From 0a450c9eba1d03b6b623e6ef51627f4bfe2f265d Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 25 Mar 2014 20:04:03 -0700 Subject: [PATCH 001/112] Accelerometer data smoothing enabled, still 0.0029 - Help file updated --- PitsideConsole/PitsideConsole/LapPainter.cpp | 298 +++++++++++------- PitsideConsole/PitsideConsole/LapReceiver.cpp | 105 +++++- PitsideConsole/PitsideConsole/LapReceiver.h | 32 ++ PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1885479 -> 1903719 bytes 4 files changed, 309 insertions(+), 126 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 7fe0a06..4b049ff 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -210,14 +210,14 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi DATA_CHANNEL eX; eX = DATA_CHANNEL_DISTANCE; -/* + static set i_Smoothed_LapId_X; // Tracker for which laps we have done smoothing on for X, Y, Z Acceleration data i_Smoothed_LapId_X.begin(); static set i_Smoothed_LapId_Y; // Tracker for which laps we have done smoothing on for X, Y, Z Acceleration data i_Smoothed_LapId_Y.begin(); static set i_Smoothed_LapId_Z; // Tracker for which laps we have done smoothing on for X, Y, Z Acceleration data i_Smoothed_LapId_Z.begin(); -*/ + set setY; map mapMinY, mapMinYTemp; map mapMaxY, mapMaxYTemp; @@ -478,14 +478,14 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi CExtendedLap* pLap = lstLaps[x]; const IDataChannel* pDataX = pLap->GetChannel(m_pLapSupplier->GetXChannel()); const IDataChannel* pDataY = pLap->GetChannel(*i); -/* // If Traction Circle window is active, pull and smooth that data + // If we are dealing with accelerometer data, pull and smooth that data IDataChannel* pDataX_ACCEL; IDataChannel* pDataY_ACCEL; IDataChannel* pDataZ_ACCEL; pDataX_ACCEL = (IDataChannel*) pLap->GetChannel(DATA_CHANNEL_X_ACCEL); pDataY_ACCEL = (IDataChannel*) pLap->GetChannel(DATA_CHANNEL_Y_ACCEL); pDataZ_ACCEL = (IDataChannel*) pLap->GetChannel(DATA_CHANNEL_Z_ACCEL); -*/ + float r; float g; float b; @@ -503,170 +503,112 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi if(pDataX && pDataY) { // tracking what we want to highlight -// static bool bSmoothFlagX, bSmoothFlagY, bSmoothFlagZ; // Flag for checking if smooth has been done or not. False = smoothing not yet done + int w = 4; // * Default setting. w is the size of the smoothing window, taken on each side of sample float dBestLength = -1; float dTimeToHighlight = -1; - const vector &lstPointsX = (vector&) pDataX->GetData(); +/* const vector &lstPointsX = (vector&) pDataX->GetData(); const vector &lstPointsY = (vector&) pDataY->GetData(); -/* // Changed to non-constant as we want to smooth the data sometimes +*/ // Changed to non-constant as we want to smooth the data sometimes vector &lstPointsX = (vector&) pDataX->GetData(); vector &lstPointsY = (vector&) pDataY->GetData(); vector lstPointsX_Accel; - vector &p_lstPointsX_Accel = (vector&) lstPointsX_Accel; + lstPointsX_Accel.begin(); vector lstPointsY_Accel; - vector &p_lstPointsY_Accel = (vector&) lstPointsY_Accel; + lstPointsY_Accel.begin(); vector lstPointsZ_Accel; - vector &p_lstPointsZ_Accel = (vector&) lstPointsZ_Accel; - for(set::iterator q = setY.begin(); q != setY.end(); q++) + lstPointsZ_Accel.begin(); + + if ( eX == DATA_CHANNEL_X_ACCEL ) { - if ( *q == DATA_CHANNEL_X_ACCEL && bSmoothFlagX == false ) - { - lstPointsX_Accel.clear(); - lstPointsX_Accel = pDataX_ACCEL->GetData(); // pDataY->GetData() - } - if ( *q == DATA_CHANNEL_Y_ACCEL && bSmoothFlagY == false ) - { - lstPointsY_Accel.clear(); - lstPointsY_Accel = pDataY_ACCEL->GetData(); // pDataY->GetData() - } - if ( *q == DATA_CHANNEL_Z_ACCEL && bSmoothFlagZ == false ) - { - lstPointsZ_Accel.clear(); - lstPointsZ_Accel = pDataZ_ACCEL->GetData(); // pDataY->GetData() - } + lstPointsX_Accel.clear(); + lstPointsX_Accel = pDataX_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsX_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - int w = 8; // * w is the size of the smoothing window, taken on each side of sample - // If Accel X or Traction Circle are to be displayed, smooth the Accelerometer data - if ( m_pLapSupplier->GetXChannel() == DATA_CHANNEL_X_ACCEL || *i == DATA_CHANNEL_X_ACCEL || sfLapOpts.bTractionCircle ) + if ( eX == DATA_CHANNEL_Y_ACCEL ) { - // Smooth the data if the X-axis is displaying ACCEL type data - if ( i_Smoothed_LapId_X.size() ) - { - bSmoothFlagX = false; // Assume that we need to smooth the Accel data, then check if this lap has already been smoothed - for(set::iterator t = i_Smoothed_LapId_X.begin(); t != i_Smoothed_LapId_X.end(); t++) - { - if ( pLap->GetLap()->GetLapId() == *t ) // Lap has already been marked as smoothed, so abort - { - bSmoothFlagX = true; // Otherwise smooth the Accel data - break; - } - } - } + lstPointsY_Accel.clear(); + lstPointsY_Accel = pDataY_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsY_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - - // If Accel Y or Traction Circle are to be displayed, smooth the Accelerometer data - if ( m_pLapSupplier->GetXChannel() == DATA_CHANNEL_Y_ACCEL || *i == DATA_CHANNEL_Y_ACCEL || sfLapOpts.bTractionCircle ) + if ( eX == DATA_CHANNEL_Z_ACCEL ) { - // Smooth the data if the X-axis is displaying ACCEL type data - if ( i_Smoothed_LapId_X.size() ) - { - bSmoothFlagY = false; // Assume that we need to smooth the Accel data, then check if this lap has already been smoothed - for(set::iterator t = i_Smoothed_LapId_Y.begin(); t != i_Smoothed_LapId_Y.end(); t++) - { - if ( pLap->GetLap()->GetLapId() == *t ) // Lap has already been marked as smoothed, so abort - { - bSmoothFlagY = true; // Otherwise smooth the Accel data - break; - } - } - } + lstPointsZ_Accel.clear(); + lstPointsZ_Accel = pDataZ_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsZ_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - // If Accel Z is to be displayed, smooth the Accelerometer data - if ( m_pLapSupplier->GetXChannel() == DATA_CHANNEL_Z_ACCEL || *i == DATA_CHANNEL_Z_ACCEL ) + if ( pDataY->GetChannelType() == DATA_CHANNEL_X_ACCEL ) { - // Smooth the data if the X-axis is displaying ACCEL type data - if ( i_Smoothed_LapId_Z.size() ) - { - bSmoothFlagZ = false; // Assume that we need to smooth the Accel data, then check if this lap has already been smoothed - for(set::iterator t = i_Smoothed_LapId_Z.begin(); t != i_Smoothed_LapId_Z.end(); t++) - { - if ( pLap->GetLap()->GetLapId() == *t ) // Lap has already been marked as smoothed, so abort - { - bSmoothFlagZ = true; // Otherwise smooth the Accel data - break; - } - } - } + lstPointsX_Accel.clear(); + lstPointsX_Accel = pDataX_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsX_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points + } + if ( pDataY->GetChannelType() == DATA_CHANNEL_Y_ACCEL ) + { + lstPointsY_Accel.clear(); + lstPointsY_Accel = pDataY_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsY_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points + } + if ( pDataY->GetChannelType() == DATA_CHANNEL_Z_ACCEL ) + { + lstPointsZ_Accel.clear(); + lstPointsZ_Accel = pDataZ_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsZ_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } vector& lstSmoothPts = (vector) pDataX->GetData(); - if( (eX == DATA_CHANNEL_X_ACCEL || eX == DATA_CHANNEL_Y_ACCEL || eX == DATA_CHANNEL_Z_ACCEL) || sfLapOpts.bTractionCircle ) + if( (eX == DATA_CHANNEL_X_ACCEL || eX == DATA_CHANNEL_Y_ACCEL || eX == DATA_CHANNEL_Z_ACCEL) ) { // Smooth out the accerlometer data for all axes before displaying them on the X/Y-axes or in the Traction Circle display if (lstPointsX_Accel.size() ) { lstSmoothPts.clear(); - lstSmoothPts = (vector) pDataX_ACCEL->GetData(); - fBoxMovingAvg( lstPointsX_Accel.size(), lstPointsX_Accel, w, lstSmoothPts, bSmoothFlagX ); -// lstPointsX_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set - lstPointsX = lstSmoothPts; // Copy the smoothed data points over to the original data set + fBoxMovingAvg( lstPointsX_Accel.size(), lstPointsX_Accel, w, lstSmoothPts, false ); + lstPointsX_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); - bSmoothFlagX = true; // Set switch so that no more smoothing is done - i_Smoothed_LapId_X.insert( pLap->GetLap()->GetLapId() ); // Add the name of this lap to the set of smoothed laps } if (lstPointsY_Accel.size() ) { lstSmoothPts.clear(); - lstSmoothPts = (vector) pDataY_ACCEL->GetData(); // Now do the same for the Y_ACCEL data - fBoxMovingAvg( lstPointsY_Accel.size(), lstPointsY_Accel, w, lstSmoothPts, bSmoothFlagY ); -// lstPointsY_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set - lstPointsX = lstSmoothPts; // Copy the smoothed data points over to the original data set + fBoxMovingAvg( lstPointsY_Accel.size(), lstPointsY_Accel, w, lstSmoothPts, false ); + lstPointsY_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); - bSmoothFlagY = true; // Set switch so that no more smoothing is done - i_Smoothed_LapId_Y.insert( pLap->GetLap()->GetLapId() ); // Add the name of this lap to the set of smoothed laps } if (lstPointsZ_Accel.size() ) { lstSmoothPts.clear(); - lstSmoothPts = (vector) pDataZ_ACCEL->GetData(); // Now do the same for the Z_ACCEL data - fBoxMovingAvg( lstPointsZ_Accel.size(), lstPointsZ_Accel, w, lstSmoothPts, bSmoothFlagZ ); -// lstPointsZ_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set - lstPointsX = lstSmoothPts; // Copy the smoothed data points over to the original data set + fBoxMovingAvg( lstPointsZ_Accel.size(), lstPointsZ_Accel, w, lstSmoothPts, false ); + lstPointsZ_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); - bSmoothFlagZ = true; // Set switch so that no more smoothing is done - i_Smoothed_LapId_Z.insert( pLap->GetLap()->GetLapId() ); // Add the name of this lap to the set of smoothed laps } } - if( (*i == DATA_CHANNEL_X_ACCEL || *i == DATA_CHANNEL_Y_ACCEL || *i == DATA_CHANNEL_Z_ACCEL) || sfLapOpts.bTractionCircle ) + if( (*i == DATA_CHANNEL_X_ACCEL || *i == DATA_CHANNEL_Y_ACCEL || *i == DATA_CHANNEL_Z_ACCEL) ) { // Smooth out the accerlometer data for all axes before displaying them on the X/Y-axes or in the Traction Circle display if (lstPointsX_Accel.size() ) { lstSmoothPts.clear(); - lstSmoothPts = (vector) pDataX_ACCEL->GetData(); - fBoxMovingAvg( lstPointsX_Accel.size(), lstPointsX_Accel, w, lstSmoothPts, bSmoothFlagX ); -// lstPointsX_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set - lstPointsY = lstSmoothPts; // Copy the smoothed data points over to the original data set + fBoxMovingAvg( lstPointsX_Accel.size(), lstPointsX_Accel, w, lstSmoothPts, false ); + lstPointsX_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); - bSmoothFlagX = true; // Set switch so that no more smoothing is done - i_Smoothed_LapId_X.insert( pLap->GetLap()->GetLapId() ); // Add the name of this lap to the set of smoothed laps } if (lstPointsY_Accel.size() ) { lstSmoothPts.clear(); - lstSmoothPts = (vector) pDataY_ACCEL->GetData(); // Now do the same for the Y_ACCEL data - fBoxMovingAvg( lstPointsY_Accel.size(), lstPointsY_Accel, w, lstSmoothPts, bSmoothFlagY ); -// lstPointsY_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set - lstPointsY = lstSmoothPts; // Copy the smoothed data points over to the original data set + fBoxMovingAvg( lstPointsY_Accel.size(), lstPointsY_Accel, w, lstSmoothPts, false ); + lstPointsY_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); - bSmoothFlagY = true; // Set switch so that no more smoothing is done - i_Smoothed_LapId_Y.insert( pLap->GetLap()->GetLapId() ); // Add the name of this lap to the set of smoothed laps } if (lstPointsZ_Accel.size() ) { lstSmoothPts.clear(); - lstSmoothPts = (vector) pDataZ_ACCEL->GetData(); // Now do the same for the Z_ACCEL data - fBoxMovingAvg( lstPointsZ_Accel.size(), lstPointsZ_Accel, w, lstSmoothPts, bSmoothFlagZ ); -// lstPointsZ_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set - lstPointsY = lstSmoothPts; // Copy the smoothed data points over to the original data set + fBoxMovingAvg( lstPointsZ_Accel.size(), lstPointsZ_Accel, w, lstSmoothPts, false ); + lstPointsZ_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); - bSmoothFlagZ = true; // Set switch so that no more smoothing is done - i_Smoothed_LapId_Z.insert( pLap->GetLap()->GetLapId() ); // Add the name of this lap to the set of smoothed laps } } -*/ + glEnable(GL_LINE_STIPPLE); glLineStipple(factor, pattern); // Set the line dash/dot characteristics if(sfLapOpts.fDrawLines == false) @@ -686,10 +628,46 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi glBegin(GL_LINE_STRIP); } - vector::const_iterator iX = lstPointsX.begin(); - vector::const_iterator iXend = lstPointsX.end(); - vector::const_iterator iY = lstPointsY.begin(); - vector::const_iterator iYend = lstPointsY.end(); + vector::const_iterator iX ; + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + iX = lstPointsX_Accel.begin(); + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + iX = lstPointsY_Accel.begin(); + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + iX = lstPointsZ_Accel.begin(); + else + iX = lstPointsX.begin(); + + vector::const_iterator iXend; + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + iXend = lstPointsX_Accel.end(); + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + iXend = lstPointsY_Accel.end(); + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + iXend = lstPointsZ_Accel.end(); + else + iXend = lstPointsX.end(); + + vector::const_iterator iY; + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + iY = lstPointsX_Accel.begin(); + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + iY = lstPointsY_Accel.begin(); + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + iY = lstPointsZ_Accel.begin(); + else + iY = lstPointsY.begin(); + + vector::const_iterator iYend; + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + iYend = lstPointsX_Accel.end(); + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + iYend = lstPointsY_Accel.end(); + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + iYend = lstPointsZ_Accel.end(); + else + iYend = lstPointsY.end(); + while(iX != iXend && iY != iYend) { float dX; @@ -701,12 +679,93 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi { iTimeUsed = ptX.iTimeMs; dX = ptX.flValue; - dY = pDataY->GetValue(ptX.iTimeMs, iY); + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + { + for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) + { + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value + { + dY = ptTemp.flValue; + break; + } + } + } + + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + { + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value + { + dY = ptTemp.flValue; + break; + } + } + } + + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + { + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value + { + dY = ptTemp.flValue; + break; + } + } + } + + else + dY = pDataY->GetValue(ptX.iTimeMs, iY); iX++; } else if(ptX.iTimeMs > ptY.iTimeMs) { iTimeUsed = ptY.iTimeMs; + + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + { + for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) + { + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value + { + dX = ptTemp.flValue; + break; + } + } + } + + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + { + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value + { + dX = ptTemp.flValue; + break; + } + } + } + + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + { + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value + { + dX = ptTemp.flValue; + break; + } + } + } + + else dX = pDataX->GetValue(ptY.iTimeMs, iX); dY = ptY.flValue; iY++; @@ -1580,6 +1639,9 @@ void CLapPainter::fBoxMovingAvg( int n, vector& lstPoints, int w, vec if (a < 0) aTemp = 0; else if (a >= n) aTemp = n - 1; else aTemp = a; t += lstPoints[aTemp].flValue; } - lstSmoothPts[s].flValue = t / ( 2 * w + 1 ); + DataPoint tempDataPoint; + tempDataPoint.flValue = (t / ( 2 * w + 1 )); + tempDataPoint.iTimeMs = lstPoints[s].iTimeMs; + lstSmoothPts.push_back( tempDataPoint ); } } diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 19a399a..12bbf6e 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -132,7 +132,21 @@ float CDataChannel::GetValue(int iTime) const int iEnd = cSize; - const DataPoint* pData = lstData.data(); + DataPoint* pData = NULL; + vector& lstPoints = lstData; + vector lstSmoothPts; + lstSmoothPts.begin(); + vector& p_lstSmoothPts = (vector&) lstSmoothPts; + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + lstSmoothPts.clear(); + SmoothedFilter().fBoxMovingAvg( lstPoints.size(), lstPoints, 4, p_lstSmoothPts ); + pData = p_lstSmoothPts.data(); + } + else + { + pData = lstData.data(); + } // this binary search will find the first and second points that we should use for interpolation. const DataPoint* dataFirst = NULL; const DataPoint* dataSecond = NULL; @@ -183,18 +197,50 @@ float CDataChannel::GetValue(int iTime) const const float flFirst = dataFirst->flValue; const float flNext = dataSecond->flValue; const float flOffset = iTime - dataFirst->iTimeMs; - const float flWidth = dataSecond->iTimeMs - dataFirst->iTimeMs; - if(flWidth == 0) return flFirst; - const float flPct = flOffset / flWidth; - return (1-flPct)*flFirst + (flPct)*flNext; + const float flWidth = dataSecond->iTimeMs - dataFirst->iTimeMs; + if(flWidth == 0) + { + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + return SmoothedFilter().ApplyTo(flFirst); // Returns the first value, transformed Y-value for this data channel + } + else + { + if(flWidth == 0) return flFirst; // Returns the first value for the Y-value for this data channel + } + } + const float flPct = flOffset / flWidth; +// if (&CDataChannel::m_pFilter != NULL) + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + return SmoothedFilter().ApplyTo( (1-flPct)*flFirst + (flPct)*flNext ); // Returns the transformed Y-value for this data channel + } + else + { + return (1-flPct)*flFirst + (flPct)*flNext; // Returns the interpolated Y-value for this data channel + } } else { - return pData[iCheck].flValue; + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + return SmoothedFilter().ApplyTo( pData[iCheck].flValue ); // Returns the last value for the Y-value for this data channel + } + else + { + return pData[iCheck].flValue; // Returns the last value for the Y-value for this data channel + } } } return 0; } + +CDataChannelFilter* CDataChannel::m_pFilter() +{ + CDataChannelFilter* Temp = NULL; + return Temp; +} + float CDataChannel::GetValue(int iTime, const vector::const_iterator& i) const { CheckLazyLoad(); @@ -208,13 +254,30 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& vector::const_iterator iBack = i; iBack--; const DataPoint& dataLast = *iBack; - if(dataLast.iTimeMs == data.iTimeMs) return dataLast.flValue; + if(dataLast.iTimeMs == data.iTimeMs) + { + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + return SmoothedFilter().ApplyTo( dataLast.flValue ); // Returns the last value for the Y-value for this data channel + } + else + { + return dataLast.flValue; + } + } float flWidth = data.iTimeMs - dataLast.iTimeMs; float flOffset = iTime - dataLast.iTimeMs; float flPct = flOffset / flWidth; DASSERT(flPct >= 0.0f && flPct <= 1.0f); - return (1-flPct)*dataLast.flValue + flPct * data.flValue; + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + return SmoothedFilter().ApplyTo( (1-flPct)*dataLast.flValue + flPct * data.flValue ); // Returns the last value for the Y-value for this data channel + } + else + { + return (1-flPct)*dataLast.flValue + flPct * data.flValue; + } } else { @@ -900,3 +963,29 @@ void LoadFromSQLite WaitForSingleObject(hThread, INFINITE); } } + +// * Moving average function +// * n is the number of input samples +// * v is an array of values of size n +// * w is the size of the window, taken on each side of sample +// * out is output array of size n +// * +// +void SmoothedFilter::fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ) +{ + int s; + for(s=0; s < n; s++) + { + float t = 0.0; + int aTemp = 0; + for ( int a = s - w; a <= s + w; a++ ) + { + if (a < 0) aTemp = 0; else if (a >= n) aTemp = n - 1; else aTemp = a; + t += lstPoints[aTemp].flValue; + } + DataPoint tempDataPoint; + tempDataPoint.flValue = (t / ( 2 * w + 1 )); + tempDataPoint.iTimeMs = lstPoints[s].iTimeMs; + lstSmoothPts.push_back( tempDataPoint ); + } +} diff --git a/PitsideConsole/PitsideConsole/LapReceiver.h b/PitsideConsole/PitsideConsole/LapReceiver.h index e87ff78..5d9b5bc 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.h +++ b/PitsideConsole/PitsideConsole/LapReceiver.h @@ -109,6 +109,13 @@ struct V2InputLapRaw TimePoint2D rgPoints[1]; }; +// CDataChannelFilter is a functino to allow for data transformations inputed by the user - KDJ +class CDataChannelFilter +{ +public: + virtual float ApplyTo(float flValue) const = 0; +}; + class IDataChannel { public: @@ -137,6 +144,7 @@ class IDataChannel // it also sorts the vector virtual void Lock() = 0; virtual bool IsLocked() const = 0; + virtual CDataChannelFilter* m_pFilter() = 0; // Added by KDJ }; class CDataChannel : public IDataChannel { @@ -160,6 +168,7 @@ class CDataChannel : public IDataChannel float GetMax() const override; int GetEndTimeMs() const override; int GetStartTimeMs() const override; + CDataChannelFilter* m_pFilter() override; // Added by KDJ const vector& GetData() const override {return lstData;} @@ -400,3 +409,26 @@ bool ReceiveLaps(int iPort, ILapReceiver* pLaps); // fills an ILapReceiver from an SQLite database void LoadFromSQLite(LPCTSTR lpszSQL, int iRaceId, ILapReceiver* pRecv); + +class PassThroughFilter : public CDataChannelFilter +{ +public: + virtual float ApplyTo(float flValue) const override {return flValue;} +}; + +class DoublerFilter : public CDataChannelFilter // for example +{ +public: + virtual float ApplyTo(float flValue) const override {return flValue*2;} +}; + +class SmoothedFilter : public CDataChannelFilter // Smoothes the data channel for display +{ +public: + virtual float ApplyTo(float flValue) const override + { + return flValue * 1.0f; + } + void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ); +}; + diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index b9a14f7a02a4e2cd7201c55dbf755f14bff1ae9f..de2b58f20392da38d4fe885b85ea7713ed7d96e9 100644 GIT binary patch delta 125022 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
`< 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 m9bBOPlTqAC(WR0~UHapK!?PJW-!^ z_q8?|2i+{uh5d0V{T3W?h$fegs){%jyf0J*k@}|s&ss%$q&>$OV)j%kJkKeQ2Jh`D zj%f00c)Ikii*o9Am#@l>2{`RMz&}%)u1pA_F~!!gdUJk0w7oTLJn6!jxOb4erJz%Y z8q>YpJkN_75>YS{w^QoK-A$&Z8qPS%u5#TMIp{t+)xUI-rS2A|`3-J7#kP_Ig9Ws2 zH==y4Qm!mrXDUdo5O<_<-X&Z}d_-O|r64)J$a!klU)mHB`WkO8 zaDWi+a|SH1qo7B?lz2S7N(<>l_tkm=#XAj+nr8^gIwp2pV%{fNT~qV` z;LqW_!22407HfGVzt-ty|IvCk@^Fyl&67#Z;42pN7nRDg;7e(tPo(lcH$x7jFIn;{ z1TFoAG_N*C!7t+5UfPgMOumm+_|EuR9WrFJRfaOs%^7-;dR$Q7(7Ln80uQs9MlpG7 z;-Sl5s%N_n&Q)m&xzV@kDkSc#{H!onixN72>>2h}Y!t;NwPCu9H<4f8tczaJ#s}e!r;>m)i1fz()!5#cA4a9(QCsWgMZ=%-&^D`V(>Jlkb#A zh3M6f9*6MFQoMBQ_8wkIdMoGkMTy&k;%jeo@y?5jOfTa)_|`%mQ|;Ry8=w{$ke`g@ zcHG+G==7xKCg{aJ%~U6)yFvUm=nh@n1+Sd&v%>>2g%Rh%Lezv}gHE)`iS|PQq)PSa zf&ZspmGS3Mdtv$Se<7M2jS`f`Q5(m(M9mv-{qDLcmP)c*7+zKPFA@Yk<_x9?hAJhh zxbK{#-7PAP&LY^E{y;NSddEUq8{gG732gSfb9SuJOy85;t!Z<@X39$OQluA^@7tK( z{;IR_w9@n&VQb9LPX+Py?-0&+s?mL>(TDHx=Z*K&wv{$?PB;4^4O^>M6HxOFl+1NJ zf+aDooBns?U>CQx+Sq_eHe?=JI?z}!D5v2 zq6ML;IuR@{e>wO*gk@5yzH~%IT-@CW@_`Dv9UN(z}Q^oJk{HVw{YSn)&Ix!Ml=D6kou;``JX(h@n`flnQ zbvaW&LaYa{(b-HMGg$X*=G*$!@w4J+I=Jj1>a|4WLX{}&)%0*~k;n>4`jIxT&eeW| z#wYR@#gm4^aV%=zZKm|H7dGnlG`n67{A9en<7B%UK%QN<9WT=T;}~9do?kQFbMWnZ zi-?QJ}G33L&xV>~`kd2L&M;H_sVjmmt%3N* zp~kVgmb8qqMbeBbm>}ezVjG-g4Kj>{U`#L|*3O;rJ|-9#o9xcW@aO+ZcSfeC$Ul`m zR0L!tw1mJQ2@nJX06c<%kP=c5adGtf$Kr6XI7}QS0g?cU{J&egWQ|S#Ma_spUN7kZ z9V2p&ab#-S*_)(gFb$n7D`uF7(H@=Y5le)3j$wKe(3W9*yffFg{V0z0ofkrk34>C3 zlQk!9a%jlsfld5}PcipQ5@H)cOl)Q)dl%=6EkQ@?S5|_i%Wph;ubPk%GV7^(%fqKO zCL9!|G5x4#oUfx~3%$q`TF*H5aLXr*Li`Rm-ICj9m+j8#fl;Du&5^VA&%XBFc?Fex z^R?+to#hkiMAAeB^MKVKU)~yx7`<}?mm$m$4 zCU)foL0Q7oXcOI_Gro|?>5KSFp?xpynRGnrIB`c4)HVj#Pxq_Oa_;c}@%%}EusM%( z0|D5bQONYmm+o?s?GifCpYn0WUq<8JS<5THpJ|cVB+9m!fRqH|vy&Sg;|8pyzh-Uu$w!I~Q^`sql%xBNBIg3ek{3 zPWy!RDKqpFGP0UmQAtCPRtQ(CEVDz#XZK;^!ocCIFN_}&$(g$rER-zmtOdXa8HoFG z%khh~SSp*lfJ_Kii@9^El1$Zw^qj<=dqGAMiZlTjmS92lq@?FaxullQ3S&C4|71|V zOrw638eOEW;E?x;HM-|36sw}zQ07&-uCxvc#NkG%|ATiX#U`5g1&)3qAl^L3N%-G+_Pi;uYCX8Xfs>8s#s?O7ftlQ*Wcxs`}*b2SufBDR9*dEraX2;E${%zgH~s6)!;t zSG4%Po9B$X!zg6UF5EyWB$Vm6oFx=*E^}=@TVHtdEmvCzbCY_8yui$r&7;szFc}UQ zzLyuN$5-P2+zhWh98>v+*P$&&ruf4J6#B=9kEj>K?l!ZM?WW&)l8*g8jrO6K+6pmK zI;Dd*b01Sj8bkDB-4znybeer{aloxpaTG0nQyM02(`{Np_H;rXeMGPq5dEkPeuf^z zPoEZ#rb(TaOrO>wjh^!npS(YSSYM|xP2QW%_P)ID!#L97*>wOVzpn;>WvPKN4n>5n zETK(Gq<8m$&%JGuati7uxIUdWiCTk-nb-P^mMw`kQRnQ0ExR@uyq-`UXWBc)mhu;I zStGqVNm;$~?04+xkXh|QL#l!fSJl~Q8?Ol@Eq}d~>g?RF1|IDg^qW&_pKeCtQ8S`n z?G3gqn?6p-=-NZxOq^PP-xM@taWK5F_ zAUZd`3a8 zA7S~=q0j@r>9g07=r>Uit=Sca539lyVlZ+c0kb^Rpf&~V1&qvlhkw8B}-wf@SqlAkck zJVtQT$j_Qp$>P++JVtcpHD@k*TZGBW*OqoAmHQKZDt>BC`bw%y=KuYj%m@6`A89M8 zW*O*qSvl#bA89g~IqCm@o&WDc|L0W^{iS&u5smMCzowQ=y;AJ$=VZ5mJyW}0|M@7ZS^LLmln;8$YJwg7`=lvG5{ju|R76qU< zBI?h}DbD*^hARNK&Iwd^Bv5^tzg(im9ni-PP`x{6Da>^@b%}#`U-vRpD!c;c^v~I{!ocOum5ca0l;r!U=ZR)I|v+b6GQ&9 z9qK;^gu!l141q(yH##H#)%idALV-7hfkHsQ>wTe6=wBG>&zhh}#0?42rGo!z_@^BV zjJzQX3<|r6Apkct14DvuU~m8obrS?5;n$^xLqRt&bVaut?U2wL7y<-AA20pq^}kz( z0K@+^9_l|pDB#B4ArRmjnn568H#CC;L2pcg1S4(;jf4aKwzog}M!0K73V z5CDQ*7X}CbBd-esMBC*}3~|FgfB+-_g1V*}AP@k%Aq={f^mW5TLx>xbpiSnw`hh?M z=w@H!|11RcZ?^-205?|xg4{3~AX?Km1O&m5H?e=z?)z)sf#4epL7^25`L{9rk1YVf zup733?s~(J(8c|3_J!Q^5+DTnr^w*n!a!h9D68Og5RSNRNI(b@c-@eIPyhrG+whK& z5_O|F9Dz3VYs113&>Qo^k%${gLx5m6#zR1F*gFsbL;h>0|JQ+l2qfah_9Hf1Oh+-*Cz&{gVpu8gto97wg>`(fY&txLYu@* z3>}HD3j;)N)^!I00dMXW2!x*IdS?*$Mq~$p{>vn2r@x^E5FGq(4gQYp48O5;P$=MrfKWIR$@-53_P?PW1VzGbNDTwtNSGiPYn{=~4u${EO8&VJ5DX5y9_K(X1mb!wLt6~!kC*&I|Njo0U>JJut_=u= z!4TJ13_;6$J)=Y5U^F@T+qlr!jmVD1;Q!GV^$*sD2GMExMrX8cu48CUbS)pD!#{fF z>+R6Cbpu1fuX_m;iUI+yXKE-Eo%ye+8XZGn*Mk(AIYF+6Ru~uny1sQVFnaT@X%z-T zC+a^7`J?}Ts~^oD5!a0n2EUm^VQ6i^u0=B#9KG?^v;~7BVb{|U8bg5o!#)48|9`;i zDukia&~^U#2fMyaXbgOv|G?0-gRf5vhoTepHKE~91Pa~u@4bUV(ff1_L#IFZ_0DLC zA=h~?0v%J}*X#%ZMHef+rhWt*`7fc->;Jd<5eNY2`s$F7Kc^4>Eg(Aoq3!<~h92>H zB0{41*|ijn=7lii{{|nl%cAE;g9ykqEuhIAnxg$ZF&aZBlfNfM(=H%-=l>E0je+2h zYwf`3Q$&D&YXMDB!BEt-e2fOsw-bN64w`o%z`(yf0*Fpcple|nop+Jfa|93!1)*K+ zZvnw@G}Zj4(EoD-1w>~J$hEsUG-pHm;@|s;#$agb_4j~i&IY^|`+;Z-c`f#%BjX>| z{GWZ%1QLDnH2At&p?^5UwMn2r=yg7eUIscx{2i*%fdWlGudNtO0?<6{KPN_80st+I z@Quz0__frFZiqzlrt6*2bQTu-I*O69>^zE*njZ^IW@3vP7%4H}|NIaAnLGL~6p|Iq zQ_&9k=id3BFF0BQH!Ee5dQ_cxsX3Z`T9Z- zXj<@}*gxVM+Ohuv|L6f7w*Cutb0r8gef!S=|JnEELJ)wP3qb%7cm7LfWGqG_BRdLB zKd*%hAPk6(oPP&NAPfveLauo@>`(gsJ4T}0!JyZu<{u2r>i@PJIOI>R_&f8XKYh4C z8~$LBYr*snhP)R0fN(ez0=qs5I<)`$7UN&>72OU7`Vao|kIerM@LF;NBG9SgT4MbN zhPW2f(Cz*mM*bbd|FlDg`@dI=&gR#d1P}p#07QrJYYqQU!~Zk13~2!rvoM{0_OOgh zy|IygP<}q}N+!s(R9;%X0=V%;%{eMNJ6^8hlEk7C$at5bg$1y>H{j(`Rdt=7aYROu sE{@O-C`v6;fZDAe5tN!1T#^goo0!U5K<}VJIMEVVj~E+)o#^id0GIQjF8}}l delta 107652 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 From ecaaf55787a7e9cd2dae80a8112c85cefeec243a Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 25 Mar 2014 20:35:52 -0700 Subject: [PATCH 002/112] Significant Traction Circle/Smoothing code cleanup --- PitsideConsole/PitsideConsole/LapReceiver.cpp | 2 +- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 13 +------------ PitsideConsole/PitsideConsole/PitsideConsole.rc | 9 --------- .../PitsideConsole/PitsideConsole.vcxproj | 2 -- .../PitsideConsole/PitsideConsole.vcxproj.filters | 6 ------ PitsideConsole/PitsideConsole/resource.h | 7 +++---- 6 files changed, 5 insertions(+), 34 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 12bbf6e..6bda7b6 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -140,7 +140,7 @@ float CDataChannel::GetValue(int iTime) const if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { lstSmoothPts.clear(); - SmoothedFilter().fBoxMovingAvg( lstPoints.size(), lstPoints, 4, p_lstSmoothPts ); + SmoothedFilter().fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, p_lstSmoothPts ); pData = p_lstSmoothPts.data(); } else diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 72f777d..8c678f2 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -43,7 +43,6 @@ #include // For Listview sorting routines #include "DlgSelectSessions.h" #include "DlgTimingScoring.h" -#include "DlgTractionCircle.h" //#pragma comment(lib,"sdl.lib") using namespace std; @@ -901,17 +900,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { m_fShowTractionCircle = !m_fShowTractionCircle; m_sfLapOpts.bTractionCircle = m_fShowTractionCircle; -/* TRACTIONCIRCLEDLG_RESULT sfResult; -// CTractionCircleDlg dlgTractionCircle(g_pLapDB, m_pReferenceLap, &sfResult, m_iRaceId[0], &m_sfLapOpts); -// ArtShowDialog(&dlgTractionCircle); - - if(!sfResult.fCancelled) - { - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); -// UpdateUI(UPDATE_ALL | UPDATE_VALUES); - return TRUE; - } -*/ UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); return TRUE; } // Nested loop for the following functions diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index e37a2da..0e56468 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -67,15 +67,6 @@ BEGIN PUSHBUTTON "Cancel", IDCANCEL, 100,67,95,18 END -// Dialog box for showing the Traction Circle display -IDD_TRACTIONCIRCLE DIALOG 485,0,63,63 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_THICKFRAME // | WS_SIZEBOX //| WS_SYSMENU -CAPTION "" -FONT 10, "MS Shell Dlg" -BEGIN - LTEXT "",IDC_TRACTIONCIRCLEMAP2,0,0,63,63 -END - // Dialog box for setting sector split points IDD_SETSPLITPOINTS DIALOG 50, 50, 400, 300 STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_TABSTOP diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj index 391b87c..e5f32be 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj +++ b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj @@ -125,7 +125,6 @@ copyjs_rel.bat - @@ -155,7 +154,6 @@ copyjs_rel.bat - diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters index 1833a57..d5357af 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters +++ b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters @@ -105,9 +105,6 @@ Header Files - - Header Files - @@ -185,9 +182,6 @@ Source Files - - Source Files - diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index 78767a9..8ae8b98 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -258,9 +258,9 @@ #define IDRESET 330 #define IDM_PRINT_BM 331 #define IDM_SAVE_BM 332 -#define IDD_TRACTIONCIRCLE 333 -#define IDC_TRACTIONCIRCLEMAP 334 -#define ID_OPTIONS_TRACTIONCIRCLE 335 +#define IDC_TRACTIONCIRCLEMAP 333 +#define ID_OPTIONS_TRACTIONCIRCLE 334 + #define IDD_SHOWSECTORS 340 #define IDC_SHOW_SECTORS 341 #define IDC_SHOW_LAP0 342 @@ -270,7 +270,6 @@ #define IDC_SHOW_LAP4 346 #define IDC_SHOW_LAP5 347 #define IDC_SHOW_LAP6 348 -#define IDC_TRACTIONCIRCLEMAP2 349 #define IDC_PLOTTYPE_TRANS_A0 355 #define IDC_PLOTTYPE_TRANS_A1 356 From 622c8439f5e8205455b65b8abede01bb4da0c25d Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 25 Mar 2014 21:31:16 -0700 Subject: [PATCH 003/112] More code cleanup --- PitsideConsole/PitsideConsole/LapReceiver.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 6bda7b6..18fe564 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -136,12 +136,11 @@ float CDataChannel::GetValue(int iTime) const vector& lstPoints = lstData; vector lstSmoothPts; lstSmoothPts.begin(); - vector& p_lstSmoothPts = (vector&) lstSmoothPts; if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { lstSmoothPts.clear(); - SmoothedFilter().fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, p_lstSmoothPts ); - pData = p_lstSmoothPts.data(); + SmoothedFilter().fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, lstSmoothPts ); + pData = lstSmoothPts.data(); } else { From 98d0d60d776f17d9d1112af33cffb8356b385dcc Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 25 Mar 2014 21:49:20 -0700 Subject: [PATCH 004/112] Cleaning up traction circle coding more --- .../PitsideConsole/DlgTractionCircle.cpp | 116 ------------- .../PitsideConsole/DlgTractionCircle.h | 162 ------------------ 2 files changed, 278 deletions(-) delete mode 100644 PitsideConsole/PitsideConsole/DlgTractionCircle.cpp delete mode 100644 PitsideConsole/PitsideConsole/DlgTractionCircle.h diff --git a/PitsideConsole/PitsideConsole/DlgTractionCircle.cpp b/PitsideConsole/PitsideConsole/DlgTractionCircle.cpp deleted file mode 100644 index ccc15e1..0000000 --- a/PitsideConsole/PitsideConsole/DlgTractionCircle.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "Stdafx.h" -#include "DlgTractionCircle.h" -#include "resource.h" -#include "pitsideconsole.h" -#include "LapPainter.h" -#include "ArtTools.h" // for FLOATRECT -#include "ArtUI.h" // for ArtOpenGLWindow - - - -LRESULT CTractionCircleDlg::DlgProc -(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - int width, height; - - HWND hWnd_OGL = GetDlgItem(hWnd,IDC_TRACTIONCIRCLEMAP2); - float dBestLength = -1; - static float dTimeToHighlight = -1; - static TimePoint2D ptBest; - static MAPHIGHLIGHT mapPt; - POINT m_ptMouse = {0}; - bool m_fMouseValid = false; - - if(p_sfRefLapPainter.HandleMessage(hWnd_OGL,uMsg,wParam,lParam)) - { - return 0; - } - - switch(uMsg) - { - case WM_INITDIALOG: - case WM_CREATE: //window being created - { - -// hDC = GetDC(hWnd); //get current windows device context - // SetupPixelFormat(hDC); //call our pixel format setup function - - // Create rendering context and make it current -// hRC = wglCreateContext(hDC); -// wglMakeCurrent(hDC, hRC); - - // Display the Traction Circle window -// m_sfLapOpts->bTractionCircle = true; - - // Get the OGL handle - p_sfRefLapPainter.Init(hWnd_OGL); - -// p_sfRefLapPainter.DrawLapLines(*m_sfLapOpts); // draws laps as a map - m_eXChannel = (DATA_CHANNEL)DATA_CHANNEL_X_ACCEL; - m_lstYChannels.push_back((DATA_CHANNEL)DATA_CHANNEL_Y_ACCEL); - p_sfRefLapPainter.DrawTractionCircle((const LAPSUPPLIEROPTIONS) *m_sfLapOpts, true); // draws Traction Circle as a separate map - return TRUE; - - default: - break; - return TRUE; - } - case WM_NOTIFY: - { - - p_sfRefLapPainter.DrawTractionCircle(*m_sfLapOpts, true); // draws laps as a map - - NMHDR* notifyHeader = (NMHDR*)lParam; - switch(wParam) - { - case IDC_LAPS: - { - return TRUE; - } - default: - return TRUE; - } - } - case WM_SIZE: - - // Retrieve width and height - height = HIWORD(lParam); - width = LOWORD(lParam); - - // Don't want a divide by 0 - if (height == 0) - { - height = 1; - } - - // Reset the viewport to new dimensions - glViewport(0, 0, width, height); - - // Set current Matrix to projection - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); //reset projection matrix - - // Time to calculate aspect ratio of our window. - - gluPerspective(54.0f, (GLfloat)width/(GLfloat)height, 1.0f, 1000.0f); - - glMatrixMode(GL_MODELVIEW); //set modelview matrix - glLoadIdentity(); //reset modelview matrix - - return 0; - break; - - case WM_COMMAND: - { - break; - } // end WM_COMMAND - case WM_CLOSE: - { - m_pResults->fCancelled = true; - EndDialog(hWnd,0); - break; - } - } -// p_sfRefLapPainter.Refresh(); // Allow the Set Split Point window its own highlighter - return FALSE; -} diff --git a/PitsideConsole/PitsideConsole/DlgTractionCircle.h b/PitsideConsole/PitsideConsole/DlgTractionCircle.h deleted file mode 100644 index 7ad9160..0000000 --- a/PitsideConsole/PitsideConsole/DlgTractionCircle.h +++ /dev/null @@ -1,162 +0,0 @@ -#pragma once - -#include -#include "ArtTools.h" // for FLOATRECT -#include "LapReceiver.h" // for TimePoint2D -#include "ArtUI.h" // for ArtOpenGLWindow -#include "LapData.h" // for CExtendedPoint -#include "resource.h" -#include "LapPainter.h" -#include "PitsideConsole.h" - -struct TRACTIONCIRCLEDLG_RESULT -{ -public: - TRACTIONCIRCLEDLG_RESULT() - { - fCancelled = true; - } - bool fCancelled; -}; - -class CTractionCircleDlg : public IUI, public ILapSupplier -{ -public: - CTractionCircleDlg(ILapReceiver* pLapDB, CExtendedLap* pLap, TRACTIONCIRCLEDLG_RESULT* pResults, int iRaceId, LAPSUPPLIEROPTIONS* i_sfLapOpts) : m_pLap(pLap), m_pResults(pResults), m_iRaceId(iRaceId), m_sfLapOpts(i_sfLapOpts), p_sfRefLapPainter(this,SUPPLIERID_TRACTIONCIRCLEDISPLAY) - { - m_pLapDB = pLapDB; - m_pLap = pLap; - }; - - virtual void NotifyChange(WPARAM wParam, LPARAM lParam) {DASSERT(FALSE);}; - virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual DWORD GetDlgId() const {return IDD_TRACTIONCIRCLE;} - - // <-- returns which laps you want painted - virtual vector GetLapsToShow() const - { - vector lstLaps; - lstLaps.push_back(m_pLap); - return lstLaps; - } - // <-- returns all the laps - virtual vector GetAllLaps() const - { - vector lstLaps; - lstLaps.push_back(m_pLap); - return lstLaps; - } - // <-- returns how you want the laps shown: this can be a map or a data plot - virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const - { - return LAPDISPLAYSTYLE_MAP; - } - // <-- returns what data channel you want to use for the x-axis - virtual DATA_CHANNEL GetXChannel() const - { - return DATA_CHANNEL_X; - } - // <-- returns what data channels you want to use for the y-axes (can be 1 or more) - virtual vector GetYChannels() const - { - return m_lstYChannels; - } - // <-- returns the actual data channel object for a given lap. - virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const - { - return m_pLapDB->GetDataChannel(iLapId, eChannel); - } - // <-- returns the x and y bounds for all the laps - virtual FLOATRECT GetAllLapsBounds() const - { - FLOATRECT rc; - rc.left = 1e30; - rc.top = -1e30; - rc.bottom = 1e30; - rc.right = -1e30; - - // changed this so it returns the bounds of the reference lap. This way, data-viewing isn't ruined by errant points - // it used to be based on all the laps, but if you had just one messed-up lap it would make viewing pointless - if(m_pLap != NULL) - { - const vector& lstPoints = m_pLap->GetPoints(); - for(int x = 0; x< lstPoints.size(); x++) - { - const TimePoint2D& p = lstPoints[x]; - rc.left = min(rc.left,p.flX); - rc.top = max(rc.top,p.flY); - rc.bottom = min(rc.bottom,p.flY); - rc.right = max(rc.right,p.flX); - } - } - return rc; - } - - // guide-parameter functions - these configure the background horizontal/vertical lines - // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw - virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw - virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) - virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) - virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the absolute lowest value we want to display for a given data channel type - virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const - { - return 0.0f; - } - // <-- returns the absolute highest value we want to display for a given data channel type - virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const - { - return 0.0f; - } - - // highlighting functions - // <-- only call if you are a HighlightSource. Sets the time in milliseconds that should be highlighted. - virtual void SetLapHighlightTime(const CExtendedLap* m_pLap, int iTimeMs) - { - m_mapLapHighlightTimes[m_pLap] = iTimeMs; - } - // <-- gets the time in milliseconds that should be highlighted. - virtual int GetLapHighlightTime(const CExtendedLap* m_pLap) const - { - DASSERT(m_mapLapHighlightTimes.find(m_pLap) != m_mapLapHighlightTimes.end()); // this should have always ended up set from the "master" highlighter. This function is only called by "slave" highlight-users - return m_mapLapHighlightTimes.find(m_pLap)->second; - } - // returns whether the caller should be a lap highlighter (calling SetLapHighlightTime) or a lap highlight-receiver (calling GetLapHighlightTime) - virtual bool IsHighlightSource(int iSupplierId) const - { - return true; // Allow the Set Split Sectors to be highlight source - } - // <-- gets more display options. - virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const - { - return *m_sfLapOpts; - } -private: - TRACTIONCIRCLEDLG_RESULT* m_pResults; - int m_iRaceId; - ILapReceiver* m_pLapDB; - LAPSUPPLIEROPTIONS* m_sfLapOpts; - CExtendedLap* m_pLap; - ILapSupplier* m_sfSectorDisplay; - vector m_lstYChannels; - DATA_CHANNEL m_eXChannel; - map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls - int m_iSupplierId; - CLapPainter p_sfRefLapPainter; - -}; From 005a41fd7ff13e3fd60835ba689a4ede464b8c09 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 15 Apr 2014 21:09:47 -0700 Subject: [PATCH 005/112] Timing and Scoring updated 1) Allow for timing markers to be saved even if no data has yet been received 2) Enabled sorting of Hot Laps by clicking on column headers 3) Minor clean up of Smoothing code 4) 2.003.0030 --- PitsideConsole/PitsideConsole/DlgRaceRerun.h | 4 +- .../PitsideConsole/DlgSelectSessions.cpp | 8 +- .../PitsideConsole/DlgTimingScoring.cpp | 336 +++++++++++++----- .../PitsideConsole/DlgTimingScoring.h | 3 +- PitsideConsole/PitsideConsole/LapReceiver.cpp | 25 +- PitsideConsole/PitsideConsole/LapReceiver.h | 9 +- .../PitsideConsole/PitsideConsole.cpp | 2 +- .../PitsideConsole/PitsideConsole.rc | 2 +- 8 files changed, 279 insertions(+), 110 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgRaceRerun.h b/PitsideConsole/PitsideConsole/DlgRaceRerun.h index d643e06..f45e93a 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceRerun.h +++ b/PitsideConsole/PitsideConsole/DlgRaceRerun.h @@ -10,8 +10,8 @@ struct RACERERUN_RESULT RACERERUN_RESULT() { fCancelled = false; - iStart = 0; - iEnd = 0; +// iStart = 0; +// iEnd = 0; } bool fCancelled; int iStart; diff --git a/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp b/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp index 763edbd..30deda2 100644 --- a/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp +++ b/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp @@ -66,7 +66,13 @@ LRESULT CDlgSelectSessions::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM else { // Do nothing, no race sessions chosen - MessageBox(NULL,L"No race sessions selected\n\nSelect some race sessions and try again",L"", MB_OK); + int iRet = MessageBox(NULL,L"No race sessions selected\n\nDo you want to start a race without any racers?\n\n(Do this if you want to capture the Start and End time markers\nfor Re-Running the race scenario once all data is collected)",L"", MB_YESNO); + if(iRet == IDYES) + { + m_pResults->m_RaceId[0] = -1; // No Race_Id stored, so let's just save the start/end markers + m_pResults->fCancelled = false; + EndDialog(hWnd,0); + } } return TRUE; } diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index 2a18f22..8974285 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -8,22 +8,134 @@ #include #include "DlgRaceRerun.h" +// Set up global variables for listview processing static TCHAR szTitle[MAX_PATH]; SCORINGDATA m_ScoringData[50]; +HWND HL_hWnd; +HWND TS_hWnd; +// HWND click_hWnd; +// HWND hWnd; +LVITEM p_HLlvi; // Listview global pointer for Hot Laps +LVITEM p_TSlvi; // Listview global pointer for Race Scoring // Routines for sorting list views by column headers -int CALLBACK CompareListItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) +int CALLBACK CompareHLListItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) { - BOOL bSortAscending = (lParamSort > 0); - int nColumn = abs(lParamSort) - 1; - - // Just compare the values of lParam1 and lParam2 - in a real application - // you'd do something more useful here, like get the text of the list items - // and compare that, but this is just an example! -// wcscmp(szRaceNameStart, szRaceName); // String comparison function, not sure how to use it here - return bSortAscending ? (lParam1 - lParam2) : (lParam2 - lParam1); + // Get the text of the list items for comparison + LVITEM pitem1 = {NULL}; + LVITEM pitem2 = {NULL}; + TCHAR sz_Result1[512] = {NULL}; + TCHAR sz_Result2[512] = {NULL}; + BOOL result; + BOOL b_TextResult; + BOOL bSortAscending = (lParamSort > 0); // Determines which way to sort the column + int nColumn = abs(lParamSort) - 1; // Then pulls the column number from the same variable + + if ( HL_hWnd ) // Hot Laps listview + { + // Get the text value for the given items and compare them + p_HLlvi.iItem = lParam1; + p_HLlvi.iSubItem =nColumn; + ListView_GetItem(HL_hWnd, (LVITEM*)&p_HLlvi); + swprintf(sz_Result1, p_HLlvi.cchTextMax, L"%s", p_HLlvi.pszText); + p_HLlvi.iItem = lParam2; + p_HLlvi.iSubItem = nColumn; + ListView_GetItem(HL_hWnd, (LVITEM*)&p_HLlvi); + swprintf(sz_Result2, p_HLlvi.cchTextMax, L"%s", p_HLlvi.pszText); + } + +// b_TextResult = wcscmp(sz_Result2, sz_Result1); + b_TextResult = wcscmp(sz_Result1, sz_Result2); + if (bSortAscending > 0 && b_TextResult < 0) +// if (bSortAscending && b_TextResult < 0) + { + result = -1 * abs((lParam1 - lParam2)); +// result = (lParam2 - lParam1); + } + else if (bSortAscending > 0 && b_TextResult >= 0) +// else if (bSortAscending && b_TextResult >= 0) + { + result = 1 * abs((lParam1 - lParam2)); +// result = (lParam1 - lParam2); + } + else if (b_TextResult < 0) +// else if (b_TextResult < 0) + { + result = 1 * abs(lParam2 - lParam1); +// result = (lParam1 - lParam2); + } + else + { + result = -1 * abs(lParam2 - lParam1); +// result = (lParam2 - lParam1); + } + +// result = (bSortAscending && b_TextResult < 0) ? -1 : 1; + if (nColumn == 0) + { + result = bSortAscending ? (lParam1 - lParam2) : (lParam2 - lParam1); + } + return result; +} + +int CALLBACK CompareTSListItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) +{ + // Get the text of the list items for comparison + LVITEM pitem1 = {NULL}; + LVITEM pitem2 = {NULL}; + TCHAR sz_Result1[512] = {NULL}; + TCHAR sz_Result2[512] = {NULL}; + BOOL result; + BOOL b_TextResult; + BOOL bSortAscending = (lParamSort > 0); // Determines which way to sort the column + int nColumn = abs(lParamSort) - 1; // Then pulls the column number from the same variable + + if ( TS_hWnd ) + { + // Get the text value for the given items and compare them + p_TSlvi.iItem = lParam1; + p_TSlvi.iSubItem =nColumn; + p_TSlvi.iItem = lParam2; + p_TSlvi.iSubItem = nColumn; + ListView_GetItem(TS_hWnd, (LVITEM*)&p_TSlvi); + swprintf(sz_Result1, p_TSlvi.cchTextMax, L"%s", p_TSlvi.pszText, p_TSlvi.iSubItem); + ListView_GetItem(TS_hWnd, (LVITEM*)&p_TSlvi); + swprintf(sz_Result2, p_TSlvi.cchTextMax, L"%s", p_TSlvi.pszText, p_TSlvi.iSubItem); + } + else + { + return 0; // Should not hit this + } + +// b_TextResult = wcscmp(sz_Result2, sz_Result1); + b_TextResult = wcscmp(sz_Result1, sz_Result2); + if (bSortAscending > 0 && b_TextResult < 0) + { + result = -1 * abs((lParam1 - lParam2)); + } + else if (bSortAscending > 0 && b_TextResult >= 0) + { + result = 1 * abs((lParam1 - lParam2)); + } + else if (b_TextResult < 0) + { + result = 1 * abs(lParam2 - lParam1); + } + else + { + result = -1 * abs(lParam2 - lParam1); + } + +// result = (bSortAscending && b_TextResult < 0) ? -1 : 1; + if (nColumn == 0) + { + return bSortAscending ? (lParam1 - lParam2) : (lParam2 - lParam1); + } + else + return result; } -void OnColumnClick(LPNMLISTVIEW pLVInfo) + +void OnColumnClick(LPNMLISTVIEW pLVInfo, HWND hWnd) { static int nSortColumn = 0; static BOOL bSortAscending = TRUE; @@ -35,7 +147,7 @@ void OnColumnClick(LPNMLISTVIEW pLVInfo) else { nSortColumn = pLVInfo->iSubItem; - bSortAscending = TRUE; + bSortAscending = !bSortAscending; } // combine sort info into a single value we can send to our sort function @@ -43,13 +155,26 @@ void OnColumnClick(LPNMLISTVIEW pLVInfo) if (!bSortAscending) lParamSort = -lParamSort; +// click_hWnd = pLVInfo->hdr.hwndFrom; +// HL_hWnd = hWnd; +// TS_hWnd = hWnd; +// HL_hWnd = GetDlgItem(hWnd, IDC_RACESCORING); +// TS_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); + // sort list - ListView_SortItems(pLVInfo->hdr.hwndFrom, CompareListItems, lParamSort); + if ( HL_hWnd && pLVInfo->hdr.hwndFrom == HL_hWnd) + ListView_SortItems(pLVInfo->hdr.hwndFrom, CompareHLListItems, lParamSort); + else + ListView_SortItems(pLVInfo->hdr.hwndFrom, CompareTSListItems, lParamSort); + } LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - switch(uMsg) + static int tmStartRace, tmEndRace; // Variables for setting up receive time / live car position + HL_hWnd = GetDlgItem(hWnd,IDC_TIMINGSCORING); // Hot Laps listview + TS_hWnd = GetDlgItem(hWnd,IDC_RACESCORING); // Race Timing listview + switch(uMsg) { case WM_INITDIALOG: { @@ -59,8 +184,8 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l swprintf(m_ScoringData[i].db_strRaceName, NUMCHARS(m_ScoringData[i].db_strRaceName),L""); swprintf(m_ScoringData[i].db_szTotTime, NUMCHARS(m_ScoringData[i].db_szTotTime),L""); } - tmStartRace = NULL; - tmEndRace = NULL; // Set the initial End Race time to NULL +// tmStartRace = NULL; +// tmEndRace = NULL; // Set the initial End Race time to NULL // Set up the Hot Lap timing list box vector lstCols; vector lstWidths; @@ -72,8 +197,8 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l lstWidths.push_back(210); lstWidths.push_back(85); lstWidths.push_back(85); - HWND Dlg_hWnd = GetDlgItem(hWnd,IDC_TIMINGSCORING); - sfListBox.Init(Dlg_hWnd,lstCols,lstWidths); +// HL_hWnd = GetDlgItem(hWnd,IDC_TIMINGSCORING); // Hot Laps listview + sfListBox.Init(HL_hWnd,lstCols,lstWidths); // Now set up the Scoring list box @@ -85,9 +210,9 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l scoringLstWidths.push_back(30); scoringLstWidths.push_back(145); scoringLstWidths.push_back(95); - HWND DlgScoring_hWnd = GetDlgItem(hWnd,IDC_RACESCORING); - sfListBox.Init(DlgScoring_hWnd,scoringLstCols,scoringLstWidths); - tmStartRace = NULL; // No races started at window initialization +// TS_hWnd = GetDlgItem(hWnd,IDC_RACESCORING); // Race Timing listview + sfListBox.Init(TS_hWnd,scoringLstCols,scoringLstWidths); +// tmStartRace = NULL; // No races started at window initialization HWND hWnd_Comment = GetDlgItem(hWnd, IDC_RACE_COMMENT); SetDlgItemText(hWnd, IDC_RACE_COMMENT, szTitle); @@ -97,13 +222,15 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l case WM_NOTIFY: { // check for column click notification and sort the list view accordingly - if ((((LPNMHDR)lParam)->idFrom == IDC_RACESCORING) && (((LPNMHDR)lParam)->code == LVN_COLUMNCLICK)) + if ( ( ((LPNMHDR)lParam)->idFrom == IDC_RACESCORING) && ( ((LPNMHDR)lParam)->code == LVN_COLUMNCLICK) ) { - OnColumnClick((LPNMLISTVIEW)lParam); +// TS_hWnd = GetDlgItem(hWnd,IDC_RACESCORING); + OnColumnClick((LPNMLISTVIEW)lParam, TS_hWnd ); } - else if ((((LPNMHDR)lParam)->idFrom == IDC_TIMINGSCORING) && (((LPNMHDR)lParam)->code == LVN_COLUMNCLICK)) + else if ( ( ((LPNMHDR)lParam)->idFrom == IDC_TIMINGSCORING) && ( ((LPNMHDR)lParam)->code == LVN_COLUMNCLICK) ) { - OnColumnClick((LPNMLISTVIEW)lParam); +// HL_hWnd = GetDlgItem(hWnd,IDC_TIMINGSCORING); + OnColumnClick((LPNMLISTVIEW)lParam, HL_hWnd ); } return TRUE; } @@ -116,7 +243,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l TimingScoringProc((LPVOID)&m_szPath, hWnd); if (tmStartRace) { - CRaceScoring((LPVOID) &m_szPath, hWnd); + CRaceScoring((LPVOID) &m_szPath, hWnd, tmStartRace, tmEndRace); } m_pResults->fCancelled = false; return TRUE; @@ -141,6 +268,16 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l } else { + if (tmStartRace > 0) // There is already a time marker stored, verify user wants to change this + { + DWORD dRet = MessageBox(hWnd, L"You already have a race stored!\n\nAre you sure you want to start a new race?\n\nPrevious race results will be lost if you haven't saved them", L"WARNING", MB_YESNO); + if(dRet == IDNO) + { + // Do nothing + m_pResults->fCancelled = true; + return TRUE; + } + } tmEndRace = NULL; // Remove any end of race marker when new race begins. INT format tmStartRace = GetSecondsSince1970(); // Set the start time for this race session. Unixtime in INT format // tmStartRace = 1376100527; // Used for the TestRaces database only @@ -161,6 +298,17 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l { TCHAR szText[MAX_PATH] = {NULL}; TCHAR szTemp[MAX_PATH] = {NULL}; + if (tmEndRace > 0) // There is already a time marker stored, verify user wants to change this + { + DWORD dRet = MessageBox(hWnd, L"You already have a race stored!\n\nAre you sure you want to change the end time for this race?\n\nPrevious race results will be lost if you haven't saved them", L"WARNING", MB_YESNO); + if(dRet == IDNO) + { + // Do nothing + m_pResults->fCancelled = true; + return TRUE; + } + } + tmEndRace = GetSecondsSince1970(); // Set the end time for this race session. Unixtime in INT format // tmEndRace = 1376100699; // Used for the TestRaces database only // swprintf(szText, NUMCHARS(szText), L"Race End = %i", tmEndRace); @@ -174,7 +322,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l TimingScoringProc((LPVOID)&m_szPath, hWnd); // Refresh the results one last time if (tmStartRace) { - CRaceScoring((LPVOID) &m_szPath, hWnd); + CRaceScoring((LPVOID) &m_szPath, hWnd, tmStartRace, tmEndRace); } swprintf(szTemp, NUMCHARS(szTemp), szText); @@ -194,8 +342,9 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l int m_RaceId[50] = {NULL}; // Show the race-selection dialog and let the User pick which ones to use on T&S page RACERERUN_RESULT sfResult; - sfResult.iStart = tmStartRace; - sfResult.iEnd = tmEndRace; + if (sfResult.iStart <= 0 || tmStartRace > 0) sfResult.iStart = tmStartRace; + if (sfResult.iEnd <= 0 || tmEndRace > 0) sfResult.iEnd = tmEndRace; + CRaceRerunDlg dlgRace(&sfResult); ArtShowDialog(&dlgRace); @@ -207,7 +356,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l TimingScoringProc((LPVOID)&m_szPath, hWnd); // Refresh the results one last time if (tmStartRace) { - CRaceScoring((LPVOID) &m_szPath, hWnd); + CRaceScoring((LPVOID) &m_szPath, hWnd, tmStartRace, tmEndRace); } } return TRUE; @@ -235,7 +384,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"TXT Files (*.txt)\0*.TXT\0\0")) { // let's make sure there's a .txt suffix on that bugger. - if(!str_ends_with(szFilename,L".txt")) + if(!str_ends_with(szFilename,L".txt") || !str_ends_with(szFilename,L".TXT") ) { wcsncat(szFilename,L".txt", NUMCHARS(szFilename)); } @@ -326,12 +475,13 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l } // Function calculates the current laps and elapsed time since the race started -DWORD* CDlgTimingScoring::CRaceScoring(LPVOID pv, HWND hWnd) +DWORD* CDlgTimingScoring::CRaceScoring(LPVOID pv, HWND hWnd, int tmStartRace, int tmEndRace) { LPCTSTR lpszPath = (LPCTSTR)pv; CSfArtSQLiteDB sfDB; vector lstTables; - HWND DlgScoring_hWnd = GetDlgItem(hWnd, IDC_RACESCORING); +// HWND DlgScoring_hWnd = GetDlgItem(hWnd, IDC_RACESCORING); +// TS_hWnd = GetDlgItem(hWnd, IDC_RACESCORING); if(SUCCEEDED(sfDB.Open(lpszPath, lstTables, true))) { // Race ID's are stored in the sfResult.m_RaceId structure @@ -481,64 +631,62 @@ DWORD* CDlgTimingScoring::CRaceScoring(LPVOID pv, HWND hWnd) } rec++; // Keep the counter correct } + sfDB.Close(); // Close the file // set up List view items - vector lstPos; - vector lstRaceName; - vector lstLapTimes; - - ListView_DeleteAllItems(DlgScoring_hWnd); // Clear the list before displaying the update + ListView_DeleteAllItems(TS_hWnd); // Clear the list before displaying the update TCHAR szText[MAX_PATH] = {NULL}; int nItem; - LVITEM lvi; +// LVITEM lvi; LPWSTR result; for (nItem = 0; nItem < rec; ++nItem) { - lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.iItem = nItem; - lvi.iSubItem = 0; - lvi.lParam = nItem; + p_TSlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_TSlvi.iItem = nItem; + p_TSlvi.iSubItem = 0; + p_TSlvi.lParam = nItem; swprintf(szTemp, NUMCHARS(szTemp), L"%i", m_ScoringData[nItem].db_iRaceId); std::wstring strTemp(szTemp); result = (LPWSTR)strTemp.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_InsertItem(DlgScoring_hWnd, &lvi); + p_TSlvi.pszText = result; + p_TSlvi.cchTextMax = wcslen(result); + ListView_InsertItem(TS_hWnd, &p_TSlvi); // set up subitems - lvi.mask = LVIF_TEXT; - lvi.iItem = nItem; + p_TSlvi.mask = LVIF_TEXT; + p_TSlvi.iItem = nItem; - lvi.iSubItem = 1; + p_TSlvi.iSubItem = 1; std::wstring strRace(m_ScoringData[nItem].db_strRaceName); result = (LPWSTR)strRace.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_SetItem(DlgScoring_hWnd, &lvi); +// p_TSlvi.lParam = (LPARAM) result; // Try this for LPARAM + p_TSlvi.lParam = nItem; + p_TSlvi.pszText = result; + p_TSlvi.cchTextMax = wcslen(result); + ListView_SetItem(TS_hWnd, &p_TSlvi); - lvi.iSubItem = 2; + p_TSlvi.iSubItem = 2; std::wstring strTotTimes(m_ScoringData[nItem].db_szTotTime); result = (LPWSTR)strTotTimes.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_SetItem(DlgScoring_hWnd, &lvi); +// p_TSlvi.lParam = (LPARAM) result; // Try this for LPARAM + p_TSlvi.lParam = nItem; + p_TSlvi.pszText = result; + p_TSlvi.cchTextMax = wcslen(result); + ListView_SetItem(TS_hWnd, &p_TSlvi); } - lstPos.clear(); - lstRaceName.clear(); - lstLapTimes.clear(); } return 0; } -// Function updates the T&S screen for HPDE's and track days, based upon user choices for Race Sessions selected +// Function updates the HotLap screen for HPDE's and track days, based upon user choices for Race Sessions selected DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) { LPCTSTR lpszPath = (LPCTSTR)pv; CSfArtSQLiteDB sfDB; vector lstTables; - HWND Dlg_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); +// HL_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); if(SUCCEEDED(sfDB.Open(lpszPath, lstTables, true))) { // Race ID's are stored in the sfResult.m_RaceId structure @@ -591,52 +739,65 @@ DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) lstLapTimes.push_back(szLap); z++; } - HWND Dlg_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); - ListView_DeleteAllItems(Dlg_hWnd); // Clear the list before displaying the update +// HWND HL_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); + ListView_DeleteAllItems(HL_hWnd); // Clear the list before displaying the update ClearHotLaps(); // Clear the Top 40 Hot Laps list before updating TCHAR szText[MAX_PATH] = {NULL}; // set up list view items int nItem; - LVITEM lvi; +// LVITEM p_HLlvi; LPWSTR result; for (nItem = 0; nItem < z - 1; ++nItem) { - lvi.mask = LVIF_TEXT | LVIF_PARAM; - lvi.iItem = nItem; - lvi.iSubItem = 0; - lvi.lParam = nItem; + p_HLlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_HLlvi.iItem = nItem; + p_HLlvi.iSubItem = 0; + p_HLlvi.lParam = nItem; std::wstring strPos(lstPos[nItem]); result = (LPWSTR)strPos.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_InsertItem(Dlg_hWnd, &lvi); + p_HLlvi.pszText = result; + p_HLlvi.cchTextMax = wcslen(result); + ListView_InsertItem(HL_hWnd, &p_HLlvi); // set up subitems - lvi.mask = LVIF_TEXT; - lvi.iItem = nItem; + p_HLlvi.mask = LVIF_TEXT; + p_HLlvi.iItem = nItem; - lvi.iSubItem = 1; + p_HLlvi.iSubItem = 1; std::wstring strRace(lstRaceName[nItem]); result = (LPWSTR)strRace.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_SetItem(Dlg_hWnd, &lvi); - - lvi.iSubItem = 2; + //From TCHAR to DWORD. + DWORD dwSomeNum; + dwSomeNum = wcstod(result, _T('\0')); +// p_HLlvi.lParam = (LPARAM) dwSomeNum; // Try this for LPARAM + p_HLlvi.lParam = nItem; + p_HLlvi.pszText = result; + p_HLlvi.cchTextMax = wcslen(result); + ListView_SetItem(HL_hWnd, &p_HLlvi); + + p_HLlvi.iSubItem = 2; std::wstring strComment(lstComment[nItem]); result = (LPWSTR)strComment.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_SetItem(Dlg_hWnd, &lvi); - - lvi.iSubItem = 3; - lvi.pszText = (LPWSTR)&lstLapTimes[nItem]; + //From TCHAR to DWORD. + dwSomeNum = wcstod(result, _T('\0')); +// p_HLlvi.lParam = (LPARAM) dwSomeNum; // Try this for LPARAM + p_HLlvi.lParam = nItem; + p_HLlvi.pszText = result; + p_HLlvi.cchTextMax = wcslen(result); + ListView_SetItem(HL_hWnd, &p_HLlvi); + + p_HLlvi.iSubItem = 3; + p_HLlvi.pszText = (LPWSTR)&lstLapTimes[nItem]; std::wstring strLapTimes(lstLapTimes[nItem]); result = (LPWSTR)strLapTimes.c_str(); - lvi.pszText = result; - lvi.cchTextMax = wcslen(result); - ListView_SetItem(Dlg_hWnd, &lvi); + //From TCHAR to DWORD. + dwSomeNum = wcstod(result, _T('\0')); +// p_HLlvi.lParam = (LPARAM) dwSomeNum; // Try this for LPARAM + p_HLlvi.lParam = nItem; + p_HLlvi.pszText = result; + p_HLlvi.cchTextMax = wcslen(result); + ListView_SetItem(HL_hWnd, &p_HLlvi); } // Now load the RACERESULTS vectors with the Top 40 Hot Laps for saving to a text file @@ -663,6 +824,7 @@ DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) lstRaceName.clear(); lstComment.clear(); lstLapTimes.clear(); + sfDB.Close(); } return 0; } diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.h b/PitsideConsole/PitsideConsole/DlgTimingScoring.h index fd13566..20abb26 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.h +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.h @@ -53,7 +53,7 @@ class CDlgTimingScoring : public IUI public: TS_RESULT* m_pResults; DWORD* TimingScoringProc(LPVOID pv, HWND hWnd); - DWORD* CRaceScoring(LPVOID pv, HWND hWnd); + DWORD* CRaceScoring(LPVOID pv, HWND hWnd, int tmStartRace, int tmEndRace); private: ILapReceiver* m_pLapDB; @@ -61,6 +61,5 @@ class CDlgTimingScoring : public IUI TCHAR m_szPath[MAX_PATH]; SELECTSESSIONS_RESULT* m_sfResult; int str_ends_with(const TCHAR * str, const TCHAR * suffix); - int tmStartRace, tmEndRace; // Variables for setting up receive time / live car position void ClearHotLaps(); }; \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 18fe564..60399d1 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -136,16 +136,18 @@ float CDataChannel::GetValue(int iTime) const vector& lstPoints = lstData; vector lstSmoothPts; lstSmoothPts.begin(); + // If data is an Accelerometer channel, first let's smooth out the data channel before returning the data value if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { lstSmoothPts.clear(); - SmoothedFilter().fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, lstSmoothPts ); + fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, lstSmoothPts ); pData = lstSmoothPts.data(); } else { pData = lstData.data(); } + // this binary search will find the first and second points that we should use for interpolation. const DataPoint* dataFirst = NULL; const DataPoint* dataSecond = NULL; @@ -205,11 +207,11 @@ float CDataChannel::GetValue(int iTime) const } else { - if(flWidth == 0) return flFirst; // Returns the first value for the Y-value for this data channel + return flFirst; // Returns the first value for the Y-value for this data channel } } + const float flPct = flOffset / flWidth; -// if (&CDataChannel::m_pFilter != NULL) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( (1-flPct)*flFirst + (flPct)*flNext ); // Returns the transformed Y-value for this data channel @@ -234,12 +236,6 @@ float CDataChannel::GetValue(int iTime) const return 0; } -CDataChannelFilter* CDataChannel::m_pFilter() -{ - CDataChannelFilter* Temp = NULL; - return Temp; -} - float CDataChannel::GetValue(int iTime, const vector::const_iterator& i) const { CheckLazyLoad(); @@ -281,7 +277,14 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& else { // this iterator is actually the first element in our vector, so just return it's value - return data.flValue; + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) + { + return SmoothedFilter().ApplyTo( data.flValue ); + } + else + { + return data.flValue; + } } } float CDataChannel::GetMin() const @@ -970,7 +973,7 @@ void LoadFromSQLite // * out is output array of size n // * // -void SmoothedFilter::fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ) +void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ) { int s; for(s=0; s < n; s++) diff --git a/PitsideConsole/PitsideConsole/LapReceiver.h b/PitsideConsole/PitsideConsole/LapReceiver.h index 5d9b5bc..6d5c5f7 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.h +++ b/PitsideConsole/PitsideConsole/LapReceiver.h @@ -144,7 +144,6 @@ class IDataChannel // it also sorts the vector virtual void Lock() = 0; virtual bool IsLocked() const = 0; - virtual CDataChannelFilter* m_pFilter() = 0; // Added by KDJ }; class CDataChannel : public IDataChannel { @@ -168,8 +167,7 @@ class CDataChannel : public IDataChannel float GetMax() const override; int GetEndTimeMs() const override; int GetStartTimeMs() const override; - CDataChannelFilter* m_pFilter() override; // Added by KDJ - + const vector& GetData() const override {return lstData;} void AddPoint(int iTime, float flValue) override; // iTime must be in milliseconds since the phone app started. flValue can be whatever you want @@ -427,8 +425,9 @@ class SmoothedFilter : public CDataChannelFilter // Smoothes the data channel fo public: virtual float ApplyTo(float flValue) const override { - return flValue * 1.0f; + return flValue; } - void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ); }; + +void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 8c678f2..10d5103 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1252,7 +1252,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) CDlgSelectSessions dlgRace(g_pLapDB, &sfResult); ArtShowDialog(&dlgRace); - if(!sfResult.fCancelled && sfResult.m_RaceId[0] != -1) + if(!sfResult.fCancelled /*&& sfResult.m_RaceId[0] != -1 */) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet { // Now display the T&S page and pass these RaceID's to this class TS_RESULT ts_sfResult; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 0e56468..6a67ccd 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -190,7 +190,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Piside Console for Wifilapper\n\nVersion 2.003.0029\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Piside Console for Wifilapper\n\nVersion 2.003.0030\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END From 3131b87f7e0c7f909758bc386d305f667e1e05de Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Thu, 17 Apr 2014 07:59:18 -0700 Subject: [PATCH 006/112] Minor code cleanup --- PitsideConsole/PitsideConsole/LapPainter.cpp | 108 ++++++++++--------- 1 file changed, 56 insertions(+), 52 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 4b049ff..4116a42 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -678,47 +678,49 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi if(ptX.iTimeMs < ptY.iTimeMs) { iTimeUsed = ptX.iTimeMs; - dX = ptX.flValue; - if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + { + for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) { - for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value { - DataPoint& ptTemp = *t; - if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value - { - dY = ptTemp.flValue; - break; - } + dY = ptTemp.flValue; + break; } } + } - else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { - for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value { - DataPoint& ptTemp = *t; - if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value - { - dY = ptTemp.flValue; - break; - } + dY = ptTemp.flValue; + break; } } + } - else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { - for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value { - DataPoint& ptTemp = *t; - if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value - { - dY = ptTemp.flValue; - break; - } + dY = ptTemp.flValue; + break; } } + } - else + else + { + dX = ptX.flValue; + } dY = pDataY->GetValue(ptX.iTimeMs, iY); iX++; } @@ -726,47 +728,49 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi { iTimeUsed = ptY.iTimeMs; - if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + { + for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) { - for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value { - DataPoint& ptTemp = *t; - if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value - { - dX = ptTemp.flValue; - break; - } + dX = ptTemp.flValue; + break; } } + } - else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { - for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value { - DataPoint& ptTemp = *t; - if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value - { - dX = ptTemp.flValue; - break; - } + dX = ptTemp.flValue; + break; } } + } - else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + { + for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { - for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) + DataPoint& ptTemp = *t; + if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value { - DataPoint& ptTemp = *t; - if ( ptTemp.iTimeMs >= ptX.iTimeMs ) // Found smoothed point, let's load the Y value - { - dX = ptTemp.flValue; - break; - } + dX = ptTemp.flValue; + break; } } + } - else - dX = pDataX->GetValue(ptY.iTimeMs, iX); + else + { + dX = pDataX->GetValue(ptY.iTimeMs, iX); + } dY = ptY.flValue; iY++; } From 4825842da023c06c9f29128d4db020f4f5426b67 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Wed, 12 Nov 2014 21:41:14 -0700 Subject: [PATCH 007/112] 2.003.0030: IOIO data graphing corrected, Accel data smoothing --- PitsideConsole/PitsideConsole/LapPainter.cpp | 53 ++++++++++++------ .../PitsideConsole/PitsideConsole.rc | 2 +- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1903719 -> 1904684 bytes 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 4116a42..208ff9e 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -279,31 +279,43 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi break; } } - if(mapMinYTemp.find(eType) == mapMinYTemp.end()) + /*if(mapMinYTemp.find(eType) == mapMinYTemp.end()) { mapMinYTemp[eType] = min(pChannel->GetMin(),m_pLapSupplier->GetDataHardcodedMin(eType)); mapMaxYTemp[eType] = max(pChannel->GetMax(),m_pLapSupplier->GetDataHardcodedMax(eType)); } - else + else */ { mapMinYTemp[eType] = min(pChannel->GetMin(),mapMinYTemp[eType]); mapMaxYTemp[eType] = max(pChannel->GetMax(),mapMaxYTemp[eType]); } //////////////////////////////// // Adding transformation functions here for Min/MaxY - if (b_TransformY == true && sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue < 0) + // This needs to be fixed, NOT CORRECT FOR SETTING THE BOUNDS +// if (b_TransformY == true && mapMinYTemp[eType] > (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue)) + if (b_TransformY == true && (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue) > (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue)) { - mapMaxY[eType] = (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); mapMinY[eType] = (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); } else if (b_TransformY == true) { mapMinY[eType] = (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); - mapMaxY[eType] = (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); } else { mapMinY[eType] = mapMinYTemp[eType]; + } + + if (b_TransformY == true && (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue) > (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue)) + { + mapMaxY[eType] = (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); + } + else if (b_TransformY == true) + { + mapMaxY[eType] = (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); + } + else + { mapMaxY[eType] = mapMaxYTemp[eType]; } //////////////////////////////// @@ -787,12 +799,13 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi // Can add transformation function here for Y if (sfLapOpts.m_PlotPrefs[y].iTransformYesNo == true) { - dY = PolynomialFilter(ptY.flValue, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); +// dY = PolynomialFilter(ptY.flValue, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); + dY = PolynomialFilter(dY, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); } - else - { - dY = ptY.flValue; - } +// else +// { +// dY = ptY.flValue; +// } ////////////////////////////////////////// glVertex2f(dX,dY); @@ -840,6 +853,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi const POINT& ptWindow = lstMousePointsToDraw[x].m_ptWindow; // <-- gets info about where in the window we want to draw the box const IDataChannel* pDataX = lstMousePointsToDraw[x].m_pDataX; // <-- gets the x channel data const IDataChannel* pDataY = lstMousePointsToDraw[x].m_pDataY; // <-- gets the y channel data + POINT Temp_ptWindow; // Point for transforming Y values in highlight loop float r; float g; @@ -869,10 +883,15 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi if (sfLapOpts.m_PlotPrefs[y].iTransformYesNo == true) { TempY = PolynomialFilter(pDataY->GetValue(dTimeToHighlight), sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); + // Transform highlight points into OpenGL space + GLdouble winx,winy,winz; + gluProject(0, (GLdouble)TempY, 0, rgModelviewMatrix, rgProjMatrix, rgViewport, &winx, &winy, &winz); + Temp_ptWindow.y = (int)winy; } else { TempY = pDataY->GetValue(dTimeToHighlight); + Temp_ptWindow.y = ptWindow.y; } ////////////////////////////////////////// GetChannelString(lstMousePointsToDraw[x].m_eChannelY, sfLapOpts.eUnitPreference, TempY, szYString, NUMCHARS(szYString)); @@ -889,7 +908,8 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi DrawText(100.0,(x+2)*GetWindowFontSize(),szText); // <-- draws the text from the bottom of the window, working upwards // we also want to draw a highlighted square - DrawGLFilledSquare(ptWindow.x, ptWindow.y, 3); // <-- draws the stupid little box at ptWindow.x. +// DrawGLFilledSquare(ptWindow.x, ptWindow.y, 3); // <-- draws the stupid little box at ptWindow.x. + DrawGLFilledSquare(ptWindow.x, Temp_ptWindow.y, 3); // <-- draws the stupid little box at ptWindow.x. // we also want to draw a highlighted LINE for that individual lap/graph combination glLineWidth(1); // Added by KDJ. Skinny line for Distance markers. glBegin(GL_LINE_STRIP); // Added by KDJ @@ -1138,12 +1158,13 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f // Can add transformation function here for Y if (sfLapOpts.m_PlotPrefs[y].iTransformYesNo == true) { - dY = PolynomialFilter(ptY.flValue, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); +// dY = PolynomialFilter(ptY.flValue, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); + dY = PolynomialFilter(dY, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); } - else - { - dY = ptY.flValue; - } +// else +// { +// dY = ptY.flValue; +// } ////////////////////////////////////////// glVertex2f(dX,dY); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 6a67ccd..a3b48b6 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -190,7 +190,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Piside Console for Wifilapper\n\nVersion 2.003.0030\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0030\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index de2b58f20392da38d4fe885b85ea7713ed7d96e9..ba095e471982cdd51c2ea73ed75eb697aa5bd185 100644 GIT binary patch delta 83909 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 rkDkT5;mr#odkLkn48Fdv`nX9p| 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 z%0A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 p5z}RzAGAv{|9kqZ43Ya delta 83223 zcmZU4b9`k@v+l$;C$??dwrzXjWXJZ7HL>kX>||nlVof-)bMwA)?)lC=_n%$ARbACx zRo#2_^YmJ)D$ngG-K`ECM4gj}iAaTrgX>?x$@Et+{}rr%1>0Z2@mKtpCHKEqTr7XZ zUlXpsN^WML69^S7_ungKCg#R05FAiYW+q@OmKCqZ7Ewo`rJctFEh&?G7lD|T6I{=icbm`oY=j(HR@7LPQj9IiKaA4Mo7ljj z8^o<4ABX(cGw`9nY~zU_mcPof_T4lI^uzG_u#}943sygSj}-Vi-@MwL@xiAni%&G) zPi~7gv}$6-uwBrZ8x)L)9_`j{t%mHT5kazeC(h>JBA81xDKC z5&k|fGensE7>u50y3J+<%Spbyy_XH3AYSEps7qu-6SBj0xA;p`Z0#Ju_5chSZuUo0 zE5r5@%di3wtbdhBf%Dz$88xOL5jJ8dLq43tIUdKJ=q?|zhlq0^&>|#=R>x_)j z+#^HrUFaW0eaj2p4Z=3;DQkTL56W3{W%BHb^9;={u+1y|;5PMZ;jzWYqqhZs-_jU3 zt+Ww&2ikd78~AaO`Ca zHzao$g$S9&p!4x7szVRN#O%y$zc5W$V^jPzcc2fmferf{2flu-w9J1{kd4p*-!)7K z4u5cz#wE3tcB$gb-4;#7HUtt-U}A%)9m4;u;j3AXlzUvMN4878A5{dv@W$(Oy#VK~r<9&FHm62H~mqng2nD_Amyl7=b*M2+oi*f)!n z6!VdF(}jpNI`nWMJ+jKC$acz~D8YHKkO0)26Qe@n`YF5z$O<&gT%nyV4H@zrIcIn< zW+h(4zEE*&#q#(J*P^PVRRudUT0{2(RY|hn`);qBASO`827AGW9bbgf@G#1ymp zl4C8MxXEbArg<9<2)}`_Ki+Z@bJ6#Morf5a@ft$k<2~9EKlUyFpx>>y*k0@3=pqE$ z19130x*q3g%EZV!xumeJsUJ<@(5^;o$X-8KBYNbK`GN-?;nHF5%%&#-J_7a!F(1xo zC!kiOLDEUuLhZLjpVSnIn^JzwY!(znc90$ojUDQFHMoNNt1^}3u=3Hbka}1(?TH=; zuZ@wfZ9kprqvxdntRj{4Dj3d((APe*XfkcKjR6`K3A6Z`+}C}G9RAsO_tultre{ZY zH^p5Rz2Md!O6hNC46*9_w!`aW7ZC@ib;!fUE<%rk6szMKKq6L6mgW|Wm6xWYBV7tR z3#3>_Vn)z!lrHJUhwWHw$Sz${Ab1?tmRHx54-*jR&$I%tvUea^U_wmTL-4!O!f?2g zu4-#QnY0boJ;_$klO|CtURGfY1Zs0_*z-q-iywF$%+{!C-L1#@JWUx4MAx}x`a!sc1lgB zC1wp5nb167=xmAOb^48}Td(B&^06vntMylHe`Qdu`(BKQV3N12TNl!&KJ=|$PplQbBd6IBXIf~J2x>c_U1XL9? zsB8`Cz{M@7EGkF zlR9v(_ET^vxW`dtTj;stam^*iu`iG1m!r7PI$52WK#VxFMaSrog>9agdlacu5pJ`j z)y2(xXMRlZF2LBC-)){~oAP5tUjl+^JuLVGIL-ue#k3dyJaUdY*UFhS=i@qnbR3`@ zLK)kbJvLo=Un+o*GZ=>R|yr&wawW;?Yv*CxJY2IgHK2u<9CT%tm zwYNE{K_t0on$f+9u$SLPsq}KiI|IUWW|dS`@Hop87`?dI(>b_C`XNt|g`RO7=LXLM zT7*efpVo-@q2l2C*mFktadNZ*WhmQW;X3AJkEAe`X0+v%5oV?BI4VyDTPS8C7X?$0*P%vD>8FD2EV$E1&h%)rvgWJm&**3uA+YeF;zCfL z#Dh_3xu}BmEu!?SLpM)CU5e&x^3cBm_)f#}$T)Hql}vQe@&;}2siy6y&HDF^G(GXw zj~H8++bpn3>-2WUbbbe3j$rUQX0f?1j#Cg%b%YIbc{H%P#Nl%#x$a}dx>jv-A#p%a zyD($Amp&XsB$`wm>Y?LMHtA1A+S_9s<};x# zZ_W)Z`B-C9%QL6kOq(*XB<`^x1*O|c@b}Q<`)f3x<&A1ulQH|*TuWFWb*59P{8@>- zh(#VMf4iMv4fb;jh&733DQMtm*jxa7#ay0a&Q*lj5nOyOm?TT&YXNg4Mwwg^ZD}2E zm)sl;Wqzowsi0ZX%8&+Yq&-012(?n*VLUCWEr?iH;AR(zfPDZ-eW$?r89hR3S#Ya3Kb*k~O)eim`{cb+NjN z$dGT_1m%79VjYPpnwGfE$67P660__4@~pG-?G3l{_Z$3-Uu{~K5rXB!)TJ&#>)CU@ zm$4l&yU>WtNky(U-M8R_sfNnD$DX%yZGj!s8Eg`)yEkU z23zWIr0k++q-KyK7k&-atCaqHmGuFrzf%WlBN6}%L+VI& zlV%1IC}!4i@oYJrzcsK@)T{)aXy6Pd+Omz-gQmE+AYizcBDu=z&iu^By(N-PzfLN$ z4D8N3DA!-Mt+U_X;N0XixY;v@fz#)JqB=jdKFdMqI5;FIptt*|4_?*427AFUBL)pV zxHR}-+(FgX`}N{wRp3Vs=Y1>}Vuwm+hwXLjx#>%H-4jFqIl|Q-ClQ2VJW$>%P#noI zoT)}DC8V-cXiyz^T2;rpboBu;cF;qdCL9TY0Te|l1YrdpA-#bx0}qg6L70H9D8s;g zWRyl3R4$NDWiVQ8nkhdNDo_ml0E8V#gE7qV7o>Cih2ETh(K#pkU*!H5>T~_Y_*{Q6 zJ{K#H8WWf9FR17K+r<6Xjr%YBXJ-1VWoG&pE{h=UzCE3XQ?!Mytn?gZ-!*iVBBJjKoc9%G>bQ@?HjL%yOkhT-Ug{B;5U#{~#N zNdY9s)BTJ;5bp;Nmk|x9fN%9_fJ}+iIE5efk8O-3aicq71_%fzu#XB2NJ?x8!qON` zJorx=G9`9n5^2u=>Jk&!VJ_cTLr(vH-6<*2K|ihesEPk8(0{s*q~-wu;Q|iQbb~N8 z2GjC@d?IU%C6h(5_K@!<1ds{pGma`MreSFcj)aKsTl;zSNm0GC zs1yO%VoZ`kxxLn4BG*UQh#Bt=#H9?jN6rt1(zMYho?;;X#GE40Jra67KO79j)>Y6^ zhA`s{r#fSrvyJKQ8CvX%oevUYVzJ33PT4cXTdF_Z(_~gl_gZfK7UCB6hnv&>I&rhA z@p`Y$rymGVIVMgoz5YX-F4;&b^>K6#ZRiNt7hOl%xblHZ4F}WJ#rIS=DN>+-E2I^` zI#>o{5bZTgH>kw84b;RtXj#xGq8NvYWiD0jayV=e#`QYU$+o|~OpEMeC-h;=q`^?B z3*)*icz&^Pswu&IM2C;Pnd&ydSRBf^1uE`!|C|bw*&zcqQ%JB|Bk!#0%biSc{n$s^J z5tb^`ASQ)T#3DgJ_GI_!E=eDs>J@*##$sz~2CtE|CS-m2S@IC@RxLi5n`UNziI#r<@`?^=CV8Qf2|3|pVoy5?5tjbvB2rp`nki^rku zL10j}Ff*2%4;}|t#80ZQMz_gv8I!_(5zPWywu%0&`1Y-fvJN_$@h#r2^=e?oi_n^Nl@?`oKMk_S<41haiVoL=Ktp(@;-;v7f6k@1KO%z?(z>`cg@@N65Ro+)is9&XLHaW676Mo6u6T4StDAhv3eNUM6Eb`FeIMQ0eGUW_e$-@ds4WbN5^uXA6FU1n+ zp`lW6#kpY!$(7WC75QZEAzJ5<9M|hWDmY=I)5aA4)D9qNjk6q-ERKTc;YDzwyp`Qp zE~!Zri6Gz{epgH-QP9801j10I%a*v6x2xzGL)1CDe{GI<@rF+}F^XP}2%~bdb^JLR zW1B5d^uRMw_~7EU_iUCWlcJ?+=q@`x7{BjuRw^ylP7W^4e7asc4{?qTO2ACYG_Lbz z0FM@XBB!)9(WCz0Gg#Li6I#q)N0i!q$!Kij{Q&TZ`nAce$){AFdj9^CG?-Qw_B3w# z`e_U5#}3bsbujRphg4A*S|ri0D*6N-s2XHG-64xEMm(9LMy!=h9mhYxY6##bqDJ(f%yD1p5Rjkz=CHZFw;rZztI) z#DLYCoD^+D-(>x78XQJ8;Mxn+f@bwWj19loQ`d6@%$}rT7m3DQEv{*LNH-z1W#*^DkwA){v;_X0p5yRMHVkk-0$qL-cFowXm_m)+WamCl|Mt~ zvf*apjx$N?%xgklV{kgE5qPL+|6G_N0B#jmYbsz6g}2Y(<+g@sBs-;0XE*5}`l1^$D~W$EMln(b zyao)xLTVj>e0gB#+PKKZAt>))tL6(nB`;-sT*%AeckSP;DJ`Iq3Y{#I%Hsh6WD&=T zbp$|R2?Cpl7G<~Qr(5^V_uxC`;mX2A^ux0+>dpDP4-1~^3cYxa^tuK!TbVjEBu6tj zSwxAiw*Qn}q(&DLjarT@vIb)8>Hn$@805+6l4*yM>W#mi8fs({!xVY{qU}}P;3k0E zNi+!ItIWKSI3GCigOQ~`+{U9GpfrFpHmBSrHMOlDsUlJZK~kxCS%0I{B_ZKs*e6XJ zW6or+L2Q!=x%xckaMlx4%3g%I!uZCQqx(m|3IQmqvsv9BwY-^$?ft zvzh8gG5k~@WEUU4VUI5_?9ha*1{NcrMi>*U1~>$-xiv6L$AUUu%FSquUD#{B3SS%D^@QUEvD4FW>PbJ|SXbP;=A z_RyCB#adb`i8x{HF}QQU&%K5d{MSaw+cHJxTOlb3FVAX8Cqg#Nec*vHRGRo=&UbI7 zU|H9dkrr^t=^@s+9HEOh_OYq;)d z?4j$%H5v>Hdv&F;WOUmX9gAT*K9Bb_;WzfS5l&dK-+v%^fqYD2Nr-{ArUN(VU%DaVg@=>V*`g( znt^Ysl)wU2+RtvLRGEM~+=Re91xO&N8Xe+a zFp4_OpxjLV+SBOLea@PuE)#G???3ZH3?$KO0qW>e0N?d!Kig^anSh)6@SlqW2NTvT_P!lEkJ!^ePEeU^FJ($Rq9`hcHBxPy+AFmsCW@#s#msi0vY-9_MDZmIfRVMTWYJGX6|8mbdX_b5g3i@`EtK| zdax+zwAB@iM98=^u<7acM?2_h`@)zHb$izkL>P}d5i0OD+Y25?W>qAmqOi$mIUyAn~=T&nZNR4FC#!@)xG`8+#**=js<@{nJuiE4X z_1IWXDRVC`<@GEyW#=Ygpbr=@Fd=4r}A++Vg(3eNEVq9JuTxrj$_EyQBo#^%$k z&n1bPTn_WS+hdEFvHh{9wo7bH-MYV|SwQ-kh#eI_8 z^6@pW@3aOvGy@XszP{$-E+oWQ=7A;a?quF??DktSG3(_%Cq%S=Kvu?0|g>e}b2x|0qKL84@tBjbF1U?E1qg70fk4vur8uXeY|jJKs>P~iqMv=W@A%JLCn94V1hC1TVc^UY zR}(YWT@E$kwLn7aYK}3m-gEj1`5BT*W4;AWmw+o)+l$=DIvC0@tXy?lq4PlD1?dq! z``uB9+M4!Fo!0pMtdy^gP@~y=D%Y?M6uYsqm8AEW$co-qAEVc!Bb5a*T`5&xZvEKn$i} zxL7AXfYI+tDk&DeOuC3*>|E4aUg2H1uI0e%lKHOKTHx-y9>_+6MUgXXvsGEwYwlqv zesZB54x!^l%f^ms`J=~S>n-z8cCcm-mylm+WaW}?Ju7v<=~>i^X^~%1BrmJATJRxr zy#|E#N5E8^p4zj5GD=1kLljOuz~*82_Vw9jzMhVAlh{suOVVzFtJJ@2@OadLYF~h> z!}UGF_qWn5Mr7kE5C%JN!@mWK_7`We@-HZt_QcaArCy4gNAx zTOhYH6o*xDJZDMqW?w$;1HkR3x^27Imn6!xYnPc^;z4RVIqI~9sT+FjYR9|~1pgy5 z43Ieoc9UBirp}sH{T@ou+PbduQ-%Zj053#adswOCz9jE_v^%CQqL>K!>n~(C(Q>{n zlB#1py{QAGJE~zY_A_0>SNh`pD50M@vfq7=5wWDsl7q{AQ_ycP#IBD#*_`pyKESo| z!3fJqLXerMOQ3}!^#lm~ULd0WP+irbAuS{-9}o6^7x$ACk}(vo)fnSLa{woleN_Ga z#2D4pJpK>B#B2<3T3rXQa{j-YX^OUX{5l7+zhUo3V7vy3t9XtEGWaNub-leSn>G=2 zi(i7h*RsB0N~iPdB`+(V*zdX=a1^;nys4*26!*8tF7Iz|{w^=6Pql`PS*>X9uAFT@ z-q}q^j69s>#E8{%A9rC(4o>pA0P^PndhWD0HTg!cT~jQ*b1Wej!S@7mCF@2?GCHr2!jWKQ zBpqb6_B$49;i9{U&$GUvZH$a4xho^L-vFs-jj3sB=2%awL45}yVORPMkPYKdvoTBe zB3{p~`KH+A8SzD+3wY;8V7j19tLHtQy;|m0ig~3n*(#@he)kctr8`JdOI zLWyqT#AlHv_xH_X$V)-HlU!DwNL2#c9PC6~e*zg&wzIp2<#y0qG6wT3xciH@5CAhA zZb&FXrqrSAy~uY<6cpnt3Q+IHm;A?d+YP_B(>56Dex!CMn3TN7J@V0UyEF zwn`KU9|BtcgzzL`TMwZQ8St;G!aW1Uwi`1I_UfHtTPB>v^=J7sqan?lW1}+~23Baq zZ(j0G0hgJx2Rv5a&y)8_c12_j0s)59%Q+s>@dX$1e7)*LAaO59(J3xg9FkCry3K<^ zm09shWPGyv0ulFma}9og-`aiRPR%3^LhGn5Ew~aZ2#iY9+{Wa;e<1Sl$a;QzNH0uM zch^#;If*AJuH};T!e%clbH`q`D~jq`f@+AbxRTJ0Wnpj0Ke-A}Zk7&~dwkZY2PVV=EncD0MtVfIDfhN`d<3(V zw2~ml+`l23;CAs5<%XBu`11aq<#s$KJ-BtBX+a%RQm0!h9vY`1(Tpm`B7%5ul%6lh|I5c%Da?WxBJqGi@YF|1q8#4wDJ%o^`nJ0Xi$~a0f_{1UphSw z9EK7iENtdxg@IRuJW#|^1^fiTMJ=z>on!Le7 zWQ}T3UoI)Fx^h1GCIL_)qxL0%TFQh$_hK_V7)Q2R|5 z3)}q+tO#Hbmx<*)J%4$W=L^f~VP7GRCI$JIvguv@;2&?zyAyC`go0o}= zev4KZt+5B-N_|iC6`)||L;=C>oRAF70u zx12GXTr-&=T-`uzlR7veb{}H)6zQ#0$%49prBOumbf=)1C7Em=mR7sKNu^c}rjcT^ zkYILwIIzF@-R>E1CXLNbWq)m%W9j^DLx7aHqqth!<`A3~%)?v>;)v85A;5L<^sE^) z&Hct%fmwJEY&O#r`zn66T;xPmCW1!tqFc7pY231eg+#)jUCcl(fV*B-1O-0bOoXaF zxiqwxbK95g48*c>hO)oAb4@c*7sW*Z&Hra`6>DH7k1QtO%ICc1Gzh? zzodVc1s0%q5$JR7369$!MY8!5G_to`0W77FtYbY`3`RGf0E}Gzp)y>TKbXi(Xtqg(l{yM1MLdUgqcH6nKf*+4@@giWEhN2p8_8R#N!WT*`8 z*r1-B28-6*Dw0gi^v!{_`=c8|?1RzD@NwJ_TxhcrlwOlQpz@Z*LSP3aS@zto>2`Xd}c|TvV;@@cr zZ((o(R7wd+2{p<7?zF3`Iu`5oH}RJDFH)c8QCVY-|7u4YDeOL`Hn4cabMq_iwi zMF**A2r$m-Q_m*jiz-&gHw_JtH?PEow1brCLhIH)LJAG|;?-deDA)af8oW8E{}&yk z`Kf^<0-r5V!->>ET8Y#_v$z2)-2V$JXs$b~b0Pb2ZUeRpo6E3ONT^|;;n@^Av&0>< z%w{2?{FLmUf}SJBnLEqEUn5qx9^JW7$%t)`O)9PRYxG~; z8qwoFrcYsj(087mBci=F`0v{f_eME9j5`1X5V0%k)t6RuRwLlCV768GVz*4lc#H?} zEwW*28e6d=alfI7ZeC5W$xx10N#ncbto+_#mUBUq zD3bHcUh2Xl+_d&(k@3V~_dtv=t)y;n>ds`@U%|)x32m*uGM7|fIVMi#hGg^&k}MeT zgIafrhlN^Gn|H1dy^>Q}6%Q9tn^&zA3S7L%vaoj%vB6CTOwZ-~Go* zvD1~RbgT|VVdip<o@V#`18N-f@o%x>UQHBMrAIbdSHHP-lo#YiDu>FpDm;`6y2cFWdEaQgHE*t? zy_Z+K_!*g%arv(ChAtp*K`DI+l^&%ooO1P#Iy&Xol6R!%5Pwr;9m>yPo+O_>O05ah z=8?fNY9ff(X)BPqcP&pbR?wUQeAmV2;U;%e|@5mB%m1 zZ*rDM>a6lUk0uW8=Him~rS($W;r74sl=0N~;c7}#ug@{Bg~8S@}TN;U&@fxa$bCBG_ifB@7(OV(=si( zan$arfiHb&BF6=mtKu?%z-Dx42Je?T^M)Tu&4?Ryh{7|hfZ7_8=_9(cpqvxe`JN{IdH9RPG5bQB zaNmb9q2bUBVkCArVDqPc`VZnOBc}n3$uf|qO2z=O<*g~}7h9kG$#dvWOCd zw_-`Zhnr`Nw)|D?`7HQ_Ws5XGJ)*-9K>u@l@h9GnVKt+IcPo1!L-dYe-=?-;J z-bT^w6YfR%j*9Gn=9|qzNyv3AZsM~dmiC@hJS>MR#7pBk3@8Q0=lIT=)QO|bgngp>Ok_0o-7Bbjot>sjWx0PM9uOUP3aC^hX+wf)FSW6p^r!m7(wgh>KSO$=hG z=us^@fUS&G{UqARdOInSv<_EaSD?P1#qzS|cMC!XExwGplgSwQ%aOv$^<>K*`G z+DAD`H=zLw=GpfFGWL;@Ti~cP*`EhaUlWggHwxwRul%fh0Xni2jdrEE=#N&ggkH8! zg67b&1@=0-i-nkv!#gu+SSI#E0O}c#hQK8!Y1`&q2*7P( zwLXRzv#V=%U#t=kxI#M5P5yc%DD_BQEer|kI+#K-t-W0ju0D6&4IwDpHm$xjz8E#7 zMg+Z7<76nGHZG<|n+=5mzx3%u0^0y>A9$GMv;3wGS%PO8ZvI}4PAXr1Ek^*O&xiG} z7Ndk1qXb?e8Eu zOUKM#lNb0D!k&zwLEmwLu&W+y?8(sjE$Np>_2HWx+ zcM>UZlc*Xgomr_oN;{(W6q@DEyylNGtd3ZOa(mBW{mv+b>-hzL$1uF)RA&T%rT zFa~2m1Tx$VCdRY}h4TRd#jwFR`+gr}4Dr%E25wt>>X9|D>V=H9{e02u&ffMn5FlpF zmHpVaGw&TyA|DVf*fP1-YDn6-#`m8zo;QiB0}kw-W4?Ce(MkzZWFf2wK!r9MdnpDe z@a2X7E&_i!7;;`m_eGR1w#mk=rM}NTH4*; zUtSR^PN^QZmAZ)PFa900s9ZU2aUPVR_Y883e1rO=aU}#z;*7qn&vur3P zRpZC~b}Sze8r85kuIGA-(c)yFcGKEpP}73C*FqJ7SdZ)#Vxq_)mx!7wm~aw(^|}<0 zS3~2u!j0p~WTgav5oLVO4s9=xr*lK=Fs%B)6~m#B_jC0iMdsH{Aj!w%D^<#Hr76^M;2wKa3tLjCyp(am@4~prxqgeMn(&_d=_IvCNFypa8bw=U$%{OZ`d(DX znjuy|5~>JH@atPx;`tq=w8~C<6w?w|A`_{USuzR1X#G?zp337IbmJUtxnGIQp>|%rqMzu9-<@( zN*Cu6j$D#S(k6%J8$M|HKJb6uL|#gIJ6)`{Xvr*iT2CVxf2g9o?A{xa%k^%Oi}T7t zcKDZ-gog_O0OR#P(3$E6$bv9HFGxOXu5eL|tB&U@Erz3+^oA__ms9wW-DJ`WOy{XU zRF{RQBYuAoUVoWwI>-*>A`#EmYk{5*kP;Pg5W2r?DG?kj4}>F)1p@3LjTr(AEu0S$ ztd$QEyc-F?@$WO||GeXwqNVMK%ZcodmG{vrX+K+>woD*IL?obABsIgvK7%Pu$kAX1 zx2P^%bN;z~?bMH_Xt<+Et&v-X4eUHj!cQ^?G7JrD-}&%10$4hp+=jHq8?3bN z4`Ihx%QI*Y(jYQkcrwW>nzG2P1)eFD3nd?Wqj9Qtb`p+fQ3V+3q!GIKAFc19ZC+Lp zDUDjN`RP-o73R*$73Ns5ji9i%$jX~s+IsyVgDcG8DZ9zaTWVdIY;hP%SnmNS-%suB z>|tHAimvZ5w4$;LPnwN)wck=aC=QLOAQX|%35<3vGWC8+>~~feeOO-ZQR%WJPR4* zNHmqD=LSMdj;HJSY>&M4^Ha)Ljyl4-Hq}?$qG|GWuvp$lJ-q1f9~iG1l5vKIv1oaV zLxU*1{K+xf?aoS>%g|TBP)z*HMUaUma6r61ua|(@h(&(Um}T1#!56^A9d>4hKri3V znVFtOUi3G_?^tB;K3{eq3f>7;qwREfo|v3^t?`6OHYww5n1Po;wb2Q%7fNo3CU*od zk~&r!E_D(pO;RR~+i}srxlSABBenoBE@S&dcx0k|-VKyI$6>_CRI~zw-(L`or$4{2 zl=YmIeJo?SQcugJLRkhR*Qdjil~t9U#Q11l*CXR^k4H8}McXvUWe(q{H(NX4-;ecX zV2~hd+Z>G!>STm`T|m)pI$-6!%2b$_y<-J zT+k!-_wc(fK)AFQVMCCn%4vS7-H~)zqFKZeKf7bUJ6O}{QdeZfw|O>EhV8MFe>d94 z3d#?kB=q1o)T;w0gU@m}tfy%f)#G7>t$gn*{hk zZotd8P86>pT0gg!uE967P?50W!P`$qog@n6l; zKq-i`1%!V0DA2(!p;GhXIO^8>+f~=3hz(y@ll)hu9o{U(5M@0pEK3(ZT zuX9yEoBSTbk({mKSt#Y7HA9Ve_iRXR8B^FYR*2DA5q zCYYNqa}fMB(+lYMnh4M7Wp&1}bl>SCVQEPK`Y3z$yGjB64=qRW*J4-kI)w_w=dzqU zSdSw~oS}+G+_fgN4|V&j?rAN8e>&`cENM>Zt8E->w3EN`-4yjGMa#LM(dJGXdI4As zqz#fCSyZ@4Kj5LLi}ao~%Yw>bZNkmC$;8RYr)68R5TJTKdY1+Q12uY>nhH?AE<>i` z7Wbgy43yOE4~47y38Jx>F5});>fQ=g&#GDcvv*;ISK@)UR^mY{+5y=A*TcYK9c{-A zE>wS{gpb}4%!HC}gndQ27zl#Qk2zS#AKldtwF0`H6o~YJKhN1PWG)4x2B9f?~$=8EusgNs1RB^fiE(~$4 zs4M_R)#JHsZe+*(LA27wtU3DO^K)w&ql4t~sd++NF8FJOctT8fKcGh712d*^cEkuT z{?{IG9MAqjHx;&wW3 zTNs#8KAJ{xAw?8WxTSlI%4UC&;j1ZIq&uz}vyAoy`>~-H#WWGExUbrAV`3Fb5V;JHrHo6#BqrddMoa{ zS$K(DkQEE~(wyT*ZN)|>-$1FTp)WDqKq4Xez^B+x1pkmwOtEB0FgP!_Q>+>AR5bAh zcGz)GZFleQ@p5nm-A7`|H_M_#KXw`n)Q-t504;*w=UdS4QUixLj7=*eyp#Z?&6yz$ zGVIe9mGq|pSK=hwtmWuoG1z)IOH`Pfg~*aQ_Wcbt8g)}4%m8$GSZz!Oz%QXp3T)?` z<}R(@CI{xu+_d9j%49 zDUwr8#pwI)TYl$YkSE=6xe5Sm$HC;YM)OkAXl%_qr|z>lkyhV(Me`-ovFH@KWaa&u zP3IsRjgVc7u#Wm=TM^XTN?^*I$w#TZ31a-jJHpkf--O4?;jWd?4*g6K#id;83&i#;1qd^W8HUncNBy0w1t6M8)@37sKS)EA49L&No zSc%JH6GzC7B`3f&q!eD7(Q!_cty1bC-OJGM6MtSU1yoaQjD{p>2CY{#L-_x2^^Og? zaKVmf+qSvewr$(CZ9Z*tw{6?DZQJH<^S)>1ewp(lR#lRfq_$8dK`KK}Z^vgCmZwD< zdF%b1Ow%Z->nEGtxgdH?zQmYJ*Vg_1DYx-idQSo_fQHzFPZ6piH9IJRRbuf&iyZjP z#HBOX%?xPcjFhxGY}|GUD55}_YCI~-f?=V;l|+4)uUevbkvg>>(JlNFXVZ35;kkw`oH&?9^uaal9*K3kUE?b0@CaD{^ z@aq9W8I#3rt$TisXMs-p3htluriz&1*?dy2lO_k@E+nBuDMqsD7u4fCipnYucU-hfuZ zUgEKZYr@Ege)!Bti2TRQ1u>NHPs6CLOJn$!u&@JirlqShX;Yny(P^Jhz{^7IdpZH$ z(o#~6EJMZLI0RM<%rW1^ysh=D+^sfrQ>4BdG|(&=8uUKFM)U&8a1Aj`V0VXjB%yhd z$|;Se^86WED4naCD+oFWfFUE=AfVh7dcHd(GGKv=nj3Aw#%OHgnnXm8AhG^n$P6Bs zWkzGx-ol7Sr1G{j+S&Mw{mXGTC;<61H2P_Cd{Wd`ETSeM{arxEPGC4GCE3vCsRP^arVNp(xvI4?Y%BMmUs<$o>n z6qH7Iinfj5y~_TonULFIRCV0cxunhwW6*=Lok4?0X1*I};b;)b7TJZI3o9`q8n}`MJDP|0)pmmG_qk8&Y zNaQMzrIDkpBm)jMEn3J$74$TM)E4sRS1LNb z-9Aa7p-rE!ZCn|GW-4#-)e7t2$DQ<a~9sza~}X$rtT+$u{Cov zIdQd^_)Od0F*hNkqFPgwG;NDQwj+Dxd(_AY%A+^`?p(PQn$~?=xz!w^CbHcD3;O`9 z-)KH7k68_B-G)NuNXNA_;X?uT6rM~O{p+FHu?|m5qjCr*W=dInWTALnp{1oUISj0U zgzDxp7{i10x}Ze7iW(rBPb7VY=sRe1z05{ldy)O9tKg0)Z{NzD@sAZ~_pf>?L^5LZ z?LCytbEdXY)5J2h`t%JVAtdXL`(q{slVk&bPiN6O) z{qux!CX!2D&xoU?2!R&jDpz_e>}13H>uCM==oV*H=vFmcEPH?v#WE1N@Mb^3b9o_8 z$y<3U-w}KTQmgc^(?u49^8N^^v-)qzU{er$WPdmA!x2xKu^Za6@qvaZQJqW zVAe4`n4Y{MW(NRz$H(#YUt%B{RA$q0ycJ!wO?nCpUcAK-I{i6BNOy&DRv-QVxWuul zh6z$ac3f1qqbT^5gY6+KQBRsO>LF65@K+-XLeAHC;2#Gbv6$>7JTw<+AF5XX_&kZ0n2bABr>Nls`qs=jn%qpOY zRx)En&YBaQMNBzd&V#nIuwxbRUovhJy$X)`ri#RelGZqHBcCLo{V{4x-+WdIQrP-> z!I|5=FK|9Zdzct5XExBk=5%|x?*l>=oE$H_#)uLjJ553?!s3pP()>(hf%smQQv2@E zkOZGEy$+!0su#*}_uv>5lY&nmj|Wa7w~v2VM@6q!!3gqh^N)zN+`8zqb_Qk50a@VA zc!Aocmgm!UIj`!f%7*Pb!168UK$Bxh#c&cOyXwI*hYWPg1rkOOxv2;t5pA=;afp}}C7d$~*hQ+_~U5Lun*?T!{i)FmWRxK5WGp5`BpmXZbUHo&JZ_D1=ABR@JU9oWw)FQYpvEgzPi~wLKP@ z#I4foOf0nO?}SZaJG)of4Kk$mv1S@sJ8b||7yngitqLk@_t#Re#o2&E?IpgLJqM7` zP6_v(3EL<_-)u#hNCS$;hPUU{psHs#K^{y{xr=GzT+g|!A=%LknKvThFGQUu2haaQ z6Vjqmz$pMMTBK8RCfzXUOkEEbdl4R^xA{}Z%E9$raPNJ zX$hg1*)3#)2EE@&Ln5JNyx&Xku+G5eBx170G0|0~W4q z_m2b(>%ZXfF35P6um7Q`>=z#dU)5MKvw`rO09XzlU@P>hGTXpKR}oW!L`GfMc1;)# z<(>CHB=sxc{rgQ=Kp_F8j1LWxf)|%A)UbNiDAvTnAV$a?(jSS9odX!I&PmH!*{oYk zY~rY!h{7ff=kT zFnT4Mci`nkQ*^GFJoavzKR&s7fcHlYapEVXCo7Q=qB7HrTdno+t=Nx04f3*H?x3Q>C9x`nWTX`{MasT7V33ywIV zBd9765rdAY1pnxuqPvL=WhAQJ{@kV+v}%ualuWAEc1Vg<4XdgUnVN~a!)9%gCt~l8 z@`~ZF_*W%D$L&xx)#GZJLUfpmvd?2>pRuE$T{4RZ&?*VhnRAlv!RO`-hwrj|a&P?f zth3dk+7SHJ;!Zc%_G}Z;i`6#sW!!gb`D4a$-phZyUT$}mtL)fdg}MC7tX=O-T-kdZ z(33d)eTxsi+Fb#V$soEm`pw-u5(Um`ujt{2gtBi)o!BV8B$TBB9r#xi#5o zZePA(KWx5cw&gBVDN2KXTJ8*X)3IKHzoq>oal822#<3~1x0MJRYhu8s+OvMFP_Bzh z%VaM$de5uWGidN9jAjhb3vx@hW#H#oH11CcIEy_>vC9OR)99~Y{|x2^R`;7s7}cC_VqA7ck@US}gd_C~;|#k?A_{V1YgI_DsEQmQ20yecRGi8O zm+~91m@8D2x$kYq&o4Wb%@B~3r+oM-$86}{^RXb#(P7$u#(eK^|je6kvB z?Aw^BJ6g~|8rs#L!;*205S2i?HXSH2FFg(=>BuARt2u>jomoDH)s3drNW$R1387=* z*IY|o>|qRr-+YdY>$w+S4%yycZNlj@w9C0&gM1k$e6$U zGzG25k&Y?^RC~Mk3Ms)ycm?48?PtG#f?Km_XODK!(qA|#aM#}D9U!$EcW~_0>>XaQ zB=FJudrbKqVYLvdj!vE)#&5~3m7|ksml_Q0($061d5Ups?~|Gj<_&)P_=h=O?3Dca zbczM1-75*3u!JXUZf|W4?oSVUmEE$)pduvoKahtDKttfz3k?*9)Yq*c65qUiqi%$u z!5*ZAhP!}T5l=H+w#OLP*{EYJn=VFe<1AZ@6Zlc9`k6meU+i;Q?g|E>S&qyXMl+1T zd}kbNN8uJMR?28}41?uSnILIjVG8-m;Rv?ImFqGXe3SOGoAeRcRnBp}qaYqV8ngY} z0{@d3z#;9=68YAV=X**p`CoQSxOA_og$#}68u_AJg7%5%K#!!zY&1PDCXE~r7$vA! zL{#eFhe``yiYk6R_(tl=%4mQpq&n`&cXM=phPOp0aMz%vV?IA4Bwai4tXAq2@gMI~7ce(To-4DGjl`2+gfgc``jDUT9Gp(|tD? zjWALVFj3R))+^LQ`67DbRa!X&1O_@n%b12HwL$Nn6-=2C5@#K8?X#a=oKm^|BiMl{ zPBAGz44Bm2t53qphm2EK1`5I|okWSZ7a$&f3OLqOqO5}LxT;Qp^_w;#|IKHQL3G4+ zVOI#^n)ebZn!jq0J7HNolS@+TQ~&3Y3Fi4@SqHHMaV;p9B~%XGg~^^<$^okoZP0j6IzS_W zd~@5pYp;2Sm6JeK%X{TtC%DuFZYqJtwMpPjd5-Pc7-d&}=y0So3o8#uX`NPWRQ#(I z!PRQeYIr@k|Ms^@i;bX*Nhe1w3tr>xfJiNkjH-Y zuiFCrEW*Ocwl<5QX=Roj%{j+jW7G6{Oy+X+da(8S3?B^p!x+SEId5NU^{L2F*mIwK zf=2EQ>Sh1nr6yB)CN@4)?nQ6lG1PtbYz2e@njRRwcVz(U)B3&GOsn&>+L=u%Gu#JG zh3T})wcu90ei&oQh$PT^)|~lu+q|R9apCt;tkqQBDVKr5(4h`iVwnujQToLbMAC82 zBBYonl!-X-9V%!gGY)M^aM@NRkZcy=VIK|k7mc!6TcyMn;v}te=0P`%(A+tO?hy6~nu-|g zr3izctrNJyOAynM{vi4j%9IwJ>YANrUk$2?-)mr17@~?x)gzkqlRHwa6~L_frDt~0 zynS7joHrWZJ7fN5$O3w&jxnvTS?{L5!!*LM#ij+&8?E86g(X5Lxh0!!F-`_KgWH^X zozT|gNX`ts7;QtFCKg=Ppz?0eNL6Y4L5&)_G*&D=ZLms9r$A~?m!UhzGzb6BjHC`I zQd#Ov{m63Pn&m*8TOtPM2)b9%u27Be{))NL{N1A_bB@Ky; z=s*GN;Nc01F9j|$B0R~`_Nb5KOHv+3$e z&t{+#v!;11NlQ4-dXQ(HN%@@NS{ImMp%3u2&JduuY24nscjSunI&UE&vjZ*v`q(C> zy>Sv4^!df&?gax8{&JbK_-gN}>3!#e&6xq(&Mb%(`lvD@)w|~{CVcO-UldpH5h6K@ z0`SncAx`j@NqrzO!N7SxF@ggSmmnzDyYMGODd8|fLb!aPR3+Z$i+N05^7EbY?LW2xw|@7P%sYjLsM)$#RMvx~VfHh< zB|K`04agg8Qz7!4BENgv@nJ(ixcvaPRL_Dvfi8XxG zM)?GN7#mnnV;zkgiYJOF)k@!rlTyE!mALA1X{>eck36AyA9G!#Z|^3$u9=k z2Q(RDU&S!>dq-indM}tY5siy*b?E8&j*He##N`s z+73&a{FyUdgKUSH0dJQ(JIAJSICjBlYAC50_a6zgs#lv&)X83O$JRmDj&NBcUf>CY z_Q2cOFU}%jDrM2|R6>BB-yhV7xk%dmAQ~-?#F`v>U0YCUSI3f9?jl_V_5>eO)O{)ch@j3Ex%m77?Ponk6{Pyw+Shh^{ zyxq~uX`DY<&j2nyFW779)D3nSD%LbMiF9GKIg1bVhBzXjHY>b?3mQs^_Ur%9KZ0_BZ=01Bd0P=+jXKjG|X-2$vxp=pC1D z?mkObyq;JWbyxB;hI_{`^EnTABIS$C0G_gq@9}elss$)gebiEvKo*1)nItnj!jc8+ zH%{usJ+1uWIe&J_PVi}a+G-EhIx(R&y6vTELPd#H))4ekr@@!sIs4)&m0BgZwnyzWy)u5vw7yrZ_nncx>T|IX|zJZ7g(557ee z=xi&M0-(*$F7Dnf_(xM?tysdVQ^>6cC*P;9X#vK>tbX_m%LJY!J&xQ3%if|vPW!(>4@2|y5<3b6uTC?+w*q_cYACPz-V=y}OU zC^94X2X5^AL+b%%uZ)VrOGdNojwKSjsiWoO6PeRX&CuCX9M41zOAwxM0ZL{H1o+{& zY6J9^dq_GczdcVGYJNBEGINm^G4eq`H%^=%NB{^L!`pq5x;S@Qex20JQ)6&wCYsnnv`*CzBiT0|73h2NN zJCe&(ui8K;UA`$iBUddKoLuCwzn7K8n5rEFa%^q%o796o4t26zcCyk;uI8^=djc21 z8B;@I%C~>>3H)2y%W$g41!25W!Tvqq=;#xbCJoNvmg*0l$YX>BnQb5=-J+vIs$4!C6T4}PKlVB{ezx|v(QK^b7-2h}{CcOPv3YM^0& zj^vYxUJ$}HubY&SF4Haj{D*R2Ct9F=;N`+sxg;4{Scn{Mj~Zq+z$!LotiZ{@3P z&pfZVI{^07?Wx`1j2*I~!Psd#oAn?W8SPj6B=B0P{8AD6KHNeP8iux}2WSc|NZy}h zw{{*HfY(b7A(q~6j280TQMIbs*|E`ohBh z>dg(zo311~39mO>7+I<@D81Qz&o-xFZ9A_FF=Vr0`*vAlmq#p^0pj1VGKoR7pG5;L zR$*bV+K3Z+yaDPL`_#n3uSCTR5f({^OpL=o5uk+sT*%h-2hKV-u@Tm5WH~7!=H;UE zjf0@*cTU?!aVH9e_Ic_ecrEIt6nenyNI1@v+9_k}_s9oKtbz+k=slT^ubest%uy=LpyFiiH+g zQ$?v^+c+8F*`(x~hkWG5e}TjuhwI>B(nKP`(b`(wp!5hpIGNMX zlcC5V+!lcGJK55NlA$mGAI2GIUJl(pw*@036i!}V4^EE<;-*Ip?Y$WhS6lvf#?~Q| zBR7S6DkQ;u(wa#VyqKHX6*5j;L1K3TnCjbW-}>aYR^^R@@q4d629PB0I@>?1cRiqy zhdX1DNOW$MC2?-a9n;RF&Fai;#Yb2B>{8GB#0$Y@#tO4JY%*TX_Vp#ET zwq;MJEA1xO=Nt`@V`%32J61rmEA4E3%&J@*{L%~m}mZdOwCAr`ZmfwU#eX zCD?H)b>Y{5sqBbDy3{S34{y8v$C#RiSzIKY=Ihv*mtM1_agKioGfw0isXvqir<2g+ zdZ-pjoysR z7`eM#<|{eMql;4mw3(m;2iKlXAg8arQf+J}&I8y0!M_GzbG96sd7q*jCzxqCajh%Y zUHw6tYV9~OpIB(S;LAGy+5+rU#RQ5#5Zo@N9H29Av7zu1vIGC9u=Cxp+6QHW$G1YU z6(KM-FTwRjEL^>7uIoo+l)QCBP8Ed>E$ZS0Z?63C1= z;R*<~+WqCEOh%zmLJgevml5R%`YqXH&5%d`q&y-9^xo`(y*)?Ys#KRkCjY%#GeWAl z+9Qj&GP;HkdVhKKG_p{VrfSa-o~f>!imssWkE0kH$QW#k{&RA~gv$hLE>2^GL6hNal8D7d@fn|K?Zk}9LJW*viVWDO zu-d{0{pmnT&RBLBczH1c)+dD?kynN_PdpX^fY(c=zsBNh_Kx;{WhbE?a3A~XF^Wh$ ztdL4o$CHiGA2j#BovWX!ReyGPSAg%y`(oA8=OVD2)C?)ok^7IbN?aiOLkjmiV4-)YK+{G=J8M-XW zGWy<%CbVz05V`S!AS%;m=dIo(@%!Z|ti-jcmni*3ETtuGrbA}gx#73cE#tBx3`kkB zaPt8fcwING7y1V-btdToKE(qYPk7+Xc7?tt+nj^;umEs=0#I@98IALQ8wJi*YG^kQ z_B>EdF`^Nd`|2xP)qIZ%5;ElakQ}?XE_fhjL}wVPRK#N~5y7-J2{ich~|SJ*-LC-%RS3?S_}SXpRUt zA?P9vIj=r|Z<5vTT&gf;3ct>I&1SNnR^5F*yRbewfTr53ONoqA6EeUv0f)NwczNAs6B6qqKhT}7Q+ac>dU{wtSKSykF4X@~wi z0Q@%}B_D!43$W)hJN*WMu#wWh=W^>ppEpErzcCh%X+ZB#tI15zG_gXKB^w?bZ8H;M zx)gpOSP%9CTiS9W%xHo>$HMLhQE1Ss1sEdm7!n#JcsNTt*tZ`p1gt-;9qhA280Gcp zGOx}P<8TMYFw(XA8g=Iv__ZpIA^O)*C; zE#TyyA~QjAdB67?elo!b-;%OWoBs~th#dMQKrYfs>EsK)@Gw#o(RGuKFe?^Z1N6`= zieNS0AuyHhf?0Jp{-!h#ms+2(W7QAWw4`;}gq34M*RWxF@u18_KNCj@=>u;MOwtgDVfR{0h&6*(5vKV zR<>DclMRdx1dM71LzlpN=Bhn{y48Mxos+O?T5E?I#|2~IVv*>AbCyH2D1)fq>bBU) z>=O(d)L0tRqy|j3@LQsviyCgbUO6YakY{~`gT}3fYAtu}GM4CSJce0+;nGb^Hjd`_ z6fu_bGWDioHyUofDNBhX9=79OM%WEv7REH{-?EV&ePZuK!=V|K6O0M$g({Mrd0$bZ1j z{zuM^+ApEgl=eI^;N}Omgrk#TD0j}-B}LAy+D}k_m7VD}gZytx*m&i(njHv|y>UrH zg8y>0Rq&KUFt+yM z1yo#wA9?YF@dK84JN7r-JwJ}m!nWvdYCRF$rgfqE`_I6A;PIc3wrO>Dn(lf59r~Ta ztskDtyE5)-hUW`kAXyuBsNEfu&5p91VK5nf1snCD8uBuH0Ko|;Q8v0XdLOHbx;D!y zUZ9am2#e!+g0;L495aDM3bYgfaD(ED%oCk|E_8g{kXcIb2{>SOcF*iE%wNx&2g^ z*W3NZhq@%+DJZwjV%yYWQDxb_C47LtVSxuf;KQ06a;356Lsy1bYL?}*HyD;I=~P#Z z?gD#9ORU!8Z%#@Z#irLvLVO}=EgqCdN3^<3>&Oy4;FT6_4HVX~8h(w^1n<0ph=Q#M z*ORDpZ6?qw7QS3fNGCpU4gQ`DR$Aj{Tlbat%bi?YogHYv7GqgWcrx~C=W}z(>!7OU z4atqizO3h4?6igQ=eDX<*U4@ZVx*@Tdycy~ub(LD#sb znj$(SO@6c1VwW{TRi?f1xwPQz+5!B;dbIS5nSo9Uk&pA(g&wF`a{Zv|^=&$0TSHXrY;gJ1rVWAZ>-+aR!SoW2GxB~H$qzE*{`e-bJ~nCEKT?bmzMI640j$xGE|)qN+4st56pGfHt8jfgJYu#7;UX`K(|-)VXR^Um_N_F~^KS`B1hpME?GLR7E=a zTH+#YRgTJrq2sF8A%g7~IMCYS1eyU!EN3BgiDZ2AZIn{2Yc_TG?$f;vQxg(m(>GxD2ICdzFF zs!FwhGZ^GW!Ip_9Qo+b-ahsByd%KZBT_{|VsF9DlDJdL8K~^oYeu#7Zuro)wM-O&= z&?IlaHX_^#Q0TEkb@;a=h*o1Vhxy#7q&D%IIP5+@znOpFp)=G(_SiT3<=T+kr&0Y3 z7KGHV${WNIE@0mkS=3&_1EZg5LeP%r zfYhHNp;s9Eh7>Qx(Miz}?47DD)(N~zN!PG|X7%r*K+9pU-zH9xlE@gXH3{jkZbqI6 z6?SPWfYu`p{;RouEw{oZp-mL;icn*wsiDmZ0L2i>qjKWSE3NbdGSg z5zQ65V!3_Q_(SHpWna_6I*zGNyNYZj-q&d)S}CGtcwX7s79m&HdI-5SwepU8*%CS9 z?tB$$?C-DJLRpZcpve|Pk80>-=HGImM$ii$fD7qs(=dNOfd>< zbT;;N)I~n^j9UHvyXuJBJYV#w$S@pRe!JO>Fn+?C94eODkUUf9;@Q}6sxJA;=8CiFX3&nIKjhZ4 z00wPNS{MOJd8*L?bYM2Xst7$WFOh!3s=M1<@oiTU>pU~_$7~WW6HJnOyqE>ct#hxD zx_<}{A@oD1qbh1jsv4Qy?u{B9hoKsl>~Ku;L4s9P>*_{;ATiD0)XQ{1w(6K({;@UL zivL1vDAY}(S`XDoksclv5UtKaK5Jze087iRY{R%*E~8ezMjpU-4NAk)7(>6cF3thw z;ud@Ux-ezxDksK9F}R;ewrIL9XD2GBr`EH8>DJOjr8Jxv<~t`HZr$bdD2hdqo-Rt>vslz2omxjBU0sHgy0)biJ!Si;J=)jY}NX~ei-qD=kk&!}4spi+>| zC7B{yG^MWTc*vN+J@24cS7!S}8|#D<0{=m&riyZ82VZ6U=NCZ~d?Io`3EtTDDO_SM z`?CC9jpauPJM>>^>1+&{c{Qpt9!s`efzr4W1zXrYb7p!G zpCCR?)h)`-DY(1|ZQ|Ki{myG8fDqFw?{fk*^jz43`nqlIetO79L4^u9$~r36dM=HspERUmqJdzhH#!i@%Pr2&z_(;Yoiuy~=Ud?Xs9 zDtNelozQS4m|;M?-q~FFz6XooZpm|X!{#Mk*Ripnsq|Ra+j%~I0B{=|ijM2A4q^5r zeJ@T?$C;2YHL&j~?=V~eF2^=Nbk`iA$Xa(|BalF)USdX*gT33{y~KM+g|8_W1yXs~ zXw>Jeu|i~ z<}4Wg!xE>P2Sa#5bhs0Ik4`ozF+C$c;vC%?Up$6m+1v)eakRI``S$1dV{+-~a0zqa z%piVWP4<@vkE20;sT)ynvahZ;W3J5oFxT1#Q(T1l7xUr_x!I|QKTkjIf@*b!lBrZq zmPbS=+>R|kv#U_^O6rP$JnKh|yx;ms*Oh6)(u8;9qVQ$Z%2 zv&l{Z7Phh+ehuNFhE}PFBfY|0!f8#V5LzfL(0@1r5wjjkPMyXHTCWW(Ofe8Lkc<6& zx8#_M8m6Jh3Z_XCn2Ulwd0R}yOQ(N9W)skF{*Uy~MlA}nhXnXv2h>WmbsV<1QT!R^ zfBVZq!SSjJB`+H(L5>$OEEbyJH?w<-Kl3@AjhEA^PnO5~_Bs;KtR&)^#Bg;moy|G3 z-%o|3J<<-pKRp0Bzh1i9zW7i?8J^t-S|gV1-VB;r{}sh2Yw(G zbKP6!+N$PRlF@stv*?}iHBr7gR^ z4Fqn#+XXjJrzp#cV_+g&!{L3ip-_NkYSNlZ;2Mk;*{P^=GY~fle&Q3F_E$$ zfan|BxVckDhRzU!L2YMESSb7R-Vx-(>Jgv+;=qw}Gr<9O7uIrho901B!*smCEAceC z{PdrQf42IoYJEaHqOq0r2fy(V_BgF@NHSxll%`$a^T1K-)5d|#^5m7;zOews9YW@y z*6!9+ZrU2^GiNktP7RVUrN@>D`k6ZIoo+$)tgDkYOB zJ!D%yCma&h*{g;W(E%%?R?PsdKdTUmupEs03pYz3!&dXkxnSF~IlRR$_;N?;bBYZf zrg`;S?rH8lYLj{niqfUZp;exFX73{tx6^za%G#w~tP8g{X=XHzcdInrBV=A1n3jmB zx~R3zJ)^*hMhBAGx9+EMzhvLRc%v`@syxlK?nJJTt30}10P++*q#*!P*W~0oo+c7w zsFHecS1zVDtT(!%FVvYwjLn4R(x~S=bdk7aN!K?d) zI&;oIr}rAMwz^k%OUhMq^QLtvqsyi|dm^HP#p;KYjWL36=ChuRd)T%8e~bqgYuVK< zZLvRIY9d;92yf*oqzzD@SGciQ%P}QIvpN&yq;N&0c*i8X%Fd$z`#y} zKWqTG`?$1F6dyj%;}JW&35+}OuiI3sv@*(z4j+r3oR%%1?}Y0eo1O?i%BxhC1{;+R z>)&G$GqlP?Gd1Vw_ujjRlj{#sy^q@u(sb;<@VXnc*HZ9*f;)gqWX+|sFn4Fh;PHQG z7^sQ7<#KMS5JoT&6dw_AB!YPOAaO$!ojoqShYNq5&R3PZ9r<^87m6CZ$Q2B+-lcH{ zr>IP^fkz8#DI{~2H z=ngRg$!kIeaX|ptZ%jd$#oPf9NW@!e7%^O9ThFGuKY_iW?<3??TBw3JR(?%HB2+R> z{?emt5^E|UQ&K!<#Z?6{EF?dq14dgr!A_$Wvh9ituV_u;Q6xW!3KX3w_k#XN8`*%MHuw?h&D1Tudi+7^BoUIH zqUhk=lK7#@>Eg;CxoYb8vC7{W{H8k+Dg?liT=F!?m6M?LbQdmoh^20 zmZ>{eTuDCa_;=)r&NpcvH9!eZ4KXs21p9TKbbzl;7Bc*U|moutHStax=)> z&XaD{|4b>Rp)#$U9*`5V?WMIl#iGlYq9#-EsiN<;Jbt27zRsdj$4i%qi^pO4jdeGL zjrlIjP5ZHOBhXhGDuMeON6P=*FG(c+#5dd8L>vGNP{@Lz4}1IY+FFB3l}~L@RK0Jj zi8MTh14*2+iKj$N3i;5-f#Bt6Xp;R9?5j$E%J<){1fWj$5PZwUEyKj4*vK-CXboMQ z?sz}9cY{}ja#XP$jApYxgU^>6CQ_feDo&g@z~VPIDl!T65L9L4Nd-mN;E3a*s>_Mn_RmwkA=*>fEyx0GX$Xni_BF}@bH9N6Xp_(G`5nU7A!TaCG z&0hmS0LO&+suf^QXkG`KtKy$jRhFx~cTE6<{F>_^t|9!?%t2>yWJhP+Bv!RjsnXN8l(^z)gA@OX({!_Dd<6h-ewOudEffkmRIT(S zgb8-@xi|BTEra1K*RMagT2m)!m()_RzgF)({FVDnz7sJDtCE;%h0~g`bXx;Ya54e? zb@v%Lrp5RplZs-pMfp;ve6fT_Z4+7t{v?(w{elnY#ZZC}+%4}2X?h+ZQj6cpQY%~f<-LhrI z^y<*S@b!c@#mnkq>Q|ZXL%)iw0tbL&#y?c!G@rW#ji1Mue=^Ezy_Dn&QVHQ7y3k?` zPY$Q_1N_jr2Lm)&+c}u1H>fGBKh2tM#+6h=$88fX&mQla~cy+Tlt-d|3W5 z*F1Wjo@9$u(7}|C>g*~x`7RiiAuizY^T5RCweN@hL9r1Q1xVimeFNMo1VI3MRJhqL za~MZ4ji9^8fhsXH|IFpA&I^mE?l_A|&ev$Io?O9!t$Ox%2hGdn5Fymi9-PfJf9I*d zkZ{r=i0Hys+WHnJh6>R#kOtRwry9euD8$V zF}hFxfc<5Uz1E)Vo^xGSYlNr<9+w(TJOUnZ;wpuA|JG&VF4fq?ZM#4p{`6(_d3Y~N(yg8jP_2oFUKgOm`>nP=L!K0w+ZpF7y zVKoghZCvaPUXwh!ZuRNUYlbCWLa`VnUvnV@j6$m=2W}dQa^x8**?R!nhktXk=)`xO zeJS^g+~%p1PMT@q)cFVI)2cJQqF3&Ki8lc)V?tEV-0+FyI-y}w6a^#UeWl52dM^)WcI7pUA(0?dM#tt57F5AG-QQu zX}YvAQ3?z|HIphomp3BoQijbtutuQAe~FSwCRW&PJH41_>kF9pN*y>TLf`ex-k9F< zx+$LN(qU2}cm`~;LqCB-VFqWT{oGU-(fLIj_jZXrZW zg&~k2Xv;f=-1wi1Kwd5NyKRxV=q$)yvS=Xo%@ZuFJpxGFwkZ)VK+}oL7Dk4mO{4{s z4W~TxKdGUH`h-)QVN}d3wrk_&CeE9t4zcIo8_3qn`a^m?#P|!wvpg_r{X0Oha)+-@ zA!DywpL?_NDzy*8HVpCEZuk;ZQ*ddgN4x_d^YY;om$_R^3PP`k1Al-Sx_SHm50TZ} zI88PZ94^h*2*wkbEA6il%y8PH2@Fc>q%jO7aN2_r3~CyPfdRW$!A6JbnY%e9^@^fc{dVY4pQN+@7wT`wOck8mpnzRY9yataI zy25c0lj1UYC_eluisx#KN=B136&HAc8Cc+7$#5KAvPkKvR=h4cF941D5O@F>wX$}gJOp{N(2BB0 zf*qBiF}h#s;x4O`u9*VwhB*c3@mgcH?$rHd`B%P1!dFe5nnCaOJUTs*HZ~z1BXfqe z*1-Acoz0;q#3*R;RwK9CZzC9Ur z-;qH*p%$$AAb`yf3x`)t3s?oq{=hA2~!SuXBES!?&l%Z^Juykw^z z%aD+Aw-CE<^QN&jvRWG7;p*wb@5JuJ31fh7#Yj4_UcW%JVx)wfoA#Cp9rOmt!IsmT zv7mY*EV}nn8Y{#TegL{Vp$_7izS?(x1&`dFY(wo0HS*kVIj5b-SWVyD6d1NRn-u!l z71AikfqihrV$?@Y_+6dBn*TlL95pTs;gT+#FWA}}rMRk{n?$&~B-$Sp-Fh8X!cnHw zc2hjrIlWoRz+{bbYSJq>9_h3S^adn-TmRND7qPgeOP1}>fdy>NcT3>qQlI@pE^Eok z&?&gopn}NwM%7h=%7m$rilH{}5i;Qk+k{#lY!kBh^mTDBsb+B@==nz~M!oWjmp*(2 zM_Z!dF;`1jN?ZJB+?_f1<9#h3FBXg&Y1A;$dI;?xNb?V$VA)YJ5OHcm@!1js>Vcoq zA>>jq{&d%;*8y(W6{e0EI5wcF4GxD|!lv}FSoq~a@!pA1Avi;msRdXo^Kx>LzXL^~ zBFzrZuNW3UfZd}w+on7A!`iVXG`P@`{aVfW)R^UTPh?K8?w39p-XE*XH|4YwJ*H>~ z%J`=Rp9UZRu5AXXWM!*N`Pf>E2$ffRi3XcE-vtKwPk@W`oMi;>es5^o2N;QHE$QAJ zww=o5n{e6fQ2S#w+}-H#3xnY-o{~Y%aSeb$u27Gr7)=n#*<_L~uiFagc9iO@1V#G=iv6r9NZo?c|Ftn3vg7 z$JDV7Qto(<)XrKP!2qS~USLK5d!kEB&>`o@6+S)7!jP~u1ilw#?R->rH#!(~Tmi3=?BNnOk? zIOyTiJf>;SVeobaWMR!wAwwfx&WGrQXCA)6HCdj6VG(u3<$Q5!6PLIio7Dru=PT__ z``Ropnm9A{kE1N51qK~6XeyQRn+yhISxv-QKkxh`e&4Rz2qSySbJGwI+#07!|86tv z?)I1Lx_X)0#7T~p;2oTF&T9WL?(5%l=dMNbk8QpCh57(UUL&FW&q7y8hiz3!hjVuY z{I|w3R88J-LkOu`_W|(d&_SK?dBfI}dV)BiL`_%*w}_yCpv9<9{k069`0XVd+XKIB z0gdd}sp;-7)*St_?fzkLM?Nfg;-0RM%6*_33gfwt6yXA67Q|pMlTS*c1}$s&at8JE z0kcqP&X@K;aa;%hGu@dpDg+|P(Z3fA9c&vCczF-B7edOtf7chPQ9nZz8#^Hj;g3|< zE(d;P#_+qX%q(O@OCr6@oMPpy!rW}gCLWqLLBh_gNF0ulN;3$lA2A zNYFhGv(2cU)uwTUblnWyT6I77adn})ms#L6+3Y&b9$9R^7B3=~*3;LbGpLC64sy1x z3~K27a^_eWmPKe?NU6KhG-!|iR&Jp5biX3+_vn1xh#R_s?9VLZK0 zC$M%pwW|T(=f@}1@!ItogSw@MYSM6NoGZ7O7j2lQJffv!JY(JpuaN#kJ~Qedl@MB7 zKb?*izF+B(Jyh;>!Z7 zut`uG)g4z+!{!&Z(f+HuNEn7)D~Fl=u{G?I@nM96Sj&!@dF-sV=05nBxOSsxh@qY zhaLuvzQx-m_{c=t_P;;OGy_C|NvH1rOa2PrZ^|>dp%#+^O z#;dccfv@2*yA3v(jB~C(mXX=|{K&+1p;Gq0WU!em;$ro+I7ufaWw;$)UOqPD^lT;h zBRBMP9oy#5CD{4-&)5+e{`RI#1@bD0=A1D>gesjd=>?!8&^WaW)Y=;*JhhA`-T%_$ z`+WSoLZ!pV{q8_6pyYNV8xK^7|!Xh&C`AbruY9N z5J!SN*=8B8kp{mU>&lIQ=gt&!IXtt0uPVCchxD{65Jzw^@VIPsU9QYJT3TU1&(B|n z#DyK-QUJLBvh?CbifFalh#4>Ai{x6Te@je&&S+Fy#*vd7xbD+6pnp(AwRZ?#YQ)Mt-A#m{ zn3Fq~{M*wgUO8o)>~iz3)iTV=saJ8{4-A@mw8FMl2sLyqdS4haqrON+av zCI1OtYFM@A5cE5g*QLk7y2Z1yTJhrE74_(7CHP3LCSD0XX!D^?(Mb1thm)#agG3KD zSDk9CK?mLl5q&%BA66%^`Gat#U)qPfxUcsY`OQFLhjPt2@=y{rM%gP`Nk*UYA2cic zmZSi@N6iuKs(Wbj+MGTqcu`Vtx$SA>V9%YAN{(kPr1~W2aFzj`F6~u?{qc9(>A}U{ zv02Vl>1Yj9Xp4k*QWwsM(PH?PNk-?o@n76G7cM0HG-F; z`7}}=Ek&hu3$?gB0_2HEH!NtgJQOM~MYaw^f>8Q_ESH#)t%BDR3ckf8=!b?i)#KW> z=VTO43YQQ;xI!Qn7=I4OAE5vTy8sM&oRYy$5b@p3T=~OLWa?}AGi#o}TIN)1-gg{g8dK0uie8r%A)*cywo&W^xkU{5FT$zi zBjN`r@pM+twe#OWBg3h(nWi$r>RcF6dNVqRM_z?$Z?KHaszYGlx}ri)vK#=Q4`ZY- zp6fNU?K`0JHS(}G68Forv{wZrs@-LCit4wi5Wy5dIK-RP?0~T+489W6&F#ay(H6OW zEs(KwPSPROdP2#iXcyWE%dFn`$fEy(tGlMtF|jn3d^_#ARod^XNK21W7_*62U+qh+ zDvwQU2hEOm1fi766$@SZC``a&M5GOZmAO79C>(qBN{N&Z5T!yU+9reaDJZ%TiBMD+ ze{;S&?&vMmy_P!fusx4jj4THcXj&3D+9>$B>weja6|R~LlEdHi49m!qfob`p?I1GT zpxZYcOyWuCMHlN2G?@#^**<5-x`kNG8()jSzNgLOXkZYxw|D8uqE7%Bw&HfwVINpJ z95&Y9Jn<%a%MTmO1*T>XGniv>Rp<(|R6o>$eDgA@kUz!NZLXI+2&RsAe>kQh3EY{y z%JK~}1bX&QJWpP)xaj7w;u7E{pRwf^hMhW(8oo@Jxrk`g=8B7Is0^e$9KgXaWw8G0 z&BEOeICr|*FhL>ud~X997TB}tC261=t(P_$NG(Ez=at01VDC}Q>*c&WSsCVKTl{CO zD;Y|Pxu;4B+vj!;ajYBr1(e{vwe4kn=R?N8liexZM}!;oRZ%z0<-)5C`u~~T6n$Ha zNnsCoHF*O3Ktjno zZz*>x!!0omcdB~X6B6T~%DM@8wG7GhbkO4@Q*0Kr7!Lw}q#`I2^s&(Q7PPZXb|-sG z<{L0fn`gB_;GzJgJU%?x_l)-XPeFQinK-eDfn0lQz!Vsj4)FEAp^5UN#6N4c)ft2F zJ-~aFO6`)u#*!4FD^YZ^+FFZkRBJ*5eH#UxJ7u0jj^uZo-pLDgOPt@Sdz4=Ye)HAs^)t-0lEiIfjJaU*<-bPb^rW7-styhoZ^PE>>;p zzKDWDURpV%XtTRADe_;%B^`Ki^a$6TWh*T9;X`Z}QXy+7c*S=O7SdX}&KSl)gv%>L z;3;Q;_jvdT_hVG{6U~x8QXWH^80333xR6yd*8@Phd~CGBlNE<4WC|&zD-iTAF@ZsQ zXSmfEE`SRZa-_XyEWH2urC=ESpKdofHvAt|z<zK7NyenM=yTbcvJS`k{haw zeTSYK79P>_gtXpL0`aqLi$)`bCQfkGiBor5#xS1STP$+8o)h$T%B9dvIl1IOXAYo7 zzNFv1I#E}#<~pz#FHrt5C$T)H`(M%Iz?x=0wSEw_zeyAU8?LF zFSAQZQJK(W%eoI(V2}GBcLEePjqfURp_PDf}u%s8wM z9s?ad4)#Tf{jH!|V5(MRau~_mOx)7n-y^6Yp1Ek)E5p+Csfv zV!8mgHOd$SQurLOOAI~}XcoAPk~!~(dW*EQ+Sv(@2iXT5yvLhV$TBqFk2sqap^O+1 zE>l*~u}dj++3`uUjz;`4dIl3&z|{;z&t7DoFe*N6g_;SO;TGJh?Ln3BpI>k#w@mPS z!(%`Fo~Up?f>KrWDe*Jh+C~-SK>$1pJW1%g`o|Yk=-xY+w0bl|%vNP5_|2PtOw9jx z+&ETK+p$Oj=|AJfB4!(N)6~@(6C0h0q}(nIq;JF%puxsi-eJx_wVXc!>f)Y@Q{A+t zTax&Oe(rq^xof40t?~Z`jHiA+)BW0eO${*~*RNX>z=P;3-st`rv=OzkUzZv-Jpwz-7Sae5N#s%|+I+}4=3AJ=u;NpVMo2T{ zb`N9m`{^OTwwjU{KP1ON;lJO7WnIK%k;wE)T7H-BmtMn)4X84Aziq>3FQh6Q`qV#y z0IKvET{Fo_GNE<@*4qzke9ZrsBUrmhb#Xu+%BuK*_>Pc zsxmrg)LErI;Tst)vo`jna()a))`*BAq%)BG$fA0mF_iPdbA&#eE^8aH_cl#$NR9YF@$DFdRXQ1*J58L-bv^WZg2Z_s4~kWrLuew`Sk`=k zhS>pG*ZZaa=nwIj^qUK(KG66T(>sqi{nc|aY)p_-+{lu(9Qbl{y%wk^d z!7OtjB)8NF4qRuBbHZxkH%a=1+$5=fwUs=3j!jX4xYX3lKw#AWIEmi zNNql0frh;I;?B9rKv0xLl(Lir{sN6`jvcAnBGOPTg^o5DH0912d`~)XADaU4<7kNe z42lpS$PByFc8z}(vn#a1aucLl+|+zlwjF`z^qeMVD~t&rS0)_}n+$@cWLsFgy zHnZ7Szo4zY=)5&V`uF3Mkn+-rkYWW8SjqZ}PcmOZgQxB|QY=>H?=?A?pvOrkGC?h_ z)C6rHUGUUQs#x{6u}ecY>xKHzostTcOl?g%WlM5e@oRSu8h!PN@u*3Mwypqo3K0YM z7I&3QWtC}=9L(qZ+4qUHJFknUm$Uf1a(Djo+>#GUwE1w%BnEfIMovIeLMac(Yz}OE zr#gtg7t2~N80rijNEWV}z>X@R@PV$Q!in528>!Rppb@)f53ic1sDq$_DPlLj z_-^L3_Fv*~11frUtx}~Nv4nnnnTF$lG^kVZj=k@xUy{Ewq2Otxv9F6BKKO^6yvBNxU2(xV^8cEK zl}>Ch|5Y1m8p$}g?{t!G`6r^&aOmU3)3790Fv^V&BRO7`*}JW~y^}FyYH0A_St1JU zTUOaZI)hrdBo*Mb))ztOPv4}~(#lz`wNNPs`}jS0J)L{I$d*}BUNOqeSHjJwFbd9h z;Zjv*j+b^@j&A5KEYHm!cUXZ71!@wz`||1ISn_WXmc-fMeLPl)P3yNCyys1anx z9!|BOFI|I4`(IN~FHbA}ihdZ4Q6dD9X3OVzZ`6@#j|H53nsZt`%P!hca}^Lbr%D>CbPKq_el*W`Te zOG*gooc?gsiz)lk1K5~j3hp!Zg`0t=K-d?t&RQRnagKmxGQ5{1$}g6gxWQ^@X#6F- z`HZv^mXfm}U+>a9NyY$YcSivHoL+Yl5_~Y~&%?BK7#N;QMR%bv!2R5L23JTi0x8gT z2n8sS`nhrv8u2+wGKBXxff+98x`-pLoGM30py0`h_8a^p%=v{aHKkn9A!madew|F% zXY1uXROe98hQ&XK>Q8l)*_~&M_5=y_Ly0$F70`AEcI^Pf*?PyeIoK!+pJ9_&s4vdU zI1;Q~*T5u)fSMHpPU|p*%1rf7hvcf zGkwU$0pT={N_Mk$TYdR#`nEH}dN&-mJq`MR_CY!^nUfiOJ;}orq>MX^o>hA*stDM_ z-3w;H?T%`Gvh{pFGhQMoXd}B_>lH3+iM6~}M5h_wUUL>^%W5pgwI^U5gnwwxw_r|)8h3Wx8|JpH_`{9VWMP93Z zT5fm>duiSVs^o7zJRgrE?sjYVZAq!}fC@r04 zK^gEMWR|(A;RqR~_rXE{0)RoUEqbP^(lt>fS3q%cn1O|AoW*{1)d|EKY`xup^ZqtJ zE&3C!P=q~21$LpkDJdz-Jp}JQXlaFnsf#vJtB`peS_UylAHNFD#kGcY%fX4{o8a5X zvbDN$Oo3wBn9?6uJ?@k;(F2%X9cvrzrx-rj3m#mypkIiKLj3cDp6w=|tL5q-?rzcO zy~*Gt{I5B7UMFl+6F!zv+k;s2L>wXKqzGuE5*wETZt2n%Ws^eHQ|OX#=I8OWlOqC4 zFY6W00E&~&k&g;O02x;Ap<BP|v5)E+WyseoxX#JwP5=tjN z1K-$q%b8mg*0Pm=cv^(kY8rB~Ue%d0PTbOKBpN<0@5D?Y?*VjFM8M+S*cC*l6D^9X zNSTKD{kvw5V_xH_m9hC|fM-{L1WVSK8KHf-;Y$jioJ8;wouoh(C~q4ZmE1F{JH^&6 zYZ!+?sBnjpCeE(BCiK=ArE(p2w1%h0S03Frd6^+zl8&BE!RY$zXR|~A%CY*PNmdHL>Uu3u64N(xK8nB0Yym*WhH!$-51ABo8qlVA9ic@ zyuKvnNfy?^^wCNs#nlLe53ivzD@Lte3wY&)`5qSgq1g-M0}_T61~_ANHQ0Jy}Wh)04l%=a3t-v38)& zEn*bI^O%m|jf?N>L^9z(L&0075k-a5OQkDBj}a0zmk+e(DthpzRLsIrHAVDhqF3?H z-{|u%tN>*fK!#HTPk@Gjv(ZKXu>1H(h7A@*qqcbQBrx!%gB|z$+fqqATWb2_T(Orp zEZC*58e3T zK78lFzPl_-&j2s)B&^}zb=tPq*SoOtwkda#Q~;?}vMmFbtWd1e$=RvpWiSH42JhcS z!|5GuSK+k=Nv84ezN3Z<>_6Chb+sKGRX!!OM{GNCQt;N$!4`nHr2a+v2nFy)s}XIu zn(*X&xyqq~*Y577I&lJBn`ZG#dV4D7Jc3=xYi1YVkdt`EIOV6XH!y2kewbT90(vDk zB0y)IVhse_>50SKj8bZyhoA75{=N?|giU%%`4c%N-mC_6z}siU>psJH@`1m>z+H)) zX#2Q<2&zk!v5Kh6t~Q&suF7&?{9(}Oo-1`Omdz!kS6ld9!6(dtRz(p4oGIh+r!&lr8;7@#81tr1kU<(>C zcv4l%LPa%NdFRG+@F5p)D$p<)*^mEi_w%c`U0(Hqx+i%3sq^Xk6!)m7k!5e)<71=Z zVtm>ZZv6U@%LE1IVE=lv$$%y2%V3}p!6zo&L)$4Wh8JWGbFbos|9|kA6 zmh`^!@U!2+9|xg^NQ!{U4iY8js2~PZo-6r!n)TyRWGpZ1^=a$T?95vyhFy;aG%*uDeju$YqH5rokCp&!*|`Fri@{#IN-ZPl4qog1+9pytdwc;*{QQb?VLGW~`QZfehj;gI zud9_Fca5Nqh~miJC9}Q&cMZ-x#t}yi3$bPiMr#k})x}~;J&vtdEIWP0A1Nne&-SB; zf59&futJfvJp;=yrOy%2VGC_1`tbL;2_wZXU6H1A0>BOe@*5vpth?k5^0@@@%d|lU zjb%f*R!I$g@dH|P2>NkNwCrYjbbs@7AHVuxb@2;(^8g+v7p2Au#JUDljf;`qqR0uB zS`l>H+*etODQNEH${K9m?c^3Sw|k>oB1u|ubzvZ^15-z+M!^egxbV_n@Ns#2#kp~o z*Nk=LH9$i^g6G;|Vi>tnUR#s38FdxxeQTW*c|D^(a?DYpjl`Lcl`#o}uIYV#GMRoI z$)Z z@A3T^;du|nUc!~F=&s}w%p#-^O_l|a^_DtpM1*8V;)(0T@5<~$7-kdLfKZTOPoy@P zQw$N6Uj|7;L6A%@=x1NmEMZCJ%v+4GL~E8d9fM7+DV?}+S|XkBw8N7ikQwn>$iXKO zcmNJZd*LAhV-|QHJ^Q+SbmgnR;`Clf>?qgG;_If-27Tt67|YNtTA6?f`roR%%NUjF ziuJ=5HM_m^H~q-hx&@Nx3h?o>`o5sSOkZ>AH|6a%d*B8jP5$YYzl?6L6F_A0WmhRY zt<{0U#ayix(`46sk7Ph<+v`qZM6y;>#{n8IkaEJo1~G3wgzFfg3u~rD`wKTQAtV4n=zDfBAJ?;Q}ix`Ptue z=7e2b<~ZTllzx2K{uC`LG162oDw$sGQbjpr4EF&KTdVe*S|3n^?Nt*Zuc0||jsr-{ z>9M=jUHWy?Qreq#>MoZu_WhTn@@aLc`D!vm8%w)<3OdLpZ}w~S2)FmqD=Rip!g#A9 z-)Smt2qoeE7-}Z{^3U7716|X606ll!eYdJ~+cvg|J`kN#Hc=03ZVts1&e1eg+c$Dg z&f{*W?5lZ+sfE)lNSDVX_bUq=SOKg>C8>q&(-J9s4}m54sn@$(%dRz;i87E=M^AP* zB$L3{HrY+2U*!-u*;Y2Jt)`?WA znLUTd4e#c8s+PY%(dGs&`(uC2kKXJ!m$YL5R>lv#wR@TXg+zp}Y-cUY&JB=iI1Q;4 zbujw^Mo3t5OV$d7kiUo^5>`Zl4~J83&5mkGB6sZr+omw}8e1FUy&@vjp;um>ejEUe zn?d9y&!>~n?jVcEgZc<~5j=?9BiLq}#VWvZ2>_RQ)8aoa$BeF`*B(!EZp>L6ww(=w z5*KXaFnKb;?g=bL&KTUJfRpy#D>n@i6Hn+31I4sb{236c?{h*G;Sv;lcnvsky4ysw zPDrAZlVPq z>d4^4(?t+cW8X${n-g7Vi9c;l122rR8a5_N|G2?4Pqi{ z9buW2j=1Q?KMuntJ3~p;msD7uHXyN?nD$O80OEk#hre$lC*(EacG*R! z9J6yk*1$3kGo0l4-O>{$F5~*2JwBPeNhR@t+kq4G;1j4manLxZ^FucPq1Pc%miB^VpZdSBESwP066C}Jo(O+olJo|VL-NTAK z0N?`~W`a@}AE6{8JN0u{!X+aT%&^=6)Zcq z8cOMy6;!d}`R~e6G(Y~0(Tf?KrE+*05EK(E9MHB9@yIW99@D7}y?qUZV2M7c;}+C<)(zwkg^HAi#+l z(M+~hBKioZqIrBr^DwU<>Ih?B$T+F#_4+Ni>Idw7i1s?$$8&n9UmbPEhO5DNdyRPz z!?);|Qymm=2|YiXUSc|iy+WDWM!FmgC%e9?P(mlAf_(*ETZ#(CKv2pm?mKFuvWgQv@G5Fe$6gG8A;Zq)GZy5oOXDyGR$T2pfSzR)kWIM8waA@Bq9%>4SZ+*x%p6 z1%=14!D6>3qV-e(1sv?~zdVb1W$dQL>n<$+fY;i@F|<$%dad9Q!jLTl=>X8>+9ToC z$Uyg>LilV5%c`5R71*o2TTkuXi%((PzPglb{*fbhu9P+Zp z7TFhH@YXehf`+;AHg|z@ZvxcRYqy%g^HWQVwx1w#C-90 znq96M7s2GH>$Tss%7N@-^={U=)elKeXs+n}LrWc)Ou`on)M12)@BqN)C$fo`G;drL zB{1T-EYS!v))V^-mN0RE{YrUX4nbFYK5tR7~Eh!j=0Lne!q!Y@$s)aBnYz*>$tyd*}5&le(#_CV6N) zZlxrqihD+c>iSeSx&yvZ2=a?=VM8S$kM=X9_~7OH=E>rUp0j<~yqWLaO^8s>vvA5X z>~oNfUwIEx*v>^tvvax{Q}g>8y;am%_-$Lw@Ls#3oh`UrA8a6D-6205`7*c$_Is(~ z`dsUl=E#B+x#&NXP7mh?6_sKo1Jj^#pV}i8LwRg0Q{m8ee35Au%^3!<<7og2phNL;!gL?=oSP`JZ0j~?EmY+m!XH1 z0K))?l|%vimUUt|ZYxqBScGFpJ4_6~?dZk@#Mh7*3GO`%db!1oIDK0~%$fcMwTPYK za|L~%I~2j56LDQma*btdM@P7gOjO$CYkXafrpGJl0^ z?W-ew*XQ$t4twsT&rg}Ap|ineDG5yiYzV{om%_WPKHu~f=aHy|VT7jm4aB`K4k|Po5BO5i2t@n?p_6|C`0(cx(@TdTVb(ZUe*$i^Y|b1}j)Lp%(pnC19iV zD$O~NFmx@`V<2LJRYdj_aCZf*1Ww2LxquV<`LO>c1m1Tb5z@KGCi zhe6WIQG12ZZFTC;p>o1E+$RXF2BfHwwC91Bf4#bVZ;BrIX;E5@Z+RksPkT-CxYuv^ z&r%W}aRZx7r!+WEe>#~B=^TOno;mHwF9(y>U6uBJA-2yo$KXZ1vqJ&=qjvkp&si@t zSccEsVV1>(2eJLr(1CYWz2Y^w(LzT@BX$C9I+7}Km8J9oW0W2t7Fco_g&oG|Oc@H0 znU%X^Y~@zWZEKiM>f{X~*u)aGSLJ=5j0qWs0SfU6bZQm)OuIa)kEkCYn(!Oi|IBqG z>!GwF>!IF70@zvp-*#}SwyxsgKl;=^4&qA2=XDOTXPld~xXSgA**4aj6J zGLlwQNRsDOM|JnKYlQ=_8RX#Yo0^(me(DjGy!TI+%d`9Ow#bMO2Om#LzJRW-wvJ_y z3M$#5!=ne0D6H=^lF0%s?8Fi46fD4fTU%EIDLf%5F6Eu0P0<=3p?25L;lqI^>_)j$HcH37IY{&DrF4?=hb{B&Do-ZU}kCI4xQGUiI7?#PgcF(h0z;<&6cIidYkvkpUB+)d#&g!ji|Skn!t{_2E-F$ zC&ftZKpCp9b|A*5+7cPkmQ6Zze;nPiqX5#rL=xj9x_ilg zIWh_e=|IK18@UbV!9YM@sY#pZlXoHjhqcXynfK6JV0s@+ZaiOZwBu>Pjrvs{(el!@k{%=hBNRKFu!F%QsNah)`; z{mvp8L4U%gST^3de$kSsEs^?X_+)oTZG;9*3lA5irkNHNDUE7I#I zD?RbIkPDWZJ6(QC;D$xnE^Z%$)|{+*R3D}e6sTH_bU}s%vFlkA|6yU&X|Gxs|jZ+$a zYNEXNecU3xiKCP!x0x<5*8<;^-6X^WN^)*T7~~ggnvLLtfz&X?ICJQlLWc}%9YUeE|dqd&f+5!wL{1-cS~U;Q@zDKCwq$A@M-Z?#ra z-lvZcg%gneYbAs6Y&}CWvyEIaFYQX1DYBF1sFauruSNcMgtkAM-)lB^lw0OgxP$d( zPa%GuX`z}~V~MrDX_<^VX}Ek(HuKrTA5l)C(UfFf^njrY0r2RyqcZFeb};rQhke}Rlt zimw4d1X^W3`QIwE_~!3Rm=@3ii~v<^&?U=t`W(3dvaF`2E-wAZxH&k8b_bN3cWMA8K|$ z&mFlB(Rf69R)&<#5`M|BrBuuPY7j|C;d-!CD{?aEA5Keny~K(6R5Y`ho*p_Y{FNTU={r@i)0EymAO)>+=_s*tae@lQP) zIl9FyIE3(sRp>Lm@5|aq^%!+xh>c&@xz&S)zhr-UyD>&eR@Rvh? zJMU`C(f~dg@H7sWIfLi1y|{NuYHqE^a2 zy41spmy*PhQdYPA;`4R^l&3+kc@6{ssL#>I6_cHr_j0pYIN<+XScW*x%WSx@0w=Jw zI|JHKc7j@hU#yR)=UX|@-^GeXQ=Po#z zCxXpcDx2##ChGzxs1A?+P533h;%sK~dG<G^T3X+b0S(6iYU=@N%pnBaFl3Sn`HopXs}aLhFn6%_6Gtv(hXT1EID?Z$!FVrQ zUt@Nhg;bL52eZEj`#1bPeB1zqsMz3Mgf5MtZCFpIp-vqZ(QsG9y`NT$8CgyVAJrSW z?a*fW{dBb&KdEp3x>-020rUtJ@mDo_H&J01Pml5(gUjo%|2;;$wq6+!%B#C?9wZtj zL}#@yp`C0VpB;3rXJA{c@{^^)PJc8Ie& z7DdLU%&yaVgucU|R{x8ub84(4(6VrB+ji2i*|F2HZQDArZQHhO+qTtlI-1Pfr@8;2 z9%`d@t+hVh6?yKaNE@`txX?w7fNzMqmt#?e7{h-I($#Yq`k5%u#_+7AaziC;U9V4w z^<7=^iee$QQ)7vW#~pUR#Ox23V@1ETCEPo8!@pm7z7Zc1wM_n_fAzXWm16`jG5!DD zYWc^Xgv$Zt{@3wP5k72>4Np~gx<#uka&udw_@|CZ*FGaeaz&Ols z@In<5ID<66RUlL}_r`IM;_`u|pW=~5^kzpOJD1N{{T{OO`}pGuhqK`_li$dn6FY1( zK0Y;pR+O25yO*;3hAvUrrH5Q26n>vcoopi}=W`PbqL3^Y9M_wFwKj6d8Nx~3Krhv( zMLTNEF<5&Yk00d{-Fuqn3S%^IKWy70;K?)N$aNY3;$DNzJ5otLHI0pASBi_pPx=>4 z;)l7oQ1Ac_!3mtngs*SF{l`~a;BY4}uzobV70)fls%Be38!BIxBamy(-I`MR_!I!T5#nV z&fS{X0J+DtpO37wBRlD*D^!?W$yMok1{0X><0gj-q*R@T}2Gy+OPE5eW2#e zrQfOdU!D>|Y9xGzXF^Id?ZN@&ZQ_pFJWD@-c3jOZ09+WR(7Jg5oi%il{j33Rx8)E! zN-zF#TzarJP~5vp+?q#Jq0L;(7l9!b3qM6*Vee$6))tt_9hcAH)&7c#xu5nrrr^6v z+Yl^psCc&+_O9rnY7Gw*uhbFdO;!<1GY8|i45L4CHNKmi7|G@wZFTn5F0Ni37L>Wpt~%ZUp0TAtng z7fI8jI+O*;6nyaL8Q;BC7Eg@+48E+&-4yO4&co#h&wYd}DsGfRT@?|1k$Hjhq&*f` zUthdN9rq0>P-Jnq>j7SXHJyPrms8t^@m&>(@~qS)G=&6z$r(X|upIUXH_k7>j4s2&}I8xN0I_Vym*I8Lt;6#V`T2qEJ{;eo`nO zaEl#4Q821J?LLGKC?(%MM+Or$^JxDVW740Pdtgix@}!E#*xcbIjlTR*y>$&HRwMm+ zyNAcrM{%}*W?a^E7K;acHK)lHV+}){H?yt4P|zg=h8EV*w_MKIS1$p;R?mJXCv)9j za4gagfk!mA=YOEDDttO`84}GTz1Tnd$BtJy-y?o`tpnB*ffyeIyq#{+8g+pc;_*;$ zp?H`CVvVR5C$ior^8z|ang_k{RZup@&feQIHbG+XXzupAa2XxorXE?>NCw;wA$tOC8~b>COP$aQuVHn&2xvbf1FjnrtAm?lm;} zYAtC;cHZ5;`6@vw;nj}xjN>+`*Dk| z=QB3JQ#+KqjmWj>&bhq7t868I9A{W7o0E_O=7hD40yQM+`3b;MUS-#Bbpg?WfQPxi z3tw=_g4I=H9ci@+E>`cMm>36b!7;VaQ^;8BGl(TQD2Vrf9tHafIxNTV#Qt%UDCL5l z-<|e0S#^>~wII$)LLanztmwp2kgEvWP4_0D4%HUDxJxoFz)Gbz_$O=Q5Um6~i7vr1 z%2wAqbeuw{jn`~y$j=i;=GbxAgOxPglQUD4eD~jGv6EUM4sQ{rWDjyk7-LMm??73v zaM$0? zl^SR|;K|nyKmT3ZYC|bvT5(WI5`{^-9Xh{Qq-}c}-|p^yFn`%kChW&W+m2d4+WWXT z)uzQ=8F>1TtAl)lPm=v9GSo+SukKuW&iocb(Q{`exjq*qqE@u$23zA6MHysV-5mMY9z4oRJ--a&b6c|uFYdDQzR zQ8K(bf(h054=g_gcR-n@(?1O1vDqC`h&3XGm2i!26Er<=yyHMJYUtPM!Pt?ve!_7u>Jp;h{D4Uh+v+{f9%((h!T zRcB+Izr>)V+Aq$$oO1Ek0iti=rt3C3_V+0=I*Pb#rH ze<5SI(~%2<&DHNAjg0zn&%cBHz|6)=SW&rAIhVG>S)@^iRU9-gK%Gi4+Y2UGXCM7J zzCr?$6C?7Ig7k+9!|z_9pdby{Dj>^*O(xMRUZ#a}RrE0-_dV7401ea??P8E5v7gMX zwpZGfTYak|Uh>g(>`f|nQUe?YfCgRqY7@aaOQn_LnLk~9i%Byc`PuNf4)dP61#7Ui zbno4v0(d#2x%@^CFZ>tmPX$ZT3!nI|J-qYj?|UZTU|MHu7+$Pr7*T#YwNtf=5t?kY z3VKoONER(~MPbdNfM4S+u`72oy{))}krS)1Nf5c1y65_rqNsTf!Lo&R7jbDdcyAE+MhPIp0Syt&tyZ(nP_c_~=i5 zi>r$mD}n~vy9^-ENcSVz@GMCuB&%jH=MvzY?=Y4x@jglC1K4l?dFU^?+p=Q}clJOe za@~l3(vq$;P=SOJJl2`cy?i7Zyva*~On4#8%ZBla!z^I&8FG z5p7wrSP+ik$%NXeqkP*j= zKaW~~Cw7|h5C2i5ZhNMbUU$Gwc=UuZUxeSVY#H&LJ+fH}9^83b;(LK+A@ewNrou^%*o{^JOFmWRm)mvd}p=Oh*zg{9n9L=A+z#m-0Qst}zEe}IvnIKKFq@opg z6ZZ7)7*j|ui6fyGBK`<=ub1UR+ooPq%ON5NKRwzywIO+cv%E@`$1YkZ7|spR1r!(+Dwb|~{n{H-zEe_S+oYmH0?!rih|>SiR4s~1 z@ltc=BE;$O9e8>aup6%84-7l6`(%y4yuBg&R|Nk-tsG7@xWzSbZ&AJqm@HqDC75=n zqr1hEN3#?EDq(P_sChDc<67S|-jS4t1wdH#sy_3sVaL|^W#S2Vi2j3GF`1Xfqw<5G zp^$@h(jUGmNRXMxnmouOdq47SuX1y`bv?3Rct~q=edR8>n6Vi>?YnJxc!I&#{U?&H zAK0@Xm+CKAQX1Pfp6ccPLD~No;^9(UFE znuVlJ`koavo~W3brycwzaULh_gRtB_?Llu3 zZK6V^;=P!cUnH8awbM|B<_i^1eWH7q__Le8 zmkUa7Xcw$?ID1(sIDq=jV8%Vqn>+=?DGDKxR8><`+w+lKT~kYTXPp<)luNHK{?93# z*&1YX+gm-Q5e5XU6IQ1Y&5nXNzQY4ZELAFJF$l@48q; zWJR(UB5*7aYjR6PR?!WtG2snJv3zS{Zf$(mk6RuVo%DXV~Vsgl*!BlAHR;oZ-D(LZiM;fzx}1` z-?5XjRqM#9l7@KRHKPzA?6~3@54eQrk_l&I?IE!t9-5`2IK7S=CKT7x z`aC23^(nbHhsWIC^?+bKYmM}-=b-UXS-Kr6)J`SSJX_a5X$Z4f;D(ut%b>We_6vmp2Otsx@NAfbmURKfzyy5%>YC$bEZ2I)!?-~QNGpiHB^(M1=D95-8$wcciajL zmXR=Vc5YewT7Vf|7B*7~xpjNx#D*9c4^x%$?d+wbz%?PL%4BPk%4>+`_wbe~skBXL zDyV=X+H&py?zj!VZOxd6V$t6-3LZn022Q1ZP_{aRk>CSteo9+PRx+;zD9;h030?FA zu&TM*1SoEsOjNvRkS??*bA+1m)f}N(&w`Czw)UWgR)ESIWS&j0G|BuFwa!;%$z|@A zmTIF#f~T89k#dMh30%5DBP!#KHRDsLaa|-sm#j#N+sRO*6`0zB6g<`-+;E^4e)mnv zW<-PC@LQo0b6^PJx?mzJDCR3f1&X4w1Pke(U)+_Eq8%;XCbt)w+mim2UA7Udt~EB7 z=Wt=7+yGB>Q`Js)vVn!YH%C!Wn%~5%N>IGhJTVD0p1>&VJB{n6)OVClrthX8 z;uYdIFp~7Io?10-w3?Fy8?fNWF<3XrvzQI>ieh&sa#SU1x2U;2b`N9-Rv*1#QPT;W zlc4eQ*a?XA`-+vYdg1lIS>~a^ci;YP=HcA2$^f`%#>F^)_p^OZ)ap+tDTPrGLPr+w zLAuW8as7tTHp{;RI^UIa9bnNu^-UfA#x469Yc*O@l(pN#Mt?_ZD?ESYB zuGxWxHoxhBsJ%vcPcJ}V-_}p&8J$OUEVwy_=imHI+!&_Uo!8LlT?azH2SlJvz%4;3 zyS8nK#~rS5H`N}bFQ}S1zy%<~&A#I;UI9CDYu%zgziPtQS&1*8I{D|KwfHT# z>NkJmMYEQ<9o;CY0!=r#`PwzAWHA5V1Mw%1%?uu#7dFU*@xt z?$Kw_Xp$pN^7 zdkWg68_t{1E5!ni@g&|f7u;6NO~{3F-N@Vj!f%_?o-)Zf^PF-h1P&(dWeSD%3jeEGLC=i zrXdS&PbD|?yUe0U;B}`kLnDuny8!C8;_9PRnw4Uqlr2kB@-<)!80X(|XqqTvrF2i; z=oRaHv-EP~$>5uCH(F%6j}lC{5~1L>7XwQ-tQ@4K%j*$4PdNhjKaKGlH>{-3Wr-$;-m$Xb`_%s68MYK3 zMA|zs^!*BixWmKdntW|_Lne0+`o52!_?-%tp?zm)D#qk(Q@Jyos<+hP7Ek`#03AD- z$3?v-(P1Vwz1OxMs^XzlOmuK9_Bjsu1xY5c81bJG%ld-0qXJ<3FV#h~s_g%c*lyT4 zKpH6r)anNXI2hNE+y)x_MGJ@{m17>2CK^dRjiiPPz{kwgjcUI6Y%Q)yb7p2Vlfw?2 zF!2i%c2p~KdTNDJ!$2?~YKKA8*0O$+b z2~3*-xbk}X?^EBdNC`q>^=yIZdEYT}hIMev8N!Ihc&|gRZqOvj~PT5*g1 z8LvWtT|2aRrg62e-3se{LhIcu0Q7q@3g~oLCE;>Xnrku#-N(zWL3*&Iq+$MgZg@@Y zY9yv~PC#>;u+BvW#t2A!l7TVhxNdjRibPDFGL3n0!&KvXc zl#r&+(C#L0bAsUxNOhutC);Ys*t~aCFhIFJDrNP-~R%juWm*%I;L+SM$Xw@6f$$+*xXUR{hJ%eZQ1czW) z%IWLN-*kWnbMn6ymXM*01vF_b_!X%^7Nv5(N@TjB$DsqON6rg`8bC$pUTA7@=0393 z48dmqJ8Ys%rtGTW_02FBct@t34@xx8KRj#q#>R?KU->R2YGreUuQMc0TN|5Wy~lR$ zLRo{bz>QR^hHH3FZpgCCH?Z_iMxy|aW_DX-j^V5K&{Za@w$V)r0RUM^b!{uQOm$np zycy&*4w1wK%A$4qK&tv9j3Y-F>UZ;I^)3%Hf`F1dGXHMISI&B!j1MGR_T`TGP!GVK znLd7fDkw8^*t3s1mIIpP3Bb?j2twAa;%e5WE&26Qb+M+nf%EY7%k3X}(}##x!b5q% zgDBh5=fLzcQ9L|+5df5tf`KWCq^YC&pRfg0%eR5A;F8`CB<71E2_f^KBb`IA!7JNh=i` z1Hl)Yw-rKbP}H|-5G(RXuTT;W9HQ&3YnG!p_sxE_ z@0R@tz&UK>ms#l|DZMCAK=pT3C60j9u3fJid-b(a4IeL$wEDI?1}S86d6mnj3(Mtm?-T#Bg^SEmmhJZnh|j9)-ei* z)7ks27A8VuoVPJbh*_|=;mgORB7qo7?sf_+=OriE|CLd{S?xp?S;PLZz6iIF&LlRf zt*7iqq%P|tJ`zLX&vm;0%PLaD8imvdz%^zS;-J7XHlYgehwJ zql4H0tyP6g>6rE6ZioZ3KyWj-siyUFm-|a!gW0LmI^ohX2Akgh;8W9}XCSD%cEyys zF02a$@GI?-ckY;#Z5fA6-0lFJvE9yj-^#ttR{pSr-9p@M_Lh>>23s-@(@AasS(aaQ zqT2U~N3N%wEQ%T00)-lXZ$w{GR?U&d@gz6(;Eqj+M)Aj#KgT0L6 zpfq515K#ct=+R*OXKIn%PH9*^hih}l`LXK;A5h1c`$dP|m-0qKGY&>2tJ?CQD&H>D za#(oqo^!7bBu&B5gGP>9jz)^B^`)``h$J4ou(A$8_;EO)L8aCBL3qr72H%-(Mg?7* zdIN-v5;I~*lgMC%^tgpTCdi5eFC-#SjBQ&=o^GDz8mTTWk5#+A(B-SU#s%!f3xvS) zz(;NwXjR6q`&}q`ZB)&`hY}GJIxiD0z8T)%V41AQiYYShVFSuoV=&(kE$CA^WAn!y zTEE=M_pg9^g7dzC3Vu?JMDOTzih%zbkKJn0c8BapJ-By(y?Gkds8=j05IErQ zL^SHU->_h32J?X{xMqPPu2wv9lBwa@8?GcD=@{wpO)MT1%2OAe!q%V2Fipo6t`+i69GcJ3$wF}j z&utiZ$mW{1`T;;4z@^)51LA7H`sPGFY)E*Q_@dCb)uQ1v>Qk?;&lk>dhP=fe6{ED> z$o+wP@;FqOtoeBE{uB(S{B)zLh2e~OY5?<-G{aPVOwvpy5qDPN}>BSU^^pi zgmdHi5`bG<)*LjtdArNO&tM|2Uh0%gREJV~hE|@02rM)L$$g&FDwSgAc?y0th>?c}1=Ap_<}=T{5P-+kM#Ovv63a4x8|#YLE--XCtpuXq zhe4bg2-M&`h@$4O<7POd)VJ#!y7WY%cqb}t1vKi!)NKSe z@62ggR4e%K;DD~f^35|O&4HQsM(>PD61(EEaOsR{E@yn~Ya^ zE?cllAu}-rz8{GiA95j!%kTbvycQ8A5=qeIdR&g=Qcuzl-8&DRXhx%dMWI0ZM1Fs= zKIJJSVL6O#R$mHR@ZLsa$R!D4SaP0Y=L~@rJJ&k+NFl3Qb6|onB)?k(Y(aC*F#+e{ zUic>x)bjT+VJO3HLjh~WZ@LBy4MaO%iP{U^d)+=dB2>CbMdCMx_roxuGW_B-(I@-VGshT0DRg&ewIw7}28TQFr1dq*{stbHKNI;+U$RleI2#2p{a0g3R^PNe zkU;W@O#+;W$Bo2nUO$WC5W`OyH`7M5E}R&s75d!SOUnDzVNqoE?shmgZ~74zhUx!P z)X{ONxJX*w=6L#hxV<`lo2$Z%Q~vif97kYlXKUL`s`SFZ!K+XO1fYp-kyVsVlc2~~ zWoHLKc?$dX?d*QzUqfu{Uz~$G861OKs>vA;=3XmT`_LRHqLcU1{>%Cy&iCQq^#G1= zFnE7B$eN}4+Smh-NvOgTh3G*|Bs<6APgH;qSo~8M*5goyw-00F0i_nRZxo@BQ~qscqto?k8Idy)fqUTbI!#Xv92Di&?mf)ieu9$?H)jxIoX zIpw@6o-ksIfLYIMCE2E4;nv{P`O8<;Nq_zv-ejAMgRj*wTkTPNNM>f0*x4633!}Ya zy${Ki@-@8{$<^-k!W?zA2lOX)5Gr(U7xo`ssC<~724Z1?I2e8fav$rob|dyJ?J^)>KW|M4i+sd z+ByPV@_a?E6Z%l}4VYYXh`c$5cUrtQ5@Ypzjx=(YpjV}V^4)B3KsaGtitk&T7mg-@ zhl+?Zj*7LAg+!x0+%AMG8GwB%JmZ{zFPcIisTr8HlwQxjDf(t{UqpSmpfGb- zE-~TL;}kJpc0A;sA$c9tn9sKTq21IW>z;3_v!x@l>?Fy>85|J^@90aPY~Vbf+(Ku# zn9(~r(`#zlW3E|GO_9xtfKCaps^tp-DL~zFzLmjBg2S&tV@QY9rD=DUucr2R@F}yC zFS(0{ja`-dZs6&|X;?$MbFgI+txO%v#MX9FbC;G-{XTlf~V|y_qkkM)BYa6=cTXed{>1c zo_r_X%7FgmXiL!+n^OR;CLG3E!&dJ0UJS?Q(vhdTxMRkyT!^O+ zovy=f4q+V($BhHH8y{RmF|GZ3N>_Oxbt9#4M^Uu{jw$(p=}VY}XisKl#wJuN`E;&5 zf8ZJM%Wq>q;7=)s?w;yKpy?lAp@>9@u;eOubUbmk3sZhlb9_(RgmYGQl^2Q`s|-X6 z?*w_2q43#l|EbVCtq#|HqV2CediUD}&3~r(qhJe_7C=DG(La7FcT!33i&wO939jfGf_QuppEfhVEyO@f= z-V^>>)8nAnX8U@Vr?BH=F07==~DWO1@2W?1)g>ALy$05#yrKhCf}294O;j1a0f^O(roa-+yVal9@Txn{Ks!EgR^4YYm4a zM)R?m7`JMob(N&WJ>~Y+^DNIlpN!&OUNb{?3(}FX6a^?sKQPnVpi&jcHl{NI31 z1tYb+Qpp&n zCvUW8vRE2T551mGre6<_o-?@Yb{k$+QJ;Oe@uKW_DabPU5g`M(?)2*V67h6BVkWoK zWFz(YH*ISs0eG@R*ho$`-j0FP<7BigUVHvz~VBVi2f zm{z2KP10GK>-Z*|&1Q9&RAUn_4Cy^v2!Y)_V1ealss{E~6QfvdE8tq@E`?a>S9xPL ztsf_mkg!Q`t(mC`_@wr6=(LSqcThI}4I=kS&eW(Us9V*RXzFDQ z9qX7O+)_d9>>LDXVV5I#yTG^{hIt(;e$A(*Bw3vPP4bQ`yQ|89lrL zpx<%;bglFhs={ZfoqjG35!0ksuskJ_N@C-@EJ~@q%&LG4zmY%QuB?Q3gChb-E0=R2 zjm3o=tJN^){?#<23N;wGjlHWtxY z0lMIa<|s=pB)ytv{EO}_9FKSPF#qfnFb5NXcN-NU7qtut_4HtuwC<550vAeu2r7#j zopLW2KN5z<%N)ODUdM1e-{t%jhz33(z&DeHGN!Vj_#|?Ufe-Z~u=JRxE4^NYLRX zNxB(H#G1=Ezg6ltXw^Jh+5ff5&`3(m)<{Y$awP!Af0?zXHGY89Z79Boao>I7ux04s z1ytvGjC0x>)3%+I=8m4vdE1cHzdFTy0?ma1lnY zF8sTFeV+DDzEVUBkvn_34Oai8VyfAJM{;>(=;{v91@xww@J6-iYa{_0OUWg=yppIh zujv^`*au_XQZaKOAAZBB3Nm9c1mt7!4laXzRqCg~t!4XiK!+sg+N}07;#*HT1P^Qy z;dX%_yRrnj-9;d_ygyy2#386d|8a%m|EjVd6Y_!b2JSeUuJKf`oB$8xVD&}B)SLd; z#AkV7q$y3kBDh(@BCH0;pH584FsL!Qv)#4Fs`@ z5ktO+86=S3rB4Ldn2qN6lGRRx6sy@ak|rK8GB!}YZ4F$txrhQ#q;3#Clx^Ic{OqE~ zYLPnL(f^s?48?o4=|F&Uqj47 zQ!!=T0$t7Gm~%Hd3#B}xqmrq zf@2sP`xMUrF-;bjWj<_2dRj&yb+M@40(y8E__{j_W2Htb+w}qKK$y})^CAbF5(KOs zd&ah65*ZoJt4qA5A|FLT#af)dMf&|w#(Q*tyePNLAoIyBNp1^jZu4s`qZ`4gq zY%lW*DLzZ-(&T^ePn9Ng(@>PMk%>vDu&#n21hEhSVN44Xt9!;=R2)rWFxV;lh`FG$a0Cb0xTG&<m@09RC3z=C26#CQv$Jw^{?Wkc5UU|-yYyc%PA@IRMi-%v^#u*n_7E>PnqYnp z3o1H}e0b-rihtTUV)=|79g=2FM8ucoJSyveS8yi?EMcA^Pi5aqBU!{RyWpQs<#$Aa zk}egcoFMxO`>V4kxOL7QsCU(o!x0>hk$`Z*@xK$f^e6{x3g9(lk zolm!Zvv>NNPdeItTx0AjGuOrB5t!c3Q+uC}@#9r+Y(u%1Q8QJyNQ6jbv&Xyhm@WY9 z7Wv#gH?VA{qX&{LOprWc(Oe03hc&QFzC@cDXL%TB3m9+4sz#Xv$Q!vc-Wgj>c1c;0 zZVDh^*;mCEg*EBp;Wi25GM%e+-$U}Mwt6S@8htZpt=Q_3+#&;8^yaja|=obIlMy?E;xEIsJnywlxDE+QfIXjMKYTHVwbg=pKjBo)s${Ned z$;jD|yjy~$hcLUA1_(2karU4wH1FdP!KnRlBO3nteV`H0J;(xD&Pg1HH_hjNG`6F< zc&|Y!^uCx+vz0dE?)B}Dc>~c@`MjiBVjcHR z=XZQm@DN^3?_@Dpxvh7nr+RE_ekLLWvMe$<%;qmKIB^|TpA!A0XeSJ4iR9MI;H4Mx zz|cED^`eY9d1ioZSTEt&X$a|#A@M~OwO~cDPp2pZ>s5R`Ei{N&6-5Jt<9#(!MQqfH zRuCLtNDlzm3mlmEkl)P9cA`SsQy49OgNw%p5bS@fLTgL9<*g*ns|A4|%i7OXeFe)0 z*j?;1>1xBWN#$XwT_SOiT9o@LRmv3`VXL!E=_c~#C(fsORD@~`$U?sQQtl%QSO>uJ z)R?*G9nLx80a)J7*F^wK%ezT^F&`lNeD)(uHWbfC+k)HkNKuWfbVKceJ`>c#^IM5- zcWp@mv@NVL(MSemW zIoYvtT=qY8xku<~3@G?H%@D$^X>~cl46*z@z+OxIcTL>&1(BD|(D#3miBz3HEZM|b z4%t-VAgmw&8yDmMcU2~9YSEkw7Fdn3{t=(7|`p`JJ8RXDU zV0vnnC3-iiK`|gfMi<$@I15-Gy#JsxoPGVf`L-S#4>j_a3NAq*2=ft{BUbS#Xizi+ z^BeAKlHkk5_Zd88;CKp$cU&mG!|DU8zNX#-4DQWHV9@f9pv*TqeGsNK4B@3dofvIf zS)c>|Mt_?lIANzgo%j`px8&f7dv7*H8DV19_(b&h+&rk*dq0w{ zdO(4n0?B)fB#D%8|EHvsCkN3QO0Zr*$(ot|Q?nwDJ48hhG1^yS=>}yX@4ID)TUoB& z@*;SgQ9mc{Hpw;@iWVSk)fMEI^?d){%|Gzp%&Nj+?ciPKD1i!M8A0Le@%aK;b`C$_ z<}q^mh>`QKWSj;B>;1przaV4)p`)Aa!Ih)V%`^^UMtNzCd98`J4lHezs}bA3K!1sn zTc&+LfpGE17qxHsy|!9)c~_?_!=%?Lu<|qp5<39JDU!xqz6${S@!kWZ*0CNoZsIyk zl}t~CRUyS-yfMfiY;5>}mM9Vqz3RdkVgJlWwI>K`sQqb^OuEpub3LtRtUKp~acVsG zM3DZB_9EUOsiCG8^pgQ zj#k&Fwp#GW!ypjk-Ie%6kfh6^yh_zjFzraTO;H}A5t854?hcT8!?(Vo4?9yo5n0ev z9%}cpIh#91tlrVts&$PTNm%PGt*CW9w{n5^rd@fS%AdTGWcGH(IV(m~%Bo&vbP}?@};`!Le&W) zwQQvJ9&8B6eUQZMgp|}BIAl!8q4*~&aKrACE*5<$F#Z_aj>YKn^PZi18GZMa3EQd; z*CZLZZ{|*iC^uAfEc{UBez(O-;+e)cS&4?8w^RZ27@hlmq9ZDwY^9>Qu$k%vdkDgD z^^ex=C9j14EumA1U8O)r2lB%AfAko6-{d%N$HjG6vWfb z0qOxjG4}DrE8NGNUo>^(;e8D!iNQ9oXJ<~I2yPtZ#2rN~Pf{uY{SXiQd$AIv&l~4p zf3L&$kwp%Yy;A`VLjyfhAp*_ezIQtQhAz1Q6C5IOuXWhcpQDAqnJt(|`&;ML&iF>o zB{<4PR2fzbYX2y!l#;VoAvgwBJC5##x1N-H()+FA)w&80_cg1n zlCQYI?$#nwgZVAs;_=60Br_Nf*rHpUL)_gGgl1>IE#Q@R1p9(p2pLGSX#VRBrXsgNSsF%DvNK{lB1B! zslzbWlS&K987TroKfwj>A+G>sP5w50v~e;bGEV0{M3Z7kq;|H8OX}(1&-Fj0eFa!l z-PXT|g0z52mw<%gbb*ARv`C2}-5?>2izR9gtwfXI(rEr00E=jBaOg7CgA^uI_H9=Qyg%<7#w` zZ&XZ_XcM$tzq`?`y1me-qL~5y`AE0|cZrlv>G#2gS44GfXAT%}ciacN_-mqrE#5vn z*{$3gkxjvR20D~0Jgf+&#aLd*U{dRYCEE1afZ+w`tG@5rl{>!Ay!IZDmr00 zMJsKjQvTGAORZ$6mg|D{>X6I186U~7Ix(5--1SjHo@<%=Bq zW(q%wF85Z+g)rgMwJl!2cem3a3wTDzit>+3jXol?j*!Tn$%DBAwZXKXtA2paBj?0<6a^i@Mf!PO>>akx_hl`(wH?eTd(COhkZBIFA{PTH57ru_;XXsW*{H z4zalv@-3r{-`ZNA)iJ+6m5|@`^&UlNcc+7wtzy_`)<+xB^L7zK0FI?S8`_5QQ^pu7 zu=joZnJvFz8Pk9Nn-y@s`b8kba(rQJ*9Pn?eb;RPMy2aoKW+n2Tor&cjMXBoB5pb zoTg{yQ-0aHd&O7YWCy&k5bXFQ)79ZT-9T1FW(pfqu(a8+-GoOM)a$iHh2uo*1Iw0- zAxfpA;*-Ae@7k8tZ@g1;dFP^U+P0u?uxaeyHb8!}9)4~*2P13zR^%Mmwz43|0VQ!CatfpAuY+tg8ftPLhN1y z*%Q}ZqQqVqaHc0gT(o$1CP}v7@*a?)BviU6t7V)~@Qy~g|7m5-4E9r!cSV@o{$(h4 z$7y8$eH^i_W^A-zxdu|cp$)C!T-qTUV)j$W!nmR6$?XsROr28qF2cR2uk>I0nf=3c z7$KUVBLCt1t%kh&?TH^tt7YBQn`7rAEMNK3m<{Yliu`CF75XCH%a)?dP4C$cB%u|D znU=a;)$^nmb&@xM=S>dBP43opEy=* z%ToPhI5bvGFpx&ik2zmiODS{bPmL=69#O~MMWSgK-8JBYx?(ArZoR$XC>!9uG!8?) z&U>^O5J>r;6>1TZbrt;f!di~>M4Jew?AneMvs+rDR9LVJr2)Z+FjsQm99j0I&S-JT!r)vDDB zdhJPHogBTkH%+s=b(y^lxA(~pae!qT9DQAl6*$^{mc3J zQmL(ZWt<5SMtJh(xYNF`;Mrh095v%fmtAl=LgKApt+Q zdHCA#TsYnmO3kY>Wt2&6p%A0I)Mb-s_mS}thVf=3W9Uk)w=e$b&MC<1?Sv%$%aV!s zmB_=##wrICA*dxz6Il)LJHHzzw&4c`WDp7-K4w|ZC=$T~;|CEQzM&+Nc+qf1ULc+m zc{cm8a^m&uE{Uhc$vz~F(xa3i0VK>I|MT(s=pmCQV~WIykT@h1M`@lg&MnM*Mzgb1 zLP6$TuO}VUpX8Ei0Ldj=p)QHE7r`Vcwl@-e?(Om;&jN3|BpP1I6C-$7s1$?VnCoA# zkAO(or}!|1I4tvLS-Gt0M|2-zCP97B##dyn@&AbO7OuMD3@II)9-Q=Cvg-S zk*`@bA(0)SyPjQD;oU*^#0RN*WyM5RN%{HBYHwW`ez^?~rVu7hBA-+~O3LTgZZPZR zNwHB<`is^%=r4u$NLlftjFw^EKKJ&Bo3`z%yh$#eykpKOseGD*q$WX-$`@cpDGG9u z^q6xRD$`TdaNGi|f$Wy3Nib!8&X^lYa*-rJj+c|9wN^5h*m0uy84=YDN@l+C<+#(# z&n2W%Y%6C^tIK{F}sLGtj=8EDej)51E1`-ZD9`bB%D`sC4 z>u8-K%}Uh#OajxmeXyNsGV;7E`e9GGrz&#Kj+nS$qogCjAEFk!6BzWi;h_~#GSB~@;I)+LTw?5o5E1=@14BsS^xl|{?)>LSVA;NP;iTEnC;jPbd%TJgN z+Ydb#hWDKRp1e1+$qvq=SfuHCDWfD z+MdI{RP_1E6?WxoB z35C8jwqomZB9`Hk;T@Nh(O=@6w6FQ%E2BN+5%obwKQ2(7O|ns%jT!fr+C&gD1C>Y5 z$nwd24d(xzMm+38>tt;HGRQaiov|%TQpj8)agDEW-=v|y9ZoiGgRGNm!LF!_Gtlhp z%by=`*3)NIu|{jkohhNGcLKu9CDTOCR8Z2zN1)nkOm}cBze4*c&h{xSU6c;H^4TZH>8+0l!@8g; z&y~r~sY?P*_rCY0ag$|*;R{i*UxUNNjqW(Q+1T^Ryx3(Q6VRaNZl?u!5gXx70nm*v zbDI9f<0Sn44kpGFIo|f;PcUlX_T!UsOeQ{Ylj)xMpvQ9`xyD!17D_Z5GUaf>NTs7Un;mXKfBY&`>YwjJm6Ms~w08Mh|b*&D5+w<^o-V0t)!gPDO!oi_WLqEq> z<>`N1>r>GeI*(4eXvpRg@uT71TvmYLat0p@wMKWpO66=tYVx+cN0YPvu98I!YmR@m zywg}*cA`UA=EqO8ffd=Ul3Skx-%*e5XDLQdg1sH8`uu-(W2~SlsA!{XkSW zBv0=K8y&!;rSM2gL80-g;`bk?zb!Q7K|U*~=lS}es5cS*6=#HmQp4|)6F>FQ#1>++BNLam{x&ApZIV%DJ$3%i zB3NlH%`Do&Z@+)CZ02t>PR^L5_5F|~NvqN7@;)}o8sxpzeu>NprzIerAHrgFrL(cx z-XS^F@98*a-909zBo?mf)T%t)E%omo95noGi~t8?@Rp`xs|wWFk!90b1J7u1vsvIJ z%rKzST3f)#F(y3XwQz%#Rq5OkcYK)=aw|;u(c{XvCj8Yl#!2(hKGulQllQFsS8MkB z87E)tZbQ75H?(X{*1PU4%+KckD%(GR06QD=vmA$e-N63VYjKZV;9>c}=IGw*(fNGf z7n{%G-U=SrzZ(xdT-$dM-{1ZzlHdU0vC?{`k!)Kjh`jsmD!1Cr3F}yKnQUHw3pnig zb=dqVO0OudWW6WzVBO`R-u~oa0{d0EGTZV@nli85o!h_mhABGd_w)5Q4jz-8UyWHj zTq<|z9vaA*>k`ZN;newyg(vV7bd?GpX2hRYDAasIs7 zaOC@Y5hWq%hT`MrdzW9vkH6G~N@Z*{o&Pm?^x)H@+PfKBxD4O8yQYO9S0lOZN{-7< zIn=h>^Fmyc?Ri`5ZVKy?a(dk#MqY8)E1w!7B;<2rGg{AD;d;(oorhW?)w%KFaf8A1ZBq9OPaOR2JZlBUo1lpSo?|SnS$>*WM1<^=SMy{_-Cx885|&yBbeQEiV1>S^O49FotX@2=RO()zE(EGwkOQ+H1mb?Qk-m3@6O z&>`MO)lFJ#$GfQUq=~nfsoZfR2?}JhKoYq0W;$)AIOd;CCk+&YxTIen7aR7~%gy0< zI-N6+#?TQ2S+~Wk0W>bvYr{6$jm13)_D=S7kl1~G#rTCfg+Vs<#b<6MEIakZ20M>1 zSH}n3%2+1aT)sFQ(51AyjEA`RO%^A{Ej~Ngwuuz`6`ow8)$Ss-=&`v&#O~VE2%(jd8-WCRMzlMDv;6Y;qF9$y8J~v!~jN;!u6|p*qAe_d}aQMx$tN34W-0yOv^#wJ_ydf9KOO%YLMR zNi8aa4!jnt&Z8IA{jrn6yn*?y<|zBU(G*Q1g^c$f?HoSBrVHzC=Umc}kovaO#C%x6 zEZ!PjGQzBZ=1kbv3+`}Pdn5+{2?6mb0b24kWh-^<%a>wBCw(mjwXfc< zh4Lt+)sWHDkagGCDZIz3Px#^{czT`Mt~p#S#8O7l3p!L0J5*hBhzPMuYat75nbyGA z#o_Q)tbQ#o!g0$!IPj6eG*)AxMsC8f+wP578!tyaz~x|QqU52k1U^)i3=GHFh2RE8 zZl^>!6ndODX<&Wd5==VLfOObXm5gX&jWSkp$q(6X+6oE!cjsnsGLumbat*@9ff^H2 z#14+2Kr+qC4vvAi!s75*P*E~Xzn0D>R!{xFHiVe~m!%01*aqWs(ISljwc+|1gwu#J zqG`!;ow&kloZgZJDw=N}W7;;Zp^?kw@DX0m9%@FYP zPwqyq=K;VM^?__vii)}~6Fn=<2)Azl<8u1~_*-L7rq4_~H29WSzXtoY>y+A_3zW;Q zYdXiJdX`10;5Q1p#Kb$jeq=N|C0F)7Fe;_cq`F)_WLyH)o{o91_Kge39s32LhDGlx zYW@XpW72mboGji8qnGB>nzYi3YhUa>)M>6SEe7=Vm&*@VZlttJSXTV>73!^?UbtHd zIMCdp?~tJeqGx9%b{ZQxh>Fa(Gx_>oN$W!BGnklMB;Y3oLhrk%f2Zc3_gN;Kt_I1(uMooJf6!C7J+ zaCyCU_0%(hTw)}9UY{JB9yk0}_RvDh=r8mU;Q_SMr>)xDE$YD zznE|KZLSWf@P7XI)g?So(8sMqm#u38dv;y1oP8$POM!EMNYhN^8OnU-1Sx82{p=QE zWAt5KDsoYv=V0XpHHAtqS!d$6r33&){l$62J?##A?u@b}UxnZOPw7tQEZ29Ob@uZ( zTW?x-iS*md<~jcuAxW#>w<0^|EMeEo|6L^+)NpMuptYX)Eol*^X)%plB%y#fgiYB= zZ?kAGbhjvBw_CP6Nzh+i)cWzCTjDG}EyunfGtItbN9h(Xl=-WEp=}Ki)0)Vk2!9O` z+no5>7cNG$uV04G>4JQQtGXSc0<%;-m4!bB?x%FEB{<$=^Ak$m8z>S@mJ%*03st|H zh)Zd8;#|RLxY!Rc%gU@$+^#HoCuse?N#sMnXHe_-{sJZ&sEPY1kInk z7x>{b@k?+6FJg57PpUB&2?Nq|f4DR=V<9bD=#F)=+pqJk+V9z?qH+{IR7HF!NRrP} zpAHoKsT%IAJ|6sGH^sK*)h<&JEn;Chx0Vv~woc7-#*1n7#iAu=IWcGo({3e-B9ax6 z1n3FTXG_tbyT3fN+$fvb87o66cYhV_D5v?L6-Ev80w$%Www9B#SK8`L7+uT5cb`sm zQWd&%4x5UV7DMkt#%I=57s~F~eVe@xk-wAE1Oz0e0)cv#pnp*x=DvpfOWu#uComGC z%wJCZ<%o_ct?}1keTAscB!5wYs3kVXa@g)zkcK_H9&OrQAhzFh0=V@=Dson*5Ar$3 zOuJcr{rdDAQ*ZW>wKx1N?@X`vuOQGg;zWTl@}766hx9+Kd=&E33YbVhPx?&Nn-Aaw zwTQtOr;^xoO*}o&c0L~UXN)iNINl1M^Zu|~RE{0XqMLdfx0nBi9wzDzwW4 zHB!sENc2n&{L)(+TfI89{Gl@X4`*_2Q|U9 zUkMTb7{M#btx+nkSTS_H%)75EML1&EqKvRtZ6sT%Xk zLw5MgnBHi;p7V8Q>Tygzco6O-^hG_wzV9(F6|cJim(7F;mCEk;1)darSBkeYCX@nb z2rmykM6E%!q=idsJ=-?~c#FS!R|le{+?%WY1l`+gy>-v7xKQ^+;)dl-$)DPp?>b)2 zZs*ikJ6u1c$2ir#<*J(sspWuuu)F|B(=rIQQaRiKMj~rW?({=@d(IguUHy19GW~Ko z#f8NN%SS2~mwmpHQ3Zk76$kKCA~)&@}HhE9@N6 zp*fvsnmiZYT=q02&(J9+kN%j~J}k`lH)X~8g+y8h6;ca&-?M>V)9;sU(Ys7*#Wp-v z`QS^rw3zNE*D;Y(pPXX9Mg4kv_rbnX|C_40<>y*!?D+mgQ-IQ`YgFTb40a>GhS&y?j->><8j)Vn(Zys93BQENT2f8@4>X7}3K$BzzA56u6ZbkQppE5mtg8g-Zr zFKs1n=JoEZG`EY3th()q@oCw8xU9sYv`v>Psc8r3v!vOyg^Rm zP1j2`UAt(Xj&KR>vA^Mkk_vyX*uk7^$f~8E(^Ji^JZp`B`fIWjorbQ{0O=0 z5fr#t{Hc?+cj>vMM-571gqh2ZD!8DofffCWS4S*VcZyd**P`(<#5J53qO+3Cn^^>m z^?Z|dr42+0527xa>6*Cd3=Ed$mwGZ$WRsbss5cei?UGm@%F0@l$E`>Ughgd5Gmj4{ z32xzU$nC!k`wIDbckR4*?d{IHdtsBX8J6{c9cfRgUmclW)2{*Ju7XA92cFp^>4IZW zOpI$3pRUq2>+bH#K?`}`n}*qEdJSY-hXt$h)0?DR36n3JJztj&)#X(cKN@X2;UOER zfl57daCFeGof5r%8@!`)BP;dQm4qbXI~1mP*M>gvtPN!tuMK5_|DTN=hdxzkiOcsl zyT&^YrSZ>KsQIKC<`Unn?Rb)DI8~_$11G416DoAxPgUx@p8_gDhLg8X$B|zXd^3eU z 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 Date: Thu, 18 Dec 2014 22:14:19 -0700 Subject: [PATCH 008/112] First stage in fixing DASSERT error --- PitsideConsole/PitsideConsole/LapReceiver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 60399d1..d756b06 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -242,7 +242,7 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& DASSERT(fLocked); // you should only be getting data after the channel is all loaded up! const DataPoint& data = (*i); DASSERT(data.iTimeMs >= iTime); - if(i != lstData.begin()) + if(i != lstData.begin() && (eChannelType != DATA_CHANNEL_X_ACCEL || eChannelType != DATA_CHANNEL_Y_ACCEL || eChannelType != DATA_CHANNEL_Z_ACCEL ) ) { // this iterator has been moved forward from the start of the vector. // back up one from it, then interpolate between those two points From 1632308ff39ff1e8ac2ff881fee6b08d038787f4 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Fri, 19 Dec 2014 18:38:11 -0700 Subject: [PATCH 009/112] 2.003.0031: Smoothing option for accelerometers added. --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 3 + PitsideConsole/PitsideConsole/LapPainter.cpp | 69 +++++++++---------- PitsideConsole/PitsideConsole/LapReceiver.cpp | 24 ++++--- .../PitsideConsole/PitsideConsole.cpp | 24 +++++++ .../PitsideConsole/PitsideConsole.rc | 3 +- PitsideConsole/PitsideConsole/resource.h | 1 + PitsideConsole/PitsideConsole/settings.txt | 4 +- 7 files changed, 82 insertions(+), 46 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index 96ee479..2b8cabc 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -40,6 +40,7 @@ struct PITSIDE_SETTINGS iVelocity = 1; iMapLines = 1; iColorScheme = 0; + bSmoothYesNo = false; } int fRunHTTP; @@ -47,6 +48,7 @@ struct PITSIDE_SETTINGS int iVelocity; int iMapLines; int iColorScheme; + bool bSmoothYesNo; }; struct TRANSFORMATION @@ -95,6 +97,7 @@ struct LAPSUPPLIEROPTIONS HWND hWndLap[50]; LAPSORTSTYLE eSortPreference; bool bTractionCircle; // Whether or not to display the Traction Circle display + bool bSmoothYesNo; // Whether or not to smooth the accelerometer graphs }; diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 208ff9e..a00a95a 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -529,39 +529,38 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi lstPointsY_Accel.begin(); vector lstPointsZ_Accel; lstPointsZ_Accel.begin(); - - if ( eX == DATA_CHANNEL_X_ACCEL ) + if ( eX == DATA_CHANNEL_X_ACCEL && sfLapOpts.bSmoothYesNo == true ) { lstPointsX_Accel.clear(); lstPointsX_Accel = pDataX_ACCEL->GetData(); // pDataY->GetData() w = lstPointsX_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - if ( eX == DATA_CHANNEL_Y_ACCEL ) + if ( eX == DATA_CHANNEL_Y_ACCEL && sfLapOpts.bSmoothYesNo == true ) { lstPointsY_Accel.clear(); lstPointsY_Accel = pDataY_ACCEL->GetData(); // pDataY->GetData() w = lstPointsY_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - if ( eX == DATA_CHANNEL_Z_ACCEL ) + if ( eX == DATA_CHANNEL_Z_ACCEL && sfLapOpts.bSmoothYesNo == true ) { lstPointsZ_Accel.clear(); lstPointsZ_Accel = pDataZ_ACCEL->GetData(); // pDataY->GetData() w = lstPointsZ_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - if ( pDataY->GetChannelType() == DATA_CHANNEL_X_ACCEL ) + if ( pDataY->GetChannelType() == DATA_CHANNEL_X_ACCEL && sfLapOpts.bSmoothYesNo == true ) { lstPointsX_Accel.clear(); lstPointsX_Accel = pDataX_ACCEL->GetData(); // pDataY->GetData() w = lstPointsX_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - if ( pDataY->GetChannelType() == DATA_CHANNEL_Y_ACCEL ) + if ( pDataY->GetChannelType() == DATA_CHANNEL_Y_ACCEL && sfLapOpts.bSmoothYesNo == true ) { lstPointsY_Accel.clear(); lstPointsY_Accel = pDataY_ACCEL->GetData(); // pDataY->GetData() w = lstPointsY_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points } - if ( pDataY->GetChannelType() == DATA_CHANNEL_Z_ACCEL ) + if ( pDataY->GetChannelType() == DATA_CHANNEL_Z_ACCEL && sfLapOpts.bSmoothYesNo == true ) { lstPointsZ_Accel.clear(); lstPointsZ_Accel = pDataZ_ACCEL->GetData(); // pDataY->GetData() @@ -569,7 +568,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } vector& lstSmoothPts = (vector) pDataX->GetData(); - if( (eX == DATA_CHANNEL_X_ACCEL || eX == DATA_CHANNEL_Y_ACCEL || eX == DATA_CHANNEL_Z_ACCEL) ) + if( (eX == DATA_CHANNEL_X_ACCEL || eX == DATA_CHANNEL_Y_ACCEL || eX == DATA_CHANNEL_Z_ACCEL) && sfLapOpts.bSmoothYesNo == true ) { // Smooth out the accerlometer data for all axes before displaying them on the X/Y-axes or in the Traction Circle display if (lstPointsX_Accel.size() ) @@ -593,9 +592,9 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi lstPointsZ_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); } - } + } - if( (*i == DATA_CHANNEL_X_ACCEL || *i == DATA_CHANNEL_Y_ACCEL || *i == DATA_CHANNEL_Z_ACCEL) ) + if( (*i == DATA_CHANNEL_X_ACCEL || *i == DATA_CHANNEL_Y_ACCEL || *i == DATA_CHANNEL_Z_ACCEL) && sfLapOpts.bSmoothYesNo == true ) { // Smooth out the accerlometer data for all axes before displaying them on the X/Y-axes or in the Traction Circle display if (lstPointsX_Accel.size() ) @@ -619,7 +618,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi lstPointsZ_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set lstSmoothPts.clear(); } - } + } glEnable(GL_LINE_STIPPLE); glLineStipple(factor, pattern); // Set the line dash/dot characteristics @@ -641,43 +640,43 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } vector::const_iterator iX ; - if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iX = lstPointsX_Accel.begin(); - else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iX = lstPointsY_Accel.begin(); - else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iX = lstPointsZ_Accel.begin(); - else + else iX = lstPointsX.begin(); vector::const_iterator iXend; - if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iXend = lstPointsX_Accel.end(); - else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iXend = lstPointsY_Accel.end(); - else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iXend = lstPointsZ_Accel.end(); - else + else iXend = lstPointsX.end(); vector::const_iterator iY; - if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iY = lstPointsX_Accel.begin(); - else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iY = lstPointsY_Accel.begin(); - else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iY = lstPointsZ_Accel.begin(); - else + else iY = lstPointsY.begin(); vector::const_iterator iYend; - if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iYend = lstPointsX_Accel.end(); - else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iYend = lstPointsY_Accel.end(); - else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() && sfLapOpts.bSmoothYesNo == true ) iYend = lstPointsZ_Accel.end(); - else + else iYend = lstPointsY.end(); while(iX != iXend && iY != iYend) @@ -690,7 +689,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi if(ptX.iTimeMs < ptY.iTimeMs) { iTimeUsed = ptX.iTimeMs; - if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( *i == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) { for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) { @@ -703,7 +702,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } - else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) { for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { @@ -716,7 +715,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } - else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( *i == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() && sfLapOpts.bSmoothYesNo == true ) { for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { @@ -728,7 +727,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } } - else { dX = ptX.flValue; @@ -740,7 +738,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi { iTimeUsed = ptY.iTimeMs; - if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() ) + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) { for(vector::iterator t = lstPointsX_Accel.begin(); t != lstPointsX_Accel.end(); t++) { @@ -753,7 +751,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } - else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() ) + else if ( eX == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) { for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { @@ -766,7 +764,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } - else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() ) + else if ( eX == DATA_CHANNEL_Z_ACCEL && lstPointsZ_Accel.size() && sfLapOpts.bSmoothYesNo == true ) { for(vector::iterator t = lstPointsY_Accel.begin(); t != lstPointsY_Accel.end(); t++) { @@ -778,8 +776,7 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } } - - else + else { dX = pDataX->GetValue(ptY.iTimeMs, iX); } diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index d756b06..4609af8 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -137,11 +137,12 @@ float CDataChannel::GetValue(int iTime) const vector lstSmoothPts; lstSmoothPts.begin(); // If data is an Accelerometer channel, first let's smooth out the data channel before returning the data value - if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) +// if ( ( eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) + if ( ( eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) ) { - lstSmoothPts.clear(); - fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, lstSmoothPts ); - pData = lstSmoothPts.data(); + lstSmoothPts.clear(); + fBoxMovingAvg( lstPoints.size(), lstPoints, (int) lstPoints.size() / 400, lstSmoothPts ); + pData = lstSmoothPts.data(); } else { @@ -201,7 +202,8 @@ float CDataChannel::GetValue(int iTime) const const float flWidth = dataSecond->iTimeMs - dataFirst->iTimeMs; if(flWidth == 0) { - if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) +// if ( ( eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) ) + if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) ) { return SmoothedFilter().ApplyTo(flFirst); // Returns the first value, transformed Y-value for this data channel } @@ -212,7 +214,8 @@ float CDataChannel::GetValue(int iTime) const } const float flPct = flOffset / flWidth; - if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) +// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) + if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( (1-flPct)*flFirst + (flPct)*flNext ); // Returns the transformed Y-value for this data channel } @@ -223,6 +226,7 @@ float CDataChannel::GetValue(int iTime) const } else { +// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( pData[iCheck].flValue ); // Returns the last value for the Y-value for this data channel @@ -242,7 +246,8 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& DASSERT(fLocked); // you should only be getting data after the channel is all loaded up! const DataPoint& data = (*i); DASSERT(data.iTimeMs >= iTime); - if(i != lstData.begin() && (eChannelType != DATA_CHANNEL_X_ACCEL || eChannelType != DATA_CHANNEL_Y_ACCEL || eChannelType != DATA_CHANNEL_Z_ACCEL ) ) + if(i != lstData.begin() ) + // if(i != lstData.begin() && (eChannelType != DATA_CHANNEL_X_ACCEL || eChannelType != DATA_CHANNEL_Y_ACCEL || eChannelType != DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) { // this iterator has been moved forward from the start of the vector. // back up one from it, then interpolate between those two points @@ -251,7 +256,8 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& const DataPoint& dataLast = *iBack; if(dataLast.iTimeMs == data.iTimeMs) { - if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) +// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) + if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) ) { return SmoothedFilter().ApplyTo( dataLast.flValue ); // Returns the last value for the Y-value for this data channel } @@ -265,6 +271,7 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& float flOffset = iTime - dataLast.iTimeMs; float flPct = flOffset / flWidth; DASSERT(flPct >= 0.0f && flPct <= 1.0f); +// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( (1-flPct)*dataLast.flValue + flPct * data.flValue ); // Returns the last value for the Y-value for this data channel @@ -277,6 +284,7 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& else { // this iterator is actually the first element in our vector, so just return it's value +// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( data.flValue ); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 10d5103..ab63b33 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -275,6 +275,7 @@ class CMainUI : public IUI,public ILapSupplier m_sfTractionDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view m_fShowTractionCircle(false), + m_fSmooth(false), m_fShowBests(false), m_fShowDriverBests(false), m_fShowReferenceLap(true), @@ -901,6 +902,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_fShowTractionCircle = !m_fShowTractionCircle; m_sfLapOpts.bTractionCircle = m_fShowTractionCircle; UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); + return TRUE; + } + case ID_OPTIONS_SMOOTH: + { + m_fSmooth = !m_fSmooth; + m_sfLapOpts.bSmoothYesNo = m_fSmooth; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); return TRUE; } // Nested loop for the following functions @@ -2204,6 +2212,7 @@ void UpdateValues() CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWDRIVERBESTS, m_fShowDriverBests); CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWREFERENCELAP, m_fShowReferenceLap); CheckMenuHelper(hSubMenu, ID_OPTIONS_DRAWLINES, m_sfLapOpts.fDrawLines); + CheckMenuHelper(hSubMenu, ID_OPTIONS_SMOOTH, m_sfLapOpts.bSmoothYesNo); CheckMenuHelper(hSubMenu, ID_OPTIONS_BACKGROUND, m_sfLapOpts.fColorScheme); CheckMenuHelper(hSubMenu, ID_OPTIONS_IOIO5VSCALE, m_sfLapOpts.fIOIOHardcoded); CheckMenuHelper(hSubMenu, ID_OPTIONS_ELAPSEDTIME, m_sfLapOpts.fElapsedTime); @@ -2773,6 +2782,7 @@ void UpdateValues() DATA_CHANNEL m_eXChannel; // vector m_lstYChannels; bool m_fShowTractionCircle; + bool m_fSmooth; bool m_fShowBests; bool m_fShowDriverBests; bool m_fShowReferenceLap; @@ -2844,6 +2854,7 @@ void LoadPitsideSettings(PITSIDE_SETTINGS* pSettings) in>>pSettings->iVelocity; in>>pSettings->iMapLines; in>>pSettings->iColorScheme; + in>>pSettings->bSmoothYesNo; in.close(); } } @@ -3032,6 +3043,19 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.fColorScheme = false; // Grey background as a default, true = black } } + switch (sfSettings.bSmoothYesNo) + { + case 0: + case 1: + { + x_sfLapOpts.bSmoothYesNo = sfSettings.bSmoothYesNo; // Assign smoothing setting from Settings.txt file + break; + } + default: + { + x_sfLapOpts.bSmoothYesNo = false; // Grey background as a default, true = black + } + } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap sfUI.SetDisplayOptions(x_sfLapOpts); sfUI.SetDBPath(szDBPath); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index a3b48b6..3722ff3 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -190,7 +190,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0030\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0031\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END @@ -463,6 +463,7 @@ POPUP "&Options" MENUITEM "Show driver bests",ID_OPTIONS_SHOWDRIVERBESTS MENUITEM "Show Reference Lap",ID_OPTIONS_SHOWREFERENCELAP MENUITEM SEPARATOR + MENUITEM "Smooth Accelerometer Graphs", ID_OPTIONS_SMOOTH MENUITEM "Draw lines between data points",ID_OPTIONS_DRAWLINES MENUITEM "Use dark background for plots",ID_OPTIONS_BACKGROUND MENUITEM SEPARATOR diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index 8ae8b98..5d4e2d3 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -65,6 +65,7 @@ #define ID_DATA_EDITSESSION 67 #define IDD_SELECTRACEEDIT 68 #define IDC_RACEEDIT_MERGE 69 +#define ID_OPTIONS_SMOOTH 1000 #define IDC_PLOTTYPE_GRAPH0 70 #define IDC_PLOTTYPE_GRAPH1 72 diff --git a/PitsideConsole/PitsideConsole/settings.txt b/PitsideConsole/PitsideConsole/settings.txt index b02705b..8b93252 100644 --- a/PitsideConsole/PitsideConsole/settings.txt +++ b/PitsideConsole/PitsideConsole/settings.txt @@ -3,9 +3,11 @@ 1 1 0 +0 order of settings: -whether to run the http server (0 = don't. 1 = do) -http server port (port 80 makes for easiest use. big port numbers like 63938 are less likely to be blocked) -Velocity Units (0 = KMH, 1 = MPH, 2 = M/S) -Draw graph points or lines (0 = points, 1 = lines) --Graph plot color scheme (0 = grey background, 1 = black background) \ No newline at end of file +-Graph plot color scheme (0 = grey background, 1 = black background) +-Smooth accelerometer channels (0 = no smoothing, 1 = smoothing enabled) \ No newline at end of file From cc74fb3cf5bd25ab3d19613c8e503cbfc37dee28 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 22 Dec 2014 09:11:01 -0700 Subject: [PATCH 010/112] Fixing multiple dialogs- First steps --- PitsideConsole/PitsideConsole/DlgWarning.cpp | 2 +- .../PitsideConsole/PitsideConsole.cpp | 51 ++++++++++--------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgWarning.cpp b/PitsideConsole/PitsideConsole/DlgWarning.cpp index 06e4439..837a765 100644 --- a/PitsideConsole/PitsideConsole/DlgWarning.cpp +++ b/PitsideConsole/PitsideConsole/DlgWarning.cpp @@ -14,7 +14,7 @@ LRESULT CWarningDlg::DlgProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); HWND hWndWarning = GetDlgItem(c_hWnd, IDC_WARNING1); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); - MessageBeep(MB_ICONWARNING); + MessageBeep(MB_OK); // Play a warning sound break; } case WM_COMMAND: diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index ab63b33..9b3267e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -785,31 +785,36 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } case ID_DATA_SWITCHSESSION: { - RACESELECT_RESULT sfResult; - - // Zero out the Race ID's before selecting them - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = -1; - sfResult.iRaceId[z] = -1; - } + static bool bSwitchSession; // Flag to prevent multiple windows from being opened + if (!bSwitchSession) + { + RACESELECT_RESULT sfResult; + bSwitchSession = true; + // Zero out the Race ID's before selecting them + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = -1; + sfResult.iRaceId[z] = -1; + } - CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); + CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + bSwitchSession = false; - if(!sfResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen + if(!sfResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen + } + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_ALL); + // Just loaded a new session. Let's reset the timer + tmLast = timeGetTime(); // Save last time lap was received + } + return TRUE; } - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); - // Just loaded a new session. Let's reset the timer - tmLast = timeGetTime(); // Save last time lap was received - } - return TRUE; } case ID_DATA_EDITSESSION: { @@ -2171,7 +2176,7 @@ void UpdateValues() } if (m_Warning) // Pop up dialog saying the alarm has been triggered { - static bool fWarnedOnce = false; + static bool fWarnedOnce; // Prevent multiple windows from appearing if(!fWarnedOnce) { // Display a warning dialog box about an alarm being triggered. From 3abb449d96f5ee5245dbca1f536e4b9e87ec267b Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 22 Dec 2014 11:58:03 -0700 Subject: [PATCH 011/112] Added coding to prevent duplicate dialogs from appearing --- .../PitsideConsole/PitsideConsole.cpp | 80 ++++++++++++------ PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1904684 -> 1905274 bytes 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 9b3267e..4f38a2b 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -799,7 +799,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); ArtShowDialog(&dlgRace); - bSwitchSession = false; if(!sfResult.fCancelled) { @@ -813,39 +812,60 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Just loaded a new session. Let's reset the timer tmLast = timeGetTime(); // Save last time lap was received } - return TRUE; + bSwitchSession = false; } + return TRUE; } case ID_DATA_EDITSESSION: { RACESELECTEDIT_RESULT sfResult; - CRaceSelectEditDlg dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); + static bool bEditSessions; // Flag to prevent multiple windows from being opened + if (!bEditSessions) + { + bEditSessions = true; + CRaceSelectEditDlg dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); - if(!sfResult.fCancelled) - { - m_iRaceId[0] = sfResult.iRaceId; - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); - } + if(!sfResult.fCancelled) + { + m_iRaceId[0] = sfResult.iRaceId; + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_ALL); + } + bEditSessions = false; + } return TRUE; } case ID_OPTIONS_PLOTPREFS: { + bool static bSetPlot; PLOTSELECT_RESULT sfResult; - CPlotSelectDlg dlgPlot(g_pLapDB, &sfResult, m_iRaceId[0], &m_sfLapOpts); - ArtShowDialog(&dlgPlot); - - UpdateUI(UPDATE_ALL | UPDATE_VALUES); - + if (!bSetPlot) // Prevent duplicate windows from appearing + { + bSetPlot = true; + CPlotSelectDlg dlgPlot(g_pLapDB, &sfResult, m_iRaceId[0], &m_sfLapOpts); + ArtShowDialog(&dlgPlot); + bSetPlot = false; + UpdateUI(UPDATE_ALL | UPDATE_VALUES); + } return TRUE; } case ID_OPTIONS_SETSPLITS: { + bool static bSetSplits; SETSPLITSDLG_RESULT sfResult; - CSetSplitsDlg dlgSetSplits(g_pLapDB, m_pReferenceLap, &sfResult, m_iRaceId[0], &m_sfLapOpts); - ArtShowDialog(&dlgSetSplits); + if (!bSetSplits) // Prevent duplicate windows from appearing + { + bSetSplits = true; + CSetSplitsDlg dlgSetSplits(g_pLapDB, m_pReferenceLap, &sfResult, m_iRaceId[0], &m_sfLapOpts); + ArtShowDialog(&dlgSetSplits); + bSetSplits = false; + } + else + { + return TRUE; + } static HWND ShowSplitsHandle; const int cSectors = 9; // Maximum numbers of Split Times @@ -875,7 +895,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if(!sfResult.fCancelled) { UpdateUI(UPDATE_ALL | UPDATE_VALUES); - return TRUE; } return TRUE; } @@ -1261,16 +1280,21 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Let's set up for displaying the T&S page int m_RaceId[50] = {NULL}; // Show the race-selection dialog and let the User pick which ones to use on T&S page - SELECTSESSIONS_RESULT sfResult; - CDlgSelectSessions dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); - - if(!sfResult.fCancelled /*&& sfResult.m_RaceId[0] != -1 */) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet + static bool bSelectSessions; + if (!bSelectSessions) // Prevent duplicate windows { - // Now display the T&S page and pass these RaceID's to this class - TS_RESULT ts_sfResult; - CDlgTimingScoring dlgTS(g_pLapDB, &ts_sfResult, m_szPath, &sfResult); - ArtShowDialog(&dlgTS); + bSelectSessions = true; + SELECTSESSIONS_RESULT sfResult; + CDlgSelectSessions dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + if(!sfResult.fCancelled /*&& sfResult.m_RaceId[0] != -1 */) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet + { + // Now display the T&S page and pass these RaceID's to this class + TS_RESULT ts_sfResult; + CDlgTimingScoring dlgTS(g_pLapDB, &ts_sfResult, m_szPath, &sfResult); + ArtShowDialog(&dlgTS); + } + bSelectSessions = false; } return TRUE; } diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index ba095e471982cdd51c2ea73ed75eb697aa5bd185..48b0ec7e9d59fdacd3555ba5d6f193e2f8cc38b2 100644 GIT binary patch delta 86911 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

E3?_S4YWo&S&OP|GbSAD3INrf4_JB_YnZg z%L);?K)hKD8tK?0vOSD0G%WScyqB8hcvs%M>h<-JNg-MTR^f z)D#@Pp7Jm6{v`x_Ow}r6$vDI#S=d@|@r58V=QcVcNnY}))vYo5FDb(_=6fp`Ddup8 zKf_j`_c(b?7I^Q`HV4tW7Z!zlx1I>xuVj&T)3i6_hNs_@2|4t z%W6c(u6vm{KZZW$Sb$M=wl~ST9W$ z3w_$MtIyw2n*xwVSNp0=_#0jnPO&pD_(y{;6v%_|IjAukX zAq8%Juo2+lhjs%Gt!=}gd+l46vf#jGOB+Q`_)EIc#O6S@XZ>(gz9BBL@ZGf`(Zk_> z$TG_uQW{BRK?zRA6%o0)_ZNRvv9S^cJ7&Mm!)37vlNP|92|}C$DdeZ=RV$QN)n4^m zf>|qkk z&*PEvP=`vnmD%W$Pzu^w%CpLnu^5dYtH#Pk-(YL3`ZZNfiA_(bEHRw4uKcQmSJW%J zD@}8hdQhoTLw9-0Nh`vPJ1Y-!H`S(xorX)$2PJ?vYsBY62;}GrH+B(cL6#OSx{3pZ z*KWw>)gjCiwaO0mV9Ui#i%;2FUt$`M%X>{=Y~KyJJZu9BN|?bQ8iMI-Ja^r~1)W%i zq1rLE@U5SnmC@)Fd#)!d^Udl7wxw2QYl-8n>1P{JnfL2e1%*G0j>|xL2mJ7&&>Eu5 zP(2`ymFzAz;9#1~vk^*~cP|9$J4-5)omQmcjGwv-F;I^tb|y$dF-@sf!(}OyNk@L| zVICV44vPyUaGEY`rO8goNlkB}(E#o0#;-L&7f+8~grr{F_UBf1A}0{gJ!CVv& z$UZG#XEUxrCgN8Eb^I+b#2WrkQrAi_Rvns-4RmicF~WdM!n8Se zsdd6qyOvXTSI1|QPCOkmh28#&Ar3tO<)mw!bF!ktN^LRRh0M)Y4o|QZxmZQ2tA2pa zXxno&{J!GRU(BY>U=wQ&_QSNp2TVj+7{P=O*tiav5H|Do!>O+@k|wJA5GE8DAD0B! zwruO6ZxRaRK7tXe?C&w5{6>0bC9$}Y>;r5EM!B1kTqVazS;EvJ!o-XtH54@znTNam zJyIUeM5oUlhUYc4K(l6R@eF4BI`vu$-hB8GRpB$4Txo7Qr=+MM)2!803-m?u> z-3*-7??SU-iV3m3lZXpObd4{i7f2MLHHO_5!!pl(rs2$Mj%i(oLAzwCfv;9%o2}n0 z?r*TWdRlATjZ5#S4$axnJj@8lZO(hor~}BA@eq*Ud5&D+R$CQ+g66i@s4kZGkN=dTNx8Z27es&$#V9BZ{1&VLx-r z!D6G3d{_mU@uP6&X_-1wCni4s)nnaW$M&ap7{Xy?`?&^c$6}EF#yp_OI{^LKDvn=k z5DDPax?6J>>8;zgbTG$S0A~NGV65t>?R@NC7^1H*W+tGBT+0aiBRNYPtDA8d6K8I` z$@6Imztj_{86FX5)94z&FRZyV3g6n#XSo$vAWYSsmfac+lphcVlvm?o+bX8RW&@jv7P z+y75Ku>G5S!2Q>Q8vnr`VA=i`e_%}~Hikj{-nI8lJb*H@{W~^(Be@+5HQnF%`)B>o z!EgYa-2ZI}sv9V7G9dxtQ*IsOC&c9OHl=BZOBO(kae`v4eFFGRiRtm>H_5@59s0YY z^;8N#kw)BSU*1nU8UWCckng9#&BS8i;f`#00}JCX&x&m0SP~|?$w>S4V8x`w!XthQ znoLys?(nRl-z`tT9cE15>khMf$l)Wf5Tt_p9-ahFG}USW38~y9 z(Jfn~2WRBcG;=S)_tsEwk3tw3oPl^I=m%}fAjtM*pg8+`2b_xnXdmr{;R!g(KRj3D zz;c}GiXI)L2p3JFHPM9CeM;82gzhWW2Q^T>p#ZYXMVc!syeBy&B3S&G zOK|3@fhwY|1`$125=e+JuQl05=$rA#=RJmelj|*N3cH%}J&_;byIS)+Ey4AV9FgL- zbi1)OvV%=&+DP6Mj^GlPRrm9ZWo0!n4BNogTUr|O+F*hTgQOA{@j?XzG7 zq=Te1-in?%k;Bl8H&h@80_$39jzE^6^fTM0eByoJX@DX)k$tU5a5{obPFU==3H8!~ zN5AP-)b5V^uu9ENy-7-jhN_%o@{d=Fft9%!W5o>u*da;GCH#jL6_G4EFEJE`MA=KP zB|h6xA3{eNnZ&Lap9Ug!+lOhdQTuqA11);dO;l*(_jR3kg~8u{o(!$-T1(pEkFO}m z?ipvtyaDG3B>mT0EiP=<8=E^2DWu6ZlbvhFN@d{sPdZJ1eH5!XZ>&=H=^2TW2gTk< zh2ON;8g?aV1Mz3}In!j-=vhXKooE6scS(oR*B ziM$&E_w@mt>KRRye1fP9C zxczPKiIxtVWi|YyNyX1Ut9fqNv>h~>mtXdd4ay!6C8{C!UT6#J7 z>#^ghCv?rV;|5o%UZsk$fCM;7VXL7SPxy$g?W^y#QgQ~MMLNwD_R~dpWx(;Qq2YAL z5cwLg6&ji$gpL}-`?H>Xx?)Mx6ucw2)3(31nM_1?oWqTqZrfrIQ{m;ObnoE!Ic6{y z#;VioSPL`HGg9qu6vR-MVSPSo4O{4?l&<&iV<+Pjawd@p&fO~Z03H|UKOFMUwFwdh zR2ZGI?7@@W=sFB;ZGJoZeC%s@80qXEwI2A~7njwOXjwJ>7;=DmPXBBQu_EF_?~G|f zyKu?il=P6rL6poA2xY*>P?sis`BK9i|26lAH4lGkGP8~v0&IvK{z3fwPE110Uy>@% zfnY)XdjCkiE}iu_2oP!h46BF`(nL~{elCskv&C}0tQhhNn$1sgK}n0Z$a|Nd4zB}t zSQSH7CIp#v<`=FEW>6dLmgwGui~N4xQEZX-IEQxDO@`$| zTQ}Y%SkgD?vir?7i8881{6>E@7YuGu2zkALn)+<|aw#&$OMahD603>qd5z_ZVVHv{BvtZlJv*3ta(z&x> z;nMZkA#ng4EdNz^L)GLRaF~&L>s!8z;@nr*+g@NxsKSM^%3xGBh@Oz1_69+8z@EM(nU(cP#?8ZV5SPP5Z`#W#2w+}o93DJ&>VdYy@h|xh)0!awAzi>yH z8W1YHO2KFpw9}nktUTf3xRL-Ij2(s^KXl0#kR!wl-^gOw8mRO`;sN9w?jTsKQuPh< zgbQ7CP>4>sRj?)V>g^oY&GV_ngZsZqVO^=lU2u@L)$AW)MT`M?^w6I_Ji`CBS&#oobmyt+^qA>-rX(e*lN_ZWLfXmc zX~`%ei*z8iP@*AidXfV)yuT4k{T4*Nvk8W}LFVLxXp7T1zRX8hqAy|wHvYBB_Jj4} z5AlZaPD>?~eyBce5sS8lT7u6^Vq5AcO#8r|5iLAwsY|Ql4}1h0DAyQbCBoA^d|?7E1TqwNR|U-I`5+3?8?IKUUZw~kUpS1=$+HxwP`&8Cj$ z_XTvxH5nx^R0l{6K1R;U@`i5AuY@)peIl6n7E4tB7)buI0j^_+E z_0y6=F0+!w;)oa0;1+SEpRVSgNq|szc*<|5pXI;w;8^W{^x*FZp6`rk+{P}YcJa7C z3M(Jy0CATM!)S4LLNp!s7!#d3vay+dLDr#cs@)BeM!6`~AqVq5Y?iA}(C$9}ud(Y- zeArPFcNdQ-djdwr9RLbl%-Z4A1Bof{2cmXP8Q-`T$`K!cVeJq`|Lubw4u!*kkr9ML zb6550^YM6ODZ=ZkVeCs+-xnX5KK=IM86T%TtJW3(p{G==j|*h+Q zVw)34i2fk+6UdfVrw6tu&*{TFd=)(oHO-?QC_Fc&n9KE@4SrS80kViUn|z6Q`SU-< zEziRhx%;Ys?HY_cybRWy7)jn$Z-2JIeeSrWDDqh5PkTulZPkS+^6Z0`McE^;+E+ir z!h0>XJ3iMLp7X>rS1`-?5^e|(FR<-8-_MBWUeEiAK}ZhJ&0~TCK^vPeXNYxjBK*J>#UJ&@y0dHOAmk-zBK3krI zJxhD+S-E{H;-7Q1DV^o6gR*;6bBLnV3(C6e-mwc_TzrZ!Eu5h1##~FjalD4|#E4o1W%>02R5F@l;ZPk!m(5Sl37~ z`Iq|vQZMr$k>l1i4yRXNLz*<_3`;@^kKxL0EFykp?~H2T_~1ln-HDA+4*uxF`K7Qo z@oG~WPPvU7X#_%|s!39taUrDo$7G&{QgAPEdbqa@HfJYZIpke?Q-woS_w5Br|4-N+ z2}&|1SXqh@`jll+>C4^a)F)<2H|2=~BI;o}fRtj|v#kBeFOcCUmiEP-c({X{mVP0& z!&4eH<|5Sx3_6ZRHRyxQiY3$@dg>zErbbQS0MLd=ugft?G8fIL+J+mB5Qte2<35rw zJ+#p!ISU>pjhVDiv;zXtNTJIfm~g!BiaxOrCxy@y0{SFVzsLgOiOr_Bk(i9nl6v?6 zz|r>u_N5R6r(jb$N#z4PhLC!3@tT>;@*rhlOKt7fFK|rr^qLU>Mp3fH!9)FxY|0a5aNEe3F#81<^z*=G~^+67(^HFhyjgMPBH72hm^|?KDcB zd^bS5k2-^}p4)7h@TVVrZxtayfa{Q`dMiCqfM(`i_@>Opzp0w!`04J!{ z;sP$pWWOQo$QdZY-%mnv9!#Rp?DmokFORQY0H~xXd1#%aweT5+>tdfwORWlxFN30cxIs(tW;3 zRn*MVqs@9wIQ>M2g&d&xb^*6l=Y>U~AF}-TnIg~&t1&WSb~_;j=WIo2R#|ygYu;Z< zQ;tldYHl7ua(J=K7f14(1>HN9hZ{=`-{bmF>~!6jY|*h{geM(I*BrTG_g{6p8yV+uCvu$MGDLGBT zmJ;)Tk*(DVkP~~9`&BB~rXFT0+seEQYhk!Ao(AbPH3}67Zz3@^WM0!8>2dE1-qr9}KIaIN$a@iwL*47%%N#WUzM79$|-ni0K9xhL& zV6F_OT@Pmc`FMs+!70%t8+z>get)3N@#5t~yy!wliMkvUz-t)E(fQtX+r^KNnBRXF z$rt?36RsDGa+ULpX4W>#$=@OIwbH<@_MIqtt&0p*TBmhs=-oPI&vn6I9qi&C1*I_* z3|fDEl}Xm^5BBV3b_sSNfF#D6yh;@{67HWuzCs5RMHtD%fFqEq|~X z%#~z%h&Hk_4~Q5a>&xqm9P>w*Tc9Ktoj?hyLAq$=O1=om0$DF139S#cp~ZoSwhv*U z7~y{X0L$mj3|t~2Qg0Ftz=BfZ7z?+HTaHO6qg<2|hOwfM85@}B9pR4_mCSiHZOho| zGC#uTMKtN}XzM5=)2hSG=ij$PJp3v3+aAhpA8!Y}3-D=QT|8k5;ieB6)lx#4OV5&5 zZh^{!;M}9-e#M(M??mOv=81{&z1sXUZGv#CH*--^+|rxKOu+ME^d#&juYb|(8l^OS zND!g5kNtj$Sg3!QLoFpNeB6nf7h=!+b{3xuU-mHP%XSymy1h{PHT#od2V6Z^WdyEw z(T?`F9?e*gBYIT;Fi4d-SiRgHI0wzi*ZS+VXo%m1^ODs^>A;o>evn?sh|O1p2%AHd81im+*xDRPJZjx3M`mHi3N8 zBJN@Z z{<0L|9bT0hNuwlhl$MDiA=7)WlNwcU>L3OmoczW5+nE6z`Fbj}0lA97@3Y}?83yWh zw%GvgT110OD9>H44Da#q0p#mO@@o(Tq+7}huMzFYq(AM%)#~{ZU&laS44mDuf*D3M z4?p1jOfefed(VL5R`a+ACOKz&<*Hxi_zU>A=@0n-hz^{|#M}hwyg2Z%2<${G+}sSD zoJ6eL91JYU!px}Y7C7)ypx@VubR-;jtoBJ9_yH9VcJB21RxEM=7uSD5;;|aC4u>2_ zeYkgkjAFF_xcnk@Fc52tW~o5>#kyz$41UW)i^R3cW4ng$3y0`p+BTOw-c-&$pWrMU zxaNzapWl;}vj=FEm7yGF03S|DV+~;povSA4ef-ThIud5?jCxZ=Ry)NVU z-8wW<3iI)t^g)a}ks}joJ^@|e>_yB?m5c*$^U?~f4xic0Ymen%3_{6Ra_g%Ni>98z zScJO;d&}&c0l^k)Lgh1^=Lr%qw@Vd3hjDN+@B-skB&6;-q$%~7dJp;@Ejs}0a zNbiqQtVeckH*+*~N_Eo2p?ky3YIkV1uXvT4WvC}`i2K*3RNq~uJapYl(L|f>m2$>1 zWwKj^kn3COn*X6dV@zg$}kFg7oxGZvF}Ozd!A39ryRcLm(cm7ryJn{Nc;2&FbK@Fs+0bl!X@6}NY$2*1e>i-b ze%17z*<>g|LDMBoARc42VwMzNxtA%YCXp0yA)t^EzKyf($3FvniymZ{94Q)w=G@J& zBtMFDXLN1#=m^g&gSRgL*e;giOXRY}q{8}PGL8Yl^xT{r1nKR=gMELs(%rO*LZGFC;zY=Iohvf^&%;M=;;E~W>?#}%y zH7J|@<1I=yU-vtiGVm+xmICY3fT>|LN%|CTot4Y+JY3(ED`;*4VyB;P@vh*X>sFK< z{C@_oJ)PjgZqj9);QtdY#PZ)!4zZfw!`56#{~EU5D^?SWk-C6E1K%j2ZxV{S8WkeI zcqgK5G8;~7PFigF-qV9jt=xuA8EBT7p2=!qPuAUILMW)eqra`o`n5#)eEb&Wr#)?v zz6(M@rc-mm`qTFnlTL;VkrX2&s5*t-z2OY--g_t7W`Dw(U;A_`_4QXE|MQaRMX>GF zM&KQWWc}B7vH_i+afxD}K%N9?s@0?)c7u=vA9~5+DGY@dl(jDbWYEebYVcQr^8~1@ zUpcuzp?E|__3$bSgg~s~cm}0&&*Kh!&Y-%&v3KGllpsf4I?oEuPR1qlZfB^p?tBLz z&)@X2$mn&kOMma`{^!Qx6IrbZB3G-nU0dcQ`7En~pba^DRLZPgr=*>_Q^3ZaTI5`5 zR@>b;`@^+TgxM*k;IY%%AMnrmT>qu6!XXa(qXKp00Cme0*DMIgbgnjX&;f?kL8O_c zu!wu_3qxn|w58<9SDb(R)6GB1Rx2UAC2E4?p{DI93R52x!VopnftUE;wOQgji)gzfx_%Jh>=PsL#+OVhdV6@nUo4!+dZ zVn-=P8<==Bs>(~)0WAc>?+GNIk1-2cLnQHm3A=gGao8_xl8m|BCm&N+aqwOpTqDP$;V1RQC8n-kCedhmYqi(BFuxGrkQ`8~jFmak zab(4K3nDe*8y|^_H(`PeJC2aNW1AsaDaU<9A<)qas8yhx-?yw2K(m}(}Onp!E zU2OdDm0u*tikL;ZlSxW|)Op(1Sh)PvCI7m*?rhoK7Cm0M@C>`G@)PDl)X=(1TPa3+y3DUWC3-9pXZX2VzF`3y-Dt;m${sz)s{EKJee=88w)sP zlyYR_q9LWuZ?F4m_EICj)^-;`Kw}zxw}}{LwqIhn$XR9I!bXdBF50@J1Id)F^4^ZZ zehF-iaad7hY#u2ITzEsBtIZm{-gUuS(0OAYp~oM;t(P;`;$no>FOj;ev^Ze&p1SuN zR<_F6MztvxC+2-HnI-W^^*GB-bb5R0_csORoO6x__L4phTQgIDFgV{>gp8*xR$x{4 z;=R@_3(rw3tXaP784P|ycpsL`@p$(z(5xAE*gWck_(-=b1P`*XxaMkQ8Lv1^cR~AT z(~ELNJblQV>Mg^x%AkiO`pE)w?8n0pn~p3wG30?`qFV>@DsmK_RW7Ui%c8|hWftBy z994WV?MZJJ75E*bIo6SNj^UQm1y(MY;I=Qf9fHHSq*0tSE6YfMEAzq^>CdHB)jrqd zE0Pod0rD#?v4rzoifda^EXNVOM^dUJ^g}S;OW@_45o&LzRHcqAdM}Q6KM#exhT)_+ z9I+;Ajs*A@j|x>W*p9LE%Ur^-=V#CQ&lzd4B)!}9-5-bGgscXfjQ<>xp9Tp3IV2U# z5cC^>S^w!{SlBrKtC7k5o?1NYK>t@z^tVcdMO`Fzp#ldtJZs9_jpe!tp@$|;$QE~v zb;zYXm1+2P>BB%KKACjAt;dz-$<6oji0?f-Q-5$cmd*G$=RuOIFmh$jV2=1plk+7s zA=6V!&p7m1VwA zi$R$waHZpwb+*|nE#alOgri^f$tv4_TRf-$(=cwhN=5Lk`}ylClh9d!$8_}haoJ@< zDK|PU=e(=1QTBa$aHE`aaU#bZE zX_g}EKw0I**lZX1=uy>SYu!}LKy60K8C{5bwul)g@p;mvmE9SPNu3me&ig{;x)O5P zPYa!5vMp_pwr&r`6yQq(1n~y-@Vp4Tj?{DJZ4w>GWwy-!|;y{US zx{bs-z7QrjICVcH)~C2@?vpQUc8vdI;2EjNybsi|h%=1-Z5Iy9azdK^VVy+0DvCE* zJqxF8R-@68ahs$8xS~B#^t|~~V<=a7L6bO|lKf1qlAKO8OW~j_us%3N>KjcF6+J=A zw{L+x@~31S_D9>$xu}|4o+Gq;YTq2osPj{>KAQ zR4g!`D^Q}FKVWt4L5@NjpUSr9O{i3*x7Cu1~1 zN7EYw6Ie3^uzsXxTkFG1DI{5pj66b~xb_twYzL`WCahi|mdfFt);)GM?v`I0+-7Go zTk;F>tkBc6Ijr0qwb5h|X-YENMDd5KeR<3?=#?WMYxDlZkWogARiBJ8?5l<&o+^^7B0;m2gNA9H*Ln9c^CRf( zc-&_7rjs3RmIIMp6l(oBDAMU?aXQ|jCbOl|?i&c>)F^KBanrG$8)=;!kygxIt8l?* z>dp3bOq0l?E4w3mqH}}5VFPxt(P=I5*jASbNNHqcPmJ1aKYoU+<6dLg!295HZUm2F zqn^{+!^hrTq+HdFP0SrJUT>r2o5!$uP{c!uKp=uj&%PxUGNj9cC zxTupg?w=%V|M@d@%+dnx2$W5wivazlJ3Cd;{E2?ZBx!t54}t{aht{x4$KL`#?ayo1 z8WFyt$GZbbx7WM{8K7E;uH3EsYfyKGM)4~+-y?iNzdG>AW)^8T3#%(sbGm^TL;VFp zGbRh5y--$sV_IK1>;W+gh8cILI;d%Nz{pjQPh!p8a!OY6;%wh)Dqjy)k?_*Zb3#2J zeV_9?LeJCic>_=wd^S<{6n9zB3QFTb(` z?mclC90}&!ki>cXsj)h?@j0n=YCETL$FN54hI*n)?pIc-un9*3KmD@qX0wJYfGdRc zDNl&i!Ou(d$3eACdxy!v1O<-{6AMz?bZpAIc_Z6EOt;|A<(wlQr-mo78YBWi++~La zK@eW*^Lv1lRe=UyyWVaA#cn!1M#+{sH)IPUsMJ`hiF^T<;op*eG|CTfqXF^pE;ym@ z-8Tu#;z)3AGh|ECNpi_}6sYh(09cylB;$SptPjYYS;ZzX!j)#{Jv8bmvic9zxWFkU z07_BI}BdWne{YN6je_}76 z@y!Dcaao)V*0nx%R|w>Gjgg^EHt@dLK|i15aAi5%*|6nr?*s^LF9c;RfY#%$?0sLD zmn_xQ&0Up=iO!a0aBdbM)=tZVpULO0o=eVktRiGBT~$dN=BUd}3Q~BVZ8~AYz9&G$ z3S*d7w0)P_ZMcSVHYf!NGbbNGxOxi2==R=PBpVI17AB4!5t8(qq=`&n%vqlsjCI9N zxCB;)ESfL7tBYiW8h(cb-2b8fY5Ec^@BaIArN54+oGX`{!+_7BXz}<7$da?|{OseX zvk@v)_|d~dr_F(rarrorwI-zTJb7Xt?uGDLXOBdp5~v0k!GOg(4pfqw-QJgf)PDTrJb?2L@Xi@InBRAd>q-GbfwTTO|Nzquy z!5h=s>LxYIK9(-%<7yo-cYK&VMAmC2;J)T|Gn*&2zj~aX>gTM7=0dvVwh~E0;0|yY z@3;A!1yiL@{-GTU;6enn$_YVC$1@?zbdJT~zo>FR5Rn_nY(5{PgE+!w;}pIBgfQDg zsb&cKb;$fdsaiW(AatoT9vFZy0)N}c7+_FZR<98LJj;hzKYd#>2ql>0$SbqU`PH-| zyh`bpgo9`+oVILLjI8!MAmb4g@9(9SS2z#cG5_Af@A$Z9X#=_se?RncX_>EyA29Hr z9+{CKBx-5mN$N@&b@l%5(QA4JW=Q#2iqpd91-NgSs0~vfU+P1rr{=vWp(q}V2e&8F zU!aR+5P1J|dDZBM@af-56-oO#AtJLydNm>9zYTI+02>$A{~e!M`R0zl1*?Cq!s==< zRQhDV-y3T?4Poi#i-5bLTM(lThlTNZV|zM3{4BzX$R-nQ+c)jH1Kq`)x$qF?xN*$a z7vis8U(XJI4^c;tns9LEHccEmI=a?nM64fQI}&Mu2?m)V#~Y6%QJDeK5e=R0ncAEHp{)ZIC`j830%avjeSe`EA?LQqIa=;S4zwZ6}%6Uev?t z@;y9pB$*P47$)%blLM^Sw7&9Vg|2!QCcd$zX!3iBqd1Bcnq!Adqu&%p=H zO#7SB#3aDFeDw4f4ID6(G?+ofTT<3y&Mlo?B}u+2e~xbFW~*8HVw$tu$Wdz=6P*yM z=PCoMv014ZRpJ*r84Km9(v3|#dY$4xES#A_t6ILrOX2?PG^quuQ3PC#ktRpc;Rvb! zlYEDeAukvdc_|~hAQGCI<5vdDu>yJR1H&=L-<&#rMx$dg zXk$4*^%OymW0=KIyz%m31^$PANFDA#Ar6welwi4j1}X)-P-GHc8)gn|cE)@Qa;Kz5 ziFC*Or*@@na>ixawRC|*{YxM=I$c7sabFIk5nq-a2)q_l@&fzsy2i`YU}QHx1QE0M zz5ycIz53AR!8`zYN6*j1I3~ORl#x={;*6oLJpgEQ0jp(T@SGk&%u(h8zpLGkjF_o3 zdV6n(!4cD$gX zE~n$mHGvKYfajqVH$KuK@A{d)l-@K|`$66*-x~}Dy<-9DFNgl4p|)dhE0z7MuUH2O z`gmZ3An+p7kmwv7^IAltZ;=64bKeo(%N@zOZ)IO3FY3e1{ohBcglxJsdCO-hJB+wnG>^^K zDKENy&ffvXABp57Z6zpSXpgI%>(OPP$zL+?uOwd3aD4(MOn*1{55{p$tCfFP{Y;*Q zZPENRjeiq|PPcnfg{&|z`CE9QDgRk^p;_-8@%E?j?+a{xt*hy#xT09794TQw4?4?X znV?&%h;?0$Z=gO`2Y+n(sS38 zLTC2|2^`*+*{M^d(t9IHzY&Ut8**0jLeH=o0pA0bYZ}&rJz)ER~taVut^TMYn&*kqgwg zBgXS8rBU6n&(Lz}q0mmn&~2i{sT8erY*iDW)@<0zBHC&5%U;hQP7Av(gis#S*SNxZ zG0hI1kfugy`EmWWZlivxTvgLkLmVsb-FEh&O2sG31cRXZ9SEAs&hhYKM6!IU>C!jg zif7w_7e~-M&rZ}jnL(@j5Y=%3N#5^Ujl<8OUOoMTdK2CYK2w~_zTbm@Vu-id!I286 zyd6mDlT1<4?BCtlNP!}P)uYpGlu_rHFF&=e6Rt9I0p%64?Gmn02@YxsPc9jYob{y0 zLQx*lXjX^jlVaPSasy$z#zzR3s3}M~m?QZi5W9)ka$xY{sKcytN|3bRpEcxprH z00!xGxG&YcAyI!$%+ZD=_V-HNTSX@FkE(wv0d)9xC3w?CAqoH9XWlLwilhyjge(oWBx0dO`P=L##EL44h)9u< zasU1DyUSDrpzu$o6^vUMg-D_s2?xeX|P?v%%9<*&^ z+9HViPP2jQB<{D?SqR_VS``4S(<49Ru(>C54(}!i?O)xv~qMJSvXSvaL2=ks7|6pe+X&%U)NC~)ELbq9661iZ3Nq%t(!R0GYU);Wc$0(BA4Mjznj+y#TRi|ZLmgeO42d{!teNOLW4g{eUY2|XIh7c30LcNs5&e;@%PfMWe8Vz1uN z)KNq{R#S%YB00K5I}3p!iqIK#ABt#wPjNS7m{BDwUo@nWo@iDajcAK|7#`Va~sQ-ON>wj>ydZpGPxAw!m4%vB`+#6Ro;LM0#sn}hjlcu3Y`ko!ZP%2maU7( zzCPOxytB&F9Uid2aw>5Fp?AavbV|t?2?^wU9m@ys43#UEbrDD-)mc8!ICRM*ieJT? ztHLkRo<8F6eFng-SG~ec(Z0-6dIf3yG>vOqZDV@Of*rCrWGsw)F3&*bZeowcM>r2^ z;`3L1P}LqO1rWL8QqG2r%Jb+blhxe0v;;lVvF9Bvi>R^?1l7=eQQ?XFz5SG=`pyEH zUT6J%1_{Xab&{EZSxgrL2Hj@Cy?1;+c{6%kU9+zg!Yd$wL@crhj&CNwwUZ6IK^Tu8 zO2#gZj4b@R;R@M9)51o_OiwgYIAHFCTp~|Vp1|Nv3Qn1CJ<_Zm6_*@1M)hpG?yiHd zPb|_$IPyePgfQ`dT&5@8o`l6Qb~5^M>}VGG@8s-4^FuW6*xr#|BQ=(Uot63feWWmr zVc6JG86m*wq~9`5hH+>rXXR*``3~OZ!m0uTLq6LJ}fzsO6-J1ArSy=4&z8oze;qHmi*M=-?VhjYdOR( zojN|$B+$qSEQMjh6I*HCSp^y}lADH=vZ6?v*ju4aG|5INF=(_38|xhS zw`i3$nQ=f0ai|-LOEp#;T%tduQhZ4tF!BgOy&0a9oYx|VONBI!mzO>w*1kolVt9jm zmuCRJJ=Dyx40m;oor_fFOKq%lt1>(ZwSndQHm+VvPmIjI$iB*6H?hK@pIuZ)n}l}= z(r+}95zMk$>f7>4Xi|dg(tPVZf2D;e&m6BIq>3P(%%F{D)m~U+_rwxg&Q4LCNUOHd zW*$TxhneBrjQk-W*OQGL-IW&1(uk%rhy3rPb%#sWbpA2PfG=wSZ!*Pp3Av$x5@Mkr zH}O=$#%IOS@1f<71Ss&w%Y(~!O=ypS0^Dlya(=)6Fu#0Hby8dCVhQg{ajc(-tmt@l zv1>nBf~)hZ+-}>wDfl{yF?{RcHIkx?^P;!?e{A<1!~cr;59>nqbvbzjRtJbuUD(nH zbic={KW5&l97+bG*oInn2F~T6eeoXpWgcZhk+f|!_qYE10;YUv6#M5iKdV6c&uM;N zhtz&whs;?8!tp;=^nY{bu^OA!n?m26{VU;#GR=zjEo~t4@N8%b#Nw)w%vmr^bzAnD z0(tr9x5Jg{o5(1Qf@Y;D>0&;cqYaYlbLP(L5xgn8*Gur55ptfeO()j|US#mjqnkY7 zupWrkI7~<8M;aB@>;^r8iP(-W>K0(IqvT1x`w2qn0)XRMP`AfFEUnNLgwS zWphs&WwaDxgj|&!QS~(myJUab3V7so_(W5YLAyuNps@p$PK2xM8-_MNIDJH2Y}DfD z$Lk59p^9Qs5hjqJ$Y2zW-Y5APJXZ+4XmK{r+krreOE)M5si@epPpG-X?GNCW@ID;sO)u$KbL1_mZ^g)USpIfOovC!FV=#cbO$Gm7o(rD2;tjL zMe)~DnGt$ZXv<%iG_l}LQ3dEG6lnJ?89_cZm6zVmMf?yIhE4)8&byasmaHc|NJB%_ zu#&zINmMmy@_lnajdlKzdia8_B&HeYfZ~2m)M9iSRj4>z@kv}_xUnkiuf*)nGj5%b zsCjzShe_8y?F6G%8UkR?&qflDpSC_K7n`|U6A$#t5rENZR{SuzBE0O?@{YXY&sse4+S%RZMb!`>9MgijE2 zoC%T)vnn&pL^ejuB9!q1`$GoSr|Sho@tVa4BH{dr-#`CbDs2?_@b50H{Y@9u%P;*# z7lppPU;`B$F8!_*ivqyH%KhK&i?)v9p$v+@T87qvgQIZ_wMc+^-pyj-L1%a14e&1hk7wKtca=V!VX_P z!R`)akx`?>sImJ$nP|u#vdU;iXp|(;O#mkO;X}L=KR`kvM)KPS9Sr(3tXs;UN19Y) z-rDK;-_w`fxjFx*0O>oz``58Q>+E;zJ`Es`M(9)J6QXF`*)C~)jFJQ53}JAmA9@Bu_pBByQ0Wxm%6@2S@1OHQp&qMR$`$){H`nH_6t zP>SZUS0(C`x<{r7mjS@CY8*fL&t#EIVZ49%dEQ{rAL^KJV|aKnx9VO{cb%=%uLGeM zuelhmuGU+IA(4w5E)KPNR$aiyMZ1X$_&4iDP(V;lnCJ#;J~4})p{dN_fB>w@dKa7p zEIOGfauPg+gOVyai72s6e+MDxdt$tr3icM-fslb<}>H(1yzgwr;h>ry}!ZG4@2Lz<-TYfstO=h^KjD>M*&%fe_ z?)lTwkPm6SH*E&2)_O`PQ$;be+l={y@!2L-??`f+337r%1>?E|ob_lnA6w6Q*rt&( z*FLf>+pQF*Z+tP|}vb&5pZOk9hX|j<9B2{Y|ki;5%Zz z2hDP9!(J?NM8#8_AZSiCv#H=OudQ4`a>C7>@er}Nx-Luhxf}1$RB#bsu?N8A|Z4Kl!MT6yzRd#)AzQpaZ45! zO14;clg8D61m)eX%KiB~)JwP~hAQsJxwYhy?1a)nl$#K7EU85+;n|=}0uTdQSwanI z>7l}|<8baupM~r38Mx_U_!#i#Z7j@y-|c%^A1KStJfq5TQUMffO*>UTqN{}@_;J=# z6gwus&_K=-2!-wQ=mrj4nJZ7wXANw-XfT0c&P3-(oU}S~J)vpSeG^w7=k4NOY zB*M$J=>FIZodx>$=N&;uJuPe?%g500;Ay@)Yt7TkH zTvCoAd}m`b9{?%%H|@*H(jUy9XDlOdN>;{u~wH&8P4kTJa@948J z{r}kdr|`_eZEF_}Dza)7KHo3c{Yer2M1!i_gBNYN^PY#W~#%0e;!+)}hkuE9k zld%OBllvoYS05QvJ4=wP$7CgJ^}RqwnkLc?saK=`Yv7KGc)+yOf$4`TxP}K|ctO{v zn27D`ev4r>HD{&ZE3RJPBTiYS1-Q?czgW~^qbB5eenXJ|I+GSQu(kQtV}>mxLrt_z z7gy^k^AZ)KJFBq_?^hD}3Xj+aQQFRc1pe57=6#k&wHoFdJ7rtFQXqOS1Q$ioV}mc% zTBq&-ydROKta-qnC>!_~q;j0#ln3t^+XS*JPKcdNE06$3|{*ZImBLM@A4;fr-APGc<lA5CM zwmo%osVY540GCg<`xRBr7opcQOLJRTjKT<^VKJ%H&4hm@xs(M%Xs(dqp1(h*sl4E4 zk0K zRom0H{kHUrw04w-CfFvQwI4VZP^oyf+oaDF(|RJ2%s|RYb7>fB^*y#l+!L#;+Y6kL z$<7?cS(lER=8DfE&K+IMFt{h(&p`LZFK{7YC<>@p7PbtrXH+i7J(W|i(ap*G{0P&? z&Kp(|#uJWJplV!Y{cOkFvEZ7Y1O~|JY)F!p5xst1p|@w6))0NBqJk{0{i>f*DCg7L)$$zG!1O^#{_`GQeE$ zb@)ilug_V#j{bPx!jp<F-DGnVa{FLh?#i}a!onZPEu*pliRclSJ=Q4NIgLJtmAj~pX^x-^aO)lJc^iY0kXly zbXZ<8YEl{5&Fehg>jFl-bv}S(9H1xf8lJK69e|>l_z(@f4h-gTn)sljqgt=RTbnbj z2_j*Ln$9q8Mqz^y#q%dwQG*s{F2dpbMlqiY*gw z`Z0P?cjoQU2kg8FGxlXaH7^*oKEg{qVfpciLTIHZb_ zQV3e*02)?VnECVK?W+8!FGtdyA>y1EgTewu=MXXL9S&`RU{aVmTITPbXn)cc!XO3; zrCPssY2SCzU3lhqWCLqN%w5NAIT0k3ott!Q821{xtdJAQ<3!9tqlZ6&0h`6qTU^W@ zbvM<2)Hs7i9M-{6(hfG<-XLe?+gxy)_Ez@rzN#r~-u){b7D!Bax;FQ)9Pb?Auv`7^ zP$c{AO{Vq+e|*qzVniN)d?~@7C&_Y+=h|S^-i&jXy3w)@m_~_YAOJ}z329|Ht}ao6 zZVb=F4@~0VJkY~63txU+;3K>ATfEjJ^k}|I;519xFFDFQcX@xfNP1>f=NuCJ512P z7;ayY|0TNu%oB<$5boiO&i z;!=7~q$_nXkl!kPg)fO;Lby`UgM>@}F0vfSBqPTj2`?6ElWp-(B3ja(s#o1LR-`fu z{8)(s-wU0jObRPa025#JbWQZA$wjPdBWsRJ=?`%j-Dy_qRWgYcqRRbH7SJIurs9W--^izU}@L0SS<0PJfK9i=&xqQkbb#9$1& zBph=gFnU(wYK@>l9DlPgx>iN@?)=fI_C(d|Q#U}bE{NWXK`QeXQdXKk>sYX|54SH3 znVdg?yEY9dmc=*=t&TTR!CaZCuXRtOC0+Nipk(#ENyCU%B0_2FWYS*;U5rSE zN;P(=ZtfQ|qNv#zqFQb){c|NG;{=huFhY!(=o<3{fJuGD=#>3qq#GSEc^qzJ^L5$_ zREBzo5Imo!L2;j%ggTiIfHEQ?zl59nDa*lwj| zhA1$?>sv8A5LZP+Pq}IoaLIb3#w7?ffMOd)Yl0S*XxsRTdOj?LS8z-|M1TTA2Ir{< zsBjDI0a?pogU1-AR5MyuC^p<*2kQTaoX6v0p-d57!*f zS7(e!<~EFCe4vITlH*Q=ydA317u^bT$@=MTE_BG_9SGA&w9#}&{|N- zAnPT9F%2l+qy0erY|h9Kr=MErX}(F61oGmk=!zuv!p^VeV^Y8#RJIRX{hP3k?X^=@ zgof>yzy}bD^t*lz2;Q=*Er&~X#E9I4zWOF9%QyO-dLK^+msC-p$EnNtE>ezAZT3Vd zV9-9_?LuXs>P3gNQ8Qhbu!b17g zw#7>bIhyy9UcgH%B7=*hs*AjH9fYL^pa&t+zI*@pUjx&4bBgN*GM?Qt_?K|G)pUcO zWLGAtj3VKIV+QYiYk9h}ELPz_g3c5&VRM=HhKcdwuxNTx@+*C?gP5NjUf;9mv{wU= z0bb}pTa^vcjcXDR0R=n&s&;WsrJcnc^+pEa1(2P06bSR2*Ho>LDAT2(GDl>=Y)8|Q znVt9fhN3OVS(TXiER?7`&cN*d<8o!@_+NN{oc}-SdRa&lUCno8%&=^FmVID%Tg9N!MJTa$s(6&CjH-mbO| z)!(F-evY0*8n6O^B~WoF!wUdT<7XVq+xwhwHtpp!3?}Uk^MhPKPuB~(*9QKoM$B>C zO+B7O#Amro3xUjrne&cU=!g*;dyy4xgh`X3G2i-Nm&7TPJSWr0sk}MZoL2mM=g=crG679&z609aNhvb8=+6 z0S%>TzyG2h1``xPB6g_a`3osvJePw@2q<$UbFWUk5)_^m>Z=l6)J|Vo%N6dV`Yk_L zUX`g#^gdXP1agh-6l7bNzGX`Q{Nh9MoAW@L`?Gs*?xShl=`xlxdqR1(`di_w)l3#$$anqu)r zbg2R!Nb>Le(+*#aqHYmO-YhWdAzSQ$C(2^lI1chTCV_hm;}0lom64=Ib(9|_kANts z`eUvRfsR!;Gi2_>wV5s`3v}zq#`3N(J1tYjzycs%*!3V07=JBG009=^i96OQt5KNQ z_G3@744>UWW0UOCSd;@4k;pr#HFv;X z8s#R1IVqf6p5lQ$LsaU0WA`@?t5m@sigW*+L*?**i#`eWKezj!zzixoF724_48);uYhXly( z#uGi|LRIsYgU=Y?nhMr_3U3ldYr3~92G9UJr;6z1ud_r|o7`2n|!{ytV@FSnA-Y%+F&U@oQw1RMvDQ=T~e)Y=twxT5`Bizc^i#{S4C0 z2B9U~2+?j0rQ$`)#l}8Q5zf#iXh)+nJE}1!HtG*Ox0ftW_Rdl;+rfATPy^E!lotUg zlmk>;-PS#%GW8P;+MiFbCfF8LC6spKzBf7a3Jf2XY%?KU!^ogbdRezB#b2_HG8&)}ZoY`?=Rx!tY?nK74Rd#G{ z8vD@HseO+lN0~Ij#2``fFtI!=jI+t`Lp3pj6m#yOgxGct&uig&t&K)qNLyq#%v3jks+ESdK6Hd}<&Uls=^+VFDQhr4QSy zuo~J=&7x}-u|*L6awf8qQzgb znhqI(z69@RzL60l*b)UH*#}^C2IqQ`O89^_wAUnNCtD_F0BzgIrDQy;$dOC%ds}vt zSe=NCXem9h+YzkTu&=J;>4T{Rk@&#UTyv;!OdPzk_7ZIZrQ?WgiORk};VYPf;Fo3= zsK@1c*hZv>xQW&p?tEvtRiHrN9KRr&M@1&&NW86XWt%n7JGS{d^D4m5`MIaDBK7%e zVpO*~8;6}()-xAOTbXp~k_r4ILXPor6+FO>OZ!~7P;-FGD(W+V!L?htHN7UPVfQpw zVY>x{i8aDbUb`j(9N#ApUpvoj!}BDD>MdG3P2=AboQ#d{-qW4XLRq6kG7cx;@B#*S zn_8zZKfT?yCDC@q4hzsb3r?T^n^LK3Tg!!$=dkfRNgIZwZS13YeZqLa8p|k` z;HYoD+b0VddGzh@l!Md9M2Hyi!Lko)=6PxbW_S$SV=pvbOmh&==w&M z5Z_wD2$I~o?LK;c#t5<>+)&I9%TkPoU9vLSEZ-iKRK53P+lYH`V3H1tTe`#Y`%5_% z>e{S+J3Ru_~j#9d<+IG?rXjm%;rkvIF#Db_E$2_IW8b zh~bXVE9}fwK_H5m6@4J<1`xPBhP81?gh@6vI!-$(pwu1ChM~dsM&0GSc|#t=S$k*{ z!C;OOv`wtFWCVp_XhMtKc$^}Ii(6rDKR{1!#FOw$f92bnyYqIKY zsjYQRtPL6@7I-I2>x<>%gM2b*bJB8DbnJs`S6E}l0a3dUqFcWLAvQbQQN8e)IVuji zJ#)gohiuU1(4EqXBL_YmBm`ZA5cltD-C1;8;rQwx_mb}{= zK{P5sBv*4OG%Z;%Tw)z~*^*SUsLtTI&Oa}Ov)`bR#yn-P9;{0bg}g3uG(;4m9%cYq zNWxwcyZ{_4I)MVye;4ayIgz}0Fb}e(4axaqV?ZWsvdxJB$sys7UkVHL8)6>7-*fn; zVqht52_7y#dK5s~#>O)EJd91Dxs^#@X zrgjiZ4c_YUT>Zq)Wff5;5h16wCw@hU###(g{oF42S}c7`mlGVK`Waoae>~7*&+Ucq zm1?kIC^-oD!tKg56yKN5;$=KT$wR$Sgwj>MZSzL zT=3OfFyZckwlvGR3`7f}V>wbj%M4)@;RvBD<9gd_HLlp0jVyC756iD{%k!1Sh)zDq zhpdB%Ys_~#?r=vS-}hzV7Z@(2bM=s+i&Y2M=bYi{NMO#A3zIJxQj3Np+Du}tPzf|^ zwn76m7(L1USbusg54VGd;Q7XGgAG^*OhX|RCuhE$&J}6wZ`1DLx(Iovc$#-1A&X+0 zF@T(on@Uvda9nWF+ZNom3lHdDi(Rs3m_1^4nuKqu6u5rA{CHNh+@k#)-2 zqCFR*)O{uF?bZZ(LP+O+fKMj6+u6Q5u%3}=Z;x3K8DCZxT^%keFwme}O#O}4LH;&* z^MWb^yNSPshYup5TM(79@N%Y*F-dF8D^g#xwTfb7Vc@>N*pK>saq@0VQ8*M@N>d21 zKO*XyW6EY+ulglgmeXyuM=e6o-<0pRz}*GSn5XXN^Y`&YUVUflzT;Zhw@Mt0B6dY) zlLm8)-nm>4!KQ23Qo|+4IaBx?6qQ*BM5~;1X0V)7LeeWcY$OE!zLA!RB6t=3PY-|M zZv&U?=i}UdPp1#PMct^?00RzA>if<#zo2;_1U zQ35DbSW$FX_VptC?(M!{FKhL%h0pOb_fc~g`BwUtaQk7Y4C^m+tTuUP^g%T#Pc&I? zv%44=NWqJwI2DK1_-=J`mh4ra+2(9&`DfJ=7^1wdrN;Oi2zMim$=4PNb0<{@64 zih%lsZy-&r$F=`UI5bUrO9q2W!@l{y62|*8YM5%;^z%=7{$UH_02rB>|DWYKMorfK zKpeLFhdHvVNUeqx@l6DAdN~6moYv9c~ z=t)YzW&exg`R46$I&DMV9kIs~)c&8{-jxw|yJwyt>fpX1cLd?kH{=4T3eqW~B6rv@ zye)v=CuRV3dCLWPV4ctW`bT}dD}(rQ*YL@e+a@CJdUt|xIHu=zrr^KR2yq0th1Iom zy91H*0V7?a&ftj;A+V^uYi_+osRhNg`6O(X@6Pj5*iF6-%1}Q5O662tKwmvL-G#_l zDWZB2x~7}Y=M5{uqgfZLGEs{FyL8|viUiAR`kBU11OO!8VO#C|W&*DOew3ST| z{AaE%MOb*9Bfkf1$%SO-(Bz(1pb&CqnGiY!C)8b7iRr{$2{Njpb==m#w$@DM=?SP4 z&=ph0*-=epYGVqertBqHvRJ;t)xct%{ z<3Xe8Mn<3gNRLDnv;VV)tD)Fj+%LZriM|y!3f=68LIiHPrwGd`;si2zzxDa$k!DRf z#DHv=By}pWhp`aD0+B^v;OXH4H= z{o8GS6ex`MP4mgzq6pYO{~^ktJs)rG8+Swo3;4nnZ|?zg=2q%^5h>Q8t2)< zSk;mW$BW*5quxHzD0#pqk{RD(y<;IKDIG0u@3&(hM#}orA-P23M9zXH?k-oq2M6-oeh# zNc$t_zL36*PfxT4`hp-t~+JeBAGOv@@vGfUJeBuwHFqaB3Xvuavi7XTDJZ}AX0XYbAoo>AD02pHtDIH@IZ>=oS_P5SH?dg)ltz3)$ny%&`QAdM$sO5@(hiK z)w2P9LpzygZCfkK25t{s`lz=>lyBFH97Z?Ra>awu z2*4aFIegrjhaIHQMI9J*NOeQuNf)-An)OP3!z4a% zOy9s~pY=}v=j8lQ{{PSPfBzj#OX>ek|Cw0X{-1?5Mg6DHvLpVd(54ruR%0d*|NIC4 z8k#AU3;@&W6GRY0&>Ee=#@YCD$+`vD!E&NhOwHLMuOm}D%=*V+-1drQXK&9>hyRbL z$~t|A!JsEw&JLed5^QqXg_vj%03~iNEKJXmfKj(8OM%6^2w0h294BCr{0cr|SR9w& zg&`2210puS0)}W3j`(eMKZg7UnPvs04ajcu3JA3nQMIl)XfegiM@YBDheiTz% zVxKN<$B8^6UaGCiL7Hr2OR032-ZgHv9D@t8J+1@zzm`IiX2ook79)Y+JWbk0F^K1z z?L|#6Ov}=%hzDkIdyf6wWEBX@c5w0@p2G?)+R(USFMtdX?~X*o(K;7iB|BV;1bAOT zOp8Q*2|_8DJXpD!Nz}OJfmQ~gprsWdem2_Pf}jUKg8WlMkqH1#*TNB;q2sIQYFR#1 zcF9&dPco8N|FwhgcS%vurkg?cp1oeg-;Ol7F`RSd*NvFxQurC(f&{&U?ah2%s6J|` z?#?{O20&|;PkZmKyVLXe+(L!F&^6LwkM)R^CZslOjBgt0-32L8m9)v7gy4fegv1j5 z%}wS-&AK!Fl|pRIrth#GrM>a~{^QdAgt6jA0PJfGlc%-k;1H`>vU*pE+BN%)2uYRz5dj_Fx1OtJ-j3v&Wv(g zMb8l8b(fBIbd$y5Iu1FGRU9+6ktW_yS{dxpO-cv2AiXttT|+uc!H%w)>N9HzgO*AH zUlsobA<7g5ZX*-joNsc}R=ZYs+SZuMw z6j0K;aTF+Ur>1_w=l^*^3zT^C!`7rEkfvr2S7E=f(-WFo68INEmK99T>LQK^O z{k0T_jpe{wxjKv{qSu3fI3?v}K{N zYdSO>5lO#zLJEY=&WOq$cYR86Wu39FdjKL$*Ar2xrHFnO`$NfVa9J9YeM}ezJoS5w zK?y6byBpFohbd9?Vv`c4@fIsDcYxOMeC>GP2WfPpnb_^*5}nF zV(D;kCBz@XSf7c0Omq9CRW}Ykt=~A;-vD_EOLFFCb7-(iYO$KWLht6pfz+|8#qoav z{eIl@FQUii)yUv{*M1aO8U@W9aY&uVo^&#x&k!#$N1qTenDh4k74CTC(0@W8s=!38 zM9Sz%qyHUl{&W^~R&voV zYLnZnfSvYuR4i>b^Z?_GLh(VCK^AjLyD!AnR*qhIzfbChdCBNrxuKWaxAWryL}rY* z`wJQ>=9i?xsYTkA!YS(8wvHaa#1PBZ`_bF^hHYwwQ}LcmoCI`lgR@~m;?2$oek7IdZ#>5Tc4DO&r%54@is~Ox`0+%0H z`_xx-vui2-D-Xg$bVY2Mb}V!YJME|*DGg~r}J7`%7Ybpt*CPUhKWKBLLr zad-YIbH(t|X}pz3e4dBxO@jAFjCDmYJeoVtokMT_-56N-Zd)h+V6gIAU#t-P3f*ri zv0xwYlL~y2V)6)x+9Jow><6yNO(KHt7r>mbgp7H~kY%p+_;oqs5NUy8-C&Cm;cEwH zY>E7SiL2T!7ZZtx)~^F_{C*b=CoD6KUnEf1K2`A@5%(JjrCuE1x(kQt51}`Rq1$@` zQOA!a0})#VR?0N{Oo#e)7-AS-8DvI*{Y#jT*5g*xt-r5Hh!{W-Lp?kaXGN4DUpaiPFWo8LU$V5#SYBKv?czwI)902PcUtGRFV#q|cU zTfQ2YxZ@4s7ER`5#b6z!Wwhq@=_LWy8ed1;qrF_n#a8Y{CU=hv_xVx6@Xfwhdpu))Ety|Bp2sOB>2 za;fXnLmgi-&{*IaEe^MM%ru(`_QXiV4GRB8^mSxX%Gv zjE`n&ZigJV{T>0i3N`G&L@`0jrYje{CXjdai1e23@ftSdtR;#Q845*6J6ke+HrKhu z9xFBA`)&ewzB?>T9Fw60W7fJb=+RsU5hrZ}6;HuhCM5S@l4ot~I#D1#Fgx-ql^l#? zpv8)h-Qe5axympL7|7H0&DTGXPK60ov^>KtPID1cb1xZi6o9WW1DRZ}6gmdv7((qd z7p^HX5tD%)3Fgp&=wb3I)qlg-##_~4o&p7u?-c@&S87_t)H_r(vV8FF*Uv$KDo?3v zweNizMR1x#TQ3Do8T;grhfI;0qiQp>v+;r3NxIg9U|9Iqo+`S!Diw~z=yO#qD)kGn zGD+O9n6f`r`2#&oD zffmr(?&IijuaDYRcOy$I~poJLaB zt{~}i=`+7%?Mll}hS9$~`#Yb&Tjef5W#H*{>ZDfvIyQVcW9?Y4E+ZNqfe_Y#WY{Gu zekWN5mT9N?3or^`q>dug3~MJ^@yA6fRj>wJxBdu`x?_;8B>KF~cXC1y<%6C(3UB}} z&h?YWd1$TZiS_0pK0?RV-BF98LYVvZ1O1k84&cX%w3nCLZd|Sol#8`5xTFzSz4;}E zHlHlf<-L22F=EwY6@o2@V3Xh!BE_y6W`Z-%I-^#Dm{3@ zaog;o`n5)Rzv49Kc67G1I_xTB?7{%nJX?>=@r0OyRHB4)joR1B0cz;EVhn^8=N(0s z>VEt!1~IblZjHRVl|Dr@I{Mw2ica(3jyAh8I5F(XypMuvXg<=y2pZsLe4YMIYRmOW z<}it843f}2QSz$I`^sTn(ioQH-R!DA8-|Ctcc}NIC`m;6tx|X(EtW?S>WKl}&fOr* zKNQC5*p7s9l3mcIMLz9QN_XN-jlVrBb?a=G9C8obidE{mY8}!OtW_k3;DeKV-GQPj zk4U>uA2T3GP0MAOKpX20-bM&OB}*@>^|EclmtJ7(R<_U0Fv0S3yhmcIFpi>*r#(@s zGYnr5B;qM66-oqSH9}eeFWZ#uLvg@W+=E8Brd=ZOHM+mnyrXl)E>%WR@sXvHW zWv?2*xv^n}Of^SBed8~!r$z@om2z6|=nn+eUb~V17V$=G49Xw)9=QQLKA>({hrU)2 zk+A;YuiYYNb7Yg`o1k*jkSHpeQu2B4zo|=lu?ggqUy2@UIg@M7W}%mNx!qo_uY2cD znOwE{jjb!{msc*l9bLES4r>pVyvS1ly@6o4lY0p#lJv&xbO!V95PL5+dT|o)Sr_ku zJG}&PJsMMAX|n%Dirftny8-VG!y2P`r!OpW!f8A;qb8Wndr3(w;+w!EJ(JxUIIp9* z9%`2II#u;0!%8nwYAxpVziP~G{^4xyR;}lXE`#sbTt+mZ-%t+1xMmGT5m#y2K`cYV zrJ(WWW~idkCQTq@ZS;6S^7w8NxK#6Hragk!XtYl|$fwYz)kUjHMFI@VOH@PaSK!+8 z1_Yx29JievP}^R)GIE25Ja`)9d(h*6vm-absG%EBYYqmnVS0~nbZ+JbA3_|MZs8nN z+c0J{(Kf(@#*=A#{5i-UHgNBK)A(q+stQpw$ffZG4~xIZu{P!ttG+|2@JbleZOuDp zH$IiiS?7ut9U4@yF9s+}LB~Kl?pOVhL^?eX+pjy@c_OVVMZHRTY8rZ=((@ZAx z<>M*TeQ-OR2yxv%Lj&Rj7H&t~H9>&WMPHSvTL`^fykonkQ3XH--U8m7v@si9=A~iw z>LGH=?$e0$@BBJb&^Ne*OA`RCBPh}Y!L-h$cR>g(+^8NXPb7nOu@#kzAWlmCqaf+F zk@o2CSKgG4EuvG6?Tri?p)M(CidT|K!rIg!=)Ggx4qz3a-=5{F_EE}8A(jfl-15>N zNmNUEPM5a}jsnQsnmr|@jE24CU&zqu%if@;qjXpCD9u{cYnU!#%rO{Wt1O%|Rt{x!B#@hkN5xoQ)!DPQHO^S*}USJzljRIbq3Y zaz504Ug)qyxIRY6J@|%uEH`u@r(>{tz^zSGjo@aETduSOJzoWKqg{K1nDCYV{>>;p z443qyg#!x5@y_e$)yG8Qv5V{e{v~~Q%t);c34v{%Ac^83X+`;b1~z(m;0fV{^$#~R zV*$#yG}68c$F5*WO>Kltffs6FB`7VSCt|J6CtTGxI8QAIDJ7v+6|nd-hm zNa?Hcy`oO@w`k3UPvy=OIkR)qXnz%yy4B%So1b;5Yke&%Guac{gz+1ZWHcB;<7H0R zw5Vf52^@gj#d>wUb!rkH0h6A0@Z>c`^5TVliM6e=JT>MRl53hoJoF+Bm8{ohq7cF zLmmNAqEdLL^#`Bpdtk`G<9L>|Df>UInPZ$KXUREFOl zQvVNrtSyya^EUc8FN)$&jm(o2&j-P~h}5tD-l7@A82={^PZB0giP0)ei8-y5hE4hN z?T2oH4Pa*C{9gjj@PFbPoXG!;Z_wqdiAE+@ix}p6T5@<_>CPQ`d7oZG{Gsa(e`zr`41B`#;8r-K}YMUL1ps}wV4p;76BTpqwhSErFj3?!o`2Hoz-6-ZJCllX$- z1fa9;ss%{l{pqpSFlx1Azora=j|q17vvhkmS-cS%$yvv)_W-feH}l}Gc9#>ZZ2=|s zY&w?jK|8C9vuPOaKxhL?eU#%KkQ#))^(9_`|M35UqJ;n_rZzeB>ZCU)NPY;z58=%S zwiGe+b#!|^3$4#YX+IcBcf=BJn2d{<8c1gqF91@PFw7pgsYr}YnXDip)5f_bjqNNzWKwO?f!PwbHJ!DiX>WnikJiw$^p44ULk9ulBBLlnWoOfe(*BWwJqE-xQsZtYf;R7ji6D zxxFFV*X$nmVlpJpof&rr@|8xe86|zk9?Y^27SVwQlql(y#1FTSvYc3eiaW*Hx55}L zK*Bh6$63fEc%VjrVLyYOJ@8!f^pRIUoPO&4{tHN=YwDc7$g&VaQF%7OYNhXk)MPRG ziSS_=Q2Uq2lW4EvHJZ%2!TjZPEh=b(P5}*Nz@@d54y}g^3j*uXS;Vg(s@TT9EjH+9 zHQt*7?xSigvmwkk(7#(Sr_F?u&tN2XGm=p!ArTR) z^#Hm`3K{om)F^I+>h6%3Xe!98Awx})|0xvD(lkBT@aTgz;}sO+VGX{{89gN+0p37< z4;db>^Pn2?LbF^;ahC4lN^+8B&)#}wIS}0AfmUf}HSbl4nRl_?iMX(~xgQzoOe`)1k@1Lr%~a0%c34th-411&->AlP=w#5_6wxuR>%{4F7`_X)EZ6y{&Ej!bRc-g_*qhAx=0GYC%LyekAo#8Zz5o*715M1OH?j_^wnx$~ODnqtgcIuY5sj*8-GX!U2kZ|8k#dRxG zIyY4D98iINoP~Aq@iZeKk{agC2_$f?(qtGmq_)O zW(P4jg(pAJ9r`s_iwT@Y^s==L%wid|Jo=W`gFL^CltkhlG2eBK;i>#v$rkWqmE|1X z6bvI=RCI>P1?Z6+w?6+Reh>6>XhQyS){Pn1{G8zw90i!8XT2{-C+{W9zfW9+s{cJe z&fV2>E|noKYb&nt93yjGLtxLwc`S2TwBxX_cF{sRQ9azqV1;sBA0$vk?HNleP^z(| zFLU_A(ZOxmB7O`i7CP1!p$hnnnXhYPNKJb+Q|mr*3utx`^H7kBR;S;)ZFZaX`TgYS z2?qg`(eCyjf%GhqAZct9l!GO<2BmmtfgesR@zkPm$N-MCo*jF%JM%QSk%a););Zh5 zsX*eZ>RJZ;VdC=q5Zv(m{o=15r*bUgyZ#EcQb2Q#QhlDWd;*&x_STru8TX0UQ@W|WJ8N{cdc3tUis;916 z_JF_*MsHg-#OJS6Hgy!;njTb*BmaTer2BVq3Y8Zosqtk%{xXv@bEB7nbo#jKQO$OJ zgA$oTvAD1zSO!hr_yeGH!%%7*vZ9GP4)sx{h}s-hvJgl9MicPuB7M)vmymR(5%+r( zg~V{lA3A^-i*Mku*0@c2GeTTmS|15ow5dmgs9Z7edSnJ@6-trg0vYDhi{_oW=m9D5w_aX98Dj(Ue>S52<` z@9Li=d3&`jO@$7(#9JkyOXhz3*!q>-6mRnO6Igka>j9U0r7I#{NzkG6g{@-X!5ERf$Ml7%FPPDbH`yy~*&~%3yxf)zn<(sp+ zf2K$mPGcc^#dFDe{_}%T8)5s{J(mflpk>WhBW+t!0n9kFgW38F~#$y zia(Q+(y@J1I`*|j7}WQCPN)4p_H~!VT)lo$GY+gI+6_U4^|X$Zdi+k3vBO6Qw`Yq- ztrwj*NU@{)=f_$)eA#)r+vLLH`-WbA5GIk4qRxf8m=f(?l@E z^PbleL6`YsqVTgtztC1bIO8|{y{H@E-@CI`oRQ!%ZRKG_K6PLnPEdfB!36B^+L!n- zvlm~M4E5$!0DOub89w_U(wuw?;TJ5rrrthw?|?EE9JzCTnR}#p+j{Z^hKCvi-U3BC z^c}wJaGL#!FeiUf?5tL-v@@1yf}v9b$sG#ro+JN0WZchQZALAV(Og6h2h~DFnFs$D zSmG|V^@dqN*;I)les6kjqq0>A<&RLeZ(TlJARZ=MfN7BSA&-cev!4ydT-2WxFrQ98 z;FCC3C@79F3f=Sighf(G4ZdRmU0a9OLQ+aHdT#ME!DR4Ac-*}wux{AkFW^=V78nuv zQ!7p4@dE`I^L`tQog(J)C2O*4bP;1QTPuwZNN}#M`093zpjQr>E}uW>OUNO$^Q_v- zyXjm&079y)gSRhv1B#w}t_(npObjmy6{1i#}3j?HnhFk*= zY1^=dn%s_krfH<^TrFL4$v$wYD0IALmZuFbExdYTTyQRy3Uk6weG7c#G+ZM>@~@cL zc%tDyf)@cvC~ggZYteb~E34jw^8@CNZ6K~t0QJj6Cm?CnDiK)!zuw+5uBxqj6egrg z=>|olM0N)$pma-!AWAAoNJ+Cm1VkFa4Tw@wf`o!}N{1*Y(jC&NG~R{hoaZ@i?(hBI z_rtw=e^_gcIp!Qa=2&a5J*RiE`V-&&pP5DHY0~gn#tI4c{y8>%Qe*fCUG-K#(!qcS17&ln`kA+Q#09BzJ)IS%8A)TxTA z12!4$C(L)A@R+LM+D{ABa7H?9#_oQaWGt948Lk4B6Qy+#+*fymINs+x`ydGwv+%S& zzd!s*z??7M*X+B|#%PbztJ;UZJ~J6xZ6U+#*N@83wz?V-mZ41vrla@X=00MQvs**u zM57ieZW!NtcF>rotzx9r^iunKxP_bDbqlU$QTe8D2M;dng$uXNQdOz@R<8Rb*`O1f zB9`fy0Rgvi27{dPw|)t;OX7lGOK+~S-0&7^v0GZv3keAexbE@tJKbTK#FidADrf7} zr^ua2rSD!zk&kK=_r-==1-llOAxvdc`Ou7y9;#_!`vGXlO4WoeMnSRYac*}l>E!+x zCq8ZnRqrLzjM-kT`L91b?+V9n-25hPC6dxW0S7*3ifb8i_Ngc{F_srF^^moMa>X^u z&Q90$U4RY5{-9cc@G@tgwMlmg@$yx0%GW+nq-US@v9eTB6&$Yk`BadKIKg9ewMn-p zKq!I4^gvs!?HXjpNjgXf_mgz{{*?K(>T0TMs2;0ueF@z-$20dCRmw~mFwaOiCuMF* zl(qv8%hqP@tzK7mWF#>ReSgsPl|@op!-P47K6%SeL(`FfMGY6l4 z46?q~B^M6wp-V2yDAcnT$T!RW8Y?CzR;Y_EjJZe~vy@)Bo0XCsvoBdg6tZ`(!a`lvSC$;Lku}}I_F8+st4>y`JAC@#9O^^gW8qF+85xK@Z z?uW9wX?Jh%VsfX;Yi+wAgI6+LmjsDiB8=4Q-Pza+?6+hrFvW(q8mz2AKv{FIix zNA)dlDLIh9r1!y$fV9$Bc4R#IQV;J$HIb!PQ9ufbb5qzg z^9ER5d@RZwy9}QN-W{60c%`V+P&Q0{YBytjU*ul(K#ZQi3}+TYw{cjfG1`49EpzdG z(?^bv&);4UW~U;z`6A`@)9AbiQB!>XyUKJYgNNbHz4e6pM4~=~gyXOVY z^8k^X(bH3(M`@R@(@Cv8&L1q_ysSbe!F5qZv;X@5XGRafp5>nFYtGS&)8tCITvmJy z*WO*7EXC!&7I?U4xGVRJvCYa}xn!u=bLfMW46WI14vCOEP0ve9rF2@kxp{r5+c_o2 z3bbaQD@n!~=a;4lE+qeGRA!$}5Cg=HHnT)`EHDI_eLb zJ7vrGt{_SDNTlepNYvmT-QNm@`8u9Em-4AvNWB1BnZAD^7dz|U6ytAwM%61&!>k2n zr+Wn>zd_bp^5#hhL+#q-t&51%FWPUXZhJZUV{>@lJ#?QmeLt@Mm80b-e5+~2;_cvl zIp7^5aMwvUTZ*=816F}i(ci*xfvfpFp-@iojdw2l zdTo7u+$haoboR?ZAJ3-4*;CEQXDy~yW0=0scvWgTk3~E^SIbO#OI?s*=7nR{w!dey za!AYv5_P)>R)yER6Lyi?Uk+2|$v^p!B_2{UdLz^mz6r@aK@cNfNZi9&!Z#rAXozKj zE;_xmcg=3E?>|51+_Efa^hsm&#_4%P>}{VW8;WNurSTUxE)T4?nusr|iS>(2A1xd` z9WRuqZB?5r+92EP5W2I$J;%4(ly3LcHM3>w0uk3T|4UIO>38`xB04Z7sT)ut?HFT8 zwUl4iT}4%=e!h*;cc~E&y-zUSW>Gn-kP1Z03KM>RGihS`5y>@z^O}JEV2;hRqox=tZkS77X#CBDbo{V!i~DZ0i@$ z*b*mb=*kRc+1NN>T2H`f}HlHo0b_)r-?h)7PAz_n>}J>p>^Z>XajfHl%@YGA?5dnha<`l zY$T}aTVpCTB1svq~d1JZNXW3spoatUydRV6@_qt4rT_?KU zNrs!E|I^~4d+`(9&X~tQi#UDpTETR$MZi^X#oth|b-L@m9FZ@zgNttv=3L8Px_X_-$E6d7ChU~0L()1B3=QO*PlC*!{LJaa%nw6VohM2aDjq$E^ra6m7qUY} ze1XC@-zi!|@FyEZyDOO4khH#XB^a`@z|5MWnxP~9*StqZ=g^s^Dq^;F)2y-a61^(w z0VU+7iB-|6KJ3#tK0sw4<@?!s+b2;L`5fmsbVJ6j19E#SgbA19N_Y+vROW+lu6j4z z`G=|VtM^0eHdP5f3F!?8eVwQ^M}B*Kw)|E+T3F4{UJpmb+GqS^(T0g1JyJZKuv|{D z>X`JG~pLNLQRvnYN{|zX(X+!^=U+=Q6UUja| zuQlEMz2UUT!V3h^IJz&a_NOu#+PaE)uDhkiMu7OZ>!eZVnoC;Wc4e1k|IJIm;_5!C^W^IsTKwm~y(O#OOa4U|rKZF9 zpZDfX?Pzc`UaV9&uP9b(T**^b9||ZG21UVjgmX+;amp5Zs)d``v+*sBtL2dmDsG8-CWh3Q1js!Oe zzZBMAU*xV#iriewl4+bWkW6ykc@qrxO`=_0pW+p0asVE&t{X)Vq_}xD^6qd&##7fW zpPulU`1DYU4(YuzV!G2==^a1myBf)e(GaI^0e(1HOw4&sQy+3~V)zI~F=snF$;c^{ zFm!Xomq^HDp%lq&q&(cT(Z#-eCqbORbbw%Dv<`&IbpISHQtyOK`=sjx2$sVd!|Obpe>Sf{+= z!?2TglPMDGMPB~qi9xutlOxaG*I_SgK%DO2IY-l|d7Axk(L=3NQ;Q7$C(&`F>XBf6+#r9tQ9x6biMhg(p6nkG$1c!D(eCjzf@0xsyI^91+H{GAY zI23W(#_W~95U2KC-actcaAaL@rjZ!5o=CU*9V z`rf*E8ba|f;4(N*owX#A7x+|{#LHOFaW)~f9LZRV(2p~_Q$MW z)QHanJm|UHm;%i?)tFL#{qY08k3iJ`I6z~HqYn4BVTwOF!h%u}#;sp$ei6PPmtxr9 zO>Fi_=bR~2Bcck+6Ec0LFym>X;;ZxLY01wJ8HN<9s4)?Kj#WzVi;_j1!*vrUHFZ7C zys|;|NS9iKdrrzPw04%9k+*1CVyzyi z6C+hdO$d}>Jw&k*0ty`cQ3;>UMPcFZ<2SnDYkU^fy)R-P#lQrk2{b)LADTqPo(V;G zIDJhsub3S^7p5@T+;C;>Gw|Xu8!3W+LT};I(`4;ncK!uOw|f?CM{G8qKj!l_MHPOI z%k6R$;tJFb+oW&zC@<-CAvPSRkR6sN^oW=FjmM> zz+5L}T#UXrD^~Ec%92R`90vA`g8mxc0c8LNRyAMfphX#b?i#Nvxgztzc;A^o@i0Cr z*ZW?fa$F(YEDK7UhS_}1;f05oR}z*)85XfA#Jd#Yr&*&gu=lh}75+WSIj@YrlT&j~ z8><+rx;K)1#N`Z<%+6;6U(Rw4WXtpMFKA^trPEHeDsauey22I0$KlE=$*Zjxl=(Qi zFqV^TI7l}}%Ed39mF;Kwbrq&CS_xQRz6cxV6!c+uuNh6XTGc{XS@t-x0yux+C zvez%RZY$oMX~1uv?EHnxqyp!s^oi_PPdWQL@J4fx8|7gPPGjlm-GIE#b4@ty>lu&@ zC;`9wIVV!NpDjtMG#{!d22VZzSdW!c8O}^Gh#EPoU0~*IiVc$L!SF_1(Z(Q<7G?HLA}-okTWkm5`rtUmrnYOxX)`$V9lCMV{!beCi~6 zKv^Icj9sY>vj}jF;-r$Yf89x>5UDD3^xe^PDZr(QlB+rCY?w1&_annP%tHuOydScm zAKkG}TFDm3Ka#B+osm$f0Q}%(B zoEQyDi~R|MzcS!IBj`WY@L02xx?xA%f`!TvhoLid5g_btwJ>-uW_mvTAoWUhy!82q zV5#-nXDKPvSek8weXSbjo;J};NhWXcq)YHgm|FPGwq9xWwIUP@+v(hsWvxx{dI_oM zFu9=r#Af04(jCueAkQz>gUR!qj#xSe2Pkzg$jE*|f-LKLf1O63S`a#^T zST2#*mqQjqOFsB6dc<9=;%garlw?a%)*^pyk^Y{~`J(jLSWAH60gC_}7K#C2K^P;Y zY4=Q8erH%q@0A<`rEy^A`gKp3qI|>aSdHnXbiq+lWn72ztm%M(<5xFZX`-EM@MiCg#6HE-ioJIxq`YwU{0F1F6l<| zBh^JYPn&NDsBF!(C6u4l`>8ejId(bg&IJ*!V1a;W`+i~ZXC<75^;c*(2d;Mq^`M>f zZJ|=CS1q3|816#kuC=H>qx7oA+xB2na-=UsGo?m~2H|BZ#h#bTDJFH zD%3G}@8fS-`<9Ch{Z#L+>6!m(@2fyKHgJa?HE?U#Lt+BIiY}5W-55Oc z{?isF-6&q@`a9FF7+5-oHN~LQeAa}aD2?j`hL4WIkKWbd0Wt%)qnIAH(sNIUk6V^# zh;@Wl#@4)1M3Xx9^BY@C+!;Fh4IAq>>$gPSU>DDt11=(NRuZbtm#S2_!mgORhF?zPw&8IR5X(pWvQQq8+a7@Em0`<_fZuH z8@Yab^4U(-9a)rm$D#QSOeo05#MJbp7qq_ zz@&(Qck=Po`$?u-<&$$|^qwXOGb$CggN!NSL{ht%WIE!irsLY9OBRV@xMC6c8l{=gt=)6I-iGa!I=knbz30C=!#Y@iwo2G^sD91eWHIonHr6d; zotjd+Ixem;P{@6|XJ?4#FvuoZV)tI-| zHO3qHG`nVTVtsR=>YJ8At2bss)z|rdPPS(5I<-}zrd3~iEBn;+gM4n}>(#u%)@)4* zc5Uz*Z`iYM@Ph#9TRj(VHRz10$B9`-h?URb3~L^#j;hPoOt<5P=TsACRIj&J=4|k5 zt^-#+U2nde?ciUXJ$uV(Ms;PAU-OvaY&%Y}iDmu;bo!VZd+zl>Iy%P(-Vd@Dan>~# zXGU>sRG z`2~49#);*3;I?Ih5)C%&k=c?Ss3`!aA;Xo~?V4T-w&##lrUHc=nRE}PR7T&B#sx1~ z9rO%DHXO9sA9v4D1e=RFG9&+Po}&;rNPBT8sFu8}P<`AU47Qhn-QE7`t|)NlclWJ% z`>N@YiFNzz77(Ed9KdZ#XY|cnrRj<{!a!n9%yiG&;F5=%dkx3JuKoAq)u8#!o1l?@ zc%!#Ix)t0SH;vj~H9W{A^~|XIX{WJ&gp*8TMFWdBaxa&L$6CJ9w;1dzkI1{#*ZgDP zy;$*7MbD00`<}ssPV^$x>!H>?^|HK5K?lCvV3$KLuLSv{50Ns5BV#;t5rbMIQSZaH zn6U2sDKhgAnL5CGf2w=zu$OM^XeVoR^YAt@(WC{C=&&L-+g^?;C*1o8#%*bfs_paf z_dw00UBzNsdWGPdJ60nK73~GZ)zPn(za)LLzV15vV?cjy_J=??yVHv+H03YvC%!Nk z^A$Xl6FD57W0+DE?Plty@}pnU+4m9epa1H+?uxo*@^V+#$6Jdls6{?mx033+PU#3U z@HK7Y*~jVyy8P(;doB-rkBDMY@8x|IbG^B#B;Bs%dfh2p|EtGGWX@coCjZWT-*qB! z#rzzkn@j2{J6ip^p<{UNBUk4<=r`9c#Jw#d_P5P?ePv{QW!8QDG53V;4RhYR_!C!? z&dLfr&HJ2xFVoQ3qgi~sKASxbDi+Hn9vVVSP&oy5$J^95n>B&PlB|7n`eFu+3YO0n8H|S zjNc-sGg^7p#Z4rkAWV$H@PE^Gy&Efzt9!-DNR|$cVn6fGg>z@y zNMAi}=oKp)P#HIbaK5Bzd6fg!BJ8~6k41GQ6~;!rfwf#n=%vX;fP~Wxp)?6kg`Ind zoqG_@4LWifaoC)eqy%lbDiYe-quk(Y%jYw>B#OB!k+E+)Y<%QILX3WVqkQo`t8_Wn za^YF*jRWLsWWlrA7oXo9jXVZiOHr-dYKjnm>K!d0m8rQaEw#LbT^t#Zs_NV~wSg+~ZZamJ%t&#O)F(%;eRpbKLL+`c}Hj zFKFBq^@er$C0@IbSsb_9bPRd9OgehtE`!{VrtAkkk$7!E_DX_xh_FOPs>jQF!aB9@ zueO%J8`t=cc||4zN9O|@HNAF$6!IOS{>0snNA6PMM?}vRRSsYF7=%8EJaplde0}O! z++KcIg|k9}mamxa2#R7z^S z(>}<3ag}q)MoQidmw)qOhubEO?2Y)BL5j6h{Y4wDrW-zv>RiN8fvyU5yW4N?jZ*5!e3T(T|Zf8aN zD(bOc zE+y^xe9&;M@KTP7(d&%}VK*KNXOG(bhMsGqw}^MSwE78=&!0U(p$SF`V#l8Q*k+jTQsf^e3{tvAOX6`i8ZkJ67JgFy;dT)tsR)%&f ztZ2TNP%T#j{S>c_VrhSUvGk!`J$&)jseAteWMjU(S1gEIig(-k`+a!w=sU=bX9&gYatpF(F2Jmz}f0I63f;NW!bR z1XOnH$Cr+xBIb|ICE1Uvc6G0 zjw)I~n#Ccb9w*(5{m9zQ!|qk%#Z zVhYwy&Mx3P8c^KlJk|d`oURu{y=@s?iTveF2Y02;V)-GgILq$nR(1~TP{i~oFNnLVsh5yaa5Zu6wZ&I zvY~_ukm-|kevST07^>OrEnb9Be2|wdP1q|vKij(CXa0EB&(+x?G=JxGrvTT`Z0qPP zz;^J~46o5r!4r|eTR9TyRoAv3Us)^|4(~bC8Hwx();5ot9xV~hN3`S!DLnuZ_SM__ zI3#Y*k7m+ZsYumf7xYgTRQGj8bHvd+>`cvFG-HUO*IQ(SRC^&Rc;${ZxNL^j4ALESy4;Q z7pV>}2!7f$v}0?OrN5D3TQXJl?Z#rnR)mqWj2jBGE1|WxG?pZl^MkIpjccQCOngc% z`PT3gpmxFTP-LD*-)*r^=F~fT?Tm0bK-9i#?*^vGyk&nf^utuqX(M+hch4OZx9`sK z+|i!rZ9`}e6QB2rVnV3#86MdFE&JL} z!lH&V{JC!}GF0{7Tj=5P24nQRqqtVlM&^pf>59fvipG3O#^y@K=}N{^t;X*=XqO$^ zRG#Ja#ORp-Z-rI$D=aKk^=3TwIRP>derSf=qN zuIf zZ+V%@rsNJe=;fmdRTp1YzzF3Q@9ho^b-IN6ji58h{XJHb*kh1YxM4G zZ_clc-)tMNuZ^h>2<8tU9;5VLG>EQDTAe53X3F5%(H*~5OEARmPRe~COv)`OLdp$z zi!e#L8;sw~0ek7x2WXN=GaaM(M^b9KJpaW2ukeBHPR`o3iL3_Az+}ol0e0hOwqr4wjZppw zAxE_k^Y?bGj~OlGtSn@Od!m>qxDOCJ)@!}vS@oI$$)qwgzU(IejvvQ!>VazkS)`gY zFWDuL?lx;*{=e}5J%EBSVlwRvi93dYC>{ z;5NnuQ0e*oYF@Y3aBKOHezf_cD-?XRF>VJ)9(uZadi%NoJ3rljOuAPtj#w@HD)aF1 zarWL@cpdpxW@jjz&v@i!vi%O=<#xC#V$fU*ytD`Q)?N1I*S^m04xy#9*Qasd{@EkG zPKQSeyUX*VziMkY#=L&jR@8X}NU$uF8UI#XIzA`ZI7?eCS&RZ4UGXrQ%37XLADeO9BTQfp}D{zqD z8wzKfv&GxvNyI#b_kcXH+yhC9uI$ag_xWoHl>8JwtS=$viIhyr_|f^E{v zuwTU6pUc~&*J1TN#T;po5$EQ#EMu|36)fT)ZU%@OD<1q>dfFp~)3Q5N-vB!XmesA2 z4dvpRdeT`Q_bCl$6PmNok)rt<#XD+qsSRJtyZ2ws>8~sdzwtS8mVe;7620=IoF+(; z@69$U;Pp0Y%9M?NNGdimahW^ZhZSBJvA4`krAX*TcPIT}rDCymgAdD>m6^1q`G+iz zs*Uak7AjIzQ+gGRGb&fLz#F(l$`pZqRT3Twugq~l|G);_M^akxk(cG_9f%H3%~3Qm zND8W%+)pn=Q+P$yiPo1knDDu)@M@dUDKDL+SUE3uEwLPXq`D(EQG0$feOl`HG$UbX zllxc32+%Ee>y?a%{|u4Y>h!iPbD`V7#by?(cf&RWMcxa1QFh>V zyY~YoRJhEgNa;#V;w^uRZMsV%nd_Db5VR|6az@jgZ*K2Cd*rKWF73A$essRGazx<4 z8!cVQo1}oV{5C9Xb`WySE?<}sn0u~OL-Gb*(0q4vUor~kyh`ysP+1(8QMn#$wR8ua z+q+YsJXPMD(c6^tQevE9!5jpS$IER zw`;a5?>rT-?S7sid_zs29O98FggM)NYUZX&!+t{8X7mF*yob#rI2#D$D*D<$H6@@7lAqH1%1k>Uj-r;NPox-+%}{dF-CYh&ylCl?jQUfA2F2M`Hh66({g%hkXF# z^wn+eK-~Pf22@n=qbMTl^UOZk#XOgn&R!KJWqUimde3Xa=CzLM?XI2S4hZ|cVNI8w z)ahS(rD=Ztx+O8}dq1;DqNF%&W*k*4M1!tPkERJpbfYKDmdNfp>6MspGW_b|{29RA zW()8QNlCgNg+5EU=gRvoG7sYDxKtr__cF~RPi49Dy3OBnmR@#{K3=uhG)~;~WSvuR z<{xdLC3k~x~f80p-Z-AW}`1R`NA-SOl9;%vhKc$_p`yz{;5JUUp{9Y1Xd(w z(x$WZYN-n?>u&D-1`Go_R?f^P9j1g80Pq`a)Huz4bBlcoNNKR zKq=@!B!syALhy7ihO-cki|6E^!<9F4a^fy?b5H`3l480Z_btV)>sVTeU9?W_6j)Mbucl7&hc4d1j2VN)^@z=!_BS|b0CX0d~Q7E{atSkm`1uGAS zBakrg0)oK872wkUBL>c-g_9S+-=+!KZ|(i%D_hWn$J?mzsLK~Dl;nt5DNgg+5>kY= zYsg(T^V7Pl|5?B3ZifD_7URGb$Q46fEkbQ2yQYlyH!5XA`)qRGG~K+B*C+gjL-^cB z$?a%5V$;NkL3v=S0(|C7di*4Kckf%E{45C0d1v;NuTczPy1R87Wge^%G21w zJi0ElA8zDM2wj7))gX%K)UuebmGv-Yd|(mjY6w4>pIqoa>m*8s!Tm=Z|{A1UZa`VKCu=yKgPw4AQtv(!A3o& zp8Sz_1F#~MF$>a7fLqn&T7BnqAJP?jX64dS+(bmyLZJ&BTgS zs|_bO|3DI)B_e)Lc6K<|e;;Y=kXdb!sfmVjL&BF-__`llsDwG!CNwp7nPuInHJj}` z_1@gRv(x<5Y&VMPS$v@6_Eoxs&HcnC<0@XNexQhoZ6cGR?t`7Dr2hrI#Gref#X4{) z=yvq09~|nc0oZbJS*Lc=r{e9!>zA{p?NGa7iDs)V3pTa%Iik6pD4C+-*K=KKI{j4L z31k};bE zb59^K~jK^w^ozH4qO-hRMUBfO)?v;C0(UrgPP2ys2i61DZ*r44{ zYL!?hYLl2%j(E05{^Xh0qjaOgiYso+3Fgv3eOe3Ih1TS)mkI3)Wjt4oLSjyFEj~!t z3#Dgd+@mr2)D>BgGJNf{(QIn?o3$&=_8VJ`_8o|ILgoAWHA?4wlV6pdV@M^nF_lYd zOK9D1G&PCqE9YH!r(%T+)T7LGzMj#b{)zN0FL4hq7wjy{psZ1A5NB(! zByg9GiwV7R?7!#v~HH2{jBy^M~uKH0HNC)gH2w_rlNEmxsbDNMU+DTIu}B+UH9NpknBLcuv%+%Uc<$a7Gdi4 z!@P#7B@1vNewJLwl}f`vM+pkA30Zf7pZ7Z;cj)RhCj<)VZcLcEQ~&(XJ$}ZW(U(vr zxMhOEo&KeN)&y>i@qp5ot~T)22ZwRD`{ck80oge3!I>j!;NhJKtUI^K!`eEkwQ~nd zM}$ByZo*-WvWl>v-qfARB$#gvRYl=YFR|u;q5Sm-sIOeRwL@1$w)%l=4Zx7{G$^jg z>~Km4Mouv7P;1oT?sL}o6^!58A=O|5H#N7Q(BY+s@ec~s0Ke{`#-VAy&w&4)27$m> z5O^7Ew)wmHzpej2&P24gb|jJ>JthYS{A(!V(9X~xaL_^!^65zs2rUG!k6VFbO8+#c zJdSz%=<(ghHy*1!mVSKhG3nzelcdc_3l_x+Ok>l$XoQ`kNoc?g&aTN}rr;t>>eZB{ zauHf{$DSus1`{Q-T1;P=ud+33{2kiaz!qnZrA3_}rJ#l3YI3kae?=<0ru( zLk8mn!vq78@sJ_pe>iKSpI~4E@$5jndPXE88zT?`9{$fd|DO_>=oRSno=jhQ*)`^) zL6fZZL9u7e5aCU(9*Bw}osS|+h$68&%P}ZRJ1yt+9U$;H9q9d?oaA(XM&T*SRPraO z@Yu^jF8=wSXfy&~7_JI=?3SNus=(Gm%I`EjDPp>EGT-TlZ}U<=6lSHC=bg3{)RkwT z4w!%tDKsS9XHKF?zl{jd=`VZ)Gw&e78fP5{cuYTT8h_ zN?-qejLPEfWNAf12>~kxIC%K$1H~e7*Sk4Q0W1W~`y0e-|4$EPLt$Vi@X$!qF%0^`263_% zsAPPx;4s7q9mA2x6Jo(pC!7_EfSi;H0fisa_`?aH2*gPd5J=<+9V1XDyc&wYK=B<2 ziol*^8VN!F%On4G0wfIlCoY~L(O`U>fMKC0^bUr{34>#haQrZWVo)dThyk!CT^9?7 zogjimAWxVCi$>wA9|i&46pv{bxTZY5>0l5f`Zv>{{Qq%X7zBMn3otM~@YN3klNr8d zU{ElP;u8j6&p!#n{?Yfh{$U^$e2HN&1pI__FeDmZt)Oft3B$nKRD5P&SQNenVQ~1d z{D0aVOm-)12ZN(emOa` z5IBI3h(SY7Xe53_KvCfIjyE0@1umV6CkR-DV9|e@4*19Wp&$s27djve zi_bM^4=|wq^cffmWEzhM2t(uh0t|%(v(z7b0SFugdMlod!O0biKOh_hY8p>E1R92f z;Uymg8Ue-k4-f_t`GYV7gu$Um-~LvB28zUUI0zaE$NaZ1@K^bb26F|z_oGn|aFO&s2gD#xCL|Ds#ZSSY)e-ph z7YG9%2I7qeput%TPyHBB5-6Uk!BP+d!|M!s8#u%KIUp8;fg|y>fW<YoV-3I{XmKN;>H;g0_)hc_LA^Ed#O z$@l}J!Fmm!88BtyO9#iIA$ai)CLSybUo!{<1c|_75P^cCemmi@{{P_+0cJw%pYaYw zg2f|V?gwEg$iEBuV+|sqC$b}m1%~H8iRQ071HwS9{)-unuG z|3dr=4~w7Eq2M%$_-{>!Q|spBD$N+>+!4cB(s3~W82rKk?0^Ny;SoEon(-L`i!Ah? zsTlNjFc<&n-N!Ht5>IPrFc<&6Km50Pk5e|@ybKb+An&2Tc0Gon@XP?h(D+&a%LXidsA14BkrVNE zT!-M@+k-&`))EjL?-?#m01p4Z{G*2SP2RtLVl#De`Rf@8NFVePBn>4$|5aS&8LqSc rPnZzXa Date: Sun, 1 Feb 2015 22:35:12 -0700 Subject: [PATCH 012/112] 20.003.032: Menus rearranged, X-Axis in KM inital coding --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 16 +- .../PitsideConsole/DlgSetSplits.cpp | 24 --- PitsideConsole/PitsideConsole/LapData.cpp | 53 +++-- PitsideConsole/PitsideConsole/LapData.h | 184 +++++++++++++++++- .../PitsideConsole/PitsideConsole.cpp | 33 +++- .../PitsideConsole/PitsideConsole.rc | 27 +-- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1905274 -> 1905635 bytes PitsideConsole/PitsideConsole/resource.h | 2 + PitsideConsole/PitsideConsole/settings.txt | 4 +- WifiLapperLite/.classpath | 9 - WifiLapperLite/.gitignore | 2 - WifiLapperLite/.project | 33 ---- .../.settings/org.eclipse.jdt.core.prefs | 4 - WifiLapperLite/AndroidManifest.xml | 100 ---------- WifiLapperLite/project.properties | 14 -- 15 files changed, 277 insertions(+), 228 deletions(-) delete mode 100644 WifiLapperLite/.classpath delete mode 100644 WifiLapperLite/.gitignore delete mode 100644 WifiLapperLite/.project delete mode 100644 WifiLapperLite/.settings/org.eclipse.jdt.core.prefs delete mode 100644 WifiLapperLite/AndroidManifest.xml delete mode 100644 WifiLapperLite/project.properties diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index 2b8cabc..87fb7e6 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -41,6 +41,7 @@ struct PITSIDE_SETTINGS iMapLines = 1; iColorScheme = 0; bSmoothYesNo = false; + bXAxis_KM = false; } int fRunHTTP; @@ -49,6 +50,7 @@ struct PITSIDE_SETTINGS int iMapLines; int iColorScheme; bool bSmoothYesNo; + bool bXAxis_KM; }; struct TRANSFORMATION @@ -68,7 +70,16 @@ struct TRANSFORMATION float f_CoeffC; bool b_LoadTrans; }; - +/* +enum UNIT_PREFERENCE +{ + UNIT_PREFERENCE_KMH, + UNIT_PREFERENCE_MPH, + UNIT_PREFERENCE_MS, + + UNIT_PREFERENCE_COUNT, +}; +*/ enum LAPSORTSTYLE { SORTSTYLE_BYTIMEOFRACE, // sort by the time the lap was done: 2:31pm comes before 4:45pm (well... on the same day) @@ -78,10 +89,11 @@ enum LAPSORTSTYLE struct LAPSUPPLIEROPTIONS { public: - LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false) + LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false) { } UNIT_PREFERENCE eUnitPreference; + bool bXAxis_KM; bool fDrawSplitPoints; bool fDrawGuides; bool fDrawLines; // whether to draw lines between data points diff --git a/PitsideConsole/PitsideConsole/DlgSetSplits.cpp b/PitsideConsole/PitsideConsole/DlgSetSplits.cpp index 51c8768..c5985e8 100644 --- a/PitsideConsole/PitsideConsole/DlgSetSplits.cpp +++ b/PitsideConsole/PitsideConsole/DlgSetSplits.cpp @@ -6,7 +6,6 @@ #include "ArtTools.h" // for FLOATRECT #include "ArtUI.h" // for ArtOpenGLWindow - LRESULT CSetSplitsDlg::DlgProc ( HWND hWnd, @@ -42,10 +41,8 @@ LRESULT CSetSplitsDlg::DlgProc { return 0; } - switch(uMsg) { - case WM_INITDIALOG: { // Get the Start time for the lap and store it @@ -60,7 +57,6 @@ LRESULT CSetSplitsDlg::DlgProc pSF[x].m_pt1 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); pSF[x].m_pt2 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); } - x = FINISH; { const TimePoint2D& p = lstPoints[lstPoints.size()-1]; @@ -70,15 +66,11 @@ LRESULT CSetSplitsDlg::DlgProc pSF[x].m_pt1 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); pSF[x].m_pt2 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); } - // Show the split points m_sfLapOpts->fDrawSplitPoints = true; - // The the OGL handle p_sfRefLapPainter.Init(hWnd_OGL); - p_sfRefLapPainter.DrawLapLines(*m_sfLapOpts); // draws laps as a map - return TRUE; } /* case WM_MOUSEMOVE: @@ -163,72 +155,56 @@ LRESULT CSetSplitsDlg::DlgProc { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT1, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT2: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT2, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT3: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT3, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT4: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT4, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT5: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT5, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT6: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT6, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT7: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT7, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT8: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT8, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDOK: diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 4ba3ded..002f176 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "LapData.h" #include "PitsideConsole.h" +#include "dlgPlotSelect.h" struct PIDDATA @@ -289,6 +290,19 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) } } +bool bXAxisUnits(XAXIS_PREFERENCE xConvertTo) +{ + + switch(xConvertTo) + { + case XAXIS_PREFERENCE_LAT: return false; + case XAXIS_PREFERENCE_KM: return true; + } + CASSERT(UNIT_PREFERENCE_COUNT == 3); + + return false; +} + float ConvertSpeed(UNIT_PREFERENCE eConvertTo, float flValueInMetersPerSecond) { @@ -861,21 +875,12 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pLapTime->AddPoint(p.iTime, (double)iElapsedTime); const double dX = p.flX - ptLast.flX; const double dY = p.flY - ptLast.flY; -/* // Converting from LONG/LAT to distance in meters - double rad = 6371.0f; // earth's mean radius in km - double dLat, dLon, R, lat1, lat2, lon1, lon2; - R = rad; - lat1 = p.flY * 0.0174532925199433; // Convert from degrees to radians - lon1 = p.flX * 0.0174532925199433; - lat2 = ptLast.flY * 0.0174532925199433; - lon2 = ptLast.flX * 0.0174532925199433; - dLat = (lat2 - lat1); - dLon = (lon2 - lon1); - double a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2); - double c = 2 * atan2(sqrt(a), sqrt(1-a)); - const double d = R * c * 1000; // Return the distance in meters */ - const double d = sqrt (dY*dY + dX*dX); // Return distance in Theta of Long/Lat. Needed until Jason fixes web-side GUI - dDistance += d; + double d; +// if ( p_sfLapOpts ) +// d = fReturnDistanceInMeters (p, ptLast); // Return the distance in meters +// else + d = sqrt (dY*dY + dX*dX); // Return distance in Theta of Long/Lat. Needed until Jason fixes web-side GUI + dDistance += d; m_lstPoints.push_back(TimePoint2D(p)); ptLast = p; @@ -915,6 +920,24 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende } } +const double fReturnDistanceInMeters (const TimePoint2D& p, TimePoint2D ptLast) +{ + // Converting from LONG/LAT to distance in meters + double rad = 6371.0f; // earth's mean radius in km + double dLat, dLon, R, lat1, lat2, lon1, lon2; + R = rad; + lat1 = p.flY * 0.0174532925199433; // Convert from degrees to radians + lon1 = p.flX * 0.0174532925199433; + lat2 = ptLast.flY * 0.0174532925199433; + lon2 = ptLast.flX * 0.0174532925199433; + dLat = (lat2 - lat1); + dLon = (lon2 - lon1); + double a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2); + double c = 2 * atan2(sqrt(a), sqrt(1-a)); + const double d = R * c * 1000; // Return the distance in meters + return d; +} + const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs) { int ixLow = 0; diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 0ae3d7a..00321b5 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -2,6 +2,10 @@ #include #include "LapReceiver.h" #include "ArtTools.h" // for FormatTimeMinutesSecondsMs +//#include "DlgPlotSelect.h" +//#include "resource.h" +//#include "LapPainter.h" +//#include "PitsideConsole.h" using namespace std; enum DATA_CHANNEL @@ -9,13 +13,8 @@ enum DATA_CHANNEL DATA_CHANNEL_START = 0, DATA_CHANNEL_X = DATA_CHANNEL_START, DATA_CHANNEL_Y = 1, - DATA_CHANNEL_PLOTTABLE_START = 2, - DATA_CHANNEL_DISTANCE = DATA_CHANNEL_PLOTTABLE_START, - DATA_CHANNEL_TIME = 11, - DATA_CHANNEL_ELAPSEDTIME = 12, - DATA_CHANNEL_LAPTIME_SUMMARY = 13, DATA_CHANNEL_VELOCITY = 3, DATA_CHANNEL_TIMESLIP = 4, DATA_CHANNEL_X_ACCEL = 5, @@ -24,17 +23,26 @@ enum DATA_CHANNEL DATA_CHANNEL_RECEPTION_X = 8, DATA_CHANNEL_RECEPTION_Y = 9, DATA_CHANNEL_Z_ACCEL = 10, + DATA_CHANNEL_TIME = 11, + DATA_CHANNEL_ELAPSEDTIME = 12, + DATA_CHANNEL_LAPTIME_SUMMARY = 13, DATA_CHANNEL_PID_START = 0x100, DATA_CHANNEL_PID_END = 0x200, - DATA_CHANNEL_IOIOPIN_START = 0x200, + DATA_CHANNEL_IOIOPIN_START = 0x201, DATA_CHANNEL_IOIOPIN_END = 0x300, DATA_CHANNEL_IOIOCUSTOM_START = 0x301, DATA_CHANNEL_IOIOCUSTOM_END = 0x400, DATA_CHANNEL_COUNT, }; +enum XAXIS_PREFERENCE +{ + XAXIS_PREFERENCE_LAT, + XAXIS_PREFERENCE_KM, +}; + enum UNIT_PREFERENCE { UNIT_PREFERENCE_KMH, @@ -42,12 +50,15 @@ enum UNIT_PREFERENCE UNIT_PREFERENCE_MS, UNIT_PREFERENCE_COUNT, -}; +}; + void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch); float ConvertSpeed(UNIT_PREFERENCE eConvertTo, float flVelocityInMetersPerSecond); +bool bXAxisUnits(XAXIS_PREFERENCE xConvertTo); LPCSTR GetUnitText(UNIT_PREFERENCE eUnits); void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch); void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch); +const double fReturnDistanceInMeters (const TimePoint2D& p, TimePoint2D ptLast); bool FindClosestTwoPoints(const TimePoint2D& p, double dInputPercentage, const vector& lstPoints, TimePoint2D* pt1, TimePoint2D* pt2); @@ -194,9 +205,168 @@ class CExtendedLap SYSTEMTIME m_tmStart; // when was this thing started on-track? public: vector m_lstPoints; // Made public by KDJ + private: bool m_fComputeTimeSlip; // time-slip is the most expensive data channel, so let's allow the caller to choose not to compute it mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated }; const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs); + +/////////////////////////////////////////////////////////////////////// +// Added for LapOpts settings +/////////////////////////////////////////////////////////////////////// +/* +struct SETXAXISDLG_RESULT +{ +public: + SETXAXISDLG_RESULT() + { + fCancelled = true; + } + bool fCancelled; +}; + +class CXAxisDlg : public IUI, public ILapSupplier +{ +public: + CXAxisDlg(ILapReceiver* pLapDB, CExtendedLap* pLap, SETXAXISDLG_RESULT* pResults, int iRaceId, LAPSUPPLIEROPTIONS* i_sfLapOpts) : m_pLap(pLap), m_pResults(pResults), m_iRaceId(iRaceId), m_sfLapOpts(i_sfLapOpts) + { + m_pLapDB = pLapDB; + m_pLap = pLap; + }; + + virtual void NotifyChange(WPARAM wParam, LPARAM lParam) {DASSERT(FALSE);}; + virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual DWORD GetDlgId() const {return NULL;} + + // <-- returns which laps you want painted + virtual vector GetLapsToShow() const + { + vector lstLaps; + lstLaps.push_back(m_pLap); + return lstLaps; + } + // <-- returns all the laps + virtual vector GetAllLaps() const + { + vector lstLaps; + lstLaps.push_back(m_pLap); + return lstLaps; + } + // <-- returns how you want the laps shown: this can be a map or a data plot + virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const + { + return LAPDISPLAYSTYLE_MAP; + } + // <-- returns what data channel you want to use for the x-axis + virtual DATA_CHANNEL GetXChannel() const + { + return DATA_CHANNEL_X; + } + // <-- returns what data channels you want to use for the y-axes (can be 1 or more) + virtual vector GetYChannels() const + { + return m_lstYChannels; + } + // <-- returns the actual data channel object for a given lap. + virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const + { + return m_pLapDB->GetDataChannel(iLapId, eChannel); + } + // <-- returns the x and y bounds for all the laps + virtual FLOATRECT GetAllLapsBounds() const + { + FLOATRECT rc; + rc.left = 1e30; + rc.top = -1e30; + rc.bottom = 1e30; + rc.right = -1e30; + + // changed this so it returns the bounds of the reference lap. This way, data-viewing isn't ruined by errant points + // it used to be based on all the laps, but if you had just one messed-up lap it would make viewing pointless + if(m_pLap != NULL) + { + const vector& lstPoints = m_pLap->GetPoints(); + for(int x = 0; x< lstPoints.size(); x++) + { + const TimePoint2D& p = lstPoints[x]; + rc.left = min(rc.left,p.flX); + rc.top = max(rc.top,p.flY); + rc.bottom = min(rc.bottom,p.flY); + rc.right = max(rc.right,p.flX); + } + } + return rc; + } + + // guide-parameter functions - these configure the background horizontal/vertical lines + // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw + virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw + virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) + virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) + virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the absolute lowest value we want to display for a given data channel type + virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const + { + return 0.0f; + } + // <-- returns the absolute highest value we want to display for a given data channel type + virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const + { + return 0.0f; + } + + // highlighting functions + // <-- only call if you are a HighlightSource. Sets the time in milliseconds that should be highlighted. + virtual void SetLapHighlightTime(const CExtendedLap* m_pLap, int iTimeMs) + { + m_mapLapHighlightTimes[m_pLap] = iTimeMs; + } + // <-- gets the time in milliseconds that should be highlighted. + virtual int GetLapHighlightTime(const CExtendedLap* m_pLap) const + { + DASSERT(m_mapLapHighlightTimes.find(m_pLap) != m_mapLapHighlightTimes.end()); // this should have always ended up set from the "master" highlighter. This function is only called by "slave" highlight-users + return m_mapLapHighlightTimes.find(m_pLap)->second; + } + // returns whether the caller should be a lap highlighter (calling SetLapHighlightTime) or a lap highlight-receiver (calling GetLapHighlightTime) + virtual bool IsHighlightSource(int iSupplierId) const + { + return true; // Allow the Set Split Sectors to be highlight source + } + // <-- gets more display options. + virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const + { + return *m_sfLapOpts; + } +private: +// void GetSplitPoint(int x, SplitPoints szTempSplit, HWND hWnd); +// void ComputeSectors(); + SETXAXISDLG_RESULT* m_pResults; + int m_iRaceId; + ILapReceiver* m_pLapDB; + LAPSUPPLIEROPTIONS* m_sfLapOpts; + CExtendedLap* m_pLap; + ILapSupplier* m_sfSectorDisplay; + vector m_lstYChannels; + map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls + int m_iSupplierId; +// CLapPainter p_sfRefLapPainter; + +}; +*/ \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 4f38a2b..0414689 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -747,6 +747,20 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) UpdateUI(UPDATE_MAP | UPDATE_MENU); return TRUE; } + case ID_OPTIONS_XAXIS_KM: + { + m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_KM; + bXAxisUnits ( XAXIS_PREFERENCE_KM ); + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_XAXIS_LAT: + { + m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_LAT; + bXAxisUnits ( XAXIS_PREFERENCE_LAT ); + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } case ID_OPTIONS_SHOWBESTS: { m_fShowBests = !m_fShowBests; @@ -2236,6 +2250,8 @@ void UpdateValues() CheckMenuHelper(hSubMenu, ID_OPTIONS_KMH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_KMH); CheckMenuHelper(hSubMenu, ID_OPTIONS_MPH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MPH); CheckMenuHelper(hSubMenu, ID_OPTIONS_MS, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MS); + CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_KM, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_KM); + CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_LAT, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_LAT); CheckMenuHelper(hSubMenu, ID_OPTIONS_TRACTIONCIRCLE, m_sfLapOpts.bTractionCircle); CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWBESTS, m_fShowBests); CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWDRIVERBESTS, m_fShowDriverBests); @@ -2599,9 +2615,10 @@ void UpdateValues() if(flSpread < 0.050) return 0.0050f; if(flSpread < 1.000) return 0.1000f; if(flSpread < 10.00) return 1.0000f; - if(flSpread < 1000) return 50.0f; - if(flSpread < 5000) return 100.0f; - if(flSpread < 10000) return 500.0f; + if(flSpread < 500) return 50.0f; + if(flSpread < 1000) return 100.0f; + if(flSpread < 5000) return 500.0f; + if(flSpread < 10000) return 1000.0f; if(flSpread < 50000) return 2500.0f; if(flSpread < 110000) return 5000.0f; if(flSpread < 1100000) return 10000.0f; @@ -2884,6 +2901,7 @@ void LoadPitsideSettings(PITSIDE_SETTINGS* pSettings) in>>pSettings->iMapLines; in>>pSettings->iColorScheme; in>>pSettings->bSmoothYesNo; + in>>pSettings->bXAxis_KM; in.close(); } } @@ -3080,9 +3098,14 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.bSmoothYesNo = sfSettings.bSmoothYesNo; // Assign smoothing setting from Settings.txt file break; } - default: + } + switch (sfSettings.bXAxis_KM) + { + case 0: + case 1: { - x_sfLapOpts.bSmoothYesNo = false; // Grey background as a default, true = black + x_sfLapOpts.bXAxis_KM = sfSettings.bXAxis_KM; // Assign choice of LAT or KM for X-Axis setting from Settings.txt file + break; } } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 3722ff3..5ce8624 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -11,6 +11,7 @@ CAPTION "Pitside" FONT 8, "MS Shell Dlg" MENU IDM_OPTIONS BEGIN +// CONTROL "", IDC_LAPS, WC_LISTVIEWEX, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 LTEXT "",IDC_DISPLAY,155,63,590,282 // LTEXT "",IDC_SUBDISPLAY,520,0,150,63 @@ -190,7 +191,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0031\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0032\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END @@ -441,13 +442,22 @@ IDM_OPTIONS MENU BEGIN POPUP "&File" BEGIN - MENUITEM "Save Image", IDM_SAVE_BM + MENUITEM "Open .wflp DB", ID_DATA_OPENDB + MENUITEM "Switch Race Session", ID_DATA_SWITCHSESSION + MENUITEM "Edit/Merge Race Sessions", ID_DATA_EDITSESSION + MENUITEM SEPARATOR MENUITEM "Print...", IDM_PRINT_BM + MENUITEM SEPARATOR + MENUITEM "Export selected laps to CSV format", ID_DATA_DASHWARE + MENUITEM SEPARATOR MENUITEM "Exit", ID_FILE_EXIT END POPUP "&Edit" BEGIN MENUITEM "Copy", ID_EDIT_COPY + MENUITEM "Save Image", IDM_SAVE_BM + MENUITEM SEPARATOR + MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS END POPUP "&Options" BEGIN @@ -455,6 +465,9 @@ POPUP "&Options" MENUITEM "MPH", ID_OPTIONS_MPH MENUITEM "m/s", ID_OPTIONS_MS MENUITEM SEPARATOR + MENUITEM "X-Axis in KM", ID_OPTIONS_XAXIS_KM + MENUITEM "X-Axis in LAT", ID_OPTIONS_XAXIS_LAT + MENUITEM SEPARATOR MENUITEM "Set Split Points", ID_OPTIONS_SETSPLITS MENUITEM SEPARATOR MENUITEM "Show Traction Circle", ID_OPTIONS_TRACTIONCIRCLE @@ -468,17 +481,7 @@ POPUP "&Options" MENUITEM "Use dark background for plots",ID_OPTIONS_BACKGROUND MENUITEM SEPARATOR MENUITEM "Force plotted data to fixed scales",ID_OPTIONS_IOIO5VSCALE - MENUITEM SEPARATOR - MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS - - END - POPUP "&Data" - BEGIN - MENUITEM "Switch Race Session", ID_DATA_SWITCHSESSION - MENUITEM "Open .wflp DB", ID_DATA_OPENDB - MENUITEM "Edit/Merge Race Sessions", ID_DATA_EDITSESSION - MENUITEM "Export selected laps to CSV format", ID_DATA_DASHWARE END POPUP "&Timing" BEGIN diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index 48b0ec7e9d59fdacd3555ba5d6f193e2f8cc38b2..50b8c6e4db15306ebdfc03b40431fe71abd270c8 100644 GIT binary patch delta 63948 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 JE+}d#{V(~uiogH> delta 63550 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 - - - - - - - - diff --git a/WifiLapperLite/.gitignore b/WifiLapperLite/.gitignore deleted file mode 100644 index 1ec69fa..0000000 --- a/WifiLapperLite/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/ -gen/ \ No newline at end of file diff --git a/WifiLapperLite/.project b/WifiLapperLite/.project deleted file mode 100644 index 26d1ec1..0000000 --- a/WifiLapperLite/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - WifilapperLite - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs b/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f77b31c..0000000 --- a/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/WifiLapperLite/AndroidManifest.xml b/WifiLapperLite/AndroidManifest.xml deleted file mode 100644 index 712d176..0000000 --- a/WifiLapperLite/AndroidManifest.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WifiLapperLite/project.properties b/WifiLapperLite/project.properties deleted file mode 100644 index e216117..0000000 --- a/WifiLapperLite/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-8 -android.library.reference.1=..\\IOIOLib -android.library=false -android.library.reference.2=../TestApp From 70c03e7b7b52a0db7109c634ea759c1471c7d603 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 2 Feb 2015 17:40:02 -0700 Subject: [PATCH 013/112] 20.003.032: Menus rearranged, X-Axis in KM inital coding 1) Initial coding to allow for X-Axis choosing inside Pitside 2) FINALLY fixed the highlight bumps for multiple data graphs! 3) Minor code cleanup on smoothing algorithm --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 16 +- .../PitsideConsole/DlgSetSplits.cpp | 24 --- PitsideConsole/PitsideConsole/LapData.cpp | 53 +++-- PitsideConsole/PitsideConsole/LapData.h | 185 +++++++++++++++++- PitsideConsole/PitsideConsole/LapPainter.cpp | 28 ++- PitsideConsole/PitsideConsole/LapReceiver.cpp | 8 - .../PitsideConsole/PitsideConsole.cpp | 35 +++- .../PitsideConsole/PitsideConsole.rc | 27 +-- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1905274 -> 1905635 bytes PitsideConsole/PitsideConsole/resource.h | 2 + PitsideConsole/PitsideConsole/settings.txt | 4 +- WifiLapperLite/.classpath | 9 - WifiLapperLite/.gitignore | 2 - WifiLapperLite/.project | 33 ---- .../.settings/org.eclipse.jdt.core.prefs | 4 - WifiLapperLite/AndroidManifest.xml | 100 ---------- WifiLapperLite/project.properties | 14 -- 17 files changed, 292 insertions(+), 252 deletions(-) delete mode 100644 WifiLapperLite/.classpath delete mode 100644 WifiLapperLite/.gitignore delete mode 100644 WifiLapperLite/.project delete mode 100644 WifiLapperLite/.settings/org.eclipse.jdt.core.prefs delete mode 100644 WifiLapperLite/AndroidManifest.xml delete mode 100644 WifiLapperLite/project.properties diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index 2b8cabc..87fb7e6 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -41,6 +41,7 @@ struct PITSIDE_SETTINGS iMapLines = 1; iColorScheme = 0; bSmoothYesNo = false; + bXAxis_KM = false; } int fRunHTTP; @@ -49,6 +50,7 @@ struct PITSIDE_SETTINGS int iMapLines; int iColorScheme; bool bSmoothYesNo; + bool bXAxis_KM; }; struct TRANSFORMATION @@ -68,7 +70,16 @@ struct TRANSFORMATION float f_CoeffC; bool b_LoadTrans; }; - +/* +enum UNIT_PREFERENCE +{ + UNIT_PREFERENCE_KMH, + UNIT_PREFERENCE_MPH, + UNIT_PREFERENCE_MS, + + UNIT_PREFERENCE_COUNT, +}; +*/ enum LAPSORTSTYLE { SORTSTYLE_BYTIMEOFRACE, // sort by the time the lap was done: 2:31pm comes before 4:45pm (well... on the same day) @@ -78,10 +89,11 @@ enum LAPSORTSTYLE struct LAPSUPPLIEROPTIONS { public: - LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false) + LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false) { } UNIT_PREFERENCE eUnitPreference; + bool bXAxis_KM; bool fDrawSplitPoints; bool fDrawGuides; bool fDrawLines; // whether to draw lines between data points diff --git a/PitsideConsole/PitsideConsole/DlgSetSplits.cpp b/PitsideConsole/PitsideConsole/DlgSetSplits.cpp index 51c8768..c5985e8 100644 --- a/PitsideConsole/PitsideConsole/DlgSetSplits.cpp +++ b/PitsideConsole/PitsideConsole/DlgSetSplits.cpp @@ -6,7 +6,6 @@ #include "ArtTools.h" // for FLOATRECT #include "ArtUI.h" // for ArtOpenGLWindow - LRESULT CSetSplitsDlg::DlgProc ( HWND hWnd, @@ -42,10 +41,8 @@ LRESULT CSetSplitsDlg::DlgProc { return 0; } - switch(uMsg) { - case WM_INITDIALOG: { // Get the Start time for the lap and store it @@ -60,7 +57,6 @@ LRESULT CSetSplitsDlg::DlgProc pSF[x].m_pt1 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); pSF[x].m_pt2 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); } - x = FINISH; { const TimePoint2D& p = lstPoints[lstPoints.size()-1]; @@ -70,15 +66,11 @@ LRESULT CSetSplitsDlg::DlgProc pSF[x].m_pt1 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); pSF[x].m_pt2 = V2D(m_sfLapOpts->m_SplitPoints[x].m_sfXPoint,m_sfLapOpts->m_SplitPoints[x].m_sfYPoint); } - // Show the split points m_sfLapOpts->fDrawSplitPoints = true; - // The the OGL handle p_sfRefLapPainter.Init(hWnd_OGL); - p_sfRefLapPainter.DrawLapLines(*m_sfLapOpts); // draws laps as a map - return TRUE; } /* case WM_MOUSEMOVE: @@ -163,72 +155,56 @@ LRESULT CSetSplitsDlg::DlgProc { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT1, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT2: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT2, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT3: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT3, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT4: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT4, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT5: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT5, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT6: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT6, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT7: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT7, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDC_SETSPLIT8: { // Get the Finish time for the lap and store it and fill in the S/F vectors for this lap GetSplitPoint(SPLIT8, szTempSplit, hWnd); - m_sfLapOpts->fDrawSplitPoints = true; - return TRUE; } case IDOK: diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 4ba3ded..002f176 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "LapData.h" #include "PitsideConsole.h" +#include "dlgPlotSelect.h" struct PIDDATA @@ -289,6 +290,19 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) } } +bool bXAxisUnits(XAXIS_PREFERENCE xConvertTo) +{ + + switch(xConvertTo) + { + case XAXIS_PREFERENCE_LAT: return false; + case XAXIS_PREFERENCE_KM: return true; + } + CASSERT(UNIT_PREFERENCE_COUNT == 3); + + return false; +} + float ConvertSpeed(UNIT_PREFERENCE eConvertTo, float flValueInMetersPerSecond) { @@ -861,21 +875,12 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pLapTime->AddPoint(p.iTime, (double)iElapsedTime); const double dX = p.flX - ptLast.flX; const double dY = p.flY - ptLast.flY; -/* // Converting from LONG/LAT to distance in meters - double rad = 6371.0f; // earth's mean radius in km - double dLat, dLon, R, lat1, lat2, lon1, lon2; - R = rad; - lat1 = p.flY * 0.0174532925199433; // Convert from degrees to radians - lon1 = p.flX * 0.0174532925199433; - lat2 = ptLast.flY * 0.0174532925199433; - lon2 = ptLast.flX * 0.0174532925199433; - dLat = (lat2 - lat1); - dLon = (lon2 - lon1); - double a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2); - double c = 2 * atan2(sqrt(a), sqrt(1-a)); - const double d = R * c * 1000; // Return the distance in meters */ - const double d = sqrt (dY*dY + dX*dX); // Return distance in Theta of Long/Lat. Needed until Jason fixes web-side GUI - dDistance += d; + double d; +// if ( p_sfLapOpts ) +// d = fReturnDistanceInMeters (p, ptLast); // Return the distance in meters +// else + d = sqrt (dY*dY + dX*dX); // Return distance in Theta of Long/Lat. Needed until Jason fixes web-side GUI + dDistance += d; m_lstPoints.push_back(TimePoint2D(p)); ptLast = p; @@ -915,6 +920,24 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende } } +const double fReturnDistanceInMeters (const TimePoint2D& p, TimePoint2D ptLast) +{ + // Converting from LONG/LAT to distance in meters + double rad = 6371.0f; // earth's mean radius in km + double dLat, dLon, R, lat1, lat2, lon1, lon2; + R = rad; + lat1 = p.flY * 0.0174532925199433; // Convert from degrees to radians + lon1 = p.flX * 0.0174532925199433; + lat2 = ptLast.flY * 0.0174532925199433; + lon2 = ptLast.flX * 0.0174532925199433; + dLat = (lat2 - lat1); + dLon = (lon2 - lon1); + double a = sin(dLat/2) * sin(dLat/2) + cos(lat1) * cos(lat2) * sin(dLon/2) * sin(dLon/2); + double c = 2 * atan2(sqrt(a), sqrt(1-a)); + const double d = R * c * 1000; // Return the distance in meters + return d; +} + const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs) { int ixLow = 0; diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 0ae3d7a..a63dee8 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -1,7 +1,9 @@ #pragma once #include -#include "LapReceiver.h" #include "ArtTools.h" // for FormatTimeMinutesSecondsMs +#include "resource.h" +#include "LapReceiver.h" +#include "PitsideConsole.h" using namespace std; enum DATA_CHANNEL @@ -9,13 +11,8 @@ enum DATA_CHANNEL DATA_CHANNEL_START = 0, DATA_CHANNEL_X = DATA_CHANNEL_START, DATA_CHANNEL_Y = 1, - DATA_CHANNEL_PLOTTABLE_START = 2, - DATA_CHANNEL_DISTANCE = DATA_CHANNEL_PLOTTABLE_START, - DATA_CHANNEL_TIME = 11, - DATA_CHANNEL_ELAPSEDTIME = 12, - DATA_CHANNEL_LAPTIME_SUMMARY = 13, DATA_CHANNEL_VELOCITY = 3, DATA_CHANNEL_TIMESLIP = 4, DATA_CHANNEL_X_ACCEL = 5, @@ -24,17 +21,26 @@ enum DATA_CHANNEL DATA_CHANNEL_RECEPTION_X = 8, DATA_CHANNEL_RECEPTION_Y = 9, DATA_CHANNEL_Z_ACCEL = 10, + DATA_CHANNEL_TIME = 11, + DATA_CHANNEL_ELAPSEDTIME = 12, + DATA_CHANNEL_LAPTIME_SUMMARY = 13, DATA_CHANNEL_PID_START = 0x100, DATA_CHANNEL_PID_END = 0x200, - DATA_CHANNEL_IOIOPIN_START = 0x200, + DATA_CHANNEL_IOIOPIN_START = 0x201, DATA_CHANNEL_IOIOPIN_END = 0x300, DATA_CHANNEL_IOIOCUSTOM_START = 0x301, DATA_CHANNEL_IOIOCUSTOM_END = 0x400, DATA_CHANNEL_COUNT, }; +enum XAXIS_PREFERENCE +{ + XAXIS_PREFERENCE_LAT, + XAXIS_PREFERENCE_KM, +}; + enum UNIT_PREFERENCE { UNIT_PREFERENCE_KMH, @@ -42,12 +48,15 @@ enum UNIT_PREFERENCE UNIT_PREFERENCE_MS, UNIT_PREFERENCE_COUNT, -}; +}; + void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch); float ConvertSpeed(UNIT_PREFERENCE eConvertTo, float flVelocityInMetersPerSecond); +bool bXAxisUnits(XAXIS_PREFERENCE xConvertTo); LPCSTR GetUnitText(UNIT_PREFERENCE eUnits); void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch); void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch); +const double fReturnDistanceInMeters (const TimePoint2D& p, TimePoint2D ptLast); bool FindClosestTwoPoints(const TimePoint2D& p, double dInputPercentage, const vector& lstPoints, TimePoint2D* pt1, TimePoint2D* pt2); @@ -194,9 +203,169 @@ class CExtendedLap SYSTEMTIME m_tmStart; // when was this thing started on-track? public: vector m_lstPoints; // Made public by KDJ + private: bool m_fComputeTimeSlip; // time-slip is the most expensive data channel, so let's allow the caller to choose not to compute it mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated }; const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs); + +/////////////////////////////////////////////////////////////////////// +// Added for LapOpts settings +/////////////////////////////////////////////////////////////////////// +/* +//struct SETXAXISDLG_RESULT +//{ +//public: +// SETXAXISDLG_RESULT() +// { +// fCancelled = true; +// } +// bool fCancelled; +//}; + +class CXAxisDlg : public IUI, public ILapSupplier +{ +public: +// CXAxisDlg(ILapReceiver* pLapDB, CExtendedLap* pLap, SETXAXISDLG_RESULT* pResults, int iRaceId, LAPSUPPLIEROPTIONS* i_sfLapOpts) : m_pLap(pLap), m_pResults(pResults), m_iRaceId(iRaceId), m_sfLapOpts(i_sfLapOpts) + CXAxisDlg(ILapReceiver* pLapDB, CExtendedLap* pLap, int iRaceId, LAPSUPPLIEROPTIONS* i_sfLapOpts) : m_pLap(pLap), m_iRaceId(iRaceId), m_sfLapOpts(i_sfLapOpts) + { + m_pLapDB = pLapDB; + m_pLap = pLap; + }; + + virtual void NotifyChange(WPARAM wParam, LPARAM lParam) {DASSERT(FALSE);}; + virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual DWORD GetDlgId() const {return NULL;} + + // <-- returns which laps you want painted + virtual vector GetLapsToShow() const + { + vector lstLaps; + lstLaps.push_back(m_pLap); + return lstLaps; + } + // <-- returns all the laps + virtual vector GetAllLaps() const + { + vector lstLaps; + lstLaps.push_back(m_pLap); + return lstLaps; + } + // <-- returns how you want the laps shown: this can be a map or a data plot + virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const + { + return LAPDISPLAYSTYLE_MAP; + } + // <-- returns what data channel you want to use for the x-axis + virtual DATA_CHANNEL GetXChannel() const + { + return DATA_CHANNEL_X; + } + // <-- returns what data channels you want to use for the y-axes (can be 1 or more) + virtual vector GetYChannels() const + { + return m_lstYChannels; + } + // <-- returns the actual data channel object for a given lap. + virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const + { + return m_pLapDB->GetDataChannel(iLapId, eChannel); + } + // <-- returns the x and y bounds for all the laps + virtual FLOATRECT GetAllLapsBounds() const + { + FLOATRECT rc; + rc.left = 1e30; + rc.top = -1e30; + rc.bottom = 1e30; + rc.right = -1e30; + + // changed this so it returns the bounds of the reference lap. This way, data-viewing isn't ruined by errant points + // it used to be based on all the laps, but if you had just one messed-up lap it would make viewing pointless + if(m_pLap != NULL) + { + const vector& lstPoints = m_pLap->GetPoints(); + for(int x = 0; x< lstPoints.size(); x++) + { + const TimePoint2D& p = lstPoints[x]; + rc.left = min(rc.left,p.flX); + rc.top = max(rc.top,p.flY); + rc.bottom = min(rc.bottom,p.flY); + rc.right = max(rc.right,p.flX); + } + } + return rc; + } + + // guide-parameter functions - these configure the background horizontal/vertical lines + // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw + virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw + virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) + virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) + virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) + { + return 0.0f; + } + // <-- returns the absolute lowest value we want to display for a given data channel type + virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const + { + return 0.0f; + } + // <-- returns the absolute highest value we want to display for a given data channel type + virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const + { + return 0.0f; + } + + // highlighting functions + // <-- only call if you are a HighlightSource. Sets the time in milliseconds that should be highlighted. + virtual void SetLapHighlightTime(const CExtendedLap* m_pLap, int iTimeMs) + { + m_mapLapHighlightTimes[m_pLap] = iTimeMs; + } + // <-- gets the time in milliseconds that should be highlighted. + virtual int GetLapHighlightTime(const CExtendedLap* m_pLap) const + { + DASSERT(m_mapLapHighlightTimes.find(m_pLap) != m_mapLapHighlightTimes.end()); // this should have always ended up set from the "master" highlighter. This function is only called by "slave" highlight-users + return m_mapLapHighlightTimes.find(m_pLap)->second; + } + // returns whether the caller should be a lap highlighter (calling SetLapHighlightTime) or a lap highlight-receiver (calling GetLapHighlightTime) + virtual bool IsHighlightSource(int iSupplierId) const + { + return true; // Allow the Set Split Sectors to be highlight source + } + // <-- gets more display options. + virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const + { + return *m_sfLapOpts; + } +private: +// void GetSplitPoint(int x, SplitPoints szTempSplit, HWND hWnd); +// void ComputeSectors(); +// SETXAXISDLG_RESULT* m_pResults; + int m_iRaceId; + ILapReceiver* m_pLapDB; + LAPSUPPLIEROPTIONS* m_sfLapOpts; + CExtendedLap* m_pLap; + ILapSupplier* m_sfSectorDisplay; + vector m_lstYChannels; + map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls + int m_iSupplierId; +// CLapPainter p_sfRefLapPainter; + +}; +*/ \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index a00a95a..19b5114 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -518,9 +518,9 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi int w = 4; // * Default setting. w is the size of the smoothing window, taken on each side of sample float dBestLength = -1; float dTimeToHighlight = -1; -/* const vector &lstPointsX = (vector&) pDataX->GetData(); - const vector &lstPointsY = (vector&) pDataY->GetData(); -*/ // Changed to non-constant as we want to smooth the data sometimes +// const vector &lstPointsX = (vector&) pDataX->GetData(); +// const vector &lstPointsY = (vector&) pDataY->GetData(); + // Changed to non-constant as we want to smooth the data sometimes vector &lstPointsX = (vector&) pDataX->GetData(); vector &lstPointsY = (vector&) pDataY->GetData(); vector lstPointsX_Accel; @@ -840,17 +840,15 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi glPushMatrix(); // <-- pushes a matrix onto the opengl matrix stack. glLoadIdentity(); // <-- makes it so that the matrix stack just converts all our coordinates directly to window coordinates glOrtho(0, RECT_WIDTH(&rcSpot),0, RECT_HEIGHT(&rcSpot),-1.0,1.0); - /* <-- tells OpenGL that it should show us the part of the openGL "world" that corresponds to - (0...window width, 0 ... window height). This completes the "hey opengl, just draw where we - tell you to plz" part of the function */ - + // <-- tells OpenGL that it should show us the part of the openGL "world" that corresponds to (0...window width, 0 ... window height). + // This completes the "hey opengl, just draw where we tell you to plz" part of the function for(int x = 0; x < lstMousePointsToDraw.size(); x++) // <-- loops through all the stupid boxes/lines we want to draw { const CExtendedLap* pLap = lstMousePointsToDraw[x].m_pLap; // <-- gets the lap data we want to draw const POINT& ptWindow = lstMousePointsToDraw[x].m_ptWindow; // <-- gets info about where in the window we want to draw the box const IDataChannel* pDataX = lstMousePointsToDraw[x].m_pDataX; // <-- gets the x channel data const IDataChannel* pDataY = lstMousePointsToDraw[x].m_pDataY; // <-- gets the y channel data - POINT Temp_ptWindow; // Point for transforming Y values in highlight loop + POINT Temp_ptWindow; // Point for transforming Y values in highlight loop float r; float g; @@ -906,17 +904,17 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi // we also want to draw a highlighted square // DrawGLFilledSquare(ptWindow.x, ptWindow.y, 3); // <-- draws the stupid little box at ptWindow.x. - DrawGLFilledSquare(ptWindow.x, Temp_ptWindow.y, 3); // <-- draws the stupid little box at ptWindow.x. + DrawGLFilledSquare((double)ptWindow.x, (double)(Temp_ptWindow.y - rcSpot.top), 3); // <-- draws the stupid little box at ptWindow.x. // we also want to draw a highlighted LINE for that individual lap/graph combination - glLineWidth(1); // Added by KDJ. Skinny line for Distance markers. - glBegin(GL_LINE_STRIP); // Added by KDJ - glVertex3f(ptWindow.x, 0, 0); // Added by KDJ, modified by Chas - glVertex3f(ptWindow.x,rcSpot.bottom,0); // Added by KDJ - glEnd(); // Added by KDJ + glLineWidth(1); // Skinny vertical line for mouse location markers. + glBegin(GL_LINE_STRIP); + glVertex3f(ptWindow.x, 0, 0); + glVertex3f(ptWindow.x,rcSpot.bottom,0); + glEnd(); } } glPopMatrix(); - glPopMatrix(); // Should there be two of these here? + glPopMatrix(); // Pops us out of windows space to OGL space } rcSpot.top += iSegmentHeight; rcSpot.bottom += iSegmentHeight; diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 4609af8..de18068 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -136,8 +136,6 @@ float CDataChannel::GetValue(int iTime) const vector& lstPoints = lstData; vector lstSmoothPts; lstSmoothPts.begin(); - // If data is an Accelerometer channel, first let's smooth out the data channel before returning the data value -// if ( ( eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if ( ( eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) ) { lstSmoothPts.clear(); @@ -202,7 +200,6 @@ float CDataChannel::GetValue(int iTime) const const float flWidth = dataSecond->iTimeMs - dataFirst->iTimeMs; if(flWidth == 0) { -// if ( ( eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) ) if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) ) { return SmoothedFilter().ApplyTo(flFirst); // Returns the first value, transformed Y-value for this data channel @@ -214,7 +211,6 @@ float CDataChannel::GetValue(int iTime) const } const float flPct = flOffset / flWidth; -// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( (1-flPct)*flFirst + (flPct)*flNext ); // Returns the transformed Y-value for this data channel @@ -226,7 +222,6 @@ float CDataChannel::GetValue(int iTime) const } else { -// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( pData[iCheck].flValue ); // Returns the last value for the Y-value for this data channel @@ -256,7 +251,6 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& const DataPoint& dataLast = *iBack; if(dataLast.iTimeMs == data.iTimeMs) { -// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) ) { return SmoothedFilter().ApplyTo( dataLast.flValue ); // Returns the last value for the Y-value for this data channel @@ -271,7 +265,6 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& float flOffset = iTime - dataLast.iTimeMs; float flPct = flOffset / flWidth; DASSERT(flPct >= 0.0f && flPct <= 1.0f); -// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( (1-flPct)*dataLast.flValue + flPct * data.flValue ); // Returns the last value for the Y-value for this data channel @@ -284,7 +277,6 @@ float CDataChannel::GetValue(int iTime, const vector::const_iterator& else { // this iterator is actually the first element in our vector, so just return it's value -// if ( (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) && sfLapOpts.bSmoothYesNo == true ) if (eChannelType == DATA_CHANNEL_X_ACCEL || eChannelType == DATA_CHANNEL_Y_ACCEL || eChannelType == DATA_CHANNEL_Z_ACCEL ) { return SmoothedFilter().ApplyTo( data.flValue ); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 4f38a2b..d77ab6d 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -747,6 +747,22 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) UpdateUI(UPDATE_MAP | UPDATE_MENU); return TRUE; } + case ID_OPTIONS_XAXIS_KM: + { + m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_KM; + bXAxisUnits ( XAXIS_PREFERENCE_KM ); + MessageBox(hWnd, L"X-Axis will be displayed in KM's\n\nYou need to re-load the Race Session for this change to take effect!",L"NOTICE", MB_OK); + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_XAXIS_LAT: + { + m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_LAT; + bXAxisUnits ( XAXIS_PREFERENCE_LAT ); + MessageBox(hWnd, L"X-Axis will be displayed in Latitude/Longitudinal degrees\n\nYou need to re-load the Race Session for this change to take effect!",L"NOTICE", MB_OK); + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } case ID_OPTIONS_SHOWBESTS: { m_fShowBests = !m_fShowBests; @@ -2236,6 +2252,8 @@ void UpdateValues() CheckMenuHelper(hSubMenu, ID_OPTIONS_KMH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_KMH); CheckMenuHelper(hSubMenu, ID_OPTIONS_MPH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MPH); CheckMenuHelper(hSubMenu, ID_OPTIONS_MS, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MS); + CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_KM, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_KM); + CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_LAT, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_LAT); CheckMenuHelper(hSubMenu, ID_OPTIONS_TRACTIONCIRCLE, m_sfLapOpts.bTractionCircle); CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWBESTS, m_fShowBests); CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWDRIVERBESTS, m_fShowDriverBests); @@ -2599,9 +2617,10 @@ void UpdateValues() if(flSpread < 0.050) return 0.0050f; if(flSpread < 1.000) return 0.1000f; if(flSpread < 10.00) return 1.0000f; - if(flSpread < 1000) return 50.0f; - if(flSpread < 5000) return 100.0f; - if(flSpread < 10000) return 500.0f; + if(flSpread < 500) return 50.0f; + if(flSpread < 1000) return 100.0f; + if(flSpread < 5000) return 500.0f; + if(flSpread < 10000) return 1000.0f; if(flSpread < 50000) return 2500.0f; if(flSpread < 110000) return 5000.0f; if(flSpread < 1100000) return 10000.0f; @@ -2884,6 +2903,7 @@ void LoadPitsideSettings(PITSIDE_SETTINGS* pSettings) in>>pSettings->iMapLines; in>>pSettings->iColorScheme; in>>pSettings->bSmoothYesNo; + in>>pSettings->bXAxis_KM; in.close(); } } @@ -3080,9 +3100,14 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.bSmoothYesNo = sfSettings.bSmoothYesNo; // Assign smoothing setting from Settings.txt file break; } - default: + } + switch (sfSettings.bXAxis_KM) + { + case 0: + case 1: { - x_sfLapOpts.bSmoothYesNo = false; // Grey background as a default, true = black + x_sfLapOpts.bXAxis_KM = sfSettings.bXAxis_KM; // Assign choice of LAT or KM for X-Axis setting from Settings.txt file + break; } } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 3722ff3..5ce8624 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -11,6 +11,7 @@ CAPTION "Pitside" FONT 8, "MS Shell Dlg" MENU IDM_OPTIONS BEGIN +// CONTROL "", IDC_LAPS, WC_LISTVIEWEX, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 LTEXT "",IDC_DISPLAY,155,63,590,282 // LTEXT "",IDC_SUBDISPLAY,520,0,150,63 @@ -190,7 +191,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0031\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0032\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END @@ -441,13 +442,22 @@ IDM_OPTIONS MENU BEGIN POPUP "&File" BEGIN - MENUITEM "Save Image", IDM_SAVE_BM + MENUITEM "Open .wflp DB", ID_DATA_OPENDB + MENUITEM "Switch Race Session", ID_DATA_SWITCHSESSION + MENUITEM "Edit/Merge Race Sessions", ID_DATA_EDITSESSION + MENUITEM SEPARATOR MENUITEM "Print...", IDM_PRINT_BM + MENUITEM SEPARATOR + MENUITEM "Export selected laps to CSV format", ID_DATA_DASHWARE + MENUITEM SEPARATOR MENUITEM "Exit", ID_FILE_EXIT END POPUP "&Edit" BEGIN MENUITEM "Copy", ID_EDIT_COPY + MENUITEM "Save Image", IDM_SAVE_BM + MENUITEM SEPARATOR + MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS END POPUP "&Options" BEGIN @@ -455,6 +465,9 @@ POPUP "&Options" MENUITEM "MPH", ID_OPTIONS_MPH MENUITEM "m/s", ID_OPTIONS_MS MENUITEM SEPARATOR + MENUITEM "X-Axis in KM", ID_OPTIONS_XAXIS_KM + MENUITEM "X-Axis in LAT", ID_OPTIONS_XAXIS_LAT + MENUITEM SEPARATOR MENUITEM "Set Split Points", ID_OPTIONS_SETSPLITS MENUITEM SEPARATOR MENUITEM "Show Traction Circle", ID_OPTIONS_TRACTIONCIRCLE @@ -468,17 +481,7 @@ POPUP "&Options" MENUITEM "Use dark background for plots",ID_OPTIONS_BACKGROUND MENUITEM SEPARATOR MENUITEM "Force plotted data to fixed scales",ID_OPTIONS_IOIO5VSCALE - MENUITEM SEPARATOR - MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS - - END - POPUP "&Data" - BEGIN - MENUITEM "Switch Race Session", ID_DATA_SWITCHSESSION - MENUITEM "Open .wflp DB", ID_DATA_OPENDB - MENUITEM "Edit/Merge Race Sessions", ID_DATA_EDITSESSION - MENUITEM "Export selected laps to CSV format", ID_DATA_DASHWARE END POPUP "&Timing" BEGIN diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index 48b0ec7e9d59fdacd3555ba5d6f193e2f8cc38b2..50b8c6e4db15306ebdfc03b40431fe71abd270c8 100644 GIT binary patch delta 63948 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 JE+}d#{V(~uiogH> delta 63550 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 - - - - - - - - diff --git a/WifiLapperLite/.gitignore b/WifiLapperLite/.gitignore deleted file mode 100644 index 1ec69fa..0000000 --- a/WifiLapperLite/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/ -gen/ \ No newline at end of file diff --git a/WifiLapperLite/.project b/WifiLapperLite/.project deleted file mode 100644 index 26d1ec1..0000000 --- a/WifiLapperLite/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - WifilapperLite - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs b/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index f77b31c..0000000 --- a/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/WifiLapperLite/AndroidManifest.xml b/WifiLapperLite/AndroidManifest.xml deleted file mode 100644 index 712d176..0000000 --- a/WifiLapperLite/AndroidManifest.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WifiLapperLite/project.properties b/WifiLapperLite/project.properties deleted file mode 100644 index e216117..0000000 --- a/WifiLapperLite/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "ant.properties", and override values to adapt the script to your -# project structure. - -# Project target. -target=android-8 -android.library.reference.1=..\\IOIOLib -android.library=false -android.library.reference.2=../TestApp From 736a2a10a1be3abb5e16799026ba4d8d344b7c5b Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 2 Feb 2015 22:32:01 -0700 Subject: [PATCH 014/112] Art's WFL merging with Keith's master --- WifiLapperLite/.classpath | 9 ++ WifiLapperLite/.gitignore | 2 + WifiLapperLite/.project | 33 ++++++ .../.settings/org.eclipse.jdt.core.prefs | 4 + WifiLapperLite/AndroidManifest.xml | 100 ++++++++++++++++++ WifiLapperLite/project.properties | 14 +++ 6 files changed, 162 insertions(+) create mode 100644 WifiLapperLite/.classpath create mode 100644 WifiLapperLite/.gitignore create mode 100644 WifiLapperLite/.project create mode 100644 WifiLapperLite/.settings/org.eclipse.jdt.core.prefs create mode 100644 WifiLapperLite/AndroidManifest.xml create mode 100644 WifiLapperLite/project.properties diff --git a/WifiLapperLite/.classpath b/WifiLapperLite/.classpath new file mode 100644 index 0000000..5e69ff8 --- /dev/null +++ b/WifiLapperLite/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/WifiLapperLite/.gitignore b/WifiLapperLite/.gitignore new file mode 100644 index 0000000..1ec69fa --- /dev/null +++ b/WifiLapperLite/.gitignore @@ -0,0 +1,2 @@ +bin/ +gen/ \ No newline at end of file diff --git a/WifiLapperLite/.project b/WifiLapperLite/.project new file mode 100644 index 0000000..26d1ec1 --- /dev/null +++ b/WifiLapperLite/.project @@ -0,0 +1,33 @@ + + + WifilapperLite + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs b/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f77b31c --- /dev/null +++ b/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/WifiLapperLite/AndroidManifest.xml b/WifiLapperLite/AndroidManifest.xml new file mode 100644 index 0000000..712d176 --- /dev/null +++ b/WifiLapperLite/AndroidManifest.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WifiLapperLite/project.properties b/WifiLapperLite/project.properties new file mode 100644 index 0000000..e216117 --- /dev/null +++ b/WifiLapperLite/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 +android.library.reference.1=..\\IOIOLib +android.library=false +android.library.reference.2=../TestApp From c41450c2cf895cab6d8581c71851dc1383cc159c Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 2 Feb 2015 22:49:43 -0700 Subject: [PATCH 015/112] Menu adjustment --- PitsideConsole/PitsideConsole/PitsideConsole.rc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 5ce8624..c503b66 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -456,8 +456,6 @@ POPUP "&Edit" BEGIN MENUITEM "Copy", ID_EDIT_COPY MENUITEM "Save Image", IDM_SAVE_BM - MENUITEM SEPARATOR - MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS END POPUP "&Options" BEGIN @@ -481,7 +479,8 @@ POPUP "&Options" MENUITEM "Use dark background for plots",ID_OPTIONS_BACKGROUND MENUITEM SEPARATOR MENUITEM "Force plotted data to fixed scales",ID_OPTIONS_IOIO5VSCALE - + MENUITEM SEPARATOR + MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS END POPUP "&Timing" BEGIN From 05e7f77e29e8301ce12b94e250da6eee731a2f01 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Mon, 2 Feb 2015 23:09:45 -0700 Subject: [PATCH 016/112] Initial commit from new computer --- .gitignore | 4 + .gitignore_global | 3 + IOIODiagnostics/.classpath | 9 + IOIODiagnostics/.gitignore | 2 + IOIODiagnostics/.project | 33 + IOIODiagnostics/AndroidManifest.xml | 24 + IOIODiagnostics/proguard.cfg | 40 + IOIODiagnostics/project.properties | 13 + .../res/drawable-hdpi/ic_launcher.png | Bin 0 -> 4147 bytes .../res/drawable-ldpi/ic_launcher.png | Bin 0 -> 1723 bytes .../res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2574 bytes IOIODiagnostics/res/layout/main.xml | 251 + IOIODiagnostics/res/values/strings.xml | 7 + .../IOIODiagnosticsActivity.java | 517 + IOIOLib/.classpath | 8 + IOIOLib/.gitignore | 2 + IOIOLib/.project | 33 + IOIOLib/.settings/org.eclipse.jdt.core.prefs | 11 + IOIOLib/AndroidManifest.xml | 8 + IOIOLib/build.xml | 85 + IOIOLib/doc/allclasses-frame.html | 97 + IOIOLib/doc/allclasses-noframe.html | 97 + IOIOLib/doc/constant-values.html | 198 + IOIOLib/doc/deprecated-list.html | 146 + IOIOLib/doc/help-doc.html | 223 + IOIOLib/doc/index-files/index-1.html | 148 + IOIOLib/doc/index-files/index-10.html | 212 + IOIOLib/doc/index-files/index-11.html | 148 + IOIOLib/doc/index-files/index-12.html | 154 + IOIOLib/doc/index-files/index-13.html | 173 + IOIOLib/doc/index-files/index-14.html | 143 + IOIOLib/doc/index-files/index-15.html | 142 + IOIOLib/doc/index-files/index-16.html | 205 + IOIOLib/doc/index-files/index-17.html | 193 + IOIOLib/doc/index-files/index-2.html | 167 + IOIOLib/doc/index-files/index-3.html | 161 + IOIOLib/doc/index-files/index-4.html | 152 + IOIOLib/doc/index-files/index-5.html | 176 + IOIOLib/doc/index-files/index-6.html | 148 + IOIOLib/doc/index-files/index-7.html | 162 + IOIOLib/doc/index-files/index-8.html | 145 + IOIOLib/doc/index-files/index-9.html | 148 + IOIOLib/doc/index.html | 39 + IOIOLib/doc/ioio/lib/api/AnalogInput.html | 328 + IOIOLib/doc/ioio/lib/api/Closeable.html | 209 + .../ioio/lib/api/DigitalInput.Spec.Mode.html | 360 + .../doc/ioio/lib/api/DigitalInput.Spec.html | 328 + IOIOLib/doc/ioio/lib/api/DigitalInput.html | 306 + .../ioio/lib/api/DigitalOutput.Spec.Mode.html | 341 + .../doc/ioio/lib/api/DigitalOutput.Spec.html | 330 + IOIOLib/doc/ioio/lib/api/DigitalOutput.html | 269 + .../doc/ioio/lib/api/IOIO.VersionType.html | 371 + IOIOLib/doc/ioio/lib/api/IOIO.html | 1241 + IOIOLib/doc/ioio/lib/api/IOIOConnection.html | 272 + IOIOLib/doc/ioio/lib/api/IOIOFactory.html | 390 + IOIOLib/doc/ioio/lib/api/IcspMaster.html | 403 + .../ioio/lib/api/PulseInput.ClockRate.html | 407 + .../ioio/lib/api/PulseInput.PulseMode.html | 425 + IOIOLib/doc/ioio/lib/api/PulseInput.html | 527 + IOIOLib/doc/ioio/lib/api/PwmOutput.html | 347 + .../doc/ioio/lib/api/SpiMaster.Config.html | 339 + IOIOLib/doc/ioio/lib/api/SpiMaster.Rate.html | 697 + .../doc/ioio/lib/api/SpiMaster.Result.html | 222 + IOIOLib/doc/ioio/lib/api/SpiMaster.html | 424 + IOIOLib/doc/ioio/lib/api/TwiMaster.Rate.html | 341 + .../doc/ioio/lib/api/TwiMaster.Result.html | 223 + IOIOLib/doc/ioio/lib/api/TwiMaster.html | 363 + IOIOLib/doc/ioio/lib/api/Uart.Parity.html | 351 + IOIOLib/doc/ioio/lib/api/Uart.StopBits.html | 333 + IOIOLib/doc/ioio/lib/api/Uart.html | 314 + .../ioio/lib/api/class-use/AnalogInput.html | 180 + .../doc/ioio/lib/api/class-use/Closeable.html | 247 + .../api/class-use/DigitalInput.Spec.Mode.html | 237 + .../lib/api/class-use/DigitalInput.Spec.html | 216 + .../ioio/lib/api/class-use/DigitalInput.html | 197 + .../class-use/DigitalOutput.Spec.Mode.html | 239 + .../lib/api/class-use/DigitalOutput.Spec.html | 228 + .../ioio/lib/api/class-use/DigitalOutput.html | 209 + .../lib/api/class-use/IOIO.VersionType.html | 205 + IOIOLib/doc/ioio/lib/api/class-use/IOIO.html | 197 + .../lib/api/class-use/IOIOConnection.html | 197 + .../ioio/lib/api/class-use/IOIOFactory.html | 144 + .../ioio/lib/api/class-use/IcspMaster.html | 181 + .../api/class-use/PulseInput.ClockRate.html | 208 + .../api/class-use/PulseInput.PulseMode.html | 218 + .../ioio/lib/api/class-use/PulseInput.html | 193 + .../doc/ioio/lib/api/class-use/PwmOutput.html | 190 + .../lib/api/class-use/SpiMaster.Config.html | 185 + .../lib/api/class-use/SpiMaster.Rate.html | 262 + .../lib/api/class-use/SpiMaster.Result.html | 187 + .../doc/ioio/lib/api/class-use/SpiMaster.html | 212 + .../lib/api/class-use/TwiMaster.Rate.html | 208 + .../lib/api/class-use/TwiMaster.Result.html | 186 + .../doc/ioio/lib/api/class-use/TwiMaster.html | 183 + .../ioio/lib/api/class-use/Uart.Parity.html | 223 + .../ioio/lib/api/class-use/Uart.StopBits.html | 223 + IOIOLib/doc/ioio/lib/api/class-use/Uart.html | 198 + .../exception/ConnectionLostException.html | 259 + .../exception/IncompatibilityException.html | 245 + .../api/exception/OutOfResourceException.html | 247 + .../class-use/ConnectionLostException.html | 643 + .../class-use/IncompatibilityException.html | 180 + .../class-use/OutOfResourceException.html | 144 + .../ioio/lib/api/exception/package-frame.html | 36 + .../lib/api/exception/package-summary.html | 167 + .../ioio/lib/api/exception/package-tree.html | 160 + .../ioio/lib/api/exception/package-use.html | 178 + IOIOLib/doc/ioio/lib/api/package-frame.html | 102 + IOIOLib/doc/ioio/lib/api/package-summary.html | 284 + IOIOLib/doc/ioio/lib/api/package-tree.html | 170 + IOIOLib/doc/ioio/lib/api/package-use.html | 323 + .../ioio/lib/util/AbstractIOIOActivity.html | 258 + ...onnectionDiscovery.IOIOConnectionSpec.html | 283 + .../lib/util/IOIOConnectionDiscovery.html | 226 + .../util/SocketIOIOConnectionDiscovery.html | 277 + .../util/class-use/AbstractIOIOActivity.html | 144 + ...onnectionDiscovery.IOIOConnectionSpec.html | 188 + .../class-use/IOIOConnectionDiscovery.html | 180 + .../SocketIOIOConnectionDiscovery.html | 144 + IOIOLib/doc/ioio/lib/util/package-frame.html | 47 + .../doc/ioio/lib/util/package-summary.html | 179 + IOIOLib/doc/ioio/lib/util/package-tree.html | 161 + IOIOLib/doc/ioio/lib/util/package-use.html | 176 + IOIOLib/doc/overview-frame.html | 46 + IOIOLib/doc/overview-summary.html | 164 + IOIOLib/doc/overview-tree.html | 179 + IOIOLib/doc/package-list | 3 + IOIOLib/doc/resources/inherit.gif | Bin 0 -> 57 bytes IOIOLib/doc/serialized-form.html | 194 + IOIOLib/doc/stylesheet.css | 29 + IOIOLib/javadoc.xml | 6 + IOIOLib/local.properties | 10 + IOIOLib/proguard.cfg | 40 + IOIOLib/project.properties | 12 + IOIOLib/res/.gitignore | 5 + IOIOLib/src/ioio/lib/api/AnalogInput.java | 104 + IOIOLib/src/ioio/lib/api/Closeable.java | 5 + IOIOLib/src/ioio/lib/api/DigitalInput.java | 140 + IOIOLib/src/ioio/lib/api/DigitalOutput.java | 120 + IOIOLib/src/ioio/lib/api/IOIO.java | 638 + IOIOLib/src/ioio/lib/api/IOIOConnection.java | 44 + IOIOLib/src/ioio/lib/api/IOIOFactory.java | 121 + IOIOLib/src/ioio/lib/api/IcspMaster.java | 145 + IOIOLib/src/ioio/lib/api/PulseInput.java | 322 + IOIOLib/src/ioio/lib/api/PwmOutput.java | 126 + IOIOLib/src/ioio/lib/api/SpiMaster.java | 211 + IOIOLib/src/ioio/lib/api/TwiMaster.java | 148 + IOIOLib/src/ioio/lib/api/Uart.java | 108 + .../exception/ConnectionLostException.java | 45 + .../exception/IncompatibilityException.java | 41 + .../api/exception/OutOfResourceException.java | 14 + IOIOLib/src/ioio/lib/impl/AbstractPin.java | 45 + .../src/ioio/lib/impl/AbstractResource.java | 74 + .../src/ioio/lib/impl/AnalogInputImpl.java | 90 + IOIOLib/src/ioio/lib/impl/Constants.java | 45 + .../src/ioio/lib/impl/DigitalInputImpl.java | 91 + .../src/ioio/lib/impl/DigitalOutputImpl.java | 50 + .../lib/impl/FlowControlledOutputStream.java | 128 + .../lib/impl/FlowControlledPacketSender.java | 118 + IOIOLib/src/ioio/lib/impl/IOIOImpl.java | 654 + IOIOLib/src/ioio/lib/impl/IOIOProtocol.java | 798 + IOIOLib/src/ioio/lib/impl/IcspMasterImpl.java | 135 + IOIOLib/src/ioio/lib/impl/IncapImpl.java | 109 + IOIOLib/src/ioio/lib/impl/IncomingState.java | 460 + .../src/ioio/lib/impl/ModuleAllocator.java | 106 + IOIOLib/src/ioio/lib/impl/PinFunctionMap.java | 76 + IOIOLib/src/ioio/lib/impl/PwmImpl.java | 101 + .../src/ioio/lib/impl/QueueInputStream.java | 79 + .../ioio/lib/impl/SocketIOIOConnection.java | 140 + IOIOLib/src/ioio/lib/impl/SpiMasterImpl.java | 198 + IOIOLib/src/ioio/lib/impl/TwiMasterImpl.java | 169 + IOIOLib/src/ioio/lib/impl/UartImpl.java | 107 + .../ioio/lib/util/AbstractIOIOActivity.java | 295 + .../lib/util/IOIOConnectionDiscovery.java | 17 + .../util/SocketIOIOConnectionDiscovery.java | 15 + PitsideConsole/.gitignore | 3 + PitsideConsole/.settings/.jsdtscope | 12 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + PitsideConsole/ArtLib/.gitignore | 2 + PitsideConsole/ArtLib/ArtHTTPServer.cpp | 259 + PitsideConsole/ArtLib/ArtHTTPServer.h | 47 + PitsideConsole/ArtLib/ArtLib.vcxproj | 123 + PitsideConsole/ArtLib/ArtLib.vcxproj.filters | 102 + PitsideConsole/ArtLib/ArtLib.vcxproj.user | 3 + PitsideConsole/ArtLib/ArtNet.cpp | 43 + PitsideConsole/ArtLib/ArtNet.h | 4 + PitsideConsole/ArtLib/ArtSQL/ArtSQLite.cpp | 181 + PitsideConsole/ArtLib/ArtSQL/ArtSQLite.h | 59 + PitsideConsole/ArtLib/ArtSQL/shell.c | 2991 + PitsideConsole/ArtLib/ArtSQL/sqlite3.c | 133612 +++++++++++++++ PitsideConsole/ArtLib/ArtSQL/sqlite3.h | 6949 + PitsideConsole/ArtLib/ArtSQL/sqlite3ext.h | 447 + PitsideConsole/ArtLib/ArtTools.cpp | 169 + PitsideConsole/ArtLib/ArtTools.h | 99 + PitsideConsole/ArtLib/ArtUI.cpp | 158 + PitsideConsole/ArtLib/ArtUI.h | 370 + PitsideConsole/ArtLib/ArtVector.cpp | 18 + PitsideConsole/ArtLib/ArtVector.h | 199 + PitsideConsole/ArtLib/AssemblyInfo.cpp | 40 + PitsideConsole/ArtLib/Assert.h | 4 + PitsideConsole/ArtLib/AutoCS.h | 36 + PitsideConsole/ArtLib/BigNum.h | 142 + PitsideConsole/ArtLib/Multicast.cpp | 120 + PitsideConsole/ArtLib/Multicast.h | 33 + PitsideConsole/ArtLib/ReadMe.txt | 37 + PitsideConsole/ArtLib/letters.png | Bin 0 -> 3091 bytes PitsideConsole/ArtLib/resource.h | 3 + PitsideConsole/ArtLib/stdafx.cpp | 8 + PitsideConsole/ArtLib/stdafx.h | 15 + PitsideConsole/ArtLib/targetver.h | 8 + PitsideConsole/MSBuild/EcmaScript.NET.dll | Bin 0 -> 349696 bytes PitsideConsole/MSBuild/Iesi.Collections.dll | Bin 0 -> 32768 bytes PitsideConsole/MSBuild/MsBuild.xml | 137 + PitsideConsole/MSBuild/New BSD License.txt | 12 + .../Yahoo.Yui.Compressor.Build.MsBuild.dll | Bin 0 -> 21504 bytes .../MSBuild/Yahoo.Yui.Compressor.dll | Bin 0 -> 38400 bytes PitsideConsole/PitsideConsole.sln | 63 + PitsideConsole/PitsideConsole/.gitignore | 3 + PitsideConsole/PitsideConsole/DashWare.cpp | 150 + PitsideConsole/PitsideConsole/DashWare.h | 12 + PitsideConsole/PitsideConsole/DlgAbout.cpp | 37 + PitsideConsole/PitsideConsole/DlgAbout.h | 29 + PitsideConsole/PitsideConsole/DlgMessage.cpp | 332 + PitsideConsole/PitsideConsole/DlgMessage.h | 73 + .../PitsideConsole/DlgPlotSelect.cpp | 1340 + PitsideConsole/PitsideConsole/DlgPlotSelect.h | 151 + PitsideConsole/PitsideConsole/DlgProgress.cpp | 52 + PitsideConsole/PitsideConsole/DlgProgress.h | 40 + .../PitsideConsole/DlgRaceEditConfirm.cpp | 41 + .../PitsideConsole/DlgRaceEditConfirm.h | 29 + .../PitsideConsole/DlgRaceNameEdit.cpp | 61 + .../PitsideConsole/DlgRaceNameEdit.h | 30 + .../PitsideConsole/DlgRaceRerun.cpp | 54 + PitsideConsole/PitsideConsole/DlgRaceRerun.h | 33 + .../PitsideConsole/DlgRaceSelect.cpp | 89 + PitsideConsole/PitsideConsole/DlgRaceSelect.h | 36 + .../PitsideConsole/DlgRaceSelectEdit.cpp | 180 + .../PitsideConsole/DlgRaceSelectEdit.h | 37 + .../PitsideConsole/DlgSelectSessions.cpp | 97 + .../PitsideConsole/DlgSelectSessions.h | 36 + .../PitsideConsole/DlgSetSplits.cpp | 292 + PitsideConsole/PitsideConsole/DlgSetSplits.h | 163 + PitsideConsole/PitsideConsole/DlgSplash.cpp | 50 + PitsideConsole/PitsideConsole/DlgSplash.h | 16 + .../PitsideConsole/DlgTimingScoring.cpp | 855 + .../PitsideConsole/DlgTimingScoring.h | 65 + PitsideConsole/PitsideConsole/DlgWarning.cpp | 41 + PitsideConsole/PitsideConsole/DlgWarning.h | 33 + PitsideConsole/PitsideConsole/Hyperlinks.cpp | 178 + PitsideConsole/PitsideConsole/Hyperlinks.h | 15 + PitsideConsole/PitsideConsole/LapData.cpp | 1008 + PitsideConsole/PitsideConsole/LapData.h | 371 + PitsideConsole/PitsideConsole/LapPainter.cpp | 1667 + PitsideConsole/PitsideConsole/LapPainter.h | 106 + PitsideConsole/PitsideConsole/LapReceiver.cpp | 993 + PitsideConsole/PitsideConsole/LapReceiver.h | 433 + .../PitsideConsole/PitsideConsole.cpp | 3157 + .../PitsideConsole/PitsideConsole.h | 11 + .../PitsideConsole/PitsideConsole.rc | 496 + .../PitsideConsole/PitsideConsole.vcxproj | 183 + .../PitsideConsole.vcxproj.filters | 191 + .../PitsideConsole.vcxproj.user | 6 + PitsideConsole/PitsideConsole/PitsideHTTP.cpp | 477 + PitsideConsole/PitsideConsole/PitsideHTTP.h | 16 + PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 0 -> 1905635 bytes PitsideConsole/PitsideConsole/ReadMe.txt | 40 + PitsideConsole/PitsideConsole/SQLiteLapDB.cpp | 857 + PitsideConsole/PitsideConsole/SQLiteLapDB.h | 64 + PitsideConsole/PitsideConsole/UnitTests.cpp | 63 + PitsideConsole/PitsideConsole/UnitTests.h | 3 + .../WifiLapper Dashware Data Profile.xml | 73 + .../PitsideConsole/WifilapperHelp.pdf | Bin 0 -> 1304122 bytes PitsideConsole/PitsideConsole/copyjs_dbg.bat | 11 + PitsideConsole/PitsideConsole/copyjs_rel.bat | 7 + PitsideConsole/PitsideConsole/drawspline.js | 219 + .../PitsideConsole/dygraphs/dygraph-canvas.js | 1167 + .../PitsideConsole/dygraphs/dygraph-dev.js | 39 + .../PitsideConsole/dygraphs/dygraph-gviz.js | 76 + .../dygraphs/dygraph-interaction-model.js | 611 + .../PitsideConsole/dygraphs/dygraph-layout.js | 413 + .../dygraphs/dygraph-options-reference.js | 815 + .../dygraphs/dygraph-range-selector.js | 727 + .../dygraphs/dygraph-tickers.js | 428 + .../PitsideConsole/dygraphs/dygraph-utils.js | 1007 + .../PitsideConsole/dygraphs/dygraph.js | 3588 + .../PitsideConsole/dygraphs/plugins/README | 92 + .../PitsideConsole/dygraphs/plugins/base.js | 4 + .../dygraphs/plugins/install.js | 4 + .../PitsideConsole/dygraphs/plugins/legend.js | 325 + .../dygraphs/rgbcolor/rgbcolor.js | 252 + .../PitsideConsole/dygraphs/stacktrace.js | 411 + .../PitsideConsole/dygraphs/strftime/Doxyfile | 243 + .../dygraphs/strftime/strftime-min.js | 1 + .../dygraphs/strftime/strftime.js | 731 + PitsideConsole/PitsideConsole/graphPage.html | 147 + PitsideConsole/PitsideConsole/jpge.cpp | 1050 + PitsideConsole/PitsideConsole/jpge.h | 169 + PitsideConsole/PitsideConsole/lapSummary.html | 178 + PitsideConsole/PitsideConsole/lapdata.js | 459 + PitsideConsole/PitsideConsole/lapdistance.php | 18 + PitsideConsole/PitsideConsole/letters.png | Bin 0 -> 3091 bytes PitsideConsole/PitsideConsole/pitside.js | 642 + PitsideConsole/PitsideConsole/res/pitside.ico | Bin 0 -> 12158 bytes PitsideConsole/PitsideConsole/res/splash.bmp | Bin 0 -> 360054 bytes PitsideConsole/PitsideConsole/resource.h | 365 + .../PitsideConsole/runtests_debug.bat | 2 + .../PitsideConsole/runtests_release.bat | 2 + PitsideConsole/PitsideConsole/settings.txt | 15 + PitsideConsole/PitsideConsole/sorttable.js | 495 + PitsideConsole/PitsideConsole/spin.min.js | 2 + PitsideConsole/PitsideConsole/stdafx.cpp | 8 + PitsideConsole/PitsideConsole/stdafx.h | 22 + PitsideConsole/PitsideConsole/targetver.h | 8 + PitsideConsole/PitsideConsole/trackmap.js | 217 + .../PitsideConsole/transformations.txt | 55 + .../PitsideConsole/v21_phonesource.wflp | Bin 0 -> 1324032 bytes .../PitsideConsole/v21_pitsidesource.wflp | Bin 0 -> 10240 bytes PitsideConsole/PitsideConsole/webside.js | 192 + PitsideConsole/PitsideConsole/wifilapper.css | 274 + PitsideConsole/ZLib/.gitignore | 2 + PitsideConsole/ZLib/ReadMe.txt | 29 + PitsideConsole/ZLib/ZLib.vcxproj | 109 + PitsideConsole/ZLib/ZLib.vcxproj.filters | 105 + PitsideConsole/ZLib/ZLib.vcxproj.user | 3 + PitsideConsole/ZLib/adler32.c | 179 + PitsideConsole/ZLib/compress.c | 80 + PitsideConsole/ZLib/crc32.c | 425 + PitsideConsole/ZLib/crc32.h | 441 + PitsideConsole/ZLib/deflate.c | 1965 + PitsideConsole/ZLib/deflate.h | 346 + PitsideConsole/ZLib/gzclose.c | 25 + PitsideConsole/ZLib/gzguts.h | 193 + PitsideConsole/ZLib/gzlib.c | 620 + PitsideConsole/ZLib/gzread.c | 589 + PitsideConsole/ZLib/gzwrite.c | 565 + PitsideConsole/ZLib/infback.c | 640 + PitsideConsole/ZLib/inffast.c | 340 + PitsideConsole/ZLib/inffast.h | 11 + PitsideConsole/ZLib/inffixed.h | 94 + PitsideConsole/ZLib/inflate.c | 1496 + PitsideConsole/ZLib/inflate.h | 122 + PitsideConsole/ZLib/inftrees.c | 306 + PitsideConsole/ZLib/inftrees.h | 62 + PitsideConsole/ZLib/test.h | 0 PitsideConsole/ZLib/trees.c | 1224 + PitsideConsole/ZLib/trees.h | 128 + PitsideConsole/ZLib/uncompr.c | 59 + PitsideConsole/ZLib/zconf.h | 506 + PitsideConsole/ZLib/zlib.h | 1744 + PitsideConsole/ZLib/zutil.c | 324 + PitsideConsole/ZLib/zutil.h | 252 + README | 0 TestApp/.classpath | 9 + TestApp/.gitignore | 2 + TestApp/.project | 33 + TestApp/AndroidManifest.xml | 58 + TestApp/assets/wifilapper_logo.png | Bin 0 -> 151603 bytes TestApp/lint.xml | 3 + TestApp/project.properties | 13 + TestApp/res/drawable-hdpi/icon.png | Bin 0 -> 11700 bytes TestApp/res/drawable-hdpi/obd2.png | Bin 0 -> 3546 bytes TestApp/res/drawable-hdpi/satellite.png | Bin 0 -> 3326 bytes TestApp/res/drawable-hdpi/wifi.png | Bin 0 -> 3334 bytes TestApp/res/drawable-mdpi/icon.png | Bin 0 -> 7988 bytes TestApp/res/drawable-xhdpi/icon.png | Bin 0 -> 16611 bytes TestApp/res/drawable/icon.png | Bin 0 -> 7988 bytes TestApp/res/drawable/iconbig.png | Bin 0 -> 26779 bytes TestApp/res/drawable/ioio_off.png | Bin 0 -> 3005 bytes TestApp/res/drawable/ioio_on.png | Bin 0 -> 2636 bytes TestApp/res/drawable/ioio_troublebad.png | Bin 0 -> 2839 bytes TestApp/res/drawable/ioio_troublegood.png | Bin 0 -> 2732 bytes TestApp/res/drawable/obd2_off.png | Bin 0 -> 3737 bytes TestApp/res/drawable/obd2_on.png | Bin 0 -> 2583 bytes TestApp/res/drawable/obd2_troublebad.png | Bin 0 -> 2892 bytes TestApp/res/drawable/obd2_troublegood.png | Bin 0 -> 2997 bytes TestApp/res/drawable/satellite_off.png | Bin 0 -> 2725 bytes TestApp/res/drawable/satellite_on.png | Bin 0 -> 2380 bytes TestApp/res/drawable/satellite_troublebad.png | Bin 0 -> 2284 bytes .../res/drawable/satellite_troublegood.png | Bin 0 -> 2286 bytes TestApp/res/drawable/tabheader_blue.xml | 9 + TestApp/res/drawable/tabheader_selected.9.png | Bin 0 -> 3470 bytes .../res/drawable/tabheader_unselected.9.png | Bin 0 -> 2618 bytes TestApp/res/drawable/wifi_off.png | Bin 0 -> 2979 bytes TestApp/res/drawable/wifi_on.png | Bin 0 -> 2347 bytes TestApp/res/drawable/wifi_toublebad.png | Bin 0 -> 2755 bytes TestApp/res/drawable/wifi_troublebad.png | Bin 0 -> 2347 bytes TestApp/res/drawable/wifi_troublegood.png | Bin 0 -> 2703 bytes TestApp/res/layout/configureaccel.xml | 271 + TestApp/res/layout/configurecomms.xml | 60 + TestApp/res/layout/configuregps.xml | 34 + TestApp/res/layout/configureioio.xml | 182 + TestApp/res/layout/configureioiofilter.xml | 148 + TestApp/res/layout/configureobd2.xml | 55 + TestApp/res/layout/configurep2p.xml | 64 + TestApp/res/layout/landingdbmanager.xml | 33 + TestApp/res/layout/landingloadrace.xml | 47 + TestApp/res/layout/landingloadrace_item.xml | 70 + TestApp/res/layout/landingnewrace.xml | 87 + TestApp/res/layout/landingoptions.xml | 113 + TestApp/res/layout/landingscreen.xml | 22 + TestApp/res/layout/lapping_demoscreen.xml | 35 + TestApp/res/layout/lapping_gpsview.xml | 22 + TestApp/res/layout/lapping_laptimeview.xml | 23 + TestApp/res/layout/lapping_loading.xml | 28 + .../res/layout/lapping_movetostartline.xml | 27 + .../layout/lapping_startfinishautodraw.xml | 21 + .../res/layout/lapping_startfinishdraw.xml | 21 + TestApp/res/layout/obd2list_item.xml | 4 + TestApp/res/layout/renamedialog.xml | 22 + TestApp/res/layout/settings.xml | 31 + .../res/layout/simplelistitem_blacktext.xml | 8 + .../layout/simplelistitem_defaultcolor.xml | 7 + TestApp/res/layout/summaryscreen.xml | 76 + TestApp/res/menu/closemenu.xml | 3 + TestApp/res/menu/closemenu_lite.xml | 4 + TestApp/res/menu/deleterename.xml | 4 + TestApp/res/menu/loadracemenu.xml | 3 + TestApp/res/menu/raceoptions.xml | 8 + TestApp/res/raw/short_1khz.wav | Bin 0 -> 1646 bytes TestApp/res/values/strings.xml | 57 + .../src/com/artsoft/wifilapper/ApiDemos.java | 2266 + .../artsoft/wifilapper/BetterOpenHelper.java | 70 + .../com/artsoft/wifilapper/BluetoothGPS.java | 441 + .../wifilapper/ComputerChooserActivity.java | 141 + .../artsoft/wifilapper/ComputerFinder.java | 248 + .../ConfigureAccelerometerActivity.java | 559 + .../wifilapper/ConfigureCommunications.java | 89 + .../wifilapper/ConfigureGPSActivity.java | 85 + .../wifilapper/ConfigureIOIOActivity.java | 432 + .../wifilapper/ConfigureIOIOFilter.java | 209 + .../wifilapper/ConfigureOBD2Activity.java | 284 + .../wifilapper/ConfigurePointToPoint.java | 268 + .../src/com/artsoft/wifilapper/FloatRect.java | 60 + .../com/artsoft/wifilapper/IOIOManager.java | 574 + .../artsoft/wifilapper/LandingDBManage.java | 419 + .../artsoft/wifilapper/LandingLoadRace.java | 475 + .../artsoft/wifilapper/LandingNewRace.java | 266 + .../artsoft/wifilapper/LandingOptions.java | 505 + .../artsoft/wifilapper/LandingRaceBase.java | 341 + .../com/artsoft/wifilapper/LandingScreen.java | 165 + .../artsoft/wifilapper/LapAccumulator.java | 1463 + .../src/com/artsoft/wifilapper/LapSender.java | 685 + .../src/com/artsoft/wifilapper/LineSeg.java | 129 + .../com/artsoft/wifilapper/MessageMan.java | 166 + .../src/com/artsoft/wifilapper/OBDThread.java | 841 + .../src/com/artsoft/wifilapper/Point2D.java | 46 + TestApp/src/com/artsoft/wifilapper/Prefs.java | 339 + .../com/artsoft/wifilapper/RaceDatabase.java | 560 + .../artsoft/wifilapper/RaceImageFactory.java | 158 + .../com/artsoft/wifilapper/SMSReceiver.java | 61 + .../com/artsoft/wifilapper/StatusBarView.java | 152 + .../artsoft/wifilapper/SummaryActivity.java | 997 + .../src/com/artsoft/wifilapper/Utility.java | 313 + .../src/com/artsoft/wifilapper/Vector2D.java | 97 + WebUI/graphPage.html | 147 + WebUI/pitside.min.js | 8939 + WebUI/wifilapper.css | 274 + WifiLapperFull/.classpath | 9 + WifiLapperFull/.gitignore | 2 + WifiLapperFull/.project | 33 + .../.settings/org.eclipse.jdt.core.prefs | 4 + WifiLapperFull/AndroidManifest.xml | 100 + WifiLapperFull/proguard.cfg | 40 + WifiLapperFull/project.properties | 14 + WifiLapperLite/.classpath | 9 + WifiLapperLite/.gitignore | 2 + WifiLapperLite/.project | 33 + .../.settings/org.eclipse.jdt.core.prefs | 4 + WifiLapperLite/AndroidManifest.xml | 100 + WifiLapperLite/project.properties | 14 + WifiLapperTablet/.classpath | 8 + WifiLapperTablet/.gitignore | 2 + WifiLapperTablet/.project | 33 + .../.settings/org.eclipse.jdt.core.prefs | 4 + WifiLapperTablet/AndroidManifest.xml | 92 + WifiLapperTablet/proguard.cfg | 40 + WifiLapperTablet/project.properties | 14 + compilerSetup.txt | 14 + 479 files changed, 248564 insertions(+) create mode 100644 .gitignore create mode 100644 .gitignore_global create mode 100644 IOIODiagnostics/.classpath create mode 100644 IOIODiagnostics/.gitignore create mode 100644 IOIODiagnostics/.project create mode 100644 IOIODiagnostics/AndroidManifest.xml create mode 100644 IOIODiagnostics/proguard.cfg create mode 100644 IOIODiagnostics/project.properties create mode 100644 IOIODiagnostics/res/drawable-hdpi/ic_launcher.png create mode 100644 IOIODiagnostics/res/drawable-ldpi/ic_launcher.png create mode 100644 IOIODiagnostics/res/drawable-mdpi/ic_launcher.png create mode 100644 IOIODiagnostics/res/layout/main.xml create mode 100644 IOIODiagnostics/res/values/strings.xml create mode 100644 IOIODiagnostics/src/com/artsoft/IOIODiagnostics/IOIODiagnosticsActivity.java create mode 100644 IOIOLib/.classpath create mode 100644 IOIOLib/.gitignore create mode 100644 IOIOLib/.project create mode 100644 IOIOLib/.settings/org.eclipse.jdt.core.prefs create mode 100644 IOIOLib/AndroidManifest.xml create mode 100644 IOIOLib/build.xml create mode 100644 IOIOLib/doc/allclasses-frame.html create mode 100644 IOIOLib/doc/allclasses-noframe.html create mode 100644 IOIOLib/doc/constant-values.html create mode 100644 IOIOLib/doc/deprecated-list.html create mode 100644 IOIOLib/doc/help-doc.html create mode 100644 IOIOLib/doc/index-files/index-1.html create mode 100644 IOIOLib/doc/index-files/index-10.html create mode 100644 IOIOLib/doc/index-files/index-11.html create mode 100644 IOIOLib/doc/index-files/index-12.html create mode 100644 IOIOLib/doc/index-files/index-13.html create mode 100644 IOIOLib/doc/index-files/index-14.html create mode 100644 IOIOLib/doc/index-files/index-15.html create mode 100644 IOIOLib/doc/index-files/index-16.html create mode 100644 IOIOLib/doc/index-files/index-17.html create mode 100644 IOIOLib/doc/index-files/index-2.html create mode 100644 IOIOLib/doc/index-files/index-3.html create mode 100644 IOIOLib/doc/index-files/index-4.html create mode 100644 IOIOLib/doc/index-files/index-5.html create mode 100644 IOIOLib/doc/index-files/index-6.html create mode 100644 IOIOLib/doc/index-files/index-7.html create mode 100644 IOIOLib/doc/index-files/index-8.html create mode 100644 IOIOLib/doc/index-files/index-9.html create mode 100644 IOIOLib/doc/index.html create mode 100644 IOIOLib/doc/ioio/lib/api/AnalogInput.html create mode 100644 IOIOLib/doc/ioio/lib/api/Closeable.html create mode 100644 IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.Mode.html create mode 100644 IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.html create mode 100644 IOIOLib/doc/ioio/lib/api/DigitalInput.html create mode 100644 IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.Mode.html create mode 100644 IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.html create mode 100644 IOIOLib/doc/ioio/lib/api/DigitalOutput.html create mode 100644 IOIOLib/doc/ioio/lib/api/IOIO.VersionType.html create mode 100644 IOIOLib/doc/ioio/lib/api/IOIO.html create mode 100644 IOIOLib/doc/ioio/lib/api/IOIOConnection.html create mode 100644 IOIOLib/doc/ioio/lib/api/IOIOFactory.html create mode 100644 IOIOLib/doc/ioio/lib/api/IcspMaster.html create mode 100644 IOIOLib/doc/ioio/lib/api/PulseInput.ClockRate.html create mode 100644 IOIOLib/doc/ioio/lib/api/PulseInput.PulseMode.html create mode 100644 IOIOLib/doc/ioio/lib/api/PulseInput.html create mode 100644 IOIOLib/doc/ioio/lib/api/PwmOutput.html create mode 100644 IOIOLib/doc/ioio/lib/api/SpiMaster.Config.html create mode 100644 IOIOLib/doc/ioio/lib/api/SpiMaster.Rate.html create mode 100644 IOIOLib/doc/ioio/lib/api/SpiMaster.Result.html create mode 100644 IOIOLib/doc/ioio/lib/api/SpiMaster.html create mode 100644 IOIOLib/doc/ioio/lib/api/TwiMaster.Rate.html create mode 100644 IOIOLib/doc/ioio/lib/api/TwiMaster.Result.html create mode 100644 IOIOLib/doc/ioio/lib/api/TwiMaster.html create mode 100644 IOIOLib/doc/ioio/lib/api/Uart.Parity.html create mode 100644 IOIOLib/doc/ioio/lib/api/Uart.StopBits.html create mode 100644 IOIOLib/doc/ioio/lib/api/Uart.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/AnalogInput.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/Closeable.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.Mode.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.Mode.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/IOIO.VersionType.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/IOIO.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/IOIOConnection.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/IOIOFactory.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/IcspMaster.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/PulseInput.ClockRate.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/PulseInput.PulseMode.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/PulseInput.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/PwmOutput.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Config.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Rate.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Result.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Rate.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Result.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/Uart.Parity.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/Uart.StopBits.html create mode 100644 IOIOLib/doc/ioio/lib/api/class-use/Uart.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/ConnectionLostException.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/IncompatibilityException.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/OutOfResourceException.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/class-use/ConnectionLostException.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/class-use/IncompatibilityException.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/class-use/OutOfResourceException.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/package-frame.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/package-summary.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/package-tree.html create mode 100644 IOIOLib/doc/ioio/lib/api/exception/package-use.html create mode 100644 IOIOLib/doc/ioio/lib/api/package-frame.html create mode 100644 IOIOLib/doc/ioio/lib/api/package-summary.html create mode 100644 IOIOLib/doc/ioio/lib/api/package-tree.html create mode 100644 IOIOLib/doc/ioio/lib/api/package-use.html create mode 100644 IOIOLib/doc/ioio/lib/util/AbstractIOIOActivity.html create mode 100644 IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.IOIOConnectionSpec.html create mode 100644 IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.html create mode 100644 IOIOLib/doc/ioio/lib/util/SocketIOIOConnectionDiscovery.html create mode 100644 IOIOLib/doc/ioio/lib/util/class-use/AbstractIOIOActivity.html create mode 100644 IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.IOIOConnectionSpec.html create mode 100644 IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.html create mode 100644 IOIOLib/doc/ioio/lib/util/class-use/SocketIOIOConnectionDiscovery.html create mode 100644 IOIOLib/doc/ioio/lib/util/package-frame.html create mode 100644 IOIOLib/doc/ioio/lib/util/package-summary.html create mode 100644 IOIOLib/doc/ioio/lib/util/package-tree.html create mode 100644 IOIOLib/doc/ioio/lib/util/package-use.html create mode 100644 IOIOLib/doc/overview-frame.html create mode 100644 IOIOLib/doc/overview-summary.html create mode 100644 IOIOLib/doc/overview-tree.html create mode 100644 IOIOLib/doc/package-list create mode 100644 IOIOLib/doc/resources/inherit.gif create mode 100644 IOIOLib/doc/serialized-form.html create mode 100644 IOIOLib/doc/stylesheet.css create mode 100644 IOIOLib/javadoc.xml create mode 100644 IOIOLib/local.properties create mode 100644 IOIOLib/proguard.cfg create mode 100644 IOIOLib/project.properties create mode 100644 IOIOLib/res/.gitignore create mode 100644 IOIOLib/src/ioio/lib/api/AnalogInput.java create mode 100644 IOIOLib/src/ioio/lib/api/Closeable.java create mode 100644 IOIOLib/src/ioio/lib/api/DigitalInput.java create mode 100644 IOIOLib/src/ioio/lib/api/DigitalOutput.java create mode 100644 IOIOLib/src/ioio/lib/api/IOIO.java create mode 100644 IOIOLib/src/ioio/lib/api/IOIOConnection.java create mode 100644 IOIOLib/src/ioio/lib/api/IOIOFactory.java create mode 100644 IOIOLib/src/ioio/lib/api/IcspMaster.java create mode 100644 IOIOLib/src/ioio/lib/api/PulseInput.java create mode 100644 IOIOLib/src/ioio/lib/api/PwmOutput.java create mode 100644 IOIOLib/src/ioio/lib/api/SpiMaster.java create mode 100644 IOIOLib/src/ioio/lib/api/TwiMaster.java create mode 100644 IOIOLib/src/ioio/lib/api/Uart.java create mode 100644 IOIOLib/src/ioio/lib/api/exception/ConnectionLostException.java create mode 100644 IOIOLib/src/ioio/lib/api/exception/IncompatibilityException.java create mode 100644 IOIOLib/src/ioio/lib/api/exception/OutOfResourceException.java create mode 100644 IOIOLib/src/ioio/lib/impl/AbstractPin.java create mode 100644 IOIOLib/src/ioio/lib/impl/AbstractResource.java create mode 100644 IOIOLib/src/ioio/lib/impl/AnalogInputImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/Constants.java create mode 100644 IOIOLib/src/ioio/lib/impl/DigitalInputImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/DigitalOutputImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/FlowControlledOutputStream.java create mode 100644 IOIOLib/src/ioio/lib/impl/FlowControlledPacketSender.java create mode 100644 IOIOLib/src/ioio/lib/impl/IOIOImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/IOIOProtocol.java create mode 100644 IOIOLib/src/ioio/lib/impl/IcspMasterImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/IncapImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/IncomingState.java create mode 100644 IOIOLib/src/ioio/lib/impl/ModuleAllocator.java create mode 100644 IOIOLib/src/ioio/lib/impl/PinFunctionMap.java create mode 100644 IOIOLib/src/ioio/lib/impl/PwmImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/QueueInputStream.java create mode 100644 IOIOLib/src/ioio/lib/impl/SocketIOIOConnection.java create mode 100644 IOIOLib/src/ioio/lib/impl/SpiMasterImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/TwiMasterImpl.java create mode 100644 IOIOLib/src/ioio/lib/impl/UartImpl.java create mode 100644 IOIOLib/src/ioio/lib/util/AbstractIOIOActivity.java create mode 100644 IOIOLib/src/ioio/lib/util/IOIOConnectionDiscovery.java create mode 100644 IOIOLib/src/ioio/lib/util/SocketIOIOConnectionDiscovery.java create mode 100644 PitsideConsole/.gitignore create mode 100644 PitsideConsole/.settings/.jsdtscope create mode 100644 PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 PitsideConsole/ArtLib/.gitignore create mode 100644 PitsideConsole/ArtLib/ArtHTTPServer.cpp create mode 100644 PitsideConsole/ArtLib/ArtHTTPServer.h create mode 100644 PitsideConsole/ArtLib/ArtLib.vcxproj create mode 100644 PitsideConsole/ArtLib/ArtLib.vcxproj.filters create mode 100644 PitsideConsole/ArtLib/ArtLib.vcxproj.user create mode 100644 PitsideConsole/ArtLib/ArtNet.cpp create mode 100644 PitsideConsole/ArtLib/ArtNet.h create mode 100644 PitsideConsole/ArtLib/ArtSQL/ArtSQLite.cpp create mode 100644 PitsideConsole/ArtLib/ArtSQL/ArtSQLite.h create mode 100644 PitsideConsole/ArtLib/ArtSQL/shell.c create mode 100644 PitsideConsole/ArtLib/ArtSQL/sqlite3.c create mode 100644 PitsideConsole/ArtLib/ArtSQL/sqlite3.h create mode 100644 PitsideConsole/ArtLib/ArtSQL/sqlite3ext.h create mode 100644 PitsideConsole/ArtLib/ArtTools.cpp create mode 100644 PitsideConsole/ArtLib/ArtTools.h create mode 100644 PitsideConsole/ArtLib/ArtUI.cpp create mode 100644 PitsideConsole/ArtLib/ArtUI.h create mode 100644 PitsideConsole/ArtLib/ArtVector.cpp create mode 100644 PitsideConsole/ArtLib/ArtVector.h create mode 100644 PitsideConsole/ArtLib/AssemblyInfo.cpp create mode 100644 PitsideConsole/ArtLib/Assert.h create mode 100644 PitsideConsole/ArtLib/AutoCS.h create mode 100644 PitsideConsole/ArtLib/BigNum.h create mode 100644 PitsideConsole/ArtLib/Multicast.cpp create mode 100644 PitsideConsole/ArtLib/Multicast.h create mode 100644 PitsideConsole/ArtLib/ReadMe.txt create mode 100644 PitsideConsole/ArtLib/letters.png create mode 100644 PitsideConsole/ArtLib/resource.h create mode 100644 PitsideConsole/ArtLib/stdafx.cpp create mode 100644 PitsideConsole/ArtLib/stdafx.h create mode 100644 PitsideConsole/ArtLib/targetver.h create mode 100644 PitsideConsole/MSBuild/EcmaScript.NET.dll create mode 100644 PitsideConsole/MSBuild/Iesi.Collections.dll create mode 100644 PitsideConsole/MSBuild/MsBuild.xml create mode 100644 PitsideConsole/MSBuild/New BSD License.txt create mode 100644 PitsideConsole/MSBuild/Yahoo.Yui.Compressor.Build.MsBuild.dll create mode 100644 PitsideConsole/MSBuild/Yahoo.Yui.Compressor.dll create mode 100644 PitsideConsole/PitsideConsole.sln create mode 100644 PitsideConsole/PitsideConsole/.gitignore create mode 100644 PitsideConsole/PitsideConsole/DashWare.cpp create mode 100644 PitsideConsole/PitsideConsole/DashWare.h create mode 100644 PitsideConsole/PitsideConsole/DlgAbout.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgAbout.h create mode 100644 PitsideConsole/PitsideConsole/DlgMessage.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgMessage.h create mode 100644 PitsideConsole/PitsideConsole/DlgPlotSelect.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgPlotSelect.h create mode 100644 PitsideConsole/PitsideConsole/DlgProgress.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgProgress.h create mode 100644 PitsideConsole/PitsideConsole/DlgRaceEditConfirm.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgRaceEditConfirm.h create mode 100644 PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgRaceNameEdit.h create mode 100644 PitsideConsole/PitsideConsole/DlgRaceRerun.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgRaceRerun.h create mode 100644 PitsideConsole/PitsideConsole/DlgRaceSelect.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgRaceSelect.h create mode 100644 PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgRaceSelectEdit.h create mode 100644 PitsideConsole/PitsideConsole/DlgSelectSessions.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgSelectSessions.h create mode 100644 PitsideConsole/PitsideConsole/DlgSetSplits.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgSetSplits.h create mode 100644 PitsideConsole/PitsideConsole/DlgSplash.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgSplash.h create mode 100644 PitsideConsole/PitsideConsole/DlgTimingScoring.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgTimingScoring.h create mode 100644 PitsideConsole/PitsideConsole/DlgWarning.cpp create mode 100644 PitsideConsole/PitsideConsole/DlgWarning.h create mode 100644 PitsideConsole/PitsideConsole/Hyperlinks.cpp create mode 100644 PitsideConsole/PitsideConsole/Hyperlinks.h create mode 100644 PitsideConsole/PitsideConsole/LapData.cpp create mode 100644 PitsideConsole/PitsideConsole/LapData.h create mode 100644 PitsideConsole/PitsideConsole/LapPainter.cpp create mode 100644 PitsideConsole/PitsideConsole/LapPainter.h create mode 100644 PitsideConsole/PitsideConsole/LapReceiver.cpp create mode 100644 PitsideConsole/PitsideConsole/LapReceiver.h create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.cpp create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.h create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.rc create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.vcxproj create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.user create mode 100644 PitsideConsole/PitsideConsole/PitsideHTTP.cpp create mode 100644 PitsideConsole/PitsideConsole/PitsideHTTP.h create mode 100644 PitsideConsole/PitsideConsole/PitsideHelp.pdf create mode 100644 PitsideConsole/PitsideConsole/ReadMe.txt create mode 100644 PitsideConsole/PitsideConsole/SQLiteLapDB.cpp create mode 100644 PitsideConsole/PitsideConsole/SQLiteLapDB.h create mode 100644 PitsideConsole/PitsideConsole/UnitTests.cpp create mode 100644 PitsideConsole/PitsideConsole/UnitTests.h create mode 100644 PitsideConsole/PitsideConsole/WifiLapper Dashware Data Profile.xml create mode 100644 PitsideConsole/PitsideConsole/WifilapperHelp.pdf create mode 100644 PitsideConsole/PitsideConsole/copyjs_dbg.bat create mode 100644 PitsideConsole/PitsideConsole/copyjs_rel.bat create mode 100644 PitsideConsole/PitsideConsole/drawspline.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-canvas.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-dev.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-gviz.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-interaction-model.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-layout.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-options-reference.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-range-selector.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-tickers.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph-utils.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/dygraph.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/plugins/README create mode 100644 PitsideConsole/PitsideConsole/dygraphs/plugins/base.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/plugins/install.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/plugins/legend.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/rgbcolor/rgbcolor.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/stacktrace.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/strftime/Doxyfile create mode 100644 PitsideConsole/PitsideConsole/dygraphs/strftime/strftime-min.js create mode 100644 PitsideConsole/PitsideConsole/dygraphs/strftime/strftime.js create mode 100644 PitsideConsole/PitsideConsole/graphPage.html create mode 100644 PitsideConsole/PitsideConsole/jpge.cpp create mode 100644 PitsideConsole/PitsideConsole/jpge.h create mode 100644 PitsideConsole/PitsideConsole/lapSummary.html create mode 100644 PitsideConsole/PitsideConsole/lapdata.js create mode 100644 PitsideConsole/PitsideConsole/lapdistance.php create mode 100644 PitsideConsole/PitsideConsole/letters.png create mode 100644 PitsideConsole/PitsideConsole/pitside.js create mode 100644 PitsideConsole/PitsideConsole/res/pitside.ico create mode 100644 PitsideConsole/PitsideConsole/res/splash.bmp create mode 100644 PitsideConsole/PitsideConsole/resource.h create mode 100644 PitsideConsole/PitsideConsole/runtests_debug.bat create mode 100644 PitsideConsole/PitsideConsole/runtests_release.bat create mode 100644 PitsideConsole/PitsideConsole/settings.txt create mode 100644 PitsideConsole/PitsideConsole/sorttable.js create mode 100644 PitsideConsole/PitsideConsole/spin.min.js create mode 100644 PitsideConsole/PitsideConsole/stdafx.cpp create mode 100644 PitsideConsole/PitsideConsole/stdafx.h create mode 100644 PitsideConsole/PitsideConsole/targetver.h create mode 100644 PitsideConsole/PitsideConsole/trackmap.js create mode 100644 PitsideConsole/PitsideConsole/transformations.txt create mode 100644 PitsideConsole/PitsideConsole/v21_phonesource.wflp create mode 100644 PitsideConsole/PitsideConsole/v21_pitsidesource.wflp create mode 100644 PitsideConsole/PitsideConsole/webside.js create mode 100644 PitsideConsole/PitsideConsole/wifilapper.css create mode 100644 PitsideConsole/ZLib/.gitignore create mode 100644 PitsideConsole/ZLib/ReadMe.txt create mode 100644 PitsideConsole/ZLib/ZLib.vcxproj create mode 100644 PitsideConsole/ZLib/ZLib.vcxproj.filters create mode 100644 PitsideConsole/ZLib/ZLib.vcxproj.user create mode 100644 PitsideConsole/ZLib/adler32.c create mode 100644 PitsideConsole/ZLib/compress.c create mode 100644 PitsideConsole/ZLib/crc32.c create mode 100644 PitsideConsole/ZLib/crc32.h create mode 100644 PitsideConsole/ZLib/deflate.c create mode 100644 PitsideConsole/ZLib/deflate.h create mode 100644 PitsideConsole/ZLib/gzclose.c create mode 100644 PitsideConsole/ZLib/gzguts.h create mode 100644 PitsideConsole/ZLib/gzlib.c create mode 100644 PitsideConsole/ZLib/gzread.c create mode 100644 PitsideConsole/ZLib/gzwrite.c create mode 100644 PitsideConsole/ZLib/infback.c create mode 100644 PitsideConsole/ZLib/inffast.c create mode 100644 PitsideConsole/ZLib/inffast.h create mode 100644 PitsideConsole/ZLib/inffixed.h create mode 100644 PitsideConsole/ZLib/inflate.c create mode 100644 PitsideConsole/ZLib/inflate.h create mode 100644 PitsideConsole/ZLib/inftrees.c create mode 100644 PitsideConsole/ZLib/inftrees.h create mode 100644 PitsideConsole/ZLib/test.h create mode 100644 PitsideConsole/ZLib/trees.c create mode 100644 PitsideConsole/ZLib/trees.h create mode 100644 PitsideConsole/ZLib/uncompr.c create mode 100644 PitsideConsole/ZLib/zconf.h create mode 100644 PitsideConsole/ZLib/zlib.h create mode 100644 PitsideConsole/ZLib/zutil.c create mode 100644 PitsideConsole/ZLib/zutil.h create mode 100644 README create mode 100644 TestApp/.classpath create mode 100644 TestApp/.gitignore create mode 100644 TestApp/.project create mode 100644 TestApp/AndroidManifest.xml create mode 100644 TestApp/assets/wifilapper_logo.png create mode 100644 TestApp/lint.xml create mode 100644 TestApp/project.properties create mode 100644 TestApp/res/drawable-hdpi/icon.png create mode 100644 TestApp/res/drawable-hdpi/obd2.png create mode 100644 TestApp/res/drawable-hdpi/satellite.png create mode 100644 TestApp/res/drawable-hdpi/wifi.png create mode 100644 TestApp/res/drawable-mdpi/icon.png create mode 100644 TestApp/res/drawable-xhdpi/icon.png create mode 100644 TestApp/res/drawable/icon.png create mode 100644 TestApp/res/drawable/iconbig.png create mode 100644 TestApp/res/drawable/ioio_off.png create mode 100644 TestApp/res/drawable/ioio_on.png create mode 100644 TestApp/res/drawable/ioio_troublebad.png create mode 100644 TestApp/res/drawable/ioio_troublegood.png create mode 100644 TestApp/res/drawable/obd2_off.png create mode 100644 TestApp/res/drawable/obd2_on.png create mode 100644 TestApp/res/drawable/obd2_troublebad.png create mode 100644 TestApp/res/drawable/obd2_troublegood.png create mode 100644 TestApp/res/drawable/satellite_off.png create mode 100644 TestApp/res/drawable/satellite_on.png create mode 100644 TestApp/res/drawable/satellite_troublebad.png create mode 100644 TestApp/res/drawable/satellite_troublegood.png create mode 100644 TestApp/res/drawable/tabheader_blue.xml create mode 100644 TestApp/res/drawable/tabheader_selected.9.png create mode 100644 TestApp/res/drawable/tabheader_unselected.9.png create mode 100644 TestApp/res/drawable/wifi_off.png create mode 100644 TestApp/res/drawable/wifi_on.png create mode 100644 TestApp/res/drawable/wifi_toublebad.png create mode 100644 TestApp/res/drawable/wifi_troublebad.png create mode 100644 TestApp/res/drawable/wifi_troublegood.png create mode 100644 TestApp/res/layout/configureaccel.xml create mode 100644 TestApp/res/layout/configurecomms.xml create mode 100644 TestApp/res/layout/configuregps.xml create mode 100644 TestApp/res/layout/configureioio.xml create mode 100644 TestApp/res/layout/configureioiofilter.xml create mode 100644 TestApp/res/layout/configureobd2.xml create mode 100644 TestApp/res/layout/configurep2p.xml create mode 100644 TestApp/res/layout/landingdbmanager.xml create mode 100644 TestApp/res/layout/landingloadrace.xml create mode 100644 TestApp/res/layout/landingloadrace_item.xml create mode 100644 TestApp/res/layout/landingnewrace.xml create mode 100644 TestApp/res/layout/landingoptions.xml create mode 100644 TestApp/res/layout/landingscreen.xml create mode 100644 TestApp/res/layout/lapping_demoscreen.xml create mode 100644 TestApp/res/layout/lapping_gpsview.xml create mode 100644 TestApp/res/layout/lapping_laptimeview.xml create mode 100644 TestApp/res/layout/lapping_loading.xml create mode 100644 TestApp/res/layout/lapping_movetostartline.xml create mode 100644 TestApp/res/layout/lapping_startfinishautodraw.xml create mode 100644 TestApp/res/layout/lapping_startfinishdraw.xml create mode 100644 TestApp/res/layout/obd2list_item.xml create mode 100644 TestApp/res/layout/renamedialog.xml create mode 100644 TestApp/res/layout/settings.xml create mode 100644 TestApp/res/layout/simplelistitem_blacktext.xml create mode 100644 TestApp/res/layout/simplelistitem_defaultcolor.xml create mode 100644 TestApp/res/layout/summaryscreen.xml create mode 100644 TestApp/res/menu/closemenu.xml create mode 100644 TestApp/res/menu/closemenu_lite.xml create mode 100644 TestApp/res/menu/deleterename.xml create mode 100644 TestApp/res/menu/loadracemenu.xml create mode 100644 TestApp/res/menu/raceoptions.xml create mode 100644 TestApp/res/raw/short_1khz.wav create mode 100644 TestApp/res/values/strings.xml create mode 100644 TestApp/src/com/artsoft/wifilapper/ApiDemos.java create mode 100644 TestApp/src/com/artsoft/wifilapper/BetterOpenHelper.java create mode 100644 TestApp/src/com/artsoft/wifilapper/BluetoothGPS.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ComputerChooserActivity.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ComputerFinder.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigureAccelerometerActivity.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigureCommunications.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigureGPSActivity.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigureIOIOActivity.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigureIOIOFilter.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigureOBD2Activity.java create mode 100644 TestApp/src/com/artsoft/wifilapper/ConfigurePointToPoint.java create mode 100644 TestApp/src/com/artsoft/wifilapper/FloatRect.java create mode 100644 TestApp/src/com/artsoft/wifilapper/IOIOManager.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LandingDBManage.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LandingLoadRace.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LandingNewRace.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LandingOptions.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LandingRaceBase.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LandingScreen.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LapAccumulator.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LapSender.java create mode 100644 TestApp/src/com/artsoft/wifilapper/LineSeg.java create mode 100644 TestApp/src/com/artsoft/wifilapper/MessageMan.java create mode 100644 TestApp/src/com/artsoft/wifilapper/OBDThread.java create mode 100644 TestApp/src/com/artsoft/wifilapper/Point2D.java create mode 100644 TestApp/src/com/artsoft/wifilapper/Prefs.java create mode 100644 TestApp/src/com/artsoft/wifilapper/RaceDatabase.java create mode 100644 TestApp/src/com/artsoft/wifilapper/RaceImageFactory.java create mode 100644 TestApp/src/com/artsoft/wifilapper/SMSReceiver.java create mode 100644 TestApp/src/com/artsoft/wifilapper/StatusBarView.java create mode 100644 TestApp/src/com/artsoft/wifilapper/SummaryActivity.java create mode 100644 TestApp/src/com/artsoft/wifilapper/Utility.java create mode 100644 TestApp/src/com/artsoft/wifilapper/Vector2D.java create mode 100644 WebUI/graphPage.html create mode 100644 WebUI/pitside.min.js create mode 100644 WebUI/wifilapper.css create mode 100644 WifiLapperFull/.classpath create mode 100644 WifiLapperFull/.gitignore create mode 100644 WifiLapperFull/.project create mode 100644 WifiLapperFull/.settings/org.eclipse.jdt.core.prefs create mode 100644 WifiLapperFull/AndroidManifest.xml create mode 100644 WifiLapperFull/proguard.cfg create mode 100644 WifiLapperFull/project.properties create mode 100644 WifiLapperLite/.classpath create mode 100644 WifiLapperLite/.gitignore create mode 100644 WifiLapperLite/.project create mode 100644 WifiLapperLite/.settings/org.eclipse.jdt.core.prefs create mode 100644 WifiLapperLite/AndroidManifest.xml create mode 100644 WifiLapperLite/project.properties create mode 100644 WifiLapperTablet/.classpath create mode 100644 WifiLapperTablet/.gitignore create mode 100644 WifiLapperTablet/.project create mode 100644 WifiLapperTablet/.settings/org.eclipse.jdt.core.prefs create mode 100644 WifiLapperTablet/AndroidManifest.xml create mode 100644 WifiLapperTablet/proguard.cfg create mode 100644 WifiLapperTablet/project.properties create mode 100644 compilerSetup.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..638be23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.metadata +PitsideConsole/PitsideConsole.opensdf +PitsideConsole/PitsideConsole.sdf +PitsideConsole/PitsideConsole.suo \ No newline at end of file diff --git a/.gitignore_global b/.gitignore_global new file mode 100644 index 0000000..81cf80b --- /dev/null +++ b/.gitignore_global @@ -0,0 +1,3 @@ +*.suo +*.opensdf +*.sdf \ No newline at end of file diff --git a/IOIODiagnostics/.classpath b/IOIODiagnostics/.classpath new file mode 100644 index 0000000..5e69ff8 --- /dev/null +++ b/IOIODiagnostics/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/IOIODiagnostics/.gitignore b/IOIODiagnostics/.gitignore new file mode 100644 index 0000000..1ec69fa --- /dev/null +++ b/IOIODiagnostics/.gitignore @@ -0,0 +1,2 @@ +bin/ +gen/ \ No newline at end of file diff --git a/IOIODiagnostics/.project b/IOIODiagnostics/.project new file mode 100644 index 0000000..c6a1cb6 --- /dev/null +++ b/IOIODiagnostics/.project @@ -0,0 +1,33 @@ + + + IOIODiagnostics + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/IOIODiagnostics/AndroidManifest.xml b/IOIODiagnostics/AndroidManifest.xml new file mode 100644 index 0000000..78879bf --- /dev/null +++ b/IOIODiagnostics/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOIODiagnostics/proguard.cfg b/IOIODiagnostics/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/IOIODiagnostics/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/IOIODiagnostics/project.properties b/IOIODiagnostics/project.properties new file mode 100644 index 0000000..1d42606 --- /dev/null +++ b/IOIODiagnostics/project.properties @@ -0,0 +1,13 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 +android.library=false +android.library.reference.1=../IOIOLib diff --git a/IOIODiagnostics/res/drawable-hdpi/ic_launcher.png b/IOIODiagnostics/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8074c4c571b8cd19e27f4ee5545df367420686d7 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 diff --git a/IOIODiagnostics/res/drawable-ldpi/ic_launcher.png b/IOIODiagnostics/res/drawable-ldpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1095584ec21f71cd0afc9e0993aa2209671b590c GIT binary patch literal 1723 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/IOIODiagnostics/res/values/strings.xml b/IOIODiagnostics/res/values/strings.xml new file mode 100644 index 0000000..e6130db --- /dev/null +++ b/IOIODiagnostics/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + Hello World, IOIODiagnosticsActivity! + IOIODiagnostics + + \ No newline at end of file diff --git a/IOIODiagnostics/src/com/artsoft/IOIODiagnostics/IOIODiagnosticsActivity.java b/IOIODiagnostics/src/com/artsoft/IOIODiagnostics/IOIODiagnosticsActivity.java new file mode 100644 index 0000000..286ed15 --- /dev/null +++ b/IOIODiagnostics/src/com/artsoft/IOIODiagnostics/IOIODiagnosticsActivity.java @@ -0,0 +1,517 @@ +// Copyright 2011-2012, Art Hare +// This file is part of IOIODiagnostics. + +//IOIODiagnostics is free software: you can redistribute it and/or modify +//it under the terms of the GNU General Public License as published by +//the Free Software Foundation, either version 3 of the License, or +//(at your option) any later version. + +//WifiLapper 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 WifiLapper. If not, see . + + +// a simple activity to view the IOIO's inputs +package com.artsoft.IOIODiagnostics; + +import java.text.NumberFormat; +import java.util.Timer; +import java.util.TimerTask; + +import ioio.lib.api.AnalogInput; +import ioio.lib.api.DigitalInput; +import ioio.lib.api.DigitalOutput; +import ioio.lib.api.IOIO; +import ioio.lib.api.IOIOFactory; +import ioio.lib.api.IcspMaster; +import ioio.lib.api.PulseInput; +import ioio.lib.api.PwmOutput; +import ioio.lib.api.SpiMaster; +import ioio.lib.api.TwiMaster; +import ioio.lib.api.Uart; +import ioio.lib.api.IOIO.VersionType; +import ioio.lib.api.PulseInput.PulseMode; +import ioio.lib.api.TwiMaster.Rate; +import ioio.lib.api.Uart.Parity; +import ioio.lib.api.Uart.StopBits; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.api.exception.IncompatibilityException; +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.ProgressBar; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.Toast; + +public class IOIODiagnosticsActivity extends Activity implements Handler.Callback, OnClickListener +{ + private IOIO m_ioio; + + private PinWrapper m_pins[]; + private Handler m_handler; + + private float m_rgValues[] = new float[48]; + + private static final int MSG_CONNECTATTEMPTDONE = 50; + private static final int MSG_REFRESHED = 51; + + @Override + public void onCreate(Bundle extras) + { + super.onCreate(extras); + m_handler = new Handler(this); + m_pins = new PinWrapper[48]; + m_ioio = IOIOFactory.create(); + //m_ioio = new FakeIOIO(); + + ConnectThread ct = new ConnectThread(m_ioio, m_handler); + ct.start(); + + Timer t = new Timer(); + t.scheduleAtFixedRate(new CheckerTask(), 100, 33); + + this.setContentView(R.layout.main); + } + + private class CheckerTask extends TimerTask + { + private float flMin = 1e30f; + private float flMax = -1e30f; + @Override + public void run() + { + try + { + for(int x = 31; x <= 39; x++) + { + if(m_pins[x] != null) + { + m_rgValues[x] = m_pins[x].GetValue(); + } + + } + m_handler.sendEmptyMessage(MSG_REFRESHED); + } + catch(Exception e) + { + Toast.makeText(IOIODiagnosticsActivity.this, "Failed to get value", Toast.LENGTH_LONG).show(); + } + + } + + } + public static String FormatFloat(float fl, int digits) + { + NumberFormat num = NumberFormat.getInstance(); + num.setMaximumFractionDigits(digits); + num.setMinimumFractionDigits(digits); + return num.format(fl); + } + + @Override + public boolean handleMessage(Message msg) + { + final int rgPinLabels[] = {R.id.lblPin31, + R.id.lblPin32, + R.id.lblPin33, + R.id.lblPin34, + R.id.lblPin35, + R.id.lblPin36, + R.id.lblPin37, + R.id.lblPin38, + R.id.lblPin39 + }; + final int rgSeeks[] = {R.id.seek31, + R.id.seek32, + R.id.seek33, + R.id.seek34, + R.id.seek35, + R.id.seek36, + R.id.seek37, + R.id.seek38, + R.id.seek39}; + + final int rgLabels[] = {R.id.label31, + R.id.label32, + R.id.label33, + R.id.label34, + R.id.label35, + R.id.label36, + R.id.label37, + R.id.label38, + R.id.label39}; + + if(msg.what == MSG_CONNECTATTEMPTDONE) + { + // they've finished attempting to connect to the IOIO, so let's populate all our pins + for(int x = 31; x <= 39; x++) + { + try{ + m_pins[x] = new PinWrapper(m_ioio,x,false); + } + catch(Exception e) + { + // oh well, couldn't connect this pin + m_pins[x] = null; + } + + TextView pinLabel = (TextView)findViewById(rgPinLabels[x-31]); + pinLabel.setOnClickListener(this); + } + + } + else if(msg.what == MSG_REFRESHED) + { + + for(int x = 0;x < rgSeeks.length;x++) + { + SeekBar seek = (SeekBar)findViewById(rgSeeks[x]); + TextView txt = (TextView)findViewById(rgLabels[x]); + TextView pinLabel = (TextView)findViewById(rgPinLabels[x]); + + if(m_pins[x+31] != null && m_pins[x+31].IsPulse()) + { + seek.setMax(100); + seek.setProgress((int)m_rgValues[x+31]); + txt.setText(FormatFloat(m_rgValues[x+31],2) + "hz"); + pinLabel.setText("Pulse " + (x+31)); + } + else if(m_pins[x+31] != null) + { + seek.setMax(500); + seek.setProgress((int)(m_rgValues[x+31]*100)); + + txt.setText(FormatFloat(m_rgValues[x+31],2) + "V"); + pinLabel.setText("Analog " + (x+31)); + } + else + { + pinLabel.setText("No signal"); + } + } + } + return false; + } + + + private class ConnectThread extends Thread + { + private IOIO m_ioio; + private Handler m_handler; + + public ConnectThread(IOIO ioio, Handler handler) + { + m_ioio = ioio; + m_handler = handler; + } + + @Override + public void run() + { + boolean fSuccess = false; + try + { + m_ioio.waitForConnect(); + fSuccess = true; + } + catch (ConnectionLostException e) {} + catch (IncompatibilityException e) {} + finally + { + m_handler.sendEmptyMessage(MSG_CONNECTATTEMPTDONE); + } + } + } + + // class that wraps either an analog pin or a pulse pin, simplifying the main class's logic + private static class PinWrapper + { + private AnalogInput m_analog; + private PulseInput m_pulse; + private IOIO m_ioio; + private int m_pinNumber; + + public PinWrapper(IOIO ioio, int pinNumber, boolean fPulse) throws ConnectionLostException + { + m_ioio = ioio; + m_pinNumber = pinNumber; + InitPin(fPulse); + } + public boolean IsPulse() + { + return m_pulse != null; + } + private void InitPin(boolean fPulse) throws ConnectionLostException + { + if(m_analog != null) + { + m_analog.close(); + m_analog = null; + } + if(m_pulse != null) + { + m_pulse.close(); + m_pulse = null; + } + + if(fPulse) + { + m_pulse = m_ioio.openPulseInput(m_pinNumber, PulseMode.FREQ); + } + else + { + m_analog = m_ioio.openAnalogInput(m_pinNumber); + } + } + public void SetPinParams(boolean fPulse) throws ConnectionLostException + { + InitPin(fPulse); + } + + public float GetValue() throws ConnectionLostException,InterruptedException + { + if(m_analog != null) + { + return m_analog.getVoltage(); + } + else if(m_pulse != null) + { + return m_pulse.getFrequency(); + } + else + { + return 0; + } + } + + } + @Override + public void onClick(View arg0) + { + int ix = 0; + switch(arg0.getId()) + { + case R.id.lblPin31: ix = 31; break; + case R.id.lblPin32: ix = 32; break; + case R.id.lblPin33: ix = 33; break; + case R.id.lblPin34: ix = 34; break; + case R.id.lblPin35: ix = 35; break; + case R.id.lblPin36: ix = 36; break; + case R.id.lblPin37: ix = 37; break; + case R.id.lblPin38: ix = 38; break; + case R.id.lblPin39: ix = 39; break; + } + if(ix >= 31 && m_pins[ix] != null) + { + try + { + m_pins[ix].SetPinParams(!m_pins[ix].IsPulse()); + } + catch(Exception e) + { + Toast.makeText(this, "Failed to switch pin type", Toast.LENGTH_LONG).show(); + } + } + + } + +} + +class FakeIOIO implements IOIO +{ + public void waitForConnect() throws ConnectionLostException, + IncompatibilityException + { + try + { + Thread.sleep(500); + } + catch(InterruptedException e) + { + + } + return; + } + + public void disconnect() + { + return; + } + public void waitForDisconnect() throws InterruptedException + { + return; + } + public void softReset() throws ConnectionLostException + { + return; + } + public void hardReset() throws ConnectionLostException + { + return; + } + public String getImplVersion(VersionType v) throws ConnectionLostException + { + return ""; + } + public DigitalInput openDigitalInput(DigitalInput.Spec spec) + throws ConnectionLostException + { + return null; + } + public DigitalInput openDigitalInput(int pin) + throws ConnectionLostException + { + return null; + } + public DigitalInput openDigitalInput(int pin, DigitalInput.Spec.Mode mode) + throws ConnectionLostException + { + return null; + } + public DigitalOutput openDigitalOutput(DigitalOutput.Spec spec, + boolean startValue) throws ConnectionLostException + { + return null; + } + public DigitalOutput openDigitalOutput(int pin, + DigitalOutput.Spec.Mode mode, boolean startValue)throws ConnectionLostException + { + return null; + } + + public DigitalOutput openDigitalOutput(int pin, boolean startValue) + throws ConnectionLostException + { + return null; + } + public DigitalOutput openDigitalOutput(int pin) + throws ConnectionLostException + { + return null; + } + public AnalogInput openAnalogInput(int pin) throws ConnectionLostException + { + return new FakeAnalogInput(pin); + } + public PwmOutput openPwmOutput(DigitalOutput.Spec spec, int freqHz) + throws ConnectionLostException + { + return null; + } + public PwmOutput openPwmOutput(int pin, int freqHz) + throws ConnectionLostException + { + return null; + } + public PulseInput openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, PulseInput.PulseMode mode, + boolean doublePrecision) throws ConnectionLostException + { + return null; + } + public PulseInput openPulseInput(int pin, PulseMode mode) + throws ConnectionLostException + { + return new FakePulseInput(pin); + } + public Uart openUart(DigitalInput.Spec rx, DigitalOutput.Spec tx, int baud, + Parity parity, StopBits stopbits) throws ConnectionLostException + { + return null; + } + public Uart openUart(int rx, int tx, int baud, Parity parity, + StopBits stopbits) throws ConnectionLostException + { + return null; + } + public SpiMaster openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, SpiMaster.Config config)throws ConnectionLostException + { + return null; + } + + public SpiMaster openSpiMaster(int miso, int mosi, int clk, + int[] slaveSelect, SpiMaster.Rate rate) + throws ConnectionLostException + { + return null; + } + + public SpiMaster openSpiMaster(int miso, int mosi, int clk, + int slaveSelect, SpiMaster.Rate rate) + throws ConnectionLostException + { + return null; + } + public TwiMaster openTwiMaster(int twiNum, Rate rate, boolean smbus) + throws ConnectionLostException + { + return null; + } + public IcspMaster openIcspMaster() throws ConnectionLostException + { + return null; + } + + private class FakeAnalogInput implements AnalogInput + { + private int pin; + public FakeAnalogInput(int pin) + { + this.pin = pin; + } + @Override + public void close() {} + + @Override + public float getReference() {return 0;} + + @Override + public float getVoltage() throws InterruptedException,ConnectionLostException + { + double dTime = (System.currentTimeMillis()%10000) / 10000.0; + return (float)(Math.sin(dTime * pin) * 2 + 2.5); + } + + @Override + public float read() throws InterruptedException, ConnectionLostException + { + double dTime = (System.currentTimeMillis()%10000) / 10000.0; + return (float)(Math.sin(dTime * pin) * 2 + 2.5); + } + } + private class FakePulseInput implements PulseInput + { + private int pin; + public FakePulseInput(int pin) + { + this.pin = pin; + } + @Override + public void close() {} + @Override + public float getDuration() throws InterruptedException,ConnectionLostException + { + return 0; + } + @Override + public float getFrequency() throws InterruptedException,ConnectionLostException + { + return (float)(((System.currentTimeMillis()%10000) / 10000.0) * pin); + } + @Override + public float waitPulseGetDuration() throws InterruptedException,ConnectionLostException + { + return 0; + } + } +} diff --git a/IOIOLib/.classpath b/IOIOLib/.classpath new file mode 100644 index 0000000..a662f00 --- /dev/null +++ b/IOIOLib/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/IOIOLib/.gitignore b/IOIOLib/.gitignore new file mode 100644 index 0000000..1ec69fa --- /dev/null +++ b/IOIOLib/.gitignore @@ -0,0 +1,2 @@ +bin/ +gen/ \ No newline at end of file diff --git a/IOIOLib/.project b/IOIOLib/.project new file mode 100644 index 0000000..196f1c5 --- /dev/null +++ b/IOIOLib/.project @@ -0,0 +1,33 @@ + + + IOIOLib + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/IOIOLib/.settings/org.eclipse.jdt.core.prefs b/IOIOLib/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8000cd6 --- /dev/null +++ b/IOIOLib/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/IOIOLib/AndroidManifest.xml b/IOIOLib/AndroidManifest.xml new file mode 100644 index 0000000..dd1ec24 --- /dev/null +++ b/IOIOLib/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/IOIOLib/build.xml b/IOIOLib/build.xml new file mode 100644 index 0000000..4fc1ec4 --- /dev/null +++ b/IOIOLib/build.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IOIOLib/doc/allclasses-frame.html b/IOIOLib/doc/allclasses-frame.html new file mode 100644 index 0000000..0a58d5a --- /dev/null +++ b/IOIOLib/doc/allclasses-frame.html @@ -0,0 +1,97 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
AbstractIOIOActivity +
+AnalogInput +
+Closeable +
+ConnectionLostException +
+DigitalInput +
+DigitalInput.Spec +
+DigitalInput.Spec.Mode +
+DigitalOutput +
+DigitalOutput.Spec +
+DigitalOutput.Spec.Mode +
+IcspMaster +
+IncompatibilityException +
+IOIO +
+IOIO.VersionType +
+IOIOConnection +
+IOIOConnectionDiscovery +
+IOIOConnectionDiscovery.IOIOConnectionSpec +
+IOIOFactory +
+OutOfResourceException +
+PulseInput +
+PulseInput.ClockRate +
+PulseInput.PulseMode +
+PwmOutput +
+SocketIOIOConnectionDiscovery +
+SpiMaster +
+SpiMaster.Config +
+SpiMaster.Rate +
+SpiMaster.Result +
+TwiMaster +
+TwiMaster.Rate +
+TwiMaster.Result +
+Uart +
+Uart.Parity +
+Uart.StopBits +
+
+ + + diff --git a/IOIOLib/doc/allclasses-noframe.html b/IOIOLib/doc/allclasses-noframe.html new file mode 100644 index 0000000..40b2aaa --- /dev/null +++ b/IOIOLib/doc/allclasses-noframe.html @@ -0,0 +1,97 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
AbstractIOIOActivity +
+AnalogInput +
+Closeable +
+ConnectionLostException +
+DigitalInput +
+DigitalInput.Spec +
+DigitalInput.Spec.Mode +
+DigitalOutput +
+DigitalOutput.Spec +
+DigitalOutput.Spec.Mode +
+IcspMaster +
+IncompatibilityException +
+IOIO +
+IOIO.VersionType +
+IOIOConnection +
+IOIOConnectionDiscovery +
+IOIOConnectionDiscovery.IOIOConnectionSpec +
+IOIOFactory +
+OutOfResourceException +
+PulseInput +
+PulseInput.ClockRate +
+PulseInput.PulseMode +
+PwmOutput +
+SocketIOIOConnectionDiscovery +
+SpiMaster +
+SpiMaster.Config +
+SpiMaster.Rate +
+SpiMaster.Result +
+TwiMaster +
+TwiMaster.Rate +
+TwiMaster.Result +
+Uart +
+Uart.Parity +
+Uart.StopBits +
+
+ + + diff --git a/IOIOLib/doc/constant-values.html b/IOIOLib/doc/constant-values.html new file mode 100644 index 0000000..0550057 --- /dev/null +++ b/IOIOLib/doc/constant-values.html @@ -0,0 +1,198 @@ + + + + + + +Constant Field Values + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + +
+ +
+ + + +
+
+

+Constant Field Values

+
+
+Contents + + + + + + +
+ioio.lib.*
+ +

+ + + + + + + + + + + + + + + + + +
ioio.lib.api.IOIO
+public static final intINVALID_PIN-1
+public static final intLED_PIN0
+ +

+ +

+ + + + + + + + + + + + +
ioio.lib.api.IOIOFactory
+public static final intIOIO_PORT4545
+ +

+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/deprecated-list.html b/IOIOLib/doc/deprecated-list.html new file mode 100644 index 0000000..fdfdaa9 --- /dev/null +++ b/IOIOLib/doc/deprecated-list.html @@ -0,0 +1,146 @@ + + + + + + +Deprecated List + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/help-doc.html b/IOIOLib/doc/help-doc.html new file mode 100644 index 0000000..12529cb --- /dev/null +++ b/IOIOLib/doc/help-doc.html @@ -0,0 +1,223 @@ + + + + + + +API Help + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Overview

+
+ +

+The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.

+

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Use

+
+Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.
+

+Tree (Class Hierarchy)

+
+There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.
    +
  • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
  • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Index

+
+The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/index-files/index-1.html b/IOIOLib/doc/index-files/index-1.html new file mode 100644 index 0000000..6ba87cc --- /dev/null +++ b/IOIOLib/doc/index-files/index-1.html @@ -0,0 +1,148 @@ + + + + + + +A-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+A

+
+
AbstractIOIOActivity - Class in ioio.lib.util
A convenience class for easy creation of IOIO-based applications.
AbstractIOIOActivity() - +Constructor for class ioio.lib.util.AbstractIOIOActivity +
  +
AnalogInput - Interface in ioio.lib.api
A pin used for analog input.
args - +Variable in class ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec +
  +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-10.html b/IOIOLib/doc/index-files/index-10.html new file mode 100644 index 0000000..8b3de9a --- /dev/null +++ b/IOIOLib/doc/index-files/index-10.html @@ -0,0 +1,212 @@ + + + + + + +O-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+O

+
+
openAnalogInput(int) - +Method in interface ioio.lib.api.IOIO +
Open a pin for analog input. +
openDigitalInput(DigitalInput.Spec) - +Method in interface ioio.lib.api.IOIO +
Open a pin for digital input. +
openDigitalInput(int) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openDigitalInput(new DigitalInput.Spec(pin)). +
openDigitalInput(int, DigitalInput.Spec.Mode) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)). +
openDigitalOutput(DigitalOutput.Spec, boolean) - +Method in interface ioio.lib.api.IOIO +
Open a pin for digital output. +
openDigitalOutput(int, DigitalOutput.Spec.Mode, boolean) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + startValue). +
openDigitalOutput(int, boolean) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), startValue). +
openDigitalOutput(int) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), false). +
openIcspMaster() - +Method in interface ioio.lib.api.IOIO +
Open an ICSP channel, enabling Flash programming of an external PIC MCU, + and in particular, another IOIO board. +
openPulseInput(DigitalInput.Spec, PulseInput.ClockRate, PulseInput.PulseMode, boolean) - +Method in interface ioio.lib.api.IOIO +
Open a pin for pulse input. +
openPulseInput(int, PulseInput.PulseMode) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + true), i.e. +
openPwmOutput(DigitalOutput.Spec, int) - +Method in interface ioio.lib.api.IOIO +
Open a pin for PWM (Pulse-Width Modulation) output. +
openPwmOutput(int, int) - +Method in interface ioio.lib.api.IOIO +
Shorthand for openPwmOutput(new DigitalOutput.Spec(pin), freqHz). +
openSpiMaster(DigitalInput.Spec, DigitalOutput.Spec, DigitalOutput.Spec, DigitalOutput.Spec[], SpiMaster.Config) - +Method in interface ioio.lib.api.IOIO +
Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules. +
openSpiMaster(int, int, int, int[], SpiMaster.Rate) - +Method in interface ioio.lib.api.IOIO +
Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the pins are all open with the default modes and default configuration values are used. +
openSpiMaster(int, int, int, int, SpiMaster.Rate) - +Method in interface ioio.lib.api.IOIO +
Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the MISO pins is opened with pull up, and the other pins are open + with the default modes and default configuration values are used. +
openTwiMaster(int, TwiMaster.Rate, boolean) - +Method in interface ioio.lib.api.IOIO +
Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + enabling communication with multiple TWI-enabled slave modules. +
openUart(DigitalInput.Spec, DigitalOutput.Spec, int, Uart.Parity, Uart.StopBits) - +Method in interface ioio.lib.api.IOIO +
Open a UART module, enabling a bulk transfer of byte buffers. +
openUart(int, int, int, Uart.Parity, Uart.StopBits) - +Method in interface ioio.lib.api.IOIO +
Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs. +
OutOfResourceException - Exception in ioio.lib.api.exception
The IOIO board does not have anymore of the requested resource.
OutOfResourceException(String) - +Constructor for exception ioio.lib.api.exception.OutOfResourceException +
  +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-11.html b/IOIOLib/doc/index-files/index-11.html new file mode 100644 index 0000000..1949977 --- /dev/null +++ b/IOIOLib/doc/index-files/index-11.html @@ -0,0 +1,148 @@ + + + + + + +P-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+P

+
+
pin - +Variable in class ioio.lib.api.DigitalInput.Spec +
The pin number, as labeled on the board. +
pin - +Variable in class ioio.lib.api.DigitalOutput.Spec +
The pin number, as labeled on the board. +
PulseInput - Interface in ioio.lib.api
An interface for pulse width and frequency measurements of digital signals.
PulseInput.ClockRate - Enum in ioio.lib.api
Suported clock rate enum.
PulseInput.PulseMode - Enum in ioio.lib.api
An enumeration for describing the module's operating mode.
PwmOutput - Interface in ioio.lib.api
A pin used for PWM (Pulse-Width Modulation) output.
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-12.html b/IOIOLib/doc/index-files/index-12.html new file mode 100644 index 0000000..46c8198 --- /dev/null +++ b/IOIOLib/doc/index-files/index-12.html @@ -0,0 +1,154 @@ + + + + + + +R-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+R

+
+
rate - +Variable in class ioio.lib.api.SpiMaster.Config +
Data rate. +
read() - +Method in interface ioio.lib.api.AnalogInput +
Gets the analog input reading, as a scaled real value between 0 and 1. +
read() - +Method in interface ioio.lib.api.DigitalInput +
Read the value sensed on the pin. +
readVisi() - +Method in interface ioio.lib.api.IcspMaster +
Request a read of the VISI register on the slave MCU. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-13.html b/IOIOLib/doc/index-files/index-13.html new file mode 100644 index 0000000..6215dce --- /dev/null +++ b/IOIOLib/doc/index-files/index-13.html @@ -0,0 +1,173 @@ + + + + + + +S-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+S

+
+
sampleOnTrailing - +Variable in class ioio.lib.api.SpiMaster.Config +
Whether to do the input and output sampling on the trailing clock + edge. +
scaling - +Variable in enum ioio.lib.api.PulseInput.PulseMode +
The scaling factor as an integer. +
setDutyCycle(float) - +Method in interface ioio.lib.api.PwmOutput +
Sets the duty cycle of the PWM output. +
setPulseWidth(int) - +Method in interface ioio.lib.api.PwmOutput +
Sets the pulse width of the PWM output. +
setPulseWidth(float) - +Method in interface ioio.lib.api.PwmOutput +
The same as PwmOutput.setPulseWidth(int), but with sub-microsecond + precision. +
SocketIOIOConnectionDiscovery - Class in ioio.lib.util
 
SocketIOIOConnectionDiscovery() - +Constructor for class ioio.lib.util.SocketIOIOConnectionDiscovery +
  +
softReset() - +Method in interface ioio.lib.api.IOIO +
Resets the entire state (returning to initial state), without dropping + the connection. +
SpiMaster - Interface in ioio.lib.api
An interface for controlling an SPI module, in SPI bus-master mode, enabling + communication with multiple SPI-enabled slave modules.
SpiMaster.Config - Class in ioio.lib.api
SPI configuration structure.
SpiMaster.Config(SpiMaster.Rate, boolean, boolean) - +Constructor for class ioio.lib.api.SpiMaster.Config +
Constructor. +
SpiMaster.Config(SpiMaster.Rate) - +Constructor for class ioio.lib.api.SpiMaster.Config +
Constructor with common defaults. +
SpiMaster.Rate - Enum in ioio.lib.api
Possible data rates for SPI, in Hz.
SpiMaster.Result - Interface in ioio.lib.api
An object that can be waited on for asynchronous calls.
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-14.html b/IOIOLib/doc/index-files/index-14.html new file mode 100644 index 0000000..b43df85 --- /dev/null +++ b/IOIOLib/doc/index-files/index-14.html @@ -0,0 +1,143 @@ + + + + + + +T-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+T

+
+
TwiMaster - Interface in ioio.lib.api
An interface for controlling a TWI module, in TWI bus-master mode, enabling + communication with multiple TWI-enabled slave modules.
TwiMaster.Rate - Enum in ioio.lib.api
 
TwiMaster.Result - Interface in ioio.lib.api
An object that can be waited on for asynchronous calls.
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-15.html b/IOIOLib/doc/index-files/index-15.html new file mode 100644 index 0000000..cd553fe --- /dev/null +++ b/IOIOLib/doc/index-files/index-15.html @@ -0,0 +1,142 @@ + + + + + + +U-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+U

+
+
Uart - Interface in ioio.lib.api
An interface for controlling a UART module.
Uart.Parity - Enum in ioio.lib.api
Parity-bit mode.
Uart.StopBits - Enum in ioio.lib.api
Number of stop-bits.
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-16.html b/IOIOLib/doc/index-files/index-16.html new file mode 100644 index 0000000..db5fab8 --- /dev/null +++ b/IOIOLib/doc/index-files/index-16.html @@ -0,0 +1,205 @@ + + + + + + +V-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+V

+
+
valueOf(String) - +Static method in enum ioio.lib.api.DigitalInput.Spec.Mode +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.DigitalOutput.Spec.Mode +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.IOIO.VersionType +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.PulseInput.ClockRate +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.PulseInput.PulseMode +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.SpiMaster.Rate +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.TwiMaster.Rate +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.Uart.Parity +
Returns the enum constant of this type with the specified name. +
valueOf(String) - +Static method in enum ioio.lib.api.Uart.StopBits +
Returns the enum constant of this type with the specified name. +
values() - +Static method in enum ioio.lib.api.DigitalInput.Spec.Mode +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.DigitalOutput.Spec.Mode +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.IOIO.VersionType +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.PulseInput.ClockRate +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.PulseInput.PulseMode +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.SpiMaster.Rate +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.TwiMaster.Rate +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.Uart.Parity +
Returns an array containing the constants of this enum type, in +the order they are declared. +
values() - +Static method in enum ioio.lib.api.Uart.StopBits +
Returns an array containing the constants of this enum type, in +the order they are declared. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-17.html b/IOIOLib/doc/index-files/index-17.html new file mode 100644 index 0000000..151f190 --- /dev/null +++ b/IOIOLib/doc/index-files/index-17.html @@ -0,0 +1,193 @@ + + + + + + +W-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+W

+
+
waitForConnect() - +Method in interface ioio.lib.api.IOIO +
Establishes connection with the IOIO board. +
waitForConnect() - +Method in interface ioio.lib.api.IOIOConnection +
  +
waitForDisconnect() - +Method in interface ioio.lib.api.IOIO +
Blocks until IOIO has been disconnected and all connection-related + resources have been freed, so that a new connection can be attempted. +
waitForValue(boolean) - +Method in interface ioio.lib.api.DigitalInput +
Block until a desired logical level is sensed. +
waitPulseGetDuration() - +Method in interface ioio.lib.api.PulseInput +
Reads a single measurement from the queue. +
waitReady() - +Method in interface ioio.lib.api.SpiMaster.Result +
Wait until the asynchronous call which returned this instance is + complete. +
waitReady() - +Method in interface ioio.lib.api.TwiMaster.Result +
Wait until the asynchronous call which returned this instance is + complete. +
waitVisiResult() - +Method in interface ioio.lib.api.IcspMaster +
Wait and return a result of a call to IcspMaster.readVisi(). +
write(boolean) - +Method in interface ioio.lib.api.DigitalOutput +
Set the output of the pin. +
writeRead(int, byte[], int, int, byte[], int) - +Method in interface ioio.lib.api.SpiMaster +
Perform a single SPI transaction which includes optional transmission and + optional reception of data to a single slave. +
writeRead(byte[], int, int, byte[], int) - +Method in interface ioio.lib.api.SpiMaster +
Shorthand for SpiMaster.writeRead(int, byte[], int, int, byte[], int) for + the single-slave case. +
writeRead(int, boolean, byte[], int, byte[], int) - +Method in interface ioio.lib.api.TwiMaster +
Perform a single TWI transaction which includes optional transmission and + optional reception of data to a single slave. +
writeReadAsync(int, byte[], int, int, byte[], int) - +Method in interface ioio.lib.api.SpiMaster +
The same as SpiMaster.writeRead(int, byte[], int, int, byte[], int), but + returns immediately and returns a SpiMaster.Result object that can be + waited on. +
writeReadAsync(int, boolean, byte[], int, byte[], int) - +Method in interface ioio.lib.api.TwiMaster +
Asynchronous version of + TwiMaster.writeRead(int, boolean, byte[], int, byte[], int). +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-2.html b/IOIOLib/doc/index-files/index-2.html new file mode 100644 index 0000000..390ad81 --- /dev/null +++ b/IOIOLib/doc/index-files/index-2.html @@ -0,0 +1,167 @@ + + + + + + +C-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+C

+
+
className - +Variable in class ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec +
  +
close() - +Method in interface ioio.lib.api.Closeable +
  +
Closeable - Interface in ioio.lib.api
 
ConnectionLostException - Exception in ioio.lib.api.exception
Thrown when the connection between Android and IOIO has been lost or + disconnected.
ConnectionLostException(Exception) - +Constructor for exception ioio.lib.api.exception.ConnectionLostException +
  +
ConnectionLostException() - +Constructor for exception ioio.lib.api.exception.ConnectionLostException +
  +
create() - +Static method in class ioio.lib.api.IOIOFactory +
Create a IOIO instance. +
create(String, Object...) - +Static method in class ioio.lib.api.IOIOFactory +
Create a IOIO instance with a user-provided underlying connection class. +
create(IOIOConnection) - +Static method in class ioio.lib.api.IOIOFactory +
  +
createConnectionDynamically(String, Object...) - +Static method in class ioio.lib.api.IOIOFactory +
  +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-3.html b/IOIOLib/doc/index-files/index-3.html new file mode 100644 index 0000000..83e7d5b --- /dev/null +++ b/IOIOLib/doc/index-files/index-3.html @@ -0,0 +1,161 @@ + + + + + + +D-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+D

+
+
DigitalInput - Interface in ioio.lib.api
A pin used for digital input.
DigitalInput.Spec - Class in ioio.lib.api
A digital input pin specification, used when opening digital inputs.
DigitalInput.Spec(int, DigitalInput.Spec.Mode) - +Constructor for class ioio.lib.api.DigitalInput.Spec +
Constructor. +
DigitalInput.Spec(int) - +Constructor for class ioio.lib.api.DigitalInput.Spec +
Shorthand for Spec(pin, Mode.FLOATING). +
DigitalInput.Spec.Mode - Enum in ioio.lib.api
Input pin mode.
DigitalOutput - Interface in ioio.lib.api
A pin used for digital output.
DigitalOutput.Spec - Class in ioio.lib.api
A digital output pin specification, used when opening digital outputs.
DigitalOutput.Spec(int, DigitalOutput.Spec.Mode) - +Constructor for class ioio.lib.api.DigitalOutput.Spec +
Constructor. +
DigitalOutput.Spec(int) - +Constructor for class ioio.lib.api.DigitalOutput.Spec +
Shorthand for Spec(pin, Mode.NORMAL). +
DigitalOutput.Spec.Mode - Enum in ioio.lib.api
Output pin mode.
disconnect() - +Method in interface ioio.lib.api.IOIO +
Closes the connection to the board, or aborts a connection process + started with waitForConnect(). +
disconnect() - +Method in interface ioio.lib.api.IOIOConnection +
  +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-4.html b/IOIOLib/doc/index-files/index-4.html new file mode 100644 index 0000000..3826e58 --- /dev/null +++ b/IOIOLib/doc/index-files/index-4.html @@ -0,0 +1,152 @@ + + + + + + +E-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+E

+
+
enterProgramming() - +Method in interface ioio.lib.api.IcspMaster +
Initiate a sequence that will put the slave device in programming mode. +
executeInstruction(int) - +Method in interface ioio.lib.api.IcspMaster +
Execute a single instruction on the slave MCU. +
exitProgramming() - +Method in interface ioio.lib.api.IcspMaster +
Initiate a sequence that will put the slave device out of programming + mode. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-5.html b/IOIOLib/doc/index-files/index-5.html new file mode 100644 index 0000000..4d778e9 --- /dev/null +++ b/IOIOLib/doc/index-files/index-5.html @@ -0,0 +1,176 @@ + + + + + + +G-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+G

+
+
getDuration() - +Method in interface ioio.lib.api.PulseInput +
Gets the pulse duration in case of pulse measurement mode, or the period + in case of frequency mode. +
getFrequency() - +Method in interface ioio.lib.api.PulseInput +
Gets the momentary frequency of the measured signal. +
getImplVersion(IOIO.VersionType) - +Method in interface ioio.lib.api.IOIO +
Query the implementation version of the system's components. +
getInputStream() - +Method in interface ioio.lib.api.IOIOConnection +
  +
getInputStream() - +Method in interface ioio.lib.api.Uart +
Gets the input stream. +
getOutputStream() - +Method in interface ioio.lib.api.IOIOConnection +
  +
getOutputStream() - +Method in interface ioio.lib.api.Uart +
Gets the output stream. +
getReference() - +Method in interface ioio.lib.api.AnalogInput +
Gets the maximum value against which AnalogInput.read() values are scaled. +
getSpecs(Collection<IOIOConnectionDiscovery.IOIOConnectionSpec>) - +Method in interface ioio.lib.util.IOIOConnectionDiscovery +
  +
getSpecs(Collection<IOIOConnectionDiscovery.IOIOConnectionSpec>) - +Method in class ioio.lib.util.SocketIOIOConnectionDiscovery +
  +
getVoltage() - +Method in interface ioio.lib.api.AnalogInput +
Gets the analog input reading, as an absolute voltage in Volt units. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-6.html b/IOIOLib/doc/index-files/index-6.html new file mode 100644 index 0000000..f4a9dd3 --- /dev/null +++ b/IOIOLib/doc/index-files/index-6.html @@ -0,0 +1,148 @@ + + + + + + +H-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+H

+
+
hardReset() - +Method in interface ioio.lib.api.IOIO +
Equivalent to disconnecting and reconnecting the board power supply. +
hertz - +Variable in enum ioio.lib.api.PulseInput.ClockRate +
The value in Hertz units. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-7.html b/IOIOLib/doc/index-files/index-7.html new file mode 100644 index 0000000..6fcb8af --- /dev/null +++ b/IOIOLib/doc/index-files/index-7.html @@ -0,0 +1,162 @@ + + + + + + +I-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+I

+
+
IcspMaster - Interface in ioio.lib.api
An interface for controlling an ICSP channel, enabling Flash programming of + an external PIC MCU, and in particular, another IOIO board.
IncompatibilityException - Exception in ioio.lib.api.exception
Thrown when an incompatibility of system components is detected, such as when + an unsupported board hardware or software version is encountered.
IncompatibilityException(String) - +Constructor for exception ioio.lib.api.exception.IncompatibilityException +
  +
INVALID_PIN - +Static variable in interface ioio.lib.api.IOIO +
An invalid pin number. +
invertClk - +Variable in class ioio.lib.api.SpiMaster.Config +
Whether to invert clock polarity. +
IOIO - Interface in ioio.lib.api
This interface provides control over all the IOIO board functions.
ioio.lib.api - package ioio.lib.api
 
ioio.lib.api.exception - package ioio.lib.api.exception
 
ioio.lib.util - package ioio.lib.util
 
IOIO.VersionType - Enum in ioio.lib.api
A versioned component in the system.
IOIO_PORT - +Static variable in class ioio.lib.api.IOIOFactory +
The TCP port used for communicating with the IOIO board. +
IOIOConnection - Interface in ioio.lib.api
 
IOIOConnectionDiscovery - Interface in ioio.lib.util
 
IOIOConnectionDiscovery.IOIOConnectionSpec - Class in ioio.lib.util
 
IOIOConnectionDiscovery.IOIOConnectionSpec(String, Object[]) - +Constructor for class ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec +
  +
IOIOFactory - Class in ioio.lib.api
Factory class for creating instances of the IOIO interface.
IOIOFactory() - +Constructor for class ioio.lib.api.IOIOFactory +
  +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-8.html b/IOIOLib/doc/index-files/index-8.html new file mode 100644 index 0000000..192e9c3 --- /dev/null +++ b/IOIOLib/doc/index-files/index-8.html @@ -0,0 +1,145 @@ + + + + + + +L-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+L

+
+
LED_PIN - +Static variable in interface ioio.lib.api.IOIO +
The pin number used to designate the on-board 'stat' LED. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index-files/index-9.html b/IOIOLib/doc/index-files/index-9.html new file mode 100644 index 0000000..fa0fdd1 --- /dev/null +++ b/IOIOLib/doc/index-files/index-9.html @@ -0,0 +1,148 @@ + + + + + + +M-Index + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+

+M

+
+
mode - +Variable in class ioio.lib.api.DigitalInput.Spec +
The pin mode. +
mode - +Variable in class ioio.lib.api.DigitalOutput.Spec +
The pin mode. +
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +A C D E G H I L M O P R S T U V W
+ + + diff --git a/IOIOLib/doc/index.html b/IOIOLib/doc/index.html new file mode 100644 index 0000000..faba50a --- /dev/null +++ b/IOIOLib/doc/index.html @@ -0,0 +1,39 @@ + + + + + + +Generated Documentation (Untitled) + + + + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="overview-summary.html">Non-frame version.</A> + + + diff --git a/IOIOLib/doc/ioio/lib/api/AnalogInput.html b/IOIOLib/doc/ioio/lib/api/AnalogInput.html new file mode 100644 index 0000000..d862adf --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/AnalogInput.html @@ -0,0 +1,328 @@ + + + + + + +AnalogInput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface AnalogInput

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface AnalogInput
extends Closeable
+ + +

+A pin used for analog input. +

+ An analog input pin can be used to measure voltage. AnalogInput instances are + obtained by calling IOIO.openAnalogInput(int). +

+ Floating-point values scaled from 0 to 1 can be obtained by calling + read(). Absolute voltage levels can be obtained by calling + getVoltage(). +

+ The instance is alive since its creation. The first read() call + block for a few milliseconds until the initial value is updated. If the + connection with the IOIO drops at any point, the instance transitions to a + disconnected state, in which every attempt to use the pin (except + Closeable.close()) will throw a ConnectionLostException. Whenever + Closeable.close() is invoked the instance may no longer be used. Any resources + associated with it are freed and can be reused. +

+ Typical usage: + +

+ AnalogInput potentiometer = ioio.openAnalogInput(40);
+ float value = potentiometer.read();
+ ...
+ potentiometer.close();  // pin 40 can now be used for something else.
+ 
+

+ +

+

+
See Also:
IOIO.openAnalogInput(int)
+
+ +

+ + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ floatgetReference() + +
+          Gets the maximum value against which read() values are scaled.
+ floatgetVoltage() + +
+          Gets the analog input reading, as an absolute voltage in Volt units.
+ floatread() + +
+          Gets the analog input reading, as a scaled real value between 0 and 1.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+getVoltage

+
+float getVoltage()
+                 throws java.lang.InterruptedException,
+                        ConnectionLostException
+
+
Gets the analog input reading, as an absolute voltage in Volt units. +

+ It typically takes a few milliseconds between when the instance is + created and until the first value can be read. In this case, the method + may block shortly. If this is a problem, the calling thread can be + interrupted. +

+ If a scaled value is desired, consider using read(). +

+

+
+
+
+ +
Returns:
The voltage, in Volt units. +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO is lost.
See Also:
read()
+
+
+
+ +

+getReference

+
+float getReference()
+
+
Gets the maximum value against which read() values are scaled. +

+

+
+
+
+ +
Returns:
The voltage, in Volts.
+
+
+
+ +

+read

+
+float read()
+           throws java.lang.InterruptedException,
+                  ConnectionLostException
+
+
Gets the analog input reading, as a scaled real value between 0 and 1. +

+ It typically takes a few milliseconds between when the instance is + created and until the first value can be read. In this case, the method + may block shortly. If this is a problem, the calling thread can be + interrupted. +

+ If an absolute value is desired, consider using getVoltage(). +

+

+
+
+
+ +
Returns:
The voltage, in scaled units. +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO is lost.
See Also:
getVoltage()
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/Closeable.html b/IOIOLib/doc/ioio/lib/api/Closeable.html new file mode 100644 index 0000000..ecd6bda --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/Closeable.html @@ -0,0 +1,209 @@ + + + + + + +Closeable + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface Closeable

+
+
All Known Subinterfaces:
AnalogInput, DigitalInput, DigitalOutput, IcspMaster, PulseInput, PwmOutput, SpiMaster, TwiMaster, Uart
+
+
+
+
public interface Closeable
+ + +

+


+ +

+ + + + + + + + + + + + +
+Method Summary
+ voidclose() + +
+           
+  +

+ + + + + + + + +
+Method Detail
+ +

+close

+
+void close()
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.Mode.html b/IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.Mode.html new file mode 100644 index 0000000..1ea3682 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.Mode.html @@ -0,0 +1,360 @@ + + + + + + +DigitalInput.Spec.Mode + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum DigitalInput.Spec.Mode

+
+java.lang.Object
+  extended by java.lang.Enum<DigitalInput.Spec.Mode>
+      extended by ioio.lib.api.DigitalInput.Spec.Mode
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<DigitalInput.Spec.Mode>
+
+
+
Enclosing class:
DigitalInput.Spec
+
+
+
+
public static enum DigitalInput.Spec.Mode
extends java.lang.Enum<DigitalInput.Spec.Mode>
+ + +

+Input pin mode. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + +
+Enum Constant Summary
FLOATING + +
+          Pin is floating.
PULL_DOWN + +
+          Internal pull-down resistor is used.
PULL_UP + +
+          Internal pull-up resistor is used.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static DigitalInput.Spec.ModevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static DigitalInput.Spec.Mode[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+FLOATING

+
+public static final DigitalInput.Spec.Mode FLOATING
+
+
Pin is floating. When the pin is left disconnected the value + sensed is undefined. Use this mode when an external pull-up or + pull-down resistor is used or when interfacing push-pull type + logic circuits. +

+

+
+
+
+ +

+PULL_UP

+
+public static final DigitalInput.Spec.Mode PULL_UP
+
+
Internal pull-up resistor is used. When the pin is left + disconnected, a logical "HIGH" (true) will be sensed. This is + useful for interfacing with open drain circuits or for + interacting with a switch connected between the pin and ground. +

+

+
+
+
+ +

+PULL_DOWN

+
+public static final DigitalInput.Spec.Mode PULL_DOWN
+
+
Internal pull-down resistor is used. When the pin is left + disconnected, a logical "LOW" (false) will be sensed. This is + useful for interacting with a switch connected between the pin + and Vdd. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static DigitalInput.Spec.Mode[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (DigitalInput.Spec.Mode c : DigitalInput.Spec.Mode.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static DigitalInput.Spec.Mode valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.html b/IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.html new file mode 100644 index 0000000..a174a4d --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/DigitalInput.Spec.html @@ -0,0 +1,328 @@ + + + + + + +DigitalInput.Spec + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Class DigitalInput.Spec

+
+java.lang.Object
+  extended by ioio.lib.api.DigitalInput.Spec
+
+
+
Enclosing interface:
DigitalInput
+
+
+
+
public static class DigitalInput.Spec
extends java.lang.Object
+ + +

+A digital input pin specification, used when opening digital inputs. +

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classDigitalInput.Spec.Mode + +
+          Input pin mode.
+ + + + + + + + + + + + + + +
+Field Summary
+ DigitalInput.Spec.Modemode + +
+          The pin mode.
+ intpin + +
+          The pin number, as labeled on the board.
+  + + + + + + + + + + + + + +
+Constructor Summary
DigitalInput.Spec(int pin) + +
+          Shorthand for Spec(pin, Mode.FLOATING).
DigitalInput.Spec(int pin, + DigitalInput.Spec.Mode mode) + +
+          Constructor.
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+pin

+
+public int pin
+
+
The pin number, as labeled on the board. +

+

+
+
+
+ +

+mode

+
+public DigitalInput.Spec.Mode mode
+
+
The pin mode. +

+

+
+
+ + + + + + + + +
+Constructor Detail
+ +

+DigitalInput.Spec

+
+public DigitalInput.Spec(int pin,
+                         DigitalInput.Spec.Mode mode)
+
+
Constructor. +

+

+
Parameters:
pin - Pin number, as labeled on the board.
mode - Pin mode.
+
+
+ +

+DigitalInput.Spec

+
+public DigitalInput.Spec(int pin)
+
+
Shorthand for Spec(pin, Mode.FLOATING). +

+

+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/DigitalInput.html b/IOIOLib/doc/ioio/lib/api/DigitalInput.html new file mode 100644 index 0000000..5a35e4a --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/DigitalInput.html @@ -0,0 +1,306 @@ + + + + + + +DigitalInput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface DigitalInput

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface DigitalInput
extends Closeable
+ + +

+A pin used for digital input. +

+ A digital input pin can be used to read logic-level signals. DigitalInput + instances are obtained by calling IOIO#openDigitalInput(Spec). +

+ The value of the pin is obtained by calling read(). It is also + possible for the client to block until a certain level is sensed, by using + waitForValue(boolean). +

+ The instance is alive since its creation. The first read() call + block for a few milliseconds until the initial value is updated. If the + connection with the IOIO drops at any point, the instance transitions to a + disconnected state, in which every attempt to use the pin (except + Closeable.close()) will throw a ConnectionLostException. Whenever + Closeable.close() is invoked the instance may no longer be used. Any resources + associated with it are freed and can be reused. +

+ Typical usage: + +

+ DigitalInput button = ioio.openDigitalInput(10);  // used an external pull-up
+ button.waitForValue(false);  // wait for press
+ ...
+ button.close();  // pin 10 can now be used for something else.
+ 
+

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classDigitalInput.Spec + +
+          A digital input pin specification, used when opening digital inputs.
+  + + + + + + + + + + + + + + + +
+Method Summary
+ booleanread() + +
+          Read the value sensed on the pin.
+ voidwaitForValue(boolean value) + +
+          Block until a desired logical level is sensed.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+read

+
+boolean read()
+             throws java.lang.InterruptedException,
+                    ConnectionLostException
+
+
Read the value sensed on the pin. May block for a few milliseconds if + called right after creation of the instance. If this is a problem, the + calling thread may be interrupted. +

+

+
+
+
+ +
Returns:
True for logical "HIGH", false for logical "LOW". +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO has been lost.
+
+
+
+ +

+waitForValue

+
+void waitForValue(boolean value)
+                  throws java.lang.InterruptedException,
+                         ConnectionLostException
+
+
Block until a desired logical level is sensed. The calling thread can be + interrupted for aborting this operation. +

+

+
+
+
+
Parameters:
value - The desired logical level. true for "HIGH", false for "LOW". +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO has been lost.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.Mode.html b/IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.Mode.html new file mode 100644 index 0000000..35c7f40 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.Mode.html @@ -0,0 +1,341 @@ + + + + + + +DigitalOutput.Spec.Mode + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum DigitalOutput.Spec.Mode

+
+java.lang.Object
+  extended by java.lang.Enum<DigitalOutput.Spec.Mode>
+      extended by ioio.lib.api.DigitalOutput.Spec.Mode
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<DigitalOutput.Spec.Mode>
+
+
+
Enclosing class:
DigitalOutput.Spec
+
+
+
+
public static enum DigitalOutput.Spec.Mode
extends java.lang.Enum<DigitalOutput.Spec.Mode>
+ + +

+Output pin mode. +

+ +

+


+ +

+ + + + + + + + + + + + + +
+Enum Constant Summary
NORMAL + +
+          Pin operates in push-pull mode, i.e.
OPEN_DRAIN + +
+          Pin operates in open-drain mode, i.e.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static DigitalOutput.Spec.ModevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static DigitalOutput.Spec.Mode[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+NORMAL

+
+public static final DigitalOutput.Spec.Mode NORMAL
+
+
Pin operates in push-pull mode, i.e. a logical "HIGH" is + represented by a voltage of Vdd on the pin and a logical "LOW" by + a voltage of 0 (ground). +

+

+
+
+
+ +

+OPEN_DRAIN

+
+public static final DigitalOutput.Spec.Mode OPEN_DRAIN
+
+
Pin operates in open-drain mode, i.e. a logical "HIGH" is + represented by a high impedance on the pin (as if it is + disconnected) and a logical "LOW" by a voltage of 0 (ground). + This mode is most commonly used for generating 5V logical signal + on a 3.3V pin: 5V tolerant pins must be used; a pull-up resistor + is connected between the pin and 5V, and the pin is used in open- + drain mode. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static DigitalOutput.Spec.Mode[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (DigitalOutput.Spec.Mode c : DigitalOutput.Spec.Mode.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static DigitalOutput.Spec.Mode valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.html b/IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.html new file mode 100644 index 0000000..6abcd91 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/DigitalOutput.Spec.html @@ -0,0 +1,330 @@ + + + + + + +DigitalOutput.Spec + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Class DigitalOutput.Spec

+
+java.lang.Object
+  extended by ioio.lib.api.DigitalOutput.Spec
+
+
+
Enclosing interface:
DigitalOutput
+
+
+
+
public static class DigitalOutput.Spec
extends java.lang.Object
+ + +

+A digital output pin specification, used when opening digital outputs. +

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classDigitalOutput.Spec.Mode + +
+          Output pin mode.
+ + + + + + + + + + + + + + +
+Field Summary
+ DigitalOutput.Spec.Modemode + +
+          The pin mode.
+ intpin + +
+          The pin number, as labeled on the board.
+  + + + + + + + + + + + + + +
+Constructor Summary
DigitalOutput.Spec(int pin) + +
+          Shorthand for Spec(pin, Mode.NORMAL).
DigitalOutput.Spec(int pin, + DigitalOutput.Spec.Mode mode) + +
+          Constructor.
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+pin

+
+public int pin
+
+
The pin number, as labeled on the board. +

+

+
+
+
+ +

+mode

+
+public DigitalOutput.Spec.Mode mode
+
+
The pin mode. +

+

+
+
+ + + + + + + + +
+Constructor Detail
+ +

+DigitalOutput.Spec

+
+public DigitalOutput.Spec(int pin,
+                          DigitalOutput.Spec.Mode mode)
+
+
Constructor. +

+

+
Parameters:
pin - Pin number, as labeled on the board.
mode - Pin mode.
+
+
+ +

+DigitalOutput.Spec

+
+public DigitalOutput.Spec(int pin)
+
+
Shorthand for Spec(pin, Mode.NORMAL). +

+

+
See Also:
#Spec(int, Mode)
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/DigitalOutput.html b/IOIOLib/doc/ioio/lib/api/DigitalOutput.html new file mode 100644 index 0000000..4d01b46 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/DigitalOutput.html @@ -0,0 +1,269 @@ + + + + + + +DigitalOutput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface DigitalOutput

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface DigitalOutput
extends Closeable
+ + +

+A pin used for digital output. +

+ A digital input pin can be used to generate logic-level signals. + DigitalOutput instances are obtained by calling + IOIO#openDigitalOutput(Spec, boolean). +

+ The value of the pin is set by calling write(boolean). +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, in + which every attempt to use the pin (except Closeable.close()) will throw a + ConnectionLostException. Whenever Closeable.close() is invoked the + instance may no longer be used. Any resources associated with it are freed + and can be reused. +

+ Typical usage: + +

+ DigitalOutput led = ioio.openDigitalInput(2);  // LED anode on pin 2.
+ led.write(true);  // turn LED on.
+ ...
+ led.close();  // pin 2 can now be used for something else.
+ 
+

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classDigitalOutput.Spec + +
+          A digital output pin specification, used when opening digital outputs.
+  + + + + + + + + + + + +
+Method Summary
+ voidwrite(boolean val) + +
+          Set the output of the pin.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+write

+
+void write(boolean val)
+           throws ConnectionLostException
+
+
Set the output of the pin. +

+

+
+
+
+
Parameters:
val - The output. true is logical "HIGH", false is logical "LOW". +
Throws: +
ConnectionLostException - The connection with the IOIO has been lost.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/IOIO.VersionType.html b/IOIOLib/doc/ioio/lib/api/IOIO.VersionType.html new file mode 100644 index 0000000..5b747da --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/IOIO.VersionType.html @@ -0,0 +1,371 @@ + + + + + + +IOIO.VersionType + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum IOIO.VersionType

+
+java.lang.Object
+  extended by java.lang.Enum<IOIO.VersionType>
+      extended by ioio.lib.api.IOIO.VersionType
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<IOIO.VersionType>
+
+
+
Enclosing interface:
IOIO
+
+
+
+
public static enum IOIO.VersionType
extends java.lang.Enum<IOIO.VersionType>
+ + +

+A versioned component in the system. +

+ +

+

+
See Also:
IOIO.getImplVersion(VersionType)
+
+ +

+ + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
APP_FIRMWARE_VER + +
+          Application layer firmware version.
BOOTLOADER_VER + +
+          Bootloader version.
HARDWARE_VER + +
+          Hardware version.
IOIOLIB_VER + +
+          IOIOLib version.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static IOIO.VersionTypevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static IOIO.VersionType[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+HARDWARE_VER

+
+public static final IOIO.VersionType HARDWARE_VER
+
+
Hardware version. +

+

+
+
+
+ +

+BOOTLOADER_VER

+
+public static final IOIO.VersionType BOOTLOADER_VER
+
+
Bootloader version. +

+

+
+
+
+ +

+APP_FIRMWARE_VER

+
+public static final IOIO.VersionType APP_FIRMWARE_VER
+
+
Application layer firmware version. +

+

+
+
+
+ +

+IOIOLIB_VER

+
+public static final IOIO.VersionType IOIOLIB_VER
+
+
IOIOLib version. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static IOIO.VersionType[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (IOIO.VersionType c : IOIO.VersionType.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static IOIO.VersionType valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/IOIO.html b/IOIOLib/doc/ioio/lib/api/IOIO.html new file mode 100644 index 0000000..48d56a9 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/IOIO.html @@ -0,0 +1,1241 @@ + + + + + + +IOIO + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface IOIO

+
+
+
public interface IOIO
+ + +

+This interface provides control over all the IOIO board functions. +

+ An instance of this interface is typically obtained by using the + IOIOFactory class. Initially, a connection should be established, by + calling waitForConnect(). This method will block until the board is + connected an a connection has been established. +

+ During the connection process, this library verifies that the IOIO firmware + is compatible with the required version. If not, waitForConnect() + will throw a IncompatibilityException, putting the IOIO + instance in a "zombie" state: nothing could be done with it except calling + disconnect(), or waiting for the physical connection to drop via + waitForDisconnect(). +

+ As soon as a connection is established, the IOIO can be used, typically, by + calling the openXXX() functions to obtain additional interfaces for + controlling specific function of the board. +

+ Whenever a connection is lost as a result of physically disconnecting the + board or as a result of calling disconnect(), this instance and all + the interfaces obtained from it become invalid, and will throw a + ConnectionLostException on every operation. Once the connection is + lost, those instances cannot be recycled, but rather it is required to create + new ones and wait for a connection again. +

+ Initially all pins are tri-stated (floating), and all functions are disabled. + Whenever a connection is lost or dropped, the board will immediately return + to the this initial state. +

+ Typical usage: + +

+ IOIO ioio = IOIOFactory.create();
+ try {
+   ioio.waitForConnect();
+   DigitalOutput out = ioio.openDigitalOutput(10);
+   out.write(true);
+   ...
+ } catch (ConnectionLostException e) {
+ } catch (Exception e) {
+   ioio.disconnect();
+ } finally {
+   ioio.waitForDisconnect();
+ }
+ 
+

+ +

+

+
See Also:
IOIOFactory.create()
+
+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classIOIO.VersionType + +
+          A versioned component in the system.
+ + + + + + + + + + + + + + +
+Field Summary
+static intINVALID_PIN + +
+          An invalid pin number.
+static intLED_PIN + +
+          The pin number used to designate the on-board 'stat' LED.
+  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voiddisconnect() + +
+          Closes the connection to the board, or aborts a connection process + started with waitForConnect().
+ java.lang.StringgetImplVersion(IOIO.VersionType v) + +
+          Query the implementation version of the system's components.
+ voidhardReset() + +
+          Equivalent to disconnecting and reconnecting the board power supply.
+ AnalogInputopenAnalogInput(int pin) + +
+          Open a pin for analog input.
+ DigitalInputopenDigitalInput(DigitalInput.Spec spec) + +
+          Open a pin for digital input.
+ DigitalInputopenDigitalInput(int pin) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin)).
+ DigitalInputopenDigitalInput(int pin, + DigitalInput.Spec.Mode mode) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)).
+ DigitalOutputopenDigitalOutput(DigitalOutput.Spec spec, + boolean startValue) + +
+          Open a pin for digital output.
+ DigitalOutputopenDigitalOutput(int pin) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), false).
+ DigitalOutputopenDigitalOutput(int pin, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), startValue).
+ DigitalOutputopenDigitalOutput(int pin, + DigitalOutput.Spec.Mode mode, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + startValue).
+ IcspMasteropenIcspMaster() + +
+          Open an ICSP channel, enabling Flash programming of an external PIC MCU, + and in particular, another IOIO board.
+ PulseInputopenPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, + PulseInput.PulseMode mode, + boolean doublePrecision) + +
+          Open a pin for pulse input.
+ PulseInputopenPulseInput(int pin, + PulseInput.PulseMode mode) + +
+          Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + true), i.e.
+ PwmOutputopenPwmOutput(DigitalOutput.Spec spec, + int freqHz) + +
+          Open a pin for PWM (Pulse-Width Modulation) output.
+ PwmOutputopenPwmOutput(int pin, + int freqHz) + +
+          Shorthand for openPwmOutput(new DigitalOutput.Spec(pin), freqHz).
+ SpiMasteropenSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+ SpiMasteropenSpiMaster(int miso, + int mosi, + int clk, + int[] slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the pins are all open with the default modes and default configuration values are used.
+ SpiMasteropenSpiMaster(int miso, + int mosi, + int clk, + int slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the MISO pins is opened with pull up, and the other pins are open + with the default modes and default configuration values are used.
+ TwiMasteropenTwiMaster(int twiNum, + TwiMaster.Rate rate, + boolean smbus) + +
+          Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + enabling communication with multiple TWI-enabled slave modules.
+ UartopenUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+ UartopenUart(int rx, + int tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs.
+ voidsoftReset() + +
+          Resets the entire state (returning to initial state), without dropping + the connection.
+ voidwaitForConnect() + +
+          Establishes connection with the IOIO board.
+ voidwaitForDisconnect() + +
+          Blocks until IOIO has been disconnected and all connection-related + resources have been freed, so that a new connection can be attempted.
+  +

+ + + + + + + + +
+Field Detail
+ +

+INVALID_PIN

+
+static final int INVALID_PIN
+
+
An invalid pin number. +

+

+
See Also:
Constant Field Values
+
+
+ +

+LED_PIN

+
+static final int LED_PIN
+
+
The pin number used to designate the on-board 'stat' LED. +

+

+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Method Detail
+ +

+waitForConnect

+
+void waitForConnect()
+                    throws ConnectionLostException,
+                           IncompatibilityException
+
+
Establishes connection with the IOIO board. +

+ This method is blocking until connection is established. This method can + be aborted by calling disconnect(). In this case, it will throw + a ConnectionLostException. +

+

+ +
Throws: +
ConnectionLostException - An error occurred during connection or disconnect() has been + called during connection. The instance state is disconnected. +
IncompatibilityException - An incompatible board firmware of hardware has been detected. + The instance state is disconnected.
See Also:
disconnect(), +waitForDisconnect()
+
+
+
+ +

+disconnect

+
+void disconnect()
+
+
Closes the connection to the board, or aborts a connection process + started with waitForConnect(). +

+ Once this method is called, this IOIO instance and all the instances + obtain from it become invalid and will throw an exception on every + operation. +

+ This method is asynchronous, i.e. it returns immediately, but it is not + guaranteed that all connection-related resources has already been freed + and can be reused upon return. In cases when this is important, client + can call waitForDisconnect(), which will block until all + resources have been freed. +

+

+
+
+
+
+ +

+waitForDisconnect

+
+void waitForDisconnect()
+                       throws java.lang.InterruptedException
+
+
Blocks until IOIO has been disconnected and all connection-related + resources have been freed, so that a new connection can be attempted. +

+

+ +
Throws: +
java.lang.InterruptedException - When interrupt() has been called on this thread. This might + mean that an immediate attempt to create and connect a new + IOIO object might fail for resource contention.
See Also:
disconnect(), +waitForConnect()
+
+
+
+ +

+softReset

+
+void softReset()
+               throws ConnectionLostException
+
+
Resets the entire state (returning to initial state), without dropping + the connection. +

+ It is equivalent to calling Closeable.close() on every interface + obtained from this instance. A connection must have been established + prior to calling this method, by invoking waitForConnect(). +

+

+ +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
hardReset()
+
+
+
+ +

+hardReset

+
+void hardReset()
+               throws ConnectionLostException
+
+
Equivalent to disconnecting and reconnecting the board power supply. +

+ The connection will be dropped and not reestablished. Full boot sequence + will take place, so firmware upgrades can be performed. A connection must + have been established prior to calling this method, by invoking + waitForConnect(). +

+

+ +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
softReset()
+
+
+
+ +

+getImplVersion

+
+java.lang.String getImplVersion(IOIO.VersionType v)
+                                throws ConnectionLostException
+
+
Query the implementation version of the system's components. The + implementation version uniquely identifies a hardware revision or a + software build. Returned version IDs are always 8-character long, + according to the IOIO versioning system: first 4 characters are the + version authority and last 4 characters are the revision. +

+

+
Parameters:
v - The component whose version we query. +
Returns:
An 8-character implementation version ID. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
+
+
+
+ +

+openDigitalInput

+
+DigitalInput openDigitalInput(DigitalInput.Spec spec)
+                              throws ConnectionLostException
+
+
Open a pin for digital input. +

+ A digital input pin can be used to read logic-level signals. The pin will + operate in this mode until close() is invoked on the returned interface. + It is illegal to open a pin that has already been opened and has not been + closed. A connection must have been established prior to calling this + method, by invoking waitForConnect(). +

+

+
Parameters:
spec - Pin specification, consisting of the pin number, as labeled on + the board, and the mode, which determines whether the pin will + be floating, pull-up or pull-down. See + DigitalInput.Spec.Mode for more information. +
Returns:
Interface of the assigned pin. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
DigitalInput
+
+
+
+ +

+openDigitalInput

+
+DigitalInput openDigitalInput(int pin)
+                              throws ConnectionLostException
+
+
Shorthand for openDigitalInput(new DigitalInput.Spec(pin)). +

+

+ +
Throws: +
ConnectionLostException
See Also:
openDigitalInput(ioio.lib.api.DigitalInput.Spec)
+
+
+
+ +

+openDigitalInput

+
+DigitalInput openDigitalInput(int pin,
+                              DigitalInput.Spec.Mode mode)
+                              throws ConnectionLostException
+
+
Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)). +

+

+ +
Throws: +
ConnectionLostException
See Also:
openDigitalInput(ioio.lib.api.DigitalInput.Spec)
+
+
+
+ +

+openDigitalOutput

+
+DigitalOutput openDigitalOutput(DigitalOutput.Spec spec,
+                                boolean startValue)
+                                throws ConnectionLostException
+
+
Open a pin for digital output. +

+ A digital output pin can be used to generate logic-level signals. The pin + will operate in this mode until close() is invoked on the returned + interface. It is illegal to open a pin that has already been opened and + has not been closed. A connection must have been established prior to + calling this method, by invoking waitForConnect(). +

+

+
Parameters:
spec - Pin specification, consisting of the pin number, as labeled on + the board, and the mode, which determines whether the pin will + be normal or open-drain. See DigitalOutput.Spec.Mode + for more information.
startValue - The initial logic level this pin will generate as soon at it + is open. +
Returns:
Interface of the assigned pin. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
DigitalOutput
+
+
+
+ +

+openDigitalOutput

+
+DigitalOutput openDigitalOutput(int pin,
+                                DigitalOutput.Spec.Mode mode,
+                                boolean startValue)
+                                throws ConnectionLostException
+
+
Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + startValue). +

+

+ +
Throws: +
ConnectionLostException
See Also:
openDigitalOutput(ioio.lib.api.DigitalOutput.Spec, boolean)
+
+
+
+ +

+openDigitalOutput

+
+DigitalOutput openDigitalOutput(int pin,
+                                boolean startValue)
+                                throws ConnectionLostException
+
+
Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), startValue). + Pin mode will be "normal" (as opposed to "open-drain". +

+

+ +
Throws: +
ConnectionLostException
See Also:
openDigitalOutput(ioio.lib.api.DigitalOutput.Spec, boolean)
+
+
+
+ +

+openDigitalOutput

+
+DigitalOutput openDigitalOutput(int pin)
+                                throws ConnectionLostException
+
+
Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), false). Pin + mode will be "normal" (as opposed to "open-drain". +

+

+ +
Throws: +
ConnectionLostException
See Also:
openDigitalOutput(ioio.lib.api.DigitalOutput.Spec, boolean)
+
+
+
+ +

+openAnalogInput

+
+AnalogInput openAnalogInput(int pin)
+                            throws ConnectionLostException
+
+
Open a pin for analog input. +

+ An analog input pin can be used to measure voltage. Note that not every + pin can be used as an analog input. See board documentation for the legal + pins and permitted voltage range. +

+ The pin will operate in this mode until close() is invoked on the + returned interface. It is illegal to open a pin that has already been + opened and has not been closed. A connection must have been established + prior to calling this method, by invoking waitForConnect(). +

+

+
Parameters:
pin - Pin number, as labeled on the board. +
Returns:
Interface of the assigned pin. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
AnalogInput
+
+
+
+ +

+openPwmOutput

+
+PwmOutput openPwmOutput(DigitalOutput.Spec spec,
+                        int freqHz)
+                        throws ConnectionLostException
+
+
Open a pin for PWM (Pulse-Width Modulation) output. +

+ A PWM pin produces a logic-level PWM signal. These signals are typically + used for simulating analog outputs for controlling the intensity of LEDs, + the rotation speed of motors, etc. They are also frequently used for + controlling hobby servo motors. +

+ Note that not every pin can be used as PWM output. In addition, the total + number of concurrent PWM modules in use is limited. See board + documentation for the legal pins and limit on concurrent usage. +

+ The pin will operate in this mode until close() is invoked on the + returned interface. It is illegal to open a pin that has already been + opened and has not been closed. A connection must have been established + prior to calling this method, by invoking waitForConnect(). +

+

+
Parameters:
spec - Pin specification, consisting of the pin number, as labeled on + the board, and the mode, which determines whether the pin will + be normal or open-drain. See DigitalOutput.Spec.Mode + for more information.
freqHz - PWM frequency, in Hertz. +
Returns:
Interface of the assigned pin. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method. +
OutOfResourceException - This is a runtime exception, so it is not necessary to catch + it if the client guarantees that the total number of + concurrent PWM resources is not exceeded.
See Also:
PwmOutput
+
+
+
+ +

+openPwmOutput

+
+PwmOutput openPwmOutput(int pin,
+                        int freqHz)
+                        throws ConnectionLostException
+
+
Shorthand for openPwmOutput(new DigitalOutput.Spec(pin), freqHz). +

+

+ +
Throws: +
ConnectionLostException
See Also:
openPwmOutput(ioio.lib.api.DigitalOutput.Spec, int)
+
+
+
+ +

+openPulseInput

+
+PulseInput openPulseInput(DigitalInput.Spec spec,
+                          PulseInput.ClockRate rate,
+                          PulseInput.PulseMode mode,
+                          boolean doublePrecision)
+                          throws ConnectionLostException
+
+
Open a pin for pulse input. +

+ The pulse input module is quite flexible. It enables several kinds of + timing measurements on a digital signal: pulse width measurement + (positive or negative pulse), and frequency of a periodic signal. +

+ Note that not every pin can be used as pulse input. In addition, the + total number of concurrent pulse input modules in use is limited. See + board documentation for the legal pins and limit on concurrent usage. +

+ The pin will operate in this mode until close() is invoked on the + returned interface. It is illegal to open a pin that has already been + opened and has not been closed. A connection must have been established + prior to calling this method, by invoking waitForConnect(). +

+

+
Parameters:
spec - Pin specification, consisting of the pin number, as labeled on + the board, and the mode, which determines whether the pin will + be floating, pull-up or pull-down. See + DigitalInput.Spec.Mode for more information.
rate - The clock rate to use for timing the signal. A faster clock + rate will result in better precision but will only be able to + measure narrow pulses / high frequencies.
mode - The mode in which to operate. Determines whether the module + will measure pulse durations or frequency.
doublePrecision - Whether to open a double-precision pulse input module. Double- + precision modules enable reading of much longer pulses and + lower frequencies with high accuracy than single precision + modules. However, their number is limited, so when possible, + and if the resources are all needed, use single-precision. For + more details on the exact spec of single- vs. double- + precision, see PulseInput. +
Returns:
An instance of the PulseInput, which can be used to + obtain the data. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method. +
OutOfResourceException - This is a runtime exception, so it is not necessary to catch + it if the client guarantees that the total number of + concurrent PWM resources is not exceeded.
See Also:
PulseInput
+
+
+
+ +

+openPulseInput

+
+PulseInput openPulseInput(int pin,
+                          PulseInput.PulseMode mode)
+                          throws ConnectionLostException
+
+
Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + true), i.e. opens a double-precision, 16MHz pulse input on the given pin + with the given mode. +

+

+ +
Throws: +
ConnectionLostException
See Also:
#openPulseInput(ioio.lib.api.DigitalInput.Spec, + ioio.lib.api.PulseInput.ClockRate, PulseMode, boolean)
+
+
+
+ +

+openUart

+
+Uart openUart(DigitalInput.Spec rx,
+              DigitalOutput.Spec tx,
+              int baud,
+              Uart.Parity parity,
+              Uart.StopBits stopbits)
+              throws ConnectionLostException
+
+
Open a UART module, enabling a bulk transfer of byte buffers. +

+ UART is a very common hardware communication protocol, enabling full- + duplex, asynchronous point-to-point data transfer. It typically serves + for opening consoles or as a basis for higher-level protocols, such as + MIDI RS-232, and RS-485. +

+ Note that not every pin can be used for UART RX or TX. In addition, the + total number of concurrent UART modules in use is limited. See board + documentation for the legal pins and limit on concurrent usage. +

+ The UART module will operate, and the pins will work in their respective + modes until close() is invoked on the returned interface. It is illegal + to use pins that have already been opened and has not been closed. A + connection must have been established prior to calling this method, by + invoking waitForConnect(). +

+

+
Parameters:
rx - Pin specification for the RX pin, consisting of the pin + number, as labeled on the board, and the mode, which + determines whether the pin will be floating, pull-up or + pull-down. See DigitalInput.Spec.Mode for more + information. null can be passed to designate that we do not + want RX input to this module.
tx - Pin specification for the TX pin, consisting of the pin + number, as labeled on the board, and the mode, which + determines whether the pin will be normal or open-drain. See + DigitalOutput.Spec.Mode for more information. null can + be passed to designate that we do not want TX output to this + module.
baud - The clock frequency of the UART module in Hz.
parity - The parity mode, as in Uart.Parity.
stopbits - Number of stop bits, as in Uart.StopBits. +
Returns:
Interface of the assigned module. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method. +
OutOfResourceException - This is a runtime exception, so it is not necessary to catch + it if the client guarantees that the total number of + concurrent UART resources is not exceeded.
See Also:
Uart
+
+
+
+ +

+openUart

+
+Uart openUart(int rx,
+              int tx,
+              int baud,
+              Uart.Parity parity,
+              Uart.StopBits stopbits)
+              throws ConnectionLostException
+
+
Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs. INVALID_PIN can + be used on either pin if a TX- or RX-only UART is needed. +

+

+ +
Throws: +
ConnectionLostException
See Also:
#openUart(ioio.lib.api.DigitalInput.Spec, + ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits)
+
+
+
+ +

+openSpiMaster

+
+SpiMaster openSpiMaster(DigitalInput.Spec miso,
+                        DigitalOutput.Spec mosi,
+                        DigitalOutput.Spec clk,
+                        DigitalOutput.Spec[] slaveSelect,
+                        SpiMaster.Config config)
+                        throws ConnectionLostException
+
+
Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules. +

+ SPI is a common hardware communication protocol, enabling full-duplex, + synchronous point-to-multi-point data transfer. It requires MOSI, MISO + and CLK lines shared by all nodes, as well as a SS line per slave, + connected between this slave and a respective pin on the master. The MISO + line should operate in pull-up mode, using either the internal pull-up or + an external resistor. +

+ Note that not every pin can be used for SPI MISO, MOSI or CLK. In + addition, the total number of concurrent SPI modules in use is limited. + See board documentation for the legal pins and limit on concurrent usage. +

+ The SPI module will operate, and the pins will work in their respective + modes until close() is invoked on the returned interface. It is illegal + to use pins that have already been opened and has not been closed. A + connection must have been established prior to calling this method, by + invoking waitForConnect(). +

+

+
Parameters:
miso - Pin specification for the MISO (Master In Slave Out) pin, + consisting of the pin number, as labeled on the board, and the + mode, which determines whether the pin will be floating, + pull-up or pull-down. See DigitalInput.Spec.Mode for + more information.
mosi - Pin specification for the MOSI (Master Out Slave In) pin, + consisting of the pin number, as labeled on the board, and the + mode, which determines whether the pin will be normal or + open-drain. See DigitalOutput.Spec.Mode for more + information.
clk - Pin specification for the CLK pin, consisting of the pin + number, as labeled on the board, and the mode, which + determines whether the pin will be normal or open-drain. See + DigitalOutput.Spec.Mode for more information.
slaveSelect - An array of pin specifications for each of the slaves' SS + (Slave Select) pin. The index of this array designates the + slave index, used later to refer to this slave. The spec is + consisting of the pin number, as labeled on the board, and the + mode, which determines whether the pin will be normal or + open-drain. See DigitalOutput.Spec.Mode for more + information.
config - The configuration of the SPI module. See + SpiMaster.Config for details. +
Returns:
Interface of the assigned module. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method. +
OutOfResourceException - This is a runtime exception, so it is not necessary to catch + it if the client guarantees that the total number of + concurrent SPI resources is not exceeded.
See Also:
SpiMaster
+
+
+
+ +

+openSpiMaster

+
+SpiMaster openSpiMaster(int miso,
+                        int mosi,
+                        int clk,
+                        int[] slaveSelect,
+                        SpiMaster.Rate rate)
+                        throws ConnectionLostException
+
+
Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the pins are all open with the default modes and default configuration values are used. +

+

+ +
Throws: +
ConnectionLostException
See Also:
openSpiMaster(ioio.lib.api.DigitalInput.Spec, + ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, + ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config)
+
+
+
+ +

+openSpiMaster

+
+SpiMaster openSpiMaster(int miso,
+                        int mosi,
+                        int clk,
+                        int slaveSelect,
+                        SpiMaster.Rate rate)
+                        throws ConnectionLostException
+
+
Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the MISO pins is opened with pull up, and the other pins are open + with the default modes and default configuration values are used. + In this version, a single slave is used. +

+

+ +
Throws: +
ConnectionLostException
See Also:
openSpiMaster(ioio.lib.api.DigitalInput.Spec, + ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, + ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config)
+
+
+
+ +

+openTwiMaster

+
+TwiMaster openTwiMaster(int twiNum,
+                        TwiMaster.Rate rate,
+                        boolean smbus)
+                        throws ConnectionLostException
+
+
Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + enabling communication with multiple TWI-enabled slave modules. +

+ TWI is a common hardware communication protocol, enabling half-duplex, + synchronous point-to-multi-point data transfer. It requires a physical + connection of two lines (SDA, SCL) shared by all the bus nodes, where the + SDA is open-drain and externally pulled-up. +

+ Note that there is a fixed number of TWI modules, and the pins they use + are static. Client has to make sure these pins are not already opened + before calling this method. See board documentation for the number of + modules and the respective pins they use. +

+ The TWI module will operate, and the pins will work in their respective + modes until close() is invoked on the returned interface. It is illegal + to use pins that have already been opened and has not been closed. A + connection must have been established prior to calling this method, by + invoking waitForConnect(). +

+

+
Parameters:
twiNum - The TWI module index to use. Will also determine the pins + used.
rate - The clock rate. Can be 100KHz / 400KHz / 1MHz.
smbus - When true, will use SMBus voltage levels. When false, I2C + voltage levels. +
Returns:
Interface of the assigned module. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
TwiMaster
+
+
+
+ +

+openIcspMaster

+
+IcspMaster openIcspMaster()
+                          throws ConnectionLostException
+
+
Open an ICSP channel, enabling Flash programming of an external PIC MCU, + and in particular, another IOIO board. +

+ ICSP (In-Circuit Serial Programming) is a protocol intended for + programming of PIC MCUs. It is a serial protocol over three wires: PGC + (clock), PGD (data) and MCLR (reset), where PGC and MCLR are controlled + by the master and PGD is shared by the master and slave, depending on the + transaction state. +

+ Note that there is only one ICSP modules, and the pins it uses are + static. Client has to make sure that the ICSP module is not already in + use, as well as those dedicated pins. See board documentation for the + actual pins used for ICSP. +

+

+ +
Returns:
Interface of the ICSP module. +
Throws: +
ConnectionLostException - Connection was lost before or during the execution of this + method.
See Also:
IcspMaster
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/IOIOConnection.html b/IOIOLib/doc/ioio/lib/api/IOIOConnection.html new file mode 100644 index 0000000..aa22fa9 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/IOIOConnection.html @@ -0,0 +1,272 @@ + + + + + + +IOIOConnection + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface IOIOConnection

+
+
+
public interface IOIOConnection
+ + +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voiddisconnect() + +
+           
+ java.io.InputStreamgetInputStream() + +
+           
+ java.io.OutputStreamgetOutputStream() + +
+           
+ voidwaitForConnect() + +
+           
+  +

+ + + + + + + + +
+Method Detail
+ +

+waitForConnect

+
+void waitForConnect()
+                    throws ConnectionLostException
+
+
+ +
Throws: +
ConnectionLostException
+
+
+
+ +

+disconnect

+
+void disconnect()
+
+
+
+
+
+
+ +

+getInputStream

+
+java.io.InputStream getInputStream()
+                                   throws ConnectionLostException
+
+
+ +
Throws: +
ConnectionLostException
+
+
+
+ +

+getOutputStream

+
+java.io.OutputStream getOutputStream()
+                                     throws ConnectionLostException
+
+
+ +
Throws: +
ConnectionLostException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/IOIOFactory.html b/IOIOLib/doc/ioio/lib/api/IOIOFactory.html new file mode 100644 index 0000000..806ed9b --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/IOIOFactory.html @@ -0,0 +1,390 @@ + + + + + + +IOIOFactory + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Class IOIOFactory

+
+java.lang.Object
+  extended by ioio.lib.api.IOIOFactory
+
+
+
+
public class IOIOFactory
extends java.lang.Object
+ + +

+Factory class for creating instances of the IOIO interface. +

+ This class acts as the single entry-point to the IOIO API. It creates the + bootstrapping between a specific implementation of the IOIO interface and any + dependencies it might have, such as the underlying connection logic. +

+ Typical usage: + +

+ IOIO ioio = IOIOFactory.create();
+ try {
+   ioio.waitForConnect();
+   ...
+   ioio.disconnect();
+ } catch (ConnectionLostException e) {
+ } finally {
+   ioio.waitForDisconnect();
+ }
+ 
+

+ +

+


+ +

+ + + + + + + + + + + +
+Field Summary
+static intIOIO_PORT + +
+          The TCP port used for communicating with the IOIO board.
+  + + + + + + + + + + +
+Constructor Summary
IOIOFactory() + +
+           
+  + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+static IOIOcreate() + +
+          Create a IOIO instance.
+static IOIOcreate(IOIOConnection connection) + +
+           
+static IOIOcreate(java.lang.String connectionClassName, + java.lang.Object... args) + +
+          Create a IOIO instance with a user-provided underlying connection class.
+static IOIOConnectioncreateConnectionDynamically(java.lang.String connectionClassName, + java.lang.Object... args) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+IOIO_PORT

+
+public static final int IOIO_PORT
+
+
The TCP port used for communicating with the IOIO board. +

+

+
See Also:
Constant Field Values
+
+ + + + + + + + +
+Constructor Detail
+ +

+IOIOFactory

+
+public IOIOFactory()
+
+
+ + + + + + + + +
+Method Detail
+ +

+create

+
+public static IOIO create()
+
+
Create a IOIO instance. This specific implementation creates a IOIO + instance which works with the actual IOIO board connected via a TCP + connection (typically over a wired USB connection). +

+

+ +
Returns:
The IOIO instance.
+
+
+
+ +

+create

+
+public static IOIO create(java.lang.String connectionClassName,
+                          java.lang.Object... args)
+                   throws java.lang.ClassNotFoundException
+
+
Create a IOIO instance with a user-provided underlying connection class. + This method should be used for establishing a non-standard connection to + the IOIO board. +

+

+
Parameters:
connectionClassName - The name of the connection class. Must have a public default + constructor. +
Returns:
The IOIO instance. +
Throws: +
java.lang.ClassNotFoundException - The given class name was not found.
+
+
+
+ +

+create

+
+public static IOIO create(IOIOConnection connection)
+
+
+
+
+
+
+ +

+createConnectionDynamically

+
+public static IOIOConnection createConnectionDynamically(java.lang.String connectionClassName,
+                                                         java.lang.Object... args)
+                                                  throws java.lang.ClassNotFoundException
+
+
+ +
Throws: +
java.lang.ClassNotFoundException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/IcspMaster.html b/IOIOLib/doc/ioio/lib/api/IcspMaster.html new file mode 100644 index 0000000..ae05bcc --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/IcspMaster.html @@ -0,0 +1,403 @@ + + + + + + +IcspMaster + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface IcspMaster

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface IcspMaster
extends Closeable
+ + +

+An interface for controlling an ICSP channel, enabling Flash programming of + an external PIC MCU, and in particular, another IOIO board. +

+ ICSP (In-Circuit Serial Programming) is a protocol intended for programming + of PIC MCUs. It is a serial protocol over three wires: PGC (clock), PGD + (data) and MCLR (reset), where PGC and MCLR are controlled by the master and + PGD is shared by the master and slave, depending on the transaction state. + IcspMaster instances are obtained by calling IOIO.openIcspMaster(). +

+ This interface is very low level: it allows direct access to the atomic + operations of the ICSP protocol: +

+

+ The ICSP module uses fixed pins for its lines. See the user guide for details + for your specific board. ICSP is a special feature, introduced for the + purpose of programming a IOIO board with another IOIO board. It does not + necessarily play nicely when used concurrently with other features, in the + sense that it may introduce latencies in other modules. It is thus + recommended not to use ICSP in conjunction with latency-sensitive features. +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, in + which every attempt to use it (except Closeable.close()) will throw a + ConnectionLostException. Whenever Closeable.close() is invoked the + instance may no longer be used. Any resources associated with it are freed + and can be reused. +

+ Typical usage: + +

+ IcspMaster icsp = ioio.openIcspMaster();
+ icsp.enterProgramming();
+ icsp.executeInstruction(0x212340);  // mov #0x1234, w0
+ icsp.executeInstruction(0x883C20);  // mov w0, 0x784 (VISI)
+ icsp.executeInstruction(0x000000);  // nop
+ icsp.readVisi();
+ int visi = icsp.waitVisiResult();   // should read 0x1234
+ icsp.exitProgramming();
+ icsp.close();                       // free ICSP module and pins
+ 
+

+ +

+

+
See Also:
IOIO.openIcspMaster()
+
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidenterProgramming() + +
+          Initiate a sequence that will put the slave device in programming mode.
+ voidexecuteInstruction(int instruction) + +
+          Execute a single instruction on the slave MCU.
+ voidexitProgramming() + +
+          Initiate a sequence that will put the slave device out of programming + mode.
+ voidreadVisi() + +
+          Request a read of the VISI register on the slave MCU.
+ intwaitVisiResult() + +
+          Wait and return a result of a call to readVisi().
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+enterProgramming

+
+void enterProgramming()
+                      throws ConnectionLostException
+
+
Initiate a sequence that will put the slave device in programming mode. + This sequence is necessary for executing instructions and reading + register values. +

+

+
+
+
+ +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost.
+
+
+
+ +

+exitProgramming

+
+void exitProgramming()
+                     throws ConnectionLostException
+
+
Initiate a sequence that will put the slave device out of programming + mode. It will be held in reset. +

+

+
+
+
+ +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost.
+
+
+
+ +

+executeInstruction

+
+void executeInstruction(int instruction)
+                        throws ConnectionLostException
+
+
Execute a single instruction on the slave MCU. +

+

+
+
+
+
Parameters:
instruction - a 24-bit PIC instruction. +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost.
+
+
+
+ +

+readVisi

+
+void readVisi()
+              throws ConnectionLostException,
+                     java.lang.InterruptedException
+
+
Request a read of the VISI register on the slave MCU. This is an + asynchronous call, in which the 16-bit result is obtained by + waitVisiResult(). + This method may block if the read queue on the IOIO is full, but this + should be for short periods only. +

+

+
+
+
+ +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost. +
java.lang.InterruptedException - Interrupted while blocking.
+
+
+
+ +

+waitVisiResult

+
+int waitVisiResult()
+                   throws ConnectionLostException,
+                          java.lang.InterruptedException
+
+
Wait and return a result of a call to readVisi(). + Results will be returned in the same order as requested. + + The call will block until there is data, until interrupted, or until + connection to the IOIO has been lost. +

+

+
+
+
+ +
Returns:
The result - an unsigned 16-bit number. +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost. +
java.lang.InterruptedException - Interrupted while blocking.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/PulseInput.ClockRate.html b/IOIOLib/doc/ioio/lib/api/PulseInput.ClockRate.html new file mode 100644 index 0000000..afb23c0 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/PulseInput.ClockRate.html @@ -0,0 +1,407 @@ + + + + + + +PulseInput.ClockRate + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum PulseInput.ClockRate

+
+java.lang.Object
+  extended by java.lang.Enum<PulseInput.ClockRate>
+      extended by ioio.lib.api.PulseInput.ClockRate
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<PulseInput.ClockRate>
+
+
+
Enclosing interface:
PulseInput
+
+
+
+
public static enum PulseInput.ClockRate
extends java.lang.Enum<PulseInput.ClockRate>
+ + +

+Suported clock rate enum. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
RATE_16MHz + +
+          16MHz
RATE_250KHz + +
+          250KHz
RATE_2MHz + +
+          2MHz
RATE_62KHz + +
+          62.5KHz
+ + + + + + + + + + +
+Field Summary
+ inthertz + +
+          The value in Hertz units.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static PulseInput.ClockRatevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static PulseInput.ClockRate[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+RATE_16MHz

+
+public static final PulseInput.ClockRate RATE_16MHz
+
+
16MHz +

+

+
+
+
+ +

+RATE_2MHz

+
+public static final PulseInput.ClockRate RATE_2MHz
+
+
2MHz +

+

+
+
+
+ +

+RATE_250KHz

+
+public static final PulseInput.ClockRate RATE_250KHz
+
+
250KHz +

+

+
+
+
+ +

+RATE_62KHz

+
+public static final PulseInput.ClockRate RATE_62KHz
+
+
62.5KHz +

+

+
+
+ + + + + + + + +
+Field Detail
+ +

+hertz

+
+public final int hertz
+
+
The value in Hertz units. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static PulseInput.ClockRate[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (PulseInput.ClockRate c : PulseInput.ClockRate.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static PulseInput.ClockRate valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/PulseInput.PulseMode.html b/IOIOLib/doc/ioio/lib/api/PulseInput.PulseMode.html new file mode 100644 index 0000000..6bb6805 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/PulseInput.PulseMode.html @@ -0,0 +1,425 @@ + + + + + + +PulseInput.PulseMode + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum PulseInput.PulseMode

+
+java.lang.Object
+  extended by java.lang.Enum<PulseInput.PulseMode>
+      extended by ioio.lib.api.PulseInput.PulseMode
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<PulseInput.PulseMode>
+
+
+
Enclosing interface:
PulseInput
+
+
+
+
public static enum PulseInput.PulseMode
extends java.lang.Enum<PulseInput.PulseMode>
+ + +

+An enumeration for describing the module's operating mode. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
FREQ + +
+          Frequency measurement (rising-edge-to-rising-edge).
FREQ_SCALE_16 + +
+          Frequency measurement (rising-edge-to-rising-edge) with 16x scaling.
FREQ_SCALE_4 + +
+          Frequency measurement (rising-edge-to-rising-edge) with 4x scaling.
NEGATIVE + +
+          Negative pulse measurement (falling-edge-to-rising-edge).
POSITIVE + +
+          Positive pulse measurement (rising-edge-to-falling-edge).
+ + + + + + + + + + +
+Field Summary
+ intscaling + +
+          The scaling factor as an integer.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static PulseInput.PulseModevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static PulseInput.PulseMode[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+POSITIVE

+
+public static final PulseInput.PulseMode POSITIVE
+
+
Positive pulse measurement (rising-edge-to-falling-edge). +

+

+
+
+
+ +

+NEGATIVE

+
+public static final PulseInput.PulseMode NEGATIVE
+
+
Negative pulse measurement (falling-edge-to-rising-edge). +

+

+
+
+
+ +

+FREQ

+
+public static final PulseInput.PulseMode FREQ
+
+
Frequency measurement (rising-edge-to-rising-edge). +

+

+
+
+
+ +

+FREQ_SCALE_4

+
+public static final PulseInput.PulseMode FREQ_SCALE_4
+
+
Frequency measurement (rising-edge-to-rising-edge) with 4x scaling. +

+

+
+
+
+ +

+FREQ_SCALE_16

+
+public static final PulseInput.PulseMode FREQ_SCALE_16
+
+
Frequency measurement (rising-edge-to-rising-edge) with 16x scaling. +

+

+
+
+ + + + + + + + +
+Field Detail
+ +

+scaling

+
+public final int scaling
+
+
The scaling factor as an integer. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static PulseInput.PulseMode[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (PulseInput.PulseMode c : PulseInput.PulseMode.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static PulseInput.PulseMode valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/PulseInput.html b/IOIOLib/doc/ioio/lib/api/PulseInput.html new file mode 100644 index 0000000..ad9575c --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/PulseInput.html @@ -0,0 +1,527 @@ + + + + + + +PulseInput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface PulseInput

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface PulseInput
extends Closeable
+ + +

+An interface for pulse width and frequency measurements of digital signals. +

+ PulseInput (commonly known as "input capture") is a versatile module which + enables extraction of various timing information from a digital signal. There + are two main use cases: pulse duration measurement and frequency measurement. + In pulse width measurement we measure the duration of a positive ("high") or + negative ("low") pulse, i.e. the elapsed time between a rise and a fall or + vice versa. This mode is useful, for example, for decoding a PWM signal or + measuring the delay of a sonar return signal. In frequency measurement we + measure the duration between a rising edge to the following rising edge. This + gives us a momentary reading of a signal's frequency or period. This is + commonly used, for example, in conjunction with an optical or magnetic sensor + for measuring a turning shaft's speed. +

+ PulseInput instances are obtained by calling + IOIO#openPulseInput(ioio.lib.api.DigitalInput.Spec, ClockRate, PulseMode, boolean) + . When created, some important configuration decisions have to be made: the + precision (single or double), the clock rate and the mode of operation. Modes + are straightforward: PulseInput.PulseMode.POSITIVE is used for measuring a + positive pulse, PulseInput.PulseMode.NEGATIVE a negative pulse, and + PulseInput.PulseMode.FREQ / PulseInput.PulseMode.FREQ_SCALE_4 / + PulseInput.PulseMode.FREQ_SCALE_16 are used for measuring frequency. The + difference between the three scaling modes is that without scaling, the + frequency is determined by measurement of a single + (rising-edge-to-rising-edge) period. In x4 scaling, 4 consecutive periods are + measured and the time is divided by 4, providing some smoothing as well as + better resolution. Similarly for x16 scaling. Note that scaling affects the + range of signals to be measured, as discussed below. +

+ The choice of single vs. double-precision is important to understand: IOIO + internally uses either 16-bit counters or 32-bit counters for the timing. 16- + counters force us to either limit the maximum duration (and the minimum + frequency) or compromise accuracy as compared to 32-bit counters. However, if + you need many concurrent pulse measurements in your application, you may have + no choice but to use single-precision. +

+ The clock rate selection is important (and even critical when working in + single-precision) and requires the user to make some assumptions about the + nature of the measured signal. The higher the clock rate, the more precise + the measurement, but the longest pulse that can be measured decreases (or + lowest frequency that can be measured increases). Using the scaling option + when operating in frequency mode also affects these sizes. combinations. It + is always recommended to choose the most precise mode, which exceeds the + maximum expected pulse width (or inverse frequency). If a pulse is received + whom duration exceeds the longest allowed pulse, it will be "folded" into the + valid range and product garbage readings. +

+ The following table (sorted by longest pulse) summarizes all possible clock / + mode combinations. The table applies for single-precision operation. + For double-precision, simply multiply the longest pulse by 65536 and divide + the lowest frequency by the same amount. Interestingly, the number written in + [ms] units in the longest pulse column, roughly corresponds to the same + number in minutes when working with double precsion, since 1[min] = + 60000[ms]. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ClockScalingResolutionLongest pulseLowest frequency
62.5KHz116us1.048s0.95Hz
250KHz14us262.1ms3.81Hz
62.5KHz44us262.1ms3.81Hz
250KHz41us65.54ms15.26Hz
62.5KHz161us65.54ms15.26Hz
2MHz1500ns32.77ms30.52Hz
250KHz16250us16.38ms61.0Hz
2MHz4125ns8.192ms122.1Hz
16MHz162.5ns4.096ms244.1Hz
2MHz1631.25ns2.048ms488.3Hz
16MHz415.6ns1.024ms976.6Hz
16MHz163.9ns256us3.906KHz
+ +

+ In some applications it is desirable to measure every incoming pulse rather + than repetitively query the result of the last measurement. For that purpose + the waitPulseGetDuration() method exists: every incoming pulse width + is pushed into a small internal queue from which it can be read. The client + waits for data to be available, then reads it and data that comes in in the + meanwhile is stored. The queue has limited size, so it is important to read + quickly if no pulses are to be lost. Note that once a pulse is detected, the + next one must have its leading edge at least 5ms after the leading edge of + the current one, or else it will be skipped. This throttling has been + introduced on purpose, in order to prevent saturation the communication + channel when the input signal is very high frequency. Effectively, this means + that the maximum sample rate is 200Hz. This rate has been chosen as it + enables measure R/C servo signals without missing pulses. + +

+ Typical usage (servo signal pulse width measurement): + +

+ // Open pulse input at 16MHz, double-precision
+ PulseInput in = ioio.openPulseInput(3, PulseMode.POSITIVE);
+ ...
+ float widthSec = in.getDuration();
+ OR:
+ float widthSec = in.waitPulseGetDuration();
+ ... 
+ in.close();  // pin 3 can now be used for something else.
+ 
+ 
+ +

+ Typical usage (frequency measurement): + +

+ // Signal is known to be slightly over 150Hz. Single precision can be used.
+ PulseInput in = ioio.openPulseInput(3,
+                                     ClockRate.RATE_2MHz,
+                                     PulseMode.FREQ_SCALE_4,
+                                     false);
+ ...
+ float freqHz = in.getFrequency();
+ ... 
+ in.close();  // pin 3 can now be used for something else.
+ 
+ 
+

+ +

+


+ +

+ + + + + + + + + + + + + + + +
+Nested Class Summary
+static classPulseInput.ClockRate + +
+          Suported clock rate enum.
+static classPulseInput.PulseMode + +
+          An enumeration for describing the module's operating mode.
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ floatgetDuration() + +
+          Gets the pulse duration in case of pulse measurement mode, or the period + in case of frequency mode.
+ floatgetFrequency() + +
+          Gets the momentary frequency of the measured signal.
+ floatwaitPulseGetDuration() + +
+          Reads a single measurement from the queue.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+getDuration

+
+float getDuration()
+                  throws java.lang.InterruptedException,
+                         ConnectionLostException
+
+
Gets the pulse duration in case of pulse measurement mode, or the period + in case of frequency mode. When scaling is used, this is compensated for + here, so the duration of a single cycle will be returned. +

+ The first call to this method may block shortly until the first data + update arrives. The client may interrupt the calling thread. +

+

+
+
+
+ +
Returns:
The duration, in seconds. +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO has been lost.
+
+
+
+ +

+waitPulseGetDuration

+
+float waitPulseGetDuration()
+                           throws java.lang.InterruptedException,
+                                  ConnectionLostException
+
+
Reads a single measurement from the queue. If the queue is empty, will + block until more data arrives. The calling thread may be interrupted in + order to abort the call. See interface documentation for further + explanation regarding the read queue. +

+ This method may not be used if the interface has was opened in frequency + mode. +

+

+
+
+
+ +
Returns:
The duration, in seconds. +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO has been lost.
+
+
+
+ +

+getFrequency

+
+float getFrequency()
+                   throws java.lang.InterruptedException,
+                          ConnectionLostException
+
+
Gets the momentary frequency of the measured signal. When scaling is + used, this is compensated for here, so the true frequency of the signal + will be returned. +

+ The first call to this method may block shortly until the first data + update arrives. The client may interrupt the calling thread. +

+

+
+
+
+ +
Returns:
The frequency, in Hz. +
Throws: +
java.lang.InterruptedException - The calling thread has been interrupted. +
ConnectionLostException - The connection with the IOIO has been lost.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/PwmOutput.html b/IOIOLib/doc/ioio/lib/api/PwmOutput.html new file mode 100644 index 0000000..f54b0cc --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/PwmOutput.html @@ -0,0 +1,347 @@ + + + + + + +PwmOutput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface PwmOutput

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface PwmOutput
extends Closeable
+ + +

+A pin used for PWM (Pulse-Width Modulation) output. +

+ A PWM pin produces a logic-level PWM signal. These signals are typically used + for simulating analog outputs for controlling the intensity of LEDs, the + rotation speed of motors, etc. They are also frequently used for controlling + hobby servo motors. PwmOutput instances are obtained by calling + IOIO.openPwmOutput(ioio.lib.api.DigitalOutput.Spec, int). +

+ When used for motors and LEDs, a frequency of several KHz is typically used, + where there is a trade-off between switching power-loses and smoothness of + operation. The pulse width is typically set by specifying the duty cycle, + with the setDutyCycle(float) method. A duty cycle of 0 is "off", a + duty cycle of 1 is "on", and every intermediate value produces an + intermediate intensity. Please note that any devices consuming more than 20mA + of current (e.g. motors) should not by directly connected the the IOIO pins, + but rather through an amplification circuit suited for the specific load. +

+ When used for hobby servos, the PWM signal is rather used for encoding of the + desired angle the motor should go to. By standard, a 100Hz signal is used and + the pulse width is varied between 1ms and 2ms (corresponding to both extremes + of the shaft angle), using setPulseWidth(int). +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, in + which every attempt to use the pin (except Closeable.close()) will throw a + ConnectionLostException. Whenever Closeable.close() is invoked the + instance may no longer be used. Any resources associated with it are freed + and can be reused. +

+ Typical usage (fading LED): + +

+ PwmOutput servo = ioio.openPwmOutput(12, 1000);  // LED anode on pin 12
+ ...
+ servo.setDutyCycle(0.0f);  // LED off
+ ... 
+ servo.setDutyCycle(0.5f);  // 50% intensity
+ ... 
+ servo.setDutyCycle(1.0f);  // 100% intensity
+ ... 
+ servo.close();  // pin 12 can now be used for something else.
+ 
+

+ Typical usage (servo): + +

+ PwmOutput servo = ioio.openPwmOutput(12, 100);
+ ...
+ servo.setPulseWidth(1000);  // 1000us = 1ms = one extreme
+ ... 
+ servo.setPulseWidth(1500);  // 1500us = 1.5ms = center
+ ... 
+ servo.setPulseWidth(2000);  // 2000us = 2ms = other extreme
+ ... 
+ servo.close();  // pin 12 can now be used for something else.
+ 
+

+ +

+

+
See Also:
IOIO.openPwmOutput(ioio.lib.api.DigitalOutput.Spec, int)
+
+ +

+ + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidsetDutyCycle(float dutyCycle) + +
+          Sets the duty cycle of the PWM output.
+ voidsetPulseWidth(float pulseWidthUs) + +
+          The same as setPulseWidth(int), but with sub-microsecond + precision.
+ voidsetPulseWidth(int pulseWidthUs) + +
+          Sets the pulse width of the PWM output.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+setDutyCycle

+
+void setDutyCycle(float dutyCycle)
+                  throws ConnectionLostException
+
+
Sets the duty cycle of the PWM output. The duty cycle is defined to be + the pulse width divided by the total cycle period. For absolute control + of the pulse with, consider using setPulseWidth(int). +

+

+
+
+
+
Parameters:
dutyCycle - The duty cycle, as a real value from 0.0 to 1.0. +
Throws: +
ConnectionLostException - The connection to the IOIO has been lost.
See Also:
setPulseWidth(int)
+
+
+
+ +

+setPulseWidth

+
+void setPulseWidth(int pulseWidthUs)
+                   throws ConnectionLostException
+
+
Sets the pulse width of the PWM output. The pulse width is duration of + the high-time within a single period of the signal. For relative control + of the pulse with, consider using setDutyCycle(float). +

+

+
+
+
+
Parameters:
pulseWidthUs - The pulse width, in microsecond units. +
Throws: +
ConnectionLostException - The connection to the IOIO has been lost.
See Also:
setDutyCycle(float)
+
+
+
+ +

+setPulseWidth

+
+void setPulseWidth(float pulseWidthUs)
+                   throws ConnectionLostException
+
+
The same as setPulseWidth(int), but with sub-microsecond + precision. +

+

+
+
+
+ +
Throws: +
ConnectionLostException
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/SpiMaster.Config.html b/IOIOLib/doc/ioio/lib/api/SpiMaster.Config.html new file mode 100644 index 0000000..af6ae24 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/SpiMaster.Config.html @@ -0,0 +1,339 @@ + + + + + + +SpiMaster.Config + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Class SpiMaster.Config

+
+java.lang.Object
+  extended by ioio.lib.api.SpiMaster.Config
+
+
+
Enclosing interface:
SpiMaster
+
+
+
+
public static class SpiMaster.Config
extends java.lang.Object
+ + +

+SPI configuration structure. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + +
+Field Summary
+ booleaninvertClk + +
+          Whether to invert clock polarity.
+ SpiMaster.Raterate + +
+          Data rate.
+ booleansampleOnTrailing + +
+          Whether to do the input and output sampling on the trailing clock + edge.
+  + + + + + + + + + + + + + +
+Constructor Summary
SpiMaster.Config(SpiMaster.Rate rate) + +
+          Constructor with common defaults.
SpiMaster.Config(SpiMaster.Rate rate, + boolean invertClk, + boolean sampleOnTrailing) + +
+          Constructor.
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+rate

+
+public SpiMaster.Rate rate
+
+
Data rate. +

+

+
+
+
+ +

+invertClk

+
+public boolean invertClk
+
+
Whether to invert clock polarity. +

+

+
+
+
+ +

+sampleOnTrailing

+
+public boolean sampleOnTrailing
+
+
Whether to do the input and output sampling on the trailing clock + edge. +

+

+
+
+ + + + + + + + +
+Constructor Detail
+ +

+SpiMaster.Config

+
+public SpiMaster.Config(SpiMaster.Rate rate,
+                        boolean invertClk,
+                        boolean sampleOnTrailing)
+
+
Constructor. +

+

+
Parameters:
rate - Data rate.
invertClk - Whether to invert clock polarity.
sampleOnTrailing - Whether to do the input and output sampling on the + trailing clock edge.
+
+
+ +

+SpiMaster.Config

+
+public SpiMaster.Config(SpiMaster.Rate rate)
+
+
Constructor with common defaults. Equivalent to Config(rate, false, + false) +

+

+
See Also:
#Config(Rate, boolean, boolean)
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/SpiMaster.Rate.html b/IOIOLib/doc/ioio/lib/api/SpiMaster.Rate.html new file mode 100644 index 0000000..df5dd56 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/SpiMaster.Rate.html @@ -0,0 +1,697 @@ + + + + + + +SpiMaster.Rate + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum SpiMaster.Rate

+
+java.lang.Object
+  extended by java.lang.Enum<SpiMaster.Rate>
+      extended by ioio.lib.api.SpiMaster.Rate
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<SpiMaster.Rate>
+
+
+
Enclosing interface:
SpiMaster
+
+
+
+
public static enum SpiMaster.Rate
extends java.lang.Enum<SpiMaster.Rate>
+ + +

+Possible data rates for SPI, in Hz. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Enum Constant Summary
RATE_1_3M + +
+           
RATE_125K + +
+           
RATE_142K + +
+           
RATE_166K + +
+           
RATE_1M + +
+           
RATE_2_2M + +
+           
RATE_2_6M + +
+           
RATE_200K + +
+           
RATE_250K + +
+           
RATE_2M + +
+           
RATE_3_2M + +
+           
RATE_31K + +
+           
RATE_333K + +
+           
RATE_35K + +
+           
RATE_41K + +
+           
RATE_4M + +
+           
RATE_5_3M + +
+           
RATE_500K + +
+           
RATE_50K + +
+           
RATE_571K + +
+           
RATE_62K + +
+           
RATE_666K + +
+           
RATE_800K + +
+           
RATE_83K + +
+           
RATE_8M + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+static SpiMaster.RatevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static SpiMaster.Rate[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+RATE_31K

+
+public static final SpiMaster.Rate RATE_31K
+
+
+
+
+
+ +

+RATE_35K

+
+public static final SpiMaster.Rate RATE_35K
+
+
+
+
+
+ +

+RATE_41K

+
+public static final SpiMaster.Rate RATE_41K
+
+
+
+
+
+ +

+RATE_50K

+
+public static final SpiMaster.Rate RATE_50K
+
+
+
+
+
+ +

+RATE_62K

+
+public static final SpiMaster.Rate RATE_62K
+
+
+
+
+
+ +

+RATE_83K

+
+public static final SpiMaster.Rate RATE_83K
+
+
+
+
+
+ +

+RATE_125K

+
+public static final SpiMaster.Rate RATE_125K
+
+
+
+
+
+ +

+RATE_142K

+
+public static final SpiMaster.Rate RATE_142K
+
+
+
+
+
+ +

+RATE_166K

+
+public static final SpiMaster.Rate RATE_166K
+
+
+
+
+
+ +

+RATE_200K

+
+public static final SpiMaster.Rate RATE_200K
+
+
+
+
+
+ +

+RATE_250K

+
+public static final SpiMaster.Rate RATE_250K
+
+
+
+
+
+ +

+RATE_333K

+
+public static final SpiMaster.Rate RATE_333K
+
+
+
+
+
+ +

+RATE_500K

+
+public static final SpiMaster.Rate RATE_500K
+
+
+
+
+
+ +

+RATE_571K

+
+public static final SpiMaster.Rate RATE_571K
+
+
+
+
+
+ +

+RATE_666K

+
+public static final SpiMaster.Rate RATE_666K
+
+
+
+
+
+ +

+RATE_800K

+
+public static final SpiMaster.Rate RATE_800K
+
+
+
+
+
+ +

+RATE_1M

+
+public static final SpiMaster.Rate RATE_1M
+
+
+
+
+
+ +

+RATE_1_3M

+
+public static final SpiMaster.Rate RATE_1_3M
+
+
+
+
+
+ +

+RATE_2M

+
+public static final SpiMaster.Rate RATE_2M
+
+
+
+
+
+ +

+RATE_2_2M

+
+public static final SpiMaster.Rate RATE_2_2M
+
+
+
+
+
+ +

+RATE_2_6M

+
+public static final SpiMaster.Rate RATE_2_6M
+
+
+
+
+
+ +

+RATE_3_2M

+
+public static final SpiMaster.Rate RATE_3_2M
+
+
+
+
+
+ +

+RATE_4M

+
+public static final SpiMaster.Rate RATE_4M
+
+
+
+
+
+ +

+RATE_5_3M

+
+public static final SpiMaster.Rate RATE_5_3M
+
+
+
+
+
+ +

+RATE_8M

+
+public static final SpiMaster.Rate RATE_8M
+
+
+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static SpiMaster.Rate[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (SpiMaster.Rate c : SpiMaster.Rate.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static SpiMaster.Rate valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/SpiMaster.Result.html b/IOIOLib/doc/ioio/lib/api/SpiMaster.Result.html new file mode 100644 index 0000000..cec75e8 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/SpiMaster.Result.html @@ -0,0 +1,222 @@ + + + + + + +SpiMaster.Result + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface SpiMaster.Result

+
+
Enclosing interface:
SpiMaster
+
+
+
+
public static interface SpiMaster.Result
+ + +

+An object that can be waited on for asynchronous calls. +

+ +

+


+ +

+ + + + + + + + + + + + +
+Method Summary
+ voidwaitReady() + +
+          Wait until the asynchronous call which returned this instance is + complete.
+  +

+ + + + + + + + +
+Method Detail
+ +

+waitReady

+
+void waitReady()
+               throws ConnectionLostException,
+                      java.lang.InterruptedException
+
+
Wait until the asynchronous call which returned this instance is + complete. +

+

+ +
Throws: +
ConnectionLostException - Connection with the IOIO has been lost. +
java.lang.InterruptedException - This operation has been interrupted.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/SpiMaster.html b/IOIOLib/doc/ioio/lib/api/SpiMaster.html new file mode 100644 index 0000000..7cbef2d --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/SpiMaster.html @@ -0,0 +1,424 @@ + + + + + + +SpiMaster + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface SpiMaster

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface SpiMaster
extends Closeable
+ + +

+An interface for controlling an SPI module, in SPI bus-master mode, enabling + communication with multiple SPI-enabled slave modules. +

+ SPI is a common hardware communication protocol, enabling full-duplex, + synchronous point-to-multi-point data transfer. It requires MOSI, MISO and + CLK lines shared by all nodes, as well as a SS line per slave, connected + between this slave and a respective pin on the master. The MISO line should + operate in pull-up mode, using either the internal pull-up or an external + resistor. SpiMaster instances are obtained by calling + IOIO#openSpiMaster(Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], Config). +

+ The SPI protocol is comprised of simultaneous sending and receiving of data + between the bus master and a single slave. By the very nature of this + protocol, the amount of bytes sent is equal to the amount of bytes received. + However, by padding the sent data with garbage data, and by ignoring the + leading bytes of the received data arbitrarily-sized packets can be sent and + received. +

+ A very common practice for SPI-based slave devices (although not always the + case), is to have a fixed request and response length and a fixed lag between + them, based on the request type. For example, an SPI-based sensor may define + the the protocol for obtaining its measured value is by sending a 2-byte + message, whereas the returned 3-byte value has its first byte overlapping the + second value of the response, as illustrated below: + +

+ Master: M1   M2   GG   GG
+ Slave:  GG   S1   S2   S3
+ 
+ + M1, M2: the master's request
+ S1, S2, S3: the slave's response
+ GG: garbage bytes used for padding. +

+ The IOIO SPI interface supports such fixed length message protocols using a + single method, writeRead(int, byte[], int, int, byte[], int), which + gets the request data, and the lengths of the request, the response and the + total transaction bytes. + +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, in + which every attempt to use it (except Closeable.close()) will throw a + ConnectionLostException. Whenever Closeable.close() is invoked the + instance may no longer be used. Any resources associated with it are freed + and can be reused. +

+ Typical usage (single slave, as per the example above): + +

+ // MISO, MOSI, CLK, SS on pins 3, 4, 5, 6, respectively.
+ SpiMaster spi = ioio.openSpiMaster(3, 4, 5, 6, SpiMaster.Rate.RATE_125K);
+ final byte[] request = new byte[]{ 0x23, 0x45 };
+ final byte[] response = new byte[3];
+ spi.writeRead(request, 2, 4, response, 3);
+ ...
+ spi.close();  // free SPI module and pins
+ 
+

+ +

+

+
See Also:
IOIO#openSpiMaster(Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], Config)
+
+ +

+ + + + + + + + + + + + + + + + + + + +
+Nested Class Summary
+static classSpiMaster.Config + +
+          SPI configuration structure.
+static classSpiMaster.Rate + +
+          Possible data rates for SPI, in Hz.
+static interfaceSpiMaster.Result + +
+          An object that can be waited on for asynchronous calls.
+  + + + + + + + + + + + + + + + + + + + +
+Method Summary
+ voidwriteRead(byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          Shorthand for writeRead(int, byte[], int, int, byte[], int) for + the single-slave case.
+ voidwriteRead(int slave, + byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          Perform a single SPI transaction which includes optional transmission and + optional reception of data to a single slave.
+ SpiMaster.ResultwriteReadAsync(int slave, + byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          The same as writeRead(int, byte[], int, int, byte[], int), but + returns immediately and returns a SpiMaster.Result object that can be + waited on.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+writeRead

+
+void writeRead(int slave,
+               byte[] writeData,
+               int writeSize,
+               int totalSize,
+               byte[] readData,
+               int readSize)
+               throws ConnectionLostException,
+                      java.lang.InterruptedException
+
+
Perform a single SPI transaction which includes optional transmission and + optional reception of data to a single slave. This is a blocking + operation that can take a few milliseconds to a few tens of milliseconds. + To abort this operation, client can interrupt the blocked thread. If + readSize is 0, the call returns immediately. +

+

+
+
+
+
Parameters:
slave - The slave index. It is determined by the index of its + slave-select pin, as per the array passed to + IOIO#openSpiMaster(Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], Config) + .
writeData - A byte array of data to write. May be null if writeSize is 0.
writeSize - Number of bytes to write. Valid values are 0 to totalSize.
totalSize - Total transaction length, in bytes. Valid values are 1 to 64.
readData - An array where the response is to be stored. May be null if + readSize is 0.
readSize - The number of expected response bytes. Valid values are 0 to + totalSize. +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost. +
java.lang.InterruptedException - Calling thread has been interrupted.
+
+
+
+ +

+writeRead

+
+void writeRead(byte[] writeData,
+               int writeSize,
+               int totalSize,
+               byte[] readData,
+               int readSize)
+               throws ConnectionLostException,
+                      java.lang.InterruptedException
+
+
Shorthand for writeRead(int, byte[], int, int, byte[], int) for + the single-slave case. +

+

+
+
+
+ +
Throws: +
ConnectionLostException +
java.lang.InterruptedException
See Also:
writeRead(int, byte[], int, int, byte[], int)
+
+
+
+ +

+writeReadAsync

+
+SpiMaster.Result writeReadAsync(int slave,
+                                byte[] writeData,
+                                int writeSize,
+                                int totalSize,
+                                byte[] readData,
+                                int readSize)
+                                throws ConnectionLostException
+
+
The same as writeRead(int, byte[], int, int, byte[], int), but + returns immediately and returns a SpiMaster.Result object that can be + waited on. If readSize is 0, the result object is ready immediately. +

+

+
+
+
+ +
Throws: +
ConnectionLostException
See Also:
writeRead(int, byte[], int, int, byte[], int)
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/TwiMaster.Rate.html b/IOIOLib/doc/ioio/lib/api/TwiMaster.Rate.html new file mode 100644 index 0000000..cb003bb --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/TwiMaster.Rate.html @@ -0,0 +1,341 @@ + + + + + + +TwiMaster.Rate + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum TwiMaster.Rate

+
+java.lang.Object
+  extended by java.lang.Enum<TwiMaster.Rate>
+      extended by ioio.lib.api.TwiMaster.Rate
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<TwiMaster.Rate>
+
+
+
Enclosing interface:
TwiMaster
+
+
+
+
public static enum TwiMaster.Rate
extends java.lang.Enum<TwiMaster.Rate>
+ + +

+


+ +

+ + + + + + + + + + + + + + + + +
+Enum Constant Summary
RATE_100KHz + +
+           
RATE_1MHz + +
+           
RATE_400KHz + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+static TwiMaster.RatevalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static TwiMaster.Rate[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+RATE_100KHz

+
+public static final TwiMaster.Rate RATE_100KHz
+
+
+
+
+
+ +

+RATE_400KHz

+
+public static final TwiMaster.Rate RATE_400KHz
+
+
+
+
+
+ +

+RATE_1MHz

+
+public static final TwiMaster.Rate RATE_1MHz
+
+
+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static TwiMaster.Rate[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (TwiMaster.Rate c : TwiMaster.Rate.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static TwiMaster.Rate valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/TwiMaster.Result.html b/IOIOLib/doc/ioio/lib/api/TwiMaster.Result.html new file mode 100644 index 0000000..9e0d983 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/TwiMaster.Result.html @@ -0,0 +1,223 @@ + + + + + + +TwiMaster.Result + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface TwiMaster.Result

+
+
Enclosing interface:
TwiMaster
+
+
+
+
public static interface TwiMaster.Result
+ + +

+An object that can be waited on for asynchronous calls. +

+ +

+


+ +

+ + + + + + + + + + + + +
+Method Summary
+ booleanwaitReady() + +
+          Wait until the asynchronous call which returned this instance is + complete.
+  +

+ + + + + + + + +
+Method Detail
+ +

+waitReady

+
+boolean waitReady()
+                  throws ConnectionLostException,
+                         java.lang.InterruptedException
+
+
Wait until the asynchronous call which returned this instance is + complete. +

+

+ +
Returns:
true if TWI transaction succeeded. +
Throws: +
ConnectionLostException - Connection with the IOIO has been lost. +
java.lang.InterruptedException - This operation has been interrupted.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/TwiMaster.html b/IOIOLib/doc/ioio/lib/api/TwiMaster.html new file mode 100644 index 0000000..53f0b48 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/TwiMaster.html @@ -0,0 +1,363 @@ + + + + + + +TwiMaster + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface TwiMaster

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface TwiMaster
extends Closeable
+ + +

+An interface for controlling a TWI module, in TWI bus-master mode, enabling + communication with multiple TWI-enabled slave modules. +

+ TWI (Two-Wire Interface) is a common hardware communication protocol, + enabling half-duplex, synchronous point-to-multi-point data transfer. It + requires a physical connection of two lines (SDA, SCL) shared by all the bus + nodes, where the SDA is open-drain and externally pulled-up. TwiMaster + instances are obtained by calling + IOIO#openTwiMaster(int, Rate, boolean). +

+ TWI is the generic name for the specific I2C and SMBus protocols, differing + mostly by the voltage levels they require. This module supports both. +

+ A TWI transaction is comprised of optional sending of a data buffer from the + master to a single slave, followed by an optional reception of a data buffer + from that slave. Slaves are designated by addresses, which may be 7-bit + (common) or 10-bit (less common). TWI transactions may fail, as a result of + the slave not responding or as result of the slave NACK'ing the request. Such + a transaction is executed using the + writeRead(int, boolean, byte[], int, byte[], int) method. +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, in +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, in + which every attempt to use it (except Closeable.close()) will throw a + ConnectionLostException. Whenever Closeable.close() is invoked the + instance may no longer be used. Any resources associated with it are freed + and can be reused. +

+ Typical usage: + +

+ // Uses the SDA1/SCL1 pins, I2C volatege levels at 100KHz. 
+ TwiMaster twi = ioio.openTwiMaster(1, TwiMaster.RATE_100KHz, false);
+ final byte[] request = new byte[]{ 0x23, 0x45 };
+ final byte[] response = new byte[3];
+ if (twi.writeRead(0x19, false, request, 2, response, 3)) {
+   // response is valid
+   ...
+ } else {
+   // handle error
+ }
+ twi.close();  // free TWI module and pins
+ 
+

+ +

+

+
See Also:
IOIO#openTwiMaster(int, Rate, boolean)
+
+ +

+ + + + + + + + + + + + + + + +
+Nested Class Summary
+static classTwiMaster.Rate + +
+           
+static interfaceTwiMaster.Result + +
+          An object that can be waited on for asynchronous calls.
+  + + + + + + + + + + + + + + + +
+Method Summary
+ booleanwriteRead(int address, + boolean tenBitAddr, + byte[] writeData, + int writeSize, + byte[] readData, + int readSize) + +
+          Perform a single TWI transaction which includes optional transmission and + optional reception of data to a single slave.
+ TwiMaster.ResultwriteReadAsync(int address, + boolean tenBitAddr, + byte[] writeData, + int writeSize, + byte[] readData, + int readSize) + +
+          Asynchronous version of + writeRead(int, boolean, byte[], int, byte[], int).
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+writeRead

+
+boolean writeRead(int address,
+                  boolean tenBitAddr,
+                  byte[] writeData,
+                  int writeSize,
+                  byte[] readData,
+                  int readSize)
+                  throws ConnectionLostException,
+                         java.lang.InterruptedException
+
+
Perform a single TWI transaction which includes optional transmission and + optional reception of data to a single slave. This is a blocking + operation that can take a few milliseconds to a few tens of milliseconds. + To abort this operation, client can interrupt the blocked thread. +

+

+
+
+
+
Parameters:
address - The slave address, either 7-bit or 10-bit. Note that in some + TWI device documentation the documented addresses are actually + 2x the address values used here, as they regard the trailing + 0-bit as part of the address.
tenBitAddr - Whether this is a 10-bit addressing mode.
writeData - The request data.
writeSize - The number of bytes to write. Valid value are 0-255.
readData - The array where the response should be stored.
readSize - The expected number of response bytes. Valid value are 0-255. +
Returns:
Whether operation succeeded. +
Throws: +
ConnectionLostException - Connection to the IOIO has been lost. +
java.lang.InterruptedException - Calling thread has been interrupted.
+
+
+
+ +

+writeReadAsync

+
+TwiMaster.Result writeReadAsync(int address,
+                                boolean tenBitAddr,
+                                byte[] writeData,
+                                int writeSize,
+                                byte[] readData,
+                                int readSize)
+                                throws ConnectionLostException
+
+
Asynchronous version of + writeRead(int, boolean, byte[], int, byte[], int). Returns + immediately and provides a TwiMaster.Result object on which the client can + wait for the result. +

+

+
+
+
+ +
Throws: +
ConnectionLostException
See Also:
writeRead(int, boolean, byte[], int, byte[], int)
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/Uart.Parity.html b/IOIOLib/doc/ioio/lib/api/Uart.Parity.html new file mode 100644 index 0000000..bafd70a --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/Uart.Parity.html @@ -0,0 +1,351 @@ + + + + + + +Uart.Parity + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum Uart.Parity

+
+java.lang.Object
+  extended by java.lang.Enum<Uart.Parity>
+      extended by ioio.lib.api.Uart.Parity
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<Uart.Parity>
+
+
+
Enclosing interface:
Uart
+
+
+
+
public static enum Uart.Parity
extends java.lang.Enum<Uart.Parity>
+ + +

+Parity-bit mode. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + +
+Enum Constant Summary
EVEN + +
+          Even parity.
NONE + +
+          No parity.
ODD + +
+          Odd parity.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static Uart.ParityvalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static Uart.Parity[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+NONE

+
+public static final Uart.Parity NONE
+
+
No parity. +

+

+
+
+
+ +

+EVEN

+
+public static final Uart.Parity EVEN
+
+
Even parity. +

+

+
+
+
+ +

+ODD

+
+public static final Uart.Parity ODD
+
+
Odd parity. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static Uart.Parity[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (Uart.Parity c : Uart.Parity.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static Uart.Parity valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/Uart.StopBits.html b/IOIOLib/doc/ioio/lib/api/Uart.StopBits.html new file mode 100644 index 0000000..d7c9ca1 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/Uart.StopBits.html @@ -0,0 +1,333 @@ + + + + + + +Uart.StopBits + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Enum Uart.StopBits

+
+java.lang.Object
+  extended by java.lang.Enum<Uart.StopBits>
+      extended by ioio.lib.api.Uart.StopBits
+
+
+
All Implemented Interfaces:
java.io.Serializable, java.lang.Comparable<Uart.StopBits>
+
+
+
Enclosing interface:
Uart
+
+
+
+
public static enum Uart.StopBits
extends java.lang.Enum<Uart.StopBits>
+ + +

+Number of stop-bits. +

+ +

+


+ +

+ + + + + + + + + + + + + +
+Enum Constant Summary
ONE + +
+          One stop bit.
TWO + +
+          Two stop bits.
+  + + + + + + + + + + + + + + + +
+Method Summary
+static Uart.StopBitsvalueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static Uart.StopBits[]values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+ + + + + + + +
Methods inherited from class java.lang.Enum
compareTo, equals, getDeclaringClass, hashCode, name, ordinal, toString, valueOf
+ + + + + + + +
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Enum Constant Detail
+ +

+ONE

+
+public static final Uart.StopBits ONE
+
+
One stop bit. +

+

+
+
+
+ +

+TWO

+
+public static final Uart.StopBits TWO
+
+
Two stop bits. +

+

+
+
+ + + + + + + + +
+Method Detail
+ +

+values

+
+public static Uart.StopBits[] values()
+
+
Returns an array containing the constants of this enum type, in +the order they are declared. This method may be used to iterate +over the constants as follows: +
+for (Uart.StopBits c : Uart.StopBits.values())
+    System.out.println(c);
+
+

+

+ +
Returns:
an array containing the constants of this enum type, in +the order they are declared
+
+
+
+ +

+valueOf

+
+public static Uart.StopBits valueOf(java.lang.String name)
+
+
Returns the enum constant of this type with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this type. (Extraneous whitespace characters are +not permitted.) +

+

+
Parameters:
name - the name of the enum constant to be returned. +
Returns:
the enum constant with the specified name +
Throws: +
java.lang.IllegalArgumentException - if this enum type has no constant +with the specified name +
java.lang.NullPointerException - if the argument is null
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/Uart.html b/IOIOLib/doc/ioio/lib/api/Uart.html new file mode 100644 index 0000000..56f260e --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/Uart.html @@ -0,0 +1,314 @@ + + + + + + +Uart + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api +
+Interface Uart

+
+
All Superinterfaces:
Closeable
+
+
+
+
public interface Uart
extends Closeable
+ + +

+An interface for controlling a UART module. +

+ UART is a very common hardware communication protocol, enabling full- duplex, + asynchronous point-to-point data transfer. It typically serves for opening + consoles or as a basis for higher-level protocols, such as MIDI, RS-232 and + RS-485. Uart instances are obtained by calling + IOIO#openUart(Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits). +

+ The UART protocol is completely symmetric - there is no "master" and "slave" + at this layer. Each end may send any number of bytes at arbitrary times, + making it very useful for terminals and terminal-controllable devices. +

+ Working with UART is very intuitive - it just provides a standard InputStream + and/or OutputStream. Optionally, one could create a read-only or write-only + UART instances, by passing null (or INVALID_PIN) for either TX or RX pins. +

+ The instance is alive since its creation. If the connection with the IOIO + drops at any point, the instance transitions to a disconnected state, which + every attempt to use it (except Closeable.close()) will throw a + ConnectionLostException. Whenever Closeable.close() is invoked the + instance may no longer be used. Any resources associated with it are freed + and can be reused. +

+ Typical usage: + +

+ Uart uart = ioio.openUart(3, 4, 19200, Parity.NONE, StopBits.ONE);
+ InputStream in = uart.getInputStream();
+ OutputStream out = uart.getOutputStream();
+ out.write(new String("Hello").getBytes());
+ int i = in.read();  // blocking
+ ...
+ uart.close();  // free UART module and pins
+ 
+

+ +

+

+
See Also:
IOIO#openUart(Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, + StopBits)
+
+ +

+ + + + + + + + + + + + + + + +
+Nested Class Summary
+static classUart.Parity + +
+          Parity-bit mode.
+static classUart.StopBits + +
+          Number of stop-bits.
+  + + + + + + + + + + + + + + + +
+Method Summary
+ java.io.InputStreamgetInputStream() + +
+          Gets the input stream.
+ java.io.OutputStreamgetOutputStream() + +
+          Gets the output stream.
+ + + + + + + +
Methods inherited from interface ioio.lib.api.Closeable
close
+  +

+ + + + + + + + +
+Method Detail
+ +

+getInputStream

+
+java.io.InputStream getInputStream()
+
+
Gets the input stream. +

+

+
+
+
+ +
Returns:
An input stream.
+
+
+
+ +

+getOutputStream

+
+java.io.OutputStream getOutputStream()
+
+
Gets the output stream. +

+

+
+
+
+ +
Returns:
An output stream.
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/AnalogInput.html b/IOIOLib/doc/ioio/lib/api/class-use/AnalogInput.html new file mode 100644 index 0000000..84305a2 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/AnalogInput.html @@ -0,0 +1,180 @@ + + + + + + +Uses of Interface ioio.lib.api.AnalogInput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.AnalogInput

+
+ + + + + + + + + +
+Packages that use AnalogInput
ioio.lib.api  
+  +

+ + + + + +
+Uses of AnalogInput in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that return AnalogInput
+ AnalogInputIOIO.openAnalogInput(int pin) + +
+          Open a pin for analog input.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/Closeable.html b/IOIOLib/doc/ioio/lib/api/class-use/Closeable.html new file mode 100644 index 0000000..0f8046a --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/Closeable.html @@ -0,0 +1,247 @@ + + + + + + +Uses of Interface ioio.lib.api.Closeable + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.Closeable

+
+ + + + + + + + + +
+Packages that use Closeable
ioio.lib.api  
+  +

+ + + + + +
+Uses of Closeable in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Subinterfaces of Closeable in ioio.lib.api
+ interfaceAnalogInput + +
+          A pin used for analog input.
+ interfaceDigitalInput + +
+          A pin used for digital input.
+ interfaceDigitalOutput + +
+          A pin used for digital output.
+ interfaceIcspMaster + +
+          An interface for controlling an ICSP channel, enabling Flash programming of + an external PIC MCU, and in particular, another IOIO board.
+ interfacePulseInput + +
+          An interface for pulse width and frequency measurements of digital signals.
+ interfacePwmOutput + +
+          A pin used for PWM (Pulse-Width Modulation) output.
+ interfaceSpiMaster + +
+          An interface for controlling an SPI module, in SPI bus-master mode, enabling + communication with multiple SPI-enabled slave modules.
+ interfaceTwiMaster + +
+          An interface for controlling a TWI module, in TWI bus-master mode, enabling + communication with multiple TWI-enabled slave modules.
+ interfaceUart + +
+          An interface for controlling a UART module.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.Mode.html b/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.Mode.html new file mode 100644 index 0000000..8b4294d --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.Mode.html @@ -0,0 +1,237 @@ + + + + + + +Uses of Class ioio.lib.api.DigitalInput.Spec.Mode + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.DigitalInput.Spec.Mode

+
+ + + + + + + + + +
+Packages that use DigitalInput.Spec.Mode
ioio.lib.api  
+  +

+ + + + + +
+Uses of DigitalInput.Spec.Mode in ioio.lib.api
+  +

+ + + + + + + + + +
Fields in ioio.lib.api declared as DigitalInput.Spec.Mode
+ DigitalInput.Spec.ModeDigitalInput.Spec.mode + +
+          The pin mode.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return DigitalInput.Spec.Mode
+static DigitalInput.Spec.ModeDigitalInput.Spec.Mode.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static DigitalInput.Spec.Mode[]DigitalInput.Spec.Mode.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type DigitalInput.Spec.Mode
+ DigitalInputIOIO.openDigitalInput(int pin, + DigitalInput.Spec.Mode mode) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)).
+  +

+ + + + + + + + +
Constructors in ioio.lib.api with parameters of type DigitalInput.Spec.Mode
DigitalInput.Spec(int pin, + DigitalInput.Spec.Mode mode) + +
+          Constructor.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.html b/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.html new file mode 100644 index 0000000..4392eeb --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.Spec.html @@ -0,0 +1,216 @@ + + + + + + +Uses of Class ioio.lib.api.DigitalInput.Spec + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.DigitalInput.Spec

+
+ + + + + + + + + +
+Packages that use DigitalInput.Spec
ioio.lib.api  
+  +

+ + + + + +
+Uses of DigitalInput.Spec in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api with parameters of type DigitalInput.Spec
+ DigitalInputIOIO.openDigitalInput(DigitalInput.Spec spec) + +
+          Open a pin for digital input.
+ PulseInputIOIO.openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, + PulseInput.PulseMode mode, + boolean doublePrecision) + +
+          Open a pin for pulse input.
+ SpiMasterIOIO.openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+ UartIOIO.openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.html b/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.html new file mode 100644 index 0000000..8477e5e --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/DigitalInput.html @@ -0,0 +1,197 @@ + + + + + + +Uses of Interface ioio.lib.api.DigitalInput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.DigitalInput

+
+ + + + + + + + + +
+Packages that use DigitalInput
ioio.lib.api  
+  +

+ + + + + +
+Uses of DigitalInput in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api that return DigitalInput
+ DigitalInputIOIO.openDigitalInput(DigitalInput.Spec spec) + +
+          Open a pin for digital input.
+ DigitalInputIOIO.openDigitalInput(int pin) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin)).
+ DigitalInputIOIO.openDigitalInput(int pin, + DigitalInput.Spec.Mode mode) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)).
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.Mode.html b/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.Mode.html new file mode 100644 index 0000000..75777ad --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.Mode.html @@ -0,0 +1,239 @@ + + + + + + +Uses of Class ioio.lib.api.DigitalOutput.Spec.Mode + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.DigitalOutput.Spec.Mode

+
+ + + + + + + + + +
+Packages that use DigitalOutput.Spec.Mode
ioio.lib.api  
+  +

+ + + + + +
+Uses of DigitalOutput.Spec.Mode in ioio.lib.api
+  +

+ + + + + + + + + +
Fields in ioio.lib.api declared as DigitalOutput.Spec.Mode
+ DigitalOutput.Spec.ModeDigitalOutput.Spec.mode + +
+          The pin mode.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return DigitalOutput.Spec.Mode
+static DigitalOutput.Spec.ModeDigitalOutput.Spec.Mode.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static DigitalOutput.Spec.Mode[]DigitalOutput.Spec.Mode.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type DigitalOutput.Spec.Mode
+ DigitalOutputIOIO.openDigitalOutput(int pin, + DigitalOutput.Spec.Mode mode, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + startValue).
+  +

+ + + + + + + + +
Constructors in ioio.lib.api with parameters of type DigitalOutput.Spec.Mode
DigitalOutput.Spec(int pin, + DigitalOutput.Spec.Mode mode) + +
+          Constructor.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.html b/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.html new file mode 100644 index 0000000..0bdce09 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.Spec.html @@ -0,0 +1,228 @@ + + + + + + +Uses of Class ioio.lib.api.DigitalOutput.Spec + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.DigitalOutput.Spec

+
+ + + + + + + + + +
+Packages that use DigitalOutput.Spec
ioio.lib.api  
+  +

+ + + + + +
+Uses of DigitalOutput.Spec in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api with parameters of type DigitalOutput.Spec
+ DigitalOutputIOIO.openDigitalOutput(DigitalOutput.Spec spec, + boolean startValue) + +
+          Open a pin for digital output.
+ PwmOutputIOIO.openPwmOutput(DigitalOutput.Spec spec, + int freqHz) + +
+          Open a pin for PWM (Pulse-Width Modulation) output.
+ SpiMasterIOIO.openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+ SpiMasterIOIO.openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+ UartIOIO.openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.html b/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.html new file mode 100644 index 0000000..026f835 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/DigitalOutput.html @@ -0,0 +1,209 @@ + + + + + + +Uses of Interface ioio.lib.api.DigitalOutput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.DigitalOutput

+
+ + + + + + + + + +
+Packages that use DigitalOutput
ioio.lib.api  
+  +

+ + + + + +
+Uses of DigitalOutput in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api that return DigitalOutput
+ DigitalOutputIOIO.openDigitalOutput(DigitalOutput.Spec spec, + boolean startValue) + +
+          Open a pin for digital output.
+ DigitalOutputIOIO.openDigitalOutput(int pin) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), false).
+ DigitalOutputIOIO.openDigitalOutput(int pin, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), startValue).
+ DigitalOutputIOIO.openDigitalOutput(int pin, + DigitalOutput.Spec.Mode mode, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + startValue).
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/IOIO.VersionType.html b/IOIOLib/doc/ioio/lib/api/class-use/IOIO.VersionType.html new file mode 100644 index 0000000..b8c24ae --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/IOIO.VersionType.html @@ -0,0 +1,205 @@ + + + + + + +Uses of Class ioio.lib.api.IOIO.VersionType + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.IOIO.VersionType

+
+ + + + + + + + + +
+Packages that use IOIO.VersionType
ioio.lib.api  
+  +

+ + + + + +
+Uses of IOIO.VersionType in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return IOIO.VersionType
+static IOIO.VersionTypeIOIO.VersionType.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static IOIO.VersionType[]IOIO.VersionType.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type IOIO.VersionType
+ java.lang.StringIOIO.getImplVersion(IOIO.VersionType v) + +
+          Query the implementation version of the system's components.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/IOIO.html b/IOIOLib/doc/ioio/lib/api/class-use/IOIO.html new file mode 100644 index 0000000..cc2e5d6 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/IOIO.html @@ -0,0 +1,197 @@ + + + + + + +Uses of Interface ioio.lib.api.IOIO + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.IOIO

+
+ + + + + + + + + +
+Packages that use IOIO
ioio.lib.api  
+  +

+ + + + + +
+Uses of IOIO in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api that return IOIO
+static IOIOIOIOFactory.create() + +
+          Create a IOIO instance.
+static IOIOIOIOFactory.create(IOIOConnection connection) + +
+           
+static IOIOIOIOFactory.create(java.lang.String connectionClassName, + java.lang.Object... args) + +
+          Create a IOIO instance with a user-provided underlying connection class.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/IOIOConnection.html b/IOIOLib/doc/ioio/lib/api/class-use/IOIOConnection.html new file mode 100644 index 0000000..b9acf91 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/IOIOConnection.html @@ -0,0 +1,197 @@ + + + + + + +Uses of Interface ioio.lib.api.IOIOConnection + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.IOIOConnection

+
+ + + + + + + + + +
+Packages that use IOIOConnection
ioio.lib.api  
+  +

+ + + + + +
+Uses of IOIOConnection in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that return IOIOConnection
+static IOIOConnectionIOIOFactory.createConnectionDynamically(java.lang.String connectionClassName, + java.lang.Object... args) + +
+           
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type IOIOConnection
+static IOIOIOIOFactory.create(IOIOConnection connection) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/IOIOFactory.html b/IOIOLib/doc/ioio/lib/api/class-use/IOIOFactory.html new file mode 100644 index 0000000..fe0537c --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/IOIOFactory.html @@ -0,0 +1,144 @@ + + + + + + +Uses of Class ioio.lib.api.IOIOFactory + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.IOIOFactory

+
+No usage of ioio.lib.api.IOIOFactory +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/IcspMaster.html b/IOIOLib/doc/ioio/lib/api/class-use/IcspMaster.html new file mode 100644 index 0000000..eb4f014 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/IcspMaster.html @@ -0,0 +1,181 @@ + + + + + + +Uses of Interface ioio.lib.api.IcspMaster + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.IcspMaster

+
+ + + + + + + + + +
+Packages that use IcspMaster
ioio.lib.api  
+  +

+ + + + + +
+Uses of IcspMaster in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that return IcspMaster
+ IcspMasterIOIO.openIcspMaster() + +
+          Open an ICSP channel, enabling Flash programming of an external PIC MCU, + and in particular, another IOIO board.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.ClockRate.html b/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.ClockRate.html new file mode 100644 index 0000000..4fb5d41 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.ClockRate.html @@ -0,0 +1,208 @@ + + + + + + +Uses of Class ioio.lib.api.PulseInput.ClockRate + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.PulseInput.ClockRate

+
+ + + + + + + + + +
+Packages that use PulseInput.ClockRate
ioio.lib.api  
+  +

+ + + + + +
+Uses of PulseInput.ClockRate in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return PulseInput.ClockRate
+static PulseInput.ClockRatePulseInput.ClockRate.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static PulseInput.ClockRate[]PulseInput.ClockRate.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type PulseInput.ClockRate
+ PulseInputIOIO.openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, + PulseInput.PulseMode mode, + boolean doublePrecision) + +
+          Open a pin for pulse input.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.PulseMode.html b/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.PulseMode.html new file mode 100644 index 0000000..928bc10 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.PulseMode.html @@ -0,0 +1,218 @@ + + + + + + +Uses of Class ioio.lib.api.PulseInput.PulseMode + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.PulseInput.PulseMode

+
+ + + + + + + + + +
+Packages that use PulseInput.PulseMode
ioio.lib.api  
+  +

+ + + + + +
+Uses of PulseInput.PulseMode in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return PulseInput.PulseMode
+static PulseInput.PulseModePulseInput.PulseMode.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static PulseInput.PulseMode[]PulseInput.PulseMode.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api with parameters of type PulseInput.PulseMode
+ PulseInputIOIO.openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, + PulseInput.PulseMode mode, + boolean doublePrecision) + +
+          Open a pin for pulse input.
+ PulseInputIOIO.openPulseInput(int pin, + PulseInput.PulseMode mode) + +
+          Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + true), i.e.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.html b/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.html new file mode 100644 index 0000000..078d572 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/PulseInput.html @@ -0,0 +1,193 @@ + + + + + + +Uses of Interface ioio.lib.api.PulseInput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.PulseInput

+
+ + + + + + + + + +
+Packages that use PulseInput
ioio.lib.api  
+  +

+ + + + + +
+Uses of PulseInput in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return PulseInput
+ PulseInputIOIO.openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, + PulseInput.PulseMode mode, + boolean doublePrecision) + +
+          Open a pin for pulse input.
+ PulseInputIOIO.openPulseInput(int pin, + PulseInput.PulseMode mode) + +
+          Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + true), i.e.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/PwmOutput.html b/IOIOLib/doc/ioio/lib/api/class-use/PwmOutput.html new file mode 100644 index 0000000..f9b0deb --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/PwmOutput.html @@ -0,0 +1,190 @@ + + + + + + +Uses of Interface ioio.lib.api.PwmOutput + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.PwmOutput

+
+ + + + + + + + + +
+Packages that use PwmOutput
ioio.lib.api  
+  +

+ + + + + +
+Uses of PwmOutput in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return PwmOutput
+ PwmOutputIOIO.openPwmOutput(DigitalOutput.Spec spec, + int freqHz) + +
+          Open a pin for PWM (Pulse-Width Modulation) output.
+ PwmOutputIOIO.openPwmOutput(int pin, + int freqHz) + +
+          Shorthand for openPwmOutput(new DigitalOutput.Spec(pin), freqHz).
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Config.html b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Config.html new file mode 100644 index 0000000..bd057b5 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Config.html @@ -0,0 +1,185 @@ + + + + + + +Uses of Class ioio.lib.api.SpiMaster.Config + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.SpiMaster.Config

+
+ + + + + + + + + +
+Packages that use SpiMaster.Config
ioio.lib.api  
+  +

+ + + + + +
+Uses of SpiMaster.Config in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type SpiMaster.Config
+ SpiMasterIOIO.openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Rate.html b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Rate.html new file mode 100644 index 0000000..9c1ccb1 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Rate.html @@ -0,0 +1,262 @@ + + + + + + +Uses of Class ioio.lib.api.SpiMaster.Rate + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.SpiMaster.Rate

+
+ + + + + + + + + +
+Packages that use SpiMaster.Rate
ioio.lib.api  
+  +

+ + + + + +
+Uses of SpiMaster.Rate in ioio.lib.api
+  +

+ + + + + + + + + +
Fields in ioio.lib.api declared as SpiMaster.Rate
+ SpiMaster.RateSpiMaster.Config.rate + +
+          Data rate.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return SpiMaster.Rate
+static SpiMaster.RateSpiMaster.Rate.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static SpiMaster.Rate[]SpiMaster.Rate.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api with parameters of type SpiMaster.Rate
+ SpiMasterIOIO.openSpiMaster(int miso, + int mosi, + int clk, + int[] slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the pins are all open with the default modes and default configuration values are used.
+ SpiMasterIOIO.openSpiMaster(int miso, + int mosi, + int clk, + int slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the MISO pins is opened with pull up, and the other pins are open + with the default modes and default configuration values are used.
+  +

+ + + + + + + + + + + +
Constructors in ioio.lib.api with parameters of type SpiMaster.Rate
SpiMaster.Config(SpiMaster.Rate rate) + +
+          Constructor with common defaults.
SpiMaster.Config(SpiMaster.Rate rate, + boolean invertClk, + boolean sampleOnTrailing) + +
+          Constructor.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Result.html b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Result.html new file mode 100644 index 0000000..9710584 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.Result.html @@ -0,0 +1,187 @@ + + + + + + +Uses of Interface ioio.lib.api.SpiMaster.Result + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.SpiMaster.Result

+
+ + + + + + + + + +
+Packages that use SpiMaster.Result
ioio.lib.api  
+  +

+ + + + + +
+Uses of SpiMaster.Result in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that return SpiMaster.Result
+ SpiMaster.ResultSpiMaster.writeReadAsync(int slave, + byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          The same as SpiMaster.writeRead(int, byte[], int, int, byte[], int), but + returns immediately and returns a SpiMaster.Result object that can be + waited on.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.html b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.html new file mode 100644 index 0000000..8d3f29e --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/SpiMaster.html @@ -0,0 +1,212 @@ + + + + + + +Uses of Interface ioio.lib.api.SpiMaster + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.SpiMaster

+
+ + + + + + + + + +
+Packages that use SpiMaster
ioio.lib.api  
+  +

+ + + + + +
+Uses of SpiMaster in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api that return SpiMaster
+ SpiMasterIOIO.openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+ SpiMasterIOIO.openSpiMaster(int miso, + int mosi, + int clk, + int[] slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the pins are all open with the default modes and default configuration values are used.
+ SpiMasterIOIO.openSpiMaster(int miso, + int mosi, + int clk, + int slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the MISO pins is opened with pull up, and the other pins are open + with the default modes and default configuration values are used.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Rate.html b/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Rate.html new file mode 100644 index 0000000..44d9536 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Rate.html @@ -0,0 +1,208 @@ + + + + + + +Uses of Class ioio.lib.api.TwiMaster.Rate + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.TwiMaster.Rate

+
+ + + + + + + + + +
+Packages that use TwiMaster.Rate
ioio.lib.api  
+  +

+ + + + + +
+Uses of TwiMaster.Rate in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return TwiMaster.Rate
+static TwiMaster.RateTwiMaster.Rate.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static TwiMaster.Rate[]TwiMaster.Rate.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + +
Methods in ioio.lib.api with parameters of type TwiMaster.Rate
+ TwiMasterIOIO.openTwiMaster(int twiNum, + TwiMaster.Rate rate, + boolean smbus) + +
+          Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + enabling communication with multiple TWI-enabled slave modules.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Result.html b/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Result.html new file mode 100644 index 0000000..dd076d6 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.Result.html @@ -0,0 +1,186 @@ + + + + + + +Uses of Interface ioio.lib.api.TwiMaster.Result + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.TwiMaster.Result

+
+ + + + + + + + + +
+Packages that use TwiMaster.Result
ioio.lib.api  
+  +

+ + + + + +
+Uses of TwiMaster.Result in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that return TwiMaster.Result
+ TwiMaster.ResultTwiMaster.writeReadAsync(int address, + boolean tenBitAddr, + byte[] writeData, + int writeSize, + byte[] readData, + int readSize) + +
+          Asynchronous version of + TwiMaster.writeRead(int, boolean, byte[], int, byte[], int).
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.html b/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.html new file mode 100644 index 0000000..f1c62ad --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/TwiMaster.html @@ -0,0 +1,183 @@ + + + + + + +Uses of Interface ioio.lib.api.TwiMaster + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.TwiMaster

+
+ + + + + + + + + +
+Packages that use TwiMaster
ioio.lib.api  
+  +

+ + + + + +
+Uses of TwiMaster in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that return TwiMaster
+ TwiMasterIOIO.openTwiMaster(int twiNum, + TwiMaster.Rate rate, + boolean smbus) + +
+          Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + enabling communication with multiple TWI-enabled slave modules.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/Uart.Parity.html b/IOIOLib/doc/ioio/lib/api/class-use/Uart.Parity.html new file mode 100644 index 0000000..b880359 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/Uart.Parity.html @@ -0,0 +1,223 @@ + + + + + + +Uses of Class ioio.lib.api.Uart.Parity + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.Uart.Parity

+
+ + + + + + + + + +
+Packages that use Uart.Parity
ioio.lib.api  
+  +

+ + + + + +
+Uses of Uart.Parity in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return Uart.Parity
+static Uart.ParityUart.Parity.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static Uart.Parity[]Uart.Parity.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api with parameters of type Uart.Parity
+ UartIOIO.openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+ UartIOIO.openUart(int rx, + int tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/Uart.StopBits.html b/IOIOLib/doc/ioio/lib/api/class-use/Uart.StopBits.html new file mode 100644 index 0000000..7daf2c3 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/Uart.StopBits.html @@ -0,0 +1,223 @@ + + + + + + +Uses of Class ioio.lib.api.Uart.StopBits + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.Uart.StopBits

+
+ + + + + + + + + +
+Packages that use Uart.StopBits
ioio.lib.api  
+  +

+ + + + + +
+Uses of Uart.StopBits in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return Uart.StopBits
+static Uart.StopBitsUart.StopBits.valueOf(java.lang.String name) + +
+          Returns the enum constant of this type with the specified name.
+static Uart.StopBits[]Uart.StopBits.values() + +
+          Returns an array containing the constants of this enum type, in +the order they are declared.
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api with parameters of type Uart.StopBits
+ UartIOIO.openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+ UartIOIO.openUart(int rx, + int tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/class-use/Uart.html b/IOIOLib/doc/ioio/lib/api/class-use/Uart.html new file mode 100644 index 0000000..e5b52f5 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/class-use/Uart.html @@ -0,0 +1,198 @@ + + + + + + +Uses of Interface ioio.lib.api.Uart + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.api.Uart

+
+ + + + + + + + + +
+Packages that use Uart
ioio.lib.api  
+  +

+ + + + + +
+Uses of Uart in ioio.lib.api
+  +

+ + + + + + + + + + + + + +
Methods in ioio.lib.api that return Uart
+ UartIOIO.openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+ UartIOIO.openUart(int rx, + int tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/ConnectionLostException.html b/IOIOLib/doc/ioio/lib/api/exception/ConnectionLostException.html new file mode 100644 index 0000000..632f70f --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/ConnectionLostException.html @@ -0,0 +1,259 @@ + + + + + + +ConnectionLostException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api.exception +
+Class ConnectionLostException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by ioio.lib.api.exception.ConnectionLostException
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public class ConnectionLostException
extends java.lang.Exception
+ + +

+Thrown when the connection between Android and IOIO has been lost or + disconnected. +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + + + + +
+Constructor Summary
ConnectionLostException() + +
+           
ConnectionLostException(java.lang.Exception e) + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+ConnectionLostException

+
+public ConnectionLostException(java.lang.Exception e)
+
+
+
+ +

+ConnectionLostException

+
+public ConnectionLostException()
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/IncompatibilityException.html b/IOIOLib/doc/ioio/lib/api/exception/IncompatibilityException.html new file mode 100644 index 0000000..fceae13 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/IncompatibilityException.html @@ -0,0 +1,245 @@ + + + + + + +IncompatibilityException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api.exception +
+Class IncompatibilityException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by ioio.lib.api.exception.IncompatibilityException
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public class IncompatibilityException
extends java.lang.Exception
+ + +

+Thrown when an incompatibility of system components is detected, such as when + an unsupported board hardware or software version is encountered. +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
IncompatibilityException(java.lang.String msg) + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+IncompatibilityException

+
+public IncompatibilityException(java.lang.String msg)
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/OutOfResourceException.html b/IOIOLib/doc/ioio/lib/api/exception/OutOfResourceException.html new file mode 100644 index 0000000..4a622bb --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/OutOfResourceException.html @@ -0,0 +1,247 @@ + + + + + + +OutOfResourceException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.api.exception +
+Class OutOfResourceException

+
+java.lang.Object
+  extended by java.lang.Throwable
+      extended by java.lang.Exception
+          extended by java.lang.RuntimeException
+              extended by ioio.lib.api.exception.OutOfResourceException
+
+
+
All Implemented Interfaces:
java.io.Serializable
+
+
+
+
public class OutOfResourceException
extends java.lang.RuntimeException
+ + +

+The IOIO board does not have anymore of the requested resource. This + exceptions do not need to be handled if the client guarantees that the limits + on concurrent resource usage are never exceeded. +

+ +

+

+
See Also:
Serialized Form
+
+ +

+ + + + + + + + + + + +
+Constructor Summary
OutOfResourceException(java.lang.String msg) + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Throwable
fillInStackTrace, getCause, getLocalizedMessage, getMessage, getStackTrace, initCause, printStackTrace, printStackTrace, printStackTrace, setStackTrace, toString
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+OutOfResourceException

+
+public OutOfResourceException(java.lang.String msg)
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/class-use/ConnectionLostException.html b/IOIOLib/doc/ioio/lib/api/exception/class-use/ConnectionLostException.html new file mode 100644 index 0000000..2c7cdc0 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/class-use/ConnectionLostException.html @@ -0,0 +1,643 @@ + + + + + + +Uses of Class ioio.lib.api.exception.ConnectionLostException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.exception.ConnectionLostException

+
+ + + + + + + + + +
+Packages that use ConnectionLostException
ioio.lib.api  
+  +

+ + + + + +
+Uses of ConnectionLostException in ioio.lib.api
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Methods in ioio.lib.api that throw ConnectionLostException
+ voidIcspMaster.enterProgramming() + +
+          Initiate a sequence that will put the slave device in programming mode.
+ voidIcspMaster.executeInstruction(int instruction) + +
+          Execute a single instruction on the slave MCU.
+ voidIcspMaster.exitProgramming() + +
+          Initiate a sequence that will put the slave device out of programming + mode.
+ floatPulseInput.getDuration() + +
+          Gets the pulse duration in case of pulse measurement mode, or the period + in case of frequency mode.
+ floatPulseInput.getFrequency() + +
+          Gets the momentary frequency of the measured signal.
+ java.lang.StringIOIO.getImplVersion(IOIO.VersionType v) + +
+          Query the implementation version of the system's components.
+ java.io.InputStreamIOIOConnection.getInputStream() + +
+           
+ java.io.OutputStreamIOIOConnection.getOutputStream() + +
+           
+ floatAnalogInput.getVoltage() + +
+          Gets the analog input reading, as an absolute voltage in Volt units.
+ voidIOIO.hardReset() + +
+          Equivalent to disconnecting and reconnecting the board power supply.
+ AnalogInputIOIO.openAnalogInput(int pin) + +
+          Open a pin for analog input.
+ DigitalInputIOIO.openDigitalInput(DigitalInput.Spec spec) + +
+          Open a pin for digital input.
+ DigitalInputIOIO.openDigitalInput(int pin) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin)).
+ DigitalInputIOIO.openDigitalInput(int pin, + DigitalInput.Spec.Mode mode) + +
+          Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)).
+ DigitalOutputIOIO.openDigitalOutput(DigitalOutput.Spec spec, + boolean startValue) + +
+          Open a pin for digital output.
+ DigitalOutputIOIO.openDigitalOutput(int pin) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), false).
+ DigitalOutputIOIO.openDigitalOutput(int pin, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), startValue).
+ DigitalOutputIOIO.openDigitalOutput(int pin, + DigitalOutput.Spec.Mode mode, + boolean startValue) + +
+          Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + startValue).
+ IcspMasterIOIO.openIcspMaster() + +
+          Open an ICSP channel, enabling Flash programming of an external PIC MCU, + and in particular, another IOIO board.
+ PulseInputIOIO.openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, + PulseInput.PulseMode mode, + boolean doublePrecision) + +
+          Open a pin for pulse input.
+ PulseInputIOIO.openPulseInput(int pin, + PulseInput.PulseMode mode) + +
+          Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + true), i.e.
+ PwmOutputIOIO.openPwmOutput(DigitalOutput.Spec spec, + int freqHz) + +
+          Open a pin for PWM (Pulse-Width Modulation) output.
+ PwmOutputIOIO.openPwmOutput(int pin, + int freqHz) + +
+          Shorthand for openPwmOutput(new DigitalOutput.Spec(pin), freqHz).
+ SpiMasterIOIO.openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, + DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, + SpiMaster.Config config) + +
+          Open a SPI master module, enabling communication with multiple + SPI-enabled slave modules.
+ SpiMasterIOIO.openSpiMaster(int miso, + int mosi, + int clk, + int[] slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the pins are all open with the default modes and default configuration values are used.
+ SpiMasterIOIO.openSpiMaster(int miso, + int mosi, + int clk, + int slaveSelect, + SpiMaster.Rate rate) + +
+          Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + where the MISO pins is opened with pull up, and the other pins are open + with the default modes and default configuration values are used.
+ TwiMasterIOIO.openTwiMaster(int twiNum, + TwiMaster.Rate rate, + boolean smbus) + +
+          Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + enabling communication with multiple TWI-enabled slave modules.
+ UartIOIO.openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Open a UART module, enabling a bulk transfer of byte buffers.
+ UartIOIO.openUart(int rx, + int tx, + int baud, + Uart.Parity parity, + Uart.StopBits stopbits) + +
+          Shorthand for + #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + , where the input pins use their default specs.
+ booleanDigitalInput.read() + +
+          Read the value sensed on the pin.
+ floatAnalogInput.read() + +
+          Gets the analog input reading, as a scaled real value between 0 and 1.
+ voidIcspMaster.readVisi() + +
+          Request a read of the VISI register on the slave MCU.
+ voidPwmOutput.setDutyCycle(float dutyCycle) + +
+          Sets the duty cycle of the PWM output.
+ voidPwmOutput.setPulseWidth(float pulseWidthUs) + +
+          The same as PwmOutput.setPulseWidth(int), but with sub-microsecond + precision.
+ voidPwmOutput.setPulseWidth(int pulseWidthUs) + +
+          Sets the pulse width of the PWM output.
+ voidIOIO.softReset() + +
+          Resets the entire state (returning to initial state), without dropping + the connection.
+ voidIOIOConnection.waitForConnect() + +
+           
+ voidIOIO.waitForConnect() + +
+          Establishes connection with the IOIO board.
+ voidDigitalInput.waitForValue(boolean value) + +
+          Block until a desired logical level is sensed.
+ floatPulseInput.waitPulseGetDuration() + +
+          Reads a single measurement from the queue.
+ booleanTwiMaster.Result.waitReady() + +
+          Wait until the asynchronous call which returned this instance is + complete.
+ voidSpiMaster.Result.waitReady() + +
+          Wait until the asynchronous call which returned this instance is + complete.
+ intIcspMaster.waitVisiResult() + +
+          Wait and return a result of a call to IcspMaster.readVisi().
+ voidDigitalOutput.write(boolean val) + +
+          Set the output of the pin.
+ voidSpiMaster.writeRead(byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          Shorthand for SpiMaster.writeRead(int, byte[], int, int, byte[], int) for + the single-slave case.
+ booleanTwiMaster.writeRead(int address, + boolean tenBitAddr, + byte[] writeData, + int writeSize, + byte[] readData, + int readSize) + +
+          Perform a single TWI transaction which includes optional transmission and + optional reception of data to a single slave.
+ voidSpiMaster.writeRead(int slave, + byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          Perform a single SPI transaction which includes optional transmission and + optional reception of data to a single slave.
+ TwiMaster.ResultTwiMaster.writeReadAsync(int address, + boolean tenBitAddr, + byte[] writeData, + int writeSize, + byte[] readData, + int readSize) + +
+          Asynchronous version of + TwiMaster.writeRead(int, boolean, byte[], int, byte[], int).
+ SpiMaster.ResultSpiMaster.writeReadAsync(int slave, + byte[] writeData, + int writeSize, + int totalSize, + byte[] readData, + int readSize) + +
+          The same as SpiMaster.writeRead(int, byte[], int, int, byte[], int), but + returns immediately and returns a SpiMaster.Result object that can be + waited on.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/class-use/IncompatibilityException.html b/IOIOLib/doc/ioio/lib/api/exception/class-use/IncompatibilityException.html new file mode 100644 index 0000000..6fe013b --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/class-use/IncompatibilityException.html @@ -0,0 +1,180 @@ + + + + + + +Uses of Class ioio.lib.api.exception.IncompatibilityException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.exception.IncompatibilityException

+
+ + + + + + + + + +
+Packages that use IncompatibilityException
ioio.lib.api  
+  +

+ + + + + +
+Uses of IncompatibilityException in ioio.lib.api
+  +

+ + + + + + + + + +
Methods in ioio.lib.api that throw IncompatibilityException
+ voidIOIO.waitForConnect() + +
+          Establishes connection with the IOIO board.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/class-use/OutOfResourceException.html b/IOIOLib/doc/ioio/lib/api/exception/class-use/OutOfResourceException.html new file mode 100644 index 0000000..bba6af4 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/class-use/OutOfResourceException.html @@ -0,0 +1,144 @@ + + + + + + +Uses of Class ioio.lib.api.exception.OutOfResourceException + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.api.exception.OutOfResourceException

+
+No usage of ioio.lib.api.exception.OutOfResourceException +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/package-frame.html b/IOIOLib/doc/ioio/lib/api/exception/package-frame.html new file mode 100644 index 0000000..3d06db5 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/package-frame.html @@ -0,0 +1,36 @@ + + + + + + +ioio.lib.api.exception + + + + + + + + + + + +ioio.lib.api.exception + + + + +
+Exceptions  + +
+ConnectionLostException +
+IncompatibilityException +
+OutOfResourceException
+ + + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/package-summary.html b/IOIOLib/doc/ioio/lib/api/exception/package-summary.html new file mode 100644 index 0000000..492b825 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/package-summary.html @@ -0,0 +1,167 @@ + + + + + + +ioio.lib.api.exception + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package ioio.lib.api.exception +

+ + + + + + + + + + + + + + + + + +
+Exception Summary
ConnectionLostExceptionThrown when the connection between Android and IOIO has been lost or + disconnected.
IncompatibilityExceptionThrown when an incompatibility of system components is detected, such as when + an unsupported board hardware or software version is encountered.
OutOfResourceExceptionThe IOIO board does not have anymore of the requested resource.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/package-tree.html b/IOIOLib/doc/ioio/lib/api/exception/package-tree.html new file mode 100644 index 0000000..567e61a --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/package-tree.html @@ -0,0 +1,160 @@ + + + + + + +ioio.lib.api.exception Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package ioio.lib.api.exception +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/exception/package-use.html b/IOIOLib/doc/ioio/lib/api/exception/package-use.html new file mode 100644 index 0000000..42c0377 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/exception/package-use.html @@ -0,0 +1,178 @@ + + + + + + +Uses of Package ioio.lib.api.exception + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Package
ioio.lib.api.exception

+
+ + + + + + + + + +
+Packages that use ioio.lib.api.exception
ioio.lib.api  
+  +

+ + + + + + + + + + + +
+Classes in ioio.lib.api.exception used by ioio.lib.api
ConnectionLostException + +
+          Thrown when the connection between Android and IOIO has been lost or + disconnected.
IncompatibilityException + +
+          Thrown when an incompatibility of system components is detected, such as when + an unsupported board hardware or software version is encountered.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/package-frame.html b/IOIOLib/doc/ioio/lib/api/package-frame.html new file mode 100644 index 0000000..d787a7a --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/package-frame.html @@ -0,0 +1,102 @@ + + + + + + +ioio.lib.api + + + + + + + + + + + +ioio.lib.api + + + + +
+Interfaces  + +
+AnalogInput +
+Closeable +
+DigitalInput +
+DigitalOutput +
+IcspMaster +
+IOIO +
+IOIOConnection +
+PulseInput +
+PwmOutput +
+SpiMaster +
+SpiMaster.Result +
+TwiMaster +
+TwiMaster.Result +
+Uart
+ + + + + + +
+Classes  + +
+DigitalInput.Spec +
+DigitalOutput.Spec +
+IOIOFactory +
+SpiMaster.Config
+ + + + + + +
+Enums  + +
+DigitalInput.Spec.Mode +
+DigitalOutput.Spec.Mode +
+IOIO.VersionType +
+PulseInput.ClockRate +
+PulseInput.PulseMode +
+SpiMaster.Rate +
+TwiMaster.Rate +
+Uart.Parity +
+Uart.StopBits
+ + + + diff --git a/IOIOLib/doc/ioio/lib/api/package-summary.html b/IOIOLib/doc/ioio/lib/api/package-summary.html new file mode 100644 index 0000000..d5eb330 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/package-summary.html @@ -0,0 +1,284 @@ + + + + + + +ioio.lib.api + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package ioio.lib.api +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Interface Summary
AnalogInputA pin used for analog input.
Closeable 
DigitalInputA pin used for digital input.
DigitalOutputA pin used for digital output.
IcspMasterAn interface for controlling an ICSP channel, enabling Flash programming of + an external PIC MCU, and in particular, another IOIO board.
IOIOThis interface provides control over all the IOIO board functions.
IOIOConnection 
PulseInputAn interface for pulse width and frequency measurements of digital signals.
PwmOutputA pin used for PWM (Pulse-Width Modulation) output.
SpiMasterAn interface for controlling an SPI module, in SPI bus-master mode, enabling + communication with multiple SPI-enabled slave modules.
SpiMaster.ResultAn object that can be waited on for asynchronous calls.
TwiMasterAn interface for controlling a TWI module, in TWI bus-master mode, enabling + communication with multiple TWI-enabled slave modules.
TwiMaster.ResultAn object that can be waited on for asynchronous calls.
UartAn interface for controlling a UART module.
+  + +

+ + + + + + + + + + + + + + + + + + + + + +
+Class Summary
DigitalInput.SpecA digital input pin specification, used when opening digital inputs.
DigitalOutput.SpecA digital output pin specification, used when opening digital outputs.
IOIOFactoryFactory class for creating instances of the IOIO interface.
SpiMaster.ConfigSPI configuration structure.
+  + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Enum Summary
DigitalInput.Spec.ModeInput pin mode.
DigitalOutput.Spec.ModeOutput pin mode.
IOIO.VersionTypeA versioned component in the system.
PulseInput.ClockRateSuported clock rate enum.
PulseInput.PulseModeAn enumeration for describing the module's operating mode.
SpiMaster.RatePossible data rates for SPI, in Hz.
TwiMaster.Rate 
Uart.ParityParity-bit mode.
Uart.StopBitsNumber of stop-bits.
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/package-tree.html b/IOIOLib/doc/ioio/lib/api/package-tree.html new file mode 100644 index 0000000..82d8718 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/package-tree.html @@ -0,0 +1,170 @@ + + + + + + +ioio.lib.api Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package ioio.lib.api +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/api/package-use.html b/IOIOLib/doc/ioio/lib/api/package-use.html new file mode 100644 index 0000000..cd0d47d --- /dev/null +++ b/IOIOLib/doc/ioio/lib/api/package-use.html @@ -0,0 +1,323 @@ + + + + + + +Uses of Package ioio.lib.api + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Package
ioio.lib.api

+
+ + + + + + + + + +
+Packages that use ioio.lib.api
ioio.lib.api  
+  +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Classes in ioio.lib.api used by ioio.lib.api
AnalogInput + +
+          A pin used for analog input.
Closeable + +
+           
DigitalInput + +
+          A pin used for digital input.
DigitalInput.Spec + +
+          A digital input pin specification, used when opening digital inputs.
DigitalInput.Spec.Mode + +
+          Input pin mode.
DigitalOutput + +
+          A pin used for digital output.
DigitalOutput.Spec + +
+          A digital output pin specification, used when opening digital outputs.
DigitalOutput.Spec.Mode + +
+          Output pin mode.
IcspMaster + +
+          An interface for controlling an ICSP channel, enabling Flash programming of + an external PIC MCU, and in particular, another IOIO board.
IOIO + +
+          This interface provides control over all the IOIO board functions.
IOIO.VersionType + +
+          A versioned component in the system.
IOIOConnection + +
+           
PulseInput + +
+          An interface for pulse width and frequency measurements of digital signals.
PulseInput.ClockRate + +
+          Suported clock rate enum.
PulseInput.PulseMode + +
+          An enumeration for describing the module's operating mode.
PwmOutput + +
+          A pin used for PWM (Pulse-Width Modulation) output.
SpiMaster + +
+          An interface for controlling an SPI module, in SPI bus-master mode, enabling + communication with multiple SPI-enabled slave modules.
SpiMaster.Config + +
+          SPI configuration structure.
SpiMaster.Rate + +
+          Possible data rates for SPI, in Hz.
SpiMaster.Result + +
+          An object that can be waited on for asynchronous calls.
TwiMaster + +
+          An interface for controlling a TWI module, in TWI bus-master mode, enabling + communication with multiple TWI-enabled slave modules.
TwiMaster.Rate + +
+           
TwiMaster.Result + +
+          An object that can be waited on for asynchronous calls.
Uart + +
+          An interface for controlling a UART module.
Uart.Parity + +
+          Parity-bit mode.
Uart.StopBits + +
+          Number of stop-bits.
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/AbstractIOIOActivity.html b/IOIOLib/doc/ioio/lib/util/AbstractIOIOActivity.html new file mode 100644 index 0000000..20545f6 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/AbstractIOIOActivity.html @@ -0,0 +1,258 @@ + + + + + + +AbstractIOIOActivity + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.util +
+Class AbstractIOIOActivity

+
+java.lang.Object
+  extended by Activity
+      extended by ioio.lib.util.AbstractIOIOActivity
+
+
+
+
public abstract class AbstractIOIOActivity
extends Activity
+ + +

+A convenience class for easy creation of IOIO-based applications. + + It is used by creating a concrete Activity in your application, which extends + this class. This class then takes care of proper creation and abortion of the + IOIO connection and of a dedicated thread for IOIO communication. + + In the basic usage the client should extend this class and implement + createIOIOThread(), which should return an implementation of the + IOIOThread abstract class. In this implementation, the client + implements the IOIOThread#setup() method, which gets called as soon + as communication with the IOIO is established, and the #loop() method, which gets called repetitively as long as the IOIO is + connected. Both methods should access the IOIOThread#ioio_ field for + controlling the IOIO. + + In addition, the IOIOThread#disconnected() method may be overridden + in order to execute logic as soon as a disconnection occurs for whichever + reason. The IOIOThread#incompatible() method may be overridden in + order to take action in case where a IOIO whose firmware is incompatible with + the IOIOLib version that application is built with. + + In a more advanced use case, more than one IOIO is available. In this case, a + thread will be created for each IOIO, whose semantics are as defined above. + If the client needs to be able to distinguish between them, it is possible to + override createIOIOThread(String, Object[]) instead of + createIOIOThread(). The first argument provided will contain the + connection class name, such as ioio.lib.impl.SocketIOIOConnection for a + connection established over a TCP socket (which is used over ADB). The second + argument will contain information specific to the connection type. For + example, in the case of SocketIOIOConnection, the array will contain an + Integer representing the local port number. +

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
AbstractIOIOActivity() + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+AbstractIOIOActivity

+
+public AbstractIOIOActivity()
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.IOIOConnectionSpec.html b/IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.IOIOConnectionSpec.html new file mode 100644 index 0000000..ec5341b --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.IOIOConnectionSpec.html @@ -0,0 +1,283 @@ + + + + + + +IOIOConnectionDiscovery.IOIOConnectionSpec + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.util +
+Class IOIOConnectionDiscovery.IOIOConnectionSpec

+
+java.lang.Object
+  extended by ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec
+
+
+
Enclosing interface:
IOIOConnectionDiscovery
+
+
+
+
public static class IOIOConnectionDiscovery.IOIOConnectionSpec
extends java.lang.Object
+ + +

+


+ +

+ + + + + + + + + + + + + + + +
+Field Summary
+ java.lang.Object[]args + +
+           
+ java.lang.StringclassName + +
+           
+  + + + + + + + + + + +
+Constructor Summary
IOIOConnectionDiscovery.IOIOConnectionSpec(java.lang.String c, + java.lang.Object[] a) + +
+           
+  + + + + + + + +
+Method Summary
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Field Detail
+ +

+className

+
+public final java.lang.String className
+
+
+
+
+
+ +

+args

+
+public final java.lang.Object[] args
+
+
+
+
+ + + + + + + + +
+Constructor Detail
+ +

+IOIOConnectionDiscovery.IOIOConnectionSpec

+
+public IOIOConnectionDiscovery.IOIOConnectionSpec(java.lang.String c,
+                                                  java.lang.Object[] a)
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.html b/IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.html new file mode 100644 index 0000000..c21e1e3 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/IOIOConnectionDiscovery.html @@ -0,0 +1,226 @@ + + + + + + +IOIOConnectionDiscovery + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.util +
+Interface IOIOConnectionDiscovery

+
+
All Known Implementing Classes:
SocketIOIOConnectionDiscovery
+
+
+
+
public interface IOIOConnectionDiscovery
+ + +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classIOIOConnectionDiscovery.IOIOConnectionSpec + +
+           
+  + + + + + + + + + + + +
+Method Summary
+ voidgetSpecs(java.util.Collection<IOIOConnectionDiscovery.IOIOConnectionSpec> result) + +
+           
+  +

+ + + + + + + + +
+Method Detail
+ +

+getSpecs

+
+void getSpecs(java.util.Collection<IOIOConnectionDiscovery.IOIOConnectionSpec> result)
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/SocketIOIOConnectionDiscovery.html b/IOIOLib/doc/ioio/lib/util/SocketIOIOConnectionDiscovery.html new file mode 100644 index 0000000..d8d24ab --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/SocketIOIOConnectionDiscovery.html @@ -0,0 +1,277 @@ + + + + + + +SocketIOIOConnectionDiscovery + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ +

+ +ioio.lib.util +
+Class SocketIOIOConnectionDiscovery

+
+java.lang.Object
+  extended by ioio.lib.util.SocketIOIOConnectionDiscovery
+
+
+
All Implemented Interfaces:
IOIOConnectionDiscovery
+
+
+
+
public class SocketIOIOConnectionDiscovery
extends java.lang.Object
implements IOIOConnectionDiscovery
+ + +

+


+ +

+ + + + + + + +
+Nested Class Summary
+ + + + + + + +
Nested classes/interfaces inherited from interface ioio.lib.util.IOIOConnectionDiscovery
IOIOConnectionDiscovery.IOIOConnectionSpec
+  + + + + + + + + + + + +
+Constructor Summary
SocketIOIOConnectionDiscovery() + +
+           
+  + + + + + + + + + + + +
+Method Summary
+ voidgetSpecs(java.util.Collection<IOIOConnectionDiscovery.IOIOConnectionSpec> result) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+SocketIOIOConnectionDiscovery

+
+public SocketIOIOConnectionDiscovery()
+
+
+ + + + + + + + +
+Method Detail
+ +

+getSpecs

+
+public void getSpecs(java.util.Collection<IOIOConnectionDiscovery.IOIOConnectionSpec> result)
+
+
+
Specified by:
getSpecs in interface IOIOConnectionDiscovery
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/class-use/AbstractIOIOActivity.html b/IOIOLib/doc/ioio/lib/util/class-use/AbstractIOIOActivity.html new file mode 100644 index 0000000..9d1f4e3 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/class-use/AbstractIOIOActivity.html @@ -0,0 +1,144 @@ + + + + + + +Uses of Class ioio.lib.util.AbstractIOIOActivity + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.util.AbstractIOIOActivity

+
+No usage of ioio.lib.util.AbstractIOIOActivity +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.IOIOConnectionSpec.html b/IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.IOIOConnectionSpec.html new file mode 100644 index 0000000..0a9e0e0 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.IOIOConnectionSpec.html @@ -0,0 +1,188 @@ + + + + + + +Uses of Class ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec

+
+ + + + + + + + + +
+Packages that use IOIOConnectionDiscovery.IOIOConnectionSpec
ioio.lib.util  
+  +

+ + + + + +
+Uses of IOIOConnectionDiscovery.IOIOConnectionSpec in ioio.lib.util
+  +

+ + + + + + + + + + + + + +
Method parameters in ioio.lib.util with type arguments of type IOIOConnectionDiscovery.IOIOConnectionSpec
+ voidSocketIOIOConnectionDiscovery.getSpecs(java.util.Collection<IOIOConnectionDiscovery.IOIOConnectionSpec> result) + +
+           
+ voidIOIOConnectionDiscovery.getSpecs(java.util.Collection<IOIOConnectionDiscovery.IOIOConnectionSpec> result) + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.html b/IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.html new file mode 100644 index 0000000..1fc7342 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/class-use/IOIOConnectionDiscovery.html @@ -0,0 +1,180 @@ + + + + + + +Uses of Interface ioio.lib.util.IOIOConnectionDiscovery + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Interface
ioio.lib.util.IOIOConnectionDiscovery

+
+ + + + + + + + + +
+Packages that use IOIOConnectionDiscovery
ioio.lib.util  
+  +

+ + + + + +
+Uses of IOIOConnectionDiscovery in ioio.lib.util
+  +

+ + + + + + + + + +
Classes in ioio.lib.util that implement IOIOConnectionDiscovery
+ classSocketIOIOConnectionDiscovery + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/class-use/SocketIOIOConnectionDiscovery.html b/IOIOLib/doc/ioio/lib/util/class-use/SocketIOIOConnectionDiscovery.html new file mode 100644 index 0000000..0c2b6c8 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/class-use/SocketIOIOConnectionDiscovery.html @@ -0,0 +1,144 @@ + + + + + + +Uses of Class ioio.lib.util.SocketIOIOConnectionDiscovery + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Class
ioio.lib.util.SocketIOIOConnectionDiscovery

+
+No usage of ioio.lib.util.SocketIOIOConnectionDiscovery +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/package-frame.html b/IOIOLib/doc/ioio/lib/util/package-frame.html new file mode 100644 index 0000000..b137e0e --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/package-frame.html @@ -0,0 +1,47 @@ + + + + + + +ioio.lib.util + + + + + + + + + + + +ioio.lib.util + + + + +
+Interfaces  + +
+IOIOConnectionDiscovery
+ + + + + + +
+Classes  + +
+AbstractIOIOActivity +
+IOIOConnectionDiscovery.IOIOConnectionSpec +
+SocketIOIOConnectionDiscovery
+ + + + diff --git a/IOIOLib/doc/ioio/lib/util/package-summary.html b/IOIOLib/doc/ioio/lib/util/package-summary.html new file mode 100644 index 0000000..b3adc14 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/package-summary.html @@ -0,0 +1,179 @@ + + + + + + +ioio.lib.util + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+

+Package ioio.lib.util +

+ + + + + + + + + +
+Interface Summary
IOIOConnectionDiscovery 
+  + +

+ + + + + + + + + + + + + + + + + +
+Class Summary
AbstractIOIOActivityA convenience class for easy creation of IOIO-based applications.
IOIOConnectionDiscovery.IOIOConnectionSpec 
SocketIOIOConnectionDiscovery 
+  + +

+

+
+
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/package-tree.html b/IOIOLib/doc/ioio/lib/util/package-tree.html new file mode 100644 index 0000000..8d4dccb --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/package-tree.html @@ -0,0 +1,161 @@ + + + + + + +ioio.lib.util Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For Package ioio.lib.util +

+
+
+
Package Hierarchies:
All Packages
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/ioio/lib/util/package-use.html b/IOIOLib/doc/ioio/lib/util/package-use.html new file mode 100644 index 0000000..55b2995 --- /dev/null +++ b/IOIOLib/doc/ioio/lib/util/package-use.html @@ -0,0 +1,176 @@ + + + + + + +Uses of Package ioio.lib.util + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Uses of Package
ioio.lib.util

+
+ + + + + + + + + +
+Packages that use ioio.lib.util
ioio.lib.util  
+  +

+ + + + + + + + + + + +
+Classes in ioio.lib.util used by ioio.lib.util
IOIOConnectionDiscovery + +
+           
IOIOConnectionDiscovery.IOIOConnectionSpec + +
+           
+  +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/overview-frame.html b/IOIOLib/doc/overview-frame.html new file mode 100644 index 0000000..e37fff0 --- /dev/null +++ b/IOIOLib/doc/overview-frame.html @@ -0,0 +1,46 @@ + + + + + + +Overview List + + + + + + + + + + + + + + + +
+
+ + + + + +
All Classes +

+ +Packages +
+ioio.lib.api +
+ioio.lib.api.exception +
+ioio.lib.util +
+

+ +

+  + + diff --git a/IOIOLib/doc/overview-summary.html b/IOIOLib/doc/overview-summary.html new file mode 100644 index 0000000..16a3890 --- /dev/null +++ b/IOIOLib/doc/overview-summary.html @@ -0,0 +1,164 @@ + + + + + + +Overview + + + + + + + + + + + + +


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+IOIOLib Documentation +

+
+ + + + + + + + + + + + + + + + + +
+Packages
ioio.lib.api 
ioio.lib.api.exception 
ioio.lib.util 
+ +


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/overview-tree.html b/IOIOLib/doc/overview-tree.html new file mode 100644 index 0000000..1e14ac0 --- /dev/null +++ b/IOIOLib/doc/overview-tree.html @@ -0,0 +1,179 @@ + + + + + + +Class Hierarchy + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Hierarchy For All Packages

+
+
+
Package Hierarchies:
ioio.lib.api, ioio.lib.api.exception, ioio.lib.util
+
+

+Class Hierarchy +

+ +

+Interface Hierarchy +

+ +

+Enum Hierarchy +

+ +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/package-list b/IOIOLib/doc/package-list new file mode 100644 index 0000000..6bb3c0a --- /dev/null +++ b/IOIOLib/doc/package-list @@ -0,0 +1,3 @@ +ioio.lib.api +ioio.lib.api.exception +ioio.lib.util diff --git a/IOIOLib/doc/resources/inherit.gif b/IOIOLib/doc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/IOIOLib/doc/serialized-form.html b/IOIOLib/doc/serialized-form.html new file mode 100644 index 0000000..6320e89 --- /dev/null +++ b/IOIOLib/doc/serialized-form.html @@ -0,0 +1,194 @@ + + + + + + +Serialized Form + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+ +
+ + + +
+
+

+Serialized Form

+
+
+ + + + + +
+Package ioio.lib.api.exception
+ +

+ + + + + +
+Class ioio.lib.api.exception.ConnectionLostException extends java.lang.Exception implements Serializable
+ +

+serialVersionUID: 7422862446246046772L + +

+ +

+ + + + + +
+Class ioio.lib.api.exception.IncompatibilityException extends java.lang.Exception implements Serializable
+ +

+serialVersionUID: -613939818063932627L + +

+ +

+ + + + + +
+Class ioio.lib.api.exception.OutOfResourceException extends java.lang.RuntimeException implements Serializable
+ +

+serialVersionUID: -4482605241361881899L + +

+ +

+


+ + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + diff --git a/IOIOLib/doc/stylesheet.css b/IOIOLib/doc/stylesheet.css new file mode 100644 index 0000000..6ea9e51 --- /dev/null +++ b/IOIOLib/doc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF; color:#000000 } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ +.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + diff --git a/IOIOLib/javadoc.xml b/IOIOLib/javadoc.xml new file mode 100644 index 0000000..37a8671 --- /dev/null +++ b/IOIOLib/javadoc.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/IOIOLib/local.properties b/IOIOLib/local.properties new file mode 100644 index 0000000..10fa6fa --- /dev/null +++ b/IOIOLib/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked in Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/Users/ytai/android-sdk-mac_x86 diff --git a/IOIOLib/proguard.cfg b/IOIOLib/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/IOIOLib/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/IOIOLib/project.properties b/IOIOLib/project.properties new file mode 100644 index 0000000..7662246 --- /dev/null +++ b/IOIOLib/project.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +android.library=true +# Project target. +target=android-8 diff --git a/IOIOLib/res/.gitignore b/IOIOLib/res/.gitignore new file mode 100644 index 0000000..76bedae --- /dev/null +++ b/IOIOLib/res/.gitignore @@ -0,0 +1,5 @@ +# Ignore everything in this directory +* +# Except this file +!.gitignore + diff --git a/IOIOLib/src/ioio/lib/api/AnalogInput.java b/IOIOLib/src/ioio/lib/api/AnalogInput.java new file mode 100644 index 0000000..dab37f8 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/AnalogInput.java @@ -0,0 +1,104 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ + +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * A pin used for analog input. + *

+ * An analog input pin can be used to measure voltage. AnalogInput instances are + * obtained by calling {@link IOIO#openAnalogInput(int)}. + *

+ * Floating-point values scaled from 0 to 1 can be obtained by calling + * {@link #read()}. Absolute voltage levels can be obtained by calling + * {@link #getVoltage()}. + *

+ * The instance is alive since its creation. The first {@link #read()} call + * block for a few milliseconds until the initial value is updated. If the + * connection with the IOIO drops at any point, the instance transitions to a + * disconnected state, in which every attempt to use the pin (except + * {@link #close()}) will throw a {@link ConnectionLostException}. Whenever + * {@link #close()} is invoked the instance may no longer be used. Any resources + * associated with it are freed and can be reused. + *

+ * Typical usage: + * + *

+ * AnalogInput potentiometer = ioio.openAnalogInput(40);
+ * float value = potentiometer.read();
+ * ...
+ * potentiometer.close();  // pin 40 can now be used for something else.
+ * 
+ * + * @see IOIO#openAnalogInput(int) + */ +public interface AnalogInput extends Closeable { + /** + * Gets the analog input reading, as an absolute voltage in Volt units. + *

+ * It typically takes a few milliseconds between when the instance is + * created and until the first value can be read. In this case, the method + * may block shortly. If this is a problem, the calling thread can be + * interrupted. + *

+ * If a scaled value is desired, consider using {@link #read()}. + * + * @return The voltage, in Volt units. + * @throws InterruptedException The calling thread has been interrupted. + * @throws ConnectionLostException The connection with the IOIO is lost. + * @see #read() + */ + public float getVoltage() throws InterruptedException, + ConnectionLostException; + + /** + * Gets the maximum value against which {@link #read()} values are scaled. + * @return The voltage, in Volts. + */ + public float getReference(); + + /** + * Gets the analog input reading, as a scaled real value between 0 and 1. + *

+ * It typically takes a few milliseconds between when the instance is + * created and until the first value can be read. In this case, the method + * may block shortly. If this is a problem, the calling thread can be + * interrupted. + *

+ * If an absolute value is desired, consider using {@link #getVoltage()}. + * + * @return The voltage, in scaled units. + * @throws InterruptedException The calling thread has been interrupted. + * @throws ConnectionLostException The connection with the IOIO is lost. + * @see #getVoltage() + */ + public float read() throws InterruptedException, ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/Closeable.java b/IOIOLib/src/ioio/lib/api/Closeable.java new file mode 100644 index 0000000..353c95d --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/Closeable.java @@ -0,0 +1,5 @@ +package ioio.lib.api; + +public interface Closeable { + void close(); +} diff --git a/IOIOLib/src/ioio/lib/api/DigitalInput.java b/IOIOLib/src/ioio/lib/api/DigitalInput.java new file mode 100644 index 0000000..63567e2 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/DigitalInput.java @@ -0,0 +1,140 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * A pin used for digital input. + *

+ * A digital input pin can be used to read logic-level signals. DigitalInput + * instances are obtained by calling {@link IOIO#openDigitalInput(Spec)}. + *

+ * The value of the pin is obtained by calling {@link #read()}. It is also + * possible for the client to block until a certain level is sensed, by using + * {@link #waitForValue(boolean)}. + *

+ * The instance is alive since its creation. The first {@link #read()} call + * block for a few milliseconds until the initial value is updated. If the + * connection with the IOIO drops at any point, the instance transitions to a + * disconnected state, in which every attempt to use the pin (except + * {@link #close()}) will throw a {@link ConnectionLostException}. Whenever + * {@link #close()} is invoked the instance may no longer be used. Any resources + * associated with it are freed and can be reused. + *

+ * Typical usage: + * + *

+ * DigitalInput button = ioio.openDigitalInput(10);  // used an external pull-up
+ * button.waitForValue(false);  // wait for press
+ * ...
+ * button.close();  // pin 10 can now be used for something else.
+ * 
+ */ +public interface DigitalInput extends Closeable { + /** + * A digital input pin specification, used when opening digital inputs. + */ + static public class Spec { + /** Input pin mode. */ + public enum Mode { + /** + * Pin is floating. When the pin is left disconnected the value + * sensed is undefined. Use this mode when an external pull-up or + * pull-down resistor is used or when interfacing push-pull type + * logic circuits. + */ + FLOATING, + /** + * Internal pull-up resistor is used. When the pin is left + * disconnected, a logical "HIGH" (true) will be sensed. This is + * useful for interfacing with open drain circuits or for + * interacting with a switch connected between the pin and ground. + */ + PULL_UP, + /** + * Internal pull-down resistor is used. When the pin is left + * disconnected, a logical "LOW" (false) will be sensed. This is + * useful for interacting with a switch connected between the pin + * and Vdd. + */ + PULL_DOWN + } + + /** The pin number, as labeled on the board. */ + public int pin; + /** The pin mode. */ + public Mode mode; + + /** + * Constructor. + * + * @param pin + * Pin number, as labeled on the board. + * @param mode + * Pin mode. + */ + public Spec(int pin, Mode mode) { + this.pin = pin; + this.mode = mode; + } + + /** Shorthand for Spec(pin, Mode.FLOATING). */ + public Spec(int pin) { + this(pin, Mode.FLOATING); + } + } + + /** + * Read the value sensed on the pin. May block for a few milliseconds if + * called right after creation of the instance. If this is a problem, the + * calling thread may be interrupted. + * + * @return True for logical "HIGH", false for logical "LOW". + * @throws InterruptedException + * The calling thread has been interrupted. + * @throws ConnectionLostException + * The connection with the IOIO has been lost. + */ + public boolean read() throws InterruptedException, ConnectionLostException; + + /** + * Block until a desired logical level is sensed. The calling thread can be + * interrupted for aborting this operation. + * + * @param value + * The desired logical level. true for "HIGH", false for "LOW". + * @throws InterruptedException + * The calling thread has been interrupted. + * @throws ConnectionLostException + * The connection with the IOIO has been lost. + */ + public void waitForValue(boolean value) throws InterruptedException, + ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/DigitalOutput.java b/IOIOLib/src/ioio/lib/api/DigitalOutput.java new file mode 100644 index 0000000..fe8a09d --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/DigitalOutput.java @@ -0,0 +1,120 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * A pin used for digital output. + *

+ * A digital input pin can be used to generate logic-level signals. + * DigitalOutput instances are obtained by calling + * {@link IOIO#openDigitalOutput(Spec, boolean)}. + *

+ * The value of the pin is set by calling {@link #write(boolean)}. + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, in + * which every attempt to use the pin (except {@link #close()}) will throw a + * {@link ConnectionLostException}. Whenever {@link #close()} is invoked the + * instance may no longer be used. Any resources associated with it are freed + * and can be reused. + *

+ * Typical usage: + * + *

+ * DigitalOutput led = ioio.openDigitalInput(2);  // LED anode on pin 2.
+ * led.write(true);  // turn LED on.
+ * ...
+ * led.close();  // pin 2 can now be used for something else.
+ * 
+ */ +public interface DigitalOutput extends Closeable { + /** + * A digital output pin specification, used when opening digital outputs. + */ + public static class Spec { + /** Output pin mode. */ + public enum Mode { + /** + * Pin operates in push-pull mode, i.e. a logical "HIGH" is + * represented by a voltage of Vdd on the pin and a logical "LOW" by + * a voltage of 0 (ground). + */ + NORMAL, + /** + * Pin operates in open-drain mode, i.e. a logical "HIGH" is + * represented by a high impedance on the pin (as if it is + * disconnected) and a logical "LOW" by a voltage of 0 (ground). + * This mode is most commonly used for generating 5V logical signal + * on a 3.3V pin: 5V tolerant pins must be used; a pull-up resistor + * is connected between the pin and 5V, and the pin is used in open- + * drain mode. + */ + OPEN_DRAIN, + } + + /** The pin number, as labeled on the board. */ + public int pin; + /** The pin mode. */ + public Mode mode; + + /** + * Constructor. + * + * @param pin + * Pin number, as labeled on the board. + * @param mode + * Pin mode. + */ + public Spec(int pin, Mode mode) { + this.pin = pin; + this.mode = mode; + } + + /** + * Shorthand for Spec(pin, Mode.NORMAL). + * + * @see #Spec(int, Mode) + */ + public Spec(int pin) { + this(pin, Mode.NORMAL); + } + } + + /** + * Set the output of the pin. + * + * @param val + * The output. true is logical "HIGH", false is logical "LOW". + * @throws ConnectionLostException + * The connection with the IOIO has been lost. + */ + public void write(boolean val) throws ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/IOIO.java b/IOIOLib/src/ioio/lib/api/IOIO.java new file mode 100644 index 0000000..4851f5c --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/IOIO.java @@ -0,0 +1,638 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.PulseInput.PulseMode; +import ioio.lib.api.TwiMaster.Rate; +import ioio.lib.api.Uart.Parity; +import ioio.lib.api.Uart.StopBits; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.api.exception.IncompatibilityException; +import ioio.lib.api.exception.OutOfResourceException; + +import java.io.Closeable; + +/** + * This interface provides control over all the IOIO board functions. + *

+ * An instance of this interface is typically obtained by using the + * {@link IOIOFactory} class. Initially, a connection should be established, by + * calling {@link #waitForConnect()}. This method will block until the board is + * connected an a connection has been established. + *

+ * During the connection process, this library verifies that the IOIO firmware + * is compatible with the required version. If not, {@link #waitForConnect()} + * will throw a {@link IncompatibilityException}, putting the {@link IOIO} + * instance in a "zombie" state: nothing could be done with it except calling + * {@link #disconnect()}, or waiting for the physical connection to drop via + * {@link #waitForDisconnect()}. + *

+ * As soon as a connection is established, the IOIO can be used, typically, by + * calling the openXXX() functions to obtain additional interfaces for + * controlling specific function of the board. + *

+ * Whenever a connection is lost as a result of physically disconnecting the + * board or as a result of calling {@link #disconnect()}, this instance and all + * the interfaces obtained from it become invalid, and will throw a + * {@link ConnectionLostException} on every operation. Once the connection is + * lost, those instances cannot be recycled, but rather it is required to create + * new ones and wait for a connection again. + *

+ * Initially all pins are tri-stated (floating), and all functions are disabled. + * Whenever a connection is lost or dropped, the board will immediately return + * to the this initial state. + *

+ * Typical usage: + * + *

+ * IOIO ioio = IOIOFactory.create();
+ * try {
+ *   ioio.waitForConnect();
+ *   DigitalOutput out = ioio.openDigitalOutput(10);
+ *   out.write(true);
+ *   ...
+ * } catch (ConnectionLostException e) {
+ * } catch (Exception e) {
+ *   ioio.disconnect();
+ * } finally {
+ *   ioio.waitForDisconnect();
+ * }
+ * 
+ * + * @see IOIOFactory#create() + */ +public interface IOIO { + /** An invalid pin number. */ + public static final int INVALID_PIN = -1; + /** The pin number used to designate the on-board 'stat' LED. */ + public static final int LED_PIN = 0; + + /** + * A versioned component in the system. + * + * @see IOIO#getImplVersion(VersionType) + */ + public enum VersionType { + /** Hardware version. */ + HARDWARE_VER, + /** Bootloader version. */ + BOOTLOADER_VER, + /** Application layer firmware version. */ + APP_FIRMWARE_VER, + /** IOIOLib version. */ + IOIOLIB_VER + } + + /** + * Establishes connection with the IOIO board. + *

+ * This method is blocking until connection is established. This method can + * be aborted by calling {@link #disconnect()}. In this case, it will throw + * a {@link ConnectionLostException}. + * + * @throws ConnectionLostException + * An error occurred during connection or disconnect() has been + * called during connection. The instance state is disconnected. + * @throws IncompatibilityException + * An incompatible board firmware of hardware has been detected. + * The instance state is disconnected. + * @see #disconnect() + * @see #waitForDisconnect() + */ + public void waitForConnect() throws ConnectionLostException, + IncompatibilityException; + + /** + * Closes the connection to the board, or aborts a connection process + * started with waitForConnect(). + *

+ * Once this method is called, this IOIO instance and all the instances + * obtain from it become invalid and will throw an exception on every + * operation. + *

+ * This method is asynchronous, i.e. it returns immediately, but it is not + * guaranteed that all connection-related resources has already been freed + * and can be reused upon return. In cases when this is important, client + * can call {@link #waitForDisconnect()}, which will block until all + * resources have been freed. + */ + public void disconnect(); + + /** + * Blocks until IOIO has been disconnected and all connection-related + * resources have been freed, so that a new connection can be attempted. + * + * @throws InterruptedException + * When interrupt() has been called on this thread. This might + * mean that an immediate attempt to create and connect a new + * IOIO object might fail for resource contention. + * @see #disconnect() + * @see #waitForConnect() + */ + public void waitForDisconnect() throws InterruptedException; + + /** + * Resets the entire state (returning to initial state), without dropping + * the connection. + *

+ * It is equivalent to calling {@link Closeable#close()} on every interface + * obtained from this instance. A connection must have been established + * prior to calling this method, by invoking {@link #waitForConnect()}. + * + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @see #hardReset() + */ + public void softReset() throws ConnectionLostException; + + /** + * Equivalent to disconnecting and reconnecting the board power supply. + *

+ * The connection will be dropped and not reestablished. Full boot sequence + * will take place, so firmware upgrades can be performed. A connection must + * have been established prior to calling this method, by invoking + * {@link #waitForConnect()}. + * + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @see #softReset() + */ + public void hardReset() throws ConnectionLostException; + + /** + * Query the implementation version of the system's components. The + * implementation version uniquely identifies a hardware revision or a + * software build. Returned version IDs are always 8-character long, + * according to the IOIO versioning system: first 4 characters are the + * version authority and last 4 characters are the revision. + * + * @param v + * The component whose version we query. + * @return An 8-character implementation version ID. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + */ + public String getImplVersion(VersionType v) throws ConnectionLostException; + + /** + * Open a pin for digital input. + *

+ * A digital input pin can be used to read logic-level signals. The pin will + * operate in this mode until close() is invoked on the returned interface. + * It is illegal to open a pin that has already been opened and has not been + * closed. A connection must have been established prior to calling this + * method, by invoking {@link #waitForConnect()}. + * + * @param spec + * Pin specification, consisting of the pin number, as labeled on + * the board, and the mode, which determines whether the pin will + * be floating, pull-up or pull-down. See + * {@link DigitalInput.Spec.Mode} for more information. + * @return Interface of the assigned pin. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @see DigitalInput + */ + public DigitalInput openDigitalInput(DigitalInput.Spec spec) + throws ConnectionLostException; + + /** + * Shorthand for openDigitalInput(new DigitalInput.Spec(pin)). + * + * @see #openDigitalInput(ioio.lib.api.DigitalInput.Spec) + */ + public DigitalInput openDigitalInput(int pin) + throws ConnectionLostException; + + /** + * Shorthand for openDigitalInput(new DigitalInput.Spec(pin, mode)). + * + * @see #openDigitalInput(ioio.lib.api.DigitalInput.Spec) + */ + public DigitalInput openDigitalInput(int pin, DigitalInput.Spec.Mode mode) + throws ConnectionLostException; + + /** + * Open a pin for digital output. + *

+ * A digital output pin can be used to generate logic-level signals. The pin + * will operate in this mode until close() is invoked on the returned + * interface. It is illegal to open a pin that has already been opened and + * has not been closed. A connection must have been established prior to + * calling this method, by invoking {@link #waitForConnect()}. + * + * @param spec + * Pin specification, consisting of the pin number, as labeled on + * the board, and the mode, which determines whether the pin will + * be normal or open-drain. See {@link DigitalOutput.Spec.Mode} + * for more information. + * @param startValue + * The initial logic level this pin will generate as soon at it + * is open. + * @return Interface of the assigned pin. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @see DigitalOutput + */ + public DigitalOutput openDigitalOutput(DigitalOutput.Spec spec, + boolean startValue) throws ConnectionLostException; + + /** + * Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin, mode), + * startValue). + * + * @see #openDigitalOutput(ioio.lib.api.DigitalOutput.Spec, boolean) + */ + public DigitalOutput openDigitalOutput(int pin, + DigitalOutput.Spec.Mode mode, boolean startValue) + throws ConnectionLostException; + + /** + * Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), startValue). + * Pin mode will be "normal" (as opposed to "open-drain". + * + * @see #openDigitalOutput(ioio.lib.api.DigitalOutput.Spec, boolean) + */ + public DigitalOutput openDigitalOutput(int pin, boolean startValue) + throws ConnectionLostException; + + /** + * Shorthand for openDigitalOutput(new DigitalOutput.Spec(pin), false). Pin + * mode will be "normal" (as opposed to "open-drain". + * + * @see #openDigitalOutput(ioio.lib.api.DigitalOutput.Spec, boolean) + */ + public DigitalOutput openDigitalOutput(int pin) + throws ConnectionLostException; + + /** + * Open a pin for analog input. + *

+ * An analog input pin can be used to measure voltage. Note that not every + * pin can be used as an analog input. See board documentation for the legal + * pins and permitted voltage range. + *

+ * The pin will operate in this mode until close() is invoked on the + * returned interface. It is illegal to open a pin that has already been + * opened and has not been closed. A connection must have been established + * prior to calling this method, by invoking {@link #waitForConnect()}. + * + * @param pin + * Pin number, as labeled on the board. + * @return Interface of the assigned pin. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @see AnalogInput + */ + public AnalogInput openAnalogInput(int pin) throws ConnectionLostException; + + /** + * Open a pin for PWM (Pulse-Width Modulation) output. + *

+ * A PWM pin produces a logic-level PWM signal. These signals are typically + * used for simulating analog outputs for controlling the intensity of LEDs, + * the rotation speed of motors, etc. They are also frequently used for + * controlling hobby servo motors. + *

+ * Note that not every pin can be used as PWM output. In addition, the total + * number of concurrent PWM modules in use is limited. See board + * documentation for the legal pins and limit on concurrent usage. + *

+ * The pin will operate in this mode until close() is invoked on the + * returned interface. It is illegal to open a pin that has already been + * opened and has not been closed. A connection must have been established + * prior to calling this method, by invoking {@link #waitForConnect()}. + * + * @param spec + * Pin specification, consisting of the pin number, as labeled on + * the board, and the mode, which determines whether the pin will + * be normal or open-drain. See {@link DigitalOutput.Spec.Mode} + * for more information. + * @param freqHz + * PWM frequency, in Hertz. + * @return Interface of the assigned pin. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @throws OutOfResourceException + * This is a runtime exception, so it is not necessary to catch + * it if the client guarantees that the total number of + * concurrent PWM resources is not exceeded. + * @see PwmOutput + */ + public PwmOutput openPwmOutput(DigitalOutput.Spec spec, int freqHz) + throws ConnectionLostException; + + /** + * Shorthand for openPwmOutput(new DigitalOutput.Spec(pin), freqHz). + * + * @see #openPwmOutput(ioio.lib.api.DigitalOutput.Spec, int) + */ + public PwmOutput openPwmOutput(int pin, int freqHz) + throws ConnectionLostException; + + /** + * Open a pin for pulse input. + *

+ * The pulse input module is quite flexible. It enables several kinds of + * timing measurements on a digital signal: pulse width measurement + * (positive or negative pulse), and frequency of a periodic signal. + *

+ * Note that not every pin can be used as pulse input. In addition, the + * total number of concurrent pulse input modules in use is limited. See + * board documentation for the legal pins and limit on concurrent usage. + *

+ * The pin will operate in this mode until close() is invoked on the + * returned interface. It is illegal to open a pin that has already been + * opened and has not been closed. A connection must have been established + * prior to calling this method, by invoking {@link #waitForConnect()}. + * + * @param spec + * Pin specification, consisting of the pin number, as labeled on + * the board, and the mode, which determines whether the pin will + * be floating, pull-up or pull-down. See + * {@link DigitalInput.Spec.Mode} for more information. + * @param rate + * The clock rate to use for timing the signal. A faster clock + * rate will result in better precision but will only be able to + * measure narrow pulses / high frequencies. + * @param mode + * The mode in which to operate. Determines whether the module + * will measure pulse durations or frequency. + * @param doublePrecision + * Whether to open a double-precision pulse input module. Double- + * precision modules enable reading of much longer pulses and + * lower frequencies with high accuracy than single precision + * modules. However, their number is limited, so when possible, + * and if the resources are all needed, use single-precision. For + * more details on the exact spec of single- vs. double- + * precision, see {@link PulseInput}. + * @return An instance of the {@link PulseInput}, which can be used to + * obtain the data. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @throws OutOfResourceException + * This is a runtime exception, so it is not necessary to catch + * it if the client guarantees that the total number of + * concurrent PWM resources is not exceeded. + * @see PulseInput + */ + public PulseInput openPulseInput(DigitalInput.Spec spec, + PulseInput.ClockRate rate, PulseInput.PulseMode mode, + boolean doublePrecision) throws ConnectionLostException; + + /** + * Shorthand for openPulseInput(new DigitalInput.Spec(pin), rate, mode, + * true), i.e. opens a double-precision, 16MHz pulse input on the given pin + * with the given mode. + * + * @see #openPulseInput(ioio.lib.api.DigitalInput.Spec, + * ioio.lib.api.PulseInput.ClockRate, PulseMode, boolean) + */ + public PulseInput openPulseInput(int pin, PulseMode mode) + throws ConnectionLostException; + + /** + * Open a UART module, enabling a bulk transfer of byte buffers. + *

+ * UART is a very common hardware communication protocol, enabling full- + * duplex, asynchronous point-to-point data transfer. It typically serves + * for opening consoles or as a basis for higher-level protocols, such as + * MIDI RS-232, and RS-485. + *

+ * Note that not every pin can be used for UART RX or TX. In addition, the + * total number of concurrent UART modules in use is limited. See board + * documentation for the legal pins and limit on concurrent usage. + *

+ * The UART module will operate, and the pins will work in their respective + * modes until close() is invoked on the returned interface. It is illegal + * to use pins that have already been opened and has not been closed. A + * connection must have been established prior to calling this method, by + * invoking {@link #waitForConnect()}. + * + * @param rx + * Pin specification for the RX pin, consisting of the pin + * number, as labeled on the board, and the mode, which + * determines whether the pin will be floating, pull-up or + * pull-down. See {@link DigitalInput.Spec.Mode} for more + * information. null can be passed to designate that we do not + * want RX input to this module. + * @param tx + * Pin specification for the TX pin, consisting of the pin + * number, as labeled on the board, and the mode, which + * determines whether the pin will be normal or open-drain. See + * {@link DigitalOutput.Spec.Mode} for more information. null can + * be passed to designate that we do not want TX output to this + * module. + * @param baud + * The clock frequency of the UART module in Hz. + * @param parity + * The parity mode, as in {@link Parity}. + * @param stopbits + * Number of stop bits, as in {@link StopBits}. + * @return Interface of the assigned module. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @throws OutOfResourceException + * This is a runtime exception, so it is not necessary to catch + * it if the client guarantees that the total number of + * concurrent UART resources is not exceeded. + * @see Uart + */ + public Uart openUart(DigitalInput.Spec rx, DigitalOutput.Spec tx, int baud, + Parity parity, StopBits stopbits) throws ConnectionLostException; + + /** + * Shorthand for + * {@link #openUart(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits)} + * , where the input pins use their default specs. {@link #INVALID_PIN} can + * be used on either pin if a TX- or RX-only UART is needed. + * + * @see #openUart(ioio.lib.api.DigitalInput.Spec, + * ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits) + */ + public Uart openUart(int rx, int tx, int baud, Parity parity, + StopBits stopbits) throws ConnectionLostException; + + /** + * Open a SPI master module, enabling communication with multiple + * SPI-enabled slave modules. + *

+ * SPI is a common hardware communication protocol, enabling full-duplex, + * synchronous point-to-multi-point data transfer. It requires MOSI, MISO + * and CLK lines shared by all nodes, as well as a SS line per slave, + * connected between this slave and a respective pin on the master. The MISO + * line should operate in pull-up mode, using either the internal pull-up or + * an external resistor. + *

+ * Note that not every pin can be used for SPI MISO, MOSI or CLK. In + * addition, the total number of concurrent SPI modules in use is limited. + * See board documentation for the legal pins and limit on concurrent usage. + *

+ * The SPI module will operate, and the pins will work in their respective + * modes until close() is invoked on the returned interface. It is illegal + * to use pins that have already been opened and has not been closed. A + * connection must have been established prior to calling this method, by + * invoking {@link #waitForConnect()}. + * + * @param miso + * Pin specification for the MISO (Master In Slave Out) pin, + * consisting of the pin number, as labeled on the board, and the + * mode, which determines whether the pin will be floating, + * pull-up or pull-down. See {@link DigitalInput.Spec.Mode} for + * more information. + * @param mosi + * Pin specification for the MOSI (Master Out Slave In) pin, + * consisting of the pin number, as labeled on the board, and the + * mode, which determines whether the pin will be normal or + * open-drain. See {@link DigitalOutput.Spec.Mode} for more + * information. + * @param clk + * Pin specification for the CLK pin, consisting of the pin + * number, as labeled on the board, and the mode, which + * determines whether the pin will be normal or open-drain. See + * {@link DigitalOutput.Spec.Mode} for more information. + * @param slaveSelect + * An array of pin specifications for each of the slaves' SS + * (Slave Select) pin. The index of this array designates the + * slave index, used later to refer to this slave. The spec is + * consisting of the pin number, as labeled on the board, and the + * mode, which determines whether the pin will be normal or + * open-drain. See {@link DigitalOutput.Spec.Mode} for more + * information. + * @param config + * The configuration of the SPI module. See + * {@link SpiMaster.Config} for details. + * @return Interface of the assigned module. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @throws OutOfResourceException + * This is a runtime exception, so it is not necessary to catch + * it if the client guarantees that the total number of + * concurrent SPI resources is not exceeded. + * @see SpiMaster + */ + public SpiMaster openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, SpiMaster.Config config) + throws ConnectionLostException; + +/** + * Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + * where the pins are all open with the default modes and default configuration values are used. + * @see #openSpiMaster(ioio.lib.api.DigitalInput.Spec, + * ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, + * ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config) + */ + public SpiMaster openSpiMaster(int miso, int mosi, int clk, + int[] slaveSelect, SpiMaster.Rate rate) + throws ConnectionLostException; + + /** + * Shorthand for {@link #openSpiMaster(ioio.lib.api.DigitalInput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config), + * where the MISO pins is opened with pull up, and the other pins are open + * with the default modes and default configuration values are used. + * In this version, a single slave is used. + * @see #openSpiMaster(ioio.lib.api.DigitalInput.Spec, + * ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, + * ioio.lib.api.DigitalOutput.Spec[], ioio.lib.api.SpiMaster.Config) + */ + public SpiMaster openSpiMaster(int miso, int mosi, int clk, + int slaveSelect, SpiMaster.Rate rate) + throws ConnectionLostException; + + /** + * Open a TWI (Two-Wire Interface, such as I2C/SMBus) master module, + * enabling communication with multiple TWI-enabled slave modules. + *

+ * TWI is a common hardware communication protocol, enabling half-duplex, + * synchronous point-to-multi-point data transfer. It requires a physical + * connection of two lines (SDA, SCL) shared by all the bus nodes, where the + * SDA is open-drain and externally pulled-up. + *

+ * Note that there is a fixed number of TWI modules, and the pins they use + * are static. Client has to make sure these pins are not already opened + * before calling this method. See board documentation for the number of + * modules and the respective pins they use. + *

+ * The TWI module will operate, and the pins will work in their respective + * modes until close() is invoked on the returned interface. It is illegal + * to use pins that have already been opened and has not been closed. A + * connection must have been established prior to calling this method, by + * invoking {@link #waitForConnect()}. + * + * @param twiNum + * The TWI module index to use. Will also determine the pins + * used. + * @param rate + * The clock rate. Can be 100KHz / 400KHz / 1MHz. + * @param smbus + * When true, will use SMBus voltage levels. When false, I2C + * voltage levels. + * @return Interface of the assigned module. + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + * @see TwiMaster + */ + public TwiMaster openTwiMaster(int twiNum, Rate rate, boolean smbus) + throws ConnectionLostException; + + /** + * Open an ICSP channel, enabling Flash programming of an external PIC MCU, + * and in particular, another IOIO board. + *

+ * ICSP (In-Circuit Serial Programming) is a protocol intended for + * programming of PIC MCUs. It is a serial protocol over three wires: PGC + * (clock), PGD (data) and MCLR (reset), where PGC and MCLR are controlled + * by the master and PGD is shared by the master and slave, depending on the + * transaction state. + *

+ * Note that there is only one ICSP modules, and the pins it uses are + * static. Client has to make sure that the ICSP module is not already in + * use, as well as those dedicated pins. See board documentation for the + * actual pins used for ICSP. + * + * @return Interface of the ICSP module. + * @see IcspMaster + * @throws ConnectionLostException + * Connection was lost before or during the execution of this + * method. + */ + public IcspMaster openIcspMaster() throws ConnectionLostException; +} \ No newline at end of file diff --git a/IOIOLib/src/ioio/lib/api/IOIOConnection.java b/IOIOLib/src/ioio/lib/api/IOIOConnection.java new file mode 100644 index 0000000..8a9d02c --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/IOIOConnection.java @@ -0,0 +1,44 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import java.io.InputStream; +import java.io.OutputStream; + +import ioio.lib.api.exception.ConnectionLostException; + +public interface IOIOConnection { + void waitForConnect() throws ConnectionLostException; + + void disconnect(); + + InputStream getInputStream() throws ConnectionLostException; + + OutputStream getOutputStream() throws ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/IOIOFactory.java b/IOIOLib/src/ioio/lib/api/IOIOFactory.java new file mode 100644 index 0000000..947c48e --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/IOIOFactory.java @@ -0,0 +1,121 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import java.lang.reflect.Constructor; + +import ioio.lib.impl.IOIOImpl; +import ioio.lib.impl.SocketIOIOConnection; + +/** + * Factory class for creating instances of the IOIO interface. + *

+ * This class acts as the single entry-point to the IOIO API. It creates the + * bootstrapping between a specific implementation of the IOIO interface and any + * dependencies it might have, such as the underlying connection logic. + *

+ * Typical usage: + * + *

+ * IOIO ioio = IOIOFactory.create();
+ * try {
+ *   ioio.waitForConnect();
+ *   ...
+ *   ioio.disconnect();
+ * } catch (ConnectionLostException e) {
+ * } finally {
+ *   ioio.waitForDisconnect();
+ * }
+ * 
+ */ +public class IOIOFactory { + /** The TCP port used for communicating with the IOIO board. */ + public static final int IOIO_PORT = 4545; + + /** + * Create a IOIO instance. This specific implementation creates a IOIO + * instance which works with the actual IOIO board connected via a TCP + * connection (typically over a wired USB connection). + * + * @return The IOIO instance. + */ + public static IOIO create() { + try { + return create(SocketIOIOConnection.class.getName(), IOIO_PORT); + } catch (ClassNotFoundException e) { + // we shouldn't get here - this class must always exist. + throw new RuntimeException("Something is very wrong here"); + } + } + + /** + * Create a IOIO instance with a user-provided underlying connection class. + * This method should be used for establishing a non-standard connection to + * the IOIO board. + * + * @param connectionClassName + * The name of the connection class. Must have a public default + * constructor. + * + * @return The IOIO instance. + * @throws ClassNotFoundException The given class name was not found. + */ + public static IOIO create(String connectionClassName, Object... args) throws ClassNotFoundException { + IOIOConnection connection = createConnectionDynamically(connectionClassName, args); + return create(connection); + } + + public static IOIO create(IOIOConnection connection) { + return new IOIOImpl(connection); + } + + public static IOIOConnection createConnectionDynamically( + String connectionClassName, Object... args) + throws ClassNotFoundException { + Class cls; + cls = Class.forName(connectionClassName); + Object instance; + try { + Class[] argTypes = new Class[args.length]; + for (int i = 0; i < args.length; ++i) { + argTypes[i] = args[i].getClass(); + } + Constructor constructor = cls.getConstructor(argTypes); + instance = constructor.newInstance(args); + } catch (Exception e) { + throw new IllegalArgumentException( + "Provided class does not have a public ctor with the right signature", e); + } + if (!(instance instanceof IOIOConnection)) { + throw new IllegalArgumentException( + "Provided class does not implement IOIOConnection"); + } + return (IOIOConnection) instance; + } +} diff --git a/IOIOLib/src/ioio/lib/api/IcspMaster.java b/IOIOLib/src/ioio/lib/api/IcspMaster.java new file mode 100644 index 0000000..69b1257 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/IcspMaster.java @@ -0,0 +1,145 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * An interface for controlling an ICSP channel, enabling Flash programming of + * an external PIC MCU, and in particular, another IOIO board. + *

+ * ICSP (In-Circuit Serial Programming) is a protocol intended for programming + * of PIC MCUs. It is a serial protocol over three wires: PGC (clock), PGD + * (data) and MCLR (reset), where PGC and MCLR are controlled by the master and + * PGD is shared by the master and slave, depending on the transaction state. + * IcspMaster instances are obtained by calling {@link IOIO#openIcspMaster()}. + *

+ * This interface is very low level: it allows direct access to the atomic + * operations of the ICSP protocol: + *

    + *
  • Enter / exit programming mode ( {@link #enterProgramming()} / + * {@link #exitProgramming()}, respectively).
  • + *
  • Executing a single instruction on the slave MCU ( + * {@link #executeInstruction(int)}).
  • + *
  • Reading the value of the VISI register of the slave MCU into a read queue + * ({@link #readVisi()}).
  • + *
+ *

+ * The ICSP module uses fixed pins for its lines. See the user guide for details + * for your specific board. ICSP is a special feature, introduced for the + * purpose of programming a IOIO board with another IOIO board. It does not + * necessarily play nicely when used concurrently with other features, in the + * sense that it may introduce latencies in other modules. It is thus + * recommended not to use ICSP in conjunction with latency-sensitive features. + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, in + * which every attempt to use it (except {@link #close()}) will throw a + * {@link ConnectionLostException}. Whenever {@link #close()} is invoked the + * instance may no longer be used. Any resources associated with it are freed + * and can be reused. + *

+ * Typical usage: + * + *

+ * {@code
+ * IcspMaster icsp = ioio.openIcspMaster();
+ * icsp.enterProgramming();
+ * icsp.executeInstruction(0x212340);  // mov #0x1234, w0
+ * icsp.executeInstruction(0x883C20);  // mov w0, 0x784 (VISI)
+ * icsp.executeInstruction(0x000000);  // nop
+ * icsp.readVisi();
+ * int visi = icsp.waitVisiResult();   // should read 0x1234
+ * icsp.exitProgramming();
+ * icsp.close();                       // free ICSP module and pins
+ * }
+ * + * @see IOIO#openIcspMaster() + */ +public interface IcspMaster extends Closeable { + /** + * Initiate a sequence that will put the slave device in programming mode. + * This sequence is necessary for executing instructions and reading + * register values. + * + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + */ + public void enterProgramming() throws ConnectionLostException; + + /** + * Initiate a sequence that will put the slave device out of programming + * mode. It will be held in reset. + * + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + */ + public void exitProgramming() throws ConnectionLostException; + + /** + * Execute a single instruction on the slave MCU. + * + * @param instruction + * a 24-bit PIC instruction. + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + */ + public void executeInstruction(int instruction) + throws ConnectionLostException; + + /** + * Request a read of the VISI register on the slave MCU. This is an + * asynchronous call, in which the 16-bit result is obtained by + * {@link #waitVisiResult()}. + * This method may block if the read queue on the IOIO is full, but this + * should be for short periods only. + * + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + * @throws InterruptedException + * Interrupted while blocking. + */ + public void readVisi() throws ConnectionLostException, InterruptedException; + + /** + * Wait and return a result of a call to {@link #readVisi()}. + * Results will be returned in the same order as requested. + * + * The call will block until there is data, until interrupted, or until + * connection to the IOIO has been lost. + * + * @return The result - an unsigned 16-bit number. + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + * @throws InterruptedException + * Interrupted while blocking. + */ + public int waitVisiResult() throws ConnectionLostException, + InterruptedException; +} diff --git a/IOIOLib/src/ioio/lib/api/PulseInput.java b/IOIOLib/src/ioio/lib/api/PulseInput.java new file mode 100644 index 0000000..ca4d366 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/PulseInput.java @@ -0,0 +1,322 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * An interface for pulse width and frequency measurements of digital signals. + *

+ * PulseInput (commonly known as "input capture") is a versatile module which + * enables extraction of various timing information from a digital signal. There + * are two main use cases: pulse duration measurement and frequency measurement. + * In pulse width measurement we measure the duration of a positive ("high") or + * negative ("low") pulse, i.e. the elapsed time between a rise and a fall or + * vice versa. This mode is useful, for example, for decoding a PWM signal or + * measuring the delay of a sonar return signal. In frequency measurement we + * measure the duration between a rising edge to the following rising edge. This + * gives us a momentary reading of a signal's frequency or period. This is + * commonly used, for example, in conjunction with an optical or magnetic sensor + * for measuring a turning shaft's speed. + *

+ * {@link PulseInput} instances are obtained by calling + * {@link IOIO#openPulseInput(ioio.lib.api.DigitalInput.Spec, ClockRate, PulseMode, boolean)} + * . When created, some important configuration decisions have to be made: the + * precision (single or double), the clock rate and the mode of operation. Modes + * are straightforward: {@link PulseMode#POSITIVE} is used for measuring a + * positive pulse, {@link PulseMode#NEGATIVE} a negative pulse, and + * {@link PulseMode#FREQ} / {@link PulseMode#FREQ_SCALE_4} / + * {@link PulseMode#FREQ_SCALE_16} are used for measuring frequency. The + * difference between the three scaling modes is that without scaling, the + * frequency is determined by measurement of a single + * (rising-edge-to-rising-edge) period. In x4 scaling, 4 consecutive periods are + * measured and the time is divided by 4, providing some smoothing as well as + * better resolution. Similarly for x16 scaling. Note that scaling affects the + * range of signals to be measured, as discussed below. + *

+ * The choice of single vs. double-precision is important to understand: IOIO + * internally uses either 16-bit counters or 32-bit counters for the timing. 16- + * counters force us to either limit the maximum duration (and the minimum + * frequency) or compromise accuracy as compared to 32-bit counters. However, if + * you need many concurrent pulse measurements in your application, you may have + * no choice but to use single-precision. + *

+ * The clock rate selection is important (and even critical when working in + * single-precision) and requires the user to make some assumptions about the + * nature of the measured signal. The higher the clock rate, the more precise + * the measurement, but the longest pulse that can be measured decreases (or + * lowest frequency that can be measured increases). Using the scaling option + * when operating in frequency mode also affects these sizes. combinations. It + * is always recommended to choose the most precise mode, which exceeds the + * maximum expected pulse width (or inverse frequency). If a pulse is received + * whom duration exceeds the longest allowed pulse, it will be "folded" into the + * valid range and product garbage readings. + *

+ * The following table (sorted by longest pulse) summarizes all possible clock / + * mode combinations. The table applies for single-precision operation. + * For double-precision, simply multiply the longest pulse by 65536 and divide + * the lowest frequency by the same amount. Interestingly, the number written in + * [ms] units in the longest pulse column, roughly corresponds to the same + * number in minutes when working with double precsion, since 1[min] = + * 60000[ms]. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
ClockScalingResolutionLongest pulseLowest frequency
62.5KHz116us1.048s0.95Hz
250KHz14us262.1ms3.81Hz
62.5KHz44us262.1ms3.81Hz
250KHz41us65.54ms15.26Hz
62.5KHz161us65.54ms15.26Hz
2MHz1500ns32.77ms30.52Hz
250KHz16250us16.38ms61.0Hz
2MHz4125ns8.192ms122.1Hz
16MHz162.5ns4.096ms244.1Hz
2MHz1631.25ns2.048ms488.3Hz
16MHz415.6ns1.024ms976.6Hz
16MHz163.9ns256us3.906KHz
+ * + *

+ * In some applications it is desirable to measure every incoming pulse rather + * than repetitively query the result of the last measurement. For that purpose + * the {@link #waitPulseGetDuration()} method exists: every incoming pulse width + * is pushed into a small internal queue from which it can be read. The client + * waits for data to be available, then reads it and data that comes in in the + * meanwhile is stored. The queue has limited size, so it is important to read + * quickly if no pulses are to be lost. Note that once a pulse is detected, the + * next one must have its leading edge at least 5ms after the leading edge of + * the current one, or else it will be skipped. This throttling has been + * introduced on purpose, in order to prevent saturation the communication + * channel when the input signal is very high frequency. Effectively, this means + * that the maximum sample rate is 200Hz. This rate has been chosen as it + * enables measure R/C servo signals without missing pulses. + * + *

+ * Typical usage (servo signal pulse width measurement): + * + *

+ * {@code
+ * // Open pulse input at 16MHz, double-precision
+ * PulseInput in = ioio.openPulseInput(3, PulseMode.POSITIVE);
+ * ...
+ * float widthSec = in.getDuration();
+ * OR:
+ * float widthSec = in.waitPulseGetDuration();
+ * ... 
+ * in.close();  // pin 3 can now be used for something else.
+ * }
+ * 
+ * + *

+ * Typical usage (frequency measurement): + * + *

+ * {@code
+ * // Signal is known to be slightly over 150Hz. Single precision can be used.
+ * PulseInput in = ioio.openPulseInput(3,
+ *                                     ClockRate.RATE_2MHz,
+ *                                     PulseMode.FREQ_SCALE_4,
+ *                                     false);
+ * ...
+ * float freqHz = in.getFrequency();
+ * ... 
+ * in.close();  // pin 3 can now be used for something else.
+ * }
+ * 
+ */ +public interface PulseInput extends Closeable { + /** An enumeration for describing the module's operating mode. */ + public enum PulseMode { + /** Positive pulse measurement (rising-edge-to-falling-edge). */ + POSITIVE(1), + /** Negative pulse measurement (falling-edge-to-rising-edge). */ + NEGATIVE(1), + /** Frequency measurement (rising-edge-to-rising-edge). */ + FREQ(1), + /** Frequency measurement (rising-edge-to-rising-edge) with 4x scaling. */ + FREQ_SCALE_4(4), + /** Frequency measurement (rising-edge-to-rising-edge) with 16x scaling. */ + FREQ_SCALE_16(16); + + /** The scaling factor as an integer. */ + public final int scaling; + + private PulseMode(int s) { + scaling = s; + } + } + + /** Suported clock rate enum. */ + public enum ClockRate { + /** 16MHz */ + RATE_16MHz(16000000), + /** 2MHz */ + RATE_2MHz(2000000), + /** 250KHz */ + RATE_250KHz(250000), + /** 62.5KHz */ + RATE_62KHz(62500); + + /** The value in Hertz units. */ + public final int hertz; + + private ClockRate(int h) { + hertz = h; + } + } + + /** + * Gets the pulse duration in case of pulse measurement mode, or the period + * in case of frequency mode. When scaling is used, this is compensated for + * here, so the duration of a single cycle will be returned. + *

+ * The first call to this method may block shortly until the first data + * update arrives. The client may interrupt the calling thread. + * + * @return The duration, in seconds. + * @throws InterruptedException + * The calling thread has been interrupted. + * @throws ConnectionLostException + * The connection with the IOIO has been lost. + */ + public float getDuration() throws InterruptedException, + ConnectionLostException; + + /** + * Reads a single measurement from the queue. If the queue is empty, will + * block until more data arrives. The calling thread may be interrupted in + * order to abort the call. See interface documentation for further + * explanation regarding the read queue. + *

+ * This method may not be used if the interface has was opened in frequency + * mode. + * + * @return The duration, in seconds. + * @throws InterruptedException + * The calling thread has been interrupted. + * @throws ConnectionLostException + * The connection with the IOIO has been lost. + */ + public float waitPulseGetDuration() throws InterruptedException, + ConnectionLostException; + + /** + * Gets the momentary frequency of the measured signal. When scaling is + * used, this is compensated for here, so the true frequency of the signal + * will be returned. + *

+ * The first call to this method may block shortly until the first data + * update arrives. The client may interrupt the calling thread. + * + * @return The frequency, in Hz. + * @throws InterruptedException + * The calling thread has been interrupted. + * @throws ConnectionLostException + * The connection with the IOIO has been lost. + */ + public float getFrequency() throws InterruptedException, + ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/PwmOutput.java b/IOIOLib/src/ioio/lib/api/PwmOutput.java new file mode 100644 index 0000000..63c408b --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/PwmOutput.java @@ -0,0 +1,126 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * A pin used for PWM (Pulse-Width Modulation) output. + *

+ * A PWM pin produces a logic-level PWM signal. These signals are typically used + * for simulating analog outputs for controlling the intensity of LEDs, the + * rotation speed of motors, etc. They are also frequently used for controlling + * hobby servo motors. PwmOutput instances are obtained by calling + * {@link IOIO#openPwmOutput(ioio.lib.api.DigitalOutput.Spec, int)}. + *

+ * When used for motors and LEDs, a frequency of several KHz is typically used, + * where there is a trade-off between switching power-loses and smoothness of + * operation. The pulse width is typically set by specifying the duty cycle, + * with the {@link #setDutyCycle(float)} method. A duty cycle of 0 is "off", a + * duty cycle of 1 is "on", and every intermediate value produces an + * intermediate intensity. Please note that any devices consuming more than 20mA + * of current (e.g. motors) should not by directly connected the the IOIO pins, + * but rather through an amplification circuit suited for the specific load. + *

+ * When used for hobby servos, the PWM signal is rather used for encoding of the + * desired angle the motor should go to. By standard, a 100Hz signal is used and + * the pulse width is varied between 1ms and 2ms (corresponding to both extremes + * of the shaft angle), using {@link #setPulseWidth(int)}. + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, in + * which every attempt to use the pin (except {@link #close()}) will throw a + * {@link ConnectionLostException}. Whenever {@link #close()} is invoked the + * instance may no longer be used. Any resources associated with it are freed + * and can be reused. + *

+ * Typical usage (fading LED): + * + *

+ * PwmOutput servo = ioio.openPwmOutput(12, 1000);  // LED anode on pin 12
+ * ...
+ * servo.setDutyCycle(0.0f);  // LED off
+ * ... 
+ * servo.setDutyCycle(0.5f);  // 50% intensity
+ * ... 
+ * servo.setDutyCycle(1.0f);  // 100% intensity
+ * ... 
+ * servo.close();  // pin 12 can now be used for something else.
+ * 
+ *

+ * Typical usage (servo): + * + *

+ * PwmOutput servo = ioio.openPwmOutput(12, 100);
+ * ...
+ * servo.setPulseWidth(1000);  // 1000us = 1ms = one extreme
+ * ... 
+ * servo.setPulseWidth(1500);  // 1500us = 1.5ms = center
+ * ... 
+ * servo.setPulseWidth(2000);  // 2000us = 2ms = other extreme
+ * ... 
+ * servo.close();  // pin 12 can now be used for something else.
+ * 
+ * + * @see IOIO#openPwmOutput(ioio.lib.api.DigitalOutput.Spec, int) + */ +public interface PwmOutput extends Closeable { + /** + * Sets the duty cycle of the PWM output. The duty cycle is defined to be + * the pulse width divided by the total cycle period. For absolute control + * of the pulse with, consider using {@link #setPulseWidth(int)}. + * + * @param dutyCycle + * The duty cycle, as a real value from 0.0 to 1.0. + * @throws ConnectionLostException + * The connection to the IOIO has been lost. + * @see #setPulseWidth(int) + */ + public void setDutyCycle(float dutyCycle) throws ConnectionLostException; + + /** + * Sets the pulse width of the PWM output. The pulse width is duration of + * the high-time within a single period of the signal. For relative control + * of the pulse with, consider using {@link #setDutyCycle(float)}. + * + * @param pulseWidthUs + * The pulse width, in microsecond units. + * @throws ConnectionLostException + * The connection to the IOIO has been lost. + * @see #setDutyCycle(float) + */ + public void setPulseWidth(int pulseWidthUs) throws ConnectionLostException; + + /** + * The same as {@link #setPulseWidth(int)}, but with sub-microsecond + * precision. + */ + public void setPulseWidth(float pulseWidthUs) + throws ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/SpiMaster.java b/IOIOLib/src/ioio/lib/api/SpiMaster.java new file mode 100644 index 0000000..6cf0db4 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/SpiMaster.java @@ -0,0 +1,211 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.DigitalInput.Spec; +import ioio.lib.api.exception.ConnectionLostException; + +/** + * An interface for controlling an SPI module, in SPI bus-master mode, enabling + * communication with multiple SPI-enabled slave modules. + *

+ * SPI is a common hardware communication protocol, enabling full-duplex, + * synchronous point-to-multi-point data transfer. It requires MOSI, MISO and + * CLK lines shared by all nodes, as well as a SS line per slave, connected + * between this slave and a respective pin on the master. The MISO line should + * operate in pull-up mode, using either the internal pull-up or an external + * resistor. SpiMaster instances are obtained by calling + * {@link IOIO#openSpiMaster(Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], Config)}. + *

+ * The SPI protocol is comprised of simultaneous sending and receiving of data + * between the bus master and a single slave. By the very nature of this + * protocol, the amount of bytes sent is equal to the amount of bytes received. + * However, by padding the sent data with garbage data, and by ignoring the + * leading bytes of the received data arbitrarily-sized packets can be sent and + * received. + *

+ * A very common practice for SPI-based slave devices (although not always the + * case), is to have a fixed request and response length and a fixed lag between + * them, based on the request type. For example, an SPI-based sensor may define + * the the protocol for obtaining its measured value is by sending a 2-byte + * message, whereas the returned 3-byte value has its first byte overlapping the + * second value of the response, as illustrated below: + * + *

+ * Master: M1   M2   GG   GG
+ * Slave:  GG   S1   S2   S3
+ * 
+ * + * M1, M2: the master's request
+ * S1, S2, S3: the slave's response
+ * GG: garbage bytes used for padding. + *

+ * The IOIO SPI interface supports such fixed length message protocols using a + * single method, {@link #writeRead(int, byte[], int, int, byte[], int)}, which + * gets the request data, and the lengths of the request, the response and the + * total transaction bytes. + * + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, in + * which every attempt to use it (except {@link #close()}) will throw a + * {@link ConnectionLostException}. Whenever {@link #close()} is invoked the + * instance may no longer be used. Any resources associated with it are freed + * and can be reused. + *

+ * Typical usage (single slave, as per the example above): + * + *

+ * {@code
+ * // MISO, MOSI, CLK, SS on pins 3, 4, 5, 6, respectively.
+ * SpiMaster spi = ioio.openSpiMaster(3, 4, 5, 6, SpiMaster.Rate.RATE_125K);
+ * final byte[] request = new byte[]{ 0x23, 0x45 };
+ * final byte[] response = new byte[3];
+ * spi.writeRead(request, 2, 4, response, 3);
+ * ...
+ * spi.close();  // free SPI module and pins
+ * }
+ * + * @see IOIO#openSpiMaster(Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], Config) + */ +public interface SpiMaster extends Closeable { + /** Possible data rates for SPI, in Hz. */ + enum Rate { + RATE_31K, RATE_35K, RATE_41K, RATE_50K, RATE_62K, RATE_83K, RATE_125K, RATE_142K, RATE_166K, RATE_200K, RATE_250K, RATE_333K, RATE_500K, RATE_571K, RATE_666K, RATE_800K, RATE_1M, RATE_1_3M, RATE_2M, RATE_2_2M, RATE_2_6M, RATE_3_2M, RATE_4M, RATE_5_3M, RATE_8M + } + + /** An object that can be waited on for asynchronous calls. */ + public interface Result { + /** + * Wait until the asynchronous call which returned this instance is + * complete. + * + * @throws ConnectionLostException + * Connection with the IOIO has been lost. + * @throws InterruptedException + * This operation has been interrupted. + */ + public void waitReady() throws ConnectionLostException, + InterruptedException; + } + + /** SPI configuration structure. */ + static class Config { + /** Data rate. */ + public Rate rate; + /** Whether to invert clock polarity. */ + public boolean invertClk; + /** + * Whether to do the input and output sampling on the trailing clock + * edge. + */ + public boolean sampleOnTrailing; + + /** + * Constructor. + * + * @param rate + * Data rate. + * @param invertClk + * Whether to invert clock polarity. + * @param sampleOnTrailing + * Whether to do the input and output sampling on the + * trailing clock edge. + */ + public Config(Rate rate, boolean invertClk, boolean sampleOnTrailing) { + this.rate = rate; + this.invertClk = invertClk; + this.sampleOnTrailing = sampleOnTrailing; + } + + /** + * Constructor with common defaults. Equivalent to Config(rate, false, + * false) + * + * @see #Config(Rate, boolean, boolean) + */ + public Config(Rate rate) { + this(rate, false, false); + } + } + + /** + * Perform a single SPI transaction which includes optional transmission and + * optional reception of data to a single slave. This is a blocking + * operation that can take a few milliseconds to a few tens of milliseconds. + * To abort this operation, client can interrupt the blocked thread. If + * readSize is 0, the call returns immediately. + * + * @param slave + * The slave index. It is determined by the index of its + * slave-select pin, as per the array passed to + * {@link IOIO#openSpiMaster(Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec, ioio.lib.api.DigitalOutput.Spec[], Config)} + * . + * @param writeData + * A byte array of data to write. May be null if writeSize is 0. + * @param writeSize + * Number of bytes to write. Valid values are 0 to totalSize. + * @param totalSize + * Total transaction length, in bytes. Valid values are 1 to 64. + * @param readData + * An array where the response is to be stored. May be null if + * readSize is 0. + * @param readSize + * The number of expected response bytes. Valid values are 0 to + * totalSize. + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + * @throws InterruptedException + * Calling thread has been interrupted. + */ + public void writeRead(int slave, byte[] writeData, int writeSize, + int totalSize, byte[] readData, int readSize) + throws ConnectionLostException, InterruptedException; + + /** + * Shorthand for {@link #writeRead(int, byte[], int, int, byte[], int)} for + * the single-slave case. + * + * @see #writeRead(int, byte[], int, int, byte[], int) + */ + public void writeRead(byte[] writeData, int writeSize, int totalSize, + byte[] readData, int readSize) throws ConnectionLostException, + InterruptedException; + + /** + * The same as {@link #writeRead(int, byte[], int, int, byte[], int)}, but + * returns immediately and returns a {@link Result} object that can be + * waited on. If readSize is 0, the result object is ready immediately. + * + * @see #writeRead(int, byte[], int, int, byte[], int) + */ + public Result writeReadAsync(int slave, byte[] writeData, int writeSize, + int totalSize, byte[] readData, int readSize) + throws ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/TwiMaster.java b/IOIOLib/src/ioio/lib/api/TwiMaster.java new file mode 100644 index 0000000..9d25f12 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/TwiMaster.java @@ -0,0 +1,148 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.exception.ConnectionLostException; + +/** + * An interface for controlling a TWI module, in TWI bus-master mode, enabling + * communication with multiple TWI-enabled slave modules. + *

+ * TWI (Two-Wire Interface) is a common hardware communication protocol, + * enabling half-duplex, synchronous point-to-multi-point data transfer. It + * requires a physical connection of two lines (SDA, SCL) shared by all the bus + * nodes, where the SDA is open-drain and externally pulled-up. TwiMaster + * instances are obtained by calling + * {@link IOIO#openTwiMaster(int, Rate, boolean)}. + *

+ * TWI is the generic name for the specific I2C and SMBus protocols, differing + * mostly by the voltage levels they require. This module supports both. + *

+ * A TWI transaction is comprised of optional sending of a data buffer from the + * master to a single slave, followed by an optional reception of a data buffer + * from that slave. Slaves are designated by addresses, which may be 7-bit + * (common) or 10-bit (less common). TWI transactions may fail, as a result of + * the slave not responding or as result of the slave NACK'ing the request. Such + * a transaction is executed using the + * {@link #writeRead(int, boolean, byte[], int, byte[], int)} method. + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, in + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, in + * which every attempt to use it (except {@link #close()}) will throw a + * {@link ConnectionLostException}. Whenever {@link #close()} is invoked the + * instance may no longer be used. Any resources associated with it are freed + * and can be reused. + *

+ * Typical usage: + * + *

+ * {@code
+ * // Uses the SDA1/SCL1 pins, I2C volatege levels at 100KHz. 
+ * TwiMaster twi = ioio.openTwiMaster(1, TwiMaster.RATE_100KHz, false);
+ * final byte[] request = new byte[]{ 0x23, 0x45 };
+ * final byte[] response = new byte[3];
+ * if (twi.writeRead(0x19, false, request, 2, response, 3)) {
+ *   // response is valid
+ *   ...
+ * } else {
+ *   // handle error
+ * }
+ * twi.close();  // free TWI module and pins
+ * }
+ * + * @see IOIO#openTwiMaster(int, Rate, boolean) + */ +public interface TwiMaster extends Closeable { + enum Rate { + RATE_100KHz, RATE_400KHz, RATE_1MHz + } + + /** An object that can be waited on for asynchronous calls. */ + public interface Result { + /** + * Wait until the asynchronous call which returned this instance is + * complete. + * + * @return true if TWI transaction succeeded. + * + * @throws ConnectionLostException + * Connection with the IOIO has been lost. + * @throws InterruptedException + * This operation has been interrupted. + */ + public boolean waitReady() throws ConnectionLostException, + InterruptedException; + } + + /** + * Perform a single TWI transaction which includes optional transmission and + * optional reception of data to a single slave. This is a blocking + * operation that can take a few milliseconds to a few tens of milliseconds. + * To abort this operation, client can interrupt the blocked thread. + * + * @param address + * The slave address, either 7-bit or 10-bit. Note that in some + * TWI device documentation the documented addresses are actually + * 2x the address values used here, as they regard the trailing + * 0-bit as part of the address. + * @param tenBitAddr + * Whether this is a 10-bit addressing mode. + * @param writeData + * The request data. + * @param writeSize + * The number of bytes to write. Valid value are 0-255. + * @param readData + * The array where the response should be stored. + * @param readSize + * The expected number of response bytes. Valid value are 0-255. + * @return Whether operation succeeded. + * @throws ConnectionLostException + * Connection to the IOIO has been lost. + * @throws InterruptedException + * Calling thread has been interrupted. + */ + public boolean writeRead(int address, boolean tenBitAddr, byte[] writeData, + int writeSize, byte[] readData, int readSize) + throws ConnectionLostException, InterruptedException; + + /** + * Asynchronous version of + * {@link #writeRead(int, boolean, byte[], int, byte[], int)}. Returns + * immediately and provides a {@link Result} object on which the client can + * wait for the result. + * + * @see #writeRead(int, boolean, byte[], int, byte[], int) + */ + public Result writeReadAsync(int address, boolean tenBitAddr, + byte[] writeData, int writeSize, byte[] readData, int readSize) + throws ConnectionLostException; +} diff --git a/IOIOLib/src/ioio/lib/api/Uart.java b/IOIOLib/src/ioio/lib/api/Uart.java new file mode 100644 index 0000000..309f478 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/Uart.java @@ -0,0 +1,108 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api; + +import ioio.lib.api.DigitalInput.Spec; +import ioio.lib.api.exception.ConnectionLostException; + +import java.io.InputStream; +import java.io.OutputStream; + +/** + * An interface for controlling a UART module. + *

+ * UART is a very common hardware communication protocol, enabling full- duplex, + * asynchronous point-to-point data transfer. It typically serves for opening + * consoles or as a basis for higher-level protocols, such as MIDI, RS-232 and + * RS-485. Uart instances are obtained by calling + * {@link IOIO#openUart(Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, StopBits)}. + *

+ * The UART protocol is completely symmetric - there is no "master" and "slave" + * at this layer. Each end may send any number of bytes at arbitrary times, + * making it very useful for terminals and terminal-controllable devices. + *

+ * Working with UART is very intuitive - it just provides a standard InputStream + * and/or OutputStream. Optionally, one could create a read-only or write-only + * UART instances, by passing null (or INVALID_PIN) for either TX or RX pins. + *

+ * The instance is alive since its creation. If the connection with the IOIO + * drops at any point, the instance transitions to a disconnected state, which + * every attempt to use it (except {@link #close()}) will throw a + * {@link ConnectionLostException}. Whenever {@link #close()} is invoked the + * instance may no longer be used. Any resources associated with it are freed + * and can be reused. + *

+ * Typical usage: + * + *

+ * Uart uart = ioio.openUart(3, 4, 19200, Parity.NONE, StopBits.ONE);
+ * InputStream in = uart.getInputStream();
+ * OutputStream out = uart.getOutputStream();
+ * out.write(new String("Hello").getBytes());
+ * int i = in.read();  // blocking
+ * ...
+ * uart.close();  // free UART module and pins
+ * 
+ * + * @see IOIO#openUart(Spec, ioio.lib.api.DigitalOutput.Spec, int, Parity, + * StopBits) + */ +public interface Uart extends Closeable { + /** Parity-bit mode. */ + enum Parity { + /** No parity. */ + NONE, + /** Even parity. */ + EVEN, + /** Odd parity. */ + ODD + } + + /** Number of stop-bits. */ + enum StopBits { + /** One stop bit. */ + ONE, + /** Two stop bits. */ + TWO + } + + /** + * Gets the input stream. + * + * @return An input stream. + */ + public InputStream getInputStream(); + + /** + * Gets the output stream. + * + * @return An output stream. + */ + public OutputStream getOutputStream(); +} diff --git a/IOIOLib/src/ioio/lib/api/exception/ConnectionLostException.java b/IOIOLib/src/ioio/lib/api/exception/ConnectionLostException.java new file mode 100644 index 0000000..2461b40 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/exception/ConnectionLostException.java @@ -0,0 +1,45 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api.exception; + +/** + * Thrown when the connection between Android and IOIO has been lost or + * disconnected. + */ +public class ConnectionLostException extends Exception { + private static final long serialVersionUID = 7422862446246046772L; + + public ConnectionLostException(Exception e) { + super(e); + } + + public ConnectionLostException() { + super("Connection lost"); + } +} \ No newline at end of file diff --git a/IOIOLib/src/ioio/lib/api/exception/IncompatibilityException.java b/IOIOLib/src/ioio/lib/api/exception/IncompatibilityException.java new file mode 100644 index 0000000..355c273 --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/exception/IncompatibilityException.java @@ -0,0 +1,41 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.api.exception; + +/** + * Thrown when an incompatibility of system components is detected, such as when + * an unsupported board hardware or software version is encountered. + */ +public class IncompatibilityException extends Exception { + private static final long serialVersionUID = -613939818063932627L; + + public IncompatibilityException(String msg) { + super(msg); + } +} diff --git a/IOIOLib/src/ioio/lib/api/exception/OutOfResourceException.java b/IOIOLib/src/ioio/lib/api/exception/OutOfResourceException.java new file mode 100644 index 0000000..6a5cd9c --- /dev/null +++ b/IOIOLib/src/ioio/lib/api/exception/OutOfResourceException.java @@ -0,0 +1,14 @@ +package ioio.lib.api.exception; + +/** + * The IOIO board does not have anymore of the requested resource. This + * exceptions do not need to be handled if the client guarantees that the limits + * on concurrent resource usage are never exceeded. + */ +public class OutOfResourceException extends RuntimeException { + private static final long serialVersionUID = -4482605241361881899L; + + public OutOfResourceException(String msg) { + super(msg); + } +} \ No newline at end of file diff --git a/IOIOLib/src/ioio/lib/impl/AbstractPin.java b/IOIOLib/src/ioio/lib/impl/AbstractPin.java new file mode 100644 index 0000000..e10b0c0 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/AbstractPin.java @@ -0,0 +1,45 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.exception.ConnectionLostException; + +public abstract class AbstractPin extends AbstractResource { + protected final int pinNum_; + + AbstractPin(IOIOImpl ioio, int pinNum) throws ConnectionLostException { + super(ioio); + pinNum_ = pinNum; + } + + synchronized public void close() { + super.close(); + ioio_.closePin(pinNum_); + } +} diff --git a/IOIOLib/src/ioio/lib/impl/AbstractResource.java b/IOIOLib/src/ioio/lib/impl/AbstractResource.java new file mode 100644 index 0000000..f985674 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/AbstractResource.java @@ -0,0 +1,74 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.IncomingState.DisconnectListener; +import ioio.lib.api.Closeable; + +public class AbstractResource implements Closeable, DisconnectListener { + enum State { + OPEN, + CLOSED, + DISCONNECTED + } + + protected State state_ = State.OPEN; + protected final IOIOImpl ioio_; + + public AbstractResource(IOIOImpl ioio) throws ConnectionLostException { + ioio_ = ioio; + } + + @Override + synchronized public void disconnected() { + if (state_ != State.CLOSED) { + state_ = State.DISCONNECTED; + } + } + + synchronized public void close() { + if (state_ == State.CLOSED) { + throw new IllegalStateException("Trying to use a closed resouce"); + } else if (state_ == State.DISCONNECTED) { + state_ = State.CLOSED; + return; + } + state_ = State.CLOSED; + ioio_.removeDisconnectListener(this); + } + + protected synchronized void checkState() throws ConnectionLostException { + if (state_ == State.CLOSED) { + throw new IllegalStateException("Trying to use a closed resouce"); + } else if (state_ == State.DISCONNECTED) { + throw new ConnectionLostException(); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/AnalogInputImpl.java b/IOIOLib/src/ioio/lib/impl/AnalogInputImpl.java new file mode 100644 index 0000000..c5a99ed --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/AnalogInputImpl.java @@ -0,0 +1,90 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import java.io.IOException; + +import ioio.lib.api.AnalogInput; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.IncomingState.InputPinListener; + +public class AnalogInputImpl extends AbstractPin implements AnalogInput, InputPinListener { + private int value_; + private boolean valid_ = false; + + AnalogInputImpl(IOIOImpl ioio, int pin) throws ConnectionLostException { + super(ioio, pin); + } + + @Override + public float getVoltage() throws InterruptedException, ConnectionLostException { + return read() * getReference(); + } + + @Override + public float getReference() { + return 3.3f; + } + + @Override + synchronized public void setValue(int value) { + // Log.v("AnalogInputImpl", "Pin " + pinNum_ + " value is " + value); + assert(value >= 0 || value < 1024); + value_ = value; + if (!valid_) { + valid_ = true; + notifyAll(); + } + } + + @Override + synchronized public float read() throws InterruptedException, ConnectionLostException { + checkState(); + while (!valid_ && state_ != State.DISCONNECTED) { + wait(); + } + checkState(); + return (float) value_ / 1023.0f; + } + + @Override + public synchronized void disconnected() { + super.disconnected(); + notifyAll(); + } + + @Override + public synchronized void close() { + super.close(); + try { + ioio_.protocol_.setAnalogInSampling(pinNum_, false); + } catch (IOException e) { + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/Constants.java b/IOIOLib/src/ioio/lib/impl/Constants.java new file mode 100644 index 0000000..aa82221 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/Constants.java @@ -0,0 +1,45 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +class Constants { + static final int NUM_PINS = 49; + static final int NUM_ANALOG_PINS = 16; + static final int NUM_PWM_MODULES = 9; + static final int NUM_UART_MODULES = 4; + static final int NUM_SPI_MODULES = 3; + static final int NUM_TWI_MODULES = 3; + static final int[] INCAP_MODULES_DOUBLE = new int[] { 0, 2, 4}; + static final int[] INCAP_MODULES_SINGLE = new int[] { 6, 7, 8}; + static final int BUFFER_SIZE = 1024; + static final int PACKET_BUFFER_SIZE = 256; + + static final int[][] TWI_PINS = new int[][] {{ 4, 5 }, { 47, 48 }, { 26, 25 }}; + static final int[] ICSP_PINS = new int[] { 36, 37, 38 }; +} diff --git a/IOIOLib/src/ioio/lib/impl/DigitalInputImpl.java b/IOIOLib/src/ioio/lib/impl/DigitalInputImpl.java new file mode 100644 index 0000000..65413d4 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/DigitalInputImpl.java @@ -0,0 +1,91 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.DigitalInput; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.IncomingState.InputPinListener; + +import java.io.IOException; + +public class DigitalInputImpl extends AbstractPin implements DigitalInput, + InputPinListener { + private boolean value_; + private boolean valid_ = false; + + DigitalInputImpl(IOIOImpl ioio, int pin) throws ConnectionLostException { + super(ioio, pin); + } + + @Override + synchronized public void setValue(int value) { + // Log.v("DigitalInputImpl", "Pin " + pinNum_ + " value is " + value); + assert (value == 0 || value == 1); + value_ = (value == 1); + if (!valid_) { + valid_ = true; + } + notifyAll(); + } + + synchronized public void waitForValue(boolean value) + throws InterruptedException, ConnectionLostException { + checkState(); + while ((!valid_ || value_ != value) && state_ != State.DISCONNECTED) { + wait(); + } + checkState(); + } + + @Override + synchronized public void close() { + super.close(); + try { + ioio_.protocol_.setChangeNotify(pinNum_, false); + } catch (IOException e) { + } + } + + @Override + synchronized public boolean read() throws InterruptedException, + ConnectionLostException { + checkState(); + while (!valid_ && state_ != State.DISCONNECTED) { + wait(); + } + checkState(); + return value_; + } + + @Override + public synchronized void disconnected() { + super.disconnected(); + notifyAll(); + } +} diff --git a/IOIOLib/src/ioio/lib/impl/DigitalOutputImpl.java b/IOIOLib/src/ioio/lib/impl/DigitalOutputImpl.java new file mode 100644 index 0000000..2e20457 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/DigitalOutputImpl.java @@ -0,0 +1,50 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.DigitalOutput; +import ioio.lib.api.exception.ConnectionLostException; + +import java.io.IOException; + +public class DigitalOutputImpl extends AbstractPin implements DigitalOutput { + DigitalOutputImpl(IOIOImpl ioio, int pin) throws ConnectionLostException { + super(ioio, pin); + } + + @Override + synchronized public void write(boolean val) throws ConnectionLostException { + checkState(); + try { + ioio_.protocol_.setDigitalOutLevel(pinNum_, val); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/FlowControlledOutputStream.java b/IOIOLib/src/ioio/lib/impl/FlowControlledOutputStream.java new file mode 100644 index 0000000..05cfce5 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/FlowControlledOutputStream.java @@ -0,0 +1,128 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +public class FlowControlledOutputStream extends OutputStream { + interface Sender { + void send(byte[] data, int size); + } + + private final Sender sender_; + private final BlockingQueue queue_ = new ArrayBlockingQueue( + Constants.BUFFER_SIZE); + private final FlushThread thread_ = new FlushThread(); + private final int maxPacket_; + private final byte[] packet_; + + private int readyToSend_ = 0; + private boolean closed_ = false; + + public FlowControlledOutputStream(Sender sender, int maxPacket) { + sender_ = sender; + maxPacket_ = maxPacket; + packet_ = new byte[maxPacket]; + thread_.start(); + } + + @Override + synchronized public void flush() throws IOException { + try { + while (!closed_ && !queue_.isEmpty()) { + wait(); + } + } catch (InterruptedException e) { + throw new IOException("Interrupted"); + } + if (closed_) { + throw new IOException("Stream has been closed"); + } + } + + @Override + synchronized public void write(int oneByte) throws IOException { + try { + while (!closed_ && !queue_.offer((byte) oneByte)) { + wait(); + } + } catch (InterruptedException e) { + throw new IOException("Interrupted"); + } + if (closed_) { + throw new IOException("Stream has been closed"); + } + notifyAll(); + } + + synchronized public void readyToSend(int numBytes) { + readyToSend_ += numBytes; + notifyAll(); + } + + @Override + synchronized public void close() { + closed_ = true; + notifyAll(); + thread_.interrupt(); + } + + synchronized public void kill() { + thread_.interrupt(); + } + + class FlushThread extends Thread { + @Override + public void run() { + super.run(); + try { + while (true) { + int toSend; + synchronized (FlowControlledOutputStream.this) { + while (readyToSend_ == 0 || queue_.isEmpty()) { + FlowControlledOutputStream.this.wait(); + } + toSend = Math.min(maxPacket_, + Math.min(readyToSend_, queue_.size())); + for (int i = 0; i < toSend; ++i) { + packet_[i] = queue_.remove(); + } + readyToSend_ -= toSend; + FlowControlledOutputStream.this.notifyAll(); + } + sender_.send(packet_, toSend); + } + } catch (InterruptedException e) { + } + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/FlowControlledPacketSender.java b/IOIOLib/src/ioio/lib/impl/FlowControlledPacketSender.java new file mode 100644 index 0000000..2546c91 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/FlowControlledPacketSender.java @@ -0,0 +1,118 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import java.io.IOException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +public class FlowControlledPacketSender { + interface Packet { + int getSize(); + } + + interface Sender { + void send(Packet packet); + } + + private final Sender sender_; + private final BlockingQueue queue_ = new ArrayBlockingQueue( + Constants.PACKET_BUFFER_SIZE); + private final FlushThread thread_ = new FlushThread(); + + private int readyToSend_ = 0; + private boolean closed_ = false; + + public FlowControlledPacketSender(Sender sender) { + sender_ = sender; + thread_.start(); + } + + synchronized public void flush() throws IOException { + try { + while (!closed_ && !queue_.isEmpty()) { + wait(); + } + } catch (InterruptedException e) { + throw new IOException("Interrupted"); + } + if (closed_) { + throw new IllegalStateException("Stream has been closed"); + } + } + + synchronized public void write(Packet packet) throws IOException { + try { + while (!closed_ && !queue_.offer(packet)) { + wait(); + } + } catch (InterruptedException e) { + throw new IOException("Interrupted"); + } + if (closed_) { + throw new IllegalStateException("Stream has been closed"); + } + notifyAll(); + } + + synchronized public void readyToSend(int numBytes) { + readyToSend_ += numBytes; + notifyAll(); + } + + synchronized public void close() { + closed_ = true; + thread_.interrupt(); + } + + synchronized public void kill() { + thread_.interrupt(); + } + + class FlushThread extends Thread { + @Override + public void run() { + super.run(); + try { + while (true) { + synchronized (FlowControlledPacketSender.this) { + while (queue_.isEmpty() + || readyToSend_ < queue_.peek().getSize()) { + FlowControlledPacketSender.this.wait(); + } + FlowControlledPacketSender.this.notifyAll(); + readyToSend_ -= queue_.peek().getSize(); + } + sender_.send(queue_.remove()); + } + } catch (InterruptedException e) { + } + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/IOIOImpl.java b/IOIOLib/src/ioio/lib/impl/IOIOImpl.java new file mode 100644 index 0000000..a115186 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/IOIOImpl.java @@ -0,0 +1,654 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.AnalogInput; +import ioio.lib.api.DigitalInput; +import ioio.lib.api.DigitalInput.Spec; +import ioio.lib.api.DigitalInput.Spec.Mode; +import ioio.lib.api.DigitalOutput; +import ioio.lib.api.IOIO; +import ioio.lib.api.IOIOConnection; +import ioio.lib.api.IcspMaster; +import ioio.lib.api.PulseInput; +import ioio.lib.api.PulseInput.ClockRate; +import ioio.lib.api.PulseInput.PulseMode; +import ioio.lib.api.PwmOutput; +import ioio.lib.api.SpiMaster; +import ioio.lib.api.TwiMaster; +import ioio.lib.api.TwiMaster.Rate; +import ioio.lib.api.Uart; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.api.exception.IncompatibilityException; +import ioio.lib.impl.IOIOProtocol.PwmScale; +import ioio.lib.impl.IncomingState.DisconnectListener; + +import java.io.IOException; + +import android.util.Log; + +public class IOIOImpl implements IOIO, DisconnectListener { + private static final String TAG = "IOIOImpl"; + + enum State { + INIT, CONNECTED, INCOMPATIBLE, DEAD + } + + private static final byte[] REQUIRED_INTERFACE_ID = new byte[] { 'I', 'O', + 'I', 'O', '0', '0', '0', '3' }; + + private final IOIOConnection connection_; + private final IncomingState incomingState_ = new IncomingState(); + private final boolean openPins_[] = new boolean[Constants.NUM_PINS]; + private final boolean openTwi_[] = new boolean[Constants.NUM_TWI_MODULES]; + private boolean openIcsp_ = false; + private final ModuleAllocator pwmAllocator_ = new ModuleAllocator( + Constants.NUM_PWM_MODULES, "PWM"); + private final ModuleAllocator uartAllocator_ = new ModuleAllocator( + Constants.NUM_UART_MODULES, "UART"); + private final ModuleAllocator spiAllocator_ = new ModuleAllocator( + Constants.NUM_SPI_MODULES, "SPI"); + private final ModuleAllocator incapAllocatorDouble_ = new ModuleAllocator( + Constants.INCAP_MODULES_DOUBLE, "INCAP_DOUBLE"); + private final ModuleAllocator incapAllocatorSingle_ = new ModuleAllocator( + Constants.INCAP_MODULES_SINGLE, "INCAP_SINGLE"); + IOIOProtocol protocol_; + private State state_ = State.INIT; + + public IOIOImpl(IOIOConnection con) { + connection_ = con; + } + + @Override + synchronized public void waitForConnect() throws ConnectionLostException, + IncompatibilityException { + if (state_ == State.CONNECTED) { + return; + } + if (state_ == State.DEAD) { + throw new ConnectionLostException(); + } + addDisconnectListener(this); + Log.d(TAG, "Waiting for IOIO connection"); + try { + try { + Log.d(TAG, "Waiting for underlying connection"); + connection_.waitForConnect(); + protocol_ = new IOIOProtocol(connection_.getInputStream(), + connection_.getOutputStream(), incomingState_); + } catch (ConnectionLostException e) { + incomingState_.handleConnectionLost(); + throw e; + } + Log.d(TAG, "Waiting for handshake"); + incomingState_.waitConnectionEstablished(); + Log.d(TAG, "Querying for required interface ID"); + checkInterfaceVersion(); + Log.d(TAG, "Required interface ID is supported"); + state_ = State.CONNECTED; + Log.i(TAG, "IOIO connection established"); + } catch (ConnectionLostException e) { + Log.d(TAG, "Connection lost / aborted"); + state_ = State.DEAD; + throw e; + } catch (InterruptedException e) { + Log.e(TAG, "Unexpected exception", e); + } + } + + @Override + public void disconnect() { + connection_.disconnect(); + } + + @Override + public void disconnected() { + state_ = State.DEAD; + // The IOIOConnection doesn't necessarily know about the disconnect + disconnect(); + } + + public void waitForDisconnect() throws InterruptedException { + incomingState_.waitDisconnect(); + } + + private void checkInterfaceVersion() throws IncompatibilityException, + ConnectionLostException, InterruptedException { + try { + protocol_.checkInterface(REQUIRED_INTERFACE_ID); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + if (!incomingState_.waitForInterfaceSupport()) { + state_ = State.INCOMPATIBLE; + Log.e(TAG, "Required interface ID is not supported"); + throw new IncompatibilityException( + "IOIO firmware does not support required firmware: " + + new String(REQUIRED_INTERFACE_ID)); + } + } + + synchronized void removeDisconnectListener(DisconnectListener listener) { + incomingState_.removeDisconnectListener(listener); + } + + synchronized void addDisconnectListener(DisconnectListener listener) + throws ConnectionLostException { + incomingState_.addDisconnectListener(listener); + } + + synchronized void closePin(int pin) { + try { + checkState(); + if (!openPins_[pin]) { + throw new IllegalStateException("Pin not open: " + pin); + } + protocol_.setPinDigitalIn(pin, DigitalInput.Spec.Mode.FLOATING); + openPins_[pin] = false; + } catch (IOException e) { + } catch (ConnectionLostException e) { + } + } + + synchronized void closePwm(int pwmNum) { + try { + checkState(); + pwmAllocator_.releaseModule(pwmNum); + protocol_.setPwmPeriod(pwmNum, 0, IOIOProtocol.PwmScale.SCALE_1X); + } catch (IOException e) { + } catch (ConnectionLostException e) { + } + } + + synchronized void closeUart(int uartNum) { + try { + checkState(); + uartAllocator_.releaseModule(uartNum); + protocol_.uartClose(uartNum); + } catch (IOException e) { + } catch (ConnectionLostException e) { + } + } + + synchronized void closeTwi(int twiNum) { + try { + checkState(); + if (!openTwi_[twiNum]) { + throw new IllegalStateException("TWI not open: " + twiNum); + } + openTwi_[twiNum] = false; + openPins_[Constants.TWI_PINS[twiNum][0]] = false; + openPins_[Constants.TWI_PINS[twiNum][1]] = false; + protocol_.i2cClose(twiNum); + } catch (IOException e) { + } catch (ConnectionLostException e) { + } + } + + synchronized void closeIcsp() { + try { + checkState(); + if (!openIcsp_) { + throw new IllegalStateException("ICSP not open"); + } + openIcsp_ = false; + openPins_[Constants.ICSP_PINS[0]] = false; + openPins_[Constants.ICSP_PINS[1]] = false; + protocol_.icspClose(); + } catch (ConnectionLostException e) { + } catch (IOException e) { + } + } + + synchronized void closeSpi(int spiNum) { + try { + checkState(); + spiAllocator_.releaseModule(spiNum); + protocol_.spiClose(spiNum); + } catch (IOException e) { + } catch (ConnectionLostException e) { + } + } + + synchronized void closeIncap(int incapNum, boolean doublePrecision) { + try { + checkState(); + if (doublePrecision) { + incapAllocatorDouble_.releaseModule(incapNum); + } else { + incapAllocatorSingle_.releaseModule(incapNum); + } + protocol_.incapClose(incapNum); + } catch (IOException e) { + } catch (ConnectionLostException e) { + } + } + + @Override + synchronized public void softReset() throws ConnectionLostException { + checkState(); + try { + protocol_.softReset(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + synchronized public void hardReset() throws ConnectionLostException { + checkState(); + try { + protocol_.hardReset(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + public String getImplVersion(VersionType v) throws ConnectionLostException { + checkState(); + switch (v) { + case HARDWARE_VER: + return incomingState_.hardwareId_; + case BOOTLOADER_VER: + return incomingState_.bootloaderId_; + case APP_FIRMWARE_VER: + return incomingState_.firmwareId_; + case IOIOLIB_VER: + return "IOIO0311"; + } + return null; + } + + @Override + public DigitalInput openDigitalInput(int pin) + throws ConnectionLostException { + return openDigitalInput(new DigitalInput.Spec(pin)); + } + + @Override + public DigitalInput openDigitalInput(int pin, Mode mode) + throws ConnectionLostException { + return openDigitalInput(new DigitalInput.Spec(pin, mode)); + } + + @Override + synchronized public DigitalInput openDigitalInput(DigitalInput.Spec spec) + throws ConnectionLostException { + checkState(); + PinFunctionMap.checkValidPin(spec.pin); + checkPinFree(spec.pin); + DigitalInputImpl result = new DigitalInputImpl(this, spec.pin); + addDisconnectListener(result); + openPins_[spec.pin] = true; + incomingState_.addInputPinListener(spec.pin, result); + try { + protocol_.setPinDigitalIn(spec.pin, spec.mode); + protocol_.setChangeNotify(spec.pin, true); + } catch (IOException e) { + result.close(); + throw new ConnectionLostException(e); + } + return result; + } + + @Override + public DigitalOutput openDigitalOutput(int pin, + ioio.lib.api.DigitalOutput.Spec.Mode mode, boolean startValue) + throws ConnectionLostException { + return openDigitalOutput(new DigitalOutput.Spec(pin, mode), startValue); + } + + @Override + synchronized public DigitalOutput openDigitalOutput( + DigitalOutput.Spec spec, boolean startValue) + throws ConnectionLostException { + checkState(); + PinFunctionMap.checkValidPin(spec.pin); + checkPinFree(spec.pin); + DigitalOutputImpl result = new DigitalOutputImpl(this, spec.pin); + addDisconnectListener(result); + openPins_[spec.pin] = true; + try { + protocol_.setPinDigitalOut(spec.pin, startValue, spec.mode); + } catch (IOException e) { + result.close(); + throw new ConnectionLostException(e); + } + return result; + } + + @Override + public DigitalOutput openDigitalOutput(int pin, boolean startValue) + throws ConnectionLostException { + return openDigitalOutput(new DigitalOutput.Spec(pin), startValue); + } + + @Override + public DigitalOutput openDigitalOutput(int pin) + throws ConnectionLostException { + return openDigitalOutput(new DigitalOutput.Spec(pin), false); + } + + @Override + synchronized public AnalogInput openAnalogInput(int pin) + throws ConnectionLostException { + checkState(); + PinFunctionMap.checkSupportsAnalogInput(pin); + checkPinFree(pin); + AnalogInputImpl result = new AnalogInputImpl(this, pin); + addDisconnectListener(result); + openPins_[pin] = true; + incomingState_.addInputPinListener(pin, result); + try { + protocol_.setPinAnalogIn(pin); + protocol_.setAnalogInSampling(pin, true); + } catch (IOException e) { + result.close(); + throw new ConnectionLostException(e); + } + return result; + } + + @Override + public PwmOutput openPwmOutput(int pin, int freqHz) + throws ConnectionLostException { + return openPwmOutput(new DigitalOutput.Spec(pin), freqHz); + } + + @Override + synchronized public PwmOutput openPwmOutput(DigitalOutput.Spec spec, + int freqHz) throws ConnectionLostException { + checkState(); + PinFunctionMap.checkSupportsPeripheralOutput(spec.pin); + checkPinFree(spec.pin); + int pwmNum = pwmAllocator_.allocateModule(); + + int scale = 0; + float baseUs; + int period; + while (true) { + final int clk = 16000000 / IOIOProtocol.PwmScale.values()[scale].scale; + period = clk / freqHz; + if (period <= 65536) { + baseUs = 1000000.0f / clk; + break; + } + if (++scale >= PwmScale.values().length) { + throw new IllegalArgumentException("Frequency too low: " + + freqHz); + } + } + + PwmImpl pwm = new PwmImpl(this, spec.pin, pwmNum, period, baseUs); + addDisconnectListener(pwm); + openPins_[spec.pin] = true; + try { + protocol_.setPinDigitalOut(spec.pin, false, spec.mode); + protocol_.setPinPwm(spec.pin, pwmNum, true); + protocol_.setPwmPeriod(pwmNum, period - 1, + IOIOProtocol.PwmScale.values()[scale]); + } catch (IOException e) { + pwm.close(); + throw new ConnectionLostException(e); + } + return pwm; + } + + @Override + public Uart openUart(int rx, int tx, int baud, Uart.Parity parity, + Uart.StopBits stopbits) throws ConnectionLostException { + return openUart(rx == INVALID_PIN ? null : new DigitalInput.Spec(rx), + tx == INVALID_PIN ? null : new DigitalOutput.Spec(tx), baud, + parity, stopbits); + } + + @Override + synchronized public Uart openUart(DigitalInput.Spec rx, + DigitalOutput.Spec tx, int baud, Uart.Parity parity, + Uart.StopBits stopbits) throws ConnectionLostException { + checkState(); + if (rx != null) { + PinFunctionMap.checkSupportsPeripheralInput(rx.pin); + checkPinFree(rx.pin); + } + if (tx != null) { + PinFunctionMap.checkSupportsPeripheralOutput(tx.pin); + checkPinFree(tx.pin); + } + int rxPin = rx != null ? rx.pin : INVALID_PIN; + int txPin = tx != null ? tx.pin : INVALID_PIN; + int uartNum = uartAllocator_.allocateModule(); + UartImpl uart = new UartImpl(this, txPin, rxPin, uartNum); + addDisconnectListener(uart); + incomingState_.addUartListener(uartNum, uart); + try { + if (rx != null) { + openPins_[rx.pin] = true; + protocol_.setPinDigitalIn(rx.pin, rx.mode); + protocol_.setPinUart(rx.pin, uartNum, false, true); + } + if (tx != null) { + openPins_[tx.pin] = true; + protocol_.setPinDigitalOut(tx.pin, true, tx.mode); + protocol_.setPinUart(tx.pin, uartNum, true, true); + } + boolean speed4x = true; + int rate = Math.round(4000000.0f / baud) - 1; + if (rate > 65535) { + speed4x = false; + rate = Math.round(1000000.0f / baud) - 1; + } + protocol_.uartConfigure(uartNum, rate, speed4x, stopbits, parity); + } catch (IOException e) { + uart.close(); + throw new ConnectionLostException(e); + } + return uart; + } + + @Override + synchronized public TwiMaster openTwiMaster(int twiNum, Rate rate, + boolean smbus) throws ConnectionLostException { + checkState(); + checkTwiFree(twiNum); + checkPinFree(Constants.TWI_PINS[twiNum][0]); + checkPinFree(Constants.TWI_PINS[twiNum][1]); + openPins_[Constants.TWI_PINS[twiNum][0]] = true; + openPins_[Constants.TWI_PINS[twiNum][1]] = true; + openTwi_[twiNum] = true; + TwiMasterImpl twi = new TwiMasterImpl(this, twiNum); + addDisconnectListener(twi); + incomingState_.addTwiListener(twiNum, twi); + try { + protocol_.i2cConfigureMaster(twiNum, rate, smbus); + } catch (IOException e) { + twi.close(); + throw new ConnectionLostException(e); + } + return twi; + } + + @Override + synchronized public IcspMaster openIcspMaster() + throws ConnectionLostException { + checkState(); + checkIcspFree(); + checkPinFree(Constants.ICSP_PINS[0]); + checkPinFree(Constants.ICSP_PINS[1]); + checkPinFree(Constants.ICSP_PINS[2]); + openPins_[Constants.ICSP_PINS[0]] = true; + openPins_[Constants.ICSP_PINS[1]] = true; + openPins_[Constants.ICSP_PINS[2]] = true; + openIcsp_ = true; + IcspMasterImpl icsp = new IcspMasterImpl(this); + addDisconnectListener(icsp); + incomingState_.addIcspListener(icsp); + try { + protocol_.icspOpen(); + } catch (IOException e) { + icsp.close(); + throw new ConnectionLostException(e); + } + return icsp; + } + + @Override + public SpiMaster openSpiMaster(int miso, int mosi, int clk, + int slaveSelect, SpiMaster.Rate rate) + throws ConnectionLostException { + return openSpiMaster(miso, mosi, clk, new int[] { slaveSelect }, rate); + } + + @Override + public SpiMaster openSpiMaster(int miso, int mosi, int clk, + int[] slaveSelect, SpiMaster.Rate rate) + throws ConnectionLostException { + DigitalOutput.Spec[] slaveSpecs = new DigitalOutput.Spec[slaveSelect.length]; + for (int i = 0; i < slaveSelect.length; ++i) { + slaveSpecs[i] = new DigitalOutput.Spec(slaveSelect[i]); + } + return openSpiMaster(new DigitalInput.Spec(miso, Mode.PULL_UP), + new DigitalOutput.Spec(mosi), new DigitalOutput.Spec(clk), + slaveSpecs, new SpiMaster.Config(rate)); + } + + @Override + synchronized public SpiMaster openSpiMaster(DigitalInput.Spec miso, + DigitalOutput.Spec mosi, DigitalOutput.Spec clk, + DigitalOutput.Spec[] slaveSelect, SpiMaster.Config config) + throws ConnectionLostException { + checkState(); + int ssPins[] = new int[slaveSelect.length]; + checkPinFree(miso.pin); + PinFunctionMap.checkSupportsPeripheralInput(miso.pin); + checkPinFree(mosi.pin); + PinFunctionMap.checkSupportsPeripheralOutput(mosi.pin); + checkPinFree(clk.pin); + PinFunctionMap.checkSupportsPeripheralOutput(clk.pin); + for (int i = 0; i < slaveSelect.length; ++i) { + checkPinFree(slaveSelect[i].pin); + ssPins[i] = slaveSelect[i].pin; + } + + int spiNum = spiAllocator_.allocateModule(); + SpiMasterImpl spi = new SpiMasterImpl(this, spiNum, mosi.pin, miso.pin, + clk.pin, ssPins); + addDisconnectListener(spi); + + openPins_[miso.pin] = true; + openPins_[mosi.pin] = true; + openPins_[clk.pin] = true; + for (int i = 0; i < slaveSelect.length; ++i) { + openPins_[slaveSelect[i].pin] = true; + } + + incomingState_.addSpiListener(spiNum, spi); + try { + protocol_.setPinDigitalIn(miso.pin, miso.mode); + protocol_.setPinSpi(miso.pin, 1, true, spiNum); + protocol_.setPinDigitalOut(mosi.pin, true, mosi.mode); + protocol_.setPinSpi(mosi.pin, 0, true, spiNum); + protocol_.setPinDigitalOut(clk.pin, config.invertClk, clk.mode); + protocol_.setPinSpi(clk.pin, 2, true, spiNum); + for (DigitalOutput.Spec spec : slaveSelect) { + protocol_.setPinDigitalOut(spec.pin, true, spec.mode); + } + protocol_.spiConfigureMaster(spiNum, config); + } catch (IOException e) { + spi.close(); + throw new ConnectionLostException(e); + } + return spi; + } + + @Override + public PulseInput openPulseInput(Spec spec, ClockRate rate, PulseMode mode, + boolean doublePrecision) throws ConnectionLostException { + checkState(); + checkPinFree(spec.pin); + PinFunctionMap.checkSupportsPeripheralInput(spec.pin); + int incapNum = doublePrecision ? incapAllocatorDouble_.allocateModule() + : incapAllocatorSingle_.allocateModule(); + IncapImpl incap = new IncapImpl(this, mode, incapNum, spec.pin, + rate.hertz, mode.scaling, doublePrecision); + addDisconnectListener(incap); + incomingState_.addIncapListener(incapNum, incap); + openPins_[spec.pin] = true; + try { + protocol_.setPinDigitalIn(spec.pin, spec.mode); + protocol_.setPinIncap(spec.pin, incapNum, true); + protocol_.incapConfigure(incapNum, doublePrecision, + mode.ordinal() + 1, rate.ordinal()); + } catch (IOException e) { + incap.close(); + throw new ConnectionLostException(e); + } + return incap; + } + + @Override + public PulseInput openPulseInput(int pin, PulseMode mode) + throws ConnectionLostException { + return openPulseInput(new DigitalInput.Spec(pin), ClockRate.RATE_16MHz, + mode, true); + } + + private void checkPinFree(int pin) { + if (openPins_[pin]) { + throw new IllegalArgumentException("Pin already open: " + pin); + } + } + + private void checkTwiFree(int twi) { + if (openTwi_[twi]) { + throw new IllegalArgumentException("TWI already open: " + twi); + } + } + + private void checkIcspFree() { + if (openIcsp_) { + throw new IllegalArgumentException("ICSP already open"); + } + } + + private void checkState() throws ConnectionLostException { + if (state_ == State.DEAD) { + throw new ConnectionLostException(); + } + if (state_ == State.INCOMPATIBLE) { + throw new IllegalStateException( + "Incompatibility has been reported - IOIO cannot be used"); + } + if (state_ != State.CONNECTED) { + throw new IllegalStateException( + "Connection has not yet been established"); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/IOIOProtocol.java b/IOIOLib/src/ioio/lib/impl/IOIOProtocol.java new file mode 100644 index 0000000..1975e10 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/IOIOProtocol.java @@ -0,0 +1,798 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.DigitalInput; +import ioio.lib.api.DigitalOutput; +import ioio.lib.api.SpiMaster; +import ioio.lib.api.TwiMaster.Rate; +import ioio.lib.api.Uart; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import android.util.Log; + +public class IOIOProtocol { + static final int HARD_RESET = 0x00; + static final int ESTABLISH_CONNECTION = 0x00; + static final int SOFT_RESET = 0x01; + static final int CHECK_INTERFACE = 0x02; + static final int CHECK_INTERFACE_RESPONSE = 0x02; + static final int SET_PIN_DIGITAL_OUT = 0x03; + static final int SET_DIGITAL_OUT_LEVEL = 0x04; + static final int REPORT_DIGITAL_IN_STATUS = 0x04; + static final int SET_PIN_DIGITAL_IN = 0x05; + static final int REPORT_PERIODIC_DIGITAL_IN_STATUS = 0x05; + static final int SET_CHANGE_NOTIFY = 0x06; + static final int REGISTER_PERIODIC_DIGITAL_SAMPLING = 0x07; + static final int SET_PIN_PWM = 0x08; + static final int SET_PWM_DUTY_CYCLE = 0x09; + static final int SET_PWM_PERIOD = 0x0A; + static final int SET_PIN_ANALOG_IN = 0x0B; + static final int REPORT_ANALOG_IN_STATUS = 0x0B; + static final int SET_ANALOG_IN_SAMPLING = 0x0C; + static final int REPORT_ANALOG_IN_FORMAT = 0x0C; + static final int UART_CONFIG = 0x0D; + static final int UART_STATUS = 0x0D; + static final int UART_DATA = 0x0E; + static final int SET_PIN_UART = 0x0F; + static final int UART_REPORT_TX_STATUS = 0x0F; + static final int SPI_CONFIGURE_MASTER = 0x10; + static final int SPI_STATUS = 0x10; + static final int SPI_MASTER_REQUEST = 0x11; + static final int SPI_DATA = 0x11; + static final int SET_PIN_SPI = 0x12; + static final int SPI_REPORT_TX_STATUS = 0x12; + static final int I2C_CONFIGURE_MASTER = 0x13; + static final int I2C_STATUS = 0x13; + static final int I2C_WRITE_READ = 0x14; + static final int I2C_RESULT = 0x14; + static final int I2C_REPORT_TX_STATUS = 0x15; + static final int ICSP_SIX = 0x16; + static final int ICSP_REPORT_RX_STATUS = 0x16; + static final int ICSP_REGOUT = 0x17; + static final int ICSP_RESULT = 0x17; + static final int ICSP_PROG_ENTER = 0x18; + static final int ICSP_PROG_EXIT = 0x19; + static final int ICSP_CONFIG = 0x1A; + static final int INCAP_CONFIGURE = 0x1B; + static final int INCAP_STATUS = 0x1B; + static final int SET_PIN_INCAP = 0x1C; + static final int INCAP_REPORT = 0x1C; + + static final int[] SCALE_DIV = new int[] { + 0x1F, // 31.25 + 0x1E, // 35.714 + 0x1D, // 41.667 + 0x1C, // 50 + 0x1B, // 62.5 + 0x1A, // 83.333 + 0x17, // 125 + 0x16, // 142.857 + 0x15, // 166.667 + 0x14, // 200 + 0x13, // 250 + 0x12, // 333.333 + 0x0F, // 500 + 0x0E, // 571.429 + 0x0D, // 666.667 + 0x0C, // 800 + 0x0B, // 1000 + 0x0A, // 1333.333 + 0x07, // 2000 + 0x06, // 2285.714 + 0x05, // 2666.667 + 0x04, // 3200 + 0x03, // 4000 + 0x02, // 5333.333 + 0x01 // 8000 + }; + + private static final String TAG = "IOIOProtocol"; + + enum PwmScale { + SCALE_1X(1, 0), SCALE_8X(8, 3), SCALE_64X(64, 2), SCALE_256X(256, 1); + + public final int scale; + private final int encoding; + + PwmScale(int scale, int encoding) { + this.scale = scale; + this.encoding = encoding; + } + } + + private byte[] outbuf_ = new byte[128]; + private int pos_ = 0; + + private void writeByte(int b) { + assert (b >= 0 && b < 256); + //Log.v(TAG, "sending: 0x" + Integer.toHexString(b)); + outbuf_[pos_++] = (byte) b; + } + + private void flush() throws IOException { + try { + out_.write(outbuf_, 0, pos_); + } finally { + pos_ = 0; + } + } + + private void writeTwoBytes(int i) throws IOException { + writeByte(i & 0xFF); + writeByte(i >> 8); + } + + private void writeThreeBytes(int i) throws IOException { + writeByte(i & 0xFF); + writeByte((i >> 8) & 0xFF); + writeByte((i >> 16) & 0xFF); + } + + synchronized public void hardReset() throws IOException { + writeByte(HARD_RESET); + writeByte('I'); + writeByte('O'); + writeByte('I'); + writeByte('O'); + flush(); + } + + synchronized public void softReset() throws IOException { + writeByte(SOFT_RESET); + flush(); + } + + synchronized public void checkInterface(byte[] interfaceId) + throws IOException { + if (interfaceId.length != 8) { + throw new IllegalArgumentException( + "interface ID must be exactly 8 bytes long"); + } + writeByte(CHECK_INTERFACE); + for (int i = 0; i < 8; ++i) { + writeByte(interfaceId[i]); + } + flush(); + } + + synchronized public void setDigitalOutLevel(int pin, boolean level) + throws IOException { + writeByte(SET_DIGITAL_OUT_LEVEL); + writeByte(pin << 2 | (level ? 1 : 0)); + flush(); + } + + synchronized public void setPinPwm(int pin, int pwmNum, boolean enable) + throws IOException { + writeByte(SET_PIN_PWM); + writeByte(pin & 0x3F); + writeByte((enable ? 0x80 : 0x00) | (pwmNum & 0x0F)); + flush(); + } + + synchronized public void setPwmDutyCycle(int pwmNum, int dutyCycle, + int fraction) throws IOException { + writeByte(SET_PWM_DUTY_CYCLE); + writeByte(pwmNum << 2 | fraction); + writeTwoBytes(dutyCycle); + flush(); + } + + synchronized public void setPwmPeriod(int pwmNum, int period, PwmScale scale) + throws IOException { + writeByte(SET_PWM_PERIOD); + writeByte(((scale.encoding & 0x02) << 6) | (pwmNum << 1) + | (scale.encoding & 0x01)); + writeTwoBytes(period); + flush(); + } + + synchronized public void setPinIncap(int pin, int incapNum, boolean enable) + throws IOException { + writeByte(SET_PIN_INCAP); + writeByte(pin); + writeByte(incapNum | (enable ? 0x80 : 0x00)); + flush(); + } + + synchronized public void incapClose(int incapNum) throws IOException { + writeByte(INCAP_CONFIGURE); + writeByte(incapNum); + writeByte(0x00); + flush(); + } + + synchronized public void incapConfigure(int incapNum, boolean double_prec, + int mode, int clock) throws IOException { + writeByte(INCAP_CONFIGURE); + writeByte(incapNum); + writeByte((double_prec ? 0x80 : 0x00) | (mode << 3) | clock); + flush(); + } + + synchronized public void i2cWriteRead(int i2cNum, boolean tenBitAddr, + int address, int writeSize, int readSize, byte[] writeData) + throws IOException { + writeByte(I2C_WRITE_READ); + writeByte(((address >> 8) << 6) | (tenBitAddr ? 0x20 : 0x00) | i2cNum); + writeByte(address & 0xFF); + writeByte(writeSize); + writeByte(readSize); + for (int i = 0; i < writeSize; ++i) { + writeByte(((int) writeData[i]) & 0xFF); + } + flush(); + } + + synchronized public void setPinDigitalOut(int pin, boolean value, + DigitalOutput.Spec.Mode mode) throws IOException { + writeByte(SET_PIN_DIGITAL_OUT); + writeByte((pin << 2) + | (mode == DigitalOutput.Spec.Mode.OPEN_DRAIN ? 0x01 : 0x00) + | (value ? 0x02 : 0x00)); + flush(); + } + + synchronized public void setPinDigitalIn(int pin, + DigitalInput.Spec.Mode mode) throws IOException { + int pull = 0; + if (mode == DigitalInput.Spec.Mode.PULL_UP) { + pull = 1; + } else if (mode == DigitalInput.Spec.Mode.PULL_DOWN) { + pull = 2; + } + writeByte(SET_PIN_DIGITAL_IN); + writeByte((pin << 2) | pull); + flush(); + } + + synchronized public void setChangeNotify(int pin, boolean changeNotify) + throws IOException { + writeByte(SET_CHANGE_NOTIFY); + writeByte((pin << 2) | (changeNotify ? 0x01 : 0x00)); + flush(); + } + + synchronized public void registerPeriodicDigitalSampling(int pin, + int freqScale) throws IOException { + // TODO: implement + } + + synchronized public void setPinAnalogIn(int pin) throws IOException { + writeByte(SET_PIN_ANALOG_IN); + writeByte(pin); + flush(); + } + + synchronized public void setAnalogInSampling(int pin, boolean enable) + throws IOException { + writeByte(SET_ANALOG_IN_SAMPLING); + writeByte((enable ? 0x80 : 0x00) | (pin & 0x3F)); + flush(); + } + + synchronized public void uartData(int uartNum, int numBytes, byte data[]) + throws IOException { + if (numBytes > 64) { + throw new IllegalArgumentException( + "A maximum of 64 bytes can be sent in one uartData message. Got: " + + numBytes); + } + writeByte(UART_DATA); + writeByte((numBytes - 1) | uartNum << 6); + for (int i = 0; i < numBytes; ++i) { + writeByte(((int) data[i]) & 0xFF); + } + flush(); + } + + synchronized public void uartConfigure(int uartNum, int rate, + boolean speed4x, Uart.StopBits stopbits, Uart.Parity parity) + throws IOException { + int parbits = parity == Uart.Parity.EVEN ? 1 + : (parity == Uart.Parity.ODD ? 2 : 0); + writeByte(UART_CONFIG); + writeByte((uartNum << 6) | (speed4x ? 0x08 : 0x00) + | (stopbits == Uart.StopBits.TWO ? 0x04 : 0x00) | parbits); + writeTwoBytes(rate); + flush(); + } + + synchronized public void uartClose(int uartNum) throws IOException { + writeByte(UART_CONFIG); + writeByte(uartNum << 6); + writeTwoBytes(0); + flush(); + } + + synchronized public void setPinUart(int pin, int uartNum, boolean tx, + boolean enable) throws IOException { + writeByte(SET_PIN_UART); + writeByte(pin); + writeByte((enable ? 0x80 : 0x00) | (tx ? 0x40 : 0x00) | uartNum); + flush(); + } + + synchronized public void spiConfigureMaster(int spiNum, + SpiMaster.Config config) throws IOException { + writeByte(SPI_CONFIGURE_MASTER); + writeByte((spiNum << 5) | SCALE_DIV[config.rate.ordinal()]); + writeByte((config.sampleOnTrailing ? 0x00 : 0x02) + | (config.invertClk ? 0x01 : 0x00)); + flush(); + } + + synchronized public void spiClose(int spiNum) throws IOException { + writeByte(SPI_CONFIGURE_MASTER); + writeByte(spiNum << 5); + writeByte(0x00); + flush(); + } + + synchronized public void setPinSpi(int pin, int mode, boolean enable, + int spiNum) throws IOException { + writeByte(SET_PIN_SPI); + writeByte(pin); + writeByte((1 << 4) | (mode << 2) | spiNum); + flush(); + } + + synchronized public void spiMasterRequest(int spiNum, int ssPin, + byte data[], int dataBytes, int totalBytes, int responseBytes) + throws IOException { + final boolean dataNeqTotal = (dataBytes != totalBytes); + final boolean resNeqTotal = (responseBytes != totalBytes); + writeByte(SPI_MASTER_REQUEST); + writeByte((spiNum << 6) | ssPin); + writeByte((dataNeqTotal ? 0x80 : 0x00) | (resNeqTotal ? 0x40 : 0x00) + | totalBytes - 1); + if (dataNeqTotal) { + writeByte(dataBytes); + } + if (resNeqTotal) { + writeByte(responseBytes); + } + for (int i = 0; i < dataBytes; ++i) { + writeByte(((int) data[i]) & 0xFF); + } + flush(); + } + + synchronized public void i2cConfigureMaster(int i2cNum, Rate rate, + boolean smbusLevels) throws IOException { + int rateBits = (rate == Rate.RATE_1MHz ? 3 + : (rate == Rate.RATE_400KHz ? 2 : 1)); + writeByte(I2C_CONFIGURE_MASTER); + writeByte((smbusLevels ? 0x80 : 0) | (rateBits << 5) | i2cNum); + flush(); + } + + synchronized public void i2cClose(int i2cNum) throws IOException { + writeByte(I2C_CONFIGURE_MASTER); + writeByte(i2cNum); + flush(); + } + + public void icspOpen() throws IOException { + writeByte(ICSP_CONFIG); + writeByte(0x01); + flush(); + } + + public void icspClose() throws IOException { + writeByte(ICSP_CONFIG); + writeByte(0x00); + flush(); + } + + public void icspEnter() throws IOException { + writeByte(ICSP_PROG_ENTER); + flush(); + } + + public void icspExit() throws IOException { + writeByte(ICSP_PROG_EXIT); + flush(); + } + + public void icspSix(int instruction) throws IOException { + writeByte(ICSP_SIX); + writeThreeBytes(instruction); + flush(); + } + + public void icspRegout() throws IOException { + writeByte(ICSP_REGOUT); + flush(); + } + + public interface IncomingHandler { + public void handleEstablishConnection(byte[] hardwareId, + byte[] bootloaderId, byte[] firmwareId); + + public void handleConnectionLost(); + + public void handleSoftReset(); + + public void handleCheckInterfaceResponse(boolean supported); + + public void handleSetChangeNotify(int pin, boolean changeNotify); + + public void handleReportDigitalInStatus(int pin, boolean level); + + public void handleRegisterPeriodicDigitalSampling(int pin, int freqScale); + + public void handleReportPeriodicDigitalInStatus(int frameNum, + boolean values[]); + + public void handleAnalogPinStatus(int pin, boolean open); + + public void handleReportAnalogInStatus(int pins[], int values[]); + + public void handleUartOpen(int uartNum); + + public void handleUartClose(int uartNum); + + public void handleUartData(int uartNum, int numBytes, byte data[]); + + public void handleUartReportTxStatus(int uartNum, int bytesRemaining); + + public void handleSpiOpen(int spiNum); + + public void handleSpiClose(int spiNum); + + public void handleSpiData(int spiNum, int ssPin, byte data[], + int dataBytes); + + public void handleSpiReportTxStatus(int spiNum, int bytesRemaining); + + public void handleI2cOpen(int i2cNum); + + public void handleI2cClose(int i2cNum); + + public void handleI2cResult(int i2cNum, int size, byte[] data); + + public void handleI2cReportTxStatus(int spiNum, int bytesRemaining); + + void handleIcspOpen(); + + void handleIcspClose(); + + void handleIcspReportRxStatus(int bytesRemaining); + + void handleIcspResult(int size, byte[] data); + + public void handleIncapReport(int incapNum, int size, byte[] data); + + public void handleIncapClose(int incapNum); + + public void handleIncapOpen(int incapNum); + } + + class IncomingThread extends Thread { + private int readOffset_ = 0; + private int validBytes_ = 0; + private byte[] inbuf_ = new byte[64]; + + private int[] analogFramePins_ = new int[0]; + private Set removedPins_ = new HashSet( + Constants.NUM_ANALOG_PINS); + private Set addedPins_ = new HashSet( + Constants.NUM_ANALOG_PINS); + + private void findDelta(int[] newPins) { + removedPins_.clear(); + addedPins_.clear(); + for (int i : analogFramePins_) { + removedPins_.add(i); + } + for (int i : newPins) { + addedPins_.add(i); + } + for (Iterator it = removedPins_.iterator(); it.hasNext();) { + Integer current = it.next(); + if (addedPins_.contains(current)) { + it.remove(); + addedPins_.remove(current); + } + } + } + + private void fillBuf() throws IOException { + try { + validBytes_ = in_.read(inbuf_, 0, inbuf_.length); + if (validBytes_ <= 0) { + throw new IOException("Unexpected stream closure"); + } + //Log.v(TAG, "received " + validBytes_ + " bytes"); + readOffset_ = 0; + } catch (IOException e) { + Log.i(TAG, "IOIO disconnected"); + throw e; + } + } + + private int readByte() throws IOException { + if (readOffset_ == validBytes_) { + fillBuf(); + } + int b = inbuf_[readOffset_++]; + b &= 0xFF; // make unsigned + //Log.v(TAG, "received: 0x" + Integer.toHexString(b)); + return b; + } + + private void readBytes(int size, byte[] buffer) throws IOException { + for (int i = 0; i < size; ++i) { + buffer[i] = (byte) readByte(); + } + } + + @Override + public void run() { + super.run(); + setPriority(MAX_PRIORITY); + int arg1; + int arg2; + int numPins; + int size; + byte[] data = new byte[256]; + try { + while (true) { + switch (arg1 = readByte()) { + case ESTABLISH_CONNECTION: + if (readByte() != 'I' || readByte() != 'O' + || readByte() != 'I' || readByte() != 'O') { + throw new IOException( + "Bad establish connection magic"); + } + byte[] hardwareId = new byte[8]; + byte[] bootloaderId = new byte[8]; + byte[] firmwareId = new byte[8]; + readBytes(8, hardwareId); + readBytes(8, bootloaderId); + readBytes(8, firmwareId); + + handler_.handleEstablishConnection(hardwareId, + bootloaderId, firmwareId); + break; + + case SOFT_RESET: + handler_.handleSoftReset(); + break; + + case REPORT_DIGITAL_IN_STATUS: + arg1 = readByte(); + handler_.handleReportDigitalInStatus(arg1 >> 2, + (arg1 & 0x01) == 1); + break; + + case SET_CHANGE_NOTIFY: + arg1 = readByte(); + handler_.handleSetChangeNotify(arg1 >> 2, + (arg1 & 0x01) == 1); + break; + + case REGISTER_PERIODIC_DIGITAL_SAMPLING: + // TODO: implement + break; + + case REPORT_PERIODIC_DIGITAL_IN_STATUS: + // TODO: implement + break; + + case REPORT_ANALOG_IN_FORMAT: + numPins = readByte(); + int[] newFormat = new int[numPins]; + for (int i = 0; i < numPins; ++i) { + newFormat[i] = readByte(); + } + findDelta(newFormat); + for (Integer i : removedPins_) { + handler_.handleAnalogPinStatus(i, false); + } + for (Integer i : addedPins_) { + handler_.handleAnalogPinStatus(i, true); + } + analogFramePins_ = newFormat; + break; + + case REPORT_ANALOG_IN_STATUS: + numPins = analogFramePins_.length; + int header = 0; + int[] values = new int[numPins]; + for (int i = 0; i < numPins; ++i) { + if (i % 4 == 0) { + header = readByte(); + } + values[i] = (readByte() << 2) | (header & 0x03); + header >>= 2; + } + handler_.handleReportAnalogInStatus(analogFramePins_, + values); + break; + + case UART_REPORT_TX_STATUS: + arg1 = readByte(); + arg2 = readByte(); + handler_.handleUartReportTxStatus(arg1 & 0x03, + (arg1 >> 2) | (arg2 << 6)); + break; + + case UART_DATA: + arg1 = readByte(); + for (int i = 0; i < (arg1 & 0x3F) + 1; ++i) { + data[i] = (byte) readByte(); + } + handler_.handleUartData(arg1 >> 6, (arg1 & 0x3F) + 1, + data); + break; + + case UART_STATUS: + arg1 = readByte(); + if ((arg1 & 0x80) != 0) { + handler_.handleUartOpen(arg1 & 0x03); + } else { + handler_.handleUartClose(arg1 & 0x03); + } + break; + + case SPI_DATA: + arg1 = readByte(); + arg2 = readByte(); + for (int i = 0; i < (arg1 & 0x3F) + 1; ++i) { + data[i] = (byte) readByte(); + } + handler_.handleSpiData(arg1 >> 6, arg2 & 0x3F, data, + (arg1 & 0x3F) + 1); + break; + + case SPI_REPORT_TX_STATUS: + arg1 = readByte(); + arg2 = readByte(); + handler_.handleSpiReportTxStatus(arg1 & 0x03, + (arg1 >> 2) | (arg2 << 6)); + break; + + case SPI_STATUS: + arg1 = readByte(); + if ((arg1 & 0x80) != 0) { + handler_.handleSpiOpen(arg1 & 0x03); + } else { + handler_.handleSpiClose(arg1 & 0x03); + } + break; + + case I2C_STATUS: + arg1 = readByte(); + if ((arg1 & 0x80) != 0) { + handler_.handleI2cOpen(arg1 & 0x03); + } else { + handler_.handleI2cClose(arg1 & 0x03); + } + break; + + case I2C_RESULT: + arg1 = readByte(); + arg2 = readByte(); + if (arg2 != 0xFF) { + for (int i = 0; i < arg2; ++i) { + data[i] = (byte) readByte(); + } + } + handler_.handleI2cResult(arg1 & 0x03, arg2, data); + break; + + case I2C_REPORT_TX_STATUS: + arg1 = readByte(); + arg2 = readByte(); + handler_.handleI2cReportTxStatus(arg1 & 0x03, + (arg1 >> 2) | (arg2 << 6)); + break; + + case CHECK_INTERFACE_RESPONSE: + arg1 = readByte(); + handler_.handleCheckInterfaceResponse((arg1 & 0x01) == 1); + break; + + case ICSP_REPORT_RX_STATUS: + arg1 = readByte(); + arg2 = readByte(); + handler_.handleIcspReportRxStatus(arg1 | (arg2 << 8)); + break; + + case ICSP_RESULT: + data[0] = (byte) readByte(); + data[1] = (byte) readByte(); + handler_.handleIcspResult(2, data); + break; + + case ICSP_CONFIG: + arg1 = readByte(); + if ((arg1 & 0x01) == 1) { + handler_.handleIcspOpen(); + } else { + handler_.handleIcspClose(); + } + break; + + case INCAP_STATUS: + arg1 = readByte(); + if ((arg1 & 0x80) != 0) { + handler_.handleIncapOpen(arg1 & 0x0F); + } else { + handler_.handleIncapClose(arg1 & 0x0F); + } + break; + + case INCAP_REPORT: + arg1 = readByte(); + size = arg1 >> 6; + if (size == 0) { + size = 4; + } + readBytes(size, data); + handler_.handleIncapReport(arg1 & 0x0F, size, data); + break; + + default: + in_.close(); + IOException e = new IOException( + "Received unexpected command: 0x" + + Integer.toHexString(arg1)); + Log.e("IOIOProtocol", "Protocol error", e); + throw e; + } + } + } catch (IOException e) { + handler_.handleConnectionLost(); + } + } + } + + private final InputStream in_; + private final OutputStream out_; + private final IncomingHandler handler_; + private final IncomingThread thread_ = new IncomingThread(); + + public IOIOProtocol(InputStream in, OutputStream out, + IncomingHandler handler) { + in_ = in; + out_ = out; + handler_ = handler; + thread_.start(); + } +} diff --git a/IOIOLib/src/ioio/lib/impl/IcspMasterImpl.java b/IOIOLib/src/ioio/lib/impl/IcspMasterImpl.java new file mode 100644 index 0000000..35b7789 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/IcspMasterImpl.java @@ -0,0 +1,135 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.IcspMaster; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.IncomingState.DataModuleListener; + +import java.io.IOException; +import java.util.LinkedList; +import java.util.Queue; + +public class IcspMasterImpl extends AbstractResource implements IcspMaster, + DataModuleListener { + private Queue resultQueue_ = new LinkedList(); + private int rxRemaining_ = 0; + + public IcspMasterImpl(IOIOImpl ioio) throws ConnectionLostException { + super(ioio); + } + + @Override + synchronized public void dataReceived(byte[] data, int size) { + assert (size == 2); + int result = (byteToInt(data[1]) << 8) | byteToInt(data[0]); + resultQueue_.add(result); + notifyAll(); + } + + @Override + synchronized public void reportAdditionalBuffer(int bytesToAdd) { + rxRemaining_ += bytesToAdd; + notifyAll(); + } + + @Override + synchronized public void enterProgramming() throws ConnectionLostException { + checkState(); + try { + ioio_.protocol_.icspEnter(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + synchronized public void exitProgramming() throws ConnectionLostException { + checkState(); + try { + ioio_.protocol_.icspExit(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + synchronized public void executeInstruction(int instruction) + throws ConnectionLostException { + checkState(); + try { + ioio_.protocol_.icspSix(instruction); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + synchronized public void readVisi() throws ConnectionLostException, + InterruptedException { + checkState(); + while (rxRemaining_ < 2 && state_ == State.OPEN) { + wait(); + } + checkState(); + rxRemaining_ -= 2; + try { + ioio_.protocol_.icspRegout(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + synchronized public void close() { + super.close(); + ioio_.closeIcsp(); + } + + @Override + public synchronized void disconnected() { + super.disconnected(); + notifyAll(); + } + + private static int byteToInt(byte b) { + return ((int) b) & 0xFF; + } + + @Override + public synchronized int waitVisiResult() throws ConnectionLostException, + InterruptedException { + checkState(); + while (resultQueue_.isEmpty() && state_ == State.OPEN) { + wait(); + } + checkState(); + return resultQueue_.remove(); + } +} diff --git a/IOIOLib/src/ioio/lib/impl/IncapImpl.java b/IOIOLib/src/ioio/lib/impl/IncapImpl.java new file mode 100644 index 0000000..a4c56c5 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/IncapImpl.java @@ -0,0 +1,109 @@ +package ioio.lib.impl; + +import ioio.lib.api.PulseInput; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.IncomingState.DataModuleListener; + +import java.util.LinkedList; +import java.util.Queue; + +public class IncapImpl extends AbstractPin implements DataModuleListener, + PulseInput { + private static final int MAX_QUEUE_LEN = 32; + private final PulseMode mode_; + private final int incapNum_; + private long lastDuration_; + private final float timeBase_; + private final boolean doublePrecision_; + private boolean valid_ = false; + // TODO: a fixed-size array would have been much better than a linked list. + private Queue pulseQueue_ = new LinkedList(); + + public IncapImpl(IOIOImpl ioio, PulseMode mode, int incapNum, int pin, + int clockRate, int scale, boolean doublePrecision) + throws ConnectionLostException { + super(ioio, pin); + mode_ = mode; + incapNum_ = incapNum; + timeBase_ = 1.0f / (scale * clockRate); + doublePrecision_ = doublePrecision; + } + + @Override + public float getFrequency() throws InterruptedException, + ConnectionLostException { + if (mode_ != PulseMode.FREQ && mode_ != PulseMode.FREQ_SCALE_4 + && mode_ != PulseMode.FREQ_SCALE_16) { + throw new IllegalStateException( + "Cannot query frequency when module was not opened in frequency mode."); + } + return 1.0f / getDuration(); + } + + @Override + public synchronized float getDuration() throws InterruptedException, + ConnectionLostException { + checkState(); + while (!valid_) { + wait(); + checkState(); + } + return timeBase_ * lastDuration_; + } + + @Override + public synchronized float waitPulseGetDuration() + throws InterruptedException, ConnectionLostException { + if (mode_ != PulseMode.POSITIVE && mode_ != PulseMode.NEGATIVE) { + throw new IllegalStateException( + "Cannot wait for pulse when module was not opened in pulse mode."); + } + checkState(); + while (pulseQueue_.isEmpty() && state_ == State.OPEN) { + wait(); + } + checkState(); + return timeBase_ * pulseQueue_.remove(); + } + + @Override + public synchronized void dataReceived(byte[] data, int size) { + lastDuration_ = ByteArrayToLong(data, size); + if (pulseQueue_.size() == MAX_QUEUE_LEN) { + pulseQueue_.remove(); + } + pulseQueue_.add(lastDuration_); + valid_ = true; + notifyAll(); + } + + private static long ByteArrayToLong(byte[] data, int size) { + long result = 0; + int i = size; + while (i-- > 0) { + result <<= 8; + result |= ((int) data[i]) & 0xFF; + } + if (result == 0) { + result = 1 << (size * 8); + } + return result; + } + + @Override + public synchronized void reportAdditionalBuffer(int bytesToAdd) { + } + + @Override + public synchronized void close() { + ioio_.closeIncap(incapNum_, doublePrecision_); + super.close(); + } + + @Override + public synchronized void disconnected() { + notifyAll(); + super.disconnected(); + } + +} diff --git a/IOIOLib/src/ioio/lib/impl/IncomingState.java b/IOIOLib/src/ioio/lib/impl/IncomingState.java new file mode 100644 index 0000000..02c48c2 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/IncomingState.java @@ -0,0 +1,460 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.IOIOProtocol.IncomingHandler; + +import java.util.HashSet; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; + +import android.util.Log; + +public class IncomingState implements IncomingHandler { + enum ConnectionState { + INIT, ESTABLISHED, CONNECTED, DISCONNECTED, UNSUPPORTED_IID + } + + interface InputPinListener { + void setValue(int value); + } + + interface DisconnectListener { + void disconnected(); + } + + interface DataModuleListener { + void dataReceived(byte[] data, int size); + + void reportAdditionalBuffer(int bytesToAdd); + } + + class InputPinState { + private Queue listeners_ = new ConcurrentLinkedQueue(); + private boolean currentOpen_ = false; + + void pushListener(InputPinListener listener) { + listeners_.add(listener); + } + + void closeCurrentListener() { + if (currentOpen_) { + currentOpen_ = false; + listeners_.remove(); + } + } + + void openNextListener() { + assert (!listeners_.isEmpty()); + if (!currentOpen_) { + currentOpen_ = true; + } + } + + void setValue(int v) { + assert (currentOpen_); + listeners_.peek().setValue(v); + } + } + + class DataModuleState { + private Queue listeners_ = new ConcurrentLinkedQueue(); + private boolean currentOpen_ = false; + + void pushListener(DataModuleListener listener) { + listeners_.add(listener); + } + + void closeCurrentListener() { + if (currentOpen_) { + currentOpen_ = false; + listeners_.remove(); + } + } + + void openNextListener() { + assert (!listeners_.isEmpty()); + if (!currentOpen_) { + currentOpen_ = true; + } + } + + void dataReceived(byte[] data, int size) { + assert (currentOpen_); + listeners_.peek().dataReceived(data, size); + } + + public void reportAdditionalBuffer(int bytesRemaining) { + assert (currentOpen_); + listeners_.peek().reportAdditionalBuffer(bytesRemaining); + } + } + + private final InputPinState[] intputPinStates_ = new InputPinState[Constants.NUM_PINS]; + private final DataModuleState[] uartStates_ = new DataModuleState[Constants.NUM_UART_MODULES]; + private final DataModuleState[] twiStates_ = new DataModuleState[Constants.NUM_TWI_MODULES]; + private final DataModuleState[] spiStates_ = new DataModuleState[Constants.NUM_SPI_MODULES]; + private final DataModuleState[] incapStates_ = new DataModuleState[2 + * Constants.INCAP_MODULES_DOUBLE.length + + Constants.INCAP_MODULES_SINGLE.length]; + private final DataModuleState icspState_ = new DataModuleState(); + private final Set disconnectListeners_ = new HashSet(); + private ConnectionState connection_ = ConnectionState.INIT; + public String hardwareId_; + public String bootloaderId_; + public String firmwareId_; + + public IncomingState() { + for (int i = 0; i < intputPinStates_.length; ++i) { + intputPinStates_[i] = new InputPinState(); + } + for (int i = 0; i < uartStates_.length; ++i) { + uartStates_[i] = new DataModuleState(); + } + for (int i = 0; i < twiStates_.length; ++i) { + twiStates_[i] = new DataModuleState(); + } + for (int i = 0; i < spiStates_.length; ++i) { + spiStates_[i] = new DataModuleState(); + } + for (int i = 0; i < incapStates_.length; ++i) { + incapStates_[i] = new DataModuleState(); + } + } + + synchronized public void waitConnectionEstablished() + throws InterruptedException, ConnectionLostException { + while (connection_ == ConnectionState.INIT) { + wait(); + } + if (connection_ == ConnectionState.DISCONNECTED) { + throw new ConnectionLostException(); + } + } + + synchronized public boolean waitForInterfaceSupport() + throws InterruptedException, ConnectionLostException { + if (connection_ == ConnectionState.INIT) { + throw new IllegalStateException( + "Have to connect before waiting for interface support"); + } + while (connection_ == ConnectionState.ESTABLISHED) { + wait(); + } + if (connection_ == ConnectionState.DISCONNECTED) { + throw new ConnectionLostException(); + } + return connection_ == ConnectionState.CONNECTED; + } + + synchronized public void waitDisconnect() throws InterruptedException { + while (connection_ != ConnectionState.DISCONNECTED) { + wait(); + } + } + + public void addInputPinListener(int pin, InputPinListener listener) { + intputPinStates_[pin].pushListener(listener); + } + + public void addUartListener(int uartNum, DataModuleListener listener) { + uartStates_[uartNum].pushListener(listener); + } + + public void addTwiListener(int twiNum, DataModuleListener listener) { + twiStates_[twiNum].pushListener(listener); + } + + public void addIncapListener(int incapNum, DataModuleListener listener) { + incapStates_[incapNum].pushListener(listener); + } + + public void addIcspListener(DataModuleListener listener) { + icspState_.pushListener(listener); + } + + public void addSpiListener(int spiNum, DataModuleListener listener) { + spiStates_[spiNum].pushListener(listener); + } + + synchronized public void addDisconnectListener(DisconnectListener listener) + throws ConnectionLostException { + checkNotDisconnected(); + disconnectListeners_.add(listener); + } + + synchronized public void removeDisconnectListener( + DisconnectListener listener) { + if (connection_ != ConnectionState.DISCONNECTED) { + disconnectListeners_.remove(listener); + } + } + + @Override + public void handleConnectionLost() { + // logMethod("handleConnectionLost"); + synchronized (this) { + connection_ = ConnectionState.DISCONNECTED; + } + for (DisconnectListener listener : disconnectListeners_) { + listener.disconnected(); + } + disconnectListeners_.clear(); + synchronized (this) { + notifyAll(); + } + } + + @Override + public void handleSoftReset() { + // logMethod("handleSoftReset"); + for (InputPinState pinState : intputPinStates_) { + pinState.closeCurrentListener(); + } + for (DataModuleState uartState : uartStates_) { + uartState.closeCurrentListener(); + } + for (DataModuleState twiState : twiStates_) { + twiState.closeCurrentListener(); + } + for (DataModuleState spiState : spiStates_) { + spiState.closeCurrentListener(); + } + for (DataModuleState incapState : incapStates_) { + incapState.closeCurrentListener(); + } + icspState_.closeCurrentListener(); + } + + @Override + synchronized public void handleCheckInterfaceResponse(boolean supported) { + // logMethod("handleCheckInterfaceResponse", supported); + connection_ = supported ? ConnectionState.CONNECTED + : ConnectionState.UNSUPPORTED_IID; + notifyAll(); + } + + @Override + public void handleSetChangeNotify(int pin, boolean changeNotify) { + // logMethod("handleSetChangeNotify", pin, changeNotify); + if (changeNotify) { + intputPinStates_[pin].openNextListener(); + } else { + intputPinStates_[pin].closeCurrentListener(); + } + } + + @Override + public void handleRegisterPeriodicDigitalSampling(int pin, int freqScale) { + // logMethod("handleRegisterPeriodicDigitalSampling", pin, freqScale); + assert (false); + } + + @Override + public void handleAnalogPinStatus(int pin, boolean open) { + // logMethod("handleAnalogPinStatus", pin, open); + if (open) { + intputPinStates_[pin].openNextListener(); + } else { + intputPinStates_[pin].closeCurrentListener(); + } + } + + @Override + public void handleUartData(int uartNum, int numBytes, byte[] data) { + // logMethod("handleUartData", uartNum, numBytes, data); + uartStates_[uartNum].dataReceived(data, numBytes); + } + + @Override + public void handleUartOpen(int uartNum) { + // logMethod("handleUartOpen", uartNum); + uartStates_[uartNum].openNextListener(); + } + + @Override + public void handleUartClose(int uartNum) { + // logMethod("handleUartClose", uartNum); + uartStates_[uartNum].closeCurrentListener(); + } + + @Override + public void handleSpiOpen(int spiNum) { + // logMethod("handleSpiOpen", spiNum); + spiStates_[spiNum].openNextListener(); + } + + @Override + public void handleSpiClose(int spiNum) { + // logMethod("handleSpiClose", spiNum); + spiStates_[spiNum].closeCurrentListener(); + } + + @Override + public void handleI2cOpen(int i2cNum) { + // logMethod("handleI2cOpen", i2cNum); + twiStates_[i2cNum].openNextListener(); + } + + @Override + public void handleI2cClose(int i2cNum) { + // logMethod("handleI2cClose", i2cNum); + twiStates_[i2cNum].closeCurrentListener(); + } + + @Override + public void handleIcspOpen() { + // logMethod("handleIcspOpen"); + icspState_.openNextListener(); + } + + @Override + public void handleIcspClose() { + // logMethod("handleIcspClose"); + icspState_.closeCurrentListener(); + } + + @Override + public void handleEstablishConnection(byte[] hardwareId, + byte[] bootloaderId, byte[] firmwareId) { + hardwareId_ = new String(hardwareId); + bootloaderId_ = new String(bootloaderId); + firmwareId_ = new String(firmwareId); + + Log.i("IncomingState", "IOIO Connection established. Hardware ID: " + + hardwareId_ + " Bootloader ID: " + bootloaderId_ + + " Firmware ID: " + firmwareId_); + synchronized (this) { + connection_ = ConnectionState.ESTABLISHED; + notifyAll(); + } + } + + @Override + public void handleUartReportTxStatus(int uartNum, int bytesRemaining) { + // logMethod("handleUartReportTxStatus", uartNum, bytesRemaining); + uartStates_[uartNum].reportAdditionalBuffer(bytesRemaining); + } + + @Override + public void handleI2cReportTxStatus(int i2cNum, int bytesRemaining) { + // logMethod("handleI2cReportTxStatus", i2cNum, bytesRemaining); + twiStates_[i2cNum].reportAdditionalBuffer(bytesRemaining); + } + + @Override + public void handleSpiData(int spiNum, int ssPin, byte[] data, int dataBytes) { + // logMethod("handleSpiData", spiNum, ssPin, data, dataBytes); + spiStates_[spiNum].dataReceived(data, dataBytes); + } + + @Override + public void handleIcspReportRxStatus(int bytesRemaining) { + // logMethod("handleIcspReportRxStatus", bytesRemaining); + icspState_.reportAdditionalBuffer(bytesRemaining); + } + + @Override + public void handleReportDigitalInStatus(int pin, boolean level) { + // logMethod("handleReportDigitalInStatus", pin, level); + intputPinStates_[pin].setValue(level ? 1 : 0); + } + + @Override + public void handleReportPeriodicDigitalInStatus(int frameNum, + boolean[] values) { + // logMethod("handleReportPeriodicDigitalInStatus", frameNum, values); + } + + @Override + public void handleReportAnalogInStatus(int pins[], int values[]) { + // logMethod("handleReportAnalogInStatus", pins, values); + for (int i = 0; i < pins.length; ++i) { + intputPinStates_[pins[i]].setValue(values[i]); + } + } + + @Override + public void handleSpiReportTxStatus(int spiNum, int bytesRemaining) { + // logMethod("handleSpiReportTxStatus", spiNum, bytesRemaining); + spiStates_[spiNum].reportAdditionalBuffer(bytesRemaining); + } + + @Override + public void handleI2cResult(int i2cNum, int size, byte[] data) { + // logMethod("handleI2cResult", i2cNum, size, data); + twiStates_[i2cNum].dataReceived(data, size); + } + + @Override + public void handleIncapReport(int incapNum, int size, byte[] data) { + // logMethod("handleIncapReport", incapNum, size, data); + incapStates_[incapNum].dataReceived(data, size); + } + + @Override + public void handleIncapClose(int incapNum) { + // logMethod("handleIncapClose", incapNum); + incapStates_[incapNum].closeCurrentListener(); + } + + @Override + public void handleIncapOpen(int incapNum) { + // logMethod("handleIncapOpen", incapNum); + incapStates_[incapNum].openNextListener(); + } + + @Override + public void handleIcspResult(int size, byte[] data) { + // logMethod("handleIcspResult", size, data); + icspState_.dataReceived(data, size); + } + + private void checkNotDisconnected() throws ConnectionLostException { + if (connection_ == ConnectionState.DISCONNECTED) { + throw new ConnectionLostException(); + } + } + +// private void logMethod(String name, Object... args) { +// StringBuffer msg = new StringBuffer(name); +// msg.append('('); +// for (int i = 0; i < args.length; ++i) { +// if (i != 0) { +// msg.append(", "); +// } +// msg.append(args[i]); +// } +// msg.append(')'); +// +// Log.v("IncomingState", msg.toString()); +// } +} diff --git a/IOIOLib/src/ioio/lib/impl/ModuleAllocator.java b/IOIOLib/src/ioio/lib/impl/ModuleAllocator.java new file mode 100644 index 0000000..41f7273 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/ModuleAllocator.java @@ -0,0 +1,106 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.exception.OutOfResourceException; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +/** + * Utility to allocate and assign unique module ids. + * A module id is requested via {@link #allocateModule()} + * and released via {@link #releaseModule(int)}. + * + * @author birmiwal + */ +public class ModuleAllocator { + private final Set availableModuleIds_; + private final Set allocatedModuleIds_; + private final String name_; + + public ModuleAllocator(Collection availableModuleIds, String name) { + this.availableModuleIds_ = new TreeSet(availableModuleIds); + allocatedModuleIds_ = new HashSet(); + name_ = name; + } + + public ModuleAllocator(int[] availableModuleIds, String name) { + this(getList(availableModuleIds), name); + } + + public ModuleAllocator(int maxModules, String name) { + this(getList(maxModules), name); + } + + private static Collection getList(int maxModules) { + List availableModuleIds = new ArrayList(); + for (int i = 0; i < maxModules; i++) { + availableModuleIds.add(i); + } + return availableModuleIds; + } + + private static Collection getList(int[] array) { + List availableModuleIds = new ArrayList(array.length); + for (int i : array) { + availableModuleIds.add(i); + } + return availableModuleIds; + } + + /** + * @return a module id that was allocated, or {@code null} if nothing was available + */ + public synchronized Integer allocateModule() { + if (availableModuleIds_.isEmpty()) { + throw new OutOfResourceException("No more resources of the requested type: " + name_); + } + Integer moduleId = availableModuleIds_.iterator().next(); + availableModuleIds_.remove(moduleId); + allocatedModuleIds_.add(moduleId); + return moduleId; + } + + /** + * @param moduleId the moduleId to be released; throws {@link IllegalArgumentException} if + * a moduleId is re-returned, or an invalid moduleId is provided + */ + public synchronized void releaseModule(int moduleId) { + if (!allocatedModuleIds_.contains(moduleId)) { + throw new IllegalArgumentException("moduleId: " + moduleId+ "; not yet allocated"); + } + availableModuleIds_.add(moduleId); + allocatedModuleIds_.remove(moduleId); + } +} diff --git a/IOIOLib/src/ioio/lib/impl/PinFunctionMap.java b/IOIOLib/src/ioio/lib/impl/PinFunctionMap.java new file mode 100644 index 0000000..3bf8cce --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/PinFunctionMap.java @@ -0,0 +1,76 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + + +public class PinFunctionMap { + private static final boolean[] PERIPHERAL_OUT = new boolean[] { true, + false, false, true, true, true, true, true, false, false, true, + true, true, true, true, false, false, false, false, false, false, + false, false, false, false, false, false, true, true, true, true, + true, true, false, true, true, true, true, true, true, true, false, + false, false, false, true, true, true, true }; + + private static final boolean[] PERIPHERAL_IN = new boolean[] { true, + false, false, true, true, true, true, true, false, true, true, + true, true, true, true, false, false, false, false, false, false, + false, false, false, false, false, false, true, true, true, true, + true, true, false, true, true, true, true, true, true, true, false, + false, false, false, true, true, true, true }; + + static void checkSupportsAnalogInput(int pin) { + checkValidPin(pin); + if (pin < 31 || pin > 46) { + throw new IllegalArgumentException("Pin " + pin + + " does not support analog input"); + } + } + + static void checkSupportsPeripheralInput(int pin) { + checkValidPin(pin); + if (!PERIPHERAL_IN[pin]) { + throw new IllegalArgumentException("Pin " + pin + + " does not support peripheral input"); + } + } + + static void checkSupportsPeripheralOutput(int pin) { + checkValidPin(pin); + if (!PERIPHERAL_OUT[pin]) { + throw new IllegalArgumentException("Pin " + pin + + " does not support peripheral output"); + } + } + + static void checkValidPin(int pin) { + if (pin < 0 || pin > 48) { + throw new IllegalArgumentException("Illegal pin: " + pin); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/PwmImpl.java b/IOIOLib/src/ioio/lib/impl/PwmImpl.java new file mode 100644 index 0000000..ce0d440 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/PwmImpl.java @@ -0,0 +1,101 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.PwmOutput; +import ioio.lib.api.exception.ConnectionLostException; + +import java.io.IOException; + +public class PwmImpl extends AbstractResource implements PwmOutput { + private final int pwmNum_; + private final int pinNum_; + private final float baseUs_; + private final int period_; + + public PwmImpl(IOIOImpl ioio, int pinNum, int pwmNum, int period, + float baseUs) throws ConnectionLostException { + super(ioio); + pwmNum_ = pwmNum; + pinNum_ = pinNum; + baseUs_ = baseUs; + period_ = period; + } + + @Override + public synchronized void close() { + super.close(); + ioio_.closePwm(pwmNum_); + ioio_.closePin(pinNum_); + } + + @Override + public void setDutyCycle(float dutyCycle) throws ConnectionLostException { + assert (dutyCycle <= 1 && dutyCycle >= 0); + setPulseWidthInClocks(period_ * dutyCycle); + } + + @Override + public void setPulseWidth(int pulseWidthUs) throws ConnectionLostException { + setPulseWidth((float) pulseWidthUs); + } + + @Override + public void setPulseWidth(float pulseWidthUs) + throws ConnectionLostException { + assert (pulseWidthUs >= 0); + float p = pulseWidthUs / baseUs_; + setPulseWidthInClocks(p); + } + + synchronized private void setPulseWidthInClocks(float p) + throws ConnectionLostException { + checkState(); + if (p > period_) { + p = period_; + } + int pw; + int fraction; + p -= 1; // period parameter is one less than the actual period length + // yes, there is 0 and then 2 (no 1) - this is not a bug, that + // is how the hardware PWM module works. + if (p < 1) { + pw = 0; + fraction = 0; + } else { + pw = (int) p; + fraction = ((int) p * 4) & 0x03; + } + try { + ioio_.protocol_.setPwmDutyCycle(pwmNum_, pw, fraction); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/QueueInputStream.java b/IOIOLib/src/ioio/lib/impl/QueueInputStream.java new file mode 100644 index 0000000..42ce41a --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/QueueInputStream.java @@ -0,0 +1,79 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; + +import android.util.Log; + +public class QueueInputStream extends InputStream { + private final Queue queue_ = new ArrayBlockingQueue( + Constants.BUFFER_SIZE); + private boolean closed_ = false; + + @Override + synchronized public int read() throws IOException { + try { + while (!closed_ && queue_.isEmpty()) { + wait(); + } + if (closed_) { + throw new IOException("Stream has been closed"); + } + return ((int) queue_.remove()) & 0xFF; + } catch (InterruptedException e) { + throw new IOException("Interrupted"); + } + } + + synchronized public void write(byte[] data, int size) { + for (int i = 0; i < size; ++i) { + if (queue_.size() == Constants.BUFFER_SIZE) { + Log.e("QueueInputStream", "Buffer overflow, discarding data"); + break; + } + queue_.add(data[i]); + } + notifyAll(); + } + + @Override + synchronized public int available() throws IOException { + return queue_.size(); + } + + @Override + synchronized public void close() { + closed_ = true; + } + +} diff --git a/IOIOLib/src/ioio/lib/impl/SocketIOIOConnection.java b/IOIOLib/src/ioio/lib/impl/SocketIOIOConnection.java new file mode 100644 index 0000000..d712b27 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/SocketIOIOConnection.java @@ -0,0 +1,140 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.IOIOConnection; +import ioio.lib.api.exception.ConnectionLostException; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketException; + +import android.util.Log; + +public class SocketIOIOConnection implements IOIOConnection { + private final int port_; + private ServerSocket server_ = null; + private Socket socket_ = null; + private boolean disconnect_ = false; + private boolean server_owned_by_connect_ = true; + private boolean socket_owned_by_connect_ = true; + + public SocketIOIOConnection(Integer port) { + port_ = port; + } + + @Override + public void waitForConnect() throws ConnectionLostException { + try { + synchronized (this) { + if (disconnect_) { + throw new ConnectionLostException(); + } + Log.d("SocketIOIOConnection", "Creating server socket"); + server_ = new ServerSocket(port_); + server_owned_by_connect_ = false; + } + Log.d("SocketIOIOConnection", "Waiting for TCP connection"); + socket_ = server_.accept(); + Log.d("SocketIOIOConnection", "TCP connected"); + synchronized (this) { + if (disconnect_) { + socket_.close(); + throw new ConnectionLostException(); + } + socket_owned_by_connect_ = false; + } + } catch (IOException e) { + synchronized (this) { + disconnect_ = true; + if (server_owned_by_connect_ && server_ != null) { + try { + server_.close(); + } catch (IOException e1) { + Log.e("SocketIOIOConnection", "Unexpected exception", e1); + } + } + if (socket_owned_by_connect_ && socket_ != null) { + try { + socket_.close(); + } catch (IOException e1) { + Log.e("SocketIOIOConnection", "Unexpected exception", e1); + } + } + if (e instanceof SocketException && e.getMessage().equals("Permission denied")) { + Log.e("SocketIOIOConnection", "Did you forget to declare uses-permission of android.permission.INTERNET?"); + } + throw new ConnectionLostException(e); + } + } + } + + @Override + synchronized public void disconnect() { + if (disconnect_) { + return; + } + Log.d("SocketIOIOConnection", "Client initiated disconnect"); + disconnect_ = true; + if (!server_owned_by_connect_) { + try { + server_.close(); + } catch (IOException e1) { + Log.e("SocketIOIOConnection", "Unexpected exception", e1); + } + } + if (!socket_owned_by_connect_) { + try { + socket_.shutdownOutput(); + } catch (IOException e1) { + } + } + } + + @Override + public InputStream getInputStream() throws ConnectionLostException { + try { + return socket_.getInputStream(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } + + @Override + public OutputStream getOutputStream() throws ConnectionLostException { + try { + return socket_.getOutputStream(); + } catch (IOException e) { + throw new ConnectionLostException(e); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/SpiMasterImpl.java b/IOIOLib/src/ioio/lib/impl/SpiMasterImpl.java new file mode 100644 index 0000000..bdd88ef --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/SpiMasterImpl.java @@ -0,0 +1,198 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.SpiMaster; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.FlowControlledPacketSender.Packet; +import ioio.lib.impl.FlowControlledPacketSender.Sender; +import ioio.lib.impl.IncomingState.DataModuleListener; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +import android.util.Log; + +public class SpiMasterImpl extends AbstractResource implements SpiMaster, + DataModuleListener, Sender { + public class SpiResult implements Result { + boolean ready_; + final byte[] data_; + + SpiResult(byte[] data) { + data_ = data; + } + + @Override + public synchronized void waitReady() throws ConnectionLostException, + InterruptedException { + while (!ready_ && state_ != State.DISCONNECTED) { + wait(); + } + checkState(); + } + } + + class OutgoingPacket implements Packet { + int writeSize_; + byte[] writeData_; + int ssPin_; + int readSize_; + int totalSize_; + + @Override + public int getSize() { + return writeSize_ + 4; + } + } + + private final Queue pendingRequests_ = new ConcurrentLinkedQueue(); + private final FlowControlledPacketSender outgoing_ = new FlowControlledPacketSender( + this); + + private final int spiNum_; + private final Map ssPinToIndex_; + private final int[] indexToSsPin_; + private final int mosiPinNum_; + private final int misoPinNum_; + private final int clkPinNum_; + + SpiMasterImpl(IOIOImpl ioio, int spiNum, int mosiPinNum, int misoPinNum, + int clkPinNum, int[] ssPins) throws ConnectionLostException { + super(ioio); + spiNum_ = spiNum; + mosiPinNum_ = mosiPinNum; + misoPinNum_ = misoPinNum; + clkPinNum_ = clkPinNum; + indexToSsPin_ = ssPins.clone(); + ssPinToIndex_ = new HashMap(ssPins.length); + for (int i = 0; i < ssPins.length; ++i) { + ssPinToIndex_.put(ssPins[i], i); + } + } + + @Override + synchronized public void disconnected() { + super.disconnected(); + outgoing_.kill(); + for (SpiResult tr : pendingRequests_) { + synchronized (tr) { + tr.notify(); + } + } + } + + @Override + public void writeRead(int slave, byte[] writeData, int writeSize, + int totalSize, byte[] readData, int readSize) + throws ConnectionLostException, InterruptedException { + Result result = writeReadAsync(slave, writeData, writeSize, + totalSize, readData, readSize); + result.waitReady(); + } + + @Override + public SpiResult writeReadAsync(int slave, byte[] writeData, + int writeSize, int totalSize, byte[] readData, int readSize) + throws ConnectionLostException { + checkState(); + SpiResult result = new SpiResult(readData); + + OutgoingPacket p = new OutgoingPacket(); + p.writeSize_ = writeSize; + p.writeData_ = writeData; + p.readSize_ = readSize; + p.ssPin_ = indexToSsPin_[slave]; + p.totalSize_ = totalSize; + + if (p.readSize_ > 0) { + synchronized (this) { + pendingRequests_.add(result); + } + } else { + result.ready_ = true; + } + try { + outgoing_.write(p); + } catch (IOException e) { + Log.e("SpiMasterImpl", "Exception caught", e); + } + return result; + } + + @Override + public void writeRead(byte[] writeData, int writeSize, int totalSize, + byte[] readData, int readSize) throws ConnectionLostException, + InterruptedException { + writeRead(0, writeData, writeSize, totalSize, readData, readSize); + } + + @Override + public void dataReceived(byte[] data, int size) { + SpiResult result = pendingRequests_.remove(); + synchronized (result) { + result.ready_ = true; + System.arraycopy(data, 0, result.data_, 0, size); + result.notify(); + } + } + + @Override + public void reportAdditionalBuffer(int bytesRemaining) { + outgoing_.readyToSend(bytesRemaining); + } + + @Override + synchronized public void close() { + super.close(); + outgoing_.close(); + ioio_.closeSpi(spiNum_); + ioio_.closePin(mosiPinNum_); + ioio_.closePin(misoPinNum_); + ioio_.closePin(clkPinNum_); + for (int pin : indexToSsPin_) { + ioio_.closePin(pin); + } + } + + @Override + public void send(Packet packet) { + OutgoingPacket p = (OutgoingPacket) packet; + try { + ioio_.protocol_.spiMasterRequest(spiNum_, p.ssPin_, p.writeData_, + p.writeSize_, p.totalSize_, p.readSize_); + } catch (IOException e) { + Log.e("SpiImpl", "Caught exception", e); + } + } + +} diff --git a/IOIOLib/src/ioio/lib/impl/TwiMasterImpl.java b/IOIOLib/src/ioio/lib/impl/TwiMasterImpl.java new file mode 100644 index 0000000..bfe2023 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/TwiMasterImpl.java @@ -0,0 +1,169 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.TwiMaster; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.FlowControlledPacketSender.Packet; +import ioio.lib.impl.FlowControlledPacketSender.Sender; +import ioio.lib.impl.IncomingState.DataModuleListener; + +import java.io.IOException; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; + +import android.util.Log; + +public class TwiMasterImpl extends AbstractResource implements TwiMaster, + DataModuleListener, Sender { + class TwiResult implements Result { + boolean ready_ = false; + boolean success_; + final byte[] data_; + + public TwiResult(byte[] data) { + data_ = data; + } + + @Override + public synchronized boolean waitReady() throws ConnectionLostException, + InterruptedException { + while (!ready_ && state_ != State.DISCONNECTED) { + wait(); + } + checkState(); + return success_; + } + } + + class OutgoingPacket implements Packet { + int writeSize_; + byte[] writeData_; + boolean tenBitAddr_; + int addr_; + int readSize_; + + @Override + public int getSize() { + return writeSize_ + 4; + } + + } + + private final Queue pendingRequests_ = new ConcurrentLinkedQueue(); + private final FlowControlledPacketSender outgoing_ = new FlowControlledPacketSender( + this); + private final int twiNum_; + + TwiMasterImpl(IOIOImpl ioio, int twiNum) throws ConnectionLostException { + super(ioio); + twiNum_ = twiNum; + } + + @Override + synchronized public void disconnected() { + super.disconnected(); + outgoing_.kill(); + for (TwiResult tr : pendingRequests_) { + synchronized (tr) { + tr.notify(); + } + } + } + + @Override + public boolean writeRead(int address, boolean tenBitAddr, byte[] writeData, + int writeSize, byte[] readData, int readSize) + throws ConnectionLostException, InterruptedException { + Result result = writeReadAsync(address, tenBitAddr, writeData, + writeSize, readData, readSize); + return result.waitReady(); + } + + @Override + public Result writeReadAsync(int address, boolean tenBitAddr, + byte[] writeData, int writeSize, byte[] readData, int readSize) + throws ConnectionLostException { + checkState(); + TwiResult result = new TwiResult(readData); + + OutgoingPacket p = new OutgoingPacket(); + p.writeSize_ = writeSize; + p.writeData_ = writeData; + p.tenBitAddr_ = tenBitAddr; + p.readSize_ = readSize; + p.addr_ = address; + + synchronized (this) { + pendingRequests_.add(result); + try { + outgoing_.write(p); + } catch (IOException e) { + Log.e("SpiMasterImpl", "Exception caught", e); + } + } + return result; + } + + @Override + public void dataReceived(byte[] data, int size) { + TwiResult result = pendingRequests_.remove(); + synchronized (result) { + result.ready_ = true; + result.success_ = (size != 0xFF); + if (result.success_) { + System.arraycopy(data, 0, result.data_, 0, size); + } + result.notify(); + } + } + + @Override + public void reportAdditionalBuffer(int bytesRemaining) { + outgoing_.readyToSend(bytesRemaining); + } + + @Override + synchronized public void close() { + super.close(); + outgoing_.close(); + ioio_.closeTwi(twiNum_); + } + + @Override + public void send(Packet packet) { + OutgoingPacket p = (OutgoingPacket) packet; + try { + ioio_.protocol_.i2cWriteRead(twiNum_, p.tenBitAddr_, p.addr_, + p.writeSize_, p.readSize_, p.writeData_); + } catch (IOException e) { + Log.e("TwiImpl", "Caught exception", e); + } + } +} diff --git a/IOIOLib/src/ioio/lib/impl/UartImpl.java b/IOIOLib/src/ioio/lib/impl/UartImpl.java new file mode 100644 index 0000000..4cd7a28 --- /dev/null +++ b/IOIOLib/src/ioio/lib/impl/UartImpl.java @@ -0,0 +1,107 @@ +/* + * Copyright 2011 Ytai Ben-Tsvi. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ARSHAN POURSOHI OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied. + */ +package ioio.lib.impl; + +import ioio.lib.api.IOIO; +import ioio.lib.api.Uart; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.impl.FlowControlledOutputStream.Sender; +import ioio.lib.impl.IncomingState.DataModuleListener; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import android.util.Log; + +public class UartImpl extends AbstractResource implements DataModuleListener, Sender, Uart { + private static final int MAX_PACKET = 64; + + private final int uartNum_; + private final int rxPinNum_; + private final int txPinNum_; + private final FlowControlledOutputStream outgoing_ = new FlowControlledOutputStream(this, MAX_PACKET); + private final QueueInputStream incoming_ = new QueueInputStream(); + + public UartImpl(IOIOImpl ioio, int txPin, int rxPin, int uartNum) throws ConnectionLostException { + super(ioio); + uartNum_ = uartNum; + rxPinNum_ = rxPin; + txPinNum_ = txPin; + } + + @Override + public void dataReceived(byte[] data, int size) { + incoming_.write(data, size); + } + + @Override + public void send(byte[] data, int size) { + try { + ioio_.protocol_.uartData(uartNum_, size, data); + } catch (IOException e) { + Log.e("UartImpl", e.getMessage()); + } + } + + @Override + synchronized public void close() { + super.close(); + incoming_.close(); + outgoing_.close(); + ioio_.closeUart(uartNum_); + if (rxPinNum_ != IOIO.INVALID_PIN) { + ioio_.closePin(rxPinNum_); + } + if (txPinNum_ != IOIO.INVALID_PIN) { + ioio_.closePin(txPinNum_); + } + } + + @Override + synchronized public void disconnected() { + super.disconnected(); + outgoing_.kill(); + } + + @Override + public InputStream getInputStream() { + return incoming_; + } + + @Override + public OutputStream getOutputStream() { + return outgoing_; + } + + @Override + public void reportAdditionalBuffer(int bytesRemaining) { + outgoing_.readyToSend(bytesRemaining); + } +} diff --git a/IOIOLib/src/ioio/lib/util/AbstractIOIOActivity.java b/IOIOLib/src/ioio/lib/util/AbstractIOIOActivity.java new file mode 100644 index 0000000..e2e4c1b --- /dev/null +++ b/IOIOLib/src/ioio/lib/util/AbstractIOIOActivity.java @@ -0,0 +1,295 @@ +package ioio.lib.util; + +import ioio.lib.api.IOIO; +import ioio.lib.api.IOIOFactory; +import ioio.lib.api.exception.ConnectionLostException; +import ioio.lib.api.exception.IncompatibilityException; +import ioio.lib.util.IOIOConnectionDiscovery.IOIOConnectionSpec; + +import java.util.Collection; +import java.util.LinkedList; + +import android.app.Activity; +import android.os.Looper; +import android.util.Log; + +/** + * A convenience class for easy creation of IOIO-based applications. + * + * It is used by creating a concrete Activity in your application, which extends + * this class. This class then takes care of proper creation and abortion of the + * IOIO connection and of a dedicated thread for IOIO communication. + * + * In the basic usage the client should extend this class and implement + * {@link #createIOIOThread()}, which should return an implementation of the + * {@link IOIOThread} abstract class. In this implementation, the client + * implements the {@link IOIOThread#setup()} method, which gets called as soon + * as communication with the IOIO is established, and the {@link IOIOThread + * #loop()} method, which gets called repetitively as long as the IOIO is + * connected. Both methods should access the {@link IOIOThread#ioio_} field for + * controlling the IOIO. + * + * In addition, the {@link IOIOThread#disconnected()} method may be overridden + * in order to execute logic as soon as a disconnection occurs for whichever + * reason. The {@link IOIOThread#incompatible()} method may be overridden in + * order to take action in case where a IOIO whose firmware is incompatible with + * the IOIOLib version that application is built with. + * + * In a more advanced use case, more than one IOIO is available. In this case, a + * thread will be created for each IOIO, whose semantics are as defined above. + * If the client needs to be able to distinguish between them, it is possible to + * override {@link #createIOIOThread(String, Object[])} instead of + * {@link #createIOIOThread()}. The first argument provided will contain the + * connection class name, such as ioio.lib.impl.SocketIOIOConnection for a + * connection established over a TCP socket (which is used over ADB). The second + * argument will contain information specific to the connection type. For + * example, in the case of SocketIOIOConnection, the array will contain an + * {@link Integer} representing the local port number. + * + */ +public abstract class AbstractIOIOActivity extends Activity { + private static final String TAG = "AbstractIOIOActivity"; + private IOIOConnectionSpec currentSpec_; + private Collection threads_ = new LinkedList(); + + /** + * Subclasses should call this method from their own onResume() if + * overloaded. It takes care of connecting with the IOIO. + */ + @Override + protected void onResume() { + super.onResume(); + createAllThreads(); + startAllThreads(); + } + + /** + * Subclasses should call this method from their own onPause() if + * overloaded. It takes care of disconnecting from the IOIO. + */ + @Override + protected void onPause() { + super.onPause(); + abortAllThreads(); + try { + joinAllThreads(); + } catch (InterruptedException e) { + } + } + + /** + * Subclasses should implement this method by returning a concrete subclass + * of {@link IOIOThread}. null may be returned if the client + * is not interested to connect a thread for this IOIO. In multi-IOIO + * scenarios, where you want to identify which IOIO the thread is for, + * consider using {@link #createIOIOThread()} instead. + * + * @return An implementation of {@link IOIOThread}, or null to + * skip. + */ + protected IOIOThread createIOIOThread() { + return null; + } + + /** + * Subclasses should implement this method by returning a concrete subclass + * of {@link IOIOThread}. This overload is useful in multi-IOIO scenarios, + * where you want to identify which IOIO the thread is for. The provided + * arguments should provide enough information to be unique per connection. + * null may be returned if the client is not interested to + * connect a thread for this IOIO. This can be used in order to filter out + * unwanted connections, for example if the application is only intended for + * wireless connection, any wired connection attempts may be rejected, thus + * saving resources used for listening for incoming wired connections. + * + * @param connectionClass + * The fully-qualified name of the connection class used to + * connect to the IOIO. + * @param connectionArgs + * A list of arguments passed to the constructor of the + * connection class. Should provide information that enables + * distinguishing between different IOIO instances using the same + * connection class. + * + * @return An implementation of {@link IOIOThread}, or null to + * skip. + */ + protected IOIOThread createIOIOThread(String connectionClass, + Object[] connectionArgs) { + return createIOIOThread(); + } + + /** + * An abstract class, which facilitates a thread dedicated for communication + * with a single physical IOIO device. + */ + protected abstract class IOIOThread extends Thread { + /** Subclasses should use this field for controlling the IOIO. */ + protected IOIO ioio_; + private boolean abort_ = false; + private boolean connected_ = true; + private final IOIOConnectionSpec spec_ = currentSpec_; + + /** + * Subclasses should override this method for performing operations to + * be done once as soon as IOIO communication is established. Typically, + * this will include opening pins and modules using the openXXX() + * methods of the {@link #ioio_} field. + */ + protected void setup() throws ConnectionLostException, + InterruptedException { + } + + /** + * Subclasses should override this method for performing operations to + * be done repetitively as long as IOIO communication persists. + * Typically, this will be the main logic of the application, processing + * inputs and producing outputs. + */ + protected void loop() throws ConnectionLostException, + InterruptedException { + sleep(100000); + } + + /** + * Subclasses should override this method for performing operations to + * be done once as soon as IOIO communication is lost or closed. + * Typically, this will include GUI changes corresponding to the change. + * This method will only be called if setup() has been called. The + * {@link #ioio_} member must not be used from within this method. + */ + protected void disconnected() throws InterruptedException { + } + + /** + * Subclasses should override this method for performing operations to + * be done if an incompatible IOIO firmware is detected. The + * {@link #ioio_} member must not be used from within this method. This + * method will only be called once, until a compatible IOIO is connected + * (i.e. {@link #setup()} gets called). + */ + protected void incompatible() { + } + + /** Not relevant to subclasses. */ + @Override + public final void run() { + super.run(); + Looper.prepare(); + while (true) { + try { + synchronized (this) { + if (abort_) { + break; + } + ioio_ = IOIOFactory.create(spec_.className, spec_.args); + } + ioio_.waitForConnect(); + connected_ = true; + setup(); + while (!abort_) { + loop(); + } + ioio_.disconnect(); + } catch (ConnectionLostException e) { + if (abort_) { + break; + } + } catch (InterruptedException e) { + ioio_.disconnect(); + break; + } catch (IncompatibilityException e) { + Log.e(TAG, "Incompatible IOIO firmware", e); + incompatible(); + // nothing to do - just wait until physical disconnection + try { + ioio_.waitForDisconnect(); + } catch (InterruptedException e1) { + ioio_.disconnect(); + } + } catch (Exception e) { + Log.e(TAG, "Unexpected exception caught", e); + ioio_.disconnect(); + break; + } finally { + try { + if (ioio_ != null) { + ioio_.waitForDisconnect(); + if (connected_) { + disconnected(); + } + } + } catch (InterruptedException e) { + } + } + } + } + + /** Not relevant to subclasses. */ + public synchronized final void abort() { + abort_ = true; + if (ioio_ != null) { + ioio_.disconnect(); + } + if (connected_) { + interrupt(); + } + } + } + + private void abortAllThreads() { + for (IOIOThread thread : threads_) { + thread.abort(); + } + } + + private void joinAllThreads() throws InterruptedException { + for (IOIOThread thread : threads_) { + thread.join(); + } + } + + private void createAllThreads() { + threads_.clear(); + Collection specs = getConnectionSpecs(); + for (IOIOConnectionSpec spec : specs) { + currentSpec_ = spec; + IOIOThread thread = createIOIOThread(spec.className, spec.args); + if (thread != null) { + threads_.add(thread); + } + } + } + + private void startAllThreads() { + for (IOIOThread thread : threads_) { + thread.start(); + } + } + + private Collection getConnectionSpecs() { + Collection result = new LinkedList(); + addConnectionSpecs("ioio.lib.util.SocketIOIOConnectionDiscovery", + result); + addConnectionSpecs( + "ioio.lib.bluetooth.BluetoothIOIOConnectionDiscovery", result); + return result; + } + + private void addConnectionSpecs(String discoveryClassName, + Collection result) { + try { + Class cls = Class.forName(discoveryClassName); + IOIOConnectionDiscovery discovery = (IOIOConnectionDiscovery) cls + .newInstance(); + discovery.getSpecs(result); + } catch (ClassNotFoundException e) { + Log.d(TAG, "Discovery class not found: " + discoveryClassName + + ". Not adding."); + } catch (Exception e) { + Log.w(TAG, + "Exception caught while discovering connections - not adding connections of class " + + discoveryClassName, e); + } + } +} diff --git a/IOIOLib/src/ioio/lib/util/IOIOConnectionDiscovery.java b/IOIOLib/src/ioio/lib/util/IOIOConnectionDiscovery.java new file mode 100644 index 0000000..3802fb4 --- /dev/null +++ b/IOIOLib/src/ioio/lib/util/IOIOConnectionDiscovery.java @@ -0,0 +1,17 @@ +package ioio.lib.util; + +import java.util.Collection; + +public interface IOIOConnectionDiscovery { + public static class IOIOConnectionSpec { + public final String className; + public final Object[] args; + + public IOIOConnectionSpec(String c, Object[] a) { + className = c; + args = a; + } + } + + public void getSpecs(Collection result); +} diff --git a/IOIOLib/src/ioio/lib/util/SocketIOIOConnectionDiscovery.java b/IOIOLib/src/ioio/lib/util/SocketIOIOConnectionDiscovery.java new file mode 100644 index 0000000..88f76ee --- /dev/null +++ b/IOIOLib/src/ioio/lib/util/SocketIOIOConnectionDiscovery.java @@ -0,0 +1,15 @@ +package ioio.lib.util; + +import ioio.lib.api.IOIOFactory; +import ioio.lib.impl.SocketIOIOConnection; + +import java.util.Collection; + +public class SocketIOIOConnectionDiscovery implements IOIOConnectionDiscovery { + + @Override + public void getSpecs(Collection result) { + result.add(new IOIOConnectionSpec(SocketIOIOConnection.class.getName(), + new Object[] { new Integer(IOIOFactory.IOIO_PORT) })); + } +} diff --git a/PitsideConsole/.gitignore b/PitsideConsole/.gitignore new file mode 100644 index 0000000..e6cc726 --- /dev/null +++ b/PitsideConsole/.gitignore @@ -0,0 +1,3 @@ +Debug +Release +ipch \ No newline at end of file diff --git a/PitsideConsole/.settings/.jsdtscope b/PitsideConsole/.settings/.jsdtscope new file mode 100644 index 0000000..dfa4f4a --- /dev/null +++ b/PitsideConsole/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.container b/PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..49c8cd4 --- /dev/null +++ b/PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.JRE_CONTAINER \ No newline at end of file diff --git a/PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.name b/PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..11006e2 --- /dev/null +++ b/PitsideConsole/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Global \ No newline at end of file diff --git a/PitsideConsole/ArtLib/.gitignore b/PitsideConsole/ArtLib/.gitignore new file mode 100644 index 0000000..043d84f --- /dev/null +++ b/PitsideConsole/ArtLib/.gitignore @@ -0,0 +1,2 @@ +Debug +Release \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtHTTPServer.cpp b/PitsideConsole/ArtLib/ArtHTTPServer.cpp new file mode 100644 index 0000000..fde75b6 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtHTTPServer.cpp @@ -0,0 +1,259 @@ +#include "stdafx.h" +#include "ArtHTTPServer.h" +#include "ArtTools.h" + +bool ParseRequest(const char* pRequest, int cbRequest, HTTPREQUEST* pParsed) +{ + char szURL[200]; + char szRequestType[200]; + szURL[0] = szRequestType[0] = 0; + + int ixStart = 0; + int ixPos = ixStart; + while(ixPos < cbRequest && ixPos < sizeof(szRequestType)) + { + if(pRequest[ixPos] == ' ') // found the end of the request type + { + strncpy(szRequestType,&pRequest[ixStart],ixPos-ixStart); + szRequestType[ixPos-ixStart] = '\0'; + break; + } + + ixPos++; + } + + // we have the request type, let's get the URL + ixStart = ixPos+1; + ixPos = ixStart; + while(ixPos < cbRequest && (ixPos-ixStart) < sizeof(szURL)) + { + if(pRequest[ixPos] == ' ' || pRequest[ixPos] == '?') + { + strncpy(szURL,&pRequest[ixStart],ixPos-ixStart); + szURL[ixPos-ixStart] = 0; + break; + } + ixPos++; + } + + if(pRequest[ixPos] == '?') + { + // this thing has a parameter list! + const char* pszEnd = strstr(&pRequest[ixPos]," "); + if(pszEnd) + { + ixPos++; + const char* pszStart = &pRequest[ixPos]; + while(pszStart < pszEnd) + { + const char* pszEquals = strstr(pszStart,"="); + if(pszEquals && pszEquals < pszEnd) + { + const char* pszAmper = strstr(pszStart,"&"); + if(!pszAmper || pszAmper > pszEnd) pszAmper = pszEnd; + if(pszAmper && pszAmper <= pszEnd) + { + // now we've got the key and the value positions + const int cchMaxValue = 10000; + char szKey[cchMaxValue]; + char szValue[cchMaxValue]; + if(pszAmper - pszEquals >= cchMaxValue || pszEquals - pszStart > cchMaxValue) + { + return false; // key or value is too big! + } + else + { + const int cchKey = pszEquals-pszStart; + const int cchValue = pszAmper-pszEquals-1; + strncpy(szKey,pszStart,cchKey); + strncpy(szValue,pszEquals+1,cchValue); + szKey[cchKey] = 0; + szValue[cchValue] = 0; + pParsed->mapParams[szKey] = szValue; + + pszStart = pszAmper+1; + } + } + else + { + // couldn't find an ampersand, or its past the end + break; + } + } + else + { + // couldn't find an equals, or its past the end + break; + } + } + } + else + { + return false; + } + } + + pParsed->strPage = string(szURL); + pParsed->strType = string(szRequestType); + return szURL[0] && szRequestType[0]; +} + +DWORD ThreadProcStub(LPVOID pvParam); + +int c = 0; + +SimpleHTTPServer::SimpleHTTPServer() : m_iPort(0), m_pResponder(NULL),m_hInitEvent(NULL),m_fInitSuccess(false) +{ +} +SimpleHTTPServer::~SimpleHTTPServer() +{ + WaitForSingleObject(m_hThread,INFINITE); +}; + +bool SimpleHTTPServer::Init(int iPort, ArtHTTPResponder* pResponder) +{ + m_iPort = iPort; + m_pResponder = pResponder; + + m_fInitSuccess = false; + WaitForSingleObject(m_hThread,INFINITE); + + if(m_hInitEvent != NULL) + { + CloseHandle(m_hInitEvent); + m_hInitEvent = NULL; + } + m_hInitEvent = CreateEvent(NULL,FALSE,FALSE,NULL); + + m_hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcStub,(LPVOID)this,0,&m_dwId); + DWORD dwRet = WaitForSingleObject(m_hInitEvent,INFINITE); + + DASSERT(dwRet == WAIT_OBJECT_0); + return m_fInitSuccess; +} + +void SimpleHTTPServer::ThreadProc() +{ + WSADATA wsaData; + SOCKET aSocket = NULL; + WORD wVersionRequested = MAKEWORD(2, 2); + int err = WSAStartup(wVersionRequested, &wsaData); + if(err == 0) + { + aSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + + if(aSocket != INVALID_SOCKET) + { + SOCKADDR_IN ReceiverAddr; + // The IPv4 family + ReceiverAddr.sin_family = AF_INET; + // Port no. 5150 + ReceiverAddr.sin_port = htons(m_iPort); + // From all interface (0.0.0.0) + ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY); + err = bind(aSocket, (SOCKADDR*)&ReceiverAddr, sizeof(ReceiverAddr)); + + m_fInitSuccess = (err == 0); + SetEvent(m_hInitEvent); + + while(m_fInitSuccess) + { + c++; + SOCKET sDataSocket = NULL; + + if(err == 0) + { + // socket is ready to listen + err = listen(aSocket, SOMAXCONN); + if(err == SOCKET_ERROR) + { + closesocket(aSocket); + aSocket = INVALID_SOCKET; + } + else + { + sockaddr sfAddr = {0}; + int cbAddr = sizeof(sfAddr); + sDataSocket = accept(aSocket, &sfAddr, &cbAddr); + } + } + + bool fConnectionLost = false; + while(!fConnectionLost && m_fInitSuccess) + { + char buf[1024]; + int cbRead = TimeoutRead(sDataSocket,buf,sizeof(buf)-1,0,10000, &fConnectionLost); + + buf[cbRead] = '\0'; + cout<MakePage(aData,ss); + + ssHeader<<"HTTP/1.0 200 OK"<ThreadProc(); + return 0; +} diff --git a/PitsideConsole/ArtLib/ArtHTTPServer.h b/PitsideConsole/ArtLib/ArtHTTPServer.h new file mode 100644 index 0000000..4e03317 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtHTTPServer.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include +#include +#include "ArtNet.h" +#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ +#include + +using namespace std; + +struct HTTPREQUEST +{ + string strType; + string strPage; + string strResponseType; + map mapParams; +}; + +// interface: if you want to handle HTTP requests, then implement this and pass yourself to a SimpleHTTPServer +class ArtHTTPResponder +{ +public: + virtual bool MakePage(HTTPREQUEST& strURL, ostream& out) = 0; +}; + +bool ParseRequest(const char* pRequest, int cbRequest, HTTPREQUEST* pParsed); +class SimpleHTTPServer +{ +public: + SimpleHTTPServer(); + virtual ~SimpleHTTPServer(); + + bool Init(int iPort, ArtHTTPResponder* pResponder); + + void ThreadProc(); + +private: + HANDLE m_hThread; + int m_iPort; + DWORD m_dwId; + ArtHTTPResponder* m_pResponder; + + HANDLE m_hInitEvent; + bool m_fInitSuccess; +}; diff --git a/PitsideConsole/ArtLib/ArtLib.vcxproj b/PitsideConsole/ArtLib/ArtLib.vcxproj new file mode 100644 index 0000000..15f1d43 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtLib.vcxproj @@ -0,0 +1,123 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B} + Win32Proj + ArtLib + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + $(IncludePath) + + + $(LibraryPath) + + + $(IncludePath) + $(LibraryPath) + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + + + Windows + true + + + + + + + + + Level3 + NotUsing + MaxSpeed + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + %(AdditionalDependencies); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtLib.vcxproj.filters b/PitsideConsole/ArtLib/ArtLib.vcxproj.filters new file mode 100644 index 0000000..b934033 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtLib.vcxproj.filters @@ -0,0 +1,102 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {8452bf93-da57-4b5a-8b0c-e44af838a199} + + + {bf79ed1a-6644-4f6c-b2fd-4db62c314a95} + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files\ArtSQL + + + Header Files\ArtSQL + + + Header Files\ArtSQL + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files\ArtSQL + + + Source Files\ArtSQL + + + Source Files\ArtSQL + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtLib.vcxproj.user b/PitsideConsole/ArtLib/ArtLib.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtLib.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtNet.cpp b/PitsideConsole/ArtLib/ArtNet.cpp new file mode 100644 index 0000000..b83a57b --- /dev/null +++ b/PitsideConsole/ArtLib/ArtNet.cpp @@ -0,0 +1,43 @@ +#include "stdafx.h" +#include "ArtNet.h" +#include + +int TimeoutRead(SOCKET s, char* buf, int cbBuf, int flags, int timeout, bool* pfConnectionLost) +{ + *pfConnectionLost = false; + + DWORD tmNow = timeGetTime(); + while(true) + { + unsigned long cbWaiting = 0; + int iRet = ioctlsocket(s, FIONREAD, &cbWaiting); + if(iRet == 0) + { + if(cbWaiting > 0) + { + return recv(s, buf, cbBuf, flags); + } + else + { + if(timeGetTime() - tmNow > (UINT)timeout) + { + // timed out + *pfConnectionLost = true; + break; + } + else + { + // not timed-out yet + Sleep(10); + } + } + } + else + { + // network failure + *pfConnectionLost = true; + break; + } + } + return 0; +} \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtNet.h b/PitsideConsole/ArtLib/ArtNet.h new file mode 100644 index 0000000..80d52e6 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtNet.h @@ -0,0 +1,4 @@ +#pragma once +#include "winsock2.h" + +int TimeoutRead(SOCKET s, char* buf, int cbBuf, int flags, int timeout, bool* pfConnectionLost); \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtSQL/ArtSQLite.cpp b/PitsideConsole/ArtLib/ArtSQL/ArtSQLite.cpp new file mode 100644 index 0000000..3221e47 --- /dev/null +++ b/PitsideConsole/ArtLib/ArtSQL/ArtSQLite.cpp @@ -0,0 +1,181 @@ + +#include "ArtSQLite.h" +#include "sqlite3.h" +#include "../ArtTools.h" +#include + +HRESULT CSfArtSQLiteDB::Open(LPCTSTR filename, vector& lstTables, bool fReadOnly) +{ + HRESULT hr = S_OK; + + int iRet = 0; + if(fReadOnly) + { + std::wstring wstr(filename); + std::string str(wstr.begin(),wstr.end()); + + iRet = sqlite3_open_v2(str.c_str(),&m_sqlite3,SQLITE_OPEN_READONLY,NULL); + } + else + { + iRet = sqlite3_open16((void*)filename, &m_sqlite3); + } + if(iRet == SQLITE_OK) + { + // hooray!. Let's get the table list + CSfArtSQLiteQuery sfQuery(*this); + if(sfQuery.Init(L"select sql from sqlite_master order by tbl_name,type desc")) + { + while(sfQuery.Next()) + { + TCHAR szSQL[1000]; + if(sfQuery.GetCol(0,szSQL,NUMCHARS(szSQL))) + { + lstTables.push_back(wstring(szSQL)); + } + } + } + } + else + { + hr = E_FAIL; + Close(); + } + + return hr; +} +void CSfArtSQLiteDB::Close() +{ + if(m_sqlite3) + { + sqlite3_close(m_sqlite3); + m_sqlite3 = NULL; + } +} + +void CSfArtSQLiteDB::ExecuteSQL(const char* lpszSQL) +{ + char* szErr = NULL; + sqlite3_exec(this->m_sqlite3,lpszSQL,NULL, NULL,&szErr); +} + +bool CSfArtSQLiteQuery::Init(LPCTSTR lpszSQL, int cchSQL) +{ + m_fDone = false; + m_iBindIndex = 0; + if(cchSQL <= 0) + { + cchSQL = wcslen(lpszSQL) * sizeof(*lpszSQL); + } + LPTSTR lpszEnd = NULL; + int iRet = SQLITE_OK; + iRet = sqlite3_prepare16(m_DB.GetSQLite(), lpszSQL, cchSQL, &m_stmt, (const void**)&lpszEnd); + + return iRet == SQLITE_OK; +} +bool CSfArtSQLiteQuery::Next() +{ + int iRet = SQLITE_OK; + do + { + iRet = sqlite3_step(m_stmt); + } while(iRet == SQLITE_BUSY); + + m_fDone = iRet == SQLITE_DONE; + return iRet == SQLITE_ROW; +} +bool CSfArtSQLiteQuery::BindValue(long long value) +{ + m_iBindIndex++; + + return sqlite3_bind_int64(m_stmt,m_iBindIndex,value) == SQLITE_OK; +} +bool CSfArtSQLiteQuery::BindValue(int value) +{ + m_iBindIndex++; + + return sqlite3_bind_int(m_stmt,m_iBindIndex,value) == SQLITE_OK; +} +bool CSfArtSQLiteQuery::BindValue(double value) +{ + m_iBindIndex++; + + return sqlite3_bind_double(m_stmt,m_iBindIndex,value) == SQLITE_OK; +} +bool CSfArtSQLiteQuery::BindValue(LPCTSTR lpszValue) +{ + m_iBindIndex++; + + char szValue[2000]; // convert to single-wide text + _snprintf(szValue, NUMCHARS(szValue), "%S", lpszValue); + + return sqlite3_bind_text(m_stmt,m_iBindIndex,szValue, strlen(szValue), SQLITE_TRANSIENT) == SQLITE_OK; +} + +bool CSfArtSQLiteQuery::GetCol(int iCol, double* p) +{ + if(sqlite3_column_type(m_stmt, iCol) != SQLITE_FLOAT) + { + DASSERT(FALSE); + return false; + } + + *p = sqlite3_column_double(m_stmt, iCol); + return true; +} +bool CSfArtSQLiteQuery::GetCol(int iCol, float* p) +{ + double d = 0; + if(GetCol(iCol,&d)) + { + *p = (float)d; + return true; + } + else + { + *p = 0; + return false; + } +} +bool CSfArtSQLiteQuery::GetCol(int iCol, int* p) +{ + if(sqlite3_column_type(m_stmt, iCol) != SQLITE_INTEGER) + { + DASSERT(FALSE); + return false; + } + + *p = sqlite3_column_int(m_stmt, iCol); + return true; +} +bool CSfArtSQLiteQuery::GetCol(int iCol, long long* p) +{ + if(sqlite3_column_type(m_stmt, iCol) != SQLITE_INTEGER) + { + DASSERT(FALSE); + return false; + } + + *p = sqlite3_column_int64(m_stmt, iCol); + return true; +} +bool CSfArtSQLiteQuery::GetCol(int iCol, LPTSTR pszResult, int cchResult) +{ + if(sqlite3_column_type(m_stmt, iCol) != SQLITE_TEXT) + { + DASSERT(FALSE); + return false; + } + + const unsigned char* psz = sqlite3_column_text(m_stmt, iCol); + _snwprintf(pszResult, cchResult, L"%S", psz); + return true; +} + +void CSfArtSQLiteQuery::DeInit() +{ + if(m_stmt) + { + sqlite3_finalize(m_stmt); + } +} \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtSQL/ArtSQLite.h b/PitsideConsole/ArtLib/ArtSQL/ArtSQLite.h new file mode 100644 index 0000000..7c0fcfd --- /dev/null +++ b/PitsideConsole/ArtLib/ArtSQL/ArtSQLite.h @@ -0,0 +1,59 @@ +#pragma once + +#include +#include "sqlite3.h" +#include +#include +#include +using namespace std; + +class CSfArtSQLiteDB +{ +public: + CSfArtSQLiteDB() : m_sqlite3(NULL) {}; + virtual ~CSfArtSQLiteDB() {Close();}; + + HRESULT Open(LPCTSTR filename, vector& lstTableSQL, bool fReadOnly=false); + void Close(); + + sqlite3* GetSQLite() {return m_sqlite3;}; + + long long GetLastInsertId() {return sqlite3_last_insert_rowid(m_sqlite3);}; + void StartTransaction() {ExecuteSQL("BEGIN TRANSACTION");} + void StopTransaction() {ExecuteSQL("END TRANSACTION");} +private: + void ExecuteSQL(const char* lpszSQL); + CSfArtSQLiteDB(const CSfArtSQLiteDB& dbCopy); // kill the copy constructor +private: + sqlite3* m_sqlite3; +}; + +class CSfArtSQLiteQuery +{ +public: + CSfArtSQLiteQuery(CSfArtSQLiteDB& DB) : m_fDone(false), m_iBindIndex(0),m_DB(DB), m_stmt(NULL) {}; + virtual ~CSfArtSQLiteQuery() {DeInit();} + + bool Init(LPCTSTR lpszSQL, int cchSQL = 0); + bool Next(); + bool IsDone() const {return m_fDone;}; // for queries that don't return results, this tells us if the query finished successfully + + bool BindValue(long long value); + bool BindValue(int value); + bool BindValue(double value); + bool BindValue(LPCTSTR lpszValue); + + bool GetCol(int iCol, double* pd); + bool GetCol(int iCol, float* pd); + bool GetCol(int iCol, int* pd); + bool GetCol(int iCol, long long* p); + bool GetCol(int iCol, LPTSTR pszResult, int cchResult); + + void DeInit(); +private: + int m_iBindIndex; + bool m_fDone; + + sqlite3_stmt* m_stmt; + CSfArtSQLiteDB& m_DB; +}; \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtSQL/shell.c b/PitsideConsole/ArtLib/ArtSQL/shell.c new file mode 100644 index 0000000..364cbef --- /dev/null +++ b/PitsideConsole/ArtLib/ArtSQL/shell.c @@ -0,0 +1,2991 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code to implement the "sqlite" command line +** utility for accessing SQLite databases. +*/ + +#include "../stdafx.h" + +#if (defined(_WIN32) || defined(WIN32)) && !defined(_CRT_SECURE_NO_WARNINGS) +/* This needs to come before any includes for MSVC compiler */ +#define _CRT_SECURE_NO_WARNINGS +#endif + +/* +** Enable large-file support for fopen() and friends on unix. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +#include +#include +#include +#include +#include "sqlite3.h" +#include +#include + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) +# include +# if !defined(__RTP__) && !defined(_WRS_KERNEL) +# include +# endif +# include +# include +#endif + +#ifdef __OS2__ +# include +#endif + +#ifdef HAVE_EDITLINE +# include +#endif +#if defined(HAVE_READLINE) && HAVE_READLINE==1 +# include +# include +#endif +#if !defined(HAVE_EDITLINE) && (!defined(HAVE_READLINE) || HAVE_READLINE!=1) +# define readline(p) local_getline(p,stdin) +# define add_history(X) +# define read_history(X) +# define write_history(X) +# define stifle_history(X) +#endif + +#if defined(_WIN32) || defined(WIN32) +# include +#define isatty(h) _isatty(h) +#define access(f,m) _access((f),(m)) +#else +/* Make sure isatty() has a prototype. +*/ +extern int isatty(int); +#endif + +#if defined(_WIN32_WCE) +/* Windows CE (arm-wince-mingw32ce-gcc) does not provide isatty() + * thus we always assume that we have a console. That can be + * overridden with the -batch command line option. + */ +#define isatty(x) 1 +#endif + +/* True if the timer is enabled */ +static int enableTimer = 0; + +/* ctype macros that work with signed characters */ +#define IsSpace(X) isspace((unsigned char)X) +#define IsDigit(X) isdigit((unsigned char)X) +#define ToLower(X) (char)tolower((unsigned char)X) + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(__RTP__) && !defined(_WRS_KERNEL) +#include +#include + +/* Saved resource information for the beginning of an operation */ +static struct rusage sBegin; + +/* +** Begin timing an operation +*/ +static void beginTimer(void){ + if( enableTimer ){ + getrusage(RUSAGE_SELF, &sBegin); + } +} + +/* Return the difference of two time_structs in seconds */ +static double timeDiff(struct timeval *pStart, struct timeval *pEnd){ + return (pEnd->tv_usec - pStart->tv_usec)*0.000001 + + (double)(pEnd->tv_sec - pStart->tv_sec); +} + +/* +** Print the timing results. +*/ +static void endTimer(void){ + if( enableTimer ){ + struct rusage sEnd; + getrusage(RUSAGE_SELF, &sEnd); + printf("CPU Time: user %f sys %f\n", + timeDiff(&sBegin.ru_utime, &sEnd.ru_utime), + timeDiff(&sBegin.ru_stime, &sEnd.ru_stime)); + } +} + +#define BEGIN_TIMER beginTimer() +#define END_TIMER endTimer() +#define HAS_TIMER 1 + +#elif (defined(_WIN32) || defined(WIN32)) + +#include + +/* Saved resource information for the beginning of an operation */ +static HANDLE hProcess; +static FILETIME ftKernelBegin; +static FILETIME ftUserBegin; +typedef BOOL (WINAPI *GETPROCTIMES)(HANDLE, LPFILETIME, LPFILETIME, LPFILETIME, LPFILETIME); +static GETPROCTIMES getProcessTimesAddr = NULL; + +/* +** Check to see if we have timer support. Return 1 if necessary +** support found (or found previously). +*/ +static int hasTimer(void){ + if( getProcessTimesAddr ){ + return 1; + } else { + /* GetProcessTimes() isn't supported in WIN95 and some other Windows versions. + ** See if the version we are running on has it, and if it does, save off + ** a pointer to it and the current process handle. + */ + hProcess = GetCurrentProcess(); + if( hProcess ){ + HINSTANCE hinstLib = LoadLibrary(TEXT("Kernel32.dll")); + if( NULL != hinstLib ){ + getProcessTimesAddr = (GETPROCTIMES) GetProcAddress(hinstLib, "GetProcessTimes"); + if( NULL != getProcessTimesAddr ){ + return 1; + } + FreeLibrary(hinstLib); + } + } + } + return 0; +} + +/* +** Begin timing an operation +*/ +static void beginTimer(void){ + if( enableTimer && getProcessTimesAddr ){ + FILETIME ftCreation, ftExit; + getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelBegin, &ftUserBegin); + } +} + +/* Return the difference of two FILETIME structs in seconds */ +static double timeDiff(FILETIME *pStart, FILETIME *pEnd){ + sqlite_int64 i64Start = *((sqlite_int64 *) pStart); + sqlite_int64 i64End = *((sqlite_int64 *) pEnd); + return (double) ((i64End - i64Start) / 10000000.0); +} + +/* +** Print the timing results. +*/ +static void endTimer(void){ + if( enableTimer && getProcessTimesAddr){ + FILETIME ftCreation, ftExit, ftKernelEnd, ftUserEnd; + getProcessTimesAddr(hProcess, &ftCreation, &ftExit, &ftKernelEnd, &ftUserEnd); + printf("CPU Time: user %f sys %f\n", + timeDiff(&ftUserBegin, &ftUserEnd), + timeDiff(&ftKernelBegin, &ftKernelEnd)); + } +} + +#define BEGIN_TIMER beginTimer() +#define END_TIMER endTimer() +#define HAS_TIMER hasTimer() + +#else +#define BEGIN_TIMER +#define END_TIMER +#define HAS_TIMER 0 +#endif + +/* +** Used to prevent warnings about unused parameters +*/ +#define UNUSED_PARAMETER(x) (void)(x) + +/* +** If the following flag is set, then command execution stops +** at an error if we are not interactive. +*/ +static int bail_on_error = 0; + +/* +** Threat stdin as an interactive input if the following variable +** is true. Otherwise, assume stdin is connected to a file or pipe. +*/ +static int stdin_is_interactive = 1; + +/* +** The following is the open SQLite database. We make a pointer +** to this database a static variable so that it can be accessed +** by the SIGINT handler to interrupt database processing. +*/ +static sqlite3 *db = 0; + +/* +** True if an interrupt (Control-C) has been received. +*/ +static volatile int seenInterrupt = 0; + +/* +** This is the name of our program. It is set in main(), used +** in a number of other places, mostly for error messages. +*/ +static char *Argv0; + +/* +** Prompt strings. Initialized in main. Settable with +** .prompt main continue +*/ +static char mainPrompt[20]; /* First line prompt. default: "sqlite> "*/ +static char continuePrompt[20]; /* Continuation prompt. default: " ...> " */ + +/* +** Write I/O traces to the following stream. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static FILE *iotrace = 0; +#endif + +/* +** This routine works like printf in that its first argument is a +** format string and subsequent arguments are values to be substituted +** in place of % fields. The result of formatting this string +** is written to iotrace. +*/ +#ifdef SQLITE_ENABLE_IOTRACE +static void iotracePrintf(const char *zFormat, ...){ + va_list ap; + char *z; + if( iotrace==0 ) return; + va_start(ap, zFormat); + z = sqlite3_vmprintf(zFormat, ap); + va_end(ap); + fprintf(iotrace, "%s", z); + sqlite3_free(z); +} +#endif + + +/* +** Determines if a string is a number of not. +*/ +static int isNumber(const char *z, int *realnum){ + if( *z=='-' || *z=='+' ) z++; + if( !IsDigit(*z) ){ + return 0; + } + z++; + if( realnum ) *realnum = 0; + while( IsDigit(*z) ){ z++; } + if( *z=='.' ){ + z++; + if( !IsDigit(*z) ) return 0; + while( IsDigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + if( *z=='e' || *z=='E' ){ + z++; + if( *z=='+' || *z=='-' ) z++; + if( !IsDigit(*z) ) return 0; + while( IsDigit(*z) ){ z++; } + if( realnum ) *realnum = 1; + } + return *z==0; +} + +/* +** A global char* and an SQL function to access its current value +** from within an SQL statement. This program used to use the +** sqlite_exec_printf() API to substitue a string into an SQL statement. +** The correct way to do this with sqlite3 is to use the bind API, but +** since the shell is built around the callback paradigm it would be a lot +** of work. Instead just use this hack, which is quite harmless. +*/ +static const char *zShellStatic = 0; +static void shellstaticFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( 0==argc ); + assert( zShellStatic ); + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3_result_text(context, zShellStatic, -1, SQLITE_STATIC); +} + + +/* +** This routine reads a line of text from FILE in, stores +** the text in memory obtained from malloc() and returns a pointer +** to the text. NULL is returned at end of file, or if malloc() +** fails. +** +** The interface is like "readline" but no command-line editing +** is done. +*/ +static char *local_getline(char *zPrompt, FILE *in){ + char *zLine; + int nLine; + int n; + + if( zPrompt && *zPrompt ){ + printf("%s",zPrompt); + fflush(stdout); + } + nLine = 100; + zLine = malloc( nLine ); + if( zLine==0 ) return 0; + n = 0; + while( 1 ){ + if( n+100>nLine ){ + nLine = nLine*2 + 100; + zLine = realloc(zLine, nLine); + if( zLine==0 ) return 0; + } + if( fgets(&zLine[n], nLine - n, in)==0 ){ + if( n==0 ){ + free(zLine); + return 0; + } + zLine[n] = 0; + break; + } + while( zLine[n] ){ n++; } + if( n>0 && zLine[n-1]=='\n' ){ + n--; + if( n>0 && zLine[n-1]=='\r' ) n--; + zLine[n] = 0; + break; + } + } + zLine = realloc( zLine, n+1 ); + return zLine; +} + +/* +** Retrieve a single line of input text. +** +** zPrior is a string of prior text retrieved. If not the empty +** string, then issue a continuation prompt. +*/ +static char *one_input_line(const char *zPrior, FILE *in){ + char *zPrompt; + char *zResult; + if( in!=0 ){ + return local_getline(0, in); + } + if( zPrior && zPrior[0] ){ + zPrompt = continuePrompt; + }else{ + zPrompt = mainPrompt; + } + zResult = readline(zPrompt); +#if defined(HAVE_READLINE) && HAVE_READLINE==1 + if( zResult && *zResult ) add_history(zResult); +#endif + return zResult; +} + +struct previous_mode_data { + int valid; /* Is there legit data in here? */ + int mode; + int showHeader; + int colWidth[100]; +}; + +/* +** An pointer to an instance of this structure is passed from +** the main program to the callback. This is used to communicate +** state and mode information. +*/ +struct callback_data { + sqlite3 *db; /* The database */ + int echoOn; /* True to echo input commands */ + int statsOn; /* True to display memory stats before each finalize */ + int cnt; /* Number of records displayed so far */ + FILE *out; /* Write results here */ + int nErr; /* Number of errors seen */ + int mode; /* An output mode setting */ + int writableSchema; /* True if PRAGMA writable_schema=ON */ + int showHeader; /* True to show column names in List or Column mode */ + char *zDestTable; /* Name of destination table when MODE_Insert */ + char separator[20]; /* Separator character for MODE_List */ + int colWidth[100]; /* Requested width of each column when in column mode*/ + int actualWidth[100]; /* Actual width of each column */ + char nullvalue[20]; /* The text to print when a NULL comes back from + ** the database */ + struct previous_mode_data explainPrev; + /* Holds the mode information just before + ** .explain ON */ + char outfile[FILENAME_MAX]; /* Filename for *out */ + const char *zDbFilename; /* name of the database file */ + const char *zVfs; /* Name of VFS to use */ + sqlite3_stmt *pStmt; /* Current statement if any. */ + FILE *pLog; /* Write log output here */ +}; + +/* +** These are the allowed modes. +*/ +#define MODE_Line 0 /* One column per line. Blank line between records */ +#define MODE_Column 1 /* One record per line in neat columns */ +#define MODE_List 2 /* One record per line with a separator */ +#define MODE_Semi 3 /* Same as MODE_List but append ";" to each line */ +#define MODE_Html 4 /* Generate an XHTML table */ +#define MODE_Insert 5 /* Generate SQL "insert" statements */ +#define MODE_Tcl 6 /* Generate ANSI-C or TCL quoted elements */ +#define MODE_Csv 7 /* Quote strings, numbers are plain */ +#define MODE_Explain 8 /* Like MODE_Column, but do not truncate data */ + +static const char *modeDescr[] = { + "line", + "column", + "list", + "semi", + "html", + "insert", + "tcl", + "csv", + "explain", +}; + +/* +** Number of elements in an array +*/ +#define ArraySize(X) (int)(sizeof(X)/sizeof(X[0])) + +/* +** Compute a string length that is limited to what can be stored in +** lower 30 bits of a 32-bit signed integer. +*/ +static int strlen30(const char *z){ + const char *z2 = z; + while( *z2 ){ z2++; } + return 0x3fffffff & (int)(z2 - z); +} + +/* +** A callback for the sqlite3_log() interface. +*/ +static void shellLog(void *pArg, int iErrCode, const char *zMsg){ + struct callback_data *p = (struct callback_data*)pArg; + if( p->pLog==0 ) return; + fprintf(p->pLog, "(%d) %s\n", iErrCode, zMsg); + fflush(p->pLog); +} + +/* +** Output the given string as a hex-encoded blob (eg. X'1234' ) +*/ +static void output_hex_blob(FILE *out, const void *pBlob, int nBlob){ + int i; + char *zBlob = (char *)pBlob; + fprintf(out,"X'"); + for(i=0; i0 ){ + fprintf(out,"%.*s",i,z); + } + if( z[i]=='<' ){ + fprintf(out,"<"); + }else if( z[i]=='&' ){ + fprintf(out,"&"); + }else if( z[i]=='>' ){ + fprintf(out,">"); + }else if( z[i]=='\"' ){ + fprintf(out,"""); + }else if( z[i]=='\'' ){ + fprintf(out,"'"); + }else{ + break; + } + z += i + 1; + } +} + +/* +** If a field contains any character identified by a 1 in the following +** array, then the string must be quoted for CSV. +*/ +static const char needCsvQuote[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; + +/* +** Output a single term of CSV. Actually, p->separator is used for +** the separator, which may or may not be a comma. p->nullvalue is +** the null value. Strings are quoted using ANSI-C rules. Numbers +** appear outside of quotes. +*/ +static void output_csv(struct callback_data *p, const char *z, int bSep){ + FILE *out = p->out; + if( z==0 ){ + fprintf(out,"%s",p->nullvalue); + }else{ + int i; + int nSep = strlen30(p->separator); + for(i=0; z[i]; i++){ + if( needCsvQuote[((unsigned char*)z)[i]] + || (z[i]==p->separator[0] && + (nSep==1 || memcmp(z, p->separator, nSep)==0)) ){ + i = 0; + break; + } + } + if( i==0 ){ + putc('"', out); + for(i=0; z[i]; i++){ + if( z[i]=='"' ) putc('"', out); + putc(z[i], out); + } + putc('"', out); + }else{ + fprintf(out, "%s", z); + } + } + if( bSep ){ + fprintf(p->out, "%s", p->separator); + } +} + +#ifdef SIGINT +/* +** This routine runs when the user presses Ctrl-C +*/ +static void interrupt_handler(int NotUsed){ + UNUSED_PARAMETER(NotUsed); + seenInterrupt = 1; + if( db ) sqlite3_interrupt(db); +} +#endif + +/* +** This is the callback routine that the shell +** invokes for each row of a query result. +*/ +static int shell_callback(void *pArg, int nArg, char **azArg, char **azCol, int *aiType){ + int i; + struct callback_data *p = (struct callback_data*)pArg; + + switch( p->mode ){ + case MODE_Line: { + int w = 5; + if( azArg==0 ) break; + for(i=0; iw ) w = len; + } + if( p->cnt++>0 ) fprintf(p->out,"\n"); + for(i=0; iout,"%*s = %s\n", w, azCol[i], + azArg[i] ? azArg[i] : p->nullvalue); + } + break; + } + case MODE_Explain: + case MODE_Column: { + if( p->cnt++==0 ){ + for(i=0; icolWidth) ){ + w = p->colWidth[i]; + }else{ + w = 0; + } + if( w<=0 ){ + w = strlen30(azCol[i] ? azCol[i] : ""); + if( w<10 ) w = 10; + n = strlen30(azArg && azArg[i] ? azArg[i] : p->nullvalue); + if( wactualWidth) ){ + p->actualWidth[i] = w; + } + if( p->showHeader ){ + fprintf(p->out,"%-*.*s%s",w,w,azCol[i], i==nArg-1 ? "\n": " "); + } + } + if( p->showHeader ){ + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + fprintf(p->out,"%-*.*s%s",w,w,"-----------------------------------" + "----------------------------------------------------------", + i==nArg-1 ? "\n": " "); + } + } + } + if( azArg==0 ) break; + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + }else{ + w = 10; + } + if( p->mode==MODE_Explain && azArg[i] && + strlen30(azArg[i])>w ){ + w = strlen30(azArg[i]); + } + fprintf(p->out,"%-*.*s%s",w,w, + azArg[i] ? azArg[i] : p->nullvalue, i==nArg-1 ? "\n": " "); + } + break; + } + case MODE_Semi: + case MODE_List: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"%s%s",azCol[i], i==nArg-1 ? "\n" : p->separator); + } + } + if( azArg==0 ) break; + for(i=0; inullvalue; + fprintf(p->out, "%s", z); + if( iout, "%s", p->separator); + }else if( p->mode==MODE_Semi ){ + fprintf(p->out, ";\n"); + }else{ + fprintf(p->out, "\n"); + } + } + break; + } + case MODE_Html: { + if( p->cnt++==0 && p->showHeader ){ + fprintf(p->out,""); + for(i=0; iout,""); + output_html_string(p->out, azCol[i]); + fprintf(p->out,"\n"); + } + fprintf(p->out,"\n"); + } + if( azArg==0 ) break; + fprintf(p->out,""); + for(i=0; iout,""); + output_html_string(p->out, azArg[i] ? azArg[i] : p->nullvalue); + fprintf(p->out,"\n"); + } + fprintf(p->out,"\n"); + break; + } + case MODE_Tcl: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,azCol[i] ? azCol[i] : ""); + fprintf(p->out, "%s", p->separator); + } + fprintf(p->out,"\n"); + } + if( azArg==0 ) break; + for(i=0; iout, azArg[i] ? azArg[i] : p->nullvalue); + fprintf(p->out, "%s", p->separator); + } + fprintf(p->out,"\n"); + break; + } + case MODE_Csv: { + if( p->cnt++==0 && p->showHeader ){ + for(i=0; iout,"\n"); + } + if( azArg==0 ) break; + for(i=0; iout,"\n"); + break; + } + case MODE_Insert: { + p->cnt++; + if( azArg==0 ) break; + fprintf(p->out,"INSERT INTO %s VALUES(",p->zDestTable); + for(i=0; i0 ? ",": ""; + if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ + fprintf(p->out,"%sNULL",zSep); + }else if( aiType && aiType[i]==SQLITE_TEXT ){ + if( zSep[0] ) fprintf(p->out,"%s",zSep); + output_quoted_string(p->out, azArg[i]); + }else if( aiType && (aiType[i]==SQLITE_INTEGER || aiType[i]==SQLITE_FLOAT) ){ + fprintf(p->out,"%s%s",zSep, azArg[i]); + }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ + const void *pBlob = sqlite3_column_blob(p->pStmt, i); + int nBlob = sqlite3_column_bytes(p->pStmt, i); + if( zSep[0] ) fprintf(p->out,"%s",zSep); + output_hex_blob(p->out, pBlob, nBlob); + }else if( isNumber(azArg[i], 0) ){ + fprintf(p->out,"%s%s",zSep, azArg[i]); + }else{ + if( zSep[0] ) fprintf(p->out,"%s",zSep); + output_quoted_string(p->out, azArg[i]); + } + } + fprintf(p->out,");\n"); + break; + } + } + return 0; +} + +/* +** This is the callback routine that the SQLite library +** invokes for each row of a query result. +*/ +static int callback(void *pArg, int nArg, char **azArg, char **azCol){ + /* since we don't have type info, call the shell_callback with a NULL value */ + return shell_callback(pArg, nArg, azArg, azCol, NULL); +} + +/* +** Set the destination table field of the callback_data structure to +** the name of the table given. Escape any quote characters in the +** table name. +*/ +static void set_table_name(struct callback_data *p, const char *zName){ + int i, n; + int needQuote; + char *z; + + if( p->zDestTable ){ + free(p->zDestTable); + p->zDestTable = 0; + } + if( zName==0 ) return; + needQuote = !isalpha((unsigned char)*zName) && *zName!='_'; + for(i=n=0; zName[i]; i++, n++){ + if( !isalnum((unsigned char)zName[i]) && zName[i]!='_' ){ + needQuote = 1; + if( zName[i]=='\'' ) n++; + } + } + if( needQuote ) n += 2; + z = p->zDestTable = malloc( n+1 ); + if( z==0 ){ + fprintf(stderr,"Error: out of memory\n"); + exit(1); + } + n = 0; + if( needQuote ) z[n++] = '\''; + for(i=0; zName[i]; i++){ + z[n++] = zName[i]; + if( zName[i]=='\'' ) z[n++] = '\''; + } + if( needQuote ) z[n++] = '\''; + z[n] = 0; +} + +/* zIn is either a pointer to a NULL-terminated string in memory obtained +** from malloc(), or a NULL pointer. The string pointed to by zAppend is +** added to zIn, and the result returned in memory obtained from malloc(). +** zIn, if it was not NULL, is freed. +** +** If the third argument, quote, is not '\0', then it is used as a +** quote character for zAppend. +*/ +static char *appendText(char *zIn, char const *zAppend, char quote){ + int len; + int i; + int nAppend = strlen30(zAppend); + int nIn = (zIn?strlen30(zIn):0); + + len = nAppend+nIn+1; + if( quote ){ + len += 2; + for(i=0; idb, zSelect, -1, &pSelect, 0); + if( rc!=SQLITE_OK || !pSelect ){ + fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db)); + p->nErr++; + return rc; + } + rc = sqlite3_step(pSelect); + while( rc==SQLITE_ROW ){ + if( zFirstRow ){ + fprintf(p->out, "%s", zFirstRow); + zFirstRow = 0; + } + fprintf(p->out, "%s;\n", sqlite3_column_text(pSelect, 0)); + rc = sqlite3_step(pSelect); + } + rc = sqlite3_finalize(pSelect); + if( rc!=SQLITE_OK ){ + fprintf(p->out, "/**** ERROR: (%d) %s *****/\n", rc, sqlite3_errmsg(p->db)); + p->nErr++; + } + return rc; +} + +/* +** Allocate space and save off current error string. +*/ +static char *save_err_msg( + sqlite3 *db /* Database to query */ +){ + int nErrMsg = 1+strlen30(sqlite3_errmsg(db)); + char *zErrMsg = sqlite3_malloc(nErrMsg); + if( zErrMsg ){ + memcpy(zErrMsg, sqlite3_errmsg(db), nErrMsg); + } + return zErrMsg; +} + +/* +** Display memory stats. +*/ +static int display_stats( + sqlite3 *db, /* Database to query */ + struct callback_data *pArg, /* Pointer to struct callback_data */ + int bReset /* True to reset the stats */ +){ + int iCur; + int iHiwtr; + + if( pArg && pArg->out ){ + + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_MEMORY_USED, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Memory Used: %d (max %d) bytes\n", iCur, iHiwtr); + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Number of Outstanding Allocations: %d (max %d)\n", iCur, iHiwtr); +/* +** Not currently used by the CLI. +** iHiwtr = iCur = -1; +** sqlite3_status(SQLITE_STATUS_PAGECACHE_USED, &iCur, &iHiwtr, bReset); +** fprintf(pArg->out, "Number of Pcache Pages Used: %d (max %d) pages\n", iCur, iHiwtr); +*/ + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_PAGECACHE_OVERFLOW, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Number of Pcache Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr); +/* +** Not currently used by the CLI. +** iHiwtr = iCur = -1; +** sqlite3_status(SQLITE_STATUS_SCRATCH_USED, &iCur, &iHiwtr, bReset); +** fprintf(pArg->out, "Number of Scratch Allocations Used: %d (max %d)\n", iCur, iHiwtr); +*/ + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_SCRATCH_OVERFLOW, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Number of Scratch Overflow Bytes: %d (max %d) bytes\n", iCur, iHiwtr); + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_MALLOC_SIZE, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Largest Allocation: %d bytes\n", iHiwtr); + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_PAGECACHE_SIZE, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Largest Pcache Allocation: %d bytes\n", iHiwtr); + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_SCRATCH_SIZE, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Largest Scratch Allocation: %d bytes\n", iHiwtr); +#ifdef YYTRACKMAXSTACKDEPTH + iHiwtr = iCur = -1; + sqlite3_status(SQLITE_STATUS_PARSER_STACK, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Deepest Parser Stack: %d (max %d)\n", iCur, iHiwtr); +#endif + } + + if( pArg && pArg->out && db ){ + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_USED, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Lookaside Slots Used: %d (max %d)\n", iCur, iHiwtr); + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_HIT, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Successful lookaside attempts: %d\n", iHiwtr); + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Lookaside failures due to size: %d\n", iHiwtr); + sqlite3_db_status(db, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Lookaside failures due to OOM: %d\n", iHiwtr); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_USED, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Pager Heap Usage: %d bytes\n", iCur); iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_HIT, &iCur, &iHiwtr, 1); + fprintf(pArg->out, "Page cache hits: %d\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_CACHE_MISS, &iCur, &iHiwtr, 1); + fprintf(pArg->out, "Page cache misses: %d\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_SCHEMA_USED, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Schema Heap Usage: %d bytes\n", iCur); + iHiwtr = iCur = -1; + sqlite3_db_status(db, SQLITE_DBSTATUS_STMT_USED, &iCur, &iHiwtr, bReset); + fprintf(pArg->out, "Statement Heap/Lookaside Usage: %d bytes\n", iCur); + } + + if( pArg && pArg->out && db && pArg->pStmt ){ + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_FULLSCAN_STEP, bReset); + fprintf(pArg->out, "Fullscan Steps: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_SORT, bReset); + fprintf(pArg->out, "Sort Operations: %d\n", iCur); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_AUTOINDEX, bReset); + fprintf(pArg->out, "Autoindex Inserts: %d\n", iCur); + } + + return 0; +} + +/* +** Execute a statement or set of statements. Print +** any result rows/columns depending on the current mode +** set via the supplied callback. +** +** This is very similar to SQLite's built-in sqlite3_exec() +** function except it takes a slightly different callback +** and callback data argument. +*/ +static int shell_exec( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + int (*xCallback)(void*,int,char**,char**,int*), /* Callback function */ + /* (not the same as sqlite3_exec) */ + struct callback_data *pArg, /* Pointer to struct callback_data */ + char **pzErrMsg /* Error msg written here */ +){ + sqlite3_stmt *pStmt = NULL; /* Statement to execute. */ + int rc = SQLITE_OK; /* Return Code */ + int rc2; + const char *zLeftover; /* Tail of unprocessed SQL */ + + if( pzErrMsg ){ + *pzErrMsg = NULL; + } + + while( zSql[0] && (SQLITE_OK == rc) ){ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zLeftover); + if( SQLITE_OK != rc ){ + if( pzErrMsg ){ + *pzErrMsg = save_err_msg(db); + } + }else{ + if( !pStmt ){ + /* this happens for a comment or white-space */ + zSql = zLeftover; + while( IsSpace(zSql[0]) ) zSql++; + continue; + } + + /* save off the prepared statment handle and reset row count */ + if( pArg ){ + pArg->pStmt = pStmt; + pArg->cnt = 0; + } + + /* echo the sql statement if echo on */ + if( pArg && pArg->echoOn ){ + const char *zStmtSql = sqlite3_sql(pStmt); + fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); + } + + /* Output TESTCTRL_EXPLAIN text of requested */ + if( pArg && pArg->mode==MODE_Explain ){ + const char *zExplain = 0; + sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain); + if( zExplain && zExplain[0] ){ + fprintf(pArg->out, "%s", zExplain); + } + } + + /* perform the first step. this will tell us if we + ** have a result set or not and how wide it is. + */ + rc = sqlite3_step(pStmt); + /* if we have a result set... */ + if( SQLITE_ROW == rc ){ + /* if we have a callback... */ + if( xCallback ){ + /* allocate space for col name ptr, value ptr, and type */ + int nCol = sqlite3_column_count(pStmt); + void *pData = sqlite3_malloc(3*nCol*sizeof(const char*) + 1); + if( !pData ){ + rc = SQLITE_NOMEM; + }else{ + char **azCols = (char **)pData; /* Names of result columns */ + char **azVals = &azCols[nCol]; /* Results */ + int *aiTypes = (int *)&azVals[nCol]; /* Result types */ + int i; + assert(sizeof(int) <= sizeof(char *)); + /* save off ptrs to column names */ + for(i=0; istatsOn ){ + display_stats(db, pArg, 0); + } + + /* Finalize the statement just executed. If this fails, save a + ** copy of the error message. Otherwise, set zSql to point to the + ** next statement to execute. */ + rc2 = sqlite3_finalize(pStmt); + if( rc!=SQLITE_NOMEM ) rc = rc2; + if( rc==SQLITE_OK ){ + zSql = zLeftover; + while( IsSpace(zSql[0]) ) zSql++; + }else if( pzErrMsg ){ + *pzErrMsg = save_err_msg(db); + } + + /* clear saved stmt handle */ + if( pArg ){ + pArg->pStmt = NULL; + } + } + } /* end while */ + + return rc; +} + + +/* +** This is a different callback routine used for dumping the database. +** Each row received by this callback consists of a table name, +** the table type ("index" or "table") and SQL to create the table. +** This routine should print text sufficient to recreate the table. +*/ +static int dump_callback(void *pArg, int nArg, char **azArg, char **azCol){ + int rc; + const char *zTable; + const char *zType; + const char *zSql; + const char *zPrepStmt = 0; + struct callback_data *p = (struct callback_data *)pArg; + + UNUSED_PARAMETER(azCol); + if( nArg!=3 ) return 1; + zTable = azArg[0]; + zType = azArg[1]; + zSql = azArg[2]; + + if( strcmp(zTable, "sqlite_sequence")==0 ){ + zPrepStmt = "DELETE FROM sqlite_sequence;\n"; + }else if( strcmp(zTable, "sqlite_stat1")==0 ){ + fprintf(p->out, "ANALYZE sqlite_master;\n"); + }else if( strncmp(zTable, "sqlite_", 7)==0 ){ + return 0; + }else if( strncmp(zSql, "CREATE VIRTUAL TABLE", 20)==0 ){ + char *zIns; + if( !p->writableSchema ){ + fprintf(p->out, "PRAGMA writable_schema=ON;\n"); + p->writableSchema = 1; + } + zIns = sqlite3_mprintf( + "INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)" + "VALUES('table','%q','%q',0,'%q');", + zTable, zTable, zSql); + fprintf(p->out, "%s\n", zIns); + sqlite3_free(zIns); + return 0; + }else{ + fprintf(p->out, "%s;\n", zSql); + } + + if( strcmp(zType, "table")==0 ){ + sqlite3_stmt *pTableInfo = 0; + char *zSelect = 0; + char *zTableInfo = 0; + char *zTmp = 0; + int nRow = 0; + + zTableInfo = appendText(zTableInfo, "PRAGMA table_info(", 0); + zTableInfo = appendText(zTableInfo, zTable, '"'); + zTableInfo = appendText(zTableInfo, ");", 0); + + rc = sqlite3_prepare(p->db, zTableInfo, -1, &pTableInfo, 0); + free(zTableInfo); + if( rc!=SQLITE_OK || !pTableInfo ){ + return 1; + } + + zSelect = appendText(zSelect, "SELECT 'INSERT INTO ' || ", 0); + zTmp = appendText(zTmp, zTable, '"'); + if( zTmp ){ + zSelect = appendText(zSelect, zTmp, '\''); + } + zSelect = appendText(zSelect, " || ' VALUES(' || ", 0); + rc = sqlite3_step(pTableInfo); + while( rc==SQLITE_ROW ){ + const char *zText = (const char *)sqlite3_column_text(pTableInfo, 1); + zSelect = appendText(zSelect, "quote(", 0); + zSelect = appendText(zSelect, zText, '"'); + rc = sqlite3_step(pTableInfo); + if( rc==SQLITE_ROW ){ + zSelect = appendText(zSelect, ") || ',' || ", 0); + }else{ + zSelect = appendText(zSelect, ") ", 0); + } + nRow++; + } + rc = sqlite3_finalize(pTableInfo); + if( rc!=SQLITE_OK || nRow==0 ){ + free(zSelect); + return 1; + } + zSelect = appendText(zSelect, "|| ')' FROM ", 0); + zSelect = appendText(zSelect, zTable, '"'); + + rc = run_table_dump_query(p, zSelect, zPrepStmt); + if( rc==SQLITE_CORRUPT ){ + zSelect = appendText(zSelect, " ORDER BY rowid DESC", 0); + run_table_dump_query(p, zSelect, 0); + } + if( zSelect ) free(zSelect); + } + return 0; +} + +/* +** Run zQuery. Use dump_callback() as the callback routine so that +** the contents of the query are output as SQL statements. +** +** If we get a SQLITE_CORRUPT error, rerun the query after appending +** "ORDER BY rowid DESC" to the end. +*/ +static int run_schema_dump_query( + struct callback_data *p, + const char *zQuery +){ + int rc; + char *zErr = 0; + rc = sqlite3_exec(p->db, zQuery, dump_callback, p, &zErr); + if( rc==SQLITE_CORRUPT ){ + char *zQ2; + int len = strlen30(zQuery); + fprintf(p->out, "/****** CORRUPTION ERROR *******/\n"); + if( zErr ){ + fprintf(p->out, "/****** %s ******/\n", zErr); + sqlite3_free(zErr); + zErr = 0; + } + zQ2 = malloc( len+100 ); + if( zQ2==0 ) return rc; + sqlite3_snprintf(sizeof(zQ2), zQ2, "%s ORDER BY rowid DESC", zQuery); + rc = sqlite3_exec(p->db, zQ2, dump_callback, p, &zErr); + if( rc ){ + fprintf(p->out, "/****** ERROR: %s ******/\n", zErr); + }else{ + rc = SQLITE_CORRUPT; + } + sqlite3_free(zErr); + free(zQ2); + } + return rc; +} + +/* +** Text of a help message +*/ +static char zHelp[] = + ".backup ?DB? FILE Backup DB (default \"main\") to FILE\n" + ".bail ON|OFF Stop after hitting an error. Default OFF\n" + ".databases List names and files of attached databases\n" + ".dump ?TABLE? ... Dump the database in an SQL text format\n" + " If TABLE specified, only dump tables matching\n" + " LIKE pattern TABLE.\n" + ".echo ON|OFF Turn command echo on or off\n" + ".exit Exit this program\n" + ".explain ?ON|OFF? Turn output mode suitable for EXPLAIN on or off.\n" + " With no args, it turns EXPLAIN on.\n" + ".header(s) ON|OFF Turn display of headers on or off\n" + ".help Show this message\n" + ".import FILE TABLE Import data from FILE into TABLE\n" + ".indices ?TABLE? Show names of all indices\n" + " If TABLE specified, only show indices for tables\n" + " matching LIKE pattern TABLE.\n" +#ifdef SQLITE_ENABLE_IOTRACE + ".iotrace FILE Enable I/O diagnostic logging to FILE\n" +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + ".load FILE ?ENTRY? Load an extension library\n" +#endif + ".log FILE|off Turn logging on or off. FILE can be stderr/stdout\n" + ".mode MODE ?TABLE? Set output mode where MODE is one of:\n" + " csv Comma-separated values\n" + " column Left-aligned columns. (See .width)\n" + " html HTML code\n" + " insert SQL insert statements for TABLE\n" + " line One value per line\n" + " list Values delimited by .separator string\n" + " tabs Tab-separated values\n" + " tcl TCL list elements\n" + ".nullvalue STRING Print STRING in place of NULL values\n" + ".output FILENAME Send output to FILENAME\n" + ".output stdout Send output to the screen\n" + ".prompt MAIN CONTINUE Replace the standard prompts\n" + ".quit Exit this program\n" + ".read FILENAME Execute SQL in FILENAME\n" + ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE\n" + ".schema ?TABLE? Show the CREATE statements\n" + " If TABLE specified, only show tables matching\n" + " LIKE pattern TABLE.\n" + ".separator STRING Change separator used by output mode and .import\n" + ".show Show the current values for various settings\n" + ".stats ON|OFF Turn stats on or off\n" + ".tables ?TABLE? List names of tables\n" + " If TABLE specified, only list tables matching\n" + " LIKE pattern TABLE.\n" + ".timeout MS Try opening locked tables for MS milliseconds\n" + ".vfsname ?AUX? Print the name of the VFS stack\n" + ".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" +; + +static char zTimerHelp[] = + ".timer ON|OFF Turn the CPU timer measurement on or off\n" +; + +/* Forward reference */ +static int process_input(struct callback_data *p, FILE *in); + +/* +** Make sure the database is open. If it is not, then open it. If +** the database fails to open, print an error message and exit. +*/ +static void open_db(struct callback_data *p){ + if( p->db==0 ){ + sqlite3_open(p->zDbFilename, &p->db); + db = p->db; + if( db && sqlite3_errcode(db)==SQLITE_OK ){ + sqlite3_create_function(db, "shellstatic", 0, SQLITE_UTF8, 0, + shellstaticFunc, 0, 0); + } + if( db==0 || SQLITE_OK!=sqlite3_errcode(db) ){ + fprintf(stderr,"Error: unable to open database \"%s\": %s\n", + p->zDbFilename, sqlite3_errmsg(db)); + exit(1); + } +#ifndef SQLITE_OMIT_LOAD_EXTENSION + sqlite3_enable_load_extension(p->db, 1); +#endif + } +} + +/* +** Do C-language style dequoting. +** +** \t -> tab +** \n -> newline +** \r -> carriage return +** \NNN -> ascii character NNN in octal +** \\ -> backslash +*/ +static void resolve_backslashes(char *z){ + int i, j; + char c; + for(i=j=0; (c = z[i])!=0; i++, j++){ + if( c=='\\' ){ + c = z[++i]; + if( c=='n' ){ + c = '\n'; + }else if( c=='t' ){ + c = '\t'; + }else if( c=='r' ){ + c = '\r'; + }else if( c>='0' && c<='7' ){ + c -= '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + if( z[i+1]>='0' && z[i+1]<='7' ){ + i++; + c = (c<<3) + z[i] - '0'; + } + } + } + } + z[j] = c; + } + z[j] = 0; +} + +/* +** Interpret zArg as a boolean value. Return either 0 or 1. +*/ +static int booleanValue(char *zArg){ + int val = atoi(zArg); + int j; + for(j=0; zArg[j]; j++){ + zArg[j] = ToLower(zArg[j]); + } + if( strcmp(zArg,"on")==0 ){ + val = 1; + }else if( strcmp(zArg,"yes")==0 ){ + val = 1; + } + return val; +} + +/* +** If an input line begins with "." then invoke this routine to +** process that line. +** +** Return 1 on error, 2 to exit, and 0 otherwise. +*/ +static int do_meta_command(char *zLine, struct callback_data *p){ + int i = 1; + int nArg = 0; + int n, c; + int rc = 0; + char *azArg[50]; + + /* Parse the input line into tokens. + */ + while( zLine[i] && nArg=3 && strncmp(azArg[0], "backup", n)==0 && nArg>1 && nArg<4){ + const char *zDestFile; + const char *zDb; + sqlite3 *pDest; + sqlite3_backup *pBackup; + if( nArg==2 ){ + zDestFile = azArg[1]; + zDb = "main"; + }else{ + zDestFile = azArg[2]; + zDb = azArg[1]; + } + rc = sqlite3_open(zDestFile, &pDest); + if( rc!=SQLITE_OK ){ + fprintf(stderr, "Error: cannot open \"%s\"\n", zDestFile); + sqlite3_close(pDest); + return 1; + } + open_db(p); + pBackup = sqlite3_backup_init(pDest, "main", p->db, zDb); + if( pBackup==0 ){ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); + sqlite3_close(pDest); + return 1; + } + while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK ){} + sqlite3_backup_finish(pBackup); + if( rc==SQLITE_DONE ){ + rc = 0; + }else{ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(pDest)); + rc = 1; + } + sqlite3_close(pDest); + }else + + if( c=='b' && n>=3 && strncmp(azArg[0], "bail", n)==0 && nArg>1 && nArg<3 ){ + bail_on_error = booleanValue(azArg[1]); + }else + + if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 && nArg==1 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 1; + data.mode = MODE_Column; + data.colWidth[0] = 3; + data.colWidth[1] = 15; + data.colWidth[2] = 58; + data.cnt = 0; + sqlite3_exec(p->db, "PRAGMA database_list; ", callback, &data, &zErrMsg); + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + } + }else + + if( c=='d' && strncmp(azArg[0], "dump", n)==0 && nArg<3 ){ + open_db(p); + /* When playing back a "dump", the content might appear in an order + ** which causes immediate foreign key constraints to be violated. + ** So disable foreign-key constraint enforcement to prevent problems. */ + fprintf(p->out, "PRAGMA foreign_keys=OFF;\n"); + fprintf(p->out, "BEGIN TRANSACTION;\n"); + p->writableSchema = 0; + sqlite3_exec(p->db, "SAVEPOINT dump; PRAGMA writable_schema=ON", 0, 0, 0); + p->nErr = 0; + if( nArg==1 ){ + run_schema_dump_query(p, + "SELECT name, type, sql FROM sqlite_master " + "WHERE sql NOT NULL AND type=='table' AND name!='sqlite_sequence'" + ); + run_schema_dump_query(p, + "SELECT name, type, sql FROM sqlite_master " + "WHERE name=='sqlite_sequence'" + ); + run_table_dump_query(p, + "SELECT sql FROM sqlite_master " + "WHERE sql NOT NULL AND type IN ('index','trigger','view')", 0 + ); + }else{ + int i; + for(i=1; iwritableSchema ){ + fprintf(p->out, "PRAGMA writable_schema=OFF;\n"); + p->writableSchema = 0; + } + sqlite3_exec(p->db, "PRAGMA writable_schema=OFF;", 0, 0, 0); + sqlite3_exec(p->db, "RELEASE dump;", 0, 0, 0); + fprintf(p->out, p->nErr ? "ROLLBACK; -- due to errors\n" : "COMMIT;\n"); + }else + + if( c=='e' && strncmp(azArg[0], "echo", n)==0 && nArg>1 && nArg<3 ){ + p->echoOn = booleanValue(azArg[1]); + }else + + if( c=='e' && strncmp(azArg[0], "exit", n)==0 && nArg==1 ){ + rc = 2; + }else + + if( c=='e' && strncmp(azArg[0], "explain", n)==0 && nArg<3 ){ + int val = nArg>=2 ? booleanValue(azArg[1]) : 1; + if(val == 1) { + if(!p->explainPrev.valid) { + p->explainPrev.valid = 1; + p->explainPrev.mode = p->mode; + p->explainPrev.showHeader = p->showHeader; + memcpy(p->explainPrev.colWidth,p->colWidth,sizeof(p->colWidth)); + } + /* We could put this code under the !p->explainValid + ** condition so that it does not execute if we are already in + ** explain mode. However, always executing it allows us an easy + ** was to reset to explain mode in case the user previously + ** did an .explain followed by a .width, .mode or .header + ** command. + */ + p->mode = MODE_Explain; + p->showHeader = 1; + memset(p->colWidth,0,ArraySize(p->colWidth)); + p->colWidth[0] = 4; /* addr */ + p->colWidth[1] = 13; /* opcode */ + p->colWidth[2] = 4; /* P1 */ + p->colWidth[3] = 4; /* P2 */ + p->colWidth[4] = 4; /* P3 */ + p->colWidth[5] = 13; /* P4 */ + p->colWidth[6] = 2; /* P5 */ + p->colWidth[7] = 13; /* Comment */ + }else if (p->explainPrev.valid) { + p->explainPrev.valid = 0; + p->mode = p->explainPrev.mode; + p->showHeader = p->explainPrev.showHeader; + memcpy(p->colWidth,p->explainPrev.colWidth,sizeof(p->colWidth)); + } + }else + + if( c=='h' && (strncmp(azArg[0], "header", n)==0 || + strncmp(azArg[0], "headers", n)==0) && nArg>1 && nArg<3 ){ + p->showHeader = booleanValue(azArg[1]); + }else + + if( c=='h' && strncmp(azArg[0], "help", n)==0 ){ + fprintf(stderr,"%s",zHelp); + if( HAS_TIMER ){ + fprintf(stderr,"%s",zTimerHelp); + } + }else + + if( c=='i' && strncmp(azArg[0], "import", n)==0 && nArg==3 ){ + char *zTable = azArg[2]; /* Insert data into this table */ + char *zFile = azArg[1]; /* The file from which to extract data */ + sqlite3_stmt *pStmt = NULL; /* A statement */ + int nCol; /* Number of columns in the table */ + int nByte; /* Number of bytes in an SQL string */ + int i, j; /* Loop counters */ + int nSep; /* Number of bytes in p->separator[] */ + char *zSql; /* An SQL statement */ + char *zLine; /* A single line of input from the file */ + char **azCol; /* zLine[] broken up into columns */ + char *zCommit; /* How to commit changes */ + FILE *in; /* The input file */ + int lineno = 0; /* Line number of input file */ + + open_db(p); + nSep = strlen30(p->separator); + if( nSep==0 ){ + fprintf(stderr, "Error: non-null separator required for import\n"); + return 1; + } + zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); + if( zSql==0 ){ + fprintf(stderr, "Error: out of memory\n"); + return 1; + } + nByte = strlen30(zSql); + rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ){ + if (pStmt) sqlite3_finalize(pStmt); + fprintf(stderr,"Error: %s\n", sqlite3_errmsg(db)); + return 1; + } + nCol = sqlite3_column_count(pStmt); + sqlite3_finalize(pStmt); + pStmt = 0; + if( nCol==0 ) return 0; /* no columns, no error */ + zSql = malloc( nByte + 20 + nCol*2 ); + if( zSql==0 ){ + fprintf(stderr, "Error: out of memory\n"); + return 1; + } + sqlite3_snprintf(nByte+20, zSql, "INSERT INTO %s VALUES(?", zTable); + j = strlen30(zSql); + for(i=1; idb, zSql, -1, &pStmt, 0); + free(zSql); + if( rc ){ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db)); + if (pStmt) sqlite3_finalize(pStmt); + return 1; + } + in = fopen(zFile, "rb"); + if( in==0 ){ + fprintf(stderr, "Error: cannot open \"%s\"\n", zFile); + sqlite3_finalize(pStmt); + return 1; + } + azCol = malloc( sizeof(azCol[0])*(nCol+1) ); + if( azCol==0 ){ + fprintf(stderr, "Error: out of memory\n"); + fclose(in); + sqlite3_finalize(pStmt); + return 1; + } + sqlite3_exec(p->db, "BEGIN", 0, 0, 0); + zCommit = "COMMIT"; + while( (zLine = local_getline(0, in))!=0 ){ + char *z; + lineno++; + azCol[0] = zLine; + for(i=0, z=zLine; *z && *z!='\n' && *z!='\r'; z++){ + if( *z==p->separator[0] && strncmp(z, p->separator, nSep)==0 ){ + *z = 0; + i++; + if( idb, zCommit, 0, 0, 0); + }else + + if( c=='i' && strncmp(azArg[0], "indices", n)==0 && nArg<3 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.mode = MODE_List; + if( nArg==1 ){ + rc = sqlite3_exec(p->db, + "SELECT name FROM sqlite_master " + "WHERE type='index' AND name NOT LIKE 'sqlite_%' " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type='index' " + "ORDER BY 1", + callback, &data, &zErrMsg + ); + }else{ + zShellStatic = azArg[1]; + rc = sqlite3_exec(p->db, + "SELECT name FROM sqlite_master " + "WHERE type='index' AND tbl_name LIKE shellstatic() " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type='index' AND tbl_name LIKE shellstatic() " + "ORDER BY 1", + callback, &data, &zErrMsg + ); + zShellStatic = 0; + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + }else if( rc != SQLITE_OK ){ + fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n"); + rc = 1; + } + }else + +#ifdef SQLITE_ENABLE_IOTRACE + if( c=='i' && strncmp(azArg[0], "iotrace", n)==0 ){ + extern void (*sqlite3IoTrace)(const char*, ...); + if( iotrace && iotrace!=stdout ) fclose(iotrace); + iotrace = 0; + if( nArg<2 ){ + sqlite3IoTrace = 0; + }else if( strcmp(azArg[1], "-")==0 ){ + sqlite3IoTrace = iotracePrintf; + iotrace = stdout; + }else{ + iotrace = fopen(azArg[1], "w"); + if( iotrace==0 ){ + fprintf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); + sqlite3IoTrace = 0; + rc = 1; + }else{ + sqlite3IoTrace = iotracePrintf; + } + } + }else +#endif + +#ifndef SQLITE_OMIT_LOAD_EXTENSION + if( c=='l' && strncmp(azArg[0], "load", n)==0 && nArg>=2 ){ + const char *zFile, *zProc; + char *zErrMsg = 0; + zFile = azArg[1]; + zProc = nArg>=3 ? azArg[2] : 0; + open_db(p); + rc = sqlite3_load_extension(p->db, zFile, zProc, &zErrMsg); + if( rc!=SQLITE_OK ){ + fprintf(stderr, "Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + } + }else +#endif + + if( c=='l' && strncmp(azArg[0], "log", n)==0 && nArg>=2 ){ + const char *zFile = azArg[1]; + if( p->pLog && p->pLog!=stdout && p->pLog!=stderr ){ + fclose(p->pLog); + p->pLog = 0; + } + if( strcmp(zFile,"stdout")==0 ){ + p->pLog = stdout; + }else if( strcmp(zFile, "stderr")==0 ){ + p->pLog = stderr; + }else if( strcmp(zFile, "off")==0 ){ + p->pLog = 0; + }else{ + p->pLog = fopen(zFile, "w"); + if( p->pLog==0 ){ + fprintf(stderr, "Error: cannot open \"%s\"\n", zFile); + } + } + }else + + if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==2 ){ + int n2 = strlen30(azArg[1]); + if( (n2==4 && strncmp(azArg[1],"line",n2)==0) + || + (n2==5 && strncmp(azArg[1],"lines",n2)==0) ){ + p->mode = MODE_Line; + }else if( (n2==6 && strncmp(azArg[1],"column",n2)==0) + || + (n2==7 && strncmp(azArg[1],"columns",n2)==0) ){ + p->mode = MODE_Column; + }else if( n2==4 && strncmp(azArg[1],"list",n2)==0 ){ + p->mode = MODE_List; + }else if( n2==4 && strncmp(azArg[1],"html",n2)==0 ){ + p->mode = MODE_Html; + }else if( n2==3 && strncmp(azArg[1],"tcl",n2)==0 ){ + p->mode = MODE_Tcl; + }else if( n2==3 && strncmp(azArg[1],"csv",n2)==0 ){ + p->mode = MODE_Csv; + sqlite3_snprintf(sizeof(p->separator), p->separator, ","); + }else if( n2==4 && strncmp(azArg[1],"tabs",n2)==0 ){ + p->mode = MODE_List; + sqlite3_snprintf(sizeof(p->separator), p->separator, "\t"); + }else if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){ + p->mode = MODE_Insert; + set_table_name(p, "table"); + }else { + fprintf(stderr,"Error: mode should be one of: " + "column csv html insert line list tabs tcl\n"); + rc = 1; + } + }else + + if( c=='m' && strncmp(azArg[0], "mode", n)==0 && nArg==3 ){ + int n2 = strlen30(azArg[1]); + if( n2==6 && strncmp(azArg[1],"insert",n2)==0 ){ + p->mode = MODE_Insert; + set_table_name(p, azArg[2]); + }else { + fprintf(stderr, "Error: invalid arguments: " + " \"%s\". Enter \".help\" for help\n", azArg[2]); + rc = 1; + } + }else + + if( c=='n' && strncmp(azArg[0], "nullvalue", n)==0 && nArg==2 ) { + sqlite3_snprintf(sizeof(p->nullvalue), p->nullvalue, + "%.*s", (int)ArraySize(p->nullvalue)-1, azArg[1]); + }else + + if( c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2 ){ + if( p->out!=stdout ){ + fclose(p->out); + } + if( strcmp(azArg[1],"stdout")==0 ){ + p->out = stdout; + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "stdout"); + }else{ + p->out = fopen(azArg[1], "wb"); + if( p->out==0 ){ + fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]); + p->out = stdout; + rc = 1; + } else { + sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); + } + } + }else + + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 && (nArg==2 || nArg==3)){ + if( nArg >= 2) { + strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); + } + if( nArg >= 3) { + strncpy(continuePrompt,azArg[2],(int)ArraySize(continuePrompt)-1); + } + }else + + if( c=='q' && strncmp(azArg[0], "quit", n)==0 && nArg==1 ){ + rc = 2; + }else + + if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 && nArg==2 ){ + FILE *alt = fopen(azArg[1], "rb"); + if( alt==0 ){ + fprintf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); + rc = 1; + }else{ + rc = process_input(p, alt); + fclose(alt); + } + }else + + if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 && nArg>1 && nArg<4){ + const char *zSrcFile; + const char *zDb; + sqlite3 *pSrc; + sqlite3_backup *pBackup; + int nTimeout = 0; + + if( nArg==2 ){ + zSrcFile = azArg[1]; + zDb = "main"; + }else{ + zSrcFile = azArg[2]; + zDb = azArg[1]; + } + rc = sqlite3_open(zSrcFile, &pSrc); + if( rc!=SQLITE_OK ){ + fprintf(stderr, "Error: cannot open \"%s\"\n", zSrcFile); + sqlite3_close(pSrc); + return 1; + } + open_db(p); + pBackup = sqlite3_backup_init(p->db, zDb, pSrc, "main"); + if( pBackup==0 ){ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); + sqlite3_close(pSrc); + return 1; + } + while( (rc = sqlite3_backup_step(pBackup,100))==SQLITE_OK + || rc==SQLITE_BUSY ){ + if( rc==SQLITE_BUSY ){ + if( nTimeout++ >= 3 ) break; + sqlite3_sleep(100); + } + } + sqlite3_backup_finish(pBackup); + if( rc==SQLITE_DONE ){ + rc = 0; + }else if( rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + fprintf(stderr, "Error: source database is busy\n"); + rc = 1; + }else{ + fprintf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); + rc = 1; + } + sqlite3_close(pSrc); + }else + + if( c=='s' && strncmp(azArg[0], "schema", n)==0 && nArg<3 ){ + struct callback_data data; + char *zErrMsg = 0; + open_db(p); + memcpy(&data, p, sizeof(data)); + data.showHeader = 0; + data.mode = MODE_Semi; + if( nArg>1 ){ + int i; + for(i=0; azArg[1][i]; i++) azArg[1][i] = ToLower(azArg[1][i]); + if( strcmp(azArg[1],"sqlite_master")==0 ){ + char *new_argv[2], *new_colv[2]; + new_argv[0] = "CREATE TABLE sqlite_master (\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")"; + new_argv[1] = 0; + new_colv[0] = "sql"; + new_colv[1] = 0; + callback(&data, 1, new_argv, new_colv); + rc = SQLITE_OK; + }else if( strcmp(azArg[1],"sqlite_temp_master")==0 ){ + char *new_argv[2], *new_colv[2]; + new_argv[0] = "CREATE TEMP TABLE sqlite_temp_master (\n" + " type text,\n" + " name text,\n" + " tbl_name text,\n" + " rootpage integer,\n" + " sql text\n" + ")"; + new_argv[1] = 0; + new_colv[0] = "sql"; + new_colv[1] = 0; + callback(&data, 1, new_argv, new_colv); + rc = SQLITE_OK; + }else{ + zShellStatic = azArg[1]; + rc = sqlite3_exec(p->db, + "SELECT sql FROM " + " (SELECT sql sql, type type, tbl_name tbl_name, name name" + " FROM sqlite_master UNION ALL" + " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " + "WHERE lower(tbl_name) LIKE shellstatic()" + " AND type!='meta' AND sql NOTNULL " + "ORDER BY substr(type,2,1), name", + callback, &data, &zErrMsg); + zShellStatic = 0; + } + }else{ + rc = sqlite3_exec(p->db, + "SELECT sql FROM " + " (SELECT sql sql, type type, tbl_name tbl_name, name name" + " FROM sqlite_master UNION ALL" + " SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " + "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%'" + "ORDER BY substr(type,2,1), name", + callback, &data, &zErrMsg + ); + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + }else if( rc != SQLITE_OK ){ + fprintf(stderr,"Error: querying schema information\n"); + rc = 1; + }else{ + rc = 0; + } + }else + + if( c=='s' && strncmp(azArg[0], "separator", n)==0 && nArg==2 ){ + sqlite3_snprintf(sizeof(p->separator), p->separator, + "%.*s", (int)sizeof(p->separator)-1, azArg[1]); + }else + + if( c=='s' && strncmp(azArg[0], "show", n)==0 && nArg==1 ){ + int i; + fprintf(p->out,"%9.9s: %s\n","echo", p->echoOn ? "on" : "off"); + fprintf(p->out,"%9.9s: %s\n","explain", p->explainPrev.valid ? "on" :"off"); + fprintf(p->out,"%9.9s: %s\n","headers", p->showHeader ? "on" : "off"); + fprintf(p->out,"%9.9s: %s\n","mode", modeDescr[p->mode]); + fprintf(p->out,"%9.9s: ", "nullvalue"); + output_c_string(p->out, p->nullvalue); + fprintf(p->out, "\n"); + fprintf(p->out,"%9.9s: %s\n","output", + strlen30(p->outfile) ? p->outfile : "stdout"); + fprintf(p->out,"%9.9s: ", "separator"); + output_c_string(p->out, p->separator); + fprintf(p->out, "\n"); + fprintf(p->out,"%9.9s: %s\n","stats", p->statsOn ? "on" : "off"); + fprintf(p->out,"%9.9s: ","width"); + for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { + fprintf(p->out,"%d ",p->colWidth[i]); + } + fprintf(p->out,"\n"); + }else + + if( c=='s' && strncmp(azArg[0], "stats", n)==0 && nArg>1 && nArg<3 ){ + p->statsOn = booleanValue(azArg[1]); + }else + + if( c=='t' && n>1 && strncmp(azArg[0], "tables", n)==0 && nArg<3 ){ + char **azResult; + int nRow; + char *zErrMsg; + open_db(p); + if( nArg==1 ){ + rc = sqlite3_get_table(p->db, + "SELECT name FROM sqlite_master " + "WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type IN ('table','view') " + "ORDER BY 1", + &azResult, &nRow, 0, &zErrMsg + ); + }else{ + zShellStatic = azArg[1]; + rc = sqlite3_get_table(p->db, + "SELECT name FROM sqlite_master " + "WHERE type IN ('table','view') AND name LIKE shellstatic() " + "UNION ALL " + "SELECT name FROM sqlite_temp_master " + "WHERE type IN ('table','view') AND name LIKE shellstatic() " + "ORDER BY 1", + &azResult, &nRow, 0, &zErrMsg + ); + zShellStatic = 0; + } + if( zErrMsg ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + sqlite3_free(zErrMsg); + rc = 1; + }else if( rc != SQLITE_OK ){ + fprintf(stderr,"Error: querying sqlite_master and sqlite_temp_master\n"); + rc = 1; + }else{ + int len, maxlen = 0; + int i, j; + int nPrintCol, nPrintRow; + for(i=1; i<=nRow; i++){ + if( azResult[i]==0 ) continue; + len = strlen30(azResult[i]); + if( len>maxlen ) maxlen = len; + } + nPrintCol = 80/(maxlen+2); + if( nPrintCol<1 ) nPrintCol = 1; + nPrintRow = (nRow + nPrintCol - 1)/nPrintCol; + for(i=0; i=8 && strncmp(azArg[0], "testctrl", n)==0 && nArg>=2 ){ + static const struct { + const char *zCtrlName; /* Name of a test-control option */ + int ctrlCode; /* Integer code for that option */ + } aCtrl[] = { + { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE }, + { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE }, + { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET }, + { "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST }, + { "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL }, + { "benign_malloc_hooks", SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS }, + { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE }, + { "assert", SQLITE_TESTCTRL_ASSERT }, + { "always", SQLITE_TESTCTRL_ALWAYS }, + { "reserve", SQLITE_TESTCTRL_RESERVE }, + { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS }, + { "iskeyword", SQLITE_TESTCTRL_ISKEYWORD }, + { "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC }, + }; + int testctrl = -1; + int rc = 0; + int i, n; + open_db(p); + + /* convert testctrl text option to value. allow any unique prefix + ** of the option name, or a numerical value. */ + n = strlen30(azArg[1]); + for(i=0; i<(int)(sizeof(aCtrl)/sizeof(aCtrl[0])); i++){ + if( strncmp(azArg[1], aCtrl[i].zCtrlName, n)==0 ){ + if( testctrl<0 ){ + testctrl = aCtrl[i].ctrlCode; + }else{ + fprintf(stderr, "ambiguous option name: \"%s\"\n", azArg[1]); + testctrl = -1; + break; + } + } + } + if( testctrl<0 ) testctrl = atoi(azArg[1]); + if( (testctrlSQLITE_TESTCTRL_LAST) ){ + fprintf(stderr,"Error: invalid testctrl option: %s\n", azArg[1]); + }else{ + switch(testctrl){ + + /* sqlite3_test_control(int, db, int) */ + case SQLITE_TESTCTRL_OPTIMIZATIONS: + case SQLITE_TESTCTRL_RESERVE: + if( nArg==3 ){ + int opt = (int)strtol(azArg[2], 0, 0); + rc = sqlite3_test_control(testctrl, p->db, opt); + printf("%d (0x%08x)\n", rc, rc); + } else { + fprintf(stderr,"Error: testctrl %s takes a single int option\n", + azArg[1]); + } + break; + + /* sqlite3_test_control(int) */ + case SQLITE_TESTCTRL_PRNG_SAVE: + case SQLITE_TESTCTRL_PRNG_RESTORE: + case SQLITE_TESTCTRL_PRNG_RESET: + if( nArg==2 ){ + rc = sqlite3_test_control(testctrl); + printf("%d (0x%08x)\n", rc, rc); + } else { + fprintf(stderr,"Error: testctrl %s takes no options\n", azArg[1]); + } + break; + + /* sqlite3_test_control(int, uint) */ + case SQLITE_TESTCTRL_PENDING_BYTE: + if( nArg==3 ){ + unsigned int opt = (unsigned int)atoi(azArg[2]); + rc = sqlite3_test_control(testctrl, opt); + printf("%d (0x%08x)\n", rc, rc); + } else { + fprintf(stderr,"Error: testctrl %s takes a single unsigned" + " int option\n", azArg[1]); + } + break; + + /* sqlite3_test_control(int, int) */ + case SQLITE_TESTCTRL_ASSERT: + case SQLITE_TESTCTRL_ALWAYS: + if( nArg==3 ){ + int opt = atoi(azArg[2]); + rc = sqlite3_test_control(testctrl, opt); + printf("%d (0x%08x)\n", rc, rc); + } else { + fprintf(stderr,"Error: testctrl %s takes a single int option\n", + azArg[1]); + } + break; + + /* sqlite3_test_control(int, char *) */ +#ifdef SQLITE_N_KEYWORD + case SQLITE_TESTCTRL_ISKEYWORD: + if( nArg==3 ){ + const char *opt = azArg[2]; + rc = sqlite3_test_control(testctrl, opt); + printf("%d (0x%08x)\n", rc, rc); + } else { + fprintf(stderr,"Error: testctrl %s takes a single char * option\n", + azArg[1]); + } + break; +#endif + + case SQLITE_TESTCTRL_BITVEC_TEST: + case SQLITE_TESTCTRL_FAULT_INSTALL: + case SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: + case SQLITE_TESTCTRL_SCRATCHMALLOC: + default: + fprintf(stderr,"Error: CLI support for testctrl %s not implemented\n", + azArg[1]); + break; + } + } + }else + + if( c=='t' && n>4 && strncmp(azArg[0], "timeout", n)==0 && nArg==2 ){ + open_db(p); + sqlite3_busy_timeout(p->db, atoi(azArg[1])); + }else + + if( HAS_TIMER && c=='t' && n>=5 && strncmp(azArg[0], "timer", n)==0 + && nArg==2 + ){ + enableTimer = booleanValue(azArg[1]); + }else + + if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ + printf("SQLite %s %s\n" /*extra-version-info*/, + sqlite3_libversion(), sqlite3_sourceid()); + }else + + if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ + const char *zDbName = nArg==2 ? azArg[1] : "main"; + char *zVfsName = 0; + if( p->db ){ + sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); + if( zVfsName ){ + printf("%s\n", zVfsName); + sqlite3_free(zVfsName); + } + } + }else + + if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){ + int j; + assert( nArg<=ArraySize(azArg) ); + for(j=1; jcolWidth); j++){ + p->colWidth[j-1] = atoi(azArg[j]); + } + }else + + { + fprintf(stderr, "Error: unknown command or invalid arguments: " + " \"%s\". Enter \".help\" for help\n", azArg[0]); + rc = 1; + } + + return rc; +} + +/* +** Return TRUE if a semicolon occurs anywhere in the first N characters +** of string z[]. +*/ +static int _contains_semicolon(const char *z, int N){ + int i; + for(i=0; iout); + free(zLine); + zLine = one_input_line(zSql, in); + if( zLine==0 ){ + break; /* We have reached EOF */ + } + if( seenInterrupt ){ + if( in!=0 ) break; + seenInterrupt = 0; + } + lineno++; + if( (zSql==0 || zSql[0]==0) && _all_whitespace(zLine) ) continue; + if( zLine && zLine[0]=='.' && nSql==0 ){ + if( p->echoOn ) printf("%s\n", zLine); + rc = do_meta_command(zLine, p); + if( rc==2 ){ /* exit requested */ + break; + }else if( rc ){ + errCnt++; + } + continue; + } + if( _is_command_terminator(zLine) && _is_complete(zSql, nSql) ){ + memcpy(zLine,";",2); + } + nSqlPrior = nSql; + if( zSql==0 ){ + int i; + for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} + if( zLine[i]!=0 ){ + nSql = strlen30(zLine); + zSql = malloc( nSql+3 ); + if( zSql==0 ){ + fprintf(stderr, "Error: out of memory\n"); + exit(1); + } + memcpy(zSql, zLine, nSql+1); + startline = lineno; + } + }else{ + int len = strlen30(zLine); + zSql = realloc( zSql, nSql + len + 4 ); + if( zSql==0 ){ + fprintf(stderr,"Error: out of memory\n"); + exit(1); + } + zSql[nSql++] = '\n'; + memcpy(&zSql[nSql], zLine, len+1); + nSql += len; + } + if( zSql && _contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) + && sqlite3_complete(zSql) ){ + p->cnt = 0; + open_db(p); + BEGIN_TIMER; + rc = shell_exec(p->db, zSql, shell_callback, p, &zErrMsg); + END_TIMER; + if( rc || zErrMsg ){ + char zPrefix[100]; + if( in!=0 || !stdin_is_interactive ){ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, + "Error: near line %d:", startline); + }else{ + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "Error:"); + } + if( zErrMsg!=0 ){ + fprintf(stderr, "%s %s\n", zPrefix, zErrMsg); + sqlite3_free(zErrMsg); + zErrMsg = 0; + }else{ + fprintf(stderr, "%s %s\n", zPrefix, sqlite3_errmsg(p->db)); + } + errCnt++; + } + free(zSql); + zSql = 0; + nSql = 0; + } + } + if( zSql ){ + if( !_all_whitespace(zSql) ){ + fprintf(stderr, "Error: incomplete SQL: %s\n", zSql); + } + free(zSql); + } + free(zLine); + return errCnt; +} + +/* +** Return a pathname which is the user's home directory. A +** 0 return indicates an error of some kind. Space to hold the +** resulting string is obtained from malloc(). The calling +** function should free the result. +*/ +static char *find_home_dir(void){ + char *home_dir = NULL; + +#if !defined(_WIN32) && !defined(WIN32) && !defined(__OS2__) && !defined(_WIN32_WCE) && !defined(__RTP__) && !defined(_WRS_KERNEL) + struct passwd *pwent; + uid_t uid = getuid(); + if( (pwent=getpwuid(uid)) != NULL) { + home_dir = pwent->pw_dir; + } +#endif + +#if defined(_WIN32_WCE) + /* Windows CE (arm-wince-mingw32ce-gcc) does not provide getenv() + */ + home_dir = strdup("/"); +#else + +#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) + if (!home_dir) { + home_dir = getenv("USERPROFILE"); + } +#endif + + if (!home_dir) { + home_dir = getenv("HOME"); + } + +#if defined(_WIN32) || defined(WIN32) || defined(__OS2__) + if (!home_dir) { + char *zDrive, *zPath; + int n; + zDrive = getenv("HOMEDRIVE"); + zPath = getenv("HOMEPATH"); + if( zDrive && zPath ){ + n = strlen30(zDrive) + strlen30(zPath) + 1; + home_dir = malloc( n ); + if( home_dir==0 ) return 0; + sqlite3_snprintf(n, home_dir, "%s%s", zDrive, zPath); + return home_dir; + } + home_dir = "c:\\"; + } +#endif + +#endif /* !_WIN32_WCE */ + + if( home_dir ){ + int n = strlen30(home_dir) + 1; + char *z = malloc( n ); + if( z ) memcpy(z, home_dir, n); + home_dir = z; + } + + return home_dir; +} + +/* +** Read input from the file given by sqliterc_override. Or if that +** parameter is NULL, take input from ~/.sqliterc +** +** Returns the number of errors. +*/ +static int process_sqliterc( + struct callback_data *p, /* Configuration data */ + const char *sqliterc_override /* Name of config file. NULL to use default */ +){ + char *home_dir = NULL; + const char *sqliterc = sqliterc_override; + char *zBuf = 0; + FILE *in = NULL; + int nBuf; + int rc = 0; + + if (sqliterc == NULL) { + home_dir = find_home_dir(); + if( home_dir==0 ){ +#if !defined(__RTP__) && !defined(_WRS_KERNEL) + fprintf(stderr,"%s: Error: cannot locate your home directory\n", Argv0); +#endif + return 1; + } + nBuf = strlen30(home_dir) + 16; + zBuf = malloc( nBuf ); + if( zBuf==0 ){ + fprintf(stderr,"%s: Error: out of memory\n",Argv0); + return 1; + } + sqlite3_snprintf(nBuf, zBuf,"%s/.sqliterc",home_dir); + free(home_dir); + sqliterc = (const char*)zBuf; + } + in = fopen(sqliterc,"rb"); + if( in ){ + if( stdin_is_interactive ){ + fprintf(stderr,"-- Loading resources from %s\n",sqliterc); + } + rc = process_input(p,in); + fclose(in); + } + free(zBuf); + return rc; +} + +/* +** Show available command line options +*/ +static const char zOptions[] = + " -help show this message\n" + " -init filename read/process named file\n" + " -echo print commands before execution\n" + " -[no]header turn headers on or off\n" + " -bail stop after hitting an error\n" + " -interactive force interactive I/O\n" + " -batch force batch I/O\n" + " -column set output mode to 'column'\n" + " -csv set output mode to 'csv'\n" + " -html set output mode to HTML\n" + " -line set output mode to 'line'\n" + " -list set output mode to 'list'\n" + " -separator 'x' set output field separator (|)\n" + " -stats print memory stats before each finalize\n" + " -nullvalue 'text' set text string for NULL values\n" + " -version show SQLite version\n" + " -vfs NAME use NAME as the default VFS\n" +#ifdef SQLITE_ENABLE_VFSTRACE + " -vfstrace enable tracing of all VFS calls\n" +#endif +#ifdef SQLITE_ENABLE_MULTIPLEX + " -multiplex enable the multiplexor VFS\n" +#endif +; +static void usage(int showDetail){ + fprintf(stderr, + "Usage: %s [OPTIONS] FILENAME [SQL]\n" + "FILENAME is the name of an SQLite database. A new database is created\n" + "if the file does not previously exist.\n", Argv0); + if( showDetail ){ + fprintf(stderr, "OPTIONS include:\n%s", zOptions); + }else{ + fprintf(stderr, "Use the -help option for additional information\n"); + } + exit(1); +} + +/* +** Initialize the state information in data +*/ +static void main_init(struct callback_data *data) { + memset(data, 0, sizeof(*data)); + data->mode = MODE_List; + memcpy(data->separator,"|", 2); + data->showHeader = 0; + sqlite3_config(SQLITE_CONFIG_URI, 1); + sqlite3_config(SQLITE_CONFIG_LOG, shellLog, data); + sqlite3_snprintf(sizeof(mainPrompt), mainPrompt,"sqlite> "); + sqlite3_snprintf(sizeof(continuePrompt), continuePrompt," ...> "); + sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); +} + +int main(int argc, char **argv){ + char *zErrMsg = 0; + struct callback_data data; + const char *zInitFile = 0; + char *zFirstCmd = 0; + int i; + int rc = 0; + + if( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)!=0 ){ + fprintf(stderr, "SQLite header and source version mismatch\n%s\n%s\n", + sqlite3_sourceid(), SQLITE_SOURCE_ID); + exit(1); + } + Argv0 = argv[0]; + main_init(&data); + stdin_is_interactive = isatty(0); + + /* Make sure we have a valid signal handler early, before anything + ** else is done. + */ +#ifdef SIGINT + signal(SIGINT, interrupt_handler); +#endif + + /* Do an initial pass through the command-line argument to locate + ** the name of the database file, the name of the initialization file, + ** the size of the alternative malloc heap, + ** and the first command to execute. + */ + for(i=1; i0x7fff0000 ) szHeap = 0x7fff0000; + sqlite3_config(SQLITE_CONFIG_HEAP, malloc((int)szHeap), (int)szHeap, 64); +#endif +#ifdef SQLITE_ENABLE_VFSTRACE + }else if( strcmp(argv[i],"-vfstrace")==0 ){ + extern int vfstrace_register( + const char *zTraceName, + const char *zOldVfsName, + int (*xOut)(const char*,void*), + void *pOutArg, + int makeDefault + ); + vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1); +#endif +#ifdef SQLITE_ENABLE_MULTIPLEX + }else if( strcmp(argv[i],"-multiplex")==0 ){ + extern int sqlite3_multiple_initialize(const char*,int); + sqlite3_multiplex_initialize(0, 1); +#endif + }else if( strcmp(argv[i],"-vfs")==0 ){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(argv[++i]); + if( pVfs ){ + sqlite3_vfs_register(pVfs, 1); + }else{ + fprintf(stderr, "no such VFS: \"%s\"\n", argv[i]); + exit(1); + } + } + } + if( i0 ){ + return rc; + } + + /* Make a second pass through the command-line argument and set + ** options. This second pass is delayed until after the initialization + ** file is processed so that the command-line arguments will override + ** settings in the initialization file. + */ + for(i=1; i=argc){ + fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z); + fprintf(stderr,"Use -help for a list of options.\n"); + return 1; + } + sqlite3_snprintf(sizeof(data.separator), data.separator, + "%.*s",(int)sizeof(data.separator)-1,argv[i]); + }else if( strcmp(z,"-nullvalue")==0 ){ + i++; + if(i>=argc){ + fprintf(stderr,"%s: Error: missing argument for option: %s\n", Argv0, z); + fprintf(stderr,"Use -help for a list of options.\n"); + return 1; + } + sqlite3_snprintf(sizeof(data.nullvalue), data.nullvalue, + "%.*s",(int)sizeof(data.nullvalue)-1,argv[i]); + }else if( strcmp(z,"-header")==0 ){ + data.showHeader = 1; + }else if( strcmp(z,"-noheader")==0 ){ + data.showHeader = 0; + }else if( strcmp(z,"-echo")==0 ){ + data.echoOn = 1; + }else if( strcmp(z,"-stats")==0 ){ + data.statsOn = 1; + }else if( strcmp(z,"-bail")==0 ){ + bail_on_error = 1; + }else if( strcmp(z,"-version")==0 ){ + printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid()); + return 0; + }else if( strcmp(z,"-interactive")==0 ){ + stdin_is_interactive = 1; + }else if( strcmp(z,"-batch")==0 ){ + stdin_is_interactive = 0; + }else if( strcmp(z,"-heap")==0 ){ + i++; + }else if( strcmp(z,"-vfs")==0 ){ + i++; +#ifdef SQLITE_ENABLE_VFSTRACE + }else if( strcmp(z,"-vfstrace")==0 ){ + i++; +#endif +#ifdef SQLITE_ENABLE_MULTIPLEX + }else if( strcmp(z,"-multiplex")==0 ){ + i++; +#endif + }else if( strcmp(z,"-help")==0 || strcmp(z, "--help")==0 ){ + usage(1); + }else{ + fprintf(stderr,"%s: Error: unknown option: %s\n", Argv0, z); + fprintf(stderr,"Use -help for a list of options.\n"); + return 1; + } + } + + if( zFirstCmd ){ + /* Run just the command that follows the database name + */ + if( zFirstCmd[0]=='.' ){ + rc = do_meta_command(zFirstCmd, &data); + }else{ + open_db(&data); + rc = shell_exec(data.db, zFirstCmd, shell_callback, &data, &zErrMsg); + if( zErrMsg!=0 ){ + fprintf(stderr,"Error: %s\n", zErrMsg); + return rc!=0 ? rc : 1; + }else if( rc!=0 ){ + fprintf(stderr,"Error: unable to process SQL \"%s\"\n", zFirstCmd); + return rc; + } + } + }else{ + /* Run commands received from standard input + */ + if( stdin_is_interactive ){ + char *zHome; + char *zHistory = 0; + int nHistory; + printf( + "SQLite version %s %.19s\n" /*extra-version-info*/ + "Enter \".help\" for instructions\n" + "Enter SQL statements terminated with a \";\"\n", + sqlite3_libversion(), sqlite3_sourceid() + ); + zHome = find_home_dir(); + if( zHome ){ + nHistory = strlen30(zHome) + 20; + if( (zHistory = malloc(nHistory))!=0 ){ + sqlite3_snprintf(nHistory, zHistory,"%s/.sqlite_history", zHome); + } + } +#if defined(HAVE_READLINE) && HAVE_READLINE==1 + if( zHistory ) read_history(zHistory); +#endif + rc = process_input(&data, 0); + if( zHistory ){ + stifle_history(100); + write_history(zHistory); + free(zHistory); + } + free(zHome); + }else{ + rc = process_input(&data, stdin); + } + } + set_table_name(&data, 0); + if( data.db ){ + sqlite3_close(data.db); + } + return rc; +} diff --git a/PitsideConsole/ArtLib/ArtSQL/sqlite3.c b/PitsideConsole/ArtLib/ArtSQL/sqlite3.c new file mode 100644 index 0000000..b4683fa --- /dev/null +++ b/PitsideConsole/ArtLib/ArtSQL/sqlite3.c @@ -0,0 +1,133612 @@ +/****************************************************************************** +** This file is an amalgamation of many separate C source files from SQLite +** version 3.7.10. By combining all the individual C code files into this +** single large file, the entire code can be compiled as a single translation +** unit. This allows many compilers to do optimizations that would not be +** possible if the files were compiled separately. Performance improvements +** of 5% or more are commonly seen when SQLite is compiled as a single +** translation unit. +** +** This file is all you need to compile SQLite. To use SQLite in other +** programs, you need this file and the "sqlite3.h" header file that defines +** the programming interface to the SQLite library. (If you do not have +** the "sqlite3.h" header file at hand, you will find a copy embedded within +** the text of this file. Search for "Begin file sqlite3.h" to find the start +** of the embedded sqlite3.h header file.) Additional code files may be needed +** if you want a wrapper to interface SQLite with your choice of programming +** language. The code for the "sqlite3" command-line shell is also in a +** separate file. This file contains only code for the core SQLite library. +*/ + +#define SQLITE_CORE 1 +#define SQLITE_AMALGAMATION 1 +#ifndef SQLITE_PRIVATE +# define SQLITE_PRIVATE static +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +/************** Begin file sqliteInt.h ***************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Internal interface definitions for SQLite. +** +*/ +#ifndef _SQLITEINT_H_ +#define _SQLITEINT_H_ + +/* +** These #defines should enable >2GB file support on POSIX if the +** underlying operating system supports it. If the OS lacks +** large file support, or if the OS is windows, these should be no-ops. +** +** Ticket #2739: The _LARGEFILE_SOURCE macro must appear before any +** system #includes. Hence, this block of code must be the very first +** code in all source files. +** +** Large file support can be disabled using the -DSQLITE_DISABLE_LFS switch +** on the compiler command line. This is necessary if you are compiling +** on a recent machine (ex: Red Hat 7.2) but you want your code to work +** on an older machine (ex: Red Hat 6.0). If you compile on Red Hat 7.2 +** without this option, LFS is enable. But LFS does not exist in the kernel +** in Red Hat 6.0, so the code won't work. Hence, for maximum binary +** portability you should omit LFS. +** +** Similar is true for Mac OS X. LFS is only supported on Mac OS X 9 and later. +*/ +#ifndef SQLITE_DISABLE_LFS +# define _LARGE_FILE 1 +# ifndef _FILE_OFFSET_BITS +# define _FILE_OFFSET_BITS 64 +# endif +# define _LARGEFILE_SOURCE 1 +#endif + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#ifdef _HAVE_SQLITE_CONFIG_H +#include "config.h" +#endif + +/************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ +/************** Begin file sqliteLimit.h *************************************/ +/* +** 2007 May 7 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file defines various limits of what SQLite can process. +*/ + +/* +** The maximum length of a TEXT or BLOB in bytes. This also +** limits the size of a row in a table or index. +** +** The hard limit is the ability of a 32-bit signed integer +** to count the size: 2^31-1 or 2147483647. +*/ +#ifndef SQLITE_MAX_LENGTH +# define SQLITE_MAX_LENGTH 1000000000 +#endif + +/* +** This is the maximum number of +** +** * Columns in a table +** * Columns in an index +** * Columns in a view +** * Terms in the SET clause of an UPDATE statement +** * Terms in the result set of a SELECT statement +** * Terms in the GROUP BY or ORDER BY clauses of a SELECT statement. +** * Terms in the VALUES clause of an INSERT statement +** +** The hard upper limit here is 32676. Most database people will +** tell you that in a well-normalized database, you usually should +** not have more than a dozen or so columns in any table. And if +** that is the case, there is no point in having more than a few +** dozen values in any of the other situations described above. +*/ +#ifndef SQLITE_MAX_COLUMN +# define SQLITE_MAX_COLUMN 2000 +#endif + +/* +** The maximum length of a single SQL statement in bytes. +** +** It used to be the case that setting this value to zero would +** turn the limit off. That is no longer true. It is not possible +** to turn this limit off. +*/ +#ifndef SQLITE_MAX_SQL_LENGTH +# define SQLITE_MAX_SQL_LENGTH 1000000000 +#endif + +/* +** The maximum depth of an expression tree. This is limited to +** some extent by SQLITE_MAX_SQL_LENGTH. But sometime you might +** want to place more severe limits on the complexity of an +** expression. +** +** A value of 0 used to mean that the limit was not enforced. +** But that is no longer true. The limit is now strictly enforced +** at all times. +*/ +#ifndef SQLITE_MAX_EXPR_DEPTH +# define SQLITE_MAX_EXPR_DEPTH 1000 +#endif + +/* +** The maximum number of terms in a compound SELECT statement. +** The code generator for compound SELECT statements does one +** level of recursion for each term. A stack overflow can result +** if the number of terms is too large. In practice, most SQL +** never has more than 3 or 4 terms. Use a value of 0 to disable +** any limit on the number of terms in a compount SELECT. +*/ +#ifndef SQLITE_MAX_COMPOUND_SELECT +# define SQLITE_MAX_COMPOUND_SELECT 500 +#endif + +/* +** The maximum number of opcodes in a VDBE program. +** Not currently enforced. +*/ +#ifndef SQLITE_MAX_VDBE_OP +# define SQLITE_MAX_VDBE_OP 25000 +#endif + +/* +** The maximum number of arguments to an SQL function. +*/ +#ifndef SQLITE_MAX_FUNCTION_ARG +# define SQLITE_MAX_FUNCTION_ARG 127 +#endif + +/* +** The maximum number of in-memory pages to use for the main database +** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE +*/ +#ifndef SQLITE_DEFAULT_CACHE_SIZE +# define SQLITE_DEFAULT_CACHE_SIZE 2000 +#endif +#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE +# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500 +#endif + +/* +** The default number of frames to accumulate in the log file before +** checkpointing the database in WAL mode. +*/ +#ifndef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT +# define SQLITE_DEFAULT_WAL_AUTOCHECKPOINT 1000 +#endif + +/* +** The maximum number of attached databases. This must be between 0 +** and 62. The upper bound on 62 is because a 64-bit integer bitmap +** is used internally to track attached databases. +*/ +#ifndef SQLITE_MAX_ATTACHED +# define SQLITE_MAX_ATTACHED 10 +#endif + + +/* +** The maximum value of a ?nnn wildcard that the parser will accept. +*/ +#ifndef SQLITE_MAX_VARIABLE_NUMBER +# define SQLITE_MAX_VARIABLE_NUMBER 999 +#endif + +/* Maximum page size. The upper bound on this value is 65536. This a limit +** imposed by the use of 16-bit offsets within each page. +** +** Earlier versions of SQLite allowed the user to change this value at +** compile time. This is no longer permitted, on the grounds that it creates +** a library that is technically incompatible with an SQLite library +** compiled with a different limit. If a process operating on a database +** with a page-size of 65536 bytes crashes, then an instance of SQLite +** compiled with the default page-size limit will not be able to rollback +** the aborted transaction. This could lead to database corruption. +*/ +#ifdef SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_PAGE_SIZE +#endif +#define SQLITE_MAX_PAGE_SIZE 65536 + + +/* +** The default size of a database page. +*/ +#ifndef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE 1024 +#endif +#if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_DEFAULT_PAGE_SIZE +# define SQLITE_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + +/* +** Ordinarily, if no value is explicitly provided, SQLite creates databases +** with page size SQLITE_DEFAULT_PAGE_SIZE. However, based on certain +** device characteristics (sector-size and atomic write() support), +** SQLite may choose a larger value. This constant is the maximum value +** SQLite will choose on its own. +*/ +#ifndef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE 8192 +#endif +#if SQLITE_MAX_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE +# undef SQLITE_MAX_DEFAULT_PAGE_SIZE +# define SQLITE_MAX_DEFAULT_PAGE_SIZE SQLITE_MAX_PAGE_SIZE +#endif + + +/* +** Maximum number of pages in one database file. +** +** This is really just the default value for the max_page_count pragma. +** This value can be lowered (or raised) at run-time using that the +** max_page_count macro. +*/ +#ifndef SQLITE_MAX_PAGE_COUNT +# define SQLITE_MAX_PAGE_COUNT 1073741823 +#endif + +/* +** Maximum length (in bytes) of the pattern in a LIKE or GLOB +** operator. +*/ +#ifndef SQLITE_MAX_LIKE_PATTERN_LENGTH +# define SQLITE_MAX_LIKE_PATTERN_LENGTH 50000 +#endif + +/* +** Maximum depth of recursion for triggers. +** +** A value of 1 means that a trigger program will not be able to itself +** fire any triggers. A value of 0 means that no trigger programs at all +** may be executed. +*/ +#ifndef SQLITE_MAX_TRIGGER_DEPTH +# define SQLITE_MAX_TRIGGER_DEPTH 1000 +#endif + +/************** End of sqliteLimit.h *****************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/* Disable nuisance warnings on Borland compilers */ +#if defined(__BORLANDC__) +#pragma warn -rch /* unreachable code */ +#pragma warn -ccc /* Condition is always true or false */ +#pragma warn -aus /* Assigned value is never used */ +#pragma warn -csu /* Comparing signed and unsigned */ +#pragma warn -spa /* Suspicious pointer arithmetic */ +#endif + +/* Needed for various definitions... */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + +/* +** Include standard header files as necessary +*/ +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif + +/* +** The following macros are used to cast pointers to integers and +** integers to pointers. The way you do this varies from one compiler +** to the next, so we have developed the following set of #if statements +** to generate appropriate macros for a wide range of compilers. +** +** The correct "ANSI" way to do this is to use the intptr_t type. +** Unfortunately, that typedef is not available on all compilers, or +** if it is available, it requires an #include of specific headers +** that vary from one machine to the next. +** +** Ticket #3860: The llvm-gcc-4.2 compiler from Apple chokes on +** the ((void*)&((char*)0)[X]) construct. But MSVC chokes on ((void*)(X)). +** So we have to define the macros in different ways depending on the +** compiler. +*/ +#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ +# define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) +#elif !defined(__GNUC__) /* Works for compilers other than LLVM */ +# define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) +# define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) +#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +#else /* Generates a warning - but it always works */ +# define SQLITE_INT_TO_PTR(X) ((void*)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(X)) +#endif + +/* +** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. +** 0 means mutexes are permanently disable and the library is never +** threadsafe. 1 means the library is serialized which is the highest +** level of threadsafety. 2 means the libary is multithreaded - multiple +** threads can use SQLite as long as no two threads try to use the same +** database connection at the same time. +** +** Older versions of SQLite used an optional THREADSAFE macro. +** We support that for legacy. +*/ +#if !defined(SQLITE_THREADSAFE) +#if defined(THREADSAFE) +# define SQLITE_THREADSAFE THREADSAFE +#else +# define SQLITE_THREADSAFE 1 /* IMP: R-07272-22309 */ +#endif +#endif + +/* +** Powersafe overwrite is on by default. But can be turned off using +** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. +*/ +#ifndef SQLITE_POWERSAFE_OVERWRITE +# define SQLITE_POWERSAFE_OVERWRITE 1 +#endif + +/* +** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1. +** It determines whether or not the features related to +** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can +** be overridden at runtime using the sqlite3_config() API. +*/ +#if !defined(SQLITE_DEFAULT_MEMSTATUS) +# define SQLITE_DEFAULT_MEMSTATUS 1 +#endif + +/* +** Exactly one of the following macros must be defined in order to +** specify which memory allocation subsystem to use. +** +** SQLITE_SYSTEM_MALLOC // Use normal system malloc() +** SQLITE_WIN32_MALLOC // Use Win32 native heap API +** SQLITE_MEMDEBUG // Debugging version of system malloc() +** +** On Windows, if the SQLITE_WIN32_MALLOC_VALIDATE macro is defined and the +** assert() macro is enabled, each call into the Win32 native heap subsystem +** will cause HeapValidate to be called. If heap validation should fail, an +** assertion will be triggered. +** +** (Historical note: There used to be several other options, but we've +** pared it down to just these three.) +** +** If none of the above are defined, then set SQLITE_SYSTEM_MALLOC as +** the default. +*/ +#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_WIN32_MALLOC)+defined(SQLITE_MEMDEBUG)>1 +# error "At most one of the following compile-time configuration options\ + is allows: SQLITE_SYSTEM_MALLOC, SQLITE_WIN32_MALLOC, SQLITE_MEMDEBUG" +#endif +#if defined(SQLITE_SYSTEM_MALLOC)+defined(SQLITE_WIN32_MALLOC)+defined(SQLITE_MEMDEBUG)==0 +# define SQLITE_SYSTEM_MALLOC 1 +#endif + +/* +** If SQLITE_MALLOC_SOFT_LIMIT is not zero, then try to keep the +** sizes of memory allocations below this value where possible. +*/ +#if !defined(SQLITE_MALLOC_SOFT_LIMIT) +# define SQLITE_MALLOC_SOFT_LIMIT 1024 +#endif + +/* +** We need to define _XOPEN_SOURCE as follows in order to enable +** recursive mutexes on most Unix systems. But Mac OS X is different. +** The _XOPEN_SOURCE define causes problems for Mac OS X we are told, +** so it is omitted there. See ticket #2673. +** +** Later we learn that _XOPEN_SOURCE is poorly or incorrectly +** implemented on some systems. So we avoid defining it at all +** if it is already defined or if it is unneeded because we are +** not doing a threadsafe build. Ticket #2681. +** +** See also ticket #2741. +*/ +#if !defined(_XOPEN_SOURCE) && !defined(__DARWIN__) && !defined(__APPLE__) && SQLITE_THREADSAFE +# define _XOPEN_SOURCE 500 /* Needed to enable pthread recursive mutexes */ +#endif + +/* +** The TCL headers are only needed when compiling the TCL bindings. +*/ +#if defined(SQLITE_TCL) || defined(TCLSH) +# include +#endif + +/* +** Many people are failing to set -DNDEBUG=1 when compiling SQLite. +** Setting NDEBUG makes the code smaller and run faster. So the following +** lines are added to automatically set NDEBUG unless the -DSQLITE_DEBUG=1 +** option is set. Thus NDEBUG becomes an opt-in rather than an opt-out +** feature. +*/ +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif + +/* +** The testcase() macro is used to aid in coverage testing. When +** doing coverage testing, the condition inside the argument to +** testcase() must be evaluated both true and false in order to +** get full branch coverage. The testcase() macro is inserted +** to help ensure adequate test coverage in places where simple +** condition/decision coverage is inadequate. For example, testcase() +** can be used to make sure boundary values are tested. For +** bitmask tests, testcase() can be used to make sure each bit +** is significant and used at least once. On switch statements +** where multiple cases go to the same block of code, testcase() +** can insure that all cases are evaluated. +** +*/ +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE void sqlite3Coverage(int); +# define testcase(X) if( X ){ sqlite3Coverage(__LINE__); } +#else +# define testcase(X) +#endif + +/* +** The TESTONLY macro is used to enclose variable declarations or +** other bits of code that are needed to support the arguments +** within testcase() and assert() macros. +*/ +#if !defined(NDEBUG) || defined(SQLITE_COVERAGE_TEST) +# define TESTONLY(X) X +#else +# define TESTONLY(X) +#endif + +/* +** Sometimes we need a small amount of code such as a variable initialization +** to setup for a later assert() statement. We do not want this code to +** appear when assert() is disabled. The following macro is therefore +** used to contain that setup code. The "VVA" acronym stands for +** "Verification, Validation, and Accreditation". In other words, the +** code within VVA_ONLY() will only run during verification processes. +*/ +#ifndef NDEBUG +# define VVA_ONLY(X) X +#else +# define VVA_ONLY(X) +#endif + +/* +** The ALWAYS and NEVER macros surround boolean expressions which +** are intended to always be true or false, respectively. Such +** expressions could be omitted from the code completely. But they +** are included in a few cases in order to enhance the resilience +** of SQLite to unexpected behavior - to make the code "self-healing" +** or "ductile" rather than being "brittle" and crashing at the first +** hint of unplanned behavior. +** +** In other words, ALWAYS and NEVER are added for defensive code. +** +** When doing coverage testing ALWAYS and NEVER are hard-coded to +** be true and false so that the unreachable code then specify will +** not be counted as untested code. +*/ +#if defined(SQLITE_COVERAGE_TEST) +# define ALWAYS(X) (1) +# define NEVER(X) (0) +#elif !defined(NDEBUG) +# define ALWAYS(X) ((X)?1:(assert(0),0)) +# define NEVER(X) ((X)?(assert(0),1):0) +#else +# define ALWAYS(X) (X) +# define NEVER(X) (X) +#endif + +/* +** Return true (non-zero) if the input is a integer that is too large +** to fit in 32-bits. This macro is used inside of various testcase() +** macros to verify that we have tested SQLite for large-file support. +*/ +#define IS_BIG_INT(X) (((X)&~(i64)0xffffffff)!=0) + +/* +** The macro unlikely() is a hint that surrounds a boolean +** expression that is usually false. Macro likely() surrounds +** a boolean expression that is usually true. GCC is able to +** use these hints to generate better code, sometimes. +*/ +#if defined(__GNUC__) && 0 +# define likely(X) __builtin_expect((X),1) +# define unlikely(X) __builtin_expect((X),0) +#else +# define likely(X) !!(X) +# define unlikely(X) !!(X) +#endif + +/************** Include sqlite3.h in the middle of sqliteInt.h ***************/ +/************** Begin file sqlite3.h *****************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are suppose to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef _SQLITE3_H_ +#define _SQLITE3_H_ +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** Add the ability to override 'extern' +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif + +#ifndef SQLITE_API +# define SQLITE_API +#endif + + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are support for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers +** +** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header +** evaluates to a string literal that is the SQLite version in the +** format "X.Y.Z" where X is the major version number (always 3 for +** SQLite3) and Y is the minor version number and Z is the release number.)^ +** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same +** numbers used in [SQLITE_VERSION].)^ +** The SQLITE_VERSION_NUMBER for any given release of SQLite will also +** be larger than the release from which it is derived. Either Y will +** be held constant and Z will be incremented or else Y will be incremented +** and Z will be reset to zero. +** +** Since version 3.6.18, SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates to +** a string which identifies a particular check-in of SQLite +** within its configuration management system. ^The SQLITE_SOURCE_ID +** string contains the date and time of the check-in (UTC) and an SHA1 +** hash of the entire source tree. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +*/ +#define SQLITE_VERSION "3.7.10" +#define SQLITE_VERSION_NUMBER 3007010 +#define SQLITE_SOURCE_ID "2012-01-16 13:28:40 ebd01a8deffb5024a5d7494eef800d2366d97204" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version, sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros +** but are associated with the library instead of the header file. ^(Cautious +** programmers might include assert() statements in their application to +** verify that values returned by these interfaces match the macros in +** the header, and thus insure that the application is +** compiled with matching library and header files. +** +**
+** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
+** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
+** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
+** 
)^ +** +** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] +** macro. ^The sqlite3_libversion() function returns a pointer to the +** to the sqlite3_version[] string constant. The sqlite3_libversion() +** function is provided for use in DLLs since DLL users usually do not have +** direct access to string constants within the DLL. ^The +** sqlite3_libversion_number() function returns an integer equal to +** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns +** a pointer to a string constant whose value is the same as the +** [SQLITE_SOURCE_ID] C preprocessor macro. +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +*/ +SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with mutexing code omitted due to the +** [SQLITE_THREADSAFE] compile-time option being set to 0. +** +** SQLite can be compiled with or without mutexes. When +** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** Enabling mutexes incurs a measurable performance penalty. +** So if speed is of utmost importance, it makes sense to disable +** the mutexes. But for maximum safety, mutexes should be enabled. +** ^The default behavior is for mutexes to be enabled. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but +** can be fully or partially disabled using a call to [sqlite3_config()] +** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], +** or [SQLITE_CONFIG_MUTEX]. ^(The return value of the +** sqlite3_threadsafe() function shows only the compile-time setting of +** thread safety, not any run-time changes to that setting made by +** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() +** is unchanged by calls to sqlite3_config().)^ +** +** See the [threading mode] documentation for additional information. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** is its destructor. There are many other interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^The sqlite3_int64 and sqlite_int64 types can store integer values +** between -9223372036854775808 and +9223372036854775807 inclusive. ^The +** sqlite3_uint64 and sqlite_uint64 types can store integer values +** between 0 and +18446744073709551615 inclusive. +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** +** ^The sqlite3_close() routine is the destructor for the [sqlite3] object. +** ^Calls to sqlite3_close() return SQLITE_OK if the [sqlite3] object is +** successfully destroyed and all associated resources are deallocated. +** +** Applications must [sqlite3_finalize | finalize] all [prepared statements] +** and [sqlite3_blob_close | close] all [BLOB handles] associated with +** the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close() is called on a [database connection] that still has +** outstanding [prepared statements] or [BLOB handles], then it returns +** SQLITE_BUSY. +** +** ^If [sqlite3_close()] is invoked while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] must be either a NULL +** pointer or an [sqlite3] object pointer obtained +** from [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()], and not previously closed. +** ^Calling sqlite3_close() with a NULL pointer argument is a +** harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3 *); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** +** The sqlite3_exec() interface is a convenience wrapper around +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], +** that allows an application to run multiple statements of SQL +** without having to use a lot of C code. +** +** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, +** semicolon-separate SQL statements passed into its 2nd argument, +** in the context of the [database connection] passed in as its 1st +** argument. ^If the callback function of the 3rd argument to +** sqlite3_exec() is not NULL, then it is invoked for each result row +** coming out of the evaluated SQL statements. ^The 4th argument to +** sqlite3_exec() is relayed through to the 1st argument of each +** callback invocation. ^If the callback pointer to sqlite3_exec() +** is NULL, then no callback is ever invoked and result rows are +** ignored. +** +** ^If an error occurs while evaluating the SQL statements passed into +** sqlite3_exec(), then execution of the current statement stops and +** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() +** is not NULL then any error message is written into memory obtained +** from [sqlite3_malloc()] and passed back through the 5th parameter. +** To avoid memory leaks, the application should invoke [sqlite3_free()] +** on error message strings returned through the 5th parameter of +** of sqlite3_exec() after the error message string is no longer needed. +** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors +** occur, then sqlite3_exec() sets the pointer in its 5th parameter to +** NULL before returning. +** +** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() +** routine returns SQLITE_ABORT without invoking the callback again and +** without running any subsequent SQL statements. +** +** ^The 2nd argument to the sqlite3_exec() callback function is the +** number of columns in the result. ^The 3rd argument to the sqlite3_exec() +** callback is an array of pointers to strings obtained as if from +** [sqlite3_column_text()], one for each column. ^If an element of a +** result row is NULL then the corresponding string pointer for the +** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the +** sqlite3_exec() callback is an array of pointers to strings where each +** entry represents the name of corresponding result column as obtained +** from [sqlite3_column_name()]. +** +** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer +** to an empty string, or a pointer that contains only whitespace and/or +** SQL comments, then no SQL statements are evaluated and the database +** is not changed. +** +** Restrictions: +** +**
    +**
  • The application must insure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
  • The application must not close [database connection] specified by +** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. +**
  • The application must not modify the SQL statement text passed into +** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
+*/ +SQLITE_API int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: SQLITE_OK {error code} {error codes} +** KEYWORDS: {result code} {result codes} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [SQLITE_IOERR_READ | extended result codes], +** [sqlite3_vtab_on_conflict()] [SQLITE_ROLLBACK | result codes]. +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended error code} {extended error codes} +** KEYWORDS: {extended result code} {extended result codes} +** +** In its default configuration, SQLite API routines return one of 26 integer +** [SQLITE_OK | result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 and later) include +** support for additional result codes that provide more detailed information +** about errors. The extended result codes are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. +** +** Some of the available extended result codes are listed here. +** One may expect the number of extended result codes will be expand +** over time. Software that uses extended result codes should expect +** to see new result codes in future releases of SQLite. +** +** The SQLITE_OK result code will never be extended. It will always +** be exactly zero. +*/ +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ + +/* Reserved: 0x00F00000 */ + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of the these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 + +/* +** CAPI3REF: File Locking Levels +** +** SQLite uses one of these integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object +** +** Every file opened by the [sqlite3_vfs.xOpen] method populates an +** [sqlite3_file] object (or, more commonly, a subclass of the +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
    +**
  • [SQLITE_LOCK_NONE], +**
  • [SQLITE_LOCK_SHARED], +**
  • [SQLITE_LOCK_RESERVED], +**
  • [SQLITE_LOCK_PENDING], or +**
  • [SQLITE_LOCK_EXCLUSIVE]. +**
+** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [SQLITE_FCNTL_LOCKSTATE | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
    +**
  • [SQLITE_IOCAP_ATOMIC] +**
  • [SQLITE_IOCAP_ATOMIC512] +**
  • [SQLITE_IOCAP_ATOMIC1K] +**
  • [SQLITE_IOCAP_ATOMIC2K] +**
  • [SQLITE_IOCAP_ATOMIC4K] +**
  • [SQLITE_IOCAP_ATOMIC8K] +**
  • [SQLITE_IOCAP_ATOMIC16K] +**
  • [SQLITE_IOCAP_ATOMIC32K] +**
  • [SQLITE_IOCAP_ATOMIC64K] +**
  • [SQLITE_IOCAP_SAFE_APPEND] +**
  • [SQLITE_IOCAP_SEQUENTIAL] +**
+** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and only needs to be supported when SQLITE_TEST +** is defined. +** +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See the [sqlite3_file_control()] documentation for +** additional information. +** +** ^(The [SQLITE_FCNTL_SYNC_OMITTED] opcode is generated internally by +** SQLite and sent to all VFSes in place of a call to the xSync method +** when the database connection has [PRAGMA synchronous] set to OFF.)^ +** Some specialized VFSes need this signal in order to operate correctly +** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most +** VFSes do not need this signal and should silently ignore this opcode. +** Applications should not call [sqlite3_file_control()] with this +** opcode as doing so may disrupt the operation of the specialized VFSes +** that do require it. +** +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer i the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write AHead Log] setting. By default, the auxiliary +** write ahead log and shared memory files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_GET_LOCKPROXYFILE 2 +#define SQLITE_SET_LOCKPROXYFILE 3 +#define SQLITE_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 + +/* +** CAPI3REF: Mutex Handle +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: OS Interface Object +** +** An instance of the sqlite3_vfs object defines the interface between +** the SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The value of the iVersion field is initially 1 but may be larger in +** future versions of SQLite. Additional fields may be appended to this +** object when the iVersion value is increased. Note that the structure +** of the sqlite3_vfs object changes in the transaction between +** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not +** modified. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
    +**
  • [SQLITE_OPEN_MAIN_DB] +**
  • [SQLITE_OPEN_MAIN_JOURNAL] +**
  • [SQLITE_OPEN_TEMP_DB] +**
  • [SQLITE_OPEN_TEMP_JOURNAL] +**
  • [SQLITE_OPEN_TRANSIENT_DB] +**
  • [SQLITE_OPEN_SUBJOURNAL] +**
  • [SQLITE_OPEN_MASTER_JOURNAL] +**
  • [SQLITE_OPEN_WAL] +**
)^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
    +**
  • [SQLITE_OPEN_DELETEONCLOSE] +**
  • [SQLITE_OPEN_EXCLUSIVE] +**
+** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The file can be a +** directory. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in figure versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method +** +** These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. They determine +** what kind of permissions the xAccess method is looking for. +** With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks whether the file exists. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
    +**
  • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
  • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
  • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
+** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given no the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^The sqlite3_initialize() routine initializes the +** SQLite library. ^The sqlite3_shutdown() routine +** deallocates any resources that were allocated by sqlite3_initialize(). +** These routines are designed to aid in process initialization and +** shutdown on embedded systems. Workstation applications using +** SQLite normally do not need to invoke either of these routines. +** +** A call to sqlite3_initialize() is an "effective" call if it is +** the first time sqlite3_initialize() is invoked during the lifetime of +** the process, or if it is the first time sqlite3_initialize() is invoked +** following a call to sqlite3_shutdown(). ^(Only an effective call +** of sqlite3_initialize() does any initialization. All other calls +** are harmless no-ops.)^ +** +** A call to sqlite3_shutdown() is an "effective" call if it is the first +** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only +** an effective call to sqlite3_shutdown() does any deinitialization. +** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ +** +** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() +** is not. The sqlite3_shutdown() interface must only be called from a +** single thread. All open [database connections] must be closed and all +** other SQLite resources must be deallocated prior to invoking +** sqlite3_shutdown(). +** +** Among other things, ^sqlite3_initialize() will invoke +** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() +** will invoke sqlite3_os_end(). +** +** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** ^If for some reason, sqlite3_initialize() is unable to initialize +** the library (perhaps it is unable to allocate a needed resource such +** as a mutex) it returns an [error code] other than [SQLITE_OK]. +** +** ^The sqlite3_initialize() routine is called internally by many other +** SQLite interfaces so that an application usually does not need to +** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] +** calls sqlite3_initialize() so the SQLite library will be automatically +** initialized when [sqlite3_open()] is called if it has not be initialized +** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** compile-time option, then the automatic calls to sqlite3_initialize() +** are omitted and the application must call sqlite3_initialize() directly +** prior to using any other SQLite interface. For maximum portability, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must insure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. Furthermore, sqlite3_config() +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** +** The first argument to sqlite3_config() is an integer +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [configuration option] +** in the first argument. +** +** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** ^If the option is unknown or SQLite is unable to set the option +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** +** The sqlite3_db_config() interface is used to make configuration +** changes to a [database connection]. The interface is similar to +** [sqlite3_config()] except that the changes apply to a single +** [database connection] (specified in the first argument). +** +** The second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. (For example, +** it might allocate any require mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
+** [[SQLITE_CONFIG_SINGLETHREAD]]
SQLITE_CONFIG_SINGLETHREAD
+**
There are no arguments to this option. ^This option sets the +** [threading mode] to Single-thread. In other words, it disables +** all mutexing and puts SQLite into a mode where it can only be used +** by a single thread. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to change the [threading mode] from its default +** value of Single-thread and so [sqlite3_config()] will return +** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD +** configuration option.
+** +** [[SQLITE_CONFIG_MULTITHREAD]]
SQLITE_CONFIG_MULTITHREAD
+**
There are no arguments to this option. ^This option sets the +** [threading mode] to Multi-thread. In other words, it disables +** mutexing on [database connection] and [prepared statement] objects. +** The application is responsible for serializing access to +** [database connections] and [prepared statements]. But other mutexes +** are enabled so that SQLite will be safe to use in a multi-threaded +** environment as long as no two threads attempt to use the same +** [database connection] at the same time. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Multi-thread [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_MULTITHREAD configuration option.
+** +** [[SQLITE_CONFIG_SERIALIZED]]
SQLITE_CONFIG_SERIALIZED
+**
There are no arguments to this option. ^This option sets the +** [threading mode] to Serialized. In other words, this option enables +** all mutexes including the recursive +** mutexes on [database connection] and [prepared statement] objects. +** In this mode (which is the default when SQLite is compiled with +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** to [database connections] and [prepared statements] so that the +** application is free to use the same [database connection] or the +** same [prepared statement] in different threads at the same time. +** ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Serialized [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_SERIALIZED configuration option.
+** +** [[SQLITE_CONFIG_MALLOC]]
SQLITE_CONFIG_MALLOC
+**
^(This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mem_methods] structure. The argument specifies +** alternative low-level memory allocation routines to be used in place of +** the memory allocation routines built into SQLite.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
+** +** [[SQLITE_CONFIG_GETMALLOC]]
SQLITE_CONFIG_GETMALLOC
+**
^(This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mem_methods] structure. The [sqlite3_mem_methods] +** structure is filled with the currently defined memory allocation routines.)^ +** This option can be used to overload the default memory allocation +** routines with a wrapper that simulations memory allocation failure or +** tracks memory usage, for example.
+** +** [[SQLITE_CONFIG_MEMSTATUS]]
SQLITE_CONFIG_MEMSTATUS
+**
^This option takes single argument of type int, interpreted as a +** boolean, which enables or disables the collection of memory allocation +** statistics. ^(When memory allocation statistics are disabled, the +** following SQLite interfaces become non-operational: +**
    +**
  • [sqlite3_memory_used()] +**
  • [sqlite3_memory_highwater()] +**
  • [sqlite3_soft_heap_limit64()] +**
  • [sqlite3_status()] +**
)^ +** ^Memory allocation statistics are enabled by default unless SQLite is +** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory +** allocation statistics are disabled by default. +**
+** +** [[SQLITE_CONFIG_SCRATCH]]
SQLITE_CONFIG_SCRATCH
+**
^This option specifies a static memory buffer that SQLite can use for +** scratch memory. There are three arguments: A pointer an 8-byte +** aligned memory buffer from which the scratch allocations will be +** drawn, the size of each scratch allocation (sz), +** and the maximum number of scratch allocations (N). The sz +** argument must be a multiple of 16. +** The first argument must be a pointer to an 8-byte aligned buffer +** of at least sz*N bytes of memory. +** ^SQLite will use no more than two scratch buffers per thread. So +** N should be set to twice the expected maximum number of threads. +** ^SQLite will never require a scratch buffer that is more than 6 +** times the database page size. ^If SQLite needs needs additional +** scratch memory beyond what is provided by this configuration option, then +** [sqlite3_malloc()] will be used to obtain the memory needed.
+** +** [[SQLITE_CONFIG_PAGECACHE]]
SQLITE_CONFIG_PAGECACHE
+**
^This option specifies a static memory buffer that SQLite can use for +** the database page cache with the default page cache implementation. +** This configuration should not be used if an application-define page +** cache implementation is loaded using the SQLITE_CONFIG_PCACHE2 option. +** There are three arguments to this option: A pointer to 8-byte aligned +** memory, the size of each page buffer (sz), and the number of pages (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 32768) plus a little extra for each +** page header. ^The page header size is 20 to 40 bytes depending on +** the host architecture. ^It is harmless, apart from the wasted memory, +** to make sz a little too large. The first +** argument should point to an allocation of at least sz*N bytes of memory. +** ^SQLite will use the memory provided by the first argument to satisfy its +** memory needs for the first N pages that it adds to cache. ^If additional +** page cache memory is needed beyond what is provided by this option, then +** SQLite goes to [sqlite3_malloc()] for the additional storage space. +** The pointer in the first argument must +** be aligned to an 8-byte boundary or subsequent behavior of SQLite +** will be undefined.
+** +** [[SQLITE_CONFIG_HEAP]]
SQLITE_CONFIG_HEAP
+**
^This option specifies a static memory buffer that SQLite will use +** for all of its dynamic memory allocation needs beyond those provided +** for by [SQLITE_CONFIG_SCRATCH] and [SQLITE_CONFIG_PAGECACHE]. +** There are three arguments: An 8-byte aligned pointer to the memory, +** the number of bytes in the memory buffer, and the minimum allocation size. +** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL and either [SQLITE_ENABLE_MEMSYS3] or +** [SQLITE_ENABLE_MEMSYS5] are defined, then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
+** +** [[SQLITE_CONFIG_MUTEX]]
SQLITE_CONFIG_MUTEX
+**
^(This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mutex_methods] structure. The argument specifies +** alternative low-level mutex routines to be used in place +** the mutex routines built into SQLite.)^ ^SQLite makes a copy of the +** content of the [sqlite3_mutex_methods] structure before the call to +** [sqlite3_config()] returns. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will +** return [SQLITE_ERROR].
+** +** [[SQLITE_CONFIG_GETMUTEX]]
SQLITE_CONFIG_GETMUTEX
+**
^(This option takes a single argument which is a pointer to an +** instance of the [sqlite3_mutex_methods] structure. The +** [sqlite3_mutex_methods] +** structure is filled with the currently defined mutex routines.)^ +** This option can be used to overload the default mutex allocation +** routines with a wrapper used to track mutex usage for performance +** profiling or testing, for example. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will +** return [SQLITE_ERROR].
+** +** [[SQLITE_CONFIG_LOOKASIDE]]
SQLITE_CONFIG_LOOKASIDE
+**
^(This option takes two arguments that determine the default +** memory allocation for the lookaside memory allocator on each +** [database connection]. The first argument is the +** size of each lookaside buffer slot and the second is the number of +** slots allocated to each database connection.)^ ^(This option sets the +** default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** verb to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
+** +** [[SQLITE_CONFIG_PCACHE2]]
SQLITE_CONFIG_PCACHE2
+**
^(This option takes a single argument which is a pointer to +** an [sqlite3_pcache_methods2] object. This object specifies the interface +** to a custom page cache implementation.)^ ^SQLite makes a copy of the +** object and uses it for page cache memory allocations.
+** +** [[SQLITE_CONFIG_GETPCACHE2]]
SQLITE_CONFIG_GETPCACHE2
+**
^(This option takes a single argument which is a pointer to an +** [sqlite3_pcache_methods2] object. SQLite copies of the current +** page cache implementation into that object.)^
+** +** [[SQLITE_CONFIG_LOG]]
SQLITE_CONFIG_LOG
+**
^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
+** +** [[SQLITE_CONFIG_URI]]
SQLITE_CONFIG_URI +**
This option takes a single argument of type int. If non-zero, then +** URI handling is globally enabled. If the parameter is zero, then URI handling +** is globally disabled. If URI handling is globally enabled, all filenames +** passed to [sqlite3_open()], [sqlite3_open_v2()], [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
SQLITE_CONFIG_PCACHE and SQLITE_CONFNIG_GETPCACHE +**
These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
+*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_db_config()] to make sure that +** the call worked. ^The [sqlite3_db_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
+**
SQLITE_DBCONFIG_LOOKASIDE
+**
^This option takes three additional arguments that determine the +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb +** may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the +** size of each lookaside buffer slot. ^The third argument is the number of +** slots. The size of the buffer in the first argument must be greater than +** or equal to the product of the second and third arguments. The buffer +** must be aligned to an 8-byte boundary. ^If the second argument to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
+** +**
SQLITE_DBCONFIG_ENABLE_FKEY
+**
^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
+** +**
SQLITE_DBCONFIG_ENABLE_TRIGGER
+**
^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back.
+** +**
+*/ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ + + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** +** ^The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. ^The extended result +** codes are disabled by default for historical compatibility. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid +** +** ^Each entry in an SQLite table has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. ^The rowid is always available +** as an undeclared column named ROWID, OID, or _ROWID_ as long as those +** names are not also used by explicitly declared columns. ^If +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^This routine returns the [rowid] of the most recent +** successful [INSERT] into the database from the [database connection] +** in the first argument. ^As of SQLite version 3.7.7, this routines +** records the last insert rowid of both ordinary tables and [virtual tables]. +** ^If no successful [INSERT]s +** have ever occurred on that database connection, zero is returned. +** +** ^(If an [INSERT] occurs within a trigger or within a [virtual table] +** method, then this routine will return the [rowid] of the inserted +** row as long as the trigger or virtual table method is running. +** But once the trigger or virtual table method ends, the value returned +** by this routine reverts to what it was before the trigger or virtual +** table method began.)^ +** +** ^An [INSERT] that fails due to a constraint violation is not a +** successful [INSERT] and does not change the value returned by this +** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** and INSERT OR ABORT make no changes to the return value of this +** routine when their insertion fails. ^(When INSERT OR REPLACE +** encounters a constraint violation, it does not fail. The +** INSERT continues to completion after deleting rows that caused +** the constraint problem so INSERT OR REPLACE will always change +** the return value of this interface.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** This function is accessible to SQL statements via the +** [last_insert_rowid() SQL function]. +** +** If a separate thread performs a new [INSERT] on the same +** database connection while the [sqlite3_last_insert_rowid()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** +** ^This function returns the number of database rows that were changed +** or inserted or deleted by the most recently completed SQL statement +** on the [database connection] specified by the first parameter. +** ^(Only changes that are directly specified by the [INSERT], [UPDATE], +** or [DELETE] statement are counted. Auxiliary changes caused by +** triggers or [foreign key actions] are not counted.)^ Use the +** [sqlite3_total_changes()] function to find the total number of changes +** including changes caused by triggers and foreign key actions. +** +** ^Changes to a view that are simulated by an [INSTEAD OF trigger] +** are not counted. Only real table changes are counted. +** +** ^(A "row change" is a change to a single row of a single table +** caused by an INSERT, DELETE, or UPDATE statement. Rows that +** are changed as side effects of [REPLACE] constraint resolution, +** rollback, ABORT processing, [DROP TABLE], or by any other +** mechanisms do not count as direct row changes.)^ +** +** A "trigger context" is a scope of execution that begins and +** ends with the script of a [CREATE TRIGGER | trigger]. +** Most SQL statements are +** evaluated outside of any trigger. This is the "top level" +** trigger context. If a trigger fires from the top level, a +** new trigger context is entered for the duration of that one +** trigger. Subtriggers create subcontexts for their duration. +** +** ^Calling [sqlite3_exec()] or [sqlite3_step()] recursively does +** not create a new trigger context. +** +** ^This function returns the number of direct row changes in the +** most recent INSERT, UPDATE, or DELETE statement within the same +** trigger context. +** +** ^Thus, when called from the top level, this function returns the +** number of changes in the most recent INSERT, UPDATE, or DELETE +** that also occurred at the top level. ^(Within the body of a trigger, +** the sqlite3_changes() interface can be called to find the number of +** changes in the most recently completed INSERT, UPDATE, or DELETE +** statement within the body of the same trigger. +** However, the number returned does not include changes +** caused by subtriggers since those have their own context.)^ +** +** See also the [sqlite3_total_changes()] interface, the +** [count_changes pragma], and the [changes() SQL function]. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_changes()] is running then the value returned +** is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** +** ^This function returns the number of row changes caused by [INSERT], +** [UPDATE] or [DELETE] statements since the [database connection] was opened. +** ^(The count returned by sqlite3_total_changes() includes all changes +** from all [CREATE TRIGGER | trigger] contexts and changes made by +** [foreign key actions]. However, +** the count does not include changes used to implement [REPLACE] constraints, +** do rollbacks or ABORT processing, or [DROP TABLE] processing. The +** count does not include rows of views that fire an [INSTEAD OF trigger], +** though if the INSTEAD OF trigger makes changes of its own, those changes +** are counted.)^ +** ^The sqlite3_total_changes() function counts the changes as soon as +** the statement that makes them is completed (when the statement handle +** is passed to [sqlite3_reset()] or [sqlite3_finalize()]). +** +** See also the [sqlite3_changes()] interface, the +** [count_changes pragma], and the [total_changes() SQL function]. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_total_changes()] is running then the value +** returned is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** +** ^This function causes any pending database operation to abort and +** return at its earliest opportunity. This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** ^It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. But it +** is not safe to call this routine with a [database connection] that +** is closed or might close before sqlite3_interrupt() returns. +** +** ^If an SQL operation is very nearly finished at the time when +** sqlite3_interrupt() is called, then it might not have an opportunity +** to be interrupted and might continue to completion. +** +** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** that is inside an explicit transaction, then the entire transaction +** will be rolled back automatically. +** +** ^The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. ^Any new SQL statements +** that are started after the sqlite3_interrupt() call and before the +** running statements reaches zero are interrupted as if they had been +** running prior to the sqlite3_interrupt() call. ^New SQL statements +** that are started after the running statement count reaches zero are +** not effected by the sqlite3_interrupt(). +** ^A call to sqlite3_interrupt(D) that occurs when there are no running +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +** +** If the database connection closes while [sqlite3_interrupt()] +** is running then bad things will likely happen. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete +** +** These routines are useful during command-line input to determine if the +** currently entered text seems to form a complete SQL statement or +** if additional input is needed before sending the text into +** SQLite for parsing. ^These routines return 1 if the input string +** appears to be a complete SQL statement. ^A statement is judged to be +** complete if it ends with a semicolon token and is not a prefix of a +** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within +** string literals or quoted identifier names or comments are not +** independent tokens (they are part of the token in which they are +** embedded) and thus do not count as a statement terminator. ^Whitespace +** and comments that follow the final semicolon are ignored. +** +** ^These routines return 0 if the statement is incomplete. ^If a +** memory allocation fails, then SQLITE_NOMEM is returned. +** +** ^These routines do not parse the SQL statements thus +** will not detect syntactically incorrect SQL. +** +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior +** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked +** automatically by sqlite3_complete16(). If that initialization fails, +** then the return value from sqlite3_complete16() will be non-zero +** regardless of whether or not the input SQL is complete.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +SQLITE_API int sqlite3_complete(const char *sql); +SQLITE_API int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors +** +** ^This routine sets a callback function that might be invoked whenever +** an attempt is made to open a database table that another thread +** or process has locked. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] +** is returned immediately upon encountering the lock. ^If the busy callback +** is not NULL, then the callback might be invoked with two arguments. +** +** ^The first argument to the busy handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). ^The second argument to +** the busy handler callback is the number of times that the busy handler has +** been invoked for this locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED] is returned. +** ^If the callback returns non-zero, then another attempt +** is made to open the database for reading and the cycle repeats. +** +** The presence of a busy handler does not guarantee that it will be invoked +** when there is lock contention. ^If SQLite determines that invoking the busy +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** or [SQLITE_IOERR_BLOCKED] instead of invoking the busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^The [SQLITE_BUSY] error is converted to [SQLITE_IOERR_BLOCKED] +** when SQLite is in the middle of a large transaction where all the +** changes will not fit into the in-memory cache. SQLite will +** already hold a RESERVED lock on the database file, but it needs +** to promote this lock to EXCLUSIVE so that it can spill cache +** pages into the database file without harm to concurrent +** readers. ^If it is unable to promote the lock, then the in-memory +** cache will be left in an inconsistent state and so the error +** code is promoted from the relatively benign [SQLITE_BUSY] to +** the more severe [SQLITE_IOERR_BLOCKED]. ^This error code promotion +** forces an automatic rollback of the changes. See the +** +** CorruptionFollowingBusyError wiki page for a discussion of why +** this is important. +** +** ^(There can only be a single busy handler defined for each +** [database connection]. Setting a new busy handler clears any +** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] +** will also set or clear the busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. Any such actions +** result in undefined behavior. +** +** A busy handler must not close the database connection +** or [prepared statement] that invoked the busy handler. +*/ +SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); + +/* +** CAPI3REF: Set A Busy Timeout +** +** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. ^The handler +** will sleep multiple times until at least "ms" milliseconds of sleeping +** have accumulated. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY] or [SQLITE_IOERR_BLOCKED]. +** +** ^Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** ^(There can only be a single busy handler for a particular +** [database connection] any any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
+**        Name        | Age
+**        -----------------------
+**        Alice       | 43
+**        Bob         | 28
+**        Cindy       | 21
+** 
+** +** There are two column (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array names azResult. Then azResult holds this content: +** +**
+**        azResult[0] = "Name";
+**        azResult[1] = "Age";
+**        azResult[2] = "Alice";
+**        azResult[3] = "43";
+**        azResult[4] = "Bob";
+**        azResult[5] = "28";
+**        azResult[6] = "Cindy";
+**        azResult[7] = "21";
+** 
)^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must pass the result table pointer to sqlite3_free_table() in order to +** release the memory that was malloced. Because of the way the +** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling +** function must not try to call [sqlite3_free()] directly. Only +** [sqlite3_free_table()] is able to release the memory properly and safely. +** +** The sqlite3_get_table() interface is implemented as a wrapper around +** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access +** to any internal data structures of SQLite. It uses only the public +** interface defined here. As a consequence, errors that occur in the +** wrapper layer outside of the internal [sqlite3_exec()] call are not +** reflected in subsequent calls to [sqlite3_errcode()] or +** [sqlite3_errmsg()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** +** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc()]. +** The strings returned by these two routines should be +** released by [sqlite3_free()]. ^Both routines return a +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. Note that the order of the +** first two parameters is reversed from snprintf().)^ This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. ^(Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer.)^ We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** ^As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. ^The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. So the longest string that can be completely +** written will be n-1 characters. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf() formatting options apply. In addition, there +** is are "%q", "%Q", and "%z" options. +** +** ^(The %q option works like %s in that it substitutes a nul-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %q is designed for use inside a string literal.)^ By doubling each '\'' +** character it escapes that character and allows it to be inserted into +** the string. +** +** For example, assume the string variable zText contains text as follows: +** +**
+**  char *zText = "It's a happy day!";
+** 
+** +** One can use this text in an SQL statement as follows: +** +**
+**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
+**  sqlite3_exec(db, zSQL, 0, 0, 0);
+**  sqlite3_free(zSQL);
+** 
+** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
+**  INSERT INTO table1 VALUES('It''s a happy day!')
+** 
+** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
+**  INSERT INTO table1 VALUES('It's a happy day!');
+** 
+** +** This second example is an SQL syntax error. As a general rule you should +** always use %q instead of %s when inserting text into a string literal. +** +** ^(The %Q option works like %q except it also adds single quotes around +** the outside of the total string. Additionally, if the parameter in the +** argument list is a NULL pointer, %Q substitutes the text "NULL" (without +** single quotes).)^ So, for example, one could say: +** +**
+**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
+**  sqlite3_exec(db, zSQL, 0, 0, 0);
+**  sqlite3_free(zSQL);
+** 
+** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** ^(The "%z" formatting option works like "%s" but with the +** addition that after the string has been read and copied into +** the result, [sqlite3_free()] is called on the input string.)^ +*/ +SQLITE_API char *sqlite3_mprintf(const char*,...); +SQLITE_API char *sqlite3_vmprintf(const char*, va_list); +SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** The SQLite core uses these three routines for all of its own +** internal memory allocation needs. "Core" in the previous sentence +** does not include operating-system specific VFS implementation. The +** Windows VFS uses native malloc() and free() for some operations. +** +** ^The sqlite3_malloc() routine returns a pointer to a block +** of memory at least N bytes in length, where N is the parameter. +** ^If sqlite3_malloc() is unable to obtain sufficient free +** memory, it returns a NULL pointer. ^If the parameter N to +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^Calling sqlite3_free() with a pointer previously returned +** by sqlite3_malloc() or sqlite3_realloc() releases that memory so +** that it might be reused. ^The sqlite3_free() routine is +** a no-op if is called with a NULL pointer. Passing a NULL pointer +** to sqlite3_free() is harmless. After being freed, memory +** should neither be read nor written. Even reading previously freed +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** might result if sqlite3_free() is called with a non-NULL pointer that +** was not obtained from sqlite3_malloc() or sqlite3_realloc(). +** +** ^(The sqlite3_realloc() interface attempts to resize a +** prior memory allocation to be at least N bytes, where N is the +** second parameter. The memory allocation to be resized is the first +** parameter.)^ ^ If the first parameter to sqlite3_realloc() +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N) where N is the second parameter to sqlite3_realloc(). +** ^If the second parameter to sqlite3_realloc() is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(P) where P is the first parameter to sqlite3_realloc(). +** ^sqlite3_realloc() returns a pointer to a memory allocation +** of at least N bytes in size or NULL if sufficient memory is unavailable. +** ^If M is the size of the prior allocation, then min(N,M) bytes +** of the prior allocation are copied into the beginning of buffer returned +** by sqlite3_realloc() and the prior allocation is freed. +** ^If sqlite3_realloc() returns NULL, then the prior allocation +** is not freed. +** +** ^The memory returned by sqlite3_malloc() and sqlite3_realloc() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** In SQLite version 3.5.0 and 3.5.1, it was possible to define +** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be used. +** +** The Windows OS interface layer calls +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular Windows +** installation. Memory allocation errors are detected, but +** they are reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +** +** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] +** must be either NULL or else pointers obtained from a prior +** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void sqlite3_free(void*); + +/* +** CAPI3REF: Memory Allocator Statistics +** +** SQLite provides these two interfaces for reporting on the status +** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] +** routines, which form the built-in memory allocation subsystem. +** +** ^The [sqlite3_memory_used()] routine returns the number of bytes +** of memory currently outstanding (malloced but not freed). +** ^The [sqlite3_memory_highwater()] routine returns the maximum +** value of [sqlite3_memory_used()] since the high-water mark +** was last reset. ^The values returned by [sqlite3_memory_used()] and +** [sqlite3_memory_highwater()] include any overhead +** added by SQLite in its implementation of [sqlite3_malloc()], +** but not overhead added by the any underlying system library +** routines that [sqlite3_malloc()] may call. +** +** ^The memory high-water mark is reset to the current value of +** [sqlite3_memory_used()] if and only if the parameter to +** [sqlite3_memory_highwater()] is true. ^The value returned +** by [sqlite3_memory_highwater(1)] is the high-water mark +** prior to the reset. +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_used(void); +SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Pseudo-Random Number Generator +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** the build-in random() and randomblob() SQL functions. This interface allows +** applications to access the same PRNG for other purposes. +** +** ^A call to this routine stores N bytes of randomness into buffer P. +** +** ^The first time this routine is invoked (either internally or by +** the application) the PRNG is seeded using randomness obtained +** from the xRandomness method of the default [sqlite3_vfs] object. +** ^On all subsequent invocations, the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. ^The authorizer callback should +** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. ^If the authorizer callback returns +** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] +** then the [sqlite3_prepare_v2()] or equivalent call that triggered +** the authorizer will fail with an error message. +** +** When the callback returns [SQLITE_OK], that means the operation +** requested is ok. ^When the callback returns [SQLITE_DENY], the +** [sqlite3_prepare_v2()] or equivalent call that triggered the +** authorizer will fail with an error message explaining that +** access is denied. +** +** ^The first parameter to the authorizer callback is a copy of the third +** parameter to the sqlite3_set_authorizer() interface. ^The second parameter +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. ^The third through sixth parameters +** to the callback are zero-terminated strings that contain additional +** details about the action to be authorized. +** +** ^If the action code is [SQLITE_READ] +** and the callback returns [SQLITE_IGNORE] then the +** [prepared statement] statement is constructed to substitute +** a NULL value in place of the table column that would have +** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] +** return can be used to deny an untrusted user access to individual +** columns of a table. +** ^If the action code is [SQLITE_DELETE] and the callback returns +** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the +** [truncate optimization] is disabled and all rows are deleted individually. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** and limiting database size using the [max_page_count] [PRAGMA] +** in addition to using an authorizer. +** +** ^(Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call.)^ ^Disable the authorizer by installing a NULL callback. +** The authorizer is disabled by default. +** +** The authorizer callback must not do anything that will modify +** the database connection that invoked the authorizer callback. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the +** statement might be re-prepared during [sqlite3_step()] due to a +** schema change. Hence, the application should ensure that the +** correct authorizer callback remains in place during the [sqlite3_step()]. +** +** ^Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. Authorization is not +** performed during statement evaluation in [sqlite3_step()], unless +** as stated in the previous paragraph, sqlite3_step() invokes +** sqlite3_prepare_v2() to reprepare a statement after a schema change. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [SQLITE_ROLLBACK | return code] +** from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** These action code values signify what kind of operation is to be +** authorized. The 3rd and 4th parameters to the authorization +** callback function will be parameters or NULL depending on which of these +** codes is used as the second parameter. ^(The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** +** ^The callback function registered by sqlite3_trace() is invoked at +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the +** SQL statement text as the statement first begins executing. +** ^(Additional sqlite3_trace() callbacks might occur +** as each triggered subprogram is entered. The callbacks for triggers +** contain a UTF-8 SQL comment that identifies the trigger.)^ +** +** ^The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes. ^The profile callback contains +** the original statement text and an estimate of wall-clock time +** of how long that statement took to run. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. The +** sqlite3_profile() function is considered experimental and is +** subject to change in future versions of SQLite. +*/ +SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: Query Progress Callbacks +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^If the progress callback returns non-zero, the operation is +** interrupted. This feature can be used to implement a +** "Cancel" button on a GUI progress dialog box. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** +** ^These routines open an SQLite database file as specified by the +** filename argument. ^The filename argument is interpreted as UTF-8 for +** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte +** order for sqlite3_open16(). ^(A [database connection] handle is usually +** returned in *ppDb, even if an error occurs. The only exception is that +** if SQLite is unable to allocate memory to hold the [sqlite3] object, +** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] +** object.)^ ^(If the database is opened (and/or created) successfully, then +** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding for the database will be UTF-8 if +** sqlite3_open() or sqlite3_open_v2() is called and +** UTF-16 in the native byte order if sqlite3_open16() is used. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** The sqlite3_open_v2() interface works like sqlite3_open() +** except that it accepts two additional parameters for additional control +** over the new database connection. ^(The flags parameter to +** sqlite3_open_v2() can take one of +** the following three values, optionally combined with the +** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], +** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ +** +**
+** ^(
[SQLITE_OPEN_READONLY]
+**
The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
)^ +** +** ^(
[SQLITE_OPEN_READWRITE]
+**
The database is opened for reading and writing if possible, or reading +** only if the file is write protected by the operating system. In either +** case the database must already exist, otherwise an error is returned.
)^ +** +** ^(
[SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
+**
The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
)^ +**
+** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. +** +** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection +** opens in the multi-thread [threading mode] as long as the single-thread +** mode has not been set at compile-time or start-time. ^If the +** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens +** in the serialized [threading mode] unless single-thread was +** previously selected at compile-time or start-time. +** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be +** eligible to use [shared cache mode], regardless of whether or not shared +** cache is enabled using [sqlite3_enable_shared_cache()]. ^The +** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not +** participate in [shared cache mode] even if it is enabled. +** +** ^The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system interface that +** the new database connection should use. ^If the fourth parameter is +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. ^This in-memory database will vanish when +** the database connection is closed. Future versions of SQLite might +** make use of additional special filenames that begin with the ":" character. +** It is recommended that when a database filename actually does begin with +** a ":" character you should prefix the filename with a pathname such as +** "./" to avoid ambiguity. +** +** ^If the filename is an empty string, then a private, temporary +** on-disk database will be created. ^This private database will be +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

URI Filenames

+** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the fourth argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** As of SQLite version 3.7.7, URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^On windows, the first component of an absolute path +** is a drive specification (e.g. "C:"). +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite interprets the following three query parameters: +** +**
    +**
  • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
  • mode: ^(The mode parameter may be set to either "ro", "rw" or +** "rwc". Attempting to set it to any other value is an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_prepare_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If sqlite3_open_v2() is +** used, it is an error to specify a value for the mode parameter that is +** less restrictive than that specified by the flags passed as the third +** parameter. +** +**
  • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behaviour requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +**
+** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

URI filename examples

+** +**
+**
URI filenames Results +**
file:data.db +** Open the file "data.db" in the current directory. +**
file:/home/fred/data.db
+** file:///home/fred/data.db
+** file://localhost/home/fred/data.db
+** Open the database file "/home/fred/data.db". +**
file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
+** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
file:/home/fred/data.db?vfs=unix-nolock +** Open file "/home/fred/data.db". Use the special VFS "unix-nolock". +**
file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +**
+** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** sqlite3_open() or sqlite3_open_v2(). +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to VFS implementations, that check +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** If F is the database filename pointer passed into the xOpen() method of +** a VFS implementation when the flags parameter to xOpen() has one or +** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and +** P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The value of P is true if it is "yes" or "true" or "on" or +** a non-zero number and is false otherwise. If P is not a query parameter +** on F then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that SQLite passed into the xOpen +** VFS method, then the behavior of this routine is undefined and probably +** undesirable. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); + + +/* +** CAPI3REF: Error Codes And Messages +** +** ^The sqlite3_errcode() interface returns the numeric [result code] or +** [extended result code] for the most recent failed sqlite3_* API call +** associated with a [database connection]. If a prior API call failed +** but the most recent API call succeeded, the return value from +** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() +** interface is the same except that it always returns the +** [extended result code] even when extended result codes are +** disabled. +** +** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(Memory to hold the error message string is managed internally. +** The application does not need to worry about freeing the result. +** However, the error string might be overwritten or deallocated by +** subsequent calls to other SQLite interface functions.)^ +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** If an interface fails with SQLITE_MISUSE, that means the interface +** was invoked incorrectly by the application. In that case, the +** error code and message may or may not be set. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); + +/* +** CAPI3REF: SQL Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement. +** This object is variously known as a "prepared statement" or a +** "compiled SQL statement" or simply as a "statement". +** +** The life of a statement object goes something like this: +** +**
    +**
  1. Create the object using [sqlite3_prepare_v2()] or a related +** function. +**
  2. Bind values to [host parameters] using the sqlite3_bind_*() +** interfaces. +**
  3. Run the SQL by calling [sqlite3_step()] one or more times. +**
  4. Reset the statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
  5. Destroy the object using [sqlite3_finalize()]. +**
+** +** Refer to documentation on individual methods above for additional +** information. +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** +** ^(This interface allows the size of various constructs to be limited +** on a connection by connection basis. The first parameter is the +** [database connection] whose limit is to be set or queried. The +** second parameter is one of the [limit categories] that define a +** class of constructs to be size limited. The third parameter is the +** new limit for that construct.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (The "_LIMIT_" in the name is changed to "_MAX_".))^ +** ^Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper bound. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** Run-time limits are intended for use in applications that manage +** both their own internal database and also databases that are controlled +** by untrusted external sources. An example application might be a +** web browser that has its own databases for storing history and +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** CAPI3REF: Run-Time Limit Categories +** KEYWORDS: {limit category} {*limit categories} +** +** These constants define various performance limits +** that can be lowered at run-time using [sqlite3_limit()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
+** [[SQLITE_LIMIT_LENGTH]] ^(
SQLITE_LIMIT_LENGTH
+**
The maximum size of any string or BLOB or table row, in bytes.
)^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
SQLITE_LIMIT_SQL_LENGTH
+**
The maximum length of an SQL statement, in bytes.
)^ +** +** [[SQLITE_LIMIT_COLUMN]] ^(
SQLITE_LIMIT_COLUMN
+**
The maximum number of columns in a table definition or in the +** result set of a [SELECT] or the maximum number of columns in an index +** or in an ORDER BY or GROUP BY clause.
)^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
SQLITE_LIMIT_EXPR_DEPTH
+**
The maximum depth of the parse tree on any expression.
)^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
SQLITE_LIMIT_COMPOUND_SELECT
+**
The maximum number of terms in a compound SELECT statement.
)^ +** +** [[SQLITE_LIMIT_VDBE_OP]] ^(
SQLITE_LIMIT_VDBE_OP
+**
The maximum number of instructions in a virtual machine program +** used to implement an SQL statement. This limit is not currently +** enforced, though that might be added in some future release of +** SQLite.
)^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
SQLITE_LIMIT_FUNCTION_ARG
+**
The maximum number of arguments on a function.
)^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
SQLITE_LIMIT_ATTACHED
+**
The maximum number of [ATTACH | attached databases].)^
+** +** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] +** ^(
SQLITE_LIMIT_LIKE_PATTERN_LENGTH
+**
The maximum length of the pattern argument to the [LIKE] or +** [GLOB] operators.
)^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
SQLITE_LIMIT_VARIABLE_NUMBER
+**
The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
SQLITE_LIMIT_TRIGGER_DEPTH
+**
The maximum depth of recursion for triggers.
)^ +**
+*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** +** To execute an SQL query, it must first be compiled into a byte-code +** program using one of these routines. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() +** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() +** use UTF-16. +** +** ^If the nByte argument is less than zero, then zSql is read up to the +** first zero terminator. ^If nByte is non-negative, then it is the maximum +** number of bytes read from zSql. ^When nByte is non-negative, the +** zSql string ends at either the first '\000' or '\u0000' character or +** the nByte-th byte, whichever comes first. If the caller knows +** that the supplied string is nul-terminated, then there is a small +** performance advantage to be gained by passing an nByte parameter that +** is equal to the number of bytes in the input string including +** the nul-terminator bytes as this saves SQLite from having to +** make a copy of the input string. +** +** ^If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. +** +** ^*ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set +** to NULL. ^If the input text contains no SQL (if the input is an empty +** string or a comment) then *ppStmt is set to NULL. +** The calling procedure is responsible for deleting the compiled +** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. +** +** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are +** recommended for all new programs. The two older interfaces are retained +** for backwards compatibility, but their use is discouraged. +** ^In the "v2" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave differently in three ways: +** +**
    +**
  1. +** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. +**
  2. +** +**
  3. +** ^When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. ^The legacy behavior was that +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** and the application would have to make a second call to [sqlite3_reset()] +** in order to find the underlying cause of the problem. With the "v2" prepare +** interfaces, the underlying reason for the error is returned immediately. +**
  4. +** +**
  5. +** ^If the specific value bound to [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will be automatically recompiled, as if there had been +** a schema change, on the first [sqlite3_step()] call following any change +** to the [sqlite3_bind_text | bindings] of that [parameter]. +** ^The specific value of WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +** the +**
  6. +**
+*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** +** ^This interface can be used to retrieve a saved copy of the original +** SQL text used to create a [prepared statement] if that statement was +** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**
+**    SELECT eval('DELETE FROM t1') FROM t2;
+** 
+** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has not run to completion and/or has not +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** CAPI3REF: Dynamically Typed Value Object +** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} +** +** SQLite uses the sqlite3_value object to represent all values +** that can be stored in a database table. SQLite uses dynamic typing +** for the values it stores. ^Values stored in sqlite3_value objects +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^The sqlite3_value objects that are passed as parameters into the +** implementation of [application-defined SQL functions] are protected. +** ^The sqlite3_value object returned by +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used with +** [sqlite3_result_value()] and [sqlite3_bind_value()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct Mem sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. ^A pointer to an sqlite3_context object +** is always first parameter to [application-defined SQL functions]. +** The application-defined SQL function implementation will pass this +** pointer through into calls to [sqlite3_result_int | sqlite3_result()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** +** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, +** literals may be replaced by a [parameter] that matches one of following +** templates: +** +**
    +**
  • ? +**
  • ?NNN +**
  • :VVV +**
  • @VVV +**
  • $VVV +**
+** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^The values of these +** parameters (also called "host parameter names" or "SQL parameters") +** can be set using the sqlite3_bind_*() routines defined here. +** +** ^The first argument to the sqlite3_bind_*() routines is always +** a pointer to the [sqlite3_stmt] object returned from +** [sqlite3_prepare_v2()] or its variants. +** +** ^The second argument is the index of the SQL parameter to be set. +** ^The leftmost SQL parameter has an index of 1. ^When the same named +** SQL parameter is used more than once, second and subsequent +** occurrences have the same index as the first occurrence. +** ^The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. ^The index +** for "?NNN" parameters is the value of NNN. +** ^The NNN value must be between 1 and the [sqlite3_limit()] +** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). +** +** ^The third argument is the value to bind to the parameter. +** +** ^(In those routines that have a fourth argument, its value is the +** number of bytes in the parameter. To be clear: the value is the +** number of bytes in the value, not the number of characters.)^ +** ^If the fourth parameter is negative, the length of the string is +** the number of bytes up to the first zero terminator. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() then that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occur at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to sqlite3_bind_blob(), sqlite3_bind_text(), and +** sqlite3_bind_text16() is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. ^The destructor is called +** to dispose of the BLOB or string even if the call to sqlite3_bind_blob(), +** sqlite3_bind_text(), or sqlite3_bind_text16() fails. +** ^If the fifth argument is +** the special value [SQLITE_STATIC], then SQLite assumes that the +** information is in static, unmanaged space and does not need to be freed. +** ^If the fifth argument has the value [SQLITE_TRANSIENT], then +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. ^A zeroblob uses a fixed amount of memory +** (just an integer to hold its size) while it is being processed. +** Zeroblobs are intended to serve as placeholders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | incremental BLOB I/O] routines. +** ^A negative value for the zeroblob results in a zero-length BLOB. +** +** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer +** for the [prepared statement] or with a prepared statement for which +** [sqlite3_step()] has been called more recently than [sqlite3_reset()], +** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() +** routine is passed a [prepared statement] that has been finalized, the +** result is undefined and probably harmful. +** +** ^Bindings are not cleared by the [sqlite3_reset()] routine. +** ^Unbound parameters are interpreted as NULL. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_RANGE] is returned if the parameter +** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. +** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); + +/* +** CAPI3REF: Number Of SQL Parameters +** +** ^This routine can be used to find the number of [SQL parameters] +** in a [prepared statement]. SQL parameters are tokens of the +** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as +** placeholders for values that are [sqlite3_bind_blob | bound] +** to the parameters at a later time. +** +** ^(This routine actually returns the index of the largest (rightmost) +** parameter. For all forms except ?NNN, this will correspond to the +** number of unique parameters. If parameters of the ?NNN form are used, +** there may be gaps in the list.)^ +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_name()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** +** ^The sqlite3_bind_parameter_name(P,N) interface returns +** the name of the N-th [SQL parameter] in the [prepared statement] P. +** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" +** respectively. +** In other words, the initial ":" or "$" or "@" or "?" +** is included as part of the name.)^ +** ^Parameters of the form "?" without a following integer have no name +** and are referred to as "nameless" or "anonymous parameters". +** +** ^The first host parameter has an index of 1, not 0. +** +** ^If the value N is out of range or if the N-th parameter is +** nameless, then NULL is returned. ^The returned string is +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()] or +** [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** +** ^Return the index of an SQL parameter given its name. ^The +** index value returned is suitable for use as the second +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero +** is returned if no matching parameter is found. ^The parameter +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** +** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset +** the [sqlite3_bind_blob | bindings] on a [prepared statement]. +** ^Use this routine to reset all host parameters to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^This routine returns 0 if pStmt is an SQL +** statement that does not return data (for example an [UPDATE]). +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** +** ^These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. ^The sqlite3_column_name() +** interface returns a pointer to a zero-terminated UTF-8 string +** and sqlite3_column_name16() returns a pointer to a zero-terminated +** UTF-16 string. ^The first parameter is the [prepared statement] +** that implements the [SELECT] statement. ^The second parameter is the +** column number. ^The leftmost column is number 0. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the next call to +** sqlite3_column_name() or sqlite3_column_name16() on the same column. +** +** ^If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +** +** ^The name of a result column is the value of the "AS" clause for +** that column, if there is an AS clause. If there is no AS clause +** then the name of the column is unspecified and may change from +** one release of SQLite to the next. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result +** +** ^These routines provide a means to determine the database, table, and +** table column that is the origin of a particular result column in +** [SELECT] statement. +** ^The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. ^The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. +** ^The returned string is valid until the [prepared statement] is destroyed +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^The first argument to these interfaces is a [prepared statement]. +** ^These functions return information about the Nth result column returned by +** the statement, where N is the second function argument. +** ^The left-most column is column 0 for these routines. +** +** ^If the Nth column returned by the statement is an expression or +** subquery and is not a column value, then all of these functions return +** NULL. ^These routine might also return NULL if a memory allocation error +** occurs. ^Otherwise, they return the name of the attached database, table, +** or column that query result column was extracted from. +** +** ^As with all other SQLite APIs, those whose names end with "16" return +** UTF-16 encoded strings and the other functions return UTF-8. +** +** ^These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. +** +** If two or more threads call one or more of these routines against the same +** prepared statement and column at the same time then the results are +** undefined. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result +** +** ^(The first parameter is a [prepared statement]. +** If this statement is a [SELECT] statement and the Nth column of the +** returned result set of that [SELECT] is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned.)^ ^If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** this routine would return the string "VARIANT" for the second result +** column (i==1), and a NULL pointer for the first result column (i==0).)^ +** +** ^SQLite uses dynamic run-time typing. ^So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. ^Type +** is associated with individual values, not with the containers +** used to hold those values. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement +** +** After a [prepared statement] has been prepared using either +** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "v2" interface +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "v2" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** ^In the legacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^With the "v2" interface, any of the other [result codes] or +** [extended result codes] might be returned as well. +** +** ^[SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. ^If the statement is a [COMMIT] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] +** is returned each time a new row of data is ready for processing by the +** caller. The values may be accessed using the [column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** ^[SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** ^With the legacy interface, a more specific error code (for example, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [prepared statement]. ^In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, +** then the more specific [error codes] are returned directly +** by sqlite3_step(). The use of the "v2" interface is recommended. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
    +**
  • 64-bit signed integer +**
  • 64-bit IEEE floating point number +**
  • string +**
  • BLOB +**
  • NULL +**
)^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** +** These routines form the "result set" interface. +** +** ^These routines return information about a single column of the current +** result row of a query. ^In every case the first argument is a pointer +** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] +** that was returned from [sqlite3_prepare_v2()] or one of its variants) +** and the second argument is the index of the column for which information +** should be returned. ^The leftmost column of the result set has the index 0. +** ^The number of columns in the result can be determined using +** [sqlite3_column_count()]. +** +** If the SQL statement does not currently point to a valid row, or if the +** column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** ^The sqlite3_column_type() routine returns the +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. ^The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value +** returned by sqlite3_column_type() is only meaningful if no type +** conversions have occurred as described below. After a type conversion, +** the value returned by sqlite3_column_type() is undefined. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of +** bytes in the string, not the number of characters. +** +** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero-terminated. ^The return +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. An unprotected sqlite3_value object +** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], then the behavior is undefined. +** +** These routines attempt to convert the value where appropriate. ^For +** example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to perform the +** conversion automatically. ^(The following table details the conversions +** that are applied: +** +**
+** +**
Internal
Type
Requested
Type
Conversion +** +**
NULL INTEGER Result is 0 +**
NULL FLOAT Result is 0.0 +**
NULL TEXT Result is NULL pointer +**
NULL BLOB Result is NULL pointer +**
INTEGER FLOAT Convert from integer to float +**
INTEGER TEXT ASCII rendering of the integer +**
INTEGER BLOB Same as INTEGER->TEXT +**
FLOAT INTEGER Convert from float to integer +**
FLOAT TEXT ASCII rendering of the float +**
FLOAT BLOB Same as FLOAT->TEXT +**
TEXT INTEGER Use atoi() +**
TEXT FLOAT Use atof() +**
TEXT BLOB No change +**
BLOB INTEGER Convert to TEXT then use atoi() +**
BLOB FLOAT Convert to TEXT then use atof() +**
BLOB TEXT Add a zero terminator if needed +**
+**
)^ +** +** The table above makes reference to standard C library functions atoi() +** and atof(). SQLite does not really use these functions. It has its +** own equivalent internal routines. The atoi() and atof() names are +** used in the table for brevity and because they are familiar to most +** C programmers. +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
    +**
  • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
  • +**
  • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
  • +**
  • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.
  • +**
+** +** ^Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometimes they +** are not possible and in those cases prior pointers are invalidated. +** +** The safest and easiest to remember policy is to invoke these routines +** in one of the following ways: +** +**
    +**
  • sqlite3_column_text() followed by sqlite3_column_bytes()
  • +**
  • sqlite3_column_blob() followed by sqlite3_column_bytes()
  • +**
  • sqlite3_column_text16() followed by sqlite3_column_bytes16()
  • +**
+** +** In other words, you should call sqlite3_column_text(), +** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() +** with calls to sqlite3_column_bytes(). +** +** ^The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** ^(If a memory allocation error occurs during the evaluation of any +** of these routines, a default value is returned. The default value +** is either the integer 0, the floating point number 0.0, or a NULL +** pointer. Subsequent calls to [sqlite3_errcode()] will return +** [SQLITE_NOMEM].)^ +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** +** The sqlite3_reset() function is called to reset a [prepared statement] +** object back to its initial state, ready to be re-executed. +** ^Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions +** KEYWORDS: {function creation routines} +** KEYWORDS: {application-defined SQL function} +** KEYWORDS: {application-defined SQL functions} +** +** ^These functions (collectively known as "function creation routines") +** are used to add SQL functions or aggregates or to redefine the behavior +** of existing SQL functions or aggregates. The only differences between +** these routines are the text encoding expected for +** the second parameter (the name of the function being created) +** and the presence or absence of a destructor callback for +** the application data pointer. +** +** ^The first parameter is the [database connection] to which the SQL +** function is to be added. ^If an application uses more than one database +** connection then application-defined SQL functions must be added +** to each database connection separately. +** +** ^The second parameter is the name of the SQL function to be created or +** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^The third parameter (nArg) +** is the number of arguments that the SQL function or +** aggregate takes. ^If this parameter is -1, then the SQL function or +** aggregate may take any number of arguments between 0 and the limit +** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third +** parameter is less than -1 or greater than 127 then the behavior is +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. Every SQL function implementation must be able to work +** with UTF-8, UTF-16le, or UTF-16be. But some implementations may be +** more efficient with one encoding than another. ^An application may +** invoke sqlite3_create_function() or sqlite3_create_function16() multiple +** times with the same function but with different values of eTextRep. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** If there is only a single implementation which does not care what text +** encoding is used, then the fourth argument should be [SQLITE_ANY]. +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL function or +** aggregate. ^A scalar SQL function requires an implementation of the xFunc +** callback only; NULL pointers must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, +** then it is destructor for the application data pointer. +** The destructor is invoked when the function is deleted, either by being +** overloaded or when the database connection closes.)^ +** ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. +** ^When the destructor callback of the tenth parameter is invoked, it +** is passed a single argument which is a copy of the application data +** pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing preferred text encodings. ^SQLite will use +** the implementation that most closely matches the way in which the +** SQL function is used. ^A function implementation with a non-negative +** nArg parameter is a better match than a function implementation with +** a negative nArg. ^A function where the preferred text encoding +** matches the database encoding is a better +** match than a function where the encoding is different. +** ^A function where the encoding difference is between UTF16le and UTF16be +** is a closer match than a function where the encoding difference is +** between UTF8 and UTF16. +** +** ^Built-in functions may be overloaded by new application-defined functions. +** +** ^An application-defined function is permitted to call other +** SQLite interfaces. However, such calls must not +** close the database connection nor finalize or reset the prepared +** statement in which the function is running. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 +#define SQLITE_UTF16LE 2 +#define SQLITE_UTF16BE 3 +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* sqlite3_create_function only */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To help encourage people to avoid +** using these functions, we are not going to tell you what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int),void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Function Parameter Values +** +** The C-language implementation of SQL functions and aggregates uses +** this set of interface routines to access the parameter values on +** the function or aggregate. +** +** The xFunc (for scalar functions) or xStep (for aggregates) parameters +** to [sqlite3_create_function()] and [sqlite3_create_function16()] +** define callbacks that implement the SQL functions and aggregates. +** The 3rd parameter to these callbacks is an array of pointers to +** [protected sqlite3_value] objects. There is one [sqlite3_value] object for +** each parameter to the SQL function. These routines are used to +** extract values from the [sqlite3_value] objects. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** object results in undefined behavior. +** +** ^These routines work just like the corresponding [column access functions] +** except that these routines take a single [protected sqlite3_value] object +** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. +** +** ^The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. ^The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** ^(The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in other +** words, if the value is a string that looks like a number) +** then the conversion is performed. Otherwise no conversion occurs. +** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** +** Implementations of aggregate SQL functions use this +** routine to allocate memory for storing their state. +** +** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** for a particular aggregate function, SQLite +** allocates N of memory, zeroes out that memory, and returns a pointer +** to the new memory. ^On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function instance, +** the same buffer is returned. Sqlite3_aggregate_context() is normally +** called once for each invocation of the xStep callback and then one +** last time when the xFinal callback is invoked. ^(When no rows match +** an aggregate query, the xStep() callback of the aggregate function +** implementation is never called and xFinal() is called exactly once. +** In those cases, sqlite3_aggregate_context() might be called for the +** first time from within xFinal().)^ +** +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer if N is +** less than or equal to zero or if a memory allocate error occurs. +** +** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is +** determined by the N parameter on first successful call. Changing the +** value of N in subsequent call to sqlite3_aggregate_context() within +** the same aggregate function instance will not resize the memory +** allocation.)^ +** +** ^SQLite automatically frees the memory allocated by +** sqlite3_aggregate_context() when the aggregate query concludes. +** +** The first parameter must be a copy of the +** [sqlite3_context | SQL function context] that is the first parameter +** to the xStep or xFinal callback routine that implements the aggregate +** function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** +** ^The sqlite3_user_data() interface returns a copy of +** the pointer that was the pUserData parameter (the 5th parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** +** ^The sqlite3_context_db_handle() interface returns a copy of +** the pointer to the [database connection] (the 1st parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** +** The following two functions may be used by scalar SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. This may +** be used, for example, to add a regular-expression matching scalar +** function. The compiled version of the regular expression is stored as +** metadata associated with the SQL value passed as the regular expression +** pattern. The compiled regular expression can be reused on multiple +** invocations of the same function so that the original pattern string +** does not need to be recompiled on each invocation. +** +** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata() function with the Nth argument +** value to the application-defined function. ^If no metadata has been ever +** been set for the Nth argument of the function, or if the corresponding +** function parameter has changed since the meta-data was set, +** then sqlite3_get_auxdata() returns a NULL pointer. +** +** ^The sqlite3_set_auxdata() interface saves the metadata +** pointed to by its 3rd parameter as the metadata for the N-th +** argument of the application-defined function. Subsequent +** calls to sqlite3_get_auxdata() might return this data, if it has +** not been destroyed. +** ^If it is not NULL, SQLite will invoke the destructor +** function given by the 4th parameter to sqlite3_set_auxdata() on +** the metadata when the corresponding function parameter changes +** or when the SQL statement completes, whichever comes first. +** +** SQLite is free to call the destructor and drop metadata on any +** parameter of any function at any time. ^The only guarantee is that +** the destructor will be called before the metadata is dropped. +** +** ^(In practice, metadata is preserved between function calls for +** expressions that are constant at compile time. This includes literal +** values and [parameters].)^ +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); +SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior +** +** These are special values for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. ^If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. ^The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. See ticket #2191. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** functions used to bind values to host parameters in prepared statements. +** Refer to the [SQL parameter] documentation for additional information. +** +** ^The sqlite3_result_blob() interface sets the result from +** an application-defined function to be the BLOB whose content is pointed +** to by the second parameter and which is N bytes long where N is the +** third parameter. +** +** ^The sqlite3_result_zeroblob() interfaces set the result of +** the application-defined function to be a BLOB containing all zero +** bytes and N bytes in size, where N is the value of the 2nd parameter. +** +** ^The sqlite3_result_double() interface sets the result from +** an application-defined function to be a floating point value specified +** by its 2nd argument. +** +** ^The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. +** ^SQLite uses the string pointed to by the +** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() +** as the text of an error message. ^SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. ^SQLite +** interprets the string from sqlite3_result_error16() as UTF-16 in native +** byte order. ^If the third parameter to sqlite3_result_error() +** or sqlite3_result_error16() is negative then SQLite takes as the error +** message all text up through the first zero character. +** ^If the third parameter to sqlite3_result_error() or +** sqlite3_result_error16() is non-negative then SQLite takes that many +** bytes (not characters) from the 2nd parameter as the error message. +** ^The sqlite3_result_error() and sqlite3_result_error16() +** routines make a private copy of the error message text before +** they return. Hence, the calling function can deallocate or +** modify the text after they return without harm. +** ^The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. ^By default, +** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_toobig() interface causes SQLite to throw an error +** indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_nomem() interface causes SQLite to throw an error +** indicating that a memory allocation failed. +** +** ^The sqlite3_result_int() interface sets the return value +** of the application-defined function to be the 32-bit signed integer +** value given in the 2nd argument. +** ^The sqlite3_result_int64() interface sets the return value +** of the application-defined function to be the 64-bit signed integer +** value given in the 2nd argument. +** +** ^The sqlite3_result_null() interface sets the return value +** of the application-defined function to be NULL. +** +** ^The sqlite3_result_text(), sqlite3_result_text16(), +** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces +** set the return value of the application-defined function to be +** a text string which is represented as UTF-8, UTF-16 native byte order, +** UTF-16 little endian, or UTF-16 big endian, respectively. +** ^SQLite takes the text result from the application from +** the 2nd parameter of the sqlite3_result_text* interfaces. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is negative, then SQLite takes result text from the 2nd parameter +** through the first zero character. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is non-negative, then as many bytes (not characters) of the text +** pointed to by the 2nd parameter are taken as the application-defined +** function result. If the 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that +** function as the destructor on the text or BLOB result when it has +** finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces or to +** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite +** assumes that the text or BLOB result is in constant space and does not +** copy the content of the parameter nor call a destructor on the content +** when it has finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained from +** from [sqlite3_malloc()] before it returns. +** +** ^The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy the +** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The +** sqlite3_result_value() interface makes a copy of the [sqlite3_value] +** so that the [sqlite3_value] specified in the parameter may change or +** be deallocated after sqlite3_result_value() returns without harm. +** ^A [protected sqlite3_value] object may always be used where an +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** If these routines are called from within the different thread +** than the one containing the application-defined function that received +** the [sqlite3_context] pointer, the results are undefined. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); + +/* +** CAPI3REF: Define New Collating Sequences +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
    +**
  • [SQLITE_UTF8], +**
  • [SQLITE_UTF16LE], +**
  • [SQLITE_UTF16BE], +**
  • [SQLITE_UTF16], or +**
  • [SQLITE_UTF16_ALIGNED]. +**
)^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCallback. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCallback argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The collating function must return an +** integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
    +**
  1. If A==B then B==A. +**
  2. If A==B and B==C then A==C. +**
  3. If A<B THEN B>A. +**
  4. If A<B and B<C then A<C. +**
+** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** +** ^To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** [database connection] to be invoked whenever an undefined collation +** sequence is required. +** +** ^If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). The second argument is the database +** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], +** or [SQLITE_UTF16LE], indicating the most desirable form of the collation +** sequence function required. The fourth parameter is the name of the +** required collation sequence.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +#ifdef SQLITE_HAS_CODEC +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); + +/* +** Specify the activation key for a SEE database. Unless +** activated, none of the SEE routines will work. +*/ +SQLITE_API void sqlite3_activate_see( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** The sqlite3_sleep() function causes the current thread to suspend execution +** for at least a number of milliseconds specified in its parameter. +** +** If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** ^SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all temporary files +** created by SQLite when using a built-in [sqlite3_vfs | VFS] +** will be placed in that directory.)^ ^If this variable +** is a NULL pointer, then SQLite performs a search for an appropriate +** temporary file directory. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +*/ +SQLITE_API char *sqlite3_temp_directory; + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** +** ^The sqlite3_get_autocommit() interface returns non-zero or +** zero if the given database connection is or is not in autocommit mode, +** respectively. ^Autocommit mode is on by default. +** ^Autocommit mode is disabled by a [BEGIN] statement. +** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** +** ^The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. ^The [database connection] +** returned by sqlite3_db_handle is the same [database connection] +** that was the first argument +** to the [sqlite3_prepare_v2()] call (or its variants) that was used to +** create the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename +** associated with database N of connection D. ^The main database file +** has the name "main". If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** a NULL pointer is returned. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Find the next prepared statement +** +** ^This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. ^If pStmt is NULL +** then this interface returns a pointer to the first prepared statement +** associated with the database connection pDb. ^If no prepared statement +** satisfies the conditions of this routine, it returns NULL. +** +** The [database connection] pointer D in a call to +** [sqlite3_next_stmt(D,S)] must refer to an open database +** connection and in particular must not be a NULL pointer. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** +** ^The sqlite3_commit_hook() interface registers a callback +** function to be invoked whenever a transaction is [COMMIT | committed]. +** ^Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** ^The sqlite3_rollback_hook() interface registers a callback +** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. +** ^Any callback set by a previous call to sqlite3_rollback_hook() +** for the same database connection is overridden. +** ^The pArg argument is passed through to the callback. +** ^If the callback on a commit hook function returns non-zero, +** then the commit is converted into a rollback. +** +** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions +** return the P argument from the previous call of the same function +** on the same [database connection] D, or NULL for +** the first call for each function on D. +** +** The commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^Registering a NULL function disables the callback. +** +** ^When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. ^If the commit hook +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^The rollback hook is invoked on a rollback that results from a commit +** hook returning non-zero, just as it would be with any other rollback. +** +** ^For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. +** ^The rollback callback is not invoked if a transaction is +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Data Change Notification Callbacks +** +** ^The sqlite3_update_hook() interface registers a callback function +** with the [database connection] identified by the first argument +** to be invoked whenever a row is updated, inserted or deleted. +** ^Any callback set by a previous call to this function +** for the same database connection is overridden. +** +** ^The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted. +** ^The first argument to the callback is a copy of the third argument +** to sqlite3_update_hook(). +** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** or [SQLITE_UPDATE], depending on the operation that caused the callback +** to be invoked. +** ^The third and fourth arguments to the callback contain pointers to the +** database and table name containing the affected row. +** ^The final callback parameter is the [rowid] of the row. +** ^In the case of an update, this is the [rowid] after the update takes place. +** +** ^(The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence).)^ +** +** ^In the current implementation, the update hook +** is not invoked when duplication rows are deleted because of an +** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook +** invoked when rows are deleted using the [truncate optimization]. +** The exceptions defined in this paragraph might change in a future +** release of SQLite. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^The sqlite3_update_hook(D,C,P) function +** returns the P argument from the previous call +** on the same [database connection] D, or NULL for +** the first call on D. +** +** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] +** interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache +** KEYWORDS: {shared cache} +** +** ^(This routine enables or disables the sharing of the database cache +** and schema data structures between [database connection | connections] +** to the same database. Sharing is enabled if the argument is true +** and disabled if the argument is false.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, +** sharing was enabled or disabled for each thread separately. +** +** ^(The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** Existing database connections continue use the sharing mode +** that was in effect at the time they were opened.)^ +** +** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise.)^ +** +** ^Shared cache is disabled by default. But this might change in +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** held by the database library. Memory used to cache database +** pages to improve performance is an example of non-essential memory. +** ^sqlite3_release_memory() returns the number of bytes actually freed, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is effect even +** when then [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The return value from sqlite3_soft_heap_limit64() is the size of +** the soft heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the soft heap limit. Hence, the current +** size of the soft heap limit can be determined by invoking +** sqlite3_soft_heap_limit64() with a negative argument. +** +** ^If the argument N is zero then the soft heap limit is disabled. +** +** ^(The soft heap limit is not enforced in the current implementation +** if one or more of following conditions are true: +** +**
    +**
  • The soft heap limit is set to zero. +**
  • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
  • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
  • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
)^ +** +** Beginning with SQLite version 3.7.3, the soft heap limit is enforced +** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] +** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], +** the soft heap limit is enforced on every memory allocation. Without +** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced +** when memory is allocated by the page cache. Testing suggests that because +** the page cache is the predominate memory user in SQLite, most +** applications will achieve adequate soft heap limit enforcement without +** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** The circumstances under which SQLite will enforce the soft heap limit may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** +** ^This routine returns metadata about a specific column of a specific +** database table accessible using the [database connection] handle +** passed as the first function argument. +** +** ^The column is identified by the second, third and fourth parameters to +** this function. ^The second parameter is either the name of the database +** (i.e. "main", "temp", or an attached database) containing the specified +** table or NULL. ^If it is NULL, then all attached databases are searched +** for the table using the same algorithm used by the database engine to +** resolve unqualified table references. +** +** ^The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. Neither of these parameters +** may be NULL. +** +** ^Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. ^Any of these arguments may be +** NULL, in which case the corresponding element of metadata is omitted. +** +** ^(
+** +**
Parameter Output
Type
Description +** +**
5th const char* Data type +**
6th const char* Name of default collation sequence +**
7th int True if column has a NOT NULL constraint +**
8th int True if column is part of the PRIMARY KEY +**
9th int True if column is [AUTOINCREMENT] +**
+**
)^ +** +** ^The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid only until the next +** call to any SQLite API function. +** +** ^If the specified table is actually a view, an [error code] is returned. +** +** ^If the specified column is "rowid", "oid" or "_rowid_" and an +** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. ^(If there is no +** explicitly declared [INTEGER PRIMARY KEY] column, then the output +** parameters are set as follows: +** +**
+**     data type: "INTEGER"
+**     collation sequence: "BINARY"
+**     not null: 0
+**     primary key: 1
+**     auto increment: 0
+** 
)^ +** +** ^(This function may load one or more schemas from database files. If an +** error occurs during this process, or if the requested table or column +** cannot be found, an [error code] is returned and an error message left +** in the [database connection] (to be retrieved using sqlite3_errmsg()).)^ +** +** ^This API is only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol defined. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** SQLite extension library contained in the file zFile. +** +** ^The entry point is zProc. +** ^zProc may be 0, in which case the name of the entry point +** defaults to "sqlite3_extension_init". +** ^The sqlite3_load_extension() interface returns +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. The calling function +** should free this memory by calling [sqlite3_free()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] prior to calling this API, +** otherwise an error will be returned. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** +** ^So as not to open security holes in older applications that are +** unprepared to deal with extension loading, and as a means of disabling +** extension loading while evaluating user-entered SQL, the following API +** is provided to turn the [sqlite3_load_extension()] mechanism on and off. +** +** ^Extension loading is off by default. See ticket #1863. +** ^Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked SQLite extension +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects and integer result as if the signature of the +** entry point where as follows: +** +**
+**    int xEntryPoint(
+**      sqlite3 *db,
+**      const char **pzErrMsg,
+**      const struct sqlite3_api_routines *pThunk
+**    );
+** 
)^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()]. +*/ +SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table module", +** defines the implementation of a [virtual tables]. +** This structure consists mostly of methods for the module. +** +** ^A virtual table module is created by filling in a persistent +** instance of this structure and passing a pointer to that instance +** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. +** ^The registration remains valid until it is replaced by a different +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** ^(The aConstraint[] array records WHERE clause constraints of the form: +** +**
column OP expr
+** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(The index of the column is stored in +** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot.)^ +** +** ^The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** ^The aConstraint[] array only reports WHERE clause terms that are +** relevant to the particular virtual table being queried. +** +** ^Information about the ORDER BY clause is stored in aOrderBy[]. +** ^Each term of aOrderBy records a column of the ORDER BY clause. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. ^If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[sqlite3_free()] is used to free idxPtr if and only if +** needToFreeIdxPtr is true. +** +** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** ^The estimatedCost value is an estimate of the cost of doing the +** particular lookup. A full scan of a table with N entries should have +** a cost of N. A binary search of a table of N entries should have a +** cost of approximately log(N). +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column on left-hand side of constraint */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ +}; + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros defined the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the wHERE clause of +** a query that uses a [virtual table]. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** +** ^These routines are used to register a new [virtual table module] name. +** ^Module names must be registered before +** creating a new [virtual table] using the module and before using a +** preexisting [virtual table] for the module. +** +** ^The module name is registered on the [database connection] specified +** by the first parameter. ^The name of the module is given by the +** second parameter. ^The third parameter is a pointer to +** the implementation of the [virtual table module]. ^The fourth +** parameter is an arbitrary client data pointer that is passed through +** into the [xCreate] and [xConnect] methods of the virtual table module +** when a new virtual table is be being created or reinitialized. +** +** ^The sqlite3_create_module_v2() interface has a fifth parameter which +** is a pointer to a destructor for the pClientData. ^SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. ^The destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** of this object to describe a particular instance +** of the [virtual table]. Each subclass will +** be tailored to the specific needs of the module implementation. +** The purpose of this superclass is to define certain fields that are +** common to all module implementations. +** +** ^Virtual tables methods can set an error message by assigning a +** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should +** take care that any prior string is freed by a call to [sqlite3_free()] +** prior to assigning a new string to zErrMsg. ^After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* NO LONGER USED */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [virtual table] and are used +** to loop through the virtual table. Cursors are created using the +** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed +** by the [sqlite3_module.xClose | xClose] method. Cursors are used +** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods +** of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^The [xCreate] and [xConnect] methods of a +** [virtual table module] call this interface +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** +** ^(Virtual tables can provide alternative implementations of functions +** using the [xFindFunction] method of the [virtual table module]. +** But global versions of those functions +** must exist in order to be overloaded.)^ +** +** ^(This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created.)^ ^The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a placeholder function that can be overloaded +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB +** KEYWORDS: {BLOB handle} {BLOB handles} +** +** An instance of this object represents an open BLOB on which +** [sqlite3_blob_open | incremental BLOB I/O] can be performed. +** ^Objects of this type are created by [sqlite3_blob_open()] +** and destroyed by [sqlite3_blob_close()]. +** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the BLOB. +** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** +** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located +** in row iRow, column zColumn, table zTable in database zDb; +** in other words, the same BLOB that would be selected by: +** +**
+**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
+** 
)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If it is zero, the BLOB is opened for read access. +** ^It is not possible to open a column that is part of an index or primary +** key for writing. ^If [foreign key constraints] are enabled, it is +** not possible to open a column that is part of a [child key] for writing. +** +** ^Note that the database name is not the filename that contains +** the database but rather the symbolic name of the database that +** appears after the AS keyword when the database is connected using [ATTACH]. +** ^For the main database file, the database name is "main". +** ^For TEMP tables, the database name is "temp". +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is written +** to *ppBlob. Otherwise an [error code] is returned and *ppBlob is set +** to be a null pointer.)^ +** ^This function sets the [database connection] error code and message +** accessible via [sqlite3_errcode()] and [sqlite3_errmsg()] and related +** functions. ^Note that the *ppBlob variable is always initialized in a +** way that makes it safe to invoke [sqlite3_blob_close()] on *ppBlob +** regardless of the success or failure of this routine. +** +** ^(If the row that a BLOB handle points to is modified by an +** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects +** then the BLOB handle is marked as "expired". +** This is true if any column of the row is changed, even a column +** other than the one the BLOB handle is open on.)^ +** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(Changes written into a BLOB prior to the BLOB expiring are not +** rolled back by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion.)^ +** +** ^Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. ^The size of a blob may not be changed by this +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function can be used, if desired, +** to create an empty, zero-filled blob in which to read or write using +** this interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** +** ^This function is used to move an existing blob handle so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing blob handle to a new row can be +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** +** ^Closes an open [BLOB handle]. +** +** ^Closing a BLOB shall cause the current transaction to commit +** if there are no other BLOBs, no pending prepared statements, and the +** database connection is in [autocommit mode]. +** ^If any writes were made to the BLOB, they might be held in cache +** until the close operation if they will fit. +** +** ^(Closing the BLOB often forces the changes +** out to disk and so if any I/O errors occur, they will likely occur +** at the time when the BLOB is closed. Any errors that occur during +** closing are reported as a non-zero return value.)^ +** +** ^(The BLOB is closed unconditionally. Even if this routine returns +** an error code, the BLOB is still closed.)^ +** +** ^Calling this routine with a null pointer (such as would be returned +** by a failed call to [sqlite3_blob_open()]) is a harmless no-op. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** +** ^Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. ^The +** incremental blob I/O routines can only read or overwriting existing +** blob content; they cannot change the size of a blob. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** +** ^(This function is used to read data from an open [BLOB handle] into a +** caller-supplied buffer. N bytes of data are copied into buffer Z +** from the open BLOB, starting at offset iOffset.)^ +** +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is +** less than zero, [SQLITE_ERROR] is returned and no data is read. +** ^The size of the blob (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(On success, sqlite3_blob_read() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** +** ^This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. ^N bytes of data are copied from the buffer Z +** into the open BLOB, starting at offset iOffset. +** +** ^If the [BLOB handle] passed as the first argument was not opened for +** writing (the flags parameter to [sqlite3_blob_open()] was zero), +** this function returns [SQLITE_READONLY]. +** +** ^This function may only modify the contents of the BLOB; it is +** not possible to increase the size of a BLOB using this API. +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. ^If N is +** less than zero [SQLITE_ERROR] is returned and no data is written. +** The size of the BLOB (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred +** before the [BLOB handle] expired are not rolled back by the +** expiration of the handle, though of course those changes might +** have been overwritten by the statement that expired the BLOB handle +** or by other independent statements. +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** ^Names are case sensitive. +** ^Names are zero-terminated UTF-8 strings. +** ^If there is no match, a NULL pointer is returned. +** ^If zVfsName is NULL then the default VFS is returned. +** +** ^New VFSes are registered with sqlite3_vfs_register(). +** ^Each new VFS becomes the default VFS if the makeDflt flag is set. +** ^The same VFS can be registered multiple times without injury. +** ^To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. If two different VFSes with the +** same name are registered, the behavior is undefined. If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. +** ^(If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary.)^ +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. ^(The following +** implementations are available in the SQLite core: +** +**
    +**
  • SQLITE_MUTEX_OS2 +**
  • SQLITE_MUTEX_PTHREADS +**
  • SQLITE_MUTEX_W32 +**
  • SQLITE_MUTEX_NOOP +**
)^ +** +** ^The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. ^The SQLITE_MUTEX_OS2, +** SQLITE_MUTEX_PTHREADS, and SQLITE_MUTEX_W32 implementations +** are appropriate for use on OS/2, Unix, and Windows. +** +** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. In this case the +** application must supply a custom mutex implementation using the +** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function +** before calling sqlite3_initialize() or any other public sqlite3_ +** function that calls sqlite3_initialize().)^ +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^If it returns NULL +** that means that a mutex could not be allocated. ^SQLite +** will unwind its stack and return an error. ^(The argument +** to sqlite3_mutex_alloc() is one of these integer constants: +** +**
    +**
  • SQLITE_MUTEX_FAST +**
  • SQLITE_MUTEX_RECURSIVE +**
  • SQLITE_MUTEX_STATIC_MASTER +**
  • SQLITE_MUTEX_STATIC_MEM +**
  • SQLITE_MUTEX_STATIC_MEM2 +**
  • SQLITE_MUTEX_STATIC_PRNG +**
  • SQLITE_MUTEX_STATIC_LRU +**
  • SQLITE_MUTEX_STATIC_LRU2 +**
)^ +** +** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) +** cause sqlite3_mutex_alloc() to create +** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. ^SQLite will only request a recursive mutex in +** cases where it really needs one. ^If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other +** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return +** a pointer to a static preexisting mutex. ^Six static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. ^But for the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. ^SQLite is careful to deallocate every +** dynamic mutex that it allocates. The dynamic mutexes must not be in +** use when they are deallocated. Attempting to deallocate a static +** mutex results in undefined behavior. ^SQLite never deallocates +** a static mutex. +** +** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. ^If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. ^(Mutexes created using +** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. +** In such cases the, +** mutex must be exited an equal number of times before another thread +** can enter.)^ ^(If the same thread tries to enter any other +** kind of mutex more than once, the behavior is undefined. +** SQLite will never exhibit +** such behavior in its own use of mutexes.)^ +** +** ^(Some systems (for example, Windows 95) do not support the operation +** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() +** will always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable behavior.)^ +** +** ^The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. ^(The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. SQLite will +** never do either.)^ +** +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** sqlite3_mutex_leave() is a NULL pointer, then all three routines +** behave as no-ops. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the user has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the user +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** output variable when querying the system for the current mutex +** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. +** +** ^The xMutexInit method defined by this structure is invoked as +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^The xMutexEnd method defined by this structure is invoked as +** part of system shutdown by the sqlite3_shutdown() function. The +** implementation of this method is expected to release all outstanding +** resources obtained by the mutex methods implementation, especially +** those obtained by the xMutexInit method. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
    +**
  • [sqlite3_mutex_alloc()]
  • +**
  • [sqlite3_mutex_free()]
  • +**
  • [sqlite3_mutex_enter()]
  • +**
  • [sqlite3_mutex_try()]
  • +**
  • [sqlite3_mutex_leave()]
  • +**
  • [sqlite3_mutex_held()]
  • +**
  • [sqlite3_mutex_notheld()]
  • +**
)^ +** +** The only difference is that the public sqlite3_XXX functions enumerated +** above silently ignore any invocations that pass a NULL pointer instead +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case, the results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (i.e. it is acceptable to provide an implementation that segfaults if +** it is passed a NULL pointer). +** +** The xMutexInit() method must be threadsafe. ^It must be harmless to +** invoke xMutexInit() multiple times within the same process and without +** intervening calls to xMutexEnd(). Second and subsequent calls to +** xMutexInit() must be no-ops. +** +** ^xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). ^Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. ^However xMutexAlloc() may use SQLite +** memory allocation for a fast or recursive mutex. +** +** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** called, but only if the prior call to xMutexInit returned SQLITE_OK. +** If xMutexInit fails in any way, it is expected to clean up after itself +** prior to returning. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. ^The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. ^The SQLite core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. ^External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** ^These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** ^The implementation is not required to provide versions of these +** routines that actually work. If the implementation does not provide working +** versions of these routines, it should at least provide stubs that always +** return true so that one does not get spurious assertion failures. +** +** ^If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. ^The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +#ifndef NDEBUG +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); +#endif + +/* +** CAPI3REF: Mutex Types +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** +** ^This interface returns a pointer the [sqlite3_mutex] object that +** serializes access to the [database connection] given in the argument +** when the [threading mode] is Serialized. +** ^If the [threading mode] is Single-thread or Multi-thread then this +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** +** ^The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. ^The +** name of the database is "main" for the main database or "temp" for the +** TEMP database, or the name that appears after the AS keyword for +** databases that are added using the [ATTACH] SQL command. +** ^A NULL pointer can be used in place of "main" to refer to the +** main database file. +** ^The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER +** case is a short-circuit path which does not actually invoke the +** underlying sqlite3_io_methods.xFileControl method. +** +** ^If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. ^This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. +** +** See also: [SQLITE_FCNTL_LOCKSTATE] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^The sqlite3_test_control() interface is used to read out internal +** state of SQLite and to inject faults into SQLite for testing +** purposes. ^The first parameter is an operation code that determines +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** Applications should not use any of these parameters or the +** [sqlite3_test_control()] interface. +*/ +#define SQLITE_TESTCTRL_FIRST 5 +#define SQLITE_TESTCTRL_PRNG_SAVE 5 +#define SQLITE_TESTCTRL_PRNG_RESTORE 6 +#define SQLITE_TESTCTRL_PRNG_RESET 7 +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#define SQLITE_TESTCTRL_ASSERT 12 +#define SQLITE_TESTCTRL_ALWAYS 13 +#define SQLITE_TESTCTRL_RESERVE 14 +#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 +#define SQLITE_TESTCTRL_ISKEYWORD 16 +#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 +#define SQLITE_TESTCTRL_LAST 19 + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^This interface is used to retrieve runtime status information +** about the performance of SQLite, and optionally to reset various +** highwater marks. ^The first argument is an integer code for +** the specific parameter to measure. ^(Recognized integer codes +** are of the form [status parameters | SQLITE_STATUS_...].)^ +** ^The current value of the parameter is returned into *pCurrent. +** ^The highest recorded value is returned in *pHighwater. ^If the +** resetFlag is true, then the highest record value is reset after +** *pHighwater is written. ^(Some parameters do not record the highest +** value. For those parameters +** nothing is written into *pHighwater and the resetFlag is ignored.)^ +** ^(Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent.)^ +** +** ^The sqlite3_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** This routine is threadsafe but is not atomic. This routine can be +** called while other threads are running the same or different SQLite +** interfaces. However the values returned in *pCurrent and +** *pHighwater reflect the status of SQLite at different points in time +** and it is possible that another thread might change the parameter +** in between the times when *pCurrent and *pHighwater are written. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** These integer constants designate various run-time status parameters +** that can be returned by [sqlite3_status()]. +** +**
+** [[SQLITE_STATUS_MEMORY_USED]] ^(
SQLITE_STATUS_MEMORY_USED
+**
This parameter is the current amount of memory checked out +** using [sqlite3_malloc()], either directly or indirectly. The +** figure includes calls made to [sqlite3_malloc()] by the application +** and internal memory usage by the SQLite library. Scratch memory +** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache +** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in +** this parameter. The amount returned is the sum of the allocation +** sizes as reported by the xSize method in [sqlite3_mem_methods].
)^ +** +** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
SQLITE_STATUS_MALLOC_SIZE
+**
This parameter records the largest memory allocation request +** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their +** internal equivalents). Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
)^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
SQLITE_STATUS_MALLOC_COUNT
+**
This parameter records the number of separate memory allocations +** currently checked out.
)^ +** +** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
SQLITE_STATUS_PAGECACHE_USED
+**
This parameter returns the number of pages used out of the +** [pagecache memory allocator] that was configured using +** [SQLITE_CONFIG_PAGECACHE]. The +** value returned is in pages, not in bytes.
)^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
SQLITE_STATUS_PAGECACHE_OVERFLOW
+**
This parameter returns the number of bytes of page cache +** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] +** buffer and where forced to overflow to [sqlite3_malloc()]. The +** returned value includes allocations that overflowed because they +** where too large (they were larger than the "sz" parameter to +** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because +** no space was left in the page cache.
)^ +** +** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
SQLITE_STATUS_PAGECACHE_SIZE
+**
This parameter records the largest memory allocation request +** handed to [pagecache memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
)^ +** +** [[SQLITE_STATUS_SCRATCH_USED]] ^(
SQLITE_STATUS_SCRATCH_USED
+**
This parameter returns the number of allocations used out of the +** [scratch memory allocator] configured using +** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not +** in bytes. Since a single thread may only have one scratch allocation +** outstanding at time, this parameter also reports the number of threads +** using scratch memory at the same time.
)^ +** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
SQLITE_STATUS_SCRATCH_OVERFLOW
+**
This parameter returns the number of bytes of scratch memory +** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] +** buffer and where forced to overflow to [sqlite3_malloc()]. The values +** returned include overflows because the requested allocation was too +** larger (that is, because the requested allocation was larger than the +** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer +** slots were available. +**
)^ +** +** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(
SQLITE_STATUS_SCRATCH_SIZE
+**
This parameter records the largest memory allocation request +** handed to [scratch memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
)^ +** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
SQLITE_STATUS_PARSER_STACK
+**
This parameter records the deepest parser stack. It is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
)^ +**
+** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** +** ^This interface is used to retrieve runtime status information +** about a single [database connection]. ^The first argument is the +** database connection object to be interrogated. ^The second argument +** is an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow in future releases of SQLite. +** +** ^The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. ^If +** the resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** if a discontinued or unsupported verb is invoked. +** +**
+** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
SQLITE_DBSTATUS_LOOKASIDE_USED
+**
This parameter returns the number of lookaside memory slots currently +** checked out.
)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
SQLITE_DBSTATUS_LOOKASIDE_HIT
+**
This parameter returns the number malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
+**
This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
+**
This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
SQLITE_DBSTATUS_CACHE_USED
+**
This parameter returns the approximate number of of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
SQLITE_DBSTATUS_SCHEMA_USED
+**
This parameter returns the approximate number of of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
SQLITE_DBSTATUS_STMT_USED
+**
This parameter returns the approximate number of of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
SQLITE_DBSTATUS_CACHE_HIT
+**
This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
+** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
SQLITE_DBSTATUS_CACHE_MISS
+**
This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
+**
+*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_MAX 8 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** of times it has performed specific operations.)^ These counters can +** be used to monitor the performance characteristics of the prepared +** statements. For example, if the number of table steps greatly exceeds +** the number of table searches or result rows, that would tend to indicate +** that the prepared statement is using a full table scan rather than +** an index. +** +** ^(This interface is used to retrieve and reset counter values from +** a [prepared statement]. The first argument is the prepared statement +** object to be interrogated. The second argument +** is an integer code for a specific [SQLITE_STMTSTATUS counter] +** to be interrogated.)^ +** ^The current value of the requested counter is returned. +** ^If the resetFlg is true, then the counter is reset to zero after this +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
+** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
SQLITE_STMTSTATUS_FULLSCAN_STEP
+**
^This is the number of times that SQLite has stepped forward in +** a table as part of a full table scan. Large numbers for this counter +** may indicate opportunities for performance improvement through +** careful use of indices.
+** +** [[SQLITE_STMTSTATUS_SORT]]
SQLITE_STMTSTATUS_SORT
+**
^This is the number of sort operations that have occurred. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance through careful use of indices.
+** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
SQLITE_STMTSTATUS_AUTOINDEX
+**
^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
+**
+*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an +** internal buffer by SQLite within the call to [sqlite3_config]. Hence +** the application may discard the parameter after the call to +** [sqlite3_config()] returns.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to the xInit method, +** so the xInit method need not be threadsafe. ^The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. All other methods must be threadsafe +** in multithreaded applications. +** +** ^SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** though this is not guaranteed. ^The +** first parameter, szPage, is the size in bytes of the pages that must +** be allocated by the cache. ^szPage will always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third argument to xCreate(), bPurgeable, is true if the cache being +** created will be used to cache database pages of a file stored on disk, or +** false if it is used for an in-memory database. The cache implementation +** does not have to do anything special based with the value of bPurgeable; +** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(The xCachesize() method may be called at any time by SQLite to set the +** suggested maximum cache-size (number of pages stored by) the cache +** instance passed as the first argument. This is the value configured using +** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable +** parameter, the implementation is not required to do anything with this +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum key value +** is 1. After it has been retrieved using xFetch, the page is considered +** to be "pinned". +** +** If the requested page is already in the page cache, then the page cache +** implementation must return a pointer to the page buffer with its content +** intact. If the requested page is not already in the cache, then the +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
createFlag Behaviour when page is not already in cache +**
0 Do not allocate a new page. Return NULL. +**
1 Allocate a new page if it easy and convenient to do so. +** Otherwise return NULL. +**
2 Make every effort to allocate a new page. Only return +** NULL if allocating a new page is effectively impossible. +**
+** +** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the to xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. If the third parameter, discard, is non-zero, +** then the page must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** discarded. ^Any prior cache entry associated with newKey is guaranteed not +** to be pinned. +** +** When SQLite calls the xTruncate() method, the cache must discard all +** existing cache entries with page numbers (keys) greater than or equal +** to the value of the iLimit parameter passed to xTruncate(). If any +** of these pages are pinned, they are implicitly unpinned, meaning that +** they can be safely discarded. +** +** [[the xDestroy() page cache method]] +** ^The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. ^After +** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] +** handle invalid, and will not use it with any other sqlite3_pcache_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** online backup operation. ^The sqlite3_backup object is created by +** a call to [sqlite3_backup_init()] and is destroyed by a call to +** [sqlite3_backup_finish()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** The backup API copies the content of one database into another. +** It is useful either for creating backups of databases or +** for copying in-memory databases to or from persistent files. +** +** See Also: [Using the SQLite Online Backup API] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is being read; +** it is not locked continuously for the entire backup operation. +** ^Thus, the backup may be performed on a live source database without +** preventing other database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
    +**
  1. sqlite3_backup_init() is called once to initialize the +** backup, +**
  2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
  3. sqlite3_backup_finish() is called to release all resources +** associated with the backup operation. +**
)^ +** There should be exactly one call to sqlite3_backup_finish() for each +** successful call to sqlite3_backup_init(). +** +** [[sqlite3_backup_init()]] sqlite3_backup_init() +** +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database +** and the database name, respectively. +** ^The database name is "main" for the main database, "temp" for the +** temporary database, or the name specified after the AS keyword in +** an [ATTACH] statement for an attached database. +** ^The S and M arguments passed to +** sqlite3_backup_init(D,N,S,M) identify the [database connection] +** and database name of the source database, respectively. +** ^The source and destination [database connections] (parameters S and D) +** must be different or else sqlite3_backup_init(D,N,S,M) will fail with +** an error. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored in the +** destination [database connection] D. +** ^The error code and message for the failed call to sqlite3_backup_init() +** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or +** [sqlite3_errmsg16()] functions. +** ^A successful call to sqlite3_backup_init() returns a pointer to an +** [sqlite3_backup] object. +** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and +** sqlite3_backup_finish() functions to perform the specified backup +** operation. +** +** [[sqlite3_backup_step()]] sqlite3_backup_step() +** +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** the source and destination databases specified by [sqlite3_backup] object B. +** ^If N is negative, all remaining source pages are copied. +** ^If sqlite3_backup_step(B,N) successfully copies N pages and there +** are still more pages to be copied, then the function returns [SQLITE_OK]. +** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages +** from source to destination, then it returns [SQLITE_DONE]. +** ^If an error occurs while running sqlite3_backup_step(B,N), +** then an [error code] is returned. ^As well as [SQLITE_OK] and +** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], +** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
    +**
  1. the destination database was opened read-only, or +**
  2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
  3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
)^ +** +** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then +** the [sqlite3_busy_handler | busy-handler function] +** is invoked (if one is specified). ^If the +** busy-handler returns non-zero before the lock is available, then +** [SQLITE_BUSY] is returned to the caller. ^In this case the call to +** sqlite3_backup_step() can be retried later. ^If the source +** [database connection] +** is being used to write to the source database when sqlite3_backup_step() +** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this +** case the call to sqlite3_backup_step() can be retried later on. ^(If +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or +** [SQLITE_READONLY] is returned, then +** there is no point in retrying the call to sqlite3_backup_step(). These +** errors are considered fatal.)^ The application must accept +** that the backup operation has failed and pass the backup operation handle +** to the sqlite3_backup_finish() to release associated resources. +** +** ^The first call to sqlite3_backup_step() obtains an exclusive lock +** on the destination file. ^The exclusive lock is not released until either +** sqlite3_backup_finish() is called or the backup operation is complete +** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to +** sqlite3_backup_step() obtains a [shared lock] on the source database that +** lasts for the duration of the sqlite3_backup_step() call. +** ^Because the source database is not locked between calls to +** sqlite3_backup_step(), the source database may be modified mid-way +** through the backup process. ^If the source database is modified by an +** external process or via a database connection other than the one being +** used by the backup operation, then the backup will be automatically +** restarted by the next call to sqlite3_backup_step(). ^If the source +** database is modified by the using the same database connection as is used +** by the backup operation, then the backup database is automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the application +** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). +** ^The sqlite3_backup_finish() interfaces releases all +** resources associated with the [sqlite3_backup] object. +** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any +** active write-transaction on the destination database is rolled back. +** The [sqlite3_backup] object is invalid +** and may not be used following a call to sqlite3_backup_finish(). +** +** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no +** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() completed. +** ^If an out-of-memory condition or IO error occurred during any prior +** sqlite3_backup_step() call on the same [sqlite3_backup] object, then +** sqlite3_backup_finish() returns the corresponding [error code]. +** +** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() +** is not a permanent error and does not affect the return value of +** sqlite3_backup_finish(). +** +** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^Each call to sqlite3_backup_step() sets two values inside +** the [sqlite3_backup] object: the number of pages still to be backed +** up and the total number of pages in the source database file. +** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces +** retrieve these two values, respectively. +** +** ^The values returned by these functions are only updated by +** sqlite3_backup_step(). ^If the source database is modified during a backup +** operation, then the values are not updated to account for any extra +** pages that need to be updated or the size of the source database file +** changing. +** +** Concurrent Usage of Database Handles +** +** ^The source [database connection] may be used by the application for other +** purposes while a backup operation is underway or being initialized. +** ^If SQLite is compiled and configured to support threadsafe database +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after +** sqlite3_backup_init() is called and before the corresponding call to +** sqlite3_backup_finish(). SQLite does not currently check to see +** if the application incorrectly accesses the destination [database connection] +** and so no error code is reported, but the operations may malfunction +** nevertheless. Use of the destination database connection while a +** backup is in progress might also also cause a mutex deadlock. +** +** If running in [shared cache mode], the application must +** guarantee that the shared cache used by the destination database +** is not accessed while the backup is running. In practice this means +** that the application must guarantee that the disk file being +** backed up to is not accessed by any connection within the process, +** not just the specific connection that was passed to sqlite3_backup_init(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** +** ^When running in shared-cache mode, a database operation may fail with +** an [SQLITE_LOCKED] error if the required locks on the shared-cache or +** individual tables within the shared-cache cannot be obtained. See +** [SQLite Shared-Cache Mode] for a description of shared-cache locking. +** ^This API may be used to register a callback that SQLite will invoke +** when the connection currently holding the required lock relinquishes it. +** ^This API is only available if the library was compiled with the +** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. +** +** See Also: [Using the SQLite Unlock Notification Feature]. +** +** ^Shared-cache locks are released when a database connection concludes +** its current transaction, either by committing it or rolling it back. +** +** ^When a connection (known as the blocked connection) fails to obtain a +** shared-cache lock and SQLITE_LOCKED is returned to the caller, the +** identity of the database connection (the blocking connection) that +** has locked the required resource is stored internally. ^After an +** application receives an SQLITE_LOCKED error, it may call the +** sqlite3_unlock_notify() method with the blocked connection handle as +** the first argument to register for a callback that will be invoked +** when the blocking connections current transaction is concluded. ^The +** callback is invoked from within the [sqlite3_step] or [sqlite3_close] +** call that concludes the blocking connections transaction. +** +** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, +** there is a chance that the blocking connection will have already +** concluded its transaction by the time sqlite3_unlock_notify() is invoked. +** If this happens, then the specified callback is invoked immediately, +** from within the call to sqlite3_unlock_notify().)^ +** +** ^If the blocked connection is attempting to obtain a write-lock on a +** shared-cache table, and more than one other connection currently holds +** a read-lock on the same table, then SQLite arbitrarily selects one of +** the other connections to use as the blocking connection. +** +** ^(There may be at most one unlock-notify callback registered by a +** blocked connection. If sqlite3_unlock_notify() is called when the +** blocked connection already has a registered unlock-notify callback, +** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** any sqlite3_xxx API functions from within an unlock-notify callback, a +** crash or deadlock may be the result. +** +** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** When a blocking connections transaction is concluded, there may be +** more than one blocked connection that has registered for an unlock-notify +** callback. ^If two or more such blocked connections have specified the +** same callback function, then instead of invoking the callback function +** multiple times, it is invoked once with the set of void* context pointers +** specified by the blocked connections bundled together into an array. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** will proceed and the system may remain deadlocked indefinitely. +** +** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock +** detection. ^If a given call to sqlite3_unlock_notify() would put the +** system in a deadlocked state, then SQLITE_LOCKED is returned and no +** unlock-notify callback is registered. The system is said to be in +** a deadlocked state if connection A has registered for an unlock-notify +** callback on the conclusion of connection B's transaction, and connection +** B has itself registered for an unlock-notify callback when connection +** A's transaction is concluded. ^Indirect deadlock is also detected, so +** the system is also considered to be deadlocked if connection B has +** registered for an unlock-notify callback on the conclusion of connection +** C's transaction, where connection C is waiting on connection A. ^Any +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** or "DROP INDEX" query, an infinite loop might be the result. +** +** One way around this problem is to check the extended error code returned +** by an sqlite3_step() call. ^(If there is a blocking connection, then the +** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in +** the special "DROP TABLE/INDEX" case, the extended error code is just +** SQLITE_LOCKED.)^ +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_strnicmp()] API allows applications and extensions to +** compare the contents of two buffers containing UTF-8 strings in a +** case-independent fashion, using the same definition of case independence +** that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the error log +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** will be invoked each time a database connection commits data to a +** [write-ahead log] (i.e. whenever a transaction is committed in +** [journal_mode | journal_mode=WAL mode]). +** +** ^The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^Note that the +** [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** those overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** +** ^The [sqlite3_wal_checkpoint(D,X)] interface causes database named X +** on [database connection] D to be [checkpointed]. ^If X is NULL or an +** empty string, then a checkpoint is run on all databases of +** connection D. ^If the database connection D is not in +** [WAL | write-ahead log mode] then this interface is a harmless no-op. +** +** ^The [wal_checkpoint pragma] can be used to invoke this interface +** from SQL. ^The [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] can be used to cause this interface to be +** run whenever the WAL reaches a certain size threshold. +** +** See also: [sqlite3_wal_checkpoint_v2()] +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** +** Run a checkpoint operation on WAL database zDb attached to database +** handle db. The specific operation is determined by the value of the +** eMode parameter: +** +**
+**
SQLITE_CHECKPOINT_PASSIVE
+** Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish. Sync the db file if all frames in the log +** are checkpointed. This mode is the same as calling +** sqlite3_wal_checkpoint(). The busy-handler callback is never invoked. +** +**
SQLITE_CHECKPOINT_FULL
+** This mode blocks (calls the busy-handler callback) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. It then checkpoints all frames in the log file and syncs the +** database file. This call blocks database writers while it is running, +** but not database readers. +** +**
SQLITE_CHECKPOINT_RESTART
+** This mode works the same way as SQLITE_CHECKPOINT_FULL, except after +** checkpointing the log file it blocks (calls the busy-handler callback) +** until all readers are reading from the database file only. This ensures +** that the next client to write to the database file restarts the log file +** from the beginning. This call blocks database writers while it is running, +** but not database readers. +**
+** +** If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file before returning. If pnCkpt is not NULL, then *pnCkpt is set to +** the total number of checkpointed frames (including any that were already +** checkpointed when this function is called). *pnLog and *pnCkpt may be +** populated even if sqlite3_wal_checkpoint_v2() returns other than SQLITE_OK. +** If no values are available because of an error, they are both set to -1 +** before returning to communicate this to the caller. +** +** All calls obtain an exclusive "checkpoint" lock on the database file. If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** The SQLITE_CHECKPOINT_FULL and RESTART modes also obtain the exclusive +** "writer" lock on the database file. If the writer lock cannot be obtained +** immediately, and a busy-handler is configured, it is invoked and the writer +** lock retried until either the busy-handler returns 0 or the lock is +** successfully obtained. The busy-handler is also invoked while waiting for +** database readers as described above. If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. SQLITE_BUSY is returned in this case. +** +** If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned to the caller. If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code returned to the caller immediately. If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint operation parameters +** +** These constants can be used as the 3rd parameter to +** [sqlite3_wal_checkpoint_v2()]. See the [sqlite3_wal_checkpoint_v2()] +** documentation for additional information about the meaning and use of +** each of these values. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 +#define SQLITE_CHECKPOINT_FULL 1 +#define SQLITE_CHECKPOINT_RESTART 2 + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** At present, there is only one option that may be configured using +** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options +** may be added in the future. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
+**
SQLITE_VTAB_CONSTRAINT_SUPPORT +**
Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
+*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Conflict resolution modes +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + + + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#if 0 +} /* End of the 'extern "C"' block */ +#endif +#endif + +/* +** 2010 August 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry *, int nCoord, double *aCoord, int *pRes), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + double *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + + +/************** End of sqlite3.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include hash.h in the middle of sqliteInt.h ******************/ +/************** Begin file hash.h ********************************************/ +/* +** 2001 September 22 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This is the header file for the generic hash-table implemenation +** used in SQLite. +*/ +#ifndef _SQLITE_HASH_H_ +#define _SQLITE_HASH_H_ + +/* Forward declarations of structures. */ +typedef struct Hash Hash; +typedef struct HashElem HashElem; + +/* A complete hash table is an instance of the following structure. +** The internals of this structure are intended to be opaque -- client +** code should not attempt to access or modify the fields of this structure +** directly. Change this structure only by using the routines below. +** However, some of the "procedures" and "functions" for modifying and +** accessing this structure are really macros, so we can't really make +** this structure opaque. +** +** All elements of the hash table are on a single doubly-linked list. +** Hash.first points to the head of this list. +** +** There are Hash.htsize buckets. Each bucket points to a spot in +** the global doubly-linked list. The contents of the bucket are the +** element pointed to plus the next _ht.count-1 elements in the list. +** +** Hash.htsize and Hash.ht may be zero. In that case lookup is done +** by a linear search of the global list. For small tables, the +** Hash.ht table is never allocated because if there are few elements +** in the table, it is faster to do a linear search than to manage +** the hash table. +*/ +struct Hash { + unsigned int htsize; /* Number of buckets in the hash table */ + unsigned int count; /* Number of entries in this table */ + HashElem *first; /* The first element of the array */ + struct _ht { /* the hash table */ + int count; /* Number of entries with this hash */ + HashElem *chain; /* Pointer to first entry with this hash */ + } *ht; +}; + +/* Each element in the hash table is an instance of the following +** structure. All elements are stored on a single doubly-linked list. +** +** Again, this structure is intended to be opaque, but it can't really +** be opaque because it is used by macros. +*/ +struct HashElem { + HashElem *next, *prev; /* Next and previous elements in the table */ + void *data; /* Data associated with this element */ + const char *pKey; int nKey; /* Key associated with this element */ +}; + +/* +** Access routines. To delete, insert a NULL pointer. +*/ +SQLITE_PRIVATE void sqlite3HashInit(Hash*); +SQLITE_PRIVATE void *sqlite3HashInsert(Hash*, const char *pKey, int nKey, void *pData); +SQLITE_PRIVATE void *sqlite3HashFind(const Hash*, const char *pKey, int nKey); +SQLITE_PRIVATE void sqlite3HashClear(Hash*); + +/* +** Macros for looping over all elements of a hash table. The idiom is +** like this: +** +** Hash h; +** HashElem *p; +** ... +** for(p=sqliteHashFirst(&h); p; p=sqliteHashNext(p)){ +** SomeStructure *pData = sqliteHashData(p); +** // do something with pData +** } +*/ +#define sqliteHashFirst(H) ((H)->first) +#define sqliteHashNext(E) ((E)->next) +#define sqliteHashData(E) ((E)->data) +/* #define sqliteHashKey(E) ((E)->pKey) // NOT USED */ +/* #define sqliteHashKeysize(E) ((E)->nKey) // NOT USED */ + +/* +** Number of entries in a hash table +*/ +/* #define sqliteHashCount(H) ((H)->count) // NOT USED */ + +#endif /* _SQLITE_HASH_H_ */ + +/************** End of hash.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include parse.h in the middle of sqliteInt.h *****************/ +/************** Begin file parse.h *******************************************/ +#define TK_SEMI 1 +#define TK_EXPLAIN 2 +#define TK_QUERY 3 +#define TK_PLAN 4 +#define TK_BEGIN 5 +#define TK_TRANSACTION 6 +#define TK_DEFERRED 7 +#define TK_IMMEDIATE 8 +#define TK_EXCLUSIVE 9 +#define TK_COMMIT 10 +#define TK_END 11 +#define TK_ROLLBACK 12 +#define TK_SAVEPOINT 13 +#define TK_RELEASE 14 +#define TK_TO 15 +#define TK_TABLE 16 +#define TK_CREATE 17 +#define TK_IF 18 +#define TK_NOT 19 +#define TK_EXISTS 20 +#define TK_TEMP 21 +#define TK_LP 22 +#define TK_RP 23 +#define TK_AS 24 +#define TK_COMMA 25 +#define TK_ID 26 +#define TK_INDEXED 27 +#define TK_ABORT 28 +#define TK_ACTION 29 +#define TK_AFTER 30 +#define TK_ANALYZE 31 +#define TK_ASC 32 +#define TK_ATTACH 33 +#define TK_BEFORE 34 +#define TK_BY 35 +#define TK_CASCADE 36 +#define TK_CAST 37 +#define TK_COLUMNKW 38 +#define TK_CONFLICT 39 +#define TK_DATABASE 40 +#define TK_DESC 41 +#define TK_DETACH 42 +#define TK_EACH 43 +#define TK_FAIL 44 +#define TK_FOR 45 +#define TK_IGNORE 46 +#define TK_INITIALLY 47 +#define TK_INSTEAD 48 +#define TK_LIKE_KW 49 +#define TK_MATCH 50 +#define TK_NO 51 +#define TK_KEY 52 +#define TK_OF 53 +#define TK_OFFSET 54 +#define TK_PRAGMA 55 +#define TK_RAISE 56 +#define TK_REPLACE 57 +#define TK_RESTRICT 58 +#define TK_ROW 59 +#define TK_TRIGGER 60 +#define TK_VACUUM 61 +#define TK_VIEW 62 +#define TK_VIRTUAL 63 +#define TK_REINDEX 64 +#define TK_RENAME 65 +#define TK_CTIME_KW 66 +#define TK_ANY 67 +#define TK_OR 68 +#define TK_AND 69 +#define TK_IS 70 +#define TK_BETWEEN 71 +#define TK_IN 72 +#define TK_ISNULL 73 +#define TK_NOTNULL 74 +#define TK_NE 75 +#define TK_EQ 76 +#define TK_GT 77 +#define TK_LE 78 +#define TK_LT 79 +#define TK_GE 80 +#define TK_ESCAPE 81 +#define TK_BITAND 82 +#define TK_BITOR 83 +#define TK_LSHIFT 84 +#define TK_RSHIFT 85 +#define TK_PLUS 86 +#define TK_MINUS 87 +#define TK_STAR 88 +#define TK_SLASH 89 +#define TK_REM 90 +#define TK_CONCAT 91 +#define TK_COLLATE 92 +#define TK_BITNOT 93 +#define TK_STRING 94 +#define TK_JOIN_KW 95 +#define TK_CONSTRAINT 96 +#define TK_DEFAULT 97 +#define TK_NULL 98 +#define TK_PRIMARY 99 +#define TK_UNIQUE 100 +#define TK_CHECK 101 +#define TK_REFERENCES 102 +#define TK_AUTOINCR 103 +#define TK_ON 104 +#define TK_INSERT 105 +#define TK_DELETE 106 +#define TK_UPDATE 107 +#define TK_SET 108 +#define TK_DEFERRABLE 109 +#define TK_FOREIGN 110 +#define TK_DROP 111 +#define TK_UNION 112 +#define TK_ALL 113 +#define TK_EXCEPT 114 +#define TK_INTERSECT 115 +#define TK_SELECT 116 +#define TK_DISTINCT 117 +#define TK_DOT 118 +#define TK_FROM 119 +#define TK_JOIN 120 +#define TK_USING 121 +#define TK_ORDER 122 +#define TK_GROUP 123 +#define TK_HAVING 124 +#define TK_LIMIT 125 +#define TK_WHERE 126 +#define TK_INTO 127 +#define TK_VALUES 128 +#define TK_INTEGER 129 +#define TK_FLOAT 130 +#define TK_BLOB 131 +#define TK_REGISTER 132 +#define TK_VARIABLE 133 +#define TK_CASE 134 +#define TK_WHEN 135 +#define TK_THEN 136 +#define TK_ELSE 137 +#define TK_INDEX 138 +#define TK_ALTER 139 +#define TK_ADD 140 +#define TK_TO_TEXT 141 +#define TK_TO_BLOB 142 +#define TK_TO_NUMERIC 143 +#define TK_TO_INT 144 +#define TK_TO_REAL 145 +#define TK_ISNOT 146 +#define TK_END_OF_FILE 147 +#define TK_ILLEGAL 148 +#define TK_SPACE 149 +#define TK_UNCLOSED_STRING 150 +#define TK_FUNCTION 151 +#define TK_COLUMN 152 +#define TK_AGG_FUNCTION 153 +#define TK_AGG_COLUMN 154 +#define TK_CONST_FUNC 155 +#define TK_UMINUS 156 +#define TK_UPLUS 157 + +/************** End of parse.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +#include +#include +#include +#include +#include + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite_int64 +# define float sqlite_int64 +# define LONGDOUBLE_TYPE sqlite_int64 +# ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (((sqlite3_int64)1)<<50) +# endif +# define SQLITE_OMIT_DATETIME_FUNCS 1 +# define SQLITE_OMIT_TRACE 1 +# undef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +# undef SQLITE_HAVE_ISNAN +#endif +#ifndef SQLITE_BIG_DBL +# define SQLITE_BIG_DBL (1e99) +#endif + +/* +** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 +** afterward. Having this macro allows us to cause the C compiler +** to omit code used by TEMP tables without messy #ifndef statements. +*/ +#ifdef SQLITE_OMIT_TEMPDB +#define OMIT_TEMPDB 1 +#else +#define OMIT_TEMPDB 0 +#endif + +/* +** The "file format" number is an integer that is incremented whenever +** the VDBE-level file format changes. The following macros define the +** the default file format for new databases and the maximum file format +** that the library can read. +*/ +#define SQLITE_MAX_FILE_FORMAT 4 +#ifndef SQLITE_DEFAULT_FILE_FORMAT +# define SQLITE_DEFAULT_FILE_FORMAT 4 +#endif + +/* +** Determine whether triggers are recursive by default. This can be +** changed at run-time using a pragma. +*/ +#ifndef SQLITE_DEFAULT_RECURSIVE_TRIGGERS +# define SQLITE_DEFAULT_RECURSIVE_TRIGGERS 0 +#endif + +/* +** Provide a default value for SQLITE_TEMP_STORE in case it is not specified +** on the command-line +*/ +#ifndef SQLITE_TEMP_STORE +# define SQLITE_TEMP_STORE 1 +#endif + +/* +** GCC does not define the offsetof() macro so we'll have to do it +** ourselves. +*/ +#ifndef offsetof +#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) +#endif + +/* +** Check to see if this machine uses EBCDIC. (Yes, believe it or +** not, there are still machines out there that use EBCDIC.) +*/ +#if 'A' == '\301' +# define SQLITE_EBCDIC 1 +#else +# define SQLITE_ASCII 1 +#endif + +/* +** Integers of known sizes. These typedefs might change for architectures +** where the sizes very. Preprocessor macros are available so that the +** types can be conveniently redefined at compile-type. Like this: +** +** cc '-DUINTPTR_TYPE=long long int' ... +*/ +#ifndef UINT32_TYPE +# ifdef HAVE_UINT32_T +# define UINT32_TYPE uint32_t +# else +# define UINT32_TYPE unsigned int +# endif +#endif +#ifndef UINT16_TYPE +# ifdef HAVE_UINT16_T +# define UINT16_TYPE uint16_t +# else +# define UINT16_TYPE unsigned short int +# endif +#endif +#ifndef INT16_TYPE +# ifdef HAVE_INT16_T +# define INT16_TYPE int16_t +# else +# define INT16_TYPE short int +# endif +#endif +#ifndef UINT8_TYPE +# ifdef HAVE_UINT8_T +# define UINT8_TYPE uint8_t +# else +# define UINT8_TYPE unsigned char +# endif +#endif +#ifndef INT8_TYPE +# ifdef HAVE_INT8_T +# define INT8_TYPE int8_t +# else +# define INT8_TYPE signed char +# endif +#endif +#ifndef LONGDOUBLE_TYPE +# define LONGDOUBLE_TYPE long double +#endif +typedef sqlite_int64 i64; /* 8-byte signed integer */ +typedef sqlite_uint64 u64; /* 8-byte unsigned integer */ +typedef UINT32_TYPE u32; /* 4-byte unsigned integer */ +typedef UINT16_TYPE u16; /* 2-byte unsigned integer */ +typedef INT16_TYPE i16; /* 2-byte signed integer */ +typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ +typedef INT8_TYPE i8; /* 1-byte signed integer */ + +/* +** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value +** that can be stored in a u32 without loss of data. The value +** is 0x00000000ffffffff. But because of quirks of some compilers, we +** have to specify the value in the less intuitive manner shown: +*/ +#define SQLITE_MAX_U32 ((((u64)1)<<32)-1) + +/* +** The datatype used to store estimates of the number of rows in a +** table or index. This is an unsigned integer type. For 99.9% of +** the world, a 32-bit integer is sufficient. But a 64-bit integer +** can be used at compile-time if desired. +*/ +#ifdef SQLITE_64BIT_STATS + typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */ +#else + typedef u32 tRowcnt; /* 32-bit is the default */ +#endif + +/* +** Macros to determine whether the machine is big or little endian, +** evaluated at runtime. +*/ +#ifdef SQLITE_AMALGAMATION +SQLITE_PRIVATE const int sqlite3one = 1; +#else +SQLITE_PRIVATE const int sqlite3one; +#endif +#if defined(i386) || defined(__i386__) || defined(_M_IX86)\ + || defined(__x86_64) || defined(__x86_64__) +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#else +# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) +# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) +# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) +#endif + +/* +** Constants for the largest and smallest possible 64-bit signed integers. +** These macros are designed to work correctly on both 32-bit and 64-bit +** compilers. +*/ +#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +/* +** Round up a number to the next larger multiple of 8. This is used +** to force 8-byte alignment on 64-bit architectures. +*/ +#define ROUND8(x) (((x)+7)&~7) + +/* +** Round down to the nearest multiple of 8 +*/ +#define ROUNDDOWN8(x) ((x)&~7) + +/* +** Assert that the pointer X is aligned to an 8-byte boundary. This +** macro is used only within assert() to verify that the code gets +** all alignment restrictions correct. +** +** Except, if SQLITE_4_BYTE_ALIGNED_MALLOC is defined, then the +** underlying malloc() implemention might return us 4-byte aligned +** pointers. In that case, only verify 4-byte alignment. +*/ +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&3)==0) +#else +# define EIGHT_BYTE_ALIGNMENT(X) ((((char*)(X) - (char*)0)&7)==0) +#endif + + +/* +** An instance of the following structure is used to store the busy-handler +** callback for a given sqlite handle. +** +** The sqlite.busyHandler member of the sqlite struct contains the busy +** callback for the database handle. Each pager opened via the sqlite +** handle is passed a pointer to sqlite.busyHandler. The busy-handler +** callback is currently invoked only from within pager.c. +*/ +typedef struct BusyHandler BusyHandler; +struct BusyHandler { + int (*xFunc)(void *,int); /* The busy callback */ + void *pArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ +}; + +/* +** Name of the master database table. The master database table +** is a special table that holds the names and attributes of all +** user tables and indices. +*/ +#define MASTER_NAME "sqlite_master" +#define TEMP_MASTER_NAME "sqlite_temp_master" + +/* +** The root-page of the master database table. +*/ +#define MASTER_ROOT 1 + +/* +** The name of the schema table. +*/ +#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) + +/* +** A convenience macro that returns the number of elements in +** an array. +*/ +#define ArraySize(X) ((int)(sizeof(X)/sizeof(X[0]))) + +/* +** The following value as a destructor means to use sqlite3DbFree(). +** This is an internal extension to SQLITE_STATIC and SQLITE_TRANSIENT. +*/ +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3DbFree) + +/* +** When SQLITE_OMIT_WSD is defined, it means that the target platform does +** not support Writable Static Data (WSD) such as global and static variables. +** All variables must either be on the stack or dynamically allocated from +** the heap. When WSD is unsupported, the variable declarations scattered +** throughout the SQLite code must become constants instead. The SQLITE_WSD +** macro is used for this purpose. And instead of referencing the variable +** directly, we use its constant as a key to lookup the run-time allocated +** buffer that holds real variable. The constant is also the initializer +** for the run-time allocated buffer. +** +** In the usual case where WSD is supported, the SQLITE_WSD and GLOBAL +** macros become no-ops and have zero performance impact. +*/ +#ifdef SQLITE_OMIT_WSD + #define SQLITE_WSD const + #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) + #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) +SQLITE_API int sqlite3_wsd_init(int N, int J); +SQLITE_API void *sqlite3_wsd_find(void *K, int L); +#else + #define SQLITE_WSD + #define GLOBAL(t,v) v + #define sqlite3GlobalConfig sqlite3Config +#endif + +/* +** The following macros are used to suppress compiler warnings and to +** make it clear to human readers when a function parameter is deliberately +** left unused within the body of a function. This usually happens when +** a function is called via a function pointer. For example the +** implementation of an SQL aggregate step callback may not use the +** parameter indicating the number of arguments passed to the aggregate, +** if it knows that this is enforced elsewhere. +** +** When a function parameter is not used at all within the body of a function, +** it is generally named "NotUsed" or "NotUsed2" to make things even clearer. +** However, these macros may also be used to suppress warnings related to +** parameters that may or may not be used depending on compilation options. +** For example those parameters only used in assert() statements. In these +** cases the parameters are named as per the usual conventions. +*/ +#define UNUSED_PARAMETER(x) (void)(x) +#define UNUSED_PARAMETER2(x,y) UNUSED_PARAMETER(x),UNUSED_PARAMETER(y) + +/* +** Forward references to structures +*/ +typedef struct AggInfo AggInfo; +typedef struct AuthContext AuthContext; +typedef struct AutoincInfo AutoincInfo; +typedef struct Bitvec Bitvec; +typedef struct CollSeq CollSeq; +typedef struct Column Column; +typedef struct Db Db; +typedef struct Schema Schema; +typedef struct Expr Expr; +typedef struct ExprList ExprList; +typedef struct ExprSpan ExprSpan; +typedef struct FKey FKey; +typedef struct FuncDestructor FuncDestructor; +typedef struct FuncDef FuncDef; +typedef struct FuncDefHash FuncDefHash; +typedef struct IdList IdList; +typedef struct Index Index; +typedef struct IndexSample IndexSample; +typedef struct KeyClass KeyClass; +typedef struct KeyInfo KeyInfo; +typedef struct Lookaside Lookaside; +typedef struct LookasideSlot LookasideSlot; +typedef struct Module Module; +typedef struct NameContext NameContext; +typedef struct Parse Parse; +typedef struct RowSet RowSet; +typedef struct Savepoint Savepoint; +typedef struct Select Select; +typedef struct SrcList SrcList; +typedef struct StrAccum StrAccum; +typedef struct Table Table; +typedef struct TableLock TableLock; +typedef struct Token Token; +typedef struct Trigger Trigger; +typedef struct TriggerPrg TriggerPrg; +typedef struct TriggerStep TriggerStep; +typedef struct UnpackedRecord UnpackedRecord; +typedef struct VTable VTable; +typedef struct VtabCtx VtabCtx; +typedef struct Walker Walker; +typedef struct WherePlan WherePlan; +typedef struct WhereInfo WhereInfo; +typedef struct WhereLevel WhereLevel; + +/* +** Defer sourcing vdbe.h and btree.h until after the "u8" and +** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque +** pointer types (i.e. FuncDef) defined above. +*/ +/************** Include btree.h in the middle of sqliteInt.h *****************/ +/************** Begin file btree.h *******************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite B-Tree file +** subsystem. See comments in the source code for a detailed description +** of what each interface routine does. +*/ +#ifndef _BTREE_H_ +#define _BTREE_H_ + +/* TODO: This definition is just included so other modules compile. It +** needs to be revisited. +*/ +#define SQLITE_N_BTREE_META 10 + +/* +** If defined as non-zero, auto-vacuum is enabled by default. Otherwise +** it must be turned on for each database using "PRAGMA auto_vacuum = 1". +*/ +#ifndef SQLITE_DEFAULT_AUTOVACUUM + #define SQLITE_DEFAULT_AUTOVACUUM 0 +#endif + +#define BTREE_AUTOVACUUM_NONE 0 /* Do not do auto-vacuum */ +#define BTREE_AUTOVACUUM_FULL 1 /* Do full auto-vacuum */ +#define BTREE_AUTOVACUUM_INCR 2 /* Incremental vacuum */ + +/* +** Forward declarations of structure +*/ +typedef struct Btree Btree; +typedef struct BtCursor BtCursor; +typedef struct BtShared BtShared; + + +SQLITE_PRIVATE int sqlite3BtreeOpen( + sqlite3_vfs *pVfs, /* VFS to use with this b-tree */ + const char *zFilename, /* Name of database file to open */ + sqlite3 *db, /* Associated database connection */ + Btree **ppBtree, /* Return open Btree* here */ + int flags, /* Flags */ + int vfsFlags /* Flags passed through to VFS open */ +); + +/* The flags parameter to sqlite3BtreeOpen can be the bitwise or of the +** following values. +** +** NOTE: These values must match the corresponding PAGER_ values in +** pager.h. +*/ +#define BTREE_OMIT_JOURNAL 1 /* Do not create or use a rollback journal */ +#define BTREE_NO_READLOCK 2 /* Omit readlocks on readonly files */ +#define BTREE_MEMORY 4 /* This is an in-memory DB */ +#define BTREE_SINGLE 8 /* The file contains at most 1 b-tree */ +#define BTREE_UNORDERED 16 /* Use of a hash implementation is OK */ + +SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeSetSafetyLevel(Btree*,int,int,int); +SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); +SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); +SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); +SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); +SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); +SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); +SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseOne(Btree*, const char *zMaster); +SQLITE_PRIVATE int sqlite3BtreeCommitPhaseTwo(Btree*, int); +SQLITE_PRIVATE int sqlite3BtreeCommit(Btree*); +SQLITE_PRIVATE int sqlite3BtreeRollback(Btree*); +SQLITE_PRIVATE int sqlite3BtreeBeginStmt(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeCreateTable(Btree*, int*, int flags); +SQLITE_PRIVATE int sqlite3BtreeIsInTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); +SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); +SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); +SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); +SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); +SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); + +SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); +SQLITE_PRIVATE const char *sqlite3BtreeGetJournalname(Btree *); +SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *, Btree *); + +SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *); + +/* The flags parameter to sqlite3BtreeCreateTable can be the bitwise OR +** of the flags shown below. +** +** Every SQLite table must have either BTREE_INTKEY or BTREE_BLOBKEY set. +** With BTREE_INTKEY, the table key is a 64-bit integer and arbitrary data +** is stored in the leaves. (BTREE_INTKEY is used for SQL tables.) With +** BTREE_BLOBKEY, the key is an arbitrary BLOB and no content is stored +** anywhere - the key is the content. (BTREE_BLOBKEY is used for SQL +** indices.) +*/ +#define BTREE_INTKEY 1 /* Table has only 64-bit signed integer keys */ +#define BTREE_BLOBKEY 2 /* Table has keys only - no data */ + +SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree*, int, int*); +SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree*, int, int*); +SQLITE_PRIVATE void sqlite3BtreeTripAllCursors(Btree*, int); + +SQLITE_PRIVATE void sqlite3BtreeGetMeta(Btree *pBtree, int idx, u32 *pValue); +SQLITE_PRIVATE int sqlite3BtreeUpdateMeta(Btree*, int idx, u32 value); + +/* +** The second parameter to sqlite3BtreeGetMeta or sqlite3BtreeUpdateMeta +** should be one of the following values. The integer values are assigned +** to constants so that the offset of the corresponding field in an +** SQLite database header may be found using the following formula: +** +** offset = 36 + (idx * 4) +** +** For example, the free-page-count field is located at byte offset 36 of +** the database file header. The incr-vacuum-flag field is located at +** byte offset 64 (== 36+4*7). +*/ +#define BTREE_FREE_PAGE_COUNT 0 +#define BTREE_SCHEMA_VERSION 1 +#define BTREE_FILE_FORMAT 2 +#define BTREE_DEFAULT_CACHE_SIZE 3 +#define BTREE_LARGEST_ROOT_PAGE 4 +#define BTREE_TEXT_ENCODING 5 +#define BTREE_USER_VERSION 6 +#define BTREE_INCR_VACUUM 7 + +SQLITE_PRIVATE int sqlite3BtreeCursor( + Btree*, /* BTree containing table to open */ + int iTable, /* Index of root page */ + int wrFlag, /* 1 for writing. 0 for read-only */ + struct KeyInfo*, /* First argument to compare function */ + BtCursor *pCursor /* Space to write cursor structure */ +); +SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); +SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); + +SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( + BtCursor*, + UnpackedRecord *pUnKey, + i64 intKey, + int bias, + int *pRes +); +SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*, int*); +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, + const void *pData, int nData, + int nZero, int bias, int seekResult); +SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); +SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, int *pAmt); +SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, int *pAmt); +SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); +SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeSetCachedRowid(BtCursor*, sqlite3_int64); +SQLITE_PRIVATE sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor*); + +SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); +SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); + +SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE void sqlite3BtreeCacheOverflow(BtCursor *); +SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); + +SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); + +#ifndef NDEBUG +SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); +#endif + +#ifndef SQLITE_OMIT_BTREECOUNT +SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3BtreeCursorInfo(BtCursor*, int*, int); +SQLITE_PRIVATE void sqlite3BtreeCursorList(Btree*); +#endif + +#ifndef SQLITE_OMIT_WAL +SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); +#endif + +/* +** If we are not using shared cache, then there is no need to +** use mutexes to access the BtShared structures. So make the +** Enter and Leave procedures no-ops. +*/ +#ifndef SQLITE_OMIT_SHARED_CACHE +SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +#else +# define sqlite3BtreeEnter(X) +# define sqlite3BtreeEnterAll(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); +SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); +#ifndef NDEBUG + /* These routines are used inside assert() statements only. */ +SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree*); +SQLITE_PRIVATE int sqlite3BtreeHoldsAllMutexes(sqlite3*); +SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); +#endif +#else + +# define sqlite3BtreeSharable(X) 0 +# define sqlite3BtreeLeave(X) +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeLeaveCursor(X) +# define sqlite3BtreeLeaveAll(X) + +# define sqlite3BtreeHoldsMutex(X) 1 +# define sqlite3BtreeHoldsAllMutexes(X) 1 +# define sqlite3SchemaMutexHeld(X,Y,Z) 1 +#endif + + +#endif /* _BTREE_H_ */ + +/************** End of btree.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include vdbe.h in the middle of sqliteInt.h ******************/ +/************** Begin file vdbe.h ********************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Header file for the Virtual DataBase Engine (VDBE) +** +** This header defines the interface to the virtual database engine +** or VDBE. The VDBE implements an abstract machine that runs a +** simple program to access and modify the underlying database. +*/ +#ifndef _SQLITE_VDBE_H_ +#define _SQLITE_VDBE_H_ +/* #include */ + +/* +** A single VDBE is an opaque structure named "Vdbe". Only routines +** in the source file sqliteVdbe.c are allowed to see the insides +** of this structure. +*/ +typedef struct Vdbe Vdbe; + +/* +** The names of the following types declared in vdbeInt.h are required +** for the VdbeOp definition. +*/ +typedef struct VdbeFunc VdbeFunc; +typedef struct Mem Mem; +typedef struct SubProgram SubProgram; + +/* +** A single instruction of the virtual machine has an opcode +** and as many as three operands. The instruction is recorded +** as an instance of the following structure: +*/ +struct VdbeOp { + u8 opcode; /* What operation to perform */ + signed char p4type; /* One of the P4_xxx constants for p4 */ + u8 opflags; /* Mask of the OPFLG_* flags in opcodes.h */ + u8 p5; /* Fifth parameter is an unsigned character */ + int p1; /* First operand */ + int p2; /* Second parameter (often the jump destination) */ + int p3; /* The third parameter */ + union { /* fourth parameter */ + int i; /* Integer value if p4type==P4_INT32 */ + void *p; /* Generic pointer */ + char *z; /* Pointer to data for string (char array) types */ + i64 *pI64; /* Used when p4type is P4_INT64 */ + double *pReal; /* Used when p4type is P4_REAL */ + FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ + VdbeFunc *pVdbeFunc; /* Used when p4type is P4_VDBEFUNC */ + CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ + Mem *pMem; /* Used when p4type is P4_MEM */ + VTable *pVtab; /* Used when p4type is P4_VTAB */ + KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ + int *ai; /* Used when p4type is P4_INTARRAY */ + SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ + int (*xAdvance)(BtCursor *, int *); + } p4; +#ifdef SQLITE_DEBUG + char *zComment; /* Comment to improve readability */ +#endif +#ifdef VDBE_PROFILE + int cnt; /* Number of times this instruction was executed */ + u64 cycles; /* Total time spent executing this instruction */ +#endif +}; +typedef struct VdbeOp VdbeOp; + + +/* +** A sub-routine used to implement a trigger program. +*/ +struct SubProgram { + VdbeOp *aOp; /* Array of opcodes for sub-program */ + int nOp; /* Elements in aOp[] */ + int nMem; /* Number of memory cells required */ + int nCsr; /* Number of cursors required */ + int nOnce; /* Number of OP_Once instructions */ + void *token; /* id that may be used to recursive triggers */ + SubProgram *pNext; /* Next sub-program already visited */ +}; + +/* +** A smaller version of VdbeOp used for the VdbeAddOpList() function because +** it takes up less space. +*/ +struct VdbeOpList { + u8 opcode; /* What operation to perform */ + signed char p1; /* First operand */ + signed char p2; /* Second parameter (often the jump destination) */ + signed char p3; /* Third parameter */ +}; +typedef struct VdbeOpList VdbeOpList; + +/* +** Allowed values of VdbeOp.p4type +*/ +#define P4_NOTUSED 0 /* The P4 parameter is not used */ +#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ +#define P4_STATIC (-2) /* Pointer to a static string */ +#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ +#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ +#define P4_VDBEFUNC (-7) /* P4 is a pointer to a VdbeFunc structure */ +#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ +#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ +#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ +#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ +#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ +#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ +#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ +#define P4_ADVANCE (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */ + +/* When adding a P4 argument using P4_KEYINFO, a copy of the KeyInfo structure +** is made. That copy is freed when the Vdbe is finalized. But if the +** argument is P4_KEYINFO_HANDOFF, the passed in pointer is used. It still +** gets freed when the Vdbe is finalized so it still should be obtained +** from a single sqliteMalloc(). But no copy is made and the calling +** function should *not* try to free the KeyInfo. +*/ +#define P4_KEYINFO_HANDOFF (-16) +#define P4_KEYINFO_STATIC (-17) + +/* +** The Vdbe.aColName array contains 5n Mem structures, where n is the +** number of columns of data returned by the statement. +*/ +#define COLNAME_NAME 0 +#define COLNAME_DECLTYPE 1 +#define COLNAME_DATABASE 2 +#define COLNAME_TABLE 3 +#define COLNAME_COLUMN 4 +#ifdef SQLITE_ENABLE_COLUMN_METADATA +# define COLNAME_N 5 /* Number of COLNAME_xxx symbols */ +#else +# ifdef SQLITE_OMIT_DECLTYPE +# define COLNAME_N 1 /* Store only the name */ +# else +# define COLNAME_N 2 /* Store the name and decltype */ +# endif +#endif + +/* +** The following macro converts a relative address in the p2 field +** of a VdbeOp structure into a negative number so that +** sqlite3VdbeAddOpList() knows that the address is relative. Calling +** the macro again restores the address. +*/ +#define ADDR(X) (-1-(X)) + +/* +** The makefile scans the vdbe.c source file and creates the "opcodes.h" +** header file that defines a number for each opcode used by the VDBE. +*/ +/************** Include opcodes.h in the middle of vdbe.h ********************/ +/************** Begin file opcodes.h *****************************************/ +/* Automatically generated. Do not edit */ +/* See the mkopcodeh.awk script for details */ +#define OP_Goto 1 +#define OP_Gosub 2 +#define OP_Return 3 +#define OP_Yield 4 +#define OP_HaltIfNull 5 +#define OP_Halt 6 +#define OP_Integer 7 +#define OP_Int64 8 +#define OP_Real 130 /* same as TK_FLOAT */ +#define OP_String8 94 /* same as TK_STRING */ +#define OP_String 9 +#define OP_Null 10 +#define OP_Blob 11 +#define OP_Variable 12 +#define OP_Move 13 +#define OP_Copy 14 +#define OP_SCopy 15 +#define OP_ResultRow 16 +#define OP_Concat 91 /* same as TK_CONCAT */ +#define OP_Add 86 /* same as TK_PLUS */ +#define OP_Subtract 87 /* same as TK_MINUS */ +#define OP_Multiply 88 /* same as TK_STAR */ +#define OP_Divide 89 /* same as TK_SLASH */ +#define OP_Remainder 90 /* same as TK_REM */ +#define OP_CollSeq 17 +#define OP_Function 18 +#define OP_BitAnd 82 /* same as TK_BITAND */ +#define OP_BitOr 83 /* same as TK_BITOR */ +#define OP_ShiftLeft 84 /* same as TK_LSHIFT */ +#define OP_ShiftRight 85 /* same as TK_RSHIFT */ +#define OP_AddImm 20 +#define OP_MustBeInt 21 +#define OP_RealAffinity 22 +#define OP_ToText 141 /* same as TK_TO_TEXT */ +#define OP_ToBlob 142 /* same as TK_TO_BLOB */ +#define OP_ToNumeric 143 /* same as TK_TO_NUMERIC*/ +#define OP_ToInt 144 /* same as TK_TO_INT */ +#define OP_ToReal 145 /* same as TK_TO_REAL */ +#define OP_Eq 76 /* same as TK_EQ */ +#define OP_Ne 75 /* same as TK_NE */ +#define OP_Lt 79 /* same as TK_LT */ +#define OP_Le 78 /* same as TK_LE */ +#define OP_Gt 77 /* same as TK_GT */ +#define OP_Ge 80 /* same as TK_GE */ +#define OP_Permutation 23 +#define OP_Compare 24 +#define OP_Jump 25 +#define OP_And 69 /* same as TK_AND */ +#define OP_Or 68 /* same as TK_OR */ +#define OP_Not 19 /* same as TK_NOT */ +#define OP_BitNot 93 /* same as TK_BITNOT */ +#define OP_Once 26 +#define OP_If 27 +#define OP_IfNot 28 +#define OP_IsNull 73 /* same as TK_ISNULL */ +#define OP_NotNull 74 /* same as TK_NOTNULL */ +#define OP_Column 29 +#define OP_Affinity 30 +#define OP_MakeRecord 31 +#define OP_Count 32 +#define OP_Savepoint 33 +#define OP_AutoCommit 34 +#define OP_Transaction 35 +#define OP_ReadCookie 36 +#define OP_SetCookie 37 +#define OP_VerifyCookie 38 +#define OP_OpenRead 39 +#define OP_OpenWrite 40 +#define OP_OpenAutoindex 41 +#define OP_OpenEphemeral 42 +#define OP_SorterOpen 43 +#define OP_OpenPseudo 44 +#define OP_Close 45 +#define OP_SeekLt 46 +#define OP_SeekLe 47 +#define OP_SeekGe 48 +#define OP_SeekGt 49 +#define OP_Seek 50 +#define OP_NotFound 51 +#define OP_Found 52 +#define OP_IsUnique 53 +#define OP_NotExists 54 +#define OP_Sequence 55 +#define OP_NewRowid 56 +#define OP_Insert 57 +#define OP_InsertInt 58 +#define OP_Delete 59 +#define OP_ResetCount 60 +#define OP_SorterCompare 61 +#define OP_SorterData 62 +#define OP_RowKey 63 +#define OP_RowData 64 +#define OP_Rowid 65 +#define OP_NullRow 66 +#define OP_Last 67 +#define OP_SorterSort 70 +#define OP_Sort 71 +#define OP_Rewind 72 +#define OP_SorterNext 81 +#define OP_Prev 92 +#define OP_Next 95 +#define OP_SorterInsert 96 +#define OP_IdxInsert 97 +#define OP_IdxDelete 98 +#define OP_IdxRowid 99 +#define OP_IdxLT 100 +#define OP_IdxGE 101 +#define OP_Destroy 102 +#define OP_Clear 103 +#define OP_CreateIndex 104 +#define OP_CreateTable 105 +#define OP_ParseSchema 106 +#define OP_LoadAnalysis 107 +#define OP_DropTable 108 +#define OP_DropIndex 109 +#define OP_DropTrigger 110 +#define OP_IntegrityCk 111 +#define OP_RowSetAdd 112 +#define OP_RowSetRead 113 +#define OP_RowSetTest 114 +#define OP_Program 115 +#define OP_Param 116 +#define OP_FkCounter 117 +#define OP_FkIfZero 118 +#define OP_MemMax 119 +#define OP_IfPos 120 +#define OP_IfNeg 121 +#define OP_IfZero 122 +#define OP_AggStep 123 +#define OP_AggFinal 124 +#define OP_Checkpoint 125 +#define OP_JournalMode 126 +#define OP_Vacuum 127 +#define OP_IncrVacuum 128 +#define OP_Expire 129 +#define OP_TableLock 131 +#define OP_VBegin 132 +#define OP_VCreate 133 +#define OP_VDestroy 134 +#define OP_VOpen 135 +#define OP_VFilter 136 +#define OP_VColumn 137 +#define OP_VNext 138 +#define OP_VRename 139 +#define OP_VUpdate 140 +#define OP_Pagecount 146 +#define OP_MaxPgcnt 147 +#define OP_Trace 148 +#define OP_Noop 149 +#define OP_Explain 150 + + +/* Properties such as "out2" or "jump" that are specified in +** comments following the "case" for each opcode in the vdbe.c +** are encoded into bitvectors as follows: +*/ +#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */ +#define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */ +#define OPFLG_IN1 0x0004 /* in1: P1 is an input */ +#define OPFLG_IN2 0x0008 /* in2: P2 is an input */ +#define OPFLG_IN3 0x0010 /* in3: P3 is an input */ +#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ +#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ +#define OPFLG_INITIALIZER {\ +/* 0 */ 0x00, 0x01, 0x01, 0x04, 0x04, 0x10, 0x00, 0x02,\ +/* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x24, 0x24,\ +/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\ +/* 24 */ 0x00, 0x01, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00,\ +/* 32 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00,\ +/* 40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,\ +/* 48 */ 0x11, 0x11, 0x08, 0x11, 0x11, 0x11, 0x11, 0x02,\ +/* 56 */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 64 */ 0x00, 0x02, 0x00, 0x01, 0x4c, 0x4c, 0x01, 0x01,\ +/* 72 */ 0x01, 0x05, 0x05, 0x15, 0x15, 0x15, 0x15, 0x15,\ +/* 80 */ 0x15, 0x01, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c,\ +/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x01, 0x24, 0x02, 0x01,\ +/* 96 */ 0x08, 0x08, 0x00, 0x02, 0x01, 0x01, 0x02, 0x00,\ +/* 104 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 112 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x00, 0x01, 0x08,\ +/* 120 */ 0x05, 0x05, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00,\ +/* 128 */ 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 136 */ 0x01, 0x00, 0x01, 0x00, 0x00, 0x04, 0x04, 0x04,\ +/* 144 */ 0x04, 0x04, 0x02, 0x02, 0x00, 0x00, 0x00,} + +/************** End of opcodes.h *********************************************/ +/************** Continuing where we left off in vdbe.h ***********************/ + +/* +** Prototypes for the VDBE interface. See comments on the implementation +** for a description of what each of these routines does. +*/ +SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(sqlite3*); +SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); +SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); +SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); +SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); +SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5); +SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); +SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr); +SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeDeleteObject(sqlite3*,Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); +SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); +SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); +SQLITE_PRIVATE void sqlite3VdbeTrace(Vdbe*,FILE*); +#endif +SQLITE_PRIVATE void sqlite3VdbeResetStepResult(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe*); +SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); +SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); +SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); +SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); +SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); +SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetValue(Vdbe*, int, u8); +SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe*, int); +#ifndef SQLITE_OMIT_TRACE +SQLITE_PRIVATE char *sqlite3VdbeExpandSql(Vdbe*, const char*); +#endif + +SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); +SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **); + +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); +#endif + + +#ifndef NDEBUG +SQLITE_PRIVATE void sqlite3VdbeComment(Vdbe*, const char*, ...); +# define VdbeComment(X) sqlite3VdbeComment X +SQLITE_PRIVATE void sqlite3VdbeNoopComment(Vdbe*, const char*, ...); +# define VdbeNoopComment(X) sqlite3VdbeNoopComment X +#else +# define VdbeComment(X) +# define VdbeNoopComment(X) +#endif + +#endif + +/************** End of vdbe.h ************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pager.h in the middle of sqliteInt.h *****************/ +/************** Begin file pager.h *******************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite page cache +** subsystem. The page cache subsystem reads and writes a file a page +** at a time and provides a journal for rollback. +*/ + +#ifndef _PAGER_H_ +#define _PAGER_H_ + +/* +** Default maximum size for persistent journal files. A negative +** value means no limit. This value may be overridden using the +** sqlite3PagerJournalSizeLimit() API. See also "PRAGMA journal_size_limit". +*/ +#ifndef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + #define SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT -1 +#endif + +/* +** The type used to represent a page number. The first page in a file +** is called page 1. 0 is used to represent "not a page". +*/ +typedef u32 Pgno; + +/* +** Each open file is managed by a separate instance of the "Pager" structure. +*/ +typedef struct Pager Pager; + +/* +** Handle type for pages. +*/ +typedef struct PgHdr DbPage; + +/* +** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** reserved for working around a windows/posix incompatibility). It is +** used in the journal to signify that the remainder of the journal file +** is devoted to storing a master journal name - there are no more pages to +** roll back. See comments for function writeMasterJournal() in pager.c +** for details. +*/ +#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) + +/* +** Allowed values for the flags parameter to sqlite3PagerOpen(). +** +** NOTE: These values must match the corresponding BTREE_ values in btree.h. +*/ +#define PAGER_OMIT_JOURNAL 0x0001 /* Do not use a rollback journal */ +#define PAGER_NO_READLOCK 0x0002 /* Omit readlocks on readonly files */ +#define PAGER_MEMORY 0x0004 /* In-memory database */ + +/* +** Valid values for the second argument to sqlite3PagerLockingMode(). +*/ +#define PAGER_LOCKINGMODE_QUERY -1 +#define PAGER_LOCKINGMODE_NORMAL 0 +#define PAGER_LOCKINGMODE_EXCLUSIVE 1 + +/* +** Numeric constants that encode the journalmode. +*/ +#define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ +#define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ +#define PAGER_JOURNALMODE_PERSIST 1 /* Commit by zeroing journal header */ +#define PAGER_JOURNALMODE_OFF 2 /* Journal omitted. */ +#define PAGER_JOURNALMODE_TRUNCATE 3 /* Commit by truncating journal */ +#define PAGER_JOURNALMODE_MEMORY 4 /* In-memory journal file */ +#define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ + +/* +** The remainder of this file contains the declarations of the functions +** that make up the Pager sub-system API. See source code comments for +** a detailed description of each routine. +*/ + +/* Open and close a Pager connection. */ +SQLITE_PRIVATE int sqlite3PagerOpen( + sqlite3_vfs*, + Pager **ppPager, + const char*, + int, + int, + int, + void(*)(DbPage*) +); +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); + +/* Functions used to configure a Pager object. */ +SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); +SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); +SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); +SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); +SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int,int); +SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); +SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); +SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); +SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); +SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); + +/* Functions used to obtain and release page references. */ +SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); +#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) +SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); +SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); + +/* Operations on page references. */ +SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); +SQLITE_PRIVATE void sqlite3PagerDontWrite(DbPage*); +SQLITE_PRIVATE int sqlite3PagerMovepage(Pager*,DbPage*,Pgno,int); +SQLITE_PRIVATE int sqlite3PagerPageRefcount(DbPage*); +SQLITE_PRIVATE void *sqlite3PagerGetData(DbPage *); +SQLITE_PRIVATE void *sqlite3PagerGetExtra(DbPage *); + +/* Functions used to manage pager transactions and savepoints. */ +SQLITE_PRIVATE void sqlite3PagerPagecount(Pager*, int*); +SQLITE_PRIVATE int sqlite3PagerBegin(Pager*, int exFlag, int); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne(Pager*,const char *zMaster, int); +SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager*); +SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerCommitPhaseTwo(Pager*); +SQLITE_PRIVATE int sqlite3PagerRollback(Pager*); +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int n); +SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); +SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); + +SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); +SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager); + +/* Functions used to query pager state and configuration. */ +SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*); +SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); +SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); +SQLITE_PRIVATE int sqlite3PagerNosync(Pager*); +SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); +SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); +SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *); + +/* Functions used to truncate the database file. */ +SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); + +#if defined(SQLITE_HAS_CODEC) && !defined(SQLITE_OMIT_WAL) +SQLITE_PRIVATE void *sqlite3PagerCodec(DbPage *); +#endif + +/* Functions to support testing and debugging. */ +#if !defined(NDEBUG) || defined(SQLITE_TEST) +SQLITE_PRIVATE Pgno sqlite3PagerPagenumber(DbPage*); +SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage*); +#endif +#ifdef SQLITE_TEST +SQLITE_PRIVATE int *sqlite3PagerStats(Pager*); +SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); + void disable_simulated_io_errors(void); + void enable_simulated_io_errors(void); +#else +# define disable_simulated_io_errors() +# define enable_simulated_io_errors() +#endif + +#endif /* _PAGER_H_ */ + +/************** End of pager.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include pcache.h in the middle of sqliteInt.h ****************/ +/************** Begin file pcache.h ******************************************/ +/* +** 2008 August 05 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the sqlite page cache +** subsystem. +*/ + +#ifndef _PCACHE_H_ + +typedef struct PgHdr PgHdr; +typedef struct PCache PCache; + +/* +** Every page in the cache is controlled by an instance of the following +** structure. +*/ +struct PgHdr { + sqlite3_pcache_page *pPage; /* Pcache object page handle */ + void *pData; /* Page data */ + void *pExtra; /* Extra content */ + PgHdr *pDirty; /* Transient list of dirty pages */ + Pgno pgno; /* Page number for this page */ + Pager *pPager; /* The pager this page is part of */ +#ifdef SQLITE_CHECK_PAGES + u32 pageHash; /* Hash of page content */ +#endif + u16 flags; /* PGHDR flags defined below */ + + /********************************************************************** + ** Elements above are public. All that follows is private to pcache.c + ** and should not be accessed by other modules. + */ + i16 nRef; /* Number of users of this page */ + PCache *pCache; /* Cache that owns this page */ + + PgHdr *pDirtyNext; /* Next element in list of dirty pages */ + PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ +}; + +/* Bit values for PgHdr.flags */ +#define PGHDR_DIRTY 0x002 /* Page has changed */ +#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before + ** writing this page to the database */ +#define PGHDR_NEED_READ 0x008 /* Content is unread */ +#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */ +#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */ + +/* Initialize and shutdown the page cache subsystem */ +SQLITE_PRIVATE int sqlite3PcacheInitialize(void); +SQLITE_PRIVATE void sqlite3PcacheShutdown(void); + +/* Page cache buffer management: +** These routines implement SQLITE_CONFIG_PAGECACHE. +*/ +SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *, int sz, int n); + +/* Create a new pager cache. +** Under memory stress, invoke xStress to try to make pages clean. +** Only clean and unpinned pages can be reclaimed. +*/ +SQLITE_PRIVATE void sqlite3PcacheOpen( + int szPage, /* Size of every page */ + int szExtra, /* Extra space associated with each page */ + int bPurgeable, /* True if pages are on backing store */ + int (*xStress)(void*, PgHdr*), /* Call to try to make pages clean */ + void *pStress, /* Argument to xStress */ + PCache *pToInit /* Preallocated space for the PCache */ +); + +/* Modify the page-size after the cache has been created. */ +SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *, int); + +/* Return the size in bytes of a PCache object. Used to preallocate +** storage space. +*/ +SQLITE_PRIVATE int sqlite3PcacheSize(void); + +/* One release per successful fetch. Page is pinned until released. +** Reference counted. +*/ +SQLITE_PRIVATE int sqlite3PcacheFetch(PCache*, Pgno, int createFlag, PgHdr**); +SQLITE_PRIVATE void sqlite3PcacheRelease(PgHdr*); + +SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache */ +SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ +SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ +SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ + +/* Change a page number. Used by incr-vacuum. */ +SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); + +/* Remove all pages with pgno>x. Reset the cache if x==0 */ +SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache*, Pgno x); + +/* Get a list of all dirty pages in the cache, sorted by page number */ +SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache*); + +/* Reset and close the cache object */ +SQLITE_PRIVATE void sqlite3PcacheClose(PCache*); + +/* Clear flags from pages of the page cache */ +SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *); + +/* Discard the contents of the cache */ +SQLITE_PRIVATE void sqlite3PcacheClear(PCache*); + +/* Return the total number of outstanding page references */ +SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache*); + +/* Increment the reference count of an existing page */ +SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr*); + +SQLITE_PRIVATE int sqlite3PcachePageRefcount(PgHdr*); + +/* Return the total number of pages stored in the cache */ +SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); + +#if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) +/* Iterate through all dirty pages currently stored in the cache. This +** interface is only available if SQLITE_CHECK_PAGES is defined when the +** library is built. +*/ +SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); +#endif + +/* Set and get the suggested cache-size for the specified pager-cache. +** +** If no global maximum is configured, then the system attempts to limit +** the total number of pages cached by purgeable pager-caches to the sum +** of the suggested cache-sizes. +*/ +SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); +#ifdef SQLITE_TEST +SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); +#endif + +/* Free up as much memory as possible from the page cache */ +SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); + +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT +/* Try to return memory used by the pcache module to the main memory heap */ +SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); +#endif + +#ifdef SQLITE_TEST +SQLITE_PRIVATE void sqlite3PcacheStats(int*,int*,int*,int*); +#endif + +SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); + +#endif /* _PCACHE_H_ */ + +/************** End of pcache.h **********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + +/************** Include os.h in the middle of sqliteInt.h ********************/ +/************** Begin file os.h **********************************************/ +/* +** 2001 September 16 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This header file (together with is companion C source-code file +** "os.c") attempt to abstract the underlying operating system so that +** the SQLite library will work on both POSIX and windows systems. +** +** This header file is #include-ed by sqliteInt.h and thus ends up +** being included by every source file. +*/ +#ifndef _SQLITE_OS_H_ +#define _SQLITE_OS_H_ + +/* +** Figure out if we are dealing with Unix, Windows, or some other +** operating system. After the following block of preprocess macros, +** all of SQLITE_OS_UNIX, SQLITE_OS_WIN, SQLITE_OS_OS2, and SQLITE_OS_OTHER +** will defined to either 1 or 0. One of the four will be 1. The other +** three will be 0. +*/ +#if defined(SQLITE_OS_OTHER) +# if SQLITE_OS_OTHER==1 +# undef SQLITE_OS_UNIX +# define SQLITE_OS_UNIX 0 +# undef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# undef SQLITE_OS_OS2 +# define SQLITE_OS_OS2 0 +# else +# undef SQLITE_OS_OTHER +# endif +#endif +#if !defined(SQLITE_OS_UNIX) && !defined(SQLITE_OS_OTHER) +# define SQLITE_OS_OTHER 0 +# ifndef SQLITE_OS_WIN +# if defined(_WIN32) || defined(WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__BORLANDC__) +# define SQLITE_OS_WIN 1 +# define SQLITE_OS_UNIX 0 +# define SQLITE_OS_OS2 0 +# elif defined(__EMX__) || defined(_OS2) || defined(OS2) || defined(_OS2_) || defined(__OS2__) +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 0 +# define SQLITE_OS_OS2 1 +# else +# define SQLITE_OS_WIN 0 +# define SQLITE_OS_UNIX 1 +# define SQLITE_OS_OS2 0 +# endif +# else +# define SQLITE_OS_UNIX 0 +# define SQLITE_OS_OS2 0 +# endif +#else +# ifndef SQLITE_OS_WIN +# define SQLITE_OS_WIN 0 +# endif +#endif + +/* +** Define the maximum size of a temporary filename +*/ +#if SQLITE_OS_WIN +# include +# define SQLITE_TEMPNAME_SIZE (MAX_PATH+50) +#elif SQLITE_OS_OS2 +# if (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 3) && defined(OS2_HIGH_MEMORY) +# include /* has to be included before os2.h for linking to work */ +# endif +# define INCL_DOSDATETIME +# define INCL_DOSFILEMGR +# define INCL_DOSERRORS +# define INCL_DOSMISC +# define INCL_DOSPROCESS +# define INCL_DOSMODULEMGR +# define INCL_DOSSEMAPHORES +# include +# include +# define SQLITE_TEMPNAME_SIZE (CCHMAXPATHCOMP) +#else +# define SQLITE_TEMPNAME_SIZE 200 +#endif + +/* +** Determine if we are dealing with Windows NT. +*/ +#if defined(_WIN32_WINNT) +# define SQLITE_OS_WINNT 1 +#else +# define SQLITE_OS_WINNT 0 +#endif + +/* +** Determine if we are dealing with WindowsCE - which has a much +** reduced API. +*/ +#if defined(_WIN32_WCE) +# define SQLITE_OS_WINCE 1 +#else +# define SQLITE_OS_WINCE 0 +#endif + +/* If the SET_FULLSYNC macro is not defined above, then make it +** a no-op +*/ +#ifndef SET_FULLSYNC +# define SET_FULLSYNC(x,y) +#endif + +/* +** The default size of a disk sector +*/ +#ifndef SQLITE_DEFAULT_SECTOR_SIZE +# define SQLITE_DEFAULT_SECTOR_SIZE 4096 +#endif + +/* +** Temporary files are named starting with this prefix followed by 16 random +** alphanumeric characters, and no file extension. They are stored in the +** OS's standard temporary file directory, and are deleted prior to exit. +** If sqlite is being embedded in another program, you may wish to change the +** prefix to reflect your program's name, so that if your program exits +** prematurely, old temporary files can be easily identified. This can be done +** using -DSQLITE_TEMP_FILE_PREFIX=myprefix_ on the compiler command line. +** +** 2006-10-31: The default prefix used to be "sqlite_". But then +** Mcafee started using SQLite in their anti-virus product and it +** started putting files with the "sqlite" name in the c:/temp folder. +** This annoyed many windows users. Those users would then do a +** Google search for "sqlite", find the telephone numbers of the +** developers and call to wake them up at night and complain. +** For this reason, the default name prefix is changed to be "sqlite" +** spelled backwards. So the temp files are still identified, but +** anybody smart enough to figure out the code is also likely smart +** enough to know that calling the developer will not help get rid +** of the file. +*/ +#ifndef SQLITE_TEMP_FILE_PREFIX +# define SQLITE_TEMP_FILE_PREFIX "etilqs_" +#endif + +/* +** The following values may be passed as the second argument to +** sqlite3OsLock(). The various locks exhibit the following semantics: +** +** SHARED: Any number of processes may hold a SHARED lock simultaneously. +** RESERVED: A single process may hold a RESERVED lock on a file at +** any time. Other processes may hold and obtain new SHARED locks. +** PENDING: A single process may hold a PENDING lock on a file at +** any one time. Existing SHARED locks may persist, but no new +** SHARED locks may be obtained by other processes. +** EXCLUSIVE: An EXCLUSIVE lock precludes all other locks. +** +** PENDING_LOCK may not be passed directly to sqlite3OsLock(). Instead, a +** process that requests an EXCLUSIVE lock may actually obtain a PENDING +** lock. This can be upgraded to an EXCLUSIVE lock by a subsequent call to +** sqlite3OsLock(). +*/ +#define NO_LOCK 0 +#define SHARED_LOCK 1 +#define RESERVED_LOCK 2 +#define PENDING_LOCK 3 +#define EXCLUSIVE_LOCK 4 + +/* +** File Locking Notes: (Mostly about windows but also some info for Unix) +** +** We cannot use LockFileEx() or UnlockFileEx() on Win95/98/ME because +** those functions are not available. So we use only LockFile() and +** UnlockFile(). +** +** LockFile() prevents not just writing but also reading by other processes. +** A SHARED_LOCK is obtained by locking a single randomly-chosen +** byte out of a specific range of bytes. The lock byte is obtained at +** random so two separate readers can probably access the file at the +** same time, unless they are unlucky and choose the same lock byte. +** An EXCLUSIVE_LOCK is obtained by locking all bytes in the range. +** There can only be one writer. A RESERVED_LOCK is obtained by locking +** a single byte of the file that is designated as the reserved lock byte. +** A PENDING_LOCK is obtained by locking a designated byte different from +** the RESERVED_LOCK byte. +** +** On WinNT/2K/XP systems, LockFileEx() and UnlockFileEx() are available, +** which means we can use reader/writer locks. When reader/writer locks +** are used, the lock is placed on the same range of bytes that is used +** for probabilistic locking in Win95/98/ME. Hence, the locking scheme +** will support two or more Win95 readers or two or more WinNT readers. +** But a single Win95 reader will lock out all WinNT readers and a single +** WinNT reader will lock out all other Win95 readers. +** +** The following #defines specify the range of bytes used for locking. +** SHARED_SIZE is the number of bytes available in the pool from which +** a random byte is selected for a shared lock. The pool of bytes for +** shared locks begins at SHARED_FIRST. +** +** The same locking strategy and +** byte ranges are used for Unix. This leaves open the possiblity of having +** clients on win95, winNT, and unix all talking to the same shared file +** and all locking correctly. To do so would require that samba (or whatever +** tool is being used for file sharing) implements locks correctly between +** windows and unix. I'm guessing that isn't likely to happen, but by +** using the same locking range we are at least open to the possibility. +** +** Locking in windows is manditory. For this reason, we cannot store +** actual data in the bytes used for locking. The pager never allocates +** the pages involved in locking therefore. SHARED_SIZE is selected so +** that all locks will fit on a single page even at the minimum page size. +** PENDING_BYTE defines the beginning of the locks. By default PENDING_BYTE +** is set high so that we don't have to allocate an unused page except +** for very large databases. But one should test the page skipping logic +** by setting PENDING_BYTE low and running the entire regression suite. +** +** Changing the value of PENDING_BYTE results in a subtly incompatible +** file format. Depending on how it is changed, you might not notice +** the incompatibility right away, even running a full regression test. +** The default location of PENDING_BYTE is the first byte past the +** 1GB boundary. +** +*/ +#ifdef SQLITE_OMIT_WSD +# define PENDING_BYTE (0x40000000) +#else +# define PENDING_BYTE sqlite3PendingByte +#endif +#define RESERVED_BYTE (PENDING_BYTE+1) +#define SHARED_FIRST (PENDING_BYTE+2) +#define SHARED_SIZE 510 + +/* +** Wrapper around OS specific sqlite3_os_init() function. +*/ +SQLITE_PRIVATE int sqlite3OsInit(void); + +/* +** Functions for accessing sqlite3_file methods +*/ +SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*); +SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); +SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); +SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file*, i64 *pSize); +SQLITE_PRIVATE int sqlite3OsLock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); +SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); +SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); +#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 +SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); +SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); +SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); +SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); + + +/* +** Functions for accessing sqlite3_vfs methods +*/ +SQLITE_PRIVATE int sqlite3OsOpen(sqlite3_vfs *, const char *, sqlite3_file*, int, int *); +SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *, const char *, int); +SQLITE_PRIVATE int sqlite3OsAccess(sqlite3_vfs *, const char *, int, int *pResOut); +SQLITE_PRIVATE int sqlite3OsFullPathname(sqlite3_vfs *, const char *, int, char *); +#ifndef SQLITE_OMIT_LOAD_EXTENSION +SQLITE_PRIVATE void *sqlite3OsDlOpen(sqlite3_vfs *, const char *); +SQLITE_PRIVATE void sqlite3OsDlError(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void); +SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ +SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); +SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); +SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); + +/* +** Convenience functions for opening and closing files using +** sqlite3_malloc() to obtain space for the file-handle structure. +*/ +SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); +SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); + +#endif /* _SQLITE_OS_H_ */ + +/************** End of os.h **************************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ +/************** Include mutex.h in the middle of sqliteInt.h *****************/ +/************** Begin file mutex.h *******************************************/ +/* +** 2007 August 28 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains the common header for all mutex implementations. +** The sqliteInt.h header #includes this file so that it is available +** to all source files. We break it out in an effort to keep the code +** better organized. +** +** NOTE: source files should *not* #include this header file directly. +** Source files should #include the sqliteInt.h file and let that file +** include this one indirectly. +*/ + + +/* +** Figure out what version of the code to use. The choices are +** +** SQLITE_MUTEX_OMIT No mutex logic. Not even stubs. The +** mutexes implemention cannot be overridden +** at start-time. +** +** SQLITE_MUTEX_NOOP For single-threaded applications. No +** mutual exclusion is provided. But this +** implementation can be overridden at +** start-time. +** +** SQLITE_MUTEX_PTHREADS For multi-threaded applications on Unix. +** +** SQLITE_MUTEX_W32 For multi-threaded applications on Win32. +** +** SQLITE_MUTEX_OS2 For multi-threaded applications on OS/2. +*/ +#if !SQLITE_THREADSAFE +# define SQLITE_MUTEX_OMIT +#endif +#if SQLITE_THREADSAFE && !defined(SQLITE_MUTEX_NOOP) +# if SQLITE_OS_UNIX +# define SQLITE_MUTEX_PTHREADS +# elif SQLITE_OS_WIN +# define SQLITE_MUTEX_W32 +# elif SQLITE_OS_OS2 +# define SQLITE_MUTEX_OS2 +# else +# define SQLITE_MUTEX_NOOP +# endif +#endif + +#ifdef SQLITE_MUTEX_OMIT +/* +** If this is a no-op implementation, implement everything as macros. +*/ +#define sqlite3_mutex_alloc(X) ((sqlite3_mutex*)8) +#define sqlite3_mutex_free(X) +#define sqlite3_mutex_enter(X) +#define sqlite3_mutex_try(X) SQLITE_OK +#define sqlite3_mutex_leave(X) +#define sqlite3_mutex_held(X) ((void)(X),1) +#define sqlite3_mutex_notheld(X) ((void)(X),1) +#define sqlite3MutexAlloc(X) ((sqlite3_mutex*)8) +#define sqlite3MutexInit() SQLITE_OK +#define sqlite3MutexEnd() +#define MUTEX_LOGIC(X) +#else +#define MUTEX_LOGIC(X) X +#endif /* defined(SQLITE_MUTEX_OMIT) */ + +/************** End of mutex.h ***********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + + +/* +** Each database file to be accessed by the system is an instance +** of the following structure. There are normally two of these structures +** in the sqlite.aDb[] array. aDb[0] is the main database file and +** aDb[1] is the database file used to hold temporary tables. Additional +** databases may be attached. +*/ +struct Db { + char *zName; /* Name of this database */ + Btree *pBt; /* The B*Tree structure for this database file */ + u8 inTrans; /* 0: not writable. 1: Transaction. 2: Checkpoint */ + u8 safety_level; /* How aggressive at syncing data to disk */ + Schema *pSchema; /* Pointer to database schema (possibly shared) */ +}; + +/* +** An instance of the following structure stores a database schema. +** +** Most Schema objects are associated with a Btree. The exception is +** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. +** In shared cache mode, a single Schema object can be shared by multiple +** Btrees that refer to the same underlying BtShared object. +** +** Schema objects are automatically deallocated when the last Btree that +** references them is destroyed. The TEMP Schema is manually freed by +** sqlite3_close(). +* +** A thread must be holding a mutex on the corresponding Btree in order +** to access Schema content. This implies that the thread must also be +** holding a mutex on the sqlite3 connection pointer that owns the Btree. +** For a TEMP Schema, only the connection mutex is required. +*/ +struct Schema { + int schema_cookie; /* Database schema version number for this file */ + int iGeneration; /* Generation counter. Incremented with each change */ + Hash tblHash; /* All tables indexed by name */ + Hash idxHash; /* All (named) indices indexed by name */ + Hash trigHash; /* All triggers indexed by name */ + Hash fkeyHash; /* All foreign keys by referenced table name */ + Table *pSeqTab; /* The sqlite_sequence table used by AUTOINCREMENT */ + u8 file_format; /* Schema format version for this file */ + u8 enc; /* Text encoding used by this database */ + u16 flags; /* Flags associated with this schema */ + int cache_size; /* Number of pages to use in the cache */ +}; + +/* +** These macros can be used to test, set, or clear bits in the +** Db.pSchema->flags field. +*/ +#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))==(P)) +#define DbHasAnyProperty(D,I,P) (((D)->aDb[I].pSchema->flags&(P))!=0) +#define DbSetProperty(D,I,P) (D)->aDb[I].pSchema->flags|=(P) +#define DbClearProperty(D,I,P) (D)->aDb[I].pSchema->flags&=~(P) + +/* +** Allowed values for the DB.pSchema->flags field. +** +** The DB_SchemaLoaded flag is set after the database schema has been +** read into internal hash tables. +** +** DB_UnresetViews means that one or more views have column names that +** have been filled out. If the schema changes, these column names might +** changes and so the view will need to be reset. +*/ +#define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ +#define DB_UnresetViews 0x0002 /* Some views have defined column names */ +#define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ + +/* +** The number of different kinds of things that can be limited +** using the sqlite3_limit() interface. +*/ +#define SQLITE_N_LIMIT (SQLITE_LIMIT_TRIGGER_DEPTH+1) + +/* +** Lookaside malloc is a set of fixed-size buffers that can be used +** to satisfy small transient memory allocation requests for objects +** associated with a particular database connection. The use of +** lookaside malloc provides a significant performance enhancement +** (approx 10%) by avoiding numerous malloc/free requests while parsing +** SQL statements. +** +** The Lookaside structure holds configuration information about the +** lookaside malloc subsystem. Each available memory allocation in +** the lookaside subsystem is stored on a linked list of LookasideSlot +** objects. +** +** Lookaside allocations are only allowed for objects that are associated +** with a particular database connection. Hence, schema information cannot +** be stored in lookaside because in shared cache mode the schema information +** is shared by multiple database connections. Therefore, while parsing +** schema information, the Lookaside.bEnabled flag is cleared so that +** lookaside allocations are not used to construct the schema objects. +*/ +struct Lookaside { + u16 sz; /* Size of each buffer in bytes */ + u8 bEnabled; /* False to disable new lookaside allocations */ + u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ + int nOut; /* Number of buffers currently checked out */ + int mxOut; /* Highwater mark for nOut */ + int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ + LookasideSlot *pFree; /* List of available buffers */ + void *pStart; /* First byte of available memory space */ + void *pEnd; /* First byte past end of available space */ +}; +struct LookasideSlot { + LookasideSlot *pNext; /* Next buffer in the list of free buffers */ +}; + +/* +** A hash table for function definitions. +** +** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. +** Collisions are on the FuncDef.pHash chain. +*/ +struct FuncDefHash { + FuncDef *a[23]; /* Hash table for functions */ +}; + +/* +** Each database connection is an instance of the following structure. +** +** The sqlite.lastRowid records the last insert rowid generated by an +** insert statement. Inserts on views do not affect its value. Each +** trigger has its own context, so that lastRowid can be updated inside +** triggers as usual. The previous value will be restored once the trigger +** exits. Upon entering a before or instead of trigger, lastRowid is no +** longer (since after version 2.8.12) reset to -1. +** +** The sqlite.nChange does not count changes within triggers and keeps no +** context. It is reset at start of sqlite3_exec. +** The sqlite.lsChange represents the number of changes made by the last +** insert, update, or delete statement. It remains constant throughout the +** length of a statement and is then updated by OP_SetCounts. It keeps a +** context stack just like lastRowid so that the count of changes +** within a trigger is not seen outside the trigger. Changes to views do not +** affect the value of lsChange. +** The sqlite.csChange keeps track of the number of current changes (since +** the last statement) and is used to update sqlite_lsChange. +** +** The member variables sqlite.errCode, sqlite.zErrMsg and sqlite.zErrMsg16 +** store the most recent error code and, if applicable, string. The +** internal function sqlite3Error() is used to set these variables +** consistently. +*/ +struct sqlite3 { + sqlite3_vfs *pVfs; /* OS Interface */ + int nDb; /* Number of backends currently in use */ + Db *aDb; /* All backends */ + int flags; /* Miscellaneous flags. See below */ + unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ + int errCode; /* Most recent error code (SQLITE_*) */ + int errMask; /* & result codes with this before returning */ + u8 autoCommit; /* The auto-commit flag. */ + u8 temp_store; /* 1: file 2: memory 0: default */ + u8 mallocFailed; /* True if we have seen a malloc failure */ + u8 dfltLockMode; /* Default locking-mode for attached dbs */ + signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ + u8 suppressErr; /* Do not issue error messages if true */ + u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ + int nextPagesize; /* Pagesize after VACUUM if >0 */ + int nTable; /* Number of tables in the database */ + CollSeq *pDfltColl; /* The default collating sequence (BINARY) */ + i64 lastRowid; /* ROWID of most recent insert (see above) */ + u32 magic; /* Magic number for detect library misuse */ + int nChange; /* Value returned by sqlite3_changes() */ + int nTotalChange; /* Value returned by sqlite3_total_changes() */ + sqlite3_mutex *mutex; /* Connection mutex */ + int aLimit[SQLITE_N_LIMIT]; /* Limits */ + struct sqlite3InitInfo { /* Information used during initialization */ + int iDb; /* When back is being initialized */ + int newTnum; /* Rootpage of table being initialized */ + u8 busy; /* TRUE if currently initializing */ + u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ + } init; + int nExtension; /* Number of loaded extensions */ + void **aExtension; /* Array of shared library handles */ + struct Vdbe *pVdbe; /* List of active virtual machines */ + int activeVdbeCnt; /* Number of VDBEs currently executing */ + int writeVdbeCnt; /* Number of active VDBEs that are writing */ + int vdbeExecCnt; /* Number of nested calls to VdbeExec() */ + void (*xTrace)(void*,const char*); /* Trace function */ + void *pTraceArg; /* Argument to the trace function */ + void (*xProfile)(void*,const char*,u64); /* Profiling function */ + void *pProfileArg; /* Argument to profile function */ + void *pCommitArg; /* Argument to xCommitCallback() */ + int (*xCommitCallback)(void*); /* Invoked at every commit. */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ + void (*xRollbackCallback)(void*); /* Invoked at every commit. */ + void *pUpdateArg; + void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); +#ifndef SQLITE_OMIT_WAL + int (*xWalCallback)(void *, sqlite3 *, const char *, int); + void *pWalArg; +#endif + void(*xCollNeeded)(void*,sqlite3*,int eTextRep,const char*); + void(*xCollNeeded16)(void*,sqlite3*,int eTextRep,const void*); + void *pCollNeededArg; + sqlite3_value *pErr; /* Most recent error message */ + char *zErrMsg; /* Most recent error message (UTF-8 encoded) */ + char *zErrMsg16; /* Most recent error message (UTF-16 encoded) */ + union { + volatile int isInterrupted; /* True if sqlite3_interrupt has been called */ + double notUsed1; /* Spacer */ + } u1; + Lookaside lookaside; /* Lookaside malloc configuration */ +#ifndef SQLITE_OMIT_AUTHORIZATION + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*); + /* Access authorization function */ + void *pAuthArg; /* 1st argument to the access auth function */ +#endif +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + int (*xProgress)(void *); /* The progress callback */ + void *pProgressArg; /* Argument to the progress callback */ + int nProgressOps; /* Number of opcodes for progress callback */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + Hash aModule; /* populated by sqlite3_create_module() */ + VtabCtx *pVtabCtx; /* Context for active vtab connect/create */ + VTable **aVTrans; /* Virtual tables with open transactions */ + int nVTrans; /* Allocated size of aVTrans */ + VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ +#endif + FuncDefHash aFunc; /* Hash table of connection functions */ + Hash aCollSeq; /* All collating sequences */ + BusyHandler busyHandler; /* Busy callback */ + int busyTimeout; /* Busy handler timeout, in msec */ + Db aDbStatic[2]; /* Static space for the 2 default backends */ + Savepoint *pSavepoint; /* List of active savepoints */ + int nSavepoint; /* Number of non-transaction savepoints */ + int nStatement; /* Number of nested statement-transactions */ + u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ + i64 nDeferredCons; /* Net deferred constraints this transaction. */ + int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ + +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY + /* The following variables are all protected by the STATIC_MASTER + ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + ** + ** When X.pUnlockConnection==Y, that means that X is waiting for Y to + ** unlock so that it can proceed. + ** + ** When X.pBlockingConnection==Y, that means that something that X tried + ** tried to do recently failed with an SQLITE_LOCKED error due to locks + ** held by Y. + */ + sqlite3 *pBlockingConnection; /* Connection that caused SQLITE_LOCKED */ + sqlite3 *pUnlockConnection; /* Connection to watch for unlock */ + void *pUnlockArg; /* Argument to xUnlockNotify */ + void (*xUnlockNotify)(void **, int); /* Unlock notify callback */ + sqlite3 *pNextBlocked; /* Next in list of all blocked connections */ +#endif +}; + +/* +** A macro to discover the encoding of a database. +*/ +#define ENC(db) ((db)->aDb[0].pSchema->enc) + +/* +** Possible values for the sqlite3.flags. +*/ +#define SQLITE_VdbeTrace 0x00000100 /* True to trace VDBE execution */ +#define SQLITE_InternChanges 0x00000200 /* Uncommitted Hash table changes */ +#define SQLITE_FullColNames 0x00000400 /* Show full column names on SELECT */ +#define SQLITE_ShortColNames 0x00000800 /* Show short columns names */ +#define SQLITE_CountRows 0x00001000 /* Count rows changed by INSERT, */ + /* DELETE, or UPDATE and return */ + /* the count using a callback. */ +#define SQLITE_NullCallback 0x00002000 /* Invoke the callback once if the */ + /* result set is empty */ +#define SQLITE_SqlTrace 0x00004000 /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing 0x00008000 /* Debug listings of VDBE programs */ +#define SQLITE_WriteSchema 0x00010000 /* OK to update SQLITE_MASTER */ +#define SQLITE_NoReadlock 0x00020000 /* Readlocks are omitted when + ** accessing read-only databases */ +#define SQLITE_IgnoreChecks 0x00040000 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommitted 0x0080000 /* For shared-cache mode */ +#define SQLITE_LegacyFileFmt 0x00100000 /* Create new databases in format 1 */ +#define SQLITE_FullFSync 0x00200000 /* Use full fsync on the backend */ +#define SQLITE_CkptFullFSync 0x00400000 /* Use full fsync for checkpoint */ +#define SQLITE_RecoveryMode 0x00800000 /* Ignore schema errors */ +#define SQLITE_ReverseOrder 0x01000000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x02000000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x04000000 /* Enforce foreign key constraints */ +#define SQLITE_AutoIndex 0x08000000 /* Enable automatic indexes */ +#define SQLITE_PreferBuiltin 0x10000000 /* Preference to built-in funcs */ +#define SQLITE_LoadExtension 0x20000000 /* Enable load_extension */ +#define SQLITE_EnableTrigger 0x40000000 /* True to enable triggers */ + +/* +** Bits of the sqlite3.flags field that are used by the +** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface. +** These must be the low-order bits of the flags field. +*/ +#define SQLITE_QueryFlattener 0x01 /* Disable query flattening */ +#define SQLITE_ColumnCache 0x02 /* Disable the column cache */ +#define SQLITE_IndexSort 0x04 /* Disable indexes for sorting */ +#define SQLITE_IndexSearch 0x08 /* Disable indexes for searching */ +#define SQLITE_IndexCover 0x10 /* Disable index covering table */ +#define SQLITE_GroupByOrder 0x20 /* Disable GROUPBY cover of ORDERBY */ +#define SQLITE_FactorOutConst 0x40 /* Disable factoring out constants */ +#define SQLITE_IdxRealAsInt 0x80 /* Store REAL as INT in indices */ +#define SQLITE_DistinctOpt 0x80 /* DISTINCT using indexes */ +#define SQLITE_OptMask 0xff /* Mask of all disablable opts */ + +/* +** Possible values for the sqlite.magic field. +** The numbers are obtained at random and have no special meaning, other +** than being distinct from one another. +*/ +#define SQLITE_MAGIC_OPEN 0xa029a697 /* Database is open */ +#define SQLITE_MAGIC_CLOSED 0x9f3c2d33 /* Database is closed */ +#define SQLITE_MAGIC_SICK 0x4b771290 /* Error and awaiting close */ +#define SQLITE_MAGIC_BUSY 0xf03b7906 /* Database currently in use */ +#define SQLITE_MAGIC_ERROR 0xb5357930 /* An SQLITE_MISUSE error occurred */ + +/* +** Each SQL function is defined by an instance of the following +** structure. A pointer to this structure is stored in the sqlite.aFunc +** hash table. When multiple functions have the same name, the hash table +** points to a linked list of these structures. +*/ +struct FuncDef { + i16 nArg; /* Number of arguments. -1 means unlimited */ + u8 iPrefEnc; /* Preferred text encoding (SQLITE_UTF8, 16LE, 16BE) */ + u8 flags; /* Some combination of SQLITE_FUNC_* */ + void *pUserData; /* User data parameter */ + FuncDef *pNext; /* Next function with same name */ + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ + void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ + void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ + char *zName; /* SQL name of the function. */ + FuncDef *pHash; /* Next with a different name but the same hash */ + FuncDestructor *pDestructor; /* Reference counted destructor function */ +}; + +/* +** This structure encapsulates a user-function destructor callback (as +** configured using create_function_v2()) and a reference counter. When +** create_function_v2() is called to create a function with a destructor, +** a single object of this type is allocated. FuncDestructor.nRef is set to +** the number of FuncDef objects created (either 1 or 3, depending on whether +** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor +** member of each of the new FuncDef objects is set to point to the allocated +** FuncDestructor. +** +** Thereafter, when one of the FuncDef objects is deleted, the reference +** count on this object is decremented. When it reaches 0, the destructor +** is invoked and the FuncDestructor structure freed. +*/ +struct FuncDestructor { + int nRef; + void (*xDestroy)(void *); + void *pUserData; +}; + +/* +** Possible values for FuncDef.flags +*/ +#define SQLITE_FUNC_LIKE 0x01 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x02 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x04 /* Ephemeral. Delete with VDBE */ +#define SQLITE_FUNC_NEEDCOLL 0x08 /* sqlite3GetFuncCollSeq() might be called */ +#define SQLITE_FUNC_PRIVATE 0x10 /* Allowed for internal use only */ +#define SQLITE_FUNC_COUNT 0x20 /* Built-in count(*) aggregate */ +#define SQLITE_FUNC_COALESCE 0x40 /* Built-in coalesce() or ifnull() function */ + +/* +** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are +** used to create the initializers for the FuncDef structures. +** +** FUNCTION(zName, nArg, iArg, bNC, xFunc) +** Used to create a scalar function definition of a function zName +** implemented by C function xFunc that accepts nArg arguments. The +** value passed as iArg is cast to a (void*) and made available +** as the user-data (sqlite3_user_data()) for the function. If +** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. +** +** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) +** Used to create an aggregate function definition implemented by +** the C functions xStep and xFinal. The first four parameters +** are interpreted in the same way as the first 4 parameters to +** FUNCTION(). +** +** LIKEFUNC(zName, nArg, pArg, flags) +** Used to create a scalar function definition of a function zName +** that accepts nArg arguments and is implemented by a call to C +** function likeFunc. Argument pArg is cast to a (void *) and made +** available as the function user-data (sqlite3_user_data()). The +** FuncDef.flags variable is set to the value passed as the flags +** parameter. +*/ +#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} +#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ + {nArg, SQLITE_UTF8, bNC*SQLITE_FUNC_NEEDCOLL, \ + pArg, 0, xFunc, 0, 0, #zName, 0, 0} +#define LIKEFUNC(zName, nArg, arg, flags) \ + {nArg, SQLITE_UTF8, flags, (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} +#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ + {nArg, SQLITE_UTF8, nc*SQLITE_FUNC_NEEDCOLL, \ + SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} + +/* +** All current savepoints are stored in a linked list starting at +** sqlite3.pSavepoint. The first element in the list is the most recently +** opened savepoint. Savepoints are added to the list by the vdbe +** OP_Savepoint instruction. +*/ +struct Savepoint { + char *zName; /* Savepoint name (nul-terminated) */ + i64 nDeferredCons; /* Number of deferred fk violations */ + Savepoint *pNext; /* Parent savepoint (if any) */ +}; + +/* +** The following are used as the second parameter to sqlite3Savepoint(), +** and as the P1 argument to the OP_Savepoint instruction. +*/ +#define SAVEPOINT_BEGIN 0 +#define SAVEPOINT_RELEASE 1 +#define SAVEPOINT_ROLLBACK 2 + + +/* +** Each SQLite module (virtual table definition) is defined by an +** instance of the following structure, stored in the sqlite3.aModule +** hash table. +*/ +struct Module { + const sqlite3_module *pModule; /* Callback pointers */ + const char *zName; /* Name passed to create_module() */ + void *pAux; /* pAux passed to create_module() */ + void (*xDestroy)(void *); /* Module destructor function */ +}; + +/* +** information about each column of an SQL table is held in an instance +** of this structure. +*/ +struct Column { + char *zName; /* Name of this column */ + Expr *pDflt; /* Default value of this column */ + char *zDflt; /* Original text of the default value */ + char *zType; /* Data type for this column */ + char *zColl; /* Collating sequence. If NULL, use the default */ + u8 notNull; /* True if there is a NOT NULL constraint */ + u8 isPrimKey; /* True if this column is part of the PRIMARY KEY */ + char affinity; /* One of the SQLITE_AFF_... values */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + u8 isHidden; /* True if this column is 'hidden' */ +#endif +}; + +/* +** A "Collating Sequence" is defined by an instance of the following +** structure. Conceptually, a collating sequence consists of a name and +** a comparison routine that defines the order of that sequence. +** +** There may two separate implementations of the collation function, one +** that processes text in UTF-8 encoding (CollSeq.xCmp) and another that +** processes text encoded in UTF-16 (CollSeq.xCmp16), using the machine +** native byte order. When a collation sequence is invoked, SQLite selects +** the version that will require the least expensive encoding +** translations, if any. +** +** The CollSeq.pUser member variable is an extra parameter that passed in +** as the first argument to the UTF-8 comparison function, xCmp. +** CollSeq.pUser16 is the equivalent for the UTF-16 comparison function, +** xCmp16. +** +** If both CollSeq.xCmp and CollSeq.xCmp16 are NULL, it means that the +** collating sequence is undefined. Indices built on an undefined +** collating sequence may not be read or written. +*/ +struct CollSeq { + char *zName; /* Name of the collating sequence, UTF-8 encoded */ + u8 enc; /* Text encoding handled by xCmp() */ + void *pUser; /* First argument to xCmp() */ + int (*xCmp)(void*,int, const void*, int, const void*); + void (*xDel)(void*); /* Destructor for pUser */ +}; + +/* +** A sort order can be either ASC or DESC. +*/ +#define SQLITE_SO_ASC 0 /* Sort in ascending order */ +#define SQLITE_SO_DESC 1 /* Sort in ascending order */ + +/* +** Column affinity types. +** +** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and +** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve +** the speed a little by numbering the values consecutively. +** +** But rather than start with 0 or 1, we begin with 'a'. That way, +** when multiple affinity types are concatenated into a string and +** used as the P4 operand, they will be more readable. +** +** Note also that the numeric types are grouped together so that testing +** for a numeric type is a single comparison. +*/ +#define SQLITE_AFF_TEXT 'a' +#define SQLITE_AFF_NONE 'b' +#define SQLITE_AFF_NUMERIC 'c' +#define SQLITE_AFF_INTEGER 'd' +#define SQLITE_AFF_REAL 'e' + +#define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) + +/* +** The SQLITE_AFF_MASK values masks off the significant bits of an +** affinity value. +*/ +#define SQLITE_AFF_MASK 0x67 + +/* +** Additional bit values that can be ORed with an affinity without +** changing the affinity. +*/ +#define SQLITE_JUMPIFNULL 0x08 /* jumps if either operand is NULL */ +#define SQLITE_STOREP2 0x10 /* Store result in reg[P2] rather than jump */ +#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ + +/* +** An object of this type is created for each virtual table present in +** the database schema. +** +** If the database schema is shared, then there is one instance of this +** structure for each database connection (sqlite3*) that uses the shared +** schema. This is because each database connection requires its own unique +** instance of the sqlite3_vtab* handle used to access the virtual table +** implementation. sqlite3_vtab* handles can not be shared between +** database connections, even when the rest of the in-memory database +** schema is shared, as the implementation often stores the database +** connection handle passed to it via the xConnect() or xCreate() method +** during initialization internally. This database connection handle may +** then be used by the virtual table implementation to access real tables +** within the database. So that they appear as part of the callers +** transaction, these accesses need to be made via the same database +** connection as that used to execute SQL operations on the virtual table. +** +** All VTable objects that correspond to a single table in a shared +** database schema are initially stored in a linked-list pointed to by +** the Table.pVTable member variable of the corresponding Table object. +** When an sqlite3_prepare() operation is required to access the virtual +** table, it searches the list for the VTable that corresponds to the +** database connection doing the preparing so as to use the correct +** sqlite3_vtab* handle in the compiled query. +** +** When an in-memory Table object is deleted (for example when the +** schema is being reloaded for some reason), the VTable objects are not +** deleted and the sqlite3_vtab* handles are not xDisconnect()ed +** immediately. Instead, they are moved from the Table.pVTable list to +** another linked list headed by the sqlite3.pDisconnect member of the +** corresponding sqlite3 structure. They are then deleted/xDisconnected +** next time a statement is prepared using said sqlite3*. This is done +** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. +** Refer to comments above function sqlite3VtabUnlockList() for an +** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect +** list without holding the corresponding sqlite3.mutex mutex. +** +** The memory for objects of this type is always allocated by +** sqlite3DbMalloc(), using the connection handle stored in VTable.db as +** the first argument. +*/ +struct VTable { + sqlite3 *db; /* Database connection associated with this table */ + Module *pMod; /* Pointer to module implementation */ + sqlite3_vtab *pVtab; /* Pointer to vtab instance */ + int nRef; /* Number of pointers to this structure */ + u8 bConstraint; /* True if constraints are supported */ + int iSavepoint; /* Depth of the SAVEPOINT stack */ + VTable *pNext; /* Next in linked list (see above) */ +}; + +/* +** Each SQL table is represented in memory by an instance of the +** following structure. +** +** Table.zName is the name of the table. The case of the original +** CREATE TABLE statement is stored, but case is not significant for +** comparisons. +** +** Table.nCol is the number of columns in this table. Table.aCol is a +** pointer to an array of Column structures, one for each column. +** +** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of +** the column that is that key. Otherwise Table.iPKey is negative. Note +** that the datatype of the PRIMARY KEY must be INTEGER for this field to +** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of +** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid +** is generated for each row of the table. TF_HasPrimaryKey is set if +** the table has any PRIMARY KEY, INTEGER or otherwise. +** +** Table.tnum is the page number for the root BTree page of the table in the +** database file. If Table.iDb is the index of the database table backend +** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that +** holds temporary tables and indices. If TF_Ephemeral is set +** then the table is stored in a file that is automatically deleted +** when the VDBE cursor to the table is closed. In this case Table.tnum +** refers VDBE cursor number that holds the table open, not to the root +** page number. Transient tables are used to hold the results of a +** sub-query that appears instead of a real table name in the FROM clause +** of a SELECT statement. +*/ +struct Table { + char *zName; /* Name of the table or view */ + int iPKey; /* If not negative, use aCol[iPKey] as the primary key */ + int nCol; /* Number of columns in this table */ + Column *aCol; /* Information about each column */ + Index *pIndex; /* List of SQL indexes on this table. */ + int tnum; /* Root BTree node for this table (see note above) */ + tRowcnt nRowEst; /* Estimated rows in table - from sqlite_stat1 table */ + Select *pSelect; /* NULL for tables. Points to definition if a view. */ + u16 nRef; /* Number of pointers to this Table */ + u8 tabFlags; /* Mask of TF_* values */ + u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + char *zColAff; /* String defining the affinity of each column */ +#ifndef SQLITE_OMIT_CHECK + Expr *pCheck; /* The AND of all CHECK constraints */ +#endif +#ifndef SQLITE_OMIT_ALTERTABLE + int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ +#endif +#ifndef SQLITE_OMIT_VIRTUALTABLE + VTable *pVTable; /* List of VTable objects. */ + int nModuleArg; /* Number of arguments to the module */ + char **azModuleArg; /* Text of all module args. [0] is module name */ +#endif + Trigger *pTrigger; /* List of triggers stored in pSchema */ + Schema *pSchema; /* Schema that contains this table */ + Table *pNextZombie; /* Next on the Parse.pZombieTab list */ +}; + +/* +** Allowed values for Tabe.tabFlags. +*/ +#define TF_Readonly 0x01 /* Read-only system table */ +#define TF_Ephemeral 0x02 /* An ephemeral table */ +#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ +#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ +#define TF_Virtual 0x10 /* Is a virtual table */ +#define TF_NeedMetadata 0x20 /* aCol[].zType and aCol[].pColl missing */ + + + +/* +** Test to see whether or not a table is a virtual table. This is +** done as a macro so that it will be optimized out when virtual +** table support is omitted from the build. +*/ +#ifndef SQLITE_OMIT_VIRTUALTABLE +# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) +# define IsHiddenColumn(X) ((X)->isHidden) +#else +# define IsVirtual(X) 0 +# define IsHiddenColumn(X) 0 +#endif + +/* +** Each foreign key constraint is an instance of the following structure. +** +** A foreign key is associated with two tables. The "from" table is +** the table that contains the REFERENCES clause that creates the foreign +** key. The "to" table is the table that is named in the REFERENCES clause. +** Consider this example: +** +** CREATE TABLE ex1( +** a INTEGER PRIMARY KEY, +** b INTEGER CONSTRAINT fk1 REFERENCES ex2(x) +** ); +** +** For foreign key "fk1", the from-table is "ex1" and the to-table is "ex2". +** +** Each REFERENCES clause generates an instance of the following structure +** which is attached to the from-table. The to-table need not exist when +** the from-table is created. The existence of the to-table is not checked. +*/ +struct FKey { + Table *pFrom; /* Table containing the REFERENCES clause (aka: Child) */ + FKey *pNextFrom; /* Next foreign key in pFrom */ + char *zTo; /* Name of table that the key points to (aka: Parent) */ + FKey *pNextTo; /* Next foreign key on table named zTo */ + FKey *pPrevTo; /* Previous foreign key on table named zTo */ + int nCol; /* Number of columns in this key */ + /* EV: R-30323-21917 */ + u8 isDeferred; /* True if constraint checking is deferred till COMMIT */ + u8 aAction[2]; /* ON DELETE and ON UPDATE actions, respectively */ + Trigger *apTrigger[2]; /* Triggers for aAction[] actions */ + struct sColMap { /* Mapping of columns in pFrom to columns in zTo */ + int iFrom; /* Index of column in pFrom */ + char *zCol; /* Name of column in zTo. If 0 use PRIMARY KEY */ + } aCol[1]; /* One entry for each of nCol column s */ +}; + +/* +** SQLite supports many different ways to resolve a constraint +** error. ROLLBACK processing means that a constraint violation +** causes the operation in process to fail and for the current transaction +** to be rolled back. ABORT processing means the operation in process +** fails and any prior changes from that one operation are backed out, +** but the transaction is not rolled back. FAIL processing means that +** the operation in progress stops and returns an error code. But prior +** changes due to the same operation are not backed out and no rollback +** occurs. IGNORE means that the particular row that caused the constraint +** error is not inserted or updated. Processing continues and no error +** is returned. REPLACE means that preexisting database rows that caused +** a UNIQUE constraint violation are removed so that the new insert or +** update can proceed. Processing continues and no error is reported. +** +** RESTRICT, SETNULL, and CASCADE actions apply only to foreign keys. +** RESTRICT is the same as ABORT for IMMEDIATE foreign keys and the +** same as ROLLBACK for DEFERRED keys. SETNULL means that the foreign +** key is set to NULL. CASCADE means that a DELETE or UPDATE of the +** referenced table row is propagated into the row that holds the +** foreign key. +** +** The following symbolic values are used to record which type +** of action to take. +*/ +#define OE_None 0 /* There is no constraint to check */ +#define OE_Rollback 1 /* Fail the operation and rollback the transaction */ +#define OE_Abort 2 /* Back out changes but do no rollback transaction */ +#define OE_Fail 3 /* Stop the operation but leave all prior changes */ +#define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ +#define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ + +#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 7 /* Set the foreign key value to NULL */ +#define OE_SetDflt 8 /* Set the foreign key value to its default */ +#define OE_Cascade 9 /* Cascade the changes */ + +#define OE_Default 99 /* Do whatever the default action is */ + + +/* +** An instance of the following structure is passed as the first +** argument to sqlite3VdbeKeyCompare and is used to control the +** comparison of the two index keys. +*/ +struct KeyInfo { + sqlite3 *db; /* The database connection */ + u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ + u16 nField; /* Number of entries in aColl[] */ + u8 *aSortOrder; /* Sort order for each column. May be NULL */ + CollSeq *aColl[1]; /* Collating sequence for each term of the key */ +}; + +/* +** An instance of the following structure holds information about a +** single index record that has already been parsed out into individual +** values. +** +** A record is an object that contains one or more fields of data. +** Records are used to store the content of a table row and to store +** the key of an index. A blob encoding of a record is created by +** the OP_MakeRecord opcode of the VDBE and is disassembled by the +** OP_Column opcode. +** +** This structure holds a record that has already been disassembled +** into its constituent fields. +*/ +struct UnpackedRecord { + KeyInfo *pKeyInfo; /* Collation and sort-order information */ + u16 nField; /* Number of entries in apMem[] */ + u8 flags; /* Boolean settings. UNPACKED_... below */ + i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */ + Mem *aMem; /* Values */ +}; + +/* +** Allowed values of UnpackedRecord.flags +*/ +#define UNPACKED_INCRKEY 0x01 /* Make this key an epsilon larger */ +#define UNPACKED_PREFIX_MATCH 0x02 /* A prefix match is considered OK */ +#define UNPACKED_PREFIX_SEARCH 0x04 /* Ignore final (rowid) field */ + +/* +** Each SQL index is represented in memory by an +** instance of the following structure. +** +** The columns of the table that are to be indexed are described +** by the aiColumn[] field of this structure. For example, suppose +** we have the following table and index: +** +** CREATE TABLE Ex1(c1 int, c2 int, c3 text); +** CREATE INDEX Ex2 ON Ex1(c3,c1); +** +** In the Table structure describing Ex1, nCol==3 because there are +** three columns in the table. In the Index structure describing +** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. +** The second column to be indexed (c1) has an index of 0 in +** Ex1.aCol[], hence Ex2.aiColumn[1]==0. +** +** The Index.onError field determines whether or not the indexed columns +** must be unique and what to do if they are not. When Index.onError=OE_None, +** it means this is not a unique index. Otherwise it is a unique index +** and the value of Index.onError indicate the which conflict resolution +** algorithm to employ whenever an attempt is made to insert a non-unique +** element. +*/ +struct Index { + char *zName; /* Name of this index */ + int nColumn; /* Number of columns in the table used by this index */ + int *aiColumn; /* Which columns are used by this index. 1st is 0 */ + tRowcnt *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */ + Table *pTable; /* The SQL table being indexed */ + int tnum; /* Page containing root of this index in database file */ + u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ + u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */ + u8 bUnordered; /* Use this index for == or IN queries only */ + char *zColAff; /* String defining the affinity of each column */ + Index *pNext; /* The next index associated with the same table */ + Schema *pSchema; /* Schema containing this index */ + u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */ + char **azColl; /* Array of collation sequence names for index */ +#ifdef SQLITE_ENABLE_STAT3 + int nSample; /* Number of elements in aSample[] */ + tRowcnt avgEq; /* Average nEq value for key values not in aSample */ + IndexSample *aSample; /* Samples of the left-most key */ +#endif +}; + +/* +** Each sample stored in the sqlite_stat3 table is represented in memory +** using a structure of this type. See documentation at the top of the +** analyze.c source file for additional information. +*/ +struct IndexSample { + union { + char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */ + double r; /* Value if eType is SQLITE_FLOAT */ + i64 i; /* Value if eType is SQLITE_INTEGER */ + } u; + u8 eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */ + int nByte; /* Size in byte of text or blob. */ + tRowcnt nEq; /* Est. number of rows where the key equals this sample */ + tRowcnt nLt; /* Est. number of rows where key is less than this sample */ + tRowcnt nDLt; /* Est. number of distinct keys less than this sample */ +}; + +/* +** Each token coming out of the lexer is an instance of +** this structure. Tokens are also used as part of an expression. +** +** Note if Token.z==0 then Token.dyn and Token.n are undefined and +** may contain random values. Do not make any assumptions about Token.dyn +** and Token.n when Token.z==0. +*/ +struct Token { + const char *z; /* Text of the token. Not NULL-terminated! */ + unsigned int n; /* Number of characters in this token */ +}; + +/* +** An instance of this structure contains information needed to generate +** code for a SELECT that contains aggregate functions. +** +** If Expr.op==TK_AGG_COLUMN or TK_AGG_FUNCTION then Expr.pAggInfo is a +** pointer to this structure. The Expr.iColumn field is the index in +** AggInfo.aCol[] or AggInfo.aFunc[] of information needed to generate +** code for that node. +** +** AggInfo.pGroupBy and AggInfo.aFunc.pExpr point to fields within the +** original Select structure that describes the SELECT statement. These +** fields do not need to be freed when deallocating the AggInfo structure. +*/ +struct AggInfo { + u8 directMode; /* Direct rendering mode means take data directly + ** from source tables rather than from accumulators */ + u8 useSortingIdx; /* In direct mode, reference the sorting index rather + ** than the source table */ + int sortingIdx; /* Cursor number of the sorting index */ + int sortingIdxPTab; /* Cursor number of pseudo-table */ + ExprList *pGroupBy; /* The group by clause */ + int nSortingColumn; /* Number of columns in the sorting index */ + struct AggInfo_col { /* For each column used in source tables */ + Table *pTab; /* Source table */ + int iTable; /* Cursor number of the source table */ + int iColumn; /* Column number within the source table */ + int iSorterColumn; /* Column number in the sorting index */ + int iMem; /* Memory location that acts as accumulator */ + Expr *pExpr; /* The original expression */ + } *aCol; + int nColumn; /* Number of used entries in aCol[] */ + int nColumnAlloc; /* Number of slots allocated for aCol[] */ + int nAccumulator; /* Number of columns that show through to the output. + ** Additional columns are used only as parameters to + ** aggregate functions */ + struct AggInfo_func { /* For each aggregate function */ + Expr *pExpr; /* Expression encoding the function */ + FuncDef *pFunc; /* The aggregate function implementation */ + int iMem; /* Memory location that acts as accumulator */ + int iDistinct; /* Ephemeral table used to enforce DISTINCT */ + } *aFunc; + int nFunc; /* Number of entries in aFunc[] */ + int nFuncAlloc; /* Number of slots allocated for aFunc[] */ +}; + +/* +** The datatype ynVar is a signed integer, either 16-bit or 32-bit. +** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater +** than 32767 we have to make it 32-bit. 16-bit is preferred because +** it uses less memory in the Expr object, which is a big memory user +** in systems with lots of prepared statements. And few applications +** need more than about 10 or 20 variables. But some extreme users want +** to have prepared statements with over 32767 variables, and for them +** the option is available (at compile-time). +*/ +#if SQLITE_MAX_VARIABLE_NUMBER<=32767 +typedef i16 ynVar; +#else +typedef int ynVar; +#endif + +/* +** Each node of an expression in the parse tree is an instance +** of this structure. +** +** Expr.op is the opcode. The integer parser token codes are reused +** as opcodes here. For example, the parser defines TK_GE to be an integer +** code representing the ">=" operator. This same integer code is reused +** to represent the greater-than-or-equal-to operator in the expression +** tree. +** +** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, +** or TK_STRING), then Expr.token contains the text of the SQL literal. If +** the expression is a variable (TK_VARIABLE), then Expr.token contains the +** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), +** then Expr.token contains the name of the function. +** +** Expr.pRight and Expr.pLeft are the left and right subexpressions of a +** binary operator. Either or both may be NULL. +** +** Expr.x.pList is a list of arguments if the expression is an SQL function, +** a CASE expression or an IN expression of the form " IN (, ...)". +** Expr.x.pSelect is used if the expression is a sub-select or an expression of +** the form " IN (SELECT ...)". If the EP_xIsSelect bit is set in the +** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is +** valid. +** +** An expression of the form ID or ID.ID refers to a column in a table. +** For such expressions, Expr.op is set to TK_COLUMN and Expr.iTable is +** the integer cursor number of a VDBE cursor pointing to that table and +** Expr.iColumn is the column number for the specific column. If the +** expression is used as a result in an aggregate SELECT, then the +** value is also stored in the Expr.iAgg column in the aggregate so that +** it can be accessed after all aggregates are computed. +** +** If the expression is an unbound variable marker (a question mark +** character '?' in the original SQL) then the Expr.iTable holds the index +** number for that variable. +** +** If the expression is a subquery then Expr.iColumn holds an integer +** register number containing the result of the subquery. If the +** subquery gives a constant result, then iTable is -1. If the subquery +** gives a different answer at different times during statement processing +** then iTable is the address of a subroutine that computes the subquery. +** +** If the Expr is of type OP_Column, and the table it is selecting from +** is a disk table or the "old.*" pseudo-table, then pTab points to the +** corresponding table definition. +** +** ALLOCATION NOTES: +** +** Expr objects can use a lot of memory space in database schema. To +** help reduce memory requirements, sometimes an Expr object will be +** truncated. And to reduce the number of memory allocations, sometimes +** two or more Expr objects will be stored in a single memory allocation, +** together with Expr.zToken strings. +** +** If the EP_Reduced and EP_TokenOnly flags are set when +** an Expr object is truncated. When EP_Reduced is set, then all +** the child Expr objects in the Expr.pLeft and Expr.pRight subtrees +** are contained within the same memory allocation. Note, however, that +** the subtrees in Expr.x.pList or Expr.x.pSelect are always separately +** allocated, regardless of whether or not EP_Reduced is set. +*/ +struct Expr { + u8 op; /* Operation performed by this node */ + char affinity; /* The affinity of the column or 0 if not a column */ + u16 flags; /* Various flags. EP_* See below */ + union { + char *zToken; /* Token value. Zero terminated and dequoted */ + int iValue; /* Non-negative integer value if EP_IntValue */ + } u; + + /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no + ** space is allocated for the fields below this point. An attempt to + ** access them will result in a segfault or malfunction. + *********************************************************************/ + + Expr *pLeft; /* Left subnode */ + Expr *pRight; /* Right subnode */ + union { + ExprList *pList; /* Function arguments or in " IN ( IN (
+ Laps:
+ + Data Channels:
+ + + +
>
>
>
>
+ + +
+
+
+ + + +
PosSizMinMaxData Channel Name
+ + +
+
+
>
>
>
>
+
+ + + + + + + + \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/jpge.cpp b/PitsideConsole/PitsideConsole/jpge.cpp new file mode 100644 index 0000000..f73218e --- /dev/null +++ b/PitsideConsole/PitsideConsole/jpge.cpp @@ -0,0 +1,1050 @@ +// jpge.cpp - C++ class for JPEG compression. +// Public domain, Rich Geldreich +// v1.01, Dec. 18, 2010 - Initial release +// v1.02, Apr. 6, 2011 - Removed 2x2 ordered dither in H2V1 chroma subsampling method load_block_16_8_8(). (The rounding factor was 2, when it should have been 1. Either way, it wasn't helping.) +// v1.03, Apr. 16, 2011 - Added support for optimized Huffman code tables, optimized dynamic memory allocation down to only 1 alloc. +// Also from Alex Evans: Added RGBA support, linear memory allocator (no longer needed in v1.03). +// v1.04, May. 19, 2012: Forgot to set m_pFile ptr to NULL in cfile_stream::close(). Thanks to Owen Kaluza for reporting this bug. +// Code tweaks to fix VS2008 static code analysis warnings (all looked harmless). +// Code review revealed method load_block_16_8_8() (used for the non-default H2V1 sampling mode to downsample chroma) somehow didn't get the rounding factor fix from v1.02. + +#include "stdafx.h" +#include "jpge.h" + +#include +#include +#include + +#define JPGE_MAX(a,b) (((a)>(b))?(a):(b)) +#define JPGE_MIN(a,b) (((a)<(b))?(a):(b)) + +namespace jpge { + +static inline void *jpge_malloc(size_t nSize) { return malloc(nSize); } +static inline void jpge_free(void *p) { free(p); } + +// Various JPEG enums and tables. +enum { M_SOF0 = 0xC0, M_DHT = 0xC4, M_SOI = 0xD8, M_EOI = 0xD9, M_SOS = 0xDA, M_DQT = 0xDB, M_APP0 = 0xE0 }; +enum { DC_LUM_CODES = 12, AC_LUM_CODES = 256, DC_CHROMA_CODES = 12, AC_CHROMA_CODES = 256, MAX_HUFF_SYMBOLS = 257, MAX_HUFF_CODESIZE = 32 }; + +static uint8 s_zag[64] = { 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63 }; +static int16 s_std_lum_quant[64] = { 16,11,12,14,12,10,16,14,13,14,18,17,16,19,24,40,26,24,22,22,24,49,35,37,29,40,58,51,61,60,57,51,56,55,64,72,92,78,64,68,87,69,55,56,80,109,81,87,95,98,103,104,103,62,77,113,121,112,100,120,92,101,103,99 }; +static int16 s_std_croma_quant[64] = { 17,18,18,24,21,24,47,26,26,47,99,66,56,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99 }; +static uint8 s_dc_lum_bits[17] = { 0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0 }; +static uint8 s_dc_lum_val[DC_LUM_CODES] = { 0,1,2,3,4,5,6,7,8,9,10,11 }; +static uint8 s_ac_lum_bits[17] = { 0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d }; +static uint8 s_ac_lum_val[AC_LUM_CODES] = +{ + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0, + 0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49, + 0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5, + 0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, + 0xf9,0xfa +}; +static uint8 s_dc_chroma_bits[17] = { 0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0 }; +static uint8 s_dc_chroma_val[DC_CHROMA_CODES] = { 0,1,2,3,4,5,6,7,8,9,10,11 }; +static uint8 s_ac_chroma_bits[17] = { 0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77 }; +static uint8 s_ac_chroma_val[AC_CHROMA_CODES] = +{ + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0, + 0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48, + 0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3, + 0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8, + 0xf9,0xfa +}; + +// Low-level helper functions. +template inline void clear_obj(T &obj) { memset(&obj, 0, sizeof(obj)); } + +const int YR = 19595, YG = 38470, YB = 7471, CB_R = -11059, CB_G = -21709, CB_B = 32768, CR_R = 32768, CR_G = -27439, CR_B = -5329; +static inline uint8 clamp(int i) { if (static_cast(i) > 255U) { if (i < 0) i = 0; else if (i > 255) i = 255; } return static_cast(i); } + +static void RGB_to_YCC(uint8* pDst, const uint8 *pSrc, int num_pixels) +{ + for ( ; num_pixels; pDst += 3, pSrc += 3, num_pixels--) + { + const int r = pSrc[0], g = pSrc[1], b = pSrc[2]; + pDst[0] = static_cast((r * YR + g * YG + b * YB + 32768) >> 16); + pDst[1] = clamp(128 + ((r * CB_R + g * CB_G + b * CB_B + 32768) >> 16)); + pDst[2] = clamp(128 + ((r * CR_R + g * CR_G + b * CR_B + 32768) >> 16)); + } +} + +static void RGB_to_Y(uint8* pDst, const uint8 *pSrc, int num_pixels) +{ + for ( ; num_pixels; pDst++, pSrc += 3, num_pixels--) + pDst[0] = static_cast((pSrc[0] * YR + pSrc[1] * YG + pSrc[2] * YB + 32768) >> 16); +} + +static void RGBA_to_YCC(uint8* pDst, const uint8 *pSrc, int num_pixels) +{ + for ( ; num_pixels; pDst += 3, pSrc += 4, num_pixels--) + { + const int r = pSrc[0], g = pSrc[1], b = pSrc[2]; + pDst[0] = static_cast((r * YR + g * YG + b * YB + 32768) >> 16); + pDst[1] = clamp(128 + ((r * CB_R + g * CB_G + b * CB_B + 32768) >> 16)); + pDst[2] = clamp(128 + ((r * CR_R + g * CR_G + b * CR_B + 32768) >> 16)); + } +} + +static void RGBA_to_Y(uint8* pDst, const uint8 *pSrc, int num_pixels) +{ + for ( ; num_pixels; pDst++, pSrc += 4, num_pixels--) + pDst[0] = static_cast((pSrc[0] * YR + pSrc[1] * YG + pSrc[2] * YB + 32768) >> 16); +} + +static void Y_to_YCC(uint8* pDst, const uint8* pSrc, int num_pixels) +{ + for( ; num_pixels; pDst += 3, pSrc++, num_pixels--) { pDst[0] = pSrc[0]; pDst[1] = 128; pDst[2] = 128; } +} + +// Forward DCT - DCT derived from jfdctint. +enum { CONST_BITS = 13, ROW_BITS = 2 }; +#define DCT_DESCALE(x, n) (((x) + (((int32)1) << ((n) - 1))) >> (n)) +#define DCT_MUL(var, c) (static_cast(var) * static_cast(c)) +#define DCT1D(s0, s1, s2, s3, s4, s5, s6, s7) \ + int32 t0 = s0 + s7, t7 = s0 - s7, t1 = s1 + s6, t6 = s1 - s6, t2 = s2 + s5, t5 = s2 - s5, t3 = s3 + s4, t4 = s3 - s4; \ + int32 t10 = t0 + t3, t13 = t0 - t3, t11 = t1 + t2, t12 = t1 - t2; \ + int32 u1 = DCT_MUL(t12 + t13, 4433); \ + s2 = u1 + DCT_MUL(t13, 6270); \ + s6 = u1 + DCT_MUL(t12, -15137); \ + u1 = t4 + t7; \ + int32 u2 = t5 + t6, u3 = t4 + t6, u4 = t5 + t7; \ + int32 z5 = DCT_MUL(u3 + u4, 9633); \ + t4 = DCT_MUL(t4, 2446); t5 = DCT_MUL(t5, 16819); \ + t6 = DCT_MUL(t6, 25172); t7 = DCT_MUL(t7, 12299); \ + u1 = DCT_MUL(u1, -7373); u2 = DCT_MUL(u2, -20995); \ + u3 = DCT_MUL(u3, -16069); u4 = DCT_MUL(u4, -3196); \ + u3 += z5; u4 += z5; \ + s0 = t10 + t11; s1 = t7 + u1 + u4; s3 = t6 + u2 + u3; s4 = t10 - t11; s5 = t5 + u2 + u4; s7 = t4 + u1 + u3; + +static void DCT2D(int32 *p) +{ + int32 c, *q = p; + for (c = 7; c >= 0; c--, q += 8) + { + int32 s0 = q[0], s1 = q[1], s2 = q[2], s3 = q[3], s4 = q[4], s5 = q[5], s6 = q[6], s7 = q[7]; + DCT1D(s0, s1, s2, s3, s4, s5, s6, s7); + q[0] = s0 << ROW_BITS; q[1] = DCT_DESCALE(s1, CONST_BITS-ROW_BITS); q[2] = DCT_DESCALE(s2, CONST_BITS-ROW_BITS); q[3] = DCT_DESCALE(s3, CONST_BITS-ROW_BITS); + q[4] = s4 << ROW_BITS; q[5] = DCT_DESCALE(s5, CONST_BITS-ROW_BITS); q[6] = DCT_DESCALE(s6, CONST_BITS-ROW_BITS); q[7] = DCT_DESCALE(s7, CONST_BITS-ROW_BITS); + } + for (q = p, c = 7; c >= 0; c--, q++) + { + int32 s0 = q[0*8], s1 = q[1*8], s2 = q[2*8], s3 = q[3*8], s4 = q[4*8], s5 = q[5*8], s6 = q[6*8], s7 = q[7*8]; + DCT1D(s0, s1, s2, s3, s4, s5, s6, s7); + q[0*8] = DCT_DESCALE(s0, ROW_BITS+3); q[1*8] = DCT_DESCALE(s1, CONST_BITS+ROW_BITS+3); q[2*8] = DCT_DESCALE(s2, CONST_BITS+ROW_BITS+3); q[3*8] = DCT_DESCALE(s3, CONST_BITS+ROW_BITS+3); + q[4*8] = DCT_DESCALE(s4, ROW_BITS+3); q[5*8] = DCT_DESCALE(s5, CONST_BITS+ROW_BITS+3); q[6*8] = DCT_DESCALE(s6, CONST_BITS+ROW_BITS+3); q[7*8] = DCT_DESCALE(s7, CONST_BITS+ROW_BITS+3); + } +} + +struct sym_freq { uint m_key, m_sym_index; }; + +// Radix sorts sym_freq[] array by 32-bit key m_key. Returns ptr to sorted values. +static inline sym_freq* radix_sort_syms(uint num_syms, sym_freq* pSyms0, sym_freq* pSyms1) +{ + const uint cMaxPasses = 4; + uint32 hist[256 * cMaxPasses]; clear_obj(hist); + for (uint i = 0; i < num_syms; i++) { uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; hist[256*2 + ((freq >> 16) & 0xFF)]++; hist[256*3 + ((freq >> 24) & 0xFF)]++; } + sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; + uint total_passes = cMaxPasses; while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--; + for (uint pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) + { + const uint32* pHist = &hist[pass << 8]; + uint offsets[256], cur_ofs = 0; + for (uint i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; } + for (uint i = 0; i < num_syms; i++) + pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; + sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; + } + return pCur_syms; +} + +// calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. +static void calculate_minimum_redundancy(sym_freq *A, int n) +{ + int root, leaf, next, avbl, used, dpth; + if (n==0) return; else if (n==1) { A[0].m_key = 1; return; } + A[0].m_key += A[1].m_key; root = 0; leaf = 2; + for (next=1; next < n-1; next++) + { + if (leaf>=n || A[root].m_key=n || (root=0; next--) A[next].m_key = A[A[next].m_key].m_key+1; + avbl = 1; used = dpth = 0; root = n-2; next = n-1; + while (avbl>0) + { + while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; } + while (avbl>used) { A[next--].m_key = dpth; avbl--; } + avbl = 2*used; dpth++; used = 0; + } +} + +// Limits canonical Huffman code table's max code size to max_code_size. +static void huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) +{ + if (code_list_len <= 1) return; + + for (int i = max_code_size + 1; i <= MAX_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i]; + + uint32 total = 0; + for (int i = max_code_size; i > 0; i--) + total += (((uint32)pNum_codes[i]) << (max_code_size - i)); + + while (total != (1UL << max_code_size)) + { + pNum_codes[max_code_size]--; + for (int i = max_code_size - 1; i > 0; i--) + { + if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; } + } + total--; + } +} + +// Generates an optimized offman table. +void jpeg_encoder::optimize_huffman_table(int table_num, int table_len) +{ + sym_freq syms0[MAX_HUFF_SYMBOLS], syms1[MAX_HUFF_SYMBOLS]; + syms0[0].m_key = 1; syms0[0].m_sym_index = 0; // dummy symbol, assures that no valid code contains all 1's + int num_used_syms = 1; + const uint32 *pSym_count = &m_huff_count[table_num][0]; + for (int i = 0; i < table_len; i++) + if (pSym_count[i]) { syms0[num_used_syms].m_key = pSym_count[i]; syms0[num_used_syms++].m_sym_index = i + 1; } + sym_freq* pSyms = radix_sort_syms(num_used_syms, syms0, syms1); + calculate_minimum_redundancy(pSyms, num_used_syms); + + // Count the # of symbols of each code size. + int num_codes[1 + MAX_HUFF_CODESIZE]; clear_obj(num_codes); + for (int i = 0; i < num_used_syms; i++) + num_codes[pSyms[i].m_key]++; + + const uint JPGE_CODE_SIZE_LIMIT = 16; // the maximum possible size of a JPEG Huffman code (valid range is [9,16] - 9 vs. 8 because of the dummy symbol) + huffman_enforce_max_code_size(num_codes, num_used_syms, JPGE_CODE_SIZE_LIMIT); + + // Compute m_huff_bits array, which contains the # of symbols per code size. + clear_obj(m_huff_bits[table_num]); + for (int i = 1; i <= (int)JPGE_CODE_SIZE_LIMIT; i++) + m_huff_bits[table_num][i] = static_cast(num_codes[i]); + + // Remove the dummy symbol added above, which must be in largest bucket. + for (int i = JPGE_CODE_SIZE_LIMIT; i >= 1; i--) + { + if (m_huff_bits[table_num][i]) { m_huff_bits[table_num][i]--; break; } + } + + // Compute the m_huff_val array, which contains the symbol indices sorted by code size (smallest to largest). + for (int i = num_used_syms - 1; i >= 1; i--) + m_huff_val[table_num][num_used_syms - 1 - i] = static_cast(pSyms[i].m_sym_index - 1); +} + +// JPEG marker generation. +void jpeg_encoder::emit_byte(uint8 i) +{ + m_all_stream_writes_succeeded = m_all_stream_writes_succeeded && m_pStream->put_obj(i); +} + +void jpeg_encoder::emit_word(uint i) +{ + emit_byte(uint8(i >> 8)); emit_byte(uint8(i & 0xFF)); +} + +void jpeg_encoder::emit_marker(int marker) +{ + emit_byte(uint8(0xFF)); emit_byte(uint8(marker)); +} + +// Emit JFIF marker +void jpeg_encoder::emit_jfif_app0() +{ + emit_marker(M_APP0); + emit_word(2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); + emit_byte(0x4A); emit_byte(0x46); emit_byte(0x49); emit_byte(0x46); /* Identifier: ASCII "JFIF" */ + emit_byte(0); + emit_byte(1); /* Major version */ + emit_byte(1); /* Minor version */ + emit_byte(0); /* Density unit */ + emit_word(1); + emit_word(1); + emit_byte(0); /* No thumbnail image */ + emit_byte(0); +} + +// Emit quantization tables +void jpeg_encoder::emit_dqt() +{ + for (int i = 0; i < ((m_num_components == 3) ? 2 : 1); i++) + { + emit_marker(M_DQT); + emit_word(64 + 1 + 2); + emit_byte(static_cast(i)); + for (int j = 0; j < 64; j++) + emit_byte(static_cast(m_quantization_tables[i][j])); + } +} + +// Emit start of frame marker +void jpeg_encoder::emit_sof() +{ + emit_marker(M_SOF0); /* baseline */ + emit_word(3 * m_num_components + 2 + 5 + 1); + emit_byte(8); /* precision */ + emit_word(m_image_y); + emit_word(m_image_x); + emit_byte(m_num_components); + for (int i = 0; i < m_num_components; i++) + { + emit_byte(static_cast(i + 1)); /* component ID */ + emit_byte((m_comp_h_samp[i] << 4) + m_comp_v_samp[i]); /* h and v sampling */ + emit_byte(i > 0); /* quant. table num */ + } +} + +// Emit Huffman table. +void jpeg_encoder::emit_dht(uint8 *bits, uint8 *val, int index, bool ac_flag) +{ + emit_marker(M_DHT); + + int length = 0; + for (int i = 1; i <= 16; i++) + length += bits[i]; + + emit_word(length + 2 + 1 + 16); + emit_byte(static_cast(index + (ac_flag << 4))); + + for (int i = 1; i <= 16; i++) + emit_byte(bits[i]); + + for (int i = 0; i < length; i++) + emit_byte(val[i]); +} + +// Emit all Huffman tables. +void jpeg_encoder::emit_dhts() +{ + emit_dht(m_huff_bits[0+0], m_huff_val[0+0], 0, false); + emit_dht(m_huff_bits[2+0], m_huff_val[2+0], 0, true); + if (m_num_components == 3) + { + emit_dht(m_huff_bits[0+1], m_huff_val[0+1], 1, false); + emit_dht(m_huff_bits[2+1], m_huff_val[2+1], 1, true); + } +} + +// emit start of scan +void jpeg_encoder::emit_sos() +{ + emit_marker(M_SOS); + emit_word(2 * m_num_components + 2 + 1 + 3); + emit_byte(m_num_components); + for (int i = 0; i < m_num_components; i++) + { + emit_byte(static_cast(i + 1)); + if (i == 0) + emit_byte((0 << 4) + 0); + else + emit_byte((1 << 4) + 1); + } + emit_byte(0); /* spectral selection */ + emit_byte(63); + emit_byte(0); +} + +// Emit all markers at beginning of image file. +void jpeg_encoder::emit_markers() +{ + emit_marker(M_SOI); + emit_jfif_app0(); + emit_dqt(); + emit_sof(); + emit_dhts(); + emit_sos(); +} + +// Compute the actual canonical Huffman codes/code sizes given the JPEG huff bits and val arrays. +void jpeg_encoder::compute_huffman_table(uint *codes, uint8 *code_sizes, uint8 *bits, uint8 *val) +{ + int i, l, last_p, si; + uint8 huff_size[257]; + uint huff_code[257]; + uint code; + + int p = 0; + for (l = 1; l <= 16; l++) + for (i = 1; i <= bits[l]; i++) + huff_size[p++] = (char)l; + + huff_size[p] = 0; last_p = p; // write sentinel + + code = 0; si = huff_size[0]; p = 0; + + while (huff_size[p]) + { + while (huff_size[p] == si) + huff_code[p++] = code++; + code <<= 1; + si++; + } + + memset(codes, 0, sizeof(codes[0])*256); + memset(code_sizes, 0, sizeof(code_sizes[0])*256); + for (p = 0; p < last_p; p++) + { + codes[val[p]] = huff_code[p]; + code_sizes[val[p]] = huff_size[p]; + } +} + +// Quantization table generation. +void jpeg_encoder::compute_quant_table(int32 *pDst, int16 *pSrc) +{ + int32 q; + if (m_params.m_quality < 50) + q = 5000 / m_params.m_quality; + else + q = 200 - m_params.m_quality * 2; + for (int i = 0; i < 64; i++) + { + int32 j = *pSrc++; j = (j * q + 50L) / 100L; + *pDst++ = JPGE_MIN(JPGE_MAX(j, 1), 255); + } +} + +// Higher-level methods. +void jpeg_encoder::first_pass_init() +{ + m_bit_buffer = 0; m_bits_in = 0; + memset(m_last_dc_val, 0, 3 * sizeof(m_last_dc_val[0])); + m_mcu_y_ofs = 0; + m_pass_num = 1; +} + +bool jpeg_encoder::second_pass_init() +{ + compute_huffman_table(&m_huff_codes[0+0][0], &m_huff_code_sizes[0+0][0], m_huff_bits[0+0], m_huff_val[0+0]); + compute_huffman_table(&m_huff_codes[2+0][0], &m_huff_code_sizes[2+0][0], m_huff_bits[2+0], m_huff_val[2+0]); + if (m_num_components > 1) + { + compute_huffman_table(&m_huff_codes[0+1][0], &m_huff_code_sizes[0+1][0], m_huff_bits[0+1], m_huff_val[0+1]); + compute_huffman_table(&m_huff_codes[2+1][0], &m_huff_code_sizes[2+1][0], m_huff_bits[2+1], m_huff_val[2+1]); + } + first_pass_init(); + emit_markers(); + m_pass_num = 2; + return true; +} + +bool jpeg_encoder::jpg_open(int p_x_res, int p_y_res, int src_channels) +{ + m_num_components = 3; + switch (m_params.m_subsampling) + { + case Y_ONLY: + { + m_num_components = 1; + m_comp_h_samp[0] = 1; m_comp_v_samp[0] = 1; + m_mcu_x = 8; m_mcu_y = 8; + break; + } + case H1V1: + { + m_comp_h_samp[0] = 1; m_comp_v_samp[0] = 1; + m_comp_h_samp[1] = 1; m_comp_v_samp[1] = 1; + m_comp_h_samp[2] = 1; m_comp_v_samp[2] = 1; + m_mcu_x = 8; m_mcu_y = 8; + break; + } + case H2V1: + { + m_comp_h_samp[0] = 2; m_comp_v_samp[0] = 1; + m_comp_h_samp[1] = 1; m_comp_v_samp[1] = 1; + m_comp_h_samp[2] = 1; m_comp_v_samp[2] = 1; + m_mcu_x = 16; m_mcu_y = 8; + break; + } + case H2V2: + { + m_comp_h_samp[0] = 2; m_comp_v_samp[0] = 2; + m_comp_h_samp[1] = 1; m_comp_v_samp[1] = 1; + m_comp_h_samp[2] = 1; m_comp_v_samp[2] = 1; + m_mcu_x = 16; m_mcu_y = 16; + } + } + + m_image_x = p_x_res; m_image_y = p_y_res; + m_image_bpp = src_channels; + m_image_bpl = m_image_x * src_channels; + m_image_x_mcu = (m_image_x + m_mcu_x - 1) & (~(m_mcu_x - 1)); + m_image_y_mcu = (m_image_y + m_mcu_y - 1) & (~(m_mcu_y - 1)); + m_image_bpl_xlt = m_image_x * m_num_components; + m_image_bpl_mcu = m_image_x_mcu * m_num_components; + m_mcus_per_row = m_image_x_mcu / m_mcu_x; + + if ((m_mcu_lines[0] = static_cast(jpge_malloc(m_image_bpl_mcu * m_mcu_y))) == NULL) return false; + for (int i = 1; i < m_mcu_y; i++) + m_mcu_lines[i] = m_mcu_lines[i-1] + m_image_bpl_mcu; + + compute_quant_table(m_quantization_tables[0], s_std_lum_quant); + compute_quant_table(m_quantization_tables[1], m_params.m_no_chroma_discrim_flag ? s_std_lum_quant : s_std_croma_quant); + + m_out_buf_left = JPGE_OUT_BUF_SIZE; + m_pOut_buf = m_out_buf; + + if (m_params.m_two_pass_flag) + { + clear_obj(m_huff_count); + first_pass_init(); + } + else + { + memcpy(m_huff_bits[0+0], s_dc_lum_bits, 17); memcpy(m_huff_val [0+0], s_dc_lum_val, DC_LUM_CODES); + memcpy(m_huff_bits[2+0], s_ac_lum_bits, 17); memcpy(m_huff_val [2+0], s_ac_lum_val, AC_LUM_CODES); + memcpy(m_huff_bits[0+1], s_dc_chroma_bits, 17); memcpy(m_huff_val [0+1], s_dc_chroma_val, DC_CHROMA_CODES); + memcpy(m_huff_bits[2+1], s_ac_chroma_bits, 17); memcpy(m_huff_val [2+1], s_ac_chroma_val, AC_CHROMA_CODES); + if (!second_pass_init()) return false; // in effect, skip over the first pass + } + return m_all_stream_writes_succeeded; +} + +void jpeg_encoder::load_block_8_8_grey(int x) +{ + uint8 *pSrc; + sample_array_t *pDst = m_sample_array; + x <<= 3; + for (int i = 0; i < 8; i++, pDst += 8) + { + pSrc = m_mcu_lines[i] + x; + pDst[0] = pSrc[0] - 128; pDst[1] = pSrc[1] - 128; pDst[2] = pSrc[2] - 128; pDst[3] = pSrc[3] - 128; + pDst[4] = pSrc[4] - 128; pDst[5] = pSrc[5] - 128; pDst[6] = pSrc[6] - 128; pDst[7] = pSrc[7] - 128; + } +} + +void jpeg_encoder::load_block_8_8(int x, int y, int c) +{ + uint8 *pSrc; + sample_array_t *pDst = m_sample_array; + x = (x * (8 * 3)) + c; + y <<= 3; + for (int i = 0; i < 8; i++, pDst += 8) + { + pSrc = m_mcu_lines[y + i] + x; + pDst[0] = pSrc[0 * 3] - 128; pDst[1] = pSrc[1 * 3] - 128; pDst[2] = pSrc[2 * 3] - 128; pDst[3] = pSrc[3 * 3] - 128; + pDst[4] = pSrc[4 * 3] - 128; pDst[5] = pSrc[5 * 3] - 128; pDst[6] = pSrc[6 * 3] - 128; pDst[7] = pSrc[7 * 3] - 128; + } +} + +void jpeg_encoder::load_block_16_8(int x, int c) +{ + uint8 *pSrc1, *pSrc2; + sample_array_t *pDst = m_sample_array; + x = (x * (16 * 3)) + c; + int a = 0, b = 2; + for (int i = 0; i < 16; i += 2, pDst += 8) + { + pSrc1 = m_mcu_lines[i + 0] + x; + pSrc2 = m_mcu_lines[i + 1] + x; + pDst[0] = ((pSrc1[ 0 * 3] + pSrc1[ 1 * 3] + pSrc2[ 0 * 3] + pSrc2[ 1 * 3] + a) >> 2) - 128; pDst[1] = ((pSrc1[ 2 * 3] + pSrc1[ 3 * 3] + pSrc2[ 2 * 3] + pSrc2[ 3 * 3] + b) >> 2) - 128; + pDst[2] = ((pSrc1[ 4 * 3] + pSrc1[ 5 * 3] + pSrc2[ 4 * 3] + pSrc2[ 5 * 3] + a) >> 2) - 128; pDst[3] = ((pSrc1[ 6 * 3] + pSrc1[ 7 * 3] + pSrc2[ 6 * 3] + pSrc2[ 7 * 3] + b) >> 2) - 128; + pDst[4] = ((pSrc1[ 8 * 3] + pSrc1[ 9 * 3] + pSrc2[ 8 * 3] + pSrc2[ 9 * 3] + a) >> 2) - 128; pDst[5] = ((pSrc1[10 * 3] + pSrc1[11 * 3] + pSrc2[10 * 3] + pSrc2[11 * 3] + b) >> 2) - 128; + pDst[6] = ((pSrc1[12 * 3] + pSrc1[13 * 3] + pSrc2[12 * 3] + pSrc2[13 * 3] + a) >> 2) - 128; pDst[7] = ((pSrc1[14 * 3] + pSrc1[15 * 3] + pSrc2[14 * 3] + pSrc2[15 * 3] + b) >> 2) - 128; + int temp = a; a = b; b = temp; + } +} + +void jpeg_encoder::load_block_16_8_8(int x, int c) +{ + uint8 *pSrc1; + sample_array_t *pDst = m_sample_array; + x = (x * (16 * 3)) + c; + for (int i = 0; i < 8; i++, pDst += 8) + { + pSrc1 = m_mcu_lines[i + 0] + x; + pDst[0] = ((pSrc1[ 0 * 3] + pSrc1[ 1 * 3]) >> 1) - 128; pDst[1] = ((pSrc1[ 2 * 3] + pSrc1[ 3 * 3]) >> 1) - 128; + pDst[2] = ((pSrc1[ 4 * 3] + pSrc1[ 5 * 3]) >> 1) - 128; pDst[3] = ((pSrc1[ 6 * 3] + pSrc1[ 7 * 3]) >> 1) - 128; + pDst[4] = ((pSrc1[ 8 * 3] + pSrc1[ 9 * 3]) >> 1) - 128; pDst[5] = ((pSrc1[10 * 3] + pSrc1[11 * 3]) >> 1) - 128; + pDst[6] = ((pSrc1[12 * 3] + pSrc1[13 * 3]) >> 1) - 128; pDst[7] = ((pSrc1[14 * 3] + pSrc1[15 * 3]) >> 1) - 128; + } +} + +void jpeg_encoder::load_quantized_coefficients(int component_num) +{ + int32 *q = m_quantization_tables[component_num > 0]; + int16 *pDst = m_coefficient_array; + for (int i = 0; i < 64; i++) + { + sample_array_t j = m_sample_array[s_zag[i]]; + if (j < 0) + { + if ((j = -j + (*q >> 1)) < *q) + *pDst++ = 0; + else + *pDst++ = static_cast(-(j / *q)); + } + else + { + if ((j = j + (*q >> 1)) < *q) + *pDst++ = 0; + else + *pDst++ = static_cast((j / *q)); + } + q++; + } +} + +void jpeg_encoder::flush_output_buffer() +{ + if (m_out_buf_left != JPGE_OUT_BUF_SIZE) + m_all_stream_writes_succeeded = m_all_stream_writes_succeeded && m_pStream->put_buf(m_out_buf, JPGE_OUT_BUF_SIZE - m_out_buf_left); + m_pOut_buf = m_out_buf; + m_out_buf_left = JPGE_OUT_BUF_SIZE; +} + +void jpeg_encoder::put_bits(uint bits, uint len) +{ + m_bit_buffer |= ((uint32)bits << (24 - (m_bits_in += len))); + while (m_bits_in >= 8) + { + uint8 c; + #define JPGE_PUT_BYTE(c) { *m_pOut_buf++ = (c); if (--m_out_buf_left == 0) flush_output_buffer(); } + JPGE_PUT_BYTE(c = (uint8)((m_bit_buffer >> 16) & 0xFF)); + if (c == 0xFF) JPGE_PUT_BYTE(0); + m_bit_buffer <<= 8; + m_bits_in -= 8; + } +} + +void jpeg_encoder::code_coefficients_pass_one(int component_num) +{ + if (component_num >= 3) return; // just to shut up static analysis + int i, run_len, nbits, temp1; + int16 *src = m_coefficient_array; + uint32 *dc_count = component_num ? m_huff_count[0 + 1] : m_huff_count[0 + 0], *ac_count = component_num ? m_huff_count[2 + 1] : m_huff_count[2 + 0]; + + temp1 = src[0] - m_last_dc_val[component_num]; + m_last_dc_val[component_num] = src[0]; + if (temp1 < 0) temp1 = -temp1; + + nbits = 0; + while (temp1) + { + nbits++; temp1 >>= 1; + } + + dc_count[nbits]++; + for (run_len = 0, i = 1; i < 64; i++) + { + if ((temp1 = m_coefficient_array[i]) == 0) + run_len++; + else + { + while (run_len >= 16) + { + ac_count[0xF0]++; + run_len -= 16; + } + if (temp1 < 0) temp1 = -temp1; + nbits = 1; + while (temp1 >>= 1) nbits++; + ac_count[(run_len << 4) + nbits]++; + run_len = 0; + } + } + if (run_len) ac_count[0]++; +} + +void jpeg_encoder::code_coefficients_pass_two(int component_num) +{ + int i, j, run_len, nbits, temp1, temp2; + int16 *pSrc = m_coefficient_array; + uint *codes[2]; + uint8 *code_sizes[2]; + + if (component_num == 0) + { + codes[0] = m_huff_codes[0 + 0]; codes[1] = m_huff_codes[2 + 0]; + code_sizes[0] = m_huff_code_sizes[0 + 0]; code_sizes[1] = m_huff_code_sizes[2 + 0]; + } + else + { + codes[0] = m_huff_codes[0 + 1]; codes[1] = m_huff_codes[2 + 1]; + code_sizes[0] = m_huff_code_sizes[0 + 1]; code_sizes[1] = m_huff_code_sizes[2 + 1]; + } + + temp1 = temp2 = pSrc[0] - m_last_dc_val[component_num]; + m_last_dc_val[component_num] = pSrc[0]; + + if (temp1 < 0) + { + temp1 = -temp1; temp2--; + } + + nbits = 0; + while (temp1) + { + nbits++; temp1 >>= 1; + } + + put_bits(codes[0][nbits], code_sizes[0][nbits]); + if (nbits) put_bits(temp2 & ((1 << nbits) - 1), nbits); + + for (run_len = 0, i = 1; i < 64; i++) + { + if ((temp1 = m_coefficient_array[i]) == 0) + run_len++; + else + { + while (run_len >= 16) + { + put_bits(codes[1][0xF0], code_sizes[1][0xF0]); + run_len -= 16; + } + if ((temp2 = temp1) < 0) + { + temp1 = -temp1; + temp2--; + } + nbits = 1; + while (temp1 >>= 1) + nbits++; + j = (run_len << 4) + nbits; + put_bits(codes[1][j], code_sizes[1][j]); + put_bits(temp2 & ((1 << nbits) - 1), nbits); + run_len = 0; + } + } + if (run_len) + put_bits(codes[1][0], code_sizes[1][0]); +} + +void jpeg_encoder::code_block(int component_num) +{ + DCT2D(m_sample_array); + load_quantized_coefficients(component_num); + if (m_pass_num == 1) + code_coefficients_pass_one(component_num); + else + code_coefficients_pass_two(component_num); +} + +void jpeg_encoder::process_mcu_row() +{ + if (m_num_components == 1) + { + for (int i = 0; i < m_mcus_per_row; i++) + { + load_block_8_8_grey(i); code_block(0); + } + } + else if ((m_comp_h_samp[0] == 1) && (m_comp_v_samp[0] == 1)) + { + for (int i = 0; i < m_mcus_per_row; i++) + { + load_block_8_8(i, 0, 0); code_block(0); load_block_8_8(i, 0, 1); code_block(1); load_block_8_8(i, 0, 2); code_block(2); + } + } + else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 1)) + { + for (int i = 0; i < m_mcus_per_row; i++) + { + load_block_8_8(i * 2 + 0, 0, 0); code_block(0); load_block_8_8(i * 2 + 1, 0, 0); code_block(0); + load_block_16_8_8(i, 1); code_block(1); load_block_16_8_8(i, 2); code_block(2); + } + } + else if ((m_comp_h_samp[0] == 2) && (m_comp_v_samp[0] == 2)) + { + for (int i = 0; i < m_mcus_per_row; i++) + { + load_block_8_8(i * 2 + 0, 0, 0); code_block(0); load_block_8_8(i * 2 + 1, 0, 0); code_block(0); + load_block_8_8(i * 2 + 0, 1, 0); code_block(0); load_block_8_8(i * 2 + 1, 1, 0); code_block(0); + load_block_16_8(i, 1); code_block(1); load_block_16_8(i, 2); code_block(2); + } + } +} + +bool jpeg_encoder::terminate_pass_one() +{ + optimize_huffman_table(0+0, DC_LUM_CODES); optimize_huffman_table(2+0, AC_LUM_CODES); + if (m_num_components > 1) + { + optimize_huffman_table(0+1, DC_CHROMA_CODES); optimize_huffman_table(2+1, AC_CHROMA_CODES); + } + return second_pass_init(); +} + +bool jpeg_encoder::terminate_pass_two() +{ + put_bits(0x7F, 7); + flush_output_buffer(); + emit_marker(M_EOI); + m_pass_num++; // purposely bump up m_pass_num, for debugging + return true; +} + +bool jpeg_encoder::process_end_of_image() +{ + if (m_mcu_y_ofs) + { + if (m_mcu_y_ofs < 16) // check here just to shut up static analysis + { + for (int i = m_mcu_y_ofs; i < m_mcu_y; i++) + memcpy(m_mcu_lines[i], m_mcu_lines[m_mcu_y_ofs - 1], m_image_bpl_mcu); + } + + process_mcu_row(); + } + + if (m_pass_num == 1) + return terminate_pass_one(); + else + return terminate_pass_two(); +} + +void jpeg_encoder::load_mcu(const void *pSrc) +{ + const uint8* Psrc = reinterpret_cast(pSrc); + + uint8* pDst = m_mcu_lines[m_mcu_y_ofs]; // OK to write up to m_image_bpl_xlt bytes to pDst + + if (m_num_components == 1) + { + if (m_image_bpp == 4) + RGBA_to_Y(pDst, Psrc, m_image_x); + else if (m_image_bpp == 3) + RGB_to_Y(pDst, Psrc, m_image_x); + else + memcpy(pDst, Psrc, m_image_x); + } + else + { + if (m_image_bpp == 4) + RGBA_to_YCC(pDst, Psrc, m_image_x); + else if (m_image_bpp == 3) + RGB_to_YCC(pDst, Psrc, m_image_x); + else + Y_to_YCC(pDst, Psrc, m_image_x); + } + + // Possibly duplicate pixels at end of scanline if not a multiple of 8 or 16 + if (m_num_components == 1) + memset(m_mcu_lines[m_mcu_y_ofs] + m_image_bpl_xlt, pDst[m_image_bpl_xlt - 1], m_image_x_mcu - m_image_x); + else + { + const uint8 y = pDst[m_image_bpl_xlt - 3 + 0], cb = pDst[m_image_bpl_xlt - 3 + 1], cr = pDst[m_image_bpl_xlt - 3 + 2]; + uint8 *q = m_mcu_lines[m_mcu_y_ofs] + m_image_bpl_xlt; + for (int i = m_image_x; i < m_image_x_mcu; i++) + { + *q++ = y; *q++ = cb; *q++ = cr; + } + } + + if (++m_mcu_y_ofs == m_mcu_y) + { + process_mcu_row(); + m_mcu_y_ofs = 0; + } +} + +void jpeg_encoder::clear() +{ + m_mcu_lines[0] = NULL; + m_pass_num = 0; + m_all_stream_writes_succeeded = true; +} + +jpeg_encoder::jpeg_encoder() +{ + clear(); +} + +jpeg_encoder::~jpeg_encoder() +{ + deinit(); +} + +bool jpeg_encoder::init(output_stream *pStream, int width, int height, int src_channels, const params &comp_params) +{ + deinit(); + if (((!pStream) || (width < 1) || (height < 1)) || ((src_channels != 1) && (src_channels != 3) && (src_channels != 4)) || (!comp_params.check())) return false; + m_pStream = pStream; + m_params = comp_params; + return jpg_open(width, height, src_channels); +} + +void jpeg_encoder::deinit() +{ + jpge_free(m_mcu_lines[0]); + clear(); +} + +bool jpeg_encoder::process_scanline(const void* pScanline) +{ + if ((m_pass_num < 1) || (m_pass_num > 2)) return false; + if (m_all_stream_writes_succeeded) + { + if (!pScanline) + { + if (!process_end_of_image()) return false; + } + else + { + load_mcu(pScanline); + } + } + return m_all_stream_writes_succeeded; +} + +// Higher level wrappers/examples (optional). +#include + +class cfile_stream : public output_stream +{ + cfile_stream(const cfile_stream &); + cfile_stream &operator= (const cfile_stream &); + + FILE* m_pFile; + bool m_bStatus; + +public: + cfile_stream() : m_pFile(NULL), m_bStatus(false) { } + + virtual ~cfile_stream() + { + close(); + } + + bool open(const char *pFilename) + { + close(); + m_pFile = fopen(pFilename, "wb"); + m_bStatus = (m_pFile != NULL); + return m_bStatus; + } + + bool close() + { + if (m_pFile) + { + if (fclose(m_pFile) == EOF) + { + m_bStatus = false; + } + m_pFile = NULL; + } + return m_bStatus; + } + + virtual bool put_buf(const void* pBuf, int len) + { + m_bStatus = m_bStatus && (fwrite(pBuf, len, 1, m_pFile) == 1); + return m_bStatus; + } + + uint get_size() const + { + return m_pFile ? ftell(m_pFile) : 0; + } +}; + +// Writes JPEG image to file. +bool compress_image_to_jpeg_file(const char *pFilename, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params) +{ + cfile_stream dst_stream; + if (!dst_stream.open(pFilename)) + return false; + + jpge::jpeg_encoder dst_image; + if (!dst_image.init(&dst_stream, width, abs(height), num_channels, comp_params)) + return false; + + const int pitch = height < 0 ? -width*num_channels : width*num_channels; + const uint8* pSrc = 0; + if(pitch < 0) + { + pSrc = pImage_data + -pitch*(abs(height)-1); // start at "far end" of image + } + else + { + pSrc = pImage_data; // start at start of image + } + for (uint pass_index = 0; pass_index < dst_image.get_total_passes(); pass_index++) + { + for (int i = 0; i < abs(height); i++) + { + const uint8* pBuf = pSrc; + pSrc += pitch; + if (!dst_image.process_scanline(pBuf)) + return false; + } + if (!dst_image.process_scanline(NULL)) + return false; + } + + dst_image.deinit(); + + return dst_stream.close(); +} + +class memory_stream : public output_stream +{ + memory_stream(const memory_stream &); + memory_stream &operator= (const memory_stream &); + + uint8 *m_pBuf; + uint m_buf_size, m_buf_ofs; + +public: + memory_stream(void *pBuf, uint buf_size) : m_pBuf(static_cast(pBuf)), m_buf_size(buf_size), m_buf_ofs(0) { } + + virtual ~memory_stream() { } + + virtual bool put_buf(const void* pBuf, int len) + { + uint buf_remaining = m_buf_size - m_buf_ofs; + if ((uint)len > buf_remaining) + return false; + memcpy(m_pBuf + m_buf_ofs, pBuf, len); + m_buf_ofs += len; + return true; + } + + uint get_size() const + { + return m_buf_ofs; + } +}; + +bool compress_image_to_jpeg_file_in_memory(void *pDstBuf, int &buf_size, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params) +{ + if ((!pDstBuf) || (!buf_size)) + return false; + + memory_stream dst_stream(pDstBuf, buf_size); + + buf_size = 0; + + jpge::jpeg_encoder dst_image; + if (!dst_image.init(&dst_stream, width, height, num_channels, comp_params)) + return false; + + for (uint pass_index = 0; pass_index < dst_image.get_total_passes(); pass_index++) + { + for (int i = 0; i < height; i++) + { + const uint8* pScanline = pImage_data + i * width * num_channels; + if (!dst_image.process_scanline(pScanline)) + return false; + } + if (!dst_image.process_scanline(NULL)) + return false; + } + + dst_image.deinit(); + + buf_size = dst_stream.get_size(); + return true; +} + +} // namespace jpge diff --git a/PitsideConsole/PitsideConsole/jpge.h b/PitsideConsole/PitsideConsole/jpge.h new file mode 100644 index 0000000..262bbfb --- /dev/null +++ b/PitsideConsole/PitsideConsole/jpge.h @@ -0,0 +1,169 @@ +// jpge.h - C++ class for JPEG compression. +// Public domain, Rich Geldreich +// Alex Evans: Added RGBA support, linear memory allocator. +#ifndef JPEG_ENCODER_H +#define JPEG_ENCODER_H + +namespace jpge +{ + typedef unsigned char uint8; + typedef signed short int16; + typedef signed int int32; + typedef unsigned short uint16; + typedef unsigned int uint32; + typedef unsigned int uint; + + // JPEG chroma subsampling factors. Y_ONLY (grayscale images) and H2V2 (color images) are the most common. + enum subsampling_t { Y_ONLY = 0, H1V1 = 1, H2V1 = 2, H2V2 = 3 }; + + // JPEG compression parameters structure. + struct params + { + inline params() : m_quality(85), m_subsampling(H2V2), m_no_chroma_discrim_flag(false), m_two_pass_flag(false) { } + + inline bool check() const + { + if ((m_quality < 1) || (m_quality > 100)) return false; + if ((uint)m_subsampling > (uint)H2V2) return false; + return true; + } + + // Quality: 1-100, higher is better. Typical values are around 50-95. + int m_quality; + + // m_subsampling: + // 0 = Y (grayscale) only + // 1 = YCbCr, no subsampling (H1V1, YCbCr 1x1x1, 3 blocks per MCU) + // 2 = YCbCr, H2V1 subsampling (YCbCr 2x1x1, 4 blocks per MCU) + // 3 = YCbCr, H2V2 subsampling (YCbCr 4x1x1, 6 blocks per MCU-- very common) + subsampling_t m_subsampling; + + // Disables CbCr discrimination - only intended for testing. + // If true, the Y quantization table is also used for the CbCr channels. + bool m_no_chroma_discrim_flag; + + bool m_two_pass_flag; + }; + + // Writes JPEG image to a file. + // num_channels must be 1 (Y) or 3 (RGB), image pitch must be width*num_channels. + bool compress_image_to_jpeg_file(const char *pFilename, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params = params()); + + // Writes JPEG image to memory buffer. + // On entry, buf_size is the size of the output buffer pointed at by pBuf, which should be at least ~1024 bytes. + // If return value is true, buf_size will be set to the size of the compressed data. + bool compress_image_to_jpeg_file_in_memory(void *pBuf, int &buf_size, int width, int height, int num_channels, const uint8 *pImage_data, const params &comp_params = params()); + + // Output stream abstract class - used by the jpeg_encoder class to write to the output stream. + // put_buf() is generally called with len==JPGE_OUT_BUF_SIZE bytes, but for headers it'll be called with smaller amounts. + class output_stream + { + public: + virtual ~output_stream() { }; + virtual bool put_buf(const void* Pbuf, int len) = 0; + template inline bool put_obj(const T& obj) { return put_buf(&obj, sizeof(T)); } + }; + + // Lower level jpeg_encoder class - useful if more control is needed than the above helper functions. + class jpeg_encoder + { + public: + jpeg_encoder(); + ~jpeg_encoder(); + + // Initializes the compressor. + // pStream: The stream object to use for writing compressed data. + // params - Compression parameters structure, defined above. + // width, height - Image dimensions. + // channels - May be 1, or 3. 1 indicates grayscale, 3 indicates RGB source data. + // Returns false on out of memory or if a stream write fails. + bool init(output_stream *pStream, int width, int height, int src_channels, const params &comp_params = params()); + + const params &get_params() const { return m_params; } + + // Deinitializes the compressor, freeing any allocated memory. May be called at any time. + void deinit(); + + uint get_total_passes() const { return m_params.m_two_pass_flag ? 2 : 1; } + inline uint get_cur_pass() { return m_pass_num; } + + // Call this method with each source scanline. + // width * src_channels bytes per scanline is expected (RGB or Y format). + // You must call with NULL after all scanlines are processed to finish compression. + // Returns false on out of memory or if a stream write fails. + bool process_scanline(const void* pScanline); + + private: + jpeg_encoder(const jpeg_encoder &); + jpeg_encoder &operator =(const jpeg_encoder &); + + typedef int32 sample_array_t; + + output_stream *m_pStream; + params m_params; + uint8 m_num_components; + uint8 m_comp_h_samp[3], m_comp_v_samp[3]; + int m_image_x, m_image_y, m_image_bpp, m_image_bpl; + int m_image_x_mcu, m_image_y_mcu; + int m_image_bpl_xlt, m_image_bpl_mcu; + int m_mcus_per_row; + int m_mcu_x, m_mcu_y; + uint8 *m_mcu_lines[16]; + uint8 m_mcu_y_ofs; + sample_array_t m_sample_array[64]; + int16 m_coefficient_array[64]; + int32 m_quantization_tables[2][64]; + uint m_huff_codes[4][256]; + uint8 m_huff_code_sizes[4][256]; + uint8 m_huff_bits[4][17]; + uint8 m_huff_val[4][256]; + uint32 m_huff_count[4][256]; + int m_last_dc_val[3]; + enum { JPGE_OUT_BUF_SIZE = 2048 }; + uint8 m_out_buf[JPGE_OUT_BUF_SIZE]; + uint8 *m_pOut_buf; + uint m_out_buf_left; + uint32 m_bit_buffer; + uint m_bits_in; + uint8 m_pass_num; + bool m_all_stream_writes_succeeded; + + void optimize_huffman_table(int table_num, int table_len); + void emit_byte(uint8 i); + void emit_word(uint i); + void emit_marker(int marker); + void emit_jfif_app0(); + void emit_dqt(); + void emit_sof(); + void emit_dht(uint8 *bits, uint8 *val, int index, bool ac_flag); + void emit_dhts(); + void emit_sos(); + void emit_markers(); + void compute_huffman_table(uint *codes, uint8 *code_sizes, uint8 *bits, uint8 *val); + void compute_quant_table(int32 *dst, int16 *src); + void adjust_quant_table(int32 *dst, int32 *src); + void first_pass_init(); + bool second_pass_init(); + bool jpg_open(int p_x_res, int p_y_res, int src_channels); + void load_block_8_8_grey(int x); + void load_block_8_8(int x, int y, int c); + void load_block_16_8(int x, int c); + void load_block_16_8_8(int x, int c); + void load_quantized_coefficients(int component_num); + void flush_output_buffer(); + void put_bits(uint bits, uint len); + void code_coefficients_pass_one(int component_num); + void code_coefficients_pass_two(int component_num); + void code_block(int component_num); + void process_mcu_row(); + bool terminate_pass_one(); + bool terminate_pass_two(); + bool process_end_of_image(); + void load_mcu(const void* src); + void clear(); + void init(); + }; + +} // namespace jpge + +#endif // JPEG_ENCODER diff --git a/PitsideConsole/PitsideConsole/lapSummary.html b/PitsideConsole/PitsideConsole/lapSummary.html new file mode 100644 index 0000000..771b59c --- /dev/null +++ b/PitsideConsole/PitsideConsole/lapSummary.html @@ -0,0 +1,178 @@ + + + + + + + + + + + + + +
+ +
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/lapdata.js b/PitsideConsole/PitsideConsole/lapdata.js new file mode 100644 index 0000000..c624078 --- /dev/null +++ b/PitsideConsole/PitsideConsole/lapdata.js @@ -0,0 +1,459 @@ +// define a point object. This may seem redundant, but it allows me to add +// prototypes to the point_ object later +var point_ = function (seed) { + this.time = null; + this.distance = null; + this.velocity = null; + this.latitde = null; + this.longitude = null; + this.index = null; + for (key in seed) { + this[key] = seed[key]; + } +} +var pointsKeyList = ["time","distance","velocity","latitude","longitude","index"]; +//define an arrayOfObjects() constructor as a copy of Array() and add some +// prototypes +var arrayOfObjects = Array; +arrayOfObjects.prototype.sortByObj = function (property) { + return this.sort(objectSort(property)) +} + +function objectSort (property) { + return function (a,b) { + return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; + } +} + +function dataLayout (name, rangeL, rangeU, suffix, pos) { + this.name = name; + if (pos === undefined) { + pos = nextAvailablePosition(); + } + this.position = pos; + this.size = 10; + this.pMin = 0; + this.pMax = 1; + this.vMin = rangeL; + this.vMax = rangeU; + this.suffix = suffix; + this.enabled = true; + this.valueToGraph = function(value) { + var ratio = ((+this.pMax) - (+this.pMin)) / ((+this.vMax) - (+this.vMin)); + var output = (((+value) - (+this.vMin)) * (+ratio)) + (+this.pMin); + return output; + }, + this.graphToValue = function(value) { + var ratio = ((+this.vMax) - (+this.vMin)) / ((+this.pMax) - (+this.pMin)); + var output = (((+value) - (+this.pMin)) * (+ratio)) + (+this.vMin); + return output; + } +} + +var prefs = { + layout: {}, + settings: {}, + graph: {}, + trackMap: {} +} + +function populateGraphPosition() { + var sorted = []; + var i; + // objects can't be easily sorted, so making a temp array to sort + for (i in prefs.layout) { + sorted.push(prefs.layout[i]); + sorted[sorted.length-1].index = i; + } + sorted.sortByObj("position"); + i = sorted.length; + var nextP = 0; + while (i--) { //countdown from last position + if (prefs.layout[sorted[i].index].enabled) { + if ((i < sorted.length-1) && (prefs.layout[sorted[i].index].position === prefs.layout[sorted[i+1].index].position) && + (prefs.layout[sorted[i+1].index].enabled == true)) { + prefs.layout[sorted[i].index].pMin = prefs.layout[sorted[i+1].index].pMin; + prefs.layout[sorted[i].index].pMax = prefs.layout[sorted[i+1].index].pMax; + } else { + var size = prefs.layout[sorted[i].index].size; + prefs.layout[sorted[i].index].pMin = nextP; + nextP += size; + prefs.layout[sorted[i].index].pMax = nextP; + } + } + } +} + +function nextAvailablePosition () { + var nextPosition = 0; + for (var key in prefs.layout) { + if (prefs.layout.hasOwnProperty(key)) { + nextPosition = Math.max(nextPosition, prefs.layout[key].position); + } + } + return +nextPosition + 1; +} + +prefs.layout.distance = new dataLayout("Distance",13,40); +prefs.layout.velocity = new dataLayout("Velocity",13,40); +prefs.layout["5"] = new dataLayout("Accel X",-2,2); +prefs.layout["6"] = new dataLayout("Accel Y",-2,2); +prefs.graph.strokeWidth = 2; +prefs.graph.dotSize = 5; +prefs.trackMap.strokeWidth = 2; +prefs.trackMap.dotSize = 5; + + + +var lapData = function(lapList) { + for (var lap in lapList) { + //check if we already have this lap + if (this.master.idx.indexOf(lap) < 0) { + //get lap via XMLHttpRequest + this.getLap(lap); + } + } + // prune unused laps from master array + this.prune(lapList); +} + +lapData.prototype.master = { + "idx": [], + "points": [], + "data": [], + "prefs": [] +}; + +lapData.prototype.waiting = 0; + + +lapData.prototype.getPage = function (page, callback) { + this.waiting++; + console.log("this.waiting ", this.waiting); + var _this = this; + var req = new XMLHttpRequest(); + req.onreadystatechange = function () { + if (req.readyState == 4) { + _this.waiting--; + console.log("this.waiting ", _this.waiting); + if (req.status === 200 || // Normal http + req.status === 0) { // Chrome w/ --allow-file-access-from-files + var data = req.responseText; + callback.call(_this, data, lap); + } else if (_this.waiting == 0) { + updateGraph(); + spinner.stop(); + } + + } + }; + req.open('GET', page , true); + req.send(null); +} + +lapData.prototype.getLap = function (lap) { + if (!this.waiting) { + spinner.spin(document.getElementById("renderArea")); + } +// this.waiting++; + var _this = this; + var refLap = lap.split(",")[0]; + this.getPage('getdata?table=points&parentId=' + lap + '&refLap=' + refLap, _this.getLap_cb); +} + +lapData.prototype.getLap_cb = function(data) { + if (data != "") { + var myLaps = toArrayOfObjects(data); + for (var key in myLaps) { + if (myLaps.hasOwnProperty(key)) { + this.insertToMaster(myLaps[key], key); + } + } + } + if (this.waiting == 0) { + updateGraph(); + spinner.stop(); + } +} + + +lapData.prototype.getData = function (lap, channelid) { + if (!this.waiting) { + spinner.spin(document.getElementById("renderArea")); + } +// this.waiting ++ ; + var _this = this; + this.getPage('getdata?table=data&lapId='+lap+'&dataType='+channelid, _this.getData_cb); +} + +lapData.prototype.getData_cb = function(data) { + if (data != "") { + var myData = toArrayOfObjects(data); + for (var key in myData) { + if (myData.hasOwnProperty(key)) { + this.insertToMaster(myData[key], key); + } + } + } + if (this.waiting == 0) { + updateGraph(); + spinner.stop(); + } +} + +lapData.prototype.insertToMaster = function(lpArr, lap) { + //console.log(lpArr); + console.time("insertToMaster"); + // merges data with the master array + // is this point or data channel info? data channel will not have gps info + var dataType = "gps"; + if (isNaN(lpArr[0].latitude)) { + dataType = "data"; +// console.log("data array detected"); + } + //check to see if the lap already exists in master + if (this.master.idx.indexOf(lap) < 0 && dataType === "gps") { + this.master.idx.push(lap); + this.master.points.push(lpArr); + this.master.data.push([]); + } else if (dataType === "data") { + if (this.master.idx.indexOf(lap) < 0) { + this.master.idx.push(lap); + } + var lpIdx = this.master.idx.indexOf(lap); + // the data type selection could have changed. Rather than + // compare old and new, we'll just wipe it out and add fresh. + // TODO: investigate speed issues with this strategy. + this.master.data.splice(lpIdx, 1, lpArr); + // TODO: do some extra stuff, like interpolating distance values, etc. + //sort on time, yo! + //this.master.points[lpIdx].sortByObj("time"); + // step through and add distances to object without 'em + var beforeIdx = 0; + var afterIdx = 0; + for (var row = 0; row < this.master.data[lpIdx].length; row++) { + if (isNaN(this.master.data[lpIdx][row].distance)) { + var myTime = this.master.data[lpIdx][row].time; + // get before and after time indexes from points data + var beforePnt = null; + var afterPnt = null; + for (var rowi = beforeIdx; rowi < this.master.points[lpIdx].length; rowi++) { + if (this.master.points[lpIdx][rowi].time < myTime) { + beforePnt = this.master.points[lpIdx][rowi]; + beforeIdx = rowi; + continue; + } + if (this.master.points[lpIdx][rowi].time === myTime) { + beforePnt = this.master.points[lpIdx][rowi]; + afterPnt = this.master.points[lpIdx][rowi]; + beforeIdx = rowi; + afterIdx = rowi; + break; + } + if (this.master.points[lpIdx][rowi].time > myTime) { + afterPnt = this.master.points[lpIdx][rowi]; + afterIdx = rowi; +// console.log("myTime: ", myTime); +// console.log("before: ", beforePnt.time); +// console.log("after: ", afterPnt.time); + break; + } + } + // interpolate the distance from the time values + // our known values are time + // need to guess the distance + if (beforePnt === null || afterPnt === null) { + // data before the first or after the last lap position is useless! + this.master.data[lpIdx].splice(row,1); + row--; + continue; + } + var t_delta = afterPnt.time - beforePnt.time; + if (t_delta === 0) { + this.master.data[lpIdx][row].distance = beforePnt.distance; + continue; + } + var d_delta = afterPnt.distance - beforePnt.distance; + var t_segment = this.master.data[lpIdx][row].time - beforePnt.time; + var t_ratio = t_segment / t_delta; + var d_segment = d_delta * t_ratio; + this.master.data[lpIdx][row].distance = beforePnt.distance + d_segment; + // have some ice cream! + // yum! + } + } + } + console.timeEnd("insertToMaster"); +} + +lapData.prototype.removeFromMaster = function(lap) { + var idx = this.master.idx.indexOf(lap); + if (idx >= 0) { + this.master.idx.splice(lap,1); + this.master.points.splice(lap,1); + this.master.data.splice(lap,1); + } +} + +lapData.prototype.header = function() { + var header = []; + header.push("Distance"); + for (var i=0; i 0) { + var rowObj = {}; + for (var rowIdx = 1; rowIdx < numCols; rowIdx++) { + // Turn "123" into 123. + row[rowIdx] = parseFloat(row[rowIdx]); + if (isNaN(row[rowIdx])) { + row[rowIdx] = null; + } + rowObj[colNames[rowIdx]]= row[rowIdx]; + } + if (!outObj[row[0]]) { +// console.log("Creating lap ",row[0]); + outObj[row[0]] = new arrayOfObjects; + idxObj[row[0]] = 0; + } + rowObj.index = idxObj[row[0]]++; + outObj[row[0]].push(rowObj); +// console.log(arry[row[0]]); + } + + } + return outObj; +} + + + diff --git a/PitsideConsole/PitsideConsole/lapdistance.php b/PitsideConsole/PitsideConsole/lapdistance.php new file mode 100644 index 0000000..c523511 --- /dev/null +++ b/PitsideConsole/PitsideConsole/lapdistance.php @@ -0,0 +1,18 @@ +Distance, Lap 2, Lap 1 +5.46956553908, 61.9444960883, 27.4452348628 +10.1875038582, 62.3483826222, 27.3095579654 +10.9251749109, 62.8765557202, 27.2710958322 +15.9902536848, 63.2307361617, 27.2972026899 +19.4478736199, 63.6656922034, 27.1687153003 +22.4380427825, 64.0136604499, 26.7873129261 +24.9612807901, 64.4424085633, 26.8364427275 +27.538957026, 64.7282377944, 26.8304459173 +31.5163448167, 65.3993212414, 26.4766263819 +35.0421677117, 65.7597181444, 26.7247407994 +38.4155857112, 66.2195314988, 26.6368037324 +42.8886922159, 67.1391624743, 25.2634382874 +47.7051136991, 67.3690648849, 21.6237188924 +50.724044101, 67.623828875, 20.9506760069 +55.354397697, 67.984225778, 14.7405448373 +59.0224759227, 68.3756879221, 7.96484927316 +61.9344296252, 68.792007379, 0.0807782501019 \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/letters.png b/PitsideConsole/PitsideConsole/letters.png new file mode 100644 index 0000000000000000000000000000000000000000..c9bade3e96e8d42f16f38705b6bd456cdcd510bc GIT binary patch literal 3091 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 literal 0 HcmV?d00001 diff --git a/PitsideConsole/PitsideConsole/pitside.js b/PitsideConsole/PitsideConsole/pitside.js new file mode 100644 index 0000000..81e8b0c --- /dev/null +++ b/PitsideConsole/PitsideConsole/pitside.js @@ -0,0 +1,642 @@ +// JavaScript Document +var updateGraph = function() { + if (!g2) { + drawGraph(); + } + populateGraphPosition(); + autoFillChannelSettings(); + // first of all, let's get the chosen data channels and stuff... + var dataChans = getSelectedItem("data"); + var firstCol = "distance"; + dataChans.splice(0,0,firstCol); + dataChans.splice(1,0,"velocity"); + var lineArry = laps.mergeLaps(dataChans); + var headers = lineArry[0]; + var lineArry = lineArry.slice(1); + var lapCols = []; + var firstRow = []; + for (var i = 0; i < headers.indexOf('X'); i++) { + lapCols.push(i); + firstRow.push(headers[i]); + } + var indexCol = headers.length - 1; + lapCols.push(indexCol); + firstRow.push(headers[indexCol]); + var trackArry = arrColumns(lineArry, [headers.indexOf('X'), headers.indexOf('Y') ]); + var distArry = arrColumns(lineArry, lapCols); + var trackHeader = ['latitude' , 'longitude']; + // Draw the track graph! + trk1.drawTrack(laps.master); + // setup the visibility mask for the data graph. + var vismask = []; + for (var i = 0; i < firstRow.length; i++) { + if (i < firstRow.length -2) { + vismask.push(1); + } else { + vismask.push(0); + } + } + initLegend(); // initialize the legend for the current lap/data + g2.updateOptions({ + file: distArry, + labels: firstRow, + strokeWidth: prefs.graph.strokeWidth, + highlightCircleSize: prefs.graph.dotSize, + visibility: vismask, + highlightCallback: function(e, x, pts, rowi) { + var xrange = g2.toDataXCoord(rowi); + rowi+=g2.getLeftBoundary_(); + var series = -1; + var dots = []; +// console.log(pts); + drawLegend(pts); + for (var idx = 0; idx < pts.length; idx++) { + var name = pts[idx].name.split(" "); + if (name[1] === "velocity" && !(isNaN(pts[idx].y))) { +// console.log(name[0], " ",name[1], " is what we want!"); + } +// console.log(pts[idx]); + } +// for (var i = 1; i < (g2.file_[rowi].length - 1); i++) { +// if (g2.file_[rowi][i]) { +// series = i - 1; +// dots[series] = g2.file_[rowi][g2.file_[rowi].length - 1]; +// } +// } + if (g2.file_[rowi][1] !== null) { + dots[0] = g2.file_[rowi][g2.file_[rowi].length - 1]; + } else { + for (var i = rowi; i < g2.file_.length; i++) { + if (g2.file_[i][1] !== null) { + dots[0] = g2.file_[i][g2.file_[i].length - 1]; + break; + } + } + } +// console.log(dots); + trk1.drawDots(dots) + } + }); +} +var xline; + +var drawGraph = function() { + trk1 = new TrackMap(trackDiv, laps.master); + + g2 = new Dygraph(div,[[0,0,0],[1,1,1]], { + labels: ['nolap','nolap','nolap'], +// labelsDiv: "distLabel", +// labelsDivStyles: { +// 'backgroundColor': 'transparent', +// }, +// labelsSeparateLines: true, +// rollPeriod: 4, + showLabelsOnHighlight: false, + interpolatePoints: true, + connectSeparatedPoints: true, + highlightOnHover: false, + hideOverlayOnMouseOut: false, + showRangeSelector: true, + rangeSelectorHeight: 30, + rangeSelectorPlotStrokeColor: "white", + rangeSelectorPlotFillColor: null, + showVerticalCrosshair: true, + crosshairColor: "red", + drawXAxis: false, + drawYAxis: false, + interactionModel : { + 'mousedown' : downV4, + 'mousemove' : moveV4, + 'mouseup' : upV4, +// 'dblclick' : dblClickV4, + }, + axes: { + x: { + valueFormatter: function(ms) { + return 'Distance: ' + ms.toFixed(2) + ' Units'; + } + }, + y: { + valueFormatter: function(y, opts, series) { + var mySeries = series.split(" "); +// console.log(mySeries); +// var dataType = mySeries[1]; + var speed = y; +// console.log("debug: ",prefs.layout[mySeries[1]]); + if (prefs.layout[mySeries[1]]) { +// console.log("using prefs: ",mySeries[1]); + speed = prefs.layout[mySeries[1]].graphToValue(y); + + } + return ' ' + parseFloat(speed).toFixed(2); + } + } + } + + } + ); +} + +function drawLegend (pts) { + + var ptlen = pts.length; + for (var i = 0; i < ptlen; i++) { + var cell = document.getElementById(pts[i].name); + if (cell) { + var name = pts[i].name.split(" "); + cell.innerHTML = Number(prefs.layout[name[1]].graphToValue(pts[i].yval)).toFixed(2); + } + } +} + +function initLegend () { + var table = document.getElementById("legendTable"); + var myLaps = getSelectedItem("lap"); + var myData = getSelectedItem("data"); + myData.splice(0,0,"distance"); + myData.splice(1,0,"velocity"); + table.innerHTML = ""; // nuke the entire table + var tHead = table.createTHead(); + var myRow = tHead.insertRow(-1); + myRow.insertCell(-1); + for (var lap = 0; lap < myLaps.length; lap++) { + var myCell = myRow.insertCell(-1); + myCell.innerHTML = "Lap " + myLaps[lap]; + } + var tBody = document.createElement("tbody"); + table.appendChild(tBody); + + for (var chan = 0; chan < myData.length; chan++) { + var myRow = tBody.insertRow(-1); + var myCell = myRow.insertCell(-1); + myCell.innerHTML = prefs.layout[myData[chan]].name; + for (var lap = 0; lap < myLaps.length; lap++) { + var myCell = myRow.insertCell(-1); + myCell.id = myLaps[lap] + " " + myData[chan]; + } + } + +} + +var v4Active = false; +var v4Canvas = null; + +function downV4 (event, g, context) { + context.initializeMouseDown(event, g, context); + v4Active = true; + moveV4(event, g, context); // in case the mouse went down on a data point. +} + + +function moveV4 (event, g, context) { + if (v4Active) { + var points = g.layout_.points; + if (points === undefined) return; +// var canvasCoords = g.eventToDomCoords(event); +// var canvasx = canvasCoords[0]; +// var canvasy = canvasCoords[1]; + var canvasx = Dygraph.pageX(event) - Dygraph.findPosX(g.graphDiv); + + var selectionChanged = false; + var idx = g.findClosestRow(canvasx); + selectionChanged = g.setSelection(idx); + var callback = g.attr_("highlightCallback"); + if (callback && selectionChanged) { + callback(event, g.lastx_, g.selPoints_, g.lastRow_, g.highlightSet_); + } + } +} + +function upV4(event, g, context) { + if (v4Active) { + v4Active = false; + } +} + +function dblClickV4(event, g, context) { + restorePositioning(g); +} + + + +var arrColumns = function(data, cols) { + var arry = []; + var rarry = []; + for (var row = 0; row < data.length; row++){ + rarry = []; + for (var i = 0; i < cols.length; i++) { + rarry.push(data[row][cols[i]]); + } + arry.push(rarry); + } + return arry; +} + +function mySorting(a,b) { + a = a[0]; + b = b[0]; + return a == b ? 0 : (a < b ? -1 : 1) +} + +function sortByY(a,b) { + a = a[3]; + b = b[3]; + return a == b ? 0 : (a < b ? -1 : 1) +} + +var toArray = function(data) { + var lines = data.split("\n"); + var arry = []; + for (var idx = 0; idx < lines.length; idx++) { + var line = lines[idx]; + // Oftentimes there's a blank line at the end. Ignore it. + if (line.length == 0) { + continue; + } + var row = line.split(","); + // Special processing for every row except the header. + if (idx > 0) { + for (var rowIdx = 0; rowIdx < row.length; rowIdx++) { + // Turn "123" into 123. + row[rowIdx] = parseFloat(row[rowIdx]); + if (isNaN(row[rowIdx])) { + row[rowIdx] = null; + } + } + } + arry.push(row); + } + return arry; +} + +var toArray2 = function(data) { + var lines = data.split("\n"); + var arry = []; + for (var idx = 0; idx < lines.length; idx++) { + var line = lines[idx]; + // Oftentimes there's a blank line at the end. Ignore it. + if (line.length == 0) { + continue; + } + var row = line.split(","); + arry.push(row); + } + return arry; +} + +function getPage(page, callback){ + var req = new XMLHttpRequest(); + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status === 200 || // Normal http + req.status === 0) { // Chrome w/ --allow-file-access-from-files + var data = req.responseText; + callback(data); + } + } + }; + req.open('GET', page , true); + req.send(null); +} + +function popRaces() { + var req = new XMLHttpRequest(); + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status === 200 || // Normal http + req.status === 0) { // Chrome w/ --allow-file-access-from-files + var data = req.responseText; + popRaces_cb(data); + } + } + }; + req.open('GET', 'getdata?table=races', true); + req.send(null); +} + +function popRaces_cb(data) { + + var raceArr = toArray2(data); + var raceSelect = document.getElementById("race"); + + //wipe out the existing options + raceSelect.options.length = 0; + raceSelect.options[raceSelect.options.length] = new Option("Choose One",-1); + for (var idx = 1; idx < raceArr.length; idx++) { + raceSelect.options[raceSelect.options.length] = new Option(raceArr[idx][1]+" - "+raceArr[idx][2]+" - "+raceArr[idx][3]+" laps", raceArr[idx][0]); + } + +} + + + +function popLaps() { + var raceSelect = document.getElementById("race"); + var raceId = raceSelect.options[raceSelect.selectedIndex].value + var req = new XMLHttpRequest(); + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status === 200 || // Normal http + req.status === 0) { // Chrome w/ --allow-file-access-from-files + var data = req.responseText; + popLapsCallback(data); + } + } + }; + req.open('GET', 'getlaps.php?action=getLaps&raceId='+raceId, true); + req.send(null); +} + +function popLapsCallback(data) { + var lapArr = toArray(data); + var lapSelect = document.getElementById("lap"); + var fastLap = lapArr[0][0]; + var fastLapIdx = 0 + var lastLap = lapArr[(lapArr.length - 1)][0]; + for (var idx = 0; idx < lapArr.length; idx++) { + if (lapArr[idx][2] < lapArr[fastLapIdx][2]) { + fastLapIdx = idx; + fastLap = lapArr[fastLapIdx][0] + + } + } + //wipe out the existing options + lapSelect.options.length = 0; + lapSelect.options[lapSelect.options.length] = new Option("FASTEST LAP", fastLap); + lapSelect.options[lapSelect.options.length] = new Option("LAST LAP", lastLap); + lapSelect.options[0].selected = true; + lapSelect.options[1].selected = true; + for (var idx = 0; idx < lapArr.length; idx++) { + lapSelect.options[lapSelect.options.length] = new Option(lapArr[idx][1]+" - "+sec2min(lapArr[idx][2]), lapArr[idx][0]); + } + // draw the graph with the fast/last lap defaulted... + if (!g1) { + graphUpdate(); +// laps.getLap(lastLap); +// laps.getLap(fastLap); + //drawGraph(); +// updateGraph(laps.mergeLaps()); + } +} + +function popData() { + // the data channels available are on a lap-by-lap basis. We don't expect + // it to change around, so we'll only look at the first selected lap + var lapSelect = document.getElementById("lap"); + var lapId = lapSelect.options[lapSelect.selectedIndex].value; + getPage("getdata?table=channels&parentId=" + lapId, popData_cb) +} + +function popData_cb(data){ + var channelArr = toArray2(data); + channelArr = channelArr.slice(1); + var dataSelect = document.getElementById("data"); + var chanTable = document.getElementById("channeltable"); + dataSelect.options.length = 0; + for (var idx = 0; idx < channelArr.length; idx++) { + dataSelect.options[dataSelect.options.length] = new Option(channelArr[idx][1], channelArr[idx][0]); + addChannel(chanTable,channelArr[idx][1],channelArr[idx][0]); + } + +} + +function addChannel(table, chname, chidx) { + if (!prefs.layout.hasOwnProperty(chidx)) { + // create entry in prefs if new + prefs.layout[chidx] = new dataLayout(chname,0,1); + prefs.layout[chidx].enabled = true; + } + if (!prefs.layout[chidx].tRow) { + // create table row if it doesn't already exist + var tRow = table.tBodies[0].insertRow(-1); //adds row at end of table + prefs.layout[chidx].tRow = tRow; + tRow.id = chidx; + var cell = tRow.insertCell(-1); //adds cell at end of row + var checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.id = chidx + " enabled"; + checkbox.checked = prefs.layout[chidx].enabled; + checkbox.onchange = settingChanged; + cell.appendChild(checkbox); + var cellArr = ["position","size","vMin","vMax","name"]; + for (var i = 0; i < cellArr.length; i++) { + var key = cellArr[i]; + var cell = tRow.insertCell(-1); + cell.contentEditable = true; + cell.onblur = settingChanged; + cell.id = chidx + " " + key; + cell.innerHTML = prefs.layout[chidx][key]; + } + } +} + +function settingChanged () { + var id = this.id.split(" "); + var chan = id[0]; + var option = id[1]; + if (this.type == "checkbox") { + var value = this.checked; + } else if (option == "name") { + var value = this.innerHTML; + } else { + var value = parseFloat(this.innerHTML); + var oldvalue = prefs.layout[chan][option]; + } + if (!isNaN(value) || option == "name") { +// console.log("Changing ",oldvalue," to ",value); + prefs.layout[chan][option] = value; + } +} + +function autoFillChannelSettings () { + //we only loop through the first + var dataArr = laps.master.data; + var temp = {}; + for (var x = 0; x < 2; x++) { + for (var lap = 0; lap < dataArr.length; lap++) { + var dataLen = dataArr[lap].length; + for (var i = 0; i < dataLen; i++) { + for (key in prefs.layout) { + if (prefs.layout.hasOwnProperty(key)) { + if (dataArr[lap][i].hasOwnProperty(key) && prefs.layout[key].enabled) { + if (!temp.hasOwnProperty(key)) { + temp[key] = {}; + temp[key].vMin = dataArr[lap][i][key]; + temp[key].vMax = dataArr[lap][i][key]; + } + temp[key].vMin = Math.min(dataArr[lap][i][key], temp[key].vMin); + temp[key].vMax = Math.max(dataArr[lap][i][key], temp[key].vMax); + prefs.layout[key].vMin = temp[key].vMin.toFixed(3); + prefs.layout[key].vMax = temp[key].vMax.toFixed(3); + if (prefs.layout[key].vMin == prefs.layout[key].vMax) { + prefs.layout[key].vMax += 1; + } + } + } + } + } + } + dataArr = laps.master.points; + } + for (key in prefs.layout) { + if (prefs.layout.hasOwnProperty(key)) { + document.getElementById(key+" vMin").innerHTML = prefs.layout[key].vMin; + document.getElementById(key+" vMax").innerHTML = prefs.layout[key].vMax; + } + } +} + +function graphUpdate() { + var lapSelect = document.getElementById("lap"); + var len = lapSelect.length ; + var lapList = []; + var lapListCSV = ""; + for (var i = 0; i < len; i++) { + if (lapSelect[i].selected) { + var thisLap = lapSelect[i].value; + lapList.push(thisLap); + lapListCSV = lapListCSV + "," + thisLap; + } + } + laps.prune(lapList); + for (var i = 0; i < lapList.length; i++){ + if (laps.master.idx.indexOf(lapList[i]) < 0) { + laps.getLap(lapList[i]); + } + } + popData(); +} + +function dataUpdate() { + var dataChans = getSelectedItem("data"); + var lapList = getSelectedItem("lap"); + var channels = ""; + if (dataChans[0]) { + channels = dataChans[0]; + } + for (var i = 1; i< dataChans.length; i++) { + channels = channels + "," + dataChans[i]; + } +// alert(channels); + for (var i = 0; i < lapList.length; i++){ + laps.getData(lapList[i], channels); + + } +} +function graphUpdate_old() { + var lapSelect = document.getElementById("lap"); +// var refLapSelect = document.getElementById("refLap"); +// var raceSelect = document.getElementById("race"); + // let's get a little fancier and use a single listbox... +// var lap = lapSelect.options[lapSelect.selectedIndex].value; +// var refLap = refLapSelect.options[refLapSelect.selectedIndex].value; + var len = lapSelect.length ; + var lap = 0; + var refLap = 0; + for (i = 0; i < len && (lap == 0 || refLap == 0); i++) { + if (lapSelect[i].selected) { + var lap = lapSelect[i].value; + for (i++ ; i < len && (lap == 0 || refLap == 0); i++){ + if (lapSelect[i].selected) { + var refLap = lapSelect[i].value; + } + } + } + } +// var chosen = lap + "\n" + refLap; +// alert(chosen); + if (!refLap) { + refLap = lap; + } + var race = 0; + var req = new XMLHttpRequest(); + req.onreadystatechange = function () { + if (req.readyState == 4) { + if (req.status === 200 || // Normal http + req.status === 0) { // Chrome w/ --allow-file-access-from-files + var data = req.responseText; + updateGraph(data); + } + } + }; + req.open('GET', 'lapdistance.php?lap='+lap+'&refLap='+refLap+'&race='+race+'&allCols=1', true); + req.send(null); +} + +function getSelectedItem(name) { + var selection = document.getElementById(name); + len = selection.length ; + i = 0 ; + chosen = [] ; + + for (i = 0; i < len; i++) { + if (selection[i].selected) { + chosen.push(selection[i].value) ; + } + } +// alert(chosen); + return chosen ; +} + +function sec2min(time) { + var mins = Math.floor(time / 60); + var seconds = time % 60; + return mins + ":" + seconds.toFixed(3); +} + +function createCookie(name,value,days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + } + else var expires = ""; + document.cookie = name+"="+value+expires+"; path=/"; +} + +function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + } + return null; +} + +function eraseCookie(name) { + createCookie(name,"",-1); +} + +function init() { + var chanTable = document.getElementById("channeltable"); + + for (key in prefs.layout) { + if (prefs.layout.hasOwnProperty(key)) { + addChannel(chanTable,prefs.layout[key].name,key); + } + } + var opts = { + lines: 13, // The number of lines to draw + length: 7, // The length of each line + width: 4, // The line thickness + radius: 10, // The radius of the inner circle + corners: 1, // Corner roundness (0..1) + rotate: 0, // The rotation offset + color: '#fff', // #rgb or #rrggbb + speed: 1, // Rounds per second + trail: 60, // Afterglow percentage + shadow: false, // Whether to render a shadow + hwaccel: false, // Whether to use hardware acceleration + className: 'spinner', // The CSS class to assign to the spinner + zIndex: 9000, // The z-index (defaults to 2000000000) + top: 'auto', // Top position relative to parent in px + left: 'auto' // Left position relative to parent in px +}; +var target = document.getElementById('renderArea'); +spinner = new Spinner(opts); + + toggle2('datamenuframe','datamenutab'); + +} diff --git a/PitsideConsole/PitsideConsole/res/pitside.ico b/PitsideConsole/PitsideConsole/res/pitside.ico new file mode 100644 index 0000000000000000000000000000000000000000..2744fc2ae1528972a4075cc73ba406b2d9758add GIT binary patch literal 12158 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 literal 0 HcmV?d00001 diff --git a/PitsideConsole/PitsideConsole/res/splash.bmp b/PitsideConsole/PitsideConsole/res/splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..298eb06e3e048575bf9605e1edd4d480537ee1d1 GIT binary patch literal 360054 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 xJ1 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 bw$>L;S=T4K|NFU*mU|bU$<~(5+nN3^=r3w3 literal 0 HcmV?d00001 diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h new file mode 100644 index 0000000..0d1eb2b --- /dev/null +++ b/PitsideConsole/PitsideConsole/resource.h @@ -0,0 +1,365 @@ +#define IDD_DLGFIRST 1 +#define IDC_LAPS 2 +#define IDC_DISPLAY 3 +#define IDC_DISPLAYTYPE_LINE 4 +#define IDC_DISPLAYTYPE_PLOT 5 +#define IDC_DISPLAYTYPE_RECEPTION 6 +// don't use 5-10, we might want more radiobuttons +#define IDC_DISPLAYTYPE_LAST 10 + +#define IDC_COMMENTTEXT 11 +#define IDC_SETDRIVER 12 +#define ID_OPTIONS_SHOWBESTS 13 +#define ID_OPTIONS_SHOWDRIVERBESTS 14 +#define IDC_SUBDISPLAY 15 +#define IDC_SETREFERENCE 16 +#define IDC_LIVELAPTIME 17 +#define IDC_CURRENTREFERENCE 18 +#define IDC_CURRENTREMOTEIP 19 +#define IDC_CLEARSELECTION 20 +#define IDM_OPTIONS 21 +#define ID_OPTIONS_KMH 22 +#define ID_OPTIONS_MPH 23 +#define ID_OPTIONS_MS 24 +#define IDC_XAXIS 25 +#define IDC_YAXIS 26 +#define IDC_LBLMESSAGE 27 +#define IDC_EDTMESSAGE 28 +#define IDC_LBLTIME 29 +#define IDC_EDTTIME 30 +#define IDC_SENDMESSAGE 31 +#define IDD_DLGMESSAGE 32 +#define IDC_LBLATTEMPTTIME 33 +#define IDC_EDTATTEMPTTIME 34 +#define IDC_MESSAGESTATUS 35 +#define ID_DATA_OPENDB 36 +#define IDC_RACE 37 +#define IDD_SELECTRACE 38 +#define ID_DATA_NEWSESSION 39 +#define ID_HELP_IPS 40 +#define IDC_PROGRESS 41 +#define IDD_PROGRESS 42 +#define ID_OPTIONS_DRAWLINES 43 +#define ID_DATA_DASHWARE 44 +#define IDC_SPLASHIMAGE 45 +#define IDD_DLGSPLASH 46 +#define IDB_SPLASHIMAGE 47 +#define ID_DATA_SWITCHSESSION 48 +#define ID_OPTIONS_IOIO5VSCALE 49 +#define ID_HELP_ABOUT 50 +#define IDD_PRINT 51 +#define ID_FILE_EXIT 52 +#define ID_EDIT_COPY 53 +#define ID_OPTIONS_ELAPSEDTIME 55 +#define ID_OPTIONS_PLOTPREFS 56 +#define IDC_GRAPHYESNO 57 +#define IDC_VALUEYESNO 58 +#define IDD_RACEEDITCONFIRM 59 +#define IDC_LBLMESSAGE3 60 +#define IDD_PLOTPREFS 61 +#define IDC_PLOTOPTIONS 62 +#define IDC_PLOTTYPE_RESCAN 63 +#define ID_OPTIONS_BACKGROUND 64 +#define IDC_LBLMESSAGE2 65 +#define ID_OPTIONS_SHOWREFERENCELAP 66 +#define ID_DATA_EDITSESSION 67 +#define IDD_SELECTRACEEDIT 68 +#define IDC_RACEEDIT_MERGE 69 +#define ID_OPTIONS_SMOOTH 1000 +#define ID_OPTIONS_XAXIS_KM 1001 +#define ID_OPTIONS_XAXIS_LAT 1002 + +#define IDC_PLOTTYPE_GRAPH0 70 +#define IDC_PLOTTYPE_GRAPH1 72 +#define IDC_PLOTTYPE_GRAPH2 74 +#define IDC_PLOTTYPE_GRAPH3 76 +#define IDC_PLOTTYPE_GRAPH4 78 +#define IDC_PLOTTYPE_GRAPH5 80 +#define IDC_PLOTTYPE_GRAPH6 82 +#define IDC_PLOTTYPE_GRAPH7 84 +#define IDC_PLOTTYPE_GRAPH8 86 +#define IDC_PLOTTYPE_GRAPH9 88 +#define IDC_PLOTTYPE_GRAPH10 90 +#define IDC_PLOTTYPE_GRAPH11 92 +#define IDC_PLOTTYPE_GRAPH12 94 +#define IDC_PLOTTYPE_GRAPH13 96 +#define IDC_PLOTTYPE_GRAPH14 98 +#define IDC_PLOTTYPE_GRAPH15 100 +#define IDC_PLOTTYPE_GRAPH16 102 +#define IDC_PLOTTYPE_GRAPH17 104 +#define IDC_PLOTTYPE_GRAPH18 106 +#define IDC_PLOTTYPE_GRAPH19 108 +#define IDC_PLOTTYPE_GRAPH20 110 + +#define IDC_PLOTTYPE_VALUE0 71 +#define IDC_PLOTTYPE_VALUE1 73 +#define IDC_PLOTTYPE_VALUE2 75 +#define IDC_PLOTTYPE_VALUE3 77 +#define IDC_PLOTTYPE_VALUE4 79 +#define IDC_PLOTTYPE_VALUE5 81 +#define IDC_PLOTTYPE_VALUE6 83 +#define IDC_PLOTTYPE_VALUE7 85 +#define IDC_PLOTTYPE_VALUE8 87 +#define IDC_PLOTTYPE_VALUE9 89 +#define IDC_PLOTTYPE_VALUE10 91 +#define IDC_PLOTTYPE_VALUE11 93 +#define IDC_PLOTTYPE_VALUE12 95 +#define IDC_PLOTTYPE_VALUE13 97 +#define IDC_PLOTTYPE_VALUE14 99 +#define IDC_PLOTTYPE_VALUE15 101 +#define IDC_PLOTTYPE_VALUE16 103 +#define IDC_PLOTTYPE_VALUE17 105 +#define IDC_PLOTTYPE_VALUE18 107 +#define IDC_PLOTTYPE_VALUE19 109 +#define IDC_PLOTTYPE_VALUE20 111 + +#define IDC_PLOTTYPE_LOWLIMIT0 130 +#define IDC_PLOTTYPE_LOWLIMIT1 131 +#define IDC_PLOTTYPE_LOWLIMIT2 132 +#define IDC_PLOTTYPE_LOWLIMIT3 133 +#define IDC_PLOTTYPE_LOWLIMIT4 134 +#define IDC_PLOTTYPE_LOWLIMIT5 135 +#define IDC_PLOTTYPE_LOWLIMIT6 136 +#define IDC_PLOTTYPE_LOWLIMIT7 137 +#define IDC_PLOTTYPE_LOWLIMIT8 138 +#define IDC_PLOTTYPE_LOWLIMIT9 139 +#define IDC_PLOTTYPE_LOWLIMIT10 140 +#define IDC_PLOTTYPE_LOWLIMIT11 141 +#define IDC_PLOTTYPE_LOWLIMIT12 142 +#define IDC_PLOTTYPE_LOWLIMIT13 143 +#define IDC_PLOTTYPE_LOWLIMIT14 144 +#define IDC_PLOTTYPE_LOWLIMIT15 145 +#define IDC_PLOTTYPE_LOWLIMIT16 146 +#define IDC_PLOTTYPE_LOWLIMIT17 147 +#define IDC_PLOTTYPE_LOWLIMIT18 148 +#define IDC_PLOTTYPE_LOWLIMIT19 149 +#define IDC_PLOTTYPE_LOWLIMIT20 150 + +#define IDC_PLOTTYPE_HIGHLIMIT0 160 +#define IDC_PLOTTYPE_HIGHLIMIT1 161 +#define IDC_PLOTTYPE_HIGHLIMIT2 162 +#define IDC_PLOTTYPE_HIGHLIMIT3 163 +#define IDC_PLOTTYPE_HIGHLIMIT4 164 +#define IDC_PLOTTYPE_HIGHLIMIT5 165 +#define IDC_PLOTTYPE_HIGHLIMIT6 166 +#define IDC_PLOTTYPE_HIGHLIMIT7 167 +#define IDC_PLOTTYPE_HIGHLIMIT8 168 +#define IDC_PLOTTYPE_HIGHLIMIT9 169 +#define IDC_PLOTTYPE_HIGHLIMIT10 170 +#define IDC_PLOTTYPE_HIGHLIMIT11 171 +#define IDC_PLOTTYPE_HIGHLIMIT12 172 +#define IDC_PLOTTYPE_HIGHLIMIT13 173 +#define IDC_PLOTTYPE_HIGHLIMIT14 174 +#define IDC_PLOTTYPE_HIGHLIMIT15 175 +#define IDC_PLOTTYPE_HIGHLIMIT16 176 +#define IDC_PLOTTYPE_HIGHLIMIT17 177 +#define IDC_PLOTTYPE_HIGHLIMIT18 178 +#define IDC_PLOTTYPE_HIGHLIMIT19 179 +#define IDC_PLOTTYPE_HIGHLIMIT20 180 + +#define IDC_PLOTTYPE_CHANNEL0 190 +#define IDC_PLOTTYPE_CHANNEL1 191 +#define IDC_PLOTTYPE_CHANNEL2 192 +#define IDC_PLOTTYPE_CHANNEL3 193 +#define IDC_PLOTTYPE_CHANNEL4 194 +#define IDC_PLOTTYPE_CHANNEL5 195 +#define IDC_PLOTTYPE_CHANNEL6 196 +#define IDC_PLOTTYPE_CHANNEL7 197 +#define IDC_PLOTTYPE_CHANNEL8 198 +#define IDC_PLOTTYPE_CHANNEL9 199 +#define IDC_PLOTTYPE_CHANNEL10 200 +#define IDC_PLOTTYPE_CHANNEL11 201 +#define IDC_PLOTTYPE_CHANNEL12 202 +#define IDC_PLOTTYPE_CHANNEL13 203 +#define IDC_PLOTTYPE_CHANNEL14 204 +#define IDC_PLOTTYPE_CHANNEL15 205 +#define IDC_PLOTTYPE_CHANNEL16 206 +#define IDC_PLOTTYPE_CHANNEL17 207 +#define IDC_PLOTTYPE_CHANNEL18 208 +#define IDC_PLOTTYPE_CHANNEL19 209 +#define IDC_PLOTTYPE_CHANNEL20 210 + +#define IDC_PLOTTYPE_FILTERYESNO0 220 +#define IDC_PLOTTYPE_FILTERYESNO1 221 +#define IDC_PLOTTYPE_FILTERYESNO2 222 +#define IDC_PLOTTYPE_FILTERYESNO3 223 +#define IDC_PLOTTYPE_FILTERYESNO4 224 +#define IDC_PLOTTYPE_FILTERYESNO5 225 +#define IDC_PLOTTYPE_FILTERYESNO6 226 +#define IDC_PLOTTYPE_FILTERYESNO7 227 +#define IDC_PLOTTYPE_FILTERYESNO8 228 +#define IDC_PLOTTYPE_FILTERYESNO9 229 +#define IDC_PLOTTYPE_FILTERYESNO10 230 +#define IDC_PLOTTYPE_FILTERYESNO11 231 +#define IDC_PLOTTYPE_FILTERYESNO12 232 +#define IDC_PLOTTYPE_FILTERYESNO13 233 +#define IDC_PLOTTYPE_FILTERYESNO14 234 +#define IDC_PLOTTYPE_FILTERYESNO15 235 +#define IDC_PLOTTYPE_FILTERYESNO16 236 +#define IDC_PLOTTYPE_FILTERYESNO17 237 +#define IDC_PLOTTYPE_FILTERYESNO18 238 +#define IDC_PLOTTYPE_FILTERYESNO19 239 +#define IDC_PLOTTYPE_FILTERYESNO20 240 + +#define IDC_PLOTTYPE_HEADERS 249 +#define IDC_VALUE_CHANNEL0 250 +#define IDC_VALUE_CHANNEL1 251 +#define IDC_VALUE_CHANNEL2 252 +#define IDC_VALUE_CHANNEL3 253 +#define IDC_VALUE_CHANNEL4 254 +#define IDC_VALUE_CHANNEL5 255 +#define IDC_VALUE_CHANNEL6 256 +#define IDC_VALUE_CHANNEL7 257 +#define IDC_VALUE_CHANNEL8 258 +#define IDC_VALUE_CHANNEL9 259 +#define IDC_VALUE_CHANNEL10 260 + +#define IDC_RACEEDIT_RENAME 280 +#define IDC_EDTMESSAGE2 281 +#define IDC_LBLMESSAGE4 282 +#define IDD_RACENAMECHANGE 283 +#define ID_HELP_SHOWHELP 284 +#define ID_HELP_SHOWWFLHELP 285 + +#define IDC_RACE_PROGRESS 293 +#define IDD_RACE_RERUN 294 +#define IDC_RACE_START 295 +#define IDC_RACE_START_TEXT 296 +#define IDC_RACE_END 297 +#define IDC_RACE_END_TEXT 298 +#define IDC_RACE_RERUN 299 +#define IDC_RACE_INFO 300 +#define IDC_RACE_SAVE 301 +#define IDC_RACE_COMMENT 302 +#define IDC_RACE_TITLE 303 +#define IDC_RACESCORING 304 +#define IDENDRACE 305 +#define IDSTARTRACE 306 +#define IDRESCAN 307 +#define IDC_TIMINGSCORING 308 +#define IDD_TIMINGSCORING 309 +#define IDD_SELECTSESSIONS 310 +#define ID_TIMINGSCORING 311 +#define IDD_ABOUT 312 +#define IDC_LBLMESSAGE5 313 +#define IDC_LBLMESSAGE6 314 + +#define IDD_WARNING 315 +#define IDC_WARNING1 316 +#define IDC_LBLSPLIT1 317 +#define IDC_LBLSPLITMAP 318 +#define ID_OPTIONS_SETSPLITS 319 +#define IDD_SETSPLITPOINTS 320 +#define IDC_SETSPLIT1 321 +#define IDC_SETSPLIT2 322 +#define IDC_SETSPLIT3 323 +#define IDC_SETSPLIT4 324 +#define IDC_SETSPLIT5 325 +#define IDC_SETSPLIT6 326 +#define IDC_SETSPLIT7 327 +#define IDC_SETSPLIT8 328 +#define IDRESET 330 +#define IDM_PRINT_BM 331 +#define IDM_SAVE_BM 332 +#define IDC_TRACTIONCIRCLEMAP 333 +#define ID_OPTIONS_TRACTIONCIRCLE 334 + +#define IDD_SHOWSECTORS 340 +#define IDC_SHOW_SECTORS 341 +#define IDC_SHOW_LAP0 342 +#define IDC_SHOW_LAP1 343 +#define IDC_SHOW_LAP2 344 +#define IDC_SHOW_LAP3 345 +#define IDC_SHOW_LAP4 346 +#define IDC_SHOW_LAP5 347 +#define IDC_SHOW_LAP6 348 + +#define IDC_PLOTTYPE_TRANS_A0 355 +#define IDC_PLOTTYPE_TRANS_A1 356 +#define IDC_PLOTTYPE_TRANS_A2 357 +#define IDC_PLOTTYPE_TRANS_A3 358 +#define IDC_PLOTTYPE_TRANS_A4 359 +#define IDC_PLOTTYPE_TRANS_A5 360 +#define IDC_PLOTTYPE_TRANS_A6 361 +#define IDC_PLOTTYPE_TRANS_A7 362 +#define IDC_PLOTTYPE_TRANS_A8 363 +#define IDC_PLOTTYPE_TRANS_A9 364 +#define IDC_PLOTTYPE_TRANS_A10 365 +#define IDC_PLOTTYPE_TRANS_A11 366 +#define IDC_PLOTTYPE_TRANS_A12 367 +#define IDC_PLOTTYPE_TRANS_A13 368 +#define IDC_PLOTTYPE_TRANS_A14 369 +#define IDC_PLOTTYPE_TRANS_A15 370 +#define IDC_PLOTTYPE_TRANS_A16 371 +#define IDC_PLOTTYPE_TRANS_A17 372 +#define IDC_PLOTTYPE_TRANS_A18 373 +#define IDC_PLOTTYPE_TRANS_A19 374 +#define IDC_PLOTTYPE_TRANS_A20 375 + +#define IDC_PLOTTYPE_TRANS_B0 380 +#define IDC_PLOTTYPE_TRANS_B1 381 +#define IDC_PLOTTYPE_TRANS_B2 382 +#define IDC_PLOTTYPE_TRANS_B3 383 +#define IDC_PLOTTYPE_TRANS_B4 384 +#define IDC_PLOTTYPE_TRANS_B5 385 +#define IDC_PLOTTYPE_TRANS_B6 386 +#define IDC_PLOTTYPE_TRANS_B7 387 +#define IDC_PLOTTYPE_TRANS_B8 388 +#define IDC_PLOTTYPE_TRANS_B9 389 +#define IDC_PLOTTYPE_TRANS_B10 390 +#define IDC_PLOTTYPE_TRANS_B11 391 +#define IDC_PLOTTYPE_TRANS_B12 392 +#define IDC_PLOTTYPE_TRANS_B13 393 +#define IDC_PLOTTYPE_TRANS_B14 394 +#define IDC_PLOTTYPE_TRANS_B15 395 +#define IDC_PLOTTYPE_TRANS_B16 396 +#define IDC_PLOTTYPE_TRANS_B17 397 +#define IDC_PLOTTYPE_TRANS_B18 398 +#define IDC_PLOTTYPE_TRANS_B19 399 +#define IDC_PLOTTYPE_TRANS_B20 400 + +#define IDC_PLOTTYPE_TRANS_C0 410 +#define IDC_PLOTTYPE_TRANS_C1 411 +#define IDC_PLOTTYPE_TRANS_C2 412 +#define IDC_PLOTTYPE_TRANS_C3 413 +#define IDC_PLOTTYPE_TRANS_C4 414 +#define IDC_PLOTTYPE_TRANS_C5 415 +#define IDC_PLOTTYPE_TRANS_C6 416 +#define IDC_PLOTTYPE_TRANS_C7 417 +#define IDC_PLOTTYPE_TRANS_C8 418 +#define IDC_PLOTTYPE_TRANS_C9 419 +#define IDC_PLOTTYPE_TRANS_C10 420 +#define IDC_PLOTTYPE_TRANS_C11 421 +#define IDC_PLOTTYPE_TRANS_C12 422 +#define IDC_PLOTTYPE_TRANS_C13 423 +#define IDC_PLOTTYPE_TRANS_C14 424 +#define IDC_PLOTTYPE_TRANS_C15 425 +#define IDC_PLOTTYPE_TRANS_C16 426 +#define IDC_PLOTTYPE_TRANS_C17 427 +#define IDC_PLOTTYPE_TRANS_C18 428 +#define IDC_PLOTTYPE_TRANS_C19 429 +#define IDC_PLOTTYPE_TRANS_C20 430 + +#define IDC_PLOTTYPE_LOAD 439 +#define IDC_PLOTTYPE_LOAD0 440 +#define IDC_PLOTTYPE_LOAD1 441 +#define IDC_PLOTTYPE_LOAD2 442 +#define IDC_PLOTTYPE_LOAD3 443 +#define IDC_PLOTTYPE_LOAD4 444 +#define IDC_PLOTTYPE_LOAD5 445 +#define IDC_PLOTTYPE_LOAD6 446 +#define IDC_PLOTTYPE_LOAD7 447 +#define IDC_PLOTTYPE_LOAD8 448 +#define IDC_PLOTTYPE_LOAD9 449 +#define IDC_PLOTTYPE_LOAD10 450 +#define IDC_PLOTTYPE_LOAD11 451 +#define IDC_PLOTTYPE_LOAD12 452 +#define IDC_PLOTTYPE_LOAD13 453 +#define IDC_PLOTTYPE_LOAD14 454 +#define IDC_PLOTTYPE_LOAD15 455 +#define IDC_PLOTTYPE_LOAD16 456 +#define IDC_PLOTTYPE_LOAD17 457 +#define IDC_PLOTTYPE_LOAD18 458 +#define IDC_PLOTTYPE_LOAD19 459 +#define IDC_PLOTTYPE_LOAD20 460 +// don't put anything below this diff --git a/PitsideConsole/PitsideConsole/runtests_debug.bat b/PitsideConsole/PitsideConsole/runtests_debug.bat new file mode 100644 index 0000000..9c72568 --- /dev/null +++ b/PitsideConsole/PitsideConsole/runtests_debug.bat @@ -0,0 +1,2 @@ +cd ../debug +pitsideconsole unit \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/runtests_release.bat b/PitsideConsole/PitsideConsole/runtests_release.bat new file mode 100644 index 0000000..58c6a49 --- /dev/null +++ b/PitsideConsole/PitsideConsole/runtests_release.bat @@ -0,0 +1,2 @@ +cd ../release +pitsideconsole unit \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/settings.txt b/PitsideConsole/PitsideConsole/settings.txt new file mode 100644 index 0000000..834034e --- /dev/null +++ b/PitsideConsole/PitsideConsole/settings.txt @@ -0,0 +1,15 @@ +1 +80 +1 +1 +0 +0 +0 +order of settings: +-whether to run the http server (0 = don't. 1 = do) +-http server port (port 80 makes for easiest use. big port numbers like 63938 are less likely to be blocked) +-Velocity Units (0 = KMH, 1 = MPH, 2 = M/S) +-Draw graph points or lines (0 = points, 1 = lines) +-Graph plot color scheme (0 = grey background, 1 = black background) +-Smooth accelerometer channels (0 = no smoothing, 1 = smoothing enabled) +-X-Axis display in Latitudinal degrees, or KM (0 = Latitudinal degrees, 1 = KM) diff --git a/PitsideConsole/PitsideConsole/sorttable.js b/PitsideConsole/PitsideConsole/sorttable.js new file mode 100644 index 0000000..7abb901 --- /dev/null +++ b/PitsideConsole/PitsideConsole/sorttable.js @@ -0,0 +1,495 @@ +/* + SortTable + version 2 + 7th April 2007 + Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/ + + Instructions: + Download this file + Add to your HTML + Add class="sortable" to any table you'd like to make sortable + Click on the headers to sort + + Thanks to many, many people for contributions and suggestions. + Licenced as X11: http://www.kryogenix.org/code/browser/licence.html + This basically means: do what you want with it. +*/ + + +var stIsIE = /*@cc_on!@*/false; + +sorttable = { + init: function() { + // quit if this function has already been called + if (arguments.callee.done) return; + // flag this function so we don't do the same thing twice + arguments.callee.done = true; + // kill the timer + if (_timer) clearInterval(_timer); + + if (!document.createElement || !document.getElementsByTagName) return; + + sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; + + forEach(document.getElementsByTagName('table'), function(table) { + if (table.className.search(/\bsortable\b/) != -1) { + sorttable.makeSortable(table); + } + }); + + }, + + makeSortable: function(table) { + if (table.getElementsByTagName('thead').length == 0) { + // table doesn't have a tHead. Since it should have, create one and + // put the first table row in it. + the = document.createElement('thead'); + the.appendChild(table.rows[0]); + table.insertBefore(the,table.firstChild); + } + // Safari doesn't support table.tHead, sigh + if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0]; + + if (table.tHead.rows.length != 1) return; // can't cope with two header rows + + // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as + // "total" rows, for example). This is B&R, since what you're supposed + // to do is put them in a tfoot. So, if there are sortbottom rows, + // for backwards compatibility, move them to tfoot (creating it if needed). + sortbottomrows = []; + for (var i=0; i5' : ' ▴'; + this.appendChild(sortrevind); + return; + } + if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) { + // if we're already sorted by this column in reverse, just + // re-reverse the table, which is quicker + sorttable.reverse(this.sorttable_tbody); + this.className = this.className.replace('sorttable_sorted_reverse', + 'sorttable_sorted'); + this.removeChild(document.getElementById('sorttable_sortrevind')); + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + this.appendChild(sortfwdind); + return; + } + + // remove sorttable_sorted classes + theadrow = this.parentNode; + forEach(theadrow.childNodes, function(cell) { + if (cell.nodeType == 1) { // an element + cell.className = cell.className.replace('sorttable_sorted_reverse',''); + cell.className = cell.className.replace('sorttable_sorted',''); + } + }); + sortfwdind = document.getElementById('sorttable_sortfwdind'); + if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); } + sortrevind = document.getElementById('sorttable_sortrevind'); + if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); } + + this.className += ' sorttable_sorted'; + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' 6' : ' ▾'; + this.appendChild(sortfwdind); + + // build an array to sort. This is a Schwartzian transform thing, + // i.e., we "decorate" each row with the actual sort key, + // sort based on the sort keys, and then put the rows back in order + // which is a lot faster because you only do getInnerText once per row + row_array = []; + col = this.sorttable_columnindex; + rows = this.sorttable_tbody.rows; + for (var j=0; j 12) { + // definitely dd/mm + return sorttable.sort_ddmm; + } else if (second > 12) { + return sorttable.sort_mmdd; + } else { + // looks like a date, but we can't tell which, so assume + // that it's dd/mm (English imperialism!) and keep looking + sortfn = sorttable.sort_ddmm; + } + } + } + } + return sortfn; + }, + + getInnerText: function(node) { + // gets the text we want to use for sorting for a cell. + // strips leading and trailing whitespace. + // this is *not* a generic getInnerText function; it's special to sorttable. + // for example, you can override the cell text with a customkey attribute. + // it also gets .value for fields. + + if (!node) return ""; + + hasInputs = (typeof node.getElementsByTagName == 'function') && + node.getElementsByTagName('input').length; + + if (node.getAttribute("sorttable_customkey") != null) { + return node.getAttribute("sorttable_customkey"); + } + else if (typeof node.textContent != 'undefined' && !hasInputs) { + return node.textContent.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.innerText != 'undefined' && !hasInputs) { + return node.innerText.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.text != 'undefined' && !hasInputs) { + return node.text.replace(/^\s+|\s+$/g, ''); + } + else { + switch (node.nodeType) { + case 3: + if (node.nodeName.toLowerCase() == 'input') { + return node.value.replace(/^\s+|\s+$/g, ''); + } + case 4: + return node.nodeValue.replace(/^\s+|\s+$/g, ''); + break; + case 1: + case 11: + var innerText = ''; + for (var i = 0; i < node.childNodes.length; i++) { + innerText += sorttable.getInnerText(node.childNodes[i]); + } + return innerText.replace(/^\s+|\s+$/g, ''); + break; + default: + return ''; + } + } + }, + + reverse: function(tbody) { + // reverse the rows in a tbody + newrows = []; + for (var i=0; i=0; i--) { + tbody.appendChild(newrows[i]); + } + delete newrows; + }, + + /* sort functions + each sort function takes two parameters, a and b + you are comparing a[0] and b[0] */ + sort_numeric: function(a,b) { + aa = parseFloat(a[0].replace(/[^0-9.-]/g,'')); + if (isNaN(aa)) aa = 0; + bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); + if (isNaN(bb)) bb = 0; + return aa-bb; + }, + sort_alpha: function(a,b) { + if (a[0]==b[0]) return 0; + if (a[0] 0 ) { + var q = list[i]; list[i] = list[i+1]; list[i+1] = q; + swap = true; + } + } // for + t--; + + if (!swap) break; + + for(var i = t; i > b; --i) { + if ( comp_func(list[i], list[i-1]) < 0 ) { + var q = list[i]; list[i] = list[i-1]; list[i-1] = q; + swap = true; + } + } // for + b++; + + } // while(swap) + } +} + +/* ****************************************************************** + Supporting functions: bundled here to avoid depending on a library + ****************************************************************** */ + +// Dean Edwards/Matthias Miller/John Resig + +/* for Mozilla/Opera9 */ +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", sorttable.init, false); +} + +/* for Internet Explorer */ +/*@cc_on @*/ +/*@if (@_win32) + document.write(" + + + + + + + + + + + +

+
+
Track Map
+
+
+
+
Data Values
+
+
+
+
+
+
+
+
+
+ +
+
Lap Graph
+
+
+
+
+
+
+ Race:
+
+ Laps:
+ + Data Channels:
+ +
+
+
>
>
>
>
+
+ +
+
+
+ + + +
PosSizMinMaxData Channel Name
+ + +
+
+
>
>
>
>
+
+ + + + + + + + \ No newline at end of file diff --git a/WebUI/pitside.min.js b/WebUI/pitside.min.js new file mode 100644 index 0000000..42df13d --- /dev/null +++ b/WebUI/pitside.min.js @@ -0,0 +1,8939 @@ +Date.ext={}; +Date.ext.util={}; +Date.ext.util.xPad=function(c,a,b) +{ + if(typeof(b)=="undefined") + { + b=10 + } + for(; parseInt(c,10)1; b/=10) + { + c=a.toString()+c + } + return c.toString() +}; +Date.prototype.locale="en-GB"; +if(document.getElementsByTagName("html")&&document.getElementsByTagName("html")[0].lang) +{ + Date.prototype.locale=document.getElementsByTagName("html")[0].lang +} +Date.ext.locales={}; +Date.ext.locales.en= +{ + a:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"], + A:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], + b:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"], + B:["January","February","March","April","May","June","July","August","September","October","November","December"], + c:"%a %d %b %Y %T %Z", + p:["AM","PM"], + P:["am","pm"], + x:"%d/%m/%y",X:"%T" +}; +Date.ext.locales["en-US"]=Date.ext.locales.en; Date.ext.locales["en-US"].c="%a %d %b %Y %r %Z"; +Date.ext.locales["en-US"].x="%D"; +Date.ext.locales["en-US"].X="%r"; +Date.ext.locales["en-GB"]=Date.ext.locales.en; +Date.ext.locales["en-AU"]=Date.ext.locales["en-GB"]; +Date.ext.formats= +{ + a:function(a){return Date.ext.locales[a.locale].a[a.getDay()]}, + A:function(a){return Date.ext.locales[a.locale].A[a.getDay()]}, + b:function(a){return Date.ext.locales[a.locale].b[a.getMonth()]}, + B:function(a){return Date.ext.locales[a.locale].B[a.getMonth()]}, + c:"toLocaleString", + C:function(a){return Date.ext.util.xPad(parseInt(a.getFullYear()/100,10),0)}, + d:["getDate","0"], + e:["getDate"," "], + g:function(a){return Date.ext.util.xPad(parseInt(Date.ext.util.G(a)/100,10),0)}, + G:function(a) + { + var e=a.getFullYear(); + var b=parseInt(Date.ext.formats.V(a),10); + var c=parseInt(Date.ext.formats.W(a),10); + if(c>b) + { + e++ + } + else + { + if(c===0&&b>=52) + { + e-- + } + } + return e + }, + H:["getHours","0"], + I:function(a) + { + var b=a.getHours()%12; + return Date.ext.util.xPad(b===0?12:b,0) + }, + j:function(a) + { + var c=a-new Date(""+a.getFullYear()+"/1/1 GMT"); + c+=a.getTimezoneOffset()*60000; + var b=parseInt(c/60000/60/24,10)+1; + return Date.ext.util.xPad(b,0,100) + }, + m:function(a){return Date.ext.util.xPad(a.getMonth()+1,0)}, + M:["getMinutes","0"], + p:function(a){return Date.ext.locales[a.locale].p[a.getHours()>=12?1:0]}, + P:function(a){return Date.ext.locales[a.locale].P[a.getHours()>=12?1:0]}, + S:["getSeconds","0"], + u:function(a) + { + var b=a.getDay(); + return b===0?7:b + }, + U:function(a) + { + var b=parseInt(Date.ext.formats.j(a),10); + var c=6-a.getDay(); + var e=parseInt((b+c)/7,10); + return Date.ext.util.xPad(e,0) + }, + V:function(a) + { + var e=parseInt(Date.ext.formats.W(a),10); + var b=(new Date(""+a.getFullYear()+"/1/1")).getDay(); + var c=e+(b>4||b<=1?0:1); + if(c==53&&(new Date(""+a.getFullYear()+"/12/31")).getDay()<4) + { + c=1 + } + else + { + if(c===0) + { + c=Date.ext.formats.V(new Date(""+(a.getFullYear()-1)+"/12/31")) + } + } + return Date.ext.util.xPad(c,0) + }, + w:"getDay", + W:function(a) + { + var b=parseInt(Date.ext.formats.j(a),10); + var c=7-Date.ext.formats.u(a); + var e=parseInt((b+c)/7,10); + return Date.ext.util.xPad(e,0,10) + }, + y:function(a) + { + return Date.ext.util.xPad(a.getFullYear()%100,0) + }, + Y:"getFullYear", + z:function(a) + { + var e=a.getTimezoneOffset(); + var b=Date.ext.util.xPad(parseInt(Math.abs(e/60),10),0); + var c=Date.ext.util.xPad(e%60,0); + return(e>0?"-":"+")+b+c + }, + Z:function(a){return a.toString().replace(/^.*\(([^)]+)\)$/,"$1")}, + "%":function(a){return"%"} +}; + +Date.ext.aggregates= +{ + c:"locale", + D:"%m/%d/%y", + h:"%b", + n:"\n", + r:"%I:%M:%S %p", + R:"%H:%M", + t:"\t", + T:"%H:%M:%S", + x:"locale", + X:"locale" +}; +Date.ext.aggregates.z=Date.ext.formats.z(new Date()); +Date.ext.aggregates.Z=Date.ext.formats.Z(new Date()); +Date.ext.unsupported={}; +Date.prototype.strftime=function(b) +{ + if(!(this.locale in Date.ext.locales)) + { + if(this.locale.replace(/-[a-zA-Z]+$/,"") in Date.ext.locales) + { + this.locale=this.locale.replace(/-[a-zA-Z]+$/,"") + } + else + { + this.locale="en-GB" + } + } + var a=this; + while(b.match(/%[cDhnrRtTxXzZ]/)) + { + b=b.replace(/%([cDhnrRtTxXzZ])/g,function(e,g) + { + var d=Date.ext.aggregates[g]; + return(d=="locale"?Date.ext.locales[a.locale][g]:d) + } ) + } + var c=b.replace(/%([aAbBCdegGHIjmMpPSuUVwWyY%])/g,function(e,g) + { + var d=Date.ext.formats[g]; + + + + if(typeof(d)=="string") + { + return a[d]() + } + else + { + if(typeof(d)=="function") + { + return d.call(a,a) + } + else + { + if(typeof(d)=="object"&&typeof(d[0])=="string") + { + return Date.ext.util.xPad(a[d[0]](),d[1]) + } + else + { + return g + } + } + } + } ); + a=null; + return c +}; + +"use strict"; +function RGBColor(d) +{ + this.ok=false; + if(d.charAt(0)=="#") + { + d=d.substr(1,6) + } + d=d.replace(/ /g,""); + d=d.toLowerCase(); + var j= + { + aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32" + }; + for(var f in j) + { + if(d==f) + { + d=j[f] + } + } + var c=[ + { + re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(i) + { + return[parseInt(i[1]),parseInt(i[2]),parseInt(i[3])] + } + }, + { + re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(i) + { + return[parseInt(i[1],16),parseInt(i[2],16),parseInt(i[3],16)] + } + }, + { + re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(i) + { + return[parseInt(i[1]+i[1],16),parseInt(i[2]+i[2],16),parseInt(i[3]+i[3],16)] + } + }]; + for(var e=0; e255)?255:this.r); + this.g=(this.g<0||isNaN(this.g))?0:((this.g>255)?255:this.g); + this.b=(this.b<0||isNaN(this.b))?0:((this.b>255)?255:this.b); + this.toRGB=function() + { + return"rgb("+this.r+", "+this.g+", "+this.b+")" + }; + this.toHex=function() + { + var l=this.r.toString(16); + var k=this.g.toString(16); + var i=this.b.toString(16); + if(l.length==1) + { + l="0"+l + } + if(k.length==1) + { + k="0"+k + } + if(i.length==1) + { + i="0"+i + } + return"#"+l+k+i + } +}; + +function printStackTrace(c) +{ + c=c||{guess:true}; + var a=c.e||null,b=!!c.guess; + var d=new printStackTrace.implementation(),e=d.run(a); + return(b)?d.guessAnonymousFunctions(e):e +} +printStackTrace.implementation=function() +{}; +printStackTrace.implementation.prototype= +{ + run:function(a,b) + { + a=a||this.createException(); + b=b||this.mode(a); + if(b==="other") + { + return this.other(arguments.callee) + } + else + { + return this[b](a) + } + }, + createException:function() + { + try + { + this.undef() + } + catch(a) + { + return a + } + }, + mode:function(a) + { + if(a["arguments"]&&a.stack) + { + return"chrome" + } + else + { + if(typeof a.message==="string"&&typeof window!=="undefined"&&window.opera) + { + if(!a.stacktrace) + { + return"opera9" + } + if(a.message.indexOf("\n")>-1&&a.message.split("\n").length>a.stacktrace.split("\n").length) + { + return"opera9" + } + if(!a.stack) + { + return"opera10a" + } + if(a.stacktrace.indexOf("called from line")<0) + { + return"opera10b" + } + return"opera11" + } + else + { + if(a.stack) + { + return"firefox" + } + } + } + return"other" + }, + instrumentFunction:function(b,c,a) + { + b=b||window; + var e=b[c]; + b[c]=function d() + { + a.call(this,printStackTrace().slice(4)); + return b[c]._instrumented.apply(this,arguments) + }; + b[c]._instrumented=e + }, + deinstrumentFunction:function(a,b) + { + if(a[b].constructor===Function&&a[b]._instrumented&&a[b]._instrumented.constructor===Function) + { + a[b]=a[b]._instrumented + } + }, + chrome:function(a) + { + var b=(a.stack+"\n").replace(/^\S[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^([^\(]+?)([\n$])/gm,"{anonymous}()@$1$2").replace(/^Object.\s*\(([^\)]+)\)/gm,"{anonymous}()@$1").split("\n"); + b.pop(); + return b + }, + firefox:function(a) + { + return a.stack.replace(/(?:\n@:0)?\s+$/m,"").replace(/^\(/gm,"{anonymous}(").split("\n") + }, + opera11:function(b) + { + var a="{anonymous}",g=/^.*line (\d+), column (\d+)(?: in (.+))? in (\S+):$/; + var h=b.stacktrace.split("\n"),l=[]; + for(var d=0,f=h.length; d/,"$1").replace(//,a); + l.push(c+"@"+j+" -- "+h[d+1].replace(/^\s+/,"")) + } + } + return l + }, + opera10b:function(b) + { + var a="{anonymous}",g=/^(.*)@(.+):(\d+)$/; + var h=b.stacktrace.split("\n"),k=[]; + for(var d=0,f=h.length; + d=0) + { + d=d.substr(0,b) + } + if(d) + { + a=d+a; + f=k.exec(a); + if(f&&f[1]) + { + return f[1] + } + f=h.exec(a); + if(f&&f[1]) + { + return f[1] + } + f=j.exec(a); + if(f&&f[1]) + { + return f[1] + } + } + } + return"(?)" + } +}; + + + + +"use strict"; +var DygraphLayout=function(a) +{ + this.dygraph_=a; + this.datasets=[]; + this.setNames=[]; + this.annotations=[]; + this.yAxes_=null; + this.xTicks_=null; + this.yTicks_=null +}; + +DygraphLayout.prototype.attr_=function(a){return this.dygraph_.attr_(a)}; +DygraphLayout.prototype.addDataset=function(b,a){this.datasets.push(a); this.setNames.push(b)}; +DygraphLayout.prototype.getPlotArea=function(){return this.computePlotArea_()}; +DygraphLayout.prototype.computePlotArea_=function() +{ + var a={x:0,y:0}; + if(this.attr_("drawYAxis")) + { + a.x=this.attr_("yAxisLabelWidth")+2*this.attr_("axisTickSize") + } + a.w=this.dygraph_.width_-a.x-this.attr_("rightGap"); + a.h=this.dygraph_.height_; + if(this.attr_("drawXAxis")) + { + if(this.attr_("xAxisHeight")) + { + a.h-=this.attr_("xAxisHeight") + } + else + { + a.h-=this.attr_("axisLabelFontSize")+2*this.attr_("axisTickSize") + } + } + if(this.dygraph_.numAxes()==2) + { + a.w-=(this.attr_("yAxisLabelWidth")+2*this.attr_("axisTickSize")) + } + else + { + if(this.dygraph_.numAxes()>2) + { + this.dygraph_.error("Only two y-axes are supported at this time. (Trying to use "+this.dygraph_.numAxes()+")") + } + } + if(this.attr_("title")) + { + a.h-=this.attr_("titleHeight"); + a.y+=this.attr_("titleHeight") + } + if(this.attr_("xlabel")) + { + a.h-=this.attr_("xLabelHeight") + } + if(this.attr_("ylabel")) + {} + if(this.attr_("y2label")){} + if(this.attr_("showRangeSelector")) + { + a.h-=this.attr_("rangeSelectorHeight")+4 + } + return a +}; + +DygraphLayout.prototype.setAnnotations=function(c) +{ + this.annotations=[]; + var e=this.attr_("xValueParser")||function(a){return a}; + for(var d=0; d1) + { + var e=c[0][0]; + if(!this.minxval||ethis.maxxval) + { + this.maxxval=f + } + } + } + } + this.xrange=this.maxxval-this.minxval; + this.xscale=(this.xrange!==0?1/this.xrange:1); + for(var b=0; b=0)&&(e<=1)) + { + this.xticks.push([e,d]) + } + } + this.yticks=[]; + for(b=0; b=0)&&(e<=1)) + { + this.yticks.push([b,e,d]) + } + } + } +}; + +DygraphLayout.prototype.evaluateWithError=function() +{ + this.evaluate(); + if(!(this.attr_("errorBars")||this.attr_("customBars"))) + { + return + } + var e=0; + for(var h=0; h=0; g--) + { + if(f.childNodes[g].className==c) + { + f.removeChild(f.childNodes[g]) + } + } + var a=document.bgColor; + var e=this.dygraph_.graphDiv; + while(e!=document) + { + var b=e.currentStyle.backgroundColor; + if(b&&b!="transparent") + { + a=b; + break + } + e=e.parentNode + } + function d(i) + { + if(i.w===0||i.h===0) + { + return + } + var j=document.createElement("div"); + j.className=c; + j.style.backgroundColor=a; + j.style.position="absolute"; + j.style.left=i.x+"px"; + j.style.top=i.y+"px"; + j.style.width=i.w+"px"; + j.style.height=i.h+"px"; + f.appendChild(j) + } + var h=this.area; + d( {x:0,y:0,w:h.x,h:this.height} ); + d({x:h.x,y:0,w:this.width-h.x,h:h.y}); + d({x:h.x+h.w,y:0,w:this.width-h.x-h.w,h:this.height}); + d({x:h.x,y:h.y+h.h,w:this.width-h.x,h:this.height-h.h-h.y}) +}; + +DygraphCanvasRenderer.prototype._renderAxis=function() +{ + if(!this.attr_("drawXAxis")&&!this.attr_("drawYAxis")) + { + return + } + function h(i) + { + return Math.round(i)+0.5 + } + function g(i) + { + return Math.round(i)-0.5 + } + var e=this.elementContext; + var k,v,w,t,j; + var l={position:"absolute",fontSize:this.attr_("axisLabelFontSize")+"px",zIndex:10,color:this.attr_("axisLabelColor"),width:this.attr_("axisLabelWidth")+"px",lineHeight:"normal",overflow:"hidden"}; + var n=function(A,i,z){var r=document.createElement("div"); + for(var y in l) + { + if(l.hasOwnProperty(y)) + { + r.style[y]=l[y] + } + } + var x=document.createElement("div"); + x.className="dygraph-axis-label dygraph-axis-label-"+i+(z?" dygraph-axis-label-"+z:""); + x.innerHTML=A; + r.appendChild(x); + return r}; + e.save(); + e.strokeStyle=this.attr_("axisLineColor"); + e.lineWidth=this.attr_("axisLineWidth"); + if(this.attr_("drawYAxis")) + { + if(this.layout.yticks&&this.layout.yticks.length>0) + { + var o=this.dygraph_.numAxes(); + for(j=0; jthis.height) + { + k.style.bottom="0px" + } + else + { + k.style.top=u+"px" + } + if(t[0]===0) + { + k.style.left=(this.area.x-this.attr_("yAxisLabelWidth")-this.attr_("axisTickSize"))+"px"; + k.style.textAlign="right" + } + else + { + if(t[0]==1) + { + k.style.left=(this.area.x+this.area.w+this.attr_("axisTickSize"))+"px"; + k.style.textAlign="left" + } + } + k.style.width=this.attr_("yAxisLabelWidth")+"px"; + this.container.appendChild(k); + this.ylabels.push(k) + } + var d=this.ylabels[0]; + var f=this.attr_("axisLabelFontSize"); + var c=parseInt(d.style.top,10)+f; + if(c>this.height-f) + { + d.style.top=(parseInt(d.style.top,10)-f/2)+"px" + } + } + var a; + if(this.attr_("drawAxesAtZero")) + { + var q=this.dygraph_.toPercentXCoord(0); + if(q>1||q<0) + { + q=0 + } + a=h(this.area.x+q*this.area.w) + } + else + { + a=h(this.area.x) + } + e.beginPath(); + e.moveTo(a,g(this.area.y)); + e.lineTo(a,g(this.area.y+this.area.h)); + e.closePath(); + e.stroke(); + if(this.dygraph_.numAxes()==2) + { + e.beginPath(); + e.moveTo(g(this.area.x+this.area.w),g(this.area.y)); + e.lineTo(g(this.area.x+this.area.w),g(this.area.y+this.area.h)); + e.closePath(); + e.stroke() + } + } + if(this.attr_("drawXAxis")) + { + if(this.layout.xticks) + { + for(j=0; jthis.width) + { + m=this.width-this.attr_("xAxisLabelWidth"); + k.style.textAlign="right" + } + if(m<0) + { + m=0; + k.style.textAlign="left" + } + k.style.left=m+"px"; + k.style.width=this.attr_("xAxisLabelWidth")+"px"; + this.container.appendChild(k); + this.xlabels.push(k) + } + } + e.beginPath(); + var b; + if(this.attr_("drawAxesAtZero")) + { + var q=this.dygraph_.toPercentYCoord(0,0); + if(q>1||q<0) + { + q=1 + } + b=g(this.area.y+q*this.area.h) + } + else + { + b=g(this.area.y+this.area.h) + } + e.moveTo(h(this.area.x),b); + e.lineTo(h(this.area.x+this.area.w),b); + e.closePath(); + e.stroke() + } + e.restore() +}; + +DygraphCanvasRenderer.prototype._renderChartLabels=function() +{ + var c,a; + if(this.attr_("title")) + { + c=document.createElement("div"); + c.style.position="absolute"; + c.style.top="0px"; + c.style.left=this.area.x+"px"; + c.style.width=this.area.w+"px"; + c.style.height=this.attr_("titleHeight")+"px"; + c.style.textAlign="center"; + c.style.fontSize=(this.attr_("titleHeight")-8)+"px"; + c.style.fontWeight="bold"; + a=document.createElement("div"); + a.className="dygraph-label dygraph-title"; + a.innerHTML=this.attr_("title"); + c.appendChild(a); + this.container.appendChild(c); + this.chartLabels.title=c + } + if(this.attr_("xlabel")) + { + c=document.createElement("div"); + c.style.position="absolute"; + c.style.bottom=0; + c.style.left=this.area.x+"px"; + c.style.width=this.area.w+"px"; + c.style.height=this.attr_("xLabelHeight")+"px"; + c.style.textAlign="center"; + c.style.fontSize=(this.attr_("xLabelHeight")-2)+"px"; + a=document.createElement("div"); + a.className="dygraph-label dygraph-xlabel"; + a.innerHTML=this.attr_("xlabel"); + c.appendChild(a); + this.container.appendChild(c); + this.chartLabels.xlabel=c + } + var d=this; + function b(e,g,h) + { + var f= + { + left:0,top:d.area.y,width:d.attr_("yLabelWidth"),height:d.area.h + }; + c=document.createElement("div"); + c.style.position="absolute"; + if(e==1) + { + c.style.left=f.left + } + else + { + c.style.right=f.left + } + c.style.top=f.top+"px"; + c.style.width=f.width+"px"; + c.style.height=f.height+"px"; + c.style.fontSize=(d.attr_("yLabelWidth")-2)+"px"; + var i=document.createElement("div"); + i.style.position="absolute"; + i.style.width=f.height+"px"; + i.style.height=f.width+"px"; + i.style.top=(f.height/2-f.width/2)+"px"; + i.style.left=(f.width/2-f.height/2)+"px"; + i.style.textAlign="center"; + var j="rotate("+(e==1?"-":"")+"90deg)"; + i.style.transform=j; + i.style.WebkitTransform=j; + i.style.MozTransform=j; + i.style.OTransform=j; + i.style.msTransform=j; + if(typeof(document.documentMode)!=="undefined"&&document.documentMode<9) + { + i.style.filter="progid:DXImageTransform.Microsoft.BasicImage(rotation="+(e==1?"3":"1")+")"; + i.style.left="0px"; + i.style.top="0px" + } + a=document.createElement("div"); + a.className=g; + a.innerHTML=h; + i.appendChild(a); + c.appendChild(i); + return c + } + var c; + if(this.attr_("ylabel")) + { + c=b(1,"dygraph-label dygraph-ylabel",this.attr_("ylabel")); + this.container.appendChild(c); + this.chartLabels.ylabel=c + } + if(this.attr_("y2label")&&this.dygraph_.numAxes()==2) + { + c=b(2,"dygraph-label dygraph-y2label",this.attr_("y2label")); + this.container.appendChild(c); + this.chartLabels.y2label=c + } +}; + +DygraphCanvasRenderer.prototype._renderAnnotations=function() +{ + var c={position:"absolute",fontSize:this.attr_("axisLabelFontSize")+"px",zIndex:10,overflow:"hidden"}; + var d=function(i,a,q,r) + { + return function(s) + { + var p=q.annotation; + if(p.hasOwnProperty(i)) + { + p[i](p,q,r.dygraph_,s) + } + else + { + if(r.dygraph_.attr_(a)) + { + r.dygraph_.attr_(a)(p,q,r.dygraph_,s) + } + } + } + }; + var m=this.layout.annotated_points; + for(var h=0; hthis.area.x+this.area.w||l.canvasythis.area.y+this.area.h) + { + continue + } + var b=l.annotation; + var n=6; + if(b.hasOwnProperty("tickHeight")) + { + n=b.tickHeight + } + var f=document.createElement("div"); + for(var k in c) + { + if(c.hasOwnProperty(k)) + { + f.style[k]=c[k] + } + } + if(!b.hasOwnProperty("icon")) + { + f.className="dygraphDefaultAnnotation" + } + if(b.hasOwnProperty("cssClass")) + { + f.className+=" "+b.cssClass + } + var o=b.hasOwnProperty("width")?b.width:16; + var g=b.hasOwnProperty("height")?b.height:16; + if(b.hasOwnProperty("icon")) + { + var j=document.createElement("img"); + j.src=b.icon; + j.width=o; + j.height=g; + f.appendChild(j) + } + else + { + if(l.annotation.hasOwnProperty("shortText")) + { + f.appendChild(document.createTextNode(l.annotation.shortText)) + } + } + f.style.left=(l.canvasx-o/2)+"px"; + if(b.attachAtBottom) + { + f.style.top=(this.area.h-g-n)+"px" + } + else + { + f.style.top=(l.canvasy-g-n)+"px" + } + f.style.width=o+"px"; + f.style.height=g+"px"; + f.title=l.annotation.text; + f.style.color=this.colors[l.name]; + f.style.borderColor=this.colors[l.name]; + b.div=f; + this.dygraph_.addEvent(f,"click",d("clickHandler","annotationClickHandler",l,this)); + this.dygraph_.addEvent(f,"mouseover",d("mouseOverHandler","annotationMouseOverHandler",l,this)); + this.dygraph_.addEvent(f,"mouseout",d("mouseOutHandler","annotationMouseOutHandler",l,this)); + this.dygraph_.addEvent(f,"dblclick",d("dblClickHandler","annotationDblClickHandler",l,this)); + this.container.appendChild(f); + this.annotations.push(f); + var e=this.elementContext; + e.strokeStyle=this.colors[l.name]; + e.beginPath(); + if(!b.attachAtBottom) + { + e.moveTo(l.canvasx,l.canvasy); + e.lineTo(l.canvasx,l.canvasy-2-n) + } + else + { + e.moveTo(l.canvasx,this.area.h); + e.lineTo(l.canvasx,this.area.h-2-n) + } + e.closePath(); + e.stroke() + } +}; + +DygraphCanvasRenderer._getIteratorPredicate=function(a) +{ + return a?DygraphCanvasRenderer._predicateThatSkipsEmptyPoints:null +}; + +DygraphCanvasRenderer._predicateThatSkipsEmptyPoints=function(a,b) +{ + return a[b].yval!==null +}; + +DygraphCanvasRenderer.prototype._drawStyledLine=function(b,g,n,a,r,q,e,d,k) +{ + var o=this.attr_("stepPlot"); + var f=this.layout.setPointsOffsets[g]; + var m=this.layout.setPointsLengths[g]; + var j=this.layout.points; + if(!Dygraph.isArrayLike(q)) + { + q=null + } + var c=this.dygraph_.attr_("drawGapEdgePoints",n); + b.save(); + var h=Dygraph.createIterator(j,f,m,DygraphCanvasRenderer._getIteratorPredicate(this.attr_("connectSeparatedPoints"))); + var l; + var p; + if(!q||q.length<=1) + { + p=trivialStrategy(b,a,r) + } + else + { + p=nonTrivialStrategy(this,b,a,r,q) + } + l=this._drawSeries(b,h,r,k,e,c,o,p); + this._drawPointsOnLine(b,l,d,n,a,k); + b.restore() +}; + +var nonTrivialStrategy=function(c,b,a,e,d) +{ + return new function() + { + this.init=function() {}; + this.finish=function(){}; + this.startSegment=function() + { + b.beginPath(); + b.strokeStyle=a; + b.lineWidth=e + }; + this.endSegment=function() + { + b.stroke() + }; + this.drawLine=function(f,h,g,i) + {c._dashedLine(b,f,h,g,i,d)}; + this.skipPixel=function(h,i,f,g) + { + return(Math.round(h)==Math.round(f)&&Math.round(i)==Math.round(g)) + } + } +}; + +var trivialStrategy=function(b,a,c) +{ + return new function() + { + this.init=function() + { + b.beginPath(); + b.strokeStyle=a; + b.lineWidth=c + }; + this.finish=function() {b.stroke()}; + this.startSegment=function(){}; + this.endSegment=function(){}; + this.drawLine=function(d,f,e,g) + { + b.moveTo(d,f); b.lineTo(e,g) + }; + this.skipPixel=function(){return false} + } +}; + +DygraphCanvasRenderer.prototype._drawPointsOnLine=function(c,g,d,h,b,f) +{ + for(var e=0; e=0; m--) + { + z=A[m]; + d=this.colors[z]; + a=this.dygraph_.axisPropertiesForSeries(z); + var b=1+a.minyval*a.yscale; + if(b<0) + { + b=0 + } + else + { + if(b>1) + { + b=1 + } + } + b=this.area.h*b+this.area.y; + var l=this.layout.setPointsOffsets[m]; + var y=this.layout.setPointsLengths[m]; + var n=Dygraph.createIterator(r,l,y,DygraphCanvasRenderer._getIteratorPredicate(this.attr_("connectSeparatedPoints"))); + t=NaN; + v=[-1,-1]; + D=a.yscale; + w=new RGBColor(d); + g="rgba("+w.r+","+w.g+","+w.b+","+j+")"; + e.fillStyle=g; + e.beginPath(); + while(n.hasNext) + { + q=n.next(); + if(q.name==z) + { + if(!Dygraph.isOK(q.y)) + { + t=NaN; + continue + } + if(B) + { + f=c[q.canvasx]; + var o; + if(f===undefined) + { + o=b + } + else + { + if(C) + { + o=f[0] + } + else + { + o=f + } + } + p=[q.canvasy,o]; + if(C) + { + if(v[0]===-1) + { + c[q.canvasx]=[q.canvasy,b] + } + else + { + c[q.canvasx]=[q.canvasy,v[0]] + } + } + else + { + c[q.canvasx]=q.canvasy + } + } + else + { + p=[q.canvasy,b] + } + if(!isNaN(t)) + { + e.moveTo(t,v[0]); + if(C) + { + e.lineTo(q.canvasx,v[0]); + if(f) + { + e.lineTo(q.canvasx,f[1]) + } + else + { + e.lineTo(q.canvasx,p[1]) + } + } + else + { + e.lineTo(q.canvasx,p[0]); + e.lineTo(q.canvasx,p[1]) + } + e.lineTo(t,v[1]); + e.closePath() + } + v=p; + t=q.canvasx + } + } + e.fill() + } + e.restore() + } + } + for(m=0; mi) + { + h=e[f]; + if(this._dashedLineToHistory[1]) + { + i+=this._dashedLineToHistory[1] + } + else + { + i+=h + } + if(i>d) + { + this._dashedLineToHistory=[f,i-d]; + i=d + } + else + { + this._dashedLineToHistory=[(f+1)%e.length,0] + } + if(f%2===0) + { + a.lineTo(i,0) + } + else + { + a.moveTo(i,0) + } + f=(f+1)%e.length + } + a.restore() +}; + +"use strict"; +var Dygraph=function(b,a,d,c) +{ + if(c!==undefined) + { + this.warn("Using deprecated four-argument dygraph constructor"); + this.__old_init__(b,a,d,c) + } + else + { + this.__init__(b,a,d) + } +}; + +Dygraph.NAME="Dygraph"; +Dygraph.VERSION="1.2"; + +Dygraph.__repr__=function() +{ + return"["+this.NAME+" "+this.VERSION+"]" +}; + +Dygraph.toString=function() +{ + return this.__repr__() +}; + +Dygraph.DEFAULT_ROLL_PERIOD=1; +Dygraph.DEFAULT_WIDTH=480; +Dygraph.DEFAULT_HEIGHT=320; +Dygraph.ANIMATION_STEPS=10; +Dygraph.ANIMATION_DURATION=200; + +Dygraph.numberValueFormatter=function(h,d,e,b) +{ + var f=d("sigFigs"); + if(f!==null) + { + return Dygraph.floatFormat(h,f) + } + var a=d("digitsAfterDecimal"); + var c=d("maxNumberWidth"); + if(h!==0&&(Math.abs(h)>=Math.pow(10,c)||Math.abs(h)=Dygraph.DECADAL) + { + return a.strftime("%Y") + } + else + { + if(c>=Dygraph.MONTHLY) + { + return a.strftime("%b %y") + } + else + { + var b=a.getHours()*3600+a.getMinutes()*60+a.getSeconds()+a.getMilliseconds(); + if(b===0||c>=Dygraph.DAILY) + { + return new Date(a.getTime()+3600*1000).strftime("%d%b") + } + else + { + return Dygraph.hmsString_(a.getTime()) + } + } + } +}; + +Dygraph.DEFAULT_ATTRS= +{ + highlightCircleSize:3, + highlightSeriesOpts:null, + highlightOnHover:true, + highlightSeriesBackgroundAlpha:0.5, + labelsDivWidth:250, + labelsDivStyles:{}, + labelsSeparateLines:false, + labelsShowZeroValues:true, + labelsKMB:false, + labelsKMG2:false, + showLabelsOnHighlight:true, + digitsAfterDecimal:2, + maxNumberWidth:6, + sigFigs:null, + strokeWidth:1, + strokeBorderWidth:0, + strokeBorderColor:"white", + axisTickSize:3, + axisLabelFontSize:14, + xAxisLabelWidth:50, + yAxisLabelWidth:50, + rightGap:5, + showRoller:false, + xValueParser:Dygraph.dateParser, + delimiter:",", + sigma:2, + errorBars:false, + fractions:false, + wilsonInterval:true, + customBars:false, + fillGraph:false, + fillAlpha:0.15, + connectSeparatedPoints:false, + stackedGraph:false, + hideOverlayOnMouseOut:true, + legend:"onmouseover", + stepPlot:false, + avoidMinZero:false, + drawAxesAtZero:false, + titleHeight:28, + xLabelHeight:18, + yLabelWidth:18, + drawXAxis:true, + drawYAxis:true, + axisLineColor:"black", + axisLineWidth:0.3, + gridLineWidth:0.3, + axisLabelColor:"black", + axisLabelFont:"Arial", + axisLabelWidth:50, + drawYGrid:true, + drawXGrid:true, + gridLineColor:"rgb(128,128,128)", + interactionModel:null, + animatedZooms:false, + showRangeSelector:false, + rangeSelectorHeight:40, + rangeSelectorPlotStrokeColor:"#808FAB", + rangeSelectorPlotFillColor:"#A7B1C4", + axes: + { + x: + { + pixelsPerLabel:60, + axisLabelFormatter:Dygraph.dateAxisFormatter, + valueFormatter:Dygraph.dateString_, + ticker:null + }, + y: + { + pixelsPerLabel:30, + valueFormatter:Dygraph.numberValueFormatter, + axisLabelFormatter:Dygraph.numberAxisLabelFormatter, + ticker:null + }, + y2: + { + pixelsPerLabel:30, + valueFormatter:Dygraph.numberValueFormatter, + axisLabelFormatter:Dygraph.numberAxisLabelFormatter, + ticker:null + } + } +}; + +Dygraph.HORIZONTAL=1; +Dygraph.VERTICAL=2; +Dygraph.PLUGINS=[]; +Dygraph.addedAnnotationCSS=false; +Dygraph.prototype.__old_init__=function(b,c,e,a) +{ + if(e!==null) + { + var f=["Date"]; + for(var d=0; d=0; + f--) + { + var h=b[f][0]; + var a=b[f][1]; + a.call(h,c); + if(c.propagationStopped) + { + break + } + } + } + return c.defaultPrevented +}; + +Dygraph.prototype.isZoomed=function(a) +{ + if(a==null) + { + return this.zoomed_x_||this.zoomed_y_ + } + if(a==="x") + { + return this.zoomed_x_ + } + if(a==="y") + { + return this.zoomed_y_ + } + throw"axis parameter is ["+a+"] must be null, 'x' or 'y'." +}; + +Dygraph.prototype.toString=function() +{ + var b=this.maindiv_; + var a=(b&&b.id)?b.id:b; + return"[Dygraph "+a+"]" +}; + +Dygraph.prototype.attr_=function(b,d) +{ + var f=[]; + f.push(this.attrs_); + if(this.user_attrs_) + { + f.push(this.user_attrs_); + if(d) + { + if(this.user_attrs_.hasOwnProperty(d)) + { + f.push(this.user_attrs_[d]) + } + if(d===this.highlightSet_&&this.user_attrs_.hasOwnProperty("highlightSeriesOpts")) + { + f.push(this.user_attrs_.highlightSeriesOpts) + } + } + } + var c=null; + for(var a=f.length-1; a>=0; --a) + { + var e=f[a]; + if(e.hasOwnProperty(b)) + { + c=e[b]; + break + } + } + return c +}; + +Dygraph.prototype.getOption=function(a,b) +{ + return this.attr_(a,b) +}; + +Dygraph.prototype.optionsViewForAxis_=function(a) +{ + var b=this; + return function(d) + { + var c=b.user_attrs_.axes; + if(c&&c[a]&&c[a][d]) + { + return c[a][d] + } + if(typeof(b.user_attrs_[d])!="undefined") + { + return b.user_attrs_[d] + } + c=b.attrs_.axes; + if(c&&c[a]&&c[a][d]) + { + return c[a][d] + } + if(a=="y"&&b.axes_[0].hasOwnProperty(d)) + { + return b.axes_[0][d] + } + else + { + if(a=="y2"&&b.axes_[1].hasOwnProperty(d)) + { + return b.axes_[1][d] + } + } + return b.attr_(d) + } +}; + +Dygraph.prototype.rollPeriod=function() +{ + return this.rollPeriod_ +}; +Dygraph.prototype.xAxisRange=function() +{ + return this.dateWindow_?this.dateWindow_:this.xAxisExtremes() +}; + +Dygraph.prototype.xAxisExtremes=function() +{ + var a=this.rawData_[0][0]; + var b=this.rawData_[this.rawData_.length-1][0]; + return[a,b] +}; + +Dygraph.prototype.yAxisRange=function(b) +{ + if(typeof(b)=="undefined") + { + b=0 + } + if(b<0||b>=this.axes_.length) + { + return null + } + var a=this.axes_[b]; + return[a.computedValueRange[0],a.computedValueRange[1]] +}; + +Dygraph.prototype.yAxisRanges=function() +{ + var b=[]; + for(var a=0; + a0) + { + return[this.rawData_[0][0],this.rawData_[this.numRows()-1][0]] + } + else + { + return[0,1] + } +}; + +Dygraph.prototype.getValue=function(b,a) +{ + if(b<0||b>this.rawData_.length) + { + return null + } + if(a<0||a>this.rawData_[b].length) + { + return null + } + return this.rawData_[b][a] +}; + +Dygraph.prototype.createInterface_=function() +{ + var b=this.maindiv_; + this.graphDiv=document.createElement("div"); + this.graphDiv.style.width=this.width_+"px"; + this.graphDiv.style.height=this.height_+"px"; + b.appendChild(this.graphDiv); + this.canvas_=Dygraph.createCanvas(); + this.canvas_.style.position="absolute"; + this.canvas_.width=this.width_; + this.canvas_.height=this.height_; + this.canvas_.style.width=this.width_+"px"; + this.canvas_.style.height=this.height_+"px"; + this.canvas_ctx_=Dygraph.getContext(this.canvas_); + this.hidden_=this.createPlotKitCanvas_(this.canvas_); + this.hidden_ctx_=Dygraph.getContext(this.hidden_); + if(this.attr_("showRangeSelector")) + { + this.rangeSelector_=new DygraphRangeSelector(this) + } + this.graphDiv.appendChild(this.hidden_); + this.graphDiv.appendChild(this.canvas_); + this.mouseEventElement_=this.createMouseEventElement_(); + this.layout_=new DygraphLayout(this); + if(this.rangeSelector_) + { + this.rangeSelector_.addToGraph(this.graphDiv,this.layout_) + } + var a=this; + this.mouseMoveHandler=function(c) + { + a.mouseMove_(c) + }; + this.addEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler); + this.mouseOutHandler=function(c) + { + a.mouseOut_(c) + }; + this.addEvent(this.mouseEventElement_,"mouseout",this.mouseOutHandler); + this.createDragInterface_(); + this.resizeHandler=function(c) + { + a.resize() + }; + this.addEvent(window,"resize",this.resizeHandler) +}; + +Dygraph.prototype.destroy=function() +{ + var d=function(e) + { + while(e.hasChildNodes()) + { + d(e.firstChild); + e.removeChild(e.firstChild) + } + }; + for(var a=0; a=h) + {continue} + var k=m[g+q]; + if(!Dygraph.isValidPoint(k)) + {continue} + var n=k.canvasy; + if(d>k.canvasx&&q+10) + { + var o=(d-k.canvasx)/f; + n+=o*(l.canvasy-k.canvasy) + } + } + } + else + { + if(d0) + { + var j=m[g+q-1]; + if(Dygraph.isValidPoint(j)) + { + var f=k.canvasx-j.canvasx; + if(f>0) + { + var o=(k.canvasx-d)/f; + n+=o*(j.canvasy-k.canvasy) + } + } + } + } + if(s==0||n=0) + { + var l=0; + var k=this.attr_("labels"); + for(j=1; jl) + {l=p} + } + var o=this.previousVerticalX_; + g.clearRect(o-l-1,0,2*l+2,this.height_) + } + } + if(this.isUsingExcanvas_&&this.currentZoomRectArgs_) + { + Dygraph.prototype.drawZoomRect_.apply(this,this.currentZoomRectArgs_) + } + if(this.selPoints_.length>0) + { + var d=this.selPoints_[0].canvasx; + g.save(); + for(j=0; j=0) + { + if(i!=this.lastRow_) + {e=true} + this.lastRow_=i; + for(var l=0; l=0; j--) + { + var m=this.layout_.points[h+j]; + if(m.yval!==null&&m.name===g.name) + { + b=m; + break + } + } + for(var j=i; j=0) + {e=true} + this.lastRow_=-1 + } + if(this.selPoints_.length) + { + this.lastx_=this.selPoints_[0].xval + } + else + { + this.lastx_=-1 + } + if(f!==undefined) + { + if(this.highlightSet_!==f) + {e=true} + this.highlightSet_=f + } + if(e) + { + this.updateSelection_(undefined) + } + return e +}; + +Dygraph.prototype.mouseOut_=function(a) +{ + if(this.attr_("unhighlightCallback")) + { + this.attr_("unhighlightCallback")(a) + } + if(this.attr_("hideOverlayOnMouseOut")) + { + this.clearSelection() + } +}; + +Dygraph.prototype.clearSelection=function() +{ + this.cascadeEvents_("deselect",{}); + if(this.fadeLevel) + { + this.animateSelection_(-1); + return + } + this.canvas_ctx_.clearRect(0,0,this.width_,this.height_); + this.fadeLevel=0; + this.selPoints_=[]; + this.lastx_=-1; + this.lastRow_=-1; + this.highlightSet_=null +}; + +Dygraph.prototype.getSelection=function() +{ + if(!this.selPoints_||this.selPoints_.length<1) + { + return -1 + } + for(var a=0; ah) + { + d=h + } + if(be) + { + e=b + } + if(f===null||de) + { + e=h + } + if(f===null||h=1; n--) + { + if(!this.visibility()[n-1]) + { + continue + } + var w=[]; + for(o=0; o=s&&h===null) + { + h=p + } + if(w[p][0]<=m) + { + r=p + } + } + if(h===null) + { + h=0 + } + if(h>0) + {h--} + if(r===null) + {r=w.length-1} + if(ry[1]) + { + y[1]=d[A] + } + if(d[A]=0; --p) + { + if(!e[p]) + { + continue + } + for(o=0; o=0; n--) + { + if(!e[n]) + { + continue + } + e[n][o][1]=NaN + } + } + } + break + } + } + return[e,g,c] +}; + +Dygraph.prototype.drawGraph_=function() +{ + var j=new Date(); + var f=this.is_initial_draw_; + this.is_initial_draw_=false; + this.layout_.removeAllDatasets(); + this.setColors_(); + this.attrs_.pointSize=0.5*this.attr_("highlightCircleSize"); + var h=this.gatherDatasets_(this.rolledSeries_,this.dateWindow_); + var b=h[0]; + var d=h[1]; + this.boundaryIds_=h[2]; + this.setIndexByName_={}; + var g=this.attr_("labels"); + if(g.length>0) + { + this.setIndexByName_[g[0]]=0 + } + var a=0; + for(var e=1; eb) + {b=a} + } + return 1+b +}; + +Dygraph.prototype.axisPropertiesForSeries=function(a) +{ + return this.axes_[this.seriesToAxisMap_[a]] +}; +Dygraph.prototype.computeYAxisRanges_=function(d) +{ + var v=[],u; + for(u in this.seriesToAxisMap_) + { + if(!this.seriesToAxisMap_.hasOwnProperty(u)) + { + continue + } + var f=this.seriesToAxisMap_[u]; + while(v.length<=f) + { + v.push([]) + } + v[f].push(u) + } + for(var e=0; e0) + { + o=0 + } + if(o==Infinity) + { + o=0 + } + if(m==-Infinity) + {m=1} + var w=m-o; + if(w===0) + {w=m} + var l,n; + if(a.logscale) + { + l=m+0.1*w; n=o + } + else + { + l=m+0.1*w; + n=o-0.1*w; + if(!this.attr_("avoidMinZero")) + { + if(n<0&&o>=0) + {n=0} + if(l>0&&m<=0) + {l=0} + } + if(this.attr_("includeZero")) + { + if(m<0) + {l=0} + if(o>0) + {n=0} + } + } + a.extremeRange=[n,l] + } + if(a.valueWindow) + { + a.computedValueRange=[a.valueWindow[0],a.valueWindow[1]] + } + else + { + if(a.valueRange) + { + a.computedValueRange=[a.valueRange[0],a.valueRange[1]] + } + else + { + a.computedValueRange=a.extremeRange + } + } + var p=this.optionsViewForAxis_("y"+(e?"2":"")); + var y=p("ticker"); + if(e===0||a.independentTicks) + { + a.ticks=y(a.computedValueRange[0],a.computedValueRange[1],this.height_,p,this) + } + else + { + var q=this.axes_[0]; + var s=q.ticks; + var r=q.computedValueRange[1]-q.computedValueRange[0]; + var t=a.computedValueRange[1]-a.computedValueRange[0]; + var x=[]; + for(var h=0; h=0) + { + q-=s[g-x][1][0]; + d-=s[g-x][1][1] + } + var c=s[g][0]; + var C=d?q/d:0; + if(this.attr_("errorBars")) + { + if(this.attr_("wilsonInterval")) + { + if(d) + { + var t=C<0?0:C,o=d; + var u=z*Math.sqrt(t*(1-t)/o+z*z/(4*o*o)); + var e=1+z*z/d; + k=(t+z*z/(2*d)-u)/e; + f=(t+z*z/(2*d)+u)/e; + w[g]=[c,[t*m,(t-k)*m,(f-t)*m]] + } + else + { + w[g]=[c,[0,0,0]] + } + } + else + { + A=d?z*Math.sqrt(C*(1-C)/d):1; + w[g]=[c,[m*C,m*A,m*A]] + } + } + else + { + w[g]=[c,m*C] + } + } + } + else + { + if(this.attr_("customBars")) + { + k=0; + var l=0; + f=0; + var a=0; + for(g=0; g=0) + { + var v=s[g-x]; + if(v[1][1]!==null&&!isNaN(v[1][1])) + { + k-=v[1][0]; + l-=v[1][1]; + f-=v[1][2]; + a-=1 + } + } + if(a) + { + w[g]=[s[g][0],[1*l/a,1*(l-k)/a,1*(f-l)/a]] + } + else + { + w[g]=[s[g][0],[null,null,null]] + } + } + } + else + { + if(!this.attr_("errorBars")) + { + if(x==1) + {return s} + for(g=0; g0&&(c[a-1]!="e"&&c[a-1]!="E"))||c.indexOf("/")>=0||isNaN(parseFloat(c))) + { + b=true + } + else + { + if(c.length==8&&c>"19700101"&&c<"20371231") + { + b=true + } + } + if(b) + { + this.attrs_.xValueParser=Dygraph.dateParser; + this.attrs_.axes.x.valueFormatter=Dygraph.dateString_; + this.attrs_.axes.x.ticker=Dygraph.dateTicker; + this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter + } + else + { + this.attrs_.xValueParser=function(d) + {return parseFloat(d)}; + this.attrs_.axes.x.valueFormatter=function(d) + {return d}; + this.attrs_.axes.x.ticker=Dygraph.numericLinearTicks; + this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter + } +}; + +Dygraph.prototype.parseFloat_=function(e,c,b) +{ + var d=parseFloat(e); + if(!isNaN(d)) + {return d} + if(/^ *$/.test(e)) + {return null} + if(/^ *nan *$/i.test(e)) + {return NaN} + var a="Unable to parse '"+e+"' as a number"; + if(b!==null&&c!==null) + { + a+=" on line "+(1+c)+" ('"+b+"') of CSV." + } + this.error(a); + return null +}; + +Dygraph.prototype.parseCSV_=function(b) +{ + var p=[]; + var n=b.split("\n"); + var s,k; + var d=this.attr_("delimiter"); + if(n[0].indexOf(d)==-1&&n[0].indexOf("\t")>=0) + { + d="\t"}var q=0; + if(!("labels" in this.user_attrs_)) + { + q=1; + this.attrs_.labels=n[0].split(d) + } + var m=0; + var t; + var c=false; + var e=this.attr_("labels").length; + var o=false; + for(var g=q; g0&&f[0]0) + { + j=String.fromCharCode(65+(i-1)%26)+j.toLowerCase(); + i=Math.floor((i-1)/26) + } + return j + }; + var f=g.getNumberOfColumns(); + var u=g.getNumberOfRows(); + var n=g.getColumnType(0); + if(n=="date"||n=="datetime") + { + this.attrs_.xValueParser=Dygraph.dateParser; + this.attrs_.axes.x.valueFormatter=Dygraph.dateString_; + this.attrs_.axes.x.ticker=Dygraph.dateTicker; + this.attrs_.axes.x.axisLabelFormatter=Dygraph.dateAxisFormatter + } + else + { + if(n=="number") + { + this.attrs_.xValueParser=function(i) + { + return parseFloat(i) + }; + this.attrs_.axes.x.valueFormatter=function(i) + { + return i + }; + this.attrs_.axes.x.ticker=Dygraph.numericLinearTicks; + this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter + } + else + { + this.error("only 'date', 'datetime' and 'number' types are supported for column 1 of DataTable input (Got '"+n+"')"); + return null + } + } + var e=[]; + var b={}; + var l=false; + var m,o; + for(m=1; m0&&t[0]0) + { + this.setAnnotations(c,true) + } + }; + +Dygraph.prototype.start_=function() +{ + var b=this.file_; + if(typeof b=="function") + { + b=b() + } + if(Dygraph.isArrayLike(b)) + { + this.rawData_=this.parseArray_(b); + this.predraw_() + } + else + { + if(typeof b=="object"&&typeof b.getColumnRange=="function") + { + this.parseDataTable_(b); + this.predraw_() + } + else + { + if(typeof b=="string") + { + if(b.indexOf("\n")>=0) + { + this.loadedEvent_(b) + } + else + { + var c=new XMLHttpRequest(); + var a=this; + c.onreadystatechange=function() + { + if(c.readyState==4) + { + if(c.status===200||c.status===0) + { + a.loadedEvent_(c.responseText) + } + } + }; + c.open("GET",b,true); + c.send(null) + } + } + else + { + this.error("Unknown data format: "+(typeof b)) + } + } + } +}; + +Dygraph.prototype.updateOptions=function(d,b) +{ + if(typeof(b)=="undefined") + { + b=false + } + var c=d.file; + var a=Dygraph.mapLegacyOptions_(d); + if("rollPeriod" in a) + { + this.rollPeriod_=a.rollPeriod + } + if("dateWindow" in a) + { + this.dateWindow_=a.dateWindow; + if(!("isZoomedIgnoreProgrammaticZoom" in a)) + { + this.zoomed_x_=(a.dateWindow!==null) + } + } + if("valueRange" in a&&!("isZoomedIgnoreProgrammaticZoom" in a)) + { + this.zoomed_y_=(a.valueRange!==null) + } + var e=Dygraph.isPixelChangingOptionList(this.attr_("labels"),a); + Dygraph.updateDeep(this.user_attrs_,a); + if(c) + { + this.file_=c; + if(!b) + { + this.start_() + } + } + else + { + if(!b) + { + if(e) + { + this.predraw_() + } + else + { + this.renderGraph_(false) + } + } + } +}; + +Dygraph.mapLegacyOptions_=function(a) +{ + var d={}; + for(var b in a) + { + if(b=="file") + {continue} + if(a.hasOwnProperty(b)) + { + d[b]=a[b] + } + } + var e=function(f,g,h) + { + if(!d.axes) + { + d.axes={} + } + if(!d.axes[f]) + { + d.axes[f]={} + } + d.axes[f][g]=h}; + var c=function(h,f,g) + { + if(typeof(a[h])!="undefined") + { + e(f,g,a[h]); + delete d[h] + } + }; + c("xValueFormatter","x","valueFormatter"); + c("pixelsPerXLabel","x","pixelsPerLabel"); + c("xAxisLabelFormatter","x","axisLabelFormatter"); + c("xTicker","x","ticker"); + c("yValueFormatter","y","valueFormatter"); + c("pixelsPerYLabel","y","pixelsPerLabel"); + c("yAxisLabelFormatter","y","axisLabelFormatter"); + c("yTicker","y","ticker"); + return d + }; + + Dygraph.prototype.resize=function(d,a) + { + if(this.resize_lock) + {return} + this.resize_lock=true; + if((d===null)!=(a===null)) + { + this.warn("Dygraph.resize() should be called with zero parameters or two non-NULL parameters. Pretending it was zero."); + d=a=null + } + var c=this.width_; + var b=this.height_; + if(d) + { + this.maindiv_.style.width=d+"px"; + this.maindiv_.style.height=a+"px"; + this.width_=d; this.height_=a + } + else + { + this.width_=this.maindiv_.clientWidth; + this.height_=this.maindiv_.clientHeight + } + if(c!=this.width_||b!=this.height_) + { + this.maindiv_.innerHTML=""; + this.roller_=null; + this.attrs_.labelsDiv=null; + this.createInterface_(); + if(this.annotations_.length) + { + this.layout_.setAnnotations(this.annotations_) + } + this.predraw_() + } + this.resize_lock=false + }; + + Dygraph.prototype.adjustRoll=function(a) + { + this.rollPeriod_=a; + this.predraw_() + }; + + Dygraph.prototype.visibility=function() + { + if(!this.attr_("visibility")) + { + this.attrs_.visibility=[] + } + while(this.attr_("visibility").length=c.length) + { + this.warn("invalid series number in setVisibility: "+a) + } + else + { + c[a]=b; this.predraw_() + } + }; + + Dygraph.prototype.size=function() + { + return {width:this.width_,height:this.height_} + }; + + Dygraph.prototype.setAnnotations=function(a,b) + { + Dygraph.addAnnotationRule(); + this.annotations_=a; + this.layout_.setAnnotations(this.annotations_); + if(!b) + { + this.predraw_() + } + }; + + Dygraph.prototype.annotations=function() + { + return this.annotations_ + }; + + Dygraph.prototype.getLabels=function() + { + return this.attr_("labels").slice() + }; + + Dygraph.prototype.indexFromSetName=function(a) + { + return this.setIndexByName_[a] + }; + + Dygraph.prototype.datasetIndexFromSetName_=function(a) + { + return this.datasetIndex_[this.indexFromSetName(a)] + }; + + Dygraph.addAnnotationRule=function() + { + if(Dygraph.addedAnnotationCSS) + {return} + var e="border: 1px solid black; background-color: white; text-align: center; "; + var f=document.createElement("style"); f.type="text/css"; document.getElementsByTagName("head")[0].appendChild(f); + for(var b=0; bd) + { + return -1 + } + if(a===null||a===undefined) + { + a=0 + } + var i=function(j) + { + return j>=0&&jh) + { + if(a>0) + { + e=g-1; + if(i(e)&&b[e]h) + {return g} + } + return Dygraph.binarySearch(h,b,a,g+1,d) + } +}; + +Dygraph.dateParser=function(b) +{ + var c; var a; + if(b.search("-")==-1||b.search("T")!=-1||b.search("Z")!=-1) + { + a=Dygraph.dateStrToMillis(b); + if(a&&!isNaN(a)) + {return a} + } + if(b.search("-")!=-1) + { + c=b.replace("-","/","g"); + while(c.search("-")!=-1) + { + c=c.replace("-","/") + } + a=Dygraph.dateStrToMillis(c) + } + else + { + if(b.length==8) + { + c=b.substr(0,4)+"/"+b.substr(4,2)+"/"+b.substr(6,2); + a=Dygraph.dateStrToMillis(c) + } + else + { + a=Dygraph.dateStrToMillis(b) + } + } + if(!a||isNaN(a)) + { + Dygraph.error("Couldn't parse "+b+" as a date") + } + return a +}; + +Dygraph.dateStrToMillis=function(a) +{ + return new Date(a).getTime() +}; + +Dygraph.update=function(c,b) +{ + if(typeof(b)!="undefined"&&b!==null) + { + for(var a in b) + { + if(b.hasOwnProperty(a)) + { + c[a]=b[a] + } + } + } + return c +}; + +Dygraph.updateDeep=function(d,c) +{ + function a(e) + { + return(typeof Node==="object"?e instanceof Node:typeof e==="object"&&typeof e.nodeType==="number"&&typeof e.nodeName==="string") + } + if(typeof(c)!="undefined"&&c!==null) + { + for(var b in c) + { + if(c.hasOwnProperty(b)) + { + if(c[b]===null) + { + d[b]=null + } + else + { + if(Dygraph.isArrayLike(c[b])) + { + d[b]=c[b].slice() + } + else + { + if(a(c[b])) + { + d[b]=c[b] + } + else + { + if(typeof(c[b])=="object") + { + if(typeof(d[b])!="object"||d[b]===null) + { + d[b]={} + } + Dygraph.updateDeep(d[b],c[b]) + } + else + { + d[b]=c[b] + } + } + } + } + } + } + } + return d +}; + +Dygraph.isArrayLike=function(a) +{ + var b=typeof(a); + if((b!="object"&&!(b=="function"&&typeof(a.item)=="function"))||a===null||typeof(a.length)!="number"||a.nodeType===3) + { + return false + } + return true +}; + +Dygraph.isDateLike=function(a) +{ + if(typeof(a)!="object"||a===null||typeof(a.getTime)!="function") + { + return false + } + return true +}; + +Dygraph.clone=function(b) +{ + var c=[]; + for(var a=0; a=g) + {return} + var h=f+(1+b)*c; + setTimeout(function() + { + b++; + e(b); + if(b>=g-1) + { + a() + } + else + { + d() + } + }, + h-new Date().getTime()) + })() +}; + +Dygraph.isPixelChangingOptionList=function(c,a) +{ + var d= + { + annotationClickHandler:true, + annotationDblClickHandler:true, + annotationMouseOutHandler:true, + annotationMouseOverHandler:true, + axisLabelColor:true, + axisLineColor:true, + axisLineWidth:true, + clickCallback:true, + digitsAfterDecimal:true, + drawCallback:true, + drawHighlightPointCallback:true, + drawPoints:true, + drawPointCallback:true, + drawXGrid:true, + drawYGrid:true, + fillAlpha:true, + gridLineColor:true, + gridLineWidth:true, + hideOverlayOnMouseOut:true, + highlightCallback:true, + highlightCircleSize:true, + interactionModel:true, + isZoomedIgnoreProgrammaticZoom:true, + labelsDiv:true, + labelsDivStyles:true, + labelsDivWidth:true, + labelsKMB:true, + labelsKMG2:true, + labelsSeparateLines:true, + labelsShowZeroValues:true, + legend:true, + maxNumberWidth:true, + panEdgeFraction:true, + pixelsPerYLabel:true, + pointClickCallback:true, + pointSize:true, + rangeSelectorPlotFillColor:true, + rangeSelectorPlotStrokeColor:true, + showLabelsOnHighlight:true, + showRoller:true, + sigFigs:true, + strokeWidth:true, + underlayCallback:true, + unhighlightCallback:true, + xAxisLabelFormatter:true, + xTicker:true, + xValueFormatter:true, + yAxisLabelFormatter:true, + yValueFormatter:true, + zoomCallback:true + }; + var f=false; + var g={}; + if(c) + { + for(var b=1; bd.boundedDates[1]) + { + l=l-(j-d.boundedDates[1]); + j=l+d.dateRange + } + } + f.dateWindow_=[l,j]; + if(d.is2DPan) + { + for(var h=0; h=10&&a.dragDirection==Dygraph.HORIZONTAL) + { + c.doZoomX_(Math.min(a.dragStartX,a.dragEndX),Math.max(a.dragStartX,a.dragEndX)); + a.cancelNextDblclick=true + } + else + { + if(d>=10&&a.dragDirection==Dygraph.VERTICAL) + { + c.doZoomY_(Math.min(a.dragStartY,a.dragEndY),Math.max(a.dragStartY,a.dragEndY)); + a.cancelNextDblclick=true + } + else + { + c.clearZoomRect_() + } + } + a.dragStartX=null; + a.dragStartY=null +}; + +Dygraph.Interaction.startTouch=function(b,c,a) +{ + b.preventDefault(); + var h=[]; + for(var d=0; d90) + { + e=90-e + } + a.touchDirections={x:(e<(90-45/2)),y:(e>45/2)} + } + } + a.initialRange={x:c.xAxisRange(),y:c.yAxisRange()} +}; + +Dygraph.Interaction.moveTouch=function(h,j,d) +{ + var k,q=[]; + for(k=0; ky&&x.clientX=t.canvasRect_.x+t.canvasRect_.w) + { + C=t.canvasRect_.x+t.canvasRect_.w; + A=C-B + } + else + { + A+=x; + C+=x + } + } + var z=t.leftZoomHandle_.width/2; + t.leftZoomHandle_.style.left=(A-z)+"px"; + t.rightZoomHandle_.style.left=(C-z)+"px"; + t.drawInteractiveLayer_(); + if(f) + { + c() + } + return true + }; + n=function(x) + { + if(!i) + { + return false + } + i=false; + Dygraph.removeEvent(u,"mousemove",m); + Dygraph.removeEvent(u,"mouseup",n); + if(!f) + { + c() + } + return true + }; + c=function() + { + try + { + t.isChangingRange_=true; + t.dygraph_.dateWindow_=v(t.getZoomHandleStatus_()); + t.dygraph_.drawGraph_(false) + } + finally + { + t.isChangingRange_=false + } + }; + k=function(y) + { + if(j||i) + { + return + } + var x=h(y)?"move":"default"; + if(x!=t.fgcanvas_.style.cursor) + { + t.fgcanvas_.style.cursor=x + } + }; + r=function(x) + { + if(x.type=="touchstart"&&x.targetTouches.length==1) + { + if(s(x.targetTouches[0])) + { + Dygraph.cancelEvent(x) + } + } + else + { + if(x.type=="touchmove"&&x.targetTouches.length==1) + { + if(p(x.targetTouches[0])) + { + Dygraph.cancelEvent(x) + } + } + else + { + q(x) + } + } + }; + l=function(x) + { + if(x.type=="touchstart"&&x.targetTouches.length==1) + { + if(o(x.targetTouches[0])) + { + Dygraph.cancelEvent(x) + } + } + else + { + if(x.type=="touchmove"&&x.targetTouches.length==1) + { + if(m(x.targetTouches[0])) + { + Dygraph.cancelEvent(x) + } + } + else + { + n(x) + } + } + }; + a=function(x,y) + { + var A=["touchstart","touchend","touchmove","touchcancel"]; + for(var z=0; z1&&c[f][1]!==null) + { + m=typeof c[f][1]!="number"; + if(m){n=[]; + b=[]; + for(h=0; h0)) + { + s=Math.min(s,u); + r=Math.max(r,u) + } + } + var e=0.25; + if(l) + { + r=Dygraph.log10(r); + r+=r*e; + s=Dygraph.log10(s); + for(f=0; fthis.canvasRect_.x||c+1=B/4) + { + for(var o=x; o>=y; o--) + { + var L=Dygraph.PREFERRED_LOG_TICK_VALUES[o]; + var D=Math.log(L/c)/Math.log(e/c)*E; + var I={v:L}; + if(u===null) + { + u={tickValue:L,pixel_coord:D} + } + else + { + if(Math.abs(D-u.pixel_coord)>=F) + { + u={tickValue:L,pixel_coord:D} + } + else + { + I.label="" + } + } + J.push(I) + } + J.reverse() + } + } + if(J.length===0) + { + var s=C("labelsKMG2"); + var z; + if(s) + { + z=[1,2,4,8] + } + else + { + z=[1,2,5] + } + var G,v,l; + for(m=-10; m<50; m++) + { + var f; + if(s) + { + f=Math.pow(16,m) + } + else + { + f=Math.pow(10,m) + } + var H=0; + for(p=0; pF) + {break} + } + if(H>F) + {break} + } + if(v>l) + {G*=-1} + for(m=0; m0) + { + var A=Math.pow(q,r.length); + for(p=r.length-1; p>=0; p--,A/=q) + { + if(d>=A) + { + t=Dygraph.round_(K/A,C("digitsAfterDecimal"))+r[p]; + break + } + } + } + if(C("labelsKMG2")) + { + K=String(K.toExponential()); + if(K.split("e-").length===2&&K.split("e-")[1]>=3&&K.split("e-")[1]<=24) + { + if(K.split("e-")[1]%3>0) + { + t=Dygraph.round_(K.split("e-")[0]/Math.pow(10,(K.split("e-")[1]%3)),C("digitsAfterDecimal")) + } + else + { + t=Number(K.split("e-")[0]).toFixed(2) + } + t+=w[Math.floor(K.split("e-")[1]/3)-1] + } + } + J[m].label=t + } + return J + }; + +Dygraph.dateTicker=function(c,d,h,g,f,i) +{ + var e=Dygraph.pickDateTickGranularity(c,d,h,g); + if(e>=0) + { + return Dygraph.getDateAxis(c,d,e,g,f) + } + else + { + return[] + } +}; + +Dygraph.SECONDLY=0; +Dygraph.TWO_SECONDLY=1; +Dygraph.FIVE_SECONDLY=2; +Dygraph.TEN_SECONDLY=3; +Dygraph.THIRTY_SECONDLY=4; +Dygraph.MINUTELY=5; +Dygraph.TWO_MINUTELY=6; +Dygraph.FIVE_MINUTELY=7; +Dygraph.TEN_MINUTELY=8; +Dygraph.THIRTY_MINUTELY=9; +Dygraph.HOURLY=10; +Dygraph.TWO_HOURLY=11; +Dygraph.SIX_HOURLY=12; +Dygraph.DAILY=13; +Dygraph.WEEKLY=14; +Dygraph.MONTHLY=15; +Dygraph.QUARTERLY=16; +Dygraph.BIANNUAL=17; +Dygraph.ANNUAL=18; +Dygraph.DECADAL=19; +Dygraph.CENTENNIAL=20; +Dygraph.NUM_GRANULARITIES=21; +Dygraph.SHORT_SPACINGS=[]; +Dygraph.SHORT_SPACINGS[Dygraph.SECONDLY]=1000*1; +Dygraph.SHORT_SPACINGS[Dygraph.TWO_SECONDLY]=1000*2; +Dygraph.SHORT_SPACINGS[Dygraph.FIVE_SECONDLY]=1000*5; +Dygraph.SHORT_SPACINGS[Dygraph.TEN_SECONDLY]=1000*10; +Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_SECONDLY]=1000*30; +Dygraph.SHORT_SPACINGS[Dygraph.MINUTELY]=1000*60; +Dygraph.SHORT_SPACINGS[Dygraph.TWO_MINUTELY]=1000*60*2; +Dygraph.SHORT_SPACINGS[Dygraph.FIVE_MINUTELY]=1000*60*5; +Dygraph.SHORT_SPACINGS[Dygraph.TEN_MINUTELY]=1000*60*10; +Dygraph.SHORT_SPACINGS[Dygraph.THIRTY_MINUTELY]=1000*60*30; +Dygraph.SHORT_SPACINGS[Dygraph.HOURLY]=1000*3600; +Dygraph.SHORT_SPACINGS[Dygraph.TWO_HOURLY]=1000*3600*2; +Dygraph.SHORT_SPACINGS[Dygraph.SIX_HOURLY]=1000*3600*6; +Dygraph.SHORT_SPACINGS[Dygraph.DAILY]=1000*86400; +Dygraph.SHORT_SPACINGS[Dygraph.WEEKLY]=1000*604800; +Dygraph.PREFERRED_LOG_TICK_VALUES=function() +{ + var e=[]; + for(var b=-39; b<=39; b++) + { + var c=Math.pow(10,b); + for(var a=1; a<=9; a++) + { + var d=c*a; + e.push(d) + } + } + return e +}(); + +Dygraph.pickDateTickGranularity=function(c,d,h,g) +{ + var j=g("pixelsPerLabel"); + for(var e=0; e=j) + { + return e + } + } + return -1 +}; + +Dygraph.numDateTicks=function(g,a,b) +{ + if(be) + {continue} + v.push({v:u,label:h(new Date(u),l,p,c)}) + } + } + } + return v +}; + +Dygraph.DEFAULT_ATTRS.axes.x.ticker=Dygraph.dateTicker; +Dygraph.DEFAULT_ATTRS.axes.y.ticker=Dygraph.numericTicks; +Dygraph.DEFAULT_ATTRS.axes.y2.ticker=Dygraph.numericTicks; +Dygraph.Plugins={}; +Dygraph.Plugins.Legend=(function() +{ + var d=function() + { + this.legend_div_=null; + this.is_generated_div_=false + }; + d.prototype.toString=function() + {return"Legend Plugin"}; + d.prototype.activate=function(j) + { + var f; + var h=j.getOption("labelsDivWidth"); + var m=j.getOption("labelsDiv"); + if(m&&null!==m) + { + if(typeof(m)=="string"||m instanceof String) + { + f=document.getElementById(m) + } + else + {f=m} + } + else + { + var k={position:"absolute",fontSize:"14px",zIndex:10,width:h+"px",top:"0px",left:(j.size().width-h-2)+"px",background:"white",lineHeight:"normal",textAlign:"left",overflow:"hidden"}; + Dygraph.update(k,j.getOption("labelsDivStyles")); + f=document.createElement("div"); + f.className="dygraph-legend"; + for(var l in k) + { + if(!k.hasOwnProperty(l)) + {continue} + try + { + f.style[l]=k[l] + } + catch(i) + { + this.warn("You are using unsupported css properties for your browser in labelsDivStyles") + } + } + j.graphDiv.appendChild(f); + this.is_generated_div_=true + } + this.legend_div_=f; + return {select:this.select,deselect:this.deselect,predraw:this.predraw,drawChart:this.drawChart} + }; + var a=function(e) + { + var g=document.createElement("span"); + g.setAttribute("style","margin: 0; padding: 0 0 0 1em; border: 0;"); + e.appendChild(g); + var f=g.offsetWidth; + e.removeChild(g); + return f + }; + d.prototype.select=function(f) + { + var j=f.selectedX; + var i=f.selectedPoints; + var h=a(this.legend_div_); + var g=c(f.dygraph,j,i,h); + this.legend_div_.innerHTML=g + }; + d.prototype.deselect=function(f) + { + var h=a(this.legend_div_); + var g=c(f.dygraph,undefined,undefined,h); + this.legend_div_.innerHTML=g + }; + d.prototype.drawChart=function(f) + { + this.deselect(f)}; + d.prototype.predraw=function(g) + { + if(!this.is_generated_div_) + {return} + g.dygraph.graphDiv.appendChild(this.legend_div_); + var f=g.dygraph.plotter_.area; + this.legend_div_.style.left=f.x+f.w-g.dygraph.getOption("labelsDivWidth")-1+"px"; + this.legend_div_.style.top=f.y+"px" + }; + d.prototype.destroy=function(){this.legend_div_=null + }; + var c=function(k,y,s,q) + { + if(k.getOption("showLabelsOnHighlight")!==true) + {return""} + var m,t,n,e,h,w; + var o=k.getLabels(); + if(typeof(y)==="undefined") + { + if(k.getOption("legend")!="always") + {return""} + t=k.getOption("labelsSeparateLines"); + m=""; + for(n=1; n":" ") + } + w=k.getOption("strokePattern",o[n]); h=b(w,u.color,q); m+=""+h+" "+o[n]+"" + } + return m + } + var z=k.optionsViewForAxis_("x"); + var A=z("valueFormatter"); + m=A(y,z,o[0],k); + if(m!=="") + { + m+=":" + } + var C=[]; + var p=k.numAxes(); + for(n=0; n "+r.name+":"+D+"" + } + return m + }; + var b=function(r,e,o) + { + var h=(/MSIE/.test(navigator.userAgent)&&!window.opera); if(h) + { + return"— " + } + if(!r||r.length<=1) + { + return'
' + } + var g,k,p,m; + var s=0,q=0; + var n=[]; + var l; + for(g=0; g<=r.length; g++) + { + s+=r[g%r.length] + } + l=Math.floor(o/(s-r[0])); + if(l>1) + { + for(g=0; g' + } + } + return f + }; + return d + })(); + Dygraph.PLUGINS.push(Dygraph.Plugins.Legend); + var point_=function(a) + { + this.time=null; + this.distance=null; + this.velocity=null; + this.latitde=null; + this.longitude=null; + this.index=null; + for(key in a) + { + this[key]=a[key] + } + }; + var pointsKeyList=["time","distance","velocity","latitude","longitude","index"]; + var arrayOfObjects=Array; + arrayOfObjects.prototype.sortByObj=function(a) + { + return this.sort(objectSort(a)) + }; + function objectSort(a) + { + return function(c,d){return(c[a]d[a])?1:0} + } + function dataLayout(a,c,d,e,b) + { + this.name=a; + if(b===undefined) + { + b=nextAvailablePosition() + } + this.position=b; + this.size=10; + this.pMin=0; + this.pMax=1; + this.vMin=c; + this.vMax=d; + this.suffix=e; + this.enabled=true; + this.valueToGraph=function(h) + { + var g=((+this.pMax)-(+this.pMin))/((+this.vMax)-(+this.vMin)); + var f=(((+h)-(+this.vMin))*(+g))+(+this.pMin); + return f + }, + this.graphToValue=function(h) + { + var g=((+this.vMax)-(+this.vMin))/((+this.pMax)-(+this.pMin)); + var f=(((+h)-(+this.pMin))*(+g))+(+this.vMin); + return f + } + } + var prefs={layout:{},settings:{},graph:{},trackMap:{}}; + function populateGraphPosition() + { + var d=[]; + var a; + for(a in prefs.layout) + { + d.push(prefs.layout[a]); + d[d.length-1].index=a + } + d.sortByObj("position"); + a=d.length; + var b=0; while(a--) + { + if(prefs.layout[d[a].index].enabled) + { + if((ak) + { + b=this.master.points[j][m]; + a=m; + break + } + } + if(d===null||b===null) + { + this.master.data[j].splice(l,1); + l--; + continue + } + var n=b.time-d.time; + if(n===0) + { + this.master.data[j][l].distance=d.distance; + continue + } + var e=b.distance-d.distance; + var p=this.master.data[j][l].time-d.time; + var o=p/n; + var f=e*o; + this.master.data[j][l].distance=d.distance+f + } + } + } + } + console.timeEnd("insertToMaster") + }; +lapData.prototype.removeFromMaster=function(b) +{ + var a=this.master.idx.indexOf(b); + if(a>=0) + { + this.master.idx.splice(b,1); + this.master.points.splice(b,1); + this.master.data.splice(b,1) + } +}; + +lapData.prototype.header=function() +{ + var a=[]; + a.push("Distance"); + for(var b=0; b0) + { + var l={}; + for(var k=1; k=trk1.coords.length) + {dotPos=1} + trk1.drawDots([dotPos]) +}; +(function(r,s,t){function x(b,f){var g=s.createElement(b||"div"),h; + for(h in f) + { + g[h]=f[h] + } + return g +} +function y(d) +{ + for(var e=1,f=arguments.length; e>1):l.left+I)+"px",top:(l.top=="auto"?K.y-J.y+(f.offsetHeight>>1):l.top+I)+"px"})), + n.setAttribute("aria-role","progressbar"),g.lines(n,g.opts); + if(!w) + { + var L=0,M=l.fps,N=M/l.speed,O=(1-l.opacity)/(N*l.trail/100),P=N/l.lines; + !function Q() + { + L++; + for(var b=l.lines; b; b--) + { + var c=Math.max(1-(L+b*P)%N*O,l.opacity); + g.opacity(n,l.lines-b,c,l) + } + g.timeout=g.el&&setTimeout(Q,~~(1000/M)) + }() + } + return g + }, + stop:function() + { + var b=this.el; + return b&&(clearTimeout(this.timeout),b.parentNode&&b.parentNode.removeChild(b),this.el=t),this + }, + lines:function(f,g) + { + function j(b,c) + { + return C(x(),{position:"absolute",width:g.length+g.width+"px",height:g.width+"px",background:b,boxShadow:c,transformOrigin:"left",transform:"rotate("+~~(360/g.lines*h+g.rotate)+"deg) translate("+g.radius+"px,0)",borderRadius:(g.width>>1)+"px"}) + } + var h=0,i; + for(; h',f)}var d=C(x("group"),{behavior:"url(#default#VML)"}); + !B(d,"transform")&&d.adj?(z.addRule(".spin-vml","behavior:url(#default#VML)"),G.prototype.lines=function(a,h) + { + function n() + { + return C(c("group",{coordsize:m+" "+m,coordorigin:-l+" "+-l + }), + {width:m,height:m}) + } + function I(f,i,j) + { + y(p,y(C(n(), + { + rotation:360/h.lines*f+"deg",left:~~i + }), + y(C(c("roundrect",{arcsize:1}),{width:l,height:h.width,left:h.radius,top:-h.width>>1,filter:j}), + c("fill",{color:h.color,opacity:h.opacity}), + c("stroke",{opacity:0})))) + } + var l=h.length+h.width,m=2*l,o=-(h.width+h.length)*2+"px",p=C(n(),{position:"absolute",top:o,left:o}),q; + if(h.shadow) + { + for(q=1; q<=h.lines; q++) + { + I(q,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)") + } + } + for(q=1; q<=h.lines; q++) + { + I(q)}return y(a,p) + }, + G.prototype.opacity=function(f,g,h,i) + { + var j=f.firstChild; + i=i.shadow&&i.lines||0,j&&g+i0) + { + for(var g=0; g + + + + + + + + diff --git a/WifiLapperFull/.gitignore b/WifiLapperFull/.gitignore new file mode 100644 index 0000000..1ec69fa --- /dev/null +++ b/WifiLapperFull/.gitignore @@ -0,0 +1,2 @@ +bin/ +gen/ \ No newline at end of file diff --git a/WifiLapperFull/.project b/WifiLapperFull/.project new file mode 100644 index 0000000..5e88a5d --- /dev/null +++ b/WifiLapperFull/.project @@ -0,0 +1,33 @@ + + + WifilapperFull + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/WifiLapperFull/.settings/org.eclipse.jdt.core.prefs b/WifiLapperFull/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f77b31c --- /dev/null +++ b/WifiLapperFull/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/WifiLapperFull/AndroidManifest.xml b/WifiLapperFull/AndroidManifest.xml new file mode 100644 index 0000000..991db77 --- /dev/null +++ b/WifiLapperFull/AndroidManifest.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WifiLapperFull/proguard.cfg b/WifiLapperFull/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/WifiLapperFull/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/WifiLapperFull/project.properties b/WifiLapperFull/project.properties new file mode 100644 index 0000000..e216117 --- /dev/null +++ b/WifiLapperFull/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 +android.library.reference.1=..\\IOIOLib +android.library=false +android.library.reference.2=../TestApp diff --git a/WifiLapperLite/.classpath b/WifiLapperLite/.classpath new file mode 100644 index 0000000..5e69ff8 --- /dev/null +++ b/WifiLapperLite/.classpath @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/WifiLapperLite/.gitignore b/WifiLapperLite/.gitignore new file mode 100644 index 0000000..1ec69fa --- /dev/null +++ b/WifiLapperLite/.gitignore @@ -0,0 +1,2 @@ +bin/ +gen/ \ No newline at end of file diff --git a/WifiLapperLite/.project b/WifiLapperLite/.project new file mode 100644 index 0000000..26d1ec1 --- /dev/null +++ b/WifiLapperLite/.project @@ -0,0 +1,33 @@ + + + WifilapperLite + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs b/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f77b31c --- /dev/null +++ b/WifiLapperLite/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/WifiLapperLite/AndroidManifest.xml b/WifiLapperLite/AndroidManifest.xml new file mode 100644 index 0000000..712d176 --- /dev/null +++ b/WifiLapperLite/AndroidManifest.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WifiLapperLite/project.properties b/WifiLapperLite/project.properties new file mode 100644 index 0000000..e216117 --- /dev/null +++ b/WifiLapperLite/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 +android.library.reference.1=..\\IOIOLib +android.library=false +android.library.reference.2=../TestApp diff --git a/WifiLapperTablet/.classpath b/WifiLapperTablet/.classpath new file mode 100644 index 0000000..a662f00 --- /dev/null +++ b/WifiLapperTablet/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/WifiLapperTablet/.gitignore b/WifiLapperTablet/.gitignore new file mode 100644 index 0000000..1ec69fa --- /dev/null +++ b/WifiLapperTablet/.gitignore @@ -0,0 +1,2 @@ +bin/ +gen/ \ No newline at end of file diff --git a/WifiLapperTablet/.project b/WifiLapperTablet/.project new file mode 100644 index 0000000..a7c8b10 --- /dev/null +++ b/WifiLapperTablet/.project @@ -0,0 +1,33 @@ + + + WifilapperTablet + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/WifiLapperTablet/.settings/org.eclipse.jdt.core.prefs b/WifiLapperTablet/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..f77b31c --- /dev/null +++ b/WifiLapperTablet/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/WifiLapperTablet/AndroidManifest.xml b/WifiLapperTablet/AndroidManifest.xml new file mode 100644 index 0000000..ca5344c --- /dev/null +++ b/WifiLapperTablet/AndroidManifest.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WifiLapperTablet/proguard.cfg b/WifiLapperTablet/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/WifiLapperTablet/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/WifiLapperTablet/project.properties b/WifiLapperTablet/project.properties new file mode 100644 index 0000000..e216117 --- /dev/null +++ b/WifiLapperTablet/project.properties @@ -0,0 +1,14 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 +android.library.reference.1=..\\IOIOLib +android.library=false +android.library.reference.2=../TestApp diff --git a/compilerSetup.txt b/compilerSetup.txt new file mode 100644 index 0000000..676bb33 --- /dev/null +++ b/compilerSetup.txt @@ -0,0 +1,14 @@ +As of July 9th, 2012... + +-Using eclipse 3.7.2. (M20120208-0800) (others may work, but that's what I use) +-Android SDK version 16.0.1.v201112150204-238534 (others may work, but that's what I use) +-File->switch workspace->(gitroot)\wifilapper\ + Eclipse will restart +-Right-click in the project explorer eclipse window->import...->general->"existing projects" into workspace + select "root directory", set it to (gitroot)\wifilapper\ + this should allow you to import IOIOLib, TestApp (the core WifiLapper code), WifiLapperFull, WifiLapperTablet, and WifiLapperLite +-Go to each project, right-click->properties->java compiler, and set "compiler compliance" to 1.6. +-Go to project->clean to make sure everything rebuilds +-Everything should now build. If not, fight with it, then email an updated copy of this doc to art.hare@gmail.com (or put it in the git branch, if I [Art] ever learn how...) +-To change stuff in WifiLapper, make changes in TestApp +-To run the app, right-click on WifiLapperLite/Full/Tablet, then choose "debug as"->"android application" and it should run on your phone or in the virtual device \ No newline at end of file From a0bf131baa8ca9584efff029ce1fb187c88b3451 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Mon, 2 Feb 2015 23:25:25 -0700 Subject: [PATCH 017/112] 2.003.0033 --- .../PitsideConsole/PitsideConsole.rc | 2 +- .../PitsideConsole/v21_pitsidesource.wflp | Bin 10240 -> 13312 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index c503b66..2d6ed89 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -191,7 +191,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0032\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0033\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END diff --git a/PitsideConsole/PitsideConsole/v21_pitsidesource.wflp b/PitsideConsole/PitsideConsole/v21_pitsidesource.wflp index 3b9df55ef1a3eab9c2008d564eb93a4308b7f042..41335474783ddd5df13b1e5c270929f3b1023e85 100644 GIT binary patch delta 443 zcmZn&Xvml#Ey%{ez`zT{Fu*oZ$5@<=LHCgoD^Q4;`6Ebzm-#pIH|CF%1zBP@UY2KO zVPN27+x(4LNQQ%vjj5DjBg00Z)WT4I4mQO?RYrzPhCGH8hE#?MhGK?7h8!Tj1jvhL zNMtAlvhtDSa;$#XuE?D108E)hwGQD&;e7W>f5DTqME4$hDb~hlPcm$&7)? zjCuWLK^840-KH{jc12ZH##Yr5pfO263sX^y0XYO_1^46wVp6=wA_|k=D}_rZ1D%x% zgsDKMmoO**9Rtz<@<{sResS5!dliNB6@bpq1Bw*_=~SSad>~JO0i-jJAr0)!WU$^e Wper&Nawe};mYjS<+$NCf!2$pbVqEe7 delta 89 zcmZq3Xb6}fEy&8iz`zB>Fu*!d$5@n=LHCgoNQQ~|8%Tna`8V^o$$~8L8!yW Date: Tue, 3 Feb 2015 21:41:31 -0700 Subject: [PATCH 018/112] Smoothed Traction Circle subdisplay, fixed Data Plot highlighting points 1) LapPainter code cleanup 2) Enabled smoothing for Traction Circle subdisplay 3) Finally fixed highlight points for data graphs --- PitsideConsole/PitsideConsole/LapPainter.cpp | 116 +++++++++++------- .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 71 insertions(+), 47 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 19b5114..912c594 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -211,13 +211,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi DATA_CHANNEL eX; eX = DATA_CHANNEL_DISTANCE; - static set i_Smoothed_LapId_X; // Tracker for which laps we have done smoothing on for X, Y, Z Acceleration data - i_Smoothed_LapId_X.begin(); - static set i_Smoothed_LapId_Y; // Tracker for which laps we have done smoothing on for X, Y, Z Acceleration data - i_Smoothed_LapId_Y.begin(); - static set i_Smoothed_LapId_Z; // Tracker for which laps we have done smoothing on for X, Y, Z Acceleration data - i_Smoothed_LapId_Z.begin(); - set setY; map mapMinY, mapMinYTemp; map mapMaxY, mapMaxYTemp; @@ -279,12 +272,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi break; } } - /*if(mapMinYTemp.find(eType) == mapMinYTemp.end()) - { - mapMinYTemp[eType] = min(pChannel->GetMin(),m_pLapSupplier->GetDataHardcodedMin(eType)); - mapMaxYTemp[eType] = max(pChannel->GetMax(),m_pLapSupplier->GetDataHardcodedMax(eType)); - } - else */ { mapMinYTemp[eType] = min(pChannel->GetMin(),mapMinYTemp[eType]); mapMaxYTemp[eType] = max(pChannel->GetMax(),mapMaxYTemp[eType]); @@ -1050,7 +1037,7 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f // now we have the bounds of all the laps we've looked at, so let's draw them glPushMatrix(); glLoadIdentity(); - glScalef(1.0f, 0.90f, 1.0f); // Let's scale it so that graphs don't touch each other. + glScalef(1.0f, 1.0f, 1.0f); // Let's scale it so that graphs don't touch each other. glOrtho(dMinX, dMaxX, mapMinY[*i], mapMaxY[*i], -1.0, 1.0); // Set up the non-zoomed/panned view for the map @@ -1077,14 +1064,6 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f } Vector2D ptHighlight; // the (x,y) coords in unit-space that we want to highlight. Example: for a speed-distance graph, x would be in distance units, y in velocities. - POINT ptMouse; - if(GetMouse(&ptMouse) && m_pLapSupplier->IsHighlightSource(m_iSupplierId)) - { - // The mouse is in our window... we make our own highlighter, ignoring anything that got sent to us - GLdouble dX,dY,dZ; - gluUnProject(ptMouse.x, ptMouse.y, 0, rgModelviewMatrix, rgProjMatrix, rgViewport, &dX, &dY, &dZ); - ptHighlight = V2D(dX,0); - } for(int x = 0; x < lstLaps.size(); x++) { CExtendedLap* pLap = lstLaps[x]; @@ -1094,11 +1073,19 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f if(pDataX && pDataY) { // tracking what we want to highlight + int w = 4; // * Default setting. w is the size of the smoothing window, taken on each side of sample float dBestLength = -1; float dTimeToHighlight = -1; // Changed to non-constant as we want to smooth the data sometimes vector& lstPointsX = (vector&) pDataX->GetData(); vector& lstPointsY = (vector&) pDataY->GetData(); + // If we are dealing with accelerometer data, pull and smooth that data + IDataChannel* pDataX_ACCEL; + IDataChannel* pDataY_ACCEL; + IDataChannel* pDataZ_ACCEL; + pDataX_ACCEL = (IDataChannel*) pLap->GetChannel(DATA_CHANNEL_X_ACCEL); + pDataY_ACCEL = (IDataChannel*) pLap->GetChannel(DATA_CHANNEL_Y_ACCEL); + pDataZ_ACCEL = (IDataChannel*) pLap->GetChannel(DATA_CHANNEL_Z_ACCEL); float r; float g; @@ -1115,10 +1102,64 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f glPointSize(2.0f); glBegin(GL_POINTS); - vector::const_iterator iX = lstPointsX.begin(); - vector::const_iterator iXend = lstPointsX.end(); - vector::const_iterator iY = lstPointsY.begin(); - vector::const_iterator iYend = lstPointsY.end(); + vector lstPointsX_Accel; + lstPointsX_Accel.begin(); + vector lstPointsY_Accel; + lstPointsY_Accel.begin(); + vector lstPointsZ_Accel; + lstPointsZ_Accel.begin(); + if ( eX == DATA_CHANNEL_X_ACCEL && sfLapOpts.bSmoothYesNo == true ) + { + lstPointsX_Accel.clear(); + lstPointsX_Accel = pDataX_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsX_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points + } + if ( pDataY->GetChannelType() == DATA_CHANNEL_Y_ACCEL && sfLapOpts.bSmoothYesNo == true ) + { + lstPointsY_Accel.clear(); + lstPointsY_Accel = pDataY_ACCEL->GetData(); // pDataY->GetData() + w = lstPointsY_Accel.size() / 400; // Sets the BoxAverage smoothing width, based upon the number of data points + } + vector& lstSmoothPts = (vector) pDataX->GetData(); + // Smooth out the accerlometer data for X-Axis before displaying them on the Traction Circle display + if (lstPointsX_Accel.size() ) + { + lstSmoothPts.clear(); + fBoxMovingAvg( lstPointsX_Accel.size(), lstPointsX_Accel, w, lstSmoothPts, false ); + lstPointsX_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set + lstSmoothPts.clear(); + } + if (lstPointsY_Accel.size() ) + { + lstSmoothPts.clear(); + fBoxMovingAvg( lstPointsY_Accel.size(), lstPointsY_Accel, w, lstSmoothPts, false ); + lstPointsY_Accel = lstSmoothPts; // Copy the smoothed data points over to the original data set + lstSmoothPts.clear(); + } + vector::const_iterator iX ; + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) + iX = lstPointsX_Accel.begin(); + else + iX = lstPointsX.begin(); + + vector::const_iterator iXend; + if ( eX == DATA_CHANNEL_X_ACCEL && lstPointsX_Accel.size() && sfLapOpts.bSmoothYesNo == true ) + iXend = lstPointsX_Accel.end(); + else + iXend = lstPointsX.end(); + + vector::const_iterator iY; + if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) + iY = lstPointsY_Accel.begin(); + else + iY = lstPointsY.begin(); + + vector::const_iterator iYend; + if ( *i == DATA_CHANNEL_Y_ACCEL && lstPointsY_Accel.size() && sfLapOpts.bSmoothYesNo == true ) + iYend = lstPointsY_Accel.end(); + else + iYend = lstPointsY.end(); + while(iX != iXend && iY != iYend) { float dX; @@ -1153,27 +1194,10 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f // Can add transformation function here for Y if (sfLapOpts.m_PlotPrefs[y].iTransformYesNo == true) { -// dY = PolynomialFilter(ptY.flValue, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); dY = PolynomialFilter(dY, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); } -// else -// { -// dY = ptY.flValue; -// } ////////////////////////////////////////// glVertex2f(dX,dY); - - // if we're a highlight source, try to figure out the closest point for this lap - if(m_pLapSupplier->IsHighlightSource(m_iSupplierId)) - { - Vector2D vPt = V2D(dX,0); - Vector2D vDiff = vPt - ptHighlight; - if(vDiff.Length() < dBestLength || dBestLength < 0) - { - dBestLength = vDiff.Length(); - dTimeToHighlight = iTimeUsed; - } - } } glEnd(); // for each lap, draw an indicator of the closest thing to the mouse @@ -1188,9 +1212,9 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f glPushMatrix(); // <-- pushes a matrix onto the opengl matrix stack. glLoadIdentity(); // <-- makes it so that the matrix stack just converts all our coordinates directly to window coordinates glOrtho(0, RECT_WIDTH(&rcSpot),0, RECT_HEIGHT(&rcSpot),-1.0,1.0); - /* <-- tells OpenGL that it should show us the part of the openGL "world" that corresponds to - (0...window width, 0 ... window height). This completes the "hey opengl, just draw where we - tell you to plz" part of the function */ +// <-- tells OpenGL that it should show us the part of the openGL "world" that corresponds to +// (0...window width, 0 ... window height). This completes the "hey opengl, just draw where we +// tell you to plz" part of the function for(int x = 0; x < lstMousePointsToDraw.size(); x++) // <-- loops through all the stupid boxes/lines we want to draw { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index c503b66..f37bd41 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -457,7 +457,7 @@ POPUP "&Edit" MENUITEM "Copy", ID_EDIT_COPY MENUITEM "Save Image", IDM_SAVE_BM END -POPUP "&Options" +POPUP "&Graphing" BEGIN MENUITEM "Km/h", ID_OPTIONS_KMH MENUITEM "MPH", ID_OPTIONS_MPH From 4effef4f1f3670619800f2dc1a39b63ecf8714dc Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 3 Feb 2015 21:50:24 -0700 Subject: [PATCH 019/112] Final 2.003.0033 commit --- PitsideConsole/PitsideConsole/PitsideConsole.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 2d6ed89..aff059f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -457,7 +457,7 @@ POPUP "&Edit" MENUITEM "Copy", ID_EDIT_COPY MENUITEM "Save Image", IDM_SAVE_BM END -POPUP "&Options" +POPUP "&Graphing" BEGIN MENUITEM "Km/h", ID_OPTIONS_KMH MENUITEM "MPH", ID_OPTIONS_MPH From b998ba586a7f2d58c5f70e3fe3cb17d35448c57e Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 9 Feb 2015 00:19:53 -0700 Subject: [PATCH 020/112] All Data display working for hard coded data channels --- .../PitsideConsole/DlgTimingScoring.cpp | 9 +- PitsideConsole/PitsideConsole/LapData.h | 3 +- PitsideConsole/PitsideConsole/LapPainter.cpp | 61 +--- PitsideConsole/PitsideConsole/LapPainter.h | 10 +- .../PitsideConsole/PitsideConsole.cpp | 341 +++++++++++++++--- .../PitsideConsole/PitsideConsole.rc | 14 +- PitsideConsole/PitsideConsole/resource.h | 3 + 7 files changed, 326 insertions(+), 115 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index 8974285..40538f2 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -724,6 +724,7 @@ DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) TCHAR szRaceName[300] = {NULL}; TCHAR szComment[300] = {NULL}; TCHAR szLap[300] = {NULL}; + // Load up all of the HL vectors with data from the database while(sfQuery.Next()) { float flLapTime = 0; @@ -768,8 +769,8 @@ DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) std::wstring strRace(lstRaceName[nItem]); result = (LPWSTR)strRace.c_str(); //From TCHAR to DWORD. - DWORD dwSomeNum; - dwSomeNum = wcstod(result, _T('\0')); +// DWORD dwSomeNum; +// dwSomeNum = wcstod(result, _T('\0')); // p_HLlvi.lParam = (LPARAM) dwSomeNum; // Try this for LPARAM p_HLlvi.lParam = nItem; p_HLlvi.pszText = result; @@ -780,7 +781,7 @@ DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) std::wstring strComment(lstComment[nItem]); result = (LPWSTR)strComment.c_str(); //From TCHAR to DWORD. - dwSomeNum = wcstod(result, _T('\0')); +// dwSomeNum = wcstod(result, _T('\0')); // p_HLlvi.lParam = (LPARAM) dwSomeNum; // Try this for LPARAM p_HLlvi.lParam = nItem; p_HLlvi.pszText = result; @@ -792,7 +793,7 @@ DWORD* CDlgTimingScoring::TimingScoringProc(LPVOID pv, HWND hWnd) std::wstring strLapTimes(lstLapTimes[nItem]); result = (LPWSTR)strLapTimes.c_str(); //From TCHAR to DWORD. - dwSomeNum = wcstod(result, _T('\0')); +// dwSomeNum = wcstod(result, _T('\0')); // p_HLlvi.lParam = (LPARAM) dwSomeNum; // Try this for LPARAM p_HLlvi.lParam = nItem; p_HLlvi.pszText = result; diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index a63dee8..8440895 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -203,11 +203,12 @@ class CExtendedLap SYSTEMTIME m_tmStart; // when was this thing started on-track? public: vector m_lstPoints; // Made public by KDJ + mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated private: bool m_fComputeTimeSlip; // time-slip is the most expensive data channel, so let's allow the caller to choose not to compute it - mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated +// mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated }; const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs); diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 912c594..5d5ff6c 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1,4 +1,5 @@ -#include "stdafx.h" +#include "Stdafx.h" +#include "resource.h" #include "LapPainter.h" #include "LapData.h" #include "ArtUI.h" @@ -40,6 +41,8 @@ void CLapPainter::OGL_Paint() LAPDISPLAYSTYLE eDisplayStyle = m_pLapSupplier->GetLapDisplayStyle(m_iSupplierId); const LAPSUPPLIEROPTIONS& sfLapOpts = m_pLapSupplier->GetDisplayOptions(); +// vector lstLaps = GetLapsToShow(); + const CExtendedLap* pLap = NULL; switch(eDisplayStyle) { case LAPDISPLAYSTYLE_MAP: @@ -1245,62 +1248,6 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f } // end y-channel data channel loop } - - - - -/* -void CLapPainter::MagicDeterminingFunction(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHighlightXAxis) -{ - for(int x = 0; x < lstMousePointsToDraw.size(); x++) // <-- loops through all the stupid boxes/lines we want to draw - { - const CExtendedLap* pLap = lstMousePointsToDraw[x].m_pLap; // <-- gets the lap data we want to draw - const POINT& ptWindow = lstMousePointsToDraw[x].m_ptWindow; // <-- gets info about where in the window we want to draw the box - const IDataChannel* pDataX = lstMousePointsToDraw[x].m_pDataX; // <-- gets the x channel data - const IDataChannel* pDataY = lstMousePointsToDraw[x].m_pDataY; // <-- gets the y channel data - - float r; - float g; - float b; - MakeColor ( pLap, x == (lstLaps.size() - 1), &r, &g, &b ); // Function picks color to use and tells opengl to draw the following in the colour we just made up - - // if we're the main screen, we want to draw some text data for each point - TCHAR szLapName[256]; - pLap->GetString(szLapName, NUMCHARS(szLapName)); // <-- gets the string "10:11:12 - 1:40.59 - Keith", aka the "lap name" - - float dTimeToHighlight = m_pLapSupplier->GetLapHighlightTime(pLap); // <-- asks the ILapSupplier interface what we should highlight - - TCHAR szTypeX[256]; - ::GetDataChannelName(eX,szTypeX,NUMCHARS(szTypeX)); // <-- converts the data channel type into a string, like "Oil Temperature" - - TCHAR szTypeY[256]; - ::GetDataChannelName(lstMousePointsToDraw[x].m_eChannelY, szTypeY, NUMCHARS(szTypeY)); // <-- converts the y channel into a string - - char szYString[256]; - GetChannelString(lstMousePointsToDraw[x].m_eChannelY, sfLapOpts.eUnitPreference, pDataY->GetValue(dTimeToHighlight), szYString, NUMCHARS(szYString)); - // <-- gets the actual unit string for the data channel. For speed, this might be "100.0km/h" - - char szXString[256]; - GetChannelString(eX, sfLapOpts.eUnitPreference, pDataX->GetValue(dTimeToHighlight), szXString, NUMCHARS(szXString)); - // <-- same for x channel - - char szText[256]; - sprintf(szText, "%S - (%S @ %S) %s @ %s", szLapName, szTypeY, szTypeX, szYString, szXString); - - DrawText(100.0,(x+1)*GetWindowFontSize(),szText); // <-- draws the text from the bottom of the window, working upwards - - // we also want to draw a highlighted square -// DrawGLFilledSquare(ptWindow.x, ptWindow.y, 5); // <-- draws the stupid little box at ptWindow.x. Commented out by KDJ - // we also want to draw a highlighted LINE for that individual lap/graph combination - glLineWidth(1); // Added by KDJ. Skinny line for Distance markers. - glBegin(GL_LINE_STRIP); // Added by KDJ - glVertex3f(ptWindow.x, 0, 0); // Added by KDJ, modified by Chas - glVertex3f(ptWindow.x,rcSpot.bottom,0); // Added by KDJ - glEnd(); // Added by KDJ - } -} -*/ - // Draws an oval centered at (x_center, y_center) and is is bound inside a rectangle whose width is w and height is h. void CLapPainter::drawOval (float x_center, float y_center, float w, float h) { diff --git a/PitsideConsole/PitsideConsole/LapPainter.h b/PitsideConsole/PitsideConsole/LapPainter.h index 49b3560..8585920 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.h +++ b/PitsideConsole/PitsideConsole/LapPainter.h @@ -28,7 +28,8 @@ enum SUPPLIERID SUPPLIERID_MAINDISPLAY, SUPPLIERID_SUBDISPLAY, SUPPLIERID_SECTORDISPLAY, - SUPPLIERID_TRACTIONCIRCLEDISPLAY, // Draw the traction + SUPPLIERID_TRACTIONCIRCLEDISPLAY, // Draw the traction circle + SUPPLIERID_ALLDATADISPLAY, // Show a window with all data for that lap for the given point }; enum LAPDISPLAYSTYLE @@ -38,7 +39,8 @@ enum LAPDISPLAYSTYLE LAPDISPLAYSTYLE_NOLAPS, // what we display if there are no laps selected LAPDISPLAYSTYLE_RECEPTION, // display a map of wireless reception data LAPDISPLAYSTYLE_COUNT, - LAPDISPLAYSTYLE_TRACTIONCIRCLE, // Draw the traction + LAPDISPLAYSTYLE_TRACTIONCIRCLE, // Draw the traction circle + LAPDISPLAYSTYLE_ALLDATADISPLAY, // Draw the data window for given point }; // LapSupplier interface - needed so that the lap painter knows what to paint interface ILapSupplier @@ -94,12 +96,10 @@ class CLapPainter : public ArtOpenGLWindow void DrawVerticalLine(double flLine, float mapMinY, float mapMaxY, char szText[512]); void fExpMovingAvg( int n, vector& lstPointsX, double alpha, vector& lstSmoothPts ); void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts, bool bSmoothFlag ); - // void MagicDeterminingFunction(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHighlightXAxis); + private: ILapSupplier* m_pLapSupplier; - //ILapHighlighter* m_pHighlighter; - int m_iSupplierId; static int d; // For Value table counting //IUI* m_pUI; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index d77ab6d..7b04076 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -273,7 +273,8 @@ class CMainUI : public IUI,public ILapSupplier : m_sfLapPainter(/*static_cast(this), */static_cast(this),SUPPLIERID_MAINDISPLAY), m_sfSubDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_SUBDISPLAY), m_sfTractionDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), - m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view + m_sfAllDataDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_ALLDATADISPLAY), + m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view m_fShowTractionCircle(false), m_fSmooth(false), m_fShowBests(false), @@ -489,6 +490,103 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return pDevMode; } /////////////////////////////////////////////////////////////////////////////////////// + +HWND hWnd_AllData; // AllData window control handle +HWND AD_hWnd; // AllData listview control handle +LVITEM p_ADlvi; // Listview global pointer for Hot Laps + +// Routines for sorting list views by column headers +int CALLBACK CompareADListItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) +{ + // Get the text of the list items for comparison + LVITEM pitem1 = {NULL}; + LVITEM pitem2 = {NULL}; + TCHAR sz_Result1[512] = {NULL}; + TCHAR sz_Result2[512] = {NULL}; + BOOL result; + BOOL b_TextResult; + BOOL bSortAscending = (lParamSort > 0); // Determines which way to sort the column + int nColumn = abs(lParamSort) - 1; // Then pulls the column number from the same variable + + if ( AD_hWnd ) // Hot Laps listview + { + // Get the text value for the given items and compare them + p_ADlvi.iItem = lParam1; + p_ADlvi.iSubItem =nColumn; + ListView_GetItem(AD_hWnd, (LVITEM*)&p_ADlvi); + swprintf(sz_Result1, p_ADlvi.cchTextMax, L"%s", p_ADlvi.pszText); + p_ADlvi.iItem = lParam2; + p_ADlvi.iSubItem = nColumn; + ListView_GetItem(AD_hWnd, (LVITEM*)&p_ADlvi); + swprintf(sz_Result2, p_ADlvi.cchTextMax, L"%s", p_ADlvi.pszText); + } + +// b_TextResult = wcscmp(sz_Result2, sz_Result1); + b_TextResult = wcscmp(sz_Result1, sz_Result2); + if (bSortAscending > 0 && b_TextResult < 0) +// if (bSortAscending && b_TextResult < 0) + { + result = -1 * abs((lParam1 - lParam2)); +// result = (lParam2 - lParam1); + } + else if (bSortAscending > 0 && b_TextResult >= 0) +// else if (bSortAscending && b_TextResult >= 0) + { + result = 1 * abs((lParam1 - lParam2)); +// result = (lParam1 - lParam2); + } + else if (b_TextResult < 0) +// else if (b_TextResult < 0) + { + result = 1 * abs(lParam2 - lParam1); +// result = (lParam1 - lParam2); + } + else + { + result = -1 * abs(lParam2 - lParam1); +// result = (lParam2 - lParam1); + } + +// result = (bSortAscending && b_TextResult < 0) ? -1 : 1; + if (nColumn == 0) + { + result = bSortAscending ? (lParam1 - lParam2) : (lParam2 - lParam1); + } + return result; +} + +void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) +{ + static int nSortColumn = 0; + static BOOL bSortAscending = TRUE; + LPARAM lParamSort; + + // get new sort parameters + if (pLVInfo->iSubItem == nSortColumn) + bSortAscending = !bSortAscending; + else + { + nSortColumn = pLVInfo->iSubItem; + bSortAscending = !bSortAscending; + } + + // combine sort info into a single value we can send to our sort function + lParamSort = 1 + nSortColumn; + if (!bSortAscending) + lParamSort = -lParamSort; + +// click_hWnd = pLVInfo->hdr.hwndFrom; +// HL_hWnd = hWnd; +// TS_hWnd = hWnd; +// HL_hWnd = GetDlgItem(hWnd, IDC_RACESCORING); +// TS_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); + + // sort list + if ( pLVInfo->hdr.hwndFrom == AD_hWnd); +// ListView_SortItems(pLVInfo->hdr.hwndFrom, CompareADListItems, lParamSort); + +} + LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -500,6 +598,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Update and show Current Lap Time TCHAR szTemp[512], szLap[512]; HWND hWndIp = GetDlgItem(m_hWnd, IDC_LIVELAPTIME); + static HWND hWnd_AllData = NULL; // Window handle of dialog box to show all data points for a lap + static WINDOWPLACEMENT w_AllDataWindow; // Save the location for the AllData display window ::FormatTimeMinutesSecondsMs((float)(timeGetTime() - tmLast) / 1000, szLap, NUMCHARS(szLap) ); swprintf(szLap, _tcslen(szLap) - 2, L"%s", szLap); // Remove the fractional time swprintf(szTemp, NUMCHARS(szTemp), L"Current Lap: %s", szLap); @@ -510,7 +610,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case WM_INITDIALOG: { m_hWnd = hWnd; - { vector lstCols; vector lstWidths; @@ -532,6 +631,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); m_sfSubDisplay.Init(GetDlgItem(hWnd,IDC_SUBDISPLAY)); m_sfTractionDisplay.Init(GetDlgItem(hWnd,IDC_TRACTIONCIRCLEMAP)); + m_sfAllDataDisplay.Init(GetDlgItem(hWnd,IDC_ALLDATADISPLAY)); set setAvailable; InitAxes(setAvailable); @@ -570,7 +670,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfLapOpts.flWindowShiftX += moveX; m_sfLapOpts.flWindowShiftY -= moveY; } - UpdateUI(UPDATE_MAP); + UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); return 0; } case WM_LBUTTONDOWN: @@ -588,46 +688,75 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return FALSE; } - case WM_LBUTTONDBLCLK: + case WM_MBUTTONDOWN: { const int x = LOWORD(lParam); const int y = HIWORD(lParam); - // figure out if we should put focus on the main map + // figure out if the mouse is within the main map RECT rcMap; HWND hWndMap = GetDlgItem(this->m_hWnd,IDC_DISPLAY); GetClientRect(hWndMap,&rcMap); - if(x >= rcMap.left && x < rcMap.right && y >= rcMap.top && y < rcMap.bottom) - { - SetFocus(hWndMap); - return TRUE; - } - // Now display the closest values on the map. -/* const float flDataX = MagicDeterminingFunction(sfLapOpts, fHighlightXAxis); // this part could be hard... - vector lstLaps = GetLapsToShow(); - if(lstLaps.size() >= 2) // don't show anything if we've got multiple laps selected - { - set setChannels = lstLaps[0]->GetAvailableChannels(); - stringstream ss; - for(set::const_iterator i = setChannels.begin(); i != setChannels.end(); i++) - { - const IDataChannel* pChannel = GetChannel(*i); - if(pChannel) - { - const float flValue = pChannel->GetValue(flDataX); - TCHAR szName[100]; - GetDataChannelName(*i,szName,NUMCHARS(szName)); - char szValue[100]; - GetChannelString(*i, m_sfLapOpts.eUnitPreference, flValue, szValue, NUMCHARS(szValue)); - ss< lstCols; + vector lstWidths; + lstCols.push_back(L"Data Channel"); + lstCols.push_back(L"Lap 1"); + lstCols.push_back(L"Lap 2"); + lstCols.push_back(L"Lap 3"); + lstCols.push_back(L"Lap 4"); + lstCols.push_back(L"Lap 5"); + lstCols.push_back(L"Lap 6"); + lstCols.push_back(L"Lap 7"); + lstCols.push_back(L"Lap 8"); + lstCols.push_back(L"Lap 9"); + lstCols.push_back(L"Lap 10"); + lstWidths.push_back(120); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + + m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize and show the listview + ShowWindow(hWnd_AllData, SW_SHOW); + } - } -*/ return TRUE; + UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); + return TRUE; } + case WM_MBUTTONDBLCLK: + { + // If the window showing all of the lap data is present, let's kill it + if (hWnd_AllData) + { + if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) + { + DestroyWindow(hWnd_AllData); + } + } + } case WM_NOTIFY: { NMHDR* notifyHeader = (NMHDR*)lParam; @@ -1446,8 +1575,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } } m_pReferenceLap = pNewRefLap; - // Tell it to close Sector Display and release all Split Points - // Blah blah blah } else { @@ -1637,6 +1764,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) const static DWORD UPDATE_MENU = 0x8; const static DWORD UPDATE_VALUES = 0x10; const static DWORD UPDATE_TRACTIONCIRCLE = 0x20; + const static DWORD UPDATE_ALLDATA = 0x40; const static DWORD UPDATE_ALL = 0xffffffff; // Pull in PlotPrefs array as well as lines vs. dots and Painting color scheme settings from Settings.txt file @@ -1703,7 +1831,12 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { UpdateMenus(); } - + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_ALLDATA)) + { + UpdateAllData(); + UpdateDisplays(); + } + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_DASHBOARD)) { set setSelectedChannels; @@ -1907,6 +2040,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) GET_WINDOWPOS(IDC_SUBDISPLAY); GET_WINDOWPOS(IDC_LAPS); GET_WINDOWPOS(IDC_TRACTIONCIRCLEMAP); + GET_WINDOWPOS(IDC_ALLDATADISPLAY); } void HandleCtlResize(SIZE sNewSize, int idc, bool fResizeX, bool fResizeY) @@ -1923,7 +2057,117 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window } - float fAverage(DATA_CHANNEL eChannel, const IDataChannel* pChannel, float flVal) + void UpdateAllData() + { + const float flDataX = 0; +// m_sfAllDataDisplay; + HWND hWnd_AllData = GetWindow(m_hWnd, GW_ENABLEDPOPUP); + if ( hWnd_AllData ); + if (GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Only execute data display functions if window is showing + { + // First let's get all of the information about the data points for this lap/location + ListView_DeleteAllItems(AD_hWnd); // Clear the list before displaying the update + // List of highlighted laps + set setSelectedData = m_sfLapList.GetSelectedItemsData(); + if(setSelectedData.size() > 0) + { + const int cLaps = 10; // The maximum number of Laps to display Data channels for + int iLap=0; // Tracking variable for which Lap we are on in the loop + int iChannel=0; // Tracking variable for which Y-Channel we are on within each lap + const int iTotChannel = m_lstYChannels.size(); // The number of Y Data channels for this lap + // Loop through each lap and pick up all of their values for each data channel + for(set::iterator a = setSelectedData.begin(); a != setSelectedData.end(); a++) + { + CExtendedLap* pLap = (CExtendedLap*)*a; + // For each lap let's get all of the available data channels for display + int TotalYChannels = 0; // Total numbber of Data Channels availalbe for this lap + TCHAR szDataChannelName[MAX_PATH]; // Test string containing the Data Channel name to display + int iLapId = pLap->GetLap()->GetLapId(); + set channels = g_pLapDB->GetAvailableChannels(iLapId); // Get all available channels for this lap + for(set::const_iterator i = channels.begin(); i != channels.end(); i++) // Loop through them, insert them into our "all data channels" set + { + TotalYChannels = channels.size(); // The number of Data Channels available for this lap + TCHAR m_szYString[512] = {NULL}; + TCHAR szLabel[50][MAX_PATH] = {NULL}; // Assumes that we will have no more than 50 Y-Data channels + DATA_CHANNEL eChannel = *i; + if( !eChannel ) continue; + float flVal; + // Let's get the value for this data channel at this highlight point + const IDataChannel* pChannel = pLap->GetChannel(eChannel); + if (pChannel) // Check if pointer is valid + { + flVal = pChannel->GetValue(m_mapLapHighlightTimes[pLap]); // The value that we are looking for + ////////////////////////////////////////// + // Adding transformation functions here for Y + if (m_sfLapOpts.m_PlotPrefs[iChannel].iTransformYesNo == true) + { + if (m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue < 0) + { + flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; + } + else + { + flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; + } + } + ////////////////////////////////////////// + // Now assign these values to the Data Value variable for display + TCHAR szChannelName[MAX_PATH]; + GetDataChannelName(eChannel,szChannelName,NUMCHARS(szChannelName)); + + char szVal[MAX_PATH]; + GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flVal,szVal,NUMCHARS(szVal)); + + // Let's load the Listview with this result + TCHAR lstVal[MAX_PATH] ; + LPWSTR result; + swprintf(lstVal,NUMCHARS(lstVal), L"%S", szVal); + + // First set up the Main listview item (Data Channel Name) for the first lap + if (iLap == 0) + { + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = iChannel; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap; // Which Lap subscript + p_ADlvi.lParam = iLap; + std::wstring strPos(szChannelName); + result = (LPWSTR)strPos.c_str(); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(AD_hWnd, &p_ADlvi); + } + + // Now populate the listview subitem with the datapoint value + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = iChannel; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; + std::wstring strVal(lstVal); // Data conversion + result = (LPWSTR)strVal.c_str(); // Another data conversion + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + } // End Data Channel checking loop + iChannel++; // Increment the Data Channel counter and try to pull the next Data Channel information + } // End Data Channel Loop + // Increment the lap counter and get info from the next lap if we are less than our max. laps + if (iLap < cLaps) + { + iLap++; + iChannel = 0; // Reset the Data Channel Listview array counter + } + else + { + break; + } + } // End Lap Loop + } // End Test Loop + } + return; + } + + + float fAverage(DATA_CHANNEL eChannel, const IDataChannel* pChannel, float flVal) { // This function returns the average value for the data channel across all data points from this lap. char szAvg[MAX_PATH]; @@ -2073,13 +2317,7 @@ void UpdateSectors() // End Sector Loop // Now that we have computed the Sector Time, let's Display them -/* if (w == lstLaps.size() - 1 && m_fShowReferenceLap) - { - swprintf(szLapString[w], NUMCHARS(szLapString[w]), L"\t\tRef Lap: \t%s", szString[w]); - SendMessage(m_sfLapOpts.hWndLap[w], WM_SETTEXT, 0, (LPARAM)szLapString[w]); - } - else -*/ { + { swprintf(szLapString[w], NUMCHARS(szLapString[w]), L"%s %s", szLapString[w], szString[w]); SendMessage(m_sfLapOpts.hWndLap[w], WM_SETTEXT, 0, (LPARAM)szLapString[w]); } @@ -2237,6 +2475,10 @@ void UpdateValues() { m_sfTractionDisplay.Refresh(); } + if (m_sfLapOpts.bSmoothYesNo) // Need to change this condition to something that makes sense + { + m_sfAllDataDisplay.Refresh(); + } } void CheckMenuHelper(HMENU hMainMenu, int id, bool fChecked) { @@ -2351,6 +2593,7 @@ void UpdateValues() case SUPPLIERID_SECTORDISPLAY: return true; // Allow the Set Split Sectors to be highlight source case SUPPLIERID_TRACTIONCIRCLEDISPLAY: + case SUPPLIERID_ALLDATADISPLAY: return false; // main display is always the driver of highlight data default: DASSERT(FALSE); @@ -2467,6 +2710,10 @@ void UpdateValues() { return LAPDISPLAYSTYLE_TRACTIONCIRCLE; } + case SUPPLIERID_ALLDATADISPLAY: + { + return LAPDISPLAYSTYLE_ALLDATADISPLAY; + } case SUPPLIERID_SECTORDISPLAY: { return LAPDISPLAYSTYLE_MAP; @@ -2816,12 +3063,14 @@ void UpdateValues() vector m_lstYChannels; ArtListBox m_sfYAxis; ArtListBox m_sfLapList; + ArtListBox m_sfListBox; private: ArtListBox m_sfXAxis; CLapPainter m_sfLapPainter; CLapPainter m_sfSubDisplay; CLapPainter m_sfTractionDisplay; + CLapPainter m_sfAllDataDisplay; // lap display style data map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index aff059f..a45d599 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -11,13 +11,13 @@ CAPTION "Pitside" FONT 8, "MS Shell Dlg" MENU IDM_OPTIONS BEGIN -// CONTROL "", IDC_LAPS, WC_LISTVIEWEX, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 + CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 LTEXT "",IDC_DISPLAY,155,63,590,282 // LTEXT "",IDC_SUBDISPLAY,520,0,150,63 LTEXT "",IDC_SUBDISPLAY,520,0,87,63 LTEXT "",IDC_TRACTIONCIRCLEMAP,610,0,63,63 - AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 + AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 AUTORADIOBUTTON "Data Plot",IDC_DISPLAYTYPE_PLOT,185,0,45,12 //AUTORADIOBUTTON "Reception",IDC_DISPLAYTYPE_RECEPTION,230,0,50,12 CONTROL "", IDC_XAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 0,0,75,150 @@ -89,6 +89,16 @@ BEGIN PUSHBUTTON "Cancel", IDCANCEL, 200,280,195,20 END +// Dialog box for displaying all data for a given point +IDD_ALLDATADISPLAY DIALOG 250, 75, 375, 250 +STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP +CAPTION "Data Point Information" +FONT 10, "MS Shell Dlg" +BEGIN + CTEXT "****Data Details****", IDC_RACE_TITLE, 5,5,365,12 + CONTROL "", IDC_ALLDATADISPLAY, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,20,365,200 +END + // Dialog box for displaying sector split times IDD_SHOWSECTORS DIALOG 250, 75, 375, 99 STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_CAPTION diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index 0d1eb2b..c442961 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -362,4 +362,7 @@ #define IDC_PLOTTYPE_LOAD18 458 #define IDC_PLOTTYPE_LOAD19 459 #define IDC_PLOTTYPE_LOAD20 460 + +#define IDD_ALLDATADISPLAY 480 +#define IDC_ALLDATADISPLAY 481 // don't put anything below this From 09145b2ccffa35727c16a9f842e7aea111baee74 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Mon, 9 Feb 2015 22:56:03 -0700 Subject: [PATCH 021/112] Changes to AllData display coding, most of it works now --- PitsideConsole/PitsideConsole/LapData.h | 4 +- .../PitsideConsole/PitsideConsole.cpp | 381 +++++++++--------- 2 files changed, 184 insertions(+), 201 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 8440895..5723d57 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -203,12 +203,12 @@ class CExtendedLap SYSTEMTIME m_tmStart; // when was this thing started on-track? public: vector m_lstPoints; // Made public by KDJ - mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated +// mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated private: bool m_fComputeTimeSlip; // time-slip is the most expensive data channel, so let's allow the caller to choose not to compute it -// mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated + mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated }; const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 7b04076..bd1d3a5 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -273,7 +273,6 @@ class CMainUI : public IUI,public ILapSupplier : m_sfLapPainter(/*static_cast(this), */static_cast(this),SUPPLIERID_MAINDISPLAY), m_sfSubDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_SUBDISPLAY), m_sfTractionDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), - m_sfAllDataDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_ALLDATADISPLAY), m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view m_fShowTractionCircle(false), m_fSmooth(false), @@ -495,99 +494,6 @@ HWND hWnd_AllData; // AllData window control handle HWND AD_hWnd; // AllData listview control handle LVITEM p_ADlvi; // Listview global pointer for Hot Laps -// Routines for sorting list views by column headers -int CALLBACK CompareADListItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) -{ - // Get the text of the list items for comparison - LVITEM pitem1 = {NULL}; - LVITEM pitem2 = {NULL}; - TCHAR sz_Result1[512] = {NULL}; - TCHAR sz_Result2[512] = {NULL}; - BOOL result; - BOOL b_TextResult; - BOOL bSortAscending = (lParamSort > 0); // Determines which way to sort the column - int nColumn = abs(lParamSort) - 1; // Then pulls the column number from the same variable - - if ( AD_hWnd ) // Hot Laps listview - { - // Get the text value for the given items and compare them - p_ADlvi.iItem = lParam1; - p_ADlvi.iSubItem =nColumn; - ListView_GetItem(AD_hWnd, (LVITEM*)&p_ADlvi); - swprintf(sz_Result1, p_ADlvi.cchTextMax, L"%s", p_ADlvi.pszText); - p_ADlvi.iItem = lParam2; - p_ADlvi.iSubItem = nColumn; - ListView_GetItem(AD_hWnd, (LVITEM*)&p_ADlvi); - swprintf(sz_Result2, p_ADlvi.cchTextMax, L"%s", p_ADlvi.pszText); - } - -// b_TextResult = wcscmp(sz_Result2, sz_Result1); - b_TextResult = wcscmp(sz_Result1, sz_Result2); - if (bSortAscending > 0 && b_TextResult < 0) -// if (bSortAscending && b_TextResult < 0) - { - result = -1 * abs((lParam1 - lParam2)); -// result = (lParam2 - lParam1); - } - else if (bSortAscending > 0 && b_TextResult >= 0) -// else if (bSortAscending && b_TextResult >= 0) - { - result = 1 * abs((lParam1 - lParam2)); -// result = (lParam1 - lParam2); - } - else if (b_TextResult < 0) -// else if (b_TextResult < 0) - { - result = 1 * abs(lParam2 - lParam1); -// result = (lParam1 - lParam2); - } - else - { - result = -1 * abs(lParam2 - lParam1); -// result = (lParam2 - lParam1); - } - -// result = (bSortAscending && b_TextResult < 0) ? -1 : 1; - if (nColumn == 0) - { - result = bSortAscending ? (lParam1 - lParam2) : (lParam2 - lParam1); - } - return result; -} - -void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) -{ - static int nSortColumn = 0; - static BOOL bSortAscending = TRUE; - LPARAM lParamSort; - - // get new sort parameters - if (pLVInfo->iSubItem == nSortColumn) - bSortAscending = !bSortAscending; - else - { - nSortColumn = pLVInfo->iSubItem; - bSortAscending = !bSortAscending; - } - - // combine sort info into a single value we can send to our sort function - lParamSort = 1 + nSortColumn; - if (!bSortAscending) - lParamSort = -lParamSort; - -// click_hWnd = pLVInfo->hdr.hwndFrom; -// HL_hWnd = hWnd; -// TS_hWnd = hWnd; -// HL_hWnd = GetDlgItem(hWnd, IDC_RACESCORING); -// TS_hWnd = GetDlgItem(hWnd, IDC_TIMINGSCORING); - - // sort list - if ( pLVInfo->hdr.hwndFrom == AD_hWnd); -// ListView_SortItems(pLVInfo->hdr.hwndFrom, CompareADListItems, lParamSort); - -} - - LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(m_sfLapPainter.HandleMessage(hWnd,uMsg,wParam,lParam)) @@ -631,7 +537,6 @@ void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); m_sfSubDisplay.Init(GetDlgItem(hWnd,IDC_SUBDISPLAY)); m_sfTractionDisplay.Init(GetDlgItem(hWnd,IDC_TRACTIONCIRCLEMAP)); - m_sfAllDataDisplay.Init(GetDlgItem(hWnd,IDC_ALLDATADISPLAY)); set setAvailable; InitAxes(setAvailable); @@ -690,12 +595,8 @@ void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) } case WM_MBUTTONDOWN: { - const int x = LOWORD(lParam); - const int y = HIWORD(lParam); - // figure out if the mouse is within the main map - RECT rcMap; + // Middle mouse button activates a modal window that dispalys all of the data for a given point in a table HWND hWndMap = GetDlgItem(this->m_hWnd,IDC_DISPLAY); - GetClientRect(hWndMap,&rcMap); DLGPROC ShowAllData = NULL; if (!IsWindow(hWnd_AllData)) { @@ -707,12 +608,7 @@ void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, ShowAllData); AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // Hot Laps listview SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); - // Initialize the results array - for (int i=0;i<10;i++) - { -// swprintf(m_AllData[i].db_strRaceName, NUMCHARS(m_ScoringData[i].db_strRaceName),L""); -// swprintf(m_AllData[i].db_szTotTime, NUMCHARS(m_ScoringData[i].db_szTotTime),L""); - } + // Set up the AllData list box columns vector lstCols; vector lstWidths; @@ -754,6 +650,7 @@ void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) { DestroyWindow(hWnd_AllData); + hWnd_AllData = NULL; } } } @@ -2057,109 +1954,200 @@ void OnColumnClick2(LPNMLISTVIEW pLVInfo, HWND hWnd) HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window } + // Function updates the data points in the window showing all of the data for the selected laps, activated by the middle mouse button void UpdateAllData() { - const float flDataX = 0; -// m_sfAllDataDisplay; - HWND hWnd_AllData = GetWindow(m_hWnd, GW_ENABLEDPOPUP); - if ( hWnd_AllData ); + // hWnd_AllData is the handle for the window we want. Let's make sure that it is displayed + hWnd_AllData = GetWindow(m_hWnd, GW_ENABLEDPOPUP); if (GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Only execute data display functions if window is showing { // First let's get all of the information about the data points for this lap/location ListView_DeleteAllItems(AD_hWnd); // Clear the list before displaying the update - // List of highlighted laps - set setSelectedData = m_sfLapList.GetSelectedItemsData(); + set setSelectedData = m_sfLapList.GetSelectedItemsData(); // List of highlighted laps if(setSelectedData.size() > 0) { - const int cLaps = 10; // The maximum number of Laps to display Data channels for - int iLap=0; // Tracking variable for which Lap we are on in the loop - int iChannel=0; // Tracking variable for which Y-Channel we are on within each lap + const int cLaps = 10; // The maximum number of Laps to display Data channels for, limited by the window form + int iLap = 0; // Tracking variable for which Lap we are on in the loop + int iChannel = 0; // Tracking variable for which Y-Channel we are on within each lap const int iTotChannel = m_lstYChannels.size(); // The number of Y Data channels for this lap // Loop through each lap and pick up all of their values for each data channel for(set::iterator a = setSelectedData.begin(); a != setSelectedData.end(); a++) { - CExtendedLap* pLap = (CExtendedLap*)*a; - // For each lap let's get all of the available data channels for display - int TotalYChannels = 0; // Total numbber of Data Channels availalbe for this lap - TCHAR szDataChannelName[MAX_PATH]; // Test string containing the Data Channel name to display - int iLapId = pLap->GetLap()->GetLapId(); - set channels = g_pLapDB->GetAvailableChannels(iLapId); // Get all available channels for this lap - for(set::const_iterator i = channels.begin(); i != channels.end(); i++) // Loop through them, insert them into our "all data channels" set - { - TotalYChannels = channels.size(); // The number of Data Channels available for this lap - TCHAR m_szYString[512] = {NULL}; - TCHAR szLabel[50][MAX_PATH] = {NULL}; // Assumes that we will have no more than 50 Y-Data channels - DATA_CHANNEL eChannel = *i; - if( !eChannel ) continue; - float flVal; - // Let's get the value for this data channel at this highlight point - const IDataChannel* pChannel = pLap->GetChannel(eChannel); - if (pChannel) // Check if pointer is valid + CExtendedLap* pLap = (CExtendedLap*)*a; + // For each lap let's get all of the available data channels for display + int TotalYChannels = 0; // Total numbber of Data Channels availalbe for this lap + int iLapId = pLap->GetLap()->GetLapId(); + set channels = g_pLapDB->GetAvailableChannels(iLapId); // Get all available channels for this lap + for(set::const_iterator i = channels.begin(); i != channels.end(); i++) // Loop through them, insert them into our "all data channels" set { - flVal = pChannel->GetValue(m_mapLapHighlightTimes[pLap]); // The value that we are looking for - ////////////////////////////////////////// - // Adding transformation functions here for Y - if (m_sfLapOpts.m_PlotPrefs[iChannel].iTransformYesNo == true) - { - if (m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue < 0) - { - flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; - } - else + TotalYChannels = channels.size(); // The number of Data Channels available for this lap + TCHAR m_szYString[512] = {NULL}; + TCHAR szLabel[50][MAX_PATH] = {NULL}; // Assumes that we will have no more than 50 Y-Data channels + DATA_CHANNEL eChannel = *i; + if( !eChannel ) continue; + float flVal; + // Let's get the value for this data channel at this highlight point + const IDataChannel* pChannel = pLap->GetChannel(eChannel); + if (pChannel) // Check if pointer is valid + { + flVal = pChannel->GetValue(m_mapLapHighlightTimes[pLap]); // The value that we are looking for + ////////////////////////////////////////// + // Adding transformation functions here for Y + if (m_sfLapOpts.m_PlotPrefs[iChannel].iTransformYesNo == true) { - flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; + if (m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue < 0) + { + flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; + } + else + { + flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; + } } - } - ////////////////////////////////////////// - // Now assign these values to the Data Value variable for display - TCHAR szChannelName[MAX_PATH]; - GetDataChannelName(eChannel,szChannelName,NUMCHARS(szChannelName)); - - char szVal[MAX_PATH]; - GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flVal,szVal,NUMCHARS(szVal)); - - // Let's load the Listview with this result - TCHAR lstVal[MAX_PATH] ; - LPWSTR result; - swprintf(lstVal,NUMCHARS(lstVal), L"%S", szVal); - - // First set up the Main listview item (Data Channel Name) for the first lap - if (iLap == 0) - { - p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; - p_ADlvi.iItem = iChannel; // Which Data Channel subscript - p_ADlvi.iSubItem = iLap; // Which Lap subscript - p_ADlvi.lParam = iLap; - std::wstring strPos(szChannelName); - result = (LPWSTR)strPos.c_str(); - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(AD_hWnd, &p_ADlvi); - } - - // Now populate the listview subitem with the datapoint value - p_ADlvi.mask = LVIF_TEXT; - p_ADlvi.iItem = iChannel; // Which Data Channel subscript - p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly - p_ADlvi.lParam = iLap + 1; - std::wstring strVal(lstVal); // Data conversion - result = (LPWSTR)strVal.c_str(); // Another data conversion - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); - } // End Data Channel checking loop - iChannel++; // Increment the Data Channel counter and try to pull the next Data Channel information - } // End Data Channel Loop - // Increment the lap counter and get info from the next lap if we are less than our max. laps - if (iLap < cLaps) - { - iLap++; - iChannel = 0; // Reset the Data Channel Listview array counter - } - else - { - break; - } + ////////////////////////////////////////// + // Now assign these values to the Data Value variable for display + TCHAR szChannelName[MAX_PATH]; + GetDataChannelName(eChannel,szChannelName,NUMCHARS(szChannelName)); + + char szVal[MAX_PATH]; + GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flVal,szVal,NUMCHARS(szVal)); + + // Let's load the Listview with this result + TCHAR lstVal[MAX_PATH] ; + swprintf(lstVal,NUMCHARS(lstVal), L"%S", szVal); +// LPWSTR result; + wchar_t result[MAX_PATH] ; + bool b_LV_ChannelFound = false; // ListView boolean for Data Channel searches + // First set up the Main listview item (Data Channel Name) for the first lap + int i_TextResult = 0; // Data channel matching integer + if (iLap == 0) + { + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = iChannel; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap; // Which Lap subscript + p_ADlvi.lParam = iLap; +// std::wstring strPos(szChannelName); +// result = (LPWSTR)strPos.c_str(); + swprintf(result,NUMCHARS(result), szChannelName); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(AD_hWnd, &p_ADlvi); + b_LV_ChannelFound = true; + } + else // Let's match up the Data Channel Name with those in the first lap for displaying in-line + { + // First let's get the channel name for this data channel + wchar_t szChannelString[MAX_PATH]; + p_ADlvi.iItem = iChannel; // The first lap's data channel name + p_ADlvi.iSubItem = 0; // The first lap's subscript + p_ADlvi.lParam = 0; + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.cchTextMax = MAX_PATH; + + ListView_GetItem(AD_hWnd, &p_ADlvi); + swprintf(szChannelString, NUMCHARS(p_ADlvi.pszText), (wchar_t*)p_ADlvi.pszText); + +// std::wstring strPos(szChannelName); +// result = (LPWSTR)strPos.c_str(); + swprintf(result,NUMCHARS(result), szChannelName); + +// ListView_GetItem(AD_hWnd, &p_ADlvi); // Get the pointer to the LV item +// swprintf(szChannelString, p_ADlvi.cchTextMax, p_ADlvi.pszText); // Get the text from the LV Item + i_TextResult = wcscmp((LPWSTR)p_ADlvi.pszText, result); // Compare the wide strings to see if they match + + if ( i_TextResult ) // 0 if they match, <>0 if they are different + { + // Items don't match. Let's see if the data channel exists in the array + for (int chan = 0; chan < TotalYChannels; chan++) + { + // First let's get the channel name for this data channel + LPWSTR result2; + wchar_t szChannelString[MAX_PATH]; + p_ADlvi.iItem = chan; // The first lap's data channel name + p_ADlvi.iSubItem = 0; // The first lap's subscript + p_ADlvi.lParam = 0; + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.cchTextMax = MAX_PATH; + + if (ListView_GetItem(AD_hWnd, &p_ADlvi) ) // Returns TRUE if it gets an item + { + swprintf(szChannelString, NUMCHARS(p_ADlvi.pszText), (wchar_t*)p_ADlvi.pszText); + + std::wstring strPos(szChannelName); + result2 = (LPWSTR)strPos.c_str(); + + // ListView_GetItem(AD_hWnd, &p_ADlvi); // Get the pointer to the LV item + // swprintf(szChannelString, p_ADlvi.cchTextMax, p_ADlvi.pszText); // Get the text from the LV Item + i_TextResult = wcscmp((LPWSTR)p_ADlvi.pszText, result2); // Compare the wide strings to see if they match + if ( !i_TextResult ) // 0 if they match, <>0 if they are different. Break loop if we found a match + { + // p_ADlvi = p_ADlviTemp; // Re-assign the List View pointer + iChannel = chan; // Set the LV Item subsript to the channel's number + b_LV_ChannelFound = true; // Set the "Channel Found" flag + break; + } + } + } // End of Data Channel searching loop + if ( !b_LV_ChannelFound ) // Data Channel doesn't exist in the list. Let's add it and the value. + { + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = TotalYChannels + 1; // Which Data Channel subscript + p_ADlvi.iSubItem = 0; // Which Lap subscript + p_ADlvi.lParam = 0; +// std::wstring strPos(szChannelName); +// result = (LPWSTR)strPos.c_str(); + swprintf(result,NUMCHARS(result), szChannelName); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(AD_hWnd, &p_ADlvi); + + // Now populate the listview subitem with the datapoint value, if it's valid + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = TotalYChannels + 1; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; +// std::wstring strVal(lstVal); // Data conversion +// result = (LPWSTR)strVal.c_str(); // Another data conversion + swprintf(result,NUMCHARS(result), lstVal); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + TotalYChannels = TotalYChannels + 1; // Increment the total number of data channels + b_LV_ChannelFound = false; // Set the channel search flag to not found + } // End of data channel add test + } // End of Data Channel not matched test + else + { + b_LV_ChannelFound = true; // The channels match + } + } // End of Sub Item addition test + if (b_LV_ChannelFound ) + { + // Now populate the listview subitem with the datapoint value, if it's valid + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = iChannel; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; +// std::wstring strVal(lstVal); // Data conversion +// result = (LPWSTR)strVal.c_str(); // Another data conversion + swprintf(result,NUMCHARS(result), lstVal); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + } + } // End Data Channel checking loop + iChannel++; // Increment the Data Channel counter and try to pull the next Data Channel information + } // End Data Channel Loop + // Increment the lap counter and get info from the next lap if we are less than our max. laps + if (iLap < cLaps) + { + iLap++; + iChannel = 0; // Reset the Data Channel Listview array counter for the next lap + } + else + { + break; + } } // End Lap Loop } // End Test Loop } @@ -2475,10 +2463,6 @@ void UpdateValues() { m_sfTractionDisplay.Refresh(); } - if (m_sfLapOpts.bSmoothYesNo) // Need to change this condition to something that makes sense - { - m_sfAllDataDisplay.Refresh(); - } } void CheckMenuHelper(HMENU hMainMenu, int id, bool fChecked) { @@ -3070,7 +3054,6 @@ void UpdateValues() CLapPainter m_sfLapPainter; CLapPainter m_sfSubDisplay; CLapPainter m_sfTractionDisplay; - CLapPainter m_sfAllDataDisplay; // lap display style data map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls From bc2f3b847cf2f42e0185a4b3139c9f88758a7fac Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Mon, 9 Feb 2015 23:06:22 -0700 Subject: [PATCH 022/112] Junk commit --- PitsideConsole/PitsideConsole/LapData.h | 4 ++-- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 8440895..5723d57 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -203,12 +203,12 @@ class CExtendedLap SYSTEMTIME m_tmStart; // when was this thing started on-track? public: vector m_lstPoints; // Made public by KDJ - mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated +// mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated private: bool m_fComputeTimeSlip; // time-slip is the most expensive data channel, so let's allow the caller to choose not to compute it -// mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated + mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated }; const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 7b04076..f001704 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -2477,7 +2477,7 @@ void UpdateValues() } if (m_sfLapOpts.bSmoothYesNo) // Need to change this condition to something that makes sense { - m_sfAllDataDisplay.Refresh(); +// m_sfAllDataDisplay.Refresh(); } } void CheckMenuHelper(HMENU hMainMenu, int id, bool fChecked) From 017320884257056d21abcd7950e6c4696ce65b02 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 10 Feb 2015 20:19:23 -0700 Subject: [PATCH 023/112] AllData hardcoded data channels now displayed in separate window Still working on derived data channels --- .../PitsideConsole/PitsideConsole.cpp | 180 ++++++++++++------ 1 file changed, 119 insertions(+), 61 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index bd1d3a5..bdd9ad4 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1376,7 +1376,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps } return TRUE; } - case ID_DATA_DASHWARE: + case ID_DATA_DASHWARE: // Save the data to a .CSV file { set setSelectedData = m_sfLapList.GetSelectedItemsData(); if(setSelectedData.size() > 0) @@ -1969,7 +1969,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps const int cLaps = 10; // The maximum number of Laps to display Data channels for, limited by the window form int iLap = 0; // Tracking variable for which Lap we are on in the loop int iChannel = 0; // Tracking variable for which Y-Channel we are on within each lap - const int iTotChannel = m_lstYChannels.size(); // The number of Y Data channels for this lap + int iTotChannel = 0; // The number of Y Data channels in the Listview // Loop through each lap and pick up all of their values for each data channel for(set::iterator a = setSelectedData.begin(); a != setSelectedData.end(); a++) { @@ -1977,12 +1977,36 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps // For each lap let's get all of the available data channels for display int TotalYChannels = 0; // Total numbber of Data Channels availalbe for this lap int iLapId = pLap->GetLap()->GetLapId(); - set channels = g_pLapDB->GetAvailableChannels(iLapId); // Get all available channels for this lap + int iLapTime = pLap->GetLap()->GetStartTime(); // Get the start time for the lap, use it for the ID in the LV +/* + pTime->Init(GetLap()->GetLapId(), DATA_CHANNEL_TIME); + pLapTime->Init(GetLap()->GetLapId(), DATA_CHANNEL_ELAPSEDTIME); + pLapTimeSummary->Init(GetLap()->GetLapId(), DATA_CHANNEL_LAPTIME_SUMMARY); + pX->Init(GetLap()->GetLapId(), DATA_CHANNEL_X); + pY->Init(GetLap()->GetLapId(), DATA_CHANNEL_Y); + pDistance->Init(GetLap()->GetLapId(), DATA_CHANNEL_DISTANCE); + pVelocity->Init(GetLap()->GetLapId(), DATA_CHANNEL_VELOCITY); + */ +// set channels = g_pLapDB->GetAvailableChannels(iLapId); // Get all available channels for this lap + + // let's add the rest of the data channels... + set channels = g_pLapDB->GetAvailableChannels(iLapId); + for(set::iterator i = channels.begin(); i != channels.end(); i++) + { + const IDataChannel* pChannel = g_pLapDB->GetDataChannel(iLapId,*i); + if(pChannel) + { +// AddChannel(pChannel); + } + } + + + if ( !iTotChannel ) iTotChannel = channels.size(); // Only update the first time through the LV creation loop for(set::const_iterator i = channels.begin(); i != channels.end(); i++) // Loop through them, insert them into our "all data channels" set { - TotalYChannels = channels.size(); // The number of Data Channels available for this lap TCHAR m_szYString[512] = {NULL}; TCHAR szLabel[50][MAX_PATH] = {NULL}; // Assumes that we will have no more than 50 Y-Data channels + TotalYChannels = channels.size(); // The number of Data Channels available for this lap DATA_CHANNEL eChannel = *i; if( !eChannel ) continue; float flVal; @@ -2010,111 +2034,124 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps GetDataChannelName(eChannel,szChannelName,NUMCHARS(szChannelName)); char szVal[MAX_PATH]; - GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flVal,szVal,NUMCHARS(szVal)); + GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flVal,szVal,NUMCHARS(szVal)); // Value for data channels + + TCHAR szDate[100]; + pLap->GetString(szDate, 9); // Truncated timestamp of this lap, to used to name it // Let's load the Listview with this result TCHAR lstVal[MAX_PATH] ; swprintf(lstVal,NUMCHARS(lstVal), L"%S", szVal); -// LPWSTR result; wchar_t result[MAX_PATH] ; bool b_LV_ChannelFound = false; // ListView boolean for Data Channel searches // First set up the Main listview item (Data Channel Name) for the first lap int i_TextResult = 0; // Data channel matching integer - if (iLap == 0) + if (iLap == 0 && iChannel == 0 ) { p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; - p_ADlvi.iItem = iChannel; // Which Data Channel subscript - p_ADlvi.iSubItem = iLap; // Which Lap subscript - p_ADlvi.lParam = iLap; -// std::wstring strPos(szChannelName); -// result = (LPWSTR)strPos.c_str(); + p_ADlvi.iItem = 0; // Which Data Channel subscript + p_ADlvi.iSubItem = 0; // Which Lap subscript + p_ADlvi.lParam = 0; + swprintf(result,NUMCHARS(result), L"Laptime"); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(AD_hWnd, &p_ADlvi); // For the first item line let's use the Lap Start Time for Identification + + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript + p_ADlvi.iSubItem = 0; // Which Lap subscript + p_ADlvi.lParam = 0; swprintf(result,NUMCHARS(result), szChannelName); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(AD_hWnd, &p_ADlvi); + ListView_InsertItem(AD_hWnd, &p_ADlvi); // Put in the Data Channel name next + b_LV_ChannelFound = true; + } + else if (iLap == 0 && !iChannel == 0 ) + { + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript + p_ADlvi.iSubItem = 0; // Which Lap subscript + p_ADlvi.lParam = 0; + swprintf(result,NUMCHARS(result), szChannelName); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(AD_hWnd, &p_ADlvi); // Put in the Data Channel name next b_LV_ChannelFound = true; } else // Let's match up the Data Channel Name with those in the first lap for displaying in-line { // First let's get the channel name for this data channel - wchar_t szChannelString[MAX_PATH]; - p_ADlvi.iItem = iChannel; // The first lap's data channel name + wchar_t result2[MAX_PATH]; + p_ADlvi.iItem = iChannel + 1; // The first lap's data channel name p_ADlvi.iSubItem = 0; // The first lap's subscript p_ADlvi.lParam = 0; - p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.mask = LVIF_TEXT; p_ADlvi.cchTextMax = MAX_PATH; - ListView_GetItem(AD_hWnd, &p_ADlvi); - swprintf(szChannelString, NUMCHARS(p_ADlvi.pszText), (wchar_t*)p_ADlvi.pszText); - -// std::wstring strPos(szChannelName); -// result = (LPWSTR)strPos.c_str(); - swprintf(result,NUMCHARS(result), szChannelName); - -// ListView_GetItem(AD_hWnd, &p_ADlvi); // Get the pointer to the LV item -// swprintf(szChannelString, p_ADlvi.cchTextMax, p_ADlvi.pszText); // Get the text from the LV Item - i_TextResult = wcscmp((LPWSTR)p_ADlvi.pszText, result); // Compare the wide strings to see if they match + swprintf(result2,NUMCHARS(szChannelName), szChannelName); // szChannelName is the current Data Channel name we want to add the value to the LV + i_TextResult = wcscmp(p_ADlvi.pszText, result2); // Compare the wide strings to see if they match if ( i_TextResult ) // 0 if they match, <>0 if they are different { // Items don't match. Let's see if the data channel exists in the array - for (int chan = 0; chan < TotalYChannels; chan++) + for (int chan = 0; chan < iTotChannel; chan++) { // First let's get the channel name for this data channel - LPWSTR result2; - wchar_t szChannelString[MAX_PATH]; - p_ADlvi.iItem = chan; // The first lap's data channel name + p_ADlvi.iItem = chan + 1; // The first lap's data channel name p_ADlvi.iSubItem = 0; // The first lap's subscript p_ADlvi.lParam = 0; - p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.mask = LVIF_TEXT; p_ADlvi.cchTextMax = MAX_PATH; if (ListView_GetItem(AD_hWnd, &p_ADlvi) ) // Returns TRUE if it gets an item { - swprintf(szChannelString, NUMCHARS(p_ADlvi.pszText), (wchar_t*)p_ADlvi.pszText); - - std::wstring strPos(szChannelName); - result2 = (LPWSTR)strPos.c_str(); - - // ListView_GetItem(AD_hWnd, &p_ADlvi); // Get the pointer to the LV item - // swprintf(szChannelString, p_ADlvi.cchTextMax, p_ADlvi.pszText); // Get the text from the LV Item i_TextResult = wcscmp((LPWSTR)p_ADlvi.pszText, result2); // Compare the wide strings to see if they match if ( !i_TextResult ) // 0 if they match, <>0 if they are different. Break loop if we found a match { - // p_ADlvi = p_ADlviTemp; // Re-assign the List View pointer iChannel = chan; // Set the LV Item subsript to the channel's number b_LV_ChannelFound = true; // Set the "Channel Found" flag break; } } } // End of Data Channel searching loop - if ( !b_LV_ChannelFound ) // Data Channel doesn't exist in the list. Let's add it and the value. + if ( b_LV_ChannelFound ) // Data Channel was found, now add the value to it + { + // Now populate the listview subitem with the datapoint value, if it's valid + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript, +1 for "Lap" row + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; + swprintf(result,NUMCHARS(result), lstVal); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + } + else // Data Channel doesn't exist in the list. Let's add it and the value. { p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; - p_ADlvi.iItem = TotalYChannels + 1; // Which Data Channel subscript + p_ADlvi.iItem = iTotChannel + 1; // Which Data Channel subscript p_ADlvi.iSubItem = 0; // Which Lap subscript p_ADlvi.lParam = 0; -// std::wstring strPos(szChannelName); -// result = (LPWSTR)strPos.c_str(); - swprintf(result,NUMCHARS(result), szChannelName); - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); + swprintf(result2,NUMCHARS(szChannelName), szChannelName); + p_ADlvi.pszText = result2; + p_ADlvi.cchTextMax = wcslen(result2); ListView_InsertItem(AD_hWnd, &p_ADlvi); // Now populate the listview subitem with the datapoint value, if it's valid p_ADlvi.mask = LVIF_TEXT; - p_ADlvi.iItem = TotalYChannels + 1; // Which Data Channel subscript + p_ADlvi.iItem = iTotChannel + 1; // Which Data Channel subscript p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly p_ADlvi.lParam = iLap + 1; -// std::wstring strVal(lstVal); // Data conversion -// result = (LPWSTR)strVal.c_str(); // Another data conversion swprintf(result,NUMCHARS(result), lstVal); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); ListView_SetItem(AD_hWnd, &p_ADlvi); - TotalYChannels = TotalYChannels + 1; // Increment the total number of data channels - b_LV_ChannelFound = false; // Set the channel search flag to not found + + iTotChannel = iTotChannel + 1; // Increment the total number of data channels in the LV } // End of data channel add test + + b_LV_ChannelFound = false; // Set the channel search flag to not found } // End of Data Channel not matched test else { @@ -2124,16 +2161,37 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps if (b_LV_ChannelFound ) { // Now populate the listview subitem with the datapoint value, if it's valid - p_ADlvi.mask = LVIF_TEXT; - p_ADlvi.iItem = iChannel; // Which Data Channel subscript - p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly - p_ADlvi.lParam = iLap + 1; -// std::wstring strVal(lstVal); // Data conversion -// result = (LPWSTR)strVal.c_str(); // Another data conversion - swprintf(result,NUMCHARS(result), lstVal); - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); + if (iChannel == 0) // Put in Lap Name if it's the first row + { + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = 0; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; + swprintf(result,NUMCHARS(szDate), szDate); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; + swprintf(result,NUMCHARS(result), lstVal); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + } + else // Populate with the data channel value + { + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript + p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly + p_ADlvi.lParam = iLap + 1; + swprintf(result,NUMCHARS(result), lstVal); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(AD_hWnd, &p_ADlvi); + } } } // End Data Channel checking loop iChannel++; // Increment the Data Channel counter and try to pull the next Data Channel information From 473bdcc03b47782f3e8e98769ee7aafdd4640749 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Tue, 10 Feb 2015 23:39:27 -0700 Subject: [PATCH 024/112] Final tweaks to AllData --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 2 +- PitsideConsole/PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index bdd9ad4..2d01b2b 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -2052,7 +2052,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps p_ADlvi.iItem = 0; // Which Data Channel subscript p_ADlvi.iSubItem = 0; // Which Lap subscript p_ADlvi.lParam = 0; - swprintf(result,NUMCHARS(result), L"Laptime"); + swprintf(result,NUMCHARS(result), L"Time"); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); ListView_InsertItem(AD_hWnd, &p_ADlvi); // For the first item line let's use the Lap Start Time for Identification diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index a45d599..955f478 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -90,7 +90,7 @@ BEGIN END // Dialog box for displaying all data for a given point -IDD_ALLDATADISPLAY DIALOG 250, 75, 375, 250 +IDD_ALLDATADISPLAY DIALOG 250, 75, 375, 225 STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP CAPTION "Data Point Information" FONT 10, "MS Shell Dlg" From f0fe80dc104fcf933f5e376d1302d4262801e472 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Wed, 11 Feb 2015 09:24:58 -0700 Subject: [PATCH 025/112] 2.003.0034: X-Axis KM option enabled, All Data display initially finished --- PitsideConsole/PitsideConsole/LapData.cpp | 23 +-- PitsideConsole/PitsideConsole/LapData.h | 177 ++---------------- .../PitsideConsole/PitsideConsole.cpp | 18 +- .../PitsideConsole/PitsideConsole.rc | 2 +- PitsideConsole/PitsideConsole/settings.txt | 2 +- 5 files changed, 35 insertions(+), 187 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 002f176..30ec619 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -290,19 +290,6 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) } } -bool bXAxisUnits(XAXIS_PREFERENCE xConvertTo) -{ - - switch(xConvertTo) - { - case XAXIS_PREFERENCE_LAT: return false; - case XAXIS_PREFERENCE_KM: return true; - } - CASSERT(UNIT_PREFERENCE_COUNT == 3); - - return false; -} - float ConvertSpeed(UNIT_PREFERENCE eConvertTo, float flValueInMetersPerSecond) { @@ -876,10 +863,14 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende const double dX = p.flX - ptLast.flX; const double dY = p.flY - ptLast.flY; double d; -// if ( p_sfLapOpts ) -// d = fReturnDistanceInMeters (p, ptLast); // Return the distance in meters -// else + if ( SetDistance(-1) ) + { + d = fReturnDistanceInMeters (p, ptLast); // Return the distance in meters + } + else + { d = sqrt (dY*dY + dX*dX); // Return distance in Theta of Long/Lat. Needed until Jason fixes web-side GUI + } dDistance += d; m_lstPoints.push_back(TimePoint2D(p)); ptLast = p; diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 5723d57..7328ed3 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -57,6 +57,7 @@ LPCSTR GetUnitText(UNIT_PREFERENCE eUnits); void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch); void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch); const double fReturnDistanceInMeters (const TimePoint2D& p, TimePoint2D ptLast); +static bool b_Distance; // Whether or not distance is reported in KM or LAT bool FindClosestTwoPoints(const TimePoint2D& p, double dInputPercentage, const vector& lstPoints, TimePoint2D* pt1, TimePoint2D* pt2); @@ -108,6 +109,23 @@ class CExtendedLap swprintf(lpszBuffer, cchBuffer, L"%02d:%02d:%02d - Laptime: %s", m_tmStart.wHour, m_tmStart.wMinute, m_tmStart.wSecond, szTime); } } +static bool SetDistance(int b_KmOrLat) // Function to set X-Axis units in either KM to Latitude/Longitudinal degrees + { + if( b_KmOrLat == -1 ) // Read the existing state of the switch + { + return b_Distance; + } + else if( b_KmOrLat == 1 ) + { + b_Distance = true; + return true; + } + else + { + b_Distance = false; + return false; + } + } static void GetStringHeaders(vector& lstCols, vector& lstWidths) { lstCols.push_back(L"Time"); @@ -211,162 +229,3 @@ class CExtendedLap mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated }; const TimePoint2D GetPointAtTime(const vector& lstPoints, int iTimeMs); - -/////////////////////////////////////////////////////////////////////// -// Added for LapOpts settings -/////////////////////////////////////////////////////////////////////// -/* -//struct SETXAXISDLG_RESULT -//{ -//public: -// SETXAXISDLG_RESULT() -// { -// fCancelled = true; -// } -// bool fCancelled; -//}; - -class CXAxisDlg : public IUI, public ILapSupplier -{ -public: -// CXAxisDlg(ILapReceiver* pLapDB, CExtendedLap* pLap, SETXAXISDLG_RESULT* pResults, int iRaceId, LAPSUPPLIEROPTIONS* i_sfLapOpts) : m_pLap(pLap), m_pResults(pResults), m_iRaceId(iRaceId), m_sfLapOpts(i_sfLapOpts) - CXAxisDlg(ILapReceiver* pLapDB, CExtendedLap* pLap, int iRaceId, LAPSUPPLIEROPTIONS* i_sfLapOpts) : m_pLap(pLap), m_iRaceId(iRaceId), m_sfLapOpts(i_sfLapOpts) - { - m_pLapDB = pLapDB; - m_pLap = pLap; - }; - - virtual void NotifyChange(WPARAM wParam, LPARAM lParam) {DASSERT(FALSE);}; - virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual DWORD GetDlgId() const {return NULL;} - - // <-- returns which laps you want painted - virtual vector GetLapsToShow() const - { - vector lstLaps; - lstLaps.push_back(m_pLap); - return lstLaps; - } - // <-- returns all the laps - virtual vector GetAllLaps() const - { - vector lstLaps; - lstLaps.push_back(m_pLap); - return lstLaps; - } - // <-- returns how you want the laps shown: this can be a map or a data plot - virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const - { - return LAPDISPLAYSTYLE_MAP; - } - // <-- returns what data channel you want to use for the x-axis - virtual DATA_CHANNEL GetXChannel() const - { - return DATA_CHANNEL_X; - } - // <-- returns what data channels you want to use for the y-axes (can be 1 or more) - virtual vector GetYChannels() const - { - return m_lstYChannels; - } - // <-- returns the actual data channel object for a given lap. - virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const - { - return m_pLapDB->GetDataChannel(iLapId, eChannel); - } - // <-- returns the x and y bounds for all the laps - virtual FLOATRECT GetAllLapsBounds() const - { - FLOATRECT rc; - rc.left = 1e30; - rc.top = -1e30; - rc.bottom = 1e30; - rc.right = -1e30; - - // changed this so it returns the bounds of the reference lap. This way, data-viewing isn't ruined by errant points - // it used to be based on all the laps, but if you had just one messed-up lap it would make viewing pointless - if(m_pLap != NULL) - { - const vector& lstPoints = m_pLap->GetPoints(); - for(int x = 0; x< lstPoints.size(); x++) - { - const TimePoint2D& p = lstPoints[x]; - rc.left = min(rc.left,p.flX); - rc.top = max(rc.top,p.flY); - rc.bottom = min(rc.bottom,p.flY); - rc.right = max(rc.right,p.flX); - } - } - return rc; - } - - // guide-parameter functions - these configure the background horizontal/vertical lines - // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw - virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw - virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) - virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) - virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) - { - return 0.0f; - } - // <-- returns the absolute lowest value we want to display for a given data channel type - virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const - { - return 0.0f; - } - // <-- returns the absolute highest value we want to display for a given data channel type - virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const - { - return 0.0f; - } - - // highlighting functions - // <-- only call if you are a HighlightSource. Sets the time in milliseconds that should be highlighted. - virtual void SetLapHighlightTime(const CExtendedLap* m_pLap, int iTimeMs) - { - m_mapLapHighlightTimes[m_pLap] = iTimeMs; - } - // <-- gets the time in milliseconds that should be highlighted. - virtual int GetLapHighlightTime(const CExtendedLap* m_pLap) const - { - DASSERT(m_mapLapHighlightTimes.find(m_pLap) != m_mapLapHighlightTimes.end()); // this should have always ended up set from the "master" highlighter. This function is only called by "slave" highlight-users - return m_mapLapHighlightTimes.find(m_pLap)->second; - } - // returns whether the caller should be a lap highlighter (calling SetLapHighlightTime) or a lap highlight-receiver (calling GetLapHighlightTime) - virtual bool IsHighlightSource(int iSupplierId) const - { - return true; // Allow the Set Split Sectors to be highlight source - } - // <-- gets more display options. - virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const - { - return *m_sfLapOpts; - } -private: -// void GetSplitPoint(int x, SplitPoints szTempSplit, HWND hWnd); -// void ComputeSectors(); -// SETXAXISDLG_RESULT* m_pResults; - int m_iRaceId; - ILapReceiver* m_pLapDB; - LAPSUPPLIEROPTIONS* m_sfLapOpts; - CExtendedLap* m_pLap; - ILapSupplier* m_sfSectorDisplay; - vector m_lstYChannels; - map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls - int m_iSupplierId; -// CLapPainter p_sfRefLapPainter; - -}; -*/ \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 2d01b2b..a914de9 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -489,11 +489,10 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return pDevMode; } /////////////////////////////////////////////////////////////////////////////////////// + HWND hWnd_AllData; // AllData window control handle + HWND AD_hWnd; // AllData listview control handle + LVITEM p_ADlvi; // Listview global pointer for Hot Laps -HWND hWnd_AllData; // AllData window control handle -HWND AD_hWnd; // AllData listview control handle -LVITEM p_ADlvi; // Listview global pointer for Hot Laps - LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if(m_sfLapPainter.HandleMessage(hWnd,uMsg,wParam,lParam)) @@ -504,7 +503,6 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps // Update and show Current Lap Time TCHAR szTemp[512], szLap[512]; HWND hWndIp = GetDlgItem(m_hWnd, IDC_LIVELAPTIME); - static HWND hWnd_AllData = NULL; // Window handle of dialog box to show all data points for a lap static WINDOWPLACEMENT w_AllDataWindow; // Save the location for the AllData display window ::FormatTimeMinutesSecondsMs((float)(timeGetTime() - tmLast) / 1000, szLap, NUMCHARS(szLap) ); swprintf(szLap, _tcslen(szLap) - 2, L"%s", szLap); // Remove the fractional time @@ -521,6 +519,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps vector lstWidths; CExtendedLap::GetStringHeadersXAxis(lstCols,lstWidths); m_sfXAxis.Init(GetDlgItem(m_hWnd, IDC_XAXIS),lstCols,lstWidths); + CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file } { vector lstCols; @@ -776,7 +775,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps case ID_OPTIONS_XAXIS_KM: { m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_KM; - bXAxisUnits ( XAXIS_PREFERENCE_KM ); + CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file MessageBox(hWnd, L"X-Axis will be displayed in KM's\n\nYou need to re-load the Race Session for this change to take effect!",L"NOTICE", MB_OK); UpdateUI(UPDATE_MAP | UPDATE_MENU); return TRUE; @@ -784,7 +783,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps case ID_OPTIONS_XAXIS_LAT: { m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_LAT; - bXAxisUnits ( XAXIS_PREFERENCE_LAT ); + CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file MessageBox(hWnd, L"X-Axis will be displayed in Latitude/Longitudinal degrees\n\nYou need to re-load the Race Session for this change to take effect!",L"NOTICE", MB_OK); UpdateUI(UPDATE_MAP | UPDATE_MENU); return TRUE; @@ -1592,7 +1591,7 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps } ClearUILaps(); - LoadLaps(g_pLapDB); + LoadLaps(g_pLapDB); UpdateUI(UPDATE_ALL); } } @@ -1785,7 +1784,6 @@ LVITEM p_ADlvi; // Listview global pointer for Hot Laps { SendMessage(hWndReference, WM_SETTEXT, 0, (LPARAM)L"No Reference Lap"); } - HWND hWndMessageStatus = GetDlgItem(m_hWnd, IDC_MESSAGESTATUS); SendMessage(hWndMessageStatus, WM_SETTEXT, 0, (LPARAM)m_szMessageStatus); @@ -3396,7 +3394,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine case 0: case 1: { - x_sfLapOpts.bXAxis_KM = sfSettings.bXAxis_KM; // Assign choice of LAT or KM for X-Axis setting from Settings.txt file + x_sfLapOpts.bXAxis_KM = sfSettings.bXAxis_KM; // Assign choice of LAT or KM for X-Axis setting from Settings.txt file break; } } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 955f478..a7f20f2 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -201,7 +201,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0033\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0034\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 PUSHBUTTON "OK", IDOK, 5,100,240,24 END diff --git a/PitsideConsole/PitsideConsole/settings.txt b/PitsideConsole/PitsideConsole/settings.txt index 834034e..779d5bd 100644 --- a/PitsideConsole/PitsideConsole/settings.txt +++ b/PitsideConsole/PitsideConsole/settings.txt @@ -4,7 +4,7 @@ 1 0 0 -0 +1 order of settings: -whether to run the http server (0 = don't. 1 = do) -http server port (port 80 makes for easiest use. big port numbers like 63938 are less likely to be blocked) From c1dc3f20096eea8bd7e4d92ec73b90cb8f708240 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Wed, 11 Feb 2015 13:44:07 -0700 Subject: [PATCH 026/112] 2.003.0034: All derived Data Channels added. Final display tweaking --- .../PitsideConsole/PitsideConsole.cpp | 30 ++---------------- .../PitsideConsole/PitsideConsole.rc | 4 +-- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1905635 -> 1945993 bytes 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index a914de9..976c3c0 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -574,7 +574,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfLapOpts.flWindowShiftX += moveX; m_sfLapOpts.flWindowShiftY -= moveY; } - UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); + UpdateUI(UPDATE_MAP); return 0; } case WM_LBUTTONDOWN: @@ -622,7 +622,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) lstCols.push_back(L"Lap 8"); lstCols.push_back(L"Lap 9"); lstCols.push_back(L"Lap 10"); - lstWidths.push_back(120); + lstWidths.push_back(130); lstWidths.push_back(60); lstWidths.push_back(60); lstWidths.push_back(60); @@ -1730,7 +1730,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_ALLDATA)) { UpdateAllData(); - UpdateDisplays(); } if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_DASHBOARD)) @@ -1975,30 +1974,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // For each lap let's get all of the available data channels for display int TotalYChannels = 0; // Total numbber of Data Channels availalbe for this lap int iLapId = pLap->GetLap()->GetLapId(); - int iLapTime = pLap->GetLap()->GetStartTime(); // Get the start time for the lap, use it for the ID in the LV -/* - pTime->Init(GetLap()->GetLapId(), DATA_CHANNEL_TIME); - pLapTime->Init(GetLap()->GetLapId(), DATA_CHANNEL_ELAPSEDTIME); - pLapTimeSummary->Init(GetLap()->GetLapId(), DATA_CHANNEL_LAPTIME_SUMMARY); - pX->Init(GetLap()->GetLapId(), DATA_CHANNEL_X); - pY->Init(GetLap()->GetLapId(), DATA_CHANNEL_Y); - pDistance->Init(GetLap()->GetLapId(), DATA_CHANNEL_DISTANCE); - pVelocity->Init(GetLap()->GetLapId(), DATA_CHANNEL_VELOCITY); - */ -// set channels = g_pLapDB->GetAvailableChannels(iLapId); // Get all available channels for this lap - - // let's add the rest of the data channels... - set channels = g_pLapDB->GetAvailableChannels(iLapId); - for(set::iterator i = channels.begin(); i != channels.end(); i++) - { - const IDataChannel* pChannel = g_pLapDB->GetDataChannel(iLapId,*i); - if(pChannel) - { -// AddChannel(pChannel); - } - } - - + set channels = pLap->GetAvailableChannels(); // Get all of the data channels for this lap if ( !iTotChannel ) iTotChannel = channels.size(); // Only update the first time through the LV creation loop for(set::const_iterator i = channels.begin(); i != channels.end(); i++) // Loop through them, insert them into our "all data channels" set { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index a7f20f2..7b6ab78 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -90,13 +90,13 @@ BEGIN END // Dialog box for displaying all data for a given point -IDD_ALLDATADISPLAY DIALOG 250, 75, 375, 225 +IDD_ALLDATADISPLAY DIALOG 250, 75, 400, 250 STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP CAPTION "Data Point Information" FONT 10, "MS Shell Dlg" BEGIN CTEXT "****Data Details****", IDC_RACE_TITLE, 5,5,365,12 - CONTROL "", IDC_ALLDATADISPLAY, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,20,365,200 + CONTROL "", IDC_ALLDATADISPLAY, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,20,390,225 END // Dialog box for displaying sector split times diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index 50b8c6e4db15306ebdfc03b40431fe71abd270c8..354cec69e3970ce3d1e2325ab4eb697e5b3846f1 100644 GIT binary patch delta 162398 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

-u< zfLyyo{MqJ(h(5QqK!5+W-->3cB?E6F{o*b@piF;sLHhcurx`5@d*F*uLwgiUa$ac7 z58z(A+Z`t|IteK7n#ev2;Vf_oNNn;9k3_o2 zJlIqS?S6?thV5Yz4bmyao57=Mi4Ukn1KrhFOH}1-zoFFHvwM~+J=f_Md`+xJ7WJf& z9Dyh#z$%N2%*}xkr0<`!tNM)ZIEX26%NvHr0hU!4GhGI_6L!!K&GAO`Vlv4SSY-k; zEA-t-sfYujGFfO3@Ht{z8-#JkcV9E{G=u97DTSg&RJqs-^`({4IM_`4&Q+!;Kz<$= z;NLruii_xgw>;>(TN;xGHV`n- zuyJ4L{{_LJn+{^y1&YBueCFV{OJTm!FZzg>UP7DiiuM`a9R+&EkB>4BfP{y6CVgn8 zd`X5KBb<8YJjdrun?;~yh~IFGpxJVQr5mlJbs1fR;v=zFA?*L@I2&WAQ4u+6+6+pPKh=z`zW9EO$tW7Dq`;zbgdoQ_17bb~tVFjiI~rj}x~UL25yr zQxTil`h#E=dD{H>qft1+K}^dZ6>u9fy2Yf-zn?LuXoxIa_t^q2|x~2iDl5?r( z?L}0}QD1QMzu(i}F>}8p2;i~cD{t$YQc}cii@Q@Go^j(0+{GcOMC&pZ#+Kj^6!Apd zQ#GYr$K~j)AgB0w{I;tp;9rg@?A+9?!3-xTD!`U#B_?((eknmG0sTLWy#-JpO_L@( zxH}B)?(XjH?t{C#_Q2ro?(XgmgS!qegS#`h!|}b}?tix%`(IpSWLH#VS9W%HX;=1> z=g;euSyj4L^jlPc5Mzy*jx-Y`>I`IW%m~h1mZ{aH-iVo-C$G|!MsJNn)A|q(?pq*3 z2s!(gfwnK`?8g{pt4G%TC5Rhy?$`C@n%(V4_BbKzV}O9)+pI}I%E<*HVgmoo!nSfz zt9ygkJNFB>Z}J!2%+@doyiUU~WtJNt*Wn=^;~RBNWx?fs3`$9~f+Rk*@QRg1txn!V zn-ms9Tu!S(d*JVpX2RU?UE$^*KlCU|c%gpR9d(9YrM?yTAb>6HyWgG0L~{-seWGxFT7Hb+Y9E33uNFARlR|bYmk;B$S}km(S=@TM3o(_>y5<&t=uDG z#*z+Iwi0B{(xFSF5w>hH@^kfT@M9d%a9tMpK45*!N>2C+yi$V$(l&8-5~ihOK7|(~ z#vxX(R{e_ptHn@(no(t;=^-YyMHiA&Ysgyrtp?XAuoRxB#nDX~^_hHlZw(TM9L)`z zikxnT_=LG@OO438p?x=+&P}!eG(Q38<TdQ9e>pI^Fxtq>3gNe|R0#$;_Dw@bIK{q;F2FK;fM+>(uG?#Iv_ z43o}LJ6l_;R$%uCet7EYFL$t=oM%5rM!!Ry9zA0JADcg^w#lGysfY{0^y7Lk^|eeCbX%t@f_fLZ_F|ShoY-?*j|Fm-EItZ={|GmKP>g^1Eh&bu+tuO+AjaKl$0e^i{prGHH zNib_*X`FKd-_sZk7$#D)2=|{eri}!kvk_MFf3&qJzui-(A96*i;KNz?@J%Al z7u$4z@+9ZPUhr9`ebY{3wkDTbf9QchIeLnRiLBKBz+p-L6GJecFh*R)neW!2gbGb2xNAAnOk9j`9f3$MrP zpT#KbY>`IW$r8~5Bz35Tgq`_d*9tp2cdi1baQ2cgCG>cme(LT86AftQ<%shiV5o*5 z;fFjNjLj2sbt84}y1!du>#GCyVaEo=BpBiu%XX7zIgWm7wbSgUtuv?_sv<1v>CB$O zU_#tcS~S*jNf^6irWRF3Pr+$^p>^(RC&LJbakEwcgA$wtgoES`sBlg-X&9p5@ef@< z2rTC{F&5J(*LX^1` zmw2`%39_sbRN}QBQk}&_FXKXchk2-p{o)5_)|2KDG#Y>6Gk21!0Apy{bW}T3`)YD9 zIPuLzdP0v0&^#a+LoA4G6F$lix)^P9PdlM#&__6czE8qG?s>}6w5_u}eXcIxI-?yz z5Zo+`yUYT@63YK>eZviKB@8bys!zcB&21ifD|X@84uvOEIAh~g`WkSuJf^QV zPbNZ8LTx)HrrB7NaE#~#zYFgT*70djgZw^cnm?Za2=Ek-Pst|X6^=a9wD7|o|71ho zIT0Knu+RPlv!p`7gF9qo7A{zD^o3ctQPZ0@MhoT%AC{~cx166i+FXF4hWr?^0yU38 znI;-Ctg0WoUHf*ZK)LB3Xw4J8kRJ0mfW=EL%JN8Q3(mdaabsn(EFPA)RTIMa7X1PG zy~ED?-&1&G#jpSL5yY+IDj4P^sl*>x6aXhT+kc(BM{E4C{v-4mTK9?k2C!d2`~^Ts|^+3S|o}qYqQkrPUeGvews5$BOsY#lXVp6 zJ5$ZjBO=pVlLLW#f9x}KB|*`T7J^a7InL?=Au;#@BZpy9Tz3f)4;7z@7B5Tdqrz^Y z!c@X-GQL%YMX(hmuw+(v;$NUz{bSIIBe?7>oul7+e)MqumE0iz8 z8{G?KI4tuG;T+b$$vOLFY>_Rjr0q$V)hXp}a`qqr_hx7wXee@KsNt-FGj65 z5}pw?n_LPos4tYR2r#K?vanjtvwm%ugcdyQrZ{$I-Kd-pn9l68AJhG}(Wy*}(8g>)(BhIR=PoL`V+RMt|P;PJ`0#JCc z0HgUBC1VF5>1P*^r_r3pU$}JU(}~E+al8|-8HkShcb;A%Svel48*g-f`$3~?KUAp9kuEy(PTll1gSn;rhWk!n*`O*3fDR*q5sg^A00$4O`*K7#Lr$J~@Fo)wQj>7#iJas6Kx94Swa3e!`Q#%p07}lO5INX zZb{#9G5=$~v-3Of$qm`zko+e)!%p2Rit?_^ zk&7#WBwSWW14_;bAZOvZ?1nM?UAMoKz|JqgXBqv-_xuTNcO|jScK^uLz;$l##aHZ^ zdgZJ!puGi;!#mC+?TPd#lDr4!K9T>cj06uZBa5kPpIxMkm~A@9F6>L8>M1EeRKZyv zz5(ukz5`xhkyS-F1cq4a^tE}$Nkt4di+@{kE1vE-q){>>ti|53fOIany2dBQuBlkQ z;}*t9EE-LR4_PE@PgyjLPSZEK--P|~mfUjo730g3%K84XYkZCaC_24H(d(c4hnV?wpl2I{Bm$^eh zz9E)T;UdYtPuf%EEg~)LEKT|dE>=q8pCKPi^G;fKo>j>_0f#Xv;NbxrQ9(O}jup~# zzQo&5c*m%5Zp;qMA#XlRCVAOUh9;Kfb90=B6|X?1$pp?*PsX)Q5A3A*P)xs3T~U2U zfAu*4PY+=;>+{BsWhElJVGZUenWrhzr6r(#Jw3oJK~I!ikHFX$JD87BgusrvVTZmM z$=b3quJ!%ZvL2K02q6gEd8BHD)z$LOHR#E3@+_Z=NG$Z+$q+v8+OAoM>#PV|_!%)l zkuS`3QHQp{UxE0wQCRF?Y~~@1wm=H?@bGwM-!7ROT{IYF5ydP z3$`(mk?v6zeEh|*!3))tTMyx0wo6le3%@jo@j7kux?)^bIe6voq({ z@Z)wm%bntjpn|(TdU;UzzC~pMgIfjCG>6(x%5LE!qK$jMk`C8hU%OU0M9|oY9N9;u z#&spq1sFw!O;K{-LrOP~tcd4Gt(WN8d*Ya(39DIV-N?y5-+>HaGr;peM!K7~fU#>M z!SgJ;EwItuwfmh?KwidFv0Fl@b&Y7AR=c;PHfKqv-pm>I>T4hnVPwhCMh_c#u|9y% zC-~G!Z6(&RLh3eOYk<>9CEXvkWT+BwO)VLt5e>-=9 zGqW;tv<8!6l0qP$NxSRU&F~z5q=NFY{Zkr*J5~7)8hz+96=v%*71pc@2K z+fcuxt?Ted2GJiW?t>}zs}gO-oK(YC@$U!o_R}pEKPdjJi_Zv@wVdJHAv7eqbo9Q* z;Z1o;%uC((&`0oeDB(rC3Lr|?S4!UBpD&gE3FZB&Z`hdGsq22@>*aK3z{0R{^LicF z2>tGq63&F0U~9b`q*Y5{8`!2spxEaqiYnty7YC7L66jQ5dMopEbx@ z2Rh6qBk(*(Fj*OXO1VQYCVOEe4pX5cZ&F1yV)-YsSu7Qto>)X!|E{||@%vRj3QiDp zCf?KH`wOtsCkQP!!N-;S#t2n@ygZjWe^^R|$wYa_ zGiI)h>DP!wgF<{bQeI(;&W0@p=`wyI+P`^P#03CKhanqr#hY`d5m``E=DUyvJ$rQA zpe?UOELBHU@x5%(5i|L>IF1bBk>)slqCWNeyrMcJ<6_)9``a-*47vDDnGa-15TEk0 zO%x3Ep$nh45>rU*Zn1@5yt7rPi#9Mt$Mw!%e5CM;tEzACiGLO&jJ z=e7V#0-+zIFAlY~U&li>>J>RKw~L5%Ur`1}*1~##IV~n+Z7U^PyxA&c$56p3tU3Ss zpOf8l%1g0~fA?S&-XlHp`4k0D$!+-|8}~~dLmo774lO6X)Fnh^t}$(Dm>$5}36Wtw zx_1&$MAs2%{)ucr#}=2On`_IJDs^bX2g%eb>JYwsP$|r@&6jsDzpM_SD7(;Rwbu_s znP)M6#&=taVMa_5h_BxsnM!cY9lwq$5*IRm+0q|=u7l?;8{s=7@xKoKUX_4?%uA<3z+LqqAFY5`QUT5 z_zOx?{k-lX4Ug|cLPv=a6@gcJe`gL~99>pluRh;7;!EKE?*OyQk+q zhPJYAN$@R|^aV=`BBmnX495b6tYW%MnLStqwiYcoi~^lO9QxSSp+0{*Doj~9v~gpA zJ5a_ew}350BW)Ja8WSSv;VEQRJ;=! zVAee?D698{vm5xvc~D(X;RJ0L-l)PDHcx;oj4IveBAk>1N}_v%9A>-vk&Au~r!)Ye z(QAOz1e){&hJJX=Y~cY;bpfyBEAkz03Jk>AlrR=TkDtI(3@}D3J2VT1W>m)vAN<3b z?Vl+yQe#=#-nD?#1cV2ehfso7xS2+2hLZ7SX?VBS`d^uLNE+9zW$deK3Yd_&H zw)`ce*y*cnjiPr$lL6^KWvCW*ojwZ)@3=ENu9``f21zrln)+_$rk+l~@EqTs5}U+jQO7qf!HZ9)yyYox zQmGebW_S8^4zJ+wUh6KBhYqiMuRo>KYR1Y+&ibpYpmI#vY8bQ*q8G}VvvtE$)%w?c^m^Vd6;GvQC zSHs6}FcirfrO&z%>X!YZ3cf_K2cqJ(*x*F#9w?vtA>alaF=^G6FC zB16A0aVR{Zh$-Oej@edHs2O?W+&*C|6hwg)TMnm>tN2i%>GwErih<%(;U`y?%OiON ze6n>aHnEq&b$C&hO@vcxMpktbQa!l~1)r_o+Q`>@Z8lSpQNnixS{symn9yQ&U!9&s z0gFn^Xse1r>TEY(lfU);sp8m8fbMAO4g43o|$xajH+= zlDaiFH|Pg*j~V05+AzG&iGep56=3Dc4~{$o%Rj_A6>@Vz@pS1pIhDyuDn=cdoSb^zDmwxq;I@O)`bMm|WFTi8m60TezQOHQ zSUj#EN_rFd|4e1Gjd{o%GuDYbSIX4hv1i5We;oU|lKYcPQdVz=zAJg`Tf_IOrV`Jf zO8I90Ko7UYem|X~vZK}V$Ll*4XhmLNenCN&T${L%tX?ceL(D0N1auq<9VO}w4I&EF z%Sb+qwyi>`48vN;7xJq?sYF98QwCYAh#$P#eV>d|t+{8Y^9Q>h7nrj#*ErO<|q z*Vo_jdBNGgAlCE+0KD&APe6ajqUcs!)FogFe^%s2j58TR9zo^N2;G19QUK-Lb*ss}F? z_9f+bb`QRGJKb8NvxqS}N)pC@BE;7GvCiQvkk3G8T7YwRq26q=tA1Da)nLID4*>ZX zgU~y0#id++^j)*z=pX`y8V1$u!yh8fNcIu7?f){{k=nGJUhd4t?Qy!t{E`UNfe^{Z zkiL+plj6~!7cQ4*<%>lxl+u&}B~09?5y7{Rh<0zF>`Ypv_B|0($Ele7W>573J3eV* z_)=_SIPQeo$y;tfqh92i7w*5Hxn5G+*!GF$zL@II5;*6K;88S~O4g z=5LagyR)Ci$7P}N5Q%M0cPGb`h=UqPP*6|uQK-WZr^u}EA3z2>1px|LI%}A64hO$L z>NqK`eIbpVB(DdMq_s7Lq_4RWyz2ZJ%jOA`#`q$ZB!$UiL6Q}pkjq}{HL(V(uWilm z8Ej>w=5UHz77>?Sjb5&9BE*^4 zFY53e$pKVUOCx*kEc}I0AK`FC5ZakjQ|32Dzf3FQ_M(8v2`C0kK3k718DZ2i(XZYC z#hn4k2Q)G_v7ofvpjsgNV12N|@Ah~~5#a*DaLkY!HbpqL5XGXq%yM(AJZBu!T)kwJ zNA1IbDp$IdOq#k+8_E>+UIT2$-mRcc!HSGAD%s*XKI$5AEh;?zp|>1bf@SV+-@7>2 z#XiFjVweFedZS4=YIRUUqLe#zi*|EI;(EV+v=v3kJSh*Bn;;*m3IuThXC5(-WjzlT z_YxCNOq^*tSm1%ibukQ(cauZ0p*U8`zaii}+2Pto_g$ zmj=Fy90>afbyZ9jB$+^5-|uDc$(BSAluCq}1u&Oqja;8t+>4iSI-l&InT)V5f*V_peq)^yzXVm7)htnR^mHb z_ZebI64_{UUA_5bHqMok6zVvyg<}&4wv|77PCgl?d+#G1_mV=;3U4R;3`ELIP!R0- zbhWG>ze+3yo(@6VIfY)V;C#lJHt^VB94i6LTb-aziliNU#LCeGJH-U&*40}(sLVGm zB_5jOLr)F7t{;D;C^~z&ADO8duY5a&a%xepl$<&?8VZVfR}1IqXs+Wv3|=w#A0sEI zs0AYgKY>tv$3y=f#ukUvQk1bF;_yQSlZ(hCD#_;`7`1-4AGV?3_=Kx;7XwH4<|qWF z*}Of}Hcgv_1nYdw`?$$es+bhc;!5Sm!84_d7TVplnU!}S9<+w$;gcZWxW40@Dhe=B zs{XC&%W2DGY==b1DE-KLGj?Oqwp+<>M`0g1*hd{|_bR2?U-~LAxSzQa9b?h6-5e3< zAHK&kpM`U|h{zGZ-{T%v5`d?4KI8|iM!%5J(bZnZm$_d12dTj{18`I%AR0@buu43zqyOkJ^rP_gk;?SwdLwPxGGwZAa(uq z6thViPQci$+5E!2F}iw!I_u+&kk1?28|sI_#1BNUw1mb=myJB?!9RDYy*w>|`v4xM zD-$u2s_XB>tINBrYy|8#Y&R1`Xo(Z5eXTKO$7L)Ycn8e@4uyWmOS^guweMTcbQDpF zRelNbv_J3Z=$hd9*HE*OdQ=a7lf^RXnKyvz>()TTD+t4E)N1i7@=OTPGHZX0cejhh z=Uh7GsDq>$SbZyPb!y#=Yac8Gwve8qO{V9-#-Uy%m|Bu+R|A>KZaWiN;0x`Asw#72 znxY!MRbhe9S`lARC}~!8l$cfU)0bdppPG_uoPsFU4BBz9krcTXNwUN^VvbT%BRw9vRF zojQ`1tjd-DMZm#L-lX>8o}_JbH&}I0%7Dcded_m)_MTEHctqR7VnEBg4_prGIaK?Y zQ(H*qSNq`Xks$P*P{`j03De=%kIPLvQ(Ka}tFQ~lJuBJl^YPCmP9%ADG;o}pVf7ub z>ptU7FqL&M_lwxwV~KGC`0kN(v_4ns`a3q^<^sC7gu>z)!YQv@O zb#(xR1f_j({w`L;IdvA^OKH|s^X`No_FiK5;SIt_uuJhV7l6R=`AGilr@^D^4- za;U5#!*M`Z@+SYeCb#Z3^Jo-1vQA|;k*M=>xD%vMG)J~f{ogECXb@pStMh9y9{c_r5770?RY zWdvvMez)ZW|MjamwdoM1T5sbZK5mbEWvY6rl1{Y%^=|@d&Z*2!U73pBxcw9x8c`B1 zF$C+-Rk=!xiydcFCELiupd3acPVE#entDYyh<@?Oc$fG{Tqcfahlu>f7Y1poV3!B< zziYo+Rn%#CcRU3e2~GgbajW@i4#3%}ro5|szDD7Ud1)nm;Q*)20bYf#_3KiKqVK)DN;ski*g44d*@#64t5h5k?F8D86=Pgzju6pC6nm zpsw-na>9`# z-N%qrL8P9}&&x;8A$q5nnVKay${9PX?o9F-K7QS5-^JjMO}Fcq@9|PAqSx8I8Kba4 zY+y2`T1r3g-O~ zLzA+d1ZR8#+6W=U^i!!8aWo3uy%;d`wJp$>Gc>tVNty|(u`K6>hFZS~+X~L-vJEbc z%zZeqBq!LM-4Wv$N@ndxr8p1IoUf5bHVv{#Hw805gE@Bj>z>oIC45JQcz#{S&%yEUe~V1g;Qc6N$CZj^p4kz2_VERnNiS12GvZi{StGzd9F z=~q!9aC9~(cO`$l(O*41S_V}JMl{ns+5CnDAeJL#NI^TVh)X!>(2T2>wJxBy*L=gG z5>a*k{71?mLKt2q(m(fS5Cavhs5ZR8kKT1WnIjz9z4?zYRuAwx2(#=q_o*{o_yCRl z6)s&_Lw#-^_qg*n@i1lyaTJ;`V@MX~e$my9sH_K5Q>vAYDC#F9&`zwm|8!eQwMqs> z1m)&ReN4g%qh(=cX5#)laL_YxQZg}7QWG)CJD7?YxtdXl@vty4vormFXQWmpW66WC zr#>ZPiG8{*{8!I~Y<>A!x>l$4&mY{6%o@DqziNwvh6HdCN|At}l96T-!3}){Cy%hh znjiQOICLC+(Rtv=Bm^y*NIzB`qRFArsP~b0Puk^sEtkA~Ohi0f+g|tL`uPX(@+qiy z`>*tsCK3!*r?1rX;~8I|SeJq%AQiHF5f;C^njg3C$F=zA&o>G4K5i6o+D#x$H1a~K zTr(pX<7qfeYN6@c!TNy7&@Ry{$pW-;^ z-<06f!i5@g+9-q?zH*V_QtTL|v05X=W#!G9Kr)aUz>jfn8N>1`8bo210^2)MoY`Gz z{wiG&Y<)MzIysI`dtFcN_3<$gB7R+3)S#FPZ^}=ET}mtG)UwH#q77a>1Dz?J%p3Aq zaQq2YMBN$XO8ap)bV~4+L_raS0iMJ$kj7TQ1a}!sc>#4|K^(%l;5e2bU^tdnaZ+Fi z38a)}aaC-yMA}w)!VPmmz$j{A0OVLWB!$#88!}&<9N1@&ZD}yo!S9e1+<}DwTOy8Z z$ReUn90uU|0qJUm0Wf-SY{)4=LSXrfVmN8U-1B|#V=`c@WV8sAakgwsqRs^YTZ~+% zN7baJ{}TTc;uhXbgf##8#U-8<4@GW($oNZeU|V=mGLtJfBy12Mk>7YlVm$A79}dDF zp%sP#IiG-q#u#FXpocBRF%n6<`Yn%0$(YBBnXI(IGA@h%Qv?|%l#-K!NhyJ|ynufK z$|!N>H7SneYi5MvCleg_S2aH%Opt2E6aS=`tAeuNjRNar$a;xp=fm4j#AKZ1bfGKvq^wtR(}=<6lB8&b zN6BO`#L&28-N6*D;ckniB#lza+aT%_(fetL02Y4$Jb!FlQmFVEMQN28{rfl@vU1#n zw^7Fv_!Y#5c_=vP79Ss!K9RfmENieCL)G_6Z7e$?cgPoPA*@ey9nE;=em$+sbQ`cw zPzwf2p^#JNFXJSe{X=q=(7f<{Dc|o#(;by)Eg+Fq-@PDvf~!1uBv;c(&0I-9aweNV zZU;sIPyG2kX$4|aZsV$eDXBHBiZ22ktUNJ%l3E#C<)Vr`lK4bu$cw^)kc#-jb*2r1 ziGO)cq~t)&WJlvkkNTSU(7+@oF(w}$L&tXZpxbF24IL-9O?f1s5Blf_oYcV>&6rqs3LiQBit$~6J)yY?u{ck8?Xq04-Fqhh5cc?j1dEX zN+v~xISrs=A>&~=(f6ZMHW6bz982|3xrxbeoXqy2xKTYo79tj!7RHD<iG26qHyY zMoU_(iryVMhKgG?l!XS>4U633TDv>F^G2&GFHvTf9xg5;Gs(5`Dh{00w3QUbi0T*fGC zWKw=Y8H$vKBt@y+G1cgdRH%JSI5Ti=?SX6HH%mr#Ls{e`=r}z;%YCwsm?;@R%klPu z7vGw_ibxZe^fB>;b%5$`w~E&sqC^9Wg}6jl!*KW{Xc_hs!5zhR7*CuOQi<_r#DpZ3 zf)xH`C-im%(NJ#t-Y7qpTV&GJwpy{__WHfg0>k*MDLb*)d@T3T+98$ED4t)j4<+d^eL8uC2|{=IGkm`2H*iv^VG0SabkZ7>LSD=ZmJWc`{0GXdd5T1Q ze3rJM_^`u)`DB?S^*I-fcys+(e%FqLgs*v$_^{V6Eom#tp{l`giqQy*?9UGeH_IJm|!7(r;Z$S=r70oZg zmhLGF(E@&=?9!`-HUN1Oi}`w+Su#F-in4`ywx6JY^$NV@r2UlRBDa%tRSM%1;coc2 zRjQ9Uj!8DG!3Z!z7;x&gxMi(+R=HVYm#zoZ_?C|4D++8B?Ev(i+LqCCh( zLHJ0mE3IKN-U2ALvC?+J8BMF-2MrwU+0Lc#{93e?Y`2M9u;kHhOYNCOW*p~GLY=tQ z%20cbup@NmA)(@4(6sFZtz;W!lGrM2D5c@WFD|s=d9vDq&Pa+j`j!|dHi2TAT*6X! zYZCn(rG~oN@f(LG$9q71iS37oQMhs_j$kn&EkB5x)(%j**e^E~fk=8iL&Xi{4x5xZ zwxjlJ_Pn?rW!DimW6(uAjhL}S?1RJ^!2@!+B&>Ub2s zqL|+t-iqOzy}dt;K|Y10B;NCp+KtTl2Xpl8cW%}al>0NYGSWocC@VA8vd=?vd6X46 zns@U2=ORwkc#tBi6m~dGh#ojbl2 z9~;Zzrt43OMNM)HH`SvWsRy9A6Pd{2vc@u(0MT@8!%a>S!)X$&!;0mkPX19=Nm6Hj z%Sabws6(N`b72*cj#P(TNjRgJv+?}K(-foxv96%MhtgLe`x)21R~q^~M;yO!#nuY? z-5ggc_P(6v_P*RsDFRPV4}xzuv72w3rHt=4Tpy>8w@VLDNS!_JceNk)4jV@A`=5Y^ z!25)UhtQ#c)a7!%I(1eH>=Z`%#Hd=lm+m1iS;|fD>w4*a^=xh|Qnt6f2Oq@7pfa-1)PjA>MmneZq|eA{=HEKs?ss)vnx!atCK7?z^T>~ z#NAVrV_5R!EZuH2nyU1K`ts>P?5jQAo_|fQa3$`|tDJQ(L4G_;Y-qeMdv-&vaAQV& zIy|1rHI$mMYj4gul`8u?TC`_y9P|9&!pq@t%a3{XW#nN zt$Zv@Aa(IDQvUPOmpc2h89TB^L&_PSW?hyL8>;Nfp4^cCBP$tCWgAH~z$@178U0V$ z#ixvOUe=3Ky=RZRXD`O^n$B=9!Q&>5vHhC-;VHr5iR4qL*|SI8GiacnTKeQX*6B5x z`nm(>@aX!+GL>4~^}ENfA0&6_BGAN|Og$F6O!t+t9++cJ!EYCi2e z`#LrH!u(qUU*?r;X>Q7~%lZ~$9(M&Z@n2z*@;`)P9&T`%UUV(fua` z+ny}{@8tKn8acxAkbl(Apea0x^S;E(<(`MgZr~GK$ndWvzi)q@a1m16rK{*+cHyeY zYq7!N*MZC6<>A>yd*`Y7JkpsP4A0KEzwX^b>vGun`%h`$lfbYxh%;wty(&qbP>E%s#U59N;4*N;NDpAI>`ye+6(zM~Bj!)NM zOQWQY;T6w%Qx0fFm-MZ9?RkfbF;7GKA)@y$PZsrNju)+9li_lZZ%T#k(a6gBJ3P3qHryp2IA*?y;p-}0XJQo~M0s`x&yv}#R#jm^&4 z>i`6LNX;CN;A!WuJQ@c>dkN|<`38zRKySBHyAZQ5r0Ob}{XKx)K7+kw2ggu*_fX5E z<}}0VSJ7vM`d6M%>+{6KR6W&yMC)vH3svoWrWmhr94c0%NKID@O-{1mS~L!(37qS; zqzhf`d{!8yQh4Qq@lZRXY))$`G%4eF>81)7+?127hY68pqghJnXaqnS>CL3J%y2#n zuZQ;o|(y35$G(Z7XhXb0(yNim{k3TY+^2{|r1d@c-6T=3~=v@SbfE(3fnDX7j> zli`Vz;rfSitcTaP>S3Y>gX39`eOX*nc)dw+CT0p*rV5jRS{80=C(@UUa#hx`FuKY3vt}-ER=#wlvAu0 z)WnD5S$rdS9`3s|GpdIP@i%ci?JAUlN|ZCI7SyDNGTCc|(^2Tst$o|oyWTach*!VE z)p>KQEKsU1?di==OLTT;t@kt#TgFT6uI&VE$~(=_kG6}w9lC~l z^jch!OaOr80T+1#HSC}$(v9?E!^nZ}P?2rlT%wyPj4^t@)XaO@u%32}>*^l&cRj%m z&7b3!D^Z#s#}gatwYHmq5}P+Y5Ks7VXWs`9sV=^|LYaci`mGh=t9#kFwQ@OqK)gRb z#dmGK9wPyMBnv)yHbCDWaDrN>U+ablkLUc0ib90kul_YWEGj>uk%#(Tn<|KM|=A zg&vB2;j6cR$?)cNfmsL4cCx;uDW?kgf9ZH=KP!XPt=Ng7SqE7~q&olp`}*E~Uy$Jv zb@cMP>6a69Gv10FL@5uU7BFi;lLepG1FQUBLjF)>V6(d-)#X40FVQ*(d+x`zS5BFO z&r=@s;}_d?KMSBMhaBh|mnz>>!};|2iC0-wtI#hll*uFL(hP0lMik>;s15Zl+C=@- z?0)%Y#_-1lz0AoMDE6Z}rAIK1sH6k=;+`_}C7TNyKVH@g zn{)6-sZ+)tZ=n0D&E42X$FrSqM&$1zkGAz+cIQn)2uiUptEf`$LPis1ZG|!(LQ}`x zlmdh{VFX7TRK0~Vp8_a!51}Q$bq52!_FA|O!RTAw3e%z!D>OY-3=g3Wum;_@oS$!0 zZr>f;7VTOVPc@r6S-YoF+!XMeIWinfG`*n~`+XTLfMUWrucF&`Tw&4Tlg>;h-$~YbZB1Q_E8BUlz z=mO>~{jZhYYRa7-m<8w6mDd?}`Oii5XS-?sx4~0>vLku+Pi@Re3T*d=d!yzY)Z@01%pRc$P#qOOp}zI^`k?HALWmyPRItPwEYhbg-q zt6ZK#=1C&flqbYjl%|+E1v*&-e%?2}l5RydFa3Y$dm(VXtZY!^s1A5Vl!D9~fp06J zx%i&(@+-&U^HTCQ0Ls3-GS6$dl+TO&AS}(YuYc3=&CG@`GQT(Em3-6MWa)!x;;&H6 zJ8$$3ho##e@;WopmD>A&*ZhLuSZ(%R3#7H$D)+t)*gus%L*C}$W&O*Y<)Xq|2P7=qYhEJk?>vUPE6Sg*f+u5hq2(R>?&A$w6#id3R~R&$Y)nKy4o=+5HYiIGD=uEySNfDv#>Fx8d0O;0bJbw4cv1oL*GH4{cFf&{3Fr}q3Mea zy)F)MG$b-9xCpuxgM?m?bBS6L0&F?>hrfZ3AVWG8IX7bRLBZYlhC%K5{>Vm4EPu1z zCSPbZ8MzZ&C$+q8-8+{9vuUweapWpL}bTs&2-NBwZESjHFDp z?j`zjYoB!wY;Qw#IoOk`j**ReafyWdzsvj%)aAwMimEC^l|Y{q_xHC!sVU&J&*o=*E_jXt)P6xW@4AIbHgWvfoeJ?9kGLG@t*7taf85 ze2B})E~ zgS_j*NPNfKAQ_+fEVaUGSsweH{~_nH?~)r|l=az4xWzJ+s?eh*NRO_b_ku7I2FUseC~EH9KdiM2p^xtTIyW7HhD%p-pTGA=xuCX?34id%KYOy#@;#U`4hgN4DVpw`$ES z=%8N!Ts+qTErVAvd2QF8dPW$rkGoJ?~~Uy?3u|L^z5mpcKuG!^o)ynS^sqeZQ~ilE--*YWE34&7b2x) zV(P9tL3?uyco{g2(b9YU*J3)1j05!&Bb@^p?ui!OL*%thd&#L?;|Zzjml!eZP7fVj zJ?)%CBUSl}Qm64D*=z~s^DOiJ3Z6yji&C^!yz{71Xw>gR(w}`O^;7g~NYA##Bes7` zt|}pAZ{p_INa8kEc*6Prm*s%Nf`z<=R&p4~SKvhEjmdN{S%p`sB5w z5Q5iF#=9e&ib3xVA<#=U*|UdK{5K7^v2!tfQk~Shlz$sjTU{97`e_(J7S{hvzF7Y= z>0#+%0eV7u7lWtT#qR*t}O#E3SW4*?=rvFVRlalR@ z7XJesI{pXwQ1IVoJ&mR3ejc{x|1SjmSK(ZGD;@*>|47+h6Wa^_&(!##0u&vo-#*sx z+?4*T{r@GP_NPPeAJ|q5d)hUPwrWS+bitRID@h)=7;p8Sh2%@ueO~=11U*(wr$&Xvaz*Ep4hf++qRvJZQD9|-|su;{F!N8Q+>^JS6BB`-S>Z!rnoA@ zfte@l4@p||0t_FLTBYi!!GyviDbeejKpD%>yg2|57jy9qi zWLxB*o~J!x8f1&6DbxOGG~wsav+C%q(X+->Np|i|hE9ARzeuDU6B;>5rxYziu*bwC z9_Vu&T0#{bM<+lWpt%(489hO1i~}aKUD#kIN#mK)&esItn5$l)=ek`q zy=$}$D~3K2Ss!%Dw@IHzS*SXZn{0HHl&Lo2VXT3sN5$TVOVb+ zXY@40cjFAk8a9nK9CpYsPW_{EjA@4V%o(gX929N1);h;1gRjmNtO*#&iZ*O^C^LR| z;InmsV~(`?JrKFCH^Q*cy23cgW9tgn5LxkifF-RG*IVZv(@gd9*i)G-=SdgdkoA|z zbWrvh%d#WWF;m6%Bj=>gr8%ABn|IE@g*xB}StKgE0xnHvkjlnKS!M0Rde9-sCiN!+ zrm~iKth$ytUbPL(1(3nVP>)6&Xl-+xyxczj;E4#qOhJX)8&ezEd7pdV#QnY}bHxa}}+ z@4N100wNVh)7BlM7wq|*Vy3Y+oP9QeKY1ZtLwRboeP+tGocZjirxXdM-JX`*rXkIX zJ2EcYJjAg4uWh?Ibwm#QvR<-KMo*o$o-&Q4Gr#w`xXklHS{s7xi?z+uU5eEaW7b!k zYQs;`I=tkJOYZlZKir~i9livPfihv0M^O;L0USDF7h&XJnF{iCCBHH3C!cENOGdJ&?AM|f_K<+ZA44Rzj>QbFKr|)-01(e`S6K1PB<2KD0_nSSC2fEm zUN2Mkae_oa(&M&<9bQxuPws{FwCG7^lj4}WjiHx~h@0%uqc*3szi1Hh*&V26H8Kp$ z%6*f}7WZz^ZRD%l&+icUpKYwKIpA|01MW=1hJM{4h{vxl14?-g;5y@%e-1!%Xp~16 zqEmoh|CpOPv3%(N_WGUl)?1>FTJH(=bSwT1USHNR`Cp?Pl!KY$zk!n}lnJ=FDTd9M zCn@jpxRfo9EttNdAS?_m4Z*U1;WD8vQmZZ@l(OtqFjS5@t@{D01V_U1GU)k|H=ILrIEFG)nmI_fv|A2Jp9Hf z{%OnEl8KLF0*uG{|F#F(1WZh9x&;6Ar1NL`&I`$Hn<^s`v@LAP2BB zGqcjmnA(~h0-ii`mRd>q?Mi>R81k$*7HujTorp z6c7O;wD1=}ww;wgRp>PW$rq?qi>5+*r;@Ld(sv=&@+UH?;H^|sJXf^qYcS%yDUIEH z{**-)Sa^OzIOD%^12E^LZ8P?~>TVkgIr{E3px4IcVP~nq zG-wMvl|OEpvD4Q4Rz&DE@*?}b`S?eAxdV!o1Hfr6ndz|@>J&OHLIhI71%*nXPhDvK zz;KI@2WqWrJ)H)3(mw8Ne&|21t-?xG>;__v92<9*u^V!p_HQnl@Sb_A2TGL!D!a)a zYS3n%+-k?#0hAB}4L&vhJG>N%RtSFlTkCVP_piCl9MD*Tw!`Mt{U-LlM=G5#v8#D8 zqouXwbGq@gT~jBHN{X z;U=YBTMY;I0KG+C7DmY-pQPav_9<6UlyC@=K5!L`1o(Vr$Q6bw-UXlG-$)s-F?j+( zLovq9Gi`UTmK>(B5Gq7!+%`JvUi2XLI>N6Ewec$nlz zxDQ%40BqlWsHSd#zqi7^WfO}S;O9WR58^*BA!P@?epGxevue2hoP$c|37q(L1j5}+ z5G~F!f3t16eK*}i+0*sFyE;A#6K9v)C*;N11ckbE!Mg6@ZW=9h^tNwN>LPIe;R6(@ z0?4aIe4?KD;h0y~Z@YDCL6@nez3{?cPh+Q30D}L@QcDsGNk}OrC8fH#4c$=oTrtpb zX9y7PE@L5xsYZW-1ko{f2nPDDfI_&}<1!MguIXE#+YOY1K-dpDB4A7eYmth27j2@i zEl?>X$DS3Seo+|&)D)6P5Rjr^!ct2N<-<_TL$DS8z8KRJm=d+jC3J~^z?2~8NEqn_ z2hbJb@JPgn(!0m;-H^r@pk(!% zAs+Z8b|gT@gmD+^F3ndCZj}q63EMQvRVwWR^T>eCi9Sp?qR9g~Ef5`YJ0`y)!-2vHJS~(BjuMAL zn+gFK1s_dgKv@N$9aT$B`k7afJ&?LT<8M`|Qor_qDMAjTLlGU09{-wu%8Q939>Pw7QIP|^t3ftZND?l-l^ zx^vWs*0FT}uN0^bOd4~$>AHqF03aHmIVKHJ?@F0KI+JV%%bkc+2eXc{+N0f3MOYcy z-2KvlS0}FVvx+@8;C1X8g0Cg?_|={Z+lItOR1<_x1b|v5tP$=8=l91atO+@f%P>H3 zWVRNx73_xAHl)5AxiLO~w+FowTM6EP;Fs(M=C5-{u@<*&acAC${Gj~M2Hd&4ut)F* zXvel_Yyfk|ej~Jy=?7@*T8Uq&HlW=Iuj^Y;eEdFwhQ58jCAvX+ z0z2Z|26#vR5=2L8Uj$zrOxV+JL~MXR6J7_r$2||!#P$e%fx8aanjl^XUim@BBK8K1 zLdMbe>8(U~LE#Bq1%$*Q0tS2zeB4Q1iFk}|mv5{N>~<6n3T`m(7!P1?v|niN+-|rJ zu6LhD`Fr3%m34=GO&$uc zXYc?*=vyCc+5LUMeM5Jr8*$zDcdTUB+a3QE_yg@#Jp#W!WOTru;}z8l44?2D0-u;a zSUxtVw`5d44&Xnt!+e0m;s1f#E#L#JPt+sA2d&?yKH4*|9j8B_c%aCU>;)1nNMDbE zJQ_GeLJ}tcu zVB|vqiylGM^JdScBBgxA3pY|Oy~YRx09?CAD@_st!P7Kzae=x4xPzTnhb{wIIE^9xC#$1>WC-FDg3!e zA=69ZO5h&l$48_p7532<{b(jmRwJhs1-Dl~c}KlJpB9pWooX+Gb~34`>#U6QSKZZ` zQhP>x;>X0`Rc*l)47qa(#%teqZ%ytNk!pEIGw`M=?zr!jky5gUW^wy@tRh%sm1)Mu z_E(vJloB95{yT)j8S?}q3zv3!H7Ff$W$P+K{&*p6UN$9w_6p!`qIK1b&7;QEw+U5MHC07b+D%nO z5>1sP6d%qXwLDgaK49ug5K5j1=d#RJiatDs5Lxq^iK@!>w0i2Ow&Ma6;8(IX3m?Ij z0aWgb9fhD3XI-9$&3(u_^bTUcwb@_O(Yi)Cb=-75fUa3N!=^*e>AO0!D6o zvYRSgGfY}w4N!DkGdAfe=Ewf8+>{aUd0Tb3xtkhk4C>9 z>z0D6HPQ}Yu#Qk{Sr>KJ6@`eN48fnZWLwzbeM7}fo+7O@G~insB{BiNFfV_`#V;@K zjmvqe)!3(?y`=T;U6cOsW%C zb`C{1){wmSN8n8t3rwMjbTWV82TKIFYMbyQ0ot!6f5lD+4^GXTuDCN1(v1i69hm_^899E;ekGBw=@3I zCW=&Wdj(?oA=p6B^)Maxn+|;|y!~1GMA{Y0+XU-xVGGd~=jED$QiQ{URIdN|Hh|uk z_KM6|-BmK20LxwOYMj&N0O@M7XAU&avvc42xfQ#-pnv6v zW1BK{sn}bTir2D!$#8+E9&A;M_9Om34@gA;fT=d+C@^K1-6NDIL39HNc=r0TxS@l2 z#U9-kzdL<=eL2P~A3kz)@}coqHqV?to?&YLm5DJ|kp7?173e6uJ+HfYgrh?Jdpm-$ zd)hvKhLvyt@sv-WfR^1xz^#ifW#;_mRrRLauxI9YVKaRj<)PS_{YQnUOWGRJ0ah;8 zpw+G1))pX_#sht!V@=x$7w{pNfznR@XkrCn`F-6rI@@`sXJ^}nu>AG$)bea!u*%iv zt6u-F{3cW}*uGtc`Dk+sTUsZDs$V8S!1V)sP!Pca(a?F7lNSao7EdYWCdH;^9Lx>4 zvAY!GCg9;3F>Fq?CZ4>6M&E9PD4+AxDw6%jzFsc_=`E=ni7 zWM=Cw!qL&Q0SDn!JW61~1p~Q- zsN>_*R25>;*qi!#>in)7So<@X_UM_sf9^Pyi`itjpF4+(PmgCfmOxFu?OGgaaZhSa zovj7@tV8=x6(IKw0YoyvWExP^JLoT_OwbR1C&Fth(TDrMQo)pS(daIyrSU!>b5_Sz z1G?QVagcFV6*Lv~*zy}qUTRNf_wpqS`(i&jH!|&ADJ;xP&A{dtKKN=zE*-Jkk80Od zM3Y7Qjx~Y>kiy=ra5@$SB?wSqSkazK7JAa68`|DV@;Eqp0E(11RT)g(Nz)%{T<7j@ z7aXno#sf_*jk~s(?{c_04tvp{-Y^cbgXE9fD*Wb(tv-f4RjzW~4{{n97@WtOd zjG8v9sG4@y+N2zioT;hw%H4xp);q>l7D8S6BCGIMr+iK5>B6~*9mra;@gnx>qG;Wb zst1y52VL?D0pxApYY7oRb~vq$kGgTK3OE>5#}F99##Ih0m=|cbVA%d2fQYet#Fou zo*?(+c$P<^B)o9{VYb{U_+FMj)5Fc1s4ur0d?Y(z1LW!871>x>U+V^R9}TU4;Z*3W z1PI@XM?}00FY*IBX`#=V(^(dMR_dc(tZ^)#oj0lBSC&7*+8b(pYgScPzj5xqaaK85 zzG>A&jbK-zu*ldoLWC--FE8dS=>to1R1_9fQ!cWvq7<|In~x6CJ_qrh@Zl*b;)i5D zgMG9V~p4`?*S8`+XNPgOUv$(M%h=qAW-pdC9s+Si^tg(f85>>~E0 zEv)4bADrcYcH!dStElC0t~pA)M`2UqPd^ubpe(lqKNYR%ai8;(*@P zEwc?hCWD)hO!IC68<()CLH+=72{_&fAlpmt0)~~Uc6VrYW?sHfrkPk+g8exZ7qBxx zIOL-q+JS4{r=5v+hpPrzuX5P9#GR;PKB z9N)yHo`G#2?a%$IeN^)^@MHyL-BK(0OSr}U$!Be~ii>A-cIVyd1v50!vdV69YW!;@ z4=r9AH;q1?SBWh)0NM0?W{OuuT|ogo0W?Z+QV&SYToD=^N`iWTnLRUjd$cEoD8Vtd z?RL32O}cF}%II{jWFFgidR&m+^_vZNA;*y4yb$BX?B7E2;PvfSUveHzxo2|9vbcbvlCcd^D<4PI)JANx1;=O}p!$!Xyz7CHmk8!#I= zRjyZk$@(nzTt5d1eKGgUfc^C9gZxpxPc8P%^kRA;-MsIVj}MJ!=#MY^6&mKF@wr=w zxM~Qn{bp`B-y%Hf>VRWzukcit?&RJ2!u@{A!@VcKn-hKj?(m5M%|n#h3c;9hhGRwC zxpfww^(r4=c;3Hdz~f&_*%+}v1jHQ(7rx^SSoegSxItW-u-Rgox!Q!L<8Vn$Jz9Mp zaq(1Za&L8dRvGFwxfZseXJ~fbCuiMe;a?vZafk8|a}cuye8Oq#EbOwYyJh}y-Fubt z+N0tjb8B>NbgOMgXX?rpQbrXrOYfOIScyG#L{AqT(lQ)mEEJfSa634#1gsj0GZdPp zMGJ@(Z{{T1KD&FnmQ2`;^bVOda9h{suYoDn8!8wNgpL$jWnrVBaDkHzyVgfSES;=y z`z|oRlm=@Y8OiX#$qOPE_EL;3ib;`alcp(9rX@&AZg2vVu`CYig3Tyf?G?pA^CHWH zrHGIX9*!NeyP`Piq8tsU0Uld<;2msvuks-pzZYigE(rfLzF1ED-cdz7?R*R2hr{i$ zvHK9)&c!?c^R4o{hlIA_iv@UJ&HjVF~R`VMlQcsO+`UUcr6Q8b^!2Jq`FfA+m6 z?}q|@RTF=l%aRN9_XPRTo>j~H~5Nc4^aR=BP)T_ zyU1WCCX{W1_Tj2CHN_N5>;na{#&M>$MsCmi4vt@vY-;XExGRKUO&hrik1w*8FxlX* z%=+vgsPNd+pr{EoVCRHdXL?zY$S}jLwrAhkf8DZy2OV9+I+64yak#nmk_P4(HMG4| zSa`uwFK& z)OtrM(n^puUULf4!We8M0__8DWY}GT`vtBmeEx$OE`YToc54udB=q@mm}^LlAA~W$ zBdm8pfGjS}gz=PsCl9fx1?^X6<(>$JtuOq;A9a!^$DW3x5}xAS2!dDmfp&-R6O_O4 z*F(7VdcZy~?cFQS^AuF>F3vBtE+4a_?W!^3BqFWbzyGq|lANP$=xE|Oh?C~`*w z2U;?cK#(-D8E8UWwbV@XfV0hW$zMGu%TCa|pn%h(e5V?b_|~iw*^D7Gvbw24)fP|? zI?KzO^BBqG1H(S3G=`j}WD7mAwmJacJ`wXiG=T0Jt!xVB*+?V|+p=HKWs$K-8caRU zL$6_~GI$;Y^?%tZ<#;CWIsOg1|K-nhV(0gW?MeNHlG;t@{UuqwX}V0!!|QEcK>m8Z z!m_G{#0yVo`o=t9ji*i^dT3$Bu`$Tva7-zSb$mo)tUj)_sCub&ac1v8r~XEUgF%C* zwgFJu(3?cVIJN;vsc0>M8z)PeqA?Dr2;3yLzh*htPZVI?EJhDTw2BsyAn7+hJ~(DH zCC)@U%rXp6v@vLQX1 zhP91cYDPmfm7%UV!39hoEr>~Y zjo6EBhT(j&_8BOimX>!d>vXhq5^1F-Xzt5zWU3YZ?QF$)`mxdiI{JXq7`W6{4l>bG zCur*RhbwDgx2BNK*J&&(P&L9-|H>>xrX|S!TPEDfDFXNr^BP@lSZ;Jo4NirEU;u`* z^!r~s<$Of+z7&uNA%4&O5y5P*Q`X*F>FUa1#OfiMf5>P@k*3q(It#~dY_>hYZLmkb zzgh^}jAA8z0X3$gm*BZOriBzU^^Bg9fQ|YR-nQ%>!yjCl^uu}b{nrw1DSsEGfk0=F z8WW17&oO&qGnzU=k4nF*9!8y&0tT>N%_!I%G9;7PFQ8IMu-7mvc(Qyq`Wuqfu)djL zO6LT79v)0?Si}J3`u9Xi;5=D;Uj5czd=yQ?(5?DQ^xklzT~SA7AWR#5`Ja|XdML|6 z-u~Uu-fV!uiGcWbmCI1)9ZX{t;nz;)V2!PGrK}9$b9|F_sG}9hetvx1`V1iB`9A&Z z)?&6#`$)F4cY~Q0K=ex47Mdx4MU|1*y2Q-*3zzGyaqh30SK3Rup#*~D0B2v)KL1FP zavmAFAv=76ky6AWor{!%WGsmul4d`*X)&meDdfA!--xWF6@)LJj4x3;NoH{Dxicj$ zB3$86?C&qcZ;$+jXT&hM`7waXj)S)yHz4=fg-nDNxjiP}A9ID#DpQN70h%jp+~RL3 z$O&d{Us4*Ymb53sr_`>^X-%g^uR@V)UL~O}As4$a(?h8!20jYw#CpgW8*axyUHb#5 zxE1lx#FsM-)`uuriu@Tuj}H4|#-;^q> zauCpB303!?L$vgmBk{Eu zwvhA^bh*b;aK|K_YPJasCYw8$S0>e6Om^n9tbxW_>9nHqrJUSMWkZ*8G17S4L}uz} zH`{zE5ob@_OU-7jawY&{V_{@@E$C;%<716o9F%UZUpFiJ^CLpbngAs6im)X)abrwj zTbb{#IW6AC7a_%b0!8jkEdh3q(r4h}JleQmD|g`g>#l@1vy^vC^OTUE|AETQ(8dAi z79~B2C~XLiJwJft53luSd^IM4tuZlQ(CZx-zh4Ud&^&?HYx@A7e|?9pmUE>X8Ou{F z1)@r6M%hG_T{wjqmw1{(Bd8Qz5}Bm3NMh90%B>FRTq?W@>UCXGsAZ)f7y6uFvV!13 z8vL&tPtoAOXDBLh56j!otF!hwwEALJGhuM4$16+6c{XZD9s@VT$!~=vu@%sBow{o1BmYVIW%}?G! z0ZnIwyi(f=H466gd>QL(Ff5Kp-Mxa;3D}TddWEdyg=bHNXVPJeS55}8-B*T84ZRE% zRrzOcoarD7Y{weE1`}g;u;5oWUqA>t&6%?>h;c+EYLWpGwBRB0wg@6}FHw(3(Mg&~ zed09)n&Vzg@Y*Q*)RJ@5lsq4?_SI8TRAMM8+m0rgYYexfH!>~ATH-l1{)iiy+11+4 zlv_PT9GIa|8l5nEPLaz!5S&HK^I-^!6IMRU`3uT z9L6hI6W9m9{9+QW`;|cEI{FOxNNmAfX%pt!^TuH5mUCL78?DixDfIqHyFX)x``2?} zqUDQrZj7eqiXEkRMuw)08qfQ5GCjiFMZ{6~VvZ9rXN!Z^Pnp;2r8K+x>^{qfPjP<+ zn(gsf!=jNV5t`aa+1j&RuP|ng{EYeG&!2<^`uSr(k=sdmUd=z5s>Mpyl+?=8xMmfc zgh+${R=Aedp#jS)*MvqZFg4RuEL&Mv@Y7rp^AH@!N73zEhTKTJ;&wI5s7frqtqg3C zMb^71!rd)seEe$2k(s!>q*vH8c0IOz$RJ_Iw0q>Z!ThU1Y_rQXZ)F^_?*lHm>dcFU zp+O^n`D~_rW#-tGcNBlDs?uGd(RfEilMGjPJBf>8wK(01&=e~+O~ z*F;oNlpQ0oQi@#-e4(l+sgBZ@3A?USc)0;kerEq*|4>*vB;b-)Odl1|N=zJ8Kbj`y zZPLz2>zK#L?if_ZV$>kB?|tGyEaS8wkSIL6ZkTJF=-JjCcDBCwqReL0%YKyEIdp29 zma>w%(nIdx?y-AF0`PvB&&)6X*@)t0)<3&?(N1g%O$LE4polLcW@skrb9yf&;>-Zv zhpGrfm$?P ze-Fqt9PAWnvg|X!l7sFgApt&+;v90x&R%^dv8#MJrd`7tSK)B(L(pLs`OHX%4Q*Ei z39Yu&)jhEL@yB(tpj5_f!J}(zDL;r)7fj`Ep5i4AU459r)JH^0kfHp@fM98)OIWh> z_elZDX1g)~Hs7#pK@XGH{C$|a5u#7~SUPJ)O;38IA&5oVm(X2k#HP3P(UZ-O&B=Xp z$`XHka|)t^rtH`EyO;UJ$P9c3dw8o7&38c`UdlR=4|N-17W*k^!xCD5KpwEG{oCEawziz%>-)SNLTUNtfne$^U&u~ymunwsTV^enkR1Vcoh zZ8jA~=Q<;dvdb=>)&y9y7ypGToNga6% zpR(~)$o0JwR@li!S3vhADCUJ|Z3SfRljkzzG`Dyez6{j+A`_Mv z<(VAm^cT&-s1eeg$FJoApLjq0tK3bYS<%{meL?n;F{J3^)6!nq9Kkv=Y+bUM58n62 z?GzXLBjXN+@wj=AnT>!96?eLS)l8YF1{=sFj0C&6MKFgn#cJt&GD%00zhyd1v;~vv zCSE3nlJ2C?mJ!84Fs-3G19y`y5*tj51@I`D9ZUL+2!>(HNkE9>LF%M*=zPNIAFS*v zk-JqLL8NuR&n*%jUs9pHMpabhiwa8pH+9c%+E&j!LpuXP@C-u{TWk zjF2b;qYGW49OO)Ek?QtxBpUb?_=J)1XMxbjBcXB*;jM5ZzI7x^sEQg{S-#zUyu?tp6CDV96gn98>o=rf*CH+tP!<4@?)S#7RYd&!Ug9Dx+q;hl z%wx4pbC6Q`q#`&*2!_FMNXx~%9Jm2gEF}Nlg`werXT`*bhXn`}jtIyh>G`O!rl+ZK z{A!vw(N5q>FA;HGU~mt3#6q)}e9RR+lBTXBmXhe{CVALvF6P^RycOK9aG4Iw*PGdR z^-#-+OjrSwq+&+gW1j*y9FYqX{i3!l6{Qn@(-*GaFJ;v?B5U^QXL+jEUS^)UK`Y13 ztv+;DO$0HSP?8OM42j2w`_L2H6&RtBvBC&_2@rnug}D$mA&6+VxGY6gEO7}`RQ*+d zujoK%r0aLP&hRaLcz=BT?zvt*{+sQ2IMsH(;WQ24eco`A6B2m!Y8ghU0^9M?UH8_) z)CK#%}un0e9skZhFPJjvI}_6=HD+(nn!MK#F*-HcZr+pv+p1^dl1s@6Iu z2s-Fy-U~|r$6ykUjrqgSFxUT}UJX|hwsWptu=)pQB>O$Z$Mqj-kB;W^Ry}7!t;CMJ zZBjb`VnMVjr9kO%>J7399>KLrmgfmOmnoq4Dw32c_DY~3Q-UWGZB5n;#cu=|dJ;@c zs0A~_JtPl-6T#Fdy8_d_lgNO>V0I#4cnFsTipUo^4n&2ZR>y=0%1taQFVBza=)$@M zs_qxTG{~{!bZbKl&e;XqJbY8O&^C1t9mOP|-{eJ6y(?t5`kCQnh(%oeEIW9aZBhX$ zt26?K!CFpNHkWf$epI;b_&x^_i${vp>tufnJOuJ3EyS}mD*WSP;_%++F7x*%?FYnF z^Yv!U_G6Ir_26^ZUD8>GtfVw-N0v0sKaSK0o~g$vCHz`p;Wb;Nm_CFwLL(9yA?y)A zbORoB@6eTw#h4#eI+0q0JIG>pvKb+&VbUm`cn0NU7jmz^;A=mApSORZd8^=%ljC6E z^&iM?Z}R!Dk+=59V8$u>g|}hcX_e%W+}<+R-#aSG1z8jm^fD(APa?8MI?~bd_p!Ol z+gwJQ;GMM6Jz6IqCxP6L(WOF@NZKR-exfO?dxLjF-qkq`BHFm$Q_{cS^59Jo8x`lA zG>AosXb$h5R=)m2__w2G1|v)LO5AEmHw>4F%ZBeBUnb)a42xFOdr$Mg9LfrJ8PtysIOy5}^R8qU zetZ6YyzgKCldbr^kA^~m&>T0xgx^dk>79>28A5k4B+C5Yf*_n}WhoU7+Axu#dx3^- zLM_yx`L~rL9Ia~#w7(aRdzuI7hr4fJ=~)+NZTzq%bD3ckX{+_T_tFSP&KJB^L9Vnd z%|kwKI8)#Uc2$TO7;!fr;7dzAZ&`>&wxi2%iJ|cEDna~+n z7mkM!Y`Ww(>is81993P6$=kZQe&t2s9C9E30;5vqH)C#FyO3fLHkRK%K$8A)wA@%BF6MtxYBj`88Df_fi_1(hK@M|zr>&PA+^IB8y{npg zhL2YWg!Jbr04jV=mUl;|3Rp7f1%KBNgeu4lm#W8)Z;UGTZ!0ZCiTp&owFfH}b%O;% zI&ow}OT7_f319AB$SvOp_*RN6O76Q*smJCJi(wvF0|Q?GhUVY&ite8XyhJe;bQiEZ ztwO$kV`G{$czf5|+oJQEibQz0L^zRSzR-MNow81g0A%&w|uaqLZ}w-#ppB?74r zbE?AV0@Bjl_TrT`bRM!Bn}v2JSWfY)wSc_R5_pa*$6cu@*5UuaN1Y(p-HH6boJMO9 zQ=l>L(AtiNEOS`i_lerFEM=V}Lh-i`^E3V^V?isG5}hEU>^*7Do3#7{ABHWMo%&7^s8X4Dz_v%4QS> z0702q?zq8?+CDn+DXP^jY8Y$4_;GESS9HxVhAAe9>4F^AZ^VEaa+W|822d&@l0{w% z!$rLSseo_buW4lc0d8f8GHoT{P^C}C&xN&QjxgDr(Vg@!<9bhoSUJQmBjB6KRTMyk zv&0`YZ#CRfsB~0CW_VR=E{uy%sj1FN04*usmMxu7GN*pKtI+^BKlf)=uExCbne8+q zMk`H-p2WJh7p@JOQNW<6d;K3amdF|4Idbt{)5@dTS2ng}Uv<0>4Md}n7U47oxwkvT@( zI8CF!Zz^U4BP&s-O$@2K;T4j z_GC$AxEN-{9y~qZboLfgaA*!0ogXR$F%@^uxJZJ~>pS&yK*r1niVkRBki&fR3Fkz_ z&)<3coB(Th5MfFur*h_BNj{1Kh$!^ydQsrVCU>Uq+9kMcWs@%xiiy=AKm%QjyxkBz z5a&oLFn1SIGO+$*<#X1A#y`|tv?0U@G|aG)#g(p@z)>^p0y;G~wRgVWhEXmF+7bi{ zxQ>Pu=gPho396SY%{&*grH)Z^#HE zh49CkTh-zq`I;l#QTSg6gr%LX82q{#!D3S4Cei^mkY?V0$OX5LpS9pgj~m2}EZz^W zIF0P9oZ;Y!UWxtHinR;fppIXpu*bcTB?q18P7teW!!HIU2x+VZ5C;j8w_%+Os)N_I zO&l6|MLGHS1p-10r@f_$K2)HLKD0kT10&O|*oPh>#k4AbK_SF{F(%ywvRNT7pw80S63U|MBEwHaeFCe)Z&@qWD5$-n`4P`#RXAyAI*GQ8Ifeq9$=;_REA6~wD zjIGA#%D`Yb!O0N-FbnF~!D}?|g0taK3r(4Kc1D1BbplzF389K2Yy|S8Sp>m03^1g@ zS7U+==!ltv$0gcjh?tkGU@pCw6&yuMpUb8k=oUg!S$}KmcBUriLCuQF0tDn&gyt=p zd*VhG;VZ3){tf_%#BljsccF>*R zR)JlC`d`Xll;4SfasI=cJ3x`|doz3X;%$dUx5PVrS6;8?4QoH95J5sDL-Y%Qhgd4m zmw6phF>vcV0BQlaa}bI-b{2t$W{0Ypv0sM;c-1h_Ba|Cz%^r-@z7`$v{7)eCAl`kU z0k(y?v2Y}VpN6pmstn|%vyAyq1&Fc&185_29hO+CK&3A}g5e9L28wkQ64@_tYdr9Q zo{oy%W*kG*-CZ>?%$>d#Y(reE=w(bpUlcoreik6WHFLi+5I;*lTwy6FB5WNvT^{g} zkxSqT)O{@QgD&c1a3`~M6vIxIp-><0tnK)TVIc4noEr?AUn65MmZ1P5v7f(3u5NFt zMIf}u9MGQ0g8w1=eU_XtB7;cyu-m%v2?>HP=zkz(35=?W!lXEaq@L$UnZb(b7a-`t> z0*V!^D@x{ND3nmzh28=TR-g2r(hIt=SsRypLRyUyy1Se6lZ7~P(X?u>6tIRI z?vCtRSkdo*jmUt`o!mj0-vatH(bJ1(iEDjlLJoRnVXd_S&}!g`CS~_7dy^n_Vr76S z0;YeBUD(&?2cS%-RYFX+QHkIptCm z>O@hhHst6rwIfSDBMR-3g@>D4N;~hs0aCE#$8>1*N> zeO7p-186FXZ(F*P7q`%)in#!CjK%f8Fp(Q!aX`L)A|F5`mmmr2;;Efn45Ugw=eznc zl8ARj1!9QBrRd6?$-c`%QgRS_@JwU*YRiiAelGB=^oS2<6u2<6Y~ktabU7L(1o1$w z{S4~sW#Yn$l|U7vl#x{7HAa@SobIk&)p-abb(S|O3ZDS%S>qib#~Oy} zA||6)90$rW^2LOh*Wk}KR1)xpjb7@FZ^hr#E~2VmfD_*^1i;An~u6A^sNB9ODe6N)RoCXZ*J8qQH^-$T5U z*H-?l^j8Nf{hLW}=KA&vS;jjJsE3hULeg(q^Be_Hj$ei%6i5JBFyuZFu(^m(av{Dx zh8_8;zdVHqNq%c3yb1xVzT5JoaROO?(R`!yKW5cJKOV??3PT3i9g%?jo13t@KSBHe zt1}>sKGYBhUC#N+I=%$fgZLXn7PiH7_>cUW7TzsH8VKe?c-!y{vJUl@TFwyZ#(U4GY4!z`@!>>G zapOfxJZ|hK(}QEvoSPwklg@?{z>%IUjD8iGm!PjhypI8zCFILVK*6bUtD#6;Zu$)f zNwZ>+@`>{jYOkQ zL$VE|oPYYv6~7S;FQSO;ub%4#*4R)7gDUEpECb-ksiS2xiTZ|EJzS;({tQR#cF}ke zzF66wdFXz>ue^3dRuXUW^7Bq{uhXxNaZ0`Gr7X$H?B*s%(~GdtVGl`h930x${It^{ z4`Gg*wiEMqXxF|_zu(90w%9t_f6>iUPkW1R^FFEkB{^-{!}-mSfAJ*Qva4xxvt?&!)xs! zI^O8Dmh3CMpM|5`;OQN=c)&PE-&2qHISHu8-!HHIpfXwNJHz>N^UODwbZ9qv$1lN5 zAjgf-A84|WCgAdi1tL1(5WW_TbQ~k$FoFy=_^b3)w@CMB5s+_TWhA>khPL+I*{ymL zCpM`?1WvO9+1=63IIet zk7K@~#DjLcf_)^XmdlAlhF~-Ld=`f}RL{s=O3$;xomD&0Z>TM`^BMMWklb#CL8_^% zio3&`&eWY0ke6rZ6|w%-+e)qWA&Sw&3E-*bZGOqTq?^98-2lg+Teox0xOp$Afn}R) z!&6$Qu$}DQ>1e4*Dbf4}0J)_@mpHA31p-4{3(8oNQvw2kfH z&5YXGX5ywLG?`sbcd>qvXYcyg&tsU|iEU!m^tf0Bd>uwPZP=vW-`kR3L)lW?zqKu+ z0j5g{tUX>aOHS!S#*VG=>e&zaM>RpIt3LGt|1GJfvP7n~O*tKh*T_}(&;Yg^d@tBk zY4+N$rES7GIWs$X<;%gPpCQz9tn5;1a;HhFV=kq>-VUH%~{>4{pZ zmYmRJ>9FUSvrOmsUhB1mQ4@7YqzKhge=ftb$Yc;-w%ClVVDPrdW9mG28oAyM zY9`nbB-%B6zNY+21L{9P+w?P~&&{RyULGs{m=5&N|0XIovqe-|;=ggp9`d?*GoQ=O zxK6*WVPap)RyTQ#s0P@~yes4KM620P4nI#I-Iqi7FniC;(Knx1mR>gO4=5udFc~wM zvR`CEQO_GWE|2g*AlMUl#^sqvcq@1dB;_#5q*yue!z{3JQmvdB%h;m6h?D>i-9yNl zY`elJCZ0$>5d^HClc*iOmN@VSDU@9XNb*D-}&d2@R2vM=~nnK~^NP5@nX(rSa5# zPOsnZ_s943)$3KK_kCU0XOG*>=TcSw+FR~1Ht)28%w%Q9-jS;-g_CzX91mTIKULgW zvMu+XXOYd3S%ht0Vdb-3`KmkLJ|QrL0bE7`k==m5IpOg2>9wQX>1CbA=mHa8_q)TR zvj>(-M(*S9QH=E%=&xJVDOgeT!{v`>sd!#W}t`lE9Z$vvefg#(8=4`qQbyG8w66-uamB*;99i zo2vTK%S(Hc4?x&B375OS1ZsrV6E^y6Sp?Tz9qS)4>d&D=W zK4`L$>>n6Z^?y9bdkTKppfx%2f{4)Vlzt z-L*j}MZx_B?tKO>np2}v9jiCjPo@WK6O842!((DjwKS26YM!loVpnMwRaP~amX-Q; ze!NnhaQdL&`u$3?^!WUji=D&KV+W4(AeBF!d zR^Gy>N#5)ISNZEkKfFU0k4e^_@GFJ&XSXi;q_;O_>Xl*Vb%U4dzIHSxw04@g(eyG$ z+x{1GpE^s6>WW)gm+8N}&cP*)jy@M1&OiP>cd62fnMFe3S2|}^CKlRW%-jgPw^-plefbcuc`x4-YYcGXkw0i8}~ zL)w#yA5Dv}J!gF30s(q7M>y3+z34SnRcq5eJ=Hh z@un{ZDoQ^6b{((YBQE>hi@TErPesmd7hPW|rsNje@UFGSW7g-6gGZ09PhKrC;yusJ z&c&nK?9<`fhU%qfO4QOGyR`?)d2bzqdQDrER9+r9nqXo)nC(?nx$^<3(PmxVQ)Vdq zh3>ZaT;dQ+ZL9xM+W)EO%h{gNGIhOOo8f7#v+U`D zh8*WiyN0ZL)$Usc^Xf0f)ZG}Er2W9PhDWhK=PjSNe1B^;RSoanUK=5-ennZSU@Y`n zyu$NBWNf+m70=ZVZXN%`|8?#cOOr~0{h3X5Dh}7|Vq70;*zQHvK`-3?o&GN8s(01s zN%u>pwAM&VhMo|9LS^jU9_x|r6&0$EHVqd|OQPhnU%lM&kW}-qe;HFN;Br6pKtzO3 zoU+f0wRHK%k%La2CIgGsF1!*TU+mcBSz=dyzvlf&Z^PJd%bs|GMswm+kAg@?3t?tag# z*peI9tD6a}fykI9Pp7fYmF^|S(nEa|-e;}dwIuYE(0fSE!#+PIW_e_*uYIkWhC}Jo z{YTr;mV5pN4PiAdJ!6T3S39~MCAyU-eAYM+a(1K0wh715CNDF- zlR4}%wVKwPyrALQgZIxub8Da8+ofo3|B?!wRO!2|xp1HDyRGh)n5z5?_~QHKqFCN; zq}kbPBQei)$c2BeTh%m+)%JTLt>;VXUaj(8>p9lZW?u|4fv&jW{AOvpu#? z&`fPv@7sanl>^Q@_thS@Q7KCGRf!3gR)vo^R>O#X5>qa*o2U8T5j`V^1gTV!#smf!J+knYXd??zHEHblyvu*P#RIz(06ddg zRoQ%#92S^I&ZLOXGM}s43bxMrTovfJs7_|utu>oJ);XL=IGKU3Ja(0re@)8yRi$Q- z?TZ%~wYL&e`ftr?d!AhuEKuy9_;_c1&kT!A{t)yRN`g;<~WRp}o z=D+iOBgW_C+5gD7v=ko?m^(6l zBUi@8Gg8UO1dI%yR4BE00!D>Hg;J8^|E?{Rk})K~bi{QkD|OA(_4Rf2VO@Qcr1T&H zLv^%ubRlhy9tY-VYwMxtGR^<@3JckA9$NuP8lp&&`vw{8-@QJYUhx$4s!s_MK~@yX z+AcjmXKAi{h=?xEo4aCuoE7dT7+0y9knZPKWOQU{*qh2q)nI{DvzA;>dTF{dN%WH5 zbmQB43F$i`2Zp4F4)wgtJndb2zbDi??y~7ult_5nbLRT>$yJh%9Ieyo^DUeARo<<2 zT33)W|8yj8+Ew48#o} zEv71RRJYu2i4INcY-d+WRl^)*~du=6<&CxT_j$7PXd&~uXq#TsII+o|d z-Nkcutg1SnHN`cmec*OGJ&%rtCMq=YA!NhUh`*8};S<+G(M+-Bu@ozmVukS zbK>lEw2)o_@O}JF5QrtjzL#Fr})^~ zFU*ri7D}J5yq{@X?>1Obahu%3Upxxg=Nz}6SN@Gwlz!}Kou#V*^@ixp$- zl?(A{i5__ht#{fc-^?u7pk=?q{(O!9^vlHH$YsfdHGK~zL%TLb{R@j$5jqJTE;lws zs6=FzOgBwdt3tQhdWHmxs12@Me?eexj=R0BhPu@f8T|AkZ|iGbcdQe9&+iT|h*HQ7 zd5)Ku-Q0DeK`eIc$l}lE=wKIBN6(??6AeAnX47rHeUXMQ2KQdeF>6E?eti_v=n|?` z1^I(+W)IVK>7Thf&+$B3@hV1lH^Q3E*3B>D2cmxQA@kE62#mI`? znaBU}qNIm^X_&CZB@r*3y=^>v&-uNyr_WsG(kASCiFehdxl{eMIe$&cwG`*cyEyf5 zt}7|F*?jmu18%s2r-^L1F9nj0+k=LHJI&iVkl=6!b_PHMCc~UKfqJ=TqNHEn( zGeAjQtW{e&;LDu!4-+;|wpyqXbVVfHRYMUB?U;Y>FXez^O>T~Uvs@ROPcq3l>&iFE zdqAKnFU=J*pIDVs)}%i;=k;GiPLX5m@h0(2kib6~k;Y_7l+`rh!x5XGEs|dov9o9#r%z2haB;Sv=SR!Uaob=4!IWdhn}Z(C3B(=*8E=mEo)c)78EU*aZe-5w z4FXzz*$0EbZ(oI(9RB-&xXhu3$H`68_szTz(2(2wfw%LpgQc)KpJCqCeKH65%W`SW zeL_OHJyu#$eqxQnA7)4$6l<~@6wMT%156q@nL@O`R-Th9Z+!sKnEZhlRLkV=d2IFp z&lDWM%n>F#Eqaz=kZ{}f|Z`NYkVj5tv!R-4V57Y11ObhNO)V#$s z-rU2K7wp(z#(Z`Bl>cAsgby2 zDuKV}>Y}>Sbp>WhJQmK(rH7|`_Ga5B1#C=_C`_w-Y`U30<8ji`V|vHZc#fnTNpTJ` zYWUDqVPbZ1dRtO@F8;63nv{u0Zg}ckcO)-cxDu}?4&?f}YK3WQOulPuYs9<0->~0M z7d)L=_vpvdy-IT}{I%u#6YuIX>vWCBx7vcu{e~Xvb&V_juRFL2 z_ZvD?8=O?Afja1W=F`NkHx;4grw%*4sC+)jdY({?j(RjbaZ1?am0?r6Wck)z(umhq zwOuOj;iuR(xjJm({V@KRi%82du{MFai)#IT7mWT2G~#V?yD09Z?b0^!ZzBQUOLO~! zcsL@HaxB45MTjVqhjTgNLUJJdb@)OK8l}B(l?m~`%@Hcd<2^t5w5<8N)rUa_SZ^h< zAqQjt#A@~in`P5pPfc^xEIv$e#9GrjD{tPezgsR@9Fw)>Y+71Ib!)BFmfBF=LYbc0 zi`AmZ_-UWL3f{pk#~pe;jogXt?W*bY4Qz}$LtPWfg$665m4m~~;M_CAt;XGNg0Ej6 zn;7Ttp*-CGxs=QVaGU&`Mk#4&KVlU=AGfT%5o#7Dj^B&UpL?)=LC3KEiJN>zCdMlw@NBfrVfC;}Il8 zQOqMq1YsRPqBs=Z3yz>!Rv;<1AQa4D9ZMnO^SHUWrEr{$5fl@HIR6<&=s!_`YB3`G zWI5o8>1hz>+w5;HS`ddMn7o545;-gk;^0ifKoEqmXaML3pY$)DAPfuxQ%qpdXy%1_6d}5SAne#Fh?$DHag~N0?y*W~SpTZJ|Il zG*e;}WtksBF_!ru6en2P0{+V)j8X`TF!sw#^v|pVVF=3FjG+Wett5i7BnHWer9l$s zFtZZ`+=yXLngdZBoFxf`Fzf_OLZKwXV5I^W z;jr={j6f_$H--@eVyYEJP*$~p5rSkfh_Le)96s*_NGmXkkSqnE*e}6<%8lYIcY;xh zUcJK#~~Fsiei=?kX~6;7Qu1! zcR%`Oe*`BeFk6-@!chYGE&9Iu0!jcUWS9hC1k-^5#?lPHD3ak@D1p%&jFIR7h;V*6 z$T$B0Bv>{^K?!FOCP7MLFo1P2HACo?gU#2M0opJ!y{G=P!crTZluz$j)u zBtSPnGpjNHSrP+`Rcr|eg;9p-2+)~um>4K!%*L3YVEjj(`PEee7sQ!PNCJVG{R#=L zP+_VS#4yF|21w8!GAlm?As~2u*DBCINX;wz(8xl z?F$eG|Zs`z=q8J4RG^rG`|ABywU`9%ZKpzLx%5@$MKm;WjT%!nvGQ1V^ z44~+6$1wzQ0La2z2ZF)Z91iGLeotoLB64s^Ib$!loE#wt?zR#F$%0vW0fu3WrU+m- zpv+AK2OKh04Qe*1Sj=@eaGD>O#`m@oG|a%&SqmwMQD7k8ff)XuNivigr7m%3668EE zdJUM${zuW~fYgZm0Ym?QVSm8zKVZZkFmfED8H6eJLhxpf#ULnQZ0rw$0FPm>`&|&| zo2@w{V1vEz50W56_#+W%IT`~Qf@wog1XvgWMyoR%3MUAh(V{^BW2RkzkuW2HK?LY8 z#^0EIE4@F8&p3!N9R*-4p8zBfi2JPuM1t;w@lFq5AQfY0AzX3#sB~S delta 122131 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 Y`tu$JVueD`SwsL(m0I{8EUL)-KR{M%wg3PC From 803b94b79dbf83cea6ad6f9025d488a7bf6a90bd Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Wed, 11 Feb 2015 15:56:43 -0700 Subject: [PATCH 027/112] 2.003.0034: Pitside Help file updated, icon added to EXE, other tweaks --- .../PitsideConsole/PitsideConsole.cpp | 7 ++++++- .../PitsideConsole/PitsideConsole.rc | 2 +- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 1945993 -> 2252283 bytes 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 976c3c0..52e2912 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -574,6 +574,11 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfLapOpts.flWindowShiftX += moveX; m_sfLapOpts.flWindowShiftY -= moveY; } + if(IS_FLAG_SET(wParam, MK_MBUTTON)) + { + // Dynamic update of All Data display + UpdateUI(UPDATE_ALLDATA); + } UpdateUI(UPDATE_MAP); return 0; } @@ -3218,7 +3223,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine INITCOMMONCONTROLSEX initCtrls; initCtrls.dwICC = ICC_LISTVIEW_CLASSES; initCtrls.dwSize = sizeof(initCtrls); - + LoadIcon(hInstance,_T("IDI_EXPLORERICON")); InitCommonControlsEx(&initCtrls); CMainUI sfUI; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 7b6ab78..7c2e2ce 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -2,7 +2,7 @@ #include #include "commctrl.h" -IDI_EXPLORERICON ICON "res\\pitside.ico" +"IDI_EXPLORERICON" ICON "res\\pitside.ico" IDB_SPLASHIMAGE BITMAP "res\\splash.bmp" IDD_DLGFIRST DIALOG 100, 100, 745, 350 diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index 354cec69e3970ce3d1e2325ab4eb697e5b3846f1..d68caeab658669ddb51e3e86d0aabffd88280257 100644 GIT binary patch delta 397590 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 z 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

NZj2``E88rHPpkBcGI9hu9oqA0d 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

8lOgEYb+v>ATY1g=Sq5nJ!<7E^%hCME=dv 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 U_`?DRpCb{7p&-OxB&x~(A1-Eo1poj5 From ef4045c3bbdf06c18911d2230dfe53e40f56afc2 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Wed, 11 Feb 2015 21:25:27 -0700 Subject: [PATCH 028/112] 2.003.0034: Fixed minor bugs in All Data window popup logic --- .../PitsideConsole/PitsideConsole.cpp | 17 ++++++++--------- PitsideConsole/PitsideConsole/PitsideConsole.rc | 6 +++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 52e2912..3fc0c1a 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -600,9 +600,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case WM_MBUTTONDOWN: { // Middle mouse button activates a modal window that dispalys all of the data for a given point in a table - HWND hWndMap = GetDlgItem(this->m_hWnd,IDC_DISPLAY); DLGPROC ShowAllData = NULL; - if (!IsWindow(hWnd_AllData)) + if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing { // Create the window for displaying all of the data points for the selected laps INITCOMMONCONTROLSEX InitCtrlEx; @@ -655,6 +654,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { DestroyWindow(hWnd_AllData); hWnd_AllData = NULL; + AD_hWnd = NULL; } } } @@ -808,13 +808,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case ID_OPTIONS_DRAWLINES: { m_sfLapOpts.fDrawLines = !m_sfLapOpts.fDrawLines; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD); + UpdateUI(UPDATE_MENU | UPDATE_MAP); return TRUE; } case ID_OPTIONS_BACKGROUND: { m_sfLapOpts.fColorScheme = !m_sfLapOpts.fColorScheme; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD); + UpdateUI(UPDATE_MENU | UPDATE_MAP); return TRUE; } case ID_OPTIONS_IOIO5VSCALE: @@ -893,7 +893,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) CPlotSelectDlg dlgPlot(g_pLapDB, &sfResult, m_iRaceId[0], &m_sfLapOpts); ArtShowDialog(&dlgPlot); bSetPlot = false; - UpdateUI(UPDATE_ALL | UPDATE_VALUES); + UpdateUI(UPDATE_ALL); } return TRUE; } @@ -940,7 +940,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } if(!sfResult.fCancelled) { - UpdateUI(UPDATE_ALL | UPDATE_VALUES); + UpdateUI(UPDATE_ALL); } return TRUE; } @@ -976,8 +976,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } case ID_OPTIONS_SMOOTH: { - m_fSmooth = !m_fSmooth; - m_sfLapOpts.bSmoothYesNo = m_fSmooth; + m_sfLapOpts.bSmoothYesNo = !m_sfLapOpts.bSmoothYesNo; UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); return TRUE; } @@ -1960,7 +1959,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) void UpdateAllData() { // hWnd_AllData is the handle for the window we want. Let's make sure that it is displayed - hWnd_AllData = GetWindow(m_hWnd, GW_ENABLEDPOPUP); +// hWnd_AllData = GetWindow(m_hWnd, GW_ENABLEDPOPUP); if (GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Only execute data display functions if window is showing { // First let's get all of the information about the data points for this lap/location diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 7c2e2ce..8fb6513 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -91,7 +91,7 @@ END // Dialog box for displaying all data for a given point IDD_ALLDATADISPLAY DIALOG 250, 75, 400, 250 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP +STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_CAPTION CAPTION "Data Point Information" FONT 10, "MS Shell Dlg" BEGIN @@ -101,7 +101,7 @@ END // Dialog box for displaying sector split times IDD_SHOWSECTORS DIALOG 250, 75, 375, 99 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_CAPTION +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Sector Times" FONT 9, "MS Shell Dlg" BEGIN @@ -118,7 +118,7 @@ END // dialog for selecting which race in a DB we want to use IDD_SELECTRACE DIALOG 150, 200, 200, 200 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select race to load" +CAPTION "Select one or more race sessions to load" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT/* | LVS_SINGLESEL*/ | LVS_SHOWSELALWAYS, 0,0,200,180 From 84b845a5f43d86f009254003dc24edb0b5f1bfe7 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Wed, 11 Feb 2015 21:50:21 -0700 Subject: [PATCH 029/112] Updated Help file for Pitside --- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 2252283 -> 2251853 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index d68caeab658669ddb51e3e86d0aabffd88280257..c5d4bbd388669618274ac7e310ae5c45f1eeef1b 100644 GIT binary patch delta 81735 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

N)B-$`M=|+~0{3kf9 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 Bi7)^F delta 82071 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 Date: Wed, 11 Feb 2015 23:14:35 -0700 Subject: [PATCH 030/112] 2.003.0034: Removed initial Splash screen and moved it to About... --- PitsideConsole/PitsideConsole/DlgAbout.cpp | 9 ++++ PitsideConsole/PitsideConsole/DlgSplash.cpp | 50 ------------------- PitsideConsole/PitsideConsole/DlgSplash.h | 16 ------ .../PitsideConsole/PitsideConsole.cpp | 5 -- .../PitsideConsole/PitsideConsole.rc | 22 +++----- .../PitsideConsole/PitsideConsole.vcxproj | 2 - .../PitsideConsole.vcxproj.filters | 6 --- PitsideConsole/PitsideConsole/resource.h | 1 - 8 files changed, 15 insertions(+), 96 deletions(-) delete mode 100644 PitsideConsole/PitsideConsole/DlgSplash.cpp delete mode 100644 PitsideConsole/PitsideConsole/DlgSplash.h diff --git a/PitsideConsole/PitsideConsole/DlgAbout.cpp b/PitsideConsole/PitsideConsole/DlgAbout.cpp index 9d8c3ed..3c51d95 100644 --- a/PitsideConsole/PitsideConsole/DlgAbout.cpp +++ b/PitsideConsole/PitsideConsole/DlgAbout.cpp @@ -10,9 +10,18 @@ LRESULT CAboutDlg::DlgProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { case WM_INITDIALOG: { + HBITMAP hBitmap = (HBITMAP)::LoadImage( GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SPLASHIMAGE), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE); ConvertStaticToHyperlink(c_hWnd, IDC_LBLMESSAGE6); + HWND hWndSplash = GetDlgItem( c_hWnd, IDC_SPLASHIMAGE ); + SendMessage(hWndSplash,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBitmap); break; } + case WM_RBUTTONDOWN: + case WM_LBUTTONDOWN: + { + EndDialog(c_hWnd,0); + break; + } case WM_COMMAND: { switch(LOWORD(wParam)) diff --git a/PitsideConsole/PitsideConsole/DlgSplash.cpp b/PitsideConsole/PitsideConsole/DlgSplash.cpp deleted file mode 100644 index c72a1cc..0000000 --- a/PitsideConsole/PitsideConsole/DlgSplash.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include "Stdafx.h" -#include "resource.h" -#include "pitsideconsole.h" -#include "DlgSplash.h" -#include "Hyperlinks.h" - -LRESULT CSplashDlg::DlgProc -( - HWND hWnd, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) -{ - switch(uMsg) - { - case WM_INITDIALOG: - { - HBITMAP hBitmap = (HBITMAP)::LoadImage( GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SPLASHIMAGE), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE); - ConvertStaticToHyperlink(hWnd, IDC_LBLMESSAGE6); - HWND hWndSplash = GetDlgItem( hWnd, IDC_SPLASHIMAGE ); - SendMessage(hWndSplash,STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hBitmap); - break; - } - case WM_RBUTTONDOWN: - case WM_LBUTTONDOWN: - { - EndDialog(hWnd,0); - break; - } - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case IDOK: - { - EndDialog(hWnd,0); - return TRUE; - } - } - break; - } // end WM_COMMAND - case WM_CLOSE: - { - EndDialog(hWnd,0); - return 0; - } - } - return FALSE; -} \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/DlgSplash.h b/PitsideConsole/PitsideConsole/DlgSplash.h deleted file mode 100644 index d19a973..0000000 --- a/PitsideConsole/PitsideConsole/DlgSplash.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -#include -#include "artui.h" -#include "resource.h" - -class CSplashDlg : public IUI -{ -public: - CSplashDlg() {}; - virtual ~CSplashDlg() {}; - - virtual void NotifyChange(WPARAM wParam, LPARAM lParam) {DASSERT(FALSE);}; - virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual DWORD GetDlgId() const {return IDD_DLGSPLASH;} -private: -}; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 3fc0c1a..1853eb8 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -28,7 +28,6 @@ #include "DashWare.h" #include "Multicast.h" #include "PitsideHTTP.h" -#include "DlgSplash.h" #include "SQLiteLapDB.h" #include "UnitTests.h" #include @@ -3211,10 +3210,6 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { -// Show Splash screen as first screen - CSplashDlg splash; - ArtShowDialog(&splash); - if(strcmp(lpCmdLine,"unit") == 0) { return UnitTests(); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 8fb6513..dc30499 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -40,17 +40,6 @@ BEGIN LTEXT "5: ", IDC_VALUE_CHANNEL5, 328,48,190,12 END -// Dialog box showing the splash screen -IDD_DLGSPLASH DIALOG 100,100,200,250 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME -CAPTION "Welcome to Pitside" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,0,0,200,200 - CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,0,200,200,20 - PUSHBUTTON "OK", IDOK, 0,220,200,30 -END - // Dialog box for sending messages to the car IDD_DLGMESSAGE DIALOG 280, 200, 200, 85 STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_CAPTION | WS_SYSMENU @@ -196,14 +185,15 @@ BEGIN END // About... dialog with hyperlink now -IDD_ABOUT DIALOG 350, 200, 250, 125 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +IDD_ABOUT DIALOG 300, 125, 250, 325 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0034\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,5,245,40 - CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,60,245,20 - PUSHBUTTON "OK", IDOK, 5,100,240,24 + CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0034\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 + PUSHBUTTON "OK", IDOK, 5,290,240,30 END // name input dialog for renaming races in a DB diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj index e5f32be..884a2ca 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj +++ b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj @@ -123,7 +123,6 @@ copyjs_rel.bat - @@ -152,7 +151,6 @@ copyjs_rel.bat - diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters index d5357af..5f6b5ac 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters +++ b/PitsideConsole/PitsideConsole/PitsideConsole.vcxproj.filters @@ -60,9 +60,6 @@ Header Files - - Header Files - Header Files @@ -137,9 +134,6 @@ Source Files - - Source Files - Source Files diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index c442961..75d9d2a 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -42,7 +42,6 @@ #define ID_OPTIONS_DRAWLINES 43 #define ID_DATA_DASHWARE 44 #define IDC_SPLASHIMAGE 45 -#define IDD_DLGSPLASH 46 #define IDB_SPLASHIMAGE 47 #define ID_DATA_SWITCHSESSION 48 #define ID_OPTIONS_IOIO5VSCALE 49 From 0564a7c8fdfcfe1e3e57b58cc80360f362c5a436 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Thu, 12 Feb 2015 07:26:58 -0700 Subject: [PATCH 031/112] Beginning of converting Sector Times window into a Listview --- .../PitsideConsole/PitsideConsole.cpp | 50 +++++++++++++++++-- .../PitsideConsole/PitsideConsole.rc | 17 ++++--- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 1853eb8..0d6b1b5 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -503,6 +503,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) TCHAR szTemp[512], szLap[512]; HWND hWndIp = GetDlgItem(m_hWnd, IDC_LIVELAPTIME); static WINDOWPLACEMENT w_AllDataWindow; // Save the location for the AllData display window + static WINDOWPLACEMENT w_SectorTimesWindow; // Save the location for the Sector Times display window ::FormatTimeMinutesSecondsMs((float)(timeGetTime() - tmLast) / 1000, szLap, NUMCHARS(szLap) ); swprintf(szLap, _tcslen(szLap) - 2, L"%s", szLap); // Remove the fractional time swprintf(szTemp, NUMCHARS(szTemp), L"Current Lap: %s", szLap); @@ -922,13 +923,54 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) DLGPROC ShowSplits = NULL; if (!IsWindow(hwndSplits)) { - hwndSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); +// hwndSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); // Let's get the handles for all display controls in this window for (int y = 0; y < MaxLaps; y++) { m_sfLapOpts.hWndLap[y] = GetDlgItem(hwndSplits, IDC_SHOW_LAP0 + y); } + // Now let's create the Listview for this control + +// LTEXT "\t\tLap ID\t\t\tSect 1\tSect 2\tSect 3\tSect 4\tSect 5\tSect 6\tSect 7\tSect 8\tSect 9", IDC_SHOW_SECTORS,5,0,370,12 +// LTEXT "Lap 1", IDC_SHOW_LAP0, 5,15,375,12 +// LTEXT "Lap 2", IDC_SHOW_LAP1, 5,27,375,12 +// LTEXT "Lap 3", IDC_SHOW_LAP2, 5,39,375,12 +// LTEXT "Lap 4", IDC_SHOW_LAP3, 5,51,375,12 +// LTEXT "Lap 5", IDC_SHOW_LAP4, 5,63,375,12 +// LTEXT "Lap 6", IDC_SHOW_LAP5, 5,75,375,12 +// LTEXT "Lap 7", IDC_SHOW_LAP6, 5,87,375,12 + + // Create the window for displaying sector times for the selected laps + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); + hwndSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); + m_sfLapOpts.hWndLap[0] = GetDlgItem(hwndSplits,IDC_SHOW_SECTORS); // Sector Times listview + SetWindowPlacement(hwndSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window + + // Set up the Sector Times list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Lap ID"); + lstCols.push_back(L"Sect 1"); + lstCols.push_back(L"Sect 2"); + lstCols.push_back(L"Sect 3"); + lstCols.push_back(L"Sect 4"); + lstCols.push_back(L"Sect 5"); + lstCols.push_back(L"Sect 6"); + lstCols.push_back(L"Sect 7"); + lstWidths.push_back(180); + lstWidths.push_back(50); + lstWidths.push_back(50); + lstWidths.push_back(50); + lstWidths.push_back(50); + lstWidths.push_back(50); + lstWidths.push_back(50); + lstWidths.push_back(50); + ShowSplitsHandle = hwndSplits; // Tracker for handle address + m_sfListBox.Init(m_sfLapOpts.hWndLap[0],lstCols,lstWidths); // Initialize and show the listview control ShowWindow(hwndSplits, SW_SHOW); } } @@ -2334,10 +2376,8 @@ void UpdateSectors() dLastLapDist = dSectorDistance; break; } - } - // End Interpolation Loop - } - // End Sector Loop + } // End Interpolation Loop + } // End Sector Loop // Now that we have computed the Sector Time, let's Display them { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index dc30499..f7a8474 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -94,14 +94,15 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Sector Times" FONT 9, "MS Shell Dlg" BEGIN - LTEXT "\t\tLap ID\t\t\tSect 1\tSect 2\tSect 3\tSect 4\tSect 5\tSect 6\tSect 7\tSect 8\tSect 9", IDC_SHOW_SECTORS,5,0,370,12 - LTEXT "Lap 1", IDC_SHOW_LAP0, 5,15,375,12 - LTEXT "Lap 2", IDC_SHOW_LAP1, 5,27,375,12 - LTEXT "Lap 3", IDC_SHOW_LAP2, 5,39,375,12 - LTEXT "Lap 4", IDC_SHOW_LAP3, 5,51,375,12 - LTEXT "Lap 5", IDC_SHOW_LAP4, 5,63,375,12 - LTEXT "Lap 6", IDC_SHOW_LAP5, 5,75,375,12 - LTEXT "Lap 7", IDC_SHOW_LAP6, 5,87,375,12 + CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 5,0,370,96 +// LTEXT "\t\tLap ID\t\t\tSect 1\tSect 2\tSect 3\tSect 4\tSect 5\tSect 6\tSect 7\tSect 8\tSect 9", IDC_SHOW_SECTORS,5,0,370,12 +// LTEXT "Lap 1", IDC_SHOW_LAP0, 5,15,375,12 +// LTEXT "Lap 2", IDC_SHOW_LAP1, 5,27,375,12 +// LTEXT "Lap 3", IDC_SHOW_LAP2, 5,39,375,12 +// LTEXT "Lap 4", IDC_SHOW_LAP3, 5,51,375,12 +// LTEXT "Lap 5", IDC_SHOW_LAP4, 5,63,375,12 +// LTEXT "Lap 6", IDC_SHOW_LAP5, 5,75,375,12 +// LTEXT "Lap 7", IDC_SHOW_LAP6, 5,87,375,12 END // dialog for selecting which race in a DB we want to use From 17721f7db11236a8f9b1d084c1f11cf97aac70c8 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Thu, 12 Feb 2015 18:03:40 -0700 Subject: [PATCH 032/112] Modal dialog box coding, remarked out at this time. --- .../PitsideConsole/PitsideConsole.cpp | 62 ++++++++++++++++++- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 1853eb8..df130cc 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -509,7 +509,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) SendMessage(hWndIp, WM_SETTEXT, 0, (LPARAM)szTemp); switch(uMsg) - { + { case WM_INITDIALOG: { m_hWnd = hWnd; @@ -2358,7 +2358,8 @@ void UpdateSectors() // End Lap Loop } } -void UpdateValues() + + void UpdateValues() { // Update the data channels that are being displayed as values // List of highlighted laps @@ -2486,11 +2487,66 @@ void UpdateValues() CWarningDlg dlgWarning(&sfResult, m_szYString); ArtShowDialog(&dlgWarning); fWarnedOnce = false; +/* + TCHAR szMessage[1024] = L""; + swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); +// HWND hWndWarning = NULL; UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; + HWND hwndGoto = NULL; // Window handle of dialog box + DLGPROC Warning = NULL; +// DLGPROC Warning(HWND hwndGoto, UINT uWarningMsg, WPARAM wWarningMsg, LPARAM lWarningMsg); + if (!IsWindow(hwndGoto)) + { + hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, Warning ( hwndGoto, uWarningMsg, wWarningParam, lWarningParam ) ); + swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); + HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); + SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); + ShowWindow(hwndGoto, SW_SHOW); + Sleep (5000); +// Warning( hWndWarning, m_uMsg, m_wParam, m_lParam ); + EndDialog(hwndGoto,0); + } +*/ } } } } - void UpdateDisplays() + +// Processing routine for Data Channel warning dialog +LRESULT WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: + { +// TCHAR szMessage[1024] = L""; +// swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); +// HWND hWndWarning = GetDlgItem(c_hWnd, IDC_WARNING1); +// SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); + MessageBeep(MB_OK); // Play a warning sound + break; + } + case WM_COMMAND: + { + switch(LOWORD(wParam)) + { + case IDOK: + { + EndDialog(c_hWnd,0); + return TRUE; + } + } + break; + } // end WM_COMMAND + case WM_CLOSE: + { + EndDialog(c_hWnd,0); + break; + } + } + return FALSE; +} + +void UpdateDisplays() { m_sfLapPainter.Refresh(); m_sfSubDisplay.Refresh(); From d2b8cfc50197ea5533be8de36d27409561340def Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Thu, 12 Feb 2015 22:05:56 -0700 Subject: [PATCH 033/112] 2.003.0034: Converted Sector Times display into a Listview --- .../PitsideConsole/PitsideConsole.cpp | 184 +++++++++++------- .../PitsideConsole/PitsideConsole.rc | 10 +- PitsideConsole/PitsideConsole/resource.h | 7 - 3 files changed, 120 insertions(+), 81 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 9b3aae3..22b3f17 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -953,21 +953,25 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) vector lstCols; vector lstWidths; lstCols.push_back(L"Lap ID"); - lstCols.push_back(L"Sect 1"); - lstCols.push_back(L"Sect 2"); - lstCols.push_back(L"Sect 3"); - lstCols.push_back(L"Sect 4"); - lstCols.push_back(L"Sect 5"); - lstCols.push_back(L"Sect 6"); - lstCols.push_back(L"Sect 7"); - lstWidths.push_back(180); - lstWidths.push_back(50); - lstWidths.push_back(50); - lstWidths.push_back(50); - lstWidths.push_back(50); - lstWidths.push_back(50); - lstWidths.push_back(50); - lstWidths.push_back(50); + lstCols.push_back(L"1"); + lstCols.push_back(L"2"); + lstCols.push_back(L"3"); + lstCols.push_back(L"4"); + lstCols.push_back(L"5"); + lstCols.push_back(L"6"); + lstCols.push_back(L"7"); + lstCols.push_back(L"8"); + lstCols.push_back(L"9"); + lstWidths.push_back(195); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); ShowSplitsHandle = hwndSplits; // Tracker for handle address m_sfListBox.Init(m_sfLapOpts.hWndLap[0],lstCols,lstWidths); // Initialize and show the listview control @@ -976,8 +980,15 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } else if (!m_sfLapOpts.fDrawSplitPoints) { - EndDialog(ShowSplitsHandle, 0); - ShowSplitsHandle = NULL; + // If the window showing all of the lap data is present, let's kill it + if (m_sfLapOpts.hWndLap[0]) + { + if (GetWindowPlacement(ShowSplitsHandle, &w_SectorTimesWindow) ) + { + DestroyWindow(ShowSplitsHandle); + ShowSplitsHandle = NULL; + } + } } if(!sfResult.fCancelled) { @@ -2260,18 +2271,16 @@ void UpdateSectors() // Lap run through the Ref Lap Time/Distance array and interpolate the iTime at the equivalent distance // Coding is similar to TimeSlip - // First, let's make sure that we have a Reference Lap, or let's not perform this - if (m_pReferenceLap != NULL) - { + if (m_pReferenceLap != NULL) // First, let's make sure that we have a Reference Lap, or let's not perform this + { + ListView_DeleteAllItems(m_sfLapOpts.hWndLap[0]); // Clear the list before displaying the update const int cSectors = 9; // The maximum number of Sectors to display, gated by display area - const int MaxLaps = 7; // Maximum number of laps to display - int w = 0; // String variable counter for Sector display + const int MaxLaps = 9; // Maximum number of laps to display + int w = 0; // Lap tracker for Sector display + int s = 0; // Sector tracker for Listview - // Get the list of highlighted lap time ID's - set setSelected = m_sfLapList.GetSelectedItemsData(); - - // Load the CExtendedLap data for the lap list - vector lstLaps = GetLapsToShow(); + set setSelected = m_sfLapList.GetSelectedItemsData(); // Get the list of highlighted lap time ID's + vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list // Get the points from the Ref Lap for computation const vector& lstRefPoints = m_pReferenceLap->GetPoints(); // For iTime @@ -2280,43 +2289,40 @@ void UpdateSectors() // Strings for building the Sector Times output for each lap TCHAR szLapString[50][512] = {NULL}; TCHAR szString[50][512] = {NULL}; + TCHAR szSectorTime[MAX_PATH] = {NULL}; // String containing the formatted sector time - // Lap Loop + // Lap Loop // Now loop through the lap list, compute the sector times and store them in SplitPoints[] for(vector::iterator i = lstLaps.begin(); i != lstLaps.end(); i++) { - // Get the data points for this lap, and compare the sector times to the Reference Lap (m_pReferenceLap) - CExtendedLap* pLap = *i; - - // Get the points from the Selected Lap for computation - const vector& lstLapPoints = pLap->GetPoints(); - + CExtendedLap* pLap = *i; // Get the data points for this lap, and compare the sector times to the Reference Lap (m_pReferenceLap) + const vector& lstLapPoints = pLap->GetPoints(); // Get the points from the Selected Lap for computation pLap->GetString(szLapString[w], NUMCHARS(szLapString)); // Timestamp of this lap, to used to name it - if (_tcslen(szLapString[w]) <= 30) - { - swprintf(szLapString[w], NUMCHARS(szLapString[w]), L"%s\t", szLapString[w]); // Add a TAB mark for formatting - } - else - { - swprintf(szLapString[w], 39, szLapString[w]); // Truncate the Timestamp string for formatting - } - const IDataChannel* pDistance = pLap->GetChannel(DATA_CHANNEL_DISTANCE); + // Let's load the Listview row titles with this result + wchar_t result[MAX_PATH] ; + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = w; // Which Lap subscript + p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) + p_ADlvi.lParam = 0; + swprintf(result,NUMCHARS(result), szLapString[w]); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); // Using the lap time stamp/string for its name + const IDataChannel* pDistance = pLap->GetChannel(DATA_CHANNEL_DISTANCE); int iLapStartTime = lstLapPoints[0].iTime; - // Sector Loop + // Sector Loop // Now loop through the split points and determine lap times for each sector - for(int s = 1; s <= cSectors; s++) + for(s = 1; s <= cSectors; s++) { - // Get the Split Point iTime and it's distance value - const int SectorStartTime = m_sfLapOpts.m_SplitPoints[s].m_sfSectorTime; - const double dSectorDistance = pReferenceDistance->GetValue((int)SectorStartTime); - - // First iTime for the lap array + const int SectorStartTime = m_sfLapOpts.m_SplitPoints[s].m_sfSectorTime; // Get the Split Point iTime and it's distance value + const double dSectorDistance = pReferenceDistance->GetValue((int)SectorStartTime); // First iTime for the lap array bool b_SectorFlag = false; double dLastLapDist = 0; - // Interpolation Loop + + // Interpolation Loop // Now go through the lap array and find the 2 points that span the dSectorDistance distance for (int x = 1; x < lstLapPoints.size(); x++) { @@ -2347,7 +2353,15 @@ void UpdateSectors() { float dSectorTime = dEstimatedElapsedTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's build the Sector times string - swprintf(szString[w], NUMCHARS(szString[w]), L"%s\t%4.2f", szString[w], dSectorTime/1000); + // Now that we have computed the Sector Time, let's put it in the Sector times string + if ( dSectorTime > 1 ) // 1 used for roundoff error + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); + } + else + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); + } iLapStartTime = dEstimatedElapsedTime; dLastLapDist = dSectorDistance; break; @@ -2359,7 +2373,15 @@ void UpdateSectors() const int iLastTime = lstLapPoints[x-1].iTime; float dSectorTime = iLastTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's build the Sector times string - swprintf(szString[w], NUMCHARS(szString[w]), L"%s\t%4.2f", szString[w], dSectorTime/1000); + // Now that we have computed the Sector Time, let's put it in the Sector times string + if ( dSectorTime > 1 ) // 1 used for roundoff error + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); + } + else + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); + } iLapStartTime = iLastTime; dLastLapDist = dSectorDistance; break; @@ -2371,31 +2393,63 @@ void UpdateSectors() const int iLastTime = lstLapPoints[lstLapPoints.size()-1].iTime; float dSectorTime = iLastTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's build the Sector times string - swprintf(szString[w], NUMCHARS(szString[w]), L"%s\t%4.2f", szString[w], dSectorTime/1000); + // Now that we have computed the Sector Time, let's put it in the Sector times string + if ( dSectorTime > 1 ) // 1 used for roundoff error + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); + } + else + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); + } iLapStartTime = iLastTime; dLastLapDist = dSectorDistance; break; } } // End Interpolation Loop + + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = w; // Which Lap subscript + p_ADlvi.iSubItem = s; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.lParam = s; + swprintf(result,NUMCHARS(result), szSectorTime); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); + + } // End Sector Loop - - // Now that we have computed the Sector Time, let's Display them - { - swprintf(szLapString[w], NUMCHARS(szLapString[w]), L"%s %s", szLapString[w], szString[w]); - SendMessage(m_sfLapOpts.hWndLap[w], WM_SETTEXT, 0, (LPARAM)szLapString[w]); - } // Increment "w" counter and do the next lap w++; if (w >= MaxLaps) break; // Stop building these if we already have as many as we need. - } + } // Lap Loop end + // Clean up any old lap sector times if user chose fewer laps to display for (int x = w; x < MaxLaps; x++) { - swprintf(szLapString[x], NUMCHARS(szLapString[x]), L"Lap %i:", x + 1); - SendMessage(m_sfLapOpts.hWndLap[x], WM_SETTEXT, 0, (LPARAM)szLapString[x]); + wchar_t result[MAX_PATH] = {NULL}; // Null string + // Let's load the Listview row titles with this result + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = x; // Which Lap subscript + p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) + p_ADlvi.lParam = 0; + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); // Using a null string for the name + + for (int z = 1; z <= cSectors; z++) + { + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = x; // Which Lap subscript + p_ADlvi.iSubItem = z; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.lParam = z; + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); + } } - - // End Lap Loop } } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index f7a8474..d34a813 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -94,15 +94,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Sector Times" FONT 9, "MS Shell Dlg" BEGIN - CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 5,0,370,96 -// LTEXT "\t\tLap ID\t\t\tSect 1\tSect 2\tSect 3\tSect 4\tSect 5\tSect 6\tSect 7\tSect 8\tSect 9", IDC_SHOW_SECTORS,5,0,370,12 -// LTEXT "Lap 1", IDC_SHOW_LAP0, 5,15,375,12 -// LTEXT "Lap 2", IDC_SHOW_LAP1, 5,27,375,12 -// LTEXT "Lap 3", IDC_SHOW_LAP2, 5,39,375,12 -// LTEXT "Lap 4", IDC_SHOW_LAP3, 5,51,375,12 -// LTEXT "Lap 5", IDC_SHOW_LAP4, 5,63,375,12 -// LTEXT "Lap 6", IDC_SHOW_LAP5, 5,75,375,12 -// LTEXT "Lap 7", IDC_SHOW_LAP6, 5,87,375,12 + CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,375,96 END // dialog for selecting which race in a DB we want to use diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index 75d9d2a..b319438 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -265,13 +265,6 @@ #define IDD_SHOWSECTORS 340 #define IDC_SHOW_SECTORS 341 -#define IDC_SHOW_LAP0 342 -#define IDC_SHOW_LAP1 343 -#define IDC_SHOW_LAP2 344 -#define IDC_SHOW_LAP3 345 -#define IDC_SHOW_LAP4 346 -#define IDC_SHOW_LAP5 347 -#define IDC_SHOW_LAP6 348 #define IDC_PLOTTYPE_TRANS_A0 355 #define IDC_PLOTTYPE_TRANS_A1 356 From d1312962690290f7e9f560f3f5c08bff9bad17f3 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Fri, 13 Feb 2015 10:01:31 -0700 Subject: [PATCH 034/112] 2.003.0034: Final version with Data Values in a List View --- PitsideConsole/PitsideConsole/LapData.h | 11 ++ .../PitsideConsole/PitsideConsole.cpp | 107 +++++++++++------- .../PitsideConsole/PitsideConsole.rc | 8 +- PitsideConsole/PitsideConsole/resource.h | 2 + 4 files changed, 84 insertions(+), 44 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 7328ed3..97510ed 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -145,6 +145,17 @@ static bool SetDistance(int b_KmOrLat) // Function to set X-Axis units in either lstCols.push_back(L"Y-Axis"); lstWidths.push_back(90); } + static void GetStringHeadersDataValues(vector& lstCols, vector& lstWidths) + { + lstCols.push_back(L"Parameter"); + lstWidths.push_back(110); + lstCols.push_back(L"Min:"); + lstWidths.push_back(50); + lstCols.push_back(L"Max:"); + lstWidths.push_back(50); + lstCols.push_back(L"Avg:"); + lstWidths.push_back(50); + } void GetStrings(vector& lstStrings) const { TCHAR szTime[100]; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 22b3f17..7a89f26 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -527,11 +527,17 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) CExtendedLap::GetStringHeadersYAxis(lstCols,lstWidths); m_sfYAxis.Init(GetDlgItem(m_hWnd, IDC_YAXIS),lstCols,lstWidths); } + { + vector lstCols; + vector lstWidths; + CExtendedLap::GetStringHeadersDataValues(lstCols,lstWidths); + m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_DATAVALUES), lstCols,lstWidths); + } { vector lstCols; vector lstWidths; CExtendedLap::GetStringHeaders(lstCols,lstWidths); - m_sfLapList.Init(GetDlgItem(hWnd, IDC_LAPS), lstCols,lstWidths); + m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); } m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); m_sfSubDisplay.Init(GetDlgItem(hWnd,IDC_SUBDISPLAY)); @@ -923,23 +929,9 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) DLGPROC ShowSplits = NULL; if (!IsWindow(hwndSplits)) { -// hwndSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); - // Let's get the handles for all display controls in this window - for (int y = 0; y < MaxLaps; y++) - { - m_sfLapOpts.hWndLap[y] = GetDlgItem(hwndSplits, IDC_SHOW_LAP0 + y); - } - // Now let's create the Listview for this control - -// LTEXT "\t\tLap ID\t\t\tSect 1\tSect 2\tSect 3\tSect 4\tSect 5\tSect 6\tSect 7\tSect 8\tSect 9", IDC_SHOW_SECTORS,5,0,370,12 -// LTEXT "Lap 1", IDC_SHOW_LAP0, 5,15,375,12 -// LTEXT "Lap 2", IDC_SHOW_LAP1, 5,27,375,12 -// LTEXT "Lap 3", IDC_SHOW_LAP2, 5,39,375,12 -// LTEXT "Lap 4", IDC_SHOW_LAP3, 5,51,375,12 -// LTEXT "Lap 5", IDC_SHOW_LAP4, 5,63,375,12 -// LTEXT "Lap 6", IDC_SHOW_LAP5, 5,75,375,12 -// LTEXT "Lap 7", IDC_SHOW_LAP6, 5,87,375,12 - + // Let's get the handle for the display control in this window + m_sfLapOpts.hWndLap[0] = GetDlgItem(hwndSplits, IDC_SHOW_SECTORS); + // Create the window for displaying sector times for the selected laps INITCOMMONCONTROLSEX InitCtrlEx; InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); @@ -2460,7 +2452,9 @@ void UpdateSectors() set setSelectedData = m_sfLapList.GetSelectedItemsData(); if(setSelectedData.size() > 0) { - const int cLabels = 5; // The maximum number of Value Data channels to display, gated by display area + HWND hWndDataValues = GetDlgItem(m_hWnd, IDC_DATAVALUES); // Get the handle for the control + ListView_DeleteAllItems(hWndDataValues); // Clear the list before displaying the update + const int cLabels = 10; // The maximum number of Value Data channels to display, gated by display area bool m_Warning = false; // Flag for showing dialog of Value display to indicate statistics are outside of bounds TCHAR m_szYString[512] = {NULL}; TCHAR m_szWarningChannel[MAX_PATH] = {NULL}; @@ -2534,18 +2528,69 @@ void UpdateSectors() flAvg=0.0f; } } + // Now assign these values to the Data Value variable for display TCHAR szChannelName[MAX_PATH]; + TCHAR w_szMin[MAX_PATH]; + TCHAR w_szMax[MAX_PATH]; GetDataChannelName(eChannel,szChannelName,NUMCHARS(szChannelName)); char szMin[MAX_PATH]; char szMax[MAX_PATH]; GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flMin,szMin,NUMCHARS(szMin)); GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flMax,szMax,NUMCHARS(szMax)); + // Need to convert these from char to wchar_t + swprintf(w_szMin, NUMCHARS(w_szMin), L"S", szMin); + swprintf(w_szMax, NUMCHARS(w_szMax), L"S", szMax); + // Now assemble the string to display (max of 5) if (w < cLabels) { - swprintf(szLabel[w],NUMCHARS(szLabel[w]),L"%s: Min: %S, Max: %S, Avg: %3.1f",szChannelName,szMin,szMax,flAvg); + + // Display the Data Value Channels + + // Let's load the Listview row titles with this result + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) + p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) + p_ADlvi.lParam = 0; + p_ADlvi.pszText = szChannelName; + p_ADlvi.cchTextMax = wcslen(szChannelName); + ListView_InsertItem(hWndDataValues, &p_ADlvi); // Using a null string for the name + + + wchar_t result[MAX_PATH] = {NULL}; // Null string + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) + p_ADlvi.iSubItem = 1; // Which Subitem subscript + p_ADlvi.lParam = 1; + swprintf(result,NUMCHARS(result), L"%S", szMin); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(hWndDataValues, &p_ADlvi); + + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) + p_ADlvi.iSubItem = 2; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.lParam = 2; + swprintf(result,NUMCHARS(result), L"%S", szMax); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(hWndDataValues, &p_ADlvi); + + + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) + p_ADlvi.iSubItem = 3; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.lParam = 3; + swprintf(result,NUMCHARS(result), L"%3.1f", flAvg); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(hWndDataValues, &p_ADlvi); + w++; // Increment Value string counter } break; @@ -2555,22 +2600,7 @@ void UpdateSectors() } } } - // Display the Data Value Channels - for (int z = 0; z < cLabels; z++) - { - HWND hWndLabel = GetDlgItem(m_hWnd, IDC_VALUE_CHANNEL1 + z); - hdc = GetDC(hWndLabel); - - SetBkMode(hdc,TRANSPARENT); - SetTextColor(hdc,RGB(255,0,0)); - //GetSysColorBrush(GetSysColor(COLOR_WINDOW)); - CreateSolidBrush(RGB(255,255,255)); - - //SetTextColor( hdc, RGB(255, 0, 0) ); - //SetBkColor(hdc, RGB(222,231,249)); - SendMessage(hWndLabel, WM_SETTEXT, 0, (LPARAM)szLabel[z]); - } - if (m_Warning) // Pop up dialog saying the alarm has been triggered + if (m_Warning) // Pop up dialog saying the alarm has been triggered { static bool fWarnedOnce; // Prevent multiple windows from appearing if(!fWarnedOnce) @@ -2582,6 +2612,7 @@ void UpdateSectors() ArtShowDialog(&dlgWarning); fWarnedOnce = false; /* + // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); // HWND hWndWarning = NULL; UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; @@ -2604,7 +2635,7 @@ void UpdateSectors() } } } - +/* // Processing routine for Data Channel warning dialog LRESULT WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -2639,7 +2670,7 @@ LRESULT WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } return FALSE; } - +*/ void UpdateDisplays() { m_sfLapPainter.Refresh(); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index d34a813..88b1b7e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -32,12 +32,8 @@ BEGIN LTEXT "", IDC_CURRENTREFERENCE, 155,26,93,24 LTEXT "", IDC_MESSAGESTATUS, 155,43,93,24 LTEXT "Phone: ", IDC_CURRENTREMOTEIP, 155,55,100,10 - LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,55,100,10 - LTEXT "1: ", IDC_VALUE_CHANNEL1, 328,0,190,12 - LTEXT "2: ", IDC_VALUE_CHANNEL2, 328,12,190,12 - LTEXT "3: ", IDC_VALUE_CHANNEL3, 328,24,190,12 - LTEXT "4: ", IDC_VALUE_CHANNEL4, 328,36,190,12 - LTEXT "5: ", IDC_VALUE_CHANNEL5, 328,48,190,12 + LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,55,70,10 + CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 END // Dialog box for sending messages to the car diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index b319438..4a57200 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -265,6 +265,8 @@ #define IDD_SHOWSECTORS 340 #define IDC_SHOW_SECTORS 341 +#define IDD_DATAVALUES 342 +#define IDC_DATAVALUES 343 #define IDC_PLOTTYPE_TRANS_A0 355 #define IDC_PLOTTYPE_TRANS_A1 356 From 85ed0e54cb12973ad163306f45f75f9c3091821a Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Fri, 13 Feb 2015 22:42:56 -0700 Subject: [PATCH 035/112] 2.003.0034: Sector Splits bug fix --- .../PitsideConsole/PitsideConsole.cpp | 136 +++++++----------- 1 file changed, 52 insertions(+), 84 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 7a89f26..8d39a6a 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -491,6 +491,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) HWND hWnd_AllData; // AllData window control handle HWND AD_hWnd; // AllData listview control handle LVITEM p_ADlvi; // Listview global pointer for Hot Laps + HWND hWndShowSplits; // Show Sectors window control handle + HWND HC_ShowSplits; // Handle to the Splits listview control LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -514,6 +516,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case WM_INITDIALOG: { m_hWnd = hWnd; + hWndShowSplits = NULL; { vector lstCols; vector lstWidths; @@ -919,66 +922,57 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return TRUE; } - static HWND ShowSplitsHandle; const int cSectors = 9; // Maximum numbers of Split Times const int MaxLaps = 7; // Maximum number of laps to display - if (!IsWindow(ShowSplitsHandle) && m_sfLapOpts.fDrawSplitPoints) + if (!IsWindow(hWndShowSplits) && m_sfLapOpts.fDrawSplitPoints) { // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE - HWND hwndSplits = NULL; // Window handle of non-modal dialog box DLGPROC ShowSplits = NULL; - if (!IsWindow(hwndSplits)) - { - // Let's get the handle for the display control in this window - m_sfLapOpts.hWndLap[0] = GetDlgItem(hwndSplits, IDC_SHOW_SECTORS); - - // Create the window for displaying sector times for the selected laps - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&InitCtrlEx); - hwndSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); - m_sfLapOpts.hWndLap[0] = GetDlgItem(hwndSplits,IDC_SHOW_SECTORS); // Sector Times listview - SetWindowPlacement(hwndSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window - - // Set up the Sector Times list box columns - vector lstCols; - vector lstWidths; - lstCols.push_back(L"Lap ID"); - lstCols.push_back(L"1"); - lstCols.push_back(L"2"); - lstCols.push_back(L"3"); - lstCols.push_back(L"4"); - lstCols.push_back(L"5"); - lstCols.push_back(L"6"); - lstCols.push_back(L"7"); - lstCols.push_back(L"8"); - lstCols.push_back(L"9"); - lstWidths.push_back(195); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - - ShowSplitsHandle = hwndSplits; // Tracker for handle address - m_sfListBox.Init(m_sfLapOpts.hWndLap[0],lstCols,lstWidths); // Initialize and show the listview control - ShowWindow(hwndSplits, SW_SHOW); - } + + // Create the window for displaying sector times for the selected laps + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); + hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); // Create resource + HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window + + // Set up the Sector Times list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Lap ID"); + lstCols.push_back(L"1"); + lstCols.push_back(L"2"); + lstCols.push_back(L"3"); + lstCols.push_back(L"4"); + lstCols.push_back(L"5"); + lstCols.push_back(L"6"); + lstCols.push_back(L"7"); + lstCols.push_back(L"8"); + lstCols.push_back(L"9"); + lstWidths.push_back(195); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + + m_sfListBox.Init(HC_ShowSplits,lstCols,lstWidths); // Initialize and show the Sector Splits window + ShowWindow(hWndShowSplits, SW_SHOW); } else if (!m_sfLapOpts.fDrawSplitPoints) { - // If the window showing all of the lap data is present, let's kill it - if (m_sfLapOpts.hWndLap[0]) + if (HC_ShowSplits) // If the window showing all of the lap data is present, let's kill it { - if (GetWindowPlacement(ShowSplitsHandle, &w_SectorTimesWindow) ) + if (GetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow) ) { - DestroyWindow(ShowSplitsHandle); - ShowSplitsHandle = NULL; + DestroyWindow(hWndShowSplits); + hWndShowSplits = NULL; } } } @@ -2256,6 +2250,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return sum; } } + void UpdateSectors() { // Update the Sector Times display @@ -2263,9 +2258,10 @@ void UpdateSectors() // Lap run through the Ref Lap Time/Distance array and interpolate the iTime at the equivalent distance // Coding is similar to TimeSlip - if (m_pReferenceLap != NULL) // First, let's make sure that we have a Reference Lap, or let's not perform this + if ( m_pReferenceLap != NULL && m_sfLapOpts.fDrawSplitPoints ) // First, let's make sure that we have a Reference Lap, or let's not perform this { - ListView_DeleteAllItems(m_sfLapOpts.hWndLap[0]); // Clear the list before displaying the update + HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + ListView_DeleteAllItems(HC_ShowSplits); // Clear the list before displaying the update const int cSectors = 9; // The maximum number of Sectors to display, gated by display area const int MaxLaps = 9; // Maximum number of laps to display int w = 0; // Lap tracker for Sector display @@ -2300,7 +2296,7 @@ void UpdateSectors() swprintf(result,NUMCHARS(result), szLapString[w]); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); // Using the lap time stamp/string for its name + ListView_InsertItem(HC_ShowSplits, &p_ADlvi); // Using the lap time stamp/string for its name const IDataChannel* pDistance = pLap->GetChannel(DATA_CHANNEL_DISTANCE); int iLapStartTime = lstLapPoints[0].iTime; @@ -2408,40 +2404,12 @@ void UpdateSectors() swprintf(result,NUMCHARS(result), szSectorTime); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); - + ListView_SetItem(HC_ShowSplits, &p_ADlvi); - } // End Sector Loop - // Increment "w" counter and do the next lap - w++; + } // End Sector Loop + w++; // Increment "w" counter and do the next lap if (w >= MaxLaps) break; // Stop building these if we already have as many as we need. } // Lap Loop end - - // Clean up any old lap sector times if user chose fewer laps to display - for (int x = w; x < MaxLaps; x++) - { - wchar_t result[MAX_PATH] = {NULL}; // Null string - // Let's load the Listview row titles with this result - p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; - p_ADlvi.iItem = x; // Which Lap subscript - p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) - p_ADlvi.lParam = 0; - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); // Using a null string for the name - - for (int z = 1; z <= cSectors; z++) - { - // Insert the item into the Listview - p_ADlvi.mask = LVIF_TEXT; - p_ADlvi.iItem = x; // Which Lap subscript - p_ADlvi.iSubItem = z; // Which Sector subscript incremented to be positioned correctly - p_ADlvi.lParam = z; - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(m_sfLapOpts.hWndLap[0], &p_ADlvi); - } - } } } From bed908fd7b612731b857dcf09208071671f9737a Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sat, 14 Feb 2015 00:21:51 -0700 Subject: [PATCH 036/112] Code cleanup --- PitsideConsole/PitsideConsole/LapPainter.cpp | 39 +++++++++---------- .../PitsideConsole/PitsideConsole.cpp | 19 +++++---- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 5d5ff6c..0c71d0c 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -45,27 +45,26 @@ void CLapPainter::OGL_Paint() const CExtendedLap* pLap = NULL; switch(eDisplayStyle) { - case LAPDISPLAYSTYLE_MAP: - glViewport(0,0,RECT_WIDTH(&rcClient), RECT_HEIGHT(&rcClient)); - DrawLapLines(sfLapOpts); // Draws the lap as a map on primary display - break; - case LAPDISPLAYSTYLE_TRACTIONCIRCLE: - glViewport(0,0,RECT_WIDTH(&rcClient), RECT_HEIGHT(&rcClient)); - DrawTractionCircle(sfLapOpts, true); // Draw the traction circle graph if the window is active - break; - case LAPDISPLAYSTYLE_PLOT: - DrawGeneralGraph(sfLapOpts, true); // Draws the data graphs on the primary display - break; - case LAPDISPLAYSTYLE_RECEPTION: - DrawReceptionMap(sfLapOpts); // Draws the reception map on the primary display - break; - case LAPDISPLAYSTYLE_NOLAPS: - // user doesn't have any laps selected, so we should tell them to select some - DrawSelectLapsPrompt(); - break; + case LAPDISPLAYSTYLE_MAP: + glViewport(0,0,RECT_WIDTH(&rcClient), RECT_HEIGHT(&rcClient)); + DrawLapLines(sfLapOpts); // Draws the lap as a map on primary display + break; + case LAPDISPLAYSTYLE_TRACTIONCIRCLE: + glViewport(0,0,RECT_WIDTH(&rcClient), RECT_HEIGHT(&rcClient)); + DrawTractionCircle(sfLapOpts, true); // Draw the traction circle graph if the window is active + break; + case LAPDISPLAYSTYLE_PLOT: + DrawGeneralGraph(sfLapOpts, true); // Draws the data graphs on the primary display + break; + case LAPDISPLAYSTYLE_RECEPTION: + DrawReceptionMap(sfLapOpts); // Draws the reception map on the primary display + break; + case LAPDISPLAYSTYLE_NOLAPS: + // user doesn't have any laps selected, so we should tell them to select some + DrawSelectLapsPrompt(); + break; } - - SwapBuffers( OGL_GetDC() ); + SwapBuffers( OGL_GetDC() ); } void CLapPainter::DrawReceptionMap(const LAPSUPPLIEROPTIONS& sfLapOpts) const diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 8d39a6a..1abb0b5 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -2380,7 +2380,6 @@ void UpdateSectors() // We've reached the end of the loop. Dump the last point as the last sector time, if other conditions failed const int iLastTime = lstLapPoints[lstLapPoints.size()-1].iTime; float dSectorTime = iLastTime - (double)iLapStartTime; - // Now that we have computed the Sector Time, let's build the Sector times string // Now that we have computed the Sector Time, let's put it in the Sector times string if ( dSectorTime > 1 ) // 1 used for roundoff error { @@ -2396,15 +2395,15 @@ void UpdateSectors() } } // End Interpolation Loop - // Insert the item into the Listview - p_ADlvi.mask = LVIF_TEXT; - p_ADlvi.iItem = w; // Which Lap subscript - p_ADlvi.iSubItem = s; // Which Sector subscript incremented to be positioned correctly - p_ADlvi.lParam = s; - swprintf(result,NUMCHARS(result), szSectorTime); - p_ADlvi.pszText = result; - p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(HC_ShowSplits, &p_ADlvi); + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = w; // Which Lap subscript + p_ADlvi.iSubItem = s; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.lParam = s; + swprintf(result,NUMCHARS(result), szSectorTime); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(HC_ShowSplits, &p_ADlvi); } // End Sector Loop w++; // Increment "w" counter and do the next lap From 21384244bb703bb6665a4f5f29a9eca96ccfb602 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sat, 14 Feb 2015 11:12:38 -0700 Subject: [PATCH 037/112] Added CTRL-Click options to program --- .../PitsideConsole/PitsideConsole.cpp | 134 +++++++++++++++--- 1 file changed, 118 insertions(+), 16 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 1abb0b5..3750d55 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -500,6 +500,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { return 0; } +// TranslateMessage(&msg); // Keyboard input handlers. Needs a MSG type variable, which Pitside doesn't support right now +// DispatchMessage(&msg); // Update and show Current Lap Time TCHAR szTemp[512], szLap[512]; @@ -556,11 +558,46 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return 0; } case WM_CLOSE: - EndDialog(hWnd,0); + DestroyWindow(hWnd); + EndDialog(hWnd,0); return 0; - case WM_MOUSEWHEEL: - { - short iDist = HIWORD(wParam); +/* case WM_KEYDOWN: // Process to capture keystrokes. Currently doesn't work, probably needs + { + switch(wParam) + { + case MK_RIGHT | MK_CONTROL: // Ctrl + Right cursor + case MK_RIGHT: // Ctrl + Right cursor + if(GetAsyncKeyState(VK_CONTROL)) + { + short iDist = HIWORD(wParam); + m_sfLapOpts.iZoomLevels += 1; + UpdateUI(UPDATE_MAP); + return 0; + } + case MK_LEFT | MK_CONTROL: // Ctrl + Right cursor + case MK_LEFT: // Ctrl + Right cursor + if(GetAsyncKeyState(VK_CONTROL)) + { + short iDist = HIWORD(wParam); + m_sfLapOpts.iZoomLevels -= 1; + UpdateUI(UPDATE_MAP); + return 0; + } + case MK_SPACE: + { + m_sfLapOpts.flWindowShiftX = 0; + m_sfLapOpts.flWindowShiftY = 0; + m_sfLapOpts.iZoomLevels = 0; // Reset the zoom level + UpdateUI(UPDATE_MAP); + return 0; + } + // more keys here + } + return 0; + } */ + case WM_MOUSEWHEEL: + { + short iDist = HIWORD(wParam); m_sfLapOpts.iZoomLevels += (iDist/WHEEL_DELTA); UpdateUI(UPDATE_MAP); return 0; @@ -577,22 +614,86 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) lastX = x; lastY = y; - if(IS_FLAG_SET(wParam, MK_LBUTTON)) - { - // they're dragging! - m_sfLapOpts.flWindowShiftX += moveX; - m_sfLapOpts.flWindowShiftY -= moveY; - } - if(IS_FLAG_SET(wParam, MK_MBUTTON)) - { - // Dynamic update of All Data display - UpdateUI(UPDATE_ALLDATA); - } + switch(wParam) + { + case MK_CONTROL: // Ctrl + Mouse movement + { + short iDist = HIWORD(wParam); + m_sfLapOpts.iZoomLevels += - moveY; + UpdateUI(UPDATE_MAP); + break; + } + case MK_LBUTTON: + { + // they're dragging! + m_sfLapOpts.flWindowShiftX += moveX; + m_sfLapOpts.flWindowShiftY -= moveY; + break; + } + case MK_MBUTTON: + { + // Dynamic update of All Data display + UpdateUI(UPDATE_ALLDATA); + break; + } + } UpdateUI(UPDATE_MAP); return 0; } case WM_LBUTTONDOWN: - { + { + switch(wParam) + { + case MK_CONTROL | MK_LBUTTON: // CTRL + Left Mouse button click + { + DLGPROC ShowAllData = NULL; + if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing + { + // Create the window for displaying all of the data points for the selected laps + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); + hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, ShowAllData); + AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // Hot Laps listview + SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); + + // Set up the AllData list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Data Channel"); + lstCols.push_back(L"Lap 1"); + lstCols.push_back(L"Lap 2"); + lstCols.push_back(L"Lap 3"); + lstCols.push_back(L"Lap 4"); + lstCols.push_back(L"Lap 5"); + lstCols.push_back(L"Lap 6"); + lstCols.push_back(L"Lap 7"); + lstCols.push_back(L"Lap 8"); + lstCols.push_back(L"Lap 9"); + lstCols.push_back(L"Lap 10"); + lstWidths.push_back(130); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + + m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize and show the listview + ShowWindow(hWnd_AllData, SW_SHOW); + } + + UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); + return TRUE; + } + break; + // more keys here + } const int x = LOWORD(lParam); const int y = HIWORD(lParam); // figure out if we should put focus on the main map @@ -655,6 +756,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return TRUE; } case WM_MBUTTONDBLCLK: + case WM_LBUTTONDBLCLK: { // If the window showing all of the lap data is present, let's kill it if (hWnd_AllData) From d1d94b62319577f46b4b6008c0131caee0b8e4f5 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sat, 14 Feb 2015 17:18:25 -0700 Subject: [PATCH 038/112] 2.003.0034: Changed AllData from CTRL-Click to Double Click - Partial coding for the reference lap/split points bug fix --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 3 +- .../PitsideConsole/PitsideConsole.cpp | 122 +++++++++--------- 2 files changed, 63 insertions(+), 62 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index 87fb7e6..b4fc9fe 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -89,7 +89,7 @@ enum LAPSORTSTYLE struct LAPSUPPLIEROPTIONS { public: - LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false) + LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false),bShowReferenceLap(true) { } UNIT_PREFERENCE eUnitPreference; @@ -110,6 +110,7 @@ struct LAPSUPPLIEROPTIONS LAPSORTSTYLE eSortPreference; bool bTractionCircle; // Whether or not to display the Traction Circle display bool bSmoothYesNo; // Whether or not to smooth the accelerometer graphs + bool bShowReferenceLap; // Whether or not the Reference Lap is displayed }; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 3750d55..0d09ab4 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -642,58 +642,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } case WM_LBUTTONDOWN: { - switch(wParam) - { - case MK_CONTROL | MK_LBUTTON: // CTRL + Left Mouse button click - { - DLGPROC ShowAllData = NULL; - if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing - { - // Create the window for displaying all of the data points for the selected laps - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&InitCtrlEx); - hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, ShowAllData); - AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // Hot Laps listview - SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); - - // Set up the AllData list box columns - vector lstCols; - vector lstWidths; - lstCols.push_back(L"Data Channel"); - lstCols.push_back(L"Lap 1"); - lstCols.push_back(L"Lap 2"); - lstCols.push_back(L"Lap 3"); - lstCols.push_back(L"Lap 4"); - lstCols.push_back(L"Lap 5"); - lstCols.push_back(L"Lap 6"); - lstCols.push_back(L"Lap 7"); - lstCols.push_back(L"Lap 8"); - lstCols.push_back(L"Lap 9"); - lstCols.push_back(L"Lap 10"); - lstWidths.push_back(130); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - - m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize and show the listview - ShowWindow(hWnd_AllData, SW_SHOW); - } - - UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); - return TRUE; - } - break; - // more keys here - } const int x = LOWORD(lParam); const int y = HIWORD(lParam); // figure out if we should put focus on the main map @@ -758,15 +706,62 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case WM_MBUTTONDBLCLK: case WM_LBUTTONDBLCLK: { - // If the window showing all of the lap data is present, let's kill it - if (hWnd_AllData) + if ( GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY) ) // If the window showing all of the lap data is present, let's kill it { - if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) - { - DestroyWindow(hWnd_AllData); - hWnd_AllData = NULL; - AD_hWnd = NULL; - } + if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) + { + DestroyWindow(hWnd_AllData); + hWnd_AllData = NULL; + AD_hWnd = NULL; + } + return TRUE; + } + else // If the window showing all of the lap data isn't there, let's create it + { + DLGPROC ShowAllData = NULL; + if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing + { + // Create the window for displaying all of the data points for the selected laps + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); + hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, ShowAllData); + AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // Hot Laps listview + SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); + + // Set up the AllData list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Data Channel"); + lstCols.push_back(L"Lap 1"); + lstCols.push_back(L"Lap 2"); + lstCols.push_back(L"Lap 3"); + lstCols.push_back(L"Lap 4"); + lstCols.push_back(L"Lap 5"); + lstCols.push_back(L"Lap 6"); + lstCols.push_back(L"Lap 7"); + lstCols.push_back(L"Lap 8"); + lstCols.push_back(L"Lap 9"); + lstCols.push_back(L"Lap 10"); + lstWidths.push_back(130); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + + m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize and show the listview + ShowWindow(hWnd_AllData, SW_SHOW); + } + + UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); + return TRUE; } } case WM_NOTIFY: @@ -913,6 +908,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case ID_OPTIONS_SHOWREFERENCELAP: { m_fShowReferenceLap = !m_fShowReferenceLap; + m_sfLapOpts.bShowReferenceLap = m_fShowReferenceLap; UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); return TRUE; } @@ -2926,7 +2922,11 @@ void UpdateDisplays() { lstLaps.push_back(m_pReferenceLap); } - +/* else + { + lstLaps.push_back(m_pReferenceLap); // Push the reference lap anyway, so that we can get the lap Split Points + } +*/ return lstLaps; } From 599ef643568d7427ee255460035e7c769d196314 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Tue, 17 Feb 2015 06:21:46 -0700 Subject: [PATCH 039/112] Android Studio commit --- .idea/.name | 1 + .idea/compiler.xml | 23 + .idea/copyright/profiles_settings.xml | 3 + .idea/encodings.xml | 5 + .idea/misc.xml | 111 ++++ .idea/modules.xml | 14 + .idea/scopes/scope_settings.xml | 5 + .idea/vcs.xml | 7 + .idea/wifilapper-1-master.iml | 10 + .idea/workspace.xml | 569 ++++++++++++++++++ IOIODiagnostics/IOIODiagnostics.iml | 19 + IOIOLib/IOIOLib.iml | 20 + TestApp/TestApp.iml | 21 + WifiLapperFull/.idea/.name | 1 + WifiLapperFull/.idea/WifiLapperFull.iml | 10 + WifiLapperFull/.idea/compiler.xml | 23 + .../.idea/copyright/profiles_settings.xml | 3 + WifiLapperFull/.idea/encodings.xml | 5 + WifiLapperFull/.idea/misc.xml | 5 + WifiLapperFull/.idea/modules.xml | 9 + .../.idea/scopes/scope_settings.xml | 5 + WifiLapperFull/.idea/vcs.xml | 7 + WifiLapperFull/.idea/workspace.xml | 328 ++++++++++ WifiLapperFull/WifiLapperFull.iml | 19 + WifiLapperLite/WifiLapperLite.iml | 19 + WifiLapperTablet/WifiLapperTablet.iml | 19 + .../IOIOLib/ioio/lib/BuildConfig.class | Bin 0 -> 325 bytes .../IOIOLib/ioio/lib/api/AnalogInput.class | Bin 0 -> 336 bytes .../IOIOLib/ioio/lib/api/Closeable.class | Bin 0 -> 134 bytes .../ioio/lib/api/DigitalInput$Spec$Mode.class | Bin 0 -> 1211 bytes .../ioio/lib/api/DigitalInput$Spec.class | Bin 0 -> 718 bytes .../IOIOLib/ioio/lib/api/DigitalInput.class | Bin 0 -> 398 bytes .../lib/api/DigitalOutput$Spec$Mode.class | Bin 0 -> 1165 bytes .../ioio/lib/api/DigitalOutput$Spec.class | Bin 0 -> 723 bytes .../IOIOLib/ioio/lib/api/DigitalOutput.class | Bin 0 -> 323 bytes .../ioio/lib/api/IOIO$VersionType.class | Bin 0 -> 1191 bytes .../IOIOLib/ioio/lib/api/IOIO.class | Bin 0 -> 3228 bytes .../IOIOLib/ioio/lib/api/IOIOConnection.class | Bin 0 -> 373 bytes .../IOIOLib/ioio/lib/api/IOIOFactory.class | Bin 0 -> 2745 bytes .../IOIOLib/ioio/lib/api/IcspMaster.class | Bin 0 -> 444 bytes .../ioio/lib/api/PulseInput$ClockRate.class | Bin 0 -> 1335 bytes .../ioio/lib/api/PulseInput$PulseMode.class | Bin 0 -> 1367 bytes .../IOIOLib/ioio/lib/api/PulseInput.class | Bin 0 -> 504 bytes .../IOIOLib/ioio/lib/api/PwmOutput.class | Bin 0 -> 306 bytes .../ioio/lib/api/SpiMaster$Config.class | Bin 0 -> 757 bytes .../IOIOLib/ioio/lib/api/SpiMaster$Rate.class | Bin 0 -> 2270 bytes .../ioio/lib/api/SpiMaster$Result.class | Bin 0 -> 326 bytes .../IOIOLib/ioio/lib/api/SpiMaster.class | Bin 0 -> 576 bytes .../IOIOLib/ioio/lib/api/TwiMaster$Rate.class | Bin 0 -> 1105 bytes .../ioio/lib/api/TwiMaster$Result.class | Bin 0 -> 326 bytes .../IOIOLib/ioio/lib/api/TwiMaster.class | Bin 0 -> 491 bytes .../IOIOLib/ioio/lib/api/Uart$Parity.class | Bin 0 -> 1067 bytes .../IOIOLib/ioio/lib/api/Uart$StopBits.class | Bin 0 -> 1029 bytes .../IOIOLib/ioio/lib/api/Uart.class | Bin 0 -> 357 bytes .../exception/ConnectionLostException.class | Bin 0 -> 626 bytes .../exception/IncompatibilityException.class | Bin 0 -> 470 bytes .../exception/OutOfResourceException.class | Bin 0 -> 471 bytes .../IOIOLib/ioio/lib/impl/AbstractPin.class | Bin 0 -> 717 bytes .../lib/impl/AbstractResource$State.class | Bin 0 -> 1174 bytes .../ioio/lib/impl/AbstractResource.class | Bin 0 -> 1509 bytes .../ioio/lib/impl/AnalogInputImpl.class | Bin 0 -> 2253 bytes .../IOIOLib/ioio/lib/impl/Constants.class | Bin 0 -> 930 bytes .../ioio/lib/impl/DigitalInputImpl.class | Bin 0 -> 2245 bytes .../ioio/lib/impl/DigitalOutputImpl.class | Bin 0 -> 1030 bytes ...owControlledOutputStream$FlushThread.class | Bin 0 -> 2013 bytes .../FlowControlledOutputStream$Sender.class | Bin 0 -> 264 bytes .../lib/impl/FlowControlledOutputStream.class | Bin 0 -> 3267 bytes ...owControlledPacketSender$FlushThread.class | Bin 0 -> 1820 bytes .../FlowControlledPacketSender$Packet.class | Bin 0 -> 264 bytes .../FlowControlledPacketSender$Sender.class | Bin 0 -> 380 bytes .../lib/impl/FlowControlledPacketSender.class | Bin 0 -> 3114 bytes .../IOIOLib/ioio/lib/impl/IOIOImpl$1.class | Bin 0 -> 933 bytes .../ioio/lib/impl/IOIOImpl$State.class | Bin 0 -> 1152 bytes .../IOIOLib/ioio/lib/impl/IOIOImpl.class | Bin 0 -> 19757 bytes .../impl/IOIOProtocol$IncomingHandler.class | Bin 0 -> 1199 bytes .../impl/IOIOProtocol$IncomingThread.class | Bin 0 -> 7155 bytes .../ioio/lib/impl/IOIOProtocol$PwmScale.class | Bin 0 -> 1487 bytes .../IOIOLib/ioio/lib/impl/IOIOProtocol.class | Bin 0 -> 12811 bytes .../ioio/lib/impl/IcspMasterImpl.class | Bin 0 -> 3423 bytes .../IOIOLib/ioio/lib/impl/IncapImpl.class | Bin 0 -> 3586 bytes .../impl/IncomingState$ConnectionState.class | Bin 0 -> 1327 bytes .../IncomingState$DataModuleListener.class | Bin 0 -> 297 bytes .../impl/IncomingState$DataModuleState.class | Bin 0 -> 2066 bytes .../IncomingState$DisconnectListener.class | Bin 0 -> 254 bytes .../impl/IncomingState$InputPinListener.class | Bin 0 -> 247 bytes .../impl/IncomingState$InputPinState.class | Bin 0 -> 1836 bytes .../IOIOLib/ioio/lib/impl/IncomingState.class | Bin 0 -> 10144 bytes .../ioio/lib/impl/ModuleAllocator.class | Bin 0 -> 3051 bytes .../ioio/lib/impl/PinFunctionMap.class | Bin 0 -> 1953 bytes .../IOIOLib/ioio/lib/impl/PwmImpl.class | Bin 0 -> 2198 bytes .../ioio/lib/impl/QueueInputStream.class | Bin 0 -> 1800 bytes .../ioio/lib/impl/SocketIOIOConnection.class | Bin 0 -> 2949 bytes .../impl/SpiMasterImpl$OutgoingPacket.class | Bin 0 -> 828 bytes .../lib/impl/SpiMasterImpl$SpiResult.class | Bin 0 -> 1146 bytes .../IOIOLib/ioio/lib/impl/SpiMasterImpl.class | Bin 0 -> 5806 bytes .../impl/TwiMasterImpl$OutgoingPacket.class | Bin 0 -> 832 bytes .../lib/impl/TwiMasterImpl$TwiResult.class | Bin 0 -> 1194 bytes .../IOIOLib/ioio/lib/impl/TwiMasterImpl.class | Bin 0 -> 4685 bytes .../IOIOLib/ioio/lib/impl/UartImpl.class | Bin 0 -> 2692 bytes .../AbstractIOIOActivity$IOIOThread.class | Bin 0 -> 3884 bytes .../ioio/lib/util/AbstractIOIOActivity.class | Bin 0 -> 4817 bytes ...nnectionDiscovery$IOIOConnectionSpec.class | Bin 0 -> 646 bytes .../lib/util/IOIOConnectionDiscovery.class | Bin 0 -> 410 bytes .../util/SocketIOIOConnectionDiscovery.class | Bin 0 -> 1208 bytes 104 files changed, 1261 insertions(+) create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/scopes/scope_settings.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/wifilapper-1-master.iml create mode 100644 .idea/workspace.xml create mode 100644 IOIODiagnostics/IOIODiagnostics.iml create mode 100644 IOIOLib/IOIOLib.iml create mode 100644 TestApp/TestApp.iml create mode 100644 WifiLapperFull/.idea/.name create mode 100644 WifiLapperFull/.idea/WifiLapperFull.iml create mode 100644 WifiLapperFull/.idea/compiler.xml create mode 100644 WifiLapperFull/.idea/copyright/profiles_settings.xml create mode 100644 WifiLapperFull/.idea/encodings.xml create mode 100644 WifiLapperFull/.idea/misc.xml create mode 100644 WifiLapperFull/.idea/modules.xml create mode 100644 WifiLapperFull/.idea/scopes/scope_settings.xml create mode 100644 WifiLapperFull/.idea/vcs.xml create mode 100644 WifiLapperFull/.idea/workspace.xml create mode 100644 WifiLapperFull/WifiLapperFull.iml create mode 100644 WifiLapperLite/WifiLapperLite.iml create mode 100644 WifiLapperTablet/WifiLapperTablet.iml create mode 100644 out/production/IOIOLib/ioio/lib/BuildConfig.class create mode 100644 out/production/IOIOLib/ioio/lib/api/AnalogInput.class create mode 100644 out/production/IOIOLib/ioio/lib/api/Closeable.class create mode 100644 out/production/IOIOLib/ioio/lib/api/DigitalInput$Spec$Mode.class create mode 100644 out/production/IOIOLib/ioio/lib/api/DigitalInput$Spec.class create mode 100644 out/production/IOIOLib/ioio/lib/api/DigitalInput.class create mode 100644 out/production/IOIOLib/ioio/lib/api/DigitalOutput$Spec$Mode.class create mode 100644 out/production/IOIOLib/ioio/lib/api/DigitalOutput$Spec.class create mode 100644 out/production/IOIOLib/ioio/lib/api/DigitalOutput.class create mode 100644 out/production/IOIOLib/ioio/lib/api/IOIO$VersionType.class create mode 100644 out/production/IOIOLib/ioio/lib/api/IOIO.class create mode 100644 out/production/IOIOLib/ioio/lib/api/IOIOConnection.class create mode 100644 out/production/IOIOLib/ioio/lib/api/IOIOFactory.class create mode 100644 out/production/IOIOLib/ioio/lib/api/IcspMaster.class create mode 100644 out/production/IOIOLib/ioio/lib/api/PulseInput$ClockRate.class create mode 100644 out/production/IOIOLib/ioio/lib/api/PulseInput$PulseMode.class create mode 100644 out/production/IOIOLib/ioio/lib/api/PulseInput.class create mode 100644 out/production/IOIOLib/ioio/lib/api/PwmOutput.class create mode 100644 out/production/IOIOLib/ioio/lib/api/SpiMaster$Config.class create mode 100644 out/production/IOIOLib/ioio/lib/api/SpiMaster$Rate.class create mode 100644 out/production/IOIOLib/ioio/lib/api/SpiMaster$Result.class create mode 100644 out/production/IOIOLib/ioio/lib/api/SpiMaster.class create mode 100644 out/production/IOIOLib/ioio/lib/api/TwiMaster$Rate.class create mode 100644 out/production/IOIOLib/ioio/lib/api/TwiMaster$Result.class create mode 100644 out/production/IOIOLib/ioio/lib/api/TwiMaster.class create mode 100644 out/production/IOIOLib/ioio/lib/api/Uart$Parity.class create mode 100644 out/production/IOIOLib/ioio/lib/api/Uart$StopBits.class create mode 100644 out/production/IOIOLib/ioio/lib/api/Uart.class create mode 100644 out/production/IOIOLib/ioio/lib/api/exception/ConnectionLostException.class create mode 100644 out/production/IOIOLib/ioio/lib/api/exception/IncompatibilityException.class create mode 100644 out/production/IOIOLib/ioio/lib/api/exception/OutOfResourceException.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/AbstractPin.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/AbstractResource$State.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/AbstractResource.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/AnalogInputImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/Constants.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/DigitalInputImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/DigitalOutputImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream$FlushThread.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream$Sender.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledPacketSender$FlushThread.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledPacketSender$Packet.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledPacketSender$Sender.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/FlowControlledPacketSender.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOImpl$1.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOImpl$State.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$IncomingHandler.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$IncomingThread.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$PwmScale.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IOIOProtocol.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IcspMasterImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncapImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState$ConnectionState.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState$DataModuleListener.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState$DataModuleState.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState$DisconnectListener.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState$InputPinListener.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState$InputPinState.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/IncomingState.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/ModuleAllocator.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/PinFunctionMap.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/PwmImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/QueueInputStream.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/SocketIOIOConnection.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl$OutgoingPacket.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl$SpiResult.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/TwiMasterImpl$OutgoingPacket.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/TwiMasterImpl$TwiResult.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/TwiMasterImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/impl/UartImpl.class create mode 100644 out/production/IOIOLib/ioio/lib/util/AbstractIOIOActivity$IOIOThread.class create mode 100644 out/production/IOIOLib/ioio/lib/util/AbstractIOIOActivity.class create mode 100644 out/production/IOIOLib/ioio/lib/util/IOIOConnectionDiscovery$IOIOConnectionSpec.class create mode 100644 out/production/IOIOLib/ioio/lib/util/IOIOConnectionDiscovery.class create mode 100644 out/production/IOIOLib/ioio/lib/util/SocketIOIOConnectionDiscovery.class diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..0408664 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +Wifilapper \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..28bb10a --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..c7d1c5a --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..7c62b52 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b9d0766 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..b85d099 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..0d5175c --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..7e76f0f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.idea/wifilapper-1-master.iml b/.idea/wifilapper-1-master.iml new file mode 100644 index 0000000..ccf83c5 --- /dev/null +++ b/.idea/wifilapper-1-master.iml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..2aa36f1 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + + + + + + + 1423903618498 + 1423903618498 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Android + + + + + + + + + + + + + + + 1.8 + + + + + + + + TestApp + + + + + + + + 1.8 + + + + + + + + + + + + + + + + diff --git a/IOIODiagnostics/IOIODiagnostics.iml b/IOIODiagnostics/IOIODiagnostics.iml new file mode 100644 index 0000000..231821b --- /dev/null +++ b/IOIODiagnostics/IOIODiagnostics.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/IOIOLib/IOIOLib.iml b/IOIOLib/IOIOLib.iml new file mode 100644 index 0000000..7ed8cb6 --- /dev/null +++ b/IOIOLib/IOIOLib.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/TestApp/TestApp.iml b/TestApp/TestApp.iml new file mode 100644 index 0000000..9c8070b --- /dev/null +++ b/TestApp/TestApp.iml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/WifiLapperFull/.idea/.name b/WifiLapperFull/.idea/.name new file mode 100644 index 0000000..504422c --- /dev/null +++ b/WifiLapperFull/.idea/.name @@ -0,0 +1 @@ +WifiLapperFull \ No newline at end of file diff --git a/WifiLapperFull/.idea/WifiLapperFull.iml b/WifiLapperFull/.idea/WifiLapperFull.iml new file mode 100644 index 0000000..ccf83c5 --- /dev/null +++ b/WifiLapperFull/.idea/WifiLapperFull.iml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/WifiLapperFull/.idea/compiler.xml b/WifiLapperFull/.idea/compiler.xml new file mode 100644 index 0000000..28bb10a --- /dev/null +++ b/WifiLapperFull/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/WifiLapperFull/.idea/copyright/profiles_settings.xml b/WifiLapperFull/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..c7d1c5a --- /dev/null +++ b/WifiLapperFull/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/WifiLapperFull/.idea/encodings.xml b/WifiLapperFull/.idea/encodings.xml new file mode 100644 index 0000000..7c62b52 --- /dev/null +++ b/WifiLapperFull/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/WifiLapperFull/.idea/misc.xml b/WifiLapperFull/.idea/misc.xml new file mode 100644 index 0000000..3c43605 --- /dev/null +++ b/WifiLapperFull/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/WifiLapperFull/.idea/modules.xml b/WifiLapperFull/.idea/modules.xml new file mode 100644 index 0000000..d72fddb --- /dev/null +++ b/WifiLapperFull/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/WifiLapperFull/.idea/scopes/scope_settings.xml b/WifiLapperFull/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..0d5175c --- /dev/null +++ b/WifiLapperFull/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/WifiLapperFull/.idea/vcs.xml b/WifiLapperFull/.idea/vcs.xml new file mode 100644 index 0000000..d2d96f2 --- /dev/null +++ b/WifiLapperFull/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/WifiLapperFull/.idea/workspace.xml b/WifiLapperFull/.idea/workspace.xml new file mode 100644 index 0000000..692f762 --- /dev/null +++ b/WifiLapperFull/.idea/workspace.xml @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + localhost + 5050 + + + + + + + 1423903845224 + 1423903845224 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No facets are configured + + + + + + + + + + + + + + + 1.8 + + + + + + + + WifiLapperFull + + + + + + + + + + + + + + + + diff --git a/WifiLapperFull/WifiLapperFull.iml b/WifiLapperFull/WifiLapperFull.iml new file mode 100644 index 0000000..cfbf8b7 --- /dev/null +++ b/WifiLapperFull/WifiLapperFull.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/WifiLapperLite/WifiLapperLite.iml b/WifiLapperLite/WifiLapperLite.iml new file mode 100644 index 0000000..cfbf8b7 --- /dev/null +++ b/WifiLapperLite/WifiLapperLite.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/WifiLapperTablet/WifiLapperTablet.iml b/WifiLapperTablet/WifiLapperTablet.iml new file mode 100644 index 0000000..cfbf8b7 --- /dev/null +++ b/WifiLapperTablet/WifiLapperTablet.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/out/production/IOIOLib/ioio/lib/BuildConfig.class b/out/production/IOIOLib/ioio/lib/BuildConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..e307f5b6dd590fad9a12d537980ac60a341026a7 GIT binary patch literal 325 zcmZusyH3ME5S;ZBi~}J=Nc;g%U?I_gDDr^Df&y?scXp1j(Qzj^HvdJ1M8OB}QHZrg zK|wRSGduhG`u_L?aE5ULAG4T#W++2qi|sJj9Yw lH%l-PCF?m59>0U$ddrqzBr>Ei6-@g)!~omEqcwU>Onkt)=P8o1*BLg2!e&)v)ge=3CWVpiqGc32k@c9zXz-J z5W;-(%`h{cU+*6P?r@=TqH(HmrZ8$GucFVk5ryLBc24y0R!f^*44uYA<6L1(>sekT zNvP=!lh`%IW$aTebLYt>_rdzuEJEAo>BhcVg)0|bG~QLlw$A*?)7~1!+t8S&Y9n=4 zxZJa6K6YZOZRhJ>cM-Cr)VEpIyCD^(dzJDty_v-j*qVzx#xCy)N(F@hU%_h>L#~4Z YMkS+?T;q`Jhz$Hk|8q2tX$~;{27?Jx_5c6? literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/Closeable.class b/out/production/IOIOLib/ioio/lib/api/Closeable.class new file mode 100644 index 0000000000000000000000000000000000000000..ac7d2132c101c0d442104e41cdd2da7c5c8cb66b GIT binary patch literal 134 zcmX^0Z`VEs1_l!bPId-%b_Nbc2G-=9{Nhwb24)S-Fh&Nh;QZ2}|)F3ZRu0Fu|wNz6;v_fN`7O)g<$WME`q0@}pD Tz{mnLoPh&+l3@{$6UV^H@FEbHyT9z#s-wu?svI!zvKSO+^c!_1p5 z3q{WyuPF$mQt57Ulr71%-{QVoXjV&ZW8W!x#9o!fitia#Qr3xc=43s`uVn3@!Tm}u z-6bW{s+Aq@&}nc{wOv~Aoho%OZ6%X;lDfeMPBX@AUh$ov*`P|{ zln7|6Wv`vQ+);YRZ&p{kqPs?yq1&})qwMZ-p}}D1oy`dm4BQn@X2ifUUNB5`al;12 zv0`8nQwI7GH!viYVZ<5wu5}eGRlH=F_GVj)h)Ab5 z`kip$7QM-1rG*~*IMPC|eGVoFT+M6Bl6mxEkMudBW}C$Hs(A`&!iA85N!Fy@0G2RF L+92GiuqE z^v1P69(J9&kd(_mtsnLIBR7%6o(U6i6H7>#D9Vt;vW5~vZvMR)l9I!6x!1E=oxalz z82094!ndL~E=zNGzb=D!TRHvxArHKfA6O{>A zCHn%Ua`=MCQ#iOnF$I-kkK#Ra2qNiYl{)z;3~NYJMFgP?3o|Jsg_BsH$y8}tp)ss-+hH(ptj zD_t6O3LuS(kp#vKJhMKM&TH>U<8bVA{~KrWZ?<%aLa53_+d~e4dBcJJ z0;|Lg|1_>`_SQZe&7bofm5bN$O73|Lc(BKm1OY;Q?TM&N=u;K-=!>Z zMx)u!{!zyJ3ULrM(kAcqy?gFG=brca@lXs~5zHzS z+!BaP1Pfx$%6P;OuGNnZOH~<<86>@HwiwikZJWJ4%joybKJ6YlZ%u~vDtEY(wRkgY zba{54x4COrbN{vBIG)mQ1Wu0N;^|S@TXNKho=2S8@ zb&|B_tDLKH+pKw=rrCRGG%eCC`_=027+xf+r^cC)wG6wR)!iPq+xgVAqO_{hGOUKt zN;`M5BHA`+rl#&s~i*Snw0*G&?O{+4@}@!X-6HRa0|EnIQdB^!MKeey?~tFT)jZ}qaPlpyGoaFS4bz3 zg5o|RNYFSGUZY0DllcniM3aLTh@2zpFBHjN%!IyCC^(?&cOnfiqo0EbwqbKIU&H~K hbVThHX*FbdfOWzIuz`7+HTsH?S5dJoejfv6Ls`aO8Tdh)qn2R?>EQ(O57E}apZepmbF)3~8dnri4gAd?C ziL=|Hc#wLT%*@XBvpf0te0vA5i%km#mQ18kkYU+`g%yjkRRbjhWd{AC9rz4(J&J

6SfFacu5d*7J<54v>8zL658w$_mZQ&k^mPmNm>?Q49Qjug83EX2y z?~6zz2MkWN{y)st6{#F4l}tlK!CCLo3p$tF3&}{X5&Jy6;vFIDVN*};M3wOjOP@8*PiqZ^rN2=q(*_M%um;*3CMjdm?65;-sm@V#O%o~lW}H5l zQ+S2uY`-G)tOjQ&=Acu&p~zvvBN898)F};Mm_wc_B2Y3+Wl~5AXE8sNsnN7XXQoql uf!@d1kAS5P9x#qj5$6Yk-^AvSSi=GlXjmj0(w0UyED}oouxU&jE`9-(;E}Na literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/DigitalOutput.class b/out/production/IOIOLib/ioio/lib/api/DigitalOutput.class new file mode 100644 index 0000000000000000000000000000000000000000..593bc147512fe937300ca5d44cfe577354ba1c79 GIT binary patch literal 323 zcmY+Au}T9$5QhJWm#jIX#uOH5(xiw@w($*41wlv=u&~=(hOl9|J#P2ZXS47Dd?;}a zQP^Uc{pbG}{+X}uk52%%SSXw;Tqs;B%n8N5WlNYnHVt=`H!*S~jNdw!SlrFa%`>6A zf4AHw7n-PWC3+wF&hmrv!YuCG!6oB&eQNu(J(^cTSi0bX_O8~Zbvh#m^MTRcGzYz_ zk8Bg+I^!!JBAa@czRHYj(E2y}HY4~isjh;oWQWjCA*TNgCIrGr-ie%p3WCC^sHvzz UYAN2C{70B!BDIv>&>v&^10J zMkj~%$VDLFj*Pol6Oj;cPev3OF4iSX z$mCq-hz$u-TyIKDn(O-_9xy0R^X0vl`Euc~S|~G&R1LRnI(Fs#u|dwFZ5!^c zrMKHgn_<3WI;NAh%z9csHq%A5s4n^NS%$GEs#+u? z8HCPTllqEiX4BR?U6(QiliVTY8rC2<<4awzyRF<1qT6&JvgUN%hOuw*z9W3{YrJ6v zSNV-eD0qlRA|5kb|L@T%m_t^;aseg-O12Zj?(uK+DUL~0BK_9X(H%p;s``%c+-Rw z5Wx(tfnk=cMbdo9J+RLRoFn*=EE)*Ou;()fKZp4NeiH$2SB?oQUl2Nn!0~|#_yyWg z`Y7C>3fxb#Bgrdf5TpkXS5{}w5dP%3{pA*Drynlj7N?He9%dO5l2{%P`9O{ERrv;? z788SKkWLZt3|a7u5zkOUo-yhfV`0x27r#?butyiJCiF0()j~atYPE0=cVQHJDNm?qvVTpm3rMRU@odg6N}D$Mb^PE ze`eZz*9(a1S{=?XRbD@0nBDoQWBHuU3N_R<>=D$p!_I)U7^`h3mtx&;j|bwhsO~yqCg%EcQm3@H5@YRj&Lz!Ch~E-Er#o5V-jU; zROVub7#2jRTdwJNJy|z~m4Z%2Ox2hZ8qKrQ$OOaP$yrg$muQo@Yh`1ccwU~?cS0*} zE4l)un&WkTI54@T;S1U}g*dAJ&%>ROx>1Gl?IBeoX=1cGl9C)$RTH1up^)yY6;7pk zYC`FhltUKIi>M!(0bQf77-pJgVDqOM9+9NQJ^z8t=~?;ZAI2Krs!X3%mCGVd)T6_c zBuL5NX!Z68AvwKImHb}~%1&$f_MRDXE70&YrGj3=6T8Ro+kX!}U*;j%IiASK6B1YT z$V)X(iJTsSZ|KPq9W3q-rR`WrTtd|aX|y4Rs!;#e+A_t5XGw}5Gu%$BA)pbHj-5vPiJXWl z1zL7eF>K`I)?jc};*m--wC;sG8K?}E5ekOe@lJh{+ilySo0!p9O}#Q)>e8U^bE}&W zG<-+%D`z!3+~kwQaC1CCjsp#pm$hNU%!OvqCop1LZH5~;X8Qc-$wN4XlRRS@Xuw~| znaaE(3|EVy!84+vOVcJNPuqTQ&zDEYqt~C>CQnG3QT8gsQcgXadeybu{b#tGQ%tj? z_NEAy;ZlyBM4<{2?`G&T5a;MK?;Mse1C4g)<*r2g+06a|mZs@@5_95%kQg(hv4D$& zEfNM=pG#!Z#Ce{O7jnn~Aukq?OSl|c6k39F1{^ zQzW0>T%syBa1|x2(7#pM-@t*~-=u$H|0W({gVqYIZ_#=iU*cU_-=p-sBXxau4hgRYT;KE+G^;m%v2`L98?n}Bti^6V{Y)Zeahkigms=^>1 z3nzO#V|(ns|DRs~6ZAsFAv%P3C$*c|^1~XVGDm0*M@vF9{mxY3v^7*Tqu+~wL9fzaR=0YSjeK*0Fn afH=0e5^@HPZ9LvF5uW@C=g-{Nz{?&+l3m3B literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/IOIOFactory.class b/out/production/IOIOLib/ioio/lib/api/IOIOFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..7f691f2c043e9da4038f131274a7a8ecef839c79 GIT binary patch literal 2745 zcmbVOO>@&$6g@AtBgb(P957%$ilC)931Ge{38kfhfJ+hsPSYAFR8bULi7dIYoRGH5 zZu%EkcEgr#l1v$(Z2MFC6FQyJ^JGVIh)ZYc8SCj?o%?a_efLVg|NZMr0O#;S0#QsW zC?t@=Z3TA}+)bc}nFM0^Lcy$pFXQ+sfgY5k=$^dXSMVT#eta#J9x8YwjeH|FS^{&> z70fFz;#f#vH_8esahUS9B+!#D|GxHE4E3{0A~G2N)n8SacWXHhaZ>FAm@tGTA!w}erzV%7!rO`4ABh)>In{XQT{PoAW zQS(g4Ca|yQY5LNXR`b0xUjn1qHpQanns#~Yew(N;w`l0zSZBvOb;q{(nAV#i66o*0Sg{T-}&3WrOT!JN75#5lTYEVY&=@!>rbXIMs2aA{1{%NZI?Lv~F|X=!TB!4mQCDrpQ!CoCp=xTaF=v^& zDo>`mVtN(Ts~DHJY@(7uX+=*-UX*7=cs&=14L(WK`WjY<624aukPDJ9HpP9egK%W5+gD^1)m>C3P4|c5~5`BSaDUwRP-avP81In{o z&(TvFOsu2#m2V==w|X2ANC*8~feA`(U=Q+vqdiDq2*Z3f!au{{H^p)MB!>i}mrkd+ zO5NV!kqsoLj&Gpv8Mj@&*#uYM9u@EVCe&c=wGvi*HV?>Tfam2So|hQ4M{tSQDD@PKQ6t8GlGXW`GBOL2`mmMM7%g4FC(OV_ zrtec+<@F{bXx@EB9a)a1-SNQgHQH@zUZhjFpzEq6AEr9w4s1sfA|x7-|(|B Y63T^w&;LT7f?GS<3Mnv2D_xlS2jUj1c>n+a literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/IcspMaster.class b/out/production/IOIOLib/ioio/lib/api/IcspMaster.class new file mode 100644 index 0000000000000000000000000000000000000000..7c3ad9b35941eff058d7f4474c30b7363723f0b6 GIT binary patch literal 444 zcmZXQ&rSj{5XPslP(%ep#hYim(2H+CFxf<-(S&=qOg1G;yJ@?+&*s4g@S%)TgG*Kq zP4mtC=9@pCU+*6Pa0@dIXB?&+&KXS51awc%=1%T*+T;wn^P4q;;i^_x25pV!aKT`V zwGJ(AiZ!Y#U}}7Dm5L~XWS++AfkU}jYp*$6G8nx{9inW*=>o|= zRla7Kbzq9RX2DlZ(e}i;5g)EqGa2k1~tCi&g@Eml8{B z3{}$5_tuAISq9e!^EBSZRb{|U1N0d%=+NuZEqe)V3_VhPQVIQ>B7=XCBN+Z+jvJ;= VZX8ai?i5CQY9AvtCf^QBz5!(FXpaB@ literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/PulseInput$ClockRate.class b/out/production/IOIOLib/ioio/lib/api/PulseInput$ClockRate.class new file mode 100644 index 0000000000000000000000000000000000000000..058bf7563d2f560805b259a138e65266160e14c2 GIT binary patch literal 1335 zcma)6T~8B16g|UkzqV@&D-_F@pat6^6p#k5m@mh^)MpM2m4 z_*1k*F&YieKKWyOMZGg^phS)B!_1tSbI(2Z?o7Y^{PY#TELJ>_F{fZ23oZ=1a6>^4 zZt@|{PZDkfB>V_LA#jWDEV|JrVQBv~2e;kmmmqzA!$H!G0SQFrV9A9$49eQldivS) z{DYNO44#x#D!yFPs|JIbv2CNAvh+&Ds4!g4nkBOov&=$F-!)^8YF5R_*t@lA=p-gi z0zz#@h8=^R7oNn1Ibd%9KQmd3)7_9Em| z={Z&8&ziRJu(ne$%IkW;q8*ozT7AK=5YBGvdwR^$?af%OS~l&?c%&^mTDDZwtqr|w za?Pf&Z0kFuul*^?;7pjdSzTo4{Y%bFCbGdGSGPAgH2`5B+=?K#;+A+HLNb!BMnIHreP7M_Q^`Eo>XbDp~FQM{X*< zwTt4q##;nVKIPebq!?(8YtpE_$!U5TJ@oLL$sl(Q&`jpVO#a18B@m;F*9dg>@lFwz z;lT(lfgTGXKJ%Ya2m64IBS>!v(JiOZDb9|GKZ>y?e-<5LSJC9?M>vikbAHDe{uSC$ z8!Uto5$DumV)2YCkjMiuqT>UHa7G8;!}U&ZcupUkf+=t^FT6|z*9uT1SG+3f;j0O% zNW!FuiouO3OgH`Q!$G^i)6bCenp@I5hfogS6;PG6a{~GV^gFap0lNg$oZ5K-yIo%> zSgOOD%gc56a(PD`UAeroj_%w67jB;&#yA;{}=( Lijr|1y~*HjlkOgS literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/PulseInput$PulseMode.class b/out/production/IOIOLib/ioio/lib/api/PulseInput$PulseMode.class new file mode 100644 index 0000000000000000000000000000000000000000..1fc53f82bde2f3732a40bddfb220f95c8ba1eb0b GIT binary patch literal 1367 zcma)5?@v-u7=8|1xEH)4qKTkp8W~_o7XB#7AVOs$wXU(TKDY~!T?ZG(5C50`i^7$y zR`YXziEFL3zEodY?>R8VRSP!Gd*5@O^SsaVo^w9_diw!D6l)Ghh&nNcc^Ts}7M&Qt zO+MV>D@zInofKm{xvgNB$7KaR9`7jd^B7k!!ec_lT?S=yLrZU^vndA0W}{Rq-mg3< zGN@_OELM{xy;dvM7%pavicyJ_jC@4jGa>?*HuoC!z{#E^;#yCwCR$w5%EQzHqTyj% zOC~a@?I=TUM>;#tAlC|d$uM^qSemjxHj#Oh(ij4dyQ*j3*Gmm9Zz>q-Zikce9-l!6t6cnpUtU&D(6xJYz&vleZ znT>L+3*pOja!#$%s1}MV2Jc1R>G96+R;W17@7lPEB<{&bF--jTHmC?-MMVg!Dn>EJ zzrrd8;Z-rr2Ol5&d>Db3!FAelE}OwtC{;|-G8hbXSlY<%77KOK>-~oS>Of~J#r<9C zAUHYCv-OB^sB>Q%Mm>(t(n}ejw=opf0>f*%XchQQwSS-oKf$?%XeVc!7Jm5G6>?<7 zRhqS61_~m$*4FnNHkt*>?;zzoid8y<;{Z;P^+>Hu63~pxD-B};M=D`o}ql~>6 zS=Q)bGSk&n-Km<7&$o8~XBbFyB=#h_68i#MwJ&ZlY|~KGT|!=?`@WZ zG|>@HZY}A7i8D7`s3#@R*H&9U(o+ArDy?VR98%FO+n>4HKh&?}MIPfBW<&pj$N ziYdoyp8w@6>EF%|i=BaSlq6Z~XtuI0Ff1*ipG^F*V+45QU#1#gIbEiZhfA-f)8yq)L^7gjCi}YJri7BW&|?wJv&q9;)gDiAca= zG@5zeJiYn-`~Cqi#gL=VG2loT`cC<`;Lqu~Fp431osT~m;@PQCmDjd(94`z5q87n8 zwbEaHQ)BNJY-z*3P;*_MCX3@P3%&||vXuwPFw$0AVRSBJrA4DM3~OB&S*}HvZ&l&% z+0YZcNlQmPl<`(j_JQu+BGeI}8jhsy2PvjwmUfXzI`uQRlSjqW7@5VMvXM HZ{hhLj7>+B literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/SpiMaster$Config.class b/out/production/IOIOLib/ioio/lib/api/SpiMaster$Config.class new file mode 100644 index 0000000000000000000000000000000000000000..a50ba107a24381de8d06a35a914f5cc56883f6a0 GIT binary patch literal 757 zcmaKpPfrs;7{;I3E#2umm&Cnz(-@K_CMH!9Asl*}))5Al*=Bd)Tlnv) zpTa{!;=vE#hcZ61t$49q-hcDH@AI3PU%!9+1n?Bw0X(eusAJWdwlxm}nl%sW9ySDO zxh$23M~vPw5(r-zqw;Pli$WCw?ViqbmZW-+$dOJCM*6iZN|kTg?q>qNHkT?dyXl#L z=nF)JJRhZM-yG&rr`j9~)Sqjk%NGJ0J2x)t_a7e-qno`W#zIdU_2%Mypz=dGNLgw2 zvY||mWUg&KE!N5tP0D&VGw(IE)@CV88VKCE8Nwn22iZkFR4=uaoxi^FlT&#qLqymN z(LfmDHs(VtSQFunhb_L=jK}(m7ugj_D$Q}SKR8vxQeb7q$mBQN9ShX@e-GCAlO8|X zg|I}7goUa+x#%5M2uIswmNKu=FU407@$MK-ygG&(x5ub`ueuj$TbQH$z|N2G@ripr zV-a7l#A-a5$6efG#!Z#3s3NQERFT!TOcCx+mG?Mj&l>Tr>t12*pIT7Wzw#d6Duvdh e?^>ZTRdBG(c?S=0i@wRoM+d>)GT)#>X8#XOIhUFM literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/SpiMaster$Rate.class b/out/production/IOIOLib/ioio/lib/api/SpiMaster$Rate.class new file mode 100644 index 0000000000000000000000000000000000000000..184dd70e357b2f08fb63ac2271c978c31bb1e736 GIT binary patch literal 2270 zcmai!c~jeF5XK*2W4|^Agt;N)Bnd|o;}a570wItP3?v9BZkkeI3=uUpF*d!M-uLxU zT4ko`w9`)h?uY7hcjX#qnh7wozxP?K_SO4nt-t^I{VxD9{N#fhZ~BqLo)_z06#Te~ zeGU&5l771QkSmG`*O&(ilgyIB6tk>woq4D*&3sGY2J>x&8Rk0*v&?rDZZh9fxW#;5 zVUGEM!fob<3iHfI3MuAC3Jc7S6&9JFC@e8QRk*|aOyMr`bA@H*7YYXRONABYR|>1l zuNBsq-+1w@2DLo3GP4m4&uefmo29IVz+66`El%gmgM;jWhQ5?lunM7^wHY$^t&p*A zEtm(TY_XrKlhp=sYT)#WaW7{XAE_=Ak?L|RN=u*Y8;5>zPIB;=M+l}088f$L7A@{pY3a_Jd(=7j|8^QY<5u1(O=#$N z&TeyqYcxrv2Ns>lXIMLVvs5lpC)WU9P~(|g<>pXL>zRCcZ~TRiIYE==HwxuqCOd2K znVYJEc$rTez$^SyT@T=UZg804 zFw5a4hg%%xINati&mqNOfx{w)B@TBu+~u&$!QimMVU@!g$ib$gx5XZ4sL$jIc{*O( zz+jC(OPjmdOo=S$c>bX@#A{!L{C1Ny_g5$3+3k{(VfqeSrH@|EWH%cD5XlQ6*&!rH zgk*}4d=Zj0LUKn)1_{X{A=xA(r-Wpdko*#oWkPaINX7}tJ0aO8BnO3LqL6$Pl9fVo zQ%HsadJhi*oyZLz(s&gb?vXl6|1Ky$G6HnmzMK0HFcXYcKTm0zAO3gMD zcChU{NZkcG2&esjz?}|yT~DAM!zaS;7SSLgP%olUM3YBEvk2WQqD4ediD(tkraN`* zqB<&touayQr?OjAkM5KEdPSYk{i6Crozxpdof36g4~RM=>a5-<>YS*4y-C!0Q5W=P zQ5QuG=(?yuQA2u*s9{kr=|NGKL|xWfMTJC-=xw6Hq9S^`sHmuz-XSV3Dxr6Z8WlCB zcZs^9cmGMwx@`JbrQJ3fjC8$?MkDR9(QKr>Hd>6dve9a!bxO4pDA!4#WH-TQqnAK~ z)kkQsaf%SIafZ-n;~b&M#(6@sjf(``#vq}^#xNmh;}W6OMu^a6BTQ(w5hZlkh!Z+( tj1szRTrnO)<4JM`*H5DcY-#H>bgs(uJb=aHf?d2!^i!o9d5lkX{|gSx$Ik!& literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/SpiMaster$Result.class b/out/production/IOIOLib/ioio/lib/api/SpiMaster$Result.class new file mode 100644 index 0000000000000000000000000000000000000000..a31ec84de1d03a00da33df2b9930728ea481b02a GIT binary patch literal 326 zcmY+A%}zow5QWbmwp>I+7VdQALN|2d8xT!MAS95uFPDiaY1*6HUVmQAg%99E8HWW| z*>rklPEWqh_s{1SfCr2<&NPOE;?26eV!QnyoZQ_%6Z((uC0E(SkTfndM$%fxrY`x( zc_s|km0Q@9xt{FotJSz9T)XI^@or;mJ4#@p~> zmYW@yVx1gC@qxumqr5ElSo4^2%SgES%a{eBs+%hF_MhSED6xf81VTr)0Z>;ykFMxb YQA)ZBTF#!R4ho!0?aNd)fq^Q10a)Huga7~l literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/SpiMaster.class b/out/production/IOIOLib/ioio/lib/api/SpiMaster.class new file mode 100644 index 0000000000000000000000000000000000000000..dff173a1bfb7c77636ee4a6ff223b3f112f4f43e GIT binary patch literal 576 zcmZ`$%T59@6g>r;isFbb6cAS|V8d+OxlxHGlVD6BapS5Cm6S|6lWFnsYcBi%KgxJV zWbgrto3`iNb9!^``^W1WfKxO$4mc_tha5)?PB+pIYRpjbwU$XY6vjxyQ6;J`%`~(e zHHJc8SjkX)N|cp-DMk#NE&u+~Ppf^$uyOSq$k?h#leo@tOi=3w?`Fyi^P&TW_CnrM zk&3)f4LuPnZxE{+VXRD=v;WV?X%J15KwhhmW^l8H&O|&4hRSj|LpkNWQ0TFDJDkYC z{_X9Ck&$AUx;B=ZH0SZG;%755)K}KYZ<$qrN1Suhr*8l(j literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/TwiMaster$Rate.class b/out/production/IOIOLib/ioio/lib/api/TwiMaster$Rate.class new file mode 100644 index 0000000000000000000000000000000000000000..6a9403f61572403724419e8123022ae010a92b17 GIT binary patch literal 1105 zcmah{VNVl55PeIpz4kaL9<^Euh+4HR%26$9(uR}}jKm@drA-=R%(kAmo=nRPjK=B$ni1MiJL2 zXiCI#6w}fcqDV;lP{kvL@tw8ZjW>nmVe;maDN374dCHd4$W35`>s4>jH8bJ~{0F zEy;{mg=4+!9<(fPm$z)XQ3I0gcMOGWb)O${)8@{eS@S*N?3HpOBp6k<&Fu#Fgk&2~ zDh@v&X5)W4hDcdB!e3=bUXX1w*Pw>_?*-KqtBE~_`(2NiLRlGzmfQB=u{lJ&;dBqm zm&#nFhHEvq>$Rho{lu0=vcr_9dQ^srsa`< zLA+=Eld2fPZQFGyVIrFwQoP;Tx7t35N?x3XVP&{E!BCZk-k<)>`E;d9fo61)23)D6 zq%?pmsS7L#1g2(WsS<%0uHiZuQsmttE0@*-`--s>gg%qUFhge~h}8+7#_RxJ#8_~v z8A|>e!Y5E9e(W56j&Afm3iG%T#HnY5k{JsK(FWA~;_NXZUxM&(y0hmh$s_5w9bhtu z;tnzcA+MI_X&P$i7||od0!LEz>% literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/TwiMaster$Result.class b/out/production/IOIOLib/ioio/lib/api/TwiMaster$Result.class new file mode 100644 index 0000000000000000000000000000000000000000..a52ea0e1785aa84bcd3b5bfa0961a027d103073f GIT binary patch literal 326 zcmY+A!A=4(5QhIjY*|D^4&L;8xTxLG$!cDTUjQiq-i(XuIQ_I@Bw%z<8WY= zOQ-+L-#=ex`}6e;;0|Mr6OAFE*jSerY*(Lzqnq1TLVxyAa+O^SN#jgoB(3Mz)Ft0L z&xGO2#y#4Uxt^@;yVW=+T)OC@@os5soFb{$2skbR{B8+wk#@p~_ zo|bDa#X32N;ysI*MtNE8upVN{EhFLTFJm5rs&1;xtAB=zgTxk25eOaG20&f;Ji4Nf YMJeejXgPbLIw)`|wJ%fI1O}@31#W#+pa1{> literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/TwiMaster.class b/out/production/IOIOLib/ioio/lib/api/TwiMaster.class new file mode 100644 index 0000000000000000000000000000000000000000..7429120918e5d839cf772c2416120790e4a09a1b GIT binary patch literal 491 zcmZ`$O-}+b5PgH|Rz3toMTyaq2f45pZ(dZQ$tD<+)f1k|(wLIXmTZgYU-RG(@JAVE z6_=1;(q?AfyqV6tetx}w060fSpe3*?uqUuj@FQhsi6hj)G*wwYk=80J&?b11bc#@( zXWFSq$uXgN77m}TLq6Rhp>p#YtEtl_<$?o&LqfeEU)i@bCUln-18uYk5V%)I7lhtKzDPoQeL10-=YvG1&%ym@qGDcVmD^8@RdSSf zJzn2rF$3Y~zx&1O@l#s$GA5K4SE_-jfY pYmEv=RgQedYuIM2j>ZD>*wz?t=4|XR2WYXE|Lg|5KXA&#**f1m=JRCH4l$ilK=vV@dHHWK2ef)%@zVoF)!f2AyO zMx)th|0v^q58_zn)+X=fzI*Py=iGOH|M~t4z$RWrAtA4zfOQ!u8BY|%QRIgnK|-OR z&Jj-|Smd@8L6X~NGM+O?M#HEvgbz&5_CGPG`>tzwyN)>=T0@5Ax;?N5x?^{A^P{aF znVz4WK+BX{Yt;;fU}JBOLC&^z>PNLEL+0&GN#PUI8S&Dqx%`blX?O6>Vo20&*D^-^ zj^!Pi9fxjYQK9jkp_r>5nYp5=IT$Scv z23>c5A$+^JkG(bmOjWuTekPBWlg_Y+8HCSZWs2WKK-?;tRQQI_IV6q` zT*9x?jXFW$4%S4R#ziRJv4kM~fLvH#IYao12+y{=NSBEoQO5&;$s&S>$WDn^B!quE zKOnU=Ie3Q1DWbwrB;m{nM-2%l7XC@N;Fy-FEsZhPY=_2(HBZ4ffr(yClsrHTZ%EG} a9>XA}lje`e<2rL#AgfS@gbmDB(|-Z5McY6C literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/Uart$StopBits.class b/out/production/IOIOLib/ioio/lib/api/Uart$StopBits.class new file mode 100644 index 0000000000000000000000000000000000000000..05df6fee5354aab9a9f4ad53e57f623fffef8a6c GIT binary patch literal 1029 zcmah{QE$>v6#gzPv~(QH#&bJ#EK|HqdUEdfopZi(?)mZa%Xa`}l%tUGK*K}i6f7zzXwb1Cew!-hH3ByU zd{)dB=TgF)TE=V>L&EuI25SU7K!{AV=#R z!&a_wWS*FYZ909U?R(tmSMsw3BpYtev^%E9MY2go*)a!{IC(uAL!`cSeKiES1|dSgq}jyq@)fi;kmW>_yS4 zj-+_nMIBoxDR|6~{`dRnSjH0_E4ZU$9&sHB#2I3jBNIv(!adt{sLE0c>7QwDmrb7R`#MMfbT8Y+9r(Kn5DIo|TOPYXqTJ%MTj3}0H12k^(?vfQp z8-sm9=p51q@)&N>KN4UE#9u~g!Y?Bf+-ga=@EPHA$buib!cWtUe!;?RWCENfL@ZIU z1c^RCDQslU5cwFu)8#J16|4&BSPMAoP)Y9kL`ahw5vTYS@?lbu&Y+$m8aSF9ICJ4| x1W99Bn?rewx%MfTsCLm@ED-UEhV%w$9FVt0SP1u!4eWg^kkyDSBac`u^$VbM*uVe) literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/Uart.class b/out/production/IOIOLib/ioio/lib/api/Uart.class new file mode 100644 index 0000000000000000000000000000000000000000..5006f064455dd66136351d82a6da801b9559ff96 GIT binary patch literal 357 zcmZXQ%}N6?6ot>Nby92p6>VL+(2d!+b5kq`1);*=17u1lDRD9+nS!t8!Uyo7#GATs zii_lsd%k;;o3HPWPXPBg7Z?hR1jYgrLMM-|dNeT*ddsrZeqmJzItZK*vKQq|d?ySx zIxfqqj(PN2y%8>NZlAYmr=)SRVLT9qjIQd~V5beX=`h^QUG3NU$yiM|c~w5%rBuS$ zI8L^vkg75=8HCaPLaWM+Toqfr=F-Ihwy-W}Rivz|10(fc{|!3*Z~hLN5eO|_NBmW- fHa`hnfb|r;R6&2g50J4=_}pgpcs_$*?aXIC=A2vX literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/exception/ConnectionLostException.class b/out/production/IOIOLib/ioio/lib/api/exception/ConnectionLostException.class new file mode 100644 index 0000000000000000000000000000000000000000..1feb41ba2a9b04609055d23679751948a2d83137 GIT binary patch literal 626 zcmb7B%}&BV7@RG?BFLX0A{af1K&S^iX}F*!nuZI=eW@E*Q@f-s>T7u-@!$jaP{wZ& zgCTnG(ET#g>CE)o_m9^%0B!6i5W!9yB|UdzD95nJknx2lxib`=FO_?HeZjzP7*bv3 z`T=)?A$MjXG7j~!)k3q)5IvW!3_1*@nsv_~x#@6sY+gRwVj7Ua+3}De+*NmiA#F)l z^kxqu;SKo6Atq-jo3c115?+$wU?P2n6H6+oOh=APK9#2Ub~LGpD{O6UDL+^xQBkri z{Mv#cRMSloeKqrJaV2$nPhcm zv9rR@b@l^Kx?|#Th%nt2z)(gMF`98g1~%wn)GbM8ikJ>zgJ!hen1j76G+T5g7VHsu z)Q~1z{8AxY5Pfs`!ZR^3F%bj{E29z*!7h>}Dnt&OX!^Z#i7S`gaJLclUs(wj{s3Do z{3kXNoQq$DSlG<$dpq;qV;-mX4*+(t>>`7u0_p`c2$e*}N<;%0C(7v4-adhj2&Jyk zi51!oL^P4P*PEBO>GM;Ikl#~U*$$!J^e@Dv@FJmyUf;$_58E39LbhwpB%$mpEsrOo zK*lE`h?uGRCS)VQc8ovCtUXr=VaHcS881?SC&tQ?SD_qR&g1oTXhvgURiGkeuMfUH z+Jwv~8K$bgQV`s}nZ%(yRH^UkUmDx#W)X963En^b3AG>J?^IZW!^Z^(E65_pJx}D7wxwZWJVF6`EJdX+%XIfQ84r=dGym*uV literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/api/exception/OutOfResourceException.class b/out/production/IOIOLib/ioio/lib/api/exception/OutOfResourceException.class new file mode 100644 index 0000000000000000000000000000000000000000..9c4cef7639777fa92232479be3449d6599f4773a GIT binary patch literal 471 zcmb7AJxc>Y5Pfs`I6M;*qluuEVBrV4ja?*7R8$TFiKgGgHCegrg}XiRm-s)d1Pj47 zy?;lXJCzjL$imFL$D8+toqfE#0yxB)ha6U2)Lk?P)mTMZ27ML9IyBek#{{|{l-r?+ ztu(eTgG3eHW{+p%?$$e@c%+TCEkb?UzmxY;1k#K|&qmsenmc_$z8&5uLdDlcT_%%( zimv1!V5a7WLk^N0$M~Df+p&%b!q=e=MW6>lPPI@ELp8O0kLV<}bK6yMm_$Q$@)tcdnGKuBkcbxo3K95>?X$Q$^0;E!r|WqScN4AH xxI9rB$90jJ7IO~w;_luv=qb~bxOy2|;>|KYpz)=`5-N;Xk1CckuNorp?)P%b5aYqXSBI!IJIQ0JW_Xnx~Eu-)7^64?9tBo>UfR2nn89e00)?Sv=Q zmX5;YDC{b;e>$}DQ6q!{JToGNon*1vjahWU7G7z6}VrnqPUYQon{V} z1m!5v8O2KtpFIZqI!)uq*lp=7?|WxM{@Y|zN7>MEF4KM5SA!4?7iF`1 zY+i$7vFn_!!?_ElOo2oeUl*fXJ)$36OI%0&&3lMnyM=XK1dZ|grnp)~nVoR4&ONZ$ z3&%Jr+%XXosFL2GNeWmL0&JeVMcuTM$OwJrjftxG_bB-{u=!edC=aUn%-tmW$3o5P NWp zUKrS|@TJr1_JfwA3%4RetYS8->LCRPX4;-Ef~F^N+N({4upYeCJY?3CnH!cGwRnQY6O>@lwkh zIq!{yuKN8>X)?b1G!n%UBYN)gF3kTqxlP^*74v*yGAeD+u8b!P`XuvKv5coG?%=M9 z6f_lc{7OS(n7QgOr%Q{~^140|Naylnr8JtSPAepmtN+i(ushy8v6scMIKQWOJ#DeP zMGHPde}`0FBDl7Gqo>=ULg5&1wG!xG&wVbck} zjFl072UFrz(WJs>L@yz6{M0r4EqYOhD6HbPuv6~{#WQXrLI;ow8!H!xeH7;LbXV>& z(Ie`(FEBddSc5(y;!q*{JNOFeM3W;Ih@T@N6h#usv{2NjP?E84go_Ml`%a_*rmd6c r07>f{j1w5vtBH_nNFq!1tkcnn=`eYgG+t*8H%KbvA>jdL%L~5%fA<8o literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/AbstractResource.class b/out/production/IOIOLib/ioio/lib/impl/AbstractResource.class new file mode 100644 index 0000000000000000000000000000000000000000..c3f678415c290f315e575b85c5610a993b7b14e9 GIT binary patch literal 1509 zcmai!ZBNrs7>4iet)mol6A(pVAjp_XRTM>#7soV922)2&_++|rf|at8wix{b{uBK! z5lJM`@BS#`eY&{~oSG%)t><~}>v=i*@$>690C$kr(2HyrQkd#O4{~z2Cb!q+a6`p( z5{3p9H#OYCZ51;bx{+0JN5x$gvnuYZc%UF&3Cut!(2KR2@bZr7`@&a{@a6GK1y@V9 zYrBSHR}Fi2&oNf2e&Cr_@Lc%rzGsQ?(0-ndr-E|UI}X_449ir82@8ilJ%dK zn|^J+F?9@LOvgO>b@a($0Oxfq$kjviD;SZN49Bc(8%4(v+oluxZt^J@-tgYpwe3vc zX7+uNF*6~_R>qUrw}cc}RI#LE87m5=o24@MY(xAG)5zBYWW*)c58B-~4La6V!PypJ zx%!$(QZUf8ks^7S8CeY#kJR?h-$YYJ9bs>5}aSg5Ac7b~+qyDs-f(cO1)E zep*;(Q{_wLN@10yTrF1e<@NPKenW2iv!xb%CGf~GFN@pauQN82@tIH4sewy88K@iLGKRUM3ye^J&xLC#(oK+2jBzD})_7at zoX&kl^Z@Y>&?uLnoK%X2O1+$c8EE_yN?|rs(d$+Xl`G+0B}K>MP1o;fCSA`qTz^E* zG1Sd;@(5ku>t~6N=%!p;$~9(wh~>UOYsrrxNiTDhf52?bGpq$n@Ht(@62o7{U97Yr z&9))M5a~;iXo5`jyzVrZCjZTJjPA`N=-*oq1Ber1l@J9&JSM~w0uA$Lwb3TRlA3|MDiDSwo_05 literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/AnalogInputImpl.class b/out/production/IOIOLib/ioio/lib/impl/AnalogInputImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..1b922770a56ab17d6ad8e082eab763a33ddb32eb GIT binary patch literal 2253 zcmZuzTXWM^5dMyDij9Eagv24?)&`mwh}$N;CeWn06t^ZxlQdjkJggOgq!|xqqeqq3yS_>==VRI+s1GZ+E}lJ@()K{`LoeDLlww2p?rJ zh}j&6IT=1q&8|;QifmrPLJk@hWwVsSC%7yMW!Zk3#b>C9>`H3kyT2en%QCFU>1r0A zV@+1;Ic(qy4VxOS=5P(yHQdnfrG~E+GP{P;ux=`-a&u!>WphKJZ`23^%MWeO4HoRc z*mA5YRc3704lgN;j8$yU_DYVuRkC;LPN}@YFBjA0@lA!)yjQgp4p(f~T5jxYS^kC~ zDC8@iX*ipPZ_7Rwro!8Hpm4Gaa?UjzuU2;JjW9wctk_g2bSbuNDT zmTcjtzbohoLC|p;ujx2}lRDnPgpN05IE9m>BC_BZZml%e%GaXrd%nE$o{kY5*RZ9- zlucCz3pEY4j&0O*+!4vUGQ2N?gK-TzI$U@<>hkJc9X^L1?*_uh9Fl zNG~%({=6gQ%s?jEfMU*S)k$f-nMjs<#S6lAwiHh6GhB8<%l8{~rn^I-cVA&;Yn#QO zkafM#zV%?vaaeoiZOgn9In4eE#BsJ*Iu@MmD&@JDnl&qks$w+KW6j)G7;U>Aaq((Z zmgPcueST$md2xPYae=jb&#>uIT3)8%ffqqqtwW#dz889?=TK>+%PY}ZjgO}lG&UK# znu^C>Mr-M@X4p`ze6Ab38<;pcGFHAJjdFOOwkSDtt!f3fZ&llcEU`D3GjuK;UAG7K9a&uIPg2P>wD<=vpD<=+2T_q9+H<78KJv5VI>){a*Q4U zACl{7ayvtF7g59|`ZgPx9%#b187g6tyeR$>3NMMFe)7*dj#?7Q4rhsEoJI~bjrMcW zpWxun5m|>G{r69Nmi-}r*p+yjjtn5p^#VZ`aTH5T_+^|zxg-AZ*ooM5YA{Mpi_p_@ zFUG7)a~3zU#Xa=4;_a-0Wtv%G^{jTlXWR7hZjFKN(mA2GK%gTGB>xnBocfc`ar6;V zmB-Xep$`N6c80M*=_cjZD8I@|zTW0?kZ2!}Z*i~C5s-!ifAFWJq-WaZry@1rNPh4+ z3J;;BXf*jNGW%8CthO^zKGI0&vx*L1BzS^JyvaGw)iA!oH<=#(|G14?vxWZwxDeIJ literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/Constants.class b/out/production/IOIOLib/ioio/lib/impl/Constants.class new file mode 100644 index 0000000000000000000000000000000000000000..491f29b2ba178d145632d6fff0c2cb4759e725a0 GIT binary patch literal 930 zcmZ{idvDTU6vm&IUSVvjIAzSsyzIWYZi)Z7m@o!QBhY3A7Muww*l3py3>QC&-^1(= z6Qh0rKa}yD(viAENZz;4?>z5$pVRdBpYOi_yu@J!I(E{~u*=JyhCJ^tc-hxrYB&(k z>&;rnvFfgXumt8ygZ^mj^~WtQocI#;ITToAPqALC+NY6~u@PhEyw<7NC(UZvWtus50$Pmam#nPK{qw{Ztri9M7O-Gh4xM|udxlT;fqo5y*UkgZE+bsdPGyxXlKWup2kVvjN=y_qw8wRXnD33n|BY{FS7z6_|47z4;^(i!O-s$KSU4GOH;~O&W zU^49am4N##%uM^2-e)h1CwQ90edM!P=H(F{XR(UBK>k0?>CN*=GxYi&OuKvO_r}yj zqi+Dw3~CiD{Nd$%-YrQXZ*pYDZ3eTC?Qgnmex zCW`ztRFnxkG9`RQ%A{S;uIzk+_!^a;)2c>r6>IdIof@!?4N^KbXNSMg(EJ;!KQe7e zvfHv^w-wF4Mk*qPO32WN89G5p{Rz1(DQqSv>$XcLSQ#c84@fIhy~4U+yVp>roz@tv hbEggJq;gULPMV`{5R@!Oxi+zjci5xK7O@nz{{k$>ofiNA literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/DigitalInputImpl.class b/out/production/IOIOLib/ioio/lib/impl/DigitalInputImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ac256a87a29502ca990f4fda0fa104f8a3579530 GIT binary patch literal 2245 zcmZuxU3U{z6x}zOWRi3!rKL^3#Ht0`fJFHyY74ZcEsTb?wpgKl;AAqi7p5~|W{UVz zs1Nw!;>8ybVJ%%t-~Agt`X9u7C(|?ytgOtr_uO;O*=L_~?%)6Y{wIKQ2n*=POdfr> zs6Ll;TrNPvtlG>K@ChmfuIANtA&*5|QM#+@lBsl`=J6S-YIUuEB`oV$QD>j)SS?@; z*L8fMV_nA$f$V+D-EnRSh>hk(*172$x5Cf~BI$eKybP_H>(qHXBRv^i5*VGRN?-bA zSJujMyWy72W&XIBHYe8ww2EJM1P)iF=Pd1P*PP(G@*vP#^=->tw*sm5iBgNUWGFD! z;c{MX%E)p}udx%wuIX0=6&UQWYy}rcH>Af@Oo76}1KVlD3F!DrAQw8(x=NL9CSsJC zICFtRYmsH&y=FCHJfuj#_}-Gyq93#_Y)q1^uLUx;>xXoao=|xTuKKHYtov4(WSGmX zkkcfbaRSF8YqTY`MqP%s?|F_LDJpX_wwsVySo3!R+gX%~q5jUaPb>EZM)8J$VGJ1< z!4N5kgSwWtS)SV~)It#WfwDYfU=Tw(zA^Bv+T2o~?@-fGH{hUV;I`6ypgx-z*Rf?l z;*Np4IHAKeunm&f_nN#6e26mw#|{?16S5B9Km!*9h7KCe)xs#S>}W+5Y5&Y>$a1?6 z9rpxI9lUCKw!baCP1Y)M#^a`-m#PdS$8!RKo>x_dNw$NEt2&web-LwH#dG$$qg-hg zg`HmY!>Cn4X1UL?=|xTu>@--qHiMphgXP*C7FHnd`H{T+!<_4~1MMxxz8eGP=!6P5 zCo7XEPINT!9yhB_7`MZCY{y1oa^o%N@vyz#lr1)Iu2q(omKG}47v|Z1s)-p;U1s2c zgHHB_hL{_HANjWL(rB~;m9kn%j;955ju!`-hQqIV+q2`~bJi+bY))q>rh_0ROpXvw z_9=@CLs)eulz~%kwXw>3hxHoih|t~uue4w%C3uT(Uq4b9KoMz54g??8lo}zRXHZQM z_d5TaEb5POwMxr0rBOOL`U0Yq{tc-o+^6s+zuocKNn|mBE}X&`bz@C?Mthq(-o!f? zhlp3lae_DBt$a^Wusi#Qq;^@dj^o(ea(Detjn=g?0t2Cnh1YLU! zjTo|}XGrZLSJH^5^c=dvl#VeC6Ad`XMV!HLoF%Gr+)d#;F2wi-no(N#rf`y|I9$9{ zgjO_ly!Vpp6s2f>yJ>tHWnNT3A5bcwlZ=~FI3A*lB0KU3M=A49QTQ1J9(Fx``H!;M z$2NcrFHST288Up4yj&&=vu(I0Tev2PYbe2$L0aqXiHXZH_WLn)e5(@b?j_U>mR_(> z&v57&x+xB)pQDF-RiDsKWAO)YBq6B@WS-hZ>aX(T3X?ZmK#GKUmc$9l!32^bNJol~ z{&`R}MLwH^NJ?dRe2);8uak&>le6qEG;9{CiD8Ktmf4moY`Rs(UyCsqO^0ofHKep+ z2LpU~X{Ty3O{pN{$v`hd#r@FUqc<4lCUV$lbDvM#=kQU>Q8Q)WNN?YB9NkSC?pLJu ln?9RhQ+#BQGG^H&_?Vj%VQf(La#h5axS7q7UK`fz;Qzuv)^Pv; literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/DigitalOutputImpl.class b/out/production/IOIOLib/ioio/lib/impl/DigitalOutputImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..aff801b29f03b3cd1492ecc13f4aebfd0615bdfa GIT binary patch literal 1030 zcmZuwX;0Kp6g_Vi%9J7svX8>Jz$`EY#T8;=K$A%ZA;C-{UreVq@T9cO%p3G4_)q*y zLLkvZzx$(%=ar$zl4jcb?mPF~bC>z^_s1^)OIR_{hx;Z>Jjn6&Fozk;YO83XgtCE( zfjJYsm^V;0U>jHv=vk40RIdc`#kve-X#28h%l*i=Ya4uMEZ0g6fy`?7$rBi;%fNfr z*>8HS_fFHNXRsc+j^A)vQlGodjM|lLfx;!qHMt{|<8O3S)KM`viFH>M~YtEg=x&}A|lI6e{E0{vUcarf4p zC>F|=kaR2Tv|R74)YXh!kyzD~7W#3+!Xh47c#L5KOBSBssfA}4HSpZR3%nEk-E6CtH z#9<7$$+sB;XV8OL+~Rrq6ox?z@x%b!#xN1DccOmq``>n13akC7@L zA$^1lKiSD+^n6GE`cL$Jm^(r4_aQ?wBp)GR8d|~xlLHlc=jmVIO_hmkN?A-KjUtCh gOV literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream$FlushThread.class b/out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream$FlushThread.class new file mode 100644 index 0000000000000000000000000000000000000000..87a21d29d124111de6f9eec82ebd64fcc5296b79 GIT binary patch literal 2013 zcmb7FU2_vv7=BK(&63R)N-0>Z1*}2SP?}IG3e+ko4MtK*O$kCp*=!E&DVyE6*`*X6 zue{*SafS;Suk@yu4q9vRLLIsDKRDy>a7N>Mb{iUJ)Jc-;Ip_U;-j6-`^{*d(1TX;+ zLqF0Q_9G*g6B@>GQZ5s5yo^&CUcsx9JT1vH8qQ);lCMc}O2z9MdhmwioRg|qd76&n zJZ4nnR9sN;CPUO)7WG7iAyp8LaMG42r$x19rE`|EI_=n=>sS`A%=uo;_llm&jp|vl zniRJ1rWlSV+cz62F(}hcg){6a2%BH>t7Yyk7-fq%eFeuftdijhNpCY1363G2v;6w< z!ZHP~Fz9*P=I*p*)a#str`iUPXmLY1L|osdH7Q{+K~G**!zpr`f-r(~q_AS#G18V{ zFQxOg$6eR2dAu@n*W@)%I5zp{DSC!^d)BB0fK}v!vc5(2WzdR_@0vU(WO|4HyPRV( zijD(#M#lh#bv%z@6&H0BFstJd=2TqPF^{*&y^f;PSdfw{D5ZB1|$w{$FFnc>im^1o%sFwyQ%v=*14cgJtDZ7r<1@(MRS zhJF9ga#q7hNVXf2N^F=WuhaNuXn;E!Me23a_=GgR+{qk=bK!f!N}G;t`mW1uFP*g< z^R}>;=6&vSnvLNgyZ_Zh!;{i*tdpb`vo!uLuR3=qR)2D&W%$E>QA)8gO;pLS{16UVG~;D5 zDrPCDAlB1=LeFv8M9$k+Dok3coqyu^ppQH6asD&Z& zC_h@@jV>a29fZEvmx!R7WEU!h%P_S!T z^Ql^lVGA1lCL>crgI^&LO5#ILHFSob(X)x&3!g;TdgC`K2!+aEWea<*N@5eeqfgeM zol!=g98`V^<$J>|KKK}Y5v(_^6dn=wI6lJz!v6rD2fKoA=(~?3vKl$;rF8`gY|?a) zKn-JXaT;}8q?kGuF3Yxn~9@HIXpPaol1d>m9WMPBCdB3>Xb5wg6A zqjX{<2XS8t>b|jE>m>0mAg26D{ZKJ75NlAu6%{E)6gB7%9Bq)(2yvtw#6H#_-7cvD kG^kO;O37uEns}VtbrJBxwD-}epZ;|Z(fK^>mFTX&0VuQwxBvhE literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream$Sender.class b/out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream$Sender.class new file mode 100644 index 0000000000000000000000000000000000000000..8f165a9b14f042d0f3b8ccdc54c95abc3a3d9d8f GIT binary patch literal 264 zcma)1y$ZrG7`#twtF?k};NqZ*S$qP8LZ=P|7pGJ|BoY%zQ++oFAHataqu?mG+}&_L z+~aw>16X2|pr2q!h#EF~LOk29ius0+RECN2XPnVi(4~A}fqxx7M<0xFL++okB}<5M_PjohQuxEsp_0 aCwvPW5xR(i>Y(?*7-`@%I0y*_asLHX5l6BB literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream.class b/out/production/IOIOLib/ioio/lib/impl/FlowControlledOutputStream.class new file mode 100644 index 0000000000000000000000000000000000000000..bad1e1a3d4300589e96e574ca438ae61c1c578e0 GIT binary patch literal 3267 zcmb7GTU!%X6kQV%CdA<)DqgT$lxi3+0aO%GE2LtnQLvyDtd}7SFfz=<$wZ(xd-(-@ ztdH%3FMX)rCt7R2_PxKOFZ~m3*Pclrw6R}!Ide|V*=w)8_CEXM_rHGr6~IY+U59K9u2>3{wfTVp_#*6(1#_;*N^D2_$e&Ht)+|$Z}>IvY1W4#GHzG6$^1#2{hwD z9E%CqSdx85_FXxiQ}IxRr(oNNUC1v?E_kLft3Vrd9MenNMm}%mRpb@aPMFTD$%AS> znA}s)o3UKWP1)8=%38|VsS(>lpxwdW2jure|!JqI6xYQLI4-)2K!7P|G?#etc z9vP{EZ`rA=>tqX_XF7gr*mkpvmNS1{j`4imgf;INe!(*p^jBeWE<9r!&U|Wk)i(z( z5JdHZu;{hFddg*b5F)W;tc)AkMbjsWGD^%`X%)FWOuJjdtHu5KX(Y6reFiDMT6>`2gdub(W=6uU_h*Uq}Q<*mTeQw$Y#xazN@FF zN5Qe`6&>tm+9E47Dk1a=!uVDYs;EFImLkJG!7nXN$l~}`oJn1ktb2O;wq`vVM%%jq zaZ(7}*$RQG3uxnhCnns2mo-N$sm}H{cZB0|`!#f+Q-h8p8j|SNZ~zB29F?!Ia!!DR(b4){WxVy|K zcpJ#iotu+KZ4+SVY_OXY>Kxa%=2nNK@6=hPhKEkRwyk`wRX(gNVa}SRcEM+j^9bJN znspQW&cY79tny%wq)4ts%-)Vv0X+ zTZ5+8tRW^ty?$g3ioSmhHTwQv;%kWL&!N3Q!?VCeA4i>!JaB@*I!PTx8=W1bvn2m( z9K$K}p&tV{jf*(LQ(!m&0q&mSid4AYNqRCnP3jS@&d?$f5dMy*BiuVnzx7Yh!cX)S z8WlW2LVtm#r+@$X6b+fzXr5}`@e(_KlXKsqKKNmm{O~Nm-iNoaomj&70OB0aV+Sr! z=3(w!B3bw#+CtB5jP5K31B|mp&gW>IKn#0_Rh&;W5e1B%ZzY+(L#&Yb zD|(Yi(;@R#Vcz=9PiT3C-H{FYe~|vw|Dn$y_k!)_Pw`Bp@dR zDY`ZU@!q1VDbAJc{=#7)O7s%J@n}&o$L~&fsbV&yngpUt{frx(ybytm>`P%y4Dj waxYHYBSeD&7K$ngdzHTku5CU{DmqqsoWPW`u#wPHM6%>iccVTsb=+Jzq)J<)u;Enc@Bz_exy#kyXF&giq#&)AgHWCKzG^vcwrS7KF#I2jwDH z<95*{NlQUGwmV@fq4!I|m^oB+i zctq1079#}hg=zbdZMn8LY2`hiD-~3HUK)Jt@QN>_M<(mXe2T+}T?z3SIB(zr#gZX8 zCIjX0A)%kr_V3Vj>nlub#ugJ>(Pm;V+6-JYaR~zkE}Iy{kclg}Y9fze2CLqjbVdoH z%tVZdYbX#v6C?VX>zdrasEL~xGck@~1Gh~~;10vy|391ISlu9M0?g37>UTMHHKH5E zY3}$8oBz;~vr#pq>%EdfZ#xdJQVI7^5s$8=9HV>(zHlu^dQPAe_k8P;E1enPP2LQ6 zz$xeZLV*9(VlYH?uw3zb*g>>4(!x&cp&jXm-e|Ju7LRJ7I zjSZOlr3&)|E(Hli5EX)Ojo}&nn(0J8xSP%aju@th6ZEucoWcxEuQJUmkEp~fDrBMX z9R5mRo|9EOI>K7D1PsLKOc{4m_ z2EO~_dIK;;Pa#q03aAa$OM4-K=4f09q|0!OCC#kk*I?$tIS;;$!8uwlOu6GU`8CDK z)|`w&CZKJwK|8zBc7JgCcV+nL3&^j@3hycA&Quju0{z#fcE)e?e6^*r78w0IE&+iC Yv$3`q1}%0CwBJ`EWlcH3!05>22_5Q35&!@I literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/FlowControlledPacketSender$Sender.class b/out/production/IOIOLib/ioio/lib/impl/FlowControlledPacketSender$Sender.class new file mode 100644 index 0000000000000000000000000000000000000000..f469339ee11e0f1fec433b4093f78e661486ed16 GIT binary patch literal 380 zcma)2v2MaZ41K0)E(9p3KhTANF1;liBT^(Jq#_})AHk{)jysg3<=;B=1Nu=_4N*p< zEcUbP_nz(FzwaLa872w?g%KgD*zXmd2=Uq!N3IFOrT1JeoT)0V2-$39gALl*owld5 z)42vQX#Fjf@kImZ#+gl+h~@KtOmsGSwgittp}9N#v~4G}0% z{c!P-g25@vwcLztEoZFFyq%e}-K`1N2|U-f#Y%KOLgPnUN_3 zmYp$O$1HfBaDvRZ?V1~wvvx-wz1z|U9l@!8$Yb9g2bxSg@T$M=~$tUjwtoE;jCqH zP9Qw5kPpPl^=(t+1Iu-2-7p(aA=5@aWI!n@&<^%VC9&mM0imi1zgQy4qBdXDUlpn= znp5ay#bG9UauPA=6gJ0q0wKADmEz8ZWmD^#VVc7Cy9Wja6x^=7T-n|V6v|Y^wu!s% zWKcTkuf_?bRWiPy;CvOvxn5ewwg*cP7o`7(RY3Gstf|tq*Jj;#yrp1d9P_GIQf2CVoUM^!wGx|G)4iwzx{DC-DNji z+HUGNhaMe$_)>?1Ar-EUJf7!I>!yH)txcfBkHXEHb}L$@Y4!@qEk}29Hpdgq2LRSV>rt>g%ge` z>hMhs@vZSpKhE=+;p`{Gc^bHs-a|b77Kz293ihDxqK32NBA4rSp`~kf5tEPlbl)zN z^ebqup}!1a2l(vbCtm)Yh!Z+R;5H1B&IJ;<#FZiLT;>YU96968SDeu;ce+TWlcOQ- zNlL$%r9Xj)7i-9ze~Johsi-s0F|>i8Z` zyn9JRFg>TyNURdSEdQ5`aQzy0u9D*@`Hj)%IIiH^1Ac8x(PexcVhk6VULl_RKh!d= zVpwZJmh(7IG?DoTz9}+i()a^LBjzV1^S(D|j+LnYMe5U^pw0kKM)X@raG(BJ)DiXu zjw6RwOmpWZ+A+m;b&KK6U>J88(A_YE4pL|@h9E0DdXVfcmyOJAnt+{{V0|OtQQFJ;G^FEF zPob1PD@iGWU1GBDL&t*ynQj2ii- v1C@nmPRU}L<^Pa{Qb7m|aVF$?8=v!iiae6+D6Jfy=DV#nNe#82qc-^;G4|c` literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IOIOImpl$1.class b/out/production/IOIOLib/ioio/lib/impl/IOIOImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0ee1f0bb721eb074ac2cc9dcc49d2041524e766e GIT binary patch literal 933 zcmah|ZBNrs6n^ej*1dEv=9~jT5GvbHs3`J9V;r!>#*UJ086WsSx~^dtOS^O%>M!!M zniyjYKY$-)Ja_1p#kZtA=Xvh!d7hJVZ?C?8y#%n0?KtLfJBAn*VuTh2y(42ukYy3> zim)PMRmMGrf?9vW`*x>lbyeAia^5m57-!anrMZ@OsvY?C zf!(Qa$8DE`zz?1>BW z-|^cr)?^eEtmD3d1QZ1iu%TcR8pHhGofSM3pKXco2pbGJF%OOAp>ZR2@)W?|^N z*B{LO)>CSku3wz4BTMDP2?&HJl9;AEL+lD+LO|sU*yXqQCxkwVC;SJtYVFFp3d+ILs60X$LRmzQWZXn`GLUkXc0=SY)FjMNROwCAT8uJMQTpNXD888c0g-ddp8x;= literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IOIOImpl$State.class b/out/production/IOIOLib/ioio/lib/impl/IOIOImpl$State.class new file mode 100644 index 0000000000000000000000000000000000000000..c7500ad2dc22e32cf08594b6f6fa6cd0bcc00ecb GIT binary patch literal 1152 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 literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$IncomingHandler.class b/out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$IncomingHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..29279a0cd00abadd370951be4429a0ad26543d7b GIT binary patch literal 1199 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 literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$PwmScale.class b/out/production/IOIOLib/ioio/lib/impl/IOIOProtocol$PwmScale.class new file mode 100644 index 0000000000000000000000000000000000000000..00ae64fb61669e753dc85eed9cc0c19fc6551512 GIT binary patch literal 1487 zcma)6+iuf95IvjNvE!OH3D6r*3N4TXXae*~OGzmOB1II*P*H&dt}(^Pu~9C-LwVuy zH#|T}0f9g~^HGSIO=wdAQv9&9Gdp|coY`If{PpEKfN>P#P%**7q=6|+YZ%gS-arbo zJk0UR1s!`0vh(a*)X~SbprfDdf{p>UmozL2=+@#wY3bgX+cdrLtZX^9?+Td3AaE;- zzFn=lRe@tAFZ9Bk@2%y$@)JK-TrMu(sD!o93H{MOyJok+rU@+G#GM?cxzU`TotPv? ztu{-DBIUb*6F%^QbpdU3WubIy$r3nzr^9Nor?y{bdg*kg(>=;!_<;2Fl)S*bUN5h? zm7De&E7l~~@Ku%5GO6{0tr>5x*Y6q33XyW%lw3t9>6GF3?Z4J#0v z^8&9nFVO#ws>Nb4vm&6>9(klPZh7m0U8`3JOHDVI4BK(sYIQW9&vP3(Vws`FN1ju@ zKIizY>d`b8nrdUX6x7Re9pTN>!5dasuQ=`%k6W2+zaC@UOA`liz{DZGszW9&V@bmm zfsqbwm5C8tHIc?O6N3zrM#jWm^qT17p`V8V^a^zEoEnp-COLi>5TAYNOq;Ofwa2bg zBhG{WuP!jrejM^0%(h`{--_KO3ADF;Un`9cv5=<+m!kKp6$Y3*K$iGROA@3d6_k-= znPgMkGaxa@Z6jYr9EULsfg|J{CCi`DK;$E$KcKuLPf#3)$+Zp2AHirVe;g4RHBxH! zGh#oWa(-l2{xOP}%`6_7g6Fsys{?`eu9=gv;{r8U)h3qFEhDv3JQ%c ziNPy$;WcS_14bRDy}X*03VFsFn=w|Y;3Ta_a4MnWG{#z-b7Wbin*9LrRwlH|+o7u> zCxLb3ai+C-gGlgq|0~qhR6MFgKf%~Umvl`fp~s}ZNBZ4rqM%B@NBW6alAfImB(-k@ z5N)8#T2&g@W38$U^jNF029nk$A}qeyc7p@}FHpb+Noxu^i*po<&~JM`S%WfF%wS)k F|2K?mHRJ#Q literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IOIOProtocol.class b/out/production/IOIOLib/ioio/lib/impl/IOIOProtocol.class new file mode 100644 index 0000000000000000000000000000000000000000..56f76e5a1800aa8b152db59c05953f7f66608865 GIT binary patch literal 12811 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 PDY0lr8~&rkBtQQTa32B6 literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IcspMasterImpl.class b/out/production/IOIOLib/ioio/lib/impl/IcspMasterImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..031542955614043391ea0c116b8b75016a25ee6b GIT binary patch literal 3423 zcmbVOTX!4P8QmjG8cUwUj+_|R7r?~?M}~+3NuW+$+loU4a-7(~!AV;fOUKT{vPR5| z96N0x(9l9}K(8Uaq@^u+=?iJS`{|4YGe3-;TIAh|)BqCT$Uk7oCZnmtIFNFpk9<=!^Ecexn$xS zNqiIEGV!X3*G#-_!19z|Ed{5ls;XWxuqS`PUbi#Vz$s<4ZOlMo-dQQzLDf?R_V1iO zS~HaF@=7LG4%CYB#>TnH@;2twn(dUG@(OW{oPq9P+xL|hIBwZL=J@tfNfkMB)$sVcvy^exDy2+rmS5hC9au0B&ALT$=*&B1b)veqq`cDtVjz`w3wCM2 z_8fT*jnUw|;~ThtCt|^`%-DXQJdI0K@o1oT=eljr29nbo1y#|!d9b1#*mJ6&oOPie zA2~Ob)8xc%AaZVskiK(?wBj{w4eXi^?854dT?wi6c&g%h!DO-M2&!G0sxB`pj~hoc zR&r@GQ2uF`3k-BA%Icl;+!fDWTcex?+D62qK^OaK@>8<3=8Ag&E`IL%M(p0bMzj?bjKVjxy1xjwyEMaM6=<+3USa^{54JMA*u!g%Tc zV{0t&$CK~AXgh)IpVMijsdBpgXrUB_I63cDy@ERKNZ`72EzvkA$!FmpG6wcG5|Qy< zRmHsH2Qrtnupf_DNMqE(qj-#=(@S*7G|}^X!Iv$ zm@QSZZ=`AY?9v6M>evCcmac}+nw9BWb^~X5bFx%oX&26`!m2(N(_Iu{v+AiUQ#*Xv z3AnT3xq(}7OI$Q?kAA^w)6?vKeRpGQ&l1OB(59uVnY_)!>ssi3*RGebim8m;&N~}y zD!#;k1Y#lU{X2;4jP$TxM@qx3lH4y?ljpl_}HT$~o7Z zhkOGL@jVy8Fdjx5uWSo2Fv2%*1PAzIhXA^IrAg3cagLpZ_Q(0OpmzX0>CxLT(svM9 zyp6WMAe!b7`$%Jafny3$j*lTm#4aN4BgPZ7^bkkJC;7IQPY({^Fg+aMeU#S}xjl_% zcqiVj(wpEMxrz8SbPdF=qvH-tx@`Y+H2UPnNOZMtjJC#+WS8ddX9whBs5DxGbD6^giii{gucSl)za|_&n(&wHYwD< zg?(f+BN9E@kf@VBTP1pdjLx7FXF2mCL%fIqoYRaRBxrXik>u-OJxqhh=`e+2&D|x| zb9J$95=1s?~Tv?r6(nCVnxZD?I3^dE=@<7vQO7fkY+N0 z|52l`ncPccSY+xba$DiL3tV}gRpc-QR_hu+(-ibU$S9} zkMk-OVWn@QPe^W|zftV9{B}vEf)2c*9ZK7f=20v3A$d)QSW;Uummrp8wl34=La7pH z9qqW-1e6GYlJeIi1bUoA1t{LP2cNzAC*IXi;@WztX?L8Nc8c>un8Q3*NpINZ_KOzmx`2YX_ literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IncapImpl.class b/out/production/IOIOLib/ioio/lib/impl/IncapImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4c70cfa3363ed768484a00d678391a3f4d24eaea GIT binary patch literal 3586 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 M)I25$H@Ho^M_P+c2mk;8 literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IncomingState$DataModuleState.class b/out/production/IOIOLib/ioio/lib/impl/IncomingState$DataModuleState.class new file mode 100644 index 0000000000000000000000000000000000000000..139d610e45928cfbfac20f9b2702aaefee1137de GIT binary patch literal 2066 zcmb7FYf~dd6g@o&8Ay6r2#-Zz6%{23LeO2GJX{E@q5)h$mSsz=$)pz=CNps!)UN+z z`2&9T!EWJJsh|B(mbW`Y5~V8Yhs<>M+`i}Bb8dJ3`16-v0o=wx4+gN1#vm3=ETxga zqFVV_J?><%j1~1Lsp+a3t(mx+Mh1&&@`;I0Gw8*-dVFT$^EArXFtKT3iy`gEAQZ0f zgKrr6%g5HKRg6OE6z@eM67vi_JMz%A!pIj4*;OmFHoR)&h;qD*fv>x?z2sOyAOeQc zKXWXUr6;|jBP&H&t2@PY*Y;}CJ=_VcP)uIUIKM=w+>U%-xZze^xI~N{Fbqs81V5CX z8?4H}syL#`kP44vFgeF?vl9$uOf5)PhD!_+xsH+fJ%(h-t5Uhw%hDB_QLQ5UT?I!1 zls(&W_AFnjdAyiZ6ezk?iY|>|rV~(Gao7svRqBv!VGDVx-N`*%S=WlH zbq3?%3aJ~&??_9w&M@qYy61<>)v8p!TFy%J=#lU#Ca1UcR-S|+*cLU5%ySQ^x&_;b zeN69ok#CE;QXBKPu9{VC%<(c_;h4Y-L!s5zw&%vZRV+1!Wb}!s>Xzpi!Z61e#!Y;| zaSz)ZJJ{v8iE)lEK{|}+Y>wp~7MCwua?STWpW{Au8D{@q!*k5xZI1WwKEqgtttR$4 z9w-9S9irO$B5uRJ7TvANv9Lqx)s`N*XmZ%9(rFsXHBPUttr0w*r?Z#xMa?@U(*|?- zs}T&Q4AyG(@QLmeici*sIJtz;$@Kj|hF3)(eNk=drZ`3cximnx8<2#d^asNYni&|S zA6WtPjVJ@?-KT7&ZzlaF@G3>VMx#Bt6AgNg7N*a^3eRB_ULf({Ig;n-DkRR4`hmV0 zc%7cT6btO5hr}Gj0VZiS+}MpbFhw)Uqfr=*a>&ORs}!R!c;RPsO<%w?aKDu`t-pOm zx9-<%8F@1!M*-8633v-LP1c59xj`9IPm$F`RrU*XvqtiSrko{V0E>#QfWs!bLWA(e z_84TAViI7(^eQ$n4vCjSo%#_yXHZC#JX{BXq$2=k_B*}b? zH{rBlPPJi@X`>l}pf-*RdrUl($axK#Z2+|65r=CGzoU10`~ue#P&zhX8}4}21$EN? zTMaqUNY>Ock9TlOSCyxK$9Jj1xbz`fq;nLrsL=;ySngk0j9sA5xI!W%5)n1TX`7+B zCW#zAAZR-6nmQXoH$H5tep|Bx`m_DdkUfK${2s}~Pv~hiOiG9B>-}9Y_#L_)@ew66 WFprn$ouyGP`Z1E~rqj_+2H-EQy2NMz literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IncomingState$DisconnectListener.class b/out/production/IOIOLib/ioio/lib/impl/IncomingState$DisconnectListener.class new file mode 100644 index 0000000000000000000000000000000000000000..7c7cf08407c87fcd0711b57e06c6a8fec280961f GIT binary patch literal 254 zcmaKnu?oUK5JYEVOk#{6wzd}9c#VIc2m!$&V1J2+TsZF}7yUR3KfsR?R|`Q9o1JAD z-pt+~*BgKZ1~HNteL}X^zH-*8s#SYJXFA&v(!!maO0Bg~gi&rQchvS!w6az6T3%#~ zj4;yA6W+9>wQ$l2f&AA!`!C$AFoDgU2(3j#UmGc&+?2B5Zx*P08>XS59XwehqzgCiJcRDC;j4+OPM>EBB#m+@7N=sP&=?DOV a=U#E@6Grge=3)Gq0b-}IBM2cTLG%JWtU!4H literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/IncomingState$InputPinState.class b/out/production/IOIOLib/ioio/lib/impl/IncomingState$InputPinState.class new file mode 100644 index 0000000000000000000000000000000000000000..0bc3cc3ea124e8cf07650fc6d4f5d690ee055a7d GIT binary patch literal 1836 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

$m!z5~VH2a%sxi5FO}Qw`K39&AmJN`v&*+ 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 Q*l)gS9{SV*wJ=!u8<^(MIRF3v literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/ModuleAllocator.class b/out/production/IOIOLib/ioio/lib/impl/ModuleAllocator.class new file mode 100644 index 0000000000000000000000000000000000000000..658e0f0ad1d45822f793a75321c57e296a832e07 GIT binary patch literal 3051 zcmZ`*T~iZR7=AVhY*?Zw2q+&KP%9)rtX0|?L=jO_gIGhch^;PU39FlI+-xZH+tz-! zcfF~X&UAX&cBYDy8Qbgrk6!k^)0x&jC%gHAaC7#Y_q^wQp7-mV{o}u1p8`0JZxkFx zLdLWL4_<4)A z5`5!klDwMYdPcjPPtR-CwD3rPkbp6xTDn-fLZ7{)=Oi46>!xl-41GSLr?W=HAvxx7 zHZ8Jg-WnSTZMBJ!gm6skS3$03i?HFE2e%8}nc4xUtzJ7S?R|5x+B=@P7>V|6v#X@l z6(<;sl0;28rP*;kXG_@E7wfO-2BRhE5_VN=iW3wc-XyB+frK3iTV1#_sb&jVlCdmd zXgjp+Y;@4$ZTZ!ymZh%BAg9Q-dfQpvS*&FzFcMn(T%fA5m*7vkZN&Po2!63I=%=L_ znwoRljb%e8S;9)f%v%fEd0mw4o=vqlB)TzxLA)hlceyjCElp#0ij9>3p2Lx<-HU2& zsjwTukpRLN2;ej>2<0I$J41qHQ)41FB4Yup;%!DhfOqh&P`)DLy#U_F2NDKL4WnlD zh_J{Dx|2k;3#mGM~spW}<7yOk*j;7h^#E4(YAw~Qa- z4U$rgF)Ni%YZ<$Oq*6?ngY`AT5)EcdJGiRZ!D7~v61q#y*SalO`em@G`P;m%B4;dKRkiP)-9)Kqkv{o#TeDQ#WZv6~Ckro2 z%$3u6bD4HgDsEJ5g)UUXxxUg9OG}%}>=yrmnXy$p!`rH>bYpC-x+r@1z#ity?B#pO zZh?e8t~}`HnoUx*X1{Pxri}eUod{R=;Nw}KC$t7Bv;og-cn#i1@Nr%@yN3ElkV6BH z;QyIQUL57v#>Za#3ixmWyD-d0{Y3=v5}v0t=orH>yucOBQtt!-#cY`H9_oURzau%$ zQ$@lrb2f;R90jd7?Fd>*DEtHs18YzOzNdgM{ycyv8Zc6Usgy7kVnz!Hii;^Mk8H8r z`2>x%ET5+3Guv1`h0!X@inw*$P=3p=;M}``03){}?mgAj@eq5$T~Dxc9ZeowyYG>H zc=lKLCu;dBVmS^!&Y=kt=-@Yq3ng@g(HAAGEsVa2|r`1()fM5$c!+XWK+%DkrbJ?!}E-FTPGt%`Wz+J z$=~R9op^;sbcrxdiG0rxim*(Fet~ZtyCr;wo((k5ZlHzX-_zXs7;W71^Ya+(YuNjn zqq$GQIyxl$j?TD{gxAr<+;A#$+RbUfO{ds93W1uTGuP=dxT7!V sl}`)an;SF9rqq~<6obFSXz3L^CreE-NuHvVMZu8gQBGgw)Pt-414ReE9smFU literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/PinFunctionMap.class b/out/production/IOIOLib/ioio/lib/impl/PinFunctionMap.class new file mode 100644 index 0000000000000000000000000000000000000000..3e72b53d404d4fde11f20631609986fb93825fb6 GIT binary patch literal 1953 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 literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/SocketIOIOConnection.class b/out/production/IOIOLib/ioio/lib/impl/SocketIOIOConnection.class new file mode 100644 index 0000000000000000000000000000000000000000..a1b4090881461a450dbe23a2b4666050b3435ba4 GIT binary patch literal 2949 zcmbVOOK?+F82(Ok+na`vmKJDv8jweu&;|rWTi&6SK>C1&K0qwD$)&w*dT&T>+9Jq9 z#n-~MuyIBfY+T5U6b5Ew0CnNQwOf~NT{r{7sNcCauR3*foX-3w=bZoikMH~c|Mtf} z9()U67e4f16OPs5WyGcEk)l_MJ}LTrIF1wY*MN$I54AYv#Yry)eHg;9iV+_IIOWA@ zxxVGa86V!psEV_4Kk9`h^~O{reOQi^7rGDUFz&^KJU67hNiU}4qqG#$QkW_%6&V%h z1*$Vv)*clQF#$EFXJ_;*cTMq0ZAOcjx*ZvC&IYXHlx}xQ9p@KymR0B!ZnmHbcnYKQzXFFR51(c|j z(go_`hN<`Fr^obcLK{o-q#ohGjBGMPee*xQJ_kz^rE2-Bz~nLcr4^-kR)8Pd(cwo6TKxzi?8i2=`Oz*#1Z^sEe%Q$Su?1TN z+DqVS86%<>^N*CVjaxapl&Zk;#r%@!$0D=*_Db3xmpN;0iw z^1k!mlWw#RxCT_<|G68mK^b29r61lB~;hHlzH**=CQV=h;d zAJ-+BUFi1XO&k%}SR(8nyFsAd$2IDqO4X-4w4k&eWzan7Zbz}Ctkz(yduofW-VIFSaFmY8hD8Z9ZC zkFgXxz?o#lDOLA3+BgN1X)DJt_WUPL6~0Ruc1rg?64|5Ya@sg;Eid|ZpeO{n08jUf z;p*q}TAHoDqSC#Kc4w;`qLt^RB6H?oAUBb>QyigggJT1~B%2_x88v8-eaUZ7m26;V zWe+t2h3BE( zh4+qQXD8)Gcqw;6q0L&(iU3DNBkeZR@;ZJGH{(@GV5MuFyVtm*AMD2K^eylPI(Wwz zs*cl2HSeB>M&eIG-$1#6B@ao4NDsQ_px*+^bmm&-g)n#P6o;Ns>4rj!`l;n zx=m`;J6hDJn#VF`z@rA|sARK&m!5ev7EMbVHI9wm@YA+Ow{a;R8tHi=6IQ5NeFN*I zxgXHvT3vA)OM7W{W!rr;4e_kT)$q6)()0q2@MARJKog-`)v$UVYnT;Zuf30TLo$T$ zJ*66_%-`>+Q4IoA)6p@T&I5M>l`97cjuVi?^R<)Ao+BQS9kIUJ*( zF?x#Q8hU8G7oVb!UXRmnf}T&{76$MY1{uLHV>rzyM({mO;U}EIFZ|ErSDa-;8lEBP zWD;UDw^${ejK@RG;;(DWYcJ0PBYs|}kbV4p5P=tHRI#7m%>&P&yudDQV(#XUii3Z$ z0X!3$EZ$pXSp`o?JdJ7rYO^gq6bs6YjF973EF+o-*QI9FCK$_Yn_0RK# z#eU7OS8{xr=i6Dno*^$69JGS8v$cSc;3*v3Bu3E+jFzI>dq$?*PXXq~f$z2x$#b(T z)cc07*QoWQR;xx$qPPmaDFuxbBGDEieet24Btx7!ohh>u3;rfw z1V!+{AK;G??`$^63WjCp-gEDnGxy$^U%!9+1n>myI%?RAv5f29yAk1Lgj*4s4DqRz zP7LHHalpWO^T12)I0b@tFBrl+-;Y3EiZ8L1O7BbuW47IKq3x>76)Z)$bcqr^!K2#KG^v#H?eQu@4 zWw7Q;U|8Lqx`~l`vd2dsgkwm0S_|7%JkJH?A1peyS=~(aMib$Dj|@w#wja*GOzlYQ z$fAx)cMp&FN1k96YY9@^O%P!v!aau0f|2}lB17s`GR5^I+Z`T>k&Dn`$f^=M%A9tM zcGf5*#4%JPw+^7mv3TJ3lv;UXJ7QLQj&^^)z-yy9)9dTjLlsGBv zS#Q(S&xG;;{VC4T?gn|=gncCL-2VpF`HtXA!8uQBNF3lfF3`F@W8oq$6C!@0Mo$%2 zaJAHWOdP)>>U_mgboiOv0DpyE6++33QVIpwC|K8UiEM-THEM31{1CTsCtUdh*37(( literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl$SpiResult.class b/out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl$SpiResult.class new file mode 100644 index 0000000000000000000000000000000000000000..3b80384c708e88fa73ff312aacf947aa216d3a96 GIT binary patch literal 1146 zcmaJ>+foxj5IvKGtO<+6sDNM)A>0D8D4<9Xk$_dH3Q$Fm2YIk2n<*Jsc2m0(FTdiu z<+B!Gl@ES^U*cD&Jxd4%Egmw{J$snI!j~fhhx)f%^<`U-0VtR}AbWLtB+APIhE>g(7NC2H9zbOi6muvm9Bm{2ShQYB*k-ID7I}EXcR}~DMCFzQd`e8-*+q~k?NxJ0O+}Yv2 z)PCbIri)-m5a*T%>W*SCi>@pDg2RJAP-yfr&TR7@)fv;>QLeXKsx93$Lv&1+)KOO4 zK3M0q25EBboh@ogdTwA~#=tB?vh3A;TRfLxr7aVf+UIY$i4?AxNF!t7DmqP==rAy6 z;vwb@ESSh+-o&B~KS73J_>z&H7tN5;$t{PwudU6>zOa=68g!<4o7d#I9@(=I#m|hX z7N9t5%PM#@LtA%P@&eUtm!bchujrD*e!Zqd^)EnQGvmK+fu2I3xDxb&+GwPTL>;-H z&a+COd~VbHgK(hP5SKUblp))i`u|YUf3;XHY;J6<6}Hz_NmVT;31sgH`=G(v)y&i~ zA8M}|2&=zHfxGm@B*D;*D1A|+A+0GbC~YY%G5HbtrE#55H^_QHzQ%UuCXT^!UlGYo z9wYiW1m2|eY8alO#It12p^MH2POqRFz2wp5Ff|LUKJp?|$Zce3*AzDGIyRI$LhJ*& zX=6ud`-1pKBy%S)KK=fw&rWbf(?+3b(}>Z!Kne2bqc=B*rI6Y@P1T_8Crpge_u>v& lak2)8IznjO=MZku-b)$vpGXhgY{xVn#Pz?)V?0{!`2)po4Hy6b literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl.class b/out/production/IOIOLib/ioio/lib/impl/SpiMasterImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..bcb182d2f0664ac7af70db8dfeadaf00b328f203 GIT binary patch literal 5806 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 SSR~3cJAq^DFX8*~Nc6vuu7HIA literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/impl/UartImpl.class b/out/production/IOIOLib/ioio/lib/impl/UartImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..19fda393c6130d3e5c82f05933da0f7da6caf492 GIT binary patch literal 2692 zcma)7YjYE26n@^&WRvZ-lu(L7X%P|96bK^VrHH+2B&DS-g;KF@lcg+dcjNAcoAfxQP#SEaM{$W)dqpx=_?nf+e80#E?x) znwwbFa9es?_U_2?U1=N*YZ^QazJ^dipBlNoJTo$OX<}YMUZD zny!T9N;nt#mbo@WK-(>PYqf)iTMk~SSQRVpHk&6d*sdL3ROrjJ80V+?qr0JeK0mOa z&^G3kEQQ?#+qKAd#q#IP6^AS7f>$)11=F`>USDhrZ`*;w3oW2m8F&OrJPGP)i-uc; zc%%pWNFxQUE*oW@cu=&;p-pWyR1}Po8Je?J(X#JZC51$0X|%>!))it)qx2WpkI1$y zuw0rb4)+!AnD@*arOi(_04ZU|Txb^WPMPH>7Ul*i6df<%kzE;)!YJ86(Q{p^7>c{j zRV!>#RbhW-U<-Pi+`DPod|`~g$+mfiJbHYq?D^qHsbov2rZZZ(b<6S@Lnex@bLC-Z z1+&(g$vbpcDa)K!@r%}^E!Wbqsr4y|(!dGaQ^-7TCeizL(@iu1x^EzZ0p`qhlh*VS z(+LAv3>tU^M+_X3=D0KuFl68%&T4pM;1hhR;WGoD;|qnoJKPB?X3PDT_)5dq28QvC zfpKy0EeZ;I8eGh>%?r&>8~6?d1CwI%y)-|FT?^-tl_2!ZVmNCBk#-t>R5;bZis~(2 zuPCNPXdNAAN=+Z83nL59rCrGHo_|dS!smcq*#@n)1nL%vYO*c-M9u zg?7HZrHAvL+!uvzq2HW6c!?jLL;UxlABXvYIlz@8P)d6Z<63oWMz*ImOwpi1P>JvV$8?*}oB6%ytcLpluy-&Jv3o(AJU6?&Cr#duSbc zws#%vk9j199NRuvZ`B9lVLt+&x=!L5nk-(HUOjnuIwe6S?CFI@zUq2dmiqJ323?_nfRE{U`QbdmI6DG1xA`iv&GU zcw?MTa&;Wtn4k>rMijDy?54Y6j6`Jm8)W($Wcur5Mv0{%Hm6}s=jHN+s>l3G#1t6M zZlGJ@u3{g%cojXuRftxxpPe52E#fUpdKE9SYj0X==aQ&ZqkW7z0hdUyfObqVaV|5# zrkO@Fq&`di=P-t=Q5Z%P^mv`T5N$*3beb&rNY+_iWG~tpWO;y|N$=p+-E>CbFY??C zdRuBjHR`B}lD${Q%GI&r#7X`^&|0!3A_vP&hb8SKsTA^fe}}{I*2AS84_~4Nwfq{P zE6JjiL~yW*-mMU7>1DHm?nEFxHN(b@rYNFRWQ;-z<7s@%KFv`dT$B?@R&ESIBKbdt Cichfs literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/util/AbstractIOIOActivity$IOIOThread.class b/out/production/IOIOLib/ioio/lib/util/AbstractIOIOActivity$IOIOThread.class new file mode 100644 index 0000000000000000000000000000000000000000..534264e70b56e95c8ff5ed51a94bcc7f1c4349c6 GIT binary patch literal 3884 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 Y9vs$vRxP+3UY)(5%csYcHb)2U71~vI>Hq)$ literal 0 HcmV?d00001 diff --git a/out/production/IOIOLib/ioio/lib/util/SocketIOIOConnectionDiscovery.class b/out/production/IOIOLib/ioio/lib/util/SocketIOIOConnectionDiscovery.class new file mode 100644 index 0000000000000000000000000000000000000000..f187532670c978fe7c1c8d0dcbf252dc80081ae2 GIT binary patch literal 1208 zcmbtTU2oD*7=8|4g|51R+uZ!#1TDj@e#eAmH<%?PWF%H+(5q5T@XXSZQkL+uypial ziMReJ<9k{L)Zo1EqUZFyU(frzA3uM6{SM$Mo~uaXj)E-(+bZs&sGy|ao`U--GSF2d zP+r0gDheJb*k#D<3s(dO3`xCw%#f;i9nP@a5H3F&_S)QkZM7Ye6dImwImebSEjMxg7}4eJKXEcgp=yl_A^Zf!XIaxo+x> z6YJE9{A!-#MAlWAOUCDep%XByFSe12SW=_@d18e)xCCR+>XeLMbF9ID6ZETvQTPAg z5)U+GQH;waK=pvA0gTsP{0*>5fiLY5b5ke?mtkfoFUOFBtIjS`i68X zd4^0YpZ_sN)*K`E1!@9sW$+|q@W@F+k+P5g>rs#i0EHvTRRY=|T?8&A*GY1NBnjN4 T?^gJC8`tPoNs}PUP2_$98Ad=9 literal 0 HcmV?d00001 From d95eb28caab32d0dbeb2a4560d73b7c733d43e54 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sun, 22 Feb 2015 19:43:18 -0700 Subject: [PATCH 040/112] Theoretical Best Lap Added, Painting of Main Display Listviews --- PitsideConsole/PitsideConsole.sln | 138 +++--- PitsideConsole/PitsideConsole/LapReceiver.cpp | 7 +- .../PitsideConsole/PitsideConsole.cpp | 466 ++++++++++++++---- .../PitsideConsole/PitsideConsole.rc | 34 +- 4 files changed, 473 insertions(+), 172 deletions(-) diff --git a/PitsideConsole/PitsideConsole.sln b/PitsideConsole/PitsideConsole.sln index ac1ffb8..963ccb9 100644 --- a/PitsideConsole/PitsideConsole.sln +++ b/PitsideConsole/PitsideConsole.sln @@ -1,63 +1,75 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual C++ Express 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PitsideConsole", "PitsideConsole\PitsideConsole.vcxproj", "{5091EEA3-E98B-4748-BF4D-6B9D281B7931}" - ProjectSection(ProjectDependencies) = postProject - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B} = {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArtLib", "ArtLib\ArtLib.vcxproj", "{D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}" -EndProject -Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "PitsideConsole_", "Release\PitsideConsole_.exe", "{F69D9218-3460-4995-99F5-393C45152E4F}" - ProjectSection(DebuggerProjectSystem) = preProject - PortSupplier = 00000000-0000-0000-0000-000000000000 - Executable = E:\gitroot\wifilapper\PitsideConsole\Release\PitsideConsole_.exe - RemoteMachine = ARTNEW - StartingDirectory = E:\gitroot\wifilapper\PitsideConsole\Release - Environment = Default - LaunchingEngine = 00000000-0000-0000-0000-000000000000 - LaunchSQLEngine = No - AttachLaunchAction = No - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Mixed Platforms = Debug|Mixed Platforms - Debug|Win32 = Debug|Win32 - Debug|x86 = Debug|x86 - Release|Mixed Platforms = Release|Mixed Platforms - Release|Win32 = Release|Win32 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Win32.ActiveCfg = Debug|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Win32.Build.0 = Debug|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|x86.ActiveCfg = Debug|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Mixed Platforms.Build.0 = Release|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Win32.ActiveCfg = Release|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Win32.Build.0 = Release|Win32 - {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|x86.ActiveCfg = Release|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Win32.ActiveCfg = Debug|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Win32.Build.0 = Debug|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|x86.ActiveCfg = Debug|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Mixed Platforms.Build.0 = Release|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Win32.ActiveCfg = Release|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Win32.Build.0 = Release|Win32 - {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|x86.ActiveCfg = Release|Win32 - {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|Win32.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|x86.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Mixed Platforms.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Win32.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Release|x86.ActiveCfg = Debug|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PitsideConsole", "PitsideConsole\PitsideConsole.vcxproj", "{5091EEA3-E98B-4748-BF4D-6B9D281B7931}" + ProjectSection(ProjectDependencies) = postProject + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B} = {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArtLib", "ArtLib\ArtLib.vcxproj", "{D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}" +EndProject +Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "PitsideConsole_", "Release\PitsideConsole_.exe", "{F69D9218-3460-4995-99F5-393C45152E4F}" + ProjectSection(DebuggerProjectSystem) = preProject + PortSupplier = 00000000-0000-0000-0000-000000000000 + Executable = E:\gitroot\wifilapper\PitsideConsole\Release\PitsideConsole_.exe + RemoteMachine = ARTNEW + StartingDirectory = E:\gitroot\wifilapper\PitsideConsole\Release + Environment = Default + LaunchingEngine = 00000000-0000-0000-0000-000000000000 + LaunchSQLEngine = No + AttachLaunchAction = No + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ListViewSample", "..\..\Listview\listview.vcxproj", "{7F220758-9B47-5000-54A5-7D8FB7872E62}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x86 = Debug|x86 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Win32.ActiveCfg = Debug|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|Win32.Build.0 = Debug|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Debug|x86.ActiveCfg = Debug|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Mixed Platforms.Build.0 = Release|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Win32.ActiveCfg = Release|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|Win32.Build.0 = Release|Win32 + {5091EEA3-E98B-4748-BF4D-6B9D281B7931}.Release|x86.ActiveCfg = Release|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Win32.ActiveCfg = Debug|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|Win32.Build.0 = Debug|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Debug|x86.ActiveCfg = Debug|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Mixed Platforms.Build.0 = Release|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Win32.ActiveCfg = Release|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Win32.Build.0 = Release|Win32 + {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|x86.ActiveCfg = Release|Win32 + {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|Win32.ActiveCfg = Debug|x86 + {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|x86.ActiveCfg = Debug|x86 + {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Mixed Platforms.ActiveCfg = Debug|x86 + {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Win32.ActiveCfg = Debug|x86 + {F69D9218-3460-4995-99F5-393C45152E4F}.Release|x86.ActiveCfg = Debug|x86 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Win32.ActiveCfg = Debug|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Win32.Build.0 = Debug|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|x86.ActiveCfg = Debug|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Mixed Platforms.Build.0 = Release|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Win32.ActiveCfg = Release|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Win32.Build.0 = Release|Win32 + {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|x86.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index de18068..34d6f6b 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -945,12 +945,7 @@ DWORD LoadFromSQLiteThreadProc(LPVOID pvParam) return 0; } -void LoadFromSQLite -( - LPCTSTR lpszSQL, - int iRaceId, - ILapReceiver* pRecv -) +void LoadFromSQLite( LPCTSTR lpszSQL, int iRaceId, ILapReceiver* pRecv ) { DASSERT(iRaceId >= 0); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 0d09ab4..61afb64 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -487,12 +487,81 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Return the modified DevMode structure. return pDevMode; } +/////////////////////////////////////////////////////////////////////////////////// +// Tentative code for Custom Draw of ListViews implementation + + LRESULT ProcessCustomDraw (LPARAM lParam, INT i_Color) + { + LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; + + switch(lplvcd->nmcd.dwDrawStage) + { + case CDDS_PREPAINT : //Before the paint cycle begins + //request notifications for individual listview items + return CDRF_NOTIFYITEMDRAW; + + case CDDS_ITEMPREPAINT: //Before an item is drawn + { + return CDRF_NOTIFYSUBITEMDRAW; + } + break; + + case CDDS_SUBITEM | CDDS_ITEMPREPAINT: //Before a subitem is drawn + { + // switch(lplvcd->iSubItem) + switch(i_Color) + { + case 0: + { + // Black letters, Light Blue background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(150,255,255); + return CDRF_NEWFONT; + } + break; + + case 1: + { + // Red background, white letters + lplvcd->clrText = RGB(255,255,255); + lplvcd->clrTextBk = RGB(240,55,23); + return CDRF_NEWFONT; + } + break; + + case 2: + { + // Green background, black letters + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(155,255,80); + return CDRF_NEWFONT; + } + break; + case 3: + { + // Blue background, white letters + lplvcd->clrText = RGB(255,255,255); + lplvcd->clrTextBk = RGB(20,20,220); + return CDRF_NEWFONT; + } + break; + } + + } + } + return CDRF_DODEFAULT; + } + +///////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////// HWND hWnd_AllData; // AllData window control handle HWND AD_hWnd; // AllData listview control handle LVITEM p_ADlvi; // Listview global pointer for Hot Laps HWND hWndShowSplits; // Show Sectors window control handle HWND HC_ShowSplits; // Handle to the Splits listview control + BOOL b_GreyColor; // Switch for painting listviews with alternating lines of color + INT i_SubItemBest, i_SubItemWorst; LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -510,12 +579,12 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) static WINDOWPLACEMENT w_SectorTimesWindow; // Save the location for the Sector Times display window ::FormatTimeMinutesSecondsMs((float)(timeGetTime() - tmLast) / 1000, szLap, NUMCHARS(szLap) ); swprintf(szLap, _tcslen(szLap) - 2, L"%s", szLap); // Remove the fractional time - swprintf(szTemp, NUMCHARS(szTemp), L"Current Lap: %s", szLap); + swprintf(szTemp, NUMCHARS(szTemp), L"Current Lap: %s", szLap); // Final string to show current lap time SendMessage(hWndIp, WM_SETTEXT, 0, (LPARAM)szTemp); switch(uMsg) { - case WM_INITDIALOG: + case WM_INITDIALOG: { m_hWnd = hWnd; hWndShowSplits = NULL; @@ -655,58 +724,12 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return FALSE; } + // Left/Middle mouse button activates a modal window that dispalys all of the data for a given point in a table case WM_MBUTTONDOWN: - { - // Middle mouse button activates a modal window that dispalys all of the data for a given point in a table - DLGPROC ShowAllData = NULL; - if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing - { - // Create the window for displaying all of the data points for the selected laps - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&InitCtrlEx); - hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, ShowAllData); - AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // Hot Laps listview - SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); - - // Set up the AllData list box columns - vector lstCols; - vector lstWidths; - lstCols.push_back(L"Data Channel"); - lstCols.push_back(L"Lap 1"); - lstCols.push_back(L"Lap 2"); - lstCols.push_back(L"Lap 3"); - lstCols.push_back(L"Lap 4"); - lstCols.push_back(L"Lap 5"); - lstCols.push_back(L"Lap 6"); - lstCols.push_back(L"Lap 7"); - lstCols.push_back(L"Lap 8"); - lstCols.push_back(L"Lap 9"); - lstCols.push_back(L"Lap 10"); - lstWidths.push_back(130); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - - m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize and show the listview - ShowWindow(hWnd_AllData, SW_SHOW); - } - - UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); - return TRUE; - } case WM_MBUTTONDBLCLK: case WM_LBUTTONDBLCLK: { - if ( GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY) ) // If the window showing all of the lap data is present, let's kill it + if ( GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY) && uMsg != WM_MBUTTONDOWN ) // If the window showing all of the lap data is present, let's kill it { if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) { @@ -718,6 +741,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } else // If the window showing all of the lap data isn't there, let's create it { + // INT_PTR CALLBACK ShowAllData; DLGPROC ShowAllData = NULL; if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing { @@ -726,8 +750,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; InitCommonControlsEx(&InitCtrlEx); - hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, ShowAllData); - AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // Hot Laps listview + hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, (DLGPROC)ShowAllData); + AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // All Data listview control +// RECT rcClient; +// GetClientRect (AD_hWnd, &rcClient); +// AD_hWnd = CreateWindowEx(WS_EX_TOPMOST, WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT, 5, 20, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, AD_chWnd, NULL, NULL, NULL); +// DWORD dw = NULL; +// if (!hWnd_AllData) dw = GetLastError(); SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); // Set up the AllData list box columns @@ -755,9 +784,9 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) lstWidths.push_back(60); lstWidths.push_back(60); lstWidths.push_back(60); - - m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize and show the listview - ShowWindow(hWnd_AllData, SW_SHOW); + + m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize the listview + ShowWindow(hWnd_AllData, SW_SHOW); // Show the listview } UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); @@ -837,6 +866,119 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } break; } // end switch on wParam + + LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam; + switch (pnm->hdr.code) // Switch for ListView coloring and painting routines + { + case NM_CUSTOMDRAW: + { + LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; + INT i_Color = 0; + switch (wParam) + { + case IDC_XAXIS: + case IDC_YAXIS: + // if(pnm->hdr.hwndFrom == HC_ShowSplits &&pnm->hdr.code == NM_CUSTOMDRAW) + // if(pnm->hdr.hwndFrom == hWnd) + { + i_Color = 1; + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + // return ProcessCustomDraw(lParam); + return TRUE; + } + // else if( pnm->hdr.hwndFrom == hWnd_AllData) + case IDC_ALLDATADISPLAY: + { + i_Color = 2; + SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + return TRUE; + } + case IDC_SHOW_SECTORS: + { + i_Color = 2; + SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + return TRUE; + } + // else if( pnm->hdr.hwndFrom == hWndShowSplits) + case IDC_LAPS: + { + i_Color = 3; + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + return TRUE; + } + case IDC_DATAVALUES: + { + i_Color = 3; + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + return TRUE; + } + default: + { + i_Color = 0; + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + return TRUE; + } + } + + switch(lplvcd->nmcd.dwDrawStage) + { + case CDDS_PREPAINT : + return CDRF_NOTIFYITEMDRAW; + + case CDDS_ITEMPREPAINT: + // if ( lplvcd->nmcd.lItemlParam == b_GreyColor) // Let's paint it with grey background + // if ( (int)lplvcd->nmcd.dwItemSpec%2 == b_GreyColor) // Let's paint it with grey background + if ( b_GreyColor) // Let's paint it with grey background + { + lplvcd->clrText = RGB(0,0,0); // Black text + lplvcd->clrTextBk = RGB(200,200,200); // Grey background + b_GreyColor = !b_GreyColor; + } + else + { + lplvcd->clrText = RGB(0,0,0); // Black text + lplvcd->clrTextBk = RGB(255,255,255); // White background + } + + // At this point, you can change the background colors for the item + // and any subitems and return CDRF_NEWFONT. If the list-view control + // is in report mode, you can simply return CDRF_NOTIFYSUBITEMDRAW + // to customize the item's subitems individually + + if (pnm->hdr.hwndFrom == HC_ShowSplits || pnm->hdr.hwndFrom == AD_hWnd) + { + return CDRF_NOTIFYSUBITEMDRAW; // Returns this to start the SubItem painting + } + else + { + return CDRF_NEWFONT; // No subitem painting, reduce overhead + } + + case CDDS_SUBITEM | CDDS_ITEMPREPAINT: // SubItem painting routines + if ( lplvcd->iSubItem == i_SubItemBest) // Best time/value, let's paint it with green background + { + lplvcd->clrText = RGB(0,0,0); // Black text + lplvcd->clrTextBk = RGB(20,230,20); // Green background + } + if ( lplvcd->iSubItem == i_SubItemWorst) // Worst time/value, let's paint it with green background + { + lplvcd->clrText = RGB(0,0,0); // Black text + lplvcd->clrTextBk = RGB(230,20,20); // Red background + } + + // This notification is received only if you are in report mode and + // returned CDRF_NOTIFYSUBITEMDRAW in the previous step. At + // this point, you can change the background colors for the + // subitem and return CDRF_NEWFONT. + + return CDRF_NEWFONT; + default: + return CDRF_DODEFAULT; + } + } + default: + return CDRF_DODEFAULT; + } } // end body of case WM_NOTIFY case WM_COMMAND: { @@ -1025,6 +1167,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if (!IsWindow(hWndShowSplits) && m_sfLapOpts.fDrawSplitPoints) { // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE + //INT_PTR CALLBACK ShowSplits; DLGPROC ShowSplits = NULL; // Create the window for displaying sector times for the selected laps @@ -1032,7 +1175,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; InitCommonControlsEx(&InitCtrlEx); - hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, ShowSplits); // Create resource + hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, (DLGPROC)ShowSplits); // Create resource HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window @@ -2091,24 +2234,38 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window } + // Function updates the data points in the window showing all of the data for the selected laps, activated by the middle mouse button void UpdateAllData() { // hWnd_AllData is the handle for the window we want. Let's make sure that it is displayed -// hWnd_AllData = GetWindow(m_hWnd, GW_ENABLEDPOPUP); + // Let's define some colors for the List Views to use + COLORREF d_BlackColor = RGB(0, 0, 0); // Black + COLORREF d_WhiteColor = RGB(255, 255, 255); // White + COLORREF d_RedColor = RGB(230, 20, 20); // Red + COLORREF d_GreenColor = RGB(20, 230, 20); // Green + COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey + HDC AD_Rect = GetDC(AD_hWnd); // HDC for the display control + if (GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Only execute data display functions if window is showing { // First let's get all of the information about the data points for this lap/location ListView_DeleteAllItems(AD_hWnd); // Clear the list before displaying the update - set setSelectedData = m_sfLapList.GetSelectedItemsData(); // List of highlighted laps - if(setSelectedData.size() > 0) + vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list + if(lstLaps.size() > 0) { const int cLaps = 10; // The maximum number of Laps to display Data channels for, limited by the window form int iLap = 0; // Tracking variable for which Lap we are on in the loop int iChannel = 0; // Tracking variable for which Y-Channel we are on within each lap int iTotChannel = 0; // The number of Y Data channels in the Listview +// SendMessage(AD_hWnd,WM_PAINT, (WPARAM)AD_Rect, (LPARAM)d_LGreyColor); // Start the painting routines +// EraseAlternatingRowBkgnds (AD_hWnd, AD_Rect); +// SendMessage(HC_ShowSplits,LVM_SETTEXTBKCOLOR, 0,(LPARAM)CLR_NONE); // Clear current LV background color +// SendMessage ( AD_hWnd, LVM_SETTEXTCOLOR, 0, (LPARAM)d_BlackColor); +// SendMessage(AD_hWnd,LVM_SETBKIMAGE,0,(LPARAM)(LPLVBKIMAGE)&plvbki); // Set background color of LV +// SendMessage(AD_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); // Set style // Loop through each lap and pick up all of their values for each data channel - for(set::iterator a = setSelectedData.begin(); a != setSelectedData.end(); a++) + for(vector::iterator a = lstLaps.begin(); a != lstLaps.end(); a++) { CExtendedLap* pLap = (CExtendedLap*)*a; // For each lap let's get all of the available data channels for display @@ -2169,7 +2326,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), L"Time"); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(AD_hWnd, &p_ADlvi); // For the first item line let's use the Lap Start Time for Identification + // ListView_InsertItem(AD_hWnd, &p_ADlvi); // For the first item line let's use the Lap Start Time for Identification + SendMessage(AD_hWnd, LVM_INSERTITEM, 0, (LPARAM)&p_ADlvi); p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript @@ -2178,7 +2336,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), szChannelName); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(AD_hWnd, &p_ADlvi); // Put in the Data Channel name next + // ListView_InsertItem(AD_hWnd, &p_ADlvi); // Put in the Data Channel name next + SendMessage(AD_hWnd, LVM_INSERTITEM, 0, (LPARAM)&p_ADlvi); b_LV_ChannelFound = true; } else if (iLap == 0 && !iChannel == 0 ) @@ -2190,7 +2349,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), szChannelName); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_InsertItem(AD_hWnd, &p_ADlvi); // Put in the Data Channel name next + // ListView_InsertItem(AD_hWnd, &p_ADlvi); // Put in the Data Channel name next + SendMessage(AD_hWnd, LVM_INSERTITEM, 0, (LPARAM)&p_ADlvi); b_LV_ChannelFound = true; } else // Let's match up the Data Channel Name with those in the first lap for displaying in-line @@ -2239,7 +2399,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), lstVal); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); + // ListView_SetItem(AD_hWnd, &p_ADlvi); + SendMessage(AD_hWnd, LVM_SETITEM, 0, (LPARAM)&p_ADlvi); } else // Data Channel doesn't exist in the list. Let's add it and the value. { @@ -2250,7 +2411,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result2,NUMCHARS(szChannelName), szChannelName); p_ADlvi.pszText = result2; p_ADlvi.cchTextMax = wcslen(result2); - ListView_InsertItem(AD_hWnd, &p_ADlvi); + // ListView_InsertItem(AD_hWnd, &p_ADlvi); + SendMessage(AD_hWnd, LVM_INSERTITEM, 0, (LPARAM)&p_ADlvi); // Now populate the listview subitem with the datapoint value, if it's valid p_ADlvi.mask = LVIF_TEXT; @@ -2260,7 +2422,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), lstVal); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); + // ListView_SetItem(AD_hWnd, &p_ADlvi); + SendMessage(AD_hWnd, LVM_SETITEM, 0, (LPARAM)&p_ADlvi); iTotChannel = iTotChannel + 1; // Increment the total number of data channels in the LV } // End of data channel add test @@ -2284,7 +2447,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(szDate), szDate); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); + // ListView_SetItem(AD_hWnd, &p_ADlvi); + SendMessage(AD_hWnd, LVM_SETITEM, 0, (LPARAM)&p_ADlvi); p_ADlvi.mask = LVIF_TEXT; p_ADlvi.iItem = iChannel + 1; // Which Data Channel subscript @@ -2293,7 +2457,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), lstVal); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); + // ListView_SetItem(AD_hWnd, &p_ADlvi); + SendMessage(AD_hWnd, LVM_SETITEM, 0, (LPARAM)&p_ADlvi); } else // Populate with the data channel value { @@ -2304,7 +2469,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) swprintf(result,NUMCHARS(result), lstVal); p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); - ListView_SetItem(AD_hWnd, &p_ADlvi); + // ListView_SetItem(AD_hWnd, &p_ADlvi); + SendMessage(AD_hWnd, LVM_SETITEM, 0, (LPARAM)&p_ADlvi); } } } // End Data Channel checking loop @@ -2349,19 +2515,87 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } } +COLORREF colorShade (COLORREF c, float fPercent) +// create a darker shade (by fPercent %) of a given colour +{ + return RGB ((BYTE) ((float) GetRValue (c) * fPercent / 100.0), + (BYTE) ((float) GetGValue (c) * fPercent / 100.0), + (BYTE) ((float) GetBValue (c) * fPercent / 100.0)); +} + +void EraseAlternatingRowBkgnds (HWND hWnd, HDC hDC) +// re-draw row backgrounds with the appropriate background colour +{ + COLORREF d_BlackColor = RGB(0, 0, 0); // Black + COLORREF d_WhiteColor = RGB(255, 255, 255); // White + COLORREF d_RedColor = RGB(230, 20, 20); // Red + COLORREF d_GreenColor = RGB(20, 230, 20); // Green + COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey + RECT rect; // row rectangle + POINT pt; + int iItems, + iTop; + HBRUSH brushCol1, // 1st colour + brushCol2; // 2nd colour + +// create coloured brushes + brushCol1 = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); + brushCol2 = CreateSolidBrush (colorShade (GetSysColor (COLOR_WINDOW), 90.0)); +// get horizontal dimensions of row + GetClientRect (hWnd, &rect); +// number of displayed rows + iItems = ListView_GetCountPerPage (hWnd); +// first visible row + iTop = ListView_GetTopIndex (hWnd); + ListView_GetItemPosition (hWnd, iTop, &pt); + + for (int i=iTop ; i<=iTop+iItems ; i++) + { +// set row vertical dimensions + rect.top = pt.y; + ListView_GetItemPosition (hWnd, i+1, &pt); + rect.bottom = pt.y; +// fill row with appropriate colour + FillRect (hDC, &rect, (i % 2) ? brushCol2 : brushCol1); + } + +// cleanup + DeleteObject (brushCol1); + DeleteObject (brushCol2); +} + void UpdateSectors() { // Update the Sector Times display // The idea here is to get the sector positions and iTime from sfLapOpts, then for each highlighted // Lap run through the Ref Lap Time/Distance array and interpolate the iTime at the equivalent distance // Coding is similar to TimeSlip + // Let's define some colors for the List Views to use + COLORREF d_BlackColor = RGB(0, 0, 0); // Black + COLORREF d_WhiteColor = RGB(255, 255, 255); // White + COLORREF d_RedColor = RGB(230, 20, 20); // Red + COLORREF d_GreenColor = RGB(20, 230, 20); // Green + COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey + LVBKIMAGE plvbki={0}; // Set background image to black if ( m_pReferenceLap != NULL && m_sfLapOpts.fDrawSplitPoints ) // First, let's make sure that we have a Reference Lap, or let's not perform this { HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + HDC HC_Rect = GetDC(hWndShowSplits); // HDC for the display control ListView_DeleteAllItems(HC_ShowSplits); // Clear the list before displaying the update const int cSectors = 9; // The maximum number of Sectors to display, gated by display area const int MaxLaps = 9; // Maximum number of laps to display + struct i_BestSectors + { + int iItem; + int iSubItem; + } + i_BestSectors[cSectors + 1] = {NULL}; // Initialize the Best Sectors array + float i_TheoreticalBestLap[cSectors + 1]; // +1 For the final Split Point + for (int a = 0; a < cSectors + 1; a++) + { + i_TheoreticalBestLap[a] = 999999; // Initialize the Theorectical Best Lap + } int w = 0; // Lap tracker for Sector display int s = 0; // Sector tracker for Listview @@ -2376,6 +2610,15 @@ void UpdateSectors() TCHAR szLapString[50][512] = {NULL}; TCHAR szString[50][512] = {NULL}; TCHAR szSectorTime[MAX_PATH] = {NULL}; // String containing the formatted sector time + float dSectorTime = 0; // Initialize the Sector Times variable + BOOL b_LineColor = false; // Flag for making alternating rows different colors + +// SendMessage(HC_ShowSplits,LVM_SETTEXTBKCOLOR,0,(LPARAM)CLR_NONE); // Clear current LV background color +// SendMessage ( HC_ShowSplits,LVM_SETTEXTCOLOR,0,(LPARAM)d_BlackColor); +// SendMessage(HC_ShowSplits,WM_PAINT,0,(LPARAM)CLR_NONE); // Start the painting routines + SendMessage(HC_ShowSplits,LVM_SETBKIMAGE,0,(LPARAM)(LPLVBKIMAGE)&plvbki); // Set background color of LV + SendMessage(HC_ShowSplits,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); // Set style +// EraseAlternatingRowBkgnds (HC_ShowSplits, HC_Rect); // Lap Loop // Now loop through the lap list, compute the sector times and store them in SplitPoints[] @@ -2437,7 +2680,7 @@ void UpdateSectors() // this is the estimated time for the previous lap at this position if(dEstimatedElapsedTime >= 0) { - float dSectorTime = dEstimatedElapsedTime - (double)iLapStartTime; + dSectorTime = dEstimatedElapsedTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's build the Sector times string // Now that we have computed the Sector Time, let's put it in the Sector times string if ( dSectorTime > 1 ) // 1 used for roundoff error @@ -2457,7 +2700,7 @@ void UpdateSectors() else { const int iLastTime = lstLapPoints[x-1].iTime; - float dSectorTime = iLastTime - (double)iLapStartTime; + dSectorTime = iLastTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's build the Sector times string // Now that we have computed the Sector Time, let's put it in the Sector times string if ( dSectorTime > 1 ) // 1 used for roundoff error @@ -2477,7 +2720,7 @@ void UpdateSectors() { // We've reached the end of the loop. Dump the last point as the last sector time, if other conditions failed const int iLastTime = lstLapPoints[lstLapPoints.size()-1].iTime; - float dSectorTime = iLastTime - (double)iLapStartTime; + dSectorTime = iLastTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's put it in the Sector times string if ( dSectorTime > 1 ) // 1 used for roundoff error { @@ -2502,11 +2745,55 @@ void UpdateSectors() p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); ListView_SetItem(HC_ShowSplits, &p_ADlvi); + if (dSectorTime < i_TheoreticalBestLap[s] ) // Save sector information if this is the fastest + { + i_BestSectors[s].iItem = w; + i_BestSectors[s].iSubItem = s; + i_TheoreticalBestLap[s] = dSectorTime; + } } // End Sector Loop w++; // Increment "w" counter and do the next lap if (w >= MaxLaps) break; // Stop building these if we already have as many as we need. } // Lap Loop end + + // Now let's load the Listview with the Best Theorectical Lap information + float f_TheoreticalBestLap = 0.0f; + for (int t = 1; t <= cSectors; t++) + { + f_TheoreticalBestLap = f_TheoreticalBestLap + i_TheoreticalBestLap[t]; + } + TCHAR szLap[MAX_PATH]; + wchar_t result[MAX_PATH] ; + p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; + p_ADlvi.iItem = w; // Which Lap subscript + p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) + p_ADlvi.lParam = 0; + ::FormatTimeMinutesSecondsMs(f_TheoreticalBestLap/1000, szLap, NUMCHARS(szLap) ); + swprintf(result,NUMCHARS(result), L"Theoretical Best: %s", szLap ); + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_InsertItem(HC_ShowSplits, &p_ADlvi); // Using the lap time stamp/string for its name + + for (int c = 1; c <= cSectors; c++) // Now let's populate the sector times for Best Theoretical Lap + { + // Insert the item into the Listview + p_ADlvi.mask = LVIF_TEXT; + p_ADlvi.iItem = w; // Which Lap subscript + p_ADlvi.iSubItem = c; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.lParam = c; + if ( i_TheoreticalBestLap[c] > 1 ) // 1 used for roundoff error + { + swprintf( result,NUMCHARS(result), L"%4.2f", i_TheoreticalBestLap[c] / 1000 ); + } + else + { + swprintf( result,NUMCHARS(result), L"", NULL); + } + p_ADlvi.pszText = result; + p_ADlvi.cchTextMax = wcslen(result); + ListView_SetItem(HC_ShowSplits, &p_ADlvi); + } } } @@ -2520,6 +2807,7 @@ void UpdateSectors() HWND hWndDataValues = GetDlgItem(m_hWnd, IDC_DATAVALUES); // Get the handle for the control ListView_DeleteAllItems(hWndDataValues); // Clear the list before displaying the update const int cLabels = 10; // The maximum number of Value Data channels to display, gated by display area + int i_WarningCoord[cLabels][3] = {NULL}; // Coordinates in the Data Channels display ListView for painting routines bool m_Warning = false; // Flag for showing dialog of Value display to indicate statistics are outside of bounds TCHAR m_szYString[512] = {NULL}; TCHAR m_szWarningChannel[MAX_PATH] = {NULL}; @@ -2577,10 +2865,21 @@ void UpdateSectors() flMax = flMaxTemp; } ////////////////////////////////////////// - if (flMax > m_sfLapOpts.m_PlotPrefs[u].fMaxValue || flMin < m_sfLapOpts.m_PlotPrefs[u].fMinValue) + if (flMax > m_sfLapOpts.m_PlotPrefs[u].fMaxValue) { m_Warning = true; // An alarm has been triggered! Save the channel name and post a warning dialog. - GetDataChannelName(eChannel,m_szWarningChannel,NUMCHARS(m_szWarningChannel)); + // Save the ListView coordinates for painting of this value + i_WarningCoord[w][2] = 1; // Maximum value exceeded + GetDataChannelName(eChannel,m_szWarningChannel,NUMCHARS(m_szWarningChannel)); // Get the failing channel name + // Build the failing channels string for output + swprintf(m_szYString,NUMCHARS(m_szYString),L"%s\n%s",m_szYString, m_szWarningChannel); + } + else if (flMin < m_sfLapOpts.m_PlotPrefs[u].fMinValue) + { + m_Warning = true; // An alarm has been triggered! Save the channel name and post a warning dialog. + // Save the ListView coordinates for painting of this value + i_WarningCoord[w][1] = -1; // Minimum value exceeded + GetDataChannelName(eChannel,m_szWarningChannel,NUMCHARS(m_szWarningChannel)); // Get the failing channel name // Build the failing channels string for output swprintf(m_szYString,NUMCHARS(m_szYString),L"%s\n%s",m_szYString, m_szWarningChannel); } @@ -2608,12 +2907,9 @@ void UpdateSectors() swprintf(w_szMin, NUMCHARS(w_szMin), L"S", szMin); swprintf(w_szMax, NUMCHARS(w_szMax), L"S", szMax); - // Now assemble the string to display (max of 5) + // Now display the results in the ListView (max of cLabels) if (w < cLabels) { - - // Display the Data Value Channels - // Let's load the Listview row titles with this result p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) @@ -2623,7 +2919,6 @@ void UpdateSectors() p_ADlvi.cchTextMax = wcslen(szChannelName); ListView_InsertItem(hWndDataValues, &p_ADlvi); // Using a null string for the name - wchar_t result[MAX_PATH] = {NULL}; // Null string // Insert the item into the Listview p_ADlvi.mask = LVIF_TEXT; @@ -2635,7 +2930,7 @@ void UpdateSectors() p_ADlvi.cchTextMax = wcslen(result); ListView_SetItem(hWndDataValues, &p_ADlvi); - // Insert the item into the Listview + // Insert the item into the Listview p_ADlvi.mask = LVIF_TEXT; p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) p_ADlvi.iSubItem = 2; // Which Sector subscript incremented to be positioned correctly @@ -2645,7 +2940,6 @@ void UpdateSectors() p_ADlvi.cchTextMax = wcslen(result); ListView_SetItem(hWndDataValues, &p_ADlvi); - // Insert the item into the Listview p_ADlvi.mask = LVIF_TEXT; p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) @@ -2680,13 +2974,13 @@ void UpdateSectors() // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); -// HWND hWndWarning = NULL; UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; + HWND hWndWarning = NULL; UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; HWND hwndGoto = NULL; // Window handle of dialog box DLGPROC Warning = NULL; // DLGPROC Warning(HWND hwndGoto, UINT uWarningMsg, WPARAM wWarningMsg, LPARAM lWarningMsg); if (!IsWindow(hwndGoto)) { - hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, Warning ( hwndGoto, uWarningMsg, wWarningParam, lWarningParam ) ); + hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)Warning ( m_hWnd, uWarningMsg, wWarningParam, lWarningParam ) ); swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); @@ -2700,9 +2994,9 @@ void UpdateSectors() } } } -/* + // Processing routine for Data Channel warning dialog -LRESULT WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +INT_PTR CALLBACK WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { @@ -2735,7 +3029,7 @@ LRESULT WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } return FALSE; } -*/ + void UpdateDisplays() { m_sfLapPainter.Refresh(); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 88b1b7e..34de404 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -6,7 +6,7 @@ IDB_SPLASHIMAGE BITMAP "res\\splash.bmp" IDD_DLGFIRST DIALOG 100, 100, 745, 350 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX CAPTION "Pitside" FONT 8, "MS Shell Dlg" MENU IDM_OPTIONS @@ -38,7 +38,7 @@ END // Dialog box for sending messages to the car IDD_DLGMESSAGE DIALOG 280, 200, 200, 85 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Pit->Car Message" FONT 8, "MS Shell Dlg" BEGIN @@ -55,7 +55,7 @@ END // Dialog box for setting sector split points IDD_SETSPLITPOINTS DIALOG 50, 50, 400, 300 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_TABSTOP +STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_TABSTOP CAPTION "Set Sector Split Points" FONT 10, "MS Shell Dlg" BEGIN @@ -76,7 +76,7 @@ END // Dialog box for displaying all data for a given point IDD_ALLDATADISPLAY DIALOG 250, 75, 400, 250 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_CAPTION +STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Data Point Information" FONT 10, "MS Shell Dlg" BEGIN @@ -85,17 +85,17 @@ BEGIN END // Dialog box for displaying sector split times -IDD_SHOWSECTORS DIALOG 250, 75, 375, 99 +IDD_SHOWSECTORS DIALOG 250, 75, 380, 99 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Sector Times" FONT 9, "MS Shell Dlg" BEGIN - CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,375,96 + CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,380,96 END // dialog for selecting which race in a DB we want to use IDD_SELECTRACE DIALOG 150, 200, 200, 200 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | DS_SETFONT | WS_CAPTION | WS_SYSMENU CAPTION "Select one or more race sessions to load" FONT 8, "MS Shell Dlg" BEGIN @@ -106,7 +106,7 @@ END // dialog for selecting which race sessions in DB we want to use for T&S IDD_SELECTSESSIONS DIALOG 150, 200, 200, 200 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | DS_SETFONT | WS_CAPTION | WS_SYSMENU CAPTION "Select T&S Race Sessions (MAX = 50)" FONT 8, "MS Shell Dlg" BEGIN @@ -117,7 +117,7 @@ END // dialog for displaying T&S data results IDD_TIMINGSCORING DIALOG 150, 200, 500, 390 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_MINIMIZEBOX CAPTION "Best Laps & Race Standings from Selected Sessions" FONT 8, "MS Shell Dlg" BEGIN @@ -137,7 +137,7 @@ END // dialog for choosing Start/End times for T&S IDD_RACE_RERUN DIALOG 250, 250, 200, 120 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU CAPTION "Enter Time Markers" FONT 8, "MS Shell Dlg" BEGIN @@ -151,7 +151,7 @@ END // dialog for selecting which race in a DB we want to edit IDD_SELECTRACEEDIT DIALOG 150, 200, 200, 213 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU CAPTION "Select race(s) to edit" FONT 8, "MS Shell Dlg" BEGIN @@ -164,7 +164,7 @@ END // confirm dialog for editing races in a DB IDD_RACEEDITCONFIRM DIALOG 350, 200, 250, 125 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU CAPTION "**WARNING**" FONT 8, "MS Shell Dlg" BEGIN @@ -175,7 +175,7 @@ END // About... dialog with hyperlink now IDD_ABOUT DIALOG 300, 125, 250, 325 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN @@ -187,7 +187,7 @@ END // name input dialog for renaming races in a DB IDD_RACENAMECHANGE DIALOG 350, 200, 200, 85 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU CAPTION "Enter New Race Session Name" FONT 8, "MS Shell Dlg" BEGIN @@ -199,7 +199,7 @@ END // dialog for selecting plotting preferences IDD_PLOTPREFS DIALOG 250, 120, 524, 312 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX CAPTION "Choose plotting preferences" FONT 8, "MS Shell Dlg" BEGIN @@ -411,14 +411,14 @@ END IDD_PROGRESS DIALOG 250, 150, 200, 50 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT CAPTION "Working..." FONT 8, "MS Shell Dlg" BEGIN END IDD_WARNING DIALOG 300, 250, 250, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU CAPTION "*****WARNING*****" FONT 8, "MS Shell Dlg" BEGIN From fbe6df07e1d3c6d92658e3c0932dd057f2aee2ff Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sun, 22 Feb 2015 20:22:50 -0700 Subject: [PATCH 041/112] Painting functions updated, Sector times template minor update --- .../PitsideConsole/PitsideConsole.cpp | 46 +++++++++++-------- .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 61afb64..c827d6b 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -513,9 +513,9 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { case 0: { - // Black letters, Light Blue background (Default) + // Black letters, clear background (Default) lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(150,255,255); + lplvcd->clrTextBk = RGB(255,255,255); return CDRF_NEWFONT; } break; @@ -545,6 +545,15 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return CDRF_NEWFONT; } break; + + case 4: + { + // Black letters, Light Grey background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(150,255,255); + return CDRF_NEWFONT; + } + break; } } @@ -873,7 +882,14 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; - INT i_Color = 0; + enum i_Color + { + CLEAR, + RED, + GREEN, + BLUE, + LTGREY + }; switch (wParam) { case IDC_XAXIS: @@ -881,41 +897,35 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // if(pnm->hdr.hwndFrom == HC_ShowSplits &&pnm->hdr.code == NM_CUSTOMDRAW) // if(pnm->hdr.hwndFrom == hWnd) { - i_Color = 1; - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, LTGREY)); // return ProcessCustomDraw(lParam); return TRUE; } // else if( pnm->hdr.hwndFrom == hWnd_AllData) case IDC_ALLDATADISPLAY: { - i_Color = 2; - SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); return TRUE; } case IDC_SHOW_SECTORS: { - i_Color = 2; - SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); return TRUE; } // else if( pnm->hdr.hwndFrom == hWndShowSplits) case IDC_LAPS: { - i_Color = 3; - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); return TRUE; } case IDC_DATAVALUES: { - i_Color = 3; - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); return TRUE; } default: { - i_Color = 0; - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, i_Color)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); return TRUE; } } @@ -1163,7 +1173,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } const int cSectors = 9; // Maximum numbers of Split Times - const int MaxLaps = 7; // Maximum number of laps to display + const int MaxLaps = 8; // Maximum number of laps to display if (!IsWindow(hWndShowSplits) && m_sfLapOpts.fDrawSplitPoints) { // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE @@ -2584,7 +2594,7 @@ void UpdateSectors() HDC HC_Rect = GetDC(hWndShowSplits); // HDC for the display control ListView_DeleteAllItems(HC_ShowSplits); // Clear the list before displaying the update const int cSectors = 9; // The maximum number of Sectors to display, gated by display area - const int MaxLaps = 9; // Maximum number of laps to display + const int MaxLaps = 8; // Maximum number of laps to display struct i_BestSectors { int iItem; @@ -2594,7 +2604,7 @@ void UpdateSectors() float i_TheoreticalBestLap[cSectors + 1]; // +1 For the final Split Point for (int a = 0; a < cSectors + 1; a++) { - i_TheoreticalBestLap[a] = 999999; // Initialize the Theorectical Best Lap + i_TheoreticalBestLap[a] = 999999.0f; // Initialize the Theorectical Best Lap } int w = 0; // Lap tracker for Sector display int s = 0; // Sector tracker for Listview diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 34de404..a95bc52 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -90,7 +90,7 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Sector Times" FONT 9, "MS Shell Dlg" BEGIN - CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,380,96 + CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,380,99 END // dialog for selecting which race in a DB we want to use From 50773b550f0cb94e803ca21461e5a008dd9de80a Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sun, 22 Feb 2015 21:48:55 -0700 Subject: [PATCH 042/112] 2.004.0001: Code cleanup on painting and Theoretical Best Lap --- .../PitsideConsole/PitsideConsole.cpp | 126 +++++++++--------- .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 62 insertions(+), 66 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index c827d6b..e418d1e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -489,77 +489,73 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } /////////////////////////////////////////////////////////////////////////////////// // Tentative code for Custom Draw of ListViews implementation - - LRESULT ProcessCustomDraw (LPARAM lParam, INT i_Color) - { - LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; + LRESULT ProcessCustomDraw (LPARAM lParam, INT i_Color) + { + LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; - switch(lplvcd->nmcd.dwDrawStage) - { - case CDDS_PREPAINT : //Before the paint cycle begins - //request notifications for individual listview items - return CDRF_NOTIFYITEMDRAW; + switch(lplvcd->nmcd.dwDrawStage) + { + case CDDS_PREPAINT : // Before the paint cycle begins + return CDRF_NOTIFYITEMDRAW; // Request notifications for individual listview items - case CDDS_ITEMPREPAINT: //Before an item is drawn - { - return CDRF_NOTIFYSUBITEMDRAW; - } - break; + case CDDS_ITEMPREPAINT: // Before an item is drawn + { + return CDRF_NOTIFYSUBITEMDRAW; // Request notifications for individual listview SubItems + } + break; - case CDDS_SUBITEM | CDDS_ITEMPREPAINT: //Before a subitem is drawn - { - // switch(lplvcd->iSubItem) - switch(i_Color) - { - case 0: - { - // Black letters, clear background (Default) - lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(255,255,255); - return CDRF_NEWFONT; - } - break; + case CDDS_SUBITEM | CDDS_ITEMPREPAINT: // Before a subitem is drawn + { + // switch(lplvcd->iSubItem) + switch(i_Color) + { + case 0: + { + // Black letters, clear background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,255); + return CDRF_NEWFONT; + } + break; - case 1: - { - // Red background, white letters - lplvcd->clrText = RGB(255,255,255); - lplvcd->clrTextBk = RGB(240,55,23); - return CDRF_NEWFONT; - } - break; - - case 2: - { - // Green background, black letters - lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(155,255,80); - return CDRF_NEWFONT; - } - break; - case 3: - { - // Blue background, white letters - lplvcd->clrText = RGB(255,255,255); - lplvcd->clrTextBk = RGB(20,20,220); - return CDRF_NEWFONT; - } - break; + case 1: + { + // Red background, white letters + lplvcd->clrText = RGB(255,255,255); + lplvcd->clrTextBk = RGB(240,55,23); + return CDRF_NEWFONT; + } + break; - case 4: - { - // Black letters, Light Grey background (Default) - lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(150,255,255); - return CDRF_NEWFONT; - } - break; - } - - } - } - return CDRF_DODEFAULT; + case 2: + { + // Green background, black letters + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(155,255,80); + return CDRF_NEWFONT; } + break; + case 3: + { + // Blue background, white letters + lplvcd->clrText = RGB(255,255,255); + lplvcd->clrTextBk = RGB(20,20,220); + return CDRF_NEWFONT; + } + break; + case 4: + { + // Black letters, Light Grey background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(240,240,255); + return CDRF_NEWFONT; + } + break; + } + } + } + return CDRF_DODEFAULT; + } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index a95bc52..92ed924 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -180,7 +180,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.003.0034\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0001\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 8903dc8058fce726b50f3ec132b5eb80b9b15f17 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Thu, 26 Feb 2015 07:32:58 -0700 Subject: [PATCH 043/112] 2.004.0001: Phone Orientation feature added Some additional coding for painting listviews... --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 11 +- PitsideConsole/PitsideConsole/LapPainter.cpp | 40 ++++- .../PitsideConsole/PitsideConsole.cpp | 167 +++++++++--------- .../PitsideConsole/PitsideConsole.rc | 7 + PitsideConsole/PitsideConsole/resource.h | 5 + 5 files changed, 142 insertions(+), 88 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index b4fc9fe..1632088 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -85,11 +85,19 @@ enum LAPSORTSTYLE SORTSTYLE_BYTIMEOFRACE, // sort by the time the lap was done: 2:31pm comes before 4:45pm (well... on the same day) SORTSTYLE_BYLAPTIME, // sort by lap time. 1:12.15 comes before 1:13.45 }; + +enum e_Orientation +{ + VERTICAL_LANDSCAPE, + VERTICAL_PORTRAIT, + FLAT_LANDSCAPE, + FLAT_PORTRAIT +}; struct LAPSUPPLIEROPTIONS { public: - LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false),bShowReferenceLap(true) + LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false),bShowReferenceLap(true),e_Orientation(VERTICAL_LANDSCAPE) { } UNIT_PREFERENCE eUnitPreference; @@ -111,6 +119,7 @@ struct LAPSUPPLIEROPTIONS bool bTractionCircle; // Whether or not to display the Traction Circle display bool bSmoothYesNo; // Whether or not to smooth the accelerometer graphs bool bShowReferenceLap; // Whether or not the Reference Lap is displayed + int e_Orientation; // Phone orientation when installed in the car }; diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 0c71d0c..888778a 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -165,8 +165,9 @@ void CLapPainter::DrawSelectLapsPromptShort() const glScalef(1.0f, 0.90f, 1.0f); // Keep the same scaling - KDJ glOrtho(0, RECT_WIDTH(&rcClient),0, RECT_HEIGHT(&rcClient),-1.0,1.0); - DrawText(0.0, 70, "Click X-Accel"); - DrawText(0.0, 40, "to display"); + DrawText(0.0, 80, "Click "); + DrawText(0.0, 50, "X/Y/Z-Accel"); + DrawText(0.0, 20, "to display"); glPopMatrix(); } @@ -912,13 +913,40 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } - void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHighlightXAxis) { vector lstLaps = m_pLapSupplier->GetLapsToShow(); - + // Let's check on which orientation the phone is in so that the Traction Circle is displayed correctly + // Vertical/Landscape: X = X-Accel, Y=Y-Accel; Vertical/Portrait: X = Z-Accel, Y=Y-Accel; Flat/Landscape: X=X-Accel, Y=Z-Accel; Flat/Portrait: X=Z-Axis, Y=X-Axis DATA_CHANNEL eX; - eX = DATA_CHANNEL_X_ACCEL; + DATA_CHANNEL DataY; + switch (sfLapOpts.e_Orientation) + { + case VERTICAL_LANDSCAPE: + { + eX = DATA_CHANNEL_X_ACCEL; + DataY = DATA_CHANNEL_Y_ACCEL; + break; + } + case VERTICAL_PORTRAIT: + { + eX = DATA_CHANNEL_Z_ACCEL; + DataY = DATA_CHANNEL_Y_ACCEL; + break; + } + case FLAT_LANDSCAPE: + { + eX = DATA_CHANNEL_X_ACCEL; + DataY = DATA_CHANNEL_Z_ACCEL; + break; + } + case FLAT_PORTRAIT: + { + eX = DATA_CHANNEL_Z_ACCEL; + DataY = DATA_CHANNEL_X_ACCEL; + break; + } + } set setY; map mapMinY, mapMinYTemp; map mapMaxY, mapMaxYTemp; @@ -938,8 +966,6 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f DATA_CHANNEL eDataX = eX; const IDataChannel* pDataX = pLap->GetChannel(eDataX); if(!pDataX || !pDataX->IsValid() || pDataX->GetData().size() <= 0) continue; - - DATA_CHANNEL DataY = DATA_CHANNEL_Y_ACCEL; { ////////////////////////////////// b_TransformY = false; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index e418d1e..26c068b 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -574,8 +574,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { return 0; } -// TranslateMessage(&msg); // Keyboard input handlers. Needs a MSG type variable, which Pitside doesn't support right now -// DispatchMessage(&msg); // Update and show Current Lap Time TCHAR szTemp[512], szLap[512]; @@ -632,43 +630,11 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return 0; } case WM_CLOSE: + { DestroyWindow(hWnd); EndDialog(hWnd,0); return 0; -/* case WM_KEYDOWN: // Process to capture keystrokes. Currently doesn't work, probably needs - { - switch(wParam) - { - case MK_RIGHT | MK_CONTROL: // Ctrl + Right cursor - case MK_RIGHT: // Ctrl + Right cursor - if(GetAsyncKeyState(VK_CONTROL)) - { - short iDist = HIWORD(wParam); - m_sfLapOpts.iZoomLevels += 1; - UpdateUI(UPDATE_MAP); - return 0; - } - case MK_LEFT | MK_CONTROL: // Ctrl + Right cursor - case MK_LEFT: // Ctrl + Right cursor - if(GetAsyncKeyState(VK_CONTROL)) - { - short iDist = HIWORD(wParam); - m_sfLapOpts.iZoomLevels -= 1; - UpdateUI(UPDATE_MAP); - return 0; - } - case MK_SPACE: - { - m_sfLapOpts.flWindowShiftX = 0; - m_sfLapOpts.flWindowShiftY = 0; - m_sfLapOpts.iZoomLevels = 0; // Reset the zoom level - UpdateUI(UPDATE_MAP); - return 0; - } - // more keys here - } - return 0; - } */ + } case WM_MOUSEWHEEL: { short iDist = HIWORD(wParam); @@ -886,6 +852,21 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) BLUE, LTGREY }; +// if( hWndShowSplits = GetWindow( m_hWnd, IDD_SHOWSECTORS ) ) // Create resource +// HC_ShowSplits = GetDlgItem( hWndShowSplits, IDC_SHOW_SECTORS ); // Let's get the handle for the display control in this window +// if( hWnd_AllData = GetWindow( m_hWnd, IDD_ALLDATADISPLAY ) ) +// AD_hWnd = GetDlgItem( hWnd_AllData, IDC_ALLDATADISPLAY ); // All Data listview control + + if( pnm->hdr.hwndFrom == AD_hWnd) // First see if this is from the All Data Display LV control + { + SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + return TRUE; + } + else if( pnm->hdr.hwndFrom == HC_ShowSplits) // See if this is from the Sector Display LV control + { + SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + return TRUE; + } switch (wParam) { case IDC_XAXIS: @@ -897,31 +878,30 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // return ProcessCustomDraw(lParam); return TRUE; } - // else if( pnm->hdr.hwndFrom == hWnd_AllData) - case IDC_ALLDATADISPLAY: + // else if( pnm->hdr.hwndFrom == hWndShowSplits) + case IDC_LAPS: { - SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); return TRUE; } - case IDC_SHOW_SECTORS: + case IDC_DATAVALUES: { - SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); return TRUE; } - // else if( pnm->hdr.hwndFrom == hWndShowSplits) - case IDC_LAPS: + case IDC_ALLDATADISPLAY: // First see if this is from the All Data Display LV control { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); return TRUE; } - case IDC_DATAVALUES: + case IDC_SHOW_SECTORS: // See if this is from the Sector Display LV control { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); return TRUE; } default: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, BLUE)); return TRUE; } } @@ -1031,6 +1011,30 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) UpdateUI(UPDATE_MAP | UPDATE_MENU); return TRUE; } + case ID_OPTIONS_VERTICAL_LANDSCAPE: + { + m_sfLapOpts.e_Orientation = VERTICAL_LANDSCAPE; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_VERTICAL_PORTRAIT: + { + m_sfLapOpts.e_Orientation = VERTICAL_PORTRAIT; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_FLAT_LANDSCAPE: + { + m_sfLapOpts.e_Orientation = FLAT_LANDSCAPE; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_FLAT_PORTRAIT: + { + m_sfLapOpts.e_Orientation = FLAT_PORTRAIT; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } case ID_OPTIONS_XAXIS_KM: { m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_KM; @@ -1173,9 +1177,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if (!IsWindow(hWndShowSplits) && m_sfLapOpts.fDrawSplitPoints) { // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE - //INT_PTR CALLBACK ShowSplits; DLGPROC ShowSplits = NULL; - // Create the window for displaying sector times for the selected laps INITCOMMONCONTROLSEX InitCtrlEx; InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); @@ -2910,8 +2912,8 @@ void UpdateSectors() GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flMin,szMin,NUMCHARS(szMin)); GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flMax,szMax,NUMCHARS(szMax)); // Need to convert these from char to wchar_t - swprintf(w_szMin, NUMCHARS(w_szMin), L"S", szMin); - swprintf(w_szMax, NUMCHARS(w_szMax), L"S", szMax); + swprintf(w_szMin, NUMCHARS(w_szMin), L"%S", szMin); + swprintf(w_szMax, NUMCHARS(w_szMax), L"%S", szMax); // Now display the results in the ListView (max of cLabels) if (w < cLabels) @@ -2972,35 +2974,35 @@ void UpdateSectors() { // Display a warning dialog box about an alarm being triggered. fWarnedOnce = true; - WARNING_RESULT sfResult; - CWarningDlg dlgWarning(&sfResult, m_szYString); - ArtShowDialog(&dlgWarning); - fWarnedOnce = false; -/* +// WARNING_RESULT sfResult; +// CWarningDlg dlgWarning(&sfResult, m_szYString); +// ArtShowDialog(&dlgWarning); + // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); - HWND hWndWarning = NULL; UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; + UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; HWND hwndGoto = NULL; // Window handle of dialog box - DLGPROC Warning = NULL; -// DLGPROC Warning(HWND hwndGoto, UINT uWarningMsg, WPARAM wWarningMsg, LPARAM lWarningMsg); - if (!IsWindow(hwndGoto)) - { - hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)Warning ( m_hWnd, uWarningMsg, wWarningParam, lWarningParam ) ); - swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); - HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); - SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); - ShowWindow(hwndGoto, SW_SHOW); - Sleep (5000); -// Warning( hWndWarning, m_uMsg, m_wParam, m_lParam ); - EndDialog(hwndGoto,0); - } -*/ + hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)WarningProc ( m_hWnd, uWarningMsg, wWarningParam, lWarningParam ) ); + HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); + swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); + SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); + ShowWindow(hwndGoto, SW_SHOW); + + fWarnedOnce = false; } } } } - +INT_PTR CALLBACK WarningProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(g_pUI) + { + return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); + } + return FALSE; +} +/* // Processing routine for Data Channel warning dialog INT_PTR CALLBACK WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -3008,12 +3010,12 @@ INT_PTR CALLBACK WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara { case WM_INITDIALOG: { -// TCHAR szMessage[1024] = L""; -// swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); -// HWND hWndWarning = GetDlgItem(c_hWnd, IDC_WARNING1); -// SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); + TCHAR szMessage[1024] = L""; + swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): "); + HWND hWndWarning = GetDlgItem(c_hWnd, IDC_WARNING1); + SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); MessageBeep(MB_OK); // Play a warning sound - break; + return TRUE; } case WM_COMMAND: { @@ -3025,17 +3027,17 @@ INT_PTR CALLBACK WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara return TRUE; } } - break; + return FALSE; } // end WM_COMMAND case WM_CLOSE: { EndDialog(c_hWnd,0); - break; + return TRUE; } } return FALSE; } - +*/ void UpdateDisplays() { m_sfLapPainter.Refresh(); @@ -3055,6 +3057,7 @@ void UpdateDisplays() { HMENU hWndMenu = GetMenu(m_hWnd); HMENU hSubMenu = GetSubMenu(hWndMenu, 2); + HMENU hSubMenu2 = GetSubMenu(hWndMenu, 3); CheckMenuHelper(hSubMenu, ID_OPTIONS_KMH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_KMH); CheckMenuHelper(hSubMenu, ID_OPTIONS_MPH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MPH); @@ -3070,6 +3073,10 @@ void UpdateDisplays() CheckMenuHelper(hSubMenu, ID_OPTIONS_BACKGROUND, m_sfLapOpts.fColorScheme); CheckMenuHelper(hSubMenu, ID_OPTIONS_IOIO5VSCALE, m_sfLapOpts.fIOIOHardcoded); CheckMenuHelper(hSubMenu, ID_OPTIONS_ELAPSEDTIME, m_sfLapOpts.fElapsedTime); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_VERTICAL_LANDSCAPE, m_sfLapOpts.e_Orientation == VERTICAL_LANDSCAPE); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_VERTICAL_PORTRAIT, m_sfLapOpts.e_Orientation == VERTICAL_PORTRAIT); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_FLAT_LANDSCAPE, m_sfLapOpts.e_Orientation == FLAT_LANDSCAPE); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_FLAT_PORTRAIT, m_sfLapOpts.e_Orientation == FLAT_PORTRAIT); } vector GetSortedLaps(LAPSORTSTYLE eSortStyle) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 92ed924..0abd0fe 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -471,6 +471,13 @@ POPUP "&Graphing" MENUITEM SEPARATOR MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS END + POPUP "&Phone Orientation" + BEGIN + MENUITEM "Vertical/Landscape", ID_OPTIONS_VERTICAL_LANDSCAPE + MENUITEM "Vertical/Portrait", ID_OPTIONS_VERTICAL_PORTRAIT + MENUITEM "Flat/Landscape", ID_OPTIONS_FLAT_LANDSCAPE + MENUITEM "Flat/Portrait", ID_OPTIONS_FLAT_PORTRAIT + END POPUP "&Timing" BEGIN MENUITEM "Timing and Scoring", ID_TIMINGSCORING diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index 4a57200..fedba0e 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -359,4 +359,9 @@ #define IDD_ALLDATADISPLAY 480 #define IDC_ALLDATADISPLAY 481 +#define ID_OPTIONS_VERTICAL_LANDSCAPE 482 +#define ID_OPTIONS_VERTICAL_PORTRAIT 483 +#define ID_OPTIONS_FLAT_LANDSCAPE 484 +#define ID_OPTIONS_FLAT_PORTRAIT 485 + // don't put anything below this From bb4bd4d0219658f66bf58dfe405517722e8c0a07 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Thu, 26 Feb 2015 22:24:10 -0700 Subject: [PATCH 044/112] ENUM for Phone Orientation, minor code cleanup --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 4 +- .../PitsideConsole/PitsideConsole.cpp | 50 +++++++++++-------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index 1632088..2c265de 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -86,7 +86,7 @@ enum LAPSORTSTYLE SORTSTYLE_BYLAPTIME, // sort by lap time. 1:12.15 comes before 1:13.45 }; -enum e_Orientation +enum ORIENTATION // These are phone orientatino ENUMS, for setting up the Traction Circle display inside LapPainter.cpp { VERTICAL_LANDSCAPE, VERTICAL_PORTRAIT, @@ -119,7 +119,7 @@ struct LAPSUPPLIEROPTIONS bool bTractionCircle; // Whether or not to display the Traction Circle display bool bSmoothYesNo; // Whether or not to smooth the accelerometer graphs bool bShowReferenceLap; // Whether or not the Reference Lap is displayed - int e_Orientation; // Phone orientation when installed in the car + ORIENTATION e_Orientation; // Phone orientation when installed in the car }; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 26c068b..5d8d0e3 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -489,7 +489,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } /////////////////////////////////////////////////////////////////////////////////// // Tentative code for Custom Draw of ListViews implementation - LRESULT ProcessCustomDraw (LPARAM lParam, INT i_Color) + LRESULT ProcessCustomDraw (LPARAM lParam, WPARAM wParam, INT i_Color) { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; @@ -859,12 +859,12 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if( pnm->hdr.hwndFrom == AD_hWnd) // First see if this is from the All Data Display LV control { - SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); return TRUE; } else if( pnm->hdr.hwndFrom == HC_ShowSplits) // See if this is from the Sector Display LV control { - SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); return TRUE; } switch (wParam) @@ -874,34 +874,34 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // if(pnm->hdr.hwndFrom == HC_ShowSplits &&pnm->hdr.code == NM_CUSTOMDRAW) // if(pnm->hdr.hwndFrom == hWnd) { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, LTGREY)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, LTGREY)); // return ProcessCustomDraw(lParam); return TRUE; } // else if( pnm->hdr.hwndFrom == hWndShowSplits) case IDC_LAPS: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // No LV coloring for Laps list return TRUE; } case IDC_DATAVALUES: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, CLEAR)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // No LV coloring for Values Display return TRUE; } case IDC_ALLDATADISPLAY: // First see if this is from the All Data Display LV control { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); return TRUE; } case IDC_SHOW_SECTORS: // See if this is from the Sector Display LV control { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, GREEN)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); return TRUE; } default: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, BLUE)); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, BLUE)); // Color Blue if process gets here (unlikely) return TRUE; } } @@ -2496,11 +2496,10 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } } // End Lap Loop } // End Test Loop - } + } // End of Dialog present conditional return; } - float fAverage(DATA_CHANNEL eChannel, const IDataChannel* pChannel, float flVal) { // This function returns the average value for the data channel across all data points from this lap. @@ -2804,7 +2803,9 @@ void UpdateSectors() } } } - + +// virtual INT_PTR CALLBACK WarningProc(HWND, UINT, WPARAM, LPARAM); // Declarative function statement for Values Warning dialog + void UpdateValues() { // Update the data channels that are being displayed as values @@ -2891,6 +2892,12 @@ void UpdateSectors() // Build the failing channels string for output swprintf(m_szYString,NUMCHARS(m_szYString),L"%s\n%s",m_szYString, m_szWarningChannel); } + else + { + // Reset the ListView coordinates for painting of this value + i_WarningCoord[w][1] = 0; // Reset Minimum value + i_WarningCoord[w][2] = 0; // Reset Maximum value + } } else { @@ -2898,6 +2905,9 @@ void UpdateSectors() flMin=0.0f; flMax=0.0f; flAvg=0.0f; + // Reset the ListView coordinates for painting of this value + i_WarningCoord[w][1] = 0; // Reset Minimum value + i_WarningCoord[w][2] = 0; // Reset Maximum value } } @@ -2925,7 +2935,7 @@ void UpdateSectors() p_ADlvi.lParam = 0; p_ADlvi.pszText = szChannelName; p_ADlvi.cchTextMax = wcslen(szChannelName); - ListView_InsertItem(hWndDataValues, &p_ADlvi); // Using a null string for the name + ListView_InsertItem(hWndDataValues, &p_ADlvi); wchar_t result[MAX_PATH] = {NULL}; // Null string // Insert the item into the Listview @@ -2941,7 +2951,7 @@ void UpdateSectors() // Insert the item into the Listview p_ADlvi.mask = LVIF_TEXT; p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) - p_ADlvi.iSubItem = 2; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.iSubItem = 2; // Which Subitem subscript p_ADlvi.lParam = 2; swprintf(result,NUMCHARS(result), L"%S", szMax); p_ADlvi.pszText = result; @@ -2951,7 +2961,7 @@ void UpdateSectors() // Insert the item into the Listview p_ADlvi.mask = LVIF_TEXT; p_ADlvi.iItem = w; // Which Data Value subscript (Max = cLabels) - p_ADlvi.iSubItem = 3; // Which Sector subscript incremented to be positioned correctly + p_ADlvi.iSubItem = 3; // Which Subitem subscript p_ADlvi.lParam = 3; swprintf(result,NUMCHARS(result), L"%3.1f", flAvg); p_ADlvi.pszText = result; @@ -2974,10 +2984,10 @@ void UpdateSectors() { // Display a warning dialog box about an alarm being triggered. fWarnedOnce = true; -// WARNING_RESULT sfResult; -// CWarningDlg dlgWarning(&sfResult, m_szYString); -// ArtShowDialog(&dlgWarning); - + WARNING_RESULT sfResult; + CWarningDlg dlgWarning(&sfResult, m_szYString); + ArtShowDialog(&dlgWarning); +/* // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); @@ -2988,7 +2998,7 @@ void UpdateSectors() swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); ShowWindow(hwndGoto, SW_SHOW); - +*/ fWarnedOnce = false; } } From 3b95fc47428d694e0e7266943c222863a9bc625a Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sat, 28 Feb 2015 07:10:59 -0700 Subject: [PATCH 045/112] 2.004.0001: Checkbox selection enabled for multi-select listviews --- PitsideConsole/ArtLib/ArtUI.h | 94 ++++++++++++++++--- .../PitsideConsole/DlgPlotSelect.cpp | 2 +- .../PitsideConsole/DlgRaceSelect.cpp | 6 +- .../PitsideConsole/DlgRaceSelectEdit.cpp | 10 +- .../PitsideConsole/DlgSelectSessions.cpp | 6 +- .../PitsideConsole/DlgTimingScoring.cpp | 2 - PitsideConsole/PitsideConsole/LapData.h | 4 +- .../PitsideConsole/PitsideConsole.cpp | 30 +++--- 8 files changed, 111 insertions(+), 43 deletions(-) diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index 5d3498a..5614ccd 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -23,6 +23,44 @@ class ArtListBox ArtListBox() { } + // Initialization routine for Listviews with checkboxes for multiple-select options + void Init2(HWND hWnd, const vector& lstColumnHeaders, const vector& lstColWidths) + { + DASSERT(lstColumnHeaders.size() == lstColWidths.size()); + + m_hWnd = hWnd; + + m_cColumns = lstColumnHeaders.size(); + if(lstColumnHeaders.size() <= 0) // No data to display + { + RECT rc; + GetClientRect(m_hWnd,&rc); + + LVCOLUMN LvCol = {0}; + LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + LvCol.pszText=L""; + LvCol.cx=RECT_WIDTH(&rc) - 30; + + SendMessage(m_hWnd,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum + } + else // Data to display + { + LVCOLUMN LvCol = {0}; + LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + + for(unsigned int x = 0; x < lstColumnHeaders.size(); x++) + { + TCHAR szTemp[MAX_PATH]; + wcsncpy_s(szTemp,lstColumnHeaders[x].c_str(),NUMCHARS(szTemp)); + LvCol.cx=lstColWidths[x]; + LvCol.pszText=szTemp; + SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum + } + } + ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); + } + + // Original Listview initialization function for non-checkbox Listviews void Init(HWND hWnd, const vector& lstColumnHeaders, const vector& lstColWidths) { DASSERT(lstColumnHeaders.size() == lstColWidths.size()); @@ -56,7 +94,7 @@ class ArtListBox SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum } } - ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); + ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); } void AddString(LPCTSTR lpszString, int iData) { @@ -150,31 +188,33 @@ class ArtListBox int ixItem = -1; do { - ixItem = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixItem, LVNI_ALL); + ixItem = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixItem, LVNI_ALL); // Search sequentially through the LV index if(ixItem >= 0) { LVITEM sfItem = {0}; sfItem.iItem = ixItem; sfItem.iSubItem = 0; - sfItem.stateMask = LVIS_SELECTED; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; sfItem.mask = LVIF_STATE | LVIF_PARAM; - if(ListView_GetItem(m_hWnd,&sfItem)) + if(ListView_GetItem(m_hWnd,&sfItem)) // If item is exists, let's check it against the setData set for a match { - DASSERT(sfItem.lParam); + DASSERT(sfItem.lParam); if(setData.find(sfItem.lParam) != end(setData)) { - // found the item in the selection set, so make it selected + // found the item in the selection set, so make it selected and checkbox checked sfItem.state |= LVIS_SELECTED; - sfItem.stateMask |= LVIS_SELECTED; + sfItem.stateMask |= LVIS_SELECTED | LVIS_STATEIMAGEMASK; ListView_SetItem(m_hWnd,&sfItem); + ListView_SetCheckState(m_hWnd,ixItem,true); // Check the checkbox } else { // this item is not supposed to be selected sfItem.state &= ~LVIS_SELECTED; - sfItem.stateMask &= ~LVIS_SELECTED; + sfItem.stateMask &= ~LVIS_SELECTED | LVIS_STATEIMAGEMASK; ListView_SetItem(m_hWnd, &sfItem); + ListView_SetCheckState(m_hWnd,ixItem,false); // Uncheck the checkbox } } else @@ -184,19 +224,20 @@ class ArtListBox } } while(ixItem >= 0); } - set GetSelectedItemsData() const + + set GetSelectedItemsData() const // GetSelectedItems for single select Listviews { set ret; int ixSelect = -1; do { - ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); + ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); if(ixSelect >= 0) { LVITEM sfItem = {0}; sfItem.iItem = ixSelect; sfItem.iSubItem = 0; - sfItem.stateMask = LVIS_SELECTED; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; sfItem.mask = LVIF_STATE | LVIF_PARAM; if(ListView_GetItem(m_hWnd,&sfItem)) @@ -211,12 +252,41 @@ class ArtListBox return ret; } + + set GetSelectedItemsData2() const // New version to capture the checkbox selections for multi-select Listviews + { + set ret; + int ixSelect = -1; + int iCount = 0; + int iTotCount = ListView_GetItemCount(m_hWnd); // Returns the number of items in the Listview + ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); + for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items + { + LVITEM sfItem = {0}; + sfItem.iItem = iCount; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + // found an item! + ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam + if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked lap + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); + } + else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) && ListView_GetItemState(m_hWnd,sfItem.iItem,LVIS_SELECTED)) // Check box is not checked, let's unhighlight the item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, 0, LVIS_SELECTED); // Deselect the highlighted lap + } + } + return ret; // Return the set of items + } private: HWND m_hWnd; int m_cColumns; // used for debugging }; - #include "gl/gl.h" #include "gl/glu.h" diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp index f4cbf4b..b09d069 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp @@ -35,7 +35,7 @@ void LoadLaps(ILapReceiver* pReceiver, int m_iRaceId) vector GetAllLaps() { - set setSelectedLaps = m_LapList.GetSelectedItemsData(); + set setSelectedLaps = m_LapList.GetSelectedItemsData2(); vector lstLaps; for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) { diff --git a/PitsideConsole/PitsideConsole/DlgRaceSelect.cpp b/PitsideConsole/PitsideConsole/DlgRaceSelect.cpp index b78efdd..be55637 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceSelect.cpp +++ b/PitsideConsole/PitsideConsole/DlgRaceSelect.cpp @@ -16,10 +16,10 @@ LRESULT CRaceSelectDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar lstCols.push_back(L"Date"); lstCols.push_back(L"Race Name"); lstCols.push_back(L"Laps"); - lstWidths.push_back(75); + lstWidths.push_back(85); lstWidths.push_back(160); lstWidths.push_back(40); - sfListBox.Init(GetDlgItem(hWnd,IDC_RACE),lstCols,lstWidths); + sfListBox.Init2(GetDlgItem(hWnd,IDC_RACE),lstCols,lstWidths); // gotta set up the list vector lstRaces = m_pLapDB->GetRaces(); @@ -50,7 +50,7 @@ LRESULT CRaceSelectDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar { case IDOK: { - set setSelected = sfListBox.GetSelectedItemsData(); + set setSelected = sfListBox.GetSelectedItemsData2(); if (setSelected.size() > 0) { // Need to find all Race Sessions selected diff --git a/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp b/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp index f96e91e..a52b594 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp +++ b/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp @@ -21,10 +21,10 @@ LRESULT CRaceSelectEditDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lstCols.push_back(L"Date"); lstCols.push_back(L"Race Name"); lstCols.push_back(L"Laps"); - lstWidths.push_back(75); + lstWidths.push_back(85); lstWidths.push_back(160); lstWidths.push_back(40); - sfListBox.Init(GetDlgItem(hWnd,IDC_RACE),lstCols,lstWidths); + sfListBox.Init2(GetDlgItem(hWnd,IDC_RACE),lstCols,lstWidths); // gotta set up the list vector lstRaces = m_pLapDB->GetRaces(); @@ -55,7 +55,7 @@ LRESULT CRaceSelectEditDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM { case IDOK: { - set set = sfListBox.GetSelectedItemsData(); + set set = sfListBox.GetSelectedItemsData2(); if(set.size() == 1) { MessageBox(NULL,L"Only 1 race session selected\n\nNo changes were made",L"", MB_OK); @@ -84,7 +84,7 @@ LRESULT CRaceSelectEditDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM if(!sfResult.fCancelled) { // Okay they are serious and really want to merge these race sessions - set setSelected = sfListBox.GetSelectedItemsData(); + set setSelected = sfListBox.GetSelectedItemsData2(); if(setSelected.size() == 1) { // Do nothing, only 1 race session chosen @@ -130,7 +130,7 @@ LRESULT CRaceSelectEditDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM if(!sfResult.fCancelled) { // Okay they are serious and really want to rename these race sessions - set setSelected = sfListBox.GetSelectedItemsData(); + set setSelected = sfListBox.GetSelectedItemsData2(); if(setSelected.size() == 0) { // Do nothing, no race sessions chosen diff --git a/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp b/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp index 30deda2..75b20c6 100644 --- a/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp +++ b/PitsideConsole/PitsideConsole/DlgSelectSessions.cpp @@ -15,10 +15,10 @@ LRESULT CDlgSelectSessions::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lstCols.push_back(L"Date"); lstCols.push_back(L"Race Name"); lstCols.push_back(L"Laps"); - lstWidths.push_back(75); + lstWidths.push_back(85); lstWidths.push_back(160); lstWidths.push_back(40); - sfListBox.Init(GetDlgItem(hWnd,IDC_RACE),lstCols,lstWidths); + sfListBox.Init2(GetDlgItem(hWnd,IDC_RACE),lstCols,lstWidths); // gotta set up the list vector lstRaces = m_pLapDB->GetRaces(); @@ -49,7 +49,7 @@ LRESULT CDlgSelectSessions::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM { case IDOK: { - set setSelected = sfListBox.GetSelectedItemsData(); + set setSelected = sfListBox.GetSelectedItemsData2(); if(setSelected.size() > 0) { // Need to find all Race Sessions selected diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index 40538f2..6a49712 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -210,9 +210,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l scoringLstWidths.push_back(30); scoringLstWidths.push_back(145); scoringLstWidths.push_back(95); -// TS_hWnd = GetDlgItem(hWnd,IDC_RACESCORING); // Race Timing listview sfListBox.Init(TS_hWnd,scoringLstCols,scoringLstWidths); -// tmStartRace = NULL; // No races started at window initialization HWND hWnd_Comment = GetDlgItem(hWnd, IDC_RACE_COMMENT); SetDlgItemText(hWnd, IDC_RACE_COMMENT, szTitle); diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 97510ed..bc66d46 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -129,9 +129,9 @@ static bool SetDistance(int b_KmOrLat) // Function to set X-Axis units in either static void GetStringHeaders(vector& lstCols, vector& lstWidths) { lstCols.push_back(L"Time"); - lstWidths.push_back(60); + lstWidths.push_back(73); lstCols.push_back(L"Laptime"); - lstWidths.push_back(60); + lstWidths.push_back(55); lstCols.push_back(L"Comment"); lstWidths.push_back(75); } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 5d8d0e3..2c8ac71 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -602,7 +602,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) vector lstCols; vector lstWidths; CExtendedLap::GetStringHeadersYAxis(lstCols,lstWidths); - m_sfYAxis.Init(GetDlgItem(m_hWnd, IDC_YAXIS),lstCols,lstWidths); + m_sfYAxis.Init2(GetDlgItem(m_hWnd, IDC_YAXIS),lstCols,lstWidths); } { vector lstCols; @@ -614,7 +614,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) vector lstCols; vector lstWidths; CExtendedLap::GetStringHeaders(lstCols,lstWidths); - m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); + m_sfLapList.Init2(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); } m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); m_sfSubDisplay.Init(GetDlgItem(hWnd,IDC_SUBDISPLAY)); @@ -777,7 +777,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; if(pDetails->iItem >= 0) { - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); } return TRUE; } @@ -805,21 +805,21 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) const set sel = m_sfXAxis.GetSelectedItemsData(); if(sel.size() == 1) { - m_eXChannel = (DATA_CHANNEL)*sel.begin(); + m_eXChannel = (DATA_CHANNEL)*sel.begin(); // Just take the first selected item for our choice NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; - if(pDetails->iItem >= 0) + if(pDetails->iItem >= 0) // Single select Listview, requires special handling { UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); } } - return TRUE; + return TRUE; } break; case IDC_YAXIS: switch(notifyHeader->code) { case LVN_ITEMCHANGED: - const set sel = m_sfYAxis.GetSelectedItemsData(); + const set sel = m_sfYAxis.GetSelectedItemsData2(); if(sel.size() >= 1) { m_lstYChannels.clear(); @@ -1668,7 +1668,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } case ID_DATA_DASHWARE: // Save the data to a .CSV file { - set setSelectedData = m_sfLapList.GetSelectedItemsData(); + set setSelectedData = m_sfLapList.GetSelectedItemsData2(); if(setSelectedData.size() > 0) { TCHAR szFilename[MAX_PATH]; @@ -1749,7 +1749,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case IDC_SETREFERENCE: { // they want to set a given lap as a reference lap - set setSelected = m_sfLapList.GetSelectedItemsData(); + set setSelected = m_sfLapList.GetSelectedItemsData2(); if(setSelected.size() == 1) { CExtendedLap* pNewRefLap = (CExtendedLap*)*(setSelected.begin()); @@ -1971,7 +1971,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } void UpdateUI_Internal(DWORD fdwUpdateFlags) { - set setSelectedData = m_sfLapList.GetSelectedItemsData(); + set setSelectedData = m_sfLapList.GetSelectedItemsData2(); vector laps = GetSortedLaps(m_sfLapOpts.eSortPreference); // translates our m_mapLaps into a vector sorted by time // do some memory cleanup for(int x = 0;x < laps.size(); x++) @@ -2606,7 +2606,7 @@ void UpdateSectors() int w = 0; // Lap tracker for Sector display int s = 0; // Sector tracker for Listview - set setSelected = m_sfLapList.GetSelectedItemsData(); // Get the list of highlighted lap time ID's + set setSelected = m_sfLapList.GetSelectedItemsData2(); // Get the list of highlighted lap time ID's vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list // Get the points from the Ref Lap for computation @@ -2810,7 +2810,7 @@ void UpdateSectors() { // Update the data channels that are being displayed as values // List of highlighted laps - set setSelectedData = m_sfLapList.GetSelectedItemsData(); + set setSelectedData = m_sfLapList.GetSelectedItemsData2(); if(setSelectedData.size() > 0) { HWND hWndDataValues = GetDlgItem(m_hWnd, IDC_DATAVALUES); // Get the handle for the control @@ -3146,7 +3146,7 @@ void UpdateDisplays() void ApplyDriverNameToSelectedLaps(ILapReceiver* pLapDB) { - set setSelectedData = m_sfLapList.GetSelectedItemsData(); + set setSelectedData = m_sfLapList.GetSelectedItemsData2(); for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) { // the ints of this set are actually pointers to CExtendedLap objects @@ -3185,7 +3185,7 @@ void UpdateDisplays() virtual vector GetAllLaps() const override { - set setSelectedLaps = m_sfLapList.GetSelectedItemsData(); + set setSelectedLaps = m_sfLapList.GetSelectedItemsData2(); vector lstLaps; for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) { @@ -3197,7 +3197,7 @@ void UpdateDisplays() } virtual vector GetLapsToShow() const override { - set setSelectedLaps = m_sfLapList.GetSelectedItemsData(); + set setSelectedLaps = m_sfLapList.GetSelectedItemsData2(); vector lstLaps; map mapFastestDriver; CExtendedLap* pFastest = NULL; From c21f188ff63b7b31b2f0e1080a8f90d83e40f3ad Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sun, 1 Mar 2015 21:19:29 -0700 Subject: [PATCH 046/112] Painting coding clean up and color refinement --- PitsideConsole/ArtLib/ArtUI.h | 4 +- PitsideConsole/PitsideConsole.sln | 12 - PitsideConsole/PitsideConsole/LapPainter.cpp | 10 +- .../PitsideConsole/PitsideConsole.cpp | 263 +++++++++++++----- 4 files changed, 203 insertions(+), 86 deletions(-) diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index 5614ccd..b5ac88b 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -57,7 +57,7 @@ class ArtListBox SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum } } - ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT); + ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS); } // Original Listview initialization function for non-checkbox Listviews @@ -94,7 +94,7 @@ class ArtListBox SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum } } - ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); + ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS, LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS); } void AddString(LPCTSTR lpszString, int iData) { diff --git a/PitsideConsole/PitsideConsole.sln b/PitsideConsole/PitsideConsole.sln index 963ccb9..74597a8 100644 --- a/PitsideConsole/PitsideConsole.sln +++ b/PitsideConsole/PitsideConsole.sln @@ -20,8 +20,6 @@ Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "PitsideConsole_", "Release\ AttachLaunchAction = No EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ListViewSample", "..\..\Listview\listview.vcxproj", "{7F220758-9B47-5000-54A5-7D8FB7872E62}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Mixed Platforms = Debug|Mixed Platforms @@ -58,16 +56,6 @@ Global {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Mixed Platforms.ActiveCfg = Debug|x86 {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Win32.ActiveCfg = Debug|x86 {F69D9218-3460-4995-99F5-393C45152E4F}.Release|x86.ActiveCfg = Debug|x86 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Win32.ActiveCfg = Debug|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|Win32.Build.0 = Debug|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Debug|x86.ActiveCfg = Debug|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Mixed Platforms.Build.0 = Release|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Win32.ActiveCfg = Release|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|Win32.Build.0 = Release|Win32 - {7F220758-9B47-5000-54A5-7D8FB7872E62}.Release|x86.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 888778a..bd3852c 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1308,7 +1308,8 @@ void CLapPainter::MakeColor(const CExtendedLap* pLap, bool RefLapFlag, float* pR *pG = RandDouble(); *pB = RandDouble(); } - while(*pR + *pG + *pB < 0.5); +// while(*pR + *pG + *pB < 0.4); + while(*pR * *pG * *pB < 0.34); glColor3d( *pR, *pG, *pB ); // Final color to use. Tells opengl to draw the following in the colour we just made up } else @@ -1319,15 +1320,16 @@ void CLapPainter::MakeColor(const CExtendedLap* pLap, bool RefLapFlag, float* pR *pG = RandDouble(); *pB = RandDouble(); } - while(*pR + *pG + *pB > 2.5); +// while(*pR + *pG + *pB > 2.6); + while(*pR * *pG * *pB > 0.35); glColor3d( *pR, *pG, *pB ); // Final color to use. Tells opengl to draw the following in the colour we just made up } // Check if this the is the Reference Lap. If so, change the color to full White/Black if (RefLapFlag && m_pLapSupplier->GetDisplayOptions().fColorScheme) // Background color is black, make Reference Lap white { - *pR = 0.95; *pG = 0.95; *pB = 0.95; + *pR = 0.90; *pG = 0.90; *pB = 0.90; } - else if (RefLapFlag) // Background color is black, make Reference Lap white + else if (RefLapFlag) // Background color is Grey, make Reference Lap Black { *pR = 0.0; *pG = 0.0; *pB = 0.0; } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 2c8ac71..cdab79d 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -351,6 +351,53 @@ void SetRaceId(int iRaceId[50]) hdc =pd.hDC; return hdc ; } + struct ICOLOR + { + int pRed; + int pGreen; + int pBlue; + }; + + // Function for setting highlighting color, making sure that there is enough contrast to a black background + ICOLOR MakeColor2(const CExtendedLap* pLap, bool RefLapFlag) + { + srand((int)pLap); // <-- makes sure that we randomize the colours consistently, so that lap plots don't change colour from draw to draw... + double pR, pG, pB; + if (m_sfLapOpts.fColorScheme) // Background color is black, let's determine the color for this lap + { + do + { + pR = RandDouble(); + pG = RandDouble(); + pB = RandDouble(); + } + while(pR * pG * pB < 0.34); + } + else + { + do + { + pR = RandDouble(); + pG = RandDouble(); + pB = RandDouble(); + } + while(pR * pG * pB > 0.35); + } + // Check if this the is the Reference Lap. If so, change the color to full White/Black + if (RefLapFlag && m_sfLapOpts.fColorScheme) // Background color is black, make Reference Lap white + { + pR = 0.90; pG = 0.90; pB = 0.90; + } + else if (RefLapFlag) // Background color is Grey, make Reference Lap Black + { + pR = 0.0; pG = 0.0; pB = 0.0; + } + ICOLOR iColor = {0}; + iColor.pRed = pR * 255; + iColor.pGreen = pG * 255; + iColor.pBlue = pB * 255; // Final color to use. + return iColor; // Final color to use. +} int copyBitmapToClipboard(char *bitmapBuffer, size_t buflen) { @@ -487,78 +534,162 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Return the modified DevMode structure. return pDevMode; } -/////////////////////////////////////////////////////////////////////////////////// -// Tentative code for Custom Draw of ListViews implementation + +// Code for Custom Draw of ListViews implementation LRESULT ProcessCustomDraw (LPARAM lParam, WPARAM wParam, INT i_Color) { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; + // Let's first set the CustomDraw color, sent in through i_Color + switch(i_Color) + { + case 0: + { + // Black letters, clear background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,255); + break; + } + case 1: + { + // Red background, white letters + lplvcd->clrText = RGB(255,255,255); + lplvcd->clrTextBk = RGB(240,55,23); + break; + } + case 2: + { + // Green background, black letters + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(155,255,80); + break; + } + case 3: + { + // Light Yellow background, black letters + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,190); + break; + } + case 4: + { + // Light Grey background, Black letters (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(240,240,255); + break; + } + case 5: + { + // Light Green background, Black letters + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(210,255,200); + break; + } + case 6: + { + // Light Red background, Black letters + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,210,255); + break; + } + case 7: + { + // Return with the color of the lap, based upon the pLap number + ICOLOR iColor = {0}; + iColor = MakeColor2( (CExtendedLap*)lParam, false); + lplvcd->clrText = RGB(iColor.pRed,iColor.pGreen,iColor.pBlue); + lplvcd->clrTextBk = RGB(255,255,255); + break; + } + } + switch(lplvcd->nmcd.dwDrawStage) { case CDDS_PREPAINT : // Before the paint cycle begins return CDRF_NOTIFYITEMDRAW; // Request notifications for individual listview items - case CDDS_ITEMPREPAINT: // Before an item is drawn - { - return CDRF_NOTIFYSUBITEMDRAW; // Request notifications for individual listview SubItems - } - break; - + return CDRF_NOTIFYSUBITEMDRAW; // Request notifications for individual listview SubItems case CDDS_SUBITEM | CDDS_ITEMPREPAINT: // Before a subitem is drawn { - // switch(lplvcd->iSubItem) - switch(i_Color) + switch(wParam) { - case 0: - { - // Black letters, clear background (Default) - lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(255,255,255); - return CDRF_NEWFONT; - } - break; - - case 1: + case IDC_LAPS: { - // Red background, white letters - lplvcd->clrText = RGB(255,255,255); - lplvcd->clrTextBk = RGB(240,55,23); - return CDRF_NEWFONT; + switch(lplvcd->iSubItem) + { + case 0: + { + // Black letters, clear background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,255); + return CDRF_NEWFONT; + } + case 1: + { + // Black letters, Light Grey background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(240,240,255); + return CDRF_NEWFONT; + } + case 2: + { + // Black letters, clear background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,255); + return CDRF_NEWFONT; + } + } + return CDRF_NEWFONT; // Return the font/painting color } - break; - - case 2: + case IDC_YAXIS: { - // Green background, black letters - lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(155,255,80); - return CDRF_NEWFONT; + return CDRF_NEWFONT; // Return the font/painting color } - break; - case 3: + case IDC_XAXIS: { - // Blue background, white letters - lplvcd->clrText = RGB(255,255,255); - lplvcd->clrTextBk = RGB(20,20,220); - return CDRF_NEWFONT; + return CDRF_NEWFONT; // Return the font/painting color } - break; - case 4: + case IDC_DATAVALUES: { - // Black letters, Light Grey background (Default) - lplvcd->clrText = RGB(0,0,0); - lplvcd->clrTextBk = RGB(240,240,255); - return CDRF_NEWFONT; + switch(lplvcd->iSubItem) // Paint each column a different background color + { + case 0: + { + // Black letters, clear background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,255); + return CDRF_NEWFONT; + } + case 1: + { + // Black letters, Light Grey background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(240,240,255); + return CDRF_NEWFONT; + } + case 2: + { + // Black letters, clear background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(255,255,255); + return CDRF_NEWFONT; + } + case 3: + { + // Black letters, Light Grey background (Default) + lplvcd->clrText = RGB(0,0,0); + lplvcd->clrTextBk = RGB(240,240,255); + return CDRF_NEWFONT; + } + break; + } } - break; } } } return CDRF_DODEFAULT; } -///////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////// HWND hWnd_AllData; // AllData window control handle HWND AD_hWnd; // AllData listview control handle @@ -844,19 +975,23 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; - enum i_Color + enum ICOLOR { CLEAR, RED, GREEN, - BLUE, - LTGREY + LTYELLOW, + LTGREY, + LTGREEN, + LTRED, + GLCOLOR }; // if( hWndShowSplits = GetWindow( m_hWnd, IDD_SHOWSECTORS ) ) // Create resource // HC_ShowSplits = GetDlgItem( hWndShowSplits, IDC_SHOW_SECTORS ); // Let's get the handle for the display control in this window // if( hWnd_AllData = GetWindow( m_hWnd, IDD_ALLDATADISPLAY ) ) // AD_hWnd = GetDlgItem( hWnd_AllData, IDC_ALLDATADISPLAY ); // All Data listview control + int pRed=0, pGreen=0, pBlue=0; if( pnm->hdr.hwndFrom == AD_hWnd) // First see if this is from the All Data Display LV control { SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); @@ -870,23 +1005,26 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) switch (wParam) { case IDC_XAXIS: + { + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, LTYELLOW)); + return TRUE; + } case IDC_YAXIS: // if(pnm->hdr.hwndFrom == HC_ShowSplits &&pnm->hdr.code == NM_CUSTOMDRAW) // if(pnm->hdr.hwndFrom == hWnd) { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, LTGREY)); - // return ProcessCustomDraw(lParam); + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, LTGREEN)); return TRUE; } // else if( pnm->hdr.hwndFrom == hWndShowSplits) case IDC_LAPS: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // No LV coloring for Laps list + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Let the process color columns individually return TRUE; } case IDC_DATAVALUES: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // No LV coloring for Values Display + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // Let the process color columns individually return TRUE; } case IDC_ALLDATADISPLAY: // First see if this is from the All Data Display LV control @@ -901,7 +1039,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } default: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, BLUE)); // Color Blue if process gets here (unlikely) + SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Color Light Grey if process gets here (unlikely) return TRUE; } } @@ -925,12 +1063,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) lplvcd->clrText = RGB(0,0,0); // Black text lplvcd->clrTextBk = RGB(255,255,255); // White background } - - // At this point, you can change the background colors for the item - // and any subitems and return CDRF_NEWFONT. If the list-view control - // is in report mode, you can simply return CDRF_NOTIFYSUBITEMDRAW - // to customize the item's subitems individually - if (pnm->hdr.hwndFrom == HC_ShowSplits || pnm->hdr.hwndFrom == AD_hWnd) { return CDRF_NOTIFYSUBITEMDRAW; // Returns this to start the SubItem painting @@ -951,20 +1083,15 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) lplvcd->clrText = RGB(0,0,0); // Black text lplvcd->clrTextBk = RGB(230,20,20); // Red background } + return CDRF_NEWFONT; - // This notification is received only if you are in report mode and - // returned CDRF_NOTIFYSUBITEMDRAW in the previous step. At - // this point, you can change the background colors for the - // subitem and return CDRF_NEWFONT. - - return CDRF_NEWFONT; default: return CDRF_DODEFAULT; } } default: return CDRF_DODEFAULT; - } + } // End of Listview Customdraw Notify header switch } // end body of case WM_NOTIFY case WM_COMMAND: { @@ -989,7 +1116,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return TRUE; } - case IDOK: + case IDOK: { return TRUE; } From 5afae623b2c034339f5905652454aefcdf58a7ca Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Wed, 4 Mar 2015 16:33:44 -0700 Subject: [PATCH 047/112] 2.004.0001: Final tweak on colors for data graphs, improving contrast --- PitsideConsole/PitsideConsole/LapPainter.cpp | 8 +++--- .../PitsideConsole/PitsideConsole.cpp | 26 ++++++++++--------- .../PitsideConsole/PitsideConsole.rc | 1 - 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index bd3852c..c220178 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1308,11 +1308,10 @@ void CLapPainter::MakeColor(const CExtendedLap* pLap, bool RefLapFlag, float* pR *pG = RandDouble(); *pB = RandDouble(); } -// while(*pR + *pG + *pB < 0.4); - while(*pR * *pG * *pB < 0.34); + while(*pR + *pG + *pB < 1.20f || *pR + *pG + *pB > 2.25f ); glColor3d( *pR, *pG, *pB ); // Final color to use. Tells opengl to draw the following in the colour we just made up } - else + else // Background color is light grey, keep these colors low enough alpha to provide contrast { do { @@ -1320,8 +1319,7 @@ void CLapPainter::MakeColor(const CExtendedLap* pLap, bool RefLapFlag, float* pR *pG = RandDouble(); *pB = RandDouble(); } -// while(*pR + *pG + *pB > 2.6); - while(*pR * *pG * *pB > 0.35); + while(*pR * *pG * *pB > 0.45 && *pR + *pG + *pB > 0.75 && *pR * *pG > 0.75); glColor3d( *pR, *pG, *pB ); // Final color to use. Tells opengl to draw the following in the colour we just made up } // Check if this the is the Reference Lap. If so, change the color to full White/Black diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index cdab79d..0bbcbb3 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -371,9 +371,9 @@ void SetRaceId(int iRaceId[50]) pG = RandDouble(); pB = RandDouble(); } - while(pR * pG * pB < 0.34); + while(pR + pG + pB < 1.20 || pR + pG + pB > 2.25); // Alpha conditions only } - else + else // Background is grey, find colors with enough contrast to display { do { @@ -381,12 +381,12 @@ void SetRaceId(int iRaceId[50]) pG = RandDouble(); pB = RandDouble(); } - while(pR * pG * pB > 0.35); + while(pR * pG * pB > 0.45 && pR + pG + pB < 0.75 && pR * pG > 0.75); // Combination of Alpha and color conditions } // Check if this the is the Reference Lap. If so, change the color to full White/Black if (RefLapFlag && m_sfLapOpts.fColorScheme) // Background color is black, make Reference Lap white { - pR = 0.90; pG = 0.90; pB = 0.90; + pR = 0.95; pG = 0.95; pB = 0.95; } else if (RefLapFlag) // Background color is Grey, make Reference Lap Black { @@ -613,7 +613,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { switch(wParam) { - case IDC_LAPS: +/* case IDC_LAPS: { switch(lplvcd->iSubItem) { @@ -641,7 +641,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return CDRF_NEWFONT; // Return the font/painting color } - case IDC_YAXIS: +*/ case IDC_YAXIS: { return CDRF_NEWFONT; // Return the font/painting color } @@ -975,7 +975,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; - enum ICOLOR + enum I_COLOR { CLEAR, RED, @@ -1019,7 +1019,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // else if( pnm->hdr.hwndFrom == hWndShowSplits) case IDC_LAPS: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Let the process color columns individually +// SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Let the process color columns individually return TRUE; } case IDC_DATAVALUES: @@ -1039,7 +1039,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } default: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Color Light Grey if process gets here (unlikely) +// SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Color Light Grey if process gets here (unlikely) return TRUE; } } @@ -3118,9 +3118,9 @@ void UpdateSectors() // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); - UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; +// UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; HWND hwndGoto = NULL; // Window handle of dialog box - hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)WarningProc ( m_hWnd, uWarningMsg, wWarningParam, lWarningParam ) ); + hwndGoto = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)WarningProc ); HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); @@ -3133,9 +3133,11 @@ void UpdateSectors() } INT_PTR CALLBACK WarningProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + IUI* mapDialogs; if(g_pUI) { - return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); +// return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); + return mapDialogs->DlgProc(hWnd,uMsg,wParam,lParam); } return FALSE; } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 0abd0fe..4c693ea 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -14,7 +14,6 @@ BEGIN CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 LTEXT "",IDC_DISPLAY,155,63,590,282 -// LTEXT "",IDC_SUBDISPLAY,520,0,150,63 LTEXT "",IDC_SUBDISPLAY,520,0,87,63 LTEXT "",IDC_TRACTIONCIRCLEMAP,610,0,63,63 AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 From 64133050288595b560e93fd123b8659d367637fd Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sat, 7 Mar 2015 21:14:32 -0700 Subject: [PATCH 048/112] Painting coding clean up --- .../PitsideConsole/PitsideConsole.cpp | 62 +++++++++---------- .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 0bbcbb3..c1547c7 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -843,7 +843,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } else // If the window showing all of the lap data isn't there, let's create it { - // INT_PTR CALLBACK ShowAllData; DLGPROC ShowAllData = NULL; if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing { @@ -852,13 +851,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; InitCommonControlsEx(&InitCtrlEx); - hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, (DLGPROC)ShowAllData); + hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), m_hWnd, (DLGPROC)ShowAllData); AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // All Data listview control -// RECT rcClient; -// GetClientRect (AD_hWnd, &rcClient); -// AD_hWnd = CreateWindowEx(WS_EX_TOPMOST, WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT, 5, 20, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, AD_chWnd, NULL, NULL, NULL); -// DWORD dw = NULL; -// if (!hWnd_AllData) dw = GetLastError(); SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); // Set up the AllData list box columns @@ -986,21 +980,27 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) LTRED, GLCOLOR }; -// if( hWndShowSplits = GetWindow( m_hWnd, IDD_SHOWSECTORS ) ) // Create resource -// HC_ShowSplits = GetDlgItem( hWndShowSplits, IDC_SHOW_SECTORS ); // Let's get the handle for the display control in this window -// if( hWnd_AllData = GetWindow( m_hWnd, IDD_ALLDATADISPLAY ) ) -// AD_hWnd = GetDlgItem( hWnd_AllData, IDC_ALLDATADISPLAY ); // All Data listview control - - int pRed=0, pGreen=0, pBlue=0; - if( pnm->hdr.hwndFrom == AD_hWnd) // First see if this is from the All Data Display LV control - { - SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); - return TRUE; - } - else if( pnm->hdr.hwndFrom == HC_ShowSplits) // See if this is from the Sector Display LV control + if( GetWindow( m_hWnd, GW_ENABLEDPOPUP) ) // Get the handle of any popup window, IDD_SHOWSECTORS or IDD_ALLDATADISPLAY { - SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); - return TRUE; + HWND hWndEnabledWindow = GetWindow( m_hWnd, GW_ENABLEDPOPUP); + if ( GetDlgItem( hWndEnabledWindow, IDC_SHOW_SECTORS ) ) // IDD_SHOWSECTORS is the Window resource here + { + HC_ShowSplits = GetDlgItem( hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + if( pnm->hdr.hwndFrom == HC_ShowSplits) // See if this is from the Sector Display LV control + { + SetWindowLong(hWndShowSplits, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); + return TRUE; + } + } + else if( GetDlgItem( hWndEnabledWindow, IDC_ALLDATADISPLAY ) ) // IDD_ALLDATADISPLAY is the Window resource here + { + AD_hWnd = GetDlgItem( hWndEnabledWindow, IDC_ALLDATADISPLAY ); // All Data listview control + if( pnm->hdr.hwndFrom == AD_hWnd) // First see if this is from the All Data Display LV control + { + SetWindowLong(hWnd_AllData, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GREEN)); + return TRUE; + } + } } switch (wParam) { @@ -1010,13 +1010,10 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return TRUE; } case IDC_YAXIS: - // if(pnm->hdr.hwndFrom == HC_ShowSplits &&pnm->hdr.code == NM_CUSTOMDRAW) - // if(pnm->hdr.hwndFrom == hWnd) { SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, LTGREEN)); return TRUE; } - // else if( pnm->hdr.hwndFrom == hWndShowSplits) case IDC_LAPS: { // SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Let the process color columns individually @@ -1039,7 +1036,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } default: { -// SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, GLCOLOR)); // Color Light Grey if process gets here (unlikely) return TRUE; } } @@ -1310,7 +1306,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; InitCommonControlsEx(&InitCtrlEx); - hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, (DLGPROC)ShowSplits); // Create resource + hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), m_hWnd, (DLGPROC)ShowSplits); // Create resource HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window @@ -1812,7 +1808,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) HWND hwndGoto = NULL; // Window handle of dialog box if (!IsWindow(hwndGoto)) { - hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_PROGRESS), hWnd, working); + hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_PROGRESS), m_hWnd, working); ShowWindow(hwndGoto, SW_SHOW); } @@ -3114,18 +3110,18 @@ void UpdateSectors() WARNING_RESULT sfResult; CWarningDlg dlgWarning(&sfResult, m_szYString); ArtShowDialog(&dlgWarning); -/* + // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); // UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; HWND hwndGoto = NULL; // Window handle of dialog box - hwndGoto = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)WarningProc ); + hwndGoto = CreateWindow(GetModuleHandle(NULL), MAKEINTRESOURCE (IDD_WARNING), m_hWnd, WarningProc ); HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); ShowWindow(hwndGoto, SW_SHOW); -*/ + fWarnedOnce = false; } } @@ -3133,11 +3129,11 @@ void UpdateSectors() } INT_PTR CALLBACK WarningProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - IUI* mapDialogs; +// IUI* mapDialogs; if(g_pUI) { -// return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); - return mapDialogs->DlgProc(hWnd,uMsg,wParam,lParam); + return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); +// return mapDialogs->DlgProc(hWnd,uMsg,wParam,lParam); } return FALSE; } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 4c693ea..ceecb67 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -417,7 +417,7 @@ BEGIN END IDD_WARNING DIALOG 300, 250, 250, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_OVERLAPPED | DS_SETFONT | WS_SYSMENU CAPTION "*****WARNING*****" FONT 8, "MS Shell Dlg" BEGIN From f7f9a1dee12645ccf08adaf5d62274537ec9e5a4 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Sat, 7 Mar 2015 21:20:05 -0700 Subject: [PATCH 049/112] Code cleanup --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 4 ++-- PitsideConsole/PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index c1547c7..0eecb1c 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3110,7 +3110,7 @@ void UpdateSectors() WARNING_RESULT sfResult; CWarningDlg dlgWarning(&sfResult, m_szYString); ArtShowDialog(&dlgWarning); - +/* // Attempt at a Modal display of this message, not working currently TCHAR szMessage[1024] = L""; swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); @@ -3121,7 +3121,7 @@ void UpdateSectors() swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); ShowWindow(hwndGoto, SW_SHOW); - +*/ fWarnedOnce = false; } } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index ceecb67..4c693ea 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -417,7 +417,7 @@ BEGIN END IDD_WARNING DIALOG 300, 250, 250, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_OVERLAPPED | DS_SETFONT | WS_SYSMENU +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU CAPTION "*****WARNING*****" FONT 8, "MS Shell Dlg" BEGIN From f1dc0a01414878197f63f7d7a76eb185fde8bed5 Mon Sep 17 00:00:00 2001 From: KDJones2 Date: Tue, 10 Mar 2015 22:29:18 -0700 Subject: [PATCH 050/112] More modal dialogue changes --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 0eecb1c..1263d4a 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3116,7 +3116,9 @@ void UpdateSectors() swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); // UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; HWND hwndGoto = NULL; // Window handle of dialog box - hwndGoto = CreateWindow(GetModuleHandle(NULL), MAKEINTRESOURCE (IDD_WARNING), m_hWnd, WarningProc ); + HINSTANCE hInstance; + LPCWSTR szName[MAX_PATH] = {NULL}; + hwndGoto = CreateWindow(NULL, NULL, WS_POPUP, 30, 50, 100, 100, m_hWnd, NULL, hInstance, WarningProc ); HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); From 77c1a545bf0352b16ba24381ff4c0acc4b73fdae Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Tue, 31 Mar 2015 15:22:05 -0700 Subject: [PATCH 051/112] 2.004.0002: Heart Rate Monitor support added, some coding additions for Checkbox selections 1) HRM channel added at 0x80 2) Modifications to improve checkbox selection added, not active 3) Modal dialog color coding attempts removed 4) Pitside help file updated --- PitsideConsole/ArtLib/ArtUI.h | 81 ++++++++++-- PitsideConsole/PitsideConsole/LapData.cpp | 3 + PitsideConsole/PitsideConsole/LapData.h | 1 + .../PitsideConsole/PitsideConsole.cpp | 116 ++---------------- .../PitsideConsole/PitsideConsole.rc | 2 +- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 2251853 -> 2454808 bytes 6 files changed, 89 insertions(+), 114 deletions(-) diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index 5614ccd..518d348 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -200,20 +200,21 @@ class ArtListBox if(ListView_GetItem(m_hWnd,&sfItem)) // If item is exists, let's check it against the setData set for a match { DASSERT(sfItem.lParam); - if(setData.find(sfItem.lParam) != end(setData)) + // See if the item is part of the selected set + if( setData.find(sfItem.lParam) != end(setData) ) { // found the item in the selection set, so make it selected and checkbox checked sfItem.state |= LVIS_SELECTED; sfItem.stateMask |= LVIS_SELECTED | LVIS_STATEIMAGEMASK; - ListView_SetItem(m_hWnd,&sfItem); - ListView_SetCheckState(m_hWnd,ixItem,true); // Check the checkbox + ListView_SetItem(m_hWnd,&sfItem); // Highlight the lap + ListView_SetCheckState(m_hWnd,ixItem,true); // Check the checkbox } else { // this item is not supposed to be selected sfItem.state &= ~LVIS_SELECTED; - sfItem.stateMask &= ~LVIS_SELECTED | LVIS_STATEIMAGEMASK; - ListView_SetItem(m_hWnd, &sfItem); + sfItem.stateMask &= ~LVIS_SELECTED & ~LVIS_STATEIMAGEMASK; + ListView_SetItem(m_hWnd, &sfItem); // Unhighlight the lap ListView_SetCheckState(m_hWnd,ixItem,false); // Uncheck the checkbox } } @@ -259,7 +260,45 @@ class ArtListBox int ixSelect = -1; int iCount = 0; int iTotCount = ListView_GetItemCount(m_hWnd); // Returns the number of items in the Listview - ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); +/* + // First let's clean up the selected or deselected the items and associated checkboxes + do + { + ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); // Go through all of the selected items sequentially +// ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_ALL); // Go through all of the LV items sequentially + if(ixSelect >= 0) + { + LVITEM sfItem = {0}; + sfItem.iItem = ixSelect; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + if( ListView_GetItem(m_hWnd,&sfItem) ) // Item exists! + { + if ( ListView_GetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED) ) // Item is selected + { + // Item is highlighted + ListView_SetCheckState(m_hWnd,sfItem.iItem, true); // Check the checkbox for this item + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the item + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); // Add the item to the selected Set + } + else if ( !ListView_GetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED) ) // Item is not highlighted, should not hit this + { + // Item is not highlighted + ListView_SetCheckState(m_hWnd,sfItem.iItem, false); // Uncheck the checkbox for this item + ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Unhighlight the item + ret.erase(sfItem.lParam); // Remove this item from the set + } + } + else + { + DASSERT(FALSE); + break; + } // Added by KDJ to prevent locks when no data is passed + } + } while(ixSelect >= 0); + // Now let's find any other items that have their checkboxes checked, and add them to the set for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items { LVITEM sfItem = {0}; @@ -271,15 +310,39 @@ class ArtListBox ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item { - ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked lap + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked item DASSERT(sfItem.lParam != NULL); ret.insert(sfItem.lParam); } - else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) && ListView_GetItemState(m_hWnd,sfItem.iItem,LVIS_SELECTED)) // Check box is not checked, let's unhighlight the item + else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) ) // Checkbox is not checked, let's unhighlight the item { - ListView_SetItemState(m_hWnd,sfItem.iItem, 0, LVIS_SELECTED); // Deselect the highlighted lap + ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Deselect the highlighted item + DASSERT(sfItem.lParam != NULL); + ret.erase(sfItem.lParam); // Remove this item from the set + } + } +*/ + for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items + { + LVITEM sfItem = {0}; + sfItem.iItem = iCount; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + // found an item! + ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam + if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked item + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); + } + else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) && ListView_GetItemState(m_hWnd,sfItem.iItem,LVIS_SELECTED)) // Check box is not checked, let's unhighlight this item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Unhighlight this item } } + return ret; // Return the set of items } private: diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 30ec619..6b0b4ee 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -251,6 +251,7 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) case DATA_CHANNEL_TEMP: lpszDataName = L"Temperature"; break; case DATA_CHANNEL_RECEPTION_X: lpszDataName = L"Wifi Dots X"; break; case DATA_CHANNEL_RECEPTION_Y: lpszDataName = L"Wifi Dots Y"; break; + case DATA_CHANNEL_HRM: lpszDataName = L"Heart Rate"; break; default: if(eDC >= DATA_CHANNEL_IOIOPIN_START && eDC <= DATA_CHANNEL_IOIOPIN_END) { @@ -339,6 +340,7 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP break; } case DATA_CHANNEL_LAPTIME_SUMMARY: + case DATA_CHANNEL_HRM: { sprintf(lpsz, "%4.1fs", flValue); break; @@ -441,6 +443,7 @@ void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPS break; } case DATA_CHANNEL_LAPTIME_SUMMARY: + case DATA_CHANNEL_HRM: { sprintf(lpsz, "%4.1f", flValue); break; diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index bc66d46..8c9441c 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -25,6 +25,7 @@ enum DATA_CHANNEL DATA_CHANNEL_ELAPSEDTIME = 12, DATA_CHANNEL_LAPTIME_SUMMARY = 13, + DATA_CHANNEL_HRM = 0x80, DATA_CHANNEL_PID_START = 0x100, DATA_CHANNEL_PID_END = 0x200, diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 2c8ac71..8168e0f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -269,9 +269,9 @@ class CMainUI : public IUI,public ILapSupplier { public: CMainUI() - : m_sfLapPainter(/*static_cast(this), */static_cast(this),SUPPLIERID_MAINDISPLAY), - m_sfSubDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_SUBDISPLAY), - m_sfTractionDisplay(/*static_cast(this), */static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), + : m_sfLapPainter(static_cast(this),SUPPLIERID_MAINDISPLAY), + m_sfSubDisplay(static_cast(this),SUPPLIERID_SUBDISPLAY), + m_sfTractionDisplay(static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view m_fShowTractionCircle(false), m_fSmooth(false), @@ -712,7 +712,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } else // If the window showing all of the lap data isn't there, let's create it { - // INT_PTR CALLBACK ShowAllData; DLGPROC ShowAllData = NULL; if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing { @@ -723,11 +722,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) InitCommonControlsEx(&InitCtrlEx); hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, (DLGPROC)ShowAllData); AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // All Data listview control -// RECT rcClient; -// GetClientRect (AD_hWnd, &rcClient); -// AD_hWnd = CreateWindowEx(WS_EX_TOPMOST, WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT, 5, 20, rcClient.right-rcClient.left, rcClient.bottom-rcClient.top, AD_chWnd, NULL, NULL, NULL); -// DWORD dw = NULL; -// if (!hWnd_AllData) dw = GetLastError(); SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); // Set up the AllData list box columns @@ -852,10 +846,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) BLUE, LTGREY }; -// if( hWndShowSplits = GetWindow( m_hWnd, IDD_SHOWSECTORS ) ) // Create resource -// HC_ShowSplits = GetDlgItem( hWndShowSplits, IDC_SHOW_SECTORS ); // Let's get the handle for the display control in this window -// if( hWnd_AllData = GetWindow( m_hWnd, IDD_ALLDATADISPLAY ) ) -// AD_hWnd = GetDlgItem( hWnd_AllData, IDC_ALLDATADISPLAY ); // All Data listview control if( pnm->hdr.hwndFrom == AD_hWnd) // First see if this is from the All Data Display LV control { @@ -871,17 +861,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { case IDC_XAXIS: case IDC_YAXIS: - // if(pnm->hdr.hwndFrom == HC_ShowSplits &&pnm->hdr.code == NM_CUSTOMDRAW) - // if(pnm->hdr.hwndFrom == hWnd) { SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, LTGREY)); - // return ProcessCustomDraw(lParam); return TRUE; } - // else if( pnm->hdr.hwndFrom == hWndShowSplits) case IDC_LAPS: { - SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // No LV coloring for Laps list +// SetWindowLong(hWnd, DWL_MSGRESULT, (LONG)ProcessCustomDraw(lParam, wParam, CLEAR)); // No LV coloring for Laps list return TRUE; } case IDC_DATAVALUES: @@ -912,8 +898,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: - // if ( lplvcd->nmcd.lItemlParam == b_GreyColor) // Let's paint it with grey background - // if ( (int)lplvcd->nmcd.dwItemSpec%2 == b_GreyColor) // Let's paint it with grey background if ( b_GreyColor) // Let's paint it with grey background { lplvcd->clrText = RGB(0,0,0); // Black text @@ -2266,12 +2250,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) int iLap = 0; // Tracking variable for which Lap we are on in the loop int iChannel = 0; // Tracking variable for which Y-Channel we are on within each lap int iTotChannel = 0; // The number of Y Data channels in the Listview -// SendMessage(AD_hWnd,WM_PAINT, (WPARAM)AD_Rect, (LPARAM)d_LGreyColor); // Start the painting routines -// EraseAlternatingRowBkgnds (AD_hWnd, AD_Rect); -// SendMessage(HC_ShowSplits,LVM_SETTEXTBKCOLOR, 0,(LPARAM)CLR_NONE); // Clear current LV background color -// SendMessage ( AD_hWnd, LVM_SETTEXTCOLOR, 0, (LPARAM)d_BlackColor); -// SendMessage(AD_hWnd,LVM_SETBKIMAGE,0,(LPARAM)(LPLVBKIMAGE)&plvbki); // Set background color of LV -// SendMessage(AD_hWnd,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); // Set style // Loop through each lap and pick up all of their values for each data channel for(vector::iterator a = lstLaps.begin(); a != lstLaps.end(); a++) { @@ -2545,25 +2523,19 @@ void EraseAlternatingRowBkgnds (HWND hWnd, HDC hDC) HBRUSH brushCol1, // 1st colour brushCol2; // 2nd colour -// create coloured brushes - brushCol1 = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); + brushCol1 = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); // create coloured brushes brushCol2 = CreateSolidBrush (colorShade (GetSysColor (COLOR_WINDOW), 90.0)); -// get horizontal dimensions of row - GetClientRect (hWnd, &rect); -// number of displayed rows - iItems = ListView_GetCountPerPage (hWnd); -// first visible row - iTop = ListView_GetTopIndex (hWnd); + GetClientRect (hWnd, &rect); // get horizontal dimensions of row + iItems = ListView_GetCountPerPage (hWnd); // number of displayed rows + iTop = ListView_GetTopIndex (hWnd); // first visible row ListView_GetItemPosition (hWnd, iTop, &pt); for (int i=iTop ; i<=iTop+iItems ; i++) { -// set row vertical dimensions - rect.top = pt.y; + rect.top = pt.y; // set row vertical dimensions ListView_GetItemPosition (hWnd, i+1, &pt); rect.bottom = pt.y; -// fill row with appropriate colour - FillRect (hDC, &rect, (i % 2) ? brushCol2 : brushCol1); + FillRect (hDC, &rect, (i % 2) ? brushCol2 : brushCol1); // fill row with appropriate colour } // cleanup @@ -2620,12 +2592,8 @@ void UpdateSectors() float dSectorTime = 0; // Initialize the Sector Times variable BOOL b_LineColor = false; // Flag for making alternating rows different colors -// SendMessage(HC_ShowSplits,LVM_SETTEXTBKCOLOR,0,(LPARAM)CLR_NONE); // Clear current LV background color -// SendMessage ( HC_ShowSplits,LVM_SETTEXTCOLOR,0,(LPARAM)d_BlackColor); -// SendMessage(HC_ShowSplits,WM_PAINT,0,(LPARAM)CLR_NONE); // Start the painting routines SendMessage(HC_ShowSplits,LVM_SETBKIMAGE,0,(LPARAM)(LPLVBKIMAGE)&plvbki); // Set background color of LV SendMessage(HC_ShowSplits,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); // Set style -// EraseAlternatingRowBkgnds (HC_ShowSplits, HC_Rect); // Lap Loop // Now loop through the lap list, compute the sector times and store them in SplitPoints[] @@ -2688,7 +2656,6 @@ void UpdateSectors() if(dEstimatedElapsedTime >= 0) { dSectorTime = dEstimatedElapsedTime - (double)iLapStartTime; - // Now that we have computed the Sector Time, let's build the Sector times string // Now that we have computed the Sector Time, let's put it in the Sector times string if ( dSectorTime > 1 ) // 1 used for roundoff error { @@ -2708,7 +2675,6 @@ void UpdateSectors() { const int iLastTime = lstLapPoints[x-1].iTime; dSectorTime = iLastTime - (double)iLapStartTime; - // Now that we have computed the Sector Time, let's build the Sector times string // Now that we have computed the Sector Time, let's put it in the Sector times string if ( dSectorTime > 1 ) // 1 used for roundoff error { @@ -2804,8 +2770,6 @@ void UpdateSectors() } } -// virtual INT_PTR CALLBACK WarningProc(HWND, UINT, WPARAM, LPARAM); // Declarative function statement for Values Warning dialog - void UpdateValues() { // Update the data channels that are being displayed as values @@ -2987,67 +2951,11 @@ void UpdateSectors() WARNING_RESULT sfResult; CWarningDlg dlgWarning(&sfResult, m_szYString); ArtShowDialog(&dlgWarning); -/* - // Attempt at a Modal display of this message, not working currently - TCHAR szMessage[1024] = L""; - swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); - UINT uWarningMsg = NULL; WPARAM wWarningParam = NULL; LPARAM lWarningParam = NULL; - HWND hwndGoto = NULL; // Window handle of dialog box - hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_WARNING), m_hWnd, (DLGPROC)WarningProc ( m_hWnd, uWarningMsg, wWarningParam, lWarningParam ) ); - HWND hWndWarning = GetDlgItem(hwndGoto, IDC_WARNING1); - swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): \n%s", m_szYString); - SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); - ShowWindow(hwndGoto, SW_SHOW); -*/ fWarnedOnce = false; } } } } -INT_PTR CALLBACK WarningProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if(g_pUI) - { - return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); - } - return FALSE; -} -/* -// Processing routine for Data Channel warning dialog -INT_PTR CALLBACK WarningProc(HWND c_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch(uMsg) - { - case WM_INITDIALOG: - { - TCHAR szMessage[1024] = L""; - swprintf(szMessage, NUMCHARS(szMessage), L"One or more of the alarm limits has been triggered\n\nCheck your Data Value parameters!!\n\nFailing Channel(s): "); - HWND hWndWarning = GetDlgItem(c_hWnd, IDC_WARNING1); - SendMessage(hWndWarning, WM_SETTEXT, NUMCHARS(szMessage), (LPARAM)szMessage); - MessageBeep(MB_OK); // Play a warning sound - return TRUE; - } - case WM_COMMAND: - { - switch(LOWORD(wParam)) - { - case IDOK: - { - EndDialog(c_hWnd,0); - return TRUE; - } - } - return FALSE; - } // end WM_COMMAND - case WM_CLOSE: - { - EndDialog(c_hWnd,0); - return TRUE; - } - } - return FALSE; -} -*/ void UpdateDisplays() { m_sfLapPainter.Refresh(); @@ -3066,8 +2974,8 @@ void UpdateDisplays() void UpdateMenus() { HMENU hWndMenu = GetMenu(m_hWnd); - HMENU hSubMenu = GetSubMenu(hWndMenu, 2); - HMENU hSubMenu2 = GetSubMenu(hWndMenu, 3); + HMENU hSubMenu = GetSubMenu(hWndMenu, 2); // Graphing... menu + HMENU hSubMenu2 = GetSubMenu(hWndMenu, 3); // Phone Orientation... menu CheckMenuHelper(hSubMenu, ID_OPTIONS_KMH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_KMH); CheckMenuHelper(hSubMenu, ID_OPTIONS_MPH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MPH); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 0abd0fe..a144387 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -180,7 +180,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0001\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0002\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index c5d4bbd388669618274ac7e310ae5c45f1eeef1b..6e2eb0fa8c70fe8960a7c771b2e775c75b2c2cfb 100644 GIT binary patch delta 930890 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

B1;DaA|}%Z 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�)MUJh6$7`{io4;_uy~(-x;Ji7$s@()tFdP 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

_I;ifrGSjf4QolZ0-BkNa8M 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

<$_tsB!(+Lm(8h##4^Nl_~&B7l^)36Fd9aKRcLZ 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∋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

J2wTU5Bf?`7 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%0D`qJ@84Y^;zdjwL6G=~6LMDrF~2x$-11I#nJm z1CyilQ6!d2f~m>;bXmj9l$z1$a&8KASt(tbNS2Bt6JzmWAy&vo^0`nh>(8dWsibQp z;Yh@7@rWfF9twv{!@+@2z!(e|g8sgMuh;MG^?G`|ZoS*p?Q(WH936I0Og5brq|<*; zyJbjcwRG65kOJwQ4ttlw-tBTgPTV@}dca`=x*e8o`%stF+=1?=0T574hQ6o0J&(G& z?(1}S+uH85w%uuI`Lr3i(}HvHeb&}?w;j?^Lw(xXbi1|b`P)@Xf#6&O9(l` zs;Bx8I5S;BVX+=dH6I0C8WyY1Gpt%*S1uFGo;79hT=n9iE#4V6oYaerUTHh2Bv_Mn z!KuocxpGMzxp2<}%dQ5+N|&liTI1@~g2t+Vm)y@GQJ}V)4yyR1e*8t@ubQk3kx(HTRT1fW_c)4n3`3lr)k|L_dO0_0T*?Dvb}OR2K8q9HP2ULi_7h zcr9R2{=DFL6j9b3r;&e5xlpXKN|#vbt9sEWCDg6*{+jS(l80Rrwki`YRr)Md z1R!cFrCAdSOLjn2(STB6$@fOtU4^d;p_>L5(GcpXGLyN|^;GveT9$e>B_>dcEct&?!V_8GyczCNn|q?o zGturTwR=k_pnQ|$gqp^wmC-T;vvA3jq-8+Ut3#PJE0Cqdc5}dnJ+}!sMg`9NrYpbY zf^A{bjcj?wwgE3NzU^a*JAPz4Fv08uCw4<6!SJLY43v=wGxZ#Z60xa0WSV&%pWchl zAc>j%Dn@3RJ>GvwA_vHvh7_`2pV_^n!p!puv%nsFo0{88&+Vt@547wP^5Yy(b>_Xw znP>J!W}XYCpC_hw6H~xW0+-F*j+eJ%8n%A-kN)7|#S2F)Mg=DdiDvlu&xJ^QeAg=M1rn6bYHapq~83kk1hG8iJlazq{A(?(wz z=yHNY0<0Z&5KSPR%s_{ANM{>@6yCzOT@D*z?M5s@I@!%#Hgl)dq#GJ&GZ|Y33{CyL zPxShSot=Mo+uQH7w0+v#`blHUCk@TF8(RSQ_-PBOs!vZhMSL{ zzW4CayAK|}_ptH3$1U$Y(cNh5{;;M0<95@hUADWu?gxgzwP$TF^ti)(-8uA4LKwA~oWY?zTvEgPI+kT3~0 z1|=pHN($|465_yt6te~l3f2dc>!y^#1|f19m7OGF07lmPk+r_WD$oPOnU$W{s=k^P zpqtREz?3KeLTtG!veczgJ@_%Qj9*2SqgH!jaB^{Mk3hMu>IUMgdP1hGDf9|fdoja` z9y5P4t9Yu|vOb0;hqxJGJhP-iaR)mRmV0wLxvH;D#55`{GX-9owbt&EafuW?*jBNo zrWE7~zdTVqyRjGVhb`;L#1xe%P-UQ0#7Pv|DPRpo6Ow$guR zb*fdWbpo}QRy+$G(&4K-3pLc{Ss+9Po#L?8o}8aJVu7FskkF>9dA&UJ5ua;%gaa}H zS?VU%FI)n6|LUV&c`Z8aGdTprEL@{}D(O6c!yox7{Raekxr5xeU7 zQu1I+QvHm-x=q;7KKQR{e+E+<1nej&%tj5bmxoeBV~B&91{PBszX5F~X)(jdifl8h zo3c9XA>(O%Vrf$*&kXB~f>Z1+y;6vzpsM*%h47hN#Kmj=N&Op$cTu3K{(w$V*u z%UJ-nU486-QBo+KQY@Wjg>=f`36boxBf-K^PH>zRU?P2W2*^VYGF1v|wsN77+2<8uH3Py5 z*cqAL{oOzM*XJ)TEn$x};3JNQi zjxeLC$Y>IX=F>+Fw6?Y|LjzrWJ zi&~-~b0laE2L^}z1E8KlUPH*!A9VNmT|GXB-s{kN9NjKk7vKbaWa+enRx)?k%&_eQ zS!BnZ4od8F;77>7bm6`Uw>DF!ZLq^S&~7%i4jL$aulKQD|3H7&`B_W*?WR^*Gq>d< zTr;=%*Sp%vk99}S` z*DTphYi`q$-Lik=fNjetuwxzFv5oFpX~&vJAWqcEh>hX9AeIGnX||c zTsOOoD91|72<3!BvfE~fDT54Vwg%H%Mr6~F0=8(oX-IDNYw1Ha2zBB{-w3eYn^;5D z15zuxf}ku~>rJfpj!*{edHRzZ1YQM6Rnw1b5OuzVn>2soee$hRo@51aR|(WvAguJP z@1jfWYomQhWSP8g>F6G?-$uoB|0-EpB!k zunjDXy|xN+1p5kv?_5%A4(^Td}AXGdmoY>Xf}`rH)S^AA2(&UOqne+?qCX% z-Q{DCq&JLY*zkw}TA`r3wPLDsm`rQ@2l+3Pxci-S<>3pgx?Gw@=+m8H>qp<4) z(KNp69)IpBBHjsL&&QPZ{3WsVPXhZvpu8U<`9ShvlZgF zJ%|&DInYYL(a8K!l1M!}R&kVCz?6S9vmnSUoG4@$kBJk7TwRuweW7|->7Y9aWt4Cm zk>iP^6R9VZOML9o$tbYQoaTY06XKK^t#AyNr~ubO<#os+D}(Y)c&}0gOwYvp>8OwJrlOuy)SZkv6H!Mz zVvB_>k+3-&97Ofx8wjD}$q;n+2b_I=XRpuE^vmr@i`zU0wIub)cSZJ#7Ke z^x@;C4<0pr@SyR-$FSe>@sqZXp8~BPK56;jNz=_ojqlxm`p&(_zq<42E#R}Kzq;G} z>-+8RJnFj9*!N+};4Pi?j^2H@&;M{B{KTASw5FQvAfO65PqEX-0*ZfDoerY=$q=0% zNGzI?tLDr)h$h?Uj=ivJAA4>e+j9{1@jXXz9~oy36zr5@C)DYL_{ui6$Jp^yBC~yL z-!Zmtr$pP>b6b9wbs6l~3ePzm@>KGx&SNX!S2l^Y0PI-^^XPNHlp{t7+8`vUOZdnLl|xNsJ}t2qj3Ok#y2GKuPPFc3+C`Vd zQx(mS0nC9tG)5g+R0i8s1J`v>=jo=dvpZ55+{S@r8jHqZQnG)Ju&+m*zH7-px8|SY zwm@4*A^i?JkPbD3s8kX}Bobr$^|?kKsB8+VM7RyS2U7H#IJ7II(;D=iCUNI<+jJCH z+S>C}VWHm$2Qpyum;e@5X|z}Slk4>7uCU8eTH|bx3qjo}^$Ukxbk_L1t9vD#%hNzCMHyH9-c_>>yj^5xy%B6%w6q*;~388uP_&{k( z&C)Lp`HE}N(9Nd0eNg9T>XeVF+^Wh)c$ef27}KPHvQ&Q|b5JvPc?b8QuIBduOBDr3 ze6C=Tjdm544D^g++fI*w8Low@iewaMC^T-Daqu6c6Bw%?2k^RZ)E+%t*LuFLljq7d zp&-7(n}laSzhl8JY!{jW+28F8s`@W=KRA9xA9u|>d~)m)#XX?>K^e8q@%Do$3=6@L zNgT%95%+(lJ&ER4B{k(E8dcu6%I25;8ay*AGGzy0@kK2a2?zGnuse@NgoO0QKh&6H z2PLa5c3-ac3FSrM%_O);WG%_pMOFI|C5UvPOWp4fIN*bBtm$@NxfS0VMGZyE(dKbN z23M&C!}dTu&A}mXHk32yQ6-lXbv-C2bF$wlP#b?<`RfHrC9$eXNw(hg%SVhVq|xO^ zo~%{$@kx1QO!A1qI{W@uYH^sQ2)2~IExKVApFP15(LVJp{XNgc=~vF<~S^g%$@*ILCr~sUCxK@t zsfE)ta+Y31GD}Eyk>LHM^W3tAQ6jf|2Jn7Cjms<@nL5y*b>FCJu|-dgubW2kk@}0 z@&Nq-SHB+wl%v;&>PhdhcDXIxZW2()5bty&LlSeBgWOLJa|cK#he>B2(AfrbAeyWO zW!rA)Z#DHb4fHk|dLH-aA9Qto*4F+>W9vsxnm|3>eAxK@{l**j8gJZ({pJrIwtVog z_2z@-8xIqnMU_aprq1U#uSe3f|MIj$ci11enwDv!Uwl4w-UwA zg}yB^+mf3arlSrmVee#BM6CF_Y( z)RQAZU4JUPZk}UGJaQEIHlCx5A`OM(mKo}Nq30#*%U(Rh12re9oJWCg-ht;llE3lL zHhy3mL%=w+>8;A>XqTP zv8H^;*|a%;x@nh&s#q3b+hxIOi8a#-R`=MU4JvK%xCU&WxiaHERBx>08n6wAukdi@ zh*A#W$+E(=P)2Q|hDxrnhu4UY7&H#Mq?-=l8No+JJ~+e?r^wbo^_2ZaZGwDA@kder z1&vSPy8V}{r1XD-6~2C+Bkq?e@yJ=kK}-7>wm(ClTrg&Som@_!>_FC`B7*|qqckU} zcP;vXM-^lliqhax#eWJKy@SelCf)!yQ$l=Mpq_xH#{1bM4-UKFSwXOrz;U6$EPEc= zWrLo|LD;5Qd?DoGR02V(0z{!QP{V~9AKxTZbv?^+P~v|Xx~>8p^{lKg}UJmm_uiEUHnKumw(jDoYclCr<7^OitHb>l32^M=IIV0vvRw`DEtI*R-5i33mR&A9ZC9-;%Uwr`-)@pybBwmcI1238J3NM&3$gp-vpwa;u zg<1y0%lu(xo;^^{fiwxIH2a=FJ%J8dyBJ@)9ACdIA}<6Rz)N6)zCy7k~6Kfd?#5AXiN z2X}w|@uOedZusS=t#94yc=vJ7ji!MQ+bp*_ouBpk9~dK#&4~tUy2+kvapv1R;~jsV z37n&nrm5@-O!bE646%j5)Y?#X!;;?t3FDeLARPoM>6ke6Or3hC&V1A7$jpUrnmPAP zoq6G_GC_H~)8|$ArXlfEWSctm$@4&F4^TdJmrt=j!ZsQD9cnml!u5C?y6C(n=)VrM2!Z4)Q9A~A6SAMK@6Oe~(DoIzQ% zkDjCK4jUC!T^Bbd30xBKP5-V(O{NVG{5_R<7w5_INAARjSHh4EqRsA zEP{Nnx1~-NI$|q}BN8C4DoaN6Vkl2sqW+v}>Iv32N-T@|Tw7OPm1jz!CJ*5$(~tt( zO!2^mX2T8zdu%`th}H|;IhucPlgDnX^Jlo7lu&I~s&NHXHrFKmSghVuPbSbD#j%0{ z)B!Y62D8!#;s24WV&UCLtgAgN@KH*eEvZfDFGiOZfi{dVxi!?*jckos&gOc0TYf95 z7TMvOAc{#tEq0+33Oy`Pe=u4G`gEuOaA`8m2W52?pi_hDyoTyJ&rg3uHTClx45_{) zDIr7zs{@gfhgrrBhj@UcAkPV9uB5B^`gu5;S!r`JTL!72c%YapI#5rWES(1NuK19H z%5S{Rwa_KBF9(h)m`C^PmmxPDl&F-?fN(iIhencg6NvgF(RN`ghbjqm5I&WsuJU;m z?n!K)@hbppHB|5OYLtIGlLS31u;akNG4W)X(U@Gvxrs(r(Y>1mfv^WgDO$Gp?4Qwt zqk6=y@q8&gj)qsX3EKXP#!n6%+WxDi{So~acBV?drbgAreZ4%82v?lsVM#F8!8oTd zzwDNUyiO>cCJs^1O>&b(zph-rKdpczDSo^1iv*&C&!}laIi`Oa1p?K1;$%f!#9<%u zAqp=H4kh6@82f0@i)STwJW7eY^s|fYa{@n_*uRM_6{{)|R%vBlgzjV8g)Q51X)1|QS7@d;`plSEF{L&vxowc=P{F_~ z^p=nOQ=pqpgVSe0)JhlOxy$hUW%$`;L=v69h&(%wkZ6C3f>v6%j4uK&62!<7v3NPM zcmdlauymPPdXZj!nO=FBUVcGbB9Oj#&VY2vfOG=IwE7~q_A(Ewe-0FI{{?)6odV0E zjnBu{k?{@Y3)+%O+CYjMpBFd3046ki&J;Iavg9e^Auq;I$efNYk`oF;=}17$2myt` zdyB`QYe0YRKxR})n=ea(&r4gt7iuQAkrG{~B(Es1`}qXi7+#m89O}3#zttsq%Fx60 zuSh`kxCVhOgc zFB0$=0_cRXb8w}k~`Z^!#JMMP0f7;S=tD)(G$Bj20JbmxplXpLR{Pvy4@7#Iv_8kyS zPv3vJ^YracpZx0fqqjbJ_{)#)|Kg*2|8Vop|9St;|GshO|9<%3=eM5xbC$pbc4!4HgKCQpq4P*lMpEdUFQEp{ToytJcHpB+xgUQ? z{XB3uTm@24Nu8jEDxih}s|KtfY*7p7w<5P!#e+5^jV0bunMs&3#Gb5CF*;2Fgwhrr z708%FHki>^LdljzIA%;(cQKAKqFC$jGju#r;1dcZvVp~zHoe%zYDf-oYY=aKi5Miz zDfC)qTSf=%a%2wlq(gbdgG0R-b!2}Yp+UHZI%4%yxBg&dn~|da>bhD#&rAg#I$$M5 zwVEygi8Po1PmK#LJ?Qv$%~_ml1$sJ+ei=Ui3lP;44oATGFIbdOSIbwt@X2bdz}cj| zcUC)40G29r>(=oDsvFqDq76*@CUUY2lHF^N8j95u`4PzQz;fOZA*Q6iMB#sDg`Hd# zZmOyqaMX@ADpgh?4o0P`n{q;lC?gW6qlG#UA!;a~z;21H_Ce)Iqed_Z8(vgMSxfiH z)vKbW&JR&y6<6kAS8{=rl+*}{Z-t(+1L0OK9s?F~7PBxx&+@oPSMxRVRJ_udA~Y2I zUz=d{p}j{jt{BKV0wuF$RMdYH9(82l(Vnq`>)sDtu8s$sPExOYsOivZOfH`x@;ZTZ zvI)6#>ZE}n=OmB+u<$v9wig@Z=}QGjaZd@ML^T`1a0yRy3G)aK z%ZgK#a5!-Z4;?$rcPRvpBOwpS3wfw)(Xl?Zk1?Ei5y^>%Fcc1o!$cgzj4c&8WkmR> zND(a_a>1^=GT^MOTC40UYyc}u8~kzY|FL)G?@=80 zx}QJc@thlweO=1?Ym~QAc4VitGc?YtGlavdZxFL=KDVH1Fh=n>gwvQ zn)*yt*9dM9+$gxAinuW#xV{p(p}wM_t|B12JfQfqQr<>csx3#ZuPH;Wt1hjpDy^+5 zsjV!jtthFHENmB7mtU_czgAgxrM&cVS;?i6;;(fFVX=-&%hPJeyv%*EoO%cW$3Vw z6%ALanyyy2T(4~{u4^x@?l&-=9Ifpbu5J%iwFQyU zMoq^E4(!5v$szSR>8OnYr3h$4FH8J5^09w3S0gB6wInmxV`M|zD@I@}Mx!1<7gEzP z%y>k72#L@hsuo;>uU&}QK3v@vszwFUI)omTik5-$=Kk`gK5VqnGEi}2uoCYI3WXLD zB8vrx%Me>gvrS>Vx0R$R9xFzpXQ%E6p=+<}7^&+Tt(P87@~8+_JwIcL=ST6pG0%T$ z?}WzY;`EHudO>Rh2_a{%??feuvK>UOB{}aLsqY$-o^A5j6AO>JSijWglA=j*m;><> zE?hWDwobUY!m}|fJ|W^=6U&?wawWP)HwG0&-A2k8N2bNDzV#~WM_`_xVd=(+kC~W0 zd46t?=cli%u@@O_kmm>Q!qrWFEa`vas`ETYeBgP}6yf4t@w$WpA=kymtP?7JEv;q5 zLZHeq#Tl)YYIhB7c3KB3Nfm4EM`cwhmQ1Lc)L9{Ad|I9_eYjdx zK1^y-12{$Vy3S!-vruWY4px8N7(mZb zb=wfi60Txm%OKUS-stO>L4D`639)>B8GTk7f5sWap{7j`DvHjLx{eSwZh1x(pXQ3A zBA-jy*3k^mLYCV-;ie0J_Q=gLYM|=Tqarp?Vq;i`AD&TsLxq2ZJ1fNLq@QskLNpRW zE!=&@=K`t`iV*TSRZTy7T7!S2*{P(>PE&7bLw8A_>v~-Wa&e%mq@kxw_#ne|4L3yO z11m^cIZXpT7U*Hy@SC#LeI!zP<6?pI=$4OgrKE7AkGalK(NZblI33DHzLPB$!6>(y z&&`^4Rr!#@!JoO+^h)su#2{{VZVXhQ2Du5f%sr@!hzbf77Yadj4b^|R+V)^w$8deu z2!58j#~N(CbzD?y7dE_SXrx=D1c4zGY3Y%a9zqZ)C8PxjX*MB92nY;~Ff;;!bju+n zM5G%8>F$nq;GFY3&-;GgU;5*>XRp22z1DSIYu&LuF^{Hgr8n=`ZzfxArdiIq(VfU& zVIKY^TaZ419c7P~`cdLx#N;?wM(F;c-rE6MgW-;QLgkoy&O;=7=hNf$q9>a~)9pmO z?S5v|r>@chN=^>-rVfP-V0nXm7NKW#h48y6VeWI0@oA}HUI%hHP$nw773+Pl{hpWd z$lPrI7*-~s^GUNU{D&49oX{(&Vaa~X6Blk+%yHIuwN>mC_cN`|R%3U!t&>YLT9;eZ z=-WQWyg7%HX50_GQp>|REcFK|NAt~QePOB6sSS@rILsMD9e$Q#ImO@ivKA5b(%21c z%ZR^aRB~)JZ}Bny2k6OWKCLvLy{G#ixzX|DJeCVnisiLEC02+etpKKYul~wpHkPG2%a?$CGLpe6?67l+w)9&Xa9nRZkpM6+goCHt3D4AfP z?6%hCUhW**FH5UO9!@G-NsaAOxrgdBevs;T7xcW)##V3asU$cN6G)?!F#dj~_w@bQ zmK-3rys`!29Bqo%7w4zHRqLv^ZzK$8dhw8k02}>}gZ~{~?WNz3^v37bPMfxHfxusQ zw|Q9aLI=<5W_&!C9{hdT_0{Y}q*Px#FFr*yCA)>V)RTG6xaLev2n%eFrF)AJZ?s)8 zbmm#-$p9{A$#uf)o4)_G(G1eQ>>Jkwha?}qEvi*NcAweYQmG@x7@Ym^sY8KJQp(X6 z7;N1TYcZ|*&yOBHdKv!JQgxMQ{8T=Wac@IZYx*Q|U~7$$cG7(wkj^#iP~b11U0cfH zrb(;j7x21u^Ex+gMLvuhX5{9sZ!^=8xEnEGzR>|*J-YD0LeT5NQ6wgVN;vmK)w zo0rM7jAL^#2d!5{%ingl)Q_VtM<`3fY@d}dU)(>d@C?-IV6S+Q5}d_;b)mU_dw9Mz zZatBc*@H?S-+1QCSZmVR=cQ;2g#DJ&Ot)k#GO|40{m+zEK;8N_25{}%hcqd9^3V3q zSJe*Z z97=ntF{EUnYh@hgZ}S8?cV3c0U@D+`_7`?MIM(~OOAOM>@9M>tNFaHsm&vhykZ|I{ zJ&Br&cmFjxp;&AO{;1mAqAIig^YpuyeC>vTkbt?%+|_xxGcuj9C3sWYWtD(q=`XUMVBHxqdcfxMPFN1`qHpArUOIK;XHKm^cQ;9m&5#w}ZG zP4l^@79uTSXUB{^oWqlQm`Qw@B~E>++aL4;_S2ty{uKdx-RqW^dlPB42-XKF`&$D1 zBP^KxUOwBQ>Lu}>awU{eyRxgcUxlHMNt}Xx;s&ceXz7epNwKAAb3O>DE0)MSZRZGk zUJ;+{nAKeZ?ho!LQ-12ZYKrM1uX&p(cz04-$c^l;f3kr0_RGH2cyM}H__=nUdk$UA zpJ^OS-!Al$opZU(+5GmuCe6b7{M<+p$Gat>9~jTe4jjl$M@@kp zH459f+T_qY)`oyTf~t?h%N(RO2!v(FAMMR%+D2}*aT|$x3};1Zdak#adMwS&e}DIe zNJ~nv8k6iB|I^J1>qDQ@4EqbUr>HlF3A?if8rpKQa>de1vOmme%}0O7eeTAuId1q) zP^|U|`G!=Edv%$IJ^#I*6KZzD=|FxB92CryUX;xK$KStc(5a0E<4qbmYM&=nj3?7L zuLziYyQGu={3vY~t(Hl14)1_JENhjcTLVML6Y zU5Ym)Fh0qPvTaK$M}iuE-|pCe(lSLN$Lo={QMer_v`zp36rS3q?)~@A>(? z*j5HN8Rost?OmMyXm!UEVcH9pM_77UX4)S%rY?X%59@wjp74q`E@#WsJMVuWi#iy+ z;%@P)GmgDHFFQ0yYoKV+lOHu(Am=D5S~q5-K9smzZU4Ry^V%z^y{n{o_j`@R9+Xj=!u=TFjYW=*E_*N*b5{>jQDaa`MHQ zQ)P}jkxPK_)XGJ+AAO~#@VMW8M>GrgO@~vLW1A+oxb=jr_KaRit60As7J7G*kl@%MEO`fem z#mv-SmmB_jr-wAxcd}#L51+ojRU2S1?1BSA1_A6m=z6oiH`e9&;$p6DAuiF(w?23B z|7ESmcqq==Egk2(T!1wrG*23WO4XZ{awq(sYbNzOaJ8%cLQJ`0`QqaP3%#&?E%ezQ za3&I5OsF563DInG3;hj8$SMSadMH6UA|xzv@nhEzWYVW3df)J~S(}_wvzUv#Bf6PM zzrtlr2WB)8s5G?3?SNUs$K&ZFw>GkkjEiJ1=5LE%V>Cdu#^R$k$swFlnFs-Bo;wt7 zhc%W}Sy}lNKp0t=tp-zk9*M;>Q(Pvh^s^TRfS3yK`t8+y#B?}vwk;0=bpb#WmiARyqCHdnsP z#t)RvdwXSm0VQlO7 zM<#yE&Mt>T0Cq}&Ao?FTM)PJikx;@Xy~6pcde6RrUZJ8iA+ zZ8DFj0q;bWth*r(E&a;~u67>^Z9E6HD96b!#0#!i;s591raSK?uB0@>|nU{j}G}e9DjgLj`&H z_V)H)jr*`Yt>df=Z6ErgQDV8!1p#>Cis#p;1t2Ais?2PPgLGX9JPri>8PrNy^Kpn?`T5U@ToH|DEYJAOg|~++P*_pd-KBgt z$*4mBI`6(!O>Nr8&0{u7`DIPP1qs!W$Dxr}HL&^<%=kyI)^t*6F?5$)i)KGe`mn4w zgbc%%Pp2GyGZ1eetKH`^(Zs_7SgA%O_vXA_P5sQ=tz$b7HeC6ki(qgbGtq9HmdtO< zE0D4o=B{jE>=8pq7c(m^wGf1A=RRR!V*mxO-|L|S{6ggIs%oC!O?am-Rh9N`S@NXpu8d_?zj{L)0Zs%I;l+xb%+%BtI)QV9vCu4ocp> z1>hq)`hh`bOoZny@kXcA6I*PQ^Lr)dMw_naMhmjL@KbBoQq}oihllS2i!NJ;rNliC z*Hx2+`iMa1uqVsZSQMX)qU2S?t$q0hju1x=U6dz+IJ`n9tc&7pkhH}|n=0V+hm_@^ z7g6?AJitIMuft{LzOyl6aM;9>MR zzPqxmK!{Lz1CL5V1K&z=M(zs%??_9@wJ-OXU$PO`7eyIaW5+*?1wy}VP}Z#dth4n5 zl&%Kf;2?g8iLNRrTf}<=)VwI=U^n?{Lk45c?--$02eN<09_lFZ9&b&KCvo}2mJz9{qC0qwfr2KC$$u zsr_7X*Ree;x0OP&E&SKFtj{wpJd1_Rx#&47NZ0Y;4i=(|#}WzN9+=9W`e@vy9F5&+ zC6hHN*aj$3nqVSc-)C;Rr7^8E+a|HNrhYe6ChUpjbJj{fbJr5R^5RwiwNG&e9}SLV zddzSaWk3)EGWdHlrEscd)N{AAAbB;05Kt=lRa|@3aaP2kyrUX_PI$lgh_N{IkwHdm z8!4>e1+4$&fE1Y3-H)%#dp`Q=j3LVvX?E#dmRHvFL73AzDZ}-yD?+eN#SrP0kb$wz z=`k@;@RDlag@#hGE>GBfc#ucJpA2kR&u0+{>*QOL6mY)`q|=l=SJGTfsf)Ka0F$`J z?mi`KSkn z3o6G&h2qR6g~_V>A8m-&GeQO@vv0ZHzND~X?moq(c)|+gwIaVyN>a9gRK+7hw3tc$ zf17>W*MFVXO>H=N0k_4<&_AxWUrN7t>Nj4)0U&Cn8!ifTi(gq-T;*z}`J8f`#B=iV zmsMBO0Gt^n4>UK)H&>VdSn2+2x(*|E!!M6f9IzXyJ|)LF~I;JA9VP=SLiJkQg-wb^nDHm%rOyZUb}c3OT@&Hm@?_<=`Zy4 z6_k~2OtqA~y-oGp7i#vXxj6GL|NOZEeEBdCC6pXTcvYG|nR3zLm{k95i0Kyv#TR2E zr+`n)&)yw(Jfgk!VTIM2X9J6Cm#BR_v+E=oVC`U`6STZeVCai)tE@Inn%Dp(C0tG)?P@xJGZl^cLLXJfu?n{R;6KBLd5UYA3cWt4v=4>>H|}=Zo7(*S zrJ#pJH(6SjHh>In&Kz_qE=FF%hY)t{WJXIQ0EMX`*&jm-qM%#iN#|;*$shh~-@Z?U zb}Wu>s6~Yp(ACy%&xz(nOvlGJfgQCl5S5r&U5A!2cttM77x_*O=bA6JO{V@Dsqj9+ z2P(wGJayj=KiJ=DD$IvB==nIZh-Y4ZLLSh6p8rTP?a^U5=l#SBEv1;(1wWUTy7l-`lAc|{$ONA7z3j1FcU>L$3x8c1y7)r z5ss&Y*&wVV4$(e5G>eMfefwiK+gtXb!Xg`;UPNX>{rA#nT2z9}d4ab{aI0!%grXid zhz1QJfU-B~9>_Hl67(_dNp;kA!4*S-F5lVyn1JKa>>ce#x z@k5H&ytjhW5kt=xD@!j?bE^+p#{`Ri-at50Qsrl#q<;N=uRyg`IiWd}#kapS@`MD# zcPi*tf)sBHP)cC7tol!Uw-F$4d7h9nNrTuI6S+A=d}k5C_p&78a50pvt)oel zqi9v(kDj|QPi4wNm2~L}J0fT@;+^nNgD3I5%lrx2xadc$VYv=-!Dm#G^3CPZrv1 zYC^yYem`R?y&Cna_aD#6Iq9aO@k_#QFQrE@bE-hPGA;^uokSjz6Qcn`lMPT(r0;5c zw_<0unKErA#P=%`EIbq+ALQP|r^P_3{ao1LYnXkQIV<$v=yJGrg-HIAk&?{@-X~7* zwTMf@O6!n3DGERGmgL*NB7uDO%UwzUp@oH7?uhCMPyi4p8nZ=L6om|87oZS(6ERC7 z82wOTK+$Pj(KWPD;IrP8xp<&D`%*sMd$x#Ql83gzBUS&Q^xxND;;7AIJ2pNntf}3n zp*?M+JubTO7=nsmR6wu)5Kq-}C@iXRZwj>lPzC^OZ#Tsm?X${`N#Yg0n9+nj8gszV z#*bf6T~JO9B*iCi4)9C(>AAe9yk~z;|!7?5@#_HHjsD=rtesvD5*a zm4-%&xpJ6(>mx~n#?AyE4D&X`bf-LvYCTV7hzSFOh*KYdvEIAdhaoYznX5_qR7D0> zCbylE*Ab-vBBqHd>>sB40ig(vs#)kk!^6KrNqP;`dBY8tYd_ONx(S<<31#A;0RxO4 zZkBGx+bhiTGPytL#9i_)<<~OMq8AILEfr}K{Q*F!bU5`V8URDsp{9WlR0epB_!Po7 z?D@Mxe5zFlh7EF%4l}H4S^?qT*~4P0lLP&vvd&liJ?_p{QpE>)O~=GU*DZ|Wa2quZZ*5A z@`wP`0{h<sadQv==4tp8qEHp`mSXKUW$n;R4MAyEImw#JV;8BV&kMY+ zp?XJ*Ef9^0Xu^`q()2}t;u7ur@*9?X1VwWN-4MDxxpk*OtM7ntr{!v&r^WP7uClcn zrEXfik@wtlb7j|=vNhoiv~^vxj7`|11>)=@Y#1im zw_w*CKz?1wR$xKUJ-JwkjK-thD{r&&;gkGfr`RtRTuF_b_O@&EUYl*&P5|p&;>4ib zI{Y*?HvT}KuYX9NK6&Kx65qxV(AG8+K$mViVxrGPr6f2n86u~Ra?M_A2o7jotrqSG z#-zOp7b;yL!)l9K-w^hPqa5fkkhk{0qabuthujy0Uv#r%{;6s#vT8&Oz5TY^KDL`v zIi0>_fv5K|w7H;p;q|1juc&G$>;M)$O(97H ze>whq?K(tm*!*=kn$0yYS&Fcs^oUaTdmZH|cl_q;In`2AIU>Gu*0#C7k~U_v`61&N)1D3mRU9wQ81u70V(?#iX)V{97R+{CVGqS<3S7EdtX>geKi&MF=103w%B$l->8FT{7TgU1jzL9 z)(!X|xR@^!(sP5aqg2Vv?ry=hB5*Lpcv%&dOl}-2l)^!jQm^BAu4Jxku@x$KXKec0 zh+YJBRDUqPZ}dm>XR<9tjOauCVk+wZ8Q9aXVp5S~0#nOm8N62gkEI z_|7b<2$Ct0W%g+DFh7=QJ^sc~5sbNVV52C@3s&%)8a_7l?PtgT$@Sbr#`IOrk3@Hz zPz7fVIibXO7$vsvwVVFqrS1e@+r&l-$)se*hA&vGMejJgXi&H^68jkEGPU1%bSaED z4~(l*T{o3v^uI?h={NyslvDaEu=46j{SX)EmEK%1e^0)K~dYP79 z9TgtK$6s_aXeB`4`R^kTjjbWSIIbpRQ;HwZbJUVp+Uf8ASvm&VKHbjVP;0eeY{__H z1;AB>d^0GdL0y}V@c|z*+RBxuhcC0DcVSNtM|(xyCgL-GYK}){Ns8_=lhu3WMVgc` zJ~d;f@+Q{DfGrx9Fx4atI)~klbQJhCHy3`Yb@vmxZvVG*S;v9xu~#7N>lPfk@u8jQ ze#8*Vso&Nm(<8nl&%^${j9c&3KZ&``sTeAQYv&d^@=zH0R&$*L?`9}6C>$_1N{#tx z2F>d%;&|>|j;{}e8S(0Ii}Jt!4j_tdw>2{hX>lxPZJ5OQ8gi zw{J&!+t89+RLqUNWLrSR(Y4>p2Jy|sbhw2BQe?8)_C&&8ez+!^zY7x?3cx%lmF>@| zr)=D~DhZ61W5%ym>>~X=DV$#X4cppi2u9#{zTFGK@No6}s=N?H^UPd^S^qi1h9`5^ zvQQy(*0!3g92(a}4T9Irn$`cT;X4Uz?6QXH_S zBYNhK;~L0&$^5EtE)aEN`Nr^F^!X1$OxT2^y1V`iU0J2hYEjuT){l*3a;eEo^z z&>jTe)Ysf_IZQ@=Gm5Hxfg6X1a(LmQUj3va2;{qU>*(yl)5)pvhlu77NkW-f)R-#@ z>DNp_^%k?Mm8{3hH}t#QT*X#vhg(U7zOz54`w4S^s7Hh}rSe z>?Qm)L0fj6_NTXY&Y6QPL=6~iR&atl%-^zjf~&(|tAS23XmNr1%=~v#2MApkOiiHf z{pX2rQKu`+WDTxc)W9m-Pl`p#-v0H^)RYz)6cx{h*OZd(k_2MKJRQavdQ%p^)n>y? z=q*NMK_v{p8Xt;mxRuixVmae83q=M=mk%kZJx`3#Fbg-!)41G>;XwVKR~O_`{lvRb zgTxoBz)!1$@Y)8CVp_dwD;T_&ZC8M01qn1 zKE&yD)a&))A%*zw-kG$tI^m<`)Xetl&_UIxP0_<~A*G=R#U2z@W<@#CwF1GusWKCwu(uOTr0DN2h{p%& zkYk3bg_6SXP<*#Y;0xNk#s)*p0XW7u`XQF1*C!joc?uEFtuMeANyMiO!;D zeHYKP(WvH^ccT-*o5~0PSi24?sgTv8jwz{j%>XS8o-6sB+Kh{}S(E(2{MXZaWb zq{V-82jkL(9V6yZ`>`o@#I^DKo{4F2>&{aQ?N^VdA)t}G&(G<}OhFoyTfsJKJ=!2C zJW%TSn*K!zMM9M+mDL)<)K1@_*-K^It4FGrI-wEI?9@%ATeFaNcb%KA6%HM0^hAH$ zJu6>P#}S+icGwv4gNop8AU?v zv`%Xn>J;=hzX&y47|kqy3N4!OZzP4}KV&49URc`b?)hwGnNW96Zfrt|km>`aIuP3+ z;XeFU3XkH25+-9}{-YL6=%A;G2d{_SH^N2my=)nUnVByi1XrU0 z#4!K(X6oewAJM)B`IZJVZ{PkXPIds1`aew}d=Y$vj2;+n@y|0EdDwVvZ3~;zlP}O$ zb&1)t_|i%PF5FUOOgtDE+OJh*Sb)KM5ZGHx&g2iG616P)^f87W{s2XtGG&HDYv*HF zm|PdwDgsbi#VUX?K%1Ut&m)ZdLWg62MS1%v;SIcb=O5<5Tp?UzPghg`uta&S+)LZ>^aI4|{@Hs%?rte{O2sf_F|}7t|=;mB)}M;d#cv&{@A`_8K#^O8e7m z4H`?Xj@Kn^HvgztV)&TgIfawg2*p$`1FqTQHDfT>#`0XLR9V|G(J7WpCe3;)|CFMYo8+t?1A~;mdR;QCSt8v?xXGgWU5lC7w+Hx8f{BT4XbE~ zUpwo>)gFFxPNXewG(DYJ1LC5hsdjU=IbK-wM$9X`#dQAKAs!9D^{(h)KbgtK`ZGvq zyeuD4F`^#4p^Ew_!#2T8Mv5-Plz@Ng7<9LUHxog}hkS3x4eQ%KU#uEG3+j!l`cz;k zWjv$^aGq7C0fX_lC}?;YHTNt)aZ8oLYg<;5`6V@birOBioLkT|``P!=V!ptel4?7# zZOkTTM`kc7lE0FY`ro#Pb=R0ll!sv=JZ@eylKmy7)-jwZ_h!n2Nx7~=rq!JBnipuw zt^cfjk&v+{5>Dl?dcfJ>2eE#H3`8%|V39iNPDxpXx2&IpxdW`~6EQ*pPgtQ8_|%|r zf;2A{U$hKnw1?SyW0630pG^FXq59{PJnd-Y@P&?LeEo{g*g@6AO!lt`{788pu6Gyp z$RMisX3d86LhWE&Q4_iDs+!TQlyB2;06!8=i4V9?K(znF>`|jTg4}yi0@L%R*-gxX z&pzp}x4kK)UM1+3C?0=mvfZ-{Rr_kWf^Nv6yXEnB3y^ zf2G2Yte@7?pqts~u2EPsfcUQku!pd89~Bfq^?AOvMjW|jcOPBkdL1k-MqHXw7ep8q zJtkmK-hY^<3iiur20)bXov+-S3VM>s@8xe_M?!9_#NHfiJJj4|zZl@6|wtZb_q$ zdLPrG;`IkcAA0&p!bO(dj3k>$efb)L-;Jn;YyHPs0lHzWG=?3ZwvXF}1>@%UxJ`kE zBuug!3S;W-Y9@-I{S<6qZ}T{$z+(8DW2Oyy=FF-z7!#7G^__@;r=z*}@k?K&=gXq- z6W!Uq{AvatDCk>iOcge`wjRLEVM~fCyh^2JMD-77W&bK1%o-e2+$nhZ-|FKdB|p4v zHrj)?EVBe=nEJDpT$S{j4mj8H#3k1BL~hCLcrBOiU*x!c=%UotWRN2 zyHtFw8=VW!7rtz|3tF{v|F@S2qrkvXg*Y>p4!-t>_gN0L3y+^kFL6GP>eVeL^A&Ym zJx(VN9Q%Heh;>rY6YfN{_JBERwA~R0h3KZz!9XU3ALoH)45%k6>V9Zy@<7^rl)#_( z8vKsRBtg-8e&-ds;xYT?dVID1$vuIxt>&s%Dx_~cr0ZMFoqKaZZzx(VGv=yM_h{QN z1=T2G@-*~*@bD&y$KSI~NKXD}`OrGp$lL*os4jz415Sb+G?w7^a`a`8$hzAbpN3DO zLlrIuIt>lrOfJJCEknbn7wAP+-lt!R+82SiT`ofkY=zjv(xt*JTQk!Ig>%J)5c}VY zD~8u&0Zm`yvVQ%w^FCpAP%1w9FM+jh=M9tJZW`9V4Wp8LR@Y__xHW|3l-rXmXs7ng z`jCJg^^FjqWQ8Yw(r3p)9BNQmbS%8RhYetbJ^?>LikdAlNH*tqKj&NfZv?W`&j`c7GwWgp#_5^&pdtu6L3a@7;?RlJ`yoKKs-9H)~mZ>`u5--g0pH zqA?rjdajb;mYDFh#VD(}I!`G%6db3n{tZROS70Pw3oZ&=Lt_mm3=VfTC2|Q$G&tiQ zG)!zw48L(`JB^_1p&xJj?lJ;djXeR&@)vswllV%q zP%0+PE1zQ^2qE#(Ju+T3F2bLojoY(HytM_Tk!wm5VKGt7@#-<0pIKnsE~glz~|Z%@?MKw3*-t`lFs*_1Y2Zub6%ChH<%=yfD@0xK}J z)KoNoLODokzhx|9gF)BKg>cz3G<~~yk@c$k?)}0k$K}!2*zlen-JZmgU2a0ubfMjA zao1(J2jYm+#s$iDSEp`HcJ1d=#1_ zNVxDp@Fh0crsOL(rhzWm+&O$R&iR3?P-{GVg-?&wW|fhkw3|HSzmHRCcGIul&C%av zsIr;4`Z9H?_=VweYxK3@xR_{8&rp2iujNi?UKo!v4uXwwR?0cDAK6vPEF2}7W5Ra& zV8I=V3N1%(nL!lmwK1SXH|(WJ@wWM^Cl5cXPp7aRX&o23Wv3AySZO{T!VJv#X$wLq zz7@G|kIBN%2Xx1LN9Nepg1+C3;@gZB&q*7-yT`#~YW zRQ{|V**IOkEOQE-7ut@}dR!XXlQN?DwhVd9)`@PE62cr%*z|34LA?Q0;=!>19$Z`$-S+q299&}OMW9-_D>?O@d)EPWLN1IAzSUhdwhzSGs*f)75(fD(5e z=ZH~{kvH`I$TLNV|Ge7$BAom&6N${tXvkitbMr?c1dgPgZJ9qdqV5)bac|niY5iES z6@j4ZtBX^%yYN6d6Ja}IfK&EFz-n*^$8U}c{3A<(+xmBqM_tGGLo?`Ltq@lNaImQF zH1q7?Qus-kaWW`e071(VrC6^dfz{Oj_)cu&8)jTglfUspmyON}IiDb}7c2eroi{hk zrWultj=ts(fqOZPf=4}APJ%(!lfSqPWSP4kQv=$*yH@>q1;o%c-OKh6CX(R0Hz;Xf zzM+L6JuE>LDq`eK;W#^6TaN@_Bj`QxPh3H&dFr2OJBQ~h_C5L|r3`=)A-v6oGz5lD z6AfKPinw32=h>8pGWWSrZCdLycwgHFSW&I8`+vGIB(p5hUwboGym8ZL^u3#)4M3CS z>#F9Gsai`w@J!0S*W>6uVdkp`DKmqmkB{l|xN*=N0zrpgW|1U}VoVBj&T*1|LC|KF zjRNwKkrE04VI5>jDo@Yf!dH|>n!LhQI~~v`#KqkV@WXqNa@P!mQvz7`P99AsUZe$< zO?!)7{nYQdqyMwvSeh0M^le+yw0Dt$?WPw{?Pmb%asi$%r^F1=`HGhV@vLDdI`T)T zv!w4Sxkq(jvFW+>)7}21(^~sp5Ya1l6q`0`sDo89`WCQ&gDU^|B?g+8 z5!|QeK-?Q^ioD5;C!gqOatCz;AMje#CrW|xPh($Q#(p%Dw#qSh!yhFzw7$bmc^VrO z|CISowBxd9hBmVhr${Oy|HU^8`sUxHm|e9uzW8_(mpXW;@yJ4ZDMy3I&A9&-GwuE6y~V9x>(CipC3OyG`5f1i{LN(rF)fC0-|Ma(oNw^j39C7k5Bu^< z*ZG9Emc1J}JJE$+fD2Ze;U|`8O=AQ~++`FEMli=X7>WqbG9dNV3m6wRg<>!5Gj|o>4w)HF220Afjbw;xlX^2Xj60r>hYe$&c;@I0D~`b4U0%_oUfIE-qtmqarAX4afsO1f$z|^lGEi^o1pJkywbF2S6xicPekyG#xeB z#CJI}y}8P-Y5Kl!rbaY3(L{g0?mBb?Jn>zfve>%BVAL7$LNvVE$zMIvEgCQPKKsp8 zYz9S2s`n<;E8K6gFg9++f{#7sE?~%0>pG&KgNqQf5~OB`Bbp@fm%{K6Af@Z{$+=T+ zgT|mg)~z^hJtz>%F}ob8^9&}5P1Bmj@IDS?8mZvA6e9oC{pba=fr5@+K%Tk)uaVrm zH%@3x@Vkbhj4AYVMAR(_&D1WgM7vz9syv@UPY2O^ zLP&6tpqd6Sgabj|cJ{5sz9yo;X7qIjl-U2zb!t{X#nSI6ReA*>%Kcvz@eqUytM7Pa zf!*@Z2n5anz})2|9^6uXsWQ9w)({m!=jUI*zAezvj5Giq*C$C~pS>d)b7t5s!MGKL?H?J_0VxWi^&a1!8 z{t@Lu(~8;X5P$#>__E0Y`5azoLilHkOOAl=xaW39oIhpl;c6yiuq&uNa_x>(k&OVv zdOKEEq`28ae@GnlvE=D7fbvR0CgxVHflxG3T3FoNfaLE5i~x%fq=delqWe z1?-+RyuMg<=@|-F6&s(xAIz&)aGqE4}Gn-fc%Yzb={2s(E0z*E!fc>-ujh0 zarivlbB3IVPSjwaz9i?fx$3~FplXlUxGQl@e##yZ(ofBtO@8b*v$4jhN^+}(Qy6cp zE>{y{zso^$#1-+1PI#&JsLmDH>z#mFKgA7U83;-f^?J&O+=Y^l{cDYhU(?Vn+ajYE zP6yCrt~f?8;11woHo?HD*Qog1P(EMk^Pv#OzG#>0aVXjT`0cY zKmPb2^3A_Emq1r^8GAAh(Qf6J z0KOr|4kWK!G`HWGTak3spyaRL*A{rb)_C~!P;#L$(#ao!NG6r3pgc4XIzQWl1`qA(!o3l4Y&{2>2}G~hMVoEo>MU?GIO`pp$!6VBqd{O?gk!P?BwZ8wGv0Pe2yKVIQ8 zaoUIokREjD4DB&x1z>IXWGIh)aRe0hDSccNpZeA}jMx=;#34pv^Ae1KBMbf#&=x*3 zagB!H!0bifz5oP@iM!i0&$f@TDS4ZK4HVe9d`D970yuBK>tskcUKh zxr;La!&~&!ECIZRb^`<6hd+VA%CkSJ&}0hVQzEFNFjpEV!7SKLJZxcKwF2kZ{gf%m1tQ=l*>{26Qt0pHr?E-nt=X6n1bBa<>|4*k0QGReE`rJ%=h zujW@!C_V}>cBZBrkX5~*9Vnbt0lh1(oU`o6078d8Y#61<^sw3^ zdwLO5A`z4q^HFQKc6#2E`P`@(kKPs>B5=HN2LJofy36+Vtjm|=55LAo$H$Fe42|BC!O!l5NV8xIof0um(Pxr(Gv`2UG5NE_-txX!k+s(6bn=Q#R zVut4pMK#ZFh4&QDCRJ8d5Hslfgu=WRjm!gn3I+`*9LWe$u-uoFM$Qu;79&`xqYpT> zIBu&wD^&FG@Or~+jBbWdMFGCj+3ZylKYmN-{(fOH2WtK%h<%)_P#}9pJl$J4!)_Di z(abQdEbG$MZ?{*C2cg($ww2}?&FWYZLwFL?kJT;>eDN#?Bc0c#Ty?*vQZLr;HKzn# zr5+q2&;65f2xW>)cuZfTw4xHYp{0%c^H9_W`kg1t?=yr$SA0r!it@BipcH`iHq@7M z)R<8XG^tA5@hlRDV;%d;wA&RKbqcyUp2f|N8_1jdAHv=`Dyq2q8$C0`5CYO6AxI1% z2#A2xP$DHGDM~03f^=*5aRY z_W7QDc6|2UpN$bvxgGJKw0n-16-Ty{+z7#_aD4w<>4x+Vi@nR0X9IkbK8NE!iZ(oZ zwNE#S3ePq(3}UncR$d#t41I6jYSvxZRlET|c&+FP)HcR37KsW1(F6c=3)Ho#t6A_qXfz zP1(EUtCBjk#a;#*eYh67Vgrl z0vh5%L}=p4gfR8SoU3RApm7sLZE8j1+w*nOtr=(@C!Z9A;o|V~EKn15i3OGpj%zr5 z&#L#O)Z6b(kNmT}HX{qI>a*LsXQHGaW$R*37_>AJosLW1^~4wm3Ocm*TCnQ#FjaRdN8 zKdN7J#$OYOwA#R~ZMfqG$bdu@o{>KQS~MXlh7=H(RIX^ z=Wr*Dg8J7yo{1U--E9AoV@!lb0L$^=W?A90wVDy5b)UI8Q>TE5;cT0&;e45v2WPEi z;qk2o57;lKdqJVc-%n3QZ=@fO2f94R!?6akPuq>-ze zgVFUr7#tjU2#L@UWtnUfT4s78`#R-Execjd8niBgh1JRS`>G^sqDfjO2_VqvDqGZE zp&!qq@b)ZZd^3Og$JS8HtE#{K(IZJ)QZ;H@Z=aMZfcs6;t+G3V$qI53uVx3fZWh)Y zX#mJqc_iE$_q;vbx*p|L=Ryo}B(GL8$eLA(Hfe+P?r z^elYp@zsi3T$gB)e4z<9w^!1ig-8$ue*(#rn@DHhYE@Zb|MQ`07YKuXS!}PG$yR=P zPrQ)?eCXu?Jer;m#mtVR#g*9m{(%}``vSnWjh z-uXUEzm(swbQhhs{o7DN=N78pRU)|e4qLCr_3vRS{KO2gec1qR9x>z24d`=QSj1jW z@e%>>b*jm!l8gJYSGE7?<}5FiG6y_{w5*d4WvqAf{+ixV#To$dHeZ~8ebAF%tZdEk z%2&ToJwOl3pjmFyC(({5bm<$0+|4NrQBv9g(1DR9vOoeqG_ynosRLIJ|G?sZ6e42_ zWeg3jK3m$E1btW8@d{@iU9=#_X--b7PI}dg=GBizrme{hNg^WtxnI_?va|d*+5I0I z{nv*wW0cG%d1^I@fW%wD2=tgl5TZWYk~qIe48)x#Tt`r)u}(WR1XGo-%t*#+r63azNue*-v| zQ-6x_zqRGAhx>^e14bomBh@yM#OT^f=+E56ZEwE?@kqn%_o5;`N&nv-xc&H@V|!?J z;vGV;P-kA8_z@h9oil(hYi|thwQuL-H@;)Em`si)MAg&DAMBP!9iP7)r|Q8A zcRd;seLl1~S8-tfyXt_E_F}hhjsJzu0Fvv5VhtalU#tf~#a%*1%SK-i-pyE&Sag z>Z#CL>kgF0@W`rAqVG$e%AjFzI+m@SxZ{Vc6~755-Kt3?#i($y=_C+bF;mjO(Kh!S z~7v&HwG}7^h=*RY4>D*-9b?4;~_@|ZpVvu%TVzje(XiQYeGjAZBX z1cI$McXGB@#P^+zjL2Xb0o37b>Ie|%xQ3e9rz1fHA~dQkogvqyU+&7?|HPK?)ssMO zmUJmQF8Pbsz1+~z^(OgY&a0&IxW{A_xtrI+>IkwQL5`-|Gsa=+pgny|*=?1wCtnUv zpuhIMzt(5gCPshibo6rKu(GyhZ>FPu+DhnobR8m1FZ3p-Faf$ePUB@V`040Zo{sdu z0=J0@91x)3oCJao136*(oWybtG+X5bD$@u5GAephxEske+^qQfPvbY;_|rzC74(MN z&dcb7R_FVHsHE$PcUt*cT8m%<7Jro>m$d*z=&pxlizPaX!)(|mg$N4VaH->Q`;kKQ z#ZbJ0f7b3&%!T(10u&TJ=^0|hba+8X6`}ayIw0YoW$dUjr4+-QNZ?vN6E8%QBE@Ai zcDo&g-nZeuJ)v;*`J;RA6&$_jH&>Puy+W<#CKZ5g%hL-`wIKl#g`jU6dnjO8xA^8v z(lrsFr{(@gl``Vze*2E;;UAjCmnU|9r;# zAfxN0l%IXl=9;8qjobR0O7?)W&CA32Wpiym-<=3@5kY7|k^{ApuG_>w@tOFF(6w8i zVX^(&>SMK5hrNBzIsm~n9T`-jg}u~0SBCF5ZoJ4I)r@(I$W1%f)cS88cx&(W>0g`} zT>=egM{P{`#=HMztyk5O9`{GAFmL8 z;M~L%#FEj(+1x&L4NPot$hSM%p8*0 zUt-A(w-SC!zSH9!Fz0DrJmTEmEOMdE<$GxGx%(Mg_%@We#Z)cLESjFs)kq(NE`r05 z6Wp0heSGJ9xkk+q{8Q>FdwZtmdu_($)Q=xdR0Noa8z|1LICU+S6{ZPG@6Ybr%(wcg zRy8R3Va(5J1d5YjDiu))Eh>tpM{nf(xH5!w;tzGH(C%BI3a#7k`G5o;>c#9N&plfZ zKz^q|pm(V6TBdl{iU!J?s25A?K=YsV5tz?yPC;U`f$Ttn#W4a8MaxTr?CGYS%P(6! z9LD;5_H;n+wd&f7e*c)szjaPa)s^!>ngxWI2p-gm_+iWKWs~Pp{_YBcQ5IRvYGHBd zu#SoE^GZL=tOR%(Nh2lHbz(#w%oAWT#jc!vXM!a90>cYMEmia57xTd@xOWHvS9TaC zB289uu`Xk1`-etEH!T7k6o9qaJL1q+`j2ipjd@F%7b(=fy8Qa{wARNy$zx4&>L^}R zGKO7Y*QWMlraGp}d+GIFs96tWvin`r`g|4@gGm^MH5vY&&ACNI#@9qa0kFCjNQ4-J zxbu?fn)Gxx%h|cvZQv;WcfeD*`MG1Qaw5Fam3Jxtn&|zrM8gM4Uu@^A4ya5Q{?wL| zlHn|VeG9i!3E-g9M9Xdev*OVU@B8OcU$LedSKHk4c-E5JU{n*}_uQ?MqICN3JObfV z@p8TUP*!$rL-lotUu!!7m@RV0>~RDuM7n@tjz0{EL2||P=p_!T$d3T3vowOAZyUs9 zam)RX3hdhxk_V7RaH<3g=`jXCz@CT*O|)(qycF1AW2Y+9lVD$=V)^x!fW+Gg1r+_6 zHvBfd5UM%fp*39!N*HdK10IKEEgOibqq6e@dWXWB)5i;iY~x^G@x^Mar@7>+jpT&O zbQp(%l-mW^Q@yM!idqnqnzn{x$gbh8)asBvx{X!(zsz`|^)hD$V~Yz<)^1I-%43*7 zRsj`6`0!#}%to2$$(tx$dpB<0^b^+dU<$N!rR(?>EA%J&5}^F2f+&>=pA(QOE; zrJX_iLxFaD5l>|H1fs=V!UP%UQO&CsM*IqFo!y>qZAUA%60OE_ZvNIisQ)bDf3SA& zw%cgJ>-1ZiAVe^``4aT%-7hEat#}G`6Yp=0>n6t+A}1vxuwO{&qeZg|*H}2_i7>9j z$Pb3!q&@yFG_k?RD$A4JA)1rS{5w+onv6k}hQGhRSWuer?q*+uX2Cyr$(a>PMh`~0 zy&#guEYZW*kxHDRVOI=q@jQ2~>ft;9cH^XV*Bze@8K;|l|25Kfe%rPeXnrnfZOAT* zRuP06b6j}fI95U4Z{A*NbmiAXm5x^)Ip%tObKJuwF_vCz`ChxIcAjLcJ^NV^;xP@@ zY%X>>9?dLF*KTyAZF>0+pNS(V7U2oevJ2ieB2aUMSbExRd5adNi8p^cxKYv_l;|%| z(@`Ll;9L>SXKB%HZCugJ>yGuhL)t{J@J!7c)6kkHia>IS>S~1;KqnpOh0`kUhP{nf zh9lE!J`o|CJ)C)*0D1u$ILdnfeCv6US@LtP*)#Rx!0^1t?WO!>cH!52r>gCUwa^4` zEAC~$_Qu-1n!C??n3qiIU`Sd&sfjly=DcL0&+R8)U3SO<5S%d!ix{asW%R=7Yor*! za4(>@KI4s>B}VVAkU#rt%ASyVk9|f4iWNVm{xP0;ZfgXn&R_KoWtIdnakn+Of#3)d zk-gCloz~rRnax65TgheH?g4Ql*1cenk-^~%&-QP7B9#^El_O?e%@lg(8Qv!;OQNud z%T-!pLs@g0Yq<5EuTkE(d3xy;09D>0Fqm^sKr`W?U5oUaWJ4mV1eRb+KO#W&GFk;2 zbK7-aSws5IMnaGh9y-=~YIhdc zEDdS(6rP=?bw*#DF^+uAmnmBR7077%s^?v2FPqQ8h?A5TK^37`3Qhw)UV87267WyBR zKd<>#@%it*oA5d~^+%l8RQ6Ah=EeE0ARqP)299KVb^n=c_8dKw*V9DaPq6q=76t)q z9Z;m@;|dBHS%sJB-sus|j{4WkCgjaNslK@W*T?0y)ZSRkYC}`!!PDa8D5Zh^HiDE| zwfpjdE-UU?XLL18@Pr>^WpOqbIFvSASm2a>9D< zro4W@e3Y-(Tl43b(R|Z)cjdu!V23r-gN1Qz1G)8~3nYkrxy=vI<)dN4jUEC_^K_5& zvbKZHj7IbQ-d~G<_=1e3Tu|qYpW_THAqx><1S7hsW}-5$J)%r?bw~ysI}X7ee^DEL z);-YO{bW}TvNO&nMDq*_SA0+E0;ZWp3oniN(p`Fr^vu@%XCWdHsPe=Rd!Gm8Jq4QH z6ZKnvzwbinP>ojG5~Fw4|K+fWha#%Iw=@;kGkzXiubL?K!CC04e-H9d@b1yZdUBhG zL_j#$w&A1uB&d(+HzbX?q38FUDD`P90DJO})dGg}29m(P_)kU#g)1Jr%#WA-J1|o@ z*yG+M^W~vKs1NAhFICFCQUK_GJ>&sCi)wM@lw>EzOKN6%mpxVcmqQQTkF2>5lR4dT z1auFT)h^+CUAe553==}ndrrlp9=EscOuj=E$S6o7g*%H75lPtSLsGQ6ao{y(t7IQc z+{9%5HZOHXX^Vcxl7QdK$79$J=7(LZA3n;v4K5iP7H;-$6|?iDPwjzCPWyMiT#EN< zukC%N1Pfjp58Xk)`utt^Hv{ZX!n ztpVBE-o-JmNEy~w-cUFuS&e_L&dZ^Qb?;G$I_C3FvmWktuu2|sZo18V!f;)WB9OxL z_Z@suS0_X7o0NQ=v;pwd)5VZhaacr3T#uqGE-u_fP!^#8s78&l3G$ZY&TlU3Oi8Kz z5EFAv3xA$A!xL|NEBbT15F4ZXW9v=9Z_;k&isw5%#8NJ?#wwiedueRj^@$-rE+(u!WYf61~=434;;xITvZYy!|bePhGXU~OeUN5djmUA-xuF$Cm7*m->A zUwPw3{HDLohqK0>4hX*Ez)hn&5Q|YrwFWJiXw54l4uxn3F zx)7=nRIPilWUDQ#OjoPfMB=OvQ1T|dy&M*#KY1I&2NRKfUq9!j zx@{{G@a{v>>!-8 zwY!f;LAY8tRcn5?_wnA92T3#nDEjrB5F?Iu`<1U<#6qK*efrDPG8)$l63gfoV`*Zm z%ImuZx{F_jDiK+X8M}%E8nbq0>STA#(5?{iQ8)KFDTq=TqrH6ui%ht93Vkd(En&EM z@mNM6A>-lio1kY*-elEMcJmXn$5qGKhmtoit3d>GodnGQzALy5rjb!D`B`y^<@w(a zo1v)>|6ie+A_{bsE6)cD>_X19tiy##gl!5{#QBn5-94)+%jin-&8?u+`SpeyazH}p zbQ7C4S`bS;f%TsPQ{vjy?4K!8Vk57n!;h!6#CKPf?c-SI`{ zQFydk{e&hv&eDwFit_ApMGYR5s)e)qf66FpCF{Q4?O@3l4oBbP#(W0U%D%g9sXU+O zmgnlcjRc0Kia^yHw-0s-UMW>IUU;Li)=DQB=&`~y-ToGfiK9gG-lY$3=emBXsUr+@ zj8eyNyCQu)m5J}q^Pa*Ww7@y<7Pczf$$7S`xjm?()x}e7$BxTQka1$RdLx=#m8NjM zubuE7==_p-C;Y0-fMH*yg5ezkk`B za0IMl$>9183*i^v4h}^WJ{86uMiow16xywTf4@9_^rL#8GGQj*7h|l~rg?+G(IaTa zl=?zBV@xvp$JaJ({*-k_x&M`&SVaEs*+~mY%Z~t7Dmoy+6(jKGTM)D~2yyt5QntvXHq(SC7MJGV8v*i=YLWuy+*m?Sr5 z){5uiW=RYte7@I~DQ=zNT_zk!^_7p`T8%}2@nV4r$6hdA;k5eegMp@}{>|}caD5m0 zngJi|{#zSt+OMK5FkDy;P0UKIps~rP$M3Av4B(=8nlua9R@Oop7JLauDCcY%T$nw90+|9-MXf;C{f@TP^nCE7WZ;Z4p&aAgOIzE2 zngHvSy;K4V1A?elD&Y8p>YMZk43}YbgFyvQIF#lQftY)G7f>u(zGc_rI|CP~} z+W|!IpY$MW$*T*c*w6Wik;i`Tl07*tfhK;q6g(X7DGOecXP=K*#-@!o@Hszj#gU-6OEYu^=j@b-NCYF7Emsnb%sJE9EBp zYeNP-`-ztI(|mtFqOG&FpJdoOUK$W_ ztj-MBX)qtjKLF@`1QI^21BtmfcAQtOn>;{vu*%+Xz#qt=VGPm>U74M_eCPNouI1tM zlDMYjy%54bE?51lK2rK7D~r*EU$*BZ;y#d=Jm%!DJ9Fv8f05;^h#jEcHqL$*egCrq zVO%Z$?0TOQZhn28A5Rk-em(G!$`73IGox&9KoT0KTbLQ_gu0i9S_FBw@Axo03w)Pu z5-@)a_cv`nE4Y{4V?TFQqFP73F)N3*N9wSg(QMUs*H#foNEy{9Tik*WUjkgkZ^p{_ zE7DhRvg>I@;Dx%?t<$`+p^nR$?dVRMcaoY~SHgNJwf%81x3jFTBV(ETQ?hB>y>>t` zqF|ppDJi~1&#pXSE7HKOF;BsKUa-qY{`sjx<#9FZaKf9|gI?1RFm3SCVzLSJG=s}- z?SCgsd*k!e=;e5%K27~vdQc{eXE|{R40R!Rjx3(JU&gzsN{p8)j&3Xt%KB5 z+Fq%pCMT?KN8O%|%wZE!~_Yls9+;R zYo<34Y?r8kA#>i|`Uu~5s-m3b%)ahsRJ@?)ei2~Z*n+^ZwtDR_r=>J}e4=PfG`%&< z>Cw1YJmBk1jK2>hhqYih`#r0qS!5!hYCgybqjOv>>z*a2!^xXhTjz&7$ie#8uPm9l zw-6~`${h^FpJtFkZ9j<;mG6uXsEVr{z&ggglL(PSge>o|>cGJ>i?+@z0f<58lE+0vr>h z$_?Ne-dQHKRW(BaL|GghJtNoEbg44rC<4~(UGoYLO2tbvzS(<-&h%-JfJNXxj+ZpC z>JuV+KN(tg)V*B0BRD}oPmCgs9s`pKE0ySe)wu3`C}M-P}KZLSKHydJjq0K`PZ}QlT8UmGjHXgYvA#P zO-3((+-)o?kI*O{GsArh?7Cwfd&58!1_%&wE&@CQ$Cax?L-(!Q0-Z8rpsgVGh$t+*- zYV{NpHVPhrxMfjKVvNW{?&-?=t;r#c{7j>_~BPJ|9L`R3^KbM_jC=@72vuj5|qA?mo8Q=H>${iqml zP_O7wWd0okC&Y{RtqA@+c*|%i>eprMKd(U&toy&32W3sjD#nF%gN3_E)$-9 zP!IO65rrGI5UO`wTJ$M?=iFgpAC`cdQ(CIuJ7B`1KcoyjpZc@R$%VbvOVT7~Bx~m? zv5i_x>{W5TYe@` znDqVBPJ^x1YrcD8A2UKoPoCXXp0(`X384Fv&%j0*o1byE@;oV_%WJCtLM*Oa+NT5% z6>Ba^{Q6pqs4T3Bv3B=oMa$>Tg4%`Mtx2C|?NW-$g&s+35vesWh|>juf1xx8Sdr7J z&AZ;%RaB+`64EFYD60ceUWLfz*5&6SBu<-EE|k^bMm*N?URUIG6A^e;9(~a%YUbATY-C9KRWn_YlhjIoz`dd2zlht zj})yEX$3mp9OsbZcn#)>4IhxR+lfJ4U{v*Tu_LzlE!h0f18sl)Ho33wYex_yXcc*B zNkDZ15e^o}+kmf3|4dwGbvhJ#|8Xy=UE}Fp>+mLZciGqb{i2<-^lDo?wzSrZ?&r`Tbm(m@~tD~nu?bvOu{-F5l*jW`J$Ee6r zc2=_sEZhXSXk7}!G9*q+uD*>hmTR}8oAC5uZ~B@HVtf`pner<8AB+mG4Len>6d)Yg z<*es*T4TQsGRz=CnD@}~AgI`Ih51|a5#m^m_URZ0XJ zcOjai+f5vrw{oOOF`1R;uTI~IsZDl-PgjB0@o8T16%&5eA$OH{N4FeRN9^ zI*RDu`_gp;Lsn^TMXyc(9DgdvjwEA?JXpY8RC-jU~; zBt*#j7?FOM-Adm%G1O~Lwz6N92gdqLYS1B^NH`s-`lZ=}n|&VbM~qOmT}$twgCh@* zF50a)Hby-r9pVdW=djoAX&-0E^I|OL-H4KuNcWKMgq)((PU*OHZ?xx2UizC!M5cL;e2izGAyI1%{lQR9C(l zDtuB}UozthVWy9EdP}E|A*6dMf&mxCr>Xh;<-Pr~puc_ht8Mq!`}%p*opwKnOkr%Y zAkdC2a_E$t_-R0;S8eIl8_1N+*OJ7IZX2b1Wb#VNwtuqGS4B*@u*T@3qB^)ro5jl) zzyH1ymN0V<8uwo6Qo}IALDNI8hmyKZ`Yd~mwpg(J87v7VjIBtt**`W9nR;=!6^fywdISK}fsLgZqd z$c4pUY?Hxl`Sv3Oh-`ltp~bcGT9TLZ@%_7~d10gkSA9S)z2if?Y!}lGmmZ0sEYtJ5 zG@owB!UD*{jJalo-q_jnRv`$HQ@4JJQ^->7OS6BSZbkpWKC6yir1;*HsPQ8xd=FU` zOk(~cpMj3dC42-$9jj47wVUK;9FwAWCg4IoBh8KBN+nn90KFgL`Ut-ZhS@Sq(F)K; zH&oZu1pbKVuQO5+E4`{i;pldzd*dJ=j`6yfh=}M|=U{_YlV5Q&G2@aT0-fguc(}$7 zyjq`F(rR|Px=-EujAMBJ~mY4X}3i`qIv4#^vo=mm#@3-k04$33fz7hG3(j~6V zPS9M%)qHN$0ZCCi3jPgs5t2}w9e%d`YnV08@av;z;t3AIJI@9Ner0P?_z@(|kb9HQ z)l)rj=evIx)fE_ui;16TNl#)@y!+56S((>NLCKQPNwc|qo3&One&dkg83uar>Oq&Z{KpEN_H5ZPusSrhp&8E z=?ShAodc$yd;&)#qjG&*_x*LChD|+B`J?^Hyy3%jh5Hccs(`?0W!`Wy@`u2Rpm`X#9Bog(#K?mZj$dGqAyjcnph*A1UASVBQdxk@qBAJ>R^_w@h zuu#GI59$VQTF3+#OF7O^DpU<5?%b#iY*oR^fj_%2fy}83MChv6kn091vq@83`(QojB+BlOSr8=i`=V;0-6Pm2@<`eL*-%i1$92zFPCEGcr7acXH*eO?c_ z508I|5m?d3++F5-DD77j6_gdv=R?A#D?R(LFVTee*_);nZsNe%mcD_K{$U5Om(FLb z;l+r+3cBO9{c0kZEZHke4jRKVbhM5zlO*3VE1c#3%x+i444rCikSeZ-xOiOI`&CikDuA{$$q6S4`gIb%TOw+TM1dBg-noJ-OJXwFfpgw7msK_RZuRZH8G!a0jQbR%ON=xp zeHUe9gl5R;-6ce3O4K>20f|=l*V>@_@Mg&Ccn;s0%~rE2-q zMq>j87|;LKJlxe4+eK=uxsJ(r3n ztnGz6sOG*?R=!MQ8713n>*MwBgb7$52jhp7Upm zHktE}&YSCxdTGLQNs2X{=>R8QF~>+ds|N;cWX{J~n;DbYmo>tlXAB2cY=r1Y(!DY=0_ zQoq|I?euN1Bf?AlfL?6ox6=omh++ad&e|c~F(bmRguZHn=ijR72JNG3FXBXFe^5|( zehn&lxU0?29wdw6q?+9hT?BGP5onv+dDEUR#s)wU9bcdC{#yPgRtQ{yB~1UDNSd9X zc$Pq3CNVT=3nj+TUL+|KPIIr?>r4tbm+1G!;jM4K2(b{6Rsf$5EPZq`y%`AM06iKm zNE+4dN0`a-#ExTFcaGqpL4rEF+?Uq$#ds%!{m-|sa10H3M(fhg(13-J#imG+k%#t~ z*TFltCrk!bvdo#oGmK>k7t6S$psX6!A$=8f6MHf^%db=Ix5dGD{(PfE-snm{CHnaF zScI&P5Hx*`nWd!EG^zRspJZKGo%5OjC=>{O39)h|j(}(mNK_d`ZZK&FJ<+JiL0x%)lviQ+&>8JFW*`14U!R8K(g?fnq7HED6 zWBD?jRrhgpm&H~J82SSY!mr>yU%2!q@G(xFH#M}!h#Z}sdQ=Crj0HpOc05~sSJ2{k+yu7IpoT1p_(!oM{)FhmI2y{MGL{^0gPvM zXgB`4wXdhHWB7t&WKI|hs8*^SRoz0c?`CT$92~7p-=)_8$hglU|ODU<-& z51$bvlvzc8bcfOTlhfk-m=Or%>5G$3MV=D39~_-exYYX26s#1f$sK`7rBhF)^S2T& ztZ`S#7SwYJDx{Za`4~{;o-=$8RK)WHcPHqQngbws_~`;W3@y$y9ji?h;|SnTL5a88 zg3Gg^^=R#OOE>hjfDQqy+Erii_gS|r0bE~vaBuTf0@7T9u=QuL;KQg$M{8R`<)tx) z2RTdTwb-&pjZthTrwY}c_h zKcf+_z;tj7AgqbIoO{mr|oS%&6jhRmv z!EyF<0$5Hi5QvbonJ351{{5+c1_;ckLHhfV;=z5Im`E?9lnt7G%?=TOfI5N-H3NrC zZU{|4A}QL%_g?Y!V8qxgVZ zGvkm~%{dY`bD&R&lW&6!wrlH5f3KWbB&{uE)dSD-9#T=ViF&l}(&x(@BoN?b{|x@^ zrMnSR3k4e(*Z1323i&6GZ)F%j8F>#1S|i4k{NcM`Ay)pbr*8b-yF6Yf4^Y+70?_IS zU91&+sQw%G{_t8g)8d@Hd(^l!pD|4oEzZ5pWRmCgI-YI65w~%d2H=VR^bJO)()p-S z2^>T;RA>1h0A!%-I7P5+$Mu5<08iWb;M8jg`>b@@=F@-(=zrMj#Co{ zHn2k=H13@%au5m#+pVv9V_fAbBN|Vty$BLI)sDi8iVLmXRk3Ln<)aWK%L>=j@~?P} zO&%8!TlwGWM!JB&s{RYTV&a&+=Rs89Q*^j^XnoTU=3drdOSc^@<8VP5Oy;C!t|y5H zsX3W|bdhNLQ+-t-vV*Q44$ccc!2}8ZewXu~IRbw8ZfnmW45G_tjXnkVbcY3NzAt?- z5Dr6Q)l5o!km?xMnJ_7SErs%kNp5{vn8wXF?wWnV{b@lJOWDIzsrqLy0jmhG=}*%k zdXe@ze-pZmh{E2)Q=O(%m z;1q7eUi(^-0{HpY`Ta*q|0Q2O$H@zq3`NQPn%xR4LBU4AabIfE`*hETPv|ikm$A41 zqc_CEi~cQCpP|k#ZdP2Fm2X^W(pX;eHsN#4M)>Q_`&(J!qZ3u21srY2f9`0+1SF=e z@L|I`=JIk03Go|5(8O_rXKiivW@F^3`Q*lrdec+Wq3o?*bCYjJ6Aby#Y$yy}U}N01*3@8>Gk&^+np&TY2B7j=skD`HamuHMHEk7TO@yX7EnCU#(Q z<0ao?bT5TqSUokW{EEjJ>GWiAc7gw4=a~7gUimRoSMc|q1bMG*KPQMBR;v+RG7b7Wtv4%-a%TL`eZDYH1Zl9N>?p|fcdv{6P9{K=2l+TY zQWWrJz|}k|ri2Z8+GFenHh$fi^chzhFYveSHSJqJBj*V~bhL4D@NejWK@tQBRb2lV z7s0DKAODtjxh)Hwr6za}4fHUK%8E$5CYQz3L%^BV$GFqD)NZ1rraPslCf}q7-5SYs z+oAbcEBsu|!N%LP(vp>5l^#iE`IY;{mmkh&&x(300ic5x7tJbd5wq;zWA|bd;z^m( zPAe&RQtHy3`g5zg^u!4?FSkD)|5q>pvvC+8nDT_-vrItvN83iTz+t9CbpU~M6VLnEFApw^%<`dw0eVGZuQr|R5b;7aNz5? zk!xP+_*z?QEB|q|MYFrMRHSEGiPTsW}XU%h(~p7GR8hxCYK)tgCIyiD*4jy0qK$PM-P0`&X&(C06Ugo)@} z(arVmEf`feMtMTB?BDU14T1)ez50eT0j|PT-aL2h`mZFg*<;h-+L{aZPXCLosfxr$kw zM)`TE(zPcVCp%F{e=^&r>Y)I!S{$>aj}MUcA5FQaU&KPZb=>D9nfLSH@WIeKsC)$r z@dST5K)`c9`Mja3D1cQG<7)GD9@$T!W+a!v>MeRQ6sh56EMVaI#JgYrvGr4llX{bUH8$q;sE#XNI#z6nkl@d& zsQXrK0>3?xGvxN-e2T`66(<;Rm0R zuis#~i(PI~fPrjK0e-zV*-3X?1x|(VY)7nZCwP&X3p=w$J2TQrJgyDJMahSYqNvMM zD&G*GkDs5^bzzuKGNbuWFy%lL_+RppcRv6R`<;+a#vyl85qPuw^iMXO(Q?+^GeE-h zrxNg$F8@(O`4KCCWY>$ir7CG0Fdn=N}Pm9!q8+E33UDIGW}Y<%>?)DCe3ASJoZxEWcf11tcI zxjAC+zw9T38WmUn8Av|{+}NwNks_H_7ocbT2mv?a=9T0~vIbz@t zM;{aZ;d4Lws*d-9)7|~0jeE~mq z^UK^X^sDdYuT~?Dz|?RsQUK)*`A0#Fs}2VHKSx_;k2z_B;dM+y1c>qSj2`RK12DXs z)vKA#Ep_&W`pCS|>bCFSo&^`#O8_%_j`d2-GN^2;PeAnUJc^^d|aF z?eiFxn=IHVh$#C9fz`d={)torx#BvW<{h!J2$-3NHk58rkfFbB|69!SUlJU3J!+K0 zSxhB)#@>ORYGLHv{i<*Np4~w9t9LF7;Kwg*kkl1owJYWhmzf;+2ssetoeP!t)$Wg{ zt;zpyie&`(lCP8dw(md6pD*rAPnFrO1#kEkzZj`jt<)5L;k(ndwA2CDk2X2VTkjK@ z@;S=7BYP-EAW_w`_<1#@#5Z4C_b2CfcBnW0e_jl}H~}i4n}nP!y71YL7H4~>IWCoM zf<6Ij!rkNU9zbqNm*juVB#Ucu^YI0~jp)2{J7tNNHH%Dos10s^?Vf%U_gyF$hg516Sbr7lJY3UN;t@#2yP6OVH>E$-*jbkk)3aEvp#O2pvoy}ZSn8$`j zlU13S<*y$DXj18aEEX>=|6LR!z=1BB#t6kdb&Da{1UUI#5I$%FnaJ^PUw*5yr6zi| z!S$0;-0XVJc8((eo<|LQf7R;}26<@`Z0INfeI-f&Pe(Ea{u7OX>EBfriS9^3d^68h zVEA?JLC}9r>Kd-62R>MyFPK`ob}~UOVe?_!1Oiec?oi+ykyoSXiWf+hqVsi&N ztdO3h=9>ig64S?^dzsg8IfgIgE z{>ovhW;~cp#P)ag(t0XUcPas@9iAZfO+-Y*>HSdo5_TM_&2)5hgtGgzy^@4xb#to% ze-?zo2;3^YwvpkffeqmQLDpMGMHzK{pwG~av?wCdjUXXC2uRCFNP{3HC?#Fb0MgwJ zgVcb8l!%nl-5}i|A)Qk9@qOR#u65V_bJm)fea=4T?B2h<`%lvU*Owz~YX2=J3$WOa zAfF(DV4S7#ns0klv|4m}QDlTtkNm~;Uw`oVbm_(_o09}HSA~p=UZV(^5{nu$QKA=- z8is=_bp(P>;f-I{!hcl~okXrQ)tHX1Q~%+!d+Dg;u|Z$Tw|jln5V&FJ@Q4^ub4(*h z)sG3jccqyy_83U=q1CM4*PGgmlL^2v^7>QrrXwO%$admzt(Pgq?-_dnTW0$>&(rLu z6+llTp|m4oF|ASTMu7wMCAQ#Oe?WPWXH!|z_!Bt>OL6QP=N5CJT${u2as<^}66|hI z9?F!T4+|mpK3JGdBEK?=f+D%1So$7d^O+Dtn3%(CR6GjldFqef`8Z~~N?!Ksefix< zlXPT-I+X5SO-Anf41`jYDj2z();il>>Szu2wIp;ja^KDM5nOyIWHUy{*YL$=oYM_$ z|NB0=g($W^V%Jb(KHx*BD1Li}U(dXJ#-gA2h%`RcP#&bs5NU_xp&d}QjyNzEzuiEj$)OArJ^6eNg^TQ^q_x5 zee#=!?RNMj1Z!I^Tb`|Td_6UrOr5PWFIER=3u0=|NS_%reuvo%W=Z0b(#r+7db!(^ z9@^U23?UZq;8W~c60%T-hu1(C4G0gstkHtUW5C;G-u8rh;6LZaAmjQAw>hNaWqgFh z2ohkm*6mXnqGtJC6Z)ZNRA&%sBVvzReT(%U4?xXeOYF3+L9?0b`?dKH3ntDWxHe8W zU7d`J-ntrTx+0xBEq9jsv}s~+E^jmgQro;+D>G}ZxD>jXsc)~64;%t#;fGPFjLF}( z)^``CI10_;ipL181BY*#d@k?Zzfbx`%=7qnVYaW$ZMfk(+Zm?Y7#Jt%Qz*yN-nC+n z|BwQe!Qwro{#ouwZyHek`9J=e8ACDfiS)quvSX+@M1h`M(pj|(x&z#flIq8rcQ)Dz zOR`q(M-SO&?1TOx#R&hq-ijosC{d!Clkk=1>$!fH8NRwJ8p(3Hk&R;0>#`=_VO#s^ zok=}vl%d_TQKhJGLKzbNx@5W^MJ3CFaMRB_A)-aktS{idU%&LE8@%{f7ree%$cPkk z-$#jO(fn3?l?EdyJnPvcVR^KMK+B8%jgRDk;whf4RN!A$aspOufc+oR6bF}@2R~oU z3oNN!5?*7PhqF%Vlgs|I(W&c9*_;pGk}M$4H@ITN`Iv_H9eEgDTjn^UfB)cn{(@}IFb`!e z_=8Wr;FodwNrMYADPDEtp%x4!5se0aap1u@QWEeH7VYVCO7u_RMS%b=9RcpWBrN<# zhlb1tKT;Lv!PV{{Op-sreN}fF@&z)O5-iU$Cg&0mtN1Va{dNqK7TgsO&qJ#k2odEQ zur2WgX~&sPahy5#%SD6dq!)j_nKH5Q`nXwu^3f{&7?i=zSbm66?I|^k3I~F8MeEtv z^2gJKxTgxy^e(q7SpUQ*0qaSIUmT4mh1nu;`XzJFgK++Q4!-rkAeN?GPOf=MUXs0+ z6l^9*e63&Ia8k(xxlO~*L$L<&C$J=(#S3MUfyz`x?oC>T=X@!Lv(0E{Nnpp0d=nBwQIq5p`FIA>>fo#!!$H0)B2-kKI^6YP=f6f5ND!U>SXN)-H%KM*8CI-|jNW zT2z4F!SfphDPGtdng48YU~>(E`<2c%YE{2WN`lC zug07dD1te@2sK;?0Qs*+psa#^V&&;VUP67ez{DW=(i`A4yC3sH?Mj>pI7vFfVy)Xk zVULyWjBGKDN!1ecq^ZqjO|10X?JoUxO<}d4a~D38swn8?{-hBex6$2E-?5w!Jxoeo-zai^s;9fjBly;GFhIY+lxlnQ!xh?CHPMpCr4pc(}%qq$7m^$rHT!<+oksU z?2KBc>#r*1SNYR&_;}_T|B<58U@O7DM5Fo>NM6OLr-XgV2N2dhd^c~p#_;YX?YDjI z%g0103M$bKSf*{&nT)bfqLLt=uawjKJW=BR2vB07%x2=)*+@z1RvuPI2cDSJFM=s+9(R`N|U#u!0?jYg(39ql| z0WiTMzvx<|h~YsnAF}c_Jwd#FawO=CLuB!M=*#c8s|_{?zJ=kDoB)1efoGX8W(tED z3sAhdY4vMQ+WEFhW%suCGpWScv}{%KjqOp?jgHZoD)Is8a=Dy24_PP?;~Ehp*_Geg z+^TV&6D4q^K7inAVxZP7Mr+;bu3tFTQ2%?%341MJ^AjFm|tayT!45P4!y9voTuE8t%j80g(tElS8D>Jwfi zDhk)AFu@O86A04U#*{9^A?%wY{~#7EsJ(HoEJaagnh5-pQs8NP4>$oy;1*!C=AiZ0 zjUT2one?eueNs0y`PMi+^d*PSi}AJpM=RzZEf^n0l1y?4ExQb!O|nLbM%SCWBiIOP zt7*!;#Md|kN~Kk-MD!b`<~CTw;ne)uKE~KDc;Ro=Q}~0F)g*Pk>W;v+mZnG~)j-oa zObD9G5E`gmLmt}&GH}WumA6;5(hkiuWITy!(;=X}p4GLp=gYZOlO#-|%n+m4iI8EY zZ^%2C@PRdzo^=7kBFH4ZKhp$xh9Vi8g)~XhSCHd+n65aqGE>(okQdaiO$%3G+a2<8 z(XMyZ{>-FI^$2D%*{xdghcJu^p2On(${JwVPjb%Z0Qp$+9dVTD0=?*4`J+8J+#uMV zb!=!05U6TzAG4Otmd71~)ORn1V35353s2skx-FY-$X!6$Hg?nsE3V=0IWCjXZep=J zhubmjlWz`bK4QeRBIZvhBI;3ukP|Gzn*IJI4xsI+!a5(>0937}(Ms5~B+#@}8bR(y zpc2B1;`>KFi4sicTO1f;oBdl=>57v?77s}W^uODTc0y^>6--oI0Rm92eHt1;^6FnR z?^DRwih!_6$g#1|i%ZDWe=EM2Hhu2<-l61P{C<`KW;~*(XoCd{G1FX0+aopmzHjfc zHx4(;t6yq2`(n%MzV!Fwo}4Bt5S0P-i}dpH+Uf|^a=KNDZTzfx!AkuEN;d?S>o_}w zukmlk4C?Y;ibei-!5nQy;Ace`m`rrBYQa=|F9@UEX=`TQSAd-jK^*}=_lnS zv-_rdT)xmeAM2e+;uf8ifE#!2Q_WOA#>3z1Bl7It_}NlS=P&)< z`;$aS_h#03nXELbgFG3B$DcSredoPVzEZ>5(lg}eL`zgyGfqp;a>^$*_J=?qTNV;8 zS^IaNjetKXl2L=@MUeU7`eEx>-ab%V;$9`*jfu-%b7v7Ldjr3g=gbXX^3$(flvx6( zJeo8>^Drt8&p4OI4=<2O5vDR9GxP3RiUuj%;bO@T=EOjQe@qfHT_?(dI=a>SnlHPt z&#oMEuJ@!TCQklN@l|7JH8dqbRVCulV+|2^wU23kc8VZ8f#Rng{*Q$?#%S5GExxGB zCoH^B?C~LQjcQLBNuYT{aNeT!bKSIAA+ip`GF#X^bY>LUb140IX_}U3SEuQ8;RDO) z7p!;n)m%H9;Nq87bv4|3ZOW|Ky9_vmz}7#>%qA&ie@Jo4zi{K$KK(r_nREgNF^N$n zdw}GS1`^dvdo`S2G2^#4lU?n!bn3Tk5TbssLjD-TmE?29mvWyHEIK2qqc>Wk_=gFk zuo#I*RL+T@OMp_wLba6L1rTurBnW(imgIE5N)T3TIr4D5t}~4Es|_|N&@zF4Q7tZN^Q(-V%WmSZEoTt##ut}B^uX*aUE&@J@nSq;mn|SmnH`=F0S!PB z_BEJec{D=jZ*yUeZwaY;o*l>Ah>69bsQ`Hz_**qC1{h>z!%7njk<)WSPd5)dE^@&R z95nqrkodaDO6`n00?zTZnF~OVu|N3JY$}h3V9{=Md7q|mpN=)Bg&Kx~%gC}l zh3|sHX}x^ht?Jnl&LZ>x4Hc&x5eFVNV!`Xu6;(aGn^e>(9+qF!6C

IomPa0rXRd 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�|Z&|7p8 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 z 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�*-7n%Z;Ks!V~1+g0Z!zn{Qu=$R|= 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

;|cO(`7vlC#}inN z*JnAN$a1_n%kg;mh5Q1V<4Z{Mc$VgM z2bmtv(!35!^F;Zh{1GWerZpheN){AvT`sKK4|PuI%}z+^MUgL z;!V!ykp5pfUj}tRBWH`V1-Z66+Y#?_b|E%Chmw5`CHovY-pSsZsIm8E@9mVtS|P(* z;4PqJZ=rV)HSj*|eH!#)@3WwdwrI%OBAc~Ee@?l!_=UAaixaek#oD5g+smCy9`Y~9q=pYqtFC(p$YsH zf6v~M39JL^vkqtu9iTuv&;+q8{nK=)4h3hJ4x>07t|LI#f71JZPYu8(x% zV_A=VEE8B0BkI@j}tRbTH zMfxJp#-B4(57#3=kA%)}S!XoSW1%y`S!YD+NqRD9I zsGhB7BgJ@uMz9xXBzu8|8mpOVh3pR5jo5fXCa@=D0((M6uqR|hXm)5e#fRpEf96m) z3D0WJS`rjOk>&%bNAu;Vyk>c0^5*7!oZlmVTwYQBg1k-nOY*nmAIO*aS1cU0aBAL; zg){Rq@&@Hi%$u7ZhSbU6x)mIy3qANXuJFFXlEPOC*B2fxYEaaos8`X{qT7q^FI-df zV$qvL8;cGWZ7hx~Zd9C6w5@n}fAN^YUBwfNrz1~3@@zn!i;AWd%_%Ai=u=L`%LY{Z=>!H(1M8KjN(njU!m?D#oy*NTUbz#UGP=jf82s^^PVa= zTIekpRG3uQB(JEj2d;ihUN)|H>cSTn{-tmh!cBRD3U6JwC;z^}y9zcHj?CXuShukC z!WVH5I-}-gTz78a;gTkWYf9Re^eCB(ntKK6Eqn#_)+t$!dP7P!lx!*4RkF9_K+)== zg2z3N>yo6BCE#de?pMjIf0A2EmVs+k(Z-TBC|jb0?EJ&U8F`Jszq)8`e%-w3cs_^n z7v+!3zc25p{KE^U;kmq@w<7&MV4$48P~*kHb@Goqt!}W%*n1`-i;w`R(zP zmgVgL=dQfA`3DxxTsR=_cX=P=9bI@&;gZ5-#lI_DQ@FD5i^461f4ho2xc3^*@&B>+ zJ$`K+SH3e>_g=v@p_Hf781q! zaqrb{A?aRSgir`^s7ncTT^^6RtV8^WO9*y|OQ`FmE_GeP$Dyv{4|ToN^}aJo_p|$X z|G;~1KjC~vVl-!Ff6kn9X7ru&xiiX(?2U9rw2@$BDrUu-gJ>`lEJQS!J6JVXKG*`< zPK{&?>IQB{#v+Sg`Q?F)NW<mYbOU zbB87YrnZyOgGZodX2}6$3@!>4i!w@q&TY0S%O04`1&e125S* zuoJvuJIn=Ne`o^wDhyu&pBxY03f~z>8Q49rf1oKOhpVDR(fiS8G$ooC-5m*oPgF z2G(9odNDP+CsG{ML=BOg=wyV8wt}CQgvvoy2S_sxc&R|-Ox`_J|p6{>#`v{nJW zuoXuAX5|Xdq;gKV7*2+HyVRf5-w@sfexQX>==#HCUA{ht0{ zsJ4Hof24m5X2MiRR(AKV^k3`0*}vJp)xQ;SK6qZFKiuCLP6($#S$2O; z=z2ISf1ImafzJy2J>e3VZ{^{t{ye2xX;q@iv@)k`^mEE|=xXRj|FW`EQNo%1Ww7qR z3Z(dBt4}M;K(gwTz{(`U=zO6rg$m6KlnySyx`pX~Llk-`cJ>yL#(a<2lVpedlgi=ALijh$D05WNeOe}=9CeKK}OOgefG=u_x@pbYc}piiSe z17*fek3NK1{1DoXAI7@?Kj-3HR2Vy_`8a+IKZc58XE2|LowzK<&*EoM34RXOps(Za z;P0R(W4Er9;a1#=p2A1)5mb&laVL5jo3RyD;8*dh=$RN2uA+*mV)Seb4_C+V@NP?(CdJpcA|5tY}F&^ z4LXm`LvPZBbRn9jo9HI=7JZmLj27tcf6|@k0^LP-p|@!x{XMi8JI}QgJIVDfv&H-c zEywPaxC~na6}rMQY&=?t-4^lN*x9RVYzCWwe#d@+{Q|lkJ1zD5*g2^+wva7C@3F<~ zljsKf6kCCAvCpv2piP!%dGsgt1p5lQ!=7Xp(Oq(K2Y-f~+`&7@sT}-SauNq;e~~jd z_;cj+4c^Iaup9XEPOU%;3DZkD&>Spx|xLDn$ zZo?Jo4z(VCLw!_z6hEUrrZ(UzwNc%RtJM~@i2q*wztpq%+v@Y`3-}+@Z>tya0re&I zC45l5q+Y_U>R+mVjSm4uX zTggrs_W=q@#sS#-CA5ucm(5cY5&|K(ZXvrr-9V_rc4PT+JFccR`AvNR~;8j8=fU^Md zhR|)&w!bEH7x2;OQ9?BeFrn;cl^w6k$ z3tF6%d*C%O)EjbzmgGC3?V+8a)(}s61KwfzD)5sQi(>7}$g)zSR4VmKHt1o8(x46I~PVJftwe=LKRXF*dp`&nf~83AkD zA)0~LbGQptcWoVSvddJZ9ao}gWNfnGoq zeUZM1RP-Xf2;U79dIDa_lX{;=*|7HK0A-+DpiiT(0%bz^6X+pSj-E!_(KA3h(6gu- zeHQ%#(C1=zf3NLCEkK_~hk>$@9_V4zi_B;j9>ZhkQ7VJ_3d*6rO6^4zR3TM}Dk(1& zf|b6X8i!T<6!jBygqox#k(QdGrcgWV`2PjzsMn}-=({vav*;L|NGBpg?6h$=eT?o# zM&>c534M>zFdFoIrk!a=CmB8SUGxLyD02+`Fm@Z#e>h`joajffTaQjN0p>;Y6J~;$ zKr_rb^8tFDeTRJqy~X~5{RLWJ-(}xL7ua=n9bIJKXWvI}tAC=NLW}C3sb5FSu^sKN zY9X(C^~s zUMVV#N|R1qAVaz$tx5M~TF#csAk_y>2d3m5p7XL+?v#!0A*o0zmFlD>sn?}Ab<&cw z=D8zn0B7EZoH8vnd1_@(tnD>3IVG& zBp38i41B#X>N?LIsC!zffL@EF-av+2;}&J3Gzl%7aHY%j(zLV+y!)jSP9zzmyK<^z za8b}+T};0H^0E|_vmKlAtYavITpMywe;$)>%3=AmyeX}QX5>z1mS-ZAEV<;7P_CR2 z%9o}AsU8Wn5KYNO*$Al7;VyPoxo*p|@~l$_yU@Z=ZKw*gS1y%8Pl}xF%yMSAw?L;e zu)j$QWlD1(M^VTsxnR_b;6D`1?8T4f^8ekr%r?h$k-3adqeB43%RWl~ZzrnWf3`=^ z`9=Tf0171AiUParL17`#7|{6_ZL5Kk{w-U9f5f)O-x=dtwg&@gz=a4$pv%7)NVbQA z=YmU)OTqinj^IV9SgMf@J9(+o5plCpP#Tkh&Pi9cv<$g*>87+PZOI7gOb3^OYfz^Q z_?v+{S?UDtp$|FTY;a9F>$oN4fA^*Mrvz(or#)!9Ei~GSg1c>X_F!;Nu)sDNI4|ge zMWlZ@*Et!yFC(egogmdXd3%`jF6T=@cN$2LDlN-}_7!Q3ou33^sYQ zJ<~zGklRP`qOGVeC9n%xI zL-K&-gTdQUrBfp%Nn&tGM#1}_pC!o%{Cl0-r4`8Cm$cHXG!J#tf8(!Kfg~g>tTaQ!aNz9OH78b5*d~!&0$a64VHdL4Dwo|1|M} zpgw5u-2%Jz_N9pae-C{i<^`@mrcfT-52Pn{=fyx~ALZ`^=|;d8)1m$raJ2?oNon9l zkoO0LTv_MNl#}IJ#{}^T@QEJhnrww$2~v&_uaLHYHszDfIB8y9aBes^q#EKoppRl_ zoFfvPmJ30!L&Va)LjMrV z%B!F?GM`5S_X0D4eL#hQ@<1)*8w0iO^MP?O1-t{uHVQSufy=z;-wNCcI09Dp4fhQp z5?JsXg@~`vGshbPm!S2Vf$M=AfjizUe}gX*d?%C4$Uv636J|n@uO~=>KI3eoLV3Uk z^CdBu5~%Xte+;Gzk-iit-7e$?a)f{3t4ahCNDMO& zRv)1p^a`sEj8G(_^9R8r7X2fADeg4*hOft`@F|4w1fD<`PvI#<;b}aLRQPrLI->C# z_zlG1H}RW@#TW1eq{i>ycTgOD7r%?*@vrc&5QkUse=6EW@f42|D3KD;1F9TV4oXxl ztCrEnRF_qkQIhJ4>I(X}YDKkzl2un#SJ5X_tEyF$qPnKKhW<`%vpQC?6{|4=(uhZAj=jk;}+D-qN{xf=%{ww`gl*4cghrYlhFbOD^Nn{ey7nvj`3GHE$ znPl`OCWT2sc}yykioVRGF=;5DNoUg0SC|YYe*+aTnM@}7Dzly0j`lJ;m>uXbCX2~J zh0IQ7CwiQDn0Xi#F^@2hpeL9|nMYAE^9AM$=xfXunJ=Oe=1a_%(ASwSGharfOaW7X zo>V*34pgRgsa@zPwMXqiocy8ny@9HU86J?tuSRq!dsa+k(sFr~Zv#&S!wrP_7MHO;5H zmRxJ_|8486>#n%Vb>B^k)}9Ln8ceV|7oSv)h z8uKl8gT2VR-CJN#yc(~|tBAwiIq#bHw)eh|_N98p-Pu4j?qYYbH^pA$J`CJNz`Nf( z>@GI=-J-k3tJtc%3L%4E$m>fc|Mg|L^SW31lKV=$ie1w^Yv1TA@2j%c3G2RPf3d|~ zCR7>=fh*Iibg!81ch9=Z`jXvACcUeOjI4XbQVnD9yBEnwg$DPsYudWQea*cNxh?Cg zY0_HkrrkH)o30{js(ap=+C6W&@7@xOZqZ)qYc}}pyM2cZis_0g3UZE_PFcqciqGgX z_pBQcaEKn(=kX-i(~0yzqae#Ze<4r2W103U?iwP!u-?65l)Z{|tb4Yvg-^HF^&RQc zeJCFxez%B>GnQ)4E|AXup=^ALY1GqVUFVzN^CPervqt36S*k@DYCz2%EuZ4LZ7lcX zySF^GJf<~PfA4*d&$nW~ zZNKfi=3BQHh?)Ee-%Y3``!>zDd=0)uca3npO4D_bS4s>8@R4nKqv9i}Vef{M{>Jt-Bcf=PuZM zu6xD4VE`YoS>461YFC9Zf47I`Q*1Lm>#qI$Byj1$JNX`(Sj|Q97fpUkwVNY0<4a8j z;+Z_W8cw*HT&*!5KIb|Ibs*=80`ontQ&YCJRGf9pBEB-34+PvE?M zF-^?0IeHp=oOR52*?pF;5cAy`&>ncYIPC5O@2Yn^lF7@Ra{I<(|34LkZ&7i$q;OqJJCa=zu*=Va^rpE9_%Ue;RjD>+XN%8d99QBH+_e})AGnnAi4jT3t*KE(#T&ricY1m} zR!^2Em&_K=K9}A+>`n1%d?WU0G7CID`zg~Y(}w4U=LW14``mkdV;yu4a`c4}BJ=va-IZdpFT?F|*Vqf(TDQ@=hrj46 z_U&+o#Unjs-l+G4cNAov^xm~Arl{wVd&rpV9`T%Uf6tnSO&X}1<4uP(#{)!4^4xje zbKYrKIUC$l?$e%oVvn`KGhs=z$>w28B8>RFH&LuI=KJz|du`>uY;U#kj32 z1_f4wGGC>^Wjy1(=v{J~O?qFAuimuN<+ABu73eWq&BJzsufcl-q|F9h?DUp;4Xz58 z#(T=Uf9ARFx#bQT^UXf5-d^fmbvJl>!5TiV5{np4(LaT6nRfvnlKUGH0p-P`Y@koZ zB8KU)SmCG8(?A)qSmCE*vBJz)tZ;iQR`{7%lyC<+j-2ST$c-eFgF=8fzXEvk`{;2r zj(&uS&{?2jz?*aEYca(6_1G_zl%luMB6>20e?Fgzq0jOd`g}Te*Kq}=aU!b3Nq{w< z$GZS)9*m*P))>A#guem!@^B1a{&Ngp9*N;gO$=YQ#gL^ITL4qG<1xUL9kHn8cVkh@ zKB^EfWdJbcHvs=VLsg?;ss<3`NDM)~N_im5A@pV}rgHR ze^BSq`_vqu%-eu6uc12xU*ZIUFYyD^4eAE|7@*7#a1ymi{RMx5`l|}zPXWGs06(Pq znCe0N2tk=RkDyFkK=390s_J3YBe+nts9MBNkT@wWCUH{yHG(*C2|=9r>jZJ)Qi3?~ zlLTwxGQgTf{1n|o_uz7J+bVvVd5n1ye^)S1F_rl5nJT6hf19aens5_|uHrTlSH)Tq zSH(IKSH<5YzY>8vnE(^UN0}(|BK{tUtK#F#I&%Y?nGNO-*v9;k`7;&(#oot07O@nT zKtL8NY#f__2MCJALj=X*m&i?_c$lDA{4%?T-Gfh%yFKwMB>Xu+Ov4;|aEzZN~qD;95M%zRaG$|C8K%iGRxefStlWW6!X!;kVe= z*`MQg*f-gC@#PrC{XMybAFlzr-N5THT>Cz`VIOY*qJ04WLH%*SwSS5s+P?szZNc}{ zt?EPg-_`%DZlkceU2UXTa(5z?f2{6R_fnrwTh$_!LgK~LC)GbwzeYWzeqH@@Dog#Q z`WMtA>SgsZm9M_6{x$U#K(yDX$H{Y#R0)YGQ(q@BWvZ0Kl&L2P(xu7>(xsjvNS7)n zNSAt=#G0uJ5^JWuL1N8RW&Drge@s0?o?4`;<0s>%spsNfi=UzD$&-rIf4=zH`191a z$+PTKL;QvK3)FYw-;RHqY9vu<>K{o|nrb3ZY3iRyRGMmze=q(9bs&Bt{uXrzQ1zcE z4S5!k(vj!UsSffaI(3v>8&7p{DvqX(k>?MoZZ3}FC?od??i1Aa2|e_JRwc}kG#;~wWqC_i~JkW#p(xN@qWJQGL_aFtvY6(LUp zQZEu*P7M)UPQ65MIW zCsVI+3O7K#0qFb{>P_w>Ao2@<$bU-xlKUAT@~bgKzRJDMy+Qq!fBQMNNUd>~0FmDU zME;oS<@3_Ibe*tAWJ{!u8Sg-QXq>e`=4|&)6^9uiNi9C`X)Q zyJM$gw_}f^0O}luI$?3jo(%l?z};fs2izw=F#wqI*<0b!=9cJYHcL?=BFg zjq|-Xgmc22p-Z@UY+29hT-JUb#$6}wHCBpcVx?Gf{9JcY zdqiyLt}`aJM+~)Ml9*v~80U?h(6gEJ?YIJcuZoL~yH46s0X?&S>sNG8&Y*M1vD=y9 zoN~@P7oE$_73YX}&ABdiI+mQBqG-QE^yS>^tZ^Ehf2W-ud&C*m6$rcS!;VBAbYa^B zy*TVXejlIKoygaA9_CN-m-t)!Jz;;_+Ob)~xX@(vYqg-6t8Hswp@@*k>-ejDvZ2<{ zb*z)mY^&f4wOde9#b38=2~^vfP+?r@rVLjFjc9}s+yqN_z!pQ|h&XGHi1VP$O>xVf zYu^QSf9#1_aom31e#=o5(jTsdAKf2>-UgmXr%A(NzIE8v;ArV`6I$nv*8 zhXVHD9g_}&W7=`f;TI+ytqzUjlyG0HH#xdSg*9P=&u^=3>B4)SWGZs7U ze><-^4?8Y`#@56|C+AEB`|q$PIP0Cw&NAW^pn*Nk5vS-p>zuVaoDI$fdzLfFne8kC zt|@1+co;^o2wpVjm~)PS|BN_qIyM})oq5hmr`Bl}=bbq`GFBQZ+wbvN{4PGmi^JqJ*>DDDvl_8fu!%y%t z`~pZZ5A|KgmOF!jzk9M>77AegMB7gahOW}1_qz9+9572y2%|y~Z{>&iac!sJe=>hV zNI$yEFwB>0bNCkivY-g1dKH3+o6vVYpKDx!5|_#0aKXw(lb<3) zh@lu*GZOt%$>);4r#6;kRZxx~9=vAS&{gx0F3N*t) zQ|o1YGSSb$Egf&3g%W+0j3v?3Ya}U;A>kee;lllAuKI?6L<^dmH zV%^S{Tled;$e4tkhWuld-A#uII?RTwj`f4}WJEfBYnQI5<7QhyfBUW07VU^Wt^2Na zh)7A~wDy{3wNs$a;ntG&lO2aa;+Txup|wVSQTx@z(r z+-mRA4ry|U?b}ak=dF|0CF^vTM!!#ga9(|8-O7GCE^5^yPfvlrx){O(19c9GwEln+&jz#{A&Tt^> zh31202kQ@-$ry#DW0giu?*k2j%)*{S1s{%22X;7+t8LJywe2^_hBJmUFD!N#+j{`P zTsnAD*l7fgj%;G<))J_r6FJaF*MZ!l3tgI)JqNOMldWCaevgDJzd9!QMQuRW!B^NC3FwdKZ%%>0OEnP>` zbVV(Dba&0me-_qKtIg?1GT+qh(C+A;4mT}9t zcFHz(Fz4tkUDRf@1+D4-o4xOWY9l%G>~6ILBNIX#;xNQv9LFIJVHn~twh#(~`8UMI zGS)Cc5;6!-cgt8vjX*-`|9}vL^|Cx4$9a8(5QlR(f7T&{C0@sId>qHJUcwSW2qDBF zgkcy${Jb3N=MabUURBL*=Kj3P-P`x}-rl`=^-7{z)zww?eP4aQ@8{}rgQ@Kyz?Q&L z+A_kChJn@_9*t=8ac%mxmew0>&suw3;fSW~a5%ax(6-g)tnY1&X^U%{4@Z2%ZAV+5 zw$--wf7Kh>3R{2aqZ@3j% zU|PZ@k!j``u$a}z2Ib@LQArVuJsR2PhkcU`Tau?8$gRDk{#ZNb8i%^sewC?ZMVe@7fZE0p%Zw!>|4k!8-;evQBCyG^?o z3&7HeAbx5Dt*n6HXJJBBDd_Hr#IdT`+#a8=pWZH!_9A)DeXKNo^H+&$q_O2X&yq)EH)-v6gUl_=GDQ zf6f;Q8|IlFdbnZBXKqZ77$PT`XY?@4z&?#_E#c~xt*|Rn+PV|=L{fmhDv@cJU37c0 z&+HrKjPzjpy@or!JvM{iizIxaU_ z;n7wfZKv&xL2;Wku|P9}i{U|fF?^MJe;V#*=ff)vwJkS8WW6Tn2{(fDAUxT4Fr=+> zhOYq21=j8@@kPSdA`)Y1yB=}0=^Kk8L14!Ymm|{Yi!{;=^R6I>&PIU7=v`Q3yn*!H z_C+FYpmCt!X7_99ST?J4cJrgco zpumT_yBBwNcXudW-1Um{;_h19-HN-rySux?&p&g?CfUv9Zf+)*Om?3~H$U0uJMf#; zZ`cALvRKvV3TrtSK`&%D#^Gsqm9hjjd>i<632mJhSNrsMtDzNtAcHAJ!iv z@Ez_+V}pV#JRznsh96oGYnl9{;>Qf>kAm69FZ~zdS2$vkn3^noawIl1?aCR!8&ddA zq^($pD>AKCkOmu9P81qz1ZUO}fKvpHUI`q>l$yqpMxIFOxv7GI#^(jl0;ut|V)l!m zDB9<`Lr6oK69oju9V7kt8r&Q0Pu}61-9u2oSMj#)>dPK9vc|^930Xmu~$b{jlVSt6z@Y<&<1lu zFL;i<;=O(CZK3(;|BG^qd^N_+VlsJCyEHawy2N=cN4B1unnwUXZ|Q@|dM2oOT(xD# zGat~!;#>JSl{BkPr#cni(bDKAqbnj~&2h9ZX>BlC@e_~3GF4^L1Oyx3H1U0L&K(|@u&YAG*?*3 zkO1W;csR*r+^pu0XAwtauh=*8XN(62$MiQg*T6TP8*0~tH~f}p@;t1=W*o9JmJ^i| z70od1ss)qmNStt-Ugd6<%6FFY+4Ejy#e_TV(AW;xi(n;XCgZJ1z-V>}Vl33S06x@@ zgBbb)0ga;_v_ruXmOi4m_N&_$YKMY0Ed7ki_TTrN!sKc=G^T4RV-%%6vfNN9apZV^ zl0q{yriQO&9Z7J-75Xf(_>fzEdXm5y-if019D%3;rcsT+ zrd42!05R`owEOkqY*ZsGFk}OXh{x~7ZJi*jOQk+{0G?^XB=q{jsn0!{bl`P0^tvMw z>$3AtYZ-{g-i_^=w9n)d?RtqebnpXvr-ra+eZFtfz+K1dk0un;T!@+#mPm=Q;g5os zZxOkwH9v!uef}FzEam)9B(azuGLKS?A|gw*3g|wPN`%Oxod0^n5=W!E{1J%h*-9G1 zKF;M*?EltPOMLy^w>FJAD|=rz!nH=YKe9)Gn7YdK!*C|G^Vu|>t@L6aT^2b0rY978 zn|8Apm{a|8I0HE8aPQbAqy#gicT4@~lg&dFp<{W3K}!FbqkWzn)-g(t<4>8>{mW;2 z;NC=T&C716z2!r|Y{!NeblN2D)GHj@OLpf-n;5@FY8&L`d#t5bU8^LEp%BXLDdntm zy;ICdJpqcJfFhQX1bd8d{8~>psdH&@XrnJ)+{T!yZov^CNFAW)mbTnGb%diQ>vH)*(2HD(;@SzRm#0=@n2SK(* zc{sxFVbDS|Il{i5rVBt;@~Y`dlQuv4F&EL%&CgA@5136o%l}a!fOD z#c>R1rp^#sN!Pa6gFquvAO96VtaQ?!kbND(@BTXi*Wk)Qc+7woq^y$Rc&4_L{Rffc zljFCbWGVO$>h6-i*-39?yQ%9p{|=!H_?#72@fjFsfI2#@VH~g=xjpz%puJHoPHQb# zC=q1&tf{A%7KVP7(j`hK_CQEGBn|pP_M5h+ zqGar>pLb(fl{CvvhWCFF7Mh+^e1R_c=FAjRrqSK;2kAO#PHFe!LF4^`@U&@};|)U; z@#zqfNOtU-;19qQL=_kUS{jrGgcU7afcAB5jfWHg4D-tG39$PMRy)66R*gjCXBHRW zI1_M#<>=@(piBS$pbK__`q@NnO%+8H{M>-f0$? zE<4!Mbo+nU%;LO=(%La{{E)A~Hc8MS^uS;G(#w0>REB_kJ1GZndVI_-I5Ij7_66Q@ zk0G5WI8Iwz%{I^DtAgGgbas3z;>~`yC0X|Pe0l}UnF5i-NW&yV83`!ZI|_N}GTnIQ zjLgK0^J*-56yx#~s#M5;YSLq&kzAIp7k9a{LzX~OqtuC5x;CPV1qw-YL3Yn!>iMv# z4e^%Mo>HKixG?P57^F#0vr{-l`Qw_)@NL$(R+S3T>3yxb_m|A;ARE>k)G6asnUVuy zW!sQ(I3&(kTAm|{#XcT7qqBD2KEmC@i9sw7WVB}x4@7S7Jq}+&Y~FC}ZGPLlfw+M= zI#=UZ2oe6(vw3df_3+^Cx?;vhbQFuHfPX-{m~Rblx(Pw1K-MUEY!~< zUR%KoU;3RpMpF6BNX~cezGJWdiY~=60RC{!chA1#*RPsHhVM6rm-Eos%Rj|vpUQK; z<|eO^`-Uco#6LnpV+{l&-lG2_?R@H~eE9ZZ5=wO4DMt6E(%16|U329X8uUqTyqzrs z3Hn4Nk=%*5=cH$sWG(qx<8UAgAashGm@AcBt&|*n)Ko`)2g&7uG z%>hH`YQuaK< zQhQsD2cC;lr9b*TTLM2OdX{q!M4Y@+QuAb}Q8$Ml9WA{Hf!!N!yWMqi1$WTp!Qg1! zGpu#Rui_?6`nUQ7>k5|$PIYU?7QB)K>TUCLbVSgm;h8eG3c|_qQ+!;2fuXL2tRX9T z{xt(u?B0^mK^NOklF{}w(+<@RbDjSxm!j0z)C-tnrvgS#*#U&JBEdP?@6)-WDkniX zF$kWi@3w@Q3?qAE7`9H9Jpqb&)fB%M2+;|at3AW3-H0t{(JTEHUU*e{oN@zE13#v) zjaXSF(9_QTKJ0YY+EPopsPYw=Vf_r3Z6qz^UDbDB0y(Ky=vITcjPcsX&62B_XlD@X zv`ic6btTPRZGhGNfSp|U;{|#u53?9-dV_fNXJxN1MvYdZCe2Lyh_H@8RmZ)#Qn>?Z zkH6)*`hc7F0>O4zt!-G9v|1Lc$v8|pYH6uuh)t_i)3fIDjt4`t$$73>PI)53ej#%n zuL{8eU2?e-{TPGWQx6>)XIklStE*tYTv+n;TZLf- zD4*sEYpNj5p&nr91Tjm4nGx?r-jOPT*tz0H{g@ASj$ki1lfmw`B#%N(nVJbngkz@? zr!0;dpXHC%Yq?ZWJR!By@)aCk6o1=uH#;y5;n&_XJ^qFjwA=A>IZs8wC(UI^5*z)? z!gI%)01)nQ`aEZu)>tK{6&*lAxbYPo6MheBu+@_tKP-F>Dy$E(i6G@G3 zP{+Cj&roCd2ILuDPRk?3XLPU^>J6of+hBk5cl?`+ihev_uHLdq8*R}@iEM2KR#;NY zl-je^Q5GoXRq0uFh(Tebq z1296&m7V5Lv?R}syU)d?<4T?1P-OMk6QfsMmodvU@rx&((b>RvU>(z`m~swv5V|Ti zz8TIdh(mY(2CWsdkKXg2_oTY0i@Td}7efwW!sT_Q;eC2u_Dy%K>4)t-u{Hg!5pS2e zdFsFxO{WoMg~?Bd*Zh7aUoE-=4RVgAKEO_LAkCDM<>zvgR_h3%UWCI#@;$ZXh*D{g z+m(oNtYZoX&7cRV!YwKBM6h4t4s|DKAKbNYt^H0;Afuco0t?Wthf|$!hh|_eqrc#YZ?7apaS+} z+Q&$Jd*bMy^Q-5m@0I!uE3guRQ&wlzPx590SrN+FCA4GA3J}a{yvMnTq-GFo#c`6w z^KFPXr{(nAD7@Ud+FI5TEmJq3aXeB$lIyYpEWc&UFZ7NcRH>5EKsW6-7Tcl9#b~tX z(iJ^4U|i`A)Q^ceBWP28d_=AEra+073896&@<0Ml6n=ln_YoJaRxa`55&^_|iUu>S z;cv$dYNa-SMO{>Buj7;I~g^(-A_JO^PVUH*6dgJAzKvTx@gX2iNy(!2pD%9PSa5 z0!ZrqRugtEnWeYU=;y!TFz4v?xxDE*m^>2_PbO&{n({f9H`Euncbto+GC9ec z-ukF$P)gP3Kd0yZ)Ww4MKHFZX==F{;bn@fprcrFhLuXA5n&hX&|AjIX;Hx5O-qWOz zE@_1)+H^tjoCkqy!kSQZ%`B8+8|KR$Ef~@Qj>g+1u@zhM9U?reN=+uGK*c z2ZiK1Vb2{yVPO1UK0^1h8Ai&-rj=Ok(-<{L={s4We0WzS8`aGh$6#^ulCV2U_U+(9 z%VgSp#>=_7jX8-_5TYn!ed`R zpgVj#;xj*ad`1!{C`k8ZDWuW!GC}u7Ef}@^&m)=PNv6ADnZxW&EQeLC13~(6v-yz2 zD3J1qv0IfOyAyJr@TMqW)3%LiOW|9=>4LA~iN|i~=h3I*{*zCAu475h<+<$y=+lmc zUvn5kA&JigW;6o0aCi*#YFu$<*Oi#-Um#!1EUrslJv~e08$cUfX-QX)Z!NyiFX>Lv zAO45GMNl$kL0ih6d0Z0Sp2LJVzkI5DxlqotopgfMIez)&-}@Kh+HdaxgBQoe8FWjjicME z{345^A3p1H`G$AY?s~vIzOBXAZ8o>CS56`w@wpWuTyF4PSw)-Ns}iQsa4`H;&;+`RqNuMvP5-OA;TfnXy&P-ZEY;LoCyC~w=bYK85_Z^3dG#yV-_B~jWYZ}kCXFp@4 z$D(0tHV-cgFB>(Z^%`qP;xc)8mUOsJSHxf!K-dQ(`wPDW5$-EtxU`AejM98?c`xIa zC@8h%N;Ka|s0n`tmBkS&r%fe5RCV-ceG_}=f$*;A3E@Kjv2hb@1vbDMatH*L3@mgi z!k7Vf-jHT?{$6bpw(wqT=Erqnc8J0y-$1{b2P^pGJgqYhYaa6ta}Pm_Q@^+uq4uzC zM=WVvkvtmPP@&i_>suCDH&sW)MPL(gq!HwVQCH`>|7rG@U0apP2|_1Pm_uktu&OoV z8@h`B5$)Zmo>q6e)W!6g=lRuox^cztvbqGIUgUCAa;(FNazsA+$hm>n`08|_{)FND zxl#6E`dJF}b|MV$V7vd9VjTvb@%=6U*)Q%hxN}kf4eJNq^(F$9pQItj)etA{(p_t} z<^V)q=i-_7XOsY5=%c_rfoQ9(0~_L*VgdApNQIL1PhtFuDDhTXug~X+h@Kvz_6RXR zP`Z~}&=cyk@1Nl6)p)f=tbzcP_X}$wgzr0;JI>v)=iY4Hl$W7Fmy~W~d+?MR}dBHNVWD} z5F;t$TIj~s0CMKhdHsbg29OBh#s&U_)7;+qb~C)HjSz?Xm<2e-{VZt9+y0 z)dQ^Ue-rX1^?ihke{FBFNbSNQ1iZj0r&cxc57@@71&@N#gmv?{%BTnOSjD$I3zr}am%I{=@UPg;M`vfrAFxf(~Ltl*M zkgg{s-lau56Or*3z&z7q72$2FtiWVp`MvM&13 z7pRgmdoo1kxLVM}L8-X8(|p^PC#`Qt-4(Fhb-Il!-;9(6iUK$+cKA1N0 z&!-=@G8#2j!*5p@tzR94cyiup7%X8L0-FE6KduP$rZ;R(`9dIB57wKwr$4N&T<##B zKh{593oOW66kQ2S+gfp46P#BybPjyp`%MzMqhIpbzjRr?DIm4^ZiPSHLzp9>?HceK zavSz^I(9jB`G4^*H@k0cNXCtyZDbST{*H+)f(sWIDnV(!Saoh0FPba~g**a2Rk^7<3uy9Fv_o zER*p~mYP>9ZTwpyzq=kIyewmUh`MLKKY3yA+1jP>?W}W5RU@U=f3z&C679=ntuJWc zT3j+M0Rg(b%kOU?NpU?-Yx86FmE%)dcs~5#C)RQgYj<(pQlsl{@E9jdu? zR(BE&c+FVb+j4VEs$zMYKTcklGo-^$B4Hew2S>gh=)7!$5B~=ks|xbEUVSw_~mnsM@TKNsQ%y-J`;GybU(U2CJi2w85nv{gd2#>phkb1b_^wVt`a%DuV`%ik z{$W!s?E~|PD89AX+Zj@FCFPAmdTr^Aqq58L^rNu*@QRBL&Y%mk+QJ*wphv$;;|g82 z%v0st9Pl8=a}$OUw~=%a;n2eo(nezyEy^ zlP&s4c`?x}eAzvTHt_`RWloZ->Fz1#vb%nqD3l6-e1zVq?~AH`-xtki59q5D6{}R^ zxs-CF^Hj*I6dARgIJVZ zcXJY?4PXj>c}8^HcG$grE^u@VmaM4FU%q#$Q=>j@wY)+Fmp|97YTZ_?ahY~%iWVpZ zE!2-~r55;u?j``0rdb|?f#N?55^iON{#Lo%a3%(N0&W5#!)cS;32X*a2q%ZXpzr^U z5vd7r8I7xepin)Qi)NTr*Zo0Iciy@Re78rf`$JZxlt=Nlg%JEZ%5wk=wC`4iwtJ?h7F^&esV8W zDq`vG+|d`|J1449SC!`KM5vVQQy-lN1>h{(mHq^30fzS3=b;t}`~t-6 z4u$?qTuHaie_3pox(>D{E(!LPgU4KnntZ!!`EWqpfTOdA7iPHpegK*W_9#xBf9SR9 zT?vcFGaHOGdzUwahvKa>gH5?s;lCq(tB9l{`9qSJQOKC#?>;Esax6X3FYP+Nz~mB4moL7Q0x%kM+Eb8a=VT2e2}<$AcEvc}>kw z45k6*5_z5&N!J7L+dsoaUo6Z_)9A4yh!ja&c?LY_QoH&U6*%p*IHwJ?-g`D~wLTrA&GG#`z+ zKS5dAGM|-1IiFQrHdZ+djnuIvRFZVOAc2qsGuF}aM(4E7xa{N2!|U@Ya{CEkfZ#Q~ z<4zAPu@l79W4NytWx$mLS*=Xcj)EPQJL z&13PbmsfVRJ&UtYv1oiy{a{phkq=M_7q?HNwD7}s?RLxmMSs&6$-`)}H!*DU;0hxzhYuX#BAP@vo~#TGm^Na%S|9D`RtCT@=zC^qaP7-f$RMvX$cAl2dYN536OcrE}ik{ zwRC^dDaNp@97j_QE^r~aC+|<>%Ga_t{4LMCc2pX8b}uYf>K9fT>F>LHvQnD3@2lur zppi**IqAxvZy6jQ5XayEFKT1Kr;hTgr2nvam}uMUsi>I{EcxD&whEjX;1z%9N?dT+ zDOehpBHP|*yr>Uo|9Wq;QSR~cb09u#`_);jqu+9yQY=+dE|W;9ud^S`p_-^RE_H^< zw!EwnP0doNy4GQyQaspGD)Y!$YO7%ll2R+$JuQRjg8&t%!R)F8$_C1orIj|S;aC1s zoTn!H$J5zkaIg|LBmKNiF(o%-!QinM3#b0HwQb|r*XBcTM_+k9o(q{B9;m;OTx%98+R2Y1{MNSOe z1SuQ?A6>)GLQhD&;=S6Wq*?if(W7+`;lXuKeh^WXpQV!6bqa`8ZdS99Z3xx4q{DF= zV6vC?*-EhcTn8YAwy+|x zYZlOns9sMo6(ChliAWv==fN1ciS~~}XU@c}O(#DM#emT6HuzW7mun&P%A{OJhQBHIB4O*+S%zsMDY>#kjA!*EI@h2% z^1G_}jnvhhe+N7#5ptX=wM&~MRy<;QpwnwMP-UqQ2&hvNDVssnfICH@L@6qL@i6BO zzln27$HQC?#tI;He2=QDB<)CO>xM$81e1PjTh~JHLo=_d<5J`+u$9g<2{p+v$pLh7 zRvO4ZGwcH2b&tP!9WM2@$UXG7j2r(xK&OvFVpzNUiMQw@BQ_dWMpGKUo2vF8>NBsI z8P~9s^4i4*MR6i+_$*hLcT_jmNq6gU)v=pVeO; zfCPfW>#)bCU{bSBV zZdE3RXN_3r^d=hUMK74#>F}$1GJmb{M+fC#^X13WtA}e?Td5bbRTw;FBVyjdruqdN z(gNU{MxHsWBe5*U9S_hQSGUizyt%&kPhIF0DF@^{wijmNJ%&NyZ}OX`1GsJR=DpfK>%BO?whXZI^FMXQ`3?sF{MGZp z9(SwD4Oz10HHQ&)7UKFVewKQciQO+-$_j4P+|4r%oXxb&fOZxKn>*`$pta43*rA1a zaT`?%4j!^Ix{m+sECbYO8zt|07NSB^XgjGpl{>3D%@S3Qt6Z_$>N@$xa#Z_+El}&$ z;-gt?F($51(Ycn5mAJEcv3UqwO46n`voKRL3-s<|p_Mq{!B5_2B8Ifpwb%8^w2g}R z+GRE|xYZXevaDLZ5PC<74UuOO($qrY z_xC8{jnw1ZFN`UG*Jj5u$jR))Tf;AJUgy6K_RHGV>?#9i3)Xgv%6E5QZdV(pLb7bw z`m<=F%~fGFV&q6%L&#Z&)l7hZ3eMHEIp14Z#gWBFWHh|c#lsHvnQpu?lYM=0#}+%D zz_Z!{w2H!eaz0Y(6!m~WKU-@p!j>C!Oz9N-bP%ZC;>xMvg(1fN!|ryBo)>?aw~e%S zh(AuCe?88ZVpn?mScw|oY9eW6h7o%x@=$J%eV7_(#SBVwQZ`Lrt69ssvpqD`AfxQx z$OQUYbsMR4FDzwvu&74ln&FsFGXD=1oiV{lV@-W}tb2f)hMO|Q|E}n&E{RG$M>6ZqIIAp;uC1IDXa~ngWnsx0Fuv%J0nJOv=l7 zHnhY-!DsRj_%bGRQIjR=S!i;J)p=c<&^YBNBR#lF}ts5J0hL#TS%bgVVQh1PyzF@y93rI~fx^S375EV9#}t~HBz z{zQ|T#Nk*LK|7926oRYGeZ9x+nJ|)yLWDF(_NJaoJ6s&IoNg`23X%hogNNmoUBVi# zg1EDt#}HGylkUg`15-yg-ru7mmt;PF>#QE4`x#q*c@XH{M{mUssk1wv^w+n`I@{fX zJtUEcoC6MB-A=D|yZyKF{ZXMPz3ICfNY>S#>BQy8n$7hk9ng) zg2{y#7#-^6HoyR+x01zSYF#imogpL!K8h(bUUlr)rA&&0B3noK+5epJg%x6T{49K@?|EH9Y6%aGbcX@H?Duw&$88bHA&d{dZ+Prcf7FUxy910iBLET;G6u`~&8gW?ZHn@hnP75wK-98QRA`787F!!JG2l9h+WZo?t{vDaQ!d`r1cy zGM#7~*&U}__^qz-sj#+fukr6Pv+Rf5bcW7F_f+$_2lsh0+?dQeE>G$cirJhL4NYER zhwkfBcK=|NL{0}>Bw3i}lsjAR0qS=dDGqjMF24+-EG@+@d@p=!z$VhMi~6XvQdJ1s zZ7#E#2Bxvw$p*GIEa=j*jK05HgcC#%L?L`l6*qTR7e|(pNpCIK=TT+~f)-0bKc>qn zPc1pTllxre-PpWjn(6l(Fk9ZY&y6Fiy-+sBbHk=GT8i2uAB80_YN$+9p`?|CqDAqi_r!OFkW1y0v!NOLfJX~$rHM299QqQ3ailhQQm#hyo-H@Y6@u;3;?mv13_Pi2?2 z=*HH@Qp-GZw48|wyEF>{kmGM(Ts>dyU$M3RBor@*;62dFu5<2jVcJxP9z#_7$GDfR zkd2~+dsS5RK(KoU8CR5iXq=YxDOX4ncpa|G~wF^mJu#;v#z&IJ7jWe zwpSEA2WGCAbLIXn?)gg1wD5ciI39jVT)ce_39Nlazx79*{80lofuUMRTW#mpitYKG zDzi>@Ub3rNr?4#-r0nA#p+!y;U)wfMchFPWvceehM&SF=74Nl1o!b~Teb!1a&%v*- zqV}lMof4NP#lsxn(LD6AJtSY=2bB^Lj?PVo?w#?IsZ?1CRmAnqNSj0e$gmYXL7v z`_h+on8^}v=Zl-0n~cH(C^U?n&EYS}F(O)@aUbaKhoOM=?@wt5o&H-*hkn6l4JFs= zav)Wb^tKAQWiHej@i{3}CLhhm>oL>myU*c&w%AQ{d0de(<0TM`MTp)R+*eK~L?J3L zVDk8TjweLXDljITEOrPGu;OZ^dXVtE6O1k&M8^`spCw1heovNqwS6iver#kNkZ$-kBSAjMG)pa-T zQ0~um_Nw>Q`&UI~+UL4MR|mq{xn*HpCmSBX2GPNE#j1bSR;Q;?K{x!j&5o9Sa!Vy> zmH25?G$YUk!C~b$ej{lkxlhYigdv(U%rPp7ZOeH?^F+W+)!%>JQ?D8U&3l`OjtPtM zR|nbKY_Y2(*G&?7!{VEXe;H2bcgT@slX#M|J8yk zRmJ$yj%!36ehpv+bU3#Cslr?QQh9xKr2o245B_*_9`+~ZxTN$ASw){Um(?}wJ7=Y> zP0N$lM}YZysqJtwuz7g@N+hrBX7FzpI85@;zi6HOJb$`Oo?mjSdi(RCvh=!5yIB>j zkUs0C7Dh`^iDRGJsOhDs>r{`vLQ^57$b|f1NN5+;2t>KFU2%l9YU$#(SoJjs=f`Z* z_F>^nJ?c~(ZhTg#XKq@tMG#_z&=0>!ThnyTqzzZqN9}27*F7bwb97E}hi#hUk6+fA z-M*G@e40PQ5vqCu7&4cPT?|*u?l`=N8{YtWR^rSjTD8*reM86$2zhXwZWojWxG5xg zzfSx$04WP5+OG^059fn__NNZblcfRwM_~X%b?8*TA-y{+FVsVf2)HaXyx^PN`H!V< zw%^jb;89$Vu)ys`8)s({OAnIJevtst6Ek%P83-5wsX5RW5T`;nXV~Czw_X}KuR@z> zKDfIP*QAD|&H9b1RY4bEKo51X=M^z%MeIrd=xQ?c?nbU_p7Rpw6fd3ha~e9Yo0^4f z|Iv=|@?G-d<$cP|@A6M4gdHmPk2ko_>@bXD1IQ--;l4FlgwJp9cuetKpZ!@PJnqnM z$jzv4)K5NFURw?~WQ4cLK2)AlZDf|#T)CS><}Sjo)G>H>m|cW%Cy!fDSJ_*g;BiGC z0L#_4hIY7jrK3&Z(GaRXduH#rOj^Tp${Nqm+JY=!hKLWSaqRsMkC+y-X#kT zG>FT-BUHmr$Q>!%8x=_gvBp`nVojnf0{=@uFV+c~2o*{rN>^f> zcdhrcQzeGj&4{9h4fiH_{P+|)GI-4Wz0RfV1M|lBX5Q7Fpa%brSdW>uaw71pq%MU+@SLIBgW%(K z@6G9GbPM=X)@7iCnqSc=J0X9h5Ic!}w73;rbbh)mOEiaM4#7o*j|JWcbmdY6gLS}f zB7A^Hopi%=S=(C#RhyCXiT@oJKN_SurM_CVKVswi5d|(0K-lyqy>}&X(*mo^VUi?V zgF}XG5fqDL3z3Y%0>h0+QT%BYgQFeW=EBa@gfa+4f_-XEjbAb4*8NG|jLj=wN+^8U z2nodx=>sb&5)mCUncU?GaBh;%ukL|-Pb9w2=fqaXe;l0lY19o~ZNAlVJQlIV!PICDX zaMCj;J~xZnz(3d7TIp<6`&+!`^5kbyC{8V8CQQ7QcS`s)qJ*dcI$Pr19y5+IhU6K+ z`89hKoGVDhMggMd*utGMh-JA=$mW>M)35TRJlG)E#!Ja@HoLURA8mwff(Po&_#rZ*5@itoay6pLMN*V*XTfA*g$tWAQZy zyqv|T|Kp0EF)vetPCd&#nA`lVS{sKEn3#QnnuvEmtntsAIC!A}(u-4)Iggf_BZ70a!)LOQWX~OrHda zU>KvH0mplVqyR*F+$%+S1j==~^Ba_02W%!j*#E;Z)+FGzIr}rpJ+cqfwG(#-b6)GO-23R47v35G}t!RsH#q`7W^F% zo|${5Qu$$Tcjba=XAa8?%7651Ic#lWBG06>FE6T&6n^lbd2c%!HI-`A?y0887KQDm<tqe&t){Gr;;8*LdEd&)E38`Trk z74m=SDudF~HK=_!^fg%Cp}aL7fj`KzpjwBVATiJ$(x>=9r4*fhw&2-+0`3bGa@FmG zOd!%nq}LFXMMRbzN2H%ALW6#f1^VLkeITm`_Bo!1N0>@|LjH#86rwRrX7~RJ*>NVUcbukNfDxZ_c&%CMXDWiqt7ws4QXSBQO z;r`>dA7igpl{1p|`4?7jrXKUTWR==po4zG-@xwK{&Opr!Y<+DqNgH4Xf14Z8yTn?< zTalwg$#fje_ZU!no@^PEt@=2sp0b(v+K%%|51lvGcQB`FtCGJmdPEeQqJm{vgk=e#&NvfCvyIz2 z)$an#TdZzpqmx4QS_7YK;Si}K9G=zFN|v4r|KHMVlbZI zV?;&U?w6v8Nbzby;lcv*N3)duzz>a+oz5PYwxfgszG0)-;BS2ZxnyK3%+?XaJvn4Mi3@Q_WYzuPvLWgo*h4QujhNZ{+%1 zNXta<51TzhlO%REgJ@!k7VI+sM{+}vr6^7BnxSIPuAirRXE9wfTD>9qAN(nD#X=&x ze$xG%tt1+MRUfc=GaglqMP3oGYXSe9LMeE+`OADM>{q$wF+~T+A=?Q8Vpwe!_{b<(*Yl3;8fQ6bX zk#(xtG5WKP7QXD=h^qdoL|js+qPSmTR;}@;&NLV;Z3&=Ou^69|I3KowQ~Dv<6?|{o z+r!GTO&e)Ej`HA9kTWR7%H4&E64Xg??0Qwn-xda=4GNaw1qWLDT4jT7-jlb3v*8Z{ zw6+xOlSGZQ)M}xnywSWHqcIAw9CqGt3luqSZS9%gTu^Ly$iiIOP~<9qaflBL2k0YR zP)s&$M+4;NI`$L71~81hC8CH1VDx)P5=*!!n_wl;=iyVG6bd5^{7|mF22j4JzbPhU zk2tyqUuM)z(xqM`wwSKCPMoB3t9{}kD4rPOCr_t75%r-ygB%U~Dq#eWzUKBsjlVUC zPu0pelFFa-cTzDMHIdN62Aal+V@=F9)K54WvA~p5H{aI+E4K#abSO9Ett7G9g!}`m z?VCOrAcY9zA9Q{@hGH6(`oME6`-XZmUXBHycow6&V=dE$l<~a-eumUobo2{7gFTZM zruVUX7>w_#Y@0AhBnvvtgcl6JT!QjVe+tPVq>u+sdmF#C4>jrAiU5!8e1`oGp@|+c z7Ko^ZpiM=h)oLI&2&n^m=ADe%yuDd(>Q3kMVM%&M7_KqK)xo~x#z^Rho1#P;;d~*n zXh^S#cG--o=;?@D5I*Xx8(}04c zSm3-)^EV;e3Ex_Tt)5^U)n8LbK7E3x0GmKtQq_v!#gapg;ZL_I0|>(Zk#v<|aWu^q zC%6R&Zow_MLvVKso&F%vM1;6OK z2?wBc$_q{j3qifnIPnZ`6yiW8`B&76Rdg1~c|gk8#B+ox?ctRWaW>@TZXECXDPjR| z#T(!t;TMSXC~5a&G}0h!yG~?c$f+KZg8Px2s+fDM(yr+5sO+2}Jv!c^cg-su$}c?D zm%!C^c+50hF~j{-^aq_C)3AQ1ATE#R)_mQKZWLiF{ zXCi4+afsq5Eh=Otvu9_OZzpL$NRI}iCjdiG7ZIPXR%u#r7xpV}us+^SPFN3SwVeC( zuFqb%5cLh$<#dE}Y?aerG-X`(5a<)gg3g5-GpBw%3Q zUFBD>HD;EC-FiVJ;8bM6%yHqffye}@=zB)WH=@CCX;i*oG^ot_f}pW4QMSTpiaRr| z(wJCYfwDfWKTRA*7iJ|H z!|zF<9b?tc7rWOBUkg!kd^^(P*&KCL8id9aPd`x! zi**@R*f^dS6Hd_LQShXGGo7o5`EpP`6j2TRt7B1~1HSxVM zZyPkqX0_jUrp4e@;zc2+oj&4`rOl90T-;1Go91)*QDFR z2F>Y2O%I(MaM5FiYla2vlBo`;fFxW}g^Fy&F~ah^lBp`AKlP0D=gP0;RTT8hD-9wJ zDq5~HlF_8dT=`+({6V&y zrMKjQ*m!Qx@Y5$tU$3!m4+1>I2lvC?=2G~=M;Y^y_ZRvaKnmAPF*y&8SjbszW}=lZ z-x8ZvFMqpgrpaf+%RHPXPL1sMpSFVOIm6%5G{#)nrKg494C-#Rchg`~2v`EnGUQ9y zd+hy3Fz-fgk6ew8S`jw#ZR9)R_P!iV{HA*1uDBU#LY_VuIWs>D%E|KCfIqJeuOGfa zcnBd>iA5AI1vc;6O=I+38g+AmyK>OFC`6Fr24`@TO?ONaUGppN8|YCwx6Il+gve(D zzanalxV-5%NCo(vFlJ%d6UNtS|FUIzY@T<~;`$S^rwUbOw&S!-So$U&?gcAxG}kKZU3 z24MEHzRG++TN{vSUJ9BUNu_31#A@ej-nIXXxnQkL0d)m$QX6{fjmp~@{qY|C^qey5 zo8MN_Wd+N}Wt8sB0K`x{`};u3Sq`|KFn8<3+7?8N9P@7^eIA`Q;?jWM z&~U)q^G@Ke=^1xM4Cy0qU+w!_swZq^wL^CscX>)vMr)jGOTJ}#03E{ALV`t@;4yjVnX*das`nj{-DxZ;JF2VXJ+31;_aM1{zpNYTF zTnMy_dy$_}@qEDXmz$X=w-ciXiL1VEiT*8h%%tsqLVU$PdNV(k3-H*vAT`0|Ncj|j zW=SK28`ZZ^t}TgrJb~X9rV%u&a;@Ap+Ri5{5f{A=<2_Wm5yf1fVM~f-Q~&@-ZzcZkv>i9F9`~O8;kk_Bm!Rc9nm2W3 z9?p&TrD-EWD*WONRUygJr0?RY^kp6-`Ccfe7LGzs#d@Q8cKYx@f3uS9*BkZK5t0vH zcN$6?7|=*4yNLVHFLl1kbhCzaG=nqGvKzK6Y7mc%JFG73?|*4Bzf*paIq$p$O9R02 ze99{HWkQrU2Q!phbr9vOf9=C)cjRp=`k3m$-|3cQM>#XR}53SK4bM8)S?EG%?IPjlH7sNyE;Ikn0 z$XB+T4+D=2QuU*b2Zy6zwIf}R3qVg;tRQ3wBgRCJAoR0y1#^pOj+4%@&hv+k%?EzZkEu7xxDg{(>Vw_guPHo;b$HK?Yecma7Xx~oFqvX9wESb> zN(w|arA#uHobPyBmc+kEI^dY_gG?n!C{6sYtN+a3ASl!Xm(6G-K zif7KoaPHHENndeN=FFaETxjDzurHnGCJ+LSE01lj)r~T~#5f5V7bK&9U>)${&*W3}fsa z^z2En+!U6yr(gVG_tW{Oc=qNL96jG<+tzDbZb!I5&Y(pYlg}-_)DS>d)FY$i(-Qo% zOEO)2q!Gk!VuQfeR0%WA4^tiTdBJl2ZkXru5u?vm3dAiM;xqSXKXU0+`(Jg19nGX{ zNR)jzirWzkv)@XcJ^bN4tx;F4gFaaJzFgTYesJ-tch1#FHg;FsPM*wXONM_5oSQ%M zwJx0uLN`-r42qVw;-3N?Xf=gcy1N{0i%0rto^N5-Byi{OoiJXglq7b=W8{12mw&c? z1!?ddxUArD!?^Y4d~aO}i$4!Gh?pHDi+o)W3?PDRhi!&)D-(66jE;6dbX|j7gZ6?u zlJ!v}+fxjVg5N;U4Za<++x$XXr@RlfC7d4)C5Yffcys`bZ3hcfR(v8v8joNV>Rn#F zbYhIIC3r*_<%w`o`VK_iTE=`p{j?-K{3$7nDvT1~u!|M^QWuq7Zy`0L`bnuflF-3$ zck4PE6|p`cJHKJn(eUfmcBh7plA{pcB8=DegGl>@1~POP>tVr;eU(nfhM0$r?#bfl z3^a^vyNR4r7T*iNcJ6>;M{7ra%!AD#oWc0fmj2}9cKpc;GXwG+);$pV1@ceE80opr zG%4za66Ev+6mN(?9JPIwf&x=LFt$&%8)A>s%6I9Qnc21gtqfkmHRHLuqiFgb3wgq#JSjf}RDn_UUhZsH+dqoacq~$Z`Hcyq)ILS@BkP z(5q!vxDr{X@ABI43is@?p)4?25bF5RwGeFdRQYMs)IBf)=YeKn9*_C4ViM!r8fFS z2t_!6*+U-X*7KzXTFg7D6N)3|aA+5s27cw+rTt~TSN9@e`URuwX)LSvWY5KBpTZ8r zOKwEdP>o<&yZW~4m?3gDE*TL|!)92(289o*iaw@6&m5x&Z#`KaDt>I)G&vdj&)|2m z($KoYyn1F772687BodXv8B^`mwVX|X$OKZr*WT~aGp$Ba>XD1Src5Rq7yG?Ks*7v< z!r|e9`1uLz$53yT@#9SVCTO3B#4|mAllE-$?2cZ^n`61F!-3MI;M+U3urWqgv(K;_yIZfD&vy~J42moJuT1bJniotn`cV_PAa1bsNaS}R=n!{s?TIN-C}H(G zUNe=EDSGlLqHaxJEFVjIPB>1{QE6QOgt?b4EJIA1sm2K-82Q?qL{!3?9)5e(o!7n7 zec+Q^kr3qL{eCH`3nH{voT`fUv&7ccaF%!m?-ybDk<(H887i-hD@EGBq2JVKIFt#$ zG}qDls`_S!c;UN2G!yV#P8$)cKSm$9dRBiLlo>n?v^fA!dCw3X zp@H(hUSCkD1f>__lQ7nz>` zaxV0&>F)~~3QAmbM~YXhQFkoBjrqD<>{Xf{X&>V0)AgdHhvlgfWBloYOXGp^sqp}T z^s_PPzAbcD6h>qFpuSlH>LGKOA(0W5hRaVygz>p+*Xo&e&ZOWSBD_6Q z;|{%$<)8nCAd+Qgl3{0;#&Cab=JmGSK<;CG-N$SI76&gvgN%!y#)CxwRhXp~(^s4C z;f{Yd*-k5Lg^(7}>aW>k%h16!9eU(qSf$M2y-<(vx;?rpzki%M$Cy@m3Mr4_8VScr&=v|Q^Q#@2^6TbbA__y;GxjkB z>HJ<>X!5t!BG(SHnK<%s=3}0xzhln(2kyw0u$d8KlP}ju0#R}nt971>tnAgAQEt*{h&gf=<|A8`gz&9Sv;#a=V$Qi!Md}W7cPrg##S2Qvv2(QN<5!eC zk7eG>KfyXN0easl%=zUDmYrA_$4dnSWM2=J=zik=fcOFRL(p>RFJ3KOwO}=6HC8pQ zo!vt95yjq@t*=|iTl`z(TYFksSVhAL-4Wf^-5uSoKAYTX7XA4nSn6ay5q|RgGzKrc z^nUIr&jlKnBz7}(dv{}W({{sl7hnxW5*JoNS3+;VwF9ob`6*Z+&aJ%eA|Fp5c%LeW z&E#)9mVO>+j|i8tTlSs~sl2eS%fGUHSiYfEql33o1TcF(3BDj-XWs~4M&C1PMFJMu zL#R`PQ?7vmG`L8JNN5GfNhl@=rc4{1uRjoVVcSugahfsQhHh)(Bw!z)nxII)hZkNr z&A@YiIY8Sp*4^Zj1k4_1^@}#U36ca>5OxikAHoav@O}%4o<#g3 zKxrj2k1*p#D73{k`Hc;^f*rn*i;WXUD@5_l0FYthWb{N-t*jF>1?|_o$#(*Vx=Z@i zy#N*~wxH$bW(9P1ZuYPj*JS&JABW{NIOqieV;yPWy&^XwpL$EN$7113%*l7 zbiCK0rIfy^e%9DYe_;MAS1<*Il#b0=yW)5+&!L+#`@W^ZjXA>hufxHI5| z0@&_Xw1*k|i+XHEC(ojxwg_9uE&9S#7&5SpU!%oOC72{`WW20oGV1LRo=%Z8%5lx~ zRJ}&O87;X-i(N`yT5D0vsxIVrC!TY_@nn2&D9#f(HDRy&qB+D_S1NrDOAM5U_`xnm zP2_cr+D7F)*p-(X;nXr}&lK&y_XN4C0hs$Tz2wVPldi!1&TGoDr7E|iwQTvQw{ER* za1j;u6R!z2&<;-+gXOL77VVc`8E=F9_=Du zZHYcie*nQafHTjBB$_l=)IW zFk1(on8+USY8neu5m4fzoa%we@<mpfh_iOA@&}=lUSQY?5Z53Td+{CiHa) z@>ZVK_3hR})Uc){(_uqN4r42!^H(8uj)%D2KaD0}5h_l!rAt`PS5lxCWCD%gSwFLF zQ8%*9aUVjoiIeBBj~aU)qLIRfQOW7LY*!%g4&4jt8g+M#y~+G~&>=nf5}PjlXQH8b z^{#m}qIs3s)TTEj&3-@8AS+~H2ajtDk82wb;Hg6}<=h#s;HF@h66l-yvC_tj#Ma5c zaB2K2&KBbm(^)wD)3&_u^0Q#W3&1$nV8a@7%br_Qa2QbdP!Xk9oY0 zd2o+;RF8Q$k9nMrd8m(hOpkfsS;5CV$j3ag$2^S3JeJ2igvUJE$2`2pJf6oq*vCA| z$2{!EJPzP759KkBaixK1r9oh&0eXc4>ud$%?6|$0|F?5M8k_!a0O`o#MMq5b>;h9; zq3kr}#T-cw63uih+cI%Z|3wEpr2qHtREAd~YfinKJG;ysdQ)ccTF(ou!uKQ5`Et_% z>9wgm=pzy3az5GjHFF-a~hK%N{Z|s(QL)X^_=1e+(!Cx?-`0oSQcHR8E(Z0JZ zzNqX`D7~b+_LHl~QLY;%ZhkkMeOMVyc$vHH6PHE@)`3Obwru<$_q2cJV2a{@lt3_r z?LW#Mm|_K{9Q;RF1XJ9>l&SwHfG?PX%VW#tRRbO%fyw&+U5`>YZVQGPRRNA#d~Qqa zvcnAL^~)=Rw%G!Mwq-$rS)O4Aj&+74*NpJuY=d~AO>SDSLTi8x8Slw`YsXuqf&{FSiSL7Xiqa*yF~(vUJO_ z%=Ld~n;XXzU89jjX1kg2Vp-GujT6Rj6TM6+k-Bculx(ig&K#<>pUp#KlBPLP_B)ct z3N@@{zs@c>8P{0cvfm*0CC_%xedg$}KAlj~{%cYH)6T1dg)T=WRndU#j}BAU)y}?wZ<`>yeRf5% zXMDADh2>!Us`gs0i%k*|HEg-Vyv@ApT*6!8as8}TrbgdF1tJ3}Z^R#`ACoT@coce! z-j#Tlcsqz%C|N|WCF959lXDe(BztSyxNLaulB740xHkbe_Y@cQVAwIa8r44K{u1+0 zv?&KrH5svwn2~4M;rE>ZIpbo6^HPIEcW1yW@9gU3Gp82wR^E6F48~M*_oMxY*$b!$;+P|FJ(x!Ls|f29}JK+{5~^%#~x2RUMjp=7`)Q&0=f zFG-_wfZ+rf%7WpjG&PYcSx&FY*VN#GdZSETlCbHy~%`b|>Xzd>P zbjR8@&UCzE^!J$;FUMO!qPPp}pC0*yVuvXVogp?&N{zw3Bn^WC*kcO!rHd&g#(l!y z`|2mb7n04QKyH>E_bGMjs~;6_NH#4PmV)8_SHFEQd;-ImxKFM9(lCrJn8HasA=zW# z>#DyZS4-Abfv5X51eds3oc7k@ z-0QobKw_n-8H79pbdEkKXAyF{5O|n-xtwd=gMFJd|FM z$1*25E5dW?em9v3yXQ(noh3^Z4LZ`({(iB#i3vPMM@}0%&A)3*C*3#2b{59DIN687 zu6G+Z*Ag+N4{;pYR1P$lAuawJyoKP}OT7Kov>$oP?fTEAJ`F7XS*slnKPN~$Dtg30 zJeha&Eo$%T7FBUKHw%;qIGd#x(arScMPNM$4b{EM2F|jdi=4Z?8{9TX%Bf7@aTsWQq{kx`-2d7sHNCw zL{|pGs{ye~|2$Of6Zpq0lLUvp{LY=Q#?X<*HeKj7-6m z`B}QTRt$~b#8*) z)d;yRQXU2nZc=y{6;iW$XIZfmQC>!l{{{R@a8Pqoe~i#2AdW&DCCTem2GptW(IYgq zX8I4wIViNh=oK)9RYoop6XgDx5o`biJ$QJFImN0Zs!HW&EN4zE9B)l-8(RfDxSplf zvHxKH$vuynv)8r`LF$JELEHapu3o{%jR-3X+K#n1Z=hfz&{T`+PuLkf9(jCy^tw}9 zV?M9Sj09(X&$C@+y9Il2662VH3$DdnaW@EMqAMyf>m1RURpi3|!nSU@pY8)(=F7^} zZ<`x@%g41(Oq+=A1{dg76wNKMJEU5`6QLmZs%2$cK`=JH^SyCZ{q$~w*cZu!$k+O1 ze=~GUb5GfFXsx_6oA$VXU=e_$jGA~+UT_TBYqbLw+ zCwUz8$+eKU=^rP7C)B^j`M6I_MVTVa6nE^s86~Dx&FlM~IAFKU-&Ivl^m8eJAUjiw zEELxzuNMp(S%D}!&tr&Qq7q#6bGZ(qz6{RIu}@6}sN`#z9b$mD zpkZ-4ay|^l^&K^|J&+opapuk$KS40wkfOOU5lLyn9Bt1~+RgY&enIuwT_|T59zk4C zj^GfejKidL`zEiMQt zF8Go0`H3@U7`XaN4k*w#kmn2=V1{}nDebED(r;47Kau5(AN^$&qKbc_%^9CU5TA4l z&0kji%E&K1JFEJ&0^Io)Nv(jLqKYw2yR@;90^+kJf5|s}$f=2n@<)`vRsba8vv`^0 zN4j8J0~0}1ZD(rEQt}(mQeut9%h0Iu=E$Y|Wi`eM zO^;K`_Y#RgL=dN=`dkA3J_Wwe{2O0#al)efu{VWKHE9|L8<%+@UXf;&G)JoMFL?xJD7!SxEPIX=Q1_R70!!aKMyb$PBt-+k zSerWDJWi>Ql}3f=a|u!?yG#1EhKO!Q4d!fA>80r_4=^BfY5txv^~rn!o8os2nL|iB zc;8Bc7_wKJLr5_+YVXjVPD(v0?NFOeUNma%(3(zWI;!Q+m`-sp>h9qEjapzRF)b;I zyUX4y9Gn~gB)t}ZXp5F)(7-8HT5-egF&Hv5hyggMi5QsXa$#;)Rll#tUVRmXDTQtf-5>3^+u2DV!&~?0P@7^OG7xGmj>%sjfUv z45_yATkcIbWVDM{CK2pPv`E_|Hofa*esmIYc`#iAWiyV}<)j!6r@j}INqPNM4)aeS z9$}H6ssR-v);}Om{$h`}0y=v!uF>^G{k*uNt5$A&k&A89#8s~J2Jx~RDf!?xD}v6& zpQXJRoyr)l5p0Koc9qIl%@NSGg?mK1hCX#w64x+6hB_iXR;KiD+nzvtBHAeY*$?d{ z7JC3;S)?)6+K4ZOmT#o8wvCV>XgJ3qnUJY&_Y;pwWNaQ#w!U6Bygw-#Z$+!q+A&ny zz}Qt`WofxA>_SS(HyZhQn5h=Yd|BRw!f@3QJs`2JaOL2^)z+rU#=7eGr=x34i^s@D zZPY3K%gFn+2w1l%-rqY6%l-l9{NuUS!Vq+oMWjn0L}{kioSQ9y+!wdat{J=4m9 zOJ_s*pC`_!v44|ob*A*HG+jKIl^mI6(3!hs@Ykfo-~=of z%PYC<5&nRpYxc}ZHaDuN+WRTO%&{9cL1wU+-EaNjut!Y&@uX|a&Zw?`wofo0;^F8N z12in!;TVPk+${QX=vV_^S+wLZz(uuL^v2QI1{hd$#xWcR_*pi!6>&qt21I}wDP3}$ zFxdgj8j*C&%`lRF^Q*i^=~sry9|038QnU%k`H2#Ntg$t6BlY9aEk-selKTlyM&4TA zapD7vepw1&CkzsK4-{ol&^L}XZ7qsy=er}}uyKEGv|IvYqHMRjhTwLv}!y@P}Zm|Li4JClcxGw0Pt zs;WEs-I{7s*mm@5l1pF$wlL|)`Z>9?Fzd*ci5+_UJKHcaC&joF+h{na;rI`>$#5>L zak03~&);C>$=LdlIr_%!;*2-G*`_v)ukI7wRMufn!0(IR#5^r|{TAeq>}~3E?RD*Y z=zZuz>qYB}>W%7C1bV?4ME_}QBia#1Zsy{kE7G0)Y23lss#sB|iYL}5&Jp259}HE4ZI^oa zrSBZJ&;&ZatoP~}t3D;Pv@luxz6vZZ8Q@S(>(ZZtX5sU$p3><>l^6|i zIG-Q_ls6(}N)h>Tu{p$0_&AFxj+bJWBUA2}3slwlW-&Bumy{bo^t9Oxn7V6$=QOt9 z1k?!T!{j#%+im&DI+9Hr$F+%vXx=atKB_&ZS6mtFo-bEho93M#C>;-7`FHQYtjqSx zN8Pgm$$ZuE;;r&qfVA+1bp!qdhFLDPoY@@^G3U@$5$M=DVcDoTsZvDrLfv|L!I4tK zduqFKf;(~fk&5$@R*3)0+4k1b+GGe7?f3ka1hP&0WwZBq`0WlX+e#$P{b2{y*&rg7 zXxGmcyYRivkjNeH8Ta1`E`Pws6%@HKGsR|3>{R#!5n+RpYr##PXfypsZ z$hZ0`dbYf?nJ-jlIYs<|`c~qato)%C#91Ue^2gAM@~j4DNPk7q`VfLB_ueTvQpNSz z4;mj8#WTi?Ds^rkx4=v?ObmX;p9vQb5NFnAd=3_Ns`x@4I5R;mYc%7r^gz(hw#~Ov zj9Auqo0?i;Qi}`+@2>?b>Yqah)93%M+&`s9j&t();2Sq_dcDV!nq8Xnv$1IP;EJG#wpt;bS)CE4Na2V16@Pwoo^-1HHMp;w}O(2NEu23Cb}&RjKT ze)(cRXu!Z(xKg+hDu0xBwDTKqd=`7oZ)VOjmr%We*#GpmVb|eT(<-6|lk`zCqcJmz zYEtpQu}XuOULljFW^sWgtRMu{kuhp zDK=?%;98|cO#i-ZmMKYdxFC5`$*pNyMO$*eaPm@QFWcgTYTVv~aECh?Dz05mv)QUw# z-Fs>3cdDzsmwXTdB6fis6gq zi-w~c!hHQg_S+9bq&xaA`Zo!Duy`E?3#lC*RxlZglw>$E21d+2IVm~$cE$5lA?)h= zbLUHk_r;$J%ZCGlF!eHx3VfHd(zuQVlk(Y3DUzS*MgzPfkHa3$Kp?^_cF57!4obt6 zNhj=It+DF))N>J)MB^PsXKp@6cdqwqNS>{TCexdR!2$xm6iI4TWy$$8B7dk42M4P= z;?cVMO&JF3d;QjGTik0}T@r+&*p`8X{+19g? zS>4E`#V0O@sl}5p4%q&D`u;;Ox!eYgwTseHhmOtfL+9+YwSqZ!FM773_YwYZn`UZtquTHs4zT8_p;(q)!kF4#I zK3u~={Tlkn8N=LI$s)l+3W+x+@h&MczK}&RntC{CTy=4#g6f+0v z|0H7@5vruX)pAA|YLDC;Nf$=&$7Px-#2!qO?=y5+Dv)y;$F}})x|sSpH%G`8`_7n# z$M~kEF;V~Cw0CF=^a3%rQ-(3V#1Ru^^L&H3i&KU@;Dy7pb*4}G&XsGpIPeQ#D%Md6 zw=q&`-0XAV=gio9%$A6@A8j8#SJvq>;N52eb$TNIDAV58`|V(4V73U7 z0$qs7I~^m`0Jm$>F1CnLk&S$$F4lA;gHMw+DP~v`7}orz;-1kS88fmO*EKY}x4O5A z=kWZK_vT_SK6mnL7ms?7O+hx(KIjXyW2&wOE5Rfyr-oRjlS?JrVu1bD*=O7hg{xTV z8I(clXJx0bt1#@}uvnkV1}vz)x&#x+{W!(&Ob+HIk2Kuw<!^aeIESEM(hIJMwc? zJMZD60}$LKDd~tAy_1i~CO<2JE0LS363;2>er5U%7mH=a$o9#$8hMa_LG-e7RH?n{ zTIUJsNyH@iHR`%y{8PJVEFEC5(H$Ot5qn`Qv2zw9`8gz1j7py62TL+u5SPU4RpPMQ zZL!iNK@Vw9-Vtz1I_TasJmjAJIQ8$7t^7`1YeQ;>jPYs-msM*^YRzkPm*;Bvm)UB)v~o^i zmjS|MU9Ff?@n!yH+1lS)Emk#FA*bqE0ahjDDjMSFFpyekBaX@Ade?+hj!FDMBOY#% zYagh!4{R}PH&PBwo1*u5imU=7#JBFXoe9xxf22;2WG3J0SZ?;K#raKf9$tykfepoa zIY>=6Njyd#EiQXzDSaGM*~}MPcM)`=ZQy;o$F==Hf9y5!4eN!tEnt1}+=O7+q%lFD zx3T7|x3V`XAnTJ5b|!izrZ?5A?qk5EY-OU(2+00!jn0OnDNtvuVu#bgdX1$rgKsip zm$#X@nYpE^Ic$yc9MLtSt!EvRR*Wu2A|DG+j4DRl2#ZII39RCd1uI6TEcTiC7$BEH z7Z+a_7Z4K={}Vqkiep@M9eo{qeb}{G_WrTkVZqTCvnNl38J7RCOC-UX)$*px1}@yP zjS>soQ{fS`^b;jk#8f0%$66*PhhsI4CeBS?-y%sGcVc zjbQBx43C&W@W7%_m}as&w2pkG22yk#EK(SmW2cgmM(B4rj5rJ!4I~#@;hs>R^xf-T zqub@Zb-lH{6}*+b)xAY~q6>bMOw*SmHjx(xYl>kDU`vM@4WJKv8u%jK`aAb`ExBY& zQE~~5+PG>w-6(cKsJ3{=?}*|v~tRo7icx<7iqcZ z2;%wTJxA6ZrIri%EBWPJ-f%}UKj3(5L)2vw^o`Y9)P>dC=}M2K6(C1S$x1OwSxTKi zVjv^+NIFFhRrTW3B0BYiGJsCKq0|GU4T1xifH*-mAaC`u!A3q(lItR2$=oRT# z=of7i+bCTqU8r-Fp_Q!84}pq62lKcfO%NA*xJ0?K#Vvl>UZeszfU7}IJVR5Ei#aVuqdscZ?aaJWig9<9N7_u0$WUJR&DOvG4V>lzUu5s~o z32D@BQ)$y~Q)mN}SF_i1tmhleqRgVq6)mRBrYxDwt1NAgxHEK%Kq<}&83wpTVaFcF zu}&kcWUUyjEUixKV(UhFkxYtQs+z@VMf9MA6FTRHR*!Z3b&qwEb#Z4z2&()n_oo$^>-ag*Z-pPP>yr8_0a8}9G!ohLTiRnq$ z?aiI>Gvc3!PK7S*E`=`T&Fsw_+xe!$sKclu#p9`C=EJJPsuNp0ZvVAx@K)MJbQ;|@ z7~caw7I`F)EKsfQN1vN$AlcYAP_%8bak3!|C&M=e7BvD5d=0z>e9kYN1dVtu1gR*J z$Y+6bfj2-Pec(x;j>IGlmqmn0-rOPAARbn@K=_{s=y3n=zVN(o^Ff3`Im1SlMeaH7 zp&wQZY#LuI!<`2~gU*8ygK#^jJNkxoSJ79=HGOUiZar=TZtHGi{VBUt6(d#-seXlS zs`K-6@kTN%C>#Z;gQl>QvSO*RyRl!xTE|?+SjTep=c?7J$*T3Ltz`pIL&GYs zm8mtZm8KQfDOB5hWkcGTLfa;>sbcj*^+N+%HCioNT~uw+D%+{neaXGo3&RVcXASVj z_fJU2O6P3nO6O$f%*M~nU$*s4OHoTv%Ze*gOH-@N%T>#^yxc*vznr*2UN#Mhe94|Zfd?F-XcDvjDbm3 z(*nl=#{|a;M}NmU$27+#$F4e%`~33xsa>YCzMa0kzUzjAJyVP932R$AQy2YY!q)M> z;}iTX{B0TMf)=XQTHTh)luDk;--}R-n3@fi1(pex6_);%b(U$CO_p6{AZK76bbf4? z;jCw;XRqhF?%-(CqI1I8mSNKcewuBa|2sb+-Xh*5-Y4Eua8$H2ZLM2xIX^mIJ|}tn+o9a zYw|A&G_`}ZX+a(n`bCQu5jRwBo^CH5@NV$#LGF_7bM08|DH~R{m9DL>jZMRRn>zay zmkVwu?PVP&?F1bt8$=r&8zvWIwrLN|;3^vF54jJe4}novA%A4DHUQJRmOsJim$EnK zchI}@d&E232kM7D0Mva%cTE6mzzQ%4%m5&Oq8p|k()c?`HQbu-Pf|g2lw0Jlu(8mh zP$j^GhdwCq_92H4eoN8{=YeL4y~8qlUY_C zjZ|?N=Ie3wyMWn5=tLsKJ$BAf)HmXS;DRLZY4dpj2bjY92920u{XI?VPI9w?uz~g# zsfN*(jn?s7!`w~$Zi!I;U$biv2#k+ywG-~x-7aRUEN#G8%TF)Bj8H8t{cj{T7WzWr zO6F0IY|RL*7g@VkokM6m)?bt{bl7AQB ztG1nmvM1x2sD>ORf(;ZWge&9&BpL)7)X0*`Un_p4QA21uf@q5b-$cHRzlJEJD=D!!Le9_^<4CtiD>^RzDSx$x;A#4+-QRS_nOHipo!k(=Uoj!kXlM z^Q9BrbashkO~kPzh*+OEXK@hj=k77rTwmUCygp3|?=~t+lR-a`Jhn9byD!J`@Il`D z1k0{joE?iy%@6Z^38$}g3W}Ob$I^4gQ}?F2joi0qI+q6oWjW) zr}KM<7eO>UireXbZiI}2ykbBnhR^Kh-RzcihERl_f|w%zAib7#v+C3CM7m}9$#=;e zZNc!5gH!k(dpgYB3Yr+Y5jqOmyk(%qK^G0+&4uAo%BTF)fy53{9-!Ex7G_0=mF73a zHKVIbAL1-e|A9su^poK7OEr-jp&O>9Av7}xk{^X1nm^3z7M}i~2Bppc_t3E0Wy_uv zM03DVN)}f0JA(heJ6rV~@~uygxrjopXN9g9|4z>~J&Jr-eIxa>96cUr#5uJLn+l9J zyZ;|!Zvhln(5;IG2p%A~TL>~}aEAn!02v^-1a}J-bR)rC2bV#DyF0<%-66QU!<+xS z`|8xGd*7>9z4o{J>$Q8Pr*~J+)a)hJU5jGU(OoZ}QKu0~-v&6biQQ0FUI~k|j=bWY z#At~0)fu(pAjgaQr$F~C2C?(}X?9(8=WTvocg$R!z_B2fzJ(R!Qe+!=SV6QwEcG!} z7Cp&H;x-=ZJ)JgOPO=%D7fF2d$wCpN#@-1CUXuR=S0`&IsD4Jf4#=MgLF@$`0N$J# zt{(41d(a6ri%xKQO88nOPZx(AQQwfQU0?`Avh;+T&zmT21yBb zE1QnRxOTi)vJA6^RZ3hLS>6JxrSDIKj8WpD+YpA(_)l&9n?PkfCyy6LB_H^=L)wec=mIe+rB5|{Zl-NwwqH+PZ%0qn9=l7%z0Mlsq-PN?=aB!zv2jjg4#}f zTeo@s^}58)b32wJ?CZ11e}?$j!mqq_XW#3|V*0G^QwFb#2sGhU-$)uF=pGyL#Cb8a zKZZMqcD5(>-E1Y*UXCNc#ICEz&_1*i)cci1NzYL@L~?Imk^zj_ zBqSwXMF!kV*4b@NdCBmedErz8s8KaelJCGwU+PeWzdEx>jw=6)7UqA5c?!!L>y-QV z9l9eYqyD#-ad?WcrUtD}^}J5ipbRC+vLt$jq4AwoqHh_TZrABJNH?t2jpe5mSlXh5 zuAjL}5#T?QJQ4KUwK#Qj)DUv3C|5y<_$>I6XbMD)U^X@93i|_VJ9Zr^42f)!BZO6P zqCV+2JV%N9%p&6aoBrzz_bVKVs7@j{xj;F@Kha+eR(Sk){OWvQ#lOy9?Mrpi4bO^h z7m1NIYaCZ^#KKNwy6B#cDee4>QJzWVWEFUxE-am|0|JW|M4>I!7ns2@Zs}&N_Z|py zg&)|HB|56Wf0EsL!<4!p z75HfpSEYCZQc$);wKEIaOts5>F_F@ZDJ>D&MOxlM?zc=n2_2T}Vm~k{2xNfL^S|zF zCATm*y7_DSA24KNz7b!=aufacY+g#4_r$O*4HCV21ka8^@>s4e|4-7V#SqY=tic@6 z^S0O*-Iu#Vi>j6iCCtBq?|(qc(}#7#G|5z7C(q4ndJ1F56WjB{JYy@~X<+Jz#gvi1#qtwh8pi_Tn?EpSvTjc?is*Ly z8M<@g&n#P?;t*lkoud7Sj}mKO#bK=wSUOO_L99mCHE28!dH1MHl?i{3*Z(KW2E>ry zr~DtN%geGx(@(5X(30YQ?}^`lr-7*RMh8g;QwNS2ArZmi^j#o^zd_dzVEz*k&;P3b zS2ce^3w0JwA2|_j$ag%1f-;0~WBunk+PYPT!1`ea#}EGKMIMs6h(H^Q@l2%W{|yq6V2Z@Rb3kcpSA|40 zbMo#!zIW^om$yjX`6VbKQ_14VQ|`Z2sE-^5`gBJ_zrB(x*l=%5{}iO zi(mIf|JjWE@AA78e&1xcVJOJ~!oJ07)T`SY-W*QsO3Zn}VLd2D3RH~;GS^U}&zf~U zFl%HYHdp^}<@r}lor!U8UBgeBR|RH-LAEHVN%eh|ywCKibzAy^r(pHHi|OU@@Xk{5 zNIhq&otaBXItOR1|9WvpUI*hk{5otdsA_4DU3NQ8$mY`#njL?*Vjhk9uJE@!!6r!A z46_+4aW{*F-yD!v4EH}D>b%>|4iuV>4kEe862xk{gaNEZO?h!2oebxWG&uTsfw;mJ zDYN-q16c#S1`;!}vbu zdKt)#;v?DR`iSz3!Y2*-j)ljWJheLiBzS6#{6W932~@JWccQf%$yWO0hu zgY^dFMRdnffiNGq%#-ng-sv(i(|t9=kR?Y8xKd1ms2EG}z`fa{lH&r=nmR<-iEZSnQ{2BHntM@%{nb741*Em`e16jY?;m zV{KAL7CX=m&>7m3#D|PC9K>Wl<}Ye$FIJF$sm*NA?USL`Tgdd! zTS>1;;5ziRXC}bCWX+lO1$d@aXnp)(bB_$UT3#WvxLi@cDc9wgSs~odYcA(+@P2V! zWh?XiIdX@r-dV0&71Q28_q^$TL#RHmLU{QK4Zlp&p|NGMd(}a?84tU5a{5;q&5fu}eS4$G;CC$sjh@PYaqR^x6os5GXba>=ieghq(PA!G^6i;oG~#FrbS|Q8$dh09 zuoei!rWj(xZpMzN#egXdSdHd};h9cg;Syyb%0kDxI|8pNvnq4)bg;S))yq%#%U+x{ za<(XLi-a04iL5dM19trTl-@WzG(CbzJEWb=>Dbxr72>`udDe1#tLt!sIV4{JDse+gsY5`YCNV`Vn%?rV$u`$4(o4FwzXW)J%M?cWcUEpJxY zm<{{T@4U0XTmg4GV&=8YGArUAYp@D zuojpH-a=JqwbdXIgwfl;JnVm{3c~gpB+?na|Uoz+_x&Y@`bY3c6g$j z3d}I&w}x;>o5_-mmJK4qNj#l3NK}A~v%)@1d72^Il!xOAt~R0U!dqD1VHiED;F^U| zdMtTZti%V-6Gv!-`*j7^gV4seHHyUEEPAf%GXsl{?qZpJ;m}nP<_I|@zUkedyvlvp zSO5)@?2Pd>`?=tc*YJiGHST}2+deZ#Xe#YdHl%)pJRnwbc?;9{xB~Cxb7o*~hEmC8 zDx6*T=e<159E_s>N1a_b2h+~OC}t&BB8(zq%hN2vD0U@R8I1B`%jYb?C|)I3uW$qb z-A~*_nv3@-4}_Imt1vYLre1}qNh-N+V6+d`c^y|k5l{LAbl}xJX@2)x+$$P3PTb7# zY21*!m~+^a$7qmH!YETn9{2)wL*g_@m|#>qBoF%%bwz$U%shWpjyWPjiO*~QIgBl^ z;?5A||Hp}GK}P+}-Iq!(Rv{W6UOf4nF4(XnD!HVDvVlS~Jb9WP7?-Z((t}Mm1g7rg zXEoCxmELzf^R{u|$1^`LU1M>-`j|N~mXgRz``TEr1P#3j zy*W{Qkv}3h&aeeLA1c1Mu^Gg^PUehdmj~liemOhavkfeWd=a;d7QMLR)KtlT5y@1| zi6{c87)FP?f4D5PP~o&ArF)eQM1-~_8QciMLi3zOW?VcLN)+>6`#$DKmWUQTEWH7$ zN`kQoDoFy*w*5XNnydmR_jP@%*495ztngzJRc6b{71=kD|QDA zayZIZagT_-k2=%JI$xBYq^;JydZKUjf8BI<99t0T-Qb>^^p6k(so7%d!XL96K6%{3(t*Z4NqqnJVp%o;lsFpsf|PUg6sh zfS&fvjilcyF9b4S;M+Yl-X2Utm}6qG>7jE;-s+_7r@XGx=fKXD8)tT3tpe(4f99Bm zkmFCAYtEug*RrGM-sWxU=fAR)F88^QpO<>D0@YR_0*i|RZvPyu)>s!r>s|pX$->J& zp)XFSWq#{7;J8N?(uv8&PYwqyots@uSQsn>Us+7mj+yznwWvPgzD6|iLLJ+~NMu}_ z#L_qz3FQZ-@k2iTs}!ow_^D}YtKeiiLw1}K^s_x9ww~it)p&!$uLUK_wv1cAyA9tW zNq3k@R`$|4=utn_X=B=_AaD^d|FMwC2aZq60z#V@#7C0(jlznZ1>zp}1R+bekp;xb zv1d|)xiG);ky(4P#)#0<2It>SQg|)3ZT9AOa)));_tzFNPj_Z(EHCG!2Kb!G8~WU@ zGwz;)BF@i8c5kt`cpx=8lq*$_wZ}$(bW`Fl`tWuPw_j4)`AG4~7gPa!%KGNDldGq> z*T#or=P<<^(4l&IYw4|u^iDhO-TAb-jf!#Du3h^z@#U8&ySCKlR<%s32dh7W>T#Lj z9uLo}VFDkE5TZ=Tmqm78=;_Pv*PpQl-MRF!EzQOrZe*k{3jMS*z3NV8YgGVnYwA+n zzsn$=+p`X+X+AasrA;NY1Y7n;cylB!(AbbG~X*ES%{PZHNz z&K?y;<5)=`ciIvqVVr*7{!4ud@ei-2MU(64Y-?ZZ?Ia>S$uS`Hnk@55oc_4k-pzwg zhnd{8d={iEy+T0vf^ZHr-B^z;U0py%=kzQG?UMNP=BxFOqlQdpoJjtyotX~oy|(Zb z*iGep=%KM%wIitYiR<<7PrYdL%RT97QJdRc(6>H|Q)&I#uLXDF zo5BukLYu$%v=@Z84+r?CSg*^Twa#2d4(W?%wVY#}2Z8-vsdpSM)|&Qv3x6!<*lTY; z0)kc4&j-W4Y~Bfwi*-!<|hVX!f%OZlmREHz3uHuIsQ> z!ef=WV&G(Tv%BQ!X}L|eS#fYk_SeA;5#8668`ZgG`aj=n=ayS6lE)MWf&4>+oPln6 zs*=6vC4wqu2;MR2vDf1o_=^Lf-bOevr?by z^(X%F)Qaq4xa6A^WU3WS?dq3}N0xJ6q0v_66d-Itv~NOhGw`VR;I?&1vo+!%jRiCc zy^N{NV0TT03F;CxKR?!a6_uR|IgF`vA-j;I@}6d|kqx-4WS;l!_Cjs>VuA0R=(UEuV8 z*E=ecINlKVmqk-Lu`;4x;Kt-=2|u*y53{VM)bcpAO5zGos=V^7`C1=9sZ|D%8H~A+k1h8j^mKnp)Ws<7Y(&qU5B3gC07fh(N;3_Otw z$-WjI3U&P|)%VJ>+oU}6#RaK*K0U-=fL;H`lkLE z$&md5&Su==w}3Rty;pXS`q`e<@$~Ws$~^~7bl*7o_)zy8%mM1-WqVnt9`mH_>zTzB z)hOOrGuKk5j*RZlYs&rJMYmP{@&ZZ~ZKj2x-}6h27o-j)m%5GJzK0Bwx&rQmMBzZxOLw*QiO(Y_H1~w+s&t4-z1ofMzoO|F7&4>A9W!4(Z$(MYlp2ugxQxi@^rxm1xr7$Jwcy$UZxQ>I@Vb+= ze%`h;lvi!NX0#49juM1SEG=-SO>)dKKYse>tevNDW`aMc#g*M{| zZ=-)OjWZLA=bMlb-r5Ds>mqgc9o7rHtpj(3y$+(4RiyGW z`ijS|($qZED_O#K*DM@=vZ@)!7v*x+=FT26Xpyo8iF^j{pwgOXl-I#qeftyopU=Qi z--z;_-*JJmMLFc|Rf2)lci@;AAc#UX`=e+83LCyKdz?Z@l{p5xZ@M@j@3!G+a!eNJ+LHQ>s ztX(o)1E(V_Lj#Rf$;eXjs1j#kC7&*nvh6b$-ux(-=rCGo{%Zy(meGIAVG3)nXs9)C z=C__V_zD-mFkk$6*3BY5PMJU2hj=edcdxFsdV@#cG~V6i0@L$aOyx=nP$mqURd~Ok z9BM(E(n}~WJYmd6Q@-$g*xX|DD9L=MHI4KhQ$VX|<}Jl)hc&Y`M!_IieP6shx4gJL?HqQ3eH2D2|qWW=Jk~drDhAI)B7eS`(qv3!|teJ&-eJ!RBC9 zsfYaEx6(2_Fe?Tp6Dpdz03!lRkuKQ`^Q4>2@0B7IeP60{^0jxpZSE;E?_oK9X3u#_ z&cw%fR32E_Ur1FhZfW=ho|L}sXWCu7ij>sfQ(6t(nj^LVh4VzG5v~@HWImTI>d&ZK z^;QXdXm%|vo(Hna9+uK9nyM&`HA1s`j^bD~q>epAapGEss%;2xGN1mjc{|o*tDsC?H7sv(;w|@#wz(Df-7ULjVVX`zU zgGtA=JL|#K>)I~$o(r$mIT7+Df(<=+B3!j^t;t<_dMd1y5TbZs zimBh!v$PudbFu0-uEJ-{Oh`mD(lFeIb(A~!Rm$>Boj1VecNIu}Z*XXSnuH5}%2@Wv z+HA$fc?CF>p8aK3%i1tM)>HM^HFST4gS$U@ZmX1Fx&J0RF^iuemSB~Py`o&lo^`ep z#sn{oa0A)Lc0cX;owz$vdvO|aBJe{S-maW9%8CJv@QRsbaRDc~qKlewZ!swikiTJ2 z+`M?WZ1%4u?K0tiD6e^fr(LAles6SCka@E(FbD)cBA8h#GoT%HF5D=}TK-ibk)mf) zUkDtPJ3psEgx4->+#p2bEL4hVys8D&HP?M|^K1T|W#5x@(%i?is`aeAg(s71DNmd?JFQh`7HjaMGCLx3DAXsQEd!e=1%Ai)UFGZXz@3fnvRd7O z2>q6uM|{WZ*WaG4H;C+Q_a=deBRve|sR?)irqimlQo_$X*h+t{F~R48)Dbg?l|S#c zLLvhdT-L@dI3;64q+WkHDg7SV;%8R#Kn?)*!IwP{jN+h)kM@3h)+Ch*kln=Xiz~nV z?`npvKX_lDZ7x&{`O;5kZi<(AUW0zu>Sz3DqKB6m)ORhvWAADFgeK9(AHc(7`^{);^D zni9U;m|l7EUbElG9PD6Q%xdb!KAacAwfCJ%U;Ah7*jcA0Z*f--Jneo8t4wy;S|~PO z{ejo^{J_Zot+CjOZg>hI^x}tf`HaCbb;)_ra8NAyf=Z>N z0kSz7&*U@j&dp zP!QGo7*a*TbiDQNjj4>`$ocrFK2g~jT4JDSQ*m(c=u-XH2>z>qk1tUGnGWFPW#|6H z_SMAJ%*mXcik*j#pO-^K1Ov^{>8FW-4F=k;v?DK6&-j_f7yh-crkTSZjVb?n8pvqC zqY4^eBUM$D8+?NM{gorm_+x4uDm4m8X8@AwvScY#t#p&)9jilMo@J?aY3Xd~{GwX1 zhRw_@;sr2zJBsS71-tE*8bPa23^uh)rk zM7OSn123s9qB5+QsJ)k`ev()E59vLkN+^8z_m;Mrs$Wlpb~mpY)X?UpuK40 zFY?3s7u)8FZaq6xs@(g+q*t*mwlcT#+6H4J6KI?7oiCv49p=Y)x#8hSayxr5DLAz@ zKPaMnUK(RFus&Wn0~*=)usoL=FD<(D!!8CQKFyzgYKeTx>&LRPj>IBqHpZu`yuQGkjuWLE)l2|h^vJ7kIPjY;;Fza|V z>OJCI(psYNVhwyC49DNL+4!*(*c_h|uJHNUK#{JOXW!SgEajoWw$-TDjCrYB!u`yj zWenAu-Ozihm@Vpv3ovgX)Z|nlqMhcf$O#vo~iS%+!l_#uJn2d z)QcFqJgZu#k+y2(d`1)f1xNOP})5jSk=S)CaTrT%OOmlI$@M4=^fn){0jbX zhv+o$Gc)bZhU;I#o$DOl&2b1;@aR~n_WYK$Np(3CEHA7X0%k(PP@5vw| z`=q1>?@yO)ZIXhNc&y$Zd!D9c6>yFex+N5NfFEmdGm=={3hET?_=fx4ponjkzG&9m z_TW52@7HYR`aZ3aT|2#N5$Ak3d(O;hdX`nW5sWF}6$9;)$*ly%GyA-^5Cq zI7kqQrJI^jGRZc#rCW`mk&%*{0`cZ?y_TGC-j|`I3G4PAG>d@H$g`T`T^iG$3Jf&B z;Gbjlqybhv(wS|@Bf^BqQ1Rf9j+@&|N<@NXB{Xod034PVD3Q9L=={3pFWl^&UQ(Ao zPH^`2$*LGCAj){XH|XI$8kUbICG9>4rQvN)4PZsi$q_c$o)E+GW6_y-g{M#$bakK3 z7$YJ%<$u~ZCjgcW`(3?zf8*&MQPKhN@+0FsHSeE?hHz~b77k5n`z4wo>R>&S+A^X` z0zx(E1QPJiZ;82&60-Ho`{jCD1Gp;R^>AOSE7_SAb&Dg3BPQlv{%v6m&J>ho<=2&g zD@5nFKukFf+M4*+iC=y_pSLBRQfj{g01N?aoUV!%My(@@uza_jXoPn~N&dh$lLR$d zJ(d(T5)*FcbFGQZ3yula+Lk~0;Uo-(Zi(tEV{}*Ki=tp>@}v&BD$9vTb14vAURKK= z#&49)bFjy9nb(#HOl$|Gy=UJ&iu`5_6NN_i`o(|gX52`X5a z6I3JmYx!c0r4cjO8#dLHBuxPPoYRaahLad}As#5sI%LL9_j#8RF^Z}z>AQo)qd8YB z3O{?6;^Qf~F@m>$XSXX{WdMs@7X%n2g^9>RNL*(PS+eIyy*XZvg81wN=Y%ox~s9^T5HrTiJ*NlJ!;SUY;6w!tAU-oLUf55Cr zWe+5*N6^x2Gtke!%u{?jfD^Z#O@c$K&pErwHp*oUc zewWe7&bRsXpzwS>?XO>vA*-T1m|m<1wuvwmUu3wFmyLEQYonKxg{Gi8+|X~c`K;;q zk|ga)H6K1f$%oZx4@fR|=e`>)4Eoq7Q*zVz@l(K2;A@drl7R~`9sN^Apamj};bj_BM6r=%j z@u5Q@hN5CH`=Yy=dPtt4Sz(W4B2}b>*OzbpJ@{#+VA`Gm<&xOH^gVJQ z#ykz`o}ZvZ*-F(=T4m-$!x%jDJPoQIPtcAmyLu>q1{%y`h=Zzz@+%J~{$=W62ARq^ z#Nu)0Cb9N#f%4_RAA0aWbn@)7p&`m&qYYc|wsMJ>BrEYGmBV8UYw!Y;!($C|@n~|1 zSS5Y&?v>xg{iW&o2D-@omS-=|E)l8&LXzKz{U9A`4XVoRkN+SZ>I9n1CHg2?ga=aQ z%d-b$VweMT(Ngi$K+MWXd7oqr;{Q@f#^SkyoRk@q?LitkXCk0TIR}Z*^1M5_P`11~ zvCww;b6$`LWRnvllCW8>{3IEwlzXQUDk^^-gBO%{_bn7F_bv|aRQ@~z4~XByQhw44 zbv2?m`WkAMcUOovCUahcrzCrh3(AP!LQ}-MzAH{9*fNT>s`;;}7KlF?! zFMsTb%54CLlIAw(g|;f|(D&3TKYa_e%5BgJEzX^%=}A!5q3+pM)}iakQ`Y&=)1$2O zvBws~8ovn-8ig1_@C5VrVm6VLkD@n)K%)tpWT1bL5PK?m2*jT1Jpz_IHDuYIN(l05 zPeuG6zyivJb@V(MT5jy!mNqWxy0&eChL$iP_2jH}f;y`%4K2t2QRE^2?kMHwG0rD- z-Igi^sPwH6~CRtGz2<>RSWu#%GO%XS#F3fyiYQW|Wu#6K<4QKiK}-c? zxO}1E^d!<;iGKLF_~2G{iJTC$5Gm}4k0f8X(!>bgZ>tO&NKint@dTn|^4x8q)Dn#n z{vkRN{FQ06S=P`JjZx)qbYLXnsgTKjzF>v~hJe8|2}}+;+=UQpRa4rk_sNCB62>1n zx~m|*v4#snU)(>C6XOp$e8|T>r4ay%8qa9rA5-?2plpRl=!4Jcdv+3;xLyQ9TBr|P ziQiEln6_WUu23iXRBy}%y(FBH_QV+J2Hhe&CK^B2~ifeXAmCd;YSOM0qcV64EncVk6p>JXF2^4jl>!@m9RTX#`qiuHcC? z>D?pu%p}HQhm=AxsJEshl(3(F@5w^x`!5{^g{7RL_rQ!EzxNC{L?o`LCJ-cUaj#={ zz2ci8dlb;-5X^24Q(wc%aPF*U2{5!d_~c`g|DFrfOQODq!(Q)F8#EXdVw+u+8e;q5 z0ed1sg7>|yQVnEJ0L_I(61bLNBSEA8`HBBzxXD~b# zo~MMA{-q|N$S&Lc53WsQ9`a{hRWDpH{e%=06N&;B48T;mo(f(x1ooY?)X-+dGDaj6 zBuIl5Y0D8Rq294|tXfT2Suk{TaNb6uti}N^V#D z)_!TQ8qRl|QYtM9`AfgVp2=>~#NNs73q2h9B}^?cc~S%|30CwFg6>Isw)IO8Z;-u-f#!}DFNCL68NnZ(1CVJutLe8M@g4>-_(X1G2@9H z%aBdp=i%mIV|>#s*2G1-m_x z)!O>zL<-zuOLshTU#WLMItVMC$?MwTG7&Q2GXK7)ud^{czP*p~6-A(g3o>|pfA_`& z5PR_g)`i!jVCkw!m)n(Wo!Zf#Fz;B-Fs*|++Tm7_R>fWv&PY2BJIa0Mj!2iw7yB9k z#FxC*f#=ZHj%W0BlfBF(^c6NZHh8wIC%5^GYTjl5>6!UTDLb<=^T2zN;-{#IozrXg z>bf_MbLQukKHt7Kc57ceMbL!cg{%cfo}*cSBk%Fq6YmZJhc&D#_}flzHhZkW6R8Eb zdBYBGDzs&j9##u>xOs;vN_mYIzNss&K(O*)z7&0wv~z;s@bj_EH>F6?rY!Lco`M* z&iq)|Tsji;S~Jy$luy-L=>Iu|+tyJlPuoi0SZXNm`g1CC80@qsa=iX1@Jkb!a;X!4 zcH`)qpi^Bi+mY28;Z5aPmAxw;$*fWo5Qr6kPq34?+UAe^w~QM9$7y24il#$K`OI7$ z>`-1i62!-Nm%w#La?5>pAP?WR-sV$YmOH!4R(M{@#@|zKy9R2jr7iZdx+%T+4pF^V z416t$O%PdYOK2O6-EPBwOngjCWIku{^>P>xTZ4L`d!fti-0z&G?xt!hZ!iJUy9+;d ze>hi+f=DWiKWY8d@f_8F%sKa8SIUp+faktISZ89kM!`}7Rc`x})~hLArZ)i#0@AZ# znxVW_|Mt+Ncfyj}2c8`By`y;@jlqaR_NE2IO->W_;XO=DTp8b`gluDH=X!`U{LrKY zTyvYJ5`MZ0n1Oj=ro6Cm1V-p16)TT~zegY*QYo`Z2y*^Ya3x zHNq%-lP{+)r%!1I!MYRhgL53w8eYIR;xqDlxJBP7AD%3HbGQ^=x*rJkjPKz|e37y! zP~hRRFbfc$K4Vl+XdtJ-mmto*DfYF@LgORWK)mxw_)J>?uYn0Otc92N>FN0JgSz5P z64o%n4m|#6{%=U}@QywUK7>h#!*3PgP2WuUT6Cypy-kAuibMy83;3dT{Q5!miGTqq z)Q7#pJnKCXV)$FBH(kE)RFp(WzkISkQ)I#0{y>RFe}|;=88aHg7%urUQZ!~RoWGAM z6{0;nCKYi70#65;#v9Hb@ZmmiGVoW`k7tDlcs>Z>h+K+s(e6f5);Z6}w;efX%F`7qnsn?<>&`5=|7EYG3Y3(^=@Y*0))o zF_>j+7rI$Uew15n6%W<$hZ29A?kS`dim{NYsTxn@!|v)3=gN^Iz^N|4CIWD=Ok`nL zDB0$PGppca=QOLdNs0ZMczk5-f@yjzROkP^uI(tgr!H(wzZBrs=A(P3bba5q?XuMv ztQ&r94{8qA9WCo_YDm#_^t(nI@y2gX)D7aM8D#a}7ElP844PLtqHv*a4qGXXFd>(U zkdla$Z{-QJA@XMd_BL+dSn|&gk0?ty$6Y7tGkz)YcDC7kj)*vSz{^w!ehQTlf8tQL;?GvBdExZpf24L-&_8zo20ie5P-aTc%gdft8S`jANiGuYTFnax z$?_#EI#Pxufx+^v@B!*QmY z$Dcn<-A+=C`Sc+i?U1NOkHm9N9Y-^Ax5s|;9_dw)G=bW?Pi)?Y>Gf+4-WOtn)0?QL zEf=E=l|r;^lHyubhFtl?LgHcZvR&wON=cu*^Em(uLtiuVD(C{8Vg`o_uffxMNeCSa zCw|Os6Qo_QRNK8fD{UjW)>3RTnoK%nB|7)rs2n*b&6;K-9UuiR1DkQ}#eVI@R@r%{ zJFhBon>$mG!UPX8k3P~D0CsEd;tMuAfdfe?hNR%SoBqaqf64I9{e8T{e#2haKg#+fXzYHR^T&E- zBg1vcpy^2#Y;-eV}0=xuu{u!<+IX>=@d3>T!I|PUsP(!6eg>v&<$_) zl;gGKJfo0ha&#_~E9YmZ3K@tE{&p}@8h{|AZf*<+WCuDb$+bH`lj5l5=rTLlvBmO9 z(G)CBj)q&l&~5L%P3IQoW$}_p`OYr@Nu8WNVs?&ps3``M3o;K43&!0w&XTzTUtFrY zxcd{0s)*xa!+GM`Hj3pV2yztdYKT6ac|08RMv<5f5pO&^7_W?oOPOeo`2U=$T(^9{ zJS^)R8-_0#PS?9F*@-N>KCFKu-57@HV~nhauY>rHo!$4GN9huUUh4v`Dc?rwMmNisXDw zaqj|+tT<^nY1^cxoDmo06qQJ!!2!aOt`Y1e_9-y?!rPL}j^{-^OSf}U6ha=hZiR;2z+#WjLWJ}n zlTrq_xktN><(Kk7!KA}xJMyxB=1cuvh6%35%8E_gFJGFrUb1smf6=z3jelWe=aPGS z+rVu;2kd6j+o6f55@|-}L3TYx0?^UO_79$%*zpQg{*3-L^~QOglll@47Zv5Z_s5~5 zDkSQ2Q=JFKAWLYcHHXO#fGIylA!w1(7cYn26D`2UNi%0LoGEN$Ste|!QKnG7)wCE+ z4Kl4>h*zsIAB-s&u$(+R&lX%V=00>XEw*_4SG9qeK48dB-%O;^kaz0%Vmc|1I4V{3 z&m;CiH!L0B{6w2=Ju8M~62DuUYp>h?pFz%izrRWZXgU6b_~;@RNR1s?pjkeN(KL0O zm8tiTs7rQDvWDXG#GSxt7qJZdkgxRO<}M#Msck~Lyy!L7E?qFHPBVIx-XC=F=j7z(9x~{!$=xH%kjEJVhA$sqpQEZ+&p&2#U$zSIzATBH(r0wX{lZb&lobl0|4;k> ziM-xYNC9*9BqIEr!LJ_4rcI6MfieYaJUN-v3Whr znVY!n5qIx8s`0K<)>Y88Q7EWK#;~|( z)PT>IHebrf>j+B24}!+w@z1*0exvC2JBvx4v3`GSvt)6?_55BsLS8^V-iEc5C20{M z9nq1)|Dw2&4UH;Y6!c%b)sxiUvGOVn>M8f4o-N>cu>DwJE!m1XxEgM70W9!Uxw#|H5jnKiTsH zSxuzWqUbL2Idz+Pum1`o&Urzuy$O4nYWZC|LzT43u%jgzUiY&4jg)j#Qxg)LIiv!lz#~{7((DJlzo)HRS z@gVEJ^(9xqH={mvI6c}tS7W|psdkGV80XF_v!^U-tRuhBpZpgWHQz=F@Q9I4#hjs< zpYK>YYuDak3)$>Rvu7wCgC=jL&rboSP-(WnlS#E7{<8->5_^8%!!=rGjVhI+q8N{_ z7wf0H7Tsgci)uy28TThm>vgRRB((dE7u#|ci)N84k^L6m1=hH}t>rJ7IT)N^G!wb< zaA~pq^%?az(}#zy??%GxX=x<_7CI`Pu+2HC6Vv7$!m|}~Rzkf6Q?6AxF5TK)>N(}aPfuLOQl%rh5EvkGRJ6QyRe{ltTuS|q-kpu0vt69 zDJWXcUBS^%xr=#atEj!Cq1PK>g?iXMX^s$Uz}^T^joUUT(gPR7;rg48&( zj)95P9{}0LLhf;jU1~Nk(+2R>(TCQ~1`B_t2V!{CZLFtC5AG_r=!(L`oi}E0W*>sJ z7D;TaFdk{LXA?g-yQsu9eV866vQSrlyX3zS(fJu%*bY)9#VpKrnJMR~NAlYss9jl` zEQ1QEmd`$>iYw?^nlVfk)VWSerTAGk)aKB>x3n-<*WMsO<;gLX{|uB`Vbs6vI+i?m z3f7{$k{0;e>B3ER#aoz-vI?FP(Xz3-$w72};V}p2HRgbDEXDg1BX@ofWgK?~6J+Vy zpw~lJpbNpP)6-^$`8a#TKB@*P zPAUm`viu{u{Ph&4OJ{BmE61SIej@aTxOAN8vM9pTzhZR*`*Ct-<%xLIJ`DGdM_6xD zpEod|$WZP+({ebY6}n;P(!F2u4D)(51v$3A+r4s0P>LM8N`catUYT4QEe8iPGc#~? ziTc~yO&N75^W%-*ztJziO__A2}rj_TWu|LDsHP!U$>~F&0N=x*h z^>4`KKjd>|5`a@%n@)*Hln7P-ky_|vrJ* zRvp3bSN&+2ZX`6Ak3L(O$*aJ!;K@&ziq_)cMx7Xj2kZscI7@swA{BT3vN1(uZ7G;7 zzGlK&lgxnm_V8KbN%G~UPT{$ox3Z1d<%IWT*N}{&!40VXGCV)mM|KWiBenaUW3Nwy zU%ygZjud`%4H)U&=u-Dq2by&+PhZMjFoSl0N7rjt0q)niwqigo^i2I~Z3Y;px`SA} zeuzYEe?$Smys}SLJVMCr-;WLXn-G~PDYgtUUHndm;oA1kt~=^cC^#jqa6RiW&PIOQ z!Fl#|0Y*GW=!$1vwmx<|p3;9^afAj9^nbRL->~h==o5NMceyeO5p?Le`Pp5*S<|^A z=(_#*i#ecGtAsEvB$Zi7$N_gULpcAVEl0}NR2M26j=hF2K!Ns0++DiX{3gwM#XbdD zkJ}UO#qja#D?-t|VjF-)PIkG4{8iN(e+WPu5PXhyQ5qtM%)Phmu+=)6mqA9PP! zS3N3kj{X|4+lR@P&q=$ad)+KFe~=R9?d@{XZZMQRh?**$a||=!jqMp^x$);lwtDY; zDtRDjiIq`(u7RQRqz=DEG(3o3{Ei^XbOx$t@xIWYi6^?8TtH@^jKQU=^Q9Y;;wy)J^FDvfX7TD@ z+iyilWo1mu-IFALJ29-a;zTF?w2K1H2k`+%)x?0fTqW&eBvUhsbFx0W+kyX!vA2$j zqx;%Kbo z4;LR#w)cmTqohEHtP-L7JFOx-Coz0{alO9Rgr;Mn!4acPas|e{DtIWL?Cc0+bic^7 zG288dBXNaJcA!BjV_tnXA`rxMz=e;qOOlJT-^$4eQ{#ENOJig>MGQ3nhLf)!3kvR^ zFFnC|QU>HWQoeui&sLA^Ef3eRVVrSZP_a>*o@uz&DxcEOMaR)m9((a&OhOl?k5jCJ zsa&d5%(!Ylz3}dilGi^^QDdu2GFNQ+F7IuD9lag?A-9J|Ps5cPdx*0L%w;9Z zndO4~lZw>V}^u7#VpzkF@M!C_|e~e42JbodK*}GB!ZAJq4CT4k?Dv z{R{KDvo_`^_J!`PE#2|83-38R$uN1h4;}`aql=x0l5coPCvFbpQ1tM@R+0cFy&z|t z4b5MT>hN@|LJlMA+=U%m0@W}JAyQcP<8B~y4F?M1cM!^G%w%aah}$KvkRv&SQt~q0 zDj0v?z$BpC22i_JPnUZzcBIzncBD24vP8n716jjjSMaqntE?x>7Pv}3MK)&98$gqJ z2RO6(EV>}rv;t_o^hPr4wNZuZE^9AZ*DrfSZtia!Q!>tujsf<&pQO%a>utN)J#Qo4 z%l6E!SV#r69Mb6#T`y33AH^&l#(>*QiC9zmWDCp+f#xTdd!mj`w+M~HJG|W|@!&5I!t@!0gA>j^m;iN5>+^#7iKh5qFYb+yW`HAWe5%|=7;aD3s z3>liCWQ3=kskWZY1#g6Wjzb^xR>;AQ-w(imm_Y$#=<+7DeL>(a=ffB|(guc4Pi=5B z!24$R>Funz*0`nhNW79ouwrTRr+rnEa+@-@$oh(AGM-gQm_54Y!p)?3$$#O8RqnJE zH)kE^WYfv)w%9_}*1geiAJy8q<##%#6uPru6?4D(c*qI{@~4F}p2d0mIbdFKvEJoq zp>b>J$o){({ZOa125Ns_tKamO#kT68-P9toDsFp$oo9jFVUC^n=$F9JuQ#o$63{2M zlP97RAO(j1RM;gg=qG*o@@!w3>INK9U*}W7bXAvpnr;KxQ1?3Kh8ds_NkFzZW`~St z@KO$}_#DH>8~z$74jCwh1BSH`_oz-Ky?^n;B`S&C4BE7*pk?gmk?U@we;0cX(~~o> z6%BZ9X?y(tL4x~UKOFu%Y9CowIS5?1`_q{TE{)7t!+c@<2*X5ekd64XcSllKDDXUYKNzar8J z$y%LcK9^Py9ynXX4^)P?UI+&klSr1!E~ob}?hHw0Cdui4nZHBeTp*EDV5(?ot( zEqd`As+B{IiWkLFW=;7V{mzf<;XvJKG&j!X2fxz~203HU_mJvK{`s6tRv%F=2dt4a zc(*_qurQ3sHmK82n~B@3S$nAa!3}$;y|>2UEONxhB*1csf`})i57lQg&&RZoP8Y)r z#m9_VM4Po{CakRfgAH?*Hce^;j>N?Wi+~U<)(dG8!WGYJvz+?o2F21&6;Groy-dUf$+~JYx0Kvj1lCuPknf@_JanxQbandqaU zJ@+YBfqnG@!Rd;5JADh?*_#=+_T>p{{aKw^+VZ`)nM-K_<0Sp6AsxATJk_J``ZFdB z(JQ?}g%{_0Z9Xma$%8{4XXpBDfDb=w)@YhX?QGoP-JG|}>>yi)EGJ4v8!Bt$2os2AbP z)5dK%Q}Obw*i&`#=w@n|$BjS>6@>{Poyx*1&_Yj8FHyaMLk6gHQa1zIa8Rz`;09W( zXykA3jAn*T9=JDnDnb^o+6*8ES8bVymOFQ_!|WXhTsiBV0S&)e195j*pE>Jl8PCXG zE*1CFR3Ca_dH{hTx@G8@%o0oSh5W5HMKi}w-It*~&Ev?_L)@*Cn+h&_Wm=0z%=6W` zcjd73dMlv$TA*l6P=2wm%X^r!8w-=casp?9VAbcXc~JR+mcC93NRemoLod6#q*&cq zkN~85#d`tNiB0^dv66Hy|FQkIa;ThVXW8hdwD7qzA;4X4B&u}2TFbD~yaN`o_S(d= zn*hod#4~q(a&R2r^f!3_b^DJyDmltMCYz6jomL&K%*{5-&N$5yKxm4{cAzHFaxn(yETlHZNqkt_~*>} z1=IMV->ur*7U)b@ThY@&-Zi^+{ZL?}eezI1mQy5Jg8(zp*Am#yFo$ZVx@DLMCFWwv zvk7n>aMdbs9z>wcE*f7ikG3<;dGrP|y7)HknF%f0&vt`^%AOjn?~5mR{0`>b1r{s5 zEgk`yIhBr?tiC8(B~$b6fza97qcC*M1Lc$yhv+xd);{~B$AyW;*7OC5#wMV?UT zBOFzfUbTC7I{-z%t{}pgu?q4|(Ec@)qA(eFUxgGJj_$_ zDBP1@M(PM4obhrfxY)##oH!CF660T#>y)sWl@}}@vv=%3OZokFpvCe=kIQQXuCZm0 zdAmIJ3a-9{%%$-M((5Pv97SdK!qWptZFgB!EGn#O4afv^^9%LTPVT+>U&qg+MUflS zbD3HZ)J)l6aM3f1I@(U=?0@58%hvx!rheBAb$jx&dV@+rIj~(5R>K7P z7SPO9A1(A6K$i03TQUBmUN(9$4;=@yp$HN5xCA`?pEKNV%bF zGnQBtU8Z`G^+upNw1cxu3-@5%T%oyeUr&)G6?e5FMggM!RV^PJ^6vgKWRl8HmCkFMO!hqal_m!25)qxdGs!`$08E zFJWPlDfXNY>&m^1KwUTCjdCAM&4HO{Pz{tta06g1(a?R-6iK|5k7n95}=2XWe)a@dxHeDH(j{IqEC8Bb@0%4rxx^(aYdiiN86| z=1UM^UZ82=o|0%>b6@%);Dm3!fjQin=lLG!6M&;wR};u81tS#yOJ}Vh!I_}Ko}d3g zW1ihE(BppiN8u37r8l&By+_Zj1SMI1@$UxM3Yo{Ycw0TAJ~fVtK;j^i8~S>l<-!_(x&k%;@O#jXXGD_KLV*nU+y!Zey24^=vj`iGQRr9{XA&sn-Y(d5+AR4 z=`vIotOLu~t8wK})F|Tc4%E#izWoFe{G%+AXhuhBzaZq~5b36OaZcO?tB-7wZ3I*X z5z;J?AR6MBZVsmYcbnB%ueoxOOaElH`Eod9G0n)8%!x2<09V+($?Ujkc@c09X`hsj z?GeRu#79{&-yQNnYtP>Ij2p@A6ZCJK4HQKubI@E_Wl04~ulIjEGx-H)m%b-p^^3q4 zkqjlzQ}Lna#`K|gQ`AaqX}lEKP0APX7jq&&>p$aV9Il?ES+K%BsvFp=R)$=fC5Krx z;d-?Cb!-HT13B)Ko0l8HJl>D`WzVx}U5=~%!S)=V%Y<%jiED&A#G?iBbeKJ`m!S+9 zgc@mY{n!m?=Y9L1P?5kUzgmOnABXk_lORNtAR@fZjomL~V6?I?zN)N*iD@XEm<5s^ zJYeK%{_Zd>!Z)tkf#X`fuYF*SCxzGv8?f(VW?LEluYuaiP6}H!82;m%9J=D~%YnWs zdXI((y{BqH|9RHZe_OO}D1YQTJh8rOU3jc$=qQb>UEuvcyXpmk(#ZeC)%HsYd8<(d z?5`VgOEXog&V&Jyy^6gnWP7@P`Id>y4{rb7=Vz6u=1P&ad-#X7x!Q>@=#-wlewY3E zIS$?T7q6AFpS{ER{NsN#Qk;__@EN&IQlVXegVeD3WlWncdyVNta#iW0@_B!wOd z*(8S^3Q}~|JJ3|&p{>u$m7YdNhrdZxJrw*&e|jk10`)yU^*vwyS0GycC+=%H#8YZ? znEHOvQH7hCRhKa(GL!4vivi0NIinBX1edsn-v3rY+db;8$!-+0YpD@od6mNFaHOO!Q)OygBAd?<+NQ~7E_ z|GOGzV(yaPuCo74$dy%frgcl&KS-5FlzB^}QIZufDbAmtns{YRpEm<3y}Gb|Xwwm? z{QpOj1pguyJ}CS}3?=o{xlHlVdVDTXc0K zfr+K*`x$BaKu@hpSJ$AFuiyJcv37>ATP4S42A5KPis4Frwn5W&!Wr}SK!=SbM?5nR zjqO(9C#E_xnr~Q-1(yXk_l$bPX7ue$y-E4-8XUvK^&u4>?WCu_h+pxL2N3u3f3-dW zYCiKFsy;}PJb{qJ$dFN{R<>L7d01Xn!UM&v%Dlw5#Slx>WB&c+?$UYecq8`CPu7p4 zs9B0_80NGF?=5I%el}WlLy<9AswtOJ=Ww8Mb>c|0I@7vo-BG($y9E`qx&7S}yH{0e z2U!P?+;eeteq}S!)4;7rLgaga&6z8Z@<{RED6-gt!5h>oXBDe5ZT?6 zzq0&LtybR5bg!IPF$PK^+%nylUQXd3*N>wawl&G^Ez{9oA!&$zkd1#2k;45-87YH! zZ&{lv2axRogm~h2MwXTl3Z1N7ZM#Wu+=|Y6IJaNGfuoT9A9-82Pf@hN+bgrJoNA^Y z9~ol45G53Sc{5$q={JX%^nC`}_*ZKG^y9?|UUPi^Ki=DvyjX_lrGuk=Jg4$LDF4Wq zZwv)%JMhA6dp46(>!fB&|2=qKT8Zs7*j>O31&<3iGE#^2bjt?o3}uG}=&L2AZ^vwb~xMq0T; zR~Wa{j4hw2Ro74kT))yXBK9e5A&N_hki{5PrPk;8uT ze-nY8M36xBft|A#c;6`T)+E|~CY`-A=(X`AmF;db{YQ{*Y5fq?$o($KWu%_0SXzC}8 z`FAB%3(r?i4~oA`DF2=__diz!f5$(`Z-nAoQq~CKY3FpN*);fQ zn(h$viQ6VEwO)Q?p}^cuHCRCt0gq2b0>o1ps9UvN1rr_7_p64aVBL1kHpa9qvueUn z>T#oUv)cFW0Yvse{{t2BsIvt@j5CU_uT(`J)RZ`TtqZh9a7t5*xmC-|!=}G-PKk0( z(Q{6HD^Ein4&m1XNpI()i$NpR8b_P)JW~IT&;ZY*x{G za~J%S=LUDTawFxUqjj$(Z{LcoEf?u&+<@B@`l$^<6cm_3SiZL5WF&j?@rU?k$+yW! zgYigHv`8{~XDo^j80mr_#Yf)M&g003kD7yPO8gd)r8apcyMeX4fs~>0<5mm4^>?j@ zCRdj-o=X>vNw?`cP`VOh(W!2rzA=ND{*h(t=}x!Bj4IFQ>G5Qb2y*7$Z*c_*@`2-; zz*h&)YPJ+KJ1BHnVwiPhJCxg+;j?u5LOt_4GAs1gSBKwB=pLEb!gE@L%k9 zPa&|`J+;z31?`?%?3O{~j16iznwn&&os01tkimOO9bjA|+;^{Sjy8$IkFbda3WsNw zY;q0E+{XXZ-0t!w5_X~)%BAlVU*uh2Q^|C&d-xfx^_E*o`jORdk)kJ7@Mx4giKnp5|9aF0EuoZ4E&NF=n!_^xU(vB0} zsNm_q1TJS{-?r9Gk)b>p2kKlv?Tj_Yvn87L&a-APu9|iM5pL@!#|MSYOv)$i6*m=V z{(RHYI#L3|aXOGa+A3S+aImT^3Sk5V`dY*P#ipJ2=kZYZpmE?Kf96nYS)Sy_ zSl6T-(pb>5fN;ruSg1eT}qkg|$ zvC9eccBGE1yMah_bkg#T%!?cKwCo{Q8e4~Z*Rj~Y78Kkm#icYZ!`jn@(RWP5T}^N8 zhriTbcvQdXOR@JTpL7bY#s!|Lm;bt_UD#6z^tE{q&$DkYue60@=1ur;Znv;ke^{v8 zbVC83mGI1X<#qhW32*E@M0kk}TqFWP;6CtB+JTJ2mJE=zD)^8AiId{>gE+MnHPP^Y z>9N5#;rL)866*w<*&FS#?&Hi>t``4fJepY}$r@!oid?T;yOP!$Ev<+@`9uJt5o-9^ zwCOMc)!hL{%rMsL9V<}o_2_oCnNk(X_*EcQc$VpQLxi{lr zQr&UrtDTmfy?*0_xFb<^QMy&!M49|Vv_`J3lGgA2{Iha-fp(d^h4CYvtz|z|1D(>` z*ScN*d{S+TQMCs~jNm@8&kN+?6i$kaO=n3OqbU$+M{UR9XN zob-hX-7XFR3@5>6*25L1>hXx&orQ_T)UASia(YC|^`fl$B~uDiHnNBAOQo~Ef)@ci zu)TU&w*{*ny8)U02xYa_M^V|k;co(!#N`#sgb7yp`iKjStTU&!FMyli)w;Z>4@HA6 zO$i0%g}d*!^b*W?dS^EhgTYkQ{ZY(Oe&iy4S^a?9I5K6M1CveNCncLmoyFL)cg+)J zCFL%k78LWBO15B;d!fd7s9QQqW+bIp`pV6X?t9+qHGMmIUEkNS^<@RCl>rG^T*M|# zf)Tf_I>GJ92wdg|eP6`@b&%8%L+qxd2)nB zI|4B_0n6m;kFnbpcr)9dkFK5SS<&7NMdpON&3r_!P9$gF5fgGrwm|a$o<#wt!=EAV z&xbJ}B=ohov-G+(2cpUj8+1ChNluraqO3RmCfa)cybz^EIpzq0_9^M>CD19SdOz6< z0BpCpS6KO8z^SA+tY|1N^GQFe%EsjS4ymJRQ3P}PUemW*w_jrK>95EVDGBLm#}<{& zU6J+^&qL3ml*HYWqOSxaEk0mz*|EW@u@1?1yLY&eqvx5r*L*0znU0n@+_lD(X2o$r z!<-(KJKVFzpKgzzo1JF3)nh6lWhp_G*Kn;5DZ&qv3=XljKq%=2iF#J*(pDXbf^doY zZi)Jw0jR!!)}{%QGgmlChTvbXj#Fj4JtMXL+CdBr!gRr@t8PJ$Ccxs&>f4={LOg$6 z0)%*aT%^uZ84`3gM!1=j?^}f{C6JU_!Su_bYP}YgfjmXv%=`}K%P;dGyYV$Bd6R?f z)im_yLX?&nX*4f{H7v(zUTY6lH!exjs5k7;KPH5h(Jn)km~Vq z%83tT_&Ai1y5a}3b9u_UZT7*3!WJT_*wnq>hfkk%c2#O2&{4jPs?EY$#gRo8^QYEj zhMr&FsI$I^qZ-9!%8gXb7HqpxPv_X|>ijl9XPHg5FMRGwFC^vwjDfil3N{W^4+Hjy zbv}z(VqUY?;mizZ=>%gLT9|1O-i9Wa6pjhH6WWNDYRkIgmK&ANq1J`go7q{Rw1zIr z=*}-6k}Y(SeWSAE@qX@2LmUWxPaFwm^3DKv*31>!vM@qyE?N$`45E3yxp|2}W2Sd3 zE?l%;`jLrbW%RNFoA@=7_r}n4?rmmIl$m(L&Pvk}IQKojyRgHEZf&@yE;Lbp*kP-& zTGkT@`h$DNv5#@oOZsxjT}gITYY)M=FUUjnPri2^Xd`pplfA=bKb-U z&+t#sg@g~ccY?!e+MKr!<4PaR#gPyCUChY_(wwXPt7-_(D|~-n%J{eQau&W-boiQ8pqaiIr=W$J|*8S|p|d}I%m>b+a{&7>#@ zq1OwK?!gztaq0Pz$)XV|-}Y;c`F-WqjlqY?lYFmfFV)J>*`J0-Zr7Qcvz`xNba)0d z80soKdxYBr5${**ZP2xED>QZ0CYU#k9(fc!&AgSSOdhIPm67gDvpR)!)XwW|u0 z5+qvhS){@@gR_wkGw{ylT&Co6c;>nN3p;Tiss=18D0vXbXz7_;-BPMHd^vHSl4;iCGjxdnqJB~ zNM26v&O%dn?{~2r5dR>#Mm7qxuu@J6q$>e@MlptzMqj&lpHhAfAWuGwBfDTX+*MlV zPd+%f$@~83P%|uafWh`#FMT<31@=Zcq&>#<&BBfgS_gi$wEF2KPWWDN*7%eCMjEgN zh4^V`%ywUDX{&bpHvDyU_3EL(HhX2_WT*f!d}vswvJhD`T!h3RF-d!n%h{U1M+M;N zW95vhya^jx}~3m{*~l7>GhQOi;!0GS0o{Wv8yLOV7}vVV511Uy5rod=wXa z_o(n2!tBJSUii+{{}bnQ*(aOg2JL8gRNh}_nk>+#+w!8#FuY{5Hqpcn967V{1U0&4gHDw&Wh~Lk*t#}J{Eo)bNZaw)rQ6c%y{^)4tcKKLH16;s{MYeS;9VW{&&Rx7saa9ovLiZo)Y~G>(lvNvDYbWxF5%+F>=1rT;hXF8Ih#$ZEylAB z7n3{X^I3W};QsiFto!o}chcg{KaiCX^3PSc6^h#B(1VHKmZ7cTLi3iJ`KVo~zW|%& zJ^kRbM?+a=JM_>(=H59rW)ZxdO}-dL;kQ(ZSo&X%FtTtI0o}+}*hZ|>^x@2|y6j}hIE!|_zxPo;Rb-xNt>9$oKmXU*}BpLot{@8Mt(%{CEd3ni2qx!rWn z1=?+@_|p}tnJ3-Oz2LJRCgD`Z;f~?*0y903T>HK6cVpJHr&RJ`Nb@hg`Wz{%XU34R z&vzs5!N?;SfVk=(w8C-Mk^^(x{Ym_~??hv)bwR0<{C&IpGg0+dDghe7u9$~%+>#o|%G=61c&lYE0MAZ3V zrocoRVFL)Gp7P}Wk*|{$l~DJIwDet?y@0^$nRFxOmzeM}H;h-x?j}HXfVjJ=(uc2R zjc=#}Cd$NO2;-fa25D>G5z;|*QLPbW?9J`SFCC-#0eqir~YJ2S6ZmR8>}*F8gH zyj(8d1NtbK&K7djkcdWH5$DFARhW{*N)!ObI?5JOOSv|#{BpO8 zks%(O6HA>gY0ejkqd-+Z`4u&?E$x?=)NZ~zDCGrMPbMGE(H^04EH~(UK zY_>+haERAe-s4thV$Y^va#qd0DM#)3t)kVKP80@l!p~!dp0iVWG4bqvD~0Hx&(RLq zCAp||%|vz0r0W2WXkjT|#;CsnEA=+>#S8{)26XThbO2_KU$wh(SK)I=YE1jpCIl5_ zI3e}F&f2W&$eny-DtypZxT{USwh+C8K_ zjgWr&OMUj|2b7239Jd2of4yIWWP7d>UkSYYlGB3cOM?mc7I3Sp@f3ZE|81|vGa+5V z3{pm(4VP&$=ot$?{!-C8?Hh9wz5g@*Zu+4|-Qwz*^al;dPO<1Mm%CH>MlS>;0*C5%N{@c^Y!6D6>Je*Qnh_;VaB<~8aqR%7y)%w8O0Jk_r+Ra>YIF^?n$ z@U*`^)5eQY&`Pcf>H2Ai)u37Xh@u- zXx526zvxWMwHSYT)JDBMG0VVkH_yPlws@d_C1W7ElwE znpkXUTx3E6%=t)|Sncr|l~PDZ^rT+AZHjyGZACPUe`?6JNON#>As6_hIx^-BQQ!IH zNPu4y{@sa;t%7eIZ~3Pf&)yibe!UuVtns*f5#w~i+e#Hpu?ge!ow4$GvBn~?M!9TV zfr)){H_k5IDdw0C`Q@Ohfc@`dAM{saScs%rMoTzV0J3Kj(!owYKwpJ^wk@mi{I#Ic zXYDZ|n3WO=Ym#XBLz&_D6<_`3)U!>Hj!*zjIOvC%5UCWH()#TL^Yv@AI}Xx)ourSNi4Zs#=f99IX2G{Tb^N`dh@If7*LP zbf*}BJ*CQcF>sL>cmnNef^^@E_n#9loJOmE+01mE;5?UfT*b;6<%{&gsmmxGP3zCs zo-u|6?pq9rTy!aN$vLWp0IXc_cX{M-=s5JNm*6e01c}1gPfBD6wns=DB8kV$#{-c| zcNr)6ufrH>)W0=IXJ8OH^>bCUyewTgdQ2cpNeOEVk&dk!kqME?>T?WE53~R8p#1KM znCiJ$Jo7;9udL+#QDJnQ#!_M3QKrG9)Fke|p9vU-qRZo~G^aX^zUTA(x_cX!N3~xqUtHAuVIgIT2QPd_Q~0uMY>r zmTs49j}$G!Sw58xx3qEc2hOGmiCG*o`k^Qunx}T3*8$O%-aA9pWQo^hCRs@X^cEL} zkYRF`h{A4-rBH#^LEFw)&f26QEcu}XZ}#7Ku^BMBNG+cr_QjURv<6EB8|T^5Jy23Z zarXS{TK1=<^m%)YR6|GV6^5Q_`+1;t(+gtz6l&vEar2^1f3t^&e2+eD>&AjxaZ2O# zokC7CO|sMRi6{^8W4+MfeT)}r^}JJx?MRJ~XHrU9hCvy~&xOBbAL1f_VxGAD%X47_ zX}4m|0T84-v^%Nu6bZL zA8gI1oJ`x>zMpF-yX}5!-k`hM)pc{8vp$)1F5UzV*c`Bir=bpW{$sryogfoXL>M4%QAPGc0@2v4!vkj|+Y}>zd z8rsi?+LIfv1fME19=u>>BUd~1cKpIBR5n32uTt>hCdYv`i#1p&9)y5$}|L(8

<0>dP*HdqYZxA!Q;?(H0n+2r?RhWc2aqYl*zg{n*YMcN;l(K0;19BKJl z$6I|zD^(5y{X$6s$J(DAq#T4h=hVlp@deY8PHsCp3VJ4=R2}(oEl9z0X;y~A@2fqS zZd3c0SIW_zLu-+YD}j`O>g3kM5y%pVHgig3|%`nrW-D$n0`a<1M!r)PXW zj16B<*Jz(=WS=xTrH7PfQExN4B;NcP4oONehpg{;jddokH_mK{v2u58rkgFYFxoLK zRz$En1zXmZ`}IIELt$A*Xt9gQL(B8;Yf8OfYn~X@qUNvqS^%Vt{7q2fYmaZKd+zVc z!2_3wuqGzXixEpPaUK(}#$`!j5)AXVDjwrm?-6l*2?B%5+D z{6Z_CI@4QHfoT-+=lh(pYhQZdVMayAP8)8#N4)cfYt+_3^2s|GRP30CMPcNwZ*Zl4 zOTX96f$hP-Q&Dz_brAMAy;8kZZ+fI3h;~BvUSxTa&nVH}sbT5Z8|4i4mT{Ty z7jbk4cw1s}SG=R*>9)~mnmOEMW0@_RBWol2I;75PwW;cgMY?B+oCT0PE)uW z(YR5iU?;h-`8vK6;;13-D{*`CE@ZlH>l1&1l7N+M@7v>BhKtFpyi<|Z9PW->NHd?} zZdE;w3sVBYWbd>#FA#NFvA+V&0Yf&An^!eep9Zc;yu=(1Y@1aNLCyz#wsMZJgN(IxdJ`B6Lca9PcBZ>gg ze(TGv@`#U4Z44nYgF3t1rA2`Y^mO}>>GQu5H;p-QYI4E>@w(qJ{Oezl+`X4B&S`h) zaW#gl*%qIi6#1NpwIHL|?iMOhd8D+t9Z!)5nEkntt3sv5d>e-DrjYPqr-Sz{QK>hX zO^1uUm9P_N)E04wj~R&*_a>d!k}WucK1{o-nlK~1esy>J(1fQkO_Wp`ufrheiJ<+Q z<6vp-Y^M=0op*7Ts6WEm&0U|pjkeE^;x;+c%>3Iv{cSeig~^+9B(URU7K(l(yrba< z?1cZE2fKOm`tf8@rLNratyftd=*Nl-u1=D7z$(N6X*ozsqH{hZXkb^C6aYL4yTIo4Oz9C@fQ*1DMY zFTH;n^ptVWh}6>utTZcXX`h%lTbZxD%YDjg49%viOS$@u>(i9CaXGnn1gboTIsD=2 z+e_*0Qv1(7LMkdgNnWjBMP$*neG7x7>&0k9Uc zwH1FVbbA7x5-$2upb5^1c<8+nB6!{K374ueA=y@#?WAAIPC&pg%(|6(r()Ya>F$Jr z45;kZ@TT#MNx+eXk&}>fXEcg+}>`jnC+T#%F2-XWHfan^5D}M!QwYZ= zo+10ZC||EUmqwIp-d455ehLA^J1(McTo<}JHaYjuh0`Dfr1##!!GQZYIXt>94YF}z z$!hoqe@r+>;_ID6&DWfOnQjuo9iyo9U_L`NO!Z`Evh5c;>MWvD_*dGyZG+VOmCggB zrFvl(v`Gv)p)*YKOLPl0D%ZMviT2?3YPo}}$c%mYvw~WUnFHe1c@W5?QCrcW44ieC z^o{hMOC(^~=mA{qji`zIC^OT0>us`Jj`+6TjUYk@avgF7>&ra#xIvnWo9QR^?z{Cg z=`N4v`ScGl`G<5O2=+f@89_M9qIs?ZY^k!op_F^@jFx%u9BZH0FEv7!n`)rTo)rCq zXM*FmZX5J7mBfnme#@TP2eXly4G02o^XamzbC*f+_$6NL_7M-dIb%E63bmY>&*Tw1 z7$L||Iijx+(MMjh(tnou9G&+B_wVO3DgU1oKVZne{7oM%WAJ{T^#@#11c+dozSeGY zP+~9Yxzmoexu-vHibSs>n}z?$R!|B?Z}6LiV;p!yqSqsci|AxFAvs|GP;s_XzQQd$ zc&op`s?%ZP6LHnrXZUUbi4^XM*tdhk6^;L5whYGo*mBk0w^9Y2h4*9|jzufJd-Lig zT(|SjHw<7AWVmsnb7FHZbl@8an1UZHk4ezCom8BYyIQkm?RaTkD z*>02HNpdsuEA2Ri4yBF+R|9leobzB=Ue6d@A1Yhk_{k~jihhQMtOmLu?r=~pe<|C< zu!hGz?pIG+pzUC{j#BRW3qE>lg?-^>kMp_t@f$=h!AnbU2-*szbsXCNA7tP2oklFk(c5eg-k z!ChjS?cEzSlqBE^ktOogwxh_kOEITg{;x}nYn7=;Q0}(D=Q&r3vV!+`HR6M=hHsOM z2L3Fmes7+RQOQs*Tqt`ZK)A=PE#G7FJe-pRZ}vG}qqrv@#?6ZzR<3~h=Pa{sO?tCy z=X-y)j=!FCX8s11u^xnT+&wQIdRC0||IqZ!(S7{S*NvStZrs>5-)&>tw$a#|G`4Nq zwj0~F)!50C&+|LqvwP0W&d%QbXV0G9*Ua3j;KdQlFN(Cplp&5u{rYW zq(icIYTqp@L17Y9VVBJQ6W%M*$PW4wP(qRg8DF(0*BLAL1pnhH3e_9Dobj-_GqmrS zPVemj_VCLU?UyUy$0Mm7(3RfzW{>^o}E|OVmqogKzZE^0Aytcp|25Kwk%H{0aYML}B2@ zH(UIKd!6fdNt_L`ONf#FV3vRr4clC$$w=C{rAXTR^X5NH%d&+g-f&%z^EG)0^8-iM ztZ+alD2wJ1;T0-=kMR~e_K@)!ASTM2K+C7QOCm8&=?ahUTGN&B?dsM2N&c4bE+J8E zh!)^1^=Ho=;7|Ama6aNuL6Oc<7`&T&xXd*VY)X{8a{zb=jfR*OYx|eEjzCjaTI!?6 zE5F&Q4#2olH@O+~=na5&U|t~{8-XE^e=LfmOo@V6)I?(EZHT_VqJPgXXpE8IaD`Z@ zXgIR`#MBvMDnSbpbYl`DCis<)69&Z?PU%FU4aXF)Cn-QZP{Bw&B_MWm*xragTSZ7s zT;&&Bg0bP@5Q{Pz zG`(_BOX)4i_yjw0Oz)BBFHnmj;i@Dc0e8*(^v%LeO8_~Aau2;23ejgo4f;nz&lhM# zer_S;oLPF5Y{Y*)+s!<`BD1BQ+98pLV(iJ-6Z3#QsKu@FlS7M)g5VE|5^g+@A|@R>$Cp#YjjQaPJPk9)qjrnJ&xiu}Y#IS#i( zqZCU)M!rZMU0HKp1kOo`Kx{$TiP)i)hd>oLrCy5M5;2{|Db2A6ZpAGTiMB1r-L*iU zhjdcU0w1%dD7EB9|7Azvza<6Rlk)WsD>0<$FW3qHujwHy^rpEiiT?$173oZW;ire- zYEB5@EU40F;Ibj45@RQ$D|DxShdA*6Iu>%Gc_4(;ovsH5N$>}G4)XO_M*{u=;T?d$ zsixY43j4*QhCxOINBEPw!*3(_0q*%bK{)(5Sl*x4ZoTjG2+&Y|(FpCKGB8!Rf$`g5 z^$g!o!-Zbwx0L7ZH2&dg8>C< zloL@2A%*BzT=9axG4*1&8HCh0)Z)@41tbMAnW)3r?lEIx6d7pL=+u6$%VO$tv6#cX z^Y$_JVqi^z_-n}Yp9a<@=xY-2@*Nk5%uQUK=H7BvRj|J;JyIsiQx&Zec}+cH57x!& zz`8okt)Lob0p;`IWc=WJw!f9`@A>!&^Wlg1NMv+R&a?x^M;td%M;AR2{$x{47u{^^ z3)=&Z+PF|bExDO(n+@L@VIxR>8}TecQ?+{1sHEOBdtMydDZVN6YqQ)|u)PDYL3u)M zg)p*NY!WD+u)FhKPZ{x57YM$sY^9y)VMKLaTt~g1 z;x8$`C?LuSZEd=M7#6+Di}sWPMdH4k6h*WA0QtrC{FER4$`83M_eN(Fc)V?P1IrJ- z&sU}U!!w@{?n&MqV~6ns`?GV)j2~BZ@Q7JSI%?jqB+$50iD1kLe14AcH0jv$E!3Of zit`pPI^}a2@I>>O-rx4rr8v=BwJWUb^7!GmQ|NoN%mUGIiC9Wu5iyh}Ht{1v@8s>F zW9<7c04^ovnYOgl^jJOmRRf67=$v(kx%PX9Gya2=_X_0>)*IlCYJ>%x>i%{L(fMPa zcw!vPxHwuusCF$8-zZU)YmrE+$ZfYTpv2+H<{3^C5Eaxcxi#)pqO!!;-vJNf4^iy- z==jK{039S)Y{JEcFL9_T5P|W}ywv!Ktw3EsdhOcWe`^-Dr-*v|+PoCOWO4557=a+` zAX0qL)q%sX@s(@(YF7xYmCz&C@Gmy6iD!x7U+PF4-Giixx9=jr?{|+>-Vgqg2|yO% zu?kZ}PTO?I_350lb>~ za{h1k5NBZi+G?Et4leZekh+In6wvLiyn{glnSa`i{|f{uD%xGi&mq#idifJoqa0~* zq>OhfkM;spPIRw)gT0e3bg$sm|5nKG5wKexo4$MqOkQ0|c6X)mV%hK`x=r-S!5!)s z``<7r&A5G|+2(r2jLgd#c)5CaY`i;@RUJra-QQ<_(tM>a?E$?4rWGZu)!5(EAwWckxX{$KMzu**)=lI@j}Z(55^ zudnTMS2yk*-VBpYC5w0N+Q|D~Pek9el3L48@2>L7lWM&qliD}m;Lv9rSI@XF*KWL8 zJ8wi;^LQV;iA)bzkFF`@V?Y6+ujcnfXR<#5Mf!J0-T|4^(Lp}QkE`w^thU(dqDX%rydhv?DA z?g(tIRM!V)YYL)x8lpeE?5f%C)Ha)ln%@km)1wCa-j;Ts%5oJQ^pT zr0R-J;zJS&B%=Dq%}r;>iI!=<5zH(G)*6@(x@0;mmWq)@~9Flr(!75aCW0AV_4#ZN0t2c`H4P4XXfDf|DD z{=>EI$Ed-OLRHicRm1;;Di{BsJ8u}841d$7WO?1EluXn}c+w`&x}LhN9>jv@9mkUBf4=^Qp<)0~!Y*ZG2Cggs%9Y`=FyfaCn;Z z-5lDz$>z_R)V-n?_5}OjbHiMhMAhxbhEPON90p=ONX~-Xli@o<0i@3x6HTgMRb^0*=dUH=d{zsOgKe8$7hxU8h)HUG;p(n2s zZ^DuD#`b3uhi^sk;qqA5WEaZmtIIprzs)~4>Vvww0K}{8mfJ$kp&JsvEL7JJV{c~3 zA@w$B59D8$muX7ip4l{Y(+-4Z7GbQ*ptfe9Ir0jlRKNr&!XukPP>TjBh9DneI&xM0 z=@SRXz8w-Au0F`yvJ0JFwfY581oJ*He@w*x$9md5i2;tyuLRzX!#Bor%XHe^*A6GO zKFZ_BcskY54t-%f8fuuMV~qD0E#gQg%`81NgF7oRVlc*RqQ@)(*$Dhq^R;H?&@&B3 zPd1sh?xt%+N)~=#GMVNNS9io?3bTRWA%b#GW2{=OXYljX*B)U*8YX3l#m*1;rtBfJjJ zZpn5cdE~wCQQuO^n_iRg#PN+kux&zk%ia(&IZ*^0N#U{qNE3V9b`+vHZ(iffu~DA~ zjuex5tkjUE*G*IQ3O6o$4ylT%iq!`wY#<-!6Ip>OZisg>K-NLU0V^>R#xyo6Gyf~U zxZgqSK~c4%7Ax5KTnb;+(~ldla&dm~oCEAs+Nt-ho;W^~%)O-QCd)0UnW>aLOB43G ze;spK7}=nw_5)7bDc5A=g#3(*KypD5U$Odg#V5#s;ir((h_c zce67N5KJmIo4rZvr{a68q;Nbvy{?}z)FkSl9hfbd5bB`oK8=Id-)BTM33Qk`rr%5u z=rF8{X^UyY=tupT;FMTGl+bVbZ})erJvryVmxnuy)~ds47j~b^XNtLpaw3YSqs~m- zE|)i*;@Q1kIw=NE#5e>8<`yQrID|T;7CG@`X%_{E@80a88GEY!N4Q`-KB(Wp$$U)j z;%Xwgix6QUoWTRXczk*J0s|)cW$+6nSl*{R2~;@lrS07R#J1 z0EYEN(&xp$zWNK{R|GN0{4X8j#$wuiLHZ6BjVKmYi8t1N zCmu$q7phZ)b$Y@cRhi~@8iPgIjR5-@w)J#p6`ja)a4@51@odT;mH3AY&1|o z#(TcDv_>6yFYB?_Cqa~|JQLB)E_%O~*nY86v@y$Un7frZ>CJ#l5nT9kc_#IR@I(rF zV>Si4y^0n6QO{K7l5BlsGoN=R<#Lg8vwH49$EMSIdBsE7rMwQd#j(M=wl4R9M*D=5 zeY1w`PG>Q~S>-_|YC-j}Qh3t?P~==t4{C>c1Ycm(^J=d{buCqd;hQyw>|CI}-^kZ| zs_3Tp90)4!xM^*XfqPUbf^p4JyvQgz_byT~|9#JJlE~B7{lM$;+_Ca4tm#1qVU^pz z9mb7_X;T3Xf7R_PSIrHqox~yY*6l=G$HS4z`wvN#!{T;XJX^RSJ7eBKz$jO`R>&x_ z7L+U9fH;(z_-6v4dmv-CHn8y#Cik2+U4NOJ(yWfY&)!~A{cw&()p=rQxPHCMGT?^p zWxqZ#b;5GUq5Dp4bHxpzxx@iXZLZHAELxZ{>&VF?I@=n9RNJ?{4 zdP1TP{T0|O)(5e5h_TQFU>mZe5IsvYXWj+~Y1(izU^gHx)$WmKJP<7=uG)XTIl0M` z8qaDmzhhS|1X&w*zgQ=92U)RqlQz0O1GWWH@FD-cTzh?KKa0E?jiuxmhh+)b2!Vu z_DTFJj`C|C7rZszsSUs)KvuJE-|s+s!^Ei1!fVMAdgHPIjOe=6SF~MVYj@-8KkCcK zch&>ejh|gQ9t)|IM9f(?7Z;!)58lQZ`{_1p*FP-Q$6dwzw)F9`sYM+y(I}we+5306 zb8^cNJ`138ho2^D#{Hw-ZNVe=Bh-0DgCQ!#wmSjlK2xV+^F9-*bC(~*bI}9Nb(xns z3QpqEc*X-(ikoGfr}WSTaasCe-|%96n2I0YqCGIc;nR-bign6q)z{r*{o;GMgbcRX z5b=d^HFDI!k@kbTW5#&|koTChNVGi;o~K|uGPE-F*^P;dRNqR_6>e{tV zK|t1`>hcBn;!2_~-kHRf_5C+cm1G_Av*F$N5VS}8M<~N=>uOdp=j!MEVpv~8TBSTV z=B)4e^qM-pE}1gsoL9e>3m7p5B@*1zd?0B@I#q#$L1tA@8`ie}ijJ-;VD_j--dCSH z?ycW>TS-p!)joVWaPH-dIOPHpm(5<_fh3Kn=UFGr1#~;BpmUS0ydlanj%Jqnx61eW zb)-7V1*iFi&*s86^)?jl`jNwPULVF~7+=csHebfo2XNg6qA#5`pflZt&3YmvDt(aY zTT3h33)~j`soNIMDLL1K+l%>@@W>KN*{VUtE%wpn@}zgHxyKi)vbT0nSwfvI0N;O# zTaolOP=WiB-<7-oA>Jy&TYu!ZQ0A&5-}#=sk*e1Pmu{5>BU8r+Zn|;_b|?nPrMt7W zcHHRVBy#Emq{!57+^RNWiKl|L6sUW2OXA9J-f=SqTaT)2E2__P>By_>8{!YD7Kax+ z-YY7c6e#{-?TJvss8R02D3nkDa7OjG1te3H*+}5a6}d_)9(BsGG(P+aPL9whd(&=A za!WLlPWBp>YAYl~(ZeavMBkIQzK^{IRe%2y2YKr3+rMWRuh0 zc*WNIRBn4O6{2J~kI5L3_ccEt-n<}IHDo1t-_%5kC2`*0mUP7cX0mr>A`uJP2pU?+9yEJ6XHRt%yE8RDIZhHhI803wVtHVir|jl* zTQ(VS47WPg9pn)YI=0$CbRoEankn>xdTb@suZo9)mTqJS+I4tDTvv1A>ea8b^mh}M zmIW{N0mRci(D%3s_?}xn&S|77m8|)^Xb?dS%aQTj^46K8+A^$0+_kURNG*|T-Ee}w zdEf1LN;we+B6qsg1yl0MU1DiMyWIo}@>uMK<#vm6y8h(7_l(&9#V%IDHsBlZgB<2& z_D2v&NbW(@cJq4nY7mP^DnYDvvs;d?5I4|Oq+iv-Emp7=P{A;<=jDqP5Wxn&n5oW1 z1O^*o|MM~Yri6cv_c`H#tk=gdnDd<(kyqqTx_;NLtDGU1(Bd2oL6JK)5@{rBkAJcK z?72hwX$Bji1-m=5wit`*Xd*?MPOLdxymo zdTgA;47Z+ij)FR-WFqBcYvzeqJ$cRcIzBat%P>7*&Dc74K#9lfPR}WRRUxB69*VGB zvrjV`?@H5g=x-yUso>>!qt#*K##1Aoslz3S^4!mwiYaro63HP#cK~WXffml4>zl}i zcoYrSoXQRxOi-@V9>4XzOj`Ps%D$r?A+$37+M>$otuVXYzb#w=aEWffvOG z3rZLl-}Z(Z#qSzY8#mnofjer%$(lEv(#LvYHk+F=-SnsC%%(BLh_&CuO^@X>;vso+ z+wlY0i75g~(7(;Ix6j(2!vl zv-Q?E%fQfI8Gg>?eu}G|`gPNJA>m72&0qq4XhfvH^`W+TPJg3h<(QnrYJLYz{D$*# z0{Td(#g~rd1QZ9b2^MSB<7R@4ywy))&R;FooZ1CBe;VC*RvYPCY4jHSKq-r9bwY08ttDMq6}i>4zjFdbn_t2Cz>^3kU;#a+!Z8z`9jB?8!TOs^C_kbj;xWZ{I($Y5H@pDXGYd*YxY+p&wl)V+9`RwOiV%u)8sNJm^{gSW zx|%I;?N|Dz;2vB}A?=2L7R3$Q4=Q1ROb6Ql_40}Jz0J_YSB~q91X_pDiU({w>@^CY z;Pv%Vt#fVhZ;s{c6Fx6o@?Wonq@qmou88}5t`mX*3G5d9?&z*tmX8T%fF@(|o&7!)#c){>rF_v4$z^n2=pxiTc5 zlKLG8cJ2&iN1xM%oneJ}Cd70YlvGg|a2(FCH~4kBFO#Y~Hi{q%d8rI0R~`FiMYv1V z;CdNHJV85o3cQ^(MLkM&A0_njWMSef&h66q4dSCW-O@oyjvEV5o^?$FhY|Q#PMu#K z>6*b~@^YuK)u(CNgr+&a6Jd~VGPsG{J_eFf3N1H*?0HUL2C6UR_R5=QInlUfon-c6 zx%POGGjY?MjL@EHn+ILsO_1!Sm~_90Rw~@*6-8wckbN zUhV@g1v~1Ap>hs8=2E@`sLv?Z61S^bZNUu8Td72qeWqx%{Ctf;{+{EczeFAMRPFBg z6SSU5r}J-Igy8hPo;}^X^Qa9>)oRTJ&oz|gF4@;w9?R6zCAZVwBhq!;MOA=$;wjNL zhd{&TjwX-L!Q&m5A(zI+gW6s=ejs4un_c7|gd9Aom_X0`cet(f3!JZwx8%>!XyUQ)s~gwIC&l0JyN&b@5!uk!{0EPb9! z_Y>?O!#}$7nhUY4TK;MNDeS!6wYEQS=hPSaJTA=-4+Bj_ih<8Lo%#244`RAB|E`oL zoU%?v%^2;njz?`6fxwE#;v!2%hpf|4%PL3RGg_;v-?Fy}^^0vqFC(jpM~@+%O4bRaY3t3AWd!5sZQy$=?|JtCX#XwKZO?qidYY-UXuzE-hY-qw6lpl+I7D3Fn-xzus%_SG9Tf;-+yz z?Khn=5bKENfHr8sjbeMtu*;Qom%2BZ#f?rkf@7YkrX}yDQ@hQM`~Awioc;T?N^~zA z3ggA&PCiAc#bqYu0hbIEhr;|yN&N`w21^A(7USliJ~+zM{?CvBvn6!^Bv zAXaH|ZO%UK!t2T>yUvnQOJ*&j((_hq26lE=vF6@-V7xD&OnRJ9x_QFrAK8~Q{^4zZ z%tp7FJ?^;GIGhcGYd8DnUxm?>pf$6VZEE;aDZk8_>goDbMN}+l5B_=mVaIMo?E9%r zPP#PYQ@-u$<6=`u*COh92*b`}e^G40(0Av;SwchCsN-@`M8wnykNkfEv*b}Qt}~=T zD5(s6K%uCVDnGAaNUH@37u~GWB;i(Crq{M%q1$B7Kk?bzL)d>Em9hWKV6N~HbWXSU zD2*!xcX5!SoXA}N_G0tI@?#s-kdCtw5?&77N(B`0*z>V&r$l<58dcZl4LMX)<>$?@ zVs}DYZv0`V{fT5X9+f1BSod@lS6v}EmA#yD zq71xr`PQcRyo_AK+mUq{E!F9*(^PPJVgoY!T&($6KyGPk2Gx+RX)k2W)YP@r zf;tR~+X_E_%d*=9nt!x_I8UB=?;UN=8IP70*XMMl<|P3fW$L$t+bXIz_Gw<^k3Y=S zz;#ln>;{3U>br^$fOAxJ$+cARIpuoe@u70k^O9y}d$uV0!Q;Q%w;oA)p}z#8sfqm5 zXZmpTP-&V6bzCpvy|zgVikDSv&UqKDF55=5zDG{m*mlLeFZe?D#)>9G9q7X9dr#7# zCbkTEip7tK(g|{@4A}1xI}?-g(#nGRjame%m79oM} zsMikHmi8g9fg!{nVbe^f!=h67H%xs@w*-`#0-VEqy=*M!QZ%zYLdp0hFm-7qCV?rJ zOt!4R;A{9(=#JOGOStB-Qfo4U@edq>)&$;oT~p5ymxN0eu>Gd^O_M((mo%G(y(5Mr zyJL&-Me!g#=y;IAdoYf|yU-JWGS>DeaA30^e+_Y1P(u* zJodYoH}hntnS+$@l<`tN3ZH*8jNxx9X;H9_^M7u1_LFvQW0x)1EocXV&w(&Es1NX} z!!#{47f6Y_8+)lsYLx-3)g|dMaZ8R91H)&B%~iks&cfEdHbt$Ec>zhhV+&K9luOVT z-yRh2>23a`>7B2UarQ~9DPPd6_Kn-ul}EkMyM&z=Od8hwywGhC=IEvWJ$i=BE?;H3 zsZ3c+WYSgUE%ZkAlF1|a2JWHtR;yt&IEQ@4aNqcxc4AAzc4AxdK)q1bRV7fkB=(`J zJV1K#kt0wcrW{oYlmlXUlMvLkb0F18D)@QTIZlj$6F}u7ZAV!k43x9f`*A8LOXW@Q zqJI`7@!Xj%=KRG{4A*P5dFK({^#{W++TFa1u%hu@5`*eNn94M@dztBg&$kkc)1ZFE z9h@tz{bE=7^shw&v^(Xlc^ritg80QwVQo4UZu4ZwVJ`!MJ3z2&JIC(4#F4VZCoT5U zARzngfb@X0_g7RTCA`}GH-Qj|rOUcaO2ij|7XdoniFYLVYLF2iru0ZgGx#3Po zT^+Q9vSg0tH<@km?|Am^tZG>|PR;XzE%J@vg}0gaD6RkwUZkh|y{d->N;LN0c#V;8 zEJ+AoshA2`9Dw1e;21}u86!>D*VH?MQ4p#S8+qx&pF^eEF2(Y%B3a7QWS5%D8!665 zHIfB&0zJ!4rSRRc(mo9K1V<);B#w;6XxuF|nNRAMw3Vz%C_sz?6>~n~2#7GO*=zHJd5w9VrWMeOt5=wwt9v-ueM9{GXzf%r9i=cPJao<4u)^s-oKauo~DHEy2i?Vgio zVmsF6g{L1XPRty0h7_e++;3(Zg~?kM;+Zdorv6rb(>IoTjLB835PP&^Us;7ZLv39+ z`T#NaRI?O$llXcT!?CCk-?3b zPq3O@bT{Nqe@0@N&TvLj2G6*mh{;W-E1u2($D0aI+GF3%dua9EPFPMZWErP?Rq-kos8AsDC8<)7z+N5#F9gp@csrlQpFe+ z{_gr^Q)EX_aeA2Pe^g;%QT2Z;ks~6!1PIEB`0w^oZ-?8-G*d~z&h}z{YBdqBVO_ww z1Q`DgD#kGEcV!lr!es5YVwR=DknFdoQZ}eq`flSlLx(F=XNJC>D~tFOz`<|{^Em$a zUOH38qlfltVa0kt+y4Af0d#?pBYU{<-CrXujdB_=%J%ELGu>a4o$U`VjVe|r+4kyW zhIa5Fc|7edjn392nd&hDXdZ49_t!<$Nv8UY0ItUqs}a5g^8KA@P1T`+?qpx*yW836 z)6!zrr^k1Hhn-zjmk+?cJcKQEb#?Ro&Hvd|#NUSDac^?AZ2aimFS(R9TEp2D-q8Z? zaYH+m=CMuqkJY;w=13E*O5e8f?}k?2E9Q;rr!c#KcG#t8yKhGevWEjdEAm^jZ;Bqp zkml>^>#7mL<`8FW(-U&1UuP8oQSc^QR~&TZ8&B_2TFxfsmrwxA*k>f65%&kb9&L6= zBQ<9-!nttoTo!aCE2(sv2P8$RLJa^e7>8nkfs1#Vfq)NG| zc+-H^apbaT(l|iup+@)k?eWs!xY8}it4QtMRF0ZHj2*eaZA!p@$$Hap!*Y{yLG$X@Dgv32kIkk~9{rvCo!Cm?0ghN*;>n>p zV6Eskk+}j7iQ)*Feg2y4cU_uCjL`fY*=!}6m$Bk#ngENE1I6OFlK}de1=$>Vi)Y9q zHvl?VMidCwi;sN9bH65uWgls}7MG+sTev?MG(alW>ELAZLK@gIGqQ$Y1_=tcZys1D!z(8x-){ z+|tJq8tM?~=&}*Qr|+T;<+<*h%Cq-jYJca$@X{kYue7q` zatv6*A?Xcf+m}UTD-33a^!H&Sfs!y3J0KE6bz=))cDQ_vOF=X;`5{3%C8j80z9lGu z8WSbTTqqVp67Vhh`f-sD*O%nGu#P}}@-JMsZiIN0zNUxEbU5Pv0`1F}h35r}MfDdK z&XzP70N#IRW+WVjv)B zWO!nxIKX;qBh)Nu>cq@N$3`s_&sh;T7w+VJ@fv&SP}O zJM0`al@wI<9wtzVr?|tGg<5#4l?i}LMT~uhl$;q+g&*6X+KU-K;`~Ip$*;9*o+eE> z%W)ETf)JA(cM={hM+zQ%`%L zjFAQ^tB}?h>=3?aC)65Y=jMrkHaY89?mthttpk&k7F+x+^9)rQr;@oJMt;DlNwde? zr~}~zX2$e0->G6}z>A1!z>DyqT~}Yq^vu64GaL)9sGz@J2?@3F32`dA9dwldqpn^< zV*=T|$6OAc+R1O0ZSHG4gq3}8&+RT=GWOW6I-8x=xNS0FdZ9`^DBi&aagAcTlh%C4y;fL(V z=}uC6GH+xL_)_!j@#(Pb88asX*{|HFwm+nI@3J0{v`#1b(_AAW)5CPb*!pb)AB1d$ zQ%z`NEbHiF((2mAluTT*%v07aO_G+qYAECG&?c`pq%P8`55>>qmlA>co(B`>to5i< z@`o}f+oYu+?KVZfpCSC=YaZ3~8&TtD?7VRgysR%1gz2t?&uoORX|Dl%IW^;FoE}_8 z?Y2_UYm^(p=MR7EFI}+3yBaqa8_+HX(B`~#la}(FsyWkAsE-gHOxhnT+CFypRSh=h zO`-<82I|U5z3gReZG8T(mBED2T`cZ&?G)~zCDxq*i=vbE5wNNvlcWMo!i<}BQN-}7qG>-d zqNIidD>Y#ZM6^%_W6`*WxKRZ#C6Tit3hEDt7PD_^*yd8hYTkkE(VB8Q2fDPyOvo$O zr|^K+Jmw(V0sGL18u@DJyF4!H#IWBIZw8iQD(U!Xa_MMkTIpD{dm2h>AQh!_%o}Xe z!QKJx8mcNl4WdP0Iy2i<$;#%pjg`RSu7Rc%>I7Xq7M5%+&NshtG$3XO(x#z#Ph(7A^Sj>fk#+UKk^k}^eK?bfz22-k69H;029NnW6ISS zw)j`3ZZnLt|0Jx;0Gn$fw5cCgzR!#>tZA@vOGo+)+UhK#!H%9$07EtGbSEP$YOoD6 zEAoM=GO7qmH@FC!^Dk>?RXhzrQ?8gdbmWbC@d*!&jF7xnz4 z&KD?P_clYBc!?5o_tYRGtrUhH@QWTz#lyjh5)$d(O$Lp`4JALei|Kgk_oFh}M$Gqf zf3FciB})0GJHit~eT7M<7#`ZwI;4?9_3?@@0-Dm5!%d)dc}LD>r)9mx;FrFvGCf{) zj})+oEd>rwIK05OjXLBkv7}`UXTlu2oF&=#%SG>6o;|%{I)!vAt7aBY@NQ|mM)M1v zojXisY`m(x#j0j2YUyDJ7G+O|Yv)g~Z$&=)jRkG5N;f7pY&Hltlx$l$`*??V$9Q{r z|E3k;p+~UcZ-i`6ZpfO*@=Iua!|G{&4@ga-f%ku3%4zg`W|tgojj4w zgQ{|(wk(hG9&uBBKi$tHiq1gf?!_s(k(R!Z?*)-7UplxdbQsGY8k;^BF z$0xM5cKN%|@7*NmusMPg8DSu=T_D?a9{P?kH0!!4#nW8wfU3a7U|x{)KK)<%Rr(E^ zYihCf%^KODW<7(3OGVNG_ITO&l!>`Ry@G}Dib2IM&60}g1&$_ODm zgt0{}|G4^+)HJ-oh~HlZ#(&^&u3vdaej^>9&cooxr=@uUrR4@04*UVsj)h{b*#^D> ztX)yLhBO0T2M6DRqZl4#HWL2cfeWLF3UY=97-Pud!>m)ob13lrh9sl4ReYf#$%Y}x zrX2qe2-SQi+()a9AVIja|i$s8FOfuGcNqsg)6zH#eDk@YC{JYODh83kekpjpOH_<0yhOvkq)=t!u~nt5$3GnNWJ4- z;FJvVCp`0A*DC9Zz0ocvDbTguVPaf5+|H-U>x$NB$tzXb&e+9NjhGES&(TDd7Zj8fQ4T}|B%T_rn=GZQujSU$KQXge@Ba4;-Y`ZeL#wM&-k z@h@@d2ii6?kJrmF-J7OgXRMATJLWg|Hz4*}=;(o@=X!;*8^U`+(sRYR35(?o3!(2( zXbuDJb5sUPk{dTd*bQ1E+wium!+9H;0(lSRjKiXr_v9}Mp5~qJopjeuQ%U1j7o%4Z z*Za>_opAWOd+K8?wzZi*rxSN+Zzuj?%HO>7u29)HGMz_8lh6(aFql3eKpxY zrsjMt7>t-d4Vgkpe;7|mB<%RO6jU)MpB?X)FqGa&!xlo$a#c~A3~Bbf_mt~3HnAk5 z;|rsXB;=)(;&>FX$PpA{;by{r#ON_B@3;d&uz`ieEEqjTr)pCN>Nx3J%lPSM+}Swd zRjJPo+-hQL9J>0|Lv^A=+oShUu+M(mdKk)bDz#f{Uueo0DedU&=(s@5!6$2O@~3|! z|BPO7xGUNv92(fstFrcv_B8Y$^^|U50a4$T9d&bxwTiXHeZzWEx6mq>nv*LK| zKW2UuRO)lG|I4Br1G3QzbwjqgERK3UIB{GG3|u#g$=W#O%5ob6R-8Xcuu@Cr);!id zin3C@N4$bHGTM-9cjsgj0Yi2E286kz7HVn5)U}AY%H}6T%lg*x-D84vyIgs@T;?4* z!`@8Q0rkJ(is4Wm8!}u2WZM`HL^2EyyL&TG9y+x5?I?Pat4OAaFuygPLJf`zoe&JA z9xsvC`!M`ge=edrW)uq~cTHzJ7!R4`ol@jhWC`*@F2h6ZU%tnFGU*gILhz6bVHKQ) zFp4%lIr5Vpr{_cegfbnNZwxh~zmgVOydc-a)VB3zUT#F6kJc8B4JaO6_pfQl`*U$# zytw((E9BYfM+(7`G45JqAi!-Ovxy*r7V(BZg1yH>T-<#}ZjLrRhde|-Bz&W?^=7}9 z+d`jAY@V3U{YMLF2RJD&I%UpP$gTAl7G{>KeheFSl3po}u8%d7=GE8)Q*O)~2Vks8 zOD}xxzY-kzAUEY1>PA{&AGwc2ydFg#Wmd!-h0gJQkROvw?;{_@*DwECJYW=cPN;0U zh#q$h(r{`WwnWKQYE5!H)V3bZWZ1NQGpIHFiq!hzrfJVB0UY~0F6%o==bgg35zPJu z1fs0oLTY)kt#Z?m&F0pPCM^}aRu@) z7=}GvpSrP8@8?If#%U{4k;uhwt)BT1Jkus#)^&dy0R=@oi>A)T%A}7Br`oEQiw34y zFHHD5g~k*u;b&#!6Zbu}EywC=m4CZ2Y9Ck3;v$A4PJ z85SHh0e%Z)FjYTIjiq;(r*QX{=(1jNapyWCUGn3O9ANI6?{sDep4T)UgzwnSZCZc(tu2hw++o+*O5#X8yV>3O1|}b+ezrGlKOOLoKlUhy)a;CrXPzdnb%hso#N??j zFsII5;cFV_W^yk-oH4dge#>IC#HsqAHO|<51oA!smhoio)8{s?FgSOIH(W#OuB_q= ztUOD~vqIck)Gx--UJBJ+PN=NJ@s12rij$61UwGCkp_?xB(VUV8hZ`RW2j(6_IVKqs zcX1eA1NgBctY0Ol@shCaMqop!J8ngx%yer>Om{b^%%odCLwS#+{Yl@_!Y7P4JAfygy1f z4N%`qh;tv*!&{`;P8i9Prc;v$WW4b%4SwaWBQr+$MPT&8ea&+sgKRIuWnSSRV-^SG zAEwh?kBeK@*98wTE@VRH5Guogu97nV{oLYu>0P^tgx&aO8J<~gY*cz;jSCTa`%02r z)^rC5`2@9(WI0N6*{!u-_1bfWrV+u4ItUpaA)iF(;s6095B&t(1VXRugh41C3>A|JuUtvn!QQO)DL@MKeWJ1KT;pR=!aH7A;}- z!3-;(JuCN9-ebZqOxWjTTJ>4>=Dl5&+2w|8-l{@6yCj5K_1N~)ghRrX{+7oXkJ~Hb zFJRc`0sloS;_THOwCjoNtkLedWwrK5vCqM@+E)85cJQOs@`7E?(RnI0h<875^G-J^ zUp}664PQyUXcbxKy((~cg#Heq-SWCl zKDWEg{e48WL`R5D5S<}9cjwCfNopW!`a7-(UtAM@{Cf#=(3U0$V*8k{da2vcj&6$o z?R?^zcs^nGJ_}J7Io~9|ult?re|^1(`YOM+=i6QON%pCBx7`bxVV`B6V=uLr*%#X@ z>?`eS?Cb57_RaQf_G}T!g?HBEr?alUE4x=N3qkH~hyc?NWj zS_8Ev=QZa|m*TR3y12U2f11#{!(Uub2Tr>dL2Na`+;`Yc=C=HIL2b*-cgZQfZW|Gh;S zV5_Be#CF1V#&(Wc1Mr-!iP|;WO}k>Z*t>{ktF?Ex_p;{Q|W}?+vsAQZY`pD z2v}cG`dDXKOO!P0TfQYVDQ=M2*`urhrfS!ziCi6p0SD+*Oumsj> zV2$VEakUb1fjPj5(9vLXJ8Y6SjL+~JjRVbY!k5jI-Nrch(ZEyYS%jsmV=w|=fj;_a zR2WTOXue|h5N?Fc2U%h`$-Lnz?kb}dG+dApLQ^*EqySU#tPWfT z?5WfxY zl~@HV2lBH$p}7xtw?J|Vl2S<4iFs$9a67OHSPpCgvVH+H=iwiqy-jQV4(#TS`ZcI zaQ7S}=cJ^X(1fu(Y~F{MISh;drvr~NA``rCNg!_Tjh|Eni#{f2yi-ZKd=$V zHqYSMGw{X{SUUp#74WZ1Wbf6YpU-q+Yh4A3NCUr7p!r?QYy|VjcdvrKWcen0SRnUG zfrQSqj46;G!OR|kWGix{KQIkdXb9@tf6JB(!j~Zb1hwcI_~pEU82*f!)>YI))--fB z`v|{+YE}m932$tMP8M?E1MtrPD`gF&^~C`D#!ifuqdfbTpRhN~sHLi#ePY?cyd{fy zQv+hV5^<7^=sk?5c9^&Fv+8E_ith$RJ-2Y>9KcAqc^o-)9C^gq@d)^3xcg^0f5sB@ z$BSow1^r*a&!{lw2KEml)oMmDUjr?)J{sfD?+Sh&^h;&+s6rhm=hXo@=!N_h;Df+N z@RpOn+nw@xHal&?d-?9uJj;~1%qL4^n@`A^yq5T0h{>anqybM`9^&~$y?q_={2c1` zHm;)PV~EKktZB|b>?N^;=8j`Hf0^sK;jqYJIxEwPfO$E_9;P}_jToy&RtnsYe5nTR z#|px=I)$Glf4+yO79fKbAP)I0G47SAfbW_LL{(8~uVUzf93P9Pc37^XKCpfc_m(1= zB^Nl;DZ)SCl?6S|mi1==H2EzXfXje;Esrv9`6)7YJg+jy+%vdaBT-~1fAfu?hCg6UOhIoygZypyybt&^jO85fl#CNpwqK`O2^)C#Xza~M z^R)m~g=cLw#<-Sq%`^n-;A4!YG?gUA-^22&(7X!E{{j9#z>kCd!|ZuNwroS6!;H!n z@E3v4nL8`IuVDL6VWu)+f1ysSzr2s4eZupoejMS8v3t3w1~Cebx3A;wYV`al-n9$X zQh225AK4pb_(Z*q`Hl1XZtB6-Odl|>J_SAx<88tyuA^35M<%AApQ!f68t$QK7{-2| z>@D{s9ekEbdso9jjQY1K?FJ2F(6>W)7SV1Tq0ZnO$5WGd4{V%dfBGxo3iWBSJPPx; zP1QI)jjs}a9M(RO$ktwmohM*3TU7}^W~8X=qwubbJYebsKfHmbW&tY@0}U#BZ!;`p z0DlfUF7Ppo{WbV`EXEkbQ=b6O00ZnX+GX)57V@r@`1?32um*)-tqA>`1UnY3PLD)G6I|pIs zPtf;5-^&tX1d@@ExWulNd8L_qLiho27v$;SS--2;+2Sp`1Y#dm06PWztnpd!&kCOH z5blCJ9oPqwRKySV8?gB?tX%_E0^b5|Qh5a&2b<$ya~y1re}m0&usIH18poDRnXGBb zga`J*!d~$2fPaTaL0(;p{xkkYjF)-p+gjLJi>I!_0!wnx&+8Ivky+e_iRQOn!{yg^fy>SZ22mT(`dc%G*@C0xZo}B{B!?Qae{{(ng zr6{$e^SCTke~fC7b<{fZPRew=%QDN%>r^3p6@dr-27N1g)l!AL9)jK;MVx#LtdQrF zlbD?Yh{=b zKHfDNyMouT0_L&DOdn$fDMxMGhgIVM?@vtYup?cHHE2Edhw~tL8M~S$*x3y{4*UT4 zA?%z7)&XZ@ZTb-F><&ir@4%M=ccQvBV-5NdfA8Pa0ocWTDEaNcDquOViSP2s%X|_3 zFMwtj;FFerArvPvoDfYrB~}5;fo$PzXwJb?@34fBB@#9ntc&<>1XXE+P{ z&pez-v4d6nBYxh+yP#<*=US>lLdc_NfaOOdZU$KCi1VqMjIqB6e!Il&z$#!l?((=^WM8SfnD5lb@(bV;wvVS&iR>So5loxd52n%B z_05y`8ZZK!4n!>R&dt&p^Zq?(=5cK_KVm*e{HNyM5&i=56A~l9>A?NK$2s0`_W&dZ zAo(%xbxptK3^n`!d+ENwZvtmyZ<&U3f6$ZIyJlfmyc7{N8xgyd_kqSdSpE(87jb&s zhQ56S`A2L=wWI%MS)x89@ikxsI339O^(gmB{TiQPEpLdJ=Zr9(hqe2G>##$Zk334o z{$VEKe+}+_DDgF51UMbIA3Eeu^e0n8sa8%T(^U*hsSOxq}^n54o ziYht^c)vNBP~rJ9_qIGk{Cbv~A4Vj91bk7}Qm#BTsHMxGvl#ksBIEvwJh~qhH3t=V zHTZYA0#jVkQ|3LGmjkeg)2nGYe=LV!Z2OC*BSSADgWf@QJORY%*z^`Gya8*9`Z7IL13SOvzNz?5rQ$?PbHQtv;C3$n#PBeLLotZ6Gw z-0QK%tzv!Szw!B+s@!yV_&WN`b?HeyYg@V^>zk0>yBW!ohf!x9e@9Ok>u~pe?2GQ_ zoe$N+&yWkRp1C!` zWJ$tP*RezRHJ``Le?gT_7V1*e*f5?Aen!$AK`?192ucP z@>4#Qs{_!_??V4F-iThA%fQd$v$?4lywC~3!f@dCc)vvZM$XEeYENDl(8Es<=i)T| zEkwdNjQw#_4UKCm+p$D}a~aij>RYIsoDtt<-aN-V2fbo{e@=pq_+*R_?&Lu3H%p6N0|OMkKNJ(91EDN!S;o8wLD6pFOGn7zJz&fXx9IX%j};#J*CWW6PFY z^D*ELe>sX^VT(ZcrwDvL{4m<$fUg+GrgkK(-!WYC{r;VP^-c(vkQ zQRQKLRegkTn!1qWb5K!nUZ(Rk-~BN#6_QbE8SxR7`!)~~)LXR==Hjow|70}PGMeic z)q%hT{H%Ep-ttx0EC7xGZh*CN;VW496qo@If4>L}amDL&kUfy(f$(ubJu zWWlQUJl{1x3J=#pGZ(zhe5ZqKEy=|@6LSmBgHK{yA~td`%ek1BHQWy6v*z_YphI%w zGq?GR=s@7hz&LO;@D#9=(O_g$u0fIwe^eMvUhuB~Hv%7&Jpa|;B%Zwr$ui*6c2s3CUZKj01lgPi2C? z0Ne|F2Y3mZ4)8a?TfnyfdjZe2Wb)1s{eiynUo0^R&!hrVSYp7a4bK7Jhx`oqe;VKs z=m_sU)AB8{Figw^^TyG@wZL^^7Qkl%72qqtjV-)8-6Qw9kRvLLofs{MG|Oy8btf!*#vZVQm^asAt~UzL+0-1lB<))wE?lnC11bQeU{2E3C{~Jz=8No6oY< z>?`#+JSOrt8GI@{vlse%TgLELDe!UFiGhEO(S$5E6(9m{z;DZN7qe;T1NkNPq2U(# zY=QSuFrp-QsfCf^O7J{JfB4Gq6QGF0=Ow1$*|o64`tQT$G2DF<2!ASVv{q{KOr&veUquPAHzEYn8p9gsp>|6(rN@%ZB;_fc+1;A%pnz@INe+-)yz_);#Wd4eG zapWIF6-aE`DVT*LO_U!VP8}X5D^hk5ET$vA}X>etAGI!!XhFdvPMJ{RAdJMk&a0AELj!SzX~7_|8r=}B1oW$q;Nj0qZYbKXFIHCk!FOyuDtWReBI z){x9Z9`?`|f1QdA@@hO{+hm3s;M9QkY9Omz1wR5mEDzA+UWR170F8z@C|wX>Jl36L z_%I%Jn!FT`(v83`QMWPn7&EYkUlcoyMMGa`NiTT2f5yC>QVs9qWMgl+ym`yf+G0@5 z#q-}axc9^km37QEZ|1DT9T}dsh&mzH%yc}#*=%U>9q4p>7w%Q@%*$M#Q*%+qjEmWk z;0ktU)4KhkxyCTGIB#Dv(P)sit!k)HZq15gUl~nM6yBd&ikQFOVT=nRtdir zINJ=`XASCJ7@WaxnqELp9kZ(-(tJHAZD!CJ3=P+S`+=#z&)MwfR4^!(vAMgCH~018 z8aVl#=CISeMdld}Z8J3OGpOYaz0SxxHJ~RRf3*_WyuVk5$D7gT8L(}>+0#a?&wki0nYy4C5u(_LZTngRqB%WzfkmU%de>gfJXy z1xn2u$W^Svcw^SQ)z(;~YP{3zx`<`sEt7S{aAUccW#+Y^#V|2U;{aivZVMxCy$wt< zf5t!Y z@T@^T30z>%@xaeAC~V-H;FN<*D}$k(kgNb~fYK76+k$Qe$>ZRFZ>JiR#Xy%u>9@cP zaL@|>0J;O{LBPh~3ie`g2qG&mnZTYJ>12FVTJ7YDr%^kn$tYtVgwQ-S4C zYr52{Pv{nZbPR2u1?Ku=WN60&Ckyn0{uqJtjz3a{=2pPA!0yo2+8-~}lK!ZHhEGBl z{85Aa0^o6!mM|!bf%7eFy9<(|fL(n5p!J7f;Y!~phNIU+L;D_spY0jIe;Q~J-nK5G z6rL2zpaD_mj02`Yej0Ea@Npn|ZTpcn8FmhUd}(Na&m9FD5I>>}VlNuP8iWoeY^rpvHhS2FSmQQp^#1J8G3eTktK9^XDCWxD$2Z zTRRn47J9ybOak=7pQ0A(e=Y(av&`{hwG-O%XJRow_Mm4IXh@2YsC5Q1V}X8zz7*WB{Cj3l=tRgN#9(C;$;K#r@;QP4|G;aZCE$IDd9dX5&J0cym5Ot0} zoBSRvhfEmqlfd!EeFgYQz&IdmX5`G!25gkTmtzF#LOVXkDssR0+EXx%p-ms96xiOM_qqR zG470!3L%!b1rT$M#{dz%a_d9Y7BPHU?)fu&+T2){2@aT@U&o>h9t8akO1pz@4ZZ}TFQE&-yHGj`*ai3yYOO@OMPZ?DIr?kQ0Mx;cR{}H3o(b#?d=fH#i$4MVFd=wWUkGggW@MGW{@cpa;nzw+n z7W96!j!0lcxJXAW#EIj_yx*hckO@P65;*?It^hv?7zc#SjBFDc0iC{87 z=v%NnG!V63fqW)t%pJQwa2NO(Q-=SYmf&M{f7^%zflO$31TKLLqT2Q|$$8NJNMSS? z{tqESxCIa~&trgyJ-He2kFj=;&mF{S2tJhPQ3$0r zM{7=9+;?|0yA3=8I|=nrI>r1pmgCL)X*?c#DZ+5XDey-dzInld%&#pBr=>w>n?buG zfA|@w+a0AR4TgGv?g*?4ZRdSSwA(D$%_v1?kHXv=P620Vu;Wn?zpXR7DD|;_l8OD0 zSnQ3=2Y;riE4G5u5vA{e7SM1W*c&(pefJECLGVCRvqK`%uxpVBI*}Kfx<-a_v0qUj z*gw%ohm4F<8G4dXs}6QZsvC|~z@DV}e}#g*k@?sInUDPtjXCe+ntiIqxtmSy1>MZt z+lsA*wjKuE9Hn(YF9*E~lKnwPfv%3y?@{YCIQe~T;2h2|clvigCO>K=0NbK;hmR0j!(AI9>29)+SbWT$4RUHXs!1rpp^moJTL+B1ewvm3cw*K?F}2ofo=r8hLv)N_Uu2-FGuO9yBL`Ul=;yg8jGTW@VT0#gm@t0{vA!6^!vf8(I@8{~&z zRU$?$4Q=&>=8mxNpuvz0-Ykmr?pQID4S&ZEzldL^V>{2TIBX2ArGv8_f`dM89kLTQic3Xg<9uPYZWAO5bX(&T!hGsHFT&1z|f8cYl@NAIrieRlVt!xbD?08-JsXv#EHk~csgH@GL%g?Ju^APM3 zpQrYStM+D1&uyaVrx10gA%i@?{yZ9mx(&q-i2S7(P1DDfer|;1K=7Nw^WzNaytEX# z!ekYHMCJgaP#TY3*G7N$14je1pt%ml>p@@%VEsVGWVr#se>j@VHrC`!9S=(}n?6ER zWZ_9}7GgCE@tlRRF!VL}ZBVd^6#>WedIEY{!(YXabIxOQmKl_YB8gRoPeQUi5NjM= zG;ye}fqy{`Oh*nh8Kx=htd1y6Kn!n1R3jH@$r+F|@}Gd849U8n9|M0TEZ+foKKPI1 zYzKD7>`OP-f8?f>obkDbFsrqDcwS%7SPRPsqc8E0Ov=GE59$`B zVp?ZhFtVD?USKp6;X7|+o8RdKJBsJDUT)}|!J)UzS8n7*qd#=i zpu7NjuhB10g1!#gmuUj50?9VO_U5}c#R}Ya|mu zCxEUTS_l3$(6>X6&o2W@o&sGS^fS=2(_oYYjW78`MWM6>I3uC$8}khuXt)O&DuJ#9 zx{CR|yq5nFbRl3t)Or{;SBA}PG0KzC(<>;2e{G@J;5-Xl1I$3_%^L5LpMd@pI#+-m z1(`2^W5HhpdK>7=#zONI4sET8!zy?#&)K=4;WzUnJ*QIkDPvDI#=<;#*PL`yn!Vh3 z(&yw11jYkV3mPhAuZAS*W~0~HlR+Pa&hJ6*0DT^%h^Xw{;GBRS^9Bx4*cuUanz-G| ze?5{Z_W2$iUZ4TVZBn|?=cMoao=B=4Px{UxHMMO&)`5OKZ6jq6hVq(+a&Q`@FV zkHyn?Xt^2R482X~<}zAiC8|LW(WCS@HK*r@sRA{n0W^dQo7p55PhvF1R<+R=^RE=uV!&H|VQ44CL?Y@Jaq=7V)o~N$VlU}A#e}M%z zkxM1$7AmhbB+>))2-Ty;)RNkgLwC|sG>C>#C+bEi)X#j&v|Z(%?f5BRYhXuUH(+nz zfOc(?Q+OC~3~&N)CU7C}>vnB=cHmXOb->NQ?Z7?2gYDXN?as%683t_ui~$w{-T|!M zKDqPr_9MUsz@+xwUhHZ&1GWaXe+PB}b_ezb_V3uEO*?xqa1`)8;56V|;3D7(t+*&z=dDLN$POfDM36 zfh~dUHC7HK15<$gfkS|!fa5e)2~7gd1kML80xkot)|eRD2;2tT1>6rj3OwDjSKFSU zi@>YEEQ3-2qkyVsukJl%e=IN#7!NE1yaQM{MSD_K1J(rA0oDgL20jHeSK~tGp4fll z$aBj8N<<8R8rJ`+nJ3spSEhTR^sKA5Y-zl=BiWxVz8Fy=2~JS=4#tv{gY!5?|*e;*?2m8uXG{wJxM zK?%J+mH4NQC8^Xubu3L~{)wZdSJHos|JWy%Ucvt{=KD)nNndTG=v99l&7?)NnzqwX z%CKxJ)+%KsT6L_ZR(mVO8e)yJW?GA^)z)_FsFfjXQA{)t{Y0vmAm)lCVuRQtPK!(q za~xOT>Rg|ja~JN%f2lly=ju6V+KTdHmK)|dZ=2_QRG#zEe>k`El!x>*-$l~;!+ALI z#&d7RjrG;l8}-LFzwx{v-Kf7{Y@YKndF1QnId7TgJWqcL?z!>2P`Nzkjq{xMz0v-n z({3!kb=i&QrSHgdUhxm-dj6G8$WuNT=R)U){C*G1HujI@fBc@?I_3)LTvaCEZVirm zg5%NPc=6AqDunCEzs8?%U!fCl4Ye^=_ITx z))it^OVuJ!yhZ!4I<;FCp@af|_G~L8Od59MLr^>hnVSZlniIqBJ^4nO3Z} zAxc{n>op(+G|XF`MC z6(JF#_k<@rdSBcmZldv`kSIhSh+D)hG(nUUeB#|H*(`1n%deI8eNA#hU zI{Wvd@5HNO0Id>3#1L97hKu2}MvN2VC{4UC-lw%0niHo_C(N5}nRYXX|dKr_hyAYS@$@7oIX}H zf9I#r2*TS13K8duCbP<;$10$nErV=WOqf~KKob#!Y zswBs#(yBDyq{^zYoL`k!<+*^mUER*H>P~eh7gTqtySR|5q$=^vDp4hJVO3RCX4ux~k5%s2ZvU7gaS?O}pS-s4+tAT1D-=SVpukoE~ zs2a)@)d)3$?^3BMl@rvP>P@bs-coOIW%Z7FhpVV@Y8)r3_tblQw;Hd;b5%7#e@)NE8j*H&MsFZdz#rTUWVsKshAKdin{-|!=9sand9sugMl*Hz!C@3@}&UVYE?)f%;i zA5&}9T5h1$tM&Z2`a%7`4b>*Ke~BBZEouulRzIpAxrzEo{lrP?XZ15bp?0dB+*IvW zyZK4ASMBAe)B$yXpH}D8Ic}yds*C)LN>}OJTxF;XZlSKKU%90Y-Zsczgv@1GnO3IG zV!2kX&K{1?_W_t^4(3@1^Gu335l2y?geXDLqMRs4VXmvQo9nc7+LGtAe|Oqb#OdgC zB;|B+I#E8Shtq>%oD?U8ZgP4%y(zznSMgLpl~5)0951CxQ9)Hkm7zkaoGM2*s|uB;-PJIV7J&9#9YH zY-RFqN#x&B>QVJ5l~%1(e=91Z+NpL_R&`JvsGNFUJx}FTvPz~3s+;OYx2x`|JKdpD zR0`dxdaK@4QT0`Q=`J-u4WI-yNDZP&YKR&_mDO-HoT{jiY9uA9QEC+3twyWSR8_sL z-lluhST&Zasdv@8bgz0}y-(HE2kHa5Pfb)4b-tdgCe!_Ds+vkQf7Ns~ogPphst@Tw zHA~H+TIwV95!F^7tB>g+HBZf>I%+sjsM>`dWQW z_00pEc=w&uCwgZe`<$bGn%Pgdd+x7?a^ySbG2XXrxy4|d`opfU7%L#lDb5#)n#>= zo>f=W73_QY_g5ArBG;DJvE^8;tX7)c!RkPkz1Ut%B9tAwA=zci% zj(!ElKGCo0V~VB*;FuCU5XWB8gK+E}{ThyaqF>j?URrJljw#VYaqJa649DKl!*T2r zJyIWgYq?Y$e^a90z_C~KC>(o7zlmd?=(qH-kCq#QV@mYfIQEKu2glygV{z;g-JgUm z9jvie^azc;qepA(^DlVhUG%(X^m~D4-VZ!8KJd&3foCQJo|zbUWK!Uf$$>|v1|FFf zcw~Cukr{zUJ`6lEEAYtdz#|_89+?w(sdp9dcKBJjwfz$0G<9$6fCYi> z*&KLee@ozzt${~=3_S8v;F0ZtM}7`GvLo=w&cGwP1CQ(pJhC^4m3@I{ehECYKk&?f zz%vH}&m0OoawPD`(ZD0e0*@RIJaQuN$VPZ%8$7ZLk#hK7^vJ2eBc}t8oC!Q~Ht@)~ zz#|s|k6a8qaw+ggdf<`Efk&f7b$!{1$lRdf<_)z$4j#M{(BX?t$A&$a!G5a<<-Y#yJuuIyd?9z4_yR7M%w&)6W z*Zu32qQTz8?WRoE@%OGRPX3!jxj^C$f3r8m$-0E>SlfI7tejnr+&|Rw+l{pg+J)?! z?ZS2uJI;LjPRsshyMjtlK0Ci%z;^7AE$t{f+78>U?b#7q+4<}k+w6DQx^Dxuk*1EY z@3(7`XVCZfFcFTAc&(az{e=@&o z=6O6%`+FhlJgPnSy>9O?pZS~iSz2nIE?vS)c^NO~75pu)E3G3{vE!?EFn|>JW6)E;lwf;#z;IqSl&rH3)7+t7mqCwYlx`{>fIt`(r zG>nGR2pXy9^&2z_e_iw~8bfdEe_1}3#?ia<9=%WF=>t9IC(xh(q}q5d_jxoOZtiy)7SKk&J{~(87-$3^ewHV?{wz) zo>tQuN~5*3j@Iiu@&j$8O|+S|&{q0UXO*95JN-;MXeaHW-8#qYrG4}Zf9wwWy+u{bd`RkYxEms(sjzBY|5cr9mbYu zB9g=tqN#XNJSCnM&BQaJxo9C;idLevcvd_o+K9HIooFvQh>qfU(Mfa`UBn9_S#%ZM z#EYW4cu7nXyTop>N9+~*f5b0hzc?TcibLYCI3kXUW8%0tAx?@@;9lv{Eu zevaF4SAL0y@K7Gc!+9)!z?1k>{*1riMf^2?!<%^vZ{;6(8~?=HfB9$L!8>^u@8&(c zm-q26yq^#7K|W;PXV)-)x7FTm|7`EDciOw`-S!@Puf5Oy#olipun*dY?8EjE`>1`) zK5n0|Pui#K)AkwrtbNWtZ(p!4+L!Ef`?8&3U$L*+zuMRA-|S5Lx}9Zb+c|cw6LIp( zTC%o$NY;@L%SYs+f3mKuC+o|{WCQuQY$zMa#&&cMog={HX z$=32&`J8Mc+sbzOUkCl~dHt`m>>^)~$+D~LCSR1@?u=ZFWFo6k$vUMvY-Cf zU%n~_$boW@d`%9Pugf8Fs2nDT%Mo&qz@~}K2kIG~6xI7_G%2V>RJR{G_bMm~rATP>GGF@JizsXE_ zU1rH_nIm(fD9Vzv@)1ga?KPg0WoU+#EO8BhT`L$DZvuUdTJ*9rccR$GsEYN$-?*+B@T& z_0D-Q1d=rM*~9f8p-jo%ZV$?=?EW@9;ZxgvaxEI*OJ37}l-hShr4K zf89EXb?X#=#f#}QR*19qy>@krumdlguoJctoERs@s)RlE%ArG{;KLQYu3=ex^DhYu9^8|d)ZNTlCS6$$gG?X>ov0hRno4ng6od!fBLH98GXeu1=k!?^%X~^j@qYmq&{on^7pk7PFV-vQ74mNO3VTJoIPVs(sCTPZ%)8Bt_lkQZypmoiue4XjE9;f>%6k?5 zbhRD&=j*MCR$=A-rB!$S->Ff9`dEaS!~y z9;-s?W~|BQ{*SA2_TR6|s<0}e;{Hpk^9^gWm;Jx6Iybb0RZ!o`##!Yk)@p1urIL8& z{vYjq2UrwY*7iNsT}@Nn6gfx|1VwT+83iLjQ89oZh=B|$5=0ckD3}AIqhdfr!0ebY z$5F?eb54kgIR`}HJ9SMsf9ved?*H$%&-Xm*eZ1#ZbyHm@-1oev>ULLS=n3(}9ugsu zxI!`{6F2A!Da0L8VF>YpVUSP!paABPp0EKEM_(dM)K+1^Eu2+2GO3@_(c+>M2F0m=t=a*Vu^vojx3Qle@L9kc8N;jM}DIj z|18b;=V}B(1%fVT;Lbe{7$~MaOgP-i6>?CxRotK@5p0Z1_E6_`JO?CrfkQ;o2 zcv&rSgIqNawWhFHf6Z5|Iqa0%%I#pc+(GUPd*v#*3J%CUmrXs60R(0LSEQncXGUn`X%sMfKdo=UYIGI7u?KsM8YghVbms+Lc+5Zu#N^Tr+7T(thS_wL%|Q~)8nY&>DQm`> zv-MdE){hkpc3xG19%9Jq!OuA@<#Gj@=j7Ec`vD!e2{#U)JSUo zU-n5+6)8inG)U>U6}0KKA0uoMVv0?Qma{=k9f-Itf6W=29Ie^}d7=+Cjx@ujAb!N3 zC`mhPJPF69Ng_xj^246kbVwXFU6O=Nj|?E0M4x1nA;gf3z*Y}uCqs-u6SRm4&QW7x z2IgQ+%<1Zw`Z!-Z5euBJk;IbT)onm$sulEue#DxtmuUzCA&WGE;V>NM^aPkdY+({i zCU!6tf2I-#oWTXe5ohoQ;sn3JZsH94;Q&#=Q8-Fm>GdWzI`cdzrw*c5oqE!%PQAZg z3;X@^wJ=Atlo_L9RLB@T7!UEgVT>O##vmpL8Dkfw3o^!VCY-Ryd*X=<8BbqijN`e9 zM9xj-rV<6Wm|H@$xMkc5qQjl%E)WCm5_gpte{nas+sLJdDSjfBm_0@lYcVqrTg(h4 z#9qX4;*2#|Eys);qN4ycs?~^8o=MPC!#PrALBXRv# zQzq)GE{8ws;)J@Gf2WH#sfXD-%(pwoISTcVESCImS_qoJAd>3!V4m>mEX{WipTiExzt! zAQT*MOYiIZa0dLq7Cwv*+CsF5l=_&Ze|C{kyQopS$f;e_k@xl>9JP*udR@J}1yoes z7dI@TAX3r-BBi9jbkKq*D&37pDj*0-NL)#!MUj#akW!=@1OW*Jq&uZsLb|?-f1hCH zS?gQxTJL&i)|xrXv&@u8+@VudCUz1p6-;=Y!_c9VaFk8t)%<^Tt~f5I)m?!sXm*;K1~ z@JpME?9k54lR>2lk3~6L*Upe!ZU*NrOZsF}51jjXjvr@Be73$;J|u?rzo)&sH)fy% zm;=JBx1VrTPb-=)s|Fs@nbcNxredz~P!QCzlhm^F*0P6>y$Bq8!BoqRt!01gFMXkw z{d6t+;nGM!nDsG@lwnxUuaLon8-eq-7{FZ*eUrnKh#R*_FmF1gv|D> zmwDfbh0mv>CHc>I3OYGJTZ!A*NK0-D1_ICGjfmXuL$CPKWmBMP6t-9>YHsE?tLIB! z7WL3vzF1{g$HT}{_Z(`T!6=fSN!**T5!6N>taknG28}7@a!M{YA|aOnk(`U(Qeq^p zP^*)K^BE^#Uq8gGU1OvaNS8Yy!S{;&={NUCWtph6Ea_M7kjwB6H83fc_qUFEW^Lrb%1hh0RoGbeWV)7easrFjD(hHfj$Ll*K36N#@_~hbJ7BTSTHCTmX=h)qujWow)8?* zsYLa`&B+_ignX708fx9&KFatpq2J|VX_XI~Q{(tk;`kHd_><#wCEW^N>{wB)kKLUs zx!h@gJAFFb@8HF}a=^T50JBm6vq}KKtQ^pjM2}9PM<>vulj(^$x-LCZFY>;7Iswjt zsLir?UOB-m*VBpS5{wLxF!Vb~$Ykk@xE}bWg+AoudPVTdFS67*3@avFL3I5Ajt!Ee zRQ^xJyAhJ1&l9#drVyMkf>J5WHA(atuS=QCX7LS*Jw8z$O^QuUT!t!a+FaT|JuoV< zigXnin-|S|{-%Y_{<0o#(No>$T4iqrY8EHmr#Bw%mJkkJJrHPFrZ)JNS01Q2KB-5y z8TVmI+?KV3DO1BEJ9SG2Di76%N{41erbi}6evC}&P3wKvo6(!t`@T1&H?udPH@!Hc z_al*`i#=Ojwg`#tdR+&OEN$CK|}+>qzV| zD7b71-VQO?s=$i8?X~qwYmS}VqTHf}fou(S-@6|@_ojp$pY{6Fk>*CNM3%j|(_G<^ zUw40(`d$d#CSAJ+c!T=rGLiPdA-}1m?+8c7gc1?&sU@Z8va*S$~^%e_QnZ zC0XR=+i1s>=w~Xy)CcLS#N0mh*pYIMoR1o zc%R^O31qrNL7GHCy2Rr&iO1;@>uD0}=@R7NWdZ3DL1_~6$^cW+2$|nkU^-7T+ch?C zI@HEJE@vzz_2Dgxn3F-OzIEvnYa@Kx&BB1Ccg6(&S=XppTI|e~x1mk#vKmRDR}R%` ztL>c#yW;zvqKrRBLNo$Dz7t?>tjqJWf{8q3X`mPraOSUIx2YLe-6-e$+4R8)J?ynP z_GVe!6<%?A#D8;qU|DP%1BiPlj;U^`iN~@wP>$toQ@K(|__DSrPONS5?jhWXBwocg zGc5bKQW-Wytdefm?y0zAD?JTsvnCt2$oIJ1Nh^a!zW$urT;1Iw++#mD0|ZJ`#gDZt zPj8X#T|PJqcmYikq6@+hp!Kw^+<^8vnVG<@&esr?~=7h?_|Q?c6m94 z5Pqhgw;;-M6Aw18zH*_3Xk~UtM#~wRO%Uf_d4jYh$H4h&yvGXD@aUF+T3d{E&^V=% z*SOAg*OMeQvd}55>%PXw>w8^lr@hwENmt{i6Kd}SHP1kvV7kr8Y^`|2;|bT^lLX5% z-oAjolWk|5QOgYgcY+IQb6AX@8N1Y7tfvShq>8r~dv45q-IcmU&rC3wG)n41i}BQt zVp(cgpte9DRMt~Vf5mZ3t1|*=wqI+AG9mQywywDzP}$MUHC`ODrFN&O%ga_&Yp<5a zflP#`-neh%`Ih(i5N4S3hDkVFO9r-jea?*}ZBz9|N@^UCm=pN4&W=3e3DUi*H)vdp zY1g)#HHvR}ssVnffy?rq&$G0QuNJ7CUo7TxjJ{u756qU(6eq*HPE4{XO*6lf#GX<5 z^HH*Lli)Z0Zw%Xz3OC`QA^3LfDU9l^+$r29@Za$NGZerT=>LRs#h!RWk0B{k{HaRF z(&f4`Z@qDA*yFMs>$-}r6UY=ykJITToo^@7Xgx~<3#KmzLT`IpFq#Vy@=iQ~u?bL6 z36oL)k2fO2!MlGa7umbY-k_EydZBiz&FQ7zVeNoO^QlH*;#YIdg;}9<;Zr8R=0!Rs zR==$oOuiKGt1a0nk;;6O^@4x9K&$#h%}nVSZ=q27g6$)>sn(QV-UFmehAs43qFGme zAuj7D!}L=upWo7KrAJSc>N)*-`flRDFDiXsT?aTRw4~OdK2OaW@v>h+!BjBP-vy(; zPw_Q}F`ZC_1}31BYW6PK?3y{(xS`hB_1d1xrPoIcDCHIW9Lc^0D%{MQ=`2mY^B^t3 zPW^`j0|Ole$HNYN+wD@`iLia$?{d;g&$IX+C9?=S%q8YhF}e36evSxZ1$f14s)fFc zR7+d}if>x7e{OD5UtYESwMMzDf~3t5zh|-|9V9gd&wXh;?xSa+)KfhsooYvwY%5Ve zaq>k0!^oS41!94Zk!{A2Q$y?lsbW#*?-yp@|MeM~7ktq#+Ih8Fvi|n!+)`>h1~vGz zZ(%)4g7MiP$w*(3UC)oG!LFy%p;OI~9rF)RJ3!PI@}XJyzCJo);bCf!iFU zaHYa94^mZ97GC;`BQu+Ck^?~rKkIZHM0I!8bBNl~XME0cshiX69e-JH5o#%sRad-#kQpJ8mc7&c zGVEPuiLMpvB_UnMrNY(K^fhUwClm?@bq&LuAVl1x=`;(y(qdd*ay6Q5b=sejP^?TQ zKbF?D_69KgRB-Vkg*vKlytvHj0Ym+pC1AI3fkNoRFM*X67bDX<-vvUJ^RZDQ$CcgQYszoCkxWXqy2Sn=*&Ba_+<1RmEQkmy+urI}ga&Jv___Y<}<{uS`*VO{Ze( z$LM}+0CKBS)6Gri{3gm)i)$X%qUJcaqE@$8)moj4{%N-EP6f=V?LU-vpmgo#vjG~$ zzcSAIYKX|`9p1iUQKGu4?4>k*#yjW68DsPL&%I2GU4!pl$xj<5LCU8>AmRHq1f={` zs~zvqnY&N)%4KBj?gFB7Xf_%(!3TnZnVFfx94|^p9vGs1Vw4Y=B{#MgUrIRdN}Njh z)}@?G&-9ata^O1!OU~-onhd%i>1Z@i(tg*euO-v5=8e!?#!vdvnJ+sx8>5BR%O`th zbIPtRcTh-Y&X@%mjxS%~xZhW!%V0&U5gC{hwYwT?tbCi&MJ8Y_R=((g9}{Ni?d`If z%w5r*a@Vbn_8x)tq=^-?@VJ%>g(xM9k6qE|w5rIq8sP`fsM4u*&*+<3VW+EVfh@|0 z;ggLvUN=T>Ob?1>suQ{}ICElgh(qEx@aZMUlUq1w1#G3GG=)Lpxb?3Dp z7Y*I4X%Xwn2f||S7snRJnX@ir-D2)Pf8C}qPb|lhv2nOGJ!<&J_&1&p%7v7a3#7tY z_uxBCio3e}t0ZNG#;!XRLZ3UC1*n1bBtO1%FAb{M08V`oy||C4T!;Ma?+?`(1qBSx z#MVX>BtK^$B|KFru|v#xZP4WLqMrKF@Y2Quk~R{lz|?P0;qP4?Z34pmUC@3)w3yi4 zyQdu)G|@#f#XnChKX;h?(J@b6TE(u&tx4!5ut-|GBh|}&Vu6S46g}su;Pt~);KVs& zMovbr;)v17nfG>&sMJpSd~Ogvcm4|7nQo8IW&rug!-?J~iE5E9p92TsADP(csYO7m zYa+vt*tzXh9D3)`NSK=^?_k_(HAKNXr5wj=vlG)Sg;Oq?mV@QUO?663`B&vDJMzBz z+Ro(*N|hgnDGq8r7DzLbFfkQ)Py(0kJMvLK!H~t87s}0lnvHH^V0pDmFOYZ9ZF{9@ zjG2&Le9^c(QD3fY&8TuV$ihCOM!535xp;@Fj()}khn{Sw2P!Y0jPsdwt6G2U{vycl zI3mQHz4d4z=k2N)osgGAclh97-3)5c=;0^JwbLI`3YDD6tp-&~udq!n&9nCb0uG%L z8neIyb>|SXEaHpBZ_W+u&Xjnzjjv|-6e$iV)J1=^etrH+(Lk3sPztU5N}c8J+c6PP z&&_6ST*Nsnu;=Zlmv6~w{H+K){4V;wn#6VWbx*_MKs z#@JVaODR2Jj7-Q8hbc5a)KxBL|z#}D$nvujv=%Rs;_>Q?UG zP3f;=q7~+N&E-~P%M#t(r%UD)Y+8!>vhUvVa(HEKVRSWKyiM~mkhn%omC=MqRtfx^ z;~6ZsZ+|b5QYHN2`PrX6Zh=l=;D7j3nKQ{ZRU*qAJCfgb)`|}Z37=gDDk^S3U(4(g<*9SiN+j`{N#jFAo?JU24NKzOOTtnc}Cf)A`IgWHmn;=Tg7gw^`sv)0lxdegN|wf*}}pZ9Sfo1Vj5e*MI$<;h>T^2{=(+@5mOtB zH!FpGUg4Y+BPvW>tlDZ8Kei0oW;e5qgNwWrY!u6i)RNS4c^0Oo{1&SXCyMx74_0Si z4H(atZCg?BJApr@sC!_PIs0ps@xGbRH?I+SL9AYS*-XT!7guVk2{18`oZ5tRH{ZE3 z;X2kvRG@5De~bHPwsr&y^OR=)wpQ2v>7nY(X4Ad>7?)3_<#Se-NYzLM3D~dc{?C|E+cE10VIc3!)u7b1%xSW?6PL_a7`2+b6$? zpQRCSGj1P`c5!SR&!Ys=Bp7QHmm;g@iFPUStW_f)&Y4!$l(8lYoQbCwcfD?qbCdbz z!~hK`bxD)V#SoTQa?0W6cIkMj?+R6>Yj#EhLJb{%JT z;9V5xImIhFRqFHo`C8h_k1hM2KefL9iE!Md=!`+fobvK`ZpK0Y5cB4V|E#R~zMc55 z{@9muA|5*Y<7Pb$Fk7a=fPxDuaU<bxj^!}DZr#*lAM8nf`oA=S$T^O|!G~{ghqb zeWvD%VvXAG_rLE`mP%@TXEWK#62g^suVOMeFJ2y_bNKwjda<(*U~oBF*!BDqoAN#{ zmnza*4!S-UzPtPcr1ni(y10AtUxsT4ETP3#q{crGuv^x}m3Lr1e>JP^4c0H?;lD)D z<(8sAw-e&R$ll~~*s-l``Z_$%{fVQ_X0ofQ?5&9P1J&sw_NyKw{is5c+ve&qp_8Xx zYXli2vZSTPi2%RGGXXElx1Td!xstU}pS);O`hYHb(XqaD`$IEvks7(M@aFXn<&N8l zQRHS!mJ;RQpSB01Ef{okYnO(M6Sh2uD-&hH_r!i37_slMJhAMOv03@iE%kjtar6yb zz2WOFbT9miVBkT~GxJQ1jayzX-;T-f4^Yl*+>-C%JvbzrJ4|i|Sgb!HEysp={Nn2i zcIP!IO6^3;?1{DJ!=i@8WYTx%S7N18tsI0us0w2*o7rRRFZD_lb;MXo>x4bC(H;8u z`Byk&pni_^a==Y)R-_O2q)4jmLRC3xvPJ4w*5kd$I<=q5#iy??RfvrHG&u)O90)md zlefPgaZNifT7Pr=BcS8l?~pX=EU`HWTSZ4WF>nbl%{NIr_q+c9;_^~v%?@cC@jmJO z+bgfL+S#*sRR4T|fv-Jj`uLDtA!{lnU8 zJgL-+J+(f*A_Ki!&=T(bz%=;#=KH!pv3_iZok4$~JAe5=yc_W9lVwTUi}M4i$@bPm zCSHNY6x-3Moh@!Dn9=OTYxB7x>LI>1#h+~NrR+|Py3J|`2j$X=>vN^vAjW?PsY zo4220dGNB7vz|*8NZG&CXxB41ID|@I?%7z0ReDMHsRHm@8q;qijGuky9y8N!qu(6# zotRsfykmQFu=bvA;@_(K;%yB&&br+HHHhfEni3o3(dY;Mm_ zg^tUcejvz7P8fJ$LVX)1%lD}vRublSn&fidCGsNbhX5k@rL4ovq|k0aSR0<#p+W;s z?0A_gaPUIyU5VsL_xWUgQgX}Pl_z4&A2XZ!o^9N|8zM3Zv@%)Q8;(473s=1}HS|I~ z)o{HC)_HNa&~cLRkT14Exs-J&ZDZovOeSi0EILWLDN_J&O3oLs#nL%I?G_Ru28Z>A zerXV|`DQZF!VlkdffLF*2^6ft;`A zUUgA^38(-f0WE%Ad(oQlggU>6D_2b&zo*HlU%Xf@X2|)yZB?cI>7}1@RsEGH^x1*b zSgp`jmzkZHfT|_(mK&EthrRP_7?*X*{QJZ!LGvE&#N$Mp3T}fXsnsHt26u|;s7U(- z#DQI_hPL945E>hbmgu27vI+N=f+_3kk|QQyK|XqQJ8wcv-s@dwb-dS+wzn-&chcSU zMxuh;#<{>b-*;mJv2>p)4|mRj_ZWHfT7EKp_0gu?x<7dR$8*uhZ5|`HIWpDpLiB}= z7(2fZf!oVlga!dQFX2TKy{_F~>su^iUG@cZQ!|^=e{}1(yXr#S4A;bZ#_FRG#lyYV zc;--}R(Cf%?IVOUGvpK%4D)PKt?R6tMK~#w((7Vdy4FU-zM9MizY4Fc)$hG)BC+wU z-#<~=A+;VD+7Q%AqCe!io8Mf!>AU0@5SN0ODAkD_f=T{t&I=O=w!RfiR-sqaeGp7NawRW-N$}YWc(zwgwrZ|6rt6uMS5k31E1;ZO< zVmb$24({h!mR)l9C%g^i@<$x_V)D6d=NVt$kkpn!v<~_v4NP5^<7aaJX-(Xs=50}Xl$8%`93woYN$ChNSV#obD|V)nSm>X3 zScHevMYD*kSL}5svG9nMEmH2HxG?rPX##A-iZC^IQFbr;DT0$&WCVdQF;~%GAA1)3 zBo-ABM9#s>hefkN*lh0JCqFAHDx~IYYbvCrVrnL&dhdxT8wQIO($r;xvLV=D`fL$Y zx*Rle7?4~==;k$DQE3e1DguF#x+)EaNnb=x-O)Y+lTTHGUhs)nO-6*tq2;@e0^-Cs=FRGn;ar zBBVL1zF%f1qkdTLBW0w)6pQFGK(70~=>__^GP!8Zhbcq^kS9QxF~8K9Rrs)k6a*6(dO(Z zKQ)XLsEZ7zjM5O0n|G0?;12H~FhEqln9qcR3vp zv1ct6H7?zN4rxR#5zB`RFPG2ujr{7jTHU(htlRun1!GDS;uX^L;(T$-g#F#q3sy5$ zTkW)5QHegwL5$xYGeTJ^AeS$EGI_@9))y9wOzO3x)eZi7QgF35$xM$R1~MMdeCoSf zwUF5uAAFVyUV>aet5QUzFIe?IGutr*;CY!*wR+Ky2b-pRTS{u1Oz$_%n}lB=O?s@^ z6uf4p$met`-OfDnd59PzhqwrJO8>iCaC^U~uED17XK1#kbf?~BxlYV()^yG=-&-Y) zOtdz-pPYs2i&Ie+a<>k4@R45j!#bdyhOV=0K6x%oXQ_~dG?>&k5+GkB)gq#$g4ZCeR zMQm8wN#L%POtC_x;^<6~BJK*6)2T>R>(7R#R5M_$6?Y-CYoGFdB`Zd~)~_~+SSEc0+ZyHLi1=z*E`h zPwy+S%t=|Nkrce8_##Di?JAslJ+!*i4*FUW4To?w#VlzpaVLB{)nNPd*B;i+7M zCw(hfv=j>Q4Ash{BgNm~5!`yQUrJ==gnk12k*D6w$xm;IA9*dc((FjFHh2x&BFVfD zS}8L<2yDg3JS~3+pC_w%d%{;zoXiKHQX=zFI#pvt8&)mL;{iKQX>5cD^mqt4%~f?O z^2{qEF1csv5OTB6qLGAocTi0}GPZ9WuppOgpM`)wycAsmPRaA-s{UZwrH%Le#}0N0;Ik^b!sHxaxG?p++$6>9aemYSo+hE$C&pV}ioI0^Vv)<}%N8*gkA{o5xmdi z$qVCw@$~cjX{B9qDD=;Io;Z_|mXMYp`|ht+=3T&C)bARzjJOOf_~exVTU{@Ih-O?P zl7WC9Wx!Wv@SOu}F@w*!YaAdcvyAG$zkQ61e>I)?JYDvk?7Nv1p5&uerZFbOFjSFB zu1!t(mh!DoMRL;%Eta7gRB}{u%F1o>N3GY8m}iy1^Yn&Po{X84nUw#v8d5tR3uRxRHa`M`{|tA=?Jzhld4RwcxA0NwV|5g(KiS{9ii^6 z@lL%{6Y;0T+^3yw+0NI__k{l}KgX40t@lG0JPhftS;z#)7|9r^e+{oU+++km{1Ov8;!hte3zG3dR>CS1t11k|2DnEQly2?JWqdTIgQ2Z16y}()U+sSWvRO zzUjE1_w!rVxpaz6X(zLNWB=k3M{jc`OX`i znUE$p)yG2QlTG9Q_PlS+ne!x99d0L(U9Yk@PiSm(A@CUqgo^8`Qm;PbbV@ZMk^+8* ztI4wuLOfM18c9i)4gS5SPxcwl1wjwy58)OWhH%rmAT;N`fkfWB9NzUeX-%+7kEZu5 z)^l4j&KmlaHO>CR7U7f8lkS`zQR>5#dk!TxO<|9GrSdk->{s0FzY1}@L20v|-9I~4 zf6e}P&pb&fv zj>O{8A)t6X5D3)&`U3xAj6gxa(&)G_2oxM2!$9!_L|`xo+`dRC98VY|9C}P>;D{X( ziNcc*iNfMxC@B8yP;fY&FeoIxR#9L@hbtfoivi%cAQ}qA$6yG242i+h3>po^!!Qsi zo@Ovm#2*a!$L<&ezPd1=8gK=~ps;ut76QYY9Ttkj#}EjxSpJuZkMxg4qK|_|7zT~Y z1bPG?>kNTFA#fP(jG+(&5+6fi@cUw+7yx%bus0qd6am2%5DG;iaP1Cac##8zqTx_H z9+&wg~BmVJYnEiB%Uw`7@p^VP6y_hBjf)Q^iTx)ctC<*LXi+S>fdxnP69YFX#Hl7hs?@akUDAgMNe?q%b(XBf;QcYR44@4(2pG42#BN@*mC$ zX57Ei9Pn3=!VsXx;SPwv4@DRPi^TN>7!rcPQ$G?0#kD&OiNswm0SF9<`YU7qov>k` zSL1a?LGY3;3np%MQq@$xyM~}bg!14@=8}A4x9ERH$R4EEqXe1m4NBt8`!0*Zs2}T`mh+*JpIPUB) za18bz+x^dU7&sQx_HhA^FkCHw7`S5L(g9d7ka0mQ3fIOM@R%7MV+1HQE@K2(8RCQ| z7K+9zf57qpi#{^(k^cWuD;5csH8{dx!PJA}NKgn2>~!2eKnz?Wj`xK^&|q-?qv|6~ zgBTQr{a0o^;tzsg-{YzQRSE_3@-fYT7?{#=8H0AhSpkpeFp%TUdW7Mc4#W@u1SgFi zfiMhSXEYQi#6UVMXyxMqf{O;8Fksl=IyDpuga1if;Qarn9}2}H!4!9VKv2^doRkUj zfMU=%bibV%M>B9R&*MZ1xN872`oGNt@&`dID9~}nAO^$WFhPKI9Ik)}aGAvkPbdNd zE(rf-0`fqBCV}B-3tVs@0Iq~byBJ(w01G&b&oSA?zi^M5L!O(<&YwvN*fQ1sXCjt%(R z2XT@Qh=JaJY$jk9?|`-CBUWRuVf0YMkp{9AFr;DKyXiXoH2;~vt|8Xc?Z&=!7}DJ9hgngIQwj{ zfCqgWM?erm{>|f0b$vvLTSI~jVBkt~oXHV}ldOKz;cNv#3=T#hPT!+gJ6pz3;u>`v-n`BJJkp?gRG^ z_zzzo%o0GXLjYlx078)fVgUl8KrafD3F3z!V)+n+Pap^rA&8qo2q8j)CnU-3L{1e3j$xXIRH=8;M5lhgha5)3|IH%X5yeO%t6@N0J-Kg6X#wb7K*6f zo!6m=7^!N%g!;nR&Axs}-*%Tp%NmoCfe~3dzkaq^SIi>e<=Hyy ztlYhPU+uNtK+m?@7;lqS?PDnyh60-gyD8Y>*s6KgWA_8S#;qvVQrv7Dm+wm%qR-er zp1&NR1zv3gtaDUfH@VuLG{XvJ(FNmvI(v5oaF4xnqs$tb6?8;Hiy{Fz5TAi(nZZEPF;;D6eO`PZP zI#~mMT_u4}k-|@q$VrvDas-B~9qDsb0}}NK6I2)tM|F!v-LoiMepw$JP=1ecSKS0= zFBGOvts25pmg`lf6DmKK?=YJfD=<|N5@!2FORQ^Ku|HTk^VOGXQUlbdN$lEbV9xp` zL0eL3R!F&aGI-ZTYla64R00sMeWt_J>!m%}S<;mB-k&a`6ZLsJkyn=H8C+XGn>($y zXGYk>Mh;3NcSk|~uGii=<@EXW%RfEs(JHkbb>QV%5SoDrB|V3A4zC-|hj99yb1$E& z>z&A182Vv+DF{evTGe~9ku%_s4KHqEfiRCxRwd(rVa5#?F0&;wpUml zvKD-Y#soHvqIKR_Y35~L9ZjAJ=*P@zL}f^++iD{fOS89uyCd9K+K>Y8PQU^_?iZ4( zIlg*@{Qg@tlP8L)_NKEF-6E(VUAgk&+t1Nxj^p*Nw*xpxb_o z$t$j(sne6hsuongyFUu1kXH@WQhqcL$j|0&(Mw_XHfolaVb~sZH6F(1)S%@aD;ecJ zj`U^Zv+dmg?J&9n8}eiYML%K;wU@6=Fx3TS?nkv3NJo9C2(?WI>Fn;0YvHgvy^iQ! zNcL^j$jg?6n;R-q;nx7hqxaLwQtB?bVn=J`rGIwUe{}HvH&fjQg@o)cjWT7-eCuAR z35zeXk_@Vz$TSmVIw-?3l1x9z>X26CZ%-QZo%d8EsW7s zkXyf3Vk+g*pIz^KF42Gb3np4 z{WgWX3YC38<={@V^iHE=g0vUo=HZAIhT}`se4X7w`p`vMjM{J*HJ(+2Cr13*xU8|` zkL?2Xaf{)8@S|;jJZVRA@i@LU=s4~t8(Oh^b6y8gtW7HJyExQe=2-M;>2Dc?A|viK z=AeILr_}uTlc6t1Pnz}adLPJiaAz%^XY?&YdE(b!O_Z<+669jhaE&;vga zyzqNcE}=rhGnz|RZfc#m%!Hq`?(H3ZgDDX2`hDM# z)V3j+@1S3}Dsp+>hFl+KgqI{AeLj5uZ7HJ|uZ6segHwpn42=Fx!zG4%l#vqe=XOGi zWFsS`Vw~XVPv3;8sSQ4Q*_6LTlMPU1Ud~J^bq)!6)G)bIqBaksRHF)KXzZ}}C^TYp zM)|2LE{U6X`K+zUzN`EFfk)#Q{mSC7fEa1*JwE-GPXf42b%2^hG{q3_*P{EgIU^r| zbPJlm`&LV}^mece6O_koF3GM&*d^~#^e`|-%(sJ@G4y1gAC3l5lsAxCAC+g#UQ1GHJ0LZHTw-m|T|Ii&pfdq2*n^fsW|#>U2-#rG}x@hevnZ zGk7;ZZJ*wI?q0LJeRHkFO3jDC87>LpjhscY78gY7ce2)kQTlcMAoYq>lf4+RbdWmC zNUdp+6WtzY+Q*{}T>%#v;58Nlvo$8`gU{j)UdK?AJ?kFnQv=Epk&96TX9@X2)bbOrP4JpPjV$l1 zlb-buXWnBBw)922BV%Cd^_OkW8Q#4uleQPgA=ii3aW}2b+l7w%%(azQAxEc0&It!3 zwNg_=tF)Nvw!%%$)|*9aLGrHo$j`~eEJDB2v$TZ4Wn)z2&n6B_xV>z6n_c5LPTiVxU7Ccj5U>T`1I>en68$^ zD2{Rxt+?OvXAq3wk^ywTcp!6y5i1phHSnKQ-+rGP_w zYFOip^YpegKL$G|nV0lME0s%ABlF@`W1~1hrd??sX^TPuDVOGFmU(we{|8+yX(g*p zV)A(kI;#PJ!dzl>#y(Ov$7af}U+~a-imY%{qv0+E<40$%jk=AzOg;?VA z!`pTh(*}NtX@(wC-fIw!T5}c-x^RNwHQ0mZFq3$=!Qo!{^v=1E9+S3v&#+iMaqaP0 z8--AnE9OFvyY+6^R3CSpMq4Wi($Rc;O67^8G8tD++?g zGwTM*&JP5&Qo`O%fqcfC$x_nAMvL9*ZK8GO&flN51Y*rv4NK5zO}gciAm<2x7Ukz? z?@H95+PqC9A1Fe?zy%RwDt{?50gynfN{K)S z58ZX$9If4LY(b)kS9XA(n4HWQ^!wG`6oijs>t^F_<%Ev|1wbSL$o#2;e@F%=mwNyP-*Cu+D=*GfVM&{8o1(qxK2H3y zf-nhSL4gfJ01n|lkOl&pz{lR=KoJD)5JBJ@5d?Y>K|B*hfDuu|bWsFe5k*K5MGS!= zrb7`Up$I8Z!~`fp7*vGlwL#}NK41mLHjzl|Ci+_l3b!oSu0)mN$SN|7m2HOBC806r=L-~+V` z0HdM01FjX;0p~8 z5du^G;dU_Gv}HyHK!FAycrMJ#@W2ZQ-Rw|}=wR?q>1!SG*j zD9S{M4#%tT|7x`bf%_s%DEv@hNC_oiB1i^kTg0$z?Xp=xS%6I5f%ZISs4H}dU4Pn(*8uv zzb!@t1_73Dh21I>y%mN67P&Q#Q1GuF7Z3p~RagKzMjp6yd_bR(9KdBKK!F41+uJ#e z+(ZJu^XGrE77DymAq7S`2!IO^KCt4<#dE6)q4ZDG{%>u9!r?s-Oix7t=Q6+uK7&um z)zaP;3P^ zz6}A8ZcPB}u&@K2Y+QgCD?TNJAMRvR5TA~Zm#?*trlpsyn-84c08CjGDE@tv|Kl2| z06~@_6hScXoJ|0D#=(87164p63_Jvb0BUx8z{LCxfXvB-A}9**axwvXV0^%U10GEV z-v6Fd|H-+O7=rLh5#;}!yAo__C~%*Sa|i-scew!`PJC1dJdm-1Ai$LKf4us?MiG%x zx0QDr7$!I7 zYvdufV}9=p#vsV=r+?ioAcFAif(g*$Q5F27Xx-g>6e2)@K!4Xo zI+zEU9~cBP0v^JIfV8OC|G6$u;XM?1Mo)td_cuJb5nYq{HgfRz*~2xOi(>$qg4~3N z()vfkhTL`>6ag@>52glG#o@b(5I1~+rvW1hd=I4;qz1;Axp@DrYyNB&f2r8tt?||s z@TU;S@6HGhF}y5M1ciZIxVT##*+REnpk4*8LlD@52mp-2JVc06{Kx(+Dgv-dfPhEv zfK?iBG5?v!e`@`kQMX0=4<}&2`A0B3^0!?9o*lo{ivVAQ1c6T?Tqr`&-yMihiU9tC zFvTE-`$re}hwbd}pd*;eKWYKaUxE=F<{vlU1Ta_#5opNozJFWnwIbB;md*Q*edurI zA=2q~cN6-@mIl}U%}EVtvc*Rc<_Dz3S%FP4E+Pbh{EsaG?wmYvG9W>U0C)n$gL_Y& z^`8d_+_J%c?{4sor$$Tw*cIm{{@ZByZq=>~0`7^k0dFO_|E3I{H*jUhP@qv<0Fadu z0iGI=qrl(Xpb`q)h)RF(mtFABNFe$MVuin*cXzO1pq|C-r#( zAqg-iMFL}yzk!k=YqJ~s)b^pfy19GyNjlK6gPque4;q);VS=wYlIrBNB;7@#c_#28 zXEb`Klh`P8%*ySLx5xS-x4t_knV2Ot&8r-rAN@GkNKNKfKcXL>pi)|6V77fgnw=!U zIkl&r>Iw!A^>Y0%Ik%0M?sOs2I z&8_J~wM*)4-^~-P(VtU}tB|{BkaSF1S9F~R;V$SyOuxxYT_1#*GA`B^ECd-Y3{DiMM+qlAa0^%87Xc5ZOhg<2{ zD8|tzB4aF)VMvA!P}!kUwK};c$wjFk!`_?o>Rd8kZG~*EnsklvQIgy<-D^@EF)O_n z9rO!oLZ143d5_A_T4{ffTdC@!8Lt6~JCzO-?BLq#baCBKS&;gu{NFZ+4_s<^!1Q*;}rtjrxm!fl9+!@)r>s0d&%T{C# zmeVJr*N=k|eNp-N>!hq~viOb{eSL${jEG}<0^9F@EHyChkg|;G+h1LKTy%Z^nSvo+ z8_eOVJbFWU59OW$s{U7$dwO1H%+K^l%0nZ*`=3n-p)Rb z4Dy*IE%>y;luf_)DW@9q$0KXryCoPp;gCF7K3?mp5=F)C=lAGMSG$j#ZlaiH664Vz z@feU#DhxUDv^f%aeOeztEAB4^%2m)y_ADb>GBjCpoOu=oT2 zvuq+=jEgFj-m+Bt%w0@92lt)2P@xBQk1AzONMx8ZBrOx3xiMXScmo;qy{kPe-#o7; z4AYqidP&C|7^XU)Nt<3Jv&63<B#(aoIe%I3ZByi4Wuo*)0I(>(gm4&;VNH5xVZ_4)FvH*8HB-k(1`-)HRf zQZK|ipNdg75>Plr6Ku2Lv<;vC!O_%sBkDpIpyGPxwQ%cw9IH4^o_a%CY<*BAgteutmONI&(Lxpn-JAuKKDN5C6b$&)PCdmmhW3+i~ zwzl3zj|)g2)hJ{$4?I}*{&aU?hl5Z`VQR~KA?xFg!)qkS1Th3#b}k_9m~$f08D`n- z{i#e^iiw|L=rkp~9uv&(`w5$O9xbD>?mEI~QAaM2_QiYuHTwcdvOA)lXlgIs?w#@w z=;h zUvN6J#S+`4yiZ9>z=b8*=Xf|C7>|qw+BoWu=@>sSS}g1)f8NU=TeA&I$f&95 z(GxDvZmugf*b5Kg=X;7-^nw40SX|$?&vy-^MnE}Jg;on$W>N}H@@Zt`IgSs!=VEo2 zAKxKk4|qQnyH;oT{$%Fh&FYZ@qs6##Z-W`}_vt6?<^bVKL!&?l_Lket6D&E+@$Qd} zfY?kzsgJD&vTb^<&_wWOQ8C^=*!u3>-VG|#+3=Omec-Axm3QBn+&wcJ)rxuwoh@aW zeP%s|4!>jAPtF2e<dyDTA8bXbk1#vH%C+UkW=CV`I=p&LDrab z5tz-n`(ppyT@FhK-RCSWV=R4PicMlHx=>G|R-9U*2dQ#!modh2MQbBP!-jan5{)hI z$jo=6VVO2$e79Tu=@AC1JDVE0U%oP>whc+&jvYqzim4<$YIg$OboUx&|!WMIZUcoJ#E#1nW zpBu)`sAMgjb(m+{_h7TbdZ+U7zAwKh&^r(Fobk1IOzUeB6Z&4aMiXOxP2R_s%&(Yo zIB~BeI4PC$NN-OoX35<(_Y|_3cRKUT{etKsBh?<|%SUV9mCQ38=hW>P3&57(u*EKU z%QE#K+gT=@JupV|F77f2-mwgy%xWFbt5{mV*+k@hP6LacRf;GWZ&LRWEw#GBT^3oc zALLJ2duyfd1yY0+nrh^63{Dm)mdxN1VsB0IZZNJjjVf#3J2$<#bZdVq(sOhgLJqB} z*f*oCj@Xjyq?mm2eoErmHcH1SWOaSIL8_#hqy#T~EnEZhsS|BcNB~&8;tTdT)#_{_ zmTE=)B9PS9hxQ{E7N@+-C2NCy%$N4^i*E|AT_|QCn!X91-={|)`HKf$Mt09ARU|94 z6N}wnTRf`HO%7^7s(bvDL7ei;)#l9w1#LsOL0tTc>EX9LqH~|1QhC|ifmG$&CO!=- zdd++V%q#g}#9`5Q*sV={?TMJs>7&PI*;hT1sv2ddc&wXA1!22e-!A*Nmbk-T8RZyw zbkPSa(WW_eSw^`ZEgcrkE}POnTC5t{TF$b@PY2Dz+wf43hzp3lRbLso-!9&l>0$3uu`Pk2{e;llTc~SfeH9!r|?>Aw4OI1mW zvj8w*s!EoSn zOECxmjFzgmpm|P3;lHyax8xw48-~+(e~^Q4-Eg2w2>B<jcqE)2jFGXnP1)llH92A2B&hXMa_p|^A_SooH%6~O(UuW5vZ;NP%t!tK1J z#vuRfKKM{L9hjuajVucE>oB4SLjVg+>RST!pOEQ)Q3?mGaPsyRdBIZyj(CwFz`Ca5 z|DEB|(*Mn4h#=st@NXUi1rFu$v~Sak8hE9{4W}yF^%x0-h5niaqHx+mg!kV8^}o;q ze*?w;A!FcX0F~MzK(7985`z%(H)Xf{bDZ8Sk8sOXz}-!!`#*vE3u*JGJ-1c>|2uti ztIzjg5el3&Fwy(XdQkt(SOmVkMZN#U>^Hh_F(SY!T+FS*WDRbugc`%G6ak101OQxP z9(W?O-`)@fk`4aH?0>88H=h3AL$9UJi2nyE0Y9z)i$HHP0O;0-=Q14W8zL--Gv-DS z6}@#7p)mBHV>ZPg!u)Ub{)z7Yiv`GLROoP4LlpeGkVOGTs49>`M*uh&g8)803_!{B zw{nm81*x z|HMZ8cYD#`D~6{loDmllfR~CYJfGj0aRct=n82kuH^5+yPbqNwaofMxA_&Nu3j+C; z+=wsW{$V%-PL}@b;D4h2phCCp<{z!?&#e5L@Bc$)!Tk)ln;6|T5a2V200nwWY_bBZ zR^0IZc4N(mA|eF1TXMsFjtNX!a|wd^f0M2Muu+iz-|$2t!hg*Mc&Y!53_~{S1o)W= zfM6@}|JdGdZ5yyC0v1^afD$hBwRi^yphA*44(jZF+5LzS9kG&F*^c) zmX8|HvEhZ^&2@%5UIdu2SNun8{}$1IV#RcC5A5Ki*iT17;LL&e_Oy-`z;?Zd!hd^^ zM{|1?hk-be1b#U({Npf>9H??_2UMLwG!PLeFZ>)5PWAG_Kk^g;gLwtvpKuC_@QMhf z#u<|H1G8>gL?WVp4Jw#F)$$258w@Ne_`8F8`*_(}y5i$J$}BWka@!OpdMdI8TPt{2 zL9LbV_SPzR<)DzWRqX?s0XM}{O`ARnD-|=-jb`)JSB#u0wYJ3$Ask7H1Up{aqnZaB z5gkthznvZLF?)aPux5}lt0VNE9_q6n3L811FCu+Mdr3YT&wPYAn#vmwWA+KoutcUQ41G^WMk>eSe?bJC8RQMSAhI(-3iISH~iLxlU| z*#UZv6DH5M{4B^D?Pp&c8V?O;D>>V$JYQKeCGf}pF?-IP9|;{D^#HfM-g;AKVp}n8 zdG$C{w)x4x+WQZJtlt@!onfeiquJpgpKaq2bpt17Uk_n7#p*HHvC*%n%;BdWOkTWW zBjg}u(6_5>#O>D%5fI8-xi}KvX2tv&_(7$_^=0CZ3K`P7;t$_X;kyt}Y-T$t$NVgK zT1Ll(`!GPik-Y6OVa%iE!M+i6Zmh2l&hZGRypb=uuyIQ=uv!(yNC;+d6ESW7#nHaolJCs}hl91Q6(R^92v zaZ>q^VCHNByjD4^=`K-VYHUFXV;Nca(ju)Uo}WvDxqK3VBPIAyt|iB`;J}#Za#Zy| z#BSuSBi;sOe}VYJpsyM_usNZMjWkqd97PW;iRE85daav=oHtQ{Kb^xKv4=gf%K0!a zpDvx-ZssSsJLv-gb+JboV`)Ao5+8g&Zi!Y!`-NXFS+5rZFI9z$XMX=#=Q!p*nS}+P ziS)j|AHxJWdSG5dA$F;>kW-S>25BL10LqUQ3pHa5a53>JXxR`2V2p`Faf6S}B{m?# ztkz8L?jTjZ$Wy8OQI)i>T`TiGPq}uY(l1KJ325Y3ee&Q@8?WMl)U&{dw%L9LZi!7S zK7s&RX9XX}HgyaWDLkCd31n&Q>8at$xhv=nUA#F04;(etKll-AVRR)l@GQmU>51a% zJ{mPpIJfK6#J!vHei8IYS<;wPO$KiEuWb&_cA>6`&L&+6QJ#N55hmH zJBs8$^&vpmDuIYGK4kra$`&hiQ@F21yn?Z~QvlKf?dO*^BVa{hapD5jM#E@$}iQ2OzwaiDwkh1l9#;{5pOIN+ovQq0~&D9YZwp95+x??mMK8$twiY7@DhW} zGm>h2H3)}p%6?~<|@Z8l&)A{r=gokHrNH)MwzWhwFRFQfS)6>U1bVn^DV9s;;^uo=oGyfGxH}?#g zW*81FJ+dG{Tgi96EcISK$2Zul^?vs0k$_K3%wYGa+=3oVw@sudbRIK3+qUKN*@B+0 zr(#c-_ko*oRNO(N%u#5)_)h#}&ofzu*g>qlXbe*}ru*S;ESxCsvMe~9UCfCum!EY?x5QY4tXIH0b|HL)i0J3Y4m|meO(`#kQH6{ z_UcZhZQocXh6 zH=kr5FXydoC+25{8YB=W)7u=h)*SWDo9>v;z5Y+>%kg`V zUJ_V#o+i|4|FC%6piV(e)h(5BpwY3@<$}?Abql{KfF&0aK#iCT;3g&lLR?AV|FZy& zZUn%x9}}LSD4(LOqrHO5uKw9{nA+9(Z5j5sZsX&x`d>$puxDj07pH~UF~cd}J5PR!4Bs_> zQoZe?vNO~_zIm24;3OWW*FX!^hh6&2PHDuidJfP<#?wPDhl1k?Is}+bR-g{iNF$3$n!Hhp#slO;pH51dGew?3&dU|~{@88jid%Bbg`#$V$hD;~1 zV&d8Q?QL`fVcdMzFUOU@oViZ_it`SQ{kw5lOIO`h@lusfeqHtvt}T(`Gi19+c$AfH z_?$$t-?@N2UZ-sPCES;7t0HpP_etxQXNO()mM{BZdC#k1Pu3ga_cdl4 zZf-Vd#M~w(jlTE9HQpog_4UnyUM@^si0CmaJucj;97%n)I(PZuN_JxT!28F5hf3u6 z`FUAc*@q7wA|fIl+=U1UC00_WXJqi1w)(7hqc7|~^5t?7e~v{bM_1%As5)B7MMu{% z)1tb?ZKIVctxqxQ2IJUdE;;mS{XjXZJd>iWqO9*=I?Q_fvXhc?&uee8lyp#P_OzbI zr#tl|oBwI!VsZKjOZ?%}wYXx2g@9+@@c4GbdNT4ys9Wps8j7E*kCuqkzu(;(zRLON zr|e$xd@Sw9r#?URhQjla02;F?S8G=N{hflXkJ?oeW9;_EJRY!LL!P+GUAR1r+7%=E ztzy+?`=1*O4`q9-NlB-@y>X9@qBVD-x_m7SNP@X4Yy#pc! z^s6QI2KCtGy~kNFk`dBeZPV42iv1xT16#-IDn_ql`IlNB@^kvrwMPnQxK|?tpY$J( z6%YU10c>HvdbfXlljC&hx|-2b46CL$tY)B#JM($9W%%5-qpxnrYSE=O+0wOPd9>yQ z&eDsT(6D2#Nxur$t*w;fRG4m+p(&W=5^nqz)%>urXslmzBDw#*1-u#{LI2 z7SyjsMuta3Qd3h?Qd5&t-4`0IB^~z9eT|!{d6s^5j4fqzuAI*lxoWsAocBIfQKsS6 zaC=Xh!@F`my6rlV;%e@^*lD?R{zBX@c`bj~W9U=z+Vbvw^?>g&GJg1JXBH{HZYpZL zp^SkStg-=~_h25z?>tB|=JdGV4>qk~m^+n(X*=?|3co=wALXbVWOmC_<`@&3+~y`1 zWfjx#dwf1&cx(WT&#umV(wDNm>I~$)NLGw7j52I0zgNquF(mOy&G0U`GsJj9?71xu z#WG`8WK%*NvOR~;_?!zyQ^9b|T*@y#-6uC`t)G8=KCFU~&jgG&KK>dXDOPoE^7){1 z&Yp&fHapvRH{*pV9bqE@H{?{c-S_J!Yu1!6DMsTWP2WXlpKopIcI9Ho39*zi8b)&{ zlW{R|S!!WpD@W;se8%}Enx$ySxnvB)RZp5~UxIZ98fIzIe_ zf#${Cmr&uDR1}@g;uMnW**@%{OwwCkky|{-G!9zNWU0?}Y%lUm?=LaZo+3%2plnFX zm9J&Wq_BE(U;A4hi@WM+KZ`jnR~}lDQ_z%5CPhRhtOoa>#6igwHX|LrK~k8&lwZNXCs~Bt3=X;<2kRy&11;6!ST(Y+n4z2DxjBUgX0yaU07dJ z@9TV)8rX&bc4qg61WJ`X=Z#DoC*z5gdC}`a7G8yGULR-3%h_&sA2JL0n=tqGE^%HALbLV~`ewb3%&1YVink$0~ zy>DgS1TIh86@g-RP)x%_JLkzW{ z<1mhR&toj+c$Tg8FbT4G^u%=*b+lTL5+(bK{5nruU`4`&?Ay zp`OpV$$TKirc{tGIv6uovT#VsH}RZD$7&jFm4A4KkabTXNe!@Cs(7@>>i50xXAM6U zWj_>VsYkS&Pes-j#!+`kz`fRKAn;iA#!kM#RIg{6s1;e8Seq!RRxS)J%z%YmizzNd ztB)pyBBa|VC5;CA1$cqhW#M5=U)$=D#1bhC%5_wa9? zusnI3vpF%*nmm}3kb|@=F3<= z*a(e0Igv`1aX&PH6e;>LSVmKqDeD1J0>3Ehx)(*5=){01Z-1R<$_rw!st>2UVwi0- zQ$)8xBDd|%OrK{izuutc-SHFn6^#pLXXwOJHrfYlpd_99Qc<7wdG8rsz9LsJxd_=v zAxE^L_QNEZB(emS9F~BZWdovbo7EtghISHFsJvPlnL9ptbSL^`R(RZfGHTf&ZdOIP zB*i{95Q;C;h@7S%-UBN=T`1F!ueci1?Vci?zATy~CyK+Y(9~p~(sH6@G4)J|mUI%Y zvdukR*R!nz8g5R0N+!Fv8LC{H0qm)co`-m`FL`Sf2Bi-Ya_te1{L~b8bd5^+se?0)L2w=8ynhWYs z!t*_Uy+A`EzGC$~b3u$pSPf+c#!54=nBrLb)a>AEl%(_&1$hL}{TeiCnU71HAKIDC z)QVR!Vp+tzGKU{5mcGlf+`yWcaNjc4`-Jh?hl$wWkRL7vrw@`nRDbDxK~us^=Z{vG z=OrFvnX(~!fj*^(gnxy!Lzbb^EDRh_;WjNuj_K*wkF7|oxi)?`!az+OfaPcD3}pwr z+nb7zao~zW2CRnfLAG+hz`bu^(M`Psit^<6ExJHB**)zopL~vGUYXBTTDkflZy2; z@zpaQ&TCe ztkLTE(Qy%CYYE)>BVl64x%N0>%%QudOLV8=RC~kRDP?;f%2y=)ii=^^k4`;oXQ%h) zBL2a#yTcMSnfc9ReLN%dhJHhJq_~rA1k)=O?;b(JEM4MIpsC*^ z(s&g8qw{shOhsvUih~0**TOgmJo991HaSgT`HCIBoX7@5R#iX1Zi>b0kJRGd#-$VYZ3rQZHo3puZd%U4K(M;drn z8$HN&Vl2%v+8kv9p3A7|PyJ(d$v$mNxuB?p`DW6bmxh`xt|wkoHXoHPyiB}564X`- z>nvSewDA>MTuwdcY)t(65_?5^{!0>Or~@RT2%5Evf+g>{&Nc;m+9{MUeWYe8&NgK$ zYwG51_w)WV9d;%$j^W-h$FyG)P8Hng@rCO7xx54317pl$*HPSkF5kGlLbu7@RYJlv zi9X|xJ|u#X_t@Ls+1Iuc!}FD36q67Bnf%U9%xdJlCAJ5_+OQ3eOB8B&JsDW8nK$k* zka{?xBlDnm;F~8*?NuzL;C2N*=;cGh0$hvwK^w>Sz-v+AUgUOp z4tY03HM%e zjcHkjeU$SzeO#!nZSk`+8VzdtW&$EIW9zxHv6X3C%Dll3n|jCl6)(fWkmxniRL9MD z8_!|tAug^fDk@Er(H$dW*|I$yUA}%{_6MSqA=q9q8-2%?0k(_Jr^eN$RzmUuxKEf} zpHEAxlXc|p_G~}RM$HP6-?U1--hcq?$C-qomMLgjg{PgwK@B`5_GIi; zM<=oF+|A_^KG0CbXt_$DisFbC)u!%g&F<}BJdH+1ZvjuKMNF1x(4BLJ(hsduRN%Ty z__TX-&j{~2QhS)*@etWReuH=Y;ejk2>9-^5qE%LW444ni3SQ)L*~g)Nk5%QWqlwx3 zsZ9c<>o{*-@dnD7bmqB1E!~yex$XJQz$U5FG;PWkTmb1FPWopzmZ>QPmPl*QV9!`r zOH~JHoTVQTPp|@ryey&kiSbgQ`x|8Q#HkeJ@dUb*kI$iuMC-HS|exM|S9 zcpUeK++lJc$uRj{^~hEelO~p#J}=^|Azv__?>8TEHn9{)%SIk=)_zP_E7=E2FJ=?U zV!6#_S2-Vas%oTp9z$QHyH+3e1x9@;9E;k*qumV0=Qi+t(4(pb+irHGebC<4>3V)$ z@Xu)^BeEG>q$XGLaf;|r*OL0NTVi+_Nv@D<_zb4$*{d4djP3gbW5$+h2j7~`M%0Cb zj-tntr?S#`xY5kTrEYBW&FPuz8-q1BY&lFEA`2Zd!W1RXXY$xoINf?FH+2U+CieMR zOGpwrcKMM(nJfX|@y}$D3JqI8j`rIGhA;bl4m)Ih)LOJVed}Qk@iB9`3pg{q6&GtaN?V-9WS_qI^Beh=2i1Y zLd5DlKa%C^;G<>*`LmDlh1KGxjk$Ul-D!7pke2rrNGF~mi)VvA6=&T|Pn<&eI1(QW z*Y z#yG6iB&F4ASAD|b`bqs8ll&3KQm!CBYIx&E=6kWvpTmO3^C6cbv+Zg0_@`FZ?LKZ@ z_oBkMJg&&>A2Qn+30lZSl7`dA(lb2yu&uh~onY^<-Q6R1A%T%m1s^1>02BODBx*e+ zAL=8P>nOB60c{5rI^qn5Juec|5LNp4cEZ8?cW5)}g~Hh)I-i;QLr5z|f!Ov7@CI7ECxQL>I*MAVbHAt<=hFw4 zccu~(+z1VMM{G$=)vE-f)rH%uxV4jv1lX>a+qp)^(E**GmudHe=@rMrMcw7_6v%~x zA#;z2tnmd+4P>7ow-`bwWv7GerD49@xv`g@q~jg@zs&^{`LlVt-u;N5-kTm{o}qL; z=B<~yi-Z!J>xcnm?XZ5aCg45_61x@~7SDT6rKh0b!vm>oK-%Vk7Bb;}Refaq9-8sa zciulGEO}Mie=}MgOn*P=lOxK~V$kq5IfN^ZT8X{Mktx0k}lT+hQP?Cn|eGU znfI-^(@Cb<%QkZ;y-kS4?im$~C7sT~G(N zGfr@AN0?QtHfnKFewL<`7KU?3kr$`RBs}WFHXq%@Kf{x{l_Kvm(mI{&oUs?6)zRTE`SA1WXq5>zBDEIg* zX6MbCHTBJ5jIxw8FkXnzyfEZVQ_~i6Lib!tx0_)r>j>GDr=l%Hm@(2igs;1$XHU;gjgf!Y-S#N1?2#X_yRy``E;a7HNEgaIvLnuNP#whv0_K9e>(t$XTywz><~a(OGpoYJ-DR~t zVKE01;iH{aO1_5C#uiFv;nG~U8}zEQX4Lgx60=W=JK+SZ?UvycFxOaMz&NT z&1`LoQE2>_uxr_fb{k?Z-7nYm$|_Y=F(p2GAZ53(?;x0k?fWXF)i`!v56LTs;dV0Z z%Dw<$Ez6YccVk>qx>wY-DEX*#ijiU;%-HSJlGiw4gf4MlU$!af6Tv6~xu~Njx@un* zdi%!9!*;DOW`et8WM*KOxZhxbn8f#2%-y~WPr{xCSgbg@9R^Rqjt@_e@r;T>>S%$j zoFB)j-~(#L{w99SOcwbey`*QJmS1ow>1|);-1GeOz5Tp5zRa&{>Rgn$i+&wy{^;Y> zsj=}G?7}YM9`1>Y99eYtf*eIAJ%N>FKjfLX}abxta}P4N0I?lTOIO;(%~0)|dWffHB~7bc1UO{N z^I~5Kt@zuiwvl9!PL7tY4yXF=3}#ItbMeX14L5!}rZ;`y$k%?GHr7 z^}#Ax!#e>dU=$b-n}%(AKiL*0bEYJol{6~j97PC^?58OH z9&Ecz%Od=e6KXliF{W0gyz%5tT-(xumjE1CDn@(FaHK+SV#=~vOa1&axtfm% z)sEhfuVc?teM^#O=uOOn;j^u=0inAp{ihKTVxr=Y3%s1oF7v@cBAl4O-8*Q#q(#Ys=bh>(7}C$EK1T6ZUJ8czp(1g zp4Os_ASZnmEJNCp^L#6E(nTm0XnWqpa2PmEv+~R8@JrH0^^ZWQWA>pY>-tL>|3F;z3_R?692;0xWPdAFOSA8jk$pP4UOuF zflWl{1^ZzDL`+^D*!{9Ra;#CX6k+ z9NLs;BO71&eZ>6AtEqvj)I&+lYK=>Pn#epY@cgiiS+atUr(@6K$yHUG*g;%Pneib? zj1>MHA9GG@yTGwU3+pE~Px(|0Q`+<+yvQz}ovhby_?~@x?iYzVKE3X->^pBtKs!;K z86dO%wd3NWGhZ_^aqdVD;XTzjTwfT95SoOn_EG!ExCKAf8Fs=+LgEJDTfs0BQ&ZQU zeo?YGYm>5slF7rH7pQ1coKiXQX`exYKg7ysm2<0BoxsWmaJKHH)Pd zJd>tP-^d|FYJLb?FZ7lBe{6kaSXtsy-(&sPse3vMk@2Qbsz(Qg)macmU z50YBl-Fy%?sf=txaqmfO-udj;7CSRBPY-ExM)0=)`>2`z$h^&z0gfn$@zpR2Pm{e- z2I)qG{LPwx%7qbQA`H)kvLppyNg|st#jf6{=Yl*at;;l5wxullagar1!*-^4$ofyr1`&6UxJQ}iYwz#K zBTxYFmwinA0qX22`D@I1WV_p*)ng5D5&bg< zY(4Y5)^5U9#O(0k0PaAUf+*u8X52&8VUOGQln-irTS8fcO~^l-6+S!x_7P-@^Fs*{R7dQ6-7lTH|R*A z{x?UgtgPP%0SFn4_^hn7!MB6-3CkX!2?@QdI4yi!s(`D90M%ARI_8~^J;xOoP)>MH z!*=~`TU>D1ZN3vw+R9pOSi12`CO?tTuW=WaA2m>!oy0KbqAUS{uHU19XEV}h3n4#r zYEcBT%EDlL;g0$A<%yW2 z$%O&(-Y)^yU2+3A?U&TJR05#Zuso4eY)@$*^J!9(x57B5e1*zOZPF#D?@saX9slCm z>gY5KULMuvI;iJOz)y#3`V)?#Aun+zE~zHqY!D9x4l`?RW4;^ZlcE9khJ)1OzUJSK z6St?xEdo$pt*RXw==MpS~mgXmQfp_R@6<1J4`ux==0{7YE|C$71CB*iD9W zmF+|RJZ8H1qV#E%8`n=xp+(;9we!nnZpG~jMa*fOhsT*t_sV%ra#p6X@f*hk1m)EW zf9HBERCO+aGR};>)71%>5ttD_vt!zAITmpu&n$J;;g}#l!^fP3sea{Yv7~4(_qCWHOw;1hO|;q@$KfcUHv9ZUvRmfX6U>gVfV;Df(= zBxT^?SyRHYW0`!#1Gq{E7SX81lnPs{)R#;})PEq5S){!S-DWbN+SQ(IuF?q9>!=9I zojuig46yIe+y~KL47X92%+cRK!l_ACH@Dypc*d(GoZpglo0bm&qtfYQLXJQ#H6X41 z*t*C!2wfBx%?=}`s%gU;PQm+K6O^5X2EI`hEP6wiUi>d!^bp3q|D@}bZ`+6~Dk$r1 z+PC9c>EUWkc9y!n*G9ukh)|j-G=YgBmdNtLIy@#I^EbMl{U2I$A5bYUx6J@Zqyyjr z5scq*Ng5hvZGQFBR^K893fZH#;qt9l6O;8=4e0%)w1|T^HC;Xqbd+E|3(`VF6o9>q zTVoU*c53dSs#>itTtQ_=I-h!w4W&dAStxMtwv*9DW+ z9QmsAT&Jrb&tjM7mY{erj!5NAPJNv>&~;w~6)^Qrh)`*+_2EMwEU1~i(Bx)>)2w-j z-V`_@h;gvb+u$eik3!Cq7x<@vlVTS=0aUEF`Bznn7lqw~?Yy5*Y3NZ> zPgI3;HcEmH^L~Anq=cGQdx=FK`5g;xkUjORwCx<;yhorBPWkyGMZwn!zT; znRF7Oc%MKs@K)(ZGG`p9r4AOB1$wUrHm1-4+?}hAPfv?kohNc6imXYn;iroW zEI=J|hv9>Hnv%3)?e~wXQ-}w8pblABeg>D+^zY@$eg{eyOz78sAoU7q8(Fu9sVV8f z-cWh+zO8VGz4bKk-7m=~>F@C#Pa9@+apM|}z=(|T1O0M%jt;Bqp5QcE=dA}6u>uJ7@#L?Arj9!$^-qj!tjv=Ah++a!!#(02w%w^kaC z^7kzO7jtPL0ocM7re0h>GktwUKdWfcvq{EER{_-Mu-jm@qA)Md?IijBtJiy50tk{@6h_P=J$ z=btlWQ03Y$^Jg^R{l0O(9!bD7psjq57u>06YK3pjdrebOa9yX&G1Cn+9~T{-0^5%r0F`?+aa7L>O@NF z^woPirv@i`X_cnk&u=%S)Kmb9$3L>rf3uEMbI<5+P*JP+3NkpnzY8hO@4pOEUn{RY zkrIllTTmo8pI1vSb)!j0qB9i&M{Q+?4-347DWSmd@)1`?7y!O*A2`mI z(%P>W7Y&q97ViTjMF3=kZ$B@&IPOU@-ZrkLE-t5_jbO-O>J4%jq3j+`cad&gKqU;b5BGd)g;^Q zn|i>ag@E8MXPz<AYtqN zrbN>q&d+bDLl4IXc?wDJVJfhjEA6o9X_om#h#3-~r60T(rKhdGb2y1M4U~2bWufzv*mtA|Mc_Wi=L=O{};9G5C#ASx*j zSv)99NZ?2_o)Ry1mxOOCSdc_U`zOiatuOP5;-06B&)2{Hm(tfa`#Fv2${4b>%EvQz zwsGZi_%rTzz4gh5n%NRr>OhI&58V~+3cmHP%gH_JQpEEPYTY-B3mF~r2anuRx2vGn zkXNaff49ts;>_fkewuF`Wb^4x1@!WE*Q)>Mv+XZC?x9=8N+dVAnV{X|@j#bc3isGA ze@FR-D(($JNvJ9cqPSqMnR3lh;{sD)Q4c0-rZQX1--v$@jp%0^Bn;m2TM4*eXT5HD zC6O^3A*&9$DO3yYTF>9@o+6`Y&1|5&0BM=a{DzOjwbCMvW)0H7B3f)ZX)CfiTYM_V zJS2+-%>2-^yUhf|tc+-E%Fz;3+%@K1frXR}i<2*ldq50JW8-12$Y|`UVcYq=_n-9j z5zXV`;u6Klga8yOT{(JFifI>+r1(xWrmD}lRJhiGTJzu4pu9(N<)P!;H_sl}|7UN;#` z-zL{&hG43~+{?ZEH0*uhjX-L|3s!>r>-yxZcC7J(Y#g93`ti4ebX#y}S z-%sbc6WBvKFC1q}o8#f^z+4&pM$)7cP&7JT%`CWm<*E~Xu68`S3DB{|7QKZq4)0_9G~(X^Fx)*?AVDj&}Ay9=Bd!#EPAZ% zDZx|kexcQ&T%#K+({An!rXaZ8&HQVi@jv1P?-BOd*2>I`jg57gh3yd!K;fJ5AU!vL zs;Suj0_xC;ra@E8o zwrDPjgD?3yEPpm*=hAv7i`V~s*Q#}w?H4oSC*;{G=uF_S<*UpW{gMC8mdI0YRxr|B zRf2iMBT0by`(+4E!W^a9dn-fc5&YCk3K0^O+eTtJpaLl0R5D+6BaeIJO=(bJoVhod z=WJ*)u)7Yy+{sI`>qw~&S*Q%Rr6Mllg*>XtP_^T$=eNM}oK>=o;h{68O>m9%OYwVp zLaKEBz5z|9yFvd3FWT@G3ZNb-DL*m_qBT;_MIda8ib`c3JF1aG4MB4--HwObVy~Bl zAuz~m2gGbXZkBM;92zS1H@56mK$!sSiyCb8ZEtVnL$|NUrUF|mhkv%-;XN}!`)&jU zC_<|=Q{<1riuO~>=i8BsrNkBQ#&7ja2J3D_xV!$aXZ17IpWa<7K661g9mAp`(~*J0Jz zqZ%^z3MB3yIzE}-jEe*QvYAgmJ6B%M`oFf$yk7m1Q1*5x)j!s2aVcm({Kew6x)cX% z1Q8KYd}30d#f^|=3`Pw7B`u8pM;?z*HUw7|ffg|g7cB!-cIU?j?UE0FwJ!rA0H=+& z6&?rE>3`L9n~#iE0Sbk5>ukmn zO=b8qXCI#J-Qtd)?k}V3{lwZ%mQ}1IpU&ja1_z2phKAsa5pHQ|zU>A?2}c?y_VQSr z>eIP|TE=3JIz3$NpM}y3H@+pOa91GDDGAdM=hb#tc%;C$!JvAhmHin9U;#xI7sv+Y z5IoJxAeiccU&bgt}6%=+90HotSv@Q=-x6~EcQ!YkNJ^`9gr58J7mty^85Z% zELQ-mG)66^lP7MjLRVLxpdh)Bt8>qcz+cfoVat?3ITT>!XEPqvXBU2798MJ8y?BZC zuUTm}W#RnS0(OZP(dv@xugdlZ^hr&3l|d(1Q|}6`UWXA`{}*B1+yHgoZBXA%NF&mK zq(*^-|Eev3xZ0`mg7Y#gK4oXvcSgyUdi9c=l!`n${wlgN6j}l+8}6FTU0pG{LLfD@ zgZXFnZ*@V!f(rQBBnLF`r$Z?3nw zHD+e6)b@Cn-mIEw*bJag+o3;NzvG~*y7H8`6YG&)xUecoCf&w<0sYWz^&8oc-wK7Q zm~s{>SMK|YUyy1O3Yji{$23JC`CxB|syYakIWD^(eWG(2!sre)DktQ}I;8w-N)(4p zscA$ed3F={yS|@iMh764QBcrr$O%IGg=r=O0{*P{ktkXrD-jL3Jh(w766z% zoijI&WUe*#e=C+H-1(Y4oK|lxB#0mHHy2||A|qe zv{3OZ9v5jj?aHdcTp2xkc(S44Q_ZfPl^@AXZAxN}*m@w#ub2ff?I(gE(+Yq6`!qKg z{`$vFE+{TE3&P#8j*Jff{Zlqgftft9M>pLTQTYwaRb1t`6*PEixe$B#gI9NMnsRKA zhcvG6VJ5}~SgfHEXbP+O7CuymXQK?@r=AG=LQTFDwkdsZ;#+Vwj%*inp5SOPthyR> zo3LOTUu#kJBeFY5Eg^(ItrDB+VwPm{18w8Hris0lottP2xyC1|M`MR|E16r#se7g+ zKK(C2hF^^BOF)5b7iXhoZ6onCFmN)cXk$?jF(*q61JpyNalG*fyJD{2^ACiLZ|9Tk z=>8vr%2IRNvcMU=%bK8_a@=Lq0+VPmM9VpNJD1gWX1xg_Bx&KA?x za;<1pY9p7G?dtE#Fx0^%}f<=*vOHDCnG@8C|tiGCygum2-bC(pFUYF8^@#Aa>f` z(pn8=XmFeK4Pc}WZMu?++{6+YV902fm~OH;XWo*>&-t^Hg!Vi_v;DKuN;AwN3aTQ9 z^{9?O0kVII`Z(K`*)zr{lN6U_mz?B9Ap{VZdftoW8ZMo9ETs}QDRrEEWwPrAwtI!s z_@f3QCqxFQpVDYw$c2g7ESyCh>ZOfr0R2$Illw`dWp@jc0H;K;RD7+{%KzGU-(bR0 z7E?5=OJ`q#VLMM(CNBhmCWuqkoCr?t<4>f&wIVPiyva>BqsA>2e`!Ydr$43FHf0w# z|3>Cpi?tqLBHLob!MO#nxn1qyk*!jS(wz(T-`-@o1h?|rk&}~awPEI9sJ#rvC`K+q ziAZvD8^7Q^-Qk?KrtYGiW9 zq=@Jr7>%F6!^rXKN@41fwp7i@>mkF%?=S`lwgHi<{34N^B1pxiRZGaIVPNI6fXgeD z!`FUmhCw>D@Ixfp=DcSe1j(wVOU7W`VPJ@9DR5b}U!tVMug)@B8_OkeJ5+ER;d5IPC#0zGe0j>`pn+ zL3;K^4R(~_jF zh^Y1@-+ze0JbaG}&rMPFt}E@OB%B|jPs~}f$;85zdg^f*h*@cM7ZkkxC~C$jsMYny z4aQ#L!lf($OUv*l>onoetBkzL#56fWswp+2)b1ld?eKeQ8lTv_A1zU+O{z#gi2 ze4N=u$KdDV*91!*clPjsMwmnFLNh0a+PI{55v&mC0*fD2W=nOO>(zN1*>^-)9n5ooeM^mI6 zl0RVVVzR$JG?)Pm#j71N<=SKG-;&QqX~cs*JM4+^o1})FsQRv9E z$elAqf4mmpj+%KDqlri3ikPlzyP^T$en|PKdhFot1d_7KdSJ~&E*t2(<~5NT_*ykb zcGlS~^tH;(&^Jnl16*r4!pDDdvJ-M(?ePJpBh%ADXBKo`fZV50ZfYv`!=u@RNnC3P z_XIW1ogXGt)H4`7B8bHkXKxpnTV63>w3Ns3`fyr&)AqEFsw(;5tzy~=5fdr zn?YGf*C^;vt!%LuJKZ-_p~?tZcqqiQCMD2X$p?wkAOnMFpyUW4%A}I0W%)<3LXW`B z!ePp+{qJ&g%gTcW{oAI${uxF@OFY3x*sU7-_zx1w2ORI-zJ9TgXm5&mVDQ%DdtgwI z4EXvo`@?MaiW{7KXfjv?-2AAv`}2atr(GnzE)B$EUBEw5=!_8S>?(ze5^QI)n*P!R*diQ4Pqzd2P| zzfO=G8EnJ?NQvJ-A=Eyyv5CS_&XNRY`D<#_JN?d!Ad<&#pT`4iTQM^1xg@&bNp7NT z*IRC=%>7Qgzb`7GV|p${860l8=g(Ry9V}OnbPbHD zG9|#=ztgh)YTXqcT_71-%UH^Xk@#nG8WE70me!nZWqqSjh6b|-qEHv3zfmgz|49t3 zgxmU}x-W)}>%5~74kq?+DUkuFGFiVH#h(ffM@4GOrRQ@<5;Phx5HfBUMoS=NVe@cR z;oPSB)nZyPXfUiWzCQZC5@UCeSX+P@Ewt?4sjP14huVKm_>frHVwo>f=W{a^ej*?j za0Gifq=p#w+ZNV$xEM3%`Frd^l{2D7NXIv=K(Wt!>YbCV%)TO{CrYbb$*%RXDHmG_ zJ&x*~t$ReBY2cG#V^^F%T)Wm&k|8%SBU`0t}^KPfW2fhruB{x>E35xYaca z8GULsujRZ8$yf=7u;4t8hf1%1*!np|j86^EPRKxbZwF9=t@fH90#_OH@2}2JfE5rU zByN1$4mh|h58zyp7Hi5*bfG70(vzO3hexRxi=xy_0tj*y(JSu$j41Bm23@SFZeki& zeZiZn*-*|}aw4j3g4s0TmoLFiz1U4pu#+DlS(pfo9MIVL6x=JuF^p0b%_T-K)j8nt)#Nb3Y~7LDrSPiPzaJNM&4rb6`TkNe9v zqMnV+v|7Tcvs`<^*bJ5;!-UHJ0S1M;d=IO2fuzF~I3|vtz?J$$GbQK_eiJiSMALuK z4#vXA^+bD7_bS4{A!XWzsLu0{Beg2HdEU%chseky_N{bhaKL^Q| z6=i2DIQ+RzBu;PxAW)_vkwzs2$LRo?%p8FLP=UvYpQ4D0oq-`4SXVNTw1R@spgQ6k z6w9jM(2W<{>f}1* z{hy>PoG5@dUovDQTm;wEGHiMagEg4Z5X=7U5<)m-Tg<*d(Z>+i+?NFfb>?>e9Pybu zLsJB9NI-Kp#Ir1yrI3kF%OW~ZuzsGn&O)*|%-BFmYtgoCv1bM+-#5)qWLmX5GaYQ! z^V9ti681O;!8TSSX)ffFmof3_-e0~Wp0X^d-K1Q8Oo;y6wWr+SnXGnT#RvI8B0(M# zGcnO_0~FT`q6J$PYT$DcP-k%=^zOC78-NObfqK@t8oLbM>sAL(V|#C6MUF{vyqd-l z@eybt(UF3CXj+bhSLu4#US1M9PbjSwdQVA@n=hnHZT@hbdehzuQn#&UrEE5v{+J7Q zBnOmO6d3P<${zc^0Ob!%+@Ipcz5PdGVt&_H9l3A4W;Vuh4b1U(cU>ZiSMK?8beol+w6js zvy1wdXrv#pU&qghQuJ|T`fK`u+1!ltQVQ3|HrG;$^W*2=1+57s2n&eYi02-BRG3q7 zjRyn215lQKa%q#9x?118FR>==h&K%~H3!i*B*rN2Dl@T+4SvNlD6p934MZIGimO*~ zDm$Liy}{DG&dL;M7?(*i8p*^&aKS_M;Mv6fYXKzJ+jBz$Gvz5Tn@pX>**E0nmY~9r zQBMR?>i4(={>Iq*WBm310o4r|r!5#MJrdQKG1e+({aXK%y%{1S0D|yU$8i----F^V zH_ZVg<12{l28d>PY{rqo5G^j@742Q8G~|1cCy*s6{|SLjx3*nU%5>c19^IkIS>+*; z9hb8saPqW}04HT1_wqBl5MAvTpc$;Y+xCpPZZSHG)Ed=k&ovC`H>x(#cMI^PBE$qg z@p%0EX(XO?4+uBpUAb2t$2gaVD9BxtoEHU;AU^H2zA>SD?1;XbHfxYC3@Q^Okngd* zBt>1Xo0&8e9tqDJMp?(4NVWqX`*}Mt+I-`Wb<=AK{>8<7@MJSwfyZzn(fh~mG0!pK z+lpz)n-p!m;i$~eb*L&zuVnc%<-y5ctE!!$y%gz_0X#p8eMPQfV*gh1bI>0xjcPNI z8mLMi5W9rA><-tk_iG1=%;>)@Nwwm*uY!E)enpnSB_DZp+bTY2wMgF1NET_2P4A`q z(R;wg>)!re`;8Tq07{tVhX6+y`=RijIa0ypPGF50&qs19`Yf6$hNkPBJQ=&&;QHp( z<$uMM2V|{f(`Ltl0)IKE$U%|zKX~_%S2%VC3pJ6@(lal~O>6bOOrK%dH)w2E?0e|3 zQt7vFe0F+>nM0irw*O8st>F2*Yp>fhTi@{u`(JiPQOET9p92E&$bZur5;@WZF)iI# z?4I93g@^4;3-<4L9Qj30*|Vn;C!3=HB$J2zg(ovh2sC!LXRqO-nRXz;|MC`h=yER! z$&as2-{49v$*HJw#_8B;rB#}PB4^wa^;k_h#6ZmHenrEi|AQ45se6I)zhDcxI&sz}rM^a&XLY_4!R5 z6k{cdk>>+@%&+)&pmom+z}0-*xN-4&tab+WlGNCEWpJaKfi3V6JCHq&XLPN?b@F|W zg|}D20G9?SUdE4F)gMbKiHd89Z2`&VQB5|MiVX<##$C}gNPJ#@$bgCKm|V_-UHeDb zv;A0$P4J!HQ;nj4ZhpiGze4mI*07H62%ES19ID%G)N4bSK?s|nC_Lwb2v8gydZPLK zr@@{@-Zu^wjq$#;QLs*D$lv(=13TA_NT` zZzMD$Wq1y zLw-VicRd-I-b2Wqs%R$0&3Gl)Eh33rOI)jnSr}!k zqFh?u)e>$~_K78l@cTA;-_jwGst%z`nI4DXZ-dqk)hve9uD`7;Ypi&C3t3i7Dt$0! zyBwI-%RzcW+C+SoZlLnC-0bP;`jV1Topts~qiScv$xPw2O0$}Pnf%W~7^#fhChZSn zh4mwPWvXT+%7)>3a_oo>u0Fa(M(##NNpwyNkh;cMX9I{|Pgc6H9xZXDnsFrGyIo^6&JM z16hA-1V0zeYmr&g_dm-ey|?@!o}_^uF8iiw`iTdpJy28Dy85;xr%~NtB?KuAosMGJ zTrkkrt@~o5|B}XTHh8Yf8|gEGH``yDL5@Q)U1+YB^nX`Twpn&T`QJjxgf>7*W||44 z6|O5`KnF43-ES?H&P>7qaw1U19HHTyHh<-BTfyJdE+52#B#xI3zcL5g_70`iIdW5= z70Z5;N}827P8`!*YoqGG_E&ry7?4#8+q4y6i5Du9LYS_6Epmp_d}tiPU4+3Ej@6}qzzSSI3vQ^se&OhSz=>;n@1*My3S z=t6*13mIo&0_fgg3@Oavu|l%`{%Mqx#MYTLqq%----#r5Meku0_4kBh$JHqIucHhc zUK&%yqo38P^3*DN^jVz^RjBh5sK2W;=lPFls6LM%i)`qCPD!M$&CZigi6xp#zV!EZ zlTo1C6%wgwiU~^yf)*cYr)I(6RQH|edSBIBvz+$UCRHcr6KZi?sOA;x2|9@*uqtdz zhVHi>=zkk!8HRVzZ8hst7 zOw)=%9XbM=unn?Pq6wc@@w2TR3{7WN_?$&QylN~K@XPpuk`5n@hNJ){dq>DjQJV*` zQ@Aj5OGsc6xS*ib7*i>`z2wVcfBshr^y1${;)#AI@A{et=60ppPmVTO?Wm2jZs#*w zmGpNdAqQ98u+J92H?S9JsBchEG2kbWzh;3V|APX;4+#IJofZO23@7dRnvpI-;9Av3 zzSy5YQ7b!)@?701$rC9OW*t704(+|oI-#S0dC>e6&oMglv0o>k2+n8jtm&*@Va>d8 z=H+>AyNtS>kjf6IQ~8<{;aRRv9?ny#0p4EUqPLN&A*gFq|1$CAl>&X;z_oXPa2G^v zoclTtc~a6DmxSDm(#&Sx_Z+lJl??|nkcm7G4o@YN4f-;$?xx^yy)V!qt5ioR2$h%B z-VAzu+w~hXqQ!oBM5?AJuOEb~lXV|Cp`rbp&ict@d3heOIGz`*uE$2`6)#8cz6srw zIaq!x7HF^6o)SrAC%p~=)|P2zL5Rp8Ekf~3qq{HUwsPy%6fwc8?Y?l1V`CR^j>dCN z!Hm8XaAhd$Jxo>Q-pnQ8Rho6X*Sl*ht{fs8Jq{C+tvjP~rI*x3DYshgCvxl>h&uXP zYU;!H&llON++x>{jkT|vWt76f#U@be5)ZfK!;hq}WR>tKBIFM9jK{~V z){@eTq6$fV&+CN}hj9(ltXHiMFLH$_FaV||O+97um#uJ+2`Mr3|mvkv?Q z3zrN}30x}L>RI_GX*mI^de!xHEIxUF8p z(zZD$btXz1Rq@scsCYY=$&bS!cHMbFxz<%U)#;+YLzi?J3|cJ*gc=0y8b4_gJCz;+^a5asnRrY4h%N=xs;f zfv{>Vo=eWtH3f4}+g5L2OosvoAZWF_?2*_8*7E*xzuuRZ+;k)!IoIw_cbmF&L80aN5qamzsGlsAbC+(B(Uxe;`=8eFHP|<4BpxwJ%?YkP4 z=55|W@oMMtUsv+VE4{_y4|Q?()o;F&UrVoqywkucm!2BNX6$W;am)NpCpA6EE35Ow z)`f3uRnLX*opDF=a%sJ)aa*;brA?C=Nol_a9ZsJW2-sno<8hj`&>5&&d+L8U{ig7F zxUQk>c1Z=lj9pB1s0_DBvEEjIj;Lx{1OQ4MUGU%XZ3Q`K173&4x!G~IrdrGvFpTq@ z(!eh>BQ!Ya+3o@wk^Os3oA;oV+N~{#7>(sx+`F4q5=y1kR8QeE`yJRN|7oT-rjIx) zbLSo?f*xB@i8LGznpludfEt0?0w}8#<=UmVGhWVEi_s=x`K-^A8`n0roJhSC`#9M#As0ghOox&o}$K z+Uwew_J@BSV%u?}7j{0WFWd&`Y!Ll)hrjXp%njMGbXH_hj3dR=&p?*c>itR!Hl>Ew z`wls&w&V6)uQ)JN#^*8@_ac45JK#oCzTMNv`=0-4-;T4!3DK&5b+7f_{WgceB{2=e zAx5lv`42Fu$AX_W5%v?8QY4$&8h&jMZ5$Rd(iK7}whrGsZdAC{YZZOr1aNZ6@H&uqb zT>$*hyLz)eNz4V`)re}u|M`*FB%T~}UxMRl+J9cB!}1d<8|!R@?j}0*^S)?dNo(K4 zEBc+uiGOWv@#qk?5TviP3Mwi`YU=OrFJHj^u&-n6j2DNE&}dN*$|%cZv^tCmQhQ9dA0Rns-8(iojajL_Mn33*jG1P zfZk&-EM5ili%jd+!ni{Jgz7XrZ*qlFuA|rslyw)3F@#S4+^k98d>(I+{Jst(%gSfl zrid|``%$zW7dHCo22tYzo3*1MTo~ZS{%J;}qGl_t<-R7!rQEzp*;kwSk8Cnas(1m3 z183+na{~c;piDqi^plzPFfAM?l3ulWUm?q#l5ERm<63rAby<(?-OsNpA~5|6K%i6` zrpFA^QA2_S5V}g;WjAqJg5zuY)FBcst0JEYnzeC%r}CIMqMlKJX;dD$< zQCRGEuMHpL>1c{ey-j`h-j2VCqtuAKp`Mfp8CAww3Mnih7v?rnb}R+Tsehg|Typ7p zGQj-7v;LUC6dJ2re*lk`&HabTg}tTq)0JNuF3y{gIvQy-G@rW)hK8xHpb16AD;uDw zwcou|wF7@+xqek~z2~#(EDkp~W@?xftSZ-!YPELOZkpA3`HW2P$)7Y1Ss|(ynUFw# zC-~AN_ZUgwGv&5-bk8m5Vz%OYU+an*O)GnqvJ=o;sZ~MKarN!aoxKeoe+795^uYg~ z-$0S%QYHRrTIp_s5S5)&3!cskyu~KKiOR;0)KzG%yG@4y=Ln#UrQP9 zFDh{K`lErym>VEf(5e7q?{GMVj=7pT*4Y<2k+bxiywDQ#07`>Nf!i<;r0y}oUf-!A z^%f-HN@Z6!97fdF$rvw|hfB{kdtEgc$4K^-J|A(nfNs)Es}Oo$_lD{j@CQ!m4wnIk zR8bw*8Q!gr*__m};<%CmX5%;Kr5zwjse+ht_!Ux8s_|zPMasWu>{SoiD<<|A6jTUl zrfLRri06)xAQ67+FF=CpHdnXh=pN%%L-C4tDc9+w^aYm>#tPr(wkI_Q*#ZV$+tJfn zzi`WoPZE1>@n{Byacksh;U`wWA7)mjd`Pa!GFU#sNBhMGDD%j|o@G}ry2T;({QAVi za7wk9rjC-&_< z_Bn!Rui2}dGEE>I$bWZPbKozPX}ZyzD_!x(JVS+)r6O|*R0S(JK$lZlD&$#RZ=LZz zI)L3A48l(O{%+LQy3(^gdey4ioqazRIosIShmo{hgsUmuF~6Mz(7VhqL?Hud7&O9+ zXV|9Yrenh-eElFT^4b5vN3R)Wl{RmZazjkxpA)wW2CbOhAX1q4(2F9;dI`>>j`W+E z(rUb5MUD)fsFx|V!ZVr~p?-4Ga4T%6YFSgNph_WjL?Ocpt$816;CQfIe3ex}asp55 z4^r@ZxL+O|sSwZky_59UzT;Ps_vfmy+~VBNX_pqhYYiQNT0VE5{3F9%+y8t(N7eEx zavWZjYzj1cpt{8FytuhXb$zHbO^i>w!`(C3lRirnXRK;Htmp1;v6G+A z2Z=5>VOO3y84AA~?`;`6ZSDNaW4kV7qgd4=TJf6W#bM(^ko`&5KgpkO6+-S$??kNG z1mrL;ESt$sXC3M8NkLF~Ja0iFn2wU@G?Nu^ATCxE zNut|?_pFApNiz7ZdpW{5BXL~tkt9sg-T3ZdmPRrJH2od&Kk>gct={x71g}sN4v&TR zXPU!up4?7WldwD85ABc_KF58CV>Q_Q>0_o(GGSajA}TT-9p`MRMMgC#>IlRXg1k}C zzT2`vd4|tPoo$^Tu5QeDW8bfDfkyq4&H?PTt^vfozogw~+e-QHhB9u;hcEi&NI7dy zdd__W@y~+%CeYnjsgP-uKVZIl_4`aL2>FP6TXwu7OZmqJ;d=xNUeu!#4FLY?=9iYU zyYxC5-mGD%7LWMpmM_TwUelT409puzKh>LraZ1B~Ay`H1xiez{Adv0RPK_D6{IS9OJE_G%@CFMf6?c*tp!-N>!LMlmn`1H zgOWou$NcSVN#o5`(DE)t;p-j@9d8q9)loT`^-d*`Dgp#XGp|(fD?Hm`@B6cH44mXn zC6+Uu@823p;3!$%feh%*?BO315p<-&I+3{<7-_(faDssU@pfUvLn3r7k<{Q)6U12O zu6%{;0s8%Hg6Z*1!*VV0G{3J8U66hA8FfT#I@>6Cmo5GJJ5HnV;K9&(pJ;vQbtC-u zqwgJp!n>!mFb%Q1!n=LIfSPe2enNt*B;7!GBY$B6HYmTKpm8Kd>{CR+zN!CEah;C8u=n2g$6!+~%l|$CN+z@d zKDjC~6aC9T?%F@+&}Z4;lKnp}ODKD#xZ8^iR6GMD*ew8TfX)%c|D#=by(G=h^Yys+ zK1HR!CRn|D+MRnoBt0Mhw*{>Y41ys-U?%@10*5Y#t9gblRdiD$qY=eH;YMQ66!xPWJL}NPW{!}nhXx!hvL>FYc2L@a^Tiz;90}r z6dDu=vD)viOzpV6KEUB46iWal8|%(hl-tjKGS$}?D23LPRMwQ7x;yDFbMrDHd|Y|8 zuYXgcPFZ}(`9(tW(3hxhXSa*|^g&ZItw5f*`N&dLmmq3(oJAX$bkPDYaCzRT^3cJ#UsurDwS<`7?Ha zp7dvq{r}=U+MnKCEGD#nebKOe^uDND605Gee6B-4_yB<@^Y1tUTBECudmWlAz^-wq6a78`H=I_xX!vjglN?>pSiC!4){H7om`&ZK7b!9B}Db@D(xnE;mQ$GDk zS~~tWmebev_V&@y(f0)y)*kueU8n^ai(pkK(>Jv-!V*SfpBCCvOMdLtEH zP?LhsfzBI};J6@Bjq>nvXS zKs?&+esu^vbqe|Bf3fkKeQz8@xlg^}PaDB;k_tZ%&ULwt^31Q)lH30lpvW==AhGv8 zGcYsJH~q%}3B0bjJxUXy;SYcERXopZME91LPATaW8?UEYAF!PqDx1qEmMdz4=jyN0 z55#~9+fHsBy+6_395Ip)vhEq*YHx4^;$k2^m4qm*VX<+QZ`PPoK*5bP)LPP;ky-q|0x)WV*XtfoQ0gF z3@sYM<;^%IJoYdq3h2G^kD8sQiEQCY>l5&8Q2H>0Q^mnp{hvbhoY_pp3_XS9!Lu8qR*bpx0{_A!gj87(Qq+DDs^QBdk8|l-|(0Z)pJX!=RkDAIauwJFPI-%P-ZQ zhWOftwG7LWf}7Y3YI0u`KCyXv@V2{@kd3}oZpQ5z`hXnUYV4W=R}~U_CX;?Xm=RW5-&wS*KzbF5YBf7J0Or*w@Lzk`FY{AYcvEZ5|k z9>Fa8z~L?HI=wKduc)qLdlZ^PlCl$j5<>pCT6Fh4)^@_rU$VR(gDSlkApS`kW-lq0H^KE*=73W* zwm5L#({+ap8FjBhhYqRp1Ov$bLiC*Tr@1=Ym}pr@21=Tux44XcfBh{DYX$AO)Q)$E zO5Xk2QA_f0Mg@nDy}Y8NYCv4T2xa*1oJD=99%*12OXZJOGZ?dusl8`oLdPRT)Z&Xr zxrSy#hSJ^MZ$jLYnQZQ-+>XSp>F5oJnmyz#L3X<4`ilK(W3^{s#be;_w=w$i{>`aU z-WhiV`+O=6n&bUprVLEOCFjlb`>GRiQS3OT>0Z~a^}pHiAY-d0_I=JK*{uW}CFA>Zng9B+%bH zM9t)g&fn}s@IK!kUmopC8w}4oPO!Y|PJcJ&vas&Z$m(3JlCD3-y@I4sZzm>O+>gwu zDC4-q5o~pFw^bi%PbmTJW`1Au#Y6kjfKOe^ZJoc6Jqm2}OEC~w%VL!?if+Q{6~SLQ z9r`<0n7#hHV07Eox|X$a={%yRP9faoyv!^W+&U<(QMC3mHZ(rqrt}PbR@fy(7kz3Z zcZR0Py!_c(lS&gT_R@zd`>eTmSz0ZsmjPQ2gH}1J>7H%_u>X_ov$)h4G~Lzq*yRfyKHv5uoJFx*AWLh=oQrYG7}LU9Zi$m*w|QG z%j4ht&?;Q4u~&8!H?a%#N6`Ml?B$Ua09*dRUxJ+`Q7)Y%Y2bWmIszjCk%m~buoLZo zsG19amvmZG1G~S+HV^03?h_dG{Vv`eH;CDaQHtjz*gs6^jhKPu)h%w(x)~1XV9q;f z#|X>|)hXO1-FFvrFM{P!D@eP4nGr}8BF1vdInaUflXW>-Sz6fAi;E#Fr9VE-yLNJ+ zQZA#LRR*VY#%50n_=pyuBNXdi@?}6izPC&O@XbG&1n)5i_171aKT(N^W*6YCB^;Xi zpYVsWQjOhW5l?h*N~K#cATk&aw9=@V78x_2eR}!IA3ahUjeG_cc`hm{0)41p8n3l* z_#`b0_Vg5hZf#QCVo89Nxq{L*KS0!sTc{rO1}|N7XW0piIvfwW-dFmp#Wl|O-w=2K zEs9yUjBZqi_70I3hVV#h*;`<%sAwXZ@Mh3foz2+F3}xhBg?GW{v&&U*vg&@4$|s>H z_XY~L(ehECEji!p&Ct%aveQY^X-gMq$mTmqxSx@nm)xM+`D);9XiQo)$vdiYtnuL+ z3oxbOQS;B6&S2=XThaqozgkq{fdMS}!=%yrNM8L%RkWr0k!`Q43n1heLJOZ;46HU_ zBh-neYreU;Szb1>aK+rri4u9pJ?g{+Uw7o+_wuciEm^H^E@Z%RuU(&A@p5#4{ZjY) z8jOo6z1A*t{>$f!s-wDZH}ir62lXW5XuZ^88ked+4x3V$ofI`T7y&lmv3opX z-{^4p##39KNy)tC6!%$MA^JCgOWNS7e2VFNR}8^%AHq-b1xuN6sER*(@4~oUan`ZJ z@&%xV+&Ed;RG>E1SI{UGSV-c=NZ^`pEq81Q_0w&t;?XRjiOj2=k$7>A)&!*C5f`1?)P$j$sa; zgm}dXt+dUpH}TTQSUHaUKXSi37cC?9OZW1jDf~e+b8sD;1`9o!pwEP{8KlyI3W>VZ z)Ku$hozt3E+5e6dx(>!bges?&) zj%Q4U%sX`FL-ThHUH>%wx@-)TX$zdf05W6Yy|>Kc8B zP(}JNS9VuceWhHLsTNDR=_i~!>6}2~5MRhMCsGt>w=J(3M53I*xoJ@mB$&a`N!TyE zFBV?!YGas%_;vRgz*v!$T_-am-Z}LU2Y(`++ATW@=(>f4pj63f?@{WN1ExDaDV9nA zQ^-?G#^qZP=o-dFjOoRk>f^@eT|)c*^`(cq%UII&B8dCTD>t|NY_!;&7))-{ukii9n|EX7FjulU4 zpicW}cFh%-r+AwYZ(KLJ9cf)$Y`5H?^~UK`SjN;}dVR!oDG6ya>^l&8xcWJpzP6jJW9nF}@%Aw%r(PTi` zENJXWXZ4v@^T0vxOkv%n8Pj0f?E-C~`mG^dceLw>^^Ds2X@V2SmR>XiY2vPQduL-ll%kCziM*uZVg{ZSuzllh}W zp!KWdj46+gjly`p!|cqz=Y~31XB<96CjA|uvfp>diE$PUSY;qV7$PWUttpMsf7$OZv6HoWp*05h(t98Zn=-1orA zeo03(6-~mQ$?Th5ffvH>szbkZG;Ds>ca+$>Hu;ms0uuyYNfl1h^4?+=Ws?A_vD@5e^<;UDR?^|F*mjZD@}GvpNh=*2 zrf+Qj+D4bekCdGqvgkJeY*!2P7fY&5yT@VoBDP6gS%)9t&WZlE(!*Y#f~j^OvY&E< zk>>nV!C^bCTn5CPWKJX0K?H|KU+9|iXfk1M-Y|sOPnQhd!{qW@lBq}N0Bnno`^lG# z5BbMK*F8JgYO-yAQ`L!b7&i^J>s>MD;cERkjh67Sw=zjPVGVgb-L~5_PF_D%MtKG? zzhFeRK+?agKRC(aBRnVn8>0KS`I-C6j+3Xl`YzTBf-=2+*Z-ND@c%Ue**QKC^YpHK zF3)P`m&g{yeg&;d#|Kz3`o`_!jLE`ZKgAJS%9`T@i(8&*=vue7xX1sgMgI2sbtanP zRzn$?*tm?A54`M~q>}Gk=aj;wQhxcwTLLeIh<}K^-@mKi{JZ*Pv zdzU$`ni|9#EhRSl*S2VCQ+dZeC%X_YNm*%y;WBilxxh`~NA+lnAOts6 zC*tlR)GK;yV+nANl9FwU8M`rkr3{9UnEwNbM~e4$4u|DMalJ0}?2aUA=&(dvagmHU z#4;v)3)Qqb6BgyRJGbj#))}K|#qWd)O=tJc*u}>59*w%{HTlj9v*}ih;wLyhdVFCa zb|7Fl%Pivy8^=r&j`HC$Wv=Em6a26lAFCk*U@$Fm1Lxt6y)`o59<7~$P`8@5Cl=sMztW;DH|HqX2`@Yq z?r>_@kjBWqpl8qJn*SSqX{YOH{*U+nTk_aaU^0U4(0p=PnJSOmyfihec~A7gUg%X7 z0D7|_m_|UP_yO3 zfNutrBF4&7zbv)X%*cuQ=+B$W8MbDhL&xE&OJZ#*Y=* zN`|df-vo2+67dzmS5@6KTi~&j+3cK>0R4Sa8cNt%3C$=7dG{~u^5y$x;7{v{i z-Iy%UB%=UkcRZ1$OC?Qec&oRhUH@=AjQ@OzC}C8gYwcjAo3+!&eEf|7Nr^pvTRnbc zr`kH$Dmqg?MfOTZDN6_r$$6E1xe%zCB)PhM!N(N>AL&8wJDsPlp;0!j6RPL{9F(Wj zXa4+X(85i9=5aAPJc=YV8o&4U(b$9WErI5GgG@&g|AwN^{tAYftqv}7246;vhLgQ< z`hCfbtHK+XGqQK0C`h7d(jEofyhLF~rIn6(8;)hTSuW_tQ{sdT9g8YNkILs;m^O%_ zwlROPv$TCV$~`}`J{w5xvmOlsdx#1?>@~ zfC?_HaBdQA`bCp(C9Lw}n6$I!$J$_>BhfxtUo}fcuE3ykPaYReR!uX20-7BIM~}tB zD4y^ z^dMq$1#P}Y#~yEH``qEz3$@Y6Bjxwu=(-tw9i_!c4CQzm>@HtJskxMN)S2>NA9ByT zWB;RXcKd!gRA6-U6bQtocq96dK`ZKKwE$@uYU!gnNBLq~8Ol;KpQ)Kdkc^*i0n&2A zcw^3XqNpQe@GTBDQ`Q+~e`)QKmoVg%N6Re)#nQM`2yrlXJ8GH!wI?$g-e{hqUq^~i z0v~|BGu;zy^3uB6q=Pms{wv}G%;u871jj!CVj9yL;t~MI(S_Zi_`Yf9ZY_pX;V14x zf_BSybw&9cl7uh+&Qg|+G z*#n7+W~+ZnG+>l>m?U)l`t3~_fVWTFrH5R_oZH@tLUSqZ6}Bt*F+Z?JkQpji>P;m1 z@_kw85q%&4%bp9TctjBT^z8``ZtHK|Azk)8i}u%RZR=(ZCo4DOS6QTYB4joz_l7k89aV0odE$jb7V-RQYNBP7wklLCp*p#`@|m03d8rE)yH)ItM&%h zEIAYdux?Q~cqR4F^vygd$>qVgL^9Q6a#4MCsphkOn3=F(UO4b4r;1|UqbIWVIk`3Y zMWC@t$$HbtA{JD<*;n4xaAlSmZsix15Uw6nUf)jNCBh9a)nx%24xA;M$~CEL_&zSI zrC;U*Xwa_X(lRS{hgFNj213mSUY@Y;k8l2$bgzHVKFdf*a8%4zX_SZtt@PWE{`V|x)c2tIR1@~W;7<%(d%m=J-!c*|F{;@Rv zC8iMX)7RhHoYXc(K2NCp{0*B8qCThh>`m_*kK6Al8=nJEjyj%SzV6&c3^wZwMB>Y6 z*Uu-KG~XoX{JTa{*53B2smbcO$|uq#k_tqQwIuRkgtv-EYHeRKM5+L=)uUq z%dSWGKFt;Vi;1osBcFpXi!Zo7FNCSt1izUv9$J&{Sr81*KwM5$)S4H?uX!MFyaU!Y z)Q3+T4}pfhH&3vUuNo};Xm^kj<0v`qby8lTpFPjN;|mjQ(_NUGv-FIHLm&080@<8c z-yas-mx|Qg(s&hGT=4XZly(gOVJ-C~b^_Vs{m*C4#S}9j6sv{PZ{^iz) zjGRaMY%3@azDDCjf#(!fOb`|azK)|umiONk(Z6RkpS%8+Br#SoGksHHJOr%CQ%4J8 zs;opnA^auI521~Pp49((SY2D2Nc*pfb`@>fbjyRumt*pYcTcKi4pNL1Gw#E#2*vGI z;wek4c2@TFJ~PvBfG1od5B8qGstZj-g4!wn{`_U#nRHZF30Te~gmWhSYp`O<+d#;R z?ipQ1P}E08^~h^$hG4+$K#!ZRVxN-4gaGZhEB%9p>hmuZX&kBkcpACbU-K7B%n%EZ z0U|jxE`G4eJ2*AttCd$W3b|!GY{vUH$r{^gU!}7_57eid4ZV2*xQ#$hx}Msr`}i>QiWQ3rjT@sD6Q=#6a2(O z(tl4NGL2G{_hig319FTWGoN%Xm6`r~kx2v3T!>g%AER{rxVt zhh#zOCrgH4jaO6X`+w1Al42=rbeRIlV?IDmA(K6~OI1GHjE;;rSTxcrG|2y>9RS(kny31$91V9wZ4 z_b45sM6kq2??-yXH( zG^)Ry!7>nEYW1s2A!&qk@9bPtV>kv&`oZg^M75D?SNL!b0dW%jOK)87>GS^pyUt`#3n;vzq zSNrb(yt+33b@LeX?yLtp zPwq-1?p~}XLii@&sO@d)upN&D@8iF&JMvJ%@*VbfVId+S;vF17Sfj{HWtotK^3vx6>n0RW#tImvwA_pNFMMtd3`dXmX~OR zYhq7E((GVx`$*SGUta!(5e~1P23!N=lYaDP_v9XZ{q*Wy`R@XVbyayqB=zauv?;Cd zJv`&8Yy-Jeu-j$13E-Euy{<~>P4+krfFP7V%B~sztrv2%C zegvq<#j`MZeI0qWoBYW+%!pgXrRDjhWtP$hI6+r6IL}>Fa!giE7}>a(er;L_XOe*} zP3=0Fg@pz8!s@LQYIOY3C2^DVmo#GI5u4d!B23pdIv_2${A zPjM9F#r?++?^`Utjm4OBD5m}&79`jfUF|zG5#Wu8`|J0M0l4J4ugo_yoxnc`I$|(7 z_DCWLJ@ez<;i%xDijPzDtb9e0>URcIo^HO8#SWu`P_iuA-xfvsc!%|!AQ+z=(wCx3 zX`6lozln$S(H$KrIOQc2&%X^mVypV;B<@M2{Oi=<@UFC+#R2StJ^0L8aNp)}x*z7- z(N60lsQU`$KD+BkoAVQE&4(z2i6xylSLnajAX;t zHX$~tZ-XuO;zE&wA8BJgM}(n;4>WoSH3ThSaAF;wi3nT#BX2wOIX(dax$MLmx@LI) zS4X9P#?6z&w0_UZmLz=0o=BDJkl;nr;$Q05C!nMj1flE9wKM67WD2tnJ4M5zUMj3` ztT9^AY+Z{>D#^nCeMh0^VIAmW`yte3gc6}us`(C&s~8LhYm}1D?lQ1CjRnCnp(0ex z2IPMY1D>#KJ-G5H`fE~LPE$}3%SGG~L|k5UuwyWS@?K*Z1|vVenOh&eSqMI5q}_9h zyN0$oB6VCIrB(isR0)LX94ltRW5*vsnDDuwxS5b(rW2Yv&CjkhbO6}RJVo!G2~!^A z$H~$uFs~e2rY6dBAq{f)Tm;tl9Jcc=SqL!T&-u#V!NuP})1XdopHlj~Wj@^RbQt@- z@W*L?htP9@_I#Mo(y$7i?Kyn>=IBW^*)Hx`Vs4-!hl7wu(u1Llyuz3d-5BoUPFi;R zv(!yb+FTE8i>EDE@cSRBs{j-ES1JlM!}f%o0y2&^bp4j5&Zz>ZrCfN80hJ%9KATqs zF^^Ph;)ozuiaeWIcXuI9Z^Ceb$BV1=9+H*jw7XT9=lyv_D^3%7=sdiPO9~H=%uuGj zTK!5*k=@Tvu;TPzi!yDuc@Q?d%o^u^Y}kSj8Yg`~0|KsuTtvrwYgYdiOg7mVQ82oC zJ3>L{FMN1YqaYhHi6vE76$2ArdZe|j=;Cp`klc1jIit#CBwD~$Lk}qah%A$Vgvhsm z5c8eM>XYc$KGA4-qD+3oxbzzglP!V7X{jEva~m@YO=ClmOD7eHxUqvk&$jVZ!9M$%`1S1I1l%JoE0i- z`0QwmR)49GtH`U)Bp$<-;x~80CBGB}6@r0rO{o-vMGN7um&R2Au+9@Ez$>V(QVH(6zdb{G?Gr3gwL2b5g+gaWE3vn`*=HNtp!&Nr zEoU{F4X&??i-}?Gif_}&x82Au`y{$wVwzUW%%OOvH|oO~VEMe#;+=Bz3XeTg_;^xd z4wB|IdJHrxoi-V@rnDkiYA5k%UK(tQ-4YsIVR#&?Ws;hCFPHoc_|4c-YH9ufQaCy? zC&c(~4743Kik6H){~{L{n;1*d-Tphw9!VMey+EpvlrGyf$;80}yDZD|Ep*Vw&1e_F%UuuK~c*uPh zj-6~aBuPl=G}uneN<&I0*45P5a6|FJLNizVULX?B0y`78OB@kcHJdMSbW>8XumR%Rbd8F;_@9s_6KyfEKewr@C-UqHfUkd@=4Zuf_f>&S>lM}r@ zDlBpgSNEeo9)Vj0E*jWJA5O(Hj@H)W`nTZ4hxliH8i&UX+oJ?V7RooPY)uAC@e6%| zIwLw`2ZOH*!Q-NNwBd8I;0q;hlm-%&$*|BgXsVPLb%|2z*pR=V!{(x=%h;PD+jILd z*eix?ap2L5Y)_mS?cV3TGWhWD@H>N4q1qlDZF)tO)9w{H%MaFv8aG7|9JA|HON$kb z&#Z`@p}y~wYIo{?zYB$ad5wJYdO0=2B47dI;dba6k$GSWvt7CWd923f?PAhL@GtqC zCWO{&AILNj*C*qL?rNUa;n)D-M>XS-j+GUQDp^47yVX{Q9==>scZU8fF%IoAO|!zDa7WhCR8bZ(E2H^!2*;u~?4jVyR^D z->Upt*LammtkSLZ$BZE}1d7<%P;76a_Q!UU)5VW#@WS!eiO&bIC?gP)1-cUV`{bvU z3Fzh3=_Y_$lN+D~4KvbaPKdz$g7qsQ6k4aSZlLB=8Jmg~WusQM zBUM8^=CfYoD0t#Hyc}mnDu!#Fj*HAHoE+Ld{dB zu2W+tpT=2Q3LC?# zAM6acakt`%>pZXmB$f!y1w?6x8NR;O|6W@xjBG)bUK5yQj^F(I0$g8D2P)T65RusN zFSnSSgoR@C94D9w9uIvAOAKw9>tA|*O1d|U z_;*iYT_*B(!!v5g{?h~B6T7;lC@QO$@Q=GVTussnV0s`?FPL;ElGQ>6Y_1|h$G`x8 zQyrA=eGtZ$?;8$t?z6*Psu6%a(}5l+1B^#%L8s8>=D}QvMwX)o zDfC3h@4T^jx9k>inLJ$USe=NR0@6RU^zWfjOmPOexEm|3OEofreAJ0W1(2fv)pog= znd#4f#`249S6yivUv(ST_m#DIcOPkHZEIs#4&GI6Yii9JbflwZEZ(tQp{HSyt1EYT zduo}mBAU)6z9^sK$frgUb?)*43EAn$dlWe9B{dFVIr#kA?A7*bg{?eo+;==&s(gOd zx3S3KEdI`ZH!7q6+!ea}-G%V`-4?ow88l1+&4wO5ufN!{g7$ULN%sPvgTaVI<~pdN ziff2*<-!q<%v4y%7NN!i2Q-tD^MBFyzPOy;=}%T&+Io>FgJ&>GD_)wZb~{QXZ>mk5 zEa-o{_90*BIi_7JS1LkNpg{8Z7*@W(q)38lswtWP1ZJE(E}<(4t$a(C$|bx?!(GZ_@rX-0E&4?|I2~GHSi>(Ii)Vqiahx~eq(0Uye5%@| z+qWRKTcB$FyX-#=iJO`4z>u;1qJikfy*oB#FcK189;tR7HWD941?7B`yGY_;Tv0*g zkpw+4)&+XQ>z+ELLrvaRW_vq%T_q>thU(_r+_V)M*jB_A2VpJvs@_df$6Om%BhO?+ zw<_j@&4x4i<@Uo2lF2rYdkU00tNI)ceb5cRDRitq?Cj(`IF0VP3%mI`0dtI8qP?jk z8R>On#}AC&F&!PgE2J4qv*hQH`O=%7TK0%BEbxr671N|#cjm&k@mU^C)w2u5u>t&h z;rJmtO_<)K{@=f&U#*Vuly-h(D5=nfjd5kK6dLSJKaGt=yBe)uq67hp8Xki6*sD>q z#i8tpx8JWS7S$DT47KNYfp(A3Wf5CJqL=5k+>@TGiQd1i?OLJ{GzFb@vNbU?pZ-%% zK25Je0555UCZXmuBLl;7`Z5CVi!s#il688AiATirT0f}R{Hn(wgmwqg`hTGnGT=N^ z{A=1~nk-tF&v(x_e*z79X|KrosamrO%8lPPM;Zj2!5mH#jld#ZlG1OpF&DzuMI&dT zpp67e1T6S&{VFSXrlP3Pv~u-J%%2lp!mgC8j?>eolYuVleQ#Im8Av3@jhKXY zSaj-A!JlDkY~Y(yt}4rUofXB0ECmstcbtl89U=ueR#0qmm`w1WW3}}$|GZ11bzYR9 zeV>-4aj<7d7$SsjAA`rY@v<+@Uw`W9!{DSp8-E&N`o@!33ebWA{2BON9>l{Ht21RIEQ?}n zjn-s^bvUOWcB&d0EgV=DIiCD-7}W88#wpK#sA#--=yjCwoLYBHMS&E`1asV1GWFwi zTg^x%aQDjLEfq7AbGxT)pKRQEL_@7?WwSin19@?f@%T8r&gfeL?@uz7F=qd|;p-Aa z>*J&jSK#(4q?41hYh7R#$4ByrOpLH;d_VH@m)hgHpC7QpDAwGQL;8Gi@Ftn#)Ac$% zB(tl%qY5t`1K*EIQD&T|o2i4CgouNEhT6?eClySX$^>^IOSsQTqx-ogyIBM9GUq^t{GUiESCrh!! zT&gUM@jBs5j+vXB=j!%0_5Qsy0fm5OjhV#IfXNJc&4=!i9n$Js&BjHeXshV^XM-b( zrxM2xRLs=q2u7Xobx6*7LA=CPAcgeEOtYTn2rks~9*bS)ENEyQw6&;%J2DySF*K8B%c+hFEe;63J#Y z=gNIr{q&nwe&nCwT-!}Owcowj|9~S4L3>`)kM-D1Ps*L*Kv!hpXc>T*+t{(1R@jj@G zM4Bn&{UpdRjj~{kt7Xmp#Y0gcm6m8(S2S7O7%vBnFDsa$DQ3vfPQa5tC2)wdpeRdst0#y%N(bG0!H(yuHUGWfQ2pQ;NfWc{6 z$3IQzIT(g~jRuI|Xw_@wt>0ylj}Hv-RwNr|j$zx3}{3wBZLq=!=R< zoSEH7WrOX5-%*H+YzJc8cf$>sqBVPMb~zNCET`$XgcZ|bM%~Covu4L33Gkj%HF4h<+J&bKuw(52%p4 zc^(v>$hXqtig`WJ)+yxepVk5vnOkE`56FPu+zS%=`a;4+f-J55y=`I@dRY_T z+Hb(#Xom!7zU4IrXA*gQ$*v6G%0^gzpYFbkEs*IC zOh7ffnDhc&fPsH6PB-m)Ldw9G^wN1iq;0hx|3UNpYr}Ewr!b{Sc{)}x*gE0Nr7hY> znyAD41@GfiBKR%!HPsaOTziiE7#3M^gn^)eFS?%NA4XhGeRE(xNAduF%5o3;qH=;g zF-Vq>g+QENT>MxHKQ-z71bi0A)zf=0I!nmnlLLEkD0IHsz1l=D%;Nnog~#uJXlF@3 zqdUF$w|88(1Xp{CP39d(?X(u9Zmh$f>GNPx1s35|C;flBRu2`&$z2;Pg0NDd^Hsno zS0AtKN@vW=;SQtU^rKWiqhT`%@qWpMpFw0Q78w7C?ZJIWZ%!vyI)sP6mW(r}>^%gR zENh8Q4oYJnc8(WSr9Ph4K?DqzW^B+FjtM_sHn%i-SyIUGe^#BF9UbK$T5=PD&{9R( z8<>DmpZmF92fs{E)uBZ#Ex*~UxCnV}c#NlkdGMk0jILyF)!q*#=2$(C#8#=q_vH8fp= zAyvoF3C+rgzuMlF>#AsUJt+41iZbLt^Ui$M1dn0X>TTMG)M3Mw!XnZRkdvPRvc?E{{!Ds2YQ9H=gpKr- zx12gG@iJkiWw*%GKNi~LEb6)|(S#JWEc4675PV5-ug`8I-$~7{QkSTqj=aGn)2q|0 z)cYM7&EQN=w=xy`m)~tqP;uuEbT?>f+Hk@ATv-P;NxYiRTPmV3cwiDo z+Glja7<6S)riikFsH}Wui%FF;+ncTr%D)lXC%^?LGTePAW!^orbklH@{z|%FC;DK_ z!L;F_1(IU}m4&=8%o=(Qf9-u40Fs;y=&HGBEe$uW2N@NUKI za0ZvwDO#6A2!PAAEA;tyuBQHF$@ewHH^yLwxZ$Xdz&Moyf%Au1UXc4qWyC@Oj#|j< zl;K*znR4jwGTVwg#gaXxAbV<_JVe}96aymiM|_SbDEjO(o=&ROL)VwZS6Y{6qk}fI z#U{RxE}rO&R$k&-N1LQXRApX>C^$K*QAxPnXih1TTRiR#>(z3)sB1|QGI;reQyq~nTA8eAXFEWepneM{e4 z0rk#zw0=v580Y4zSyg}EGw`aPHMbzp+7vm*Rm%}(e`v1f;(51dHo3x&s}BwUEM-DQXMVCLM5y_;!uNhf51>2!+un6A+gAth>L0t!Ur&@YE!NxWO=LUTj&nV|{ge8R+rM8*EcPB@sUcMI6w#^ux%7`@YULknl%lfFZJh#c%G--vwBu2-~wthwz zT+oShvo=X#_7wMQ>_Dze_yC|!0&6QvM1{Vh($tg*CJ@Pr#ohcyEr1l_axSo-_7D<6wIBcz;Il-cHU%m=-!}4{DWKF~ zYVMQYzREsznCf%MarJ%AVI>`##+|vc7*1^Hc43B=Fs6jTMh{!L-MBbpi$pvgbGAVW zwlnm#DA4tKmzw8kuez4pR}Rt9H|*}4A)wjG!ZMDA8g@srm2x&q2tgK_?Lr1&@k#Kd zuqbOw;uAL(J2JsC>cGucvi&r0qzedsbB3y zWm0@_C*eT?Cq==?Gw=obMmcUuHW4xLe1kb(4f__W%TU<95ZM=y{*jJ-^lp`uh~@7V zqv1xz6PPEXR3ed~M271$GAxx7Gy>CemD%xVLp2BASo0554Uq-$7jPq>k;n4*HC|th zI@#GHeU97!4(!^?UVJXpPJza8xRDnm2SJIur|$BVc1OR^XV^?8UZoLg*F9VIvGDk0 z2X?{=d?rrk#DqKcD3=$WXT~;2Ap3U-3cf8qIT6q8Dy!HMntVFiKPaI3MjhKML~!JU zGA~%?yz_=d+S8cUKNb2t@lC6+ea4p(5r_*W^Q;CDp!ib1l?s ztBPPlvtZUd50nKD5KB5xS@17wll*9TLNj&>8dEaJjAsvCGKnoXWVbVAJBR z7h)p0RP=Oz1!s3^NgofOWo~V=s^UmL4!%Bfl)_dbn7+42Y2W|bX4n6rN=HVM5sNF} zS=0!?fUuZgJ$)gb6sL;<{H!83Po(sQ*X9l4zR+c(euG-o_WP-1)e%NNd>`Ib_)>!C zN{{cSI#b4C^Wg)_Vb_q`cQf{GW$O8?X4iv^%*yN%al zbp8>rJ#$CZ0BjB^soPq?jJC(ha>Fe<88hoG33~uue3F6h(VH$c% z`m*Pr-14QRrYrw+g1{xUw(DdyIDFxw(`&0;@STCW$l?wgWL?(-PmpE>ZanE<>oI8? zrCOeK(Brs+mc^BQFZfN{lN<%32GSZYUM+*Xw)?XqqghpQ_Vq9^PSLiBDzwwKMr`ZEZ^n^mT(mrj~Hl^5xQ%}G3sf10l+ZG_~|cawrkt@9Mt_fhjdTW$89!_)?>6TA;#2M zKE)Wc;Eyw!{Jmjn!a~Zb;#}u`RDou8uHF7O>DbptQn~|OUuGxY-*NfQ+iyOI6aQ;u zNf~c&E<7$91n~y+>ZL!pvX&t;kQcn-CD=oU8sDz)M`x4A&rksR!nkeE~sgZet}5Ej<^IN4p?)D2F~+OP4> zc6e<6S@G+Qf)0k4U}e8Cpp1nkacdJ{bnTVPX(GsI_iKC_J}DBk_O)(b@2Fc0PC%>yL~UMhRfbjDi|w#xyM7`P}7H3e{bY>WsGPn(zRakPHVOq>)!o3)URX z74H|0GRPH5_F}_>RZ(w_$)uaeMIrEEgzHPXMARHgm$GR2L1~c&1#}cmN(gt0$G-E( zH)v8och19LoRa$i$oZAYYM8DwZRSv5SiH|bc zgLp1xjP%?V0%t(RaXe=;4g?}cZq%pmK+$C3_}nHddZW9fS&n0RrJP!rHo*2Nv9+Wi zirps;UKfNW9YMMyk3zUjP6NH@BVMyvK&6a)O;ve`$lZCSj~BwzUv0Iu^*s6^UpG0} zBntV+gg9AlWSIt>fb5iZ3|;vvM@|m!tjF;YUby;?-vHPAy(3uz$~+tpT$AIBD&zu} zcyGp$Nkvn_-AJ~G*s%XN5k8*@-|@&fDdjevuse17$epPU{U3|b3U|S4eKHAB4F1yS zhAY2m75s}N&!!lgyp*CDPBF~QBJh#a8-*ob31&e@Cy19Mw~vS(<8NcLevjL2HDAL5uhz72 zo#4^)3)ofSpA#ZAQv4Z#gBbe%_1_d9OnaUl?+f?gmnGRL+jC9SGnQRgjoR};p~5HuBH#K=cV2Suke-SB#(}gKrgvHCA4O}5@chUGa5RH*Re2z!2tATQE$q`Xu%0u^N&$s65q+SY+ z3}HmChNg7lYDf4W>_uJg|1O&sa8JNLmgKjCU$Ii&Pi5aVSu4Y7UzuE)eK*r{feS3I4 z(Mdb$Y(Lw4zNI;FFL`_aF$&q;*Yfwv6QDhf#_z(&q3!Zz&^PhZj;*%q&jRA*onc$k zP9ZBX}KBHy=3Thi<1U^D5ob8d-PoG+Qn{i(xp;t4PjXW&P zKr(-6+yx~Tlp!TUbhicbDlmkR0SJ9!BGsFG7p6_f-ZOFx8pJ~H(KOpgz77AG%ajk- zMf7S`^0L!kayiCb%2CMh-nvq@X+Rnh*_Lqv%LvwEIP3 zVr3~J@l{d3IPR6myq>KDrr3mXIkp(2RW&y|M+sq<$gN`M9oR&cVRsc)3Rq>c>s-&9 zh|iR%QIjlOu605^t-8T5K_d7!n&RBq=qaY51fVvzBT7j$62uZrJ~W zueS_~W7+z?fndQUxI4jvySpa1lK{abz~F=q!QI`0Tkv3mCV0@ngF6%4UEayw=REhl z&v~AAu4_IpP1maKs;>20|EgYvt;x&jcVUO_Gous7bFdi=E^0+x%q-q*Yz21_3%lcpsZ;nX&plKslF2R zt3NXqcZXT4Wjd`xz*}EZfjeH+)FAYs{Uk@Bj#cjwwwY!PdAR$4>^~E zV&H?g_}CD!6&JKxz0Rq9qiu^0T*DWk**Q3v-gt*`qaiPO2onsFNAzB(t|g%2s?sKD zP4kD7nDoYZS`x#-$)dz5!NH*~lJH8h2N?XKl^d+EBc#Dc(#d`vg#`yY{z(-9ZoJ-V zoO~B!_$MJNTJZ;=Al22*deU?VJnT3C`|`d(EnqFTgU1(oc75bP6?J&4PYV0_&xiV1 zO41NC#<&gh@4w;V;4NqPV&k6Y)>pBL3#0s>Un4>CdVPtwrNVfz{T13gsHlolNT<*A zy4d&fQsm7;H=RDCkA zW5l%G70yYzzf3Zd(W)swyAZ&zi0;QFos2)Z3R&AN(=N)8l9bHnh@)youqsREEi4Ow zJeT#yRQq23s0~|&$sXiH3zF$CEEk7usfmavD;{v)MZl#pQb?nQ8Kq8rYHx$4d+|!{ z`wJ)HJSl*{gxyB5boX4};dcf%i3xw^(XMdqZFEkm>HcFcC%^d3Cd#!lOY%k8#Pzk8 zTnQoq!bCH|O#tiLlnf=A3~&q+L#No*?D&hXyP|SRFQ!?&dE=x$+JasN!-Dj`-9Sn| zlndyVb+V*ycV3ZG-8u9>Cul?N?o?hhv|tC=*=srOGRh9x#qE*c;cXGuwo$}H<_dpl z1|EGYQ*yr3ULoY3_}Um-i~dUBQK9-=OGzfo_@R~H7M%Iu)ARC2VjUkRV}=)=EGE@u zApt7LL+V+qndwyXXIq_%kWV_}f7?sN)wrqv~6Y6AfHzOm>nbs?N zO-E0&C2(m1Y9tqeJu9gTw=ra4nR56g|H;Bv*-_5PA@P0NY4W(*kZveq^iZfSC|k!F zReu`ht2VqZ%#{n=cKZ0D-cL~thp_{W*^E}88$X)t!CL5|`)R|4FVGAfSzD{k%X@X7 zS|if-vYS-{mOc&3taGr!yL&jLHRr)=E9oVx#-#nImo_RK94YeQO~4l=x6gu(qgmdw zNjsy4tP(lX+-@n(GPR8CuGVgDzRd!VW z9+u}0+0+*QDPt#iM0$o82&o&*=AI>)lx2-hu+m}I=GdCCAdl2i+FTh=&qh3C9}D8h6AgTidP*pHvIUE9hoKjj~b00lKyyY|<))k{_EZ z-~Wu5Ttspr88Iz6{yAzezg};xRkUT0ZF|>|U9W5e5BF*D!x%Q=W!9&KyW!YDZuNS{ zYy%@J!H2~c{E4zWWM0K;8|N4GGwLfTER|}*KeY@|UMjY=B{Pt@vWAPc(bilFwo31y zFfa+X%H7Yl4xK^1vH|LS3oKX|{9T{tC(8{Y87BONjQF(XG@>0QX598SIA4GKfLE)F zRX;u))Xd0>qw~CAPi5~4!oUYZaNh;<%E@h{_n=N=;C?B`tySH4`N5lN%^lrrp3CAl z__u^F8Gc(U)yJ*OE3pj)hT4lLSw}MqV?l5zVZ+y8LWV46B-r>jK|@?n&|0tA(Llg_ zk_EMXcJ$4F)|I!Ok0)=sQXjb%%yd%p%~yU)56^p`9}0qAHhHIb*v!)nJn*yne!JfF zXn`l3%Xv}sf_e4z*lP*A(7<{4*|#I@_r+AKe%$&$P3SIt`eHh#g) z@6d@L*ZNn1vv;r^f+sED;9fg6@1P)9C-lsY3Z^HT6@PNsqI_^zrE}bEsh!+!EB_AN z=XZE5ze5n<-u?1{@!9ft=o;1)_0`JPuf?173m4{~$9-Thl1dj|ykPQWb{Cduz;0|} zv%QXtyn=Ri1+$AzdvU(K9H=4eSXxtu>i8sN&6q>+o_dOI0ypU0Vcj8=z`Exr%te%~=1`&T8_*W*1ij>0C>|&2vbi<{ zr`^O`ya#yKSRHq-u82!)hk_ilLn@gA#k?<4%VHXNOv-%za+0LUQ^VkdTxQeHT3ekVKGZmhLr(2J zd3|P`D@C6?kZLm^BYEb`j-YO-%H?&XYc(9Yl?KPn8nYystn<=#jL$m(5!7dV#06)7 zb4vLua4w6op^gGBE%Did$*coMZkFogzwdFL*UeA9Ml0A|WTunwo12-qjK68Zw}xyn z?E$pz0_bq6?A=O(&Kfs-pi*HfHy#}|YS}nh=8|$pabgq3Oci=9-uozskcSIg1@DI& z79$>5NrhJlm`F$Xt<6zJNFeh zq?Qs6uJqOC%}}kOqj5%w{d-Je3Yc}szpaDy-=LLe$P6GpiVR^F3~jE5E0Oy5LCISM zVaYFVQL1YAp22KyqHv+7f#cQx1_BvC=LhsOZGeQid>2L@9NB~FJ&9|yX3WOBoyO4_ z@Nkk-@Hg`rjW{RBvwD z$k%Vq|Sf()$5b)gp%>)3Ano0lPMZ>VbJuiP#n=crKH_n_=)A2@1)2%o# zl+i-_4>F-A&FM7w+C;njStq-inM5a=F6dPrT}3$$y#+{2deEv~M-v%F9xU+^PqT7= zGY}t_aDZ$iB;HwmQ6AMo_Nf;z+Ohxz1AZN^2Z$n(Fm%|>S39q-#`9#18Xdx!)^#RO zU?ougcL`#}%!%bb-PcvDFgflm8^3e1Y?RZ^X!ea?41+td@71ANk>=9U(urW4FispY z(ajlPf;gn3tN>r}8}Sm1Q%ZMnqyv!?%5NnBHh#x>QE%d<%Yy~C7Pi!>cN|Ry zL~XAbk|iZ2>2d%2Y-71_qUj1G5E5PW17pM=Zd(4P3p>BjapBfk&F@&wbrvR+c|0^x zuy!^&ZXHGEUJKE<%LE2Kdw7_B2QsNmfw9iMvesPX8f8TvAMojuB0I-TZuI>GDY#OT zUDu3a&vj~IL44W<^10ZuLK8N%I?rzR^Ayyx*DxtC7W`6+P6pusJE!BRM~n5k}zAksKmxQ@>K7v*&<`z zxu11r&UK!1J8yCxD@57jcV0F|a$h8-AZX7kLW{LXHhPAtxS{x3p6NO=_*YRcRl(U8 zoCcyQgKr#|CC;Pat8F^F34{EMvB_v(sxBuC4`eYzN^*hf+VLSuBv0}p1`AH3UZ;@v zF*@@!{IFaT0?&QHe28Tz1si1FxdU2y=Ej$L`A^(6X;D(*_8)9OT$~_IVY)krJAIiHdom}VoRi-rve}+(Qj*Jn~IQzfzQ|sS>(}zUp=|-R&BvI-))+T^;r~kM5y=pD0rv<8~Er}tkiC+%e zu$`dqsg4SOoAFN`8rf32us&+JFhUF}nwKtXZ<^a7!)V&eIpDt9z0e=z5-ygm!m4sZ zZ?h1x;&ebdMyqGcF{h@+WTxR3_5~E`+M>y>%|QcFu5*nCHpeyZ(~zA;QwTMmHRw>D8MCLBF7I3CHHSx7Y~uP&%(7+7 zxMqFTvR@TAD&{w((6${ftOwQd?+M4r1x;O8Z<&L79sJJrw8k$b?oZCE{eJ^b>$!_h zm#MIA)3=tZ0KTJ1PQWw%@@tU%?l)@&pytPvf6DCsRo@4r;D%(9ykcELod|0aM}kw( z+bS#OY@~j3v~leOb_|4xPwS&l{S!-&cIb{J+j}nI@{*cUgiM;ugnsI%C0mOq&uNGt0gYC?QGHUeI9t+4GRnuOci5uZ4N8X}cNMO_rsMYf0 z7A`sZ%5J$eNdUU%4O*^y&IbS*R^?uUt0Dgi-NOeo$|XoHwRIbh)o`6oaM#u zj;hC=+BuhMSF41ai?kBcK`e<%);#IP{FzMHU4-9I-inBbR4!e2mwT)jWW!lk#N#hk zAv#)E-=nn%k2l#1lclYeYXPsj9uTD@N!6t(3JMO1+#0VWqedO(b$t)(DA`sqduQVz zkfpEFy$wdcB7TRKVTsNWQ}Fo65^Z3U{Iad>B3h*1|2>0K*che$7E$D)p`TJj!_w^) zoqs>ntHX__O6cGxL$(ywf!Ql5cmX#)(t^wqW~H+O29}4*1Y2${@Dy;9j_>?1N_GD$ z){yeo1#CgA*S7JBv#)y7<%?oRX7R@f1;VnS9T8#SuS=pN*;}SgiFwsZ54cQ?(t0ov zWxfk4DJe>CDX(B?oBB&TkVkm?4SaoEQdEpvzm9DK4;8l&xzWS2!p=5Q3}e*uC3)ke z80fz%9K>Pe3bcIdIeHf);D>AtGJWN+Twx1-YvXua2 zp-Qld;%GTq$jrUwG|PT89NGwd{B3n!Y0`T{F8frB{&05GUgtf8^|6pc##HC(I||k7 zJ9qC7xR0IncdB*2}dz#<_#+28>yGGZ`uNVx+x%nG+lM3b$lwzcGx_8XD- ziIc3IXWO@15l`nrNTQ<_MB6)4K}Xn{@}3EbL;Z-49^=N} zy}$9R%3HT~cc;;Q=v3>mMc<~xjr{rM?wnh}1z;3xZ5A8t6(h`7nd^09n60Eyd?3ko zJpZ&qYR}N$YkcCV8FgfgN+E`*J7S>6f9bW>Q~rZ5wKX8W7fQ&itgDllCPI@m9uHGx zY>7>77bhw>frIgSv)1Fw>}>m7|CR!4i?R4YOIp5kRSk90LXK#qrL!@KvFbO1^QuaG z!0$LS3Ye>vrF|mX-lKgSUiU5mR~!AxG~T5QF!@1rnZks5HWIc=!o&hoTk|({_@Y}9 zVUq#HyiqX&lNu5fR8$(Os`TslgI=QPiZz8;scX6e>TX~~0+MX!zY5m8del~jub)!g zb=&Da9G<^g+;(6* zQC^4v(;u{Hfye6qWg(ofAhM^vDy@a!biSk`q8A~gobc7L*}X4xJZ~gZ;91!-cw6NE z#wOS+x$y#!Uia0`zaULaY*Wh&OEVOxbzbSvW(ihWilGoGFT{fxr2lV&zQ%7R%7r7w z9fRaStDTjwaC&&gweQM^qR?q?rqT%X9bHHBISkkE{x5cqz{`?QVd-vR*wo;ki3NId z&_a_lQ||5UGAI8%&^t-B{BVZ-IF`TSw{z04;=RwVx*LLwf^vJ;PLkbUa)9{$hnG%v zZowTVGQvdC`rfnRVb7*g?tP*P(lvCSe5d$3f45T>-Jg`B0#+%@({}CJlgwRrUlTWQ zKHF6~Mk$})i8xY?5_~KSf2^r$c;=?PJ2aoHJb=+NBC=R556q*@e{Si$dB=5&ZeyC; za_X)rj@>^ic`QEDb-C$JYI1C%t`42=RNQ}`18XMlh=kYEQbAP&kmR-y**EQG+^~rm zL;ghdBCP|lRPk0WzuT!=cNBSD&}B7LFll6a;O$ZhyOAFiz0GBeMpfyCprExlGO<9J`O}y_MZ7JX$Imu6k(k76d*7}^vF`ivaIASo(%7wJWkiSQ-uQlmpuj0JeYXa2o^2lZf2N6Xtg*G9Y;zI>#=rA~PKKjDs6$<6uE``|ohY+{`6S;55DLBJfohUo6v3tu+nrO4qp<4v zRH5=r>lGds*?T@)R{a)fkcahx$1RG`0NB9E8|%d*{KmpjT)yO@;$T#315|hE^1>h9 z`1!Q^LRv`X1$j5m6w~7G>XuBhC1`GBobW!Mt%#6fP8E_$*3YCG>*wk9pypv1))@~c z5!wQGk;5d=!bR**V)>okozE~AD(Xg;Rl!-`XPp@ft7X0Z_ZL`hEs=>(Y3Xh+_4Xz; z4*9D=rrbiUvbFfySx*z_UE#w_Xk^Se=25$7i`~W!orR051_g)ALEc??1@C~eTHmT% zf6^xl`o^K zGXEgMoJa#jU{}<>G1a{WSzW+5Uk#+=G*mU6f<`*ozWoI&@mSD1Vdr_^&tJ^h>6;^B z1KZ=ozR4sM8{8!ZhV@IJni_Yuj)vMQoGyqGthhKe?Ygj?2+vRCg(cF}b#=1+tpT6Pxj2d^7 z!K?OH=~47c=Tja{qDog&pj=1HPW^5L_&$raA{YT4ajRj}qq4khmr-Lqb>?DI`jm)A z5%Y4ld-FTi0ar|G3&z^mR;Hubi?<$_1wWva-=jE6OjYyH(;&TkQCo!;Ab<+EcVS82 z7xy{2o<0%l=b#k+cyk@RR-dYXZ9@Lbn13P* z6J|uUsThZ&AX_o`73!QyNy${SvGkzH&wVHj+ zO2)>!%Ef5=7|vhJ!b9BNnLzgQETzX}Wj+!U&XxCB35yM)vHBR`Y?6w)o+l-5@=@J7 z-UAjVr4H;7QU!;q1Vab3RiyeWI4f=9Y$18iH&n%Y*;Cdg)_uil_Q|1;N>~my?szZT z$#^qoiL*U+CSd8}X3wPGbP2TI8yox8ursx78ZkBRa#c8Ts4NOE2C(jQW)K9)h2U_O0#{=x_EA*@1#~2_OzS5_6exO*!t;-i?>i!w52p_rL>(OriRy`Z z(`(#QlqNInyyt3}98p-mIDUU^d9(br!a_qMXFCxRKF1g}74QiMR}|qb?-vgimDUE` zQ73Vy?nJ$yrTmY|pBE}7MZ-9{D6T=`%LAvHywR%TD#S-GVL zJWP2e!@+13g|JqyPA5sooX78np_|; zDud1i{NS=_ozI1x>JC>~rYb#S;^34ex0q16dJ$LlkQMi)j(amkL+Ey!{_sUiG+s+A z#M#odMtm=$3)mVABfP`#pZojnhrQ*B5E%asyiIH^9%_$Pkc0&XB4!&|CB87Kz39^C zH0t9Y>*JwnfQVnoIer*@^C84cUxBpn$E)M@J*6>8ywe4hYdTflZY#98`@z=fFGal& zhzpzksFFA3sG)r(4Sr)`90>)PdQky-pn*+}4FD6rh@FW$$~Fk4U+R2RtaFzC*3<-h z#Sib~dEgYo{vTfYGnU~R-c`1MzT@LkQ#<`HRPq5)B9-M%i6K-#WO#=K=*q3LO1Xqj z32I&iarNP5jCbzc)>uY4{i=I^a^jLW#o!GCq`b>8wt~p7>(tbIabV!8#Ptt~XgX`@ zZ6$QRAvPh1#wU<(l6=DztU}9MMi=~AU1tF%>!3e8Z%{xCe`5xk#r~30>wJ-rIRbfE(jgIv*px_xi ze7pv=#0R8*h%|Vx`KhW;anIlWVJz4G(VzbR87qGP3N_Gcj{P(3rT%Y;>+fkV7`$zY zgTJ0w%917u>tw$qDOhOQl@I}H?6-i$j(b+4oX0@5r|VWS;8BFw%otjcpbWE|5O#ml z`OoUdi0)-ftQc{Jzt#kN2Qku#P5SGc?;|_!YPPX?P=E8|oOnHwSh4oB|D%LalGRk7~c2Uy?{^JQav|j*WU8A#A?GDDXYrAL_%o% z>c^?X%{wzKKSDHLca{IBVLhr>k8zGc>*($y+^z!NsdwF4rrD3QWohW1cFO4%*Z+J+ z{iuO+BD%g!XFbAURzw#tVpjw}O1XE^2o5oxrtqtw=5nkTQrx*RvUHs$* zOLt2jAF9bvO%!Z2VUxq6QHKpokLUH>3P=9!TffE#W0piyq58EOYct_)ttY3gowo-I z)xcpFI%{s*)!|WpX|`-`2fBJ((ALG58if3&cCq_dFL+r0fXGf=*yJWg^%kehYW}o0 zuj5tql}QZ!oh9k?yvf1-ypT&jFppk7!2`sXd4VuV43~t>#OlakyNKkQI z9&B&jVlUf?{2tK1HFUf-%tIy4vw19MJ`l$xsq3x?$~O68zN^iL$r7uofsyH71f++n zONpN+{a!>6(fNQ21BNNU#jRkqOY!_dr02AE1YX`hL95=Xt&9+nwV0r%_`dWY3re^2T~Cj3atSm`3Aw?!${*Zli1Olnu;?M{Yh7K|2TNxKQ zN;QMQrU1WSB|ilb>8=M>T|o2W(ovm3f&&+mnZnl;{cp|14c zBe5GISjwf9BeIrDHw0%3&puDg=os~wgspI@kJg8sok#fDH{(QGGp)F29pCDg8ok{nT z`bOsVfN*Z^rqSo(>@sv&h0N4ex^mw_G46%V(xs0=M7_~Gnr6nuR*V-@Q@?v!bNO-9 zpJ(cuq-_bYp+UrKGj!3_c<-T$Hb`bhKhE6G#~Xv7$Qa#nr2uIgvJvKTD8m!wa6A+X z*qDT+9u_$b90L3Tx)z+PV(u?c%>0gS)#~ndT20NaAI0mAu^&)6>%0XT@Gq{}TI}y9 zzx8B>Y1|g<>yOam6+>s=_Jdid(3&xzo-cU1vff;W+sT9OK1(9S|9qOfNG_L&DoD|h zabYl-bS?_ zb+e%_wlR;w)+udchmqONTbriWkeWmZ-#1sgtuG!D*10g`+8S6Kz^nV@YdtJA8}dzex*TSC8I-F zTsoy>IKY=FCLy>QBTYl}jKZ!2qt@n-=0kRux@*3cSiAYiu6A{fC3QBGH@oc=nR)0n zJWeT&<~0E3+o81WAyn(sG?`7{tMz0ihq%D2&SR}3A5hK3g%t)*HS7vYd|go$z2nCE zVS4=<$a*lP5zedm;3?}9d#<3H%)5j-Nr02RJ~2;GHCzMU$}x10mXWpwi|799VU7>O z$}^&*#Qt&!K8P*w_41Vl8DSK_w1KFSKoFA`iHBK??A4-*GfqC;T(J@v)!huwNW)?KR>5RFtA6Rdp8}V_snUS0pOoE;?-@%3_P_XqB`Sqn zNyV@jvJcv&LFKFX4fHJv^D-Zb_#Lmdj9)CpF^4er^x6=FsZTgz_I~^g_Cm@81P1#e z{vM+^$Q1;FPb`N3A@lqIc5KJRc$_8qZheQmJ^vp9IF#L9&u_@*+Sy#}#hXRJM=SpK z0%pr+Wt|64lVc7yiJkMqMH(L)pN=|iug@gB(&t|mc{EY|Ug)MLz`lTJLF8CnN@EYL@!O;PEvi_JL|d1EqP}OpBZs1) z!eB|ZW!yp1--lBNI3!tOtEU`x+HC49Up7J|nVr%ur`CU4dgcO#Odw-)Z+wAm^m>j^ zIT~<#u`L}hKH|y`Nn?V%k;f~jso!Cn2FQ$pYugy~>vFOm>#;CoN9_DU<_34^KK~+A zMek{kh^g~wqGIgnICAWA2xVvBGbl@*$tu)hU^ydj)ZjT;afq@xs4L}rzg@~}lPAy#4<+xp}nE_^# zoh2ZMgy!(85z&ZTvxQT9%(A4W26M?@-Bgn_5gJ)LH9qbz3X5!)7^y(xmn1>dILyug zKpfg|LZ-5<9kpII1d+lFW2IZ+)5LxLWY7nB)V>nVg;w!u`0dA^ zZxbB#8N*VV`7*sOT2~|@jh0X4eufa>qudT0JyPu5;58fWE zST@S#T>($f1J1(@{9EcEwJ|bE$_^j*!fCq@^pWDuKU*4>Xyi7s=%$|jDNCXKpG6tx z+arh5fjJ$xo!I#`Vtq>F+nN+IO5_bK&MLF|A=x6Hqi2gJK=|PA-z3tYHH1Mv13}np z%Nv5$qgl0VpM-HrH+MfibuuEPjXZD6hv3OPpCN_4fQ=p{D#-bn zGIy$7V+3~&6!)f*lK%ca-B9R@$*BOzFQ##Jgk0*ZrQO5dBi7MDBl#flovB|r3uN>> zOwaK-UGRHc6T?}U_7XHC*_*zZqrJSj1kR%^c3kkerPQXEYJI{a3q4}={cQu+% z<92>FEvc-_4h0u;-;Kj##^>+!`YwJ?m1$*Xm9$Q>6;m|A@^2#rxW>&qc^Xz~0-X|U zI{}nQ^K1oy^0~)Jr0Q)Xyxt)+Jkq>8JLA-RgAE{8w?QezZiwl+btsX*%%&7yJor4K z##~+lcyC747WAjr^DQyk#7%kvk0s#+7UYfHg7+^q^&PERuBK#RK?RVlXlf`RRZN!{U2hzJ}Tetw{l17VE8No8MZ>fNoG;&mmdy5)4n_&*sNt_l?VBwV4VXwKpNuOiV`pS`&)<%hkTe=FtiJ(u$a=2#JnwI` zj~S8Q{p`tbub3_IHO3)vKkgADemA2OE0vx;lZ}DyRT5~7f*&M%;zA9ZD|i2@9;R-% zr&W;`0WFP555nv<Zcuen@{F&P{eZ_pHKOmo*#`VOD}EFh%-D@+}>Z6Tm7gR8!7Hwx0>F8I0GYM=eQ zoo&R9DItU5RJV;zldcr>ECWk85^`dkCu}j3worN>QJVOiaMQ#y$YYBdtmr5*Nt9fs zC8}#p)Vr)Z{e8np?_=I!xmYsN>(eSVB_EUL5FOkMyR{SKjyJt@1a0Gz*jG%l*2E!u zVD(CQ%}U^K=uDKyEMLT9Kh30UZo1q;uUpZiUDtl9Ofh>W-m$s;N8METM(;~?ePz&M z%Vr52tn#{26nNRIMIsEsz0i9OoTUi)w~8aQz65WepEYsWE+oh%!~92tV>pu2buz~O1rY}?ez&RjsYD1ftPGk5o{?#2{_qDcjJN>?Myd-*=g zKYIq^6E*CeO*!_X5c{S^E!>X+j{AMe1fDhZW#^MuXvFm_%o(l&#jNr&vF*7hXQ}ug zLfw%9bjz`PO?nMi-c++bKu0gYj831#5T~Q)cgEHowXu|UHB#&ew^*^YFB?qi?0%>n z0mZMYlP|&Lqea3_^FL|IJ6kPfiA+Y~Ed5>=bGo{d7Zey6xgIwYS5iQ14?kE->T%^S zSY#x}L3gix2x9fU@;D+PNN9N+K)#62xlM0fc}lYE?)^J=m%`B}ZHixvzi7PEHd@Dj z;||wtee2(a4h&}E-nS$~7j!c^%lB;M0^%a5h(AlWI!NN%NhboRry*WWmVRn&wBC8# zGS&=7U%=8Jw(8oC?YOcp1-^*KN&S)(4O_L_x{_Jc-!wZkPGH@&WccX90ON=3UQeew zIFpn}%^Y^kffy9&E34uw_njlVTh3h`Q%VBW52`tA`>L;T;2@Ui$e zq8VoknO~PBDX_sJor#$P-It`9+R^}_)R(Ck^Omok>}k1FoLGv=0-(Gs zgpdR54ldEylZREh?s{VUu7z@HFwX8krw~2`Dk8$WV{Ehl16Qq=YM8PmZ(td%C1ESw zf@=v>5#{mV+x+cDQDdNCf1qbP1NA;o`)}v~{!j;7zVAG*NsvQS#T(iuClpu@muzP` z#@75tX(W^9IOXri8JVcT0hDxLPXry77*HO>2K15#hL|N&|8<#x@Q~?OG59y03P-pw z76=Iqtv02wZOB-Yu7}M|eOUYPd$Obwh?p+A|0MZk`OVSY6CdvXfLJP&RBBf$U&Qk; zYo}!cKXG!BCkXljDag=r?f&L0W+O|;t*;JlSMp0j#s9*Izi9$gZ9morg&AD3d7QDD zqI~szdKnzXp-$Nqt#Po_W&BjojB|DBdAA`7YFBi>Aj| zWT0&(?L6j4wj(oF+%9FV`A%GpWoOZ#G<=FawM4YUi(`aAkqMTW2dxBnv9oF#e#(e* zOIEt>P?(?XeOB)LstAKfj?9mO?;RQNq1LbGjG6Ols_aJ7nDi-e_yx(Z7OcU9uYHsV zEJT!PAnhl8C$QSKulWDoo+G{yA$%Zk-<>MM(vZ{WR;xyYwWg1@@)H#=y^=d61^NC@ zqAtB|iE(_?#QbK*H4R92Bw%#)I#!lVd~zS9&{@G>T@IXl^>en-&^->mfxSP zr8~?jIc~Xqf16Pdllp+v4c$nWUxsqRa({r565?2Wvv-Y#%L^j&*QX%xiE=T}2`?vt z{jwGg;Fd|riDw23bJ$wN1~NAA8*-QE-PKpfkb{Ry6`IlbV6JvN%n$ zM{>y)yTuItQD2qJ2lm_FOXft|ph#dgSp3xPuWZ)bm$YdmrC}a$EO{bA^ciQkdfL_1 zDDBN~f~BxJZE)hPS`GYMfJ%srsk4)ap(wly6dDH@aHTXFzF}1nxQaqz7~!It?nWzK z_e_8@v1FaEjB#ycSQDtz*)0&*X>Zv>n|+Z1)x1Tb6N%i`SvFVCHh$5)@ZG!li`~Rt z#;Ds3Zg!fHfvxsV4YO?1EU#mbRp866?Lb+$BV1`vb>}j=><%v}&8SX=&O+6U{ir7Z zobul^nO69&wc_~~j#BBuKqTCn_`pNsbhU-eT^dyT zeC|-0ktYE~BLIh2mZ)L3PSR|J+MWgw4}9TON~^I?(qcLrCxY+4BLylltcbr~todw7 zf!_bsTc;^a4~3|APLsbhVVO5@`ixFkys2)YbQFdqhvC+0=y?moV{iR96%mgcOT%M6 z=ybd1jtIyrJT5o8Bo@}z*2Y15i2q*1E3wDuR%>YkIxeY)xG+sV1qJdl zKOIfx-Lmxl+d|b1DD)z$Y18xFm>f^$+)gR>A`%J}-p5ClQlfB<-%h%jdLopZXL2q@ z*?UV?8bpNq*M#SoRr^y0byIJgw3O-oQq5CvfoJ*r%XoxBJ36T;6zlM^{odlgM|66&He8#C4?tCL3-Ir$S2(l%lV7%1ohHll z2|Imr`yQ_Dpq;joZ%z-o3!RAKI8HvvpDU<2(S8J-)RZjK!1|z_o099FmUHOz?u@C@ zId(@`aagTIHa#B?f!_!ZgXycVtE5=SX*?*S)-m=3VqOVzZEF?x?AS)5kGx*!RJ zD^Aq&E|s09-^vPN?_V|OYnC+YnD=V%zv&>M(RCc;s4a!!Zz&*})oSKjAOo`Z$}MNV-~UxM;&l8~NEF54Q;uA<=wNcTe!v@t}sX@rYy zwjH*OS)-Wd#S=&KVGenx>4XFAtqQ382!e_AlL}r};}-=wD&lU0&lCDt+qZTTprXjZ zN{ON@$Cml-Srs2=fQ*UPyDDBcdC-_3EMx`dtw)8SKWRIx*5b=^2}#8v2Qgtzk?)2D z7Gt*$B0UczM(0wk4t`~{-o5sh4GlEt`r6z3b3(J%u-s6$L9@1kpucJ+LDA#@#%U%$ zHR-8^acrU+whwGeCfrjhbI`1Tly$pGwIxiemzWTDh@c!TI70)Z2MZc(^6fiGYF$cR z*|!og9;}!)tx!~U2sn-DA6lTCGJ*q1ri$3)5Ma)AM&EuZ$115~$K^r?r#?xlh}Yd9 ztcn#zYYgpG5yVT~3(@HjcZW9buM2+FrygbBS-SXqXZWLJy8j-a25?HD|EWOz5TL6< z78J0%+kg_9JdK1c?KK5yq+wr>@ub|1PWSSp9%glT?dVaBX^aS9z^({2sr5f)sN+2b znxUnych#*N-jA~?lxCg5(GZ<(;-%_p_M2DWlE1XCKhhWQ5ABN*=rcaXdDrraNW;r3 zKfID~{@bM2Rbm4mA@uDD(TZQ{3UZed=%1T&Dgv zTXE1vvXBihPmJ4wOL1VQ&a4>hrB#FgSE6f_vMx5Dr7Wo!Ie)TLU$$us<}bIouqHpk z#1S!RToYeYz5W&|1_UpZfIm{<;eT4o;a28*ojg#?4>A`s=91KaRox=aE^y3Go%Izf3Ls zpGyJ$rFz2p93ht}hNfst44p99pITQo{AZ`S-eb5b@HFYJPVJFx;_;fDMq75T?E2G; zHV250QY`<7RG$BVJtM(;`fPky2eAI*%aAb&w!P6~c&Hfq-E;ql0Fo`}!2gLv{tiT7 z8W4I39G$TM{xCx0FD9@f4dj9>c|7G!?27&yAj|0XI`Qd~avS~1_G8xw8d1!>CJ<+QK%x4wB zx-R0iSuNnZYpK5;w5EUDlVEyb>?LU%G>e327AwKA z;z)nm;*{{O&i3!V_DOa&!zN!z8Z>Z(?i=l6GW#U)Sig{y`p)hdVIrS16Tr>I!!It5 ziRK1!egDo86U{3t*}%Y=OaRAU;LB5&f+H?uXp3^58Wo4tcCAq;gBTT|3Abx41LuVTbA)^!e{?v@Ur;VOw*z3Qr!Sf`b`;|qI_GmjppLm$1_&OTMyeW&GC zJhmX<^Lt$Eg0%N*aZ8mxdH{`YSL}+9-qnME)S~r!>N}%rlOOr0$ld-oHk2A3^>5?O z*JLhdYpg<%+6>ou7Dqly6?-^;mYR~Nu~tL7`ko`!=H0_Ek!f^m{}=gub2S zZFDA4$doW~;YZ!Blv<&PZ&%+X_7AU?r$ypk6!Fpaz3DmYiSWV}*qaB^T-KZxH^fe2 z=;`jjs0ojLxP{65jfRZ#HG8yQle4xzqsx$K9PkgUno-N|F!_GbaLv2cni`=Kh3ty_ zc%r3O`h_SS!N=ll&MT=b#dknxaqY*i;(j4!oY7c|RCR*Xzd^@MWan`j6hz=A=p(A% z0vY~tq!!1@LszNb7t{|ZBgYQpSeBqvuxVg`g4eS=>e5sSvb)VO6Evbfpd6<&Brx>P zlNLE(I_??vl=@99f4--Jo+@mJj0KcLPb_-=CVq!gv1b&xchyTMPHwM(Ua)EI&~4H8 zhHfQJu@`4V->(TQ^%#nIB2;7@JFlAeABrhtwgV|mvyM%EqpK#uNjU)M^QRUgQC~gv;k;$lokpMS; za%)jl`&TQB08>Z=el65v;2WRa#YZdqGfjK*cU|xrnZlJ3IJdg6&0#e)MhGI3+h?SO zzKzB@9(&1~N?s|l91(v429t~}!BAnw5YaRBm$@t{#rj{QyPn}ykV&lTkd{Qq=+#;5 z>4d#ghW?!9&H2G&bTqa21zEq#V}BZp`@e2&7gOZw)XB~*f)ml~Y33Eyy(7;wVV zUp$XJRS7FJjirYNdFA*tC+;Bn;C@)Y1Ql+fI=L_A~uFYNYf zw6Y-#HQhiF=8J_xrZ4U!@{fa@FQURk-df&sOI5#7qU4^xrTHSP$G`+vJ_aSg4=y_1 zN56gP&-!xlc|AWO2F2x=780%(*ShFpiTMXmX8!3{U!V#2<3a>+n@td^iF|yUj5& zB?}?UO5Qm_Ta?MnMuF0=a|h7CsCdp0g>6;O`G(Jm?@!qDN3DIRF(6{lL%=%^MrUJ=9YzofeQOgg5ePaQi|39w2GOlhXXcud7cXxM(;_g<8ySo)A z94tU_cP&ty;uJ3jDDDo$-5n0@m;Za;FZX`RFPmg{XLmCD>?AXfM)Wjay!Hd0&cGNq z*4O1F#UdY7S1vaLx;a--^?y(T^DpCT46d7e6#F>X3T*ZL3Eja!@Hka!jV#=*OWAEQ8xT?ZNE;ll=liLbCu6pRMo#L zwKt#R9LrjQpn1dqWjf==EfOxz3Fde7iF$)6a#Ir&R|wnP(3D46b~r)g+Dti+Z+I97 zV{9Cht(o78GPk?GLFP)xsLOAfWG!IRsl=Dzjis(vW3WB>KL@Q9Ml0?&&_K#1Zm7?< z$!()JC8C_!gv)llp>I*s=R7Oi7`xpg5B0TW^Sn^w>I#B@m6KKL$yWYdGbeU59qs|= z06c=J+HZ>zYLZA3y;fi=A~Qyf?O5$%l-piI+E!{cZg2JPHrGURrAOMP5-K|sp4I|3 zCwQ^~PSbs(C?X@Qp({JkEFQOiFZmZgqaH2fkJX$M-+erEVx3PryA~)HeQN6Yn#^r) z;RVRM|Anvt&S_q%wP1nsk)DwKx~WJ!&}UPaDOgUISJkOF!25wi@|(H_jx|QL^TOv- zo~zFF@zy_oUt){mFyl?rv_Z3yn(oyyWwV5)^z=h}E*ft))wQLi6 zZk{QJF%?KB`vr}fPO<<;0&wyEf5<{-*?F4}!=HZx*eEorBuJ!UL_|Pw{L!K^)y|V` zj?D7-vk`Y$cimpl?dmRvFzL^N_KA$C-lmne_1@@ahLOMZ{Jai%*j+OV3ChCQX~L@T zHz6JBz7WfJwbeLN%4bA8B{IdnEe^Bz5odZ!O~CJY>D2GoD!Stg*P-c9t{r4@)Bi$o z_+omIR<+Rud2?;}J4Ff}eF{3OGCge|&mi+Xfd8Ey>wf!T4-$ZJ6J@@}-_9Gi&6U;# zYeILgCKlm~+#r6n2#5Z6*Y<%lj+}i0sW({4GGL;~)le)j78@$}^rDO8o8(YO4@Ona z3?LgQNNe#{JFwoCBNTxldq}}Uhbzp3ljG9v6xY`O@Z3kPy5H~u z4!?y5`Mzh_#mhjtIHVi)Ay`}ur?lY3ivoy{m54vP=WyZL=SC^T3}VX~CKX7#Vw;%L z*w0GA-Tc*@VTj~uq~o=eTrS_hRQ`(E5hko1>{Lqsk-W?vP6wW|ji`@a6_aXDpyf>eMxzB9D>t~MmFgWgVmiQ=7CEZ6S%qgVbfpDw{K$yeprLkZcl zGHrwSg8Fqt7avf7_R{U}&U|;gi3=dk`mAFE%E#yJun^ci*w~JVsf97KR3b-4*s!BX z{49*8LUVwzio7#7t8_Wzqg3M8Z<|JjVGA(-eXfXy@3)O!;HBMDX6cR?=x8z6JrTEw z{*)r(D_eR=SEwHISeL^v-)1$K&NMezbH3J({5RyY1o1MjGx0w5S8Dc~`cdGto4OvK zFs#fDwB0@=S-eT!L}Q+-fqcQ^s(;1iUg zmIzDL`SwMxA+D1%_|bR?OgPsY{iAb=a%>9z6jjnHzf`1pi6xfOq{jTy=WMrJB7$`! zqPMzq=|RS7_lHZV{G%K9)fa$0w9@{IVGdsI?8px@UYqRSa*~*h&&FKq60DDSs43!$ z+F+yKpA~W=+-Ze+V24%9?I#o&tqc?kodPj@tLn16H>-ud?`nGn^i@{#AIK~US2Nj_ zX`e2GyR~WORB9Au@^vz~ulX#|>%?Su{?0 z$IqWmWH?(VRLlCcwvF40SbUAYM%^&;EsWT>x(Hu=+H1X_erFNt6kU5$Y2t6`;esb@ z8%sOCXj;-CX_f@hL75E~ma#&~h_3N6SZ)?55wqu~1RS6Fgi0zKpPcT_C()7URp&)R zRC}e6v^ymY<%wik>AnGfGOe>~cU=2w(O*ma1a&y5QVo4O^DozaTjjLL#D&Y0PW)!M z!grd(z$FIStZF(on-vBb9A|a(^mG&b5kECFV40z+U4Dg;lP9<4Tf5jcKa1ROUiv#* zv&0?OKY2rMg(@>wyz-lUZYATpzl*)c$}6`-8C*>gatsY>K0hlU$zHV69rOoHN{|Q+ zt7Fdf=fyFaD59UNS=p&NL6?Ithk!44#04`UTw=DyA;sieK-H#&E3B$PGIg_Lm+P0z z6j)QLxYD`lg(V%2f_1p$pkJhBwh?$8rR+Srem|2N$|kmM@3UCSm&{?rsG1R?DvAFv zQ`%X@%U3GEcV(3WTN|pi(JPm)Vp26$2ph_Ns77B9!i0KIf_FUrw(rlu5O8U6Fo=@P zxg|L>tVI-}usHf;UtM7Hm)pXWX>q@kRMUv>V6z)NOZ~24r8|D$WN^~?LfPnBaq{SR z?@hK}laq!JUf{&SI*X{UE`FRjofeZ2N74Sxm(pA^C1Ix)@W{9g|EGZd#QX5 zTTV@9tyVL2VG6QJZ-U!ksx=j-p^S2<$9{Yesm|SqV-|8k$};cMOwNj?5B0t?3=7neE+?|mH+^xlJW8V_Puft)0_~Ga@hjyf6wC?-z2bk*H zLSMgo+;XMUtGtYhJDU)Ddmfykp068hO1s@ynSu z zxiR_Uv76)ddXuVS{IL9XdzW6rABrvLz)*2z;~DfrG=o0`(tlBah+x(YvOq8k)av@+ zPZ2KrSg&uQzpYZy&e%v_Os826qevCWaHxUVLS7}wfT6&oy%mrOf15l7)xpw@KC*&T zX7}6P1@()JFs@}v#0e6>FsO_PdMBLL-;Ov3e^!PLn-F`l^2oq6hc`jl7l`aYH?otfv34{7b{4vY-|jd?UX;(F zy2bvYQ29{7uFk-&)&-s2i{GIXaC1%y@=pqOqPXum>|fjy!YxUmoTJ_nN?+f@`+y15 zfcUl=`bzDtMCoMYe(_H~bX%q;A|}y_%-dfOGbC1t`GXjLNL~2 z4()dBV#wx1-$9xHgG(ICXI%`CyEmeyZ5Kf=93BdVkfRpN?I%r&3WKArjwfz?@`REg zI+({_W`ahh(9l7EnN~xDp_3o)->q%(@KgZ1JODajp2j^8ceWbDY0}Te1xt^1fo~qdp1W5_FWLL<{oon*ZKKTXlIz_56 zS`*9b1Vwot{fq8gAxL3fStW&9T-`i8ySQz5@LdWPaoWsnLa6u5S|qY*8pn}eLF=p9 z@)oOYc2#qzEuCARIXbnw@n}w7J#|)AXA7r>2JK2?xysew@Mrycej4LXCnCyH%@b{Y z*YziIKN^51JFU%nF1Khros+^H|F5BvfJ=^XQEeAjaIMS%R5E;_Sq3dwy%#0q>+avR zpUE&c8NuTJ2nLD17w^PSUeC!2ui>yf3sin2aaFl~RrHYY)04JS!__xw!cmb?4PQ~& zwfYflB~6JrV}}pF3!y^L-J_9Km1I*7?8Exu$7lfPOnze=!cszrTv~#xf=sPKnLoRR zc26UPRyZ0lVJYq!scdFJs%18JcZ@#Y^X<;DP@f|c1DH5UCskwBP1arx+>1*mb}qL~ z{P0WJ-$_-(iwf=j6mtHXA~<*aA;CkF2CY4o#&0I<_+h!5jEXc?LiuO=(DK@joePyg z_DU6?QvHw4*FjUAC5-w#3%B@d=p$$%SA>)_C!O5{^!8HdweHW4Gb-yMd6+flo%|8_ zI0`dTX+~2ig0%7##}$TCm+ceMPv{w(2dbvQ?%yGp+F6Fsvn)q0tX;pEQpIpulh(tR zdvs}PL%QM_TJl&&an!fMkn+m^{yNg%8<*Dr5@VEX`Bgg>OfWaXth5^}-MUPIKMSBo zTqZ%}!39kz-#s>Dzc?5uqK1yV7%7;!M0V4HT9?+%{cK*@29|I;xB=eXKJLM%mE_}g zn4reXsP@gM_RFaH%c!d@d(g%FZbvht@jLv^ z+oje!pI+su3O)Mg&O*l1c|LOCS)Re%BRB__v&9G*Q-tMzm-*X>GOpY4QG*Dcqn!$q z=;=30%I9bQ+OTV4r~E&YYjc@V|FOZmk(YqA8cMe_`ZBt-bJ>KIfQ&bPlx?)OoHXd zi#lJXUeKEx8vHK%`kL2#;CEE4t`v0)mFQ4jQv@?YM-kY>eLg@-e1^$rl`$8lg^t6I z#<*<6H0UNBfvxWT9dlr>%nsnVrEQdj`U^5#GH30IA^d}Ug7)AGMZ(jp_hm0H`^7{= z*F9(wob^lv!W>ubT8E*i5rTivk!Dd3Y^Bm)_S17x*0xtdKBz8|T>h*LNmtxrE-_V* z!MjaS&=)M(x}HD1Z~GRiGu-J#Q&S?nmJ=_$VIEs9CRFiqQh8Qi9|lZ}6HVlC=80K| z080U{4Oh>0cl)J76Kc>M6KW4)Vz~FumKawL=Wn`Z4t6LGW<}&Kp?qS%u>Why)idMM zgXX`h($Rf2;)y&yKOfnrL&C9Ao7ucvw>Y$(#FSy=qOZ;3Yb7OV+%}?*tLLxcLlxg9 z4ulacD6CMeHuLbX$bq6SlW9L5@Iaq@M}&Mw;At+B(D2%2teGw=KYkWP+tHy6qevSt zO17mPc|&6{-Ixz7=tq~lULZ`4=qysp>! z`!>k4&I{@D2T-$^N2kBHdcbW6s^Z2HrG)~~}o@Tm4HvUI_X-vxc z8cEb@G7mq?apT0C!i_mFEjj>6ognrhL?rueV$Yx33&zQdgjEDLMGss{LQ}$1q9^0t z2anPZ{~m>2>NyTQen@i5Zxf$zBSe_(lC;521DHrb8GV@X;kG}*;Ym!}9M(Gt`7KE6 zQPO1+L>)UO!?~WA8(fTRI1Zy(&9a_@-BQ;LS5+JMSG@q2L8V2r+8&S22pO!%gllX@ z#lqD3-0-^_SK0`4nFL+ns zAJ9ZU(EJkIc8a)mOCKVXn{ehW*|Ckd8%NJ0lskE*YciZE;w!$Oz6r~DZQEQ^I_YRq zv(jPQ;ot7@#hJp84f)G+=j(tj zE2#7FXgZO4zyx@SJzsyZNYIfR&#DE-0rGhE@)-#}EU?RjF&5n}u#qk=O{pYJn4v?mq%AI?$HJS}$@DMkPqhA8L1#md5 zm6)n&NZk@Ekud)0-W_;nAfJx?v(4;ujp8BOz(xAuDOR z&PivW4YOOYE?=kc&L5nU7Hw#~v>Sy=tla=FJ)$4x}mUMdDMJAM2%bmC(j zeHnB0}MoN3st0`C-Ea$278<;P@bZMz$E@ec*Px~3w98Y#hl-3g3MJh zrO)O`G6)*cWk7TV@3@R>DpsO2{9DmUX#VOXXv)l56Q0H&uGhb7i#C$&Da&>1+K)$9 z3wG9|ut2f=Ybd_0R3TzlOpltWqgr%<$ZT2tH}S_;n#B61*&-2MJ0(^9WJ4$zxTBqJ zeYvo3nLWYZ!tw*-EJ*M1aD~vQIRqyxRprzJGM0k3ECXQ~wfj(UuwBK{Y-+vC_|x6H znj9*jwL71ae;dU7nrvnHptIiVDTh>JEVka!DZlmx(V140Sj+Qr@dOE`c>L+%pJ#d1@vH$L>*jOkd@-v9+<)n<)o$OlDQ7+2 zG5Du&NoM+vWg~6=#fsEB?_>_Z^NFmr+4)bD+!%H0uV0SbyvLHPb(S-pha#J_zr9Yq zJekxa;lC=G86#pFn`}FOw7C2EN#d8{P{k+XvLeESXqzi&ePa%O{%_?iXN7g%|KKT7 z4<@GKiZk34&th$mfx)=$rDSr6yW4NUp1%bm+)~nSdZ7w77pGC(qi*++PWOqF^|-Pw zd%0|je(f-;4ogf=x0B}IXjBM6FXCBUtHNPME%lc=cp>es2xysPdS|WfdaG z&Ng~ax3i&k>}OYnKU(ba+RLw2LQ`Edn2Gc0v)|Kmihr(6Hn6X|-}(;}2XgNILBKzz z3bof80wOcZ+15=WF-USyQ-f*ZnNQnW_-qIVXBQ^|8}{{dF}Moh9e)a$jl>wtY^UKY z{~(bnT1ewr&LWhfvSCd8WhmSl(_K-rQP5og!7~tvfzLPyXi-m{~fAQrjyAuut zVWBkQiVpt6&#gHK;w%?Y8@dywU2T^D`@#bAAJ?i;e;5%jwDHB9EO9hA^!y!19VI39 z`Q~`AQYUfSH{eQBXK5V7j+Hv{w7c0OXY6|l^`A}y_$8k5Yxf24Iq?wwQ`xs)10l^Y zgNDF}bAKEg`EVzqag-rZxUk@Y$k_k%n3HR6%manKW z(IpBY*9ebE?u9cgg0Yb$a$Rjk?T|8J1&`0N$A}l=SMjoigap(st33;SDQcyNJ{2f- zC#zwA(Rbao+jq8-upiF|LJ`}xc+@=*YXysSJ`xNK@sHS>PEK%fj1kAKP~^jgn2Tl~ zEtH~1h~)MAC%Q4;$?C4xKsh$X+nGAa3b+a{iThU7ph#}UucOGPSAOu*-=>o`bg{4l zL3j;T#9J)>j$iOe=LU4c?g`ATM+HXs#^R`f#(lFPKH7zTIFs zaS6jVuFFthi*@`FzvtJO``u5QBc7V< z^KO6<|K)UAUAuwYtuyITo0I8zQ%C!9hHvvwX9tvA@UDu+E0eRDak;fNsYPJ@>ra1I z`ofd?!kOsZ7jMTfN53Y&)oNqBodF}DeONbaytb}#eij+RN6_^fM=*zqO2Nx=jTA2* zTaE;Q<43)c(Be=EamF%%uQP#W!|cpqBKk;Ygxfa;o^#3N?zPV$iA3n1+WtN|Rk0m- zglksU9zTvtawmPGUN1iIrRSby4|F8*{8P&PTiauSi-{pXRh|TUf1~a3+1=U&=-z2G zS{nD>3)4Ez)oQcRIt!T=sc@yWtPYvY#1O=y@(o5`um=6pE2^@yUg7EC8>evcoWfMG zl*c9d5*7xfWh+lgrY#r7J43y65W&V*9v^?S)w9HKjZ#tAqdzH(=KMRx9jXk8t)4|8 z&CYq2L#P1WtnmBMVSrVO4(3rR5dMg>39V%*E+XSx!VF<}eKR`}I(Sg*g6i&X^p6)`VDafLuD!|Y zKDAxyZ%}$_tWMrz+d1w|ao*N1R+l=*T(-0^84y0KB+pw;E&7=$c+$KLw+PA3K6hjQ z(w_)kUS2g;$A#6?nraG9YhJLkbRMAlL#?1=yGE!i09!vE2*tIud8r5Ao26Q&gsw(o znhH1lJkIv3+JV{Pj#uOqpyTj^`GPf*4Ub)`1#LSn=(%b@=v#fbmqR%)M;cSbiYDiZ zrY#7=x6&XKTuWK0@=414y8TDd&K_C+IGKV#Xsz< zi~SQE1f`j|gs_6i?c_azd6Ins zi|u}bWelss!orlM;f=uVb>e@W zkGPZGQ)`;FS{S><{f4!*a@2Sa3^Df4*(9%RF@saVz z$oISBeQ2vuSoc@Cuc^6QUz_NwUH=5-iq^?`eiB0ci}4)5H!&3UIQXs)nWnFle=Uuf zu|FzjdqT;2ws%_`T@d-1UyWx5^7qSN4H%8Gx)jE-(wa=G4o@tPIdyU_moM?5U^Skf zusF0n>1Y`vuJ-}K6UKb6ESn>)&lfxzf;L$>Yc^aA`rNkQ(jFDeh8RKEt^9Y2V)69# z9e?*9#To#@oKQ|@*>x2{%^bPy1zC+x)*)p?-c81l@IOV)gBOl+>K;vd^s-G{Bf127 zRTp@T41SV1|6Y7X%r@~x7zn20k;1sg*6zHZ$O=Fnjf(s9aXZuDV=VPb0D{$aY3G!@ z3UnPK1PikzKd7$ymns4x~I}Ld5e(QbMkYEEQi?vD8W@ zS4DSia~gQnbcq&af7-3AjMg@8zdc#2j!P}pG?H8E1! zoL2e*;3DaW{ro}{F;tv9SMm6?UtXXklcwqI^nkx3ayh|nBIN&heTnAvAY`NG4sKvA zk;GRnV2ku2{JcyJ#^qSl&j5II+CFR^wFw03bRgll9MrG2!Y^_!hs_@39mTR>R}A}^VVkoQ?P#UlTjs+7-{LaUjB~3v+%mD-i2xq zm^=tf!=@Qc&Y(Ue>;W;X+yAbR;;OMGU2oelhF|Yf!YbXX?7D8ju||xRjY!eWzB+RI zEr{RwN`;i^mIQm@nfpafseBK;h0bf?Kz2E6$nK)y4&lY$+C1x_Yx=JkYF90SDOCwD zW;v@2SqnY4>Ko0?XnpQY8^Y$tzmo!x)y|`AKdMcRjmfvoCtWP+6~5qFcau72w+pKB(7{yEu55-Z8EG{JUT$VFA(fNnI_qW`$?PlePG zGwd+)OH>7Hxr0>JG4-E*PEBsdK`*b!cICm*Q}zM0<3%A(u`i8(K9VYIa3W6*gB|dJm|bJw3jBkLn5l%>7ab zPT|3YFQU3}H}DJXU2f7DtHfq^s`Fv3FqnMYqt+iegE&jl=k`etuVSuS85gJ_L8ABH z1U^O!nIc*%?x@VAcpcKk%5T!e-kV>h4R*(BMThQEb(AX^*^MREp$maEVF;jleJ z+_;jDu+1_i?ia+jQXWj5p`&sHJVIl}6S@d{Lr^9?D6v)G7{V;!Mp$wgR4d&EGyX}I z%iLnla1b<23&DJn6IVN@L^;r~!I)fx)o(L#kg}}|V72ewz#!T{nQ5{0X!%v>YWBm7 zRdyTUS0!|DA3Hy&_~YkFYB(Z(wcQOS5^SV_mK9OD`gp}tYOJT9y=&}Ez)kc?yQFXY zX z(eR%MxuHWZHofpt$0p~c0|r)J*|5~at_e-*rM z+gaDbt-hVd8TBbie!CSj2{=uB`u4oN4l8v25N>n+(slN9w&ebXp4avkKJj*ch93Zl zXBTyySc5-byxVC1Tf<1!Ev&06>V2-%r$u1T@jtHU_iYaU0{saAzZmzW(I$ zwoOZwGU>agI9A1YK7E=Pl*0Pi&3C72dYO8Pb?llo5oGDiB3E!#N9aX!8dYT0tqW%m z^XXT;lr7YC;o*Me82qhFmkI_RxNvr6@r8oO`D0y}S*2MoRBKWOU!n#!A|n>9G!C_s z*;Va0=Ijy-QH2`dbYtfjXkvloXNHm%M$A%q8hG?o>|c|?vsUSaxzL*=@ww#FY#-WddQNbS56#UB z)A0H~MxFHD^_ncQsfoHYx=wlHsL!Fy1!|fF6Pup zhmp>>1J*Jik68g%FGee&lJ1SPE{qFzkL~@p1=H>yoC&`}roJPp9(9Fu!%DApe@9${ z6JPy-@(UCcvAd!%I7?_lbBa)W(p4lP;DVl?EF9;Gjt zut6tKQTK$&7lX@+Jj99cps|m#iGqNnMjTOw*#xr!%&2!2G~QB_mH&SHD<>nNT>OE3 zj4U)V1y)wlnnB9B_k|9iZD|~E?wbFZ- zL2eN)1Q}e{m)D~TM*KSSLsN}vwgv;9{EJI?P1TuIPS(fS1No1g}EYJ(OVa}@!e@nI@>cZ+n`P} zUl>x+GRyo@Zg8!Yeldd9)z`#G!@d{Ix7Me+S#11}Dlvv?DCQLbR<^Q~Pbc6l?XM&( z`$12l1gZXc@ujsp_-iP09w$p4zK&{g0fEieiQ*{ov1DiN19*lr zdhma?8Jv)dD}zAM02*dS_yV5tQZVCRGQ}=^TYXq}>-9>+oT}Kv)fs&`1RH*_-xDwZ zj5$TEB>J#V;1b!FWhr|(-S77E5&w8mZGRpj^f09mjwN8Xb5SFHmEdLOHAk7Gq4D|4 z`VX2du?gV_^AG{bvNr)?rz9Ln+J}geMvo!B5yv@~=*W^DAAiU(5*O>Nc9MsNsStb#b?p zKvcX6-M1^c$UkT}MEm6~iZYYRrzkx!u)Lz@k3&y_lc$axPlEd|!n56gK7MtMJH^hk zM2b)$8Ix}a?B5XBe&V1!=y?B<`(~x?|J}-QYiT)DU66ffq#yG22S~NGv$@K(3a~*@ zT3^y=1ICcngF4Hto?o~b!7*ShB+VMz`%a3Qf_sjD1Rnyic(VTZ)p9=qa?K?#%)lpelrF&LwG07 z_iP%9S&;hAaN6J+>IZ$I+_a7SD~&US#_Wo(DhxT;U*QexZ4?}-&5si%rziODE@PE* z>!KYFb_kZ}J*u$(WN-h$lW(zDD&ch6&ggJM+2Q4hCC=7Z;_WfS&A|&h0`M6t!+q{Q z(rCWJc+~pY$AAa^b}kG&tV{lOq_Rv(&)|A~S=0pae8-M1E<ZwA3B=x zM>Z)DX3I(AO%NAQm-%YPSd-&a>uPie3E@C0U-riEcB^jF4R|rx{9(*-Lsxg% z+R|^DZwr-qUtZ#nbne??05I=!Rlr{$bjKhSsCZ!o)otoOSAA&-180IqF*P^mHx6J4 zHC?-~h70F6q(@A?V;92A+DV=N8Pb!~)1+{Ml%jNiG7OJ}5s^eb(oKCl7p~;$b_sS_ zgQ^(RW5v{I+p@R$au~tjNGS;6r>Mt4g!zi(Add#?xCw(v;1l~( zeb*_vL%f_)@60YK?{>bM}I!2}xTWol9i~gx~29A>q z8&D~^qto^=%#I8fR*H@pT--pc$bc1MNo| z>CWCc`mdZa|9hXlgcVSf;C-jz6U%xvIy zchprthH>0o&=>HgnOLQxSPHdl3v}F0W+;In>G_?i1~foc`00&UP47ag5IwAe#xJ7H zzK@xSm(omDM4;GO%f=|A(F$3QNG=MW>1O=gVb$>tmGt@WKSmrRrdFp{b>);k=@7s> z;C0#jc@y$n(ebhc8d~oR1Y`MrIm^;Wz9LGP%A0}5Q|g3WBIzc{8SGa22&QW-WeP?Pa6GdvRr z(sZ$yY^LI_*B?AK-JCM2Q0p4II8|JgiOqijQq<*tYneET;GSWTfKHTE+BxPcE;GiP zTlx0)EqwFB%!deJQhAXAs7PfT$I@wOIrjKU$bqNQ=uuG|KW+iVvg;<5Qg%-!@{j&IovAm67U>I^P zgR`g}lg&-_grX0l9g;w&O3CmSo+aWJlXn_nl!Ax5#Se!l4Ob`&$8G{*eu{-K0wr>* z!xFuvLygnx2s*CHNEGO!!2~9*pGdGT!x%C(Tno(TTvlCVdOwx6qyl5GfOH-JD$vd7 zw<$l>><9Tbbl?3K(!SI^|JOL9S_uT~*sfgeeUYn?A6L0o9TpSb{bY{H4Y9F9xpf1W z3#(o>!fSOlUIevWa6yAVL%uR2BhuuP=vQgmdN%)_72Ky;GtgR{n^QpCT;4d}7nb9h z)0#^aeOdYAdG3U(kZ9?n8XcttXeBR~jJeG3dL76|Hvb$^XW+w&QjsyDiIMI%r&Hc> z!30%|=*qu-JBla;S?Yb;mA-gJW7TUaTc$axOS=(dvXpSI*fq`vyMM_z6#AjNd4Lv1 zX_h$!`<}FTyf2>e!^GKnchqDe(!_?#Q;fy^0E4g`ki$K=T+Y*ozWiwb$XUfEOP#B! zfAG8&|8kId;hz7Vph%mp0k7uY)>HyVn?-Pr^QCx~Dn=K)r6EWBP)0(eve@R&VV%AZ5-#;C#j|R2m(>@k1G~Jg@EIH@BqXDZ!YDbN)BgZ~mPS z%)nDH)ysk@PcUk#7#u-pZ^tB27Gj1P=7W|WiM0GfGMi$->xHIarzRDd9Fdnitu_2T zlY16eL*_tlS4;0X-DUs$lZVIrrbU~DIX<>rrWd+@>(vIn5Sm{H;4cAajtn=H8JGq=qG`<84N~K!Rf~jj_^-^s&qZUs07Kmj+uPio>Z=5CXm}F z8GY{RL+_XF_6$oyI{ONK5g`zzt6T1L5XD^L+q6N{CiVi*-7)v2smlh64O-2BeY%=| zN7Va|Oi+Pj=;WdR&1=##GmG#9)w!NIj5RFungaRX3tn}i>FMdD6O%)XU?|X-8nxOB+G}sVX8``LJM|8! zC*)PqIIc7R9@r9J6Ih;n7@PP&t$Z>Bn$0QhBLTczr*0GVPA57Kah`Q9#A**lJp#!0 z69Hw&*H^lvW~(zu*j-L5)wap90^l}&v%~f;&UGE}xjgChUieU03lf%#$65}KM3P+P>RISTTF{TT2>-bHQWyg%9eFU}y@ADM^u_?~wwba%UJ|HKRpP#h zU$(&0{&@I3gf3uwxxl+R0|Pwu*%nd@BU!3 zFjF?FFl<#%)@%z(zT}`|y&4jYoN(M3b%cJB8wb}9IvBKopJ{2!<|5f7Woc_HfmWD( zy@rUzuKT{dUSFa*{aYr4;p~kTnNIoXo{R>TB1x_(I~4pPn@)>-T9@V8DvSIH5H%e< zyV9$FhayEJlJ8aPFZ`4rRJYV6-S%N3v4&2)Ri}ngW85_)y&UtOVqH(mFL0iP%LAf} zLsM&fg#BqO8I7k;>7vj72CR%K+nis-oD|spSitIfpX>n z5VRwM@P&L6K@hrx@jHuOJ$T*U>+${)c-#2?G9fyE`p4Opl*=oI1K8$sa7w_3%90*r zzW*hmx|U4eDduys9swSS1UsA5cQ5c+9um+({!p+(d1UIXop(IFuD@-Ip^*r*Jh$#g zf~yoYmunl{XV-YUhI~Cff|TyqANm+UJ3J4+OitKQJ107=Uwbffaas|?V8!H4QXVRA z6DgPb&W*h_;e3UU0TfPRLTj^Z=4a`PgI+@sL^eVDkln`q#JhvKLU?qtm3Lkk$egq> z@RU%ToRT>}vZZjx0!czF0rzrO!jj(hbiyKcMuIGMnfv__+J}&CMH~O9uMW=F6zQiN$x1Cq_ zoXBCOg7G(Cy@0*gbSd^nBtZD8icL~~AVUVp&Aj{f#Q~J(c7^ez8kBmt2z7XOq@T1aY1*2o%foWTI$}rRBvC^8UxvsE4n*YG! zB^d5){gJKCL&}hk?A?Q;F=P2|E~=pqp8}SQu$TbQgog3imY?Ar*lpb07S=k4l4#ST z%UnYS^{hP0We*idM(98a_CySx8$ZVo9_tO5plt(NIR9JshE%WaT*LKZkDnoGuQ9q% zfkK;qa_>#v&(~gv^77U7uBpoc>fPp7<|bM3yjSn8kv!b*$<}|4qjDGw)n@q>S`fZB z5Ch>0=dDF)^GC--Uho#(q_pRXR5kpQB14(ShZ-Qy+ZITF>&e#Mk8|9SwGMK_K?!3=iMlcOUA_< zCjF^sOnEKR{IOe20UoCIf^3b*QBrL45-^YsDr|C^vd^|?5&=`RtxXFK6YEuA_(~UO zD~V;&pm)1$N}~%fBVjwumvZvJ?yY^%K1F!#^0Ud4wb*WCfBH;Lx5ynf5&atW z!EVjM-|($I2An;AL(QaUreefj3P9PI!8b}#h~5?}Lo zfSK~aL7BTb`8rcS+7MVx6Ui$8ov8ws&mMCZTQ07CSWR%*6GT+Ea%44{!-W#t&LR>b zeo4aHRtO^wcXwreBAUicicE1}wsQ}5PMy<3P2ZS56;X z)>k^jJel`==iB@yz9Ie_jsDUg!VstCTt5&s5jl-Ob_3=xGwSehj*KyYOI>3|2ikQ% z(89@bDQRLx*4-I6(rP%!#+gc>>1rO^8fG@!FC6wg!db5j^IPx#@zl3CC}X(kC+fzg za$oj$L@BDPor(NX=hH4Nrp}ru-Ko#x+}i8Al$tdK;q}c#DtpE<(H#nPnfyMn`C*Vv z{6s{F$&$yET350uZY>}|MRD6|t*nt&pYO;aTp1yUWp90Yp)qu6=p(=A?+*$qnbalE z_p$OJtUCon6EwwOdvg5GT9TkAK@czZpwNJ^%w`D)k?rXN3xwl#L3TZXl`pzUq3#Y` z=Ma+&>KRAY7e-RN?!KM#L*83}arYjFi-jpni(P_T5J}z%b^{Z*3-wHA<&<^4ydglu->XW~$1;`o$ z?8h#KpeNp3Xn+p<`#r887Z&7*hHHF<;&z6IUn>uOL&P(=PVOAc#-Xecevhyy92y}S zSWOLM{ZR zcIqA-N#+P2FOF7++%f52t6-@jbi~cG+OqZSwd`g@0BEF}ZQF}cV~A<7ZQIXWb-Tu( zSppch=rN4}x~~=iJEO#cf0UARbU7jRFI^Gu%n(^)tud|NuM)hVjY4t*-{-bdA<-)B zLWcOq6MjCC)0v7y4OKviv;u2GNp1A=l7+kT>=G6$apSJrd9Z~Szx{Fnn#oBWqRS}z zd*x4ntFuiq8yGArYfNWZ+3B`RI_r};`LOdzd#%UT>;qXQ&F@V_YKC)6*)<6x@&1rJ z=@@YKshZHI{mutuS>3M>m&b{DSly6MuwVU66GFz-x=GcH3#x*V+t+&s zeNiAV;?WEsLcmkGH&y2s{nBHKPbb!UVK$He9*B%V@)ua?2(N&HlvMBU+@KRaE5bey zbF{s$xjdMILRCC)_ZvI7k({kYV!hIVaEa+V4ui;0tXqQ)mffd7 zi@j74_%*zz9}1g}ZnWC&H_pz7!1oWhMl(|VuC1u~^iL%Eb6{C6 zE?N1LBT6{^XXB*Mp%jfP9&)_9>*aT=;RCn(l8`!&6Gs3tq0;Oho$=#<1R%UW_mQ2Q z@#B@uRw5iE&YR`MNUV5QBAu(IF|3?JW!{isz|6E}uRg3Skae|9qj(O1o28@?CV z_KYZ5;-p1k4~>MQzDtjr4+ac>Wgxp$f`h^}n+_QrIR1kfoA1hxgzaDm(rU63Jt2D+ zPbCBb(eq@geix1Dn1}qE<$n#Pf^3rbFVvl~_hA1sgT23Q#Fs*X+G9t;Eq5GOS@rYe+8(DirQ^;EuseituV z-T2fIazr}gCm;gtfe05!1p|Wh`=yId?Q-;pKZNt0`X_qm4D$P(3cAKF;sd&b%9V&a zIo8ysrn`Lv+ED5t>GOwHeI6gF71vUagEQw%={M(>Uy2sM?)@gpP*B3!a1gGC*^M14 z{WT!PGuuDNPNbr0tsgGY>nVu+y^jqT!ww!{J>-n%QM}m^;7{4?IL6@vou2Fa@3W$R z0r_K{;`MNZ@Aqn#GdB|Y@5rsi-(c+x?tMg&^TBjB0s^47`Rcc&>!nVoCrE`&u5a#O zMPmyu9y+lz)%mfnXc!o3lBybPt)spMU=Kus^QsP7?p|s=1~M@JQnHr8?wf!DrrMLFIcI1&itQpNel0Ls)hsh*`AqhcwNG3dt;&}QamIvurS4aI;(d2YL~&H&2u zcP<>-9C6XwZz}tmRr))N&PtO{c>leRk|1K)o>$qSHoqHW>(ZJsC7pLxLYMiyCi@+x zCx`QbP+X|ljolp6U4IM+zv3FM1D~GZD}+qbuKAa)Bg+X7z`!%kdYJaCdhL?rs5syA#|A?k*iH1h?Ss?iOHh3-0dj65Ml!`+3iw z?+;fG)6=!3YSpURyLavSv8_@&o>`PLD9<^RA2ue*F%@Ef*X&;RVY9(>{u?^^1spu^ z>X>8P=Ws1wTm`61;sf<_Liz%S75I+p#E$BBD^f^VcF$APXb{#P_k^5%dx%O1?>N|Y z%L%WRSJAKH7tDtJLY}jF01bh|vN*oM$n`VWj$p7}1SWXg$L;LwcfFEt2o>IE_2@Hr zd|iW#x69wHRP#PhAmjM7x+6*YqZ{%&g{T)QDIw3J4R%(V=z)G}e(Q#{+oM+18dj3W znnk*Rqu~~XQ_N83Ih&-xyTx`7wVhn5Q0%OU(yCEYb0y2%;1mN6{b^BwKI;maS~-#y z)rox8FsWqy`^0#?2=DkKbhB47rMu+7aKaYWx14uJm$26M(t^CTywAm=o$)qoV5(7F zDr;SK%oTIIwsH?3fQ=HG_F_E9F!E4nPc@-LPIroq>-CYLM!vCp!1w}!dk)x zXZ(hs>ZJTz^iVOQ?z+U_$M-(TA#{oJYdIw|cbZeQ8F;l7O&GZe*E?5!vICCesYO;^ zvAygXTG?%$>!nu{%-55L2BNCZ_#yt+&?dky8_6nDA~S7uzZQIs2cd>)dw+}V9)Y4k z&-AZ3n22i&^ZO|Jpz^lGUN!xaRuU&6Ciy2&PayDLbQhN7w zE~)vwA)6Ooi8@*;$->oc^yS8fnrELIKy>9pzsk+^wPXdRCG7ePX|6j0MiC*n#IF3y zW?RDhe}I}wGX~I|S4ITsF@RZa%(zs9a{8m&Vf(zxz4+)X^4sd>4p{K`NIa;-&FfQf z?>3ja5Dc=P{5o|p=+4iZb(2gN*m*OOJnI@eUMJKLYNuS*Y6jj%R6=@v;)m<`w!Nun z+rHwpr^Rb*_pv{>8!^kp)d6?PY1Zn%R0eGC60)qxeb?{5jcc&Lf1S|PMm`dx2y3ZH zXgQ-E0&imZvyI|r+*X!jN8br9kZJB`iYgiN@jHR<%D!=X^A~Fd9705X*Op2($u?T> znqFz2_OcyX*liwjrs|HT%|-S*DsK8kLp1k+=GNki;kCJ-Dr1ujJP= zJ#0HRyHeq(os&Xw73xS^c;bE5v|;&8ErQP=ApgZ6(ir-EcGy#s|LC&)d64VD;Pc)s zLuOf8MZG|V-rHjb+tVKqgfeB>;;0mnmkanvDpgGHr>k z(d?xXrEd0qq#}ReA-H(GHheE)UK5g5kWKMX2RI05!4Mtgei1%LXi9?pSY~#9CG2Ar zBU9=WTlnAH?E1Z)iBGHa?g3>140Cnm9<{D{W`X&z6RP7_u z&{?NL=0trqi1#{CG@I>D^q{76_)f>+a&@N@26EVH4u{B*Dp>>-yBJ-myYG~q!WP#N zDw;3Y)A}C8S)76fil68rm%ku+qP!k@DrpAk^XCCKuO5hSZ}oH1!qJlMwUQ zlItWFo4o4#h4ksJHQ9G;S=mfJTlzwL!ys^db!nN`Cu?Gz8VepeGHh{AsELD#Yqp*Q z1|{}#Jo*j?S$QFpsd(+Lb6FDk9h|DwsLb;htlXhhO<{7%lb%~j;-96W-qu26{`0>? zGCP-3#zCECUAnS)+3@uYCU``-APo>m3f#}xP1qbl?xzv+4))aQ3}m@TkZtYK2#S(a z_*e(}f6SGxx-$~_iXs|RWd+!KGBE!@#(TnsNDB@hiv*cNt+N;Ho>HPyUktmY59!yG zEEr6m80Af{RSdGwKzzpZzxhMnt~7f&YcH1%*moHURv1aD{gxEhIRvY$3rCFxb zEf?(4u+XDPzJ993zFiEby2~R8rE|Xd1LhwDXX^q?WdfDf7%g@LEx>RGHZdkxM;ved z_+|f@8wa6?+ZVG{kNjG&;^w2sx&|N46V$yw^bN0ljWzABQDk3Nf%!-l>VL4gyY}=Z zRY#|*nLuCuHE}L)$lhF6`>%MX|IKiH`TR-c`3YALmHq6n%uN)&;f5dFJ3&=kXS(oR zUo(;!yjir^oeJx;_$!{*#$Vr& z4{Q%jCpoTPfR?&{vbURaZQ(YJ;@;_&{l^Cqc@1Z!a!D_?_jQRjZWagqby;%q(#(mn z-ak02?Kj@ZI<&}5xtVl=CVh)GO}qM3vH`W}pdH|E@T)1??Y`Wc&ZfaaN=L>+CyZC& zOP*Yw`aiHO{O4<<3u^7EwR45F7X3R?2%B59ES=c&KZsv3@9mk7DPX#R>Fyy0QM1>H zkICa~>dSmRv?ve;nn2hEBPVpc`_isY+z4ppKh4-Xi&x4TvJ=*wbgwEo0eu2jn|a9c zKyEoup!8_l@-a9oUlIBK&caB)N1LsaUg?fwyX$?zDNd9P>bK}<^4inM?Dr}K@wDgh zWL7##f}zQEYnPf&Jx@8C<(#Z=J7RD8Cj8APB=M53y5H@#>U4Rn`-JQ2WYuN8`7an( zt%FIhiOEtq+r_*K>tbFLKLdpUUg`~Oc_E2&e)aYbnrqUMz27XLW_pgJgdTF)AWG1! z3!DmoRo8q?|C6`LGcfmt-H~kLF&{%zu}iN{qp8k%Rzn}Wm| zPW=qasm2!r4*d_*NhV>9zXxgJmqTwzZr-VOE^~k((urW9s;*3Rd&7dt@*v9RW?>Tu z{(6os_g;^9kC7*RJQ*m6*2~PlQb-+FkRBnUYUD0jNZux)-Q@hqcP+zDYkN>x&Z)Sj z+K``V}K}vR}E)}#8s`r%eYQ(;7cC>D(9}bx@#MOS>5~MXb;g!IryIzAbvA#hY7oRBcv&M85?yO$6nHqn2Zv+I<_1?d_xxgSt)WrE;J`~F zZ+DL(7c`v%q6U+m_kZluRc9)7fUTf)RNo+hLwVK|yjD8>P6n~U7#tMDyzC^t7|?-P zp73?t!o({HLb5OTJJ-}?5HtqE35%Mi=6jT0N9L8Zp40iCRJrw+98l!{uG{6vD61DUSoZha#0?-m z)hT;1Auxeu(;&w3kb=G8$5BHAX7CLE`dR~Wet#0U^&$7TVEf1YgV=?MunWBjZ|;BP zuB#0IOyH*>2 zoHRLO_jbwpdSQbLyw5c2vL?qCn1X@FaY$ZyoiYRTX3Yn0 zn7C?5epLmagQYb%UY*li5xn*-m5Dm+<%E8W{?=Yb?F-;yesxoHvxzrPBcHq>%)6S=i;-2YU)% zp98!1TU2t;ZOAmHaY~ zcSc)JsA$2J@y9GrocpmY^ZDI8!QtE0xbaa9v%;)XRn2YaYSBeKA*bZZG*I>BiVF*$>mRY-h4iNQp3MjTrD%+ z)$a&TP6lO7r~Y%!-JCc;d`swC3M{hkuWkZCy?Y|siwpPjlO!d-Y+&Y6Uvq6}rIFTt z4STrl*-{SAtFh>xVDd!&KY`?l;b-pmz)jT4!|`f9o8ro1HtRQC?7hQEGL!M%T&nc) z>vf12cX%50aPr3IedzB5xub2Jx>fvs#anHst!kG}P@F^5jG_%{3%p_AK)~b)v!9zuo@ra?r~{dV|VRsyke2r zpJ=cIlsc2O%euFCEAv~dKD`b8-z433XPc=tRSf)<#{h>1gab(26VArfd0e(Yb>1_j z-e6w(t?4VK<_-Oa?-Usza3X<5OWWAp`T9pY`TODXiSUool`$4^bVwFCp9(%u zzjxi(tMOc{wnf^6?z}eK8?d#oG%7SgVgTPnc5T63{tnvkxanNuFN&td;IjoN9d;pH z>1?>;eb&==?VF8X?t;Q12k4p>BaIy)awJQ7jxke*vu5&WJlZ0A){;s_N1_Ux3cW9N zqOO+Pw+P)#UlZofo}DJZ0eEmsxcx$m1-HU}Lz#=f4UJTv5DV~}vEbG5#km&DDXcGL zqv{-p-kl?+;`&CXi#C5=rz)3YyQWiw#^N_i>-1zsuSZkObxYL+>&Ux{Yn=(4FqU63 zEE>b!gYr~{|Bc3ZN)DKd9Ji{^yA*nFJ_!|)gJ~z2T+PC)h;R^gOxOtMu4Zbk4Mq_Jk#cVnl(7WEpTw z^PW??+1&LrKgqi5m;zSI_!7SY{LPQH#!`KUair}%f6AL*UM0tdDh6htBSAu76(|EU zN6_Ax=Fufj^2onu@7u7IdnI$OSOGmiRXrN7H#~u-EzWEm(Y6*JjH~F1>;Imgsw~2` ztF8KhHod2_x$u7-PCOP6{PA8(CN7HCs1n-|iBRpPMV0Rk_&qulsXntkPWrd!+pUEg z-T}sn<`HwMiMI$Nh}J^7^00AQ_T!Eb8v(891OuT(0SifRAF#q=@AUxT9S5DM1*?8F z{_9S`bOMbPU;4Jc^2U}rUM$xc9zB6l65xC?3%5&ZvO-4)5S8e$N8pU>%inpHA?;i$ z>wdN_{g0~k;kc)}ueZG~L0`xKB;_JiXc=T*7esr_(jpIbHB;D(ms;pL! zlBP5`Z2ZIj&kg}835SlAWr3@)#BhgdO<$kNtBZy5KSCFs%&1!0Lg}rFHtt1E|OuUl>ZDh{!YQ_H(*_3}%jW}TA3`4$Ivs431=+lwQ8ZmCko#NHtJYn2mt zdl43R;vzOoM90J)cGa2og|M1txW?-4p>{%Ss)Xr_fhe!kGM_tvc!0Q&NSFNMaCN{ajSm{t~ z{T2Xut*-6(1!vr|2_JzK#Aj^(Nw?JDxV5q|tC@`>R*VqSb1$9*I(0i7G1I9;>I?@gX58?w$C{+0onV_g?9 z76s4HCk%q-N6Mp;zp_zRPp?zyU$$uW`Km8f(C>96Qc-E_=VJ^yd0ZPMrvxl~ciKhX z`2;%n7t;5!=VIVWR={;)TJDLPDNMQ+?;-y^W;V|Ss$sc?UTM63#o-D5yn`3)yXJ5O z?r>l5Pf}}T(jD?L#208F=~by5+L0I|mV-mumCzd2RmS56T;>!yg!XLpC zCQ&1|d56jmLj!g|natlTUlY+awBY=+lbY;^A;JAfhr!BY>zh}%TK3&Y; zFFy^u#i@84D_*DeMAuUb@khvgy11H~NT9G~QH-zjuI`dD3 z2;f${2ex+U^#e@Hcb;$lVC?wYXZ_-O1&pmrCiM)hi=%7TNis{jEB&k2d5cI8LcCr; zn<=ocIcqhrTIE75WVQD?bq~s2-oF`kwBw+!fXI<{L@Hkkm8KD5i7x=#ZUvrnby9uf z7~zh{L1mJD+2IBL{J*zM%6H!g1P|5_uoY+xRjq;tUB#en5Gjb#cbw4HxSunUsIB`` zg_(}_*(20{V8K?g{;wpNu(!=~@yip9$$ z9>gp-xO;FlnogSHO`Iwiww*U?{FcAW?b05O&?*nsJb|;;3{B)2pd3!b;{$|Hu>J>^ zWmmqlC$OCg5D%0XNUXB*N(eQHg(aR$Gc5cDANm50PuvG4PU?0em{eZ9QsX%FAXTap z2z$e|D`ve|1vCj^cw6C?(RL-b$wf1ErxUboPeXvHxLny8{#}H{9gCvAdgh#>qEABz3zsFATToJIqF|DlfI_g)i zmN@;TpYa~l&k^v@`b95_7^5Yp@*#7O>R@*n#W$Q@cLxp5K+WWhTZkpj2~wxmIrQdJ zfW;=f0px%SoTzXhHzBP%D7qafgo z8vVht4NP{Y@a&4~NMm_Z*Bsf)b6p&-=7^u)k9ADnIs8CvrNDD!@nN zbJ`beD!`2ry~9wj+eb}B6@W$-CXNwG75n?+2d51AC`;?k zwd#*Okn+?CpX#1)=O^3GubH$zcm(fZSp=PDx&;+p&yCdu@m~#dsij`Htxym&}#z`)hZr!6z2#9psXF0Ir%gDJ>Vb zz`#8T-`Kl^M3Rry2Q&L;0-5#A7-msn2y*c~@p{vvZ)@;i0gZehhK=ht>%sHV$Nn33 zT}cT`$&k$IqdMePlo}sxHnvAa)OBv3w;t=K0XtE*?3yCO0z$N-&_$t&loa1`rk>}U z@r~Fvsri^ao=99gTA;6J==?9VJ1PSW4e9W+mPC42n;&kAPre4ew- z*F3Z$yL%4EFz_c zsU|%NxJ+X8B&BBae3cf#GPo+w+rx$e4UUV#vG#;-$-*Od+DSF4Zn+cgC*6~}^q%PI z^xPz6_LSoWB@Bop5_<@`w>fw}9=25TSdUC>y^cpx82onp3##YNcu{==w+()g65`@+ zt&{q`#@bM?cD=MsYTUn3MfVMvh1}(Ay2Cj*-3Cxd9)&>nN+qC-~95WX~+jFRjq%%!NwFJx@30va8aG*fr&~u@9!RGdbxh%c=In#WJ)Z(vCS9)T`!*mCW`y1Qlkfr|_$ca`$ z;8z~L?2l4dUD$*B%m*`Y3y9X4{FYBI9-dG^C;rQzx~!^t%5~S3Q^4;pA({WT&9mR6 z>mn}-KSzC@9J_V|3{o;WiOY{8RBi`;-E~#G*84>JHK^$Nqh73Pb{u40cZ^;MJfeeK zPW&d?ED%A$;45FFM(rn7$eC!!*+QRP(Rrx|u|a1OA568#&+Zc`Z!(Z952%m(4~RS3u*+uk11MEq!~y(c ziBu7Y^+BgGfi^7q6C}Fh%?Bw0CCj|s6~~>0hjdcoBEHGQMB3A8`m`I zNPVSGd5J=C{c8&CRSPlp4^|wQm@`WGuszSSE}f|zUOesIoDu>VaKR%_6|XMoz7r#T zeK#|}p|EG-M!@}1Cd>G$&UlsE)$I<}R&G-FWBVY_3nCbmin1k9gFRNNlJyYpujH9k zdez;}s0?}5g?(LsuHp{&jIbk>1)qbKPCEmg*Xuw1fZ+9u1D_|0erto@{YX9HeP2?G zZ#}~TFH?n!dn7aH_U(s=ypf5?la=e~%L34@<}oC4ZyU502)RxSh7(UElT1vWF`N{A zuK}y)#h&iZFkoPhal2X70^hpJ#8Wahl6DYq9DQKe!E!CjSien^yeOFIkWm-I;hCD^ zTTN;CcATOYucNOTA!h<+2?}jENzE7jR=3=|Z3b!j+BoT%&_zSOJ6{Z5gZ)l{`R=X> z-!op!nf$8W;?6??!_BTy2fT@LQjfLPHoJp}a#HOxUvw#Fn@|@daf;ViWu8Sg_J8w3 zF@FF3hr@0n(h?Og`AfcqB+1wy6kakYx7TC){4-ww6IdmC8Be=)(6@^&|{prPlj-t3b{6< zuVT&AXC3~gaYtT0ru7c=95Ba*&SE1U%hMf?g>$gllOW)poRoA0Jigd0R0-Ak9Tc2c znAy9TDY|`8bn{ef>?pi&_MEnXh5Fe}e7USkYarzKq6EACY{>FF6R_iXaw~q(`B!l> ztCtkywR^LkPkJuk4P(=vy|Hsjbhl0-fGPkX;M8q5$TAspaMvkyI$Q2Z27dRBZNT@3y`@ypFm#2p zb)DBWe&7Wj<8Bs>@26wmiUG^PMFeE^lgQTbfywu$M?PE_SjCJDrGY`>Arb+Fu~!T~ zAV`vt$n&-m^XK9Sx=dqb(3Es({14AkI#CPBEI(&pu!?;>)$;JnpJd~1_2DLJ@-#e_ z(M=kMgu!`)&@G9?WiV&O7K%oAKf`v;1DnWtm;8Y z@P5&Z!)KEF2kq=*ZK5#u zeXOVrxv9ht#AGJCZ0^~X7GuF@ny_2N-<6gCs4>(>F}nFypj4r;+A_-{b9b++!Ojsz z+>$i)f}m|LMeo#Y{XD&OMxtK`8M zrRylHEg@Kt3dqvA zo6QOF%>!j@aTChPXfzzJ>vS=c*M=gdm-p~*cslMu8XHypW&sqOk_FoZT>p6(^x&@Q z#4bffu`!?AKq#UQhS*NV)DmfZyfRR*Wk)L37szF*TU}d;s$^Xu=X>7^t6`vLV5V}jy;f+Z=qCa|1P0d&k@z_gXK)CgvZtlJs`+KjFRbR!augp_2+H2 zS2x4MQopybY2z4P!7$(d10wMBr>=Z()*0HHjh8E>PM(pg{yU-~D6fr8Q-*?VEndgf zor*1*irxM7c$0DL*47SgeYg~WryXCA3_Hnpq9f<($L1QqPOW{)WjR#$tU@^m4lfh` zsFBOp`pHQ=V>MpST29U5n%<|*`YGgzJiz{YaZ~ZHCZn!=L~F_`Yw!;Lh5D)Rv`D-k zi25Tl61&F~lZO2EagX4B`MCy=YwF=fq{b6qn$fsYsaVK<3dCQNL@@!-xd-G3x2chx zLfo9Tm$mT_RC`A}W&8pgAPX@fNCF!MLl(-*VTRMTkM{!E_jrsm94UHw&LtH@v{qoy+>%UIg4 zK!>1~*C1T=nKb0urF=^S1a1X*3#yUW^@&t?S`ju=eK-zo?LNNO40th@N^66*q`^|N z;d)qSCULAGYXB<*zma;RlurJ}+|)V@``o+?Y@>1ZWYzX1HGr}FGA|uh)B*kz^s=Hs zDVK)5eDK60mkQr9TrR&@Nk9lMSNVU|p3Bsjip#Z@)6l`(i%Lm;py2nLh8cBJ?_d@z zX2+_H`|8dl?gj8^yxFOupE_Ir)iA*C!I=7xhUU|<+!U<7&cGu0cacyO8XDTk$tfTp zU?pp5ZkFwPVBd6@(~H4Da@(VunjT6XAJmub)V-fCCp8sZIPsM*SmYnbG-Zsw_)Zs6 zrVUWlP-9`C+4g=CCZ{T32!t2aLvG-OlZZuZ;I#}{Ek6RNwPxg;Xg))L*g}d5;<>X1 z$T=f-=b_fgMHLL)&3P;kc7hNCj5>~Gt^e*}^*7UnJH-Fh_6@m041|+E71blmm`fw$F-`5U#-T3@K3HIN#cO7?Zy{?(*-mx|3d=%#k28o%TW1NxL4-0G+Rng%2 zqX6px5WPtt!<$Wgo@p#Wj)DKk!)Ym>l&&V1#xcCi!R0Qh;SlYgljHxzIxQA&@apFE zg95GLUO@9_Scfeas+zsXNJ|Y@|0v7dTV7h2q-x5bY^@;HUip3*0u1aVbqzwLwM6|W zNTN7S{=%s74_!8R-^;(c`t>5fkJdgby_QEYcRTt15RY4f!s`P7AWcX@0YI^5c70NE6YKCe?H6@vgqD7R~+;2cC zLnBiOf3kXJL?1tn?27##Cbbace6JtERKIL1h1BdQt+XWA=|Ymt3{VV|(a1|aBSaLu z<>;GfK!h}PIj}4IA_6&?2$jH(&?Am9ig)H+xpt9%HQp*0*oy2Eq-!4k!!+}!<%*_w zmQ$A9qA;`AS~NnsF07zmC%Qs=x|#qG%u@_xP3z@Xww2Lp{L8>!*9bo7Mx@go&nme~ zj=fr_zJj`PF+)$CG)4l$2IYJIq04`RMMWlJzU=eL8fg3V*LvO%k(DzqvSK9 z=iGi)0p~h6Bp_YCUTHV>E>xvMgQK9J7$<(M2A*RKzZ>ovcC3C6c3aDYYoH3R8Kl(x zO1!o|Rmpf&T7uxP^|1zNK!$mLbL=vZM^_=9WeJU7-eUdf(+39)X&kMZNbxuNYFBEu zTw6F9@nuI9YO9|#vbGCT2tQGPktqqB*})+KHCemVWfGOMZw9^Eif1*-3)%X6pFf(o z{JcfG&4&wVz_Y@2Pwgsq%}>_xrTcoPkhl8}Lo@Qy2Yw|nlD%LSjeL!JcOh`~u!rAO zL|r+od-wRGw>E+!O+a%ExxrNY2Tz&(Gu$~8Q^Ht{xdfG|xIEkFVNFZ5#e!XZ4cTGWYKVtq)K<+~piV=LHAQmL-Q>v{dT z?yu7?6mh8F_bbJSN6u>DL92IlLUJoiVpo;KrrBXQsrclsY>Di*Eba zQ=JeE{UvE#YrO!*r|jM6vZC$mlwSPkPbx%pKHIQ8r%M9I3^M~p zbZSipPsC%$i{M}9q;Oxc?eJyg=$G0T`lqO))3OMLnhKoL+~Wd=3{a$kiMi(Gx%4?0 zdgwrZvDT3qiBox+lPnBc?TRk>>o~JUN9@uICF_XkD|)x#)5M_R9BP7A)#ahYqi=~I ze_&z$D%@un`^~H$_O&u9$7I^GYR8kVo20%tfwgcnL<4a3puFlTpsj;W~{`}~SA^!r+aEZG3m$dECl)ojI*ReK7%A^}7usEq_i`&~z8+@c{gvJdPExY$C0r1nVZ<{J& zJuB;LMSfWyenmJYVdZuo_#M>;V$GW3-!b^#3*=jvpFZ2@D6@z@2`Z{Lm^0wf?NG%4 z+?S?bh$^Em4!IK)wt`2w`hmGPk|>j%(A#e4&jA zL`%TdlPyB%b-5)WcmDj-Qr|oQe#r|5!rNJ_ia z{JeJJl*MveJ?KdU+xgwWlo7N415*;I~>FT1;%2HbDa zm3mnZ{AG;`0FYCo4PKDkc`_g%ohVf4Kdd;{e*gNXm%x%aqr6gS1o9y2lbKm}<0*Zg zYL3=Jvy5pR4 zeUQHg=1m~3ls`*|Rt)RG#?fhA#uI*uqRWAA(nmrvFil5;x8HfKq$d1~PO(FOk+(`h zbyMRnW+9mTns^|0fPC|j4_o#h!N^cxB2sAeUsIHX^8;xC30C1M@=e4iXf9wVu{jQF ztb5Z|Zv!e%A?C1lO(XCh8RmUj<)Pf^T@`=uAr!SK9IGsQ;&6dn^^)aNC9)BctFu$edO4HCuya)FHxmHY*K#UNq_JDV%{6Jx{}iw}u`V?p5rtD( zzvkZ|A(N?p0=Lj}#fY~tGK{8Eup~r(+J;4H=8$e=uTfQEvtI4q?;nSj+V9^G>ZM?$ zJdpEo6diM!KQ?Smj#M3}4(Oqrip^t5Nb&2JUF^G!*XBFzvYPoquRnw9oLTWQ&nkB& zGWGboyAnr#Qw?-uXM)eqUgjV@DL|p$wXcp8Y%pUro2glakjcE?ou?(3Jcct?rSf@` z^S*oA>vi@9vTt&FaHj{+0NNoG(wfINlaDvzl&d{#LKT;)4Q(38jj;DgEc)Z{VS+qd z{{wM8qn6&GVi$MV<&Qe<(2xoR75Zs~aydjR%0h3Q7R5ykxj#Lxe*}K(#q#%~G?pvh z+nz>W_pG5$mf~FCeq84wBJy0pY;KE!gEd?snX0zfnza9g%O_X&7AG>=NG0ph*qyt& zRjj4RpE++Ao0Xyo;6&2!`5SWMBE2CAJ5%O5du(l~q@BPBIC5^>7dPrP-jq5*&a{Y- z^+&Z~{P9VqZiV`(MOLPy;&N-8fow3ssJ$yq;>R!xWo)$hs{xG`%S`BS9)f|U0F=UrpITZOD|KmMwQUXwmoz?#MSPOX-f(s-BLg1vkgQ89)yO~_!ophDw!OeTegrN*WY{90~x-2 zDKZMZpeSSB{#SVL#qQm?;X<;43&Aob7g|HfK(c{r#1bc*p(4Vvk+G7g3JWK9AAKNx zuOIsnTq%|!;WHX^vV{#)2^P29iVhC;8V{4)|}tVzj4t+(-!G@YoLZ(`J~TjkfOn^l!tJ8o-hJvrpB zue<8Fh)4wm@&uX5_eCIS?rP|3@aGVxc#@^a(^Ml3_;lVI2;M!vdbhv*9VGqNOvnTH zd+!WfS61@MlzbsGj{hjLJy;tdPJ3y$(WHmSmt;)2CPpAuW;HJFVvQGWFYiYDB^^J_ z!kT|tK~4h-;6JmE+FfxIX?c!N$@^>jKsTb~f}|HM$Rgs*<8%m0%XxD*IwBly4_ z%v8IWB@3}#jp-2daGBt$m7K~dk82B{Rm%@~i1f#QNlx<2)N^|#tzgU)#K91wG^5ZN z_wIg>#R%Ridq@v)sIfxm+pSJuP_Xqm(w3{d_p!-aNZC&8WYI(K5Vp%sUaL=`I1Jfe zgZoFy*0FAQw|vxyOu6U_=No2aI--aExU%5>Ejhd9=Apv9Kj7gwaNNC7#4sLEULMkz zK(6)~{mcLOgU9$tm@)HZS-ip;d7hoeqX$TR%Ty>wHp*qwE85bZ5lCZXEz4p#veRI;{9VkE<4Fj10! zBJy&W@41G`vkn~n7X9Vvzs(PXgH z);_sSwD4H{hJ4&;P&r+ixZEgKpH`jh(x}>@Il6%GsMDc5k(~ahQ#^T$?X$D2Oe`N; z^%Q_F0Y`R71ZdKft?EZIMY=^6M&`CYk0k=0z44LQ=tNH9qWKMG;4w zPci=1)vQA=n)71|$-fYQOAQ<~l6&fH*fSg^(m$fmRLIoW``u(5>mW!?#wPs*4hCN9 zV|Bu}`u}vJfW`v?H4S#6j(9L**zTJZP6Om}uqWWj+~ELUtM(V9VA68l!iy5$r-$C# z6lbSNaW@x3?PKRP*{BY)KRgJG`qy( zkhI||yLpkXut3`fT?;Q7oDz%|d>H(VmB%Pb;-~meDQSq#ZPfl_l!@dJ=IE|eaVFj6 zgGre0fn7I#YuB6$8u}jlyk$G1pVe3950MN0jr;(ZGBeyT9Z+xHPQ*CTG=x7I9<{cf zq)mns-TPiKX8?x_C=S6{p@I`1*?hCZ&!5w%=qskS7(Uvq{Ppvg+HAS{cr*BHjLENo z&A%vv7acNb4!wgvKrjF!=z%hj1;J06q^})j1cl69MF0KG`a@pV;GEC{28{i-tkUU{ z9@fX_+AUq(pHP-{tt%rbx+L0aICj#aIk1p(!u4b+fh9oAz-~Koif(|dGJIusw&Xhd zMEl2x*GtrG^w$yBTbXks!w8u4Pn#buWtbB7-bB-;6|L;<&AS^6a&5DatYo#W45!-v z8pL^+bSMjzdmpgREI+$I;_F|H+qTjsr5u{$*MGLnUGt4qUi1{MXu#!x+bow}4F1cX&-}|f z9@Ty=ToVc8>4J*cOMcjrn^J;<&rq;Jar>b(D^4eFw!C1066k0bn3nOAJpRe4H+>~T zn4l;R6Z|QsT8K9kF}jZP?EIWLQ{0+x(k2^Yy1xJjj31?1vZ9TV?anm4IqDeLor@ek zgE}im^47l0()epnNQ&y@k29~lSQi9?U@fVv5j4#BNi7wouoV1)rO5bUpi*a9iKvF@ zG*_=-$Lrgl9wtg6z7&($ySqE3w>yXI4o~uDXY=oM34MLDC9D?TDoQHjR0-wF)>I0G zN;tiNMDJ$R6LtDC*+PvfPPsjc-04v*-4<_wjZ>WER}(;wbo>cn+Ctr?8e-P^`Cb%I znJWq$DCnF0>j<^=BWwkQ6$>pECT$tA^6b0pHbmld0s?!&q!p-SjJC!g$dJzn!gB$- zggR2kiM8U0x(CJ;-x6xM7V}zjmD~kx?6XM6(Kl^;* zUya0yO`Oo(i;#?LY^`mdn&jvMjz#L{A1)a6^kdkQF>|!e^j#CeiZY) zi>o4nKpyLo02lq><@q{!c5;b*oo>9EpD8lH6iEn~VDWRMrU;dA)X0a>|2(W_8H2~^ zuQ3OdD*|nux++mZe{g~f{&75B|0fJ07MhxAD!3n_tZ;$;Xs)7%S9sF0L3W44*8nbL zxX6#uYPg$UAFw=Diij^f{;s~7Klv9SLRd3N>Z3`v;N>J488dy>k3`by`DE(U`aSmr z@pe2B;yCcReptD>ox|or#+yNYWcqVLG-UEJ9G853AX*}UzGMlsAlFCYO86h_AbN(odMwxCC&DVO?0B)7nX`2TzGC!WRq0~gBYba$>>cF8{o=D@L9*d6 zbh-t{aWEG2J}|gFO6(o0Y6&0IDe%c5R}ntaK$0KFeUmBxkEA*71&#P#2^ppt~7f*A3QY?AsuQkMj4ME2yr7|KF zO{>4m2A=&Vx*lbe)1aXUH(Fc{9Q>~^ao-v>zF&23en}~_(3k2>omaP*t5qddq<>W@ z6sU0hF?Uz9OfZ|~M?Ys#J$(u!>b^Q#Dj%WHx2u@va1Jg@i?$xKeP@Tv2}FiSq;KPV znMHLR8Q{v4nK5DIf)n-m@M%f)!3y*97;&yBYaRg;QfcHz@ga!4fTy;=y&67szf`hW zYY*?tbx-IVRr@QR5e(Hzv6*Ed5KiCxcH$`4kOzwm8-h3yJ=zv6tnUXv9Ss62BHY=7 zlZ=ncHd2DkZ$s~9uI;=C@4cuwuAB zCIeh}k~x%~e)k_%|48D>!;0M1^8Wh&0Es|$zb!G;rq~muC&TkpfF??RBhMRv^gXXfuf_L&J0NWk zy3hxbqHHyTXq1^U)P=0Hl%3*>fQt=JiVFQ|54fr7g+&zR)G(`rr;{)<4o^mGp`e8o zCu{~`54v|%#DI9niTC+EfTpU4OBT-SI6K29V|+5g8HFw9G+aWs88D1e1cf=EID&PF zi`*k;z|MyNUpFQi02;&rZ88H^Y6n5x3#xWd zMnORjie^xAgBI}A815C%pqTGU(tteu52tCy0;4!XMVGcZ{xbdWr`KY_1*vG8;!tZb z;WDtW3Q%hq>M{Ve#87DnW;F6%{Op=7+Mn9Q5 z38xY$rB20}@F*&v{&e9*3^oANl53r=dH>ce*_^uopb|+hv+$Em##7Skl4gZeGNgEz z6i!Itlr*a3<_Ej20XeCElcP2{>XYLM$xKOBCq;+p>oJ@;2fgTWj|l~+B{L6;0GtVz z-}D$j9S+IMM)If_e0gGhc4*u_)Nix7@x_sG_td(dcOMn~7d5=!#n~|~>vMqO48?;` zjG+{N&QK#iKlF2R37Cw6`Yim#Z{F|e_-sVC49aS7rM3O)Iu{a(D7>` zP#mCm{vHoMb$!N7RSj1(7KG|J45>y`&57(g=js5p8i8`ZZGgHAL#>*rSMGk-(UUKl z78iG&c#cLeUF7^daPL?EPzIGKqFk>* zlbbgi$hw(<8<~nGUenf;GDYP{2@2^t1#}2n=!!jB^FJsc+j|+iu%-)3O?t zRfl=ovbq$bfQhESM{5Dfgif2&Q<`Z&g;UrN7)k>t7*l3{VuaLrdzG4LdROIaI_~(A z{avB(CandQRd`wb%aRrH<#__!3pWNtqTEz*Nzo#Clbq=!tCBN~6fCxq@>CZ#)1jfJ zWS6Wvne@0=^lxSyGkS`mKG@aN^leh>*Y|6#S9jf->((8o33M|6u$39gT9Fi>I3?< zJ+J9`4bNj2;`>#XNyYIiHoY#tDPfcXp(s;?S=S~r%lZGF^pU5l8SuPN_G|+>6^t;W zg!{d4yWu@Aqi03qNkM&_Q=S&porZJN56{%FVzY36(hz7RMW;TXQ^mu11D_~(zmKYcebkx#xS^t=to z1{s6?ts_)KD665P3EJ(U?XLN%Zyt`(iGp$lszOp9SI{%455O}Ab5)Lc?^NW&+8?U3}6g>(z1H-G$}Z(Ja6y?t}-^Rfz1X$GSq0o2iu?6i`n6?`x2P=@+{ zDr5impS_dr{D1u7k59|t|9s<5>6(A~^?MBzHc`+*LBkB{Mo>E^DUMO|I8>fVK&3$e z>bDG_asr_K%Z(e^-&QW)rtnjWP8@$MVeXnB zNRl+eRu*e8$N|n&5W7`eeuG)6l zwo6nji%QwDYL?ZaeK_HV0`8Y$Rd7(DIZz?=_PlMPKr>72}Q_b@#o>z9flI0bVS2TSp1;a1se#!K! zw%_nrG^!^t)OkAJA}IM%s-FCnE9gmuhout)6)!l`!^2Uy-3*@;(Y?(0&O!I{z2>Le z)larcpY2q?KIuOz>90C}!Ks4Fz)+JkRh!;)uiCNq)N54k$x40+#8=<50F359O~6sxsgx9e}2yhYK#wJ2+?Kf`cnQ zJ7`CQrFsByL(o3*K7-Z3mIP1%Xb=P{Y0R<~gPaynVtP?S&&v9Lm3IMfX8-YP)x$1nhZ3M7Ey4E0?A)MbMEm*2?`XZpcj*OdV3l8Jn)rpsDbaD*#{ ziw%Ar=IUAW|6DJT?|T~zb?rpH;EHi5OZ4qi%Nl?ilj`DA)jAlV?KXN+MUTqpSsiV) z%$=@zFfu7a)xl|hNtN%|G?_rs$bfq?!3)~9?Rm<9>&{(RLBNLOW2{CIHAs{=?!`&f zO|n{&nUcKDQs8PHX@;a5vrG)Ge<@NmeNwTQP{`^<3?*h@q`5-+70&GAQZD|(AGS;NWGh3SWXa=y0(n{`&l}`Lmr!Q8__^4$ z!OmuYGDQksQ74%R+3&I-)RR*9Fz-Jq1o95)GN&hbP0I;8ZrJmv1RW=6+bK->Rn4!? zcy^x;!s1gcJ$&P>_Xj4X^i)yV_$dld-e!QBCq6~46Bw2|vFwg%woJ2Qpq`F~nl;hv znQ9xVYtO}hVL}ZI#X=L>cnp1Hn)GLi9n8E~4Vlm1f-ogl4Us$&kk>4dDo9X(>ievG zMBTvkr4&A%Wg*5u$ryze>qsnM6qv-ke1s+{QP@2Ew4oQe21czil z7R}B;G^#XApo0mjf?=sF$`qb8RZx;9ww%GY6F$;^BwJC0=cKVG04Oa>wi$?#3)I>%z(s!< zfMO|CVEXD1L|`IS571W_N(Y;K2vH}BP8HkE>vl%5PbPL|YG*Y&r&|Tfs#sRjvO2UU z2Y^z47XgX~o-_a}PER~ly9p@=4OnPFA3lWfQ1s9?B=WgnFwZlw1w*9{K{}rg8WlLh zyj}ql+3RJBfRwjEmI75v^t9T~^S*HknR~5>lpJz8Bl`og-HKl{@bg;mwBkLlg*#nx zIAUN$H)z567$Q+TTs)SXM@rJcu+S1zXaoI!IBrK#J&0-^uGnGG3@B?946mSjMZ+yy zZbKyUDe!-(z)(EvQiG4Y(1b1{l?Xo#Aof(H+~ha~+sT_wPIt1JlU1G5sdK70*{PFL zouclPOa@tPIM5WDkS;LFgasxLa^jUD_|PX6GWUiMdun-JouZTH6>YD8yu9h<3@@jD z`#H_esZ8=3FqGprAfqphL#ZO2&k}W|QdW`+Po)^;NaKCz!%_``tRCzS!>va6AdkK{ z7~a~d+=x+A3ZtyVz>UZpdR#b*Ch@24$*}DXH9%+;Eaw>R5s6Bxa{Ia$U;$VA!&M{yid7?A)_(Nny6v_OsKV>aZY`0&ZtlXdiA$o|jDIh5JB%QOX#_ zwDV$jy5xn3FWuj!$uO_2JM`Mbp6GHLU!ybscX?f8sSmsgCZxqe=S}4jai~-)ahD5{ zdXjVJo^SziFOUgk6VMeC`7UOtG?DMSC@2wcs44N6bs`;{iZ5~a`A~lgg`Swhc3eNy(g9@%9M3s2Swu_csL{7Q*_Ik8G<%n*d18l+KT`Fn-^IJ*;Mc7o&GAb%Qvy!F;rt`a>t zjPD=E_fE4Tao1zRpjtpr{gA24G;M>kk0)yJEscjtEAr`5 zMLs65#t`%*ho8P(fC^Uz2(OJpUAqUCjn6dv#OWy=Il@z92MKe3P;@bCX;eBe?_tu9 z$RL&^B7ICcK54n6VUZdlbqmC1(r{U*ls>0z*aNGqLM39)GLwW2Q5k^6I|kENmqrUl z-xov0QpCiO!fH$aoj5(|6rCVYJ_5_Ri=$Q$H9g$$al;Fl_$-gB4Sx0cumvb6k(Ml5 z3s7k>Gy}M41_c3srm&EfS(6!xiwd!)j&0X$yI|O-ihb0#ciZ+(%iizXM`JrPv+^bj zLNy@`Z)91DR7b)Tfv0qo>p*ncE$FxFf}YwClNtj+(c@Y?2t`kuo67V-0LzUtRN4>l zZc2rQM4M3EAtj9zRn}$E_Rx*y|2R)AFr@&c9NBah14FBSqt#@CClJy335Z zhI11?ExV74&clNBAcr0moagmux5wg8Ig`{w7KBpQ<$Kfw`tUTONeNxXQ}|LYW8+N=BF>e@_Oe zn&*{VFK>A{(>pV~Gu=DW{4*6~#sI2l_!Vn8myZvL;^}-yROnqQ+bh@XwV|xs6sjfA zC#7fyN7LX%JA6>|KR;4F+-kgg@AR$PyTATq>;Ha#`1n^h@4flaqd(p~`16bM{nO#g zx_vwj%QnlP>qG3R=;2cnznb9ZP5gD<{p>*bV5|A={j=ZR-u>4P9{uX({WottdF!*6 z?|iv;>uHX%$!^Op=nQ;@pe)jQ6rL1*vSGanB`N9{=Pbre$1{AS;DZU9XEj_vEE}*M z%u7{&P-#p1bfh8`a=}1<5uhy4FB3>&%&Fl{!=-0Px#`oF6KV9!h3r$IDc`#lz~|44&SLT98#{%X~r3%cB7F)7zu%+|J7atYG3?R2+G zkFD&u^Hw&#Ubmk}?v(3YS6aPuH4$C*>b&-Uy8Okg^>2P%=Um23EWX2aRh^dr0gG1y zu)#8-wY%aC2%ADJ9w;oEKGD!!sA+{6ND@|{cbcXm!s~PI5R^VZmrmp}Ky<_4vMC6~ z2SY6oR2W`9k?*|P_9fy_p?GJ62UWu69-&Jo^2zSaCVld8GbH?x{qHO)3)R0}k39nh(SP~Je4zcQ+oQS9T1eWEy7)y*4T+48EM-=Mu{ z81`5eL{u>2qjCJQg`d@fm#t{8M^cQU&{X#rNl~7n=yWn+>*+G(seZB^pzyU)_~aIz znpG|@AECnNrz)xESow(j9zNanPqzJk!)^cUB>2s5w$4i7!&l+mgXqq2{8g6RE0C`% z=lrsoyqB(D`_yoNlJz(imtcXZNo`kZol=9Opp)#B9FHhj8#S%79m?Zr;>4b5^i)&U?LAYY#GQwpuETgb$vjGbYV5lK~JX~_UvbCMC zE00M54K)$M^;F7Gaz*PY7}#~&&TIC`$lmYRFKYJVg8I0iy{Ox-x~#L!84RFWkVr7G zEMADulmbubpr@V`c&ZC&iGr&`NXDK)RdXw4D4w;&A0p0B{AFzrgQnoAL0h8KT(L+_ zA&0%-pyQtmW4cV+K-C6+lEU+NB_HuBha=O7q_@&h%bmPj#>9o+(k4W~yy}rNl_l&w zuX>LtI_1&*oOv&6Jjhwks^NBr1)N|G@ER0GEqFDlzn z5#hW}E#Y7uvQfRF&IUuZMY%jhSQ>oT+L-o?pk&AJQC*Y?gs$p;j#F@)tm$Ml=Vay_ zE6&lxIT|}hBj;$~91opSV5ox5#zQqBT~Oh5&N(!JC{m-E0z(b*i3@LnVh(O5z zmDRjc&C9AD2Pk?)ERhef@lbVd&QMf441uAhX*wSulDqiQ6ZyR-7Wkuh_^BQQStHmT z1dpr1ofC9xyZ6U`2gTof_Ud0heEQ3q5B~YxuYUgf&wlydSHJ&!`_{Akz2p9insqb^ zix5Jh3{?&BnS~E$_+<}2EaT6QjSpY;-l2Q={NPs~KKsS*@BIAj+yC+&MX<-eyZ!Qm zN13~a-R*{(2Y?!^z>X*CmZtzk8Lb}ToQY4S_-KL;M=VQ!kj^txoYNUER~%e*7)en{ zD^wU#mA^DI&=>pnMIxUkMn8?AfJRmcUsTaohwV?cij?&}e4Ks%;mOC(@?W#7Mkk{= zKusWicm4*AMS${CfTHt7fWq9^mOQabo+4W~5M(Y`O;>P5!nQ7@AIOOW`eNp`BgQ<+ zRfb%lancljaZBPa`5Z2<Hk>9{VhkVB;>%GdNDhy1)B zgO_L+JQ{UjA|K->)6`5;e!;qPs^31EetxWeaiZSIXq2H| zH0MF6n#nM#3T67rFl_2fN0})bIdw3!UiGYBk$a-Bp1FvEnj1DlT=#Hx z7VUO_<0lpOVZoyF=YUbKdgN$CPN&SBSTLAQr1V7B9FJM0I|@((q5fP+_sLPzRd>V% zMI_{go%$tgk-yh%vhY(iOG?Kiw}&&^{_(bduk7h3r<5`zxKgd3s8aR`gERu=O42~zJ^1p7PD`QdQviyl9`lI^7CKc zOb@}2^2YD}#A^rf60D{`170^w2XFaIdIJR&g(td);afLv(x3409a9OQc*ctaP{S|( z(~r{WukKVCK<)iKUH;$u6Xa^hM=0>vyQN@Q6Bkw*I?ntry3s#pW+96@QEr;B`QZJ3 zzxvUC_@b}UXCJmqgHTI8gb*Ao_TsBR()WNYy#&OU($VGDQ>FnaIl+(T_&M;pA8sys zi`~vO0P3}Is8xX4#86klsMY*E8K6))^d6Iz$3jRIlZ6bZxl1AFbev>{(aA8%4CB*L zk{z>^RB~e`XQL$33y<2~e#73Yq1~E)#iUNf-m5#W8t#76KWGPs9emi0j(W*)KRN1? zqX9V{kQ4fJE9|+ZPd6p0PQn_tA%z3J>nV}y56FYLbV+Zrm5{v0s@x<=H%yvdQbTc3 zj|;OXuSSI#&a13kSkVm1*1UGs03H?-UJi9JK*?iL#;!Yr!7L-FiLF2tYi;p=Wk4zz z;g&r3^*I1Ky;t*^5ZcW=)8q(~FY!yg1#i z7<)~J!c=CI0ueMLA!Ayj4N(jq5x$^)Hu(nDMNV$ z!>c-O3j#wE5bmv=g0V3K!-Lx%X&h=MWCEe9n&aecC!;$js&k|`hZE<2VB{POor8gM z&}R&l89QfFHW;dm&H;+OB1(iZIXaC+i=rP@peI9=F6Tugx-bT+;&}y!G1QsqWp(eA z(vvoiL*+C!7>WW^8G=v^-*2rg%?F6&NUMu@JaUTV-|rbn)4Js z8K7Kg^ph=oaTKx|AubsBbc#?VzbdPBjFJA1c8?$r*o>4$Q@?3&6d0P=r zvAsCDmUBv)_&r^JEWCUT+(^WA*&D9Q-h5r@uV!#EL!NpOvnV+gx-bw)>0^ zuYO&TKu#nGF4aox&yogEEMZgx|Gop>X=*`DLHPU8rqb&G&OOOuh@uTnKOJnp0X*Xk zF*>s3x<%Ke^D>=N?E_;oE6`0fpnlPS_H3!H**qAEPC7t;)6_I4vKR)HDPWW#2#eRF z)9F5;7@g|6wEJRiNwCKPu#nc8M$yX4932o3Dyh!hef;fd+z(Hm8Zn@ry;n|*=FoY? z2JRXX47Di^WrL1Zz-iWoA<3DUz1OpzH?7B2>+6E`<*EMp@r*LmXNSsXhf~T^Pip3? zfqABzC6i%)R4O@x)$615v_C|f#Wz7Hn zAKtjQ=EL9p-5U&`PDpM)I^7FT_JV_5|1=Z)`mL>hY#Be;55GEO5hw~!ce3P8o`KRB zCN}seo)>-c$-?@z56&t;$wqG)FW}ERd)OgGsuMEnu8Wg5-ny9{f*<8qzx$IGMF#jH z_>2EiK(IltA!sM(HJQPq$efB{_=lS}=}$D^EaPC+#7|L8y7=~z)L0~BW{7KCC?dOQtc#Rq`;H|Ea!$&u{H@AD7pcsz0c82z9KMaYGY z+B-_24IPhMa+k9+yTh?P?WVnh_uhM;;7xg;P)?coP&L&+_v|cr%TPr|1qO}oo2-d7Q{eB4g0Bp01(2l#s)~<) z!e3v8T6&~s#|OCLt*$nbDmNYQb01!S+M1*m9)N-eQ%XAY46C)WYO+=0&D_+?j3A8k zNKcRT>_jJqT9;+i^7SaU%euGx1c0I)KSobOTJbU=p9@f|G0=d#*RnG?(vfe$~zBfAvG6e_a;CT{%770Mv+Pv;`x7AP1mW?x{npRN%$rSWFDX^b|D%MaN#X=h73? z{;@fcHUl?#D3)tr4CRzyC{!%gw*WJd!DBuBuFRh%x#MUX&KKF?bz$nOFp^rQ2AH5M zk+iRCZlry?4yz9W)Ou$*#MAe}EmYI&ynxe$uVr0VwX5>#va~!eE-x$EZ4(`Teqy5y zK()-xBqBI=d|UIvES2JQdMLqRD3*ufC<#?%Wl)Tvcx0#yRYK*kunP?( ziV|j^D(b4{0jU0cZ}ZOws0sjo)J(hUXeR~jO=SA~s`>R{`m2{d0H}X{`T^MI%WvNQ zpYKopbQpQ-uUzD(SOYa#S5zuFWEm&`s1X5FPJ11mJiTiC?l1!Y_0P{P{_*SgzyA8& z|9W=v+t)YW9)XjY@D2V_HAgihAMPAR0(Ze>$!AOXIksRQM9sbby zIsC0R0SlPsdgBl%I!P!mKz+|9shaxTsM*sVZxGE;6yp6i0wbafnp;JPXzPJhJ(Mp?k!X}m7gt}i#& z1}(Nlnq#uPboxYhSGZ47R8|>bnOrR6vt?wm43FWgMj@t3Y^KEL zN@AfTc_kwuEYztcw@>~F^GAeyBGW$z!dMUng1`wv&kdgM^Zbw)YEJYtBUd`slyF2| zMgS%Q%A_x7s6khM|A&NpuA!OiDDZg_;q&xQ#nHI3V0qh3s*VH5;Fj(SCP@5g9CVQQV@J?AwCgu zypR)wJkb-JvkM_P6#$?@ebL_*uj}G@SvoDj&yml|%0)$gxoN1u9x_xx&~l4)nA5MS z8qm{TVzQr_9XS|vRbBZg6$RWB=1`Tv(oz6W4ejIRA=CWq*70pIl<{~YUGs54oqNCw zsyVxqu?tB%o3N8{GZr&4IrCrsaF?l?X9@E-VeSJxrR?_^`&|}a-=$-h#oXr~{Os%k zl)LoRb~amoCQix!gf@Qv_wT=Rf4+ObGhhAgsZ96D%9Ds; zU}Tn@sc;*h9E@@SYH69O-hBJ3C;#v+FDrdXVE|P|fZFfKv@zn1dkm$UleIb4%+ZQ_ z_U{p(rsNte8HPehC~p~*Hwoq1@v#|Dyx%f@xkFEX`i`sTJsP?npMU&i7`4SvyCn4( zLw$ZKYO4V1L4d;Ddu;~-=qXqg0Bvn@;4U8z9>k@qFt}wj@ zXiD|Zll`+Kcbe#7#JRKN;5-E|HNMKuZt`=$sJoJITNG}J{B>b*QxfigryA=}$4ZRs zl8otpgNc(4_!|I}y(8gs^?R;nV>8dX0JXHLl2x2rnX#1`n5lu0gc$08QQ7IbD6qCQ zn1ONuYPovg*pl!qC?hZ;hT2H@STU3*12w0$@tBs%u)0o-;jL3H^Rweb?_Hn^Ok z=MSRo^ZYE(l9MBx)EGd`JpjcM6AdZBRHwv$Q*tDR+hVXK#yBxGMuw_T2CC=u_+!l} zB&ViVqL~62%1uH!Z7Ejtah_oM$*M?JdSnAAUFJrI;l`f7ydSK>gX3uHB-w)}Z%gw) zT>^~CjFF*OO)FbU&F^m=Z_(2(K&_qnP*!-=w(Rl}_1@7wn(z7BKvFiK(;fMvMhA9( zVq#}_1gNId?tI~BM|bzu%m)DqO^vKN0Mybf$!0+`@(W_9IdXJP>M;r5Lku-?`t33w3DHvw1-D$+G2&wkl@*De zD00G*(NoExr^aey$HzH6cIV#aP@e>UD6fPsHP`%I?XsUe+oj$*5{_#WZ zU-u$ky}bR+cPB(ox8EK`;B#>hZrzrJvCbK&c(^{SwM7bbdc zsAu|m3h1e;r~7(lsAp-zBr`#nN{#W4UL$vlsnb+f@z_%=?~D4@H1jH?0GUxqa#_Zv zSMWbPO%IRbz5OtmNQ7JP(GGV2#?gh3WwfRH&hVONmrr#VihUAYLkVWhw{luEvJXgW zMX(^@=dK9Ipx8})qvzT32y&5sr^~7a1k5QX`&NQ8V?906Sw}j0tY;?rc4}y+$986d zRqDAp6|gI4m<){8vp1xMHLz>^?G1H9Tg??d$uMf@XcdqmyzM`JT|-jx06J9!RGX&;R=;m8@64ytd?aBnB3iI zn(QtMOp>T+G!6qjai&=}%<{@8t&Ac?MMsQcDppq6EjZQRGn%u8)Wo^ET4lvmY_baW zm%iTern9_kEiamIRxg`>Dx9y|>P=ULJG%_7}l4vWBt%^r9 zeGf@VvY;=qmFH#&O6?sNWUk9va(Ad<0c+&lCybgAL&=`md^ZVyCDMG&kz-y_MmMK$ zU%qL`XJz@MC>`abgABiyoV|{YUxo(X`#CrtW&w_b@K8w2gv=Z&1{oECGuUH@!=^7^890ZQKisQD)kctNdV*UEOKXcvoiHg6}gcCKRo z_D_Lq)4t5ur&;?bYwu_6_gVWb0aW9Y$72BHdkCQ11+eC6u;R@iLwrT_15g;BpMLip4ErkC7cV~(pbQ6~8sGhY^2xt@-N*wyImeeF(`+0# zYQHa&ipjnH;>j-$INmhp+`%t4U-;th7(ii#RN}vX{O;r~KyB>!9E?)$R|mV(mj2lQ z^$9roIRNUfWT?-(@?^vVr5f_^m{-D$WSQHlR`CdlZ0xh(dH5&Mga^J zstUg1>?SvVx=bTOAwb0$Ju!e9U1lcNx%o|DaaR_7WeLu=MIQcn4Lns*{0%MGHseFP zDB;p~;?Yz64Gznr@K-!_0j{09=x$WH87RprF@PGHX<(?K0dEulRBny{RaH@z)29WG z=+-Pe0#I%eN^lrz0%xayWyah9oC2sBEy7uW46K=d69dIxSI)EJ!)WKtUHSX-6dI0& z8mF0&ua31*MG@EGBS)9c%6oY-j^HTAR2Id|M2vLB+p2g|L57NRn1?D+NmP$sxp11K zvmBIHkuG_Je47s)32sNG*%3uL_eu zO-l5C&B6lL9`2Skztbe$9jLbe${oqw-P$Ro=36H6QFehX`Qjslrf?r4Hbi<#&Co;w z0gCp?M|A&7o|3Ci0FdwnGealZzCsw{0R)5q>_aoi+k4n|EJlXI3mbY0DP zy5;(0X3p&R%1$0CFKzDgug#ay$?4o3$sXf4Ii$Giu%2wQ#w>s(BUD_(=W<@ z+CgIW(%1g(qV(;D^w;~5e|>ZJ`**&lC-Ijzh5bP zUz39{5j2^t7_EHmHL%kA#Pm&MvXO2l$Q{_<`}L^jQ2MpF%eIBpV{g~`-#OryGh{rXV0F&E8Ru@ zX8~02-9J3}<=f^|ZagD^no6q*WuSTzAb;{phEYxuihDxaxS-d!iUda`FEdu9rPGt-=z?CNotUutro%mYT< z7N$4($yIiIl^fsW;4$gCSo<%T!%Yml*3ZTii(TU zsk4;*+hm~Z`!$C5Y|K54u4c@U+p^l4RadMsZ{?=IP$rA?*vL+ef`IF&`U;nM17;$@ zBsV*M?ycdMC7~EYeGHE!wF^*V((knuYygxP5<-&4f!%RI*K&+{N;E4(mP-At*^KjC?7@|C&}JLcIc}JaSqS}Gf;g` zGRSo@H+FWAjGa;4-LPfF;EbUF#;Ysr29+0az5r-{N>1^do}+#*Ct|5o(|iD+c5N%R z>JjEnx2dLK)mFez7BZA*7DWT11gmawU6nOpjV{%-G40%f{*JDV`PA!Pb>H56NE^A# zL?Xpg5^AzZLNODG_yGUDD(T56hxLAumhn zs^b~HRPaV(`tYkP^$&AVUyQ=9q0UaLhn)+E@+K&z2_**aUsxPjK z-(O%hb}vx>kN`-Z2U}WtqF0w2ue`-W4iesfB$Vhj(v|euOs|af(oipOdcLRUI6cb% zYKU^aIES@S$ssz)upU*5hX87MUj@PXzccfq1uf6&8ZuOJxCT@V)KyH)SENW+%S^BU zs!bM8GqwSKzcKMv0q;j7^f>Y@Nmwh=_Ip>yu?u)1(o{kXB~Vv7!7n$LCdT^HNpC-A}RR1hJyvU9(b5nS$0RV5x!fi!@ zp()hTqCGP?L_kYnEiLjIoHLZoLG2%9sQ_?VYjS)w99`eeM#}mj&@ep3k9`yO{n7*E zpm0+SHdJ^UgKZ6XCqLi(7J!;6<2V6-5fZqGHVMsGdljgPH^u2C6Q8FC=czti;6-M1 znHyi_r`N?faN=!6fN>RmY`Cq(I1{c204+Vj!0g)yvsC#RY5&-Dt+ua=^R&a0ozdn; z!LVi7CDqOdc3QAgf}IfTtYX)wAa_$QOi3tq=#F%4hP{Ezl4>TVW^iBz28NG+GwwJe zFftOnUR+{^rAw)n&Kf5y_;A(N>&kjvRMFifJVJUpt*j37tM}Q}o3!#WA^$lh{W&hf z1Bh2i1)hAHQQqa0qq1_49y7KDr-WGVAf zI<=dG3KH29)La6V$6rl%hTsQ>)me)H)XsQ>t%e$yM-ow3~>+l{eZ9@yEQ zUF_RmzX}uw*h2TRiU#I?M@4%tj{x-_e*Kp;(tQk|yiTOMJFzVO<@X9?L| ze*3$p585_9xc>iX0EIE|nn?VQsGuw-9|3B~0IDmSmdqIHi-X3d49Wp00;@aP5SSX= z55Icyi+yg+9sK>1d&jR1xE}>5&9m3{>ErVO>ZhXCPsOM$hVmYNf4z`zw*YGGK?cQH z7BYtF(*|9W8Sx2rd4VNS08@pDU7Xs*8Rn-T*aP@d4rY+P6-O(HRiwELH(T;<=^)a2b60-jD+5dcQu%6f{IdZn)E2KxJS=|vbukJ6HTo1l zN%V7A`&U*BC6Or~u9gX)Q2vBA?`B1^vSTaSS>IKJ^K}1zIMzOjwhqIMgHR359}?a3 z%;35(3D#w}F<>bL%Z!nuDA?_)Y&|sec`?WE*j2eTeUv0ZjDi(NUb1rnMwX%=+f@xA zi@Q&4>-)2V7oc3Tk-6K|-LmUztG=?Ts#THAvSe0dgF>&tf}ea%N0d^W6FrGe2##;L z+e?=<*kufV#Y~)PvRshmjHsj*N^*t_g)V&LVGaR*eU^Um_JNvuOz&CGWzlKSEILhf z6?J0??A~~S!%zd#@-b7s3Skts)>W5f6`%2%@7-$x<#3bgbUjn=3;Em@Q3`D-%$+1u zb*W`$TBxhtRMqnWf07ydpF*j#mrS+*Ez>4@ZcSSwmqL$z{aE7Fkf zinE)-4Bn#i-1M@*`|B#e4nrF_0}do%NbecZjuvh$gTPscPBTEKlXw?D$dM+*0eqap z&BJK>IM(?9f3;-)G&ML&kIu6b_{ldV-dB}>gH4lD9^!$)$c-L$pSingCyy-CV{FJt2O5#hVg;%RXHU1Dl$o9GzO=|!;rgTDt40I9BOO1Q5^`v6d@(}Du%^fo>@ zNH30&p498A=4)AD&Pt5YL?Svs6`!wV0!Ae#STWJ2IhW0S>xVWccLD0R4v>~3Is z>xJDLn7V%0{Mw$X_C&Bpygd-?zG!oj-4^WH+%Amm(!~D5UI5N_E&IBEVPDkj4`qA5 zV86{_yf4|uHT%42`}%f@$Ic@|$9H}8xB_+;pu8r5-Y-448SC|S*mSqtA&y;!dTed~ z{P}YRQ0!m;r91*qj)ZTiXb4c!M#A?Ipd{0hDDhNhD!wn1E8GCwpneiV{iu*{?MX=e#X`PM0F;-Zct;=3N>+O&R@Zje zyhhP<0_Fl1jI*i&$|njl+}6uYaAyw!9-xQ${9{2b>fTBAz%&m`#Zgg6RZb%Osb~Fc z{3Htc>yA&?h)K>nGbV;YFFxIBuF#IJ4xySg)vT{@3#+T^9NVpbB7KhR0jLKVYRk`@ zVH69A7QLdwP%c0XT!(=f7QzG?3M^F4vg0FI*u=YM*%2%|gDsDQ?|z34p7a$QO<@&L z%uK~-PxRHqyDE}YyuXp~HA&|8Kn9BKB{GKcIP%F1px~-?ePS3K%t}kM#G}wL*3|=b z>9#b#E=;fT{LDbD;=0Tx&BKBk`<9yx*PNjzEi|3+I%RKxQ!w;;l`1erNy z-EC{5fhj5&1qJD;tm4YVEuR-W*#2pNl07x`UD67+466xDy+U()I5$=Xal1W6csu*NaF{1<VF3$U0EwXwHsdW^0tb@onD?rGulJs;DO1{OBJ zP}#X28|Z<5mVQ@LoxrS0tdHna6tPuP*GUg~3uBk}6$>sy$@EH~Ax_oXg5Fx_jhSAb z=+&`anUJV&rWa;yn7oPaW!sFroKt7oe67naWNU*sEY)Qq?n~rg)6hwnEL}d{ZVJ&UDIMLi0v0c?J ze1z+NvYi>2!OG$~H@JXHga0kiTzYU_ocn8Xq@!WQR(ln0DyY*d^LM5B4Gc%Q5s=Yo zqIVo^9fWK9!RmWY?1$<=h;YeANQhk|#63&N?-6)P3p( zpzykun<=kK*VX^zb=f-r1!GrMu;UXuGO@#dV><{d;e}n)uwHmZTD7GEP$sF@6mm;| zd8(>e$(ecAG0&>zNyR)Wn+HYXsA^nwjNr&f^4JIDlX<+uPZ}N>3-}T7{AgU$)``qcLM5y_l8b)$2y*GT8}T9Mnge$>D%ngT#s2e`K#P<`4U^+ zhSzMILW8IIfW%eEF5@(^XJuumJTk*Ri`|>=>d*kKSxlRaOd39Bwv`1jZ4r3LgOn7y z(q(J=eB#f<9J8$jU>nn`wKAXCtFlsxW6sJo{&CRWq`v&c9j9RU=)KvR%TaNhw|W)! zP(pwwGDxi&o4Fq{M=roGfoe6TN&9>S+R`nvn%GMPE?bzbosjume?YO>P6$JLmg?-* zd5(oHh(RWdy~?v+G*e|`d_89pehv*XJFg$e#P}}0d8;yB=!@InulGB^&LF9-;4d|d z3Uw`-9c!Nh;tsMj5|v?#p_~ZriBuDLx+1#LDB5M$FF=OdcOu%SN4={ZL}+;)E47tB zBVuF$$U-wKRIHl_sObY~;`ce3rNe(&ZjHxPAUvq}a~+`VOIsNcqEl*uE1jiFFI8W(cAc0cDeH;Mn5AFKJH< zu#=u)aG5I) z3wBm_7?sBSRT(O{%2b-pRP5zh&fUJcAh77iazi(FY;|IO|uYYw{augHC$Dv$>)p(qk{Y$Zw6 z3QLQV+ivLd!c}adV3gw}*!p=BH|m!TXv(0_Y;F|%g(qTa8|PAC<(d5F&B{4Gi3iQ2 z`5<4N3Lk)YBwcO_9Y%l-XNXH71o;)@=O>`bhF@L2X<)1a3)zS-%}2-|lS)}^Up6PvLbsKsbxut!B-EzV%(M$WbIow%drgcMW0G_7|CirN2c;MrtXkS3=8qr}ZOtv7*C@+R5b%q2QKg{~3h z%fz*4jth=WdJYm{!=8<1eK87ePmh{`V-$H>wshIehgH6aTI{ZoCwOv9@d;?V@k!8W3)!0TWK(_k{f}FHT;LgH?hbz>Vvw`g_bC!v7zPhx4F?kxp zwwtlOIFQs`TdRBJqekZBIz}NO9m@rZE}*Wy|uty!z769;Ib34;Q{G911+$Wkuqm zyqEXF_jKOb{F*BVk0(I54&L+r!!SUYAateJ){qSK{&;_H`ih*JptS7+nn|f8KZuW{ z{dmV7eQu!HaLg2y_&ZxEbP0|jhV3(MtFXKfpHdim_xKkWio%b-Uw6|SQZ1^f5tX@9sal@j(QXSHTa8;YDJNGt2A*3C0ZlNSBfgp63^ZtZ(hh5BHM2EMn!BX(X zMNd-lbXZB@Gc!8y4U;Ahj9r`sCI3=%K$4e^H5ob=#W^GdCnVHj(}hry&ZGnslsf9D ztk)g(nNNIgiY@e;q6FGv7jFMy=(YrKJK~Ayw-0D43 zt9WoNin_PwJ+R8YgiP>IVt_2^Dp^U|+xsBq5XSCGh#Dz#+iW_mMf|4j?rO0?c}P>q z&H#TSq9)tJ=s{nL`6YJhlrMRt*RUcT1d&2;Ug72TU>z80&;Xu?=z*IePP{ljoI9!C zf1gy|-zfqSWGA6>DU6BB#qyXj1N3dqt>;^S0WpL7@Ako`IPXzW`bM-s1?ysY1GD^h z?sd*L2A+<~CL(M0Cu=wv!oEscZM#y@5P%qLvm&v&NclQ>q|qZ~$WOQ_Q~1??QDfUz zR4!EHGxq-Tsp=efiu+;P7KV(6BXV$-p~{#LbOtPMckqhG{_t4VUlz4VE&)6(Uy- zHHO}>qq=FF!jDn(gR5x`1CA_}=X*L*VaF=bO4C{hM; zV)QhTnsX`Q(|`Xi+gbU&!z2l^}#Z8_^_x9p8eWbu9AZ6uLHqgfMf7i{~TzqRU@MEcSK!fV-|axeuiz2Bv6%MT$HNYGGb z7#9k}=?x?l1>*J%mdPQFhB#cQ>r=1m(YTT_@O`Lfl&%hJvS{vQct=*NwE{rh$_4wR zWbbichBEt>F#*uJ8O>1v6#$Ymn%A>BHHZmdx9%Pzf6iw_4(ZF&UTN* zu1BHUv&$Xw-MQW&<^@wZ#(B3<$XupSj7lSn_hI>})iYawqjaQ{^TgSEk z+KKNUe_|DvNp$_b8(Gn_qy`YLmPW*U@#_I+qEl9Z)dZ?yUjZm)t*Z;w9E^J5BHZN9 z!(1N3t=dGkd+TC+P$<#r!kMit|J>Zs*tZe(*(0r`XMYT?>FMB?%Xu&8u8`pA@lk`D z>$29;@toH26{f~ig0`wiq7}T*)1C?DPt@@}>@k`^PtB((=clfPUZC&dkK(t*I=8nO z@8B{R{Odpr;)V>dTyo_^45q%{sbFHBMVZ@LMA$WQ4vL+R)x`|SA(dJ0&4k$D#VycT zZN%qp*01Mn;|sY|d5>{z(eVS&vHxk~9D11hd^ZpHIAdQ#Cd`t*6Q>$( zgmohsrFi%$O!PGJ1xfC7A&OrbCr&=o z>1!8U5pO$(_?Z1tI@TA`b2#~qL3!)ZLZ8S5|2p1!{_Ys z>gdhogHtqf3K93@>}XMTN@ve?q{)W5z{l2!@Sj49EI=BDx+=_3a{p_Ji!JOoz1vS} zy%I(y*G)e73_}^q_otxC#yTJB5FSSoWB*a_8xsjtD(R~$kt~H}nv+JsVuFm_Uf}vWoUqbgwBItkUmj-uw^HUMyK@aZJGJ^#KsR~lJBoeZmmla!0nG~GwIhl4QD7UOk*>| zuSEE&v@iO9VEQ$`k(rw7 zPrdEqz!`r+ilEh5DHBT@k}Hn=Wl$T0p@2&##$rz!@{&zAt_|5ajhM*#*Ouu(J8 z;=QZEnnLI?Vr~>3=4Mf>tuit$j_*uYG>g8gNNsO$?_1{m5#jpKnPX7-}3rhX{y$m+e9?a|RxWbD$f3TQg1Db13Gc*$*pZBGf8>zkV|sVR?Lo11Nl3eN{M18cg8 zk5_%sF9%%%FL(5hU%Ue@UN$15+wPw>#{k~Dwbk^mPp0SRW%O&$YryT@>IvP;1Eqb< zO_}_&kK=h{^@#6Nhz>TMKtd!P{mU0*1k$_6fdTB@0{v%^z4r?fx&|*)^505z9uh7; zOwAM*Fn>!Brt*FqpwEaDzT4bR6(~M9&^Y~Zw{!X$$&DNA`$iM~ldm(z*n|!FMB$36 zynKy(Pv9}~#&9cKJ`Op`}z;hBQ^?7v4e= zc9b6Fr1$|)hkgiVxuW^s5vJ--KhvD|G?DPU@aAdsTG50?(Tp9LCZUOgA~TFz*3*yp zCJeP(pGZS543Sx=^=?v;yc9dpNkZVYzH8USbJ|3#+k4_}FpKhceplU6yV!plx&szQ zTRla3cCi7)eQm&R;VKlgI1Um3Mj0R2vxNR>|H%yOR8*&F6w^hlF%&Zg^^kLsI^$fbK1xN+<>!3Hui!t&S90 zMg8&2iS|MXBYJf~og;R0(joS2nGnvHUgj$1YLgEhGF2kLg|4&Sv9zaQ^eZYy@?+NM zUIx9r2$)zILpAw@5P=~Tn-RS=y~h8@v>b}tDt(~%$tqG;jiQ9$#PHDgm~9;I6mcA{ z@p_A43mpNoyFjZ7tjxgGN0!Bh)NafdS(~6%-4D`S7B}x?$b2ZyMYb}x_N-RQJcQQJ zYt`gyUF8Eym>Kzn-ZsbmNaOS78Ffoop#izS=8x#Irfxwdlc{fTsCWLgmBsQ`C0<{o z_D=oT&kmpTwnPWxo#KP=p{pmKj&@hY-myYJveV#k^2d*%)ip6*<&Nj}e{RkH+~UYN z;#0ooHV}#kvf7e5Ft_eB_D)DGyLN86#!yk?hNS_zIW-=R@?SVq3zV1^r>_||*63;u z$Uthj3_~_8Rg1eU${5qmBH%(*%t0*iYmK=9_ALCsAPP8DK4=`~$q`~*ZSw)?wOO$Z z&M>rPYh~f;mqsFs z*cn)TNPy2MWh;c4-e3(EW;K*lYdR}CV89kLi3;u-KYg1sJzzSW(9R}Bilqzm8xvAn z`2hQF$ymi>f(9xIgHr)Pn#eNtS)$%9C+)_{bzKaO&v*lUsOmNPtplu(AEyp*GW!xd zDTQx^)Vc^ww9l(?1lit1Du7aPGGIA>#{hZ>plF}HXf@A2ctmlRHG~9?p&o-L1eJBk zb++;ok5#7eEB=DwxFi2g(5iLVh`+T*)~m+AnxWTnC1D^_YVB&PH@_;^>LVgJGcrE{ zF0^#inREZ%k^BwR*{H_DsOF58VD-tml$%eb`TmtleL&ULu@*(o0X9i_L|pd?A3%ce z&V9eBgPTf;ms*8R=>0)VW@6C(^8>xdoTeN^b!BdZf24xfy7IoSKVRW-FsW|`VNQ|P{O$vAqd zv1f47`y)30;rZhsgF*gQwray755Qd3OMVCaEoH}KO|lnkCe)u}*244NlkD$-)%gO1 z!6=6dH{)LH#Me_>tIDNPD6z=@a{641wp}!aNm8X*n%gPVFiolEeaXE+4|*{Lo39-Y zNi+)Ve86KYZ^Kx(3{6zUUv)?9_rEcLKW&%LYWJ*;mC^v?vh(?^&X;A9b09{fn0js3 zg6Ne{jmNNk4;!w)0YA5hlg}yzh&dY}_lRnR^O$7(?Q|wlIG*QRSZR$mB_7Ny{h2)2 z98t#R+<(6?J=r+e87kx-qpDNafqv-PHzO$F8f{J7$oaX#EU~>Huyl^0wobwF^j`z@ zuFTiwdN#Rl?KmMUSi{PoF5ny5AwjO7(vx?W5H)`|-+=8rRZ9a$u;r6Wp5X^iP{wBR zMY-EswiSKR63;?vmWO3_{MCDXXy|QL{|K_(cUI)@ezPS9BOb?9lG@Nc?EJXX=pGA4l>d15LrYq@=1KIU`z{y!<tJcN+Q{ak;LSQ9z-6Jnh&Kt$&Qw#T7~vuP)c zFc1uZD5Dy#Uq$jo$hi@Lh2H}Vas(1lK{;lAq7Ue~w~{P=V}JPlCQYAEhpl;tn1z;X z!^K*xmkZ*{kW(jgP*FrfN1wy`1ubE#*v~Xa zt?*Gt&Xlec-`*i_7qog)()K_1&UnA_AKm>0k7waRVSx(2iZp86{!yDxi&rzpa`ud< z*Mv%(27A~MJsHRmGYhR*wakCh&EqV!ya%WAahP)1WaQ`K0l*(W`F6>gawV^6?kF@L zD50?Hi6tHtc~I(#tJ$9)nz!#PcYFE_Gb-UT+-I@aw=MbFqXbE{$1iwbPjQHzlQn7zh*|Oq?-dv6=g&TIbD1Yil=t;jZN+ zf&CDB3a0f7uE{B9f<22s78Q1;e)Tcm%#immI&KL-h#7Hgs6(|U-R9mZuq~8OVNU8> zwwyA>Vh2xwvS^T>jTuXcpzybHiu^ywO|w&BcU)%hLacL(2do%|EBW0;=mZ;@NGccJ z4H^&DrBIi~(}`(Lr=2EA48;03M2O4X()&ZX`-GvfW81GZm+jgxr8(1(^pS6%7>Z+f zumuK?5rBvmx3<)Y1{uR{No;OYMV(E4jqc2K{Oko!^n;J~y6`ypC%xmnl<-F6f+1xL zLaOFwjQLsTxF)5y3N~4otilq}LO0jHZGlvTvMM9PQK8)42=n9v#6Ew_CD?Qpb5`&}Pk&q$nVgxB$h46Cu*{ZfPQN59LzC=x}O z-q{n{!j09m5NI`7P?5!pRwMt{I!U2y2qFV#fqeiWC7Bt{{tEw`a5g>UBbZY!J`hG{ z>PV&bnDGzMgiy`F!6WpmDn^ENrH}{r=ZgBBG|51Ea6U;*E>+>6H(wI2q87+`(qN49}1hisf;Jp}f*D7m@_{RJB!WSM-!ZjS)aN8I> zGxh@nabf-A;6?_Y^KUqYpQkA@=;0ZtvlxW-mZKDR5(_W~cV>rz<(2P|XVBc1LW$Eu zhoxEQ`PAlY&XO8J%Gttsd$?5HHkmyEOPt$Bp3(LZo9YjHRMBMhG+>Qq@*jQr+>bV( z3`1Vw;h{x(z#?u-a&!MJ22TWax;{gVUQ$2B813YJxJW9=e_aiWpC&E%vgtW>QZiGd z#TwvLhNJ`bqwvMC^Vi&tsiK$CUqnl{@MrEgSWWYvSbu8?zXP9TxJid3g^?mZ&BC=U?Ap5-^<@Tlh1$ z3WlOEPN(@aA#Tp0n~JJmH}4c5bEEYeKmt8U5U^tM2%8Y67bc3SJ}O-lq_E_=-xytZ z%wYAsnSRD^1iT89>_D|d^$-9~PE|O_;^xxgFL_4V3LS)?aMUbGrRi&e40e*@9-T9| zeBrAA6NuIvpW}T>wZ!0Io$6^kdWS5hwn=V=`|N^_7`^&8!n1M-85-4L76(gQRN@Rv z?wo*%V`c(k%fbcC0=GE);ZC<{Y>0J2z7uTle!Y~qw5GFxi)%XC`WARkzPx}6%7!J| zo*=p1JPI@k>raoc4zqV?-(2l(Y7$3nCh+!_vxhpXlD8fEtf;qYLQu9ORdI4LQ9#W(xUJc+oomg zF6;E4!;PARrghd^z_K(#y+~g6gIA6PqE6Xsl;{=7xF;61S|4MB?dS!Uae(KKL@JJD zi?q(vzfPIKGIwC>0c-Lz%f@{DJc{8@{&#t8B@bG)0C>P(DMTRKKu6SUH4a#l|rDWASw-9NDWE7;)LUSALpmIFH@Ks|L%b zgDByYQ9bW15sx6J1JWV-MS*K<>UJgE$F_xvQ;S0>pHk=2D0XjZoi*_a+Sa9WXphI3~#`KIT&B3T*uc$rp~Vurv;KED-iQ0XlW zh#?vzn=t10Tvu7SfyWUes|-r=V-w<`F~URdI(Y~1T=;Wks-SLW{2e2?yXt|D85vO= zwkebBR?Q2Uq>T*tC=`Fo-^ZX9NO!LiC4s_NELwC^EUH%n%1fw2H7f{R%9O+q=|);W za2pQ5UB`jl=kaYNXD5eRrL^>YU)xj(I*2xK0}r>U8c){+5@#Z@Kyu(-gv8%5`||6z z5oG}y&LKSv4H}Pkd9TyEBt9)Nc$ELg)6JOg8k^-kHr2Pmazd;8!*8-sk|9Vw|M>t7 zZD{Id=+}I@7>G03ap5Y*#QD-Lc0k@vH&prIN-cD0{1)p&aF+n0iGHlh}4Sx}!f8ua{&L%K5quB!u zOJ6~`n7WzSR-)99#q4qVFdvdxHqs?EiiOgMHxRn;Ei`hd5;pa!d`nfHOI++Ie~J)O z2V}#ip9{=WFx%@ul(%BvL|zKdqS}?H{5cjo&DdWmNSh-am4fW{X6m`c`{bCyB7FdH zW#MT5I>LX^<@k`_&F!ek>$=7JmkS_bBh;@EiS@^f&#Kn2lwrHp!u0D!0Q3X?HO)RU z!}c{~>I(1t-%_qN6sB}w9PT$J@0Z7|nK4P0?OI-5QklmfXB^@wabT=Uz)&I`v5VHC z-YF;-r-q#3utG(gSPc~}oO)KIs2Y=Jo%_O^6CLEcak{ae7L{tU|OVh7MjY|ST1 zQbtH78S-9=9xG#?TS2(`NPa|@L2In)b-(9vGGtXRap_s+9Om};w9RPhG1RVKuoKk# zM7}W_h%|k1Cq~d*spOad2JKo3QN1h;#~{@s-h0 zbVv7wC8Q&U$dVfzJeOdD1)<+eNXoTV&}{n_UeR&jPv*uUfBcDa+VIasWxyr3-cbp+ zK$&wjc#9gu^Q(<&mvRo3>5xKP`i|LoGw(^=tZsF|&XtRwjpe?6iwfoEk%4}py1OkSd`68s~A%>6YzT;4Kt25I62GE`)(8tf*>BV3+^NpNdCeCPL=&?_j!AFU12 zU=0l%{LH@gEvQGaMHjYjA`}aKdPCN90WAeH%B#{8^HIe6gB$TBv?*QYfD9Lp>c(Pr*^`AJX z@8Qv3G*e5aeBqX&f_?}nQH&xSl6{;wCu3CP-*aXZH|}@daJ2D=ib)_y%SQ6{gCFkw{D&?x$wlfabsXN+mB(@h1u(1#wV|f zv8EKi`M9N@7m&n;$R7F}3ZJ)u(DM0A7hmu;#c;3*7<1D02(sAk_JL!XXAix0Ml~LZ z`EyrPllNUK&qF_{FK>X!v)IAylUh-B)ZCSLrTCGO;PfZ&W2;3tMXIRWL~*}DAqj)L z0#=CyYEORk89cQ==HF8Zr`sJb+99*uAcS2^ZJHD4{l7`eQ z^-ei{x$IUJA+KH{EvkTg(j_BR#12Dlx=)qYrzCIR>8QOn$G&o>%n_C`;upS!dcr*8 zM1^RD#)>|AxU>fJxK^y%iYD_&VOb$XSAC_ow);2iaX%uTbFw{S^XGL zfdPhz5=r`7RNAbKc}}?fX@fhfHw7x;5DK#bJH(9M6eN(WAikvjTtQfbIME;<5K6tq z8>EyEKYcs(a^qUSD;SOdaeP}K3i}6yghBZiG8>QI4I7Bd&IUX`W|fmWNJSzF24les zZ^+4Md=M$x>O0p;D<=UA>e|y&>{N2>3neYl)pL>v)zUU3wl2GM9i;4teaW0yXOb+= zWQlneS>&FBCDy%*(8p%Bk}{Bi&n>iYwOKf>A6;GX+$-ZIJC$Dy=I)E#zYy5W?f%9* zWHWZ6l=zg^Er!8SgmD(#^IQxCv2cMBxMwXV>P(7|5Q$v+Wh|F4c*Fk^NMnDh*4M$D zRi(_$P*++dvB*Vq{Famx*R=eGkC}D4$gr%KW@L4oWn7(f%8gQ)cp=LIP-mQqdgrD! z<$;z>A|bZLbCe)>RvCj3m+OnjHHb&H)!+zH3F-WOP7d*As1?&xvnrWIBA6a$Ad;;p ziL>ElBr1~KQ{mA5(dedBx+*=`hZ;wyVIcL@B(UNGlLvoA7&pRPp*TA;zIseYZB=cH zRTlM{=g{KhAE6?Q*pDNAuU8xQ)%=Z5Na8jOy^ffimU;TkpC|Jx6VMI$%SPT+H&A&` z4r{+H>%?ueAk}$}@GEVQjk3kch8qk;WN32Apyoc}d7A-#VAcN3b5<+{BXp0Q zTQGpvXRJ5(k>%}b`ChMrUd!BJ$~Vt)muv!5ZDxiX7voxH|Ly;doI0QJ7DP+g1|4QG z`!Ni0gi9r%FXZ}R0>th{$EpP1pDetEDbv6Vujz8=yTV{xeZdQgh?Z`23a!mfjQp)N=bztq|iutP21!5xNLxD#B zZfb%4G8=K@R3M9^{hR%J*^ z5>UqWrei`bXL6~$#jZZ{+};-TytI4>uZfWsLO&DJnguU}y3&a3l%vmvhJGU`l}h4< ze~hReiXlq}43}t=ww1NG)p>(d%nGNR;K}A=6b%}N_oQ<@f4B(OGrc7Qea++xbe10c zg#}G#L`YBTi*a4?W=nA+gDg65Y1E7yht%)&S30U*WmqTi6xC!Z$Jid)g!7&A1ZQes z%~R$2nk4F@v*59Gye;^`RAlM<^K~)IVL+5%WRyh&c4gF(iw4ih_fj%7IATnfI4HX8 zU5K{tgojR-4;9tl#r|Zo7{6!LO$yl3AVqP(pEIgsA%8tmqXo)NB^u=C8f&T*t@m>Y z$1;39Z0B&rG}7YLE$scSqGz*vAnz?cp;x#&+b>9})Gej;*5*RG0>L!XpSIjlZpnPF z?0at>FuAHcLQdX38@P6W5?GSm!HJ@oS7@p}!FP>T>S8!Yl87Htey z+q^N0vB?(A-2VsW!4+=1! z4ve456W)2S;8_%1WCF{?1F_C5;MFljQg#VfOz^PBXqFv8j&HRvsE0)9wDIL}2eGmFlsd>j$?B`hi>DDBrfyAWR=vNWaiXbzm$zjs=Wm z6Yu*)Kqb5JT^wK}y^vM6B`kv8tM*p+x}ORLuI^%IVNf<+sYVA3TAyxSBnUOpehHDw ze-2r+L_K*baD#slT_wcYbO+IOy<36!v%ud!lURhx@UJ+&Hs-VrVnsP(dt1oml3wj5 z5hD1Ab}@*zS|jVWHoPq&smjQlSj+OI#z+4n&EU=bZ#AUEb=LI`fieEhTz&6m8E?$N z1H`i57P_u39-si3_Rv%gmWXiM=sOc~Qe56bk`lnj*Q0W)!7UvAqK4fVi}e#oyX;qC z9E7kA_J7NtY-GW-R#QMKE^<*0SEW_M&&7Bhs4fx~9G=Q*5^7%9@0kuuRbIhYJ&WE( z;I5w96j+k6^zZoUh9MQVO_|kO3O5>}da)*xy@F@4R5URHX<8=G#E7A+37IDA@7KKy z?dX~_)=H2Y16GKjGq!u5SqhlZdXa@ZaGE~2d{GGFv&}T3h$Lp(Lm~CGF#O4ie$#fc^)r~ucWwr+mrN3Cqec|EK@xajMnM|NZHS=b>dyYe_O&8) zoN|HH$SZaEMtcE^HZdzp#AHm;11{;a+l-yZ`KtbQK$U`n+bnRhGF@YOJ@*nWD;S1E zAtSnse-I@2ebv3Vhjh13Oc`2$DCfh9!1L>|^8)|MJ}AVvY$Jggphd6mec?_2|0Fq|DqW zM}=STl%Sa+2w}hn{P;AtgfDD*I`5XSc!k^|1Hu*VG(0uNqSCDtoS~yH&i8%aveL1e zkfb7yH;0Ugxay;Xunt}-;&bM|^M3HaDbg*dH<-dARoAc!s&R!_c@cCKSGN@H%~-c> zzrmEHC`B^A@6e#RXP?1TqgOpFN3873Bj6s%n84aEN9+R1_THBjxu{J(hG#V?IqDIl zhG$VD#MlcrJ8VdX&2bO8Jsbyi0F)7#71>RD~wojp6wo!-hsamYW%(wDY-r6L61F1c* zvf=&Tt^LX$p1RwoU+{n?diuo;(D1!1uqUV)(urN7!Px8xDTiR_r z_D=SY6u{FeX-9K^bm!W5v+jl0)=JNs__Ci)?*m+jhcdj#C3Rd0D2Mm|)3S(UT?2-lah(RSYP&5uXQ6g|n)U@`To{&!V`8VM=pM|x_XCCA+@k7N|$1i8rP!FZkiS&Pl*8l2t67dZL z)fxjEv+r+Zj9iGs*39I5?k1EEzgj&!BcJHV_t}^wY#ssj$?TcrHKwJV_TIOxy>pY{ zH>*vYQ*|6q6JA+-czB0e8my-5=cP@^vq0N+clX1`lA{&6b_^{?Q_N}wGGpf-^B4A| z(Rde;-txz3WY#NRZu$sV$u*q*3U

>Q99lFV-Xi)gs{_`f@xR+c*s6q{ATbP(ahFAFO-+W|JzP-Fo}dOR4B{u?V*(2AlW_S0ypKt@2?N|OmEliFQd2S zX`!aX1OIG+;g^W){%Zp(kv2|VYdy}sj}epUkI;X-*bg_8LZ%-6hCChy(2pn2>FZXL zXijtEOMmS0&4fq|BU^O3-b#*&57!Ys5*UuT9zOQ-YygAkm*Gk}Y}e9MZC?MgD7^L@ zHKN8P7F-PCx%Wq`3@Cho=g_K%GIi1eD+VC-%`m?IBi@OQz|V&p6@sRx;5FfH55r%( ztw^(!ir6n4oM%B^lWezeau>`TEM^D&UVBz_0_9V)hiDNmVfiNdR!}$lQ!v%a)BjQC zy4;D&aAZFH+|S!cBR=$@=>OMIY`Mw`I7Ffu(SRY`z9Z8NB*j04V&d@uudTW9UDKC) z%cFxdxtX@n{~AyF)Gd20FMX>mYz;Q69u#vno086W$zMk!6lL(Wj=Q7%p|#en3tx}o zZ1r8Q)ru}{t8(3%)U!#<_C#{o zB86m+^_)IM-$L{B#wd5OU!V>2#OadIL%rv^wV?Q?XY7~TheI;Q(w5EN_l!GFKQG#J zU58RAw+6?GZfWD)=@uv%(EnQibh$*@{;WCAmX5o-Rp&%RRgseX3GNJ6>_9zR3KzRX zYrB`Tmc?|*rFfZ>$915|oy8}E<$t7@UG&|`?o~v%hqDg_Dj4i-z-{`=_P>f--^%j;mXg*tnwJMaohLH&h0BZJ_bk|=9MW`C%j)X- zZn2%hE2VSW!1XoqYaQxrdQWGRra=o&>w08D3?h(s|1EJd@$W-@?!Mc(=?kx+$6c^r zZ^OCZK47TgKpuj!%P223HU5wAH@&tu8NNC?a3`g;lWv`?SbKr652Wgz08i;JW1as; zCeOC+PgXsk&aNjNyInzMqLMub``qs!51>~W_n5P5CPkXQ?UD+H@hc!r+em9#9r&Qx z;DuEm$D&$Q{PMipia&Ucg4c0C(chQtKl5+YJK)tl65`{G-ngMi7CA|<28ZXvU2%Q+ z#LElV5J6l-qON~R?)zN%LQe6P1Eepnm2V>PchUNmLcq~3G#R=+*>!G~t@FHkWJzsg z^6;;5COTG;oiKiRB-NG|(Hf=M#9mXD4Ck?auY<_xr+tLX-5rgaDsxnLH2Znl za@2yg29d9Cru9i6yhdq;Km!ONi!TcRHe99mPCxFI(0SQ)&|1CZs%{>14nEv|F9&|X z;I$pw8c?`Z+~D^|bnVQCl{CIeRlxW$#*BqE-a*_-X+JU1lbSDtH~*D9u=D&R6AQ;f ztZw+qE|*8hHQDeR&LtRI5s)AJw=c++b%}#GO`G0(D0=a&Y{72W$_^ZhB8a}=X4y3OFwjTs{SQ zaI{$SI8s6PgnW8lw1N;zWK;y%iRYTE{|93d){}Y$ZUT*(d6Lgkt-ksDmhsL{PyJjq z9uy333Vp7>JkLs&*Zt!5og8xJ!RF~sSBX=aqs&zih__KQdhd<4;Yi7DOvZwE(Ba zpcX8A(mL)ns;&@OaZaZ6d}o`j)8ta|^l1qSTx6jZVHJcrH#Yu-u}UT>sewmKQ@pB| z4nMsn#S!jhd*W8dEEtYv_>9YbgE~g(de0>DJQo>S_PB;nlYT>7u#~uQpQRn5D9oFI z*6QFoGdWasQ@-m(3%I=w-QK5ds&TN(%#;DbHCTuTv*77eMM)GKF8gM>Q-`)H{AnJT z)voW_AB9p5NxTWDV_F5-gzY0(4(#X_REiYH0p5b*H*K)Lj-=*zEP!_;c{R@DEga; z%Fu3AW6cRKKUD||8SQik_w>eEa*5E z!eq5ar9Te7nLfNZ>a8;IXc*R=E!6RPn9>MtIgUR*)_Ss_ITk+Q8%ALAnCbKi)tl@T zzqO^0T$Ym`3I=b_@s!H_QDKv8U`P!R^0z|Gt<4yhPtigh)ClfWivf_ zRLO~i&p-EeC&kU96CY&_A7-+ULKY&2M^46x?dL1i9c#I-H!Z= z*Z!1&cKpGGbY?9T2A@)B68hFWhU8$cJObufGj|Y_zk(jOVga^^#{>$7PZ(rrRJYq; zYb^vz4CsnJ96~(K$Ybv1%3#h(s0ln1?%GvVC&HFSA>>N23pj@@MvgSxb{;BzxIvC- zG@c;r;q7k;S|%;?e_a-etg_#lN0cH?pLn)pB-EC88y~3?L8J`8M}Y!4eyQM?J9Ns}ZeGdO!0H6au95}>!)j3J(aWWnB|5>NUS1IM=@^zEmOsjKctkPusMq%KK zL_nkZU+bx|4rw^p$(i+aYpALd;nGW+Zwr(Y%)mN_-~S|b@RgbXGP$!=aV7O%dkPL5 zt#dLAp6oxW{q+2g5$?ART2@pp7JS2jI8`t?9ReEe8O-ku+zk9<-j{= zZr2dpGP^{cFy?Ag4sEmo$dIP9Pg8Kc48&9EZomfKg+dSw%GXjnQtqTPPt=HwS-nS+ z8L0e35K;p$;@;&Bee_n}94}V5hxyTHb*3N8(;xPmDq|B3zGyZTq+vUO4Pb$wN*k`! z<8R0@3U+Z?6>kpn4Zu&kJ>gwWP9lQTdeabZBVFo@92ACzf3PAqb`V2IEF&xMejS|@*=*Zx=epyvdz-$uSqv=m7UC#}P;^ZH6Z!@p_RhZC z+dcP}KRt+LGJr7iq2~D;V0V4}|FCuC@lbYOycs)5M6yI>O^dRmvQ3GyPs~sW6|y9< z%l1qQLQ^rIbS#2LO@ZhOzdAS$J| z!|49d&p8arbGVo1qtbXo`l5Q7YrsMMDSb8d9C@`&=v_kxyY8ZNlx>2rm8)oqbBpwy)t~$6?wbos~;`S_$`{2 zDD*}CI%e(7c#{on6-gZudu$w8);@163lfLPiu}4tM$jE_fagYogHd67q7@q7@+-V; z^K$MS^}9X%Wbw+kR;I%ZZ$D-JG~SC30Un4f)1}66(2M?el&;B_nw^_)LR@kB#^NLo zaP}ejx9!)KiZXbbM0$pl=3AAAQiC5BH|CLrW@P=>lrhkks%j8iX^@lChwZ6j7a*8G!X&~l3d|Iul2brj-JU1oJX z;m`#~wOS*0V4~8CGjlziyLk@A4rox3?|6z65=%?)^rG@ewMV!y(wsZ~rMUHn)5Q&4 z{d?W93+@>%F?m@|sS$=e1$N=)G454KvZagP*w8q2X&aeiH)VJ3u71Y}jtwn!Orr)H z0avu@uU}|Vnok^&M1Oi)p(;pPv3Ea2OLiV0yeCB`+Uzh4Ycg(-t!izG&>s}1C&X7Z zUw5|dZoN4rt&Kudf|#s-H+aGE6qT_P5ZO4dx=CI-mcL%SP>2sb%!;ntgYTjj)lPxv z+Xe#eN|dF9br?X`hi_ISPmP1*A!+O;@(hQx!VV{xP-R`Owqf=t%{J~|UP@{G^wpy- ztJ;3l9nYt!KsDJaFuo)(K677b=JSe>LeLYNg)Q$F>rc5PsoUEI=lRYAPIK}WKF^aW z#RkOmzBG?ne0CAVu?$-)-c4pV&j;y%oi}>=Db8+W>Su>7if(hXR?92q{I9L<0!%Yg$GKs>9opEB1=8ZBlk$9aP0dlpNkj6QhG z)DK04JvS1l!NV6cAq~p;e?eR);iTWf6T}&j>lv`qVvGsA$WKlB4lw0Wk=ai4 zr?IQw(c1M?@n>Ou9=f&L%4zxBom7H*Cp3CG7<}W)N1uY6=Cnz`n_qSD5vGf9Ih@Bx zg7}%OA?z^zA-0fproVJvF3PfRPxC2w2Ob4fYWMwbT?aiDL1?rFX?>m!%NXec#!^N& zP5-Dn!0>aZt8Jt*^W}|XHo3gytf8`@!!zpT%e2*PqQm0SAB7*g&iwKpfNI0r+?>w_ z40CVENf-(&$@a1BF4V1n41v;KWsJzD9|MJ{zZVN>-XPcqgbM5q>PWE|YNmTaPxywu zBCU4%*A^7#dcTD-X`qG?g&J-1rLE@1nq&LtmYRPdaau|4okw5HHsy>2aHfe)-|(Dp z$G=YreD<5Ouhr9Z8JhT-%Xzq|ggRswLdeArCuZS$Ne%y29z80%EnjOPdYs?UzAy7e z_>F5+A7|c1SP|!yNyk1l1-C|ao9{kTk+rEY z(jaGIr%)9vgG@_Na{CV1)g3%oc*7wz$LWCQaf6=6StJ(@NG`9d+9}vJR?&^TJ*Rom zth6zF_=JCclo5~YYrCai?V;(34tAZG2Qo&}*0J>e88Fs5~30nUi_Z zD=HUVSS+_c7R4yr7|pCqn$u&3Bihyob}H7Y?_Kobd=c!4%7l5Xut7 z_oyBj^mfD=<~fOcG$%{w51K0-oTAogb8@M!g}yZ_IQf2K5`(HRpN_gDnHx&rcM7#A zzfHklpW$luf{KRR>RR6Z%~?F6{FVNb`Ah|RLd%QUg|8~#+7=y6%&!a$HU>=%l(u$Ic6jRXUgmvg!G|@)_#K920t!f=Zg`UA4KgHUS?YSyb#W!(M^k~mZTpZ(>mV? zb$im1*{TRq>Zrc$0G*v|<$A^~`Z<}qe)g9vUW#p`nrw-^DR)9TmbbpDFoy9kLn^aP z(T{w<>VUVD?Zix&b!^Y)NEK7KFFtGdE!L=Exbj@onQLANxm{VsLn3*$Vj>U5stRRf z*>s$@#~RAwJLZSRg3ey<c>@@VE<%-){4|ZB=kG)0k!OQ~g4ZFe3g8s?<;z-w`|KH)yNcY#pE6V{8uD>WqEV z(H74i7V(PkpWW-BpO#SY@w2L+z1PLsg+^s zK_0D`pKrGdn!wCVYRx1&&40;NSs{8Drg|r&n2XwM;_KMU88eqhM_V*Xqc4qr8*@I@ z6P2Wp-)ZCKM83a!w8hoMLEEoj->UwEJev7b0zEuF0eLBS+mLbWQcPq0@onx_KO3oT zu%s}jdInSYZzC@{`f4&Gfh`ewQl%c>S2ud_lH=6;fRd>Kql<_WecJ*pr*U@_8{`Cl zRR@Hb`pgIUhdHiuRzP?y6r#JMv|`_KCRHu}>9j1$#f-Kwxj}%pdUkHD1XP z>+bd0^=VHlb_$nQkGTC@;eHSfxd3CrMI+n2uXOSYjsZ-_GpeF~9SE}BqnDoA?QC6G zK>k3cBQlEmDA!^lpc#rq%ns+|;B!JJIH+u&ih+ z>X7Dmq}3=_{YxeZ5siSBJ$miBFg$p3emr+}yHqON{5PK3_;45`KAT zdhgS`GbpFst0B|4rZuM`n{vjD#9@D8-M`IT>n5?gp&#i3o1hcHuPxcz)RzvV1@g`R%0@U zgtWunAHh#?M!6r_EiMGI@WRK#PMtJKU1q4ft(iGc97>;*H~Jyx*-hnFaZ`)UU@__t zcfhO8qYlN(Tb|g0Hv#BX$Ya)+7uaH!vRn!p!4#{UKoV&VBI1=$h{I4_-Y9`IcW7`Mxv+|~cu5R`Z%2pj1(cnz^UV!f(p*8+0Y$t`OU|*piOS66pQ*P;4T@Gzm@Lr} z-xeA;a;&eBr4nQ5`EK&C)2QG8{Q-pL>u zcHa@KFNJ{q$EdaMNnlw0DbG*O+b74p!Y^~lHi|oM{k5?4aya5LpEGcpr_*w?JtH=U zhr}mK%00iNU2u&}hMSe-R><}BWjdL!@^uxIRzmCGWaUGyi#!L5G*Ft{{x}^F3Gn#~ zGe(s6v$qxRz}7_@__0V;+!J+HUGVC$bQshMIg`F!y?K1%qw>4rTLN>%&gDmbdQVLU&rC@*wrKq;sL$vb?DA;)iLGDW@b{ z&hhZiUHLuf!O&Cx5p>=xwpLMC`&Rl9yxs|yD~DGdmCOD~1%~2ywne+@1Eob>FXPmDYZi{3h!;^my&Of_=&+9Alf`B!uo|FBlj zZ-a?u`(cOfiy%e~fYMLajWSQtzKq${Pfw6>&(k$=PH9PZmfeAV1$zIWno)%dBakaI zr%}aPr0v>C^{jT;^N~ILQ8_slESOfIQg2A^CRW0{0UT6=TKPOib=&-+Q-$br$ZQ5*&cJfW7=-TyT^e7Z{)T59c_zh zOq-t)KRb(kwe+u%y$(nJ_s#*70Jaluz9!?{FBYv!yk;yk zP$vK)g92tfI7{ZzvBO)G4g=gQ7_}L`Vx52dO{`5MOa6&KBw3UTZOew%fjbFx$YYoH z<4?m?a^7e?yLG$%{T2`PY-6b3Hg^XtDSy$lDOVeH;uK~15eX6*9w5O*+`TtRX~lBt z;1F%DGIICD7q*b{e3g)82)OV^ZXvk zV_|h=U`bGL(UIHhmkwDFUY$XK8eHr&EajjxD6<+0_LGfIL{49M+4fCp8LM3@5}hYF zzI*(@vzA>bU2xRjh#LH^@r%J=vq_^g+w%9BL6rkNx0XP^0>|x*aDr9{5s0x!Qf;n< zFm`XhU$dSL4QatE!Prb(wfQ8My0Q%I_k+MA-8$8DTC@{ccRjcdma8xtCV@Ga%WGx{ zF%I-6dlgg?#Ulf-VJxAv7;D>_;^z(O&miqjfe0yOz@cLHzS_ohHv+smXk^RIm*H|{ zaOf_Ca|18}m;sQ$pyqh>&*0@e=R=Kt4x`1Hvf~2FJ+e3(&7gotsUipgy@8-fKbrVsDn(wEmUQt$ z6wmnKHDA>`hQA)_c>YW}4^&|rJP`bC=#HAa-h>4cxG}&)UbbS&A*%xY38|(BsX6&(O6+KK;{E^bYkI}qdTEQ4|kJ6m4%mmj{%EqaD=Rqo^|w)jeO+WP8pM`8&v@YWeIVSl0jZtR zjmQk^O!53$x5$Xxg0eo3iuRe5YG5&2=ieKC{rWgwc=<;8+M9?iTmA!oxrh6bEdA2Y zFd2H${m@DnZ^7{tBkEZ4kMuaLHder>`IkyK4zy?}-YE+H{o&LqIRO8E>z>jKOw;Ho zzxbpoxc-mx9^B)I#G`3jR(KBBF}{G#%6bLwfZ{1aU{Laat)1Tmp=B6E_x}+h0BN-= zPInjD{7bIV3c|C4&6-8G5hQO^1>SzXL74N~(dM-{GV2Py(SXNf{HcI*Dy_sJ<-I)= zD!C%#d0w;+j`&9?<`pIb0Sp6&PXZs4!4X%P8ITz8kH8axcp@k=S<&!uO@N-km+6#I zY>0k-K-Wo;b;}lBRT`4yRn+e7Xe=d!#XR~AmeYq4zq1WSc7@XL$~n&aT;vqq|M>_u zEN*)drZn1A3?I{4fBfk6w#NKS6C@GhhS3>I)9Q}Bbfi?dSSmmmSthHY^WZA+i0WRS zBpoq)sx2>1hB^vM>E#pub5HY648F{**}x;~su!~@;|^uzt4~jF)s5FcEp`aUrl2lqMpF^ThZx?Ym9J=|zVr%N7cH?@CYu=7q@Kfl4OMg&-yI-`j_$G+l{| zxzj``kEc&rq*&3dl$E_z8INj&N+2dXZ}9khpl-t_Rh3XXpZnjCn+<2b+4?8 zxd&IY{6`lfvw?Z-vs5PA0=ah8W`Powl5&9y!f$ds4|dekfU<)OCSUQ6y(Miv=e=GT zXYH!t*w|qn2R1J@D~mrdMA?-na#3H(EcV_#x(>4>iZU4~$Bjpl0X4Z96FVFo%YT+` zjBA{B^`Mk<`l}w>8}YWP&5hk8j<@l~(jYiUwWnP7wB1;ZcZ#%i zf{{Bl?WjXsHkkV|$`GnioOkn>5~L@LkIS3PQHOw*)5`fmLq)O)VccwgzhsIUq((?{ zE1r;*J+9aW$tx-z?ZK`FJ?vd&@xp!QrHVIOehgf#X?GQ&CuB$>iHv_-_L){q$u+gT z_}n7cpH@^rgOI*K7?yYN?Cl!(_Q}Fsu2nIT_p6J&mlnzrB* z%|{P10u4Gyaukfjcz-6fSK?kNSuWB}o{okF>h)r>Q1+tFo;}6$HZS zE-peE^N!An4V{=MTU6>r5J0K{*ge3HE7=TV-{Bu@?(mM z)ndNLxx`=C3+a8hSlWw1NtZ-av;W+5P;kz81jhq9(lG=UH1AV^vO?vwcZ2(1pWcc_ zSV7k+jCZlam%`LtK-Wa&)p-&+7S8Kl4wkiBnK}BYa)pf zlpVZj^QYa|HSL(A;x-2wIDThmC*j4?kchb4NnTHIqXfJ}8Czn#eR8MWxWP-|rtzDj z+YY77EX@EkRpL&K@unArfNdD1^QYef9LO0-+qEf{FS3J(NIZM?EGJ@;B+j?{k;1;! zl#IQ#(AxCY!oR<;;M(SMABP9=THDcduY#Plmz?d#j%+1(QsPMfPy7X}QVe@0RJJt+4~__WWt*Bma;d zDCpk3dqo#ep6_H;MUcdOEBcgfbC>1Qv@@L1e+b+VTF;UPnF%O%^k~M&nsL4BTHXB; zUjIV`F}CP4cX31t8^pd?a2Kz}yk=VV-;CK32&d5i$7!vh*eL60jiu+cVc#eP3WtB2 z`-#(Oxs-LGjb~#-iq%)<(i0Mm>lu+&u{a{=@`GfucmB~Ssg#6&YykU9^GR+``&+E& zHsHqafR!M2W_Z_`+PVL;=KdY%Hus*nsnOq6zQKh&AG&}8BWc>ly%Wu z1Toog6oK6fTjc4U2(g-VyRDin95?sLL0n#e%hRg{9(DV`^}C+lt^0g{@)(8*ZgQvn z9Ox?Bfr+!m6Z0%{i-TU^fJg{Fp`lu7ko0J4a?Rg}1qe^k5&Tlkup$sw3Fd<8DYp*O z1G1KLMD=f;=B0+h0yzcnJ1_Q{XaWl5_&0z8dM3J+Aa0JR8{V-Jz#LHGNlxm2$;yS+ zzJ{2@tuoe>TlZUa{^9GGBP6SwgWUvL=tN( z{5t{RVhR>q!2oDAYg1#C0JSxw7nP}IFL6&(`#aO<(Gz^B;W9q^JuRswTJw{dVT-Kb zzXYcz{O-SqS`5Vz!POCc3B0|7K+diAA-QVqEOyW5Om`rFYeVyyY)<|I3OX@6aQy zp5usM#Myfu)vZ!H@NAU*lB2#^{xb-spMSKmsthwKvf~5?0xJaalz$b9fr>aopXYSi z4>xxDZ@qvkYr2XcLjjDHc3{B(KVn6v{9opKipX?1xpeY%B4|m%Q_&u3%xsYKAx|_C zB1-@5N^eE+K1J=-)#oQlVlOw<^E@ix+e%L$1LZuT5}TZSDKMdT?g)|?`uBS}68I_K z&H`3SEy9Q-8r}k!1q6)?S-aM zDQR6L5nV4c>poG%^N~gc-edofUCj|3;nXAx59o+1FSx@C;_VLZY4S-tnVi6dEW7cK zcoPRLTwo_6J)!YclJh?t7>eJ6e-spCj&Rz}Lij{!0Cn9*D9cog{5u>qwxc^uQGsAy z4IDn}I*L^@`yc+U2I{#dI3h22RM-~e3dXT$Z`-{4~Ajq4C(!>%AOth^_xITx!> zN@&on7Yt^WD4Lj-uM7kpN@XFkpqvARwSxc<0C2Fdp^Tvc2sQl*=VoKlDGIY3k@Pky zWeR-<*RNoGe+Bqbu%VKi#WjNDVJ*6`I5;T*AX1#7i~bzNxqDj?LHn|%1i;jI}t;FR=)YKt?d6MzpKVkX@6-=9i!ve6rZ3(MP^H?$f( z(&AWK4u-LcTM4@W#K=mg&#HgwBSZ&Av9;qOi?|H%eQl$7(E+>G?->W_L&NpLgz z2n*rXUOW*D4w9x&DH+S>>{*CuLXD%XP1L~6p>;oh{Ilq_JgCMAJ`@nSJ8vBRb2u*$ z0Lcb#n>}8x;#8|qiaRNc7gK>55zTag1b>@*WRgJeg3DB;aH-t^^^A1pn}T$g&gv(` zN%iZ9h1mSKH$Y5XN-i@(Y29FuuF8J)gy-wkWsDjtq$B#9_36H5)nmN)dwZ5%Q za8C2yE8QhXPZ#t{yrZ59fh^+;W527x5ysx3e0`fpU!Wu#nng$+F*#~7dKRh1gb*_C z#zmxG8rIfslR$Jw>=9-VHNK)lFM++HbFN2Xd^mv{DYgSRnE+x^wO4`_e0pf7`sB~H z3YUA{5Xg!`P4PUMGHvm<)ooFE`|t-rB`sKqnvI{kX}Ij0y09ZlZF_JzY8DxM`f(EY z@%Cw-+1sS&M!~=od+>T7XDOk$7Qcr=9eNDc09Mfmd+*T&KbkKmyb7N9!o^5f^wLJ9 zFaR;f5l%a76sBx^{)h+x8Na5O+9X6;sUV3l_lZPK-b{irW3xW6|e`ax3CC66L%R?E(1#G_;fAE*M1ji{2Hgx`f zaobIa;D>HFYYvpuV};^~LXz9tOMHFB@Iwru(x6U3mLZq+>9T$XFvz6Acq)NWgE9Rv z7ctW6IyI?Z0>AVG_Y~CR|5`M(e9(~nn%Fp!yc-b@=(rN<;(x}bVt2y?@g8?n_kP8I zA53O7n$p2kV9!aY2>g|Hdte*t5Sj($gnbV{&RDaygtl-s$xIMW_OYTN9YB_CL8@&- zm?5AiN%R}_tnpM;Ch##k+IX6pq!@yjEI3t?zLj7wT$}*>c!V?D|Btd^fAH7H+3!7y zBXScN3AW#G&|EqzS|;YomUB2Ax7Q_yV-z3|$zNp2){Z`{eO%X@x)Mhg%h)hFQhw?pW;d5u>la z3hI`}5{(zh+E8}2QJ`cEXR%RluPbN}2<&plZgf$THiLIV#OBV6=N<=R;DU1JWUL<80_hR|c>f-R+TN-#m~wT?b`$ zPZh-_`KBr>KnE#yWRX@g{eIyTH21dE zqVt~ilBll2F9~|lzYnO{u_*s?6peSfzVh~9>JafG`>CODu_M|2j9#2X)muT<`-_R`Is#LUfq)@o2xW(PKyF9e3nY#WN7T(nbd4NV3@ZwuiP@nevm>f4!G&1^>Fw*4N#NaDvVYIdnj#_~Td zJeZRt{7B=54wB3?j+;xjtMF+uJoEDQ*O;`>?{eP5`UN@lC04PqJBkKsH9xXo7D?YL zHCmc%P<8x}$Jp8M1%x?(&`1x`ujH9 z-;Q@JS@`EbLPSd0Wqza>2eNGI#v{TfOg|bd)0YqtSem=n4>4&|08P#uXGbshFhWx& zl)CsI<0S5GFiN=C`>SK`TQC{S;U{2VQKTXD@57e?7-C2HoY_X`c;0Ap-*l71{uGw% zOW^(~k#X%bYH-^2n-94Xh3HaoLk0G#OxKaa-MAo=VJkm_FlI#e-E}~6g`~m_Wa?Z) z!bO6SR{FAF$HgxAkLcnfVuA6|z%Z-L+jXWc-7@Nh|X^!#GJ z4BnZV-SrBXvQKuUAc0O(zl z@UyGAi8_4ho2?q9=>{|wWj1$B5HIG2v?_pHgz)*3>o@;wY zRZ3<*GqbH5ZOh>F!sqtT<+-%jDUYXL#y#EB>TQ3UTtx{@RWeGV3rpBG;l)0sU}y-q zj#9YRc{)rqQy~2b4&^LPTE>^nDzbQg5pC_dpqPCLZjkLQ%~u~6V`7iz*q7zAC(EbQ zrBhoyqsF)$Wknx}Tvun8NlkTk#jrP2#X6dg zk=WNbWl;6-b@R+Y0ceMMTeI|Z7?-HhPFjphpJ6!eZo@jFb@T|!eAkqgd7jPng^FlJ zP);0)mh81`jQ5yXuJSymJ>tI$4S3~%>+v#^&tmp&~W)G^( z%6EKwfV-Q#VNE^ZERv=)?=vwKBpGUNf5C-Ld*($)luUDM(Cg-LV~l^Pc+3Bgzm~T; z6X8>6tm2vJ187dg4tp>uRRU7DJo5AQR?f!=Ouz&N&=Ku8(H<4Bc9m>cv2~K%AFUDKQ!=lVImAub9>8#@3`@{<3x9-Icc>OL@ zwA*mB!ba2kHpKQfn4@fHegzK#x0Nc&@N)FfTTbp%bup3T(!izU5$v$O$8M{3?2Mb% z*#W4{jS5-zm>v+LO|DV+wM)35!;u4s0$AHO@d6C9(A+jmm50`1%?N|L{DHP11+)0jUQGf4)SBn6uX!4am~0t$!5i&BKbBt=82ZDDj+P20k^_st zS~;Nqht!zSUjRen=`h8`fsXxAqI_AyaZQqT6B8gJ z+n@s}S(62xhg&`#Gt3Lpb+CP^XES(I67931^#>+TarV?Op;oR1>N#}3NT=8pHCP58 z);0r4Ji0t4HK?QD;guQVYgs81Dn8YEZu*S;V(t7?_Pf(*uFaka;!SqTD^Cz#*|vpTe!%cOcGjns$Co?KDxo&P zy;ULh9gf@-TWNh^xQx@?>n={>{z~HD1=(BxWb<&g-@=E$TB)>{PlY%u1z9O9$?92k z#<-ike+BzY^(jVp1M) zBKWo4vHGFA+>|!FzQCXNd#eY9DVm?aMR>CMjZ2Roc7MT&8O%;aD~uC6_v0fZ(Y{5~zC~}7M|R7my%R_ObTJ$oD!XSJd$tfeb3IjV;syJ2V_&b$ zhbt_@IO%F$2;K?!TpTW^fDa9M=5yJ+I-vFBd!E(we@?mIZcfl(8k>5Lb}OLep)6~*-va-x?8iV;yK)kJBK7aZ#qWYAsb{5c6Q7TN$&C9B%*K;dfw^_4tRP0hzG$!Gyse3Jq}gw$q8XlldoR{@%gqG3_fBu<_Pj?8lGtk~ekpN& z@^$kfx`=-VbY^p)TVLq0>cga84er0E!Et~ZGv4sR$U^#?>%|LE6*2;NvK!gc-Q}AA z3kp<%FxsxV|JNzg)MicTCdu1MkCUzyix$A#+7|TU9Lz9JHYCpCPf1Bo|=#-IotU2v8&fhd6~M%b19)`TNQlw>$mrN zJ?qzR&nVbRE43N;8gS)J&bk$}8a-6NXvSwcCST)DPBqh!7pxX*Ze4tsA~!L0Td=vY zPfn&T`ZV{YY-m`CS%FGyA01{?{ie)mi7Db5Hvnq5_6A^)1}CwuQsIZd8|-Lt2GLt8YN$XutzrJNMm0898K^^; z*1{{_^m@IfbiM|3eVYV~(UTvx5r!E=M~Vu$2roGFm<(y0OFV~zy0>=Pl0g^HI1!&y1 zUc5@HHgf^_XH7`wT#UqS5HT^r(V)cx3dbveGlM)`e>=Wc$C>K+kB_*$=bk&sW&Rkjf}1dgMMm~?VO)lCQ9bS&P_ljHJA z^Y(SuZ-F0=GT2Z{gRl!UK+7xUy73e2p=sIVTYDW2Jfp)5k8fH}SYpvxS5sIx3n76e zP!T&iRC1j5vIlXt?Mga-!M~|@+szrrti++{=W^@r*ndyThTxytbNT~1%md{H5r zc^@rlUJR5e5%aqVU)VJkPYXn81uLYO`($}UkXSu~MGxWKS|?vRrj_)U{0xL1fj$nrQbM_=vo5o5Jiz*0421dld2&!<@(3uL z)62tI(Zx!TnUBW8HcUp$TwCjfbk#!61QhB%E{6dWsB5lz;A=BEM3-rs`f4C#A<3>$ zjv&K@jvY1t87?t9X-HDQ0Q`w^5a(ssnVeXm?m{=ucG6T_%}AMa#f1(9^pDLjwX5`DEld|d zN3a9*&oGEdH*mLljaRNFlS!S*cs%p3ABR_u#JtZS3IGbHg`<}h)rTuZ8p_G) z6vDsWoX@$QtDcN6qF553OF%EqO{SAQ-=RlN^P}8z?O7{%mhqR_YW>vtT4qu`9`_fk z8S^^qro;2QP7ErymEGiz?gh0JYzxT!4*~KqtVXWxD-Mhg2WiE)C6tUT;B#9FSwtFeg1^RleOmHD4?75q`)L31|^^##@ zymV?(hwR6%9Uc7q&ymzK&BYUYhfF5PQ%`RUlsRTfLd?JDE3}zdS^8>ZvtX(;lfKw;*B$$hro3VkQ*aJ{qQwE4;gtRx z2we{K>-dNh=jHecj@FE5TFe`Y?iC)XM32<9N-e3~={`A4TrBI$)6!OvweYqip+Mg?wD>Oy8-V^V>M=lznyeY%R8W7;n-O5 z0VI%q*GZ+qCMwJ8$482O%A~Y-Wk*2LPz3* zgSt$VN>2^t`GNsX5aUh++ab0Hq42fB=j@cn1lMEKYW)hQn4_9ywMqLDG?*xr0%)i_ zf9eerH&Fg)N!=w&$<%pXH|_qSeLjj_2Dp1ml|=8TL8QP!@t~!Tn%3;9{nfm(7RXA|ot>|3Z~G9V8%bne_&u zMwZb~puRr0)Tt)v+PH*16+CEyBOjo-zYzFrD>Y_up>Eol=er}NsmB|O|9!5s0f%c=jLY!&0J^NAh;EBe6cLoaZj=8k7X%ximJ^;$=)t z0w4Yn0e3N)Vwu-CnDv*go3%;TBqeOOQ9=)-8&M?Ls{q2%l7LWag;ef`59HSW8dDA_ z8g5;<3&rbqsDEH=D-Z4GILWD`e_4L}9JptirO2~JChKvfyg)Bh5|Rj5FV{rzeEj^r zNV0D_j+l{9&5>yRd+PMCWN(v-VULRWw-o-5Z4@$(64N79q@9;%y{oH`j6YZi zT*;G56BCDapi})|ue*OEcs35w^}Z2)ky1OtJu5{oaQ$u3E32*Txqfh%qd?0^k;c$k z&A|TY(81Wu*&dtG#Sm^Dg|@*Y_g><*L>9Y^DGGE>v=680mJ}9V%fc+<^JZ<{Si4## zfZm)B=+X_;@Sxi&7zrvnx_OmK0?r>dhQ zEnOe>1M!}8#Ot$t?j_~)d8Vf$WPLH163SWN`}>xk;4THP_UM=D5=S0iZC-iw5l(BThtSTOuf}JTB&G&C4mCuhOiu)rh+D zbh0)sdBjQa+hp>{QL4lxJbrfX_sBq!>m4BT#PQ@w_1?D@ zY4UEY43>A-iZcu-&U`3(f;)wj2>tp!uEde}6`i2F1~xC^wh0SxIeZ(Ag4i{?T>4 zCh2aG&Po!D12Y+G!ajJo`;})UkG=ps52FvErBGlz%s(la6f_eXho_yC z+3n81pIOCuvfxS|#~@p3p@_llE|a?ewP3YSR=LpD^{let#;2?Ba2y1v9G>W7MT<#i zXYrvTRz|4kM>P^aVr(_9%nHo;@O!%6xeUbU88}Amf+1qBZ?GQUY}lUF+xfmm0iKxp`OsQRD)8|_Zdjsa{tLlT$Mn|N%M54t&t8^`7+JKXM^xF_~ z%&(g~EV~|NGnCU4zO)*#5PpDff!wk4)Jh%<0nx&wBK&HDA;H}@9yNBfNje%jA=-ZC z!{_mCVTn;$bj2PrH2=G7ZqZkLr4YFfNq|ojoU)N1op1+*%Bl#|By-~m7J`Fxbef#Y zOIFNeGiLFN^UX=aZ$pHEpq2iIJ5M^B!X`VOD482x^EDj9fCPK4WLRPDU)8XJ&Dqez1Ze1Pl@ZAPw7d21o-n+qP0juR_s5r@5YE(yuBbf6HRZzx7GIwxP*!>vDHtuh=D~MycQsc# z_!PA(39BY@fxa(0cSJ^rx$|AsL#(0Wlpn*JfG+pwBqaW%<2{|3~%cI{sZy%2hDl0G<`PH*eF^QH9fy;=`>91Ixy&0G|{U{A;sEYV=JN6*Xu?g{(UN-oOLjHS7zinB@OCVn zoB?YWc1(%qm{d%FX>T}yq0|-z$T3WV7zVQ`U#t&<*}-aYvJlGA|Mn4q2K@&c^On`z7^CM z8+cjuT}_AHc0kHLLG39W-wX znz~f$>5$>axy!rFYtoib3JpoCP|^lt+YVNU2*1K*q0pf6^v8_=D<6taW+U z%{65YmWdL6oEsUuS=uW{1PLW!^-JaH4?^;zWjw(Vx1F^j)#+KD+@|ruT{Sd2r%v3yTK8epJ<=N zuC()4yjdLPW6(xIme-}HEt@4g4)j7fIT%CSKr+5vXMmXJ%{57duS%^~kF+_j5rnz4 zc-_3SF7Zb~JesLIsk2j9x{F>P3Rb1Heri#7tqwR!N+TDt{wZB(zJun<>G z;FF$lfman@S8vBeqlJrTL(<$D&8%w#*1U=j-L?auO9-eU9{(7Z)KhOR1QVR$`x0D7 z@VwFQe+nuEd##ySl`=BlkxENChkLyfJvpx5))Za(Hm02$?rVw$S0l?T_yFsntC#f<`m(IPVsWZ7j zK^iU*{NiT!=$?L;CwwBTdF$$0&_)||^-x*y zOuqZ}U)Qq@YVtdes<@CcU!rOtjDN2t8r-yva5GL36jhyZXbR18d3(cK0iYm1-zr3TYOV1qt9+H~Iu#(@rqg@r+ zP1A^3G_{Z}9LW5nuJVI$Na-LA>3aSIX&>pTCAj(a$2X3FPm97=wn9n+X-IngmYf6Y ztI&(q3$8@Z%W$bfkEG3Pq@%@N?tYfAmXROAiT<%7$p3J6_+@yr3hL&^80XP#>bh&l z1e1qtgbkzIiY{8D)%fJQ0GA69l-t1I2Q|Aj+X^UDYq+rx=r{j13E^}+SB%Q)?4KJH zXC(Vh;_s4b54T>0$EsI!AdvCbJstd73V+PwQ=ZWVVU@3;T7dI0{@G_M!D911JCNjC z^&Cv=bzMc=N1XpNEspB-^IR+35559;W_83X6`YS0yDks@{^z<pL>AG6u`Ytp{_ql~{{GXi2hX%=atw&s~(ZhuvlONT3x2~9VVhpxP#$6k-d_Z|0 zT46g!W${Zuv#Z<#JQ52eQF-9J?rGp}HGuTpwb~`O5SC;RC0j;qkYPh0SD0=?D9alP zHLg0@Up{slR-?|!;?N3-&=ohym*q7IT?YJSHD{cWyxjzzWAob}gsM!qYSe(kAr|)#71|z}dA*PD-?Q2@q_cg$_04)d3zpR!Uapxo- z3_ETpCm!>Kp#8~0lmWEM%kayJctRrA>hln#x$P`@ zSqX5-2iNVpfg*ZXH+T+wCFHq_^3lALe8U0pTL~`{Da6)}9bMtM3+{OSSb4Dmym)=b zh8Ka$C4*XBmJb4C!CeOliKV;fh23FOpn$zpa54@1 z-ED9J5pV+U|IzgpKyhr#<8ZLx?(Q1gJ$P^k?iSqLVQ>u)g4^QmP9S)KySqzpf@}D1 za_{@y`(Aw?wKZGC&P?~|(|-E&`S*zVAlw8yXmiLMRKOLoGo9cahxW-w8?chiA~89Yk^I+-esJ-D)0cnNPW}{|{dHf14bh>D z^uKNclffv#mL|tJ7;Nh}6Qt5qv%k=;JInvEV1F)CP=}9oAUHZlh`+qZKePSE3jDc% zomO11TMO>a@!Ps`Cg4D*J8=9biT>vW|277Ruxc*Blcr05JfPnf;CH1$C%A5ebjaKL zpGr3gj#A{3xw*W-hCj*hKVkmwjQGFxForVoKYsncnb=< z{9W+#M}d?^nXzP zbqn4&_4c1QU{ZbzvE-Y_e^LDVOu&N{_e}5R`M=`e|6v_@q{x1;yx1!zw3dquRbpOqf;9U~`=QaN~t)lRM7pnay{sddQH3<%89`ygB(ZA>K zzZmqlW%dVdL8^CMe;2FfrOA)v0bb3~QUB(ms4H-?_A4s5dDefb-2MlN|B7P3ma6dM z-t06p=eEr1$2i2b2-qzGxWQdU98ML&ME?keK}`N4*tenm7h6Yx zmGeD#4Vx(LEm(v?{=ZT`k>+462Jw%yfphgYvyvi07~ncra77O`+34HYuQLy;+J8#f z*CNfGzs4nloiH%cz(0xx90~q%yz4+$_5mj~%n#{(dEo!5LK-vG9(P3k?Q8yzu+T$X zXRNQTo}pI9_22ey_m}0Oguev?Ws8L@TU6c_O1fAe_%p0ns;M6DrSJbGO0pu)55sN1 z>aX)dz8qmJWH;U?4zOHu(C75|ScKx!ZT@lWB{*b6zP$RK*ZxZfapjPJBjMbyIP3kr zo8Vm7CpPfDl1fxa>)*vslkzC)Qy2dWNJZrNSyjZ(L$CvEb?7_cuQwg<&cMkbc@vTA zA^;YG>vuKO|A+=ytFAxyw>6`NgZC&sd>Ja~-R%4W?002Rq4e*{qGYuHVGQuZqNae| zx~E&mJ6f=6F#nww`WiwE&I?_ugsKcB{B>#;NlI=&E6Z=ESoB7|9Y8Q_`Y%gzoMrV{ z{_V-uzcoqTys3l8^9f&0YGBY4Sd9$)jvq!%o0HW3mshR=$}Dp3P_TB!%^?|h@O&&L zbP*sFngmBsN=^xjhp>MAAT+7vkV6@+*r^ztfF0ilJXRiG(tYLaUxBNlu#{)j@77$f zg~5@&tm3m<(rE&h=DNSzZs{_<7uU%Lg~x--rg}w@nAEiAPOC$y)|Zqvl0(}4MUti3 zcx)AJ_U&R8KApYiGrX6LZJ&&Ro?d6r)64o=+FPDjJ&%=_zF&qvzuZ)9>kqfBEoNou za@)S^zyZmLV7;?J5U~Tm!JO=0zBFA0ZLaJ}8TPiSY1Y6?Re9`Bi0T6}G|!Ilg{JTA-}@3{JeYdu=78`3^Pl~V)Bxy``AOpCz+7NM7Z z_`guYRo(>!s342e?vNnRnZ}Aj?DFq1xgEaUB&@RDh)9slG=;mle(DNJ2#XQ?DK9hA z()<8%FX%T-bf8rG$+i11lGRJ>>HdEP1f`4A4OHy;z zmH@fW=K<(JWEc}@j#NH-VJhE@rSaCCp^e<@LuVb}D8eNE(h#wd7jdG?`Na1cCh;h> zS?!S}-qCZMxMMQT$7U;X`}A&_`c=JjRbM+7xIx`ud6j3MQ5k?1C2ExQ%MXYQ(2^@)5(qw#Q=lrKT}g_>!-fr854d)f@Agz}cVMWa@88!L$Ut%!(uw85bU=2F4 zmz_JsQ}aKdDRTS;sdC`Jgzxy9@GDC;K(t5dtIT4O{gfJGoWa?a=1fF7TJ2F+kkj|} z-pV?U583g=wH7OpC@?d8u#+8KBCvL?U8rA7qKt|6W9X&qtWnQ#QkI&BWC9~sYaP~F zf)z8(RWH4609yaZZxV)CgYe8K&Anmzc&V3daQxFuMLv+BV1{%7i%i5QF`!4ldOF}} ztQ9nN1*mg>>DQjdpcNt>pvxp8@{A@;NLzrT^Z)qaB_0Qp#}mZmxCjNFa9v)Yj+>S^)6-G!tO9eTNPyek$#dx2 zP=Dj%8a!sZg{uG7e5!y2KkWjp%fgXY*L5ba(cw}mV$lkNK)2Hl4Kwo*&wy>@d%XiU zZ7gHcgw2`P)JM4=gOM^7m$I)>#^N}LZ^p1SM}l0ur;aC0LJM8S_zftt4orXGdc=-L z+^1~-XAt1&#ygP7aM%=w2xWw(%Q64f6}9O|-bfFAUv)I(A-m@k(=4lAZzit`3e2Q7 zUmWe@s$oTq>lh!*j9Kb72c*!!Zdt-q&J z>c&GE+=ppK?Y#(jG&Dj9exOaYE*Q)haB3LBoXcSW?LGBdWB!fe$Kx|;2z66PSy3={ zkiW6}IA;)UX3Jdb_#3y(0B5bfJq$$H|9$IPLIOTs?c@YJfTz>6TLi+*I5k>o{dKI8=EqKGn={rQGPt7Px&ALO zzN{)D^uGlY5(X=X3=aHpHr~iSCyz!!po11g1AlgUx>({xaEP&#fBzapHV|t3!nJoN z-a7CU42kgP7U(amufeg%0xEEjj12Ar9?A$um-G8sXwgrIU_0^r8KDFLjFS`ir#~=) z^zfh{5Bq_(nW@qMjI@BBmq4*S(tjX8Y)R8fSfFNf`CpV5a+8C*8Bc*peTn=JPA$Vu z1mtzbsW+-LIo3iDh2Zv7s4!T-Z(}I-7i8v-0z|Z!Q|5+k;4aBZCEzt|sbbn35rb7p zh|m$XfAHI;>33ULKTf-;S4s&1>*)m!`lL^0V7e1s`ooo=3f~FTc&sA)MGI3%Ll?d1 zPmFBrBk~ZlKj7&i;Y$R5>(jo-0QOy(b)ZiHHp2wPCY9hnV?pdr642A9scmxlHo}l& zsw#!xjadc$eQ2i@?28p zJoM9o1fHmD=9F6g8X%hH-Oli?ulS;%ea6jZb!mY04FH{Jgoi=S116Ts$X9r}^02yj zRmB_hzoz2LR!a7|v}QRZOA7-xTEC;l7$c8bbr#T^dtK`(A9fu zRPYx2H8j?*Pt5Euy!Yg*_uZKuXRX+Oqn!BkG_RTPea;1NqE^!vvekhB5{Edk;7b0? z-oKbr_~F>QXh}P|ksC8>^`rT(Pxgi)fmR_ae>mahKTIsDx1*_fx|5MkYjHO$)nW|p z^fJooDs~DU!5-c}w5WBBc@s_5L&!GC`(6p24t&4>c<=83(I0TYZ$f`z_4mmrFQ+Oc z)b6Fj?;97^$6$n%edH?m8U92h`8*nZ2TfdV1^Tda=ZB8+uRcBB`q!8WI0IX{MmNcYWUKA>o zm)@t2fWypR1eYE+t`MS`KdUS-{+4(84O^JRAri6Gm%R+L*tTA$X1-IL{?(lpLLv{p z0ejZA!DEea``a;gWCY()CqpI|!<8-J&Tc>VEZv9n$Lm=iqngW%qZJFDmT|zrsk8mN zpHp~S-H4x8%Htu4M^ctsrN#Ur4vN29%A<1{HX(yo`+TZD;VCPJfO9l4ii9Pgyenp zO73g7pl%d3v$+o-%O<b{Knm3-Tfn^M85-f5Gs(N#FCjgf1Gg1+$TjB%S6 z|F1{Iwz?JM`SSdriKT$RzN`Mcbx>P=Ive{=*rVGpd(LXuYA!m=YXP9at9Y54)z|?k zvrUk~zhW*fvpSq+tfsm0=S`z_C;sJp>2nzVvG3T{y6qvC+(hj0MJ1cKSF;D-(Wg~B z%sw8alr+ovO4U6B2kh3-r)to45Bn zL*pq`eox;|4E1-D?Hvsnr@ieLnKOQ~B|EL}Bm~s0iyW#ZP%txxsKBL}0@QQS>!VL6DHhR~9m#f- zVtcCCCVUndq9}EhR;S=fn^Ct$p5|<=q%WYEge(%REt5x`(}t*Lt27|wuXr|M=cuPt zC{Z=O9uQJx#I3s;HsQxxug9r(AAewh(LejqT5wcXRo+^45L|MsAE>UPd1d{M1<^Zj z{!*cRVQx6j0EoXTtC+`XuR27w))7C_Nx-kRVlo%x;Dt1^uG2WNG!uQ(*ho?!T$iup>sn`~C0fcj=cO^mZiJ+--TEfiYr>HIl* z%4z0Jo}zfr`~@<#?vZJkNfDTP80VF{X*bZ$#izHtfCcU@Hw-uZNPdNKX&v=BYXmpR z`hEP4{o0P{rF0rgop;kz3aY7twxseQ&1#L6WlZY3;T4PZVP$jJjWp%zGEC9dGRo0R zjT3nS=XEQ&{hO=lkl(SU3B>2rungWWMN!a24OC2X#1lKzvKMhNK0c?oF56&mR8V^&D}aMV8s)zpuIOHLg`0 zYnFFbstOY0sho)^e^xXI#L^|GfbyydOSkE|3a>4~<;qwxiaF+S=o)z#m8nEY6C`qL z{m$sutW!>!{Xl>8uI>J_BEsBm>(ku(LicffcEB(CY!uPvvSHc|>P!?FJ06StBBSB4 zs9VLT3JPt_6T`(%IuFybn$+o zhSRJ=ub(SRLTrf|W9S@02&HPwiPR3bwE!M5WXcszimy%!+_4gr%=qx%rLCpX@vM5K z52R$dK1ZSBepLQ`Zay=L_rkB{zsVx_)0D)PwwuJqdHks`CHLWou9EhXm>15Nj$e@<8^VDJ9(~jR<@tpUJ+epXro{GOf(?ekHLwm~8T= z`|&Q1JA30 zGW5%lW9DLdafs!$HxEu0wB-*B)-8p^ZwMMHOOCkE>?=ZH#MlY=4nE;s_KAk_&#hm- zBGfY{uW3cEns$og{Af8H(X^n2*jFnrq{sR(%6MimWpmoWmGe?u%sK=Meh}j`pfczb zPShxqNQ+J)DDw=jc!M25TYf@S7^7vwrK1a<3_7vM_U2H!bs6`Cfs54Kq>%`!mL~=& zUty{%m3r$;D^Uq8%{)u`(N@}Kxw@+y8Yr%^l=(Zpk7=bFQDq6uaDBUwqwA=qr=g_A zm0u>QUdawWZ6XVOGaRL&ocJ*hpu(nR9%OqT>$bz2D$)Ed56eyl-2j27&`1G6jmq%- z#a=;H1GFZrX0RQ|wP||eWXzyro5|gGS21UauOu)su*~z724=7u+X9+6GTRi+c3vvR z_e?q*$yzEnGtrVdI|DS8AV)^HcR`MHaFb1FcJSz|25`Y#i;Aj9)870>K)l9&4U?$N zhdk#6l^!=Pt;r{t)eQCKgsd1(LR$g)Ud~09DKBU!gl#;tdal=$3%Qs4=`Q9$BKXT>6Vw~6OTH`}hml}N04lCS)sisWdlTRLGn^BkBuBF+)jeJWq zCE|)P8ayv3jLF~2aJ+VF0WKKSwBeHt!)=agZ`@_W4vtx-J%e$23YAP-V>~PoACVQy z8e}AK-0Yf6BipZ|EN}~__41#iqFrZ$swP|Prig3uaVi`HLrL?-HEgkT} z+v{7CIJK&c-!l+Adik;BA5#hF_HSwA)u+rFzYg><{uwA)G=P(d12ohW7caHT#DA8l zkVKLFmhgElj$k8Xej^G_>v@#CGwsK50ha@b^)wXrb50(t%@VIbz$SBPM_y}o_)it% z8TaW!ciF-O3c2}^=b*zk^hUqf8$~4H=Mo)NBb$;aMfot2v|vpP_>zBcujTfc$i#B) zI*Oyr?vT|(H6hO)bOUfo&4G2tqr(DL_~zYn@Qh1S8nSDn!?14re(ZIb$-CkPH@mx| zTF+@b_nmKktpja0UaGrZ`jr153SWK~o@Lnp_(Ga~Jj zJR@0exbvNA@IJn!=s5l;2ZF@_#d}>y3r*q2S&F7g_+V6$19w(zO5yyQtrOh!jdNPF zVWu-}B+ZNLWcd%>6QsAlEcr>Rg)zg|NSu(k19@UE2TnMCl30q+${**r7;4`>UZY0S zYwm56zTEZ4r6eygqQ);ajk0Gms49JG7LkHD==O(5M5L;6jMFe`OPF-8S35{$=<8QQ zQke3#a-Wfx1_(IWmgU}j;;Mue;V&eyr|r;v+xkM|{GxER9CH_(HS8JL9QAH6Vdh z>dWI+%d}G&bf{bCS7Y2%iZG*^Q#aAB{TZ;KaQbsOhJ>_J<|=E7?t#gZ}RR85lOiDb9DBNkxg8XBl38SCDYYnHdR4%& zP56!GqGE*^%UBMym>p&*2YARs6vZLVRLS zuMcGcKNQA$?AGs7U6I%O;bp@xS zepp+PJ>ab}87C>E1{0Gb4rrog9M$4LchM+pj*tbq*U7Wz*NGGgY_LsepnrNFm98=y zR5qtRtEMC=IY=+7^B#j;fxcIPPpcTmnzeiwR(;Sg`6l`^Ez5~{!AasbDu(u}a_Q$? z(fjX!C_d2`1&&y4J;c4~=RG9`+} zly3HgBWYy4_INa-t$-KfL{TNL%dl$N(k>%_)7U!rcu8(pfSv)#IDiakgV!>TGglnx zNF*5#Kjwf8G?w$sH~`@9ad{Fpu)_d>k3y|b?p=0S~7L&C$1>!;e?=)VmR5E`&W5MQaa&FO!9?dQnCP=ygbl@BM*HyPV3%* zJF@)ko^iVJWJAX1CZ%tc+uV0v*e0n%*$+~B0iMAR-PvqK{KN8FTyR$DaT{sgvTt@u zB!lFI?1;DwV7lNJEgp^d9D6QBz(Ft&Jh2oJ?fU*uQ7BZAh@bO9Q6(r%(L*K5iZ!DN zgJJ|G6^?bHhM|f?MK`+9I18HZwd#ii6iZlN#ArgbmK1eCFSAbR(4;u{H$Y)|P1gol zOkw8NjQG)L`;6C*_+C7)6q;+plaz%0tcV1x(W1BQk?`eCWx2j)_cct#rhN3kaD3SD z;E>Ja#dg+RHpuJO$&10S-m}w}=d)iIEP&4aD&;s(O$?BhR2LSC$jQp7NPZ^xJVQd6 zBjrEi(9VPcWd2a0iQqLU2xI5i4?MQy-E?BkdCfUxHyUvQdsql= zZ3dl)|LQrA1g}3DU74HU5YiNwafL)Mn@QuG321wLNJ^hG#z6}19CR05Sh!zpkQSFc zGVXjN?@fix5JVOjC_q12LFOj7wNAwC^HA8nmc&ZT5y?eLA{u*=4iS5B3{%>dUDbN z+M}A2c}yn~vlsG0fkARM-g)A&=~rw-NN7KJ%Q`I~=X{a*j0=F*im$^3Evh{6D=I?D ztAEh$C@5Ft?B&eoq@!B*kz3L^%Zg9Z`W<&;QboaHr^nksGtSR zOl4wrnMF+#jiM&QMDhev)Qp1b4-h85xR79fOb1`My#3L!@&Ogv?sZVIR0V!GC!AGF zk92pTRZHEgB2qZ2Z=+aA?*m&sXMEt2c$$Mg8IOZRgzks+fn3ui1I2|wxMh0dH}tlk zE``MmTM&rJGsq|{Q?+s^jpI46wsMJ-0 zc6?K!cE{!-YrIx;;(i((PedtnhM18fyyNbRIaWgFmkKx ziDVuAfgqAZAP?PyB5ny2RioGuCDI@sBDY52Cy~Snqo#jjzI)w!n6Uco6xb};2|y?^r92AmeW!n}ws?8+j#-tZLRyj`B97j>fraCnN%S8zhcQHNJh3 zy(u`&gv`Z8=y6Lv)8$eUPjL8oz}E)pvJugbZeyH~!HsuhuuA8FxO@vey==Bnm9Y71$DW8|rQ6!G8H+)K_AiyOcp@c6_ zCut0O2b2An4$&-%W7jWO;wTVFbN56 zy55H|K$fnjqHs9XPD8ZN_)Sm4K_)eK8(G@{AOAZIykJH5!Jw6Mdcy7o>GUUa`m3AR z(Izgn;iYlBMy?(U804dc0`99he;+!$U+7PJ7GbCfOK=)3sdLAZz)vA+jSF2r1!RF083y~9{X3Zy@K&D1_YNd9iH>fbGR9R5k+Q!}JxClI4 zS`_fIRCUWo@(iGZ)-h(<^z*bF`9AS7<pFi}2sqi|Mek^6S{ z4-v3)tMvK9dP&SU^V=rn-BAB{Gn6`YuGz^k8`7OZdm)K9{%I=Dh!DfRnj`)~Z)pZ} z%$@oHXPmxUHlvMtkG4oZl*`;l&hjCm8fbARbQ-tt3-M4ROw;9w_?T|M^0BoQ`?CZRb9qWq;uQ#bh z9qnCwh%g!VHe=5JTIjQEF{0e!t`FF*;ZN}Hm)h!LxKGNCeuqDSZfxu0zQG#X~iJBS8PwKh1Xy%Jf6DVozQwXNy<0t7xUGutAkZlL0SpsldhkfPPKSPK5c48!*Dj;IOKdXDChLHj z%_kRK!8n+DzL;X9$zSE=mLb5N%o@&;wh>zc&twskq4Is%p~?Ht7GBNG7X1a)hOTx( z5mftM*eybub$tqn^Ip^lNcgNS{Od|wTo)e}=V?r+G`1SvKe;~@HWXG{Yt$-+e8z8` zt0{rFKOWnpN=AykB$)OIg5GV?cDH#;fZ61ZwCIv&`Q`F>&^IIRwHG#^6q2mRYcu%W zPYz*i{I(k(FA=2&`J?U#L|5&r8t3mFZanFoen^v+kQ$gU-hz?rCT@P?i~OniqZ%S8 zwmM5>la69^N)yiHCD&P<9q)vUr!+j>T1jZq91nUp*NK@ow&lX1(d9tj?BMm?s7)k5 z+)Oh`oVWFdni9)Hjm&s}BXORpt1nN>(jk>Qf9q}IXg_uKL$M~WhXihrH#b3+>jZPl z`^c`&d@wkzConIl{(Q1c4>p~;FL1(3dLsJYHC!>n0lObj~ zIaxg&IaVB-PVg4nKb2XX7RquN@4%XerP`{ z?x>zS0o=>g7)auH1Oy%rinBXjemz#V|2(yE@Fnzm)~#;;HCFlPu-baNSMIUi;lY>yVM1MmLjHCZlKznM4XwFtzK{2hhKp(sPY=3h(LW0hFIT$}J6j>wg*1D|S)K}y z0N_WI!MRrFL!d#O?p>XxtE9N!eez4Wt0mO!L%D;TVV({MAjd`MTtKlRh1u3|!18~d zZM!vShg$KwX6~(QyVW|q{c=kv^+JVzE_VK8{Cur@yViwR5C|bb+&Q;)*Zh=>yQhcs z^JNdsPg>6LcM*=@d#f{bTPY9Pc225Mm>sq-E zU!y2nz0zM$u>`7NFHgtn= zXP^};cMyI)RNWPUm;R_}c&j9)zr zIU2&xlaM7@>%mzT%)b^n3i)CK#nZaj z@HIgI#Yk}rkX?^Z_+8mfNPI~e+1RA%fwd(x#Nrx}RR8;Kw}pifVCI=UU2phwkPW;X zm;bu`p5Je17nl!RBYK}s5(Y~@<3qgqOq z=ua1Hq-ooem?t_*H6iwED1@I&>Zn^$UuiZgED8}JTzn7Hl;qz*LpAk|y678-+V95z zv5)Mbh$Lo3_r*6&6|boN)6AZvBmwq!H&?k#lF}qv36IIZ9f*&HL$WZe<{Mfv0j0_Z zHS4Go?a$${6)XB`_iql3^ogyldlmExDx*;_t!yYOML9)U3X!MZE-%p?PZ&qIyVk}s zFU|J1wl0(kD@teLV_10aqy^^C;(hM?QK{-Gv^Czq_UkWKjerZBmmBOQWVRQ ztq7rbVCPl=6bnhP0#PFGguCA7yrCsRb{TMfbtljzY&;IzVAjzzvz+XS_YD-g5ECI7 z;fTgV;Ysoo-NG#DxY$R|%yc-_lf{HEKDpA!<8FIxCl_N=>O6{FRf=SrE=$-qMWY=a zlhG0i(Nw=-pCJW3hkiH5Hvl^7qX;&BC8SKYGyjShfO`63PuGP)7&b+=^9E+Y7<*!m zH~qMdAFAS2I^)yeHK(@`5)}5OQWIYFo{j}B!yQX^u7bu_HksGEe zc_PL`W9vlLSHJX3?GSd%^p}NCpfEc$H-#yzL|EqL%^Ij1H~91zpb;M%BQLyD{JzG_ z&EcU7bggvoXWldwwwjgN#xFOUF+1pPfZO9Y5sagxOk;dmb|hChqc?~+lb8BLQH=5W zM(M0{U^?^}riz;r)e=uPnPJUUJbs37#w9FYvD$L#O^sTyQKW8z_SfL{HgiT)?oZO2rN~H2#$ul1Yhet0j1n0%p8x1kuv6HsZ;tUe#SCLCY+^{ zrfZBQxSHM~eAEVe#_hly?C#ncYLPcVbD#BRO$LdW?A~fS!`Y(BZ-?uIPT5`)3(UB< z%y*0ZS`j6Ph!L4Tkkb8-VM1IYBBVj4H+CW8ER$r!E5qE&Wu02yyS-JYz8QTyZ*xv- z0ED75lyyz+8d<1FTg$-gcFiXYJ5q95dE*-Kl%z3L;4lVedL2;+1XO-8v$IVBP19y4M3 zm665uKamtWCMj9(p=sXAZ4mWDry3GW%54|JK_qBeI>UcN$?ayCNV_M1I+GYyJ-XL< zv;K;f6hjAt!bkDAOuC&Zty5s3S?~Lr1J!(H&B)u3hV}U@8MLOj3zPZ&SAJMxeR=?q z>9QCulqZ_p5gPtB?tG_AZtsjb-D9D25;*_~lTPD>c0$%=`~}=xnT4VM!#x z`FJn__{m)SbDv0%I#6It4DCw0CO1ttkZR-Ga;i_eX1l-3N*k_L$3)**VzXUCtqR0y zU@3X=o<~3GBbHC{v)P7(( z(UEO4H(gfSA#l<2a~IFho-fdtjl@>>mBiNHmU^{F)V~&yR}q8utE#XP7iQ6S?Bz; zsAvvyDkYy|+o;pE%zW;?{Y7NTYG6q&875I1lSoHQrfp4okX@tOfj`Whcc4S1j@&<- zE6s*B1RLa~7lwGCcS8F1sX`C1fyLZ4s>6^~k9TFtEDf!{maak{=GoMO=S86BP(Lgf znumybxC5SK)=p5)90M1adB((51nmiu+Xxr4Vn%Mf-EElq^+)ZQ_qmgukD|RyjRU^- zyslAO(PMT_kz3iln3FZLfk`f8TKW8rmyeltc(>q7CRPgOJB|F6SypnO;mhH=mcn7f z%k|qQgEHm$)`VI;H(TeMY~Pckv-Vq%2pQR8$(j5JbDx~W%~dJos#}3TtlDzC?b0^3 zE|mpx(a5ieNleaGLGN&Ji+bydIm~Evv!++F3A+oH5alX(BM8AVRXp@pQX30KY6LM1 z3EFnG*0#)9)5W(TF&!ZQ+b6DfvU6I!>6W?)cDi*R$US46w} zi&i*$81=&^X+jZK(OQy31`3XT)MNZFeJ%x6aVeMvD+A_*&r?97z0F zTj0{9Ja1E}PmBceV>5=-Dk5aFj{6PP(E^mbp86*Rg%L$nPoY zt{!Z-$cdJg7o46S3Atq*o#qrX`w1c~4<+R z0?LVp0yAF>@)9=c2elR($4=P{&q7D|MXm|t2svZr;0d*CT5qkeH$gd&9g?ux&g3%% zmVw33@0UGjUMB=eiE$zjy!J$Zo^nKtXf@ZcysG-h!hqQ#7~6|M;iX)rE+vl8VEid# z%*4dxv%jg>SHOpO+Zw9`TftvDOILW1xpc~rXV6Z8k*FUxHot4j$@V=y>_Grj;F%Gk zasFwCy!M#DOmbrsff*zVU9d=HUhvLApvFL@A;ml-EX77+7s8ihPCi)_<`5!Cv#2Nx zY`VGJbfIuaRk9jk$)*iHk(0DCOA$v)x7R4mIp6~LP{0BOa@yzDfzW#5$Xn`5g|kPC zI5EU1Iz37_bhT~%CFLZWs#=1GebgA7rTZr*TSbyIA*6UQ-!3HIXR=qid%Nf=Vy_e3 zgVj(Tut4f(A(0}BllEFMWr6%ou7zfHfe>ZV8HNz$v)B`k$ZCR!Gl{w40Vds(?h7Wc z#}$K7Q~;%F%}P^3S(i6muLD~81pCarldS=IsCR%%Q8Ds$XN96_b`TtnJ;fY%yvA{U zO-7!QKN&+62aTDu?SYtHV+JBk;e_pwQd8oRU855&F*MQ8n^&W?QXx&eWMU#R%*v&;b9tZBcK~BFtezo7WL)&{>1r8lrCp0Ijb<-A zANR|XUp|UtQz8qB68tDF_{f-9S0qAS7x0NZ^=E1FrxG4vOep0d0$+h1an%4CXm)k+ ziUE`sqyQlq7&giY7yE0UN{o5wY>4Ilr2m-d2Z72HlM-n zp+X{FY+N{{=6?)Q3Y51atWzsOlLI->D=Pz~wvy-cwfT&08ePRV?blF-mvjNb)UZB~ ztj;#X_lK~cB~UpMQOlcfP}z#E<{d%5|9R1zObL`mArdF{uhtbrQg!T(^eIEwa>&A| zkVtv-gsFNONwT=xe6$Z9S8O3%r6?a%{L=UxR7SkxQ`M^QhiCFjb*SFMf0yl+CPxEC z?xFbJGK$~3Ha*m%k|dVd0TnxODbJD4WZLir45Ejsi{6~DG_&$(hLl0>jZ*P(ve&2i zXD_#3r}5YH3MF_nyPdXHlCWyNWUgrq*)kT+Sje(jD>3K2W5u7vgm#nkyY~R z$NF=IS_jP}tXWtMhYDUs>KCVdCY12YVA7|JQHPgHy=yGjzIb6b^VTu>{v^osF^TW! z!^`6IHmv5?p^OIEizn=S#8Tnn4$Vil+#)uOHd-?p8B35_lb{L>CQ%EIANmGBuz=-- z6gXI+&a9V`y^&Z2*)FQu`IH?=yPcG(+SEa@n?*Gv#~0Bk!^rX1SWp)wf+G!;*Yk0L zHn67(p};%r5GIokCgbVC&U@+|b^OZj?`0Vrel8@yCVUp)c!we{nJbm{q2zsEM93^% zZXd1kV@QR(jDnGh)fYmALnY5d!WLeA%YDsth{qYli#1E9Tr7S^y%ksM_QQtw)!JMxZc59kO}*>uMcU&) z@q4XsNFV1$s;VM9M;=LLXwvH%C7%UYlRIej4gPoI1+9>%!8PHJ&SQL&fO;D_XxKRR z`vaDYT;qL}XaYsN#d?9a(i(zLyfLW$U=h~F+vE)=L}1+6M)ciXy1<=$98C7$ZGv`6 zsv66pL~Ic7SsXKv;s6Tel9lu;J%s4lR|;X;xKR>Gi#W2HkWYl%G`Q-eW}oPpKB(B> zf^fF#MX}gEF5t$JSA;rd0WGNvFoCD(+^Dp#?Zs61SgW|8?>0~{`FjWH6X_!?w8DFw z5U7_VrKodWu=CWY?)b(xETx;SP8cVKMc8h>na7?(=V;B)MR1TS_shS7IJOF{#DSaH zkE6JBu0ci1#DcCe(n5RP_58g!ixuSkQ>@@44{};!2wN#L7d^?hUSN)YWg1x=z6|S| z3;Kr*-f!(L;kkSt1B2^fMYXh*ji|ngq4e*$hFwNV^l3|#WnnMG+>DM{C$8v*}r%F>6%e|Qh*kPjsR1Wtz0xm;N$VZbeCQj8^PXHTQ$q zVW1DP2@FkJ+2|)=-6(0s-4C}OUcp*Lu+_f$Oou#V*gjCks=Gi>FUd zCaKs1US2qt8tI10-Speo*9CPWdaz-krqc^*?YeL>J)sh1S6#HDe3*&l3)e6k zIZM9~*b^Mj+(vJPEbqa>zNY`2%@3|u@I3N47q0=5B$A29nsy6swm=DVNzF90!Z1W$ zHsPliAShu5l9r)&AcUW#uZPqMrnAx9x(nzwR6`#YNuSu#)hYtqFNqQ;2#rZ;$djnx zOD);(m~*7=>(z=>(hlD~U2Urr?#5t!oy_CWxcCl{rzTNEv506@Y9n73LUVne?ayM< z{HO`w1WXKxd76>8wxUr|@m?vnKwnBjmkklTxhJ2-)nPg4^1R&_Ok z+Inde@_T{1r7IU|?p6%#oJl(AQA`Suliy1xw$vP*7+Bx#W@KNCDSg>1HbJ;2{k7I9 zyH{?KWmtw9sQ1meart%~1OojU^XTAUYuf>2JVdPZ(o{8zj>cSt(qd_+U1{H(dUoTF z@>0TE&~3p%9}8EH9@TlTYBUdTIj5mD5AL$HevOzGcf1WyGHzQWZ1AL<6ImgUU#9SS z_w`twGxH#sV->>5#hBt4E7txyynltv7umI-|5DcB;M;gA)~F16LLMKzwaR-=dU5Fr)F2V~t^&?)1y|&eJfT;|OfeL$@v(`1~tf(muE?@j5H6(R{|O3B@4 zBxBPD3@|BD5&A*>2EB##ifuL^zgMs@A6~hO5i=kWAoGLupOBdbv$$iRjr%FCC;F4U zhjPB>7ByoO9@usPk-15qt&2K^|Xl4?L#L74j9(J&Rr@{y~qI$ z2WPcwt!|l0U`cRCz;3WkNR9&n^$CdwmeYG+A7KzHFap>Of&plU5M$8H6g$lipJ7sZ zG9@87DZYawq|8`k!5bbll> z3)H~O=;LS$OX}<*MDOzC%u#&$Fba2baxX9;^^Hrs<6;c9!46;rg6%1pcLom>T?UyV zjzeUsNCKM*X@11n`&6ijaJ2a)l(j54)T}%)a~PZ6k4)`{=z*ZR064_B*fk+>Lmk59 zV3q__l(n{=vQeL+^ixsRI-3Qf6MyR9&pNmU=8`}{L4uU2*`vsW%s(b{J=(E+wyFPw zqxx`3{^8=`&*%3)n3H|Du>T21`8iiN%Cmq^VSOs&IQ3M|I21J3*`w$rTf)Ol!>6n2 zkCqf4%pZI(xA)<~;YUmIPgaf}ZfHQMCZ+BSlQWzIAf4#lz#;$^>K8? zg_GQ@A~k)Om^zG49mFONVz8V&isKJTnM8e7(#&0a=>%&Y6M}=Y2dPXkj)vK7tQjIx zn2r72WzT_>uUHDlnOoqnF5D}t_CWc%G9n6GgCbJ zz=zJ!f}qz@BqkMSP09i$#eY?3wogpES_dBl#1azP5+X-d>?(=fRf(rYs9%qC0NmgG zVvv%hmm%}krQVv5?WrI{(rNm0(36n~MaW>2OVpQ4$m zOXv7e=u<&9lTI^J$a$IS`_wx1DgBi`HDprQeNmYrldIF0nG*D6s>Y)^DSHJW>o~{HT;4X7w(zR69CdQ(I68M2oR)be z#I7;E^@}YdKH=FlkALy3PvNI6am^k0L8jK#NsuXktH;TH09T*c!YwIaOHWDf8Z&%L zUT7s_+QB(jk$(=Id6h?#`m=ns9nRK~ zTqDBJjOKf^qJ#zXAhAU0$3OWnTc|nw z89NZj+JiYqDDMmxKKyL*yMOfkYxwl>Yz$0oh$fug=l|^w(`K`KZo)e^;Rog?Lh}>h z`H9HFL~MRMI)C>xG5aJwGnSklOHPfXCLgDPiATW0_ulUn{_t!-Fv$C>WBv!|ZysW;p8W`8@rY|ERjdXq&@JnM<2Jdv0? z9Cio&u7JUbz3g44z zQIoo$QH)G!hc#-LHse!di9Qttx&%h1w6QZSktuC#$eXm!)2I^)%|=BSjZ%iuq!gf0 ztVw}J9r)0p=WW(!!bm)>DsxWL$e$P_UtH#p9j2=ERed@)4V z;3F`l5tDLvsYdb0gc;_I4+wtxZ`qV#n84uxry{U##Ng{H$z`0=#ms}kC-y4#DL!eNLw)PD{>oy%=#(*Ue&n+v;^GT&Cii4&N+Z1*0V zUId4^o@x!{p?VJ0={WTibB7_gN6;$3dC3b+d3L&H?==DZbE7xYlDrkQqRlU;K%*drk4@}F#$~~AiT|m{ z`$Xs-6FA5C_EDY{fY|$~&;bX9U>lqfZXdnHJ(*&1ord8Fs9>7L(kjVDfkw?8r)T7e zX)uMo@VGQEF7Z7Td!ZqX37un5b$eV;$xp`lfB$6n??$)(_VMPA zN4I}EB?7VfZ2bhn4~RzKGM7$L%bM(hDmAM}fMdcrk3b1r^CzpC4;B#SP(+v2DX4R5J(!uIJ_QThyzb0!3kN2JfMiqk>njAvH-W3WV`TfCQ=o>X?{INBU|c>N!jY; z-KZk`uA%pUvl`=DK3i9RynhT9dGNvf-p^*Fu>6#B{Af!LGBrg`8(Q@yH7T4_S>I(G ziq5NS>{635p-FMIL9W`psU#+KtlK`Z?CM;6Q$T2qiR@{SvmkcY#GVG?ZHm1u3B}i@ zNQYszcw2zP)1-(!IPqWz_9F>9$6G?a(l3hsc^&wsEukd?y>gdOrhn{75eT5k112TV zS_FEh(C8a7sov~9`l{50r1tq)#66#4+=ot|JC*r>E`>hHk@Y!cAVDtLBoRiPiHJ@+lL8+ienv%HY4+9)!Y)z9`Qzt;FHh;9q4NVf(S5@)VlPE_S zT?JIpHC1#&9p~y&=u@V=&{7ati(-6{stg*%Gp4t+u{C9ARS{fQg}Iv8jy}ORrbOnf z#8!}jLph3KYffNF@$~UsU0i5NNi12EDNp&>Uq1=9AnfeDU7{N>DH_U>cmKhpPXF^C z|5>Ko^d&2RKYv;Er;q@Ut^q-$9wh6y5q3zFebJ&Plz02HE^pf5PTHLbn>}u|#Q=*f z7LMkB^mqT5&Q*<$xWSn)xDrNp(&$N|t#5L1OgN#K@FyCpy23!h8HziCF-I`Q!nNY)k0yW?d~vgS)Sz1g-e+acBl z`gZ2b;50ut4O6tK4OEZm>^@_XuZ?aiL+eLgfXwa-@ih^VF}`QX9J%sJUj_fW2|rLi zp_wTnQ*tNB6qA{v)BI$nnA8-NkpFQ)hX2wg*`wXT8qIkTb7uIn=E_^wKJov=oLEg&ZAdiofOnJGjbv_e5=1l#1`eW8_!>S0a`cTDMHIrD1$kudC`1U)k@;f_ zir5lF&g8w74I_OOod#F^Aak246-`l@$$#5Ya$y>{7x@Lm{TXlo{}anZx)b_?i?Bfpe5^AK}?Xcz@Oro&~K< zNM#DA6!tPxC~o9GbJ!%mU-JG@mB~Y)r1bKzj7-6AVcl59DTV6XoFX}~7aA3~A95`p zakM|1JNo-^(T^T&{m;)y0G4@_)Nt4L=yhd;kM}GW;+w+#YqcrI7)*)Gc+lY? zX0)J5gObx7A5h1m4_@EVQ4O~-7QuI)?%VG?@xP7U&K}kwvLy{62 zfux*LJ0+>CDp*#98mh>FI(Dj#KUK#uI;>7Gt||3SwU;L@(l52?R+!@)MTD@HmBhJPG0McG7{v+X zCKaPh!UUlRJ%7;`FToV6K7klT#y&9}`zSH71yJj4O$kavOw}!^aynqk_nKiaztecSL;x9y36mO9fMJg{doIL|4=~NPpfQM_Of5ns_U0_e>RG&{9c^ zjoFcEsjE4DEKD8av|$jug+no1vU^wHsPW7Njy^q&Nq@_MA+e`#&EB(Yez;_Mv|{dC zwE|TQi`|pTAPf^cQ;u&f@hwHZr39lS5vIs58*@vB%+hvxX$LID+fFY7bD47MwxY;c zk-BRe-Uhg5%D^6M#g6itIm_FQFX`g^o#dJ+Beditjw0cyI`9;j!du;NmL>MQ#9olQ zD=L3|D}TJV9Xm3nPOU&v1xiv(!9GsoUm_`I9&PXJ6_8YU?=+O#1q*}a_ozh*)b_!m zu!UE0d*SSEDBTDoYW`^18!USKdAB#~bf+E8l--d8vpJKARPF0Oep{^Un_MX)m^*Fs zWK6!S*`NDMNGev`f6d_ZdjH#pC7adP|Ipw6Fn>6J78!gP9efZQc#s&lpX$Gt?(5F< zb!B@y3t*4GEj+$cB-a1=KfZ=em-h$0_^R69S?TXA_ji^0yYhWqxxP*~PO7gf(c2m8 z?F{#J1$(;!kGg!1y1b9N+>g3a3fa%!`Rn?@nciR84wem}sxi_yeg3kyx0jMsq;?)} z0DnWhO7FeQ>|JE{E^>P>vdyz><0xC(&sH1RN-bM1XG?`_DW5GBGo@0xR8E(x>2f_? zX=bXs>FOR@1ua$CO_rKqi9#K%*i4jm6Q#XG`5+1KTR%%Tp98EBdznUddlhe7#IRuM zJWzV(&YoHmM?2xYEq_hzF3TMSsU<5hr+=l^9PFdwgpVpt>|24PP`mF0c#0qu6Pz+L zJk>NrNU~qJz8$LRgH;5mKy@1+E7HVhRBYdzII^ZOwa<~iN>Xn!)Egvaqn3L{j3Fr- zOH#}}OHvF^u_Wa{W4Y;1#G&2@MKMMg3XNdYOEwyHj%82@icu$;$bm8lO|r4!seeK1 zle)@cM@eKa3foo^;wxp51O5ci1Un@#p}nwX$*-ESD?8BAp}nVgJ1J=Uyqyfs0G8z$ zb39X?XDBQg^E~jujIaY%1QKCO=22oxKvQl4CmYy_og+*oUQ&|!O91MhL{gedB&AGT zC}J;UM5aK>M2n6o;D}rEZ{B_E`F|aCzOAxsF2VUPVm4Q1UYFu*rAST}8YYtIv*4lw z<1AZiBrJ6(!o0py#+7OtGh>hHe}0rNTSts)k~mk5Z>yu`7_0w=&Z_fraB7$Ds4tmI z^B8l95r*My`YIFm*AU3BvAnQT;OIz9P!j{FnF5Sbh9;Gv zX;ox)D*-?UxQ&Vp)(Xw>V{q~^d}N#^fX3W*5q~ghT%8_QCdL%; zQCS4O))8r7MB*EkcxWBa1V*NSapEv!V;vAmPq3PMP6pXlsobBPMK(fMeCIBbl(oTS zNeVt|0+B5-u8fT-qGNKFq-01^6Us0+{Ft?R4&2z|i?D3FO%70VZ%| z>)xe~G4VZ)rjKtPk$T}u7mTGvbCpD+a=;x0&podB_RQvu(TzX!3%+`|@LA{N zXLrZH?4JJZ0}fEtH^Xb)9L<2h3f~K~8fZIwN24WPL1795Qhz99aU%2`ueuHvE%mwW z(u6t#05u|y4{yYVq!BpVF-2@joq(?!OVt=l!3`nDtYa9OTrZh9VI>MN7 zY9*aOpo(xz!6T}fk-R2UEhCfgU?^gS&g3bvGdjn@NYju!-qxHyB@{I&oKzBb6f>q6 z5F@F=$rpq^UTh|wZpM$X(kk3wNh+jxgQPUEqs_##O@G2@ngk;n&@zM|CX1MAhhC0Y zF%hWEByph;4A00Zwd-HV4xAx9NqU}ms`Rjgn=a84oIHFez5(CN%msmw9<0q%>8tsH zZ&1}GhWd`iQ!rUNc}YQnd`)bB$mrp)8mf#=9rKj|6aXvHiho3-B&bVyfMOBM3=i#0ur_d&>cKjibh?keB5<}P_y|nxi#%`3@nc0|>D-Q> zHKE5EGvUMP_z7v6pO56R;Gn~tJbAR}eR#=amA@^o?=^s;4>S8KQRiqClrcGwlsc)f z;icL!W=krz-j?HsbyCnA0+`w-^1#(Kpl`&0)PH6Idd^{~cVOM|c*XKy$#8#h=fR@k zAE5X@}!O%IYiOy*vu(PlgU)oNs z7_$OPL1-(9T~(>4A#qg&mOO7eF|Q4CR6(vb%+tkI3`v1GBeDWdVSGvkPMxzPw&m9? z8GoTQ3;RlMZ8NyL9Xo816s^!F)%v8y1pLp!`DM43l2oyA>`T?r(sh5jftG0m7;6Ty zP29qZsk%Q|^Tn#3aLED5Fq81JFH1cg<(}KcM`(pd zx3g#+$)1kn!;aX)j>v=zj?8U2|o*qh4(b{-J1T)C7h z7jxxuu2Mm^0>Y~90&3;zhsa!Dbs(>!OzkLLJxEvfljXf+X%DyMeYDC!x^|qYpJkiR zv%4>{yNGO=J^b866YH}8=z^8!-haZGBYg}sv=eIT{8f#otZ)>OpVv>R z`{v}KJ#&gO5xFx*_LSOXp0Xqk%!z$de9siyGlE5tt#BLL0}3<2Uz0}`z^Dw>nqVZ& zT_lzCEeypPsfwZu#h8^fvj4)CdtuGvmcZ0Gz?7|UVJomOReWhLzOoaT!hgD_HzH7P zVJK?AP=)WzOj6$~bMBQ9G3up(B`JOKIhI7lPPCCDRbU@5O6sbJokfwoux`ykGh8*M zR}3lsPI6@@fo4eJuZA>ZJ7B4m?IcehTilFrG$D>EFsBU8s)Dm*JEscGsl&6H2paST z>e#FXZB7f@_^dV#j@cYaY=31jH_222e{UUK1#r=yBTU6#s+suFKiM>Y-jbI{iUg!K z!e_+yJ7UWJy-Xj@WG_J92>raRwt^Uy=Wb_#q2{#l8Fg$%6Ps4Y*o3b5>=w9Knfaak zlDPuo3*%W4lG?g4@A@rv;QR|ocZ#XPX?9G3dV6p?9d5`c(nETQ6rjS8=k)G{YiW3_B8FPe&Q z^T92|N}|maV_V=KX5lKhMvP|xg%ODcl)OV#CEp>HsJ#-IiV?3Veh%)IEO;z|JLaga znDanSv+B^K%rhZ%O@Ax=us^>QTii}98!1wi*Bv#Xt08hX#ok?sZx7fC9KsF%0Z9Tp z0f&S#nkL!iDK;8)MHv!KL+U?TcadnFAvdED;|MQ$FXMPi=VDLrd6T)jj5|aYnv47Tqq~=L#->fzP55Sa? zVpMQa5tvei;0d1xz%gN|6wUlZI%endUd3el!%tN`<#zO5{5hxDJ*v;#Qy47vZx8#KDKlj!w?b&2i<|1MC0zko#HJ^rv^n zf88)msz-W3z@{Kd`CYTB{#DCWk~$zHMJ76kVGS2X&48r# z7tOUf_y|>MR2CcAhz?7_PsG6?Nf3B;LK&OZU=i7@maU1Sau&84AgZXP4ag)7Qj9uf z>!%o!f`9G>+A@48@Pq&n_pTT_XA~WTp>7PVULRb!IkFDt46lz!JuFF8)=|OlnAM$l zour`ohzUuF97s|^N>U~yDXAkS_huCSqTFAV`I{R7oWZ~;5t3yMk2Lt$INOhzy5}gP zO=}NZ%L>H6A*ZESM-tz@*t;k4>yMJQO9=s^_?u&f~60EpC+Moh8*g23~ zDK=4x0Wr+I7Jp6UMHDrvz@UJkVcb@hFtfe7jEgcbWx^~> zF)4p-l4{rg0z=_I#%i{p;j$eqD8o!Y8uMa8T~sMoOwT`f#%2+;?!fEoV$l0Q*TraQ z!nZgSwGET(4(33ju%Vhn=%|>X9NQGpErcx*-@sa}Fhf-eLRDAN{7?=Z?(>n@dw+nr zD~|dynd+R@L`P+TL6NIZVDDMB+~@9eFX-+q=(`uTVIPJh7@?p8pTnZsH1HH`7YIXf zwi0ugD;}AK0Yw1=iho?@n^gFw!L8DS=@`0V$gWumB70eAE3O#R3!BjyrEgm1omKcb znjm*G!qdn3hUA(#BeoU5gqGa8Ie#NCreG^|6cpa7HngW_Ny?6jXSAZ^f-Ts`nAByM zq9m2CAGs4%YMx|`nm0wQPORoh)I9O3CsuZaiw=Lz=E+zbNwYO>v_uW2sKF54F@&}a zA-y3KiWI*3{q1a_sWFDtV5W%L9MxE38e1Ir<%s;ijy+Oz#>(z^6%Ky+^?yL7j+Sm) zzJB=VXaA{S+;MbuIJ-LBT^-&opqpEP?r*>%-QPsJZ^XN=C%dnwy02%u{+J_{zhr%% ze%|^B`YHXNeqQXpUc84^AeO&(Jwq%G)_pzNbv@j9-QRiL+j-q{_Z!#UZya}T*zVql zOGF?2^}lHzKexp9tciVV@_)dVIs}rsfB!y^)boq)V)gUX?yJn+tL#2t)XV(-MPWZb z|6jk?`uUg_EL5w7tvj&au~o@eYx!CuU*FBw_X~}~Lh~fwJY~(=0dMNG5}rCtRSr@W z*v4jl{=J_qCXl2WPqVv(r1mbd`(Q5-rgmQ@8W*v~MY#GRP<-mnoqyVsN9Nf6PNb;| z*0sK>)>ql`*K~o#b_jrI-<&wKrB58$r>^`nXZ|UeEBDk1mIbOhv1fpfj%}GE6i9E| zA&R8~J>mW_hN9A^tYja%G8ES0ows73Z!pvgrWh*!IzwHx7wi_0>KtH-Y%eHJ*$O~X z2vauTDcmA4*-NaH#DC>nzDs5)B1Tb?!e~_Pr78Q8kkrKvScb@$C!ZlnMNc&0L#2Or z!(A0Sioj5-CIBepqou9r;%1nu4b7{A9Cct`6Ijp$7c`*-O?W}e82o8Y>6?*xCZ)~^ ziDN?S7#BOnM0T)okz-8kM3cD3Bp$GF@cpD{$i)fPaGoNCjR!^r+ybVu5z# zxgvIf6;J}X~JqXrL9JhKb6qbJ|9*{5&41|&w?s*7^*|* z=`tgghB;KbjDMl0U57u->oZfz$cWh8FR(n~?cAT=?3`9~PAl(ob-k;WCnC?NJT#?= zbG89d%cyGZV72?O#;QR-3*0}B9*c=ECrud!S9uC>fLy|y9!RPH|4Sl<=z)`@ivt2v z2Pnwwe@mL5Dh?jk88}EnXPs{@LT?Y~G_m0xS~Cx>8h?k^En{K_P}Q_D&_XI6B2|9X ziiv*=Qc)kqf54>w#n@?W2Bw&RR12f7kd&K}RDKpoDo8?gn3~?pw?3vZDNOJSAW3be z7Iq52s&HMXh#rKIkwn&#SE#KWmP(SCRD==kLv1}QWh%|<^T5u)7f4b}Kq@$)qy@$C z`R())(SNc=I<}D&j)>6Tl8H$QMTu{eq^Q!c5iumG1!HAKmmgPWMij|md2Dzi3~u}r ziT{b%i^+;2Cm|`%*oJRH9%M2J4VbS;SF>6nYfi0Pk}l+-$VQc2o@tLLpA(p}HWy4) z&UR^fGe4=xOsG@is>GNwHi}`X2#HJuX-tYf9)Iw(V8N80Q5UC?DfrMeBDp}*beZ+n z+RH5+Q)Z#zo@HB;YpTuY3Zu$IztDew$#!Q}e`8ek`#!-J_c@<_JNXZHMt^k+P-p;1 z>i3TpZjFfUb2Pv~BT^qA%!09mB!xF8{bVEdc+G!r(RO=A_s0?0@A?E^-e36i?&L4O zd4KZD8v~!-9{sX=8d&Vckf58R9uU~zOTqXN-0*fxiXkbI+J~$sB>9I+<{C$zp9HRy zMMtIKVM%aE%UVIXa$M4jgr$OKY(VOifi*^nf|3-8 zNg+vP0Ec_|rmh)f$EfJm$U2-YpdXM__kXOqmv0>1@J=(?ebsdjM(x{riCD`?G3pfS zS&*b^grqV^Qs%(A(J3-I#1_BQ9+kP%GH+h$DN5XBk*g+j)uFiwF~zzmgeKrSBu#)> zGfvqOB|yjWj4~8ff4J%bdu0{Vkcunj;YAgr=757kLw|-= zd?*XD#rT0E#5Vvj40)+CO?Zzcc7_Ru;LYN}5rV|Tkng-Ci#T+uqOqY%$$N-D7+fF>1*hb0 z2%Xh6TS;Imtyl|o`Amu5FR9AviG^3Br)5Exu5{q^*-HufwXHg>hT%EYkT#ZbT02YC- z=yN2az=?=d;I_qJJtV{vIKhm9FcYhyF&DyI$5i-q)ro5pz$mt0z_QsnJ%6Tr&*(BU zTPSBVqhq)F97-GQ6rd+u#4fH*dlbx~xg`xgr9r^g@Y4#yMS` zim4-`s=}HX_^zfd3e?6;kNULfMvzqvI#ubG)sPt7PNrxg>^it%ZMddu@a z{@3R&Uutkh(LV>K>VM~``xi9*Tn+q7o&3NKS7BdPyH>THb-nNM>rz9oWfDU`Y6v(Z z`CI?`uR=WT+RuI@`q_`fAN^?KqaP_g`jPTyf2;lYZ*?F4aOb1r`G4d+!^hXQKf1Q{(SOu@ z^aI6De<1zo55+(Iq41|aT>s#Q_P(AU{MA3-Jvq0hj~p3Xg9&is?EJfX_wKbwD!mIB z^@?EB%fi7$@c>Ecla*Ald05bO0UO=c)r!?h0jyRl)PnOr2fT^`MirYU#og25UQ74m zX@2)dWDP{kN#08-1G+A{d7 z4fZjZ)k^AnPFL4;u?s@IB@~r!+nWq!fo&GeLicftB!6WAj6(7MbKC)#%3oLsOj!#r zZ3PyiSYdP6r`%+FjiFi?mH*B}qEVEj3?v{$mexg*+Dbm#jGt}7m=!*d`>Lj9GVwi1cn+H*+$pRBLdUVs%eOC z807B^u74N?_(t%b2UksCPXv}HYu2GP+t8Z*$(n5t&H4oPg|1QjV_ecbr|!WDeaEQG4}8km&hpF^QqRJw_L1Nh!6-(PVL}lak$Q&3 z?$Hh3xFR&Aj!fevWVi-EfGP=!(ZLb##-;T2L+R@^Q<&xl-i5@wE3m`8%5b#NNtqV_ zs(+8Cd(73sc3@=(9tK1z2_n^uDln%BbM*<}DJ-qESI}c2FooI_uaQ)OB`F$^ieE8| z76p!p+(ZrFg|n3gLLZS}-s9l9YhcaUFK}S$qu4hp3r(tGl%$p|)iqZWMobcxdWs2t zSE%jnBqj1N^W#ubrqMR-ENU=-EynriZ-3Ep zdwT1}$j0w``Cr^alKS-S_&?kp`E|$8=baN@_b%O;koGL<;87ow1!lAN5BbLdw$pM3W1#8(gI;0U+IL=P6Wo(P>Y z+8CFtE!C=Nx=d1HmZSu(eV(~GuYb!;tANKNW76QL*gq`vjfi}s5@_!MGIJ7!ZyAil z1S9kMG_+i*3djcL&RPK}CWnwjsZfR@cnYnaw8R=b2G9Tp)@=9Zwck$3ZjVcDjf%b* zUb{UmhIS47h;>q%3HWk>iy0yG;2Enhe@X=saasli0ro`hs>oRck`h{hq<{SD2Isob zA+mTSwvg1Bkh(JPr!`v^TrX0(m`4;c7gwxhfuk-$@Hr+637xQZj2b~cBI)dEtlG-U zraa~yZ6)Tn;+)OcoHh!^*^1BW5)1kicRRhflUahN+5kr`@~yxibp$03oLCdV%~_+X zl&)G!d~*Q|_zU0*smk5J6Myg_cgQiWbf66Gs)7wwprZ6<6`r`<$&i%7n<6XomhrFQ zeRcE%FiIBKmv|cMSf^ivgQMa4rxo~6xGl&sp;NjB5HYw+3?2dLNZieJ2e4rQoYEzI z5d{nX`5Ke~n#O*_PH4Tg;1F^)lGxg}Eh2vl-NQ0VE^ z$keOWvU<>GDsauaV`L&+s;stRtuGT)S+QY`HxYq6CM)pL5EYxz=S5*y_!pj~0t_{) z%S>sK&>M^@V_uzx%q{0OwF=jWVwl*dG1OIs7iszg6S1P2o4GWs% z#{}jGM&Xi_$dW`kicC1L>v01%64{M7yIL_JEQX;-$0fuSB7g8c6M-gF>1p#6stD5L zRVaR4hyQrhtTcKq0wd}_(Q zASCt5L6iDgRv-eo7gsETr!uR1j)Vv?Q1{>%41;RS%C&}y|}J%q0;M~ls);_gXt@9c_d;@-3T?z0@0S)FFRuYrK>Zdk3p)TK>7zGSP4M@tEdu3!W>Ln4H zz<;H6^{Ml%#Iw!V*=FQK9U>&n zXry2=v?-};LS!FXvkb2qhgNo;EN>4iZ}%sh@8e5HM0UWAY$4w~MASbYCL>sed%|OddT~{y!zD#HH-MP@8KmueVF(SX(5u zL`g~;pMhRZ9sq_KlllNa#<2X~Pcopu)l3j+xH2KB!xl+xyoIDr+9ZW;RfDdGx=f6b z0c1+02uTr)g7W3+mIjg{(ish!zE0?psVSzBDR%Kh zrbL2D-@||c-ph))z||*bR6!u70luMUUVVR7@sOi}okv_vA8!j@99lDvitNBsv+Cf2 zF0pLNk;qhy_#SjJ`9u|Av->W`q<<33N>!JQDo%(|4-KdKN%mtB5CGh7;Perx4}g7G z;s=bHP)4WJiMcIcfda17<3I&JxE2^mF-MUk7qK75h)%pgQb+ANDMC_nTd7$_xGzF^ zY6j^hfx_J;^i(k(L~)6U6Jd7WVmrI9RYHZUdhx8UlhhL=DgU6zHz@iOF@Gr?(aNSV zDO;V&S>QrrEKCu|stHgzWREJbleJ}0dV)vLhQsJiAWV&`!F`IODPyP>sESUiV+=-- z>^>CnBN@4*)T?%hwGV0f*;_~|fFuQwvTR4)bwHspWxQWVi==eljLE(p5PbEJ`^CN4 zFS=*G=$`(fd+N76oSQ>y-G8&HUcPBq>H##K(`CWeTC&tQ+l5I@YFHKp7Q4S>y)(OY zV^sEse!*`aEq!@!?l*TQ7>w#$f=1B^qw}(HRO&>m|*M}^)ov2R@JpO6K>aQ;N*$7(gq&q)BI@g4QnDu2B+ov%ew;wvQe z6dFF6KWW0_F{6pY)nS6}ytZpj_3gAA;1L>f&!Qgq5e_~}vIpVYq$=nwEkqiPVl)yF zd3GsD3GHd2HM))@K8kE?hVtZoE9OoP2i+Uslq@gWn2nobMQ=V_Dth<^b zq#kO!7_oBJ1&%5*lz%x7pftZ3n^6TO<-Q4-cYMP$E_IJfJrf(=Nx6R-h*BAvq3PU+ zR|$AO92UAwKq|hav|=g3L4e?R#_ZBgW^p^UxRd4?bI@1tttHA+B6ov?q<1%b4VkYl z_f-|XqTHL7yJB)jK<@A>Tv3IGl2l0*sH;M|sxT_Y0!FRbN`EWH%+hvpaXSf}50D+M z*JCNH*{dQCW)4HILJcEU6zh=b3Oqw*Q6J}MLNiLZ3g496J0$-Gl?A4bnrp;>hp zfpIfBk9d_tumT3O0RvXrF)TB1Rt|uR2Nwm-E!1k7 zhEtl=7v{FXigPYbT!Ht`6YS#IU`RqWCkaYaAxtsVPiz4c zuoVsmp{J4nZP8@;JY4Y{Iwc&7W#MP+Dr{)9L>d{&gQBJ+^SOyJG7AAWCybjgr91IVNREtR7HlR{{D66<5gSF%Kv8V%wpp@v;3~-009zU zFqo$VNRR}WmpqL#?grXIFw^ap+-|qKC(?8~jbP%~#&l1n$5Pz3Wi8f5ao>ttu~t?U zYv1>M-*;9OStM)czR21oO0t8T^L_UgOOo4|V1I`AOx1=Gg z?i2a02|bs2u1j3|6`t#sG&rJ8aZCklcXd>FEKFh702Yd1PKu+?j%kx4Sf(BsMn&Pg zKcPtym?|$I{;$DD6b{1)O=4UXozzg6O3j%vd|N@}EG@W~rM@c4Tb21%6u~upylu(u zIDbooq}CadN)nP{?aoMRNt=Z!B1%%J<&NB$1BPPcMwkKtZhZBfU$6sL=;8{UT%luD z=$H}Mrv!GpH+SaOf0ruMMg_KElzmWO9}w941xQkj@BAVpRn+-VS`@%kAyH~x__zP6 zBoV3p;`^Gv_`dcpzi0U2_sl=~p5;fcJAZ!ky5~p##sB7O;UB*i`SELsQ?I2@y_P-o zTK>m>Ms@RNKkI$amu|yv^QZnS5BrlpOr3fy{$so=xI^!cUUU8MHTw_$-2B5oH~jE* z-Cw@0`HR<8|Mh!`At0%Lar@!(OzTkw2&Mfv(|HUeb?w@qFvNK$PiDSri$ zRA-Np)Y3*#`qqh`EEJdETlVXw^YB4d@hls2)=yb78(o(CWTdD*wwedLLd7N!O%rqaS*fywSgB0=sB4Gv!=_$MM zl+_UWaw?GuXMfZ}PRDV=2Lv@ZbQ!k{VUKCA5^)eKrI(wrD+apHEQwUR$ z7Hkowq6kxHW=^(1Osuzgn*}J!P*e;?eG?)i)y+ov>xfY-Nj-5_AGwwvILdb{g#%-H zM;C9aA`N+PP3l`&@L*0#V9)Uomr`>`QUs$2K+Rh+@N>|-DLto8OlzVXRexv#Q&B)t zzL7;QVieqv`bQ9^f@1`u##FI!Rg8tH@Gy{+GB!psQ&XlQ&$T8AZNS0>%bl_G$ox+x zsqf$^M>j3SI!+i%)KBjoMXF;VSlz~yeK#lN!4Z2%Qs(>&!6*o52}!|XxWYq!v!(d81Kc?*G9)Hb+QO2P&cB$zE;}QTdYLb~zMFL|$EjTkaxQ+@C5WI$c zVmEeJOzS=!Q+_s~yfSOLDRN`vsYm~0p|3_rYOjZ+_93Vyb$vC6z^6<(c>M<#gM+fb z2$lt=01Ub4mVl8tIvAw(SWBgzvGrKFL3<)-Lj-L(N0|zDAR>Z50)OJPc`L-9iBY*9 z80rSke1mVk$+u9X8kD$37JXyN5Jwm1TJsR4U|K4+p-JsPoMY;i_ANi|rlMTmN>U8? z91%N+hwx#)?fYfKk{%<|QPB?QDBmoR$S7^?;O% z(EEHjE%jn`AMx&s(|;(XE%G&l9vr+#+5ne%AjdKWljwrpkl{6dYB#Z~BCd?xRw*{2 zvqK&HXdgEOA#f5G9as0Q0xv+U0`bhaK0gj5g>Hne_DQW12RY&pNSdUm1Ehk`H~mmi z-*R%Tn9eUlJ9G#VA3m0V{5;pHIM5=O)^~-$4n%HKmgP}hp?@)cRp|R-*82Mi-TxU?o*R_@!!6Or z{o+qXmqlR zXJ48%XYsnXCN`mtj;kVAZ=ec~tD_UzI7gS5(x;~M>1ktj2HC2}vzG+!6_IZZ{v6T9 zyDIinMSnI5;rx-Q#%Y#k!wV@<%hI+3d{U@dZyq8S{<9yh8*t15N|-Pyb3|+Wh)LaZTGxjOslr`#a$g$R6nL9l zSB>jhM+<*YXKmh72cD8fwiR^tTz5D-;sanBR`iJiEv{>A%2FBC7Y5ater38(k-Q;G zT$jeK%i`CiakzbBF>!M-c~gvJGagX?YbfU0o5z?L+&v&bf`#OQx0+u{3LupV+fE!YRvMptid28#ipfjiZN-YDq==YmE47eUFd6YovSmJ5?b~t6R^bf z$s&J!KvI(6b+PYDzWdU=^TMp{BG-Oh>>pCZU^nbVMVMOVxv_s7uglr7@fJvG(vTfh zCx+zF0a>VD795ZU`=voZs!3gH&RP_~A?B{a$8y@38P~+dl#vN-jH63V!{^qNowpW+ zKvJG%34CI`D^l-@#Iqs~tZHK|b9URgbm)Iwxf@)27^xp&V}6G=l8_Gl9#Nh;CaKDX z+?7`lDcuE>2L-IL`JG>|gFxn^;>mnmsdrA|aRdr~{Wrf$mzon|*SOd3dvynWL0)06ghPP*PX>3M(W zWZ<2Xk#|nU-Z`0g_hjbXH*!CJBmeUsQ1w0{qSIgf)k{Aq{QL(6-1Cjh&)-PBdoup+ z$?!WTgYTU5y>rt2&Pn@E-?0Al4fES?=zsEt?k8`kfAU6ZV(|4p`ji)XrQJ?Zf+PhucFTXrR`Qk3!M#rK)`=7S&f{5HB$=gXwhxjQPn;MUKP_zmOdaJn z;0Zs@b{?ex01=>QAs-?VKvNC@>RFB`iy}xx#y9tfPTGC?vKYKNuIPJ_p-_L{iBU&1 z8}%|n)ftisH|Q2IDvWv>X*>-BNui!a2uVd+&(Y5uEBC&R_Fxn?L$!M_s*Ma4W=RS# zDo}q;iu!=05Tm>xAgMJVsmHFBhtA49+tQ&qx2I2S5twSqgX>Z_FL)|qS6N6pq4?Gu zAGZa*tthY+sD!ox-s#+DFz-)Dz%vLB1JT+-#3l_A0uAJ0&Wu{&%@S`yGk_$QmR-}JQo!(c(w;{BU zpxwk8EOcC3X%<#L)Y6Q(IA>kr(pg2`x|r0(K~#*_&5no5P?BOZQ*?iBDS;_6PYTN_ zNOAbSDoxZ=B~H914lp4V-J-6206QE#A*lrT-;m zADl#}%vffB8^Q)4DTsfX=52*(eR5P891vqpieQulc}igI7dwWeo>4_$QX7S!4oGS- z+`zJ#^qw()8!@UvXZRk`sZ!k`yj}lu(nrkXkFcSD7@@N;^_7|!#Y-Xl@Hesg&Ql{Z zZP$3NbtD4!x{#DFk{5@P)SVYe>ZsQ<@YOyk4IwE2F$sAHv9EtlTpU*gcpj_@Tq`6Y zRg<6##HNz4lA64dj0-vf4xt;?8Xarx@K*;)IGZEa5XT7zah$NMOqeR;#-#~EVM3pu zFytl-8IB=~)tHtd9rh$7))sWkQ;&H*eYgW!ErZ1>1f#lu1M1F}>iYNzd}xcub=A2} z48S0!f|rg*-Rgfxdlc(6L0t#;)xCGi7VJ};Hg50*Z{seQfTe$C#$14RgnCV=SlH>ss4hwA z3E(KA+fsO2omBx4oVhq}EO7O?IbC*EpPhxp$_N;ho5JRW%!DpIMGUyae#A6{%2!G1 z*l~iA6mfvWVnU#{0}Q>q>*Qd}0W*%MqJxV;I2h?bVYEQ^HzAgWBawh=ci1tzC4K@B zasx?e(@1|(ns`kU1(M3C0||8?t`4Tu!K^x5R0a!D4=m&9StH>EZEQjlAJ@boB!kz7 z)F`fF+qrj-?0_8tc6`m;lPmD#a0pT3Y?^7;Y?&mK^O@T1hFMNbAfA_ zB)`~17&2W|>|PeR$^r-Gq2^5KXS+^W~Qn~z)ih| zesJ4O49p#vRk^PttSt_-$h`F?k4O;c$YQ|kU%`0<&Rlk4yg)tDF*^@&{?Y?j17Yj^TA zk>NE=NCh`=2!f*q{59=Zn|7?vIBT=+2G7?Lk+~bP=nfE>IJ7DBw_#6UF4$qpu|9w8 ztj_~Xg|`8TW4}oI6AN}uFH(5;{CEv--7?9*mpzhy&>`fOpU2y)0mb*N3U5d?MuU< zHwq-x%}JR_x0I_Q^{q&WK{^~G3vjCSuWF)AV|vqGJn$^v@vl7y*Pg^$08M|-6YXw$ zKDL&;1XFCE)Rxk-r0^`kR_QINyd^c!Z_i!-?mnr%{oj|x>Ig~`5vn76Rd`+*az!fd zy?-uSZcQ!vCuRN#sc%f`8Pe6I{hoHoJZ^qtxGyLA0fnUAp`{gOunbY<&r>$pBo6np!o;j^Qb2>dU`Tals z*FaK)p#VTokDmVDKR{AnckVpfASBiOy5!yK?Cx$5k`li}Qil&Vg8hFderm`PlInCx zDmVayWj}b-+JDrf0JT_alys+0yzq5exxtXs;d6BGqa;PrQcD|01rR>x$C=I(BEnE4 z6_rDE8H!cs>8r|YFnWcjxJ^4!6z#$k0jMxhsQwrf#x404FshC)6=IPJ zcq-g{28uKhrl^Sos!e}|B!&G@l%c37Mm4_)Hop!~lA=X@M1-V{JUHD0Na~TJ^1xoY zV<{e*0H)Gg+Qfz?-cn+6s&aJbS{0v%8kW`L&Y1V&Q<~dhICGW71Ni#!NZJf@Tj zrwC!=xoeGtnk@--_wOPSl8a`Pq-e9bskdyK8N0*u<|9n8W*5wy*39v&Ui6w^NUDRT zK#paI-$qq22sM9ih@4-}n@OLP?i$YuY&E0^^^nviu~h1k)IK4pCLyU3A*oou)Yso7 zDZ`5-g^qvw>?k6{C^a1;LhU%v%J1&62^g9e-Bu@ekfgk;)NW!@6CIKJ2PLk71t$O$ z*7zYtxgls7Q--JX35Y`$e5(*dX&}tV9hi%E0iztO|2cnS@QZOmj|=)M1AJYit$@JP zBeu*B*%M$#8tS0OyRRYe)&U2oNCjpG&_k8lgK&jZ_dTFfrCu%YV@Qhe?t5qelFHmx zCiWL0-VSX@g6#!=1LIFj*${bFAr_Sc8Zs>H+X9jzFC#NOtveKqwIx4P!w<8!Rm2Da zL4$br0nvZVx$0z?Q56FrQ)$9joHQ0D(FHvRQ8!IUvGb&AbeRVRYBJ0xiq7iQ z*(Na~&z-rU%>EYK9YszO^?032s3@CM~ zxsD2E8-p!sXTh!~4~#F8l%Dad-qXVB4I~w-X(DBH2uLcf@Nz=A;;s z3N^7b4wFQ6oS+e`DZ({%w60Cm^~rTZqH0W(Oo_a?OH#RpHQ%x3H_f?iQ*KwA+?0O@ z*M*MatRcx!NAU8UG7L-y&lw&U9!}sW3tbg~v&45SVF{llN8LoH4aq58d{P|&h8mH1 zha_$gtW<*wD7cMf>M|bzD?dfWG5n`u7^xZosnQ_00h%*q(3=!})vA&%NrhW-QqYM1 zAg11$s`v)N6scaeRvy4AM+*F2C8>WSJDi4=?rYPBIJ?=`#F5#q+MKI4>#EIrn+uU` zSSt)m_bur2gXRg;Zo*N;OqQt#3)F!uyvg^}rYz+#eQ{J@7}ghtw1rW_5`n22R{Ei# zL&{LwpbJu~PX6)5TOL+t^N}0JSjUz(|gBJyX3q0TFT;GLx@8|Qd^}&C)U+@DL z1wp_ofT>%`4BRtd(Y&_-C?t#TkjV%vNs;bjdKLqc0z`sG=X&a}|Ae(VXM)*_6h1X^o!|(1r|%C&RPQ_}yH_d2OoH zp_Ggr7X&x?et@G6&%Y@Q??``Qdy5GiHlavjm*^s<$jL>d;FiGOnfJEmJgpgLW6DvR zb~bq44%`DQjPO`$QmapF4;;O&}x+#Y9b(Eve;4y12&zkcbU3x?bBo!UkBsh9ZNWn*4=qxXItBZkk zh~;E~RS8~0s6g1J48f7LVa@G1OJ8|cNP%DTX&jsJ+1`9&ebx(82|`k5|K{&f<(4k6 zqVX>it!Vu#@GX@dRn>pN553D;Pf6`uQrinkYhGc=$xRu#F}-L4Wk51hT4G3v^a*cb z?Z1EcNq%L6tB%g9qO;1#lp@TLhbI<86Y?-e5t&j(XVvj}T~cJqNbPy0dr9l9=={ru z;EE|!HHTMUP^g+--n#gw|7O{wGrxb<^8Q)d`)3{RpY?oj*7JYi*}#WqLm!=qd~_!M z(V5h5&SZY`-wMC^Md7!%QORqQ3H zyGT-pkFv_2)9Qb|jTcGEaqt*PYM+pltllW=Pn~#IP=3-x7j)7mb;vqS96Tp|QfN9+ z28`M|DsCPXHje=PvTZ_A$JwZ-y(C3pDuV)CdZDzBh)GVpnwBEmLL|)q_r1hWs2WlIaS(o3dji{F{U}sF!Yv}zQzD$Gi{5_`O~Oq$AL{FHo4wIu8LG`N z6cr^YfBm`dn52#X`JraS?c)umX1jjD?JMdo^(KoEOPwHDp3LC&l`Mt4#JqXxSK;98q zn2s200AiC;s5))EmxbGMl8{ofFFqZxqRW4Mb?m0aOuD3vOSegtKAhk8B{)xNW8U4I zb<}6<>(jRCly#Y7DdS{ba}j4eVH%X$MXvBYYho-T+#nu$2ggaGT+hcTPZ^3JPw^fz zmZ(VEm+s=MUN$pDt^5SOHs9OgdoaFYF{-@~>L5muN=4E-cU#9cM)gn$Gfay0Kfiz1 zoy?1E3nb%15~Fy*eBQMR|I36vGp0!lD=`-Xf*Yfn#DqRg3rz(c>=Ig}4uQmL9dkyB zJ$NQSc0AGz2WUB}P5?J`HA)6w!Z9-MAZ3=J7EKsYmZW`5bj*{X%R2=IrqHW1zOxu? zNr2$&6_KqZv@8kC1-`k!GeaC+oVS0{%R#hHDnDyQ)`N$@XV`5P>$;#bbwo^)l(`I% z-V-J>ReFTeiZh330u#a3ML6!@3C|F}L}JOfj-!OhI}5wf@#V)P#g-?LBqKvonq*rY zTUUq6>R?voivdX~eQ|{^DfgwN?xesPo7RTL2G4T+Sk@bS+f9KTkqYQlQjW*G_iGEd`%x;d5NT~ zNK$P}u4Bq<8q!)DNTgUD`D1bc+n5w!_g%ms${^BpwkrA?*VXy#}z@+ z)$76QJR(QG(01!sq^VQv96+i9!tx9;ROKI)1BZrSL7N~&fK=G>39+lagd~MS73+kg z(Ai@#SeIcgY!xQ~gRd?%&V3 zKb`g9cFyzJ93Yh!d5VAMzbp#hl&6OEMUHKS>uzB6U~HTCTF^ngce*5n)ysI~!s6Bj zBm|}#H!qKwR{)X5Eme*kD5=5scf_GBNq7s0OyF;kFI@7 zclCKJgph_id=I_6lONTj2bJ+#GD1?)5N4*NVc@1Ke9srNgrufS7rBnBLT{fe1bdEZ zQWJ(8F7ITD-;{s3Fo_pcvcs5=3f~a>t_s{=@?Br@otNhw*90#3;kYh2XDM>+OVg&@ zB=%B8AszsdnlfbOFl}0bcuX2tQ2asrP^PMLfUiNHk568d2RGMOk7fE2@8Cg>NG@b7;-vUp4uvM(>Kj zy{vatKsr}N3vyS~uCmHelG_WRZ1aEo_CjfWcfp($o3lb=hHpsobSbVj37XfXc=|No zkP(}6Qd?00f9qc{hStoHb!)6kaui(!?IdX5wPd|Wr z4xj(fPvpjj{?K>fTw1OE>3{lnY)*>mJ4ovJOC;6aJ!n&sDo9SB_=%{n(`FneR#?Z0 zM`$#G=rrIYBy}1{s$w|JRQElyq50p5Q;YTbUPFKI_K6d3>yw0}sCOSz+Q)kLRkn|? zv~Tlqe&cbrLmm0L?NLv|bzI2D^hTlS#FK7&6r*nXseLT!2AOIdB|(&-TBt;e z#VEE_>RTD=TQMp~Fe>nO;(g%0F=QN^CsiOd8p@?Z+vuWLa#jfk&a+%3Ej%0=v}5t?4ZkZ_E5*XR^(mIlObg^z`(bdzR`CGHQ%P? z`qC(z;x_?jXrUc8E8M>5!qnj+wekyXi2@r!e@B2G?@fWPi5L|`j9O$dN=q?{akYBTojT24 z9AInw*h#YVSHv3Y4rcU{5Kv)5!Mv+FhwT7Mz)c)OmSe=WqdD>+#4#%@N2q%oEof03 zevBiVI1SCS#zp!-YmsRX8fkyxJ@8yBLNrckVLw-5ms*tT*~z(-p?c?K)3g*in86#7 z*p-JnQuuRMRqR|AJCLUksqAH;qatwPtW5ORa^Ngxo)ZqVx{M@$NkR$_e0tP(VTxS@ z7?SGp6!G!9OAXV27I8+lzb^3Lm@1L4E(x_Lx~kA@kTve>$!H%N&ZB?5+nxqjcJ zFy^XcJ}ll_aML7IpU{3&01RclHgE2Vfhj)1)G<#nFvX;(hJeBr1H-7`2zdyOAw6d; z3fwDb3c->Tv3g&a@5bjxM>O zj5HS9m3eb!QWYLu^b#_{rwyD4;6uzpV;pS^FXk{Me7+GG*$ws)!?Oj3viAwBT`@2v zLYO+{sbiR;JcU<;#!zTc3*b3p%FNrBNDEc1OH%l+5sVU%!oPpTAa;Z5(tD=-SC$eb zsTXrnbtEYlt?t8|6q1y{gC2UoJJXKUDf{ZIt1b#{%9H!>zMCtLNvjn4*TIs7mgz;z z$iuoMqOFMf;-D&XOPK=Lxh_lIkf#RK`BCE%$GSXiuc9NLxjb$xVbV&MAJXIo)Y)5# z)D4o2x+Dl-5{iH8`4li}#`VdJ^OG6Z@2Te8p8-#CF-3Jr6uK!-4(SS$)|ELo>BEX{ zt5OU};VOa49qk3iJ}LMuC8$YTSF_^rjrHIeVqyzA3x3&7OHIs0Y4 z`HJHWCNbMB@K?M z6U20=$kAs;HHjg4WJn$!(*JNa ze^~4L`}MxRul4<|cIzLdD(d6qzK=_N=StVl<*%K~Uq7F|c0P6WeEiD!@a6O2tG|!+ zf4Q`{pqQP%`m0}(KB*^EIpR3cC8-`4bR>T%(kj)aF6iz3JMG=W_Rd~=XSdCg6b_Rj z*61fr+;sSFv6Xu7iYiaqhiIRETHZwaK7T*+o40RWAUUb}-otuHf9kln?-%?EG49(Z z38~$u%R5iYTThlYNqbc55!y|lrTK$o<6)}tDA9a`&U-8+y_|j`T~v%&Uz3P2?t6d2 zsQn~K)jC!J)C4_#wJWOk_P3;>ScMz3mhTvy0$r`s8&8Oia9e*ucnDVG0LxEQ5fj?%PWDY)gPtcPyBw z`pR6mZ7v*=Ey~m*{1%uidtk`y{Xc)&&g;36>`L?h$n4DQXyihp(Zs&*`>r(7s$1Q1 zt&!h|dE2Mmk!w@!${Utp6}|VK1VMQ3NB|_fcO(c)f&d9avdG%lbI!e)NU+$g-Uun; zi;P4Ph9H5&{o$PReM=xp(^%YMD#1s_l9SRKT`aw^vV`L{hYL9SQ=SuQCES0|ULDV$qRj=^c151zA0^EhjOnYQfCZRQE1 zu&EC*DvB7z017>UlRRUk1Ez$rDGb?6h;=K`1($}7gUt?@LKnOIq-cMQXa|fcNieD@ z6r`@S4vHj&3zZF_fe>MemfYyS0gHSmz+({v=ro5u&zPz+?<_4)!E1?piRfg-38gzx%yhOdX3DCGo2~W|b)_#2^Zx`JpyGposxh^{XS8)~!!5W5a2J2rPcF zXG9N2O>xXc9A3$JN|#Q-t9_8T5(~t-1RTM8pg+qjE1yZf+2DT#qfU7nE3C&4SZ}L5 z11}O|dP0{Nhxd^tHl~h_f;6#FwEIp1?~K5sP)Qmc8d=%MU11o7y?n$?E7aD@?jJ7V z$qg7P*cKdNMJ4*8hCL%R$>$F9LxQj5Q1LVPK_>`UiN=*QToyNC;m4-HM!P6HRYLHc`{dC8$cqQ_jJ(_O$Y;3u|SZRw(c!#(KIL~kGDxm;@!s`C*TUy z-A6SkASr(=NFhl*S0#px*(t}tq6f<{>y%NeqCp`tKd-?jES&C!bm`~v@WaKOJ2TFk zQ=1=8*gqV%eKhX4Ipe%Hzw>CtM*!t}u;95n=e{%R1c16Zwe{(wxVJ)BsF98(3bE!Vg zddnF}q4%aLi6pfG423ZDU^Ubwi*zgFz1lR~!>}nkXrKuxb@I6){sc)Xcz4kcF!fjl ze}NR0ii%TP2lLz26->@W8}n7+?@mA4NIsS)9?4>l*5d$E&k?3}dv$v~ zYM_6)bhk3~Y=bit0Mx_P$b;1|=>BRLkP6FKhU}=dFtvFwOC$x4A`3MU+=5h-f;S^` zkH_zJ@^IpMu@UN8-o8J-b$532?#$*LOfz%<5IvZ45?*b7I$^posQKfIjo){#lkbEQ zVCusm?I)wgTNCCx)3$pv_PglRXS)aRHD!PObR1KtJ{VBF-=}=9Z{yt_`MW*qAM`5# zuO7_UpJAK#&J$!V`<+SC-AU7d#B;n$q!aoGGq6d;n zFK^}6cgo7ZkuFj*m}--hzi<&s7vKK*zrS~@%i)ctORZ$FDJp*j zDuG%kx|l39l6j_jGFMOJPU4{bli2=oG(EtN}5T%;apo8 z>w5CtZ+<GC$88oPyGzaw`QYHItxXJwZZ}g8x^!m85@g-o(Mn zdK3{~GuoH!CEb{3=?Kd~k1j%0(Ppty~>lS?o>haaUHc9s~0 zVtGLTzLYKJEV!HadCU)K~NRd=Af~g2= z^Ft}ZO=So~V1XOI9pgQd$?6NtS)3gQeh;i^$5Y#UrrlW^|CEqkdoA-I7v0wvU7h)aEo1JeN#fG z)*|;yuP#wWspVGgzmw7VjDzfM( zneSLMJg1lyfuT|)B&k*7W;0W5m|{-jguoa`y5#0feHbfD z6H=^QP#L?1q*z&sc?PluLK%H<ZT5$Nk4yMHX zqjn&**ycwe(JX&p%aVmxwHX>F=f_zVn{|Ie3}WLE zS3*=Sr<>Q+BJuhW!PN00yvQBJ8SDPEd3VaRI|XkgV;W`Joiy)FVgVZd^7~Xz&tm7{ zCiww+YSP>&*234Gk!)ks8IugQfm4>%OMuA(5oR`vJfeS#zOoQa5yd{?Hc5E|XAiWj zDa~)fn=9QWDXnEnZJJP;$CZ{bg>48)%J^hXe}6)(G${b1kfeZsMpU;))py2#q1r{L zPX`H?`eleteXn)&!PRhJO34PMZVtgdFG$@1h8hzYidCl2nBw7#1xV_J%rl@24r`*+ z^&Mp?PFR1uRtBh4?HkbqCJbRDDciLql~{A9SDfj^&CHxFgLyhYQfrt14!DHrbz@X% z0+Je4-NQT%?E|V+-NP9ur39noh)#o7JNj@`3J0dtY+&l{s9G#Y-Ip-b!zosoqITsu zE09$0x))%O8B>qzW7zbLPc1y83J%~3HVD8tZQXxe*ed>6l2W1>X?@XEfj9Ut%}Mo0 zNNR|a)bU!NwH`W!GZLMh(7zPUy|AjEwB!c0sqXdA!-btY)6Scdn^or20h*2K(_-xjpy`Dg=;=S6i(BmR!^x?B zouq%eFGBWxSvXxVlH#W$+Ci6f30=o^Qk-%fb&=fTVnPmjaJuk>|=pzkUxJ{5H{d0<*FF^%Xj=;)%t{Tl@O7yU&%$ zryI$x_4uQ;=)<*WmpuM-BLy%8dZtW0RRDivQ5|ZH7-}U9x=#X_dbA$vrkWIy6nusf zNd+3~p%y9#YOV!Xf5PD`hHzyEwDInB|APhR-5JNdnaz81TleRk59eKvmRJUd_wmxs z-C6s`qXuT*2R!ws9)KeS@YDzW>Kns4_z@0OF^wBP88v(~q6hMNzhC)oui{<2^2UF= zFV^1&k{U(dzb8xXr_0-q<~Q$6TW^mW?@So6w|{Z##p(|0H3gz)%|ft)B&7@tDdBY( zowa0uq+~!+ek3VV^31}A@ww3%Ln;xb7*B2Q0VUO+j?4c2f8Y52Pk+nw2GcvgeG~OR zNxyybrzrlTpMZYz{U87OfBg8@-}`^jufF%gUw-$8zx>y?fAO8Se(~+Me*WFJ{_VSO z{~Yu^+WzZX|Ms09{OsFr{_NXt{OrHK@y>tyJ_>fe^XAXsN8kJ5FTVeyU%v6H>jUUw(tDrS6}^`@Bbs$8(;pLH@@1*$N>uWz1^)GzqC!H66O#0EczWT#|{_5M` z{K{MZ^yMFX<4bRT<4bRR{U5&nwg3FRum1gazw)=B-~N}ccm47wnc}f;@5GsI@I0w> zeJfROoN6Ni77Nuey2IXWjYs%OfzOc6-xAe}Fza)s1>K9w(~^5sXrE)0A$@5;+w)f-J&KXkOOd1mhB~G0 zJ}y=COyDV$Qjh|KY{h@2lt>X`YLXfo!M5Z~0k+fR3W50f2eZO)R1<}+;N)lr9}2k4 zpn??Dq?lg*1ttG8B8FlZMQ(n)AI~RR`SC?5Es5)dgePo~e8o*m9Apq}ilq$2{mnc= z9SX}6%;>ChREii4eFIz-4pU_AM^4(vQ>6ZC5=<46$Y2+PeQlEJdk=v`UT0P=Yk=vec#6%g1&El47)lLYU$S zmAuVw1vBf9sKtM-!o#q3ssMeI#>*J0ZPxc1NilX4V5-eir{e2bNV>1HuM2=E$r--R zVvE-T!t0#DmteNPEN$tevJ{6Y7dF}f(V)2&CCE%z3%Dhhtw|;fs45C^V`Wwh6)}nz zq`XpH4^!>QCc%Azy8$~6U^OynFHP7e5OWiK9_T+_CA)tH#)gDZKH;gc`U@v14pYQ0 z4H01^JjDtz-2Y$XTvqdH8(Hw0S7QalBjHD4W!RV5?qX<42ZPPsL ztYgh}Ey4ETiUc4S1Fl*0qp?L_}Fp|3_*Ib9ogg|Hb5U1@23bYGS zGGZvEwKjiDNuSXX#e!EwD-YJ!*Cy7hBvqq?f;LIbn1H05(;Ca9+6W{yrm&0xNv+#@ zS1eEG(Qbm8_q2dcw*jd}RD@9~y2wb1!O;fx{vkBAg@vkNz%C_RAFEE|08Jz+Lg5Y; zq4alIQ{NPhN z1vcBocnTPbFbYZP{sbc_21fu>tSr?Q9zkMK(@n&xlkUL;iO~~U6jD>)430{5&4OtD zYtHg?!H!v|a_^9e+4rHw5E5~Gn32@rpCzdj&yzxu!dPA;DLBuM=+gb_c#kUnToDsV zYSMpEW+WvGwKhU$bW%En6VB2$H%Bi zDSwwN+^wJ{KywaGO|z~FRjZGeclg<0mSWRKj6_n@w#REyvKWxmla1sv1sqHPVLg$@ zAG3D8wdjL2PErp5sSvv&kJsbRHJL%<{+O*ajqmXq3q+Q;NeaJD!%z$ik5_=9eBJUuj{>vKA1%6XOgcL2 zxtf=i#>HX%Avkwy)`BTaEU9 zDA(Lf9)ldH8Y)q1oL!0}6)c=b%a?J2snj9DRJ!sq&C_*{)5Rlzreyvgl`AGuPOGgdl{m(F74bCw~+ zFv<%UwbyiIFp$?4uK_)oB1eYMkv>=3q3|eT^IzCB8Ga!h1IAwNof)0u-uOlytA4Y!QShKh6b{RXd}+I$1EmFK{Lno+P@K zq%inWC{79WsVL6{-Vk2o@Vw*_!9&PHr|?q8>KNy#Ix9|b^J;IqnRB5NrkMN0%;o{9 zJVPu)DhtNx2jqXAcgVAxs4B|pT(4o&=M|?`1UrZ&>hVLEa#hGh5RC+<=|N|yXH{6+ zp9tR-G{nx;Rl!hYrCl@;tFi5GOI8DIq@wr5al8D==hLYjNbsq^`(XeT6m<&Qm4JY3 z-2GCRF66b{6JCT8?DF_%lGs)kcwG{@)kS~Z$fBqSyC_zlC4pH|YrZRY zF2$%d2}a>r4q=L2r`eIT>lOdVb>T0}{(vo^EcKZrHDifPn|#xH=M<2X$~dkvk14IA zO8bz)(J!;31^S{5qh}C0%=gj0PmjjtlX`|%9FA~8ih-5-4wjji(5K?=7&W;~5+z-c z08QLzV$OfkHE(@9Z+pA|vOigLJYC*;zUJ;-2V4qb+^t|qG|U{=m4SYRZvYc;KCin^ zAgRpK*514$J8j7Tp}@_1*LR+;IDx00kX;7A4j>PAxxxAoBO~nt4pxFDB-2mR20|n= z`cW{=koZNkLr0?tjO?*LL#KBK+O5NrT6Olyw)=lKeDI6_4}t7PwBb?GusTG}fuGgg zcm7&UN+hYqlDh(D@=<+eK$GlMCtfJy-HI5^N%5K#ycqB#gPqB6t~*^L|MNK_sUcmu zM-h9n8esi;Hd*M~v?d8Q}^a3|l^$u-~3@cdhyX^!f!Cbo^q6^>6IdShofvsadMFj~KH+N$4Yi zrW4^uYvG50RIhoMm=qlRO)|;JPEi2Fh%20Owlg97=J8}!*zOfd&8#u zgrhuz-|ZZ;_$qn0B^TB(h^{+Tba%JqMhuxg%w_NZLt&HN+!jF7lU2{Nb$^c{1duhT zP4pvb`R>ndemZKrF`xl-`Xf1_|E_yYgsJ!X)bICeJ{VNr7}S717|^^wpaz(FzaM`a z{NC?VfNl(^J_Tr+v2`uF9xu6oq;Q;SRDW|+e|OUSaL)E*3EpUEk~yqm*=I>WDh%TW z(x=(vd3$!%U6Ok%s?f16+B7DCo;XP%RVB|jOeImcrWM4B1=xH=V1x>w;Bnu&N1E)c%Sla0C}|p&mUpMvir% zs>)wcc*^UpB88mh=B(LyYj$}vzwRz6y@zlGbL_;CYPt5#cXBU1`Acu%(pP-tFTC=> z4#``%Xe$qT3G(D#?qtufdo6ivk5#OZvL#e9hYF@Z!5l2WMMtc%nW#C_C+>gU=63ef zlRNj4Jo}WdwA*y0>svrW@ro^aXp2^u;I8bkBYUE{iK>AdiK-)xg5$OrznV3A$W%YQ z5J}3PKaZ3yV+WUFWh!;}5*zT!&1C5$S*#@rM}SW8{c?Q26x%-_RbuOY5dL4f01y@sP|b`LtD1!&QUn3Y6h1VD4ve9)F<6GJ zA#{KWk^*IYpsWM=OH5i+8MlElJdiGUsD}p)R}JtQh@F@Sri7$jPEvnYN>QAl_#_k! zM#UxQ#1utogo_#=DS|0&>Pa!>}k)aq#>2O`jNa~!El(Y^N zYfEVM6LmEURT)94n4*IC5kRfa(Ya_Ytq|NwEve`mZ?=Dw68KB9E?N?;%mlSpVyqOk&5a1eYE)Z-y_@t1KPWccQK^WE zRtIzK$)<`ViIt7yRE0YfTlLsNy(E0cPB#~leCH(?#Yl<V(6{Vp?8&uQlCvyl19EO7}XxCqOyM!H=v;U5x&xb{98m~ z9PEcdh-20kyySF+q|T%yrHNmPBC2X5l~AanE#aHk1Sq`J;dOpWGttOX45qHcK)1_M zk~TjqM3MxKmi{k}ggWDqv=p@@G>cwGQrB0eR>V@NFffHNE9fQI);zlZk@cVVSco)g zW7KOT)s&3$2v>g)D?waMkq9K;IWYXGOTeLt09?IgKwLqyEsAR(!GjZg2%g{?dXqUz1=3IWTfvKZ_#6#Y?EdNkEyT*$8R^QA^=eaBs; zVCj=u4#il_^@kF-sn+i>B^W&q2Lp&MdU85$Ubui)F`t#d`aa3aMs14>Qh(1^>kVvC z4Q?(S890gP&wGU;0#~I1`*cPbq~B=7Gp%G~Y%?%RdceeIx$XRgeb~6UOpxC~uYMBq zC6lhY4DY$NX)PRSFYLy9-fgz}p}un`;tXX`Eq^J?d96W7HX)s>P$r~w;0SeQm|09# zzh17i0sbUsxNPPQllsSfb~P3M`UrgW-KQ!Ty`4aP`|~p9gPX3s>)6S8w7#PM(&_-OX*L*toi|N@P;s0CkqhpzMT~ zfzCvjS8RN*-PR`KA2%>5nj70TJz234FJJ7r%W}oHc3Y5Z=bb7kmfL2@fxMk2tHpl( zZvJGPPWU6LOqObB4EJ$PhJqicc&Y03&X-|x5!ePIuY6gm(>+S%yGF2i_8LN8JVqBnl^5iN)fqEDu}g(&QRXDr zkm>Qs?KM`nS*o&VF1$MwEKX_Zc9zj^GkMp*xD$W7kp^d$5$-RClXIVJC$Nr{m+v{9xt^D3{e-qn0&fl`;{=2_o-Yg z|JD&>77KHK>VT3nKfXw%Jq0 zI`4ln#qw>}i;9{o=+CnN{lY<^Mv9cB`zCBA(BjNL(=Wh-aqT^Yq_rUl$tYpE?*^cj zh_AGrU^zId;t*YNg}IM2Pj5+#)LMV5mip2cl(b;WZY$7(*yuonUHK-e7u`@xEqvE+ z1!NtQUtbtmV;fmhdtl{b*)6o7J4)79icEbuOtXU@dZLe@@CHl-NJAU{(t{AQuSV;x zmFgf&kvB06dT3tUXlF9O$m$T8&%NUxG)^M1d4*}cWP(-3c6Q_ZiNh9i@@(UvX~zM4 zmY)s&J*&n8`0Uzr=z43&*jREU;hGr4ioXyr3QCr}2Ecm{@f_|{ECy0TBr4wuZr04! zS7}v5qY`yaA#?^naUXV#M=RM%KU(Q&B| z)OV4Hd{6pc6(hKiN(M2aFw-!$=Rie2O@4ilPAmI$N%VdhXr7N%Jw7NBU(jagPgAeI zCanL>Qv2b4Fs*q|_tULBnb?C%)J4qCHyV6BZebssq@RF@#6-9IhCuiFfq!L8u^1u=MDZL`#Tz;v^-q z>I^5LW;NR-U;}v+&`)01l&a^In^l!vSAU}sdS_$(cuv0t3QaU#oXlkstY>#zA^I~e zr$u<1A~7+tPw8t)@LT9EptaR*K<6WpcM~Y1z7yLPPNYneaz#VHhpYfNEFwQ6(&G zue-vnz{X&{#~n3$alBH^tTl~O{mlxd`AU!rgg+J=KL5Aw?E5Vfu)v?6)!B|W<^Bph z&wN3Kqc00NgvR!(N~o^v(=$w$sGW}7#ry?1^_b~fE_+A7M&`=c7(nBJGM2Zh8$^PI zI;{Ljr-b)={t8~0bpl`XW;SL{$&Bp%6cD&&&&Lx{o})fK^944BoIQRsaqhe@!(z&8+qK1jw10sO z(W~V)QQNEixN6Tb22aRgknVo;Mfzx|v3~yJTTJ1ej6d<*6hb+AvXJ4rfMLhf9szW^ z0%j&q1nOsblaxt&rM<-s!Q-S6u|jMd8@f1vmQn^?!mQk(Yvt|rWxt!hJAzMRV%lgz zS~!_e#%AY6mWFCBauV z6J3nMQ)zQjQG`d7dw5{1iJhHQcb7OV7@;r;Lf4L#WtiAPyU#Moo@p5xm$i5uun-kr z@cxXjQ*Aw2c+j#)H~DYZY{5Y=DmWBLmgQhycDn6rh-=bdP*?hELbH*Vh!9dvb@@U+ z5zlKx3#(+eU+d-(wW%L38Ant*tT zFE#GI7}Xy@7)!USFZ+kGxJj>a_gVp0y=A??=SDs|@9OePQ?vWs!I5m~okvo5p};w% zu)QzmjySXvP0X+j2_65>JgPxJZ+8HffZYhI{kEn%F7Jc7Ykp}2FHXoifPe@#MkDAM zxh52nz=dl~W{e|Qjr&%2mh6L12)6JP%roJgF4^NFue+iBXYJ6~xUkP^PtW*ZeZeXz z2>;#jfI%HoO06k@+Y1EM4~V&oTFDaO&WXIjX7R_b?2Qwm zCzT>&CK>2J4o{U;WUd{Yz+e^7S_Nz`+t}qq+ErkUMf}O&ySu_!E*_~Wx;`RB7Feaz zy=ady;#6Ph9VFzA^R8PPN#$2ni@-`$_$nMtvaCUy&4I3G{_Xx^2S?n3nLquV$MxlM z@iKB$r|Y<&1^tvTu=P6)HH;)?Tspug^px;&DNXugiDf1p+a%pBuyG>lNHC_#Qy+wN zfJi#!g9{qsHETzD8r*ttszUi7s2sOT~_(PK5 z50Z4y@_VkNtj>G^Pd7FhE?vyjuU_G?vgp90!+No{+9bd*4>Nz_Qi?B?RO@CC;u(+?xBvRR! z5fp>+Yi~T^T}Zr?B=!iWAG7a#>I?jB5d%~W>?*37*thQpj5l6^ zHxz9EOhU~=-y2@wWa8C{GT2V%oNS~Xf^?O+iZJ05 z!yw0#sg}_aqY{#cn;DQ|b_>8=ca9qm0C{KvH#I5=OQ7-UO_~SBcf4a%J!eQVltxK$ z&stR0NbDWESyfHP@js^evUkcg3@@oT5J+aR2@-s1vQ<>w;8k0phb|2Kr)TExG_GYW z{-|pE7jH5j+7D__)NRUydw=g%O=>I(b}P$1Z^&n|>FBfhS~?{@BadL2Z!AMx-ccBn#6)@EWo=Fi@t|^Xoq>j zVO+!Cf=jCFlMfYE{1Nhx@namas~<14#o4~FPnneKb8u_oC+(x=T;smJ8Uro;%=i-L z@g;k8q`F;jEsaRjT7IsH;OZ=(Ch>AX18EF0z zOb{|Vs%a)~!c3+js`t4`u8Th_{kZM#ObK5Ne6d+{wi);G#xiYsXV)ZR7sSSkr35S- z|MsWI*Pis977UJB-#0i%RB&YzpdPjpNm@c__GzeENM4h%Pkk@3f{Y6<>DHW)`d_%pH zYJe|PyP+7zyZ~j0&1z;aFk?FEeizGso@p_@G?C_J+~;;sYo~Z~T&K+< zBB96~Abj{%x#N3WLW%l{rUMDFdDJsft=Y9`Z@Q$h{c+8n(P9zhS#$Uez*TE167s3!c_^vM7Vlkt>vy^hE*;)A0kvRVdv4jJHXTViR#U*+kl zB3|Qs&~;*P3XkJvFnVV^dT0ID{aN(RUitNWe%fusGOC)Wxk%c&PDsTY?t zk|ke0W5+@aQ7geGQHcKPy~wdohI+CD zagn}`aGh0Uy$>q^G@Hc=??{l%-W~lIU;l6)bap<6Oh?DruGI|qkvj8-{beE)?qSmWBUswY+(T2q`YwIkn9v>XLhV)O z-!rvLPIUykT>~?c9T1BjZW0vTg`sB-Pa0au2_-{>I)}9Y_l*89(ViaI-RR{Dz;EcR zr(JF6Ffieb?oj#uL;mvvvy$N)cjuVN?Dg%hYYKL))w>tqzOS&ZQ&}7#OT~V>8H-h+ zPaiM*oxTUAHsQRn=PxOzZO52>-ulauGB5%7&CVdL)rTDt(Hc<@{|21CY(WQH<~Cc6 zD-9|2n+3Unu-84B+dOOrd<&&f4Q0wVWy+=c8IhH@29BZRdZV~Zb=qz3Yu)}(bcaaF zu1YL(yef9==^8~3kbbEhkH0H(W#`&Yvk4>bC&cZ0N0ZgK)xJg~cbG_LI}r6}Dl8Y_ zH7~pPI#+568)_%5>7V=QM;iTQd(@QZ)-C`L-KZ2^~AQC6C$)gkmqJk?TEP@T#5R!E=Z*~0$sr9}M92IfUM_oR+dQI0g(s6%;hk{(d?y=>=_IIbk@~VhZ14IZ zbLAerwvbTj<}dL`@RR5XO)W%#h784Tm<&eqwsnQb18SS|PCmWJTJKJM2P0IkALQ6#^g9hWa& z?#MokdQLpI7(HD|4~glcup;R`o#HRFzQ0mV{PXM+c*}kFtWO!#^;|+^vH!RfF$VxP zDYu%f^egcdK!-lT^R(b4mC|12Ne~qRAVhdLdh9XsvP|!_c8e{pLB@-k(cVU42>;)7 zWpumIi#hH(qlKU5M3bhY5?S8t(<0P|NLinkP6YEL^{d{jf&vOqZBskb{rGL=r6Ji^ zP;Rgt6u#bzv>s+59biB(0i+xFi z5)FRC_MTz*hXB0$9|J8tyHZB=`1) zqv|b>wekxc6XdWMU6*~4i4TA{jQ5AijDO}2kwj8S{rZhN=l0tzyPY1P(zjhl`*h2^ zv2{z8;{v!Bn*>~gLps^Q6xs8NZqpcnFI;c0IvG}TpXRWA-x*#heILCZ@$t0Teke)i zxZh^K;LvMs@$tkE-P0F$bCfFL z5o>!O^}?GM?*G;)a5B+$XOR(^^evt^6+#ArOSHhR9UAtZ=A9wDY`qWwfxf8qVaK8e3h9h$vew#l8VQ%=t{74bI2 zGdvS#JQIsGF(Ec|v|w%9l8vM3fvMWvPYbrGzxC;UpF&M1dV9;1drH?XGCgXCOl%Sz z<2}t~L^^AeOPrY<(AC$7`LQC+e&F0pym(_HCuy?3jsjZ)iem9S7Dn;Tlc%qlgyX3acCV;v)%91FqC*BKpJadv8_XN|b}*F<3|lvBANT8>!MKjb0!E0H)c%|hGD z^{v%hQz$+$1EwLND1A?q)LIj_pNg&LsJ+Y1zCa~F&6#8O85JFVRupe3cD4{(PohGq`3bA0q+%YKy%no*(g^Sxwu6Z;B7*M>(k~EQ^s=hp$@)pvFBPy%j160 zn{OLfIo7)Q<#O6}v=!xT_bj?9$oJQdw3A1cUH6w(iD5?QVp53vNS;^1Yne6t963nc zYw(huk_n~jn>mpvdeqlb0^~=jn6CbLGo%WE73W0JleCeh9qN7uDenGIJ>4!j$O1(! zeY)|R1vv=6nl*t%b?*Sm&4cYhU4w!i#W!mtKtCJ8+=dbD$oxqM|2u*nAJ`Sa4|-WdL)9?`jdaA;VVl+3iovu4+~X@7cV^G*W$(A9e!^~nV2PbnfD{f zF|T(C%t_uD&ndKFjy`W1m1$R@@`dm-)(behub3&9#~6|uQ9Nv+n$V>U1b+O0!`5fd zAq9sq0#kuac6t$=zlyzh9(G;Y&OLC*=KB{LdF12wk)p1nX%*#^xdlY}z}H*o>G))@ zUXe878JyTE-^pb`+a})nFIywDwc?k*4eA45PdU33Zf(;)cvJDch9D~7uo^U*v~V9Z z+h5fx7rU+dK)GxabmWcc;?#|pLtvANDo8SzX?IdT@VT%^T&*({ouT*^G!}sB=GuF& zU0f$_5sKpOp9xY)^XBwDoS}AK3c>O}Bg-U@Tmoa765AIl6U~k^s87N=#1WsV%& z9Xae*jO=#|#Op}6-1Irj=PMW4J#@|1UNOAjh8e#r!j{b6{IJEX4mK$uj5M4skFOL; zXe3FHG9ZKE?;ua^6mZm}^>qWg)4z3gjyITM;y85%hb>BpEi&2*9*k!kgYC1_w?Vka zq!oFFtyEsO*R8{x8LdcbIZQfFW7@15Gso!SMNU~VdI+Nqkt-f{!7@)ls1%#x)opOLrT z`2|bhPeFMCNc8i!!B9N)iS_qi3NvMzc0j!5EKCYkL9B{4=3mFiyVd-5XbO_!j4yKd zmja+L`-PFqQNYdS+vpNH=cVUy|LxZh4)h(4h<7Zx6Tm zddWmgZ9xq$vk<|uM%ZDa)zf@Gefy;A#DVL%aZ%5*;L+E!DN*uP#Fdn@#GiW>(Qdqn zj3Xq2)8Z(#gU+eiL>>{^v)JfZVP5S!TB*1dRRcfZ}p)kg9+j zQ5HXApD&yQV)wnD!1+v4pPWiC7%WL>#+brZTNLEVPkIZoAiK;THk-(|7-fxm6lr5Q0&AMauJ zRc*JgVE^o1WO?n9z`;yksn8(t#%kMkh3MgW&fLeL<#wBiv+hs*Qo}Qot?Y_#7^IZ2 zVl4P>UP#+Lv`iL60|ZnT}fm% znP(7K?$foGQZ1m1Ouw|(5o@-(FP}ks6W(KMgi!kOwpa09R{okB(zJ!be2+5XGISbb zz&{u|^xRtHX9kORKf@~ zR~Jlhp)7p?pajPfrx%$VmS>?iu5|-E!V(ks4iz9OK_V6P90%h`-5jD2z@S4kXeVz0 z9t_6jU+}@{kNQcph{%Cl6hB_Jg8h5j_6#Eo3%U5lu3lvv9o6qhE_UIKyua-cvwJh{jJjSo5xJJB02O|ZQM<>GAaEw212HJq;II{ft&t)8TSE%B zb%?nd1nx6X_wTFS`cuN^PL7Nik(tP=%pNxCC)?IiHf@$`qkj{`ej=9j(mQmuy;={m zEd>H5mOst6w60;Tr=DL;)h|)k-5C$Ptzd8x84?HamB<0VNG2X&3|HeKQ89~{-Nc_(nax;AfjGjIJ(d~O^@7gU>k zEZDVb_a)da;O3iQ<>47`)DJHG#n16+Jqz&*^Zjo+aBB|Z_w45OzGo>N3NdJsYfx=hZQH|4FYlU9s5OTa+E9s{R zV0(qRow5+SC>baOK#fU4XNhw?*&=$Ux?-=4I;s4jR5fKXc7KCy+bqp~y<#)hjaWd! z)aA6o&b4J#Ea8;?$S~xq|-)2xEk)N zxWQIaMQ3`FZ&W&-_$PHj!~e3ZQkTR9cym*1glo$ZD)1K8+TAJtrGq@VFC-o5oPDKv z0^7jxo}{INVdbt;%ve7{_Y_CrJT~mO;V;jhhb>u)9=y&vXW6l;ZEVXONnT1D@<<+o z_1Q+2r(eHG%5P_EpQ3$vj9+&D5*D1EICH0d9*k|fpEUGoDBJ3HICV@DzfI9B2Uwit zZ1VPOycUR-6U4%3u|8%ft+QEX;ChRPD*v(T(JVZ9lW?h3XS=$Zt6qJ!AZ2pN*RMnk zx@m}miWyXnFd7;Yv1O>9E>)}|GyU=VBU-Z4@pjlY1%3UFf1D&b3C&N%FNL>Q2wYZu z!g92#cZ^xaUt*IDCJl2RJXX4q08BNu)y3zB#@nDt*WWgVxt!=qF+zT4Zn$*H*c#Ll zDte-Ma_EXNSM;|=u7%B#&H6)L8d`j6`Etf$>9IhGxMF6$@VQ#;gKMb+cV3#!Dh^XZ zA5Lay*bkkfT&C(R9E)bW?Y~#@UlxK|_rt);36xWH)D#4inzkFu;p5?`0YFQU)5(&! zgyW|>zSguMYezZHY3PwrCuMjO64#9NWCIzZ(8K3G>siuZ{_l92oO?Q9jWZkRpE}9q zu?&6~??57z=;=mKy4Pt3li^KA#m=#f$C0;e`eW1GJHWgC)`3dwaVCoA z@wbU0;9h@wFFUfhaU1#2_wt8}2+5m|T%A>O1-^83*U?b@bb4juD^SMu@i6+J1M^_q0qt>GpP2W-3m|*- z5s0`|5A^Kc$C22L4g=0BvN#f5U6*ucd-P9C;xlw^ZqN7rhw+SLqLvX>N*QFvMBNjc8Ap=%RGYWnX=yk=Xp%u!#2hhMrOQ4+Rcu)JOl*-C$OK#)i z|&_B>+|hi zphnwh+PmlmA4n9-cUi3T)1D|oJ{Tz+OnPz;dMdFxE=BQ^SbJpmYJB0+W7s2U^z zKSxfYvtSo&dw+V)x=F*u6nz+e8`-ecx>*fYq4DdN?K#xlE{Iz!RC`)!+BzF0D z7rP?lgQO3v-^0P;*EMh-C34;#tN4=A!SANqB}(}5fsUzt)JaAhneo@CFiQD})cN;5 zB^LvaPwRm{askih*sXZZjPF?s-(pp|p(%~g7kDCno z^TLc#0L+uIG`OgkQ};h&xf{%Jv@UK65;Y{qzkhtQeKH2&k6BKT8yp5(Ga%#keuWt* zJJ|I>b^oIWcQT+?g~nRw;4?)sM^V!!JH~axSK*l$t0rL?J8w!~LlkZineJyt*FqU- z2mPORoPU#*|NXl=^Z19Y>fL~yGh?hEeGSj<(u;0x*%X5arn(240#-w>ETw7pr=2)p z69Dp##un&&NLFUU)OUb&y(YN=cbu^tJs+|{ehnL9b zQfXK&T&4$Jmidp(O32IeGj9*9-lj~yDXqMC5@yfPpxUjo zpWOfMNY1U@x)U8eFbym>Erj`@y=I`~zddg&ydQZ^TC^*?8Xes4i3Vl|LLF2lD{;L#Ykx{w@G@nk-K2S?bL$9vmOm-rnmklOk)Nz@o``K>7k;r&8y^{ zknnS9XWBFUoVUBX%7o4Jq{vk|E$kfdtvV`LIp9{mx43jYXQ-?OvCcdarxZT=k^jev zHTLaUCKkXlf)tV-8M61-KuOv1Q^OA!?-V`J;2BBrw?gu)*{Rzw2dtK^U)veJP~j2L zHlJFD)?4h$npH!Upf=`p77q!<&f&79Z2oiaaiZU>Ql3Oh3n=WWu;<@-dz)Ri13Z7+ z63NZc{Occ6x_;6ZoPB7i%YVCPp!pcwGyFBKy7d;&+!Ipoo810>l)X6A6tfdQp7Km4yfi@5mL@+1x( zpZ(LB?qK0j3~|f(rt|denk{hsa3)h~vkS{ZFu{s?)*!MJ@Qxb61iWEKrz?40EuBl77<;yqo2cdW(P?92LrGH_U+z=(Vpmhlar^`z+1)4g&%ys0 zki@h->xVgf%R-Wn-G_~40&A!|7jzze8S;fq$5`(-5$IMzmn(4H`lpDT*8YOl_(5rB zRwC8)$)MQJeX}t^$qTDuE5dsZ7x>j08g0IXnPWL9{s9S~V})U)hHO&G6q zxdhgX7@ezd9*`r(Kx-6MD|c$}v_kc8*-^wNgRv1VPcjB=Co>V0&h! zb5~mS{m@RP!JT=TeXw)(k*-6;E@f-B>*&iG!^I=1*8{ByjDDY=Rz38WPOk|QUlA0~ znqQt@SHth(VN{+~;zE_Y3mYc>J=Z<-VZH5fNNKH6`}S9rdzA7AzB-pJaC%Z>lylUv zOsS@lL*heH|9=l2u=(wUmfFfqs92+wGrdCOO+ICs!aj6TgR^yM?BUMK)Mbun^ephM z(Hj`g`{xkXMc%Md4Ox!AX-tW0^p!`qb0}zjUnCyRHRoo$p8v9!;%lZ8qhI*I8q@Bw zudO?YH2<_Hf|TQK>FkF{1W)~(Le#c@a4#_Vo!Jpz9TEVSDVOZtLD((fBjET7zlh_{`WMNngTH&{S*gNgy1h9k{q zcjR$++ZhAbbl&jFRITYA(MRcFIoRe8GQ)qH|9IJ7Ix5|xgIs<|TgwD@IsIiXz{iab zPEIYTV1-tC1UXnSndHwotYi%x(m;Vh?7Tw2Wyvz0d zX5n)>NlaJZ5K14f0afF#-8x~k870x~X@dV>Ub*#>vH*Q~g8KCrmH)qhjvo`H;s@IS zy3VXM!0ma)qkg35@E%FM1c_Y?>EC$L;3hb^z0F$^Ary z%A*?t$=SclK2AMxKaYEHR$njP=zM@MC}?dJ(rfGVr<5JMsviw3MuIy1lA>3azyrs~ z$rLWu$U%u+3J;uNlxA=XTr%+1vf&Ua?55IEXeK; zUXhUu!~rD7V&+7rP=XIO3y~|_oOggiSEVO1qJ#cY7q6Og($i+7iYiA4c6S_D85J(kw>*Ney z>w1)ZGR1((m(EQ&dcNbQi;}u0IwnxlPngmUeL=!T;XH$eMCDuRS60WaW8Yzq^q^r@ zbz*bW;IDBxm00uzv}jsyj47a?@0w*Fr6AIbl8yO(r-Pvhx`UQJLNi~tXo{iGxb;|& zX6^10U2i(KI3{v;`&L@!NCS^&p@jS_mS9 zD=}yFTQ_g|Pg=~18A%_yYNJiHoF5xZJX$Sp@N3lGf{CDhKpOwnTVW{(J%piXv8I21 z95F8*Ilb9B{xs)FZo3Du04*r?-9SnX&3w#6*;dhCtoTRawg(BvkC9%0 zv~`>Jb%=Js(^tKkj7qf}Us_ODQr`^__GzZ)2bLYWz^~%8rthHG%!jQ)4Cwkzw&M3$ zYDGTJhLKz=AQpOG-SMH2fGihU3*L>VyrsHLvsf~rDplLgUk|C8kq}labv(>rP?`b0 zG2q1zhM2+z^}~vZ)L+5WK0%5kdlS9<>69SfMBsZAG{s`%1~p!Q!SQ@cI`n0iVXlM? znq);n6o71gqa0C0sQ>pzYNnpOuR+ciTUo5X$Nge}xVXMX$~74O;GMI50t+hGjDc2} zNn{CSC^5e1Vld-FK#9CVtb~=k|9XP6+0Q5aeY40o??KyPqEc_G-E(e$Z)oZNA~=90 zQjvwdgNSY8V@m>TF%{;=5*tTn<(A7@s`iFHzUow}@bWDSs2HCr+})t=HN^C4x9`aFk64%z9|UH3X#_jdR2&J+lB?t$J05{4bWoZXoZ+Rp4$NC zsjqa2aINMMT=?t`)Toyi!U+OlZ)`NvtF{^ft!Y74Qb}meu16}zwI3xR4IGMaM60*{ z8zg6S!EiONySEZ>MBnvlIvt5x$a6y{mEpIBSN6(cGlH!AfVXKY8#&tqYcHkis*0)j z@Q7YgSduD33LOW>S&87sXd|`C`^}MlhRx_q%#x_^y7g1moLO8Q#bye&7?7DlA;*KB zyk>GWmvAEmAAC*qd56wx_IoK&$OZ0`4~dLW+87o?ctq4FDa`$@H?`RR^&hfN-f`U1 zrqErXcmQ#va(jv~upcE(u_A9Sj>5JXKvTjU^P#ZimwOUS?;G5*$*dreSbC={bYPW) zy~5~t&-mG_Zqmou2J$az5#J;zZ$7P=jE5@y$U=pvkETQ;obre8IxAT-dJl`TDBY zWSa(9HgeX4a)T9g;Hms@ngX)e&-ChE>N44esKJ90n9~0VRYi(ZOKz%5?waiXhhIGZ z@eA*m7&%3fWFH^56a+OC9;FM7ptSLFYQ*x)|IEI0YVK;x`L9EL0POCS+u-IAsa(@1p%~BmP}E2 zp9W5M77nTLLA>_vzVSDsYTEEyKSL z+5(nWkAw8kxhz0h@-AhN436MxPaFL8%x^F=N%> zm@9V06hf6{Yx6ZZ64&f4Vu3gY1?z-=3WvtZoXzrB%X@DyG6m_zVSOa^Rlfn9u%&RT&!Mo#?~ zoI&0i)Vv_9@i}IQgG0Q-#A30-qu-$g$r7x6Oi;021<`tG&iQZHTCE{gRpgs{`oBCv;h(FQW6;(! zQ(rM}d=$w*P5V8+vrC2C`)Bmb<9nfS$aj-|`f&_j%y!JbZ5PJ->w5}pR>bqg* zle+Ktll!gk@l~f`U}LWaS7#Y{{D(n)S67J%u*rsdJP^7QSIZNWFTsM3ycifu2$)%Y zb|wI;=Pr8Do2{aMcKt6e)%w?sLJaD-ti{80sEsQjE`QF$Dz2uvCF_ zjG$SpY-&;vA{N?$$5%0gK!|DiKm4iT2{B7IRFJ?O`dDl{nBL5dbD;y_lX4pWtt{}3 z-nGm0SbU)!7uam=%5y8dvY460emS6eID=E5T6nhi7ziI^tB!vLBoc?P_3cO2Z9YuU zbf|y$VK93(k|}wt<>t!#kG%h@F*!Vb)37ts8ThyZD~2l=!IN)Z5s)G5scl#(K@J)3 zabj^qLg_CbyO>^T)fif;6nvtTgBJc^o${Ruf#FuN1i%KJRNz6S!1*6Sr9<=I=*BTM zC7kA@$4=t#fYU_Jo5vWptLL+Phg~7?m^J)gRfX}mH}SWIkKioY_KXp&R^4@ADw#E=1Ld9* zbfX8EMR7V2Mp@&3r`!>I)u~I~LrO^aj@n1lJD8BRyR6^O(r||fG&rsg&srsFY@kRZ ztH(v+e_Hejt`GnX#dE4kl-2Ptvd^D7PEyL6Fk@8RI(nPVi3%w2W7fv)O?Sb^o5`N zEDQQ6Z>=Z*wvH;i{g3I~K0=IXj4^DP=N-=8Z(%gO2l`m9uvlYVc?HBBG}E)=>H~!0 z69Y{1l}Z#nuOckV@>`I93n~8#{JH-ki~PD52WpqhzNJ+ydB%b( zm4&D1xXBZh0y}C36)-rolJK8@&a;6raRjt+AOd9WYTlE5EZJZ=n1JrkvYT{ehyn*- z_fu*&SJnke!TewJQv6@7NMZe_m0K@}$OhH>($W2hoZ2`$2xa#4h|1fC{R`QnqM4MY zsA@RAQ`B(6;PzEV02iD}K9cO;_BKszkqP&t_&HOj_@*6H9Xe^!i-EV~8Wz7L6n$m2 zK&JQ~C<2^#piPpkQTBh6x&P3Iv&$g*QQ8?I`0={!DgC`tVVCVbr?!wHFHOOH2uvRC zI?(@Wu-^+(CA=2ycs!*_9<_#T1<=wsAxAk6%Z*w<{jI+6;C3XzhPGkDV zSgLTwil^@kkdSInD~3DvOF-ndSSYEU=TLUE_}d0K=~g&_k4S;iJEj7Qd_f)fj4NIb z?yQBK@V7J<4yx6o`N*&k(l1_zR$il9=}r=Ny1un7$I!Ye^VI%$=hIhqcU%wA%Q%)R zp8q(P^WQuNOe@1I75A|R&Q8xKs-xc1v5zhvP7pjq`@wtU01!$)_1UT198^t50=CLK zV2`=ltwslC#ld=4o>0ga$jMP6#Wf*J=4MU zgG&C?qCfx|=PY{EtKoF2nYjzAP`TVu8X78;D8xa=`scVvaJH6rE=@my{bIEaFmWDZjA9j!)Xq=m7X{n{)lwa{WcGw`2 zFvc5WSfLGM4xUJuSsB3N&DUS>`XdFFv|yMVeb;}HZSdb;jw%L33>zPPeK&@ln4xjW zpW_l>tf?@HG-B_OhWkpJjh`~nokfq0Z(QZo)mz#y{snXeDTw+nIJXupM#V`L68#(Y z|D|J@WvskoIzD)BloTv5MW0ib9#=chQSH;;bfp6vlIW-vDx=22Rm!A=LsX6)((wPN z@(6$5Bmu4LQ;e*iLwsh8gCoYxUr4cD6rSz)214VsRCZ9JU9uXAlR`@^>vMKfHC!=1 zy?|%S#4sQF9GxiioVo;1XxV}tVT-9&a4q<5;$}N8J&)uf31i0JtzsD3KGzR^b*`B z2h(C1Z{oVCIkegRM1Skn)R#LhtD|<{wmI=`~D3XHT2z4Tf3P1U}7i zcX%;!&lxS}H_*-cmlqG@9u8Jge?rY2_=lZV7Pg|5o^VQ08kPXDm zW)gn>3|B#DI}D}@Qye_Lw0NXAKqv7ia(F$`#N{AzDz(~$ZM?&`V%@ErLt#+9lltfc z9CuRT>jnmF`K83Qc<-1U>u2_5x4G;nt~o+ABOg7i7SAytjt(4^N;n9xi7&(jXdWHE zKAGGWJQqG20#`F8RYk{o>D7aOVg^j;VuyhJG{2O|{k%gan8EYv4|Pt^Zn!a|l9X~) z0HpaI#l+F@4tsrhexk1IuWqIcjkn4tbJ`3nN&{#_z%|wE7o>_&u(Zz4Z_q8D_Isn@ zH7U)=+j^8ng`u}E6|jCO{T!j4Lg08!Xw52iX?O{oE%nJ*Xe_t#-zt@{mN}sI9ti=y z`#8F}_A-4(MbDNC;DKuDSg70&@U8vW&_kEkJ7Np$xhKa;to$6V?poTqwVn_t0*li>f4tv8Q{@_XaPMJN?1ODKwr zDEn3lEu>*=gBFr~U#7BU#BE8kwYbqBgxfMBM3xY;hwOt8%5DnTW&NE|eV@s;IWeO>3weRtkMxWCZ{Tn-;g-^$#2rU;j;ET?)!Yu~c+Y?dV|8yfaMT&OOs zSciVK%qo4@9FOVu5RhKzhVrKo%f4r5^vNRhlD+`xq~9GVprYWpGq%B=b>YYjti`Pa z#z=Ebk?B3JGgC);{TT!V!!pdL1E6n-})Jocoz%qZ8M1)|7wGjHJBF#F@lC zoQUYGoXzV&E#+z(p$e9|i*t)wo|U_`h(R9doZAx~kIgY6t1sQ@)aFHEmTjI6q<2Y- zu}k}+RSg=wxh4m0e9KxK^sdyl;=41bt+prZ?Dw*Ko{%a!twoMUMwwXEHluT6BUY2q za>8>7k!=RKs~jVz%ZYyKc^?rP3Nm#Dd*GMM-qo^Cr2cB!GZQGr zJrQ2}l3rmOL!K4ax;Zwz&z&p&*49Xn&p{kEH$E-dQ`HC#kBG#qzZ-`s&A-_aEJaFC z`z^7<@TJT9Fs22Ualdl}1hgJ0u`682mA!Vfvubu=f`B|;<7>c+Th?K6c34hU+WWqU?*&)WaK(@V}-ABGQ8^Ow2z+s z!Kv|6z;bbsiZ7g@LwC%Q2fV8XHEcYg!U09E4Y@boSE>%-^eVy6FUz@4aiLOo4M?G) z2Dy2mV!x9tvf^?V=;Mkvtg6x?JXk+Gi=V>;*Qt)r^*ZVh*`dUV_B`kt0zXBP}*a8r)hy0)xF z1dBVq6@F^Dg?~fyl--eyRb!PIi{U-bE7?EXkd&_;HpSAob^PDirZXuKBkJDr)!3sc zDCI{s+I!x`Bo{-89J}suU2Eu;qPLCJ{d>@Y5%haxS3mM$u^PfCON6;R`*N>gIPn3e zU8s5#W}VRyp6`49VWn2K_MV7;#AvC(rzrm`Mz(Ed0?~FCi}>M?GC$<&6Z1K>?LE$v zyH#S$LZ|vKe+|$6bUd8v|3|1679WMOujkH}TSd8CkNIK<_4gHMQWi{Z^?p6)?XmPZ zBlQN4jhcK~w8GFR1ZKj@bpRE0Pf=g1E zCf-gVRG;nxWU7;qyFrG!louykt*;lh4*j?}=C6lGEt%Yq_W;UMK40kB^5V_Z*!1j$ zwa&`AnT68EC&pVG!)gzhg;;XS))|g4l*j?M4+tNy*&Zzya{v9qeZ6d}MDo}Q7PN&~ zFv2*42u<}F35Tt#kLveW^f{CzR_7*s$om!ZNoO3IwkvJcEF$HuCr8EN1rEu7spwT< z^ks21emaw^GpmGQx~K`Vc+@W0Pb_Y-2SFBRQC?n%iHhF`yBD9edby<4BTvjd(3I4o z?bNN**t>Y{ku>ZsZCOGsRbWnZF)5|O|vv^IiykTwRP z1|g(GQb21}BXYK{C#wZP4r2PJU$zShtG&pb=kj>7`}>0w4f1QF?+>xxd9L+^U%PmO zaM@MFOs}Ez$=7;((WUmzT5VwFMyl`apHa-2O3|UC*dGTm&F8bhDVSAtQ2gq z7I71^PUp(D3T>{t^VT85ATd~gZ^M2;vCo8Y=e}%X8V+4$?U!0k-1Z|tzp{sKEN^Js z~&99yXI1*tm*$Ns!cs6h@1@65;b8L7!O*3I3!RB`CW z6Uj3#9(V|wVuuBkg-;6|yU}57r1c+EYV61pbLM%cwe>4B2%=i-~P!V8zswt)NZ9!7hHnT+MM`V!=^8mETzg z?N?KgsM?$iKeQrKp50m`E#Wet2I}BzWUr$cQnxZ8B};6Q9MNSYj&sIMtOQlSJ%nOE zAL@9vvKfa(yL_Tt!^Y`%=t=CFPyf`O?U0pj8O8B66Kk-WhQ=uc0IT5Lf0~#jkY~n- z15KT!0$Rbb`u1`9uH3z6>AA^apXG?A>WR;XSYnq?r|uQZ%>Q;Lio{PtW6Psy1HB0G zLm^i-*80w(}Sm*Q9O4BXLlWWb-MeGi>+LUr0utER(sgi(+gzl<({n@-wW!Ad zW$PO&SsntpB#R{2ymR8>&NRA^@pTJ-PGzAHV;3nSn!V8QMWZ!9fW;9!HRr* za`+DzfLK)^YwrRkT}R1Am}8ye^z+be-nx`v{crbvKjCwO6QQ7xGb{Vmue?w{Rw^zt z=J4}k&lH_UkQ{q_enA<3Aeu|_rEc5UKT3x`z7MSoN2@SW_*<5suXa z!3RA~Ie_+C35|*Tp;LV&cIoFkv^4lHvl>qX?JOtwGl^Nbqb0#x?ysb-lER**Sm=+W zysMWFkuj1$Qe&7qCbx+_{fQHHqTUHEIa}auCsLr<$o{&_{AGE9da?Mvm6?U;+4gBx z;UIn3@NWGmN68|+%^8uerL9JTlqo}v>vo+%EUASYr6mQgmsX%bCr(*t=+XVYOhD{=F?X*^b@gKdJ7=D)goZ zuP3n7ZJT?|412Xx6o{_xs!E-0s-qU!q~S+ z5>I!2mm?Nr-I-NN*A%HnL{#e4kfTx<5_H*c<4NR|1`(&VUrB5Oc__h+_~Y)^e_)17 zKPerVMEB2JA5i+on3#r-Uv`R2+VRx)gWe8tq7uSRUdz2Q7Feg*UK_nU^*E)6r&Nm& zbW|eeneS%RLcDW~PPsxHw!aNVegD#O(l=&)@>Q-Krx>$`$X%v!2ToRp-K0I{;sz1*@qou#w>ov1*xfeIM`St^pjRWR%M-Ahl_~r-w`!yxq-q}XlYk|Iw#lJqcv{FTyj zlgV?Yq(Zd@EW7V0d(bxRY&b>bqeuw{eZxu~uyN6fUZ zmn6t|<%n4ppmkH}0;o*u6`Ee9=I~2o>I+^YS?`@7A+qAS^AMtdE<+ z6br%kqqFyc%I^-9Gt^tgN&GI=K){w{iJ6MwB^)wDjTJfZ^G;ZS&Ui$Q$jcrE8D!(C zW~F@54OL+xS=$PMw*<6yug$1(3Oc@% z_^UOFZ_H)0@uF=19b}uy@ni-sLPxSO9!KFmpUK?B18u(M+vjCQF*T(gL%)<}Yu#}4 z;@W%Cm;7S9Y8lwfAcy(264}omov`|L98{;UTAtAhVH)?W{_94J%Sgv!yMce5NfxzI zFosLyCSJZqJB8mw$y&VRM~zu84ewKqTUnu;etb403nWSfv0 zv-Yu8oxr~Vz)Y~lmiXkPfh@Lyf$Y0GGk%I;)^M3n%M zex3T1Hl@d8$^?pN1=AG)^XMOjkM&%CE z5F!U(c@9@@iR<;ce5sqpbZlsCMe6!N0Z$X3$d}xQ&|@ZCG>z?m#?r;0QZvFbyhiPH zw+&`vBL#If4>@4v72!2{y9yQ1paIIVaEQ#2E4*_}I`pO;F!Gi=Xg6Fv@|&SODodOq z8Z0kPW6J{cc=h!wZDEg(>Y(mVw8F*}qMMzK1S=8R5u5YXHA_&Q8Vv2*cq`cpAJ_Gtupx{(1HZ%FWw)q0Vu_+CDB)!rAZqo5EjukjR%U-@$fWW?GF1 zy`|gL0(*j?b$DwOk`pH7OAsRKEI&P6@7r2=q4t%7Z?;w-Xj99trLQGcd)0Uxj|(c~ zlN7EPiti_!oN4k%e#@u&?A{4$%~`k4jXr<~=rYsvsR4m*<=@5{`aCEBxotL%ywT#6 zzNl%R@@~ET^LTS_OIEQ{=FQAnfZi_C-;)N(IfM6etsp^RJC?GjeCrm!@ecvIC#JNg z2GpWB=;02+2UJ&2s^Vt0YgyEW8=iS&z2~?SHp#o#OT$*I(FSXGdS!o0w;b^NW zrUf??18Q#}13vCUS5a>d&-$#_U$leHHas)x=(owQz6Cj+7fhg_dFbOsM0cZ7<=cNF zk19{{hT-76sb}op!LQf2pl&nmFM5{;XlwmWZwz{~D4lYAUzGE9c9fvq2sJ;%(ojHU zxtG^#SjT)sCjvxSIXZk9*tKY)aONz^Dk?SH5@s6v)}rm>Qcq(CDI00egp9Aqgv$DT z{PkT_dqZymm@(8BeaZV%TnQ)5;_In1hpK7}TVKxzSPAH`EI}qq(MNBE$duT=l$;n6 zZAWHs1M#zAVva_FUC3pYj@>~mEtvH{!s6kjU&r@s{Y3Ar7T6uJHOOHYznUJ)W?;A* z!$bk3&-Xa+fah034jxeH9HQ$0*y5pS@7ONx4fp;0IXD$VzWEq^i508K6!P30t7-C8 zCpvaE{CIpCB(UeT+w*9;46RQ{od8N!VTj8GW6uRg96$*k!>C)>Ypq{W&{R8k@dv2= z^y?!8G+vzX<2IQGD)5*ny2`0A652oV6kXf;d7o+}f&i+3X|_|omOizI*7g{I&6n~X zC7V0SIfN8?s7(~r-G&WaH7OIw=AoU3chNw;BA|RH!FJf_E1G9(<%snX!ZD`U4#47Q zF0xAq({$xx?5!*&1|v)g-5=40Z&UBR0o-HTke=Hg;urY4oo+!hKsUEL)OLpD+LZDyNFC zr?)Jv1_t|=Ro+z(Y`}b~PkbcY<9%%`eO{YI^!=e)G&HZ7s9QRVDmY*K^JO{O$!S*W zjQg4JSXZiy>;2FYOvtwN@lm{x?=f^&S#j2CO->l?HJOFTE+Cse!+fz}#MG0^Gb!q! z{^(sa)U87_B#Rg_WqgJlVxo|Y7IhqWXW1xb)Wj37yxCOo%qt`PnT-Y*n+1NK1G)4#fsKYHgBC^qTHz^r8Y8+c zXp4nHP$zG4>fIhO_je)F@m;NT-JZ)S8VSRcUie({7mNaNjD>n z8Iaf_Gyw#F<|7Ra2~hWpr#9HrK2y8BRy6y{)-S+o<15gS^KGx-UqMpq-}ElfA)76X zwSh^Zi+$RMykf_G!>>gwcE~4X-Ffn+{pu1R(Zhqs~dIp!{>$bBvA5i1 z8ah-H1h!F-f&NdVwajdknB0cfMkgxx!v=~h*h@W3wBY&lr^mSaezdG8e8A;M z%w;OOy=gxn3egn-0dIlD6fPy~#b0?um+`c-6zAdGCH7A1p4SSsY25qs=hIf4<{9T9 zqrAqJ#>ZCJiX&&HJ>KEx0yit#^qPNaIj91@qDc?aih6$Y+wNREK@MMiW!qU#n<^oJ zU%2w1=%_rtnDY`-G&;+1Ml0*5mRNr+KDSGnI0l7J!}2$@26`_j_MKDgjxpr@ihPY! zTCBn;N|qf+)rn&>h-E<08=C8jadX`b`l;#^7BYD0#0Mkh75+~(QpBmKfp@Uat^WHM z$~%+tiVn}YpBqgtZswz^*aRHef_8LT=uIE_H(DQe;?{MV{vi9-X6O&yOdu!+Ar zzRq{Q=zLdE_LjdNDX9uWk1t>O(I^8E#SAF^V4BJJ&@|VC6JG5!Whq4`A9?ie83>gS z{&cbzDL-5E;r9={PI2R#cq>cAAavzN%NVx(prABNb`XpGO+(uo$}q`YhCTkF|H{wl zJ+MC}0t3!zwo-~y!>eaC%Uyj~VbUHd2WGPk_9?b)33}gfN9JP1WYnJT&;SG0S&hJE z3ED&NGmh|ui#wqf!uvDo^g8d-<4Co`CvlW&MU@_1*tg=PfHfY@TG z0PTZ@InGwG{YEG^dN_iGid#(iDsi`EDy{_oxPiZ>BipBf1FtPU5HaEY2z?1plR}I=WLd@!Q&_p?N`Er2zXpGrIY*geUvp8$lLL>b zZ@m9{#XnY89`E4$D?8jA0_os5YzePzd>-zTp8a|cHDS!fd#ggW$8&WqvFF7y&lPW! z)qbj)LyB$DL5Jk|e>{K9svkDkcl^VTq+dINbYSewrelh5iYt{rHKHN3u^~7B$-Rvd zTo!w$=jj!glvFmg`PtkiX-TQzekT zvS9gJXq$66{Xu#GKeYfCq0TK*oS_0FKV_xY#zs=X2^<{kIx)6mxM=i1%#f#aC6ch# z%2S~vyBX&a3Y@a|T1{r;}%B zt5SJfW8KTH*n#G9veL~P`CsxY;v8JmC8(W*;%oB6=gv=*IlMHG4UR@%^pvK9cJ?B$ zL4S^UlMYW-_@Lay2O3C-7b}WB1`w3ZI<^@_I*C(XS+e4sfhkTfPzHMBV2XI_hGV`{CPhx% zHku=$lLSCz*(>)sCg@J*g{M&YKaeb=e+Cv;ZKY%YD$DM zCA%21at*Q>b4uySCAX8Y`Y7-jQ*J`!DZMH4s0mqU@>0K+?Ez-NnG8zV#ngOJyb=9( z;|S6=2+2z*VDUmt(t@>iTC|)ypnW5Km4~Cz%^Pc*Qw}TFE0$g=qo!Z(K?%lhprV}R zn+wtChX?R&35N~it^}86f_K`oP6rQiTz>E}>G3)pkn#a&kytcD_Dc!Ik}E3iEqx1y z=Bj5~FRTxeyMm*@vFZ>fdi{joFp7Tfs0=Z~!4%tO-FNr$kEs^U(#}42MuWD;lTM8NOdCfM~%*$77d;DR#a6MwKN(cMP zb*}Es8cM3!?EawlTw|oY-x}I8dx`j48>B|d`ClUy??EU}Q>;zWKn1#1)RXg5S9`_E5Tkk%bw%=oYjO64$|pv z@5K6T7{5fRbLer5VTvPzzELR>&8SAYbMzp0iu2|uU7AK|**JPld&}+i z_5dNF6+S*d;w4k=avncxlI0&90WyATU{UGN9IVh!|@{qf`FWzI!~=SveI?AO1P;vOWf43`w$ z!)dg$4f%+_)xQw2C@M57IsMH`Q|5A0_#-M)ypzfu$3{Ra7Tb=XH6ja-v9Qs=)U}fZ ziv%!CQsCl8#e2zjzxy>Z3o*vIR_ZcD$a8F7uMi!s?7ish12a_!A`^FB=ITH<^0&Zw z;2rlF54q4@jUlEQ?b>OD{IMEE6yJxT{^rKDF;}nC9iW;?qoTBaeCP~ohO1gYN7WVo zOO*(~TnoF_z-J&GMrB7SBmqOKOR>m z=rcX?cv3j<6flAsY2v=7in9Fqc`Ktdf0WxCv1sm@0de6MM{Cs7b z$J3+3hdQ>%0UqvB7fw#=CV!<)O(ki>Q=Cpl9fwlKf*2vskJL@9=fAT$3K0DaXuRP^ zNpkJ6 z4;41I=mehFDI18CsY?pC?Jq92b%3K!k&X%>zUWlI?Kb|RmT}@8==)E9Q9Vw_nERTP ziiZ@Jr)c8`^D9LO=ODS|(SDH9>f`iL?dd-Hs)Gv`n1fMKdktb~0HNSN&FSRXaY!{Q zCGe&MkqyI)n`5cd0)@daLmTF|fd?5@}KXy&gx< zSKX;tE^07MB-;y$>P9L(xC?YHA@ae%k*gj#ez+e&^?+|gZx^#n3@G_5fP-FWKY=W| z(;fviQ(FXWaYhJQgRScsU$g{K|MOm)DvnAH&11*~4Fv+}6K7)XudnV!6`Wa|sYXWs zvNkRmP6HXc;Nb^WHgSg72Ux2hmA%EadsUCYxVX> z9tLZLR~tRsS!+>~B&6p8j_T(z6giXu>rM^W7V-JE{xd`{B-*4=2AD5@KQ4ZU><-6} z8Q;0zv$Xet3Isk2x#ikm1+B*eckfh%uLXsRGqivf!Yg9WnPP=)IR@7X!YlyXIADWP zP)ox7$d>17gcG*DKH(t{>o4OyDa_e*21vG2B)uC*7GGu5v?CcH1NhYdt{&vga4flA zY3VmLvHFa4=*@oZg&smjVG`{hYL1rS?2@tzHm~v^^MVN!tBgi=CfJQ>6kY*v^zw$d z1-1)d5S1yjy6A4MwIZgUddNKB;R97hvwt2=fT^rp6gJ%KxuKSzU>`@;Bk0rr^^40D z&CS09oyjk|*ukLG>i$R2&Zv`dWX?3et2Y}#x;MwN|6L^4Cob-JzKZ0p(?1x2fs(&F zY3&&3WDL3f7{EvQ>Rux(uIW&UdX@jp_%Iz z|6YJ2l?eBr3SS+3?(F}p9wZl3^qqOkA7p(x0{Ik5kZZ?+r_}NPU9FF6@T@)`m<3$A zDzU<*+e{ylByK-g=<~slq<{u?C@};$vF`k0qU7@E->n64JeKDcq|Tjp2myiF#r$?p9Ql{8ONu3VpKf|Z@;$%cPfWQql*cAz)2=!X* zdri^-RF_G@@7|34*9XSw?{mr6NiM(oC#&2edFCk4?4mL|lp{9rAck@rWpDr}Uq(V$ zH?5;qq}9Qer#6DaLi-dkl;H?ZnWwGXhlLA>-C2-Uz`-iC_Ck7PT}t*Dx{Dt0NRb4X zRH3Op>|o0t2>*AG#D{ws7pOHt33`*_(c=Uw0A33;4|=2u-1+DR?*pPqmOvMK|LHrHsukh;mW|88LkLID){qh3v9o?V`*FzTX~f}(W^I#|$4ki##u zMWVYt=(&Lc@o+1m6hSwv`@32`xl#3ZV>603F^hL=!{3dgZ*?p8G9sN!KN~ZtZ!q_HNWFpZE{Ioi8JmRN-2y>RZ{c7@e$^!b9KVE0Mi)zs#gJ{B0J0v# zkS_muTBu;`zfULsx|(9?2c9lRFIkdouqLs_c^FEe1r{Vf_MPPST8{GBAgo#SudxFb z!Th8CXownSWp~{xMY1u0nv?;rph0juW9KRXy{rzD{h#bHN{vg<+n^%$?Kfzr3*PxQ z00YFHnPDS#y6Km?WFr2vdB$7c!><^Cd$lo-G%1dskeQ=+53B@{?|*H>u6EOG=syb} zkL0-xK-1omKQ_{6ya!MT2AFhc$BOzY?|>DH|HaTLYHH~Mo*L|gmF5voFnU-i#tJLA z7ujG(b`l>br;o?W?I<+7=R#yX)xBeWIag<)z5Yb#TN7gYAliSZtKQLa8>H_1 zzzJH0TB@L1znmxjZc>uiJaqdb!u_X@Wo7F`HD+H+=Po)k;LRtr9~3Q@TSBzdJQSy| zokojtyFdJEy)zmE1oNe0j(=7D?;<3(*fvg^X>>;o)(=v2oByQdGFP)+S>enY0(rfY zQ46!yP0E-?reaKpB++KbV;tr--rz_@rT^`TLMlAP?bRDOCfrz)!p{hn&TMuA3zwjbmNqnA)(jW^v@n)Y1i$ zS_Ii4C;mzbV?tm|->XY77-O+_;N_m#=)Vn=JWc!NDB^B77GEbz+}`Z@clK5paff-# z90CINddeIITT+)v*!yQxA-dV=zzU{OWZw@n7|#Kd7mw%>2QVnYdXg6HdEBi)LGjBjBH@ z|KqsGLGA*}yJDmjJK5dUDe{WGe>a+qhRQmmiQiwNj{)=nEV&6`enq%zJ#MA6a|$W^ z6%}R9Ul5}Yd5+tpNZoXcyW!A2m~=Z#A)O!f>h`pxG~VU0*dH-KU3~gS0w#PnhSFAg zSPfLNrsE$Qfk9+D}RoJUUZ=h(p1rn9F}F>M^b!U*6GYs->sTSEg;tlooFbiAtWthyKrB z02YBu8$x#z*XeWR= z_QPI_!AIOWRL`z+zqVRz48i;n50qRv#sd$tgaD2^fjzYkB4M=QloTtmSVr25bl^L? z#Vdk;9&PXdcf-bGBaKzyyhK<*F#rv)m&y-$R^tV!hZuZS7wKF>?o2_0)Z-%nNT4#C zh5*!F{!^!FNe`4i#+m&)`Rs>5m_gxfn2+HS-?_iWUW*xg;9yq;TN_73mRe$2mnAP9*Ijso_#D zU86c0#3aRvvDX0Qjybk#r=G@g`haQ(FJ^co`7#|je2_c#)BmESjMoBdLWv{0q)#Mx z<3d=40O9~Ku&nq+t7K>J6=m8hbZp^+_Wr<5NA{Z6$cc0#1cFC$@P`?2IhC$7m{Oq$H92!8cPXP|d*tOxmeNQM|N`!onc z`i^4sJ!*;-4dV3x*Bz02y)a1vTJ^-ag?7Fw?cle4J;1FJ2Fypl*RiS``AvC(}r$v)h3>ZkJ*l#rwMCf)J3FY>4xFxy?xqc?x zK58IzF7kvX>5J89w`|wB_Kc-<)Rw{v%z=SB7!l{yIxY^~;>pN^*I19A#9M7SsTq2| zriyk!v+45DK&Q^c@1JZiEpD}h>*$H%$;E>jtjAB_t?bFP@F74&weG_u zTV2?+JckWvKa9_pBT5@jAQ2D?FD6ILYbG`8 zm|3XX&}aC&M@}~V;qji9Pp{a%TuiC6SibEl_9SBuK^`9%^nA3Wk`|_ANs}OUu!M%) z9xzpjvNyw8XQ{6}zolNlK9Zjuh>jAm%ZajaDvEt}?jS+m@)x_bh`px$CELK(+wD9x zL++1mKrB?b%&Cq_hS$rb!1db5cEg@w4{SAoZ0#gke{>H<1hwkJ z#e=b*F}&zu9Xxnk#@-JdOm##nxI`%m4Z2*@;f@AQ7<+?o42k5n=n4;JIk?Q0mt?LR z#^@Im64+K*)k_X3fE(2XzB3rUGH6#V=G2ltxKFD!E=^P%VPIJpxL5Td!^zu%et}Xx zkD9f8S?iE#j z`n-i2t_@;6poprS5ZB|RrbppRAL$HjuKF4LnC3oLkXv2($8 zPdZ_ObxooWJ$FD#{Eza(*veRK$)J>?Mg&LR^G_Jc%5_-5hYR+nnN${v%6ip=gee zbytdASIY77zq%LPbSdR%i?2+PPka6(?L;o9o8(a5jyzc|^)M3BahFX!P$S0t8b)V7U*R)}hSV5pHfo+Jh*XC!$ zXT3c|C9T6@V|hJ}ye6a?6_cjfpze{O8x@A{yv2L(b>`>>hLrn@#L7r|DH!YJbp0^Q z&031?YEj4~Xe8;r>vQe6Ss6I2Yt&&KWb!CTJi|(_BrC+2BkuaqcIhQXlvvW3oXC2>zWE~ zF@?|L2md#&am01RC8?zY*~*t8vhZy!Q&N6%S6tF;96wL=c_lJ1mOX`iKkR|gOzRBv zsetorZ!D;T?Mo0_e$k&e`X_7@)N&ptJuCMEda$c=seul|C7Y}Ad>5`+ij>vis*x7= z4s%%Iv_)Y2_O2H2h#`&bWH*S_+RTRv@_&sq@7#{{E9qI#1xe zx0sJIa`zpPAw(K(1bNwEdvMBIOMJ8OhK=Mdm9(`ua%XIiQdSX1Tr7BjpzwvE1;i12 z^^DEAypI*;-iINH;{O+8=}wCz1#w|J>-VNu1v}YpB3co@xmjBA``Z?g<#0?N^kvcV zPAPiV=l!TICIf)3f29z?7aS-e)jb9<{=ATGvpR8OK&XhXYTTOXJ;`^Q%xn^r+OJ7ETIC0DW0OLfJpd3L}XtKtO2>MFK_t-534)qsOHu zf212ZTxPF!%O;bK7RFvqtklF%#;XrQFITk6OSk*Hf-z39mlqe&KAx7UsB^O zXN1e@#HEQi1hqtIM4rB?=yb&PT-WZA-7Qe`igZ>cLj@m}$K7?*M(42I!Uf@x7rL1* zql2`&$R9d1BxDHshmn7=rKPthmA4P0eu1F>b-z?vFnZv@UBGa17guzIa(>P#u8PPK zXH!v2fk9|1$nio<(XWuPAM+`m4rvh)1wqVRPQugIE4*%yw4wV-ERAo%Z+ypw$ADnN zkT_&SX#ZdhG5pSB*#NDB%qaHLbZJ*L;I-AdfE3OmU@~-PwjDOTln^N?@Ha<<#&EeX zhz#6Zw;X(BemTQ^B|9<<_q(Jd4ScwKzK;xE<@hXoK$6H>iIDD&Kco8-D5Ul#0!JH5 zRV9*a`K3a_1{A_o?)-XFvOdLV@6sT279^-2W7ik?#x>|+J&LPgR9M-yd1hcvnpm=? zKVEOY4@bVhxFhxM^iA78ev{5twm)O9F^EMGB?i9wDD(hyF7^|-1)IhoDeU6ZIjW1k z^M-S#>w(_(zD)&!ev)oMsTcVub(Y3QEFYvM!BxI3V;$_*LvmqgrEI3S_Qh)PjZ`FGYU)wwiK-X4gSQJSS`vWmf1pUy` z*L0u5?!%W;_!)M@XMNnt94`R0NL$Bywi=1BvcsGwussU4hKKj_$?xF1n59MfIeh%V zeqg}MHvYN}Qbb%D%Iyg3e^Gokm-NxOLaL$9Md8R z`3-;Y&~cWh9nbBa-Vv%P1iH8wbN}s8lv_8rf6mN%_Py1HkVP5kgH?lzxbfF7Z|Anx zpsMgv4-4=22CA73CG5`j`o_{r{^%vYcO|?s6UjB6H}&f^Tox5h6b1&M13%RWSP{ta zB(#$ts$fEj7%HxKgEj0chuorlj!*O25jWIWk(YclF1BKfV&E2jt8yd$hIrgQc{x&f z489Uks1`P6k9E<#ta#j>@$alq0Ghsju{wXwa!^05FHXO%?;a-SX8E8*B7WjpH}8d; zy;#w&ug@Hl%s&I&GS*YOvrp~2eF}Fh@d$>*^QyHV=^UqEU%>14H<1$b|KzMaVx?6lyBQF(SY5k?+rk)Z6m#maKsH+nJ{VG50q zOQ3Cw>fQ&xZ_3ywo&RUON*@mHs1Wo3pojbVZzxv`ZFyj$gb7r5{^arI* zh0W+k)6$!spW*W`F}eblk|p_gqM)$NYhRuCx*D(2XA zUKD*>Y%zw^eLgR$cDUH?i-7)Ih0kMGL30_F>{mG&pKQMkFZnkj1BaQEIQqW<$2%Axeo10nFxsjKo7RYO^PH_=$1q(r!^4et z@%7+1=1uDz%ZZRa?@XyLo-Oxfp73aM|n>oEHkU?smbZUA@H|h@QH% z;M=%CAzw|@{om~O5B6^Z@^JxwFa0@jAPPO5FHO`7Vm_+yzerxFcz?aL&fT&p>HJ%t z*{*gH2xBoOHqHASj}!KrW3zlNkKKCH#Y*B_GQ$FqYJI#YNfQVEClYkx+RVlY45d#z zA!pCk8J4(1qorxTKM|i=Zc7TL3N%$u1l=qnWlLs8^q4Q@6~Dc;ss7?|Ra@K^%AnLo z9TsU}C$JH0d3730UUN?lZU0ZTv{hbPwPfU}70T@%;heA@dvuPx43Wg@oGYR4K;vzH z;qH81N!rs7P~+1oH1SGMLXJY}*r&FjOW++8n_&+`un;WO`giW{LrM3fuT41oOKQC@ zhNc72sZvp^k!D!!r>{!g<{N!}WUhCY!=D?eoILav$|W!Dp_2((R_>_N#l6B@L-THK zn(-^61sSJr&pb0POOe>`H-IGcet=5jGg9Awa9fUj`}UgAs%_f>tN7yGi~ADytbK6L zjUktPMF2lK+c)QdtwS)ml@b{bxij*ChJMSmUaXLtmnO!RF-Kw4 zpEwsR^R)dXMp#P36iy*sG{YV~n2at^)CC;0{la9@!#In0iyHue1dNi`E$AOrYC*)gxsW+8wt4LB+N0&(eML{0q$%qGmh?f`fr~MqtO~>ioX~Wx~sR^y2$$nN+OM6@Vn_ zS)xRbQsBko+SWM|<}L2c&xh~tewx0ZygZb%$*1BtiPxLp2Bq|UB``*PN@jbk2m18V zgc)Jp4*Yd4N=idGAU=mZYa7u>5ED1YTW(0e2ygMeiBk=Rlf+#Dkdzv0ak(J%k9Onw zq6miT0ps&@vlAq zX-eQfUI-{5%WZ76R3?`ZisDwJ0>_U(GIVyhA$v>z$N(WNt*QB${=0I#{Z8l?p zEo=ToP<{@3CktDY#(tdY2BY@J# z`e3Afm7|*AKG-eG1F>rF=ZjBK)j5CXw23+4c$5z-mFdE88RlHlmK3!}-8L9Tu4$>Q zQlHaxYG3t{$uw5EAO4uXze!n$-Fe~R_Fhd~pXO&ita-=p*duY*kJmod@~`*43dZs( zpj%_!BXlhwXJ}&BHS&2}G+xG|(D-LsD*8(? zhljn0U2Bi;p+!3^-oj*g%Od6J+sG{(Q-*%~?(P{FKWh(?UZ&~8~R8~IjMM6 zuRk%9A>&P4F8m+ccqcU!RF0??jYJH2W%WZ!nIWk#;rSQZU7M~T5cIFxQt{n(sRJVo zM@YN>8L0)W|CLJRzau^WAdjw$54&uImWwGyjI}8&702Kh^LFx%!?~hXv)ml3C6Y_r zp{`e^;3_t2V;VN02jkvf5DK9b=#Xul)4XZImuB(%Q{4|9IzoTA-FfMT>QVu$YNjF> z-6L`2l12Od)PYB#3IT?y17As$j>WLs)@sfPSnQM2Kvfr!98-T)rK)7Qe&-+aBer+d zHATs5h{WIYMv^=>H5J5`{UIR|>fSHAJb_YMR?_iZ0I!vru!DdqO5Helv95v&ONXn2 zx7dmO-4!_Y|8%aTZszZlJh$L{-N5%F9;~18d~%5ZRwt7tj*6i51uSFo&uHrV&kG-A z0;?sy!fcL*Uh<2imseQYuv#Ajt4n?)$uko!G|J(RHusi%vlV**#>||fg!-N#oMn_; zO<>y|hNyB-dqBZf6c?59=lv0yk1*SDxc6IPUX#H3&#QT>31D|=Jn0nvS@Q~h6n*Fu zVmFqFT^}1PeNt?l5r69(ARsw^$DnnCz$F&fhs`^XEI;WZPL)YzRUyZX0?KDPUw%W? zZhy6?Nzd&lFQ?{S&zw7opS<+Fq*u-;{^&0+Czt@c+8;<_;Dd~JqH%pasrpEOUh*vo zZ&g@2s%(jDRRy7^_eM;?DsWDp9GkJs(?75!txYQFIZ7Wbb7D0nbJ9O)A}vtEe(_BZ-uwu%_m+Oc&@nrb<58dhd*Zs&UP~YLKK>JsA0mI(aK}9N2wH1jk%0Uh0^g1o6l|yIK9C1Sf zw~Su{9C=n89p7hn>;{>jcEPp}2spAG6RpUl2NUxMTndXMIXkbAI_1zEwLHXu-b{Zd zKzhJWd8TOsV_D7oNb6>X!qC^DfJPtxOa(t*L}S?8C$(cb8>Xlf9Cv?q`7S7ER9uLu z!=RveaFfw3>?#g0tDUb`S9BUF0mI(j?kyc9_2k zszp3*jnd8Y(z|~R(9D`Vd4fSETrZmUu@uOhvmWV;AnRL<;Eb&f%0!Hb*}IdYpD|t@ z#aKdD`9CG~`4%vd@sYDl46;63rohRa_ePZ%T!N@;U>Miuw?Yd^_F~9VtL>*Y*LpBw zYeJ`Q@zy7(+NXWQJaz%k=?}q}b^?JhUmP{J#7F1clZ;{m_5zj)Fn(+s_`IT>{;Kou z+?T*w|KP(4r8K zLa%e6kC>b;a#lSga;Z&)LE=G74kEe69!Gc@Fl#zTRV^5j+S>%oyFocZeQ&iSeJp!L zIb^x2ZIswS5)8Y5K9twaFM(BY_6cz0 zycDeacUT9zD)H@=BU&*lQj_{A0Rbje0iDdr6dQH#&V2ZO8$)Cn`vr6C1Bz`06qfpX z^{>^I^$uXp3CqC@dt!6*o3`DxE*QPdT6@U<%R7Ogtn@)N^g9u@HnznvNX;df_MRRj zn*frL*8Lif^tPUVONb1cyL;*QRg!O)=N%9M&w3d1e?RAlx)CKfanArCwzsAo>Jeak zR=-5Ct(Y&F#(~29IuW|HYt#i^j?e{B!ypWyJ1p$uZnvx>isR_*bkv(DhZ_;h(N0N~_ zi11CDp@J}--aF7NGr7Hq{@zE4zl-&*&3m&ytOA{xSMa~8kXdI?RHeOy!FZwn5N~U(cLv8 zMN94dII4M)moGq{t7g0jfw(^H&)Gv@7l|Zs6z~XL?>OCQjfx6xe(YGi*+@G=ErkNd z-L-GXlz-R`r}V1`{DQO`sG+;*PxHBShd>~{t?J(WO zCUZjv$^cKd8oNp35o2|jJ3@50X9%7G;YWh_YIbmB@>Q6#S2jPpIOl37*pO)9!{%Ov zZMTZ1GE~1yPV6&_qY6HQex?a{qUFKMra?WN@4qh$Cr^fDVB+r^B&e3GNFG9&5Q0t% z+&Gu4(Ft@2^Q^%Fpc)I2qMnb4?82iVAQVAa+8q_YRE95Z)&5>E(_-T$rg3xs?r=M@=cy- zzu8w0cj@+YJ0-fMeCEK^{8U;sZ#;Dsn_(K6RGB7V_!@VffXK}6^?2Gg9VhNaS@TnR zbV!+nQ4tRoz6dt9U1=ipd=82lFde15?De#fSK@!nTISk&>!~-y)nG*-Rhi<4VcNx+ z#$IiM{rt|6QG=P_drOHk0p;0t)?UaEM?!x<$ocj=t$&>F0~R(#zfb%T^ATZ+vg3>I zdz6Xb^!c7%Qj7LD?s_wSmFp|7m$6p%9+6bMrEoZ!Or6OTca=e5!td^@~zOQe|}%Rznd84szq8 z%1qp>rIu_~w(oV2gU`rdCVc}osEj)Lc7HvvWpV>_8Z23IL9ks4m`pdtsk`YQb8p=j zH3M^AZL!o|dTxQL^;quBcPuTfNQ`Qy4Pl^g*I|a{-Pv{JwT~5B`O^2t@&kejB&`hv z**mByxIl-RlI4XZxgkKaX)I^zSUu1o1=77meAr(=yMi3B?Y2@0@g$IuRX?HsM@xYI zbC~9a(6tS#xe`@n-4A*2n|Hi@;>c^jmIUM9%{u=Y3WXM{^s_y0>+0SA_&+RwVE+=}s7Ad@?x<6z zK?XK#vr?i}h94Kx7S8(J`E)WpwY595S6fj0*iIg_$B+%`6z`uU=JdhahyrOB9NSTQ z1yNkTkf@5ZiH~i-xYX_+!S#nGViT6oQ3H*vhiR`?;U5LEq-2f!~7rF=-aT z1WB;s0K{F!KYIUMv%zc?jth0qOCA%4vngBZ>jCHA#vAgaNh{^MKh!PM>L=6w45-Fz5M zT<;w(iGzP4IiA5D)SIGQ8LAI=nn1ZHAt*mT>Dk_Ey}3KY7MEPJOutTbofq4+%#8*S zaS~mygj@m+2Kmg0!3YihxcT(YB`6}DdJLED>ywdYYcNLL)zIS!M9lK2#r3(^qDEvp z)&VZzBT0<^D3AH)PQ>f8-nb|Dh-4^mg%%?iTYyBMX3`L318Db4p@r@B2%O1?3CvK2 zAp#yb?g1M-%FRHU4F1HeZ{nzMp@naOfN`M}A`bvf@3|4f$H8Y|ArTA!GdSXEbf%?GvL^wKk)@n@TV99+Xnl+`@_u`Hy-W>O%^CtO6WF7(i->t zBKH1>=}U7T#aF<`%ip<-Qz60gC-(%g-#D&ak4IE%nW0+H?i0s1Pp0xTg+GFNIr%_+ zzN9H-3$M_eevN|nDaEoFJ(#7l_SchMD{$lu2Zq*T##>XqfMN_>IDj#tc}!YybrDP+ zd=bvUEq8*Q=^=8QctR)Qk)Y*FmaOVAHKn)%>PL$-Fv6!@^RB4gPQ>}2v}v+innbbZ z2s9=OaU`0UdeYwtby|(zNgcM`FP91aUF`#}Lt2UoVi}B3jIq9Rm_YCI-RbUm^{qs8 zIjelQK}m%^!Q;n1T)IM}0NW1h!$3aeeAq2u?x%6)4w}lH{Z~^^8?>2b@2p>PlU`gm zv5z4J=6n@LZ(A@TRJq5c{jYAbv%PW8!frS)n!((*ha3ZQ~2Y6ubtUo04;zR+lFX z1+n_alby0)HBOK!sz`8mXDF$XhLN~^gQ9gp<34u&2ku=BFP@~FwN#XI+csns#7e3a ztQ~}k9z^);)&BaDMCA{TB>@MffA;zOv+Nli+ynk$PkvWnNrJs*NnQoZ`F@DE6qKwe z@`3yOKoI4S6nv>)?|!nuaBULg1tXVf1SRM3)SUZr)yZqaIRIO7OOALE( zj!4V|_GG>_n4$m|3kNSC{?o!Vg|SGT=VUO~Cy52wEw;N6MF>`!{%e>K9y_pMO-a?rzy!8-v~;)1mD*?2#H5&uve>gk*% zf`FWQFz4HQ$pFWJ3Qlmm$c(H=gV716>wEG-X@G>hLV{h?id)#kL&bjvV5UTGT5xCK z#IR$Y%*0W_uNQ&}H5pr!nXS+Fp{W4B(Mob~#OZflmHEj@OR3ls(FL%ffZ58Wet|*} zPr(5!+;p(Ps6}wf=w`jf1X$$*9v8HSb3JCQ=6iZ7z!PvV5C`zB3{UUN0*1l#5h(I0 zr6hW|5pzf4x5Y*Ev7QKRh!nbr6Z(l5ScUPH0`&m&#i^$ebMNHYCV$>ag#Go%hyn01ShU=?+rl&{Q1dD4?QJCMF2GM*IPDazjd9M zIUmjuFzwX`G!yggD8|eG{V3+FnGEhx5(${IF({F+^ZCvW!3fj-X#Mbl(24ZV6maHU z2&%*YC5X_`jPIK`1jVF<{|ZNZ8juV^_aQKzBqVh0cwV#)dZ}!`<&$;_|JVse|i><|}{(T(684@2h{RVp9$Pk5_4NWhwK9iAK z7Nyz}y9fNV*qq)K6?-y1V&TazhNz^_y1HgeI1Oxj5NrZ8TA*ksg75<0_l#Y zntbGff98@2p0ubCLaF?uOkwFd2>jnbYlOvqfl{Hm>@8d{f__IMeu#jK4i|~CDRF^v zv=%M5{;Xpi%&g5kX8#M@c?bVDdiQ^r(_0}qPL!0UC`6e^1y7>@Fpx1e(^3U&t>MJ8 z=&g>4ubmjuQ#c?6NpA6=fkwyZp)Y*vne~aO839&sGMV4bLS}NfDPiOGi0gB3-(JZF z0Q$210j&Rx=5}p<_zT3{v+YLhe{F6DXLD!)nDcG`12BzCl?ZW_@-YHZ($GWJHm*8x z3DQs#rky(NCQ;od*GXJKElPDX;^-QfJU5AW4T&K$$2DzVM!shJzr+0wQFidEv?J`f zNG>U%MZDGo{(50E{vQ=i!jmk(>QA`~`0x2{aP93`;3|KgC#J%w%WG{c=synrM?=>i z3Q+=|Oao<;jI@6|?C)cYCy#;uJOll=iBgc5S>yBpE+v)%7pCBRW;WvEn-hc#!XYF$ zOWBQMZ)}~?Eqc#n+GIfZ(m}USUu0u z&URY`J*4Vz11`=+dkX?G;6!i-d;AyqTGI!~y4i5E27m+xBYg8euc8g$jl{j`Y$bwD z5ow7_b>T9bQS)iW+;`K(JXR@Q{y&6d1oazFDT5Hn?MO=oG#)6Mqqx!P*nJmzPlk#u ze@I{L5{#I9VE~N#dOg^hbVOHx_9t;-ww!H9zKbnFPqYDp!!7{Pp5?e2*V<@s+6_s< zg0s4RsRI_kTZWS{LI%ALi0LCUJFvS(jm8`L{YtP^_F5Udj#wUt6$B9a8K_PAuOYk4XW~P~fm>QzvSL)jUeJfbO~q4jn8&HI4T!_YGJh9sCa8|7n4r0481& zlsML#fsp;18~;bcpV)C47D6svgAqcX{zt_^CyM&NQ~89%j16ZQxBu^K{yecJF$GIf zG~UL4k1|+k5^TaJ1y2Fi^1tIu!%Y?R|6@>6CnA7MFK{tX_WW<-VB$zR#u<)Bg2Iv( zi2isW`v1$`qE74$Fw6D^482`)b$mh}sGtC682?Mb8Fh;mKqkH}bJPUn?sBj;T@MK8 z{U5Mmu?#eNL29oI{l|V^pY&&ouBZwH{`G+en-gtp6_T;YZ1fjQl_l2xnqD?;JkOhP z3nGJWb||%>!arrtz6h-Jzx&LJ0QP};Hipp?cZ9YyEm1)rLPcaDOyEtR)B~3`M(j2v z0$R_;VEe~fg4IqU3%HCe7E~!3#qNabkBfSdq45?0Ni?NfF`V531bt8Qui$wnf`fI# z;w>!LhMEC|*eO%Izw^N!Q4#!qEjkB!A_8Fax;V&Uo2DaH4N(*X;Ho|iIFdx_jaS}Z z7uPwN5eBqK3|MUUVSECAhlvVf25|i-OZvYX_O=7t#ZF0srN@W(J{!Pydgr+oQbPO@ zpKh`-Sp6N3=E-=BQIOrhks=2#76-dwV;D;~MpILBhFeRUNA)%hjWFqjs{?iA!5I~N ziG4*^Va@`#vFi*Cm^)nga~Kx1w*bhG65n$d`|kSf#HoTcC&hYw6hkOq3FyF_9eXi8 zAwW_b_|0zI`GYTaZ{VySR~|pqhv9-&t37rGf>Oav_AikqEc`!y^1J0>S1+am6lDsY z1jm!U{y_wS{3pY})vgBsxEk0P#Q@&J{wJXS3zJGu3?mCs9U0emtbfE0BXs!3BB9@~ z^}7jh_&kNBA7EMJ11|gdE%!g~YRJc-PYLm0Hv;r$b$Nh&R{s)A+s6p(26cfOHXE_2~$KozoIo%K>kDdyr{LNhcqlq^s zI{O*dx6zh+;+7}O=D&W2061W10Kj&FqxIj1M#SPTfnfPx$mnrmMWKk*QBQ}N!{liV z6gd9_3h&Ka^@V=&B1sx>T=8E>`n!D=B3Uz`FS>DHPZZRi?biLXCiu@t7O2CsfJ^nf z2tsh8K!pOhVHT`+!95%Q#)ea*xL5?J7r+dPe<1gd{y+Xd!iMjO$ZyyD{ujJH)@|Gd zYHr;Sz=Fz0VsM`I-|sqi@~)cQHBs03B{M)xr2a=0fhYZPqbr~)A&|h*{l8)4cZ*ms zF|Q=!cRPZBK8^oRC%Al`)HgotbRfbTM72-1Z4;F4A|+-e zdcMO|N5)Pie%Msq^CP`#4A1noOfK^y4h!L6C34LW1%|WW=*3es2*cqPs718yckKygLRVwlMl(q9I&GmNHBhj}E@SH#}WnjgO! z$j1{WpE|szB~a|$tUUd$UX=cpd2xDCTy^@*by4Ev8~XWKo#AvM2Kx_!FXGSzxdehr zJVIB?I(Y&tD8V5outMV(lCbcd4ISCzMB6y~2<~Mi(>;OcM^0{w58ls$NjagvD2iu8* zSCLEB;D96a_GY-w*Yf?wBZkADk|5yHAT6IH?L{0}HO5=3)^?51H}j@i^vif&NgXUs zB(t7V%_j>*s9B*#!eU@fSEbBOn>ELfp@uWC)e2Tg>*kB|w>>`YWs>G1q62&M%nmZi zsCg$U_A5O6)$t3zU)`6;FS?ZLt>3ABA0&Jf2VjtM^#H~elsoP&G>%2ol>O@bwF)(1 z?%eE7?Awfz*sv?jouEpYSWgME^rY}K@O(cRAHuh~@a44^DuJwkx2dwCbIW(fPt$UZ zw^agPRa|jfdOK`?x2oFLaUzY#(#p!BK#4G^n17JZ*{GBLU8#7z8Tg#6L6CUe!vgtc z{W2)92J3Mm6q!e$9?wmDYW%(d$6HT|jfr|U0pb6Mg4$@E=BS{CjR zuKrR(9W|BK%I9)83xzutqztK+jwN~ksL6@h5DU&g&MUuFPapoU6pGr*q!ZU49H_#^ z-pnuRD}k_*ocP^+Uo*#uz(mS(w(GwzMIGH3$Z||dF8PQ_1D9}t%%li9q0e(STwhD4 za&JMOe!l>~8(4U;QvQ=YqyVLkBz)0%nRmv*d-HiDJh#7OdaUUgTBCC~zqwPiJ#?X; z9iA5CFLL_w=1gC?QE`~UwxH`xI;dT*^O)ay#BzQkaoC)_s~wYMx1>UJaChG+yr`Fk z2iaQmVwN)sx9kB0OZxGBrIg@K!7pK8ow+l9gkB#%m>Eciw%31Mg%KKBcsftuibh@6 z9wm>^dUoW7K=eI3wSL!{e{tUYiD9FAk3FtTT$Vjbj#45QA~)2xn}CexKZayleogF! zsJuKn$3?b;IyPf$3-W!7&erdItXn{N=98S^!)6LvR@PKFXAkz5YH9}6+`s&SZ*->y zC67jQ>ptudwb--8MAjnV8ALbNXRVVngj3o-hH}zk) zHfy`>OljTlRA=DopdqBI_Iok-%WfT+IwG_#dYlGHk301!h9l4)c()I#Y$yd4DD~g7 zRK6nDitJ^H=4@LM9ce+r+70C2=b_VBP*dK%-xQWu8V_I(UNX9cP$4K7&t4?rF0Gw+ zhiJaxX|8aQMOM!2@=kp64IP_5TrH~QrXf(x^hqVGKgL%iF;82=IQXOA@8#n^RdzsS zb$mjcu1}i)J4O^j?5`<>uw(G?$~Bpfz6!$%Kb$7|x+{CPJYV`XQ+-67R+tjO+S$YV z`6wMwpOkl-x_2irzV_XV7%Fk%B&u6HK;>^=RmUaZ(^oGsrkp2BqUxH-E3TCiasejp)`YiliU=S?8?Dc zKAp6MunyoEH$YScuh;%0d&XGwV1{!OPVqs~-%TKPM$xkKD*hFzjpV*v7I;6@nB4b` z7DyuW+{ZQ5;KKZzUMb$?V0?OVH-@i$*S;^P5i!|3sd?&&x@`{5yUoBavu4%%&E3@(iA5>x~#o5qJnyHFK08X9RP1X-;m$q9?( zcHI=~PUmYIqJwAj>|(Om%kRw`!1p6N3}=VrFQzBcz@t65QDRn3^eH-|==()7A>(cb z3u4%QKRJ`sUW*M~}RYGi{q-3yXbmjYOfgHd0C!sallRlXgW zOHK$57i1;*bF|ZRdP#%)XXn7D$6J?Jh`?-0wIRfV(0Hb&6**Q}W-u4!F4c=>$6~cQ z!bRAlT|J=ml4e`gYgfeUGcRx1@uyeQHzVn11mv>N;0rd}-c+Ts3aN89 zZ@4g(7#}g^3$t@@sxq8UW`511lijMoDx`GO-M>i%SbuPno zvDd_RF_CNn)vOqC>#C+FDE2@~V3`RI6fId&&B(Q48oaFXlY!?gG7iwZyHP<;StOeK$>6R3l=Ht%AT3aPF=kL zKf--A1TahaBxo6UwD~uS4*4Fx^m(W6OL6-wNquAru03W8$7cW*IQ*O$vhS2>@6vAn zE`oJ&GZJ3G+)G_!hD$qeQ? z9xA1yNX4(F>utiKE3#j>&_YTaId=ZnP?2IUQZW=NT*IgpI;ptlnQ%%acAT-^XNK+(8_ss5-zc zekvs!K&J>STu}$2jzV$QM0`x045}S&Jv4z6<_0}$dwLn(zs|k9E39i3q~t{aCp;&g zrYLvQ+@MiZc4{?n`}^bf@I4u83|;m@*gWRkvyPV!JD1u+O(T$W)fVyKxTm1CD*jV! z`lS`Jf*MB;V+qZH`Qn}YsNI675%t)^N1N+w(~x4T+2SKQdqVPBSD?JhG5$$W9gPYm zf_Xtil*~d{Kbq<&8`=Ti%OwVtekp5-A|9?DK9iVp;V0d4GaR&kchpx7$}KZ`gXz^B zp4IzdBjrt6kujk$TzM~Wd3&0n4g{W{U>M`z($H?TeU}+n(5D@mKqsPBHnjotl5uF1r3Z*9) zw`CWW#~i&hf23!B1I@*ggZk(6?Hx0bkR#Lc*gtS#i8@dObW_64~Rhs0V-uf;O&JlKBJ)_v_ z#OQICO7enY$VhglBmEKo{AAvvPl)IcyQGh52TQtUyfsjF}= znvJ%qbtw5MmxEJ)e$FZ^_Ma!ryd#P5hds#d3S4yAb8s?BC%j)QJOVMvMK7H!c ztqV_3r{a=hBaVh8plYx6mWDC7kyb>KE4>g+)#*7*&5^eQs=U33bp~VYlgoLl;+_4> zO!NOfJ~%GC8n;bd+)n*LtkW)~#VTPZFOL*HtEbgw6@O!KBW4J1;Pe_s5s&W7ZmbxF97&mS=bAUB#uuIz%xK+{8qY;{>*st^rbX69{_h z6p|o`>XhmH_m(0f(q(G=W0J&zstL2=e6GFHIP^Z5BWf>yD?|JS5D>@s{uv*0mIVE- zwJLf3tDKd)Jq~w-unf20{c{|vV=kzlP7Jqr4(bt;5K;T-Q{Q}nQ~3@Fdn}EXnH8D3 ziRaCJ8#I8cQGkX`XCJ%$5MrNHsS9z{%U;PW^2dM~JLQXycOn$AE2_U$(X#rr_gx_@ z&(#`2y32G5aB36OlsirIm{ZJ465J4;+&M9ZYr=aQah~_R-bPrM+Xz!QpmHN2^!2N1 z1MAbZUp#T}Lo+Re{qE9kWVCLx`a_%>4F1e%U>ikS`<`Z>uWKEs=O5+H9@RJ`+CBf3 z+Be}nPn7Zwy|nviUtM<2uYlnf1+I^DVfONPl%Tpt3jV26U(HUmuIIV?!Kg!jbdhV# zA=b%LuHw?AqeL)7h)tMX-=ZKksqf7+187-q$On%epU2twmA_VEYCfDe^5bTKyGX5j z=IdGED{R0t5S7_aL8nf^@J>d!9u%<~R{mCFXDoZEQrV_0`--L}nUpZQ`~(NE1PQDV zd$P+}oS)pOI8kQR&*2gAaNt?1z)AE=oOIZiojCWND1n2L&T#7EIU?d`jKn<8J|kA$ zuQC$LNlW_7Y7Tz?5m1+Pi6oJWhF|}tZHm4Qr1k{0@(TlU5A2VPe;o1@*i*p20SXSx zH3g7v;3kmwqNHe0ig(KHOlVag_vY1(OMD&f>W0ax77>>wgifCWu^*_5@-)tb_G0y` zh73~ot=5bTGCSsj0JxUEMx*OWU*qE&apAn+n=c?`zC#xjm$q~a(!WAxhjR^C2iKFL zCVDEL>CX|KksZU?F!*~Z^EK;WrL*R(i8AhuZxqwG36(gf^Yl; zcJU44Yk)IJ++Sr=g#NJ!7-nNy47dDnEyr?&_V~2+rmQe~ZoB@#x?{xvS?W(>oRt9O zgFoohJ1d+f$C!&^^K~_Dc-X0q*bWR`syaQ18NIPg7>Oo%8ShXr5RoKC3IY%5$yk9^ z@%yww@w+nZk4=xhClhs4M!-jJSf%>xFAAn7t3GxznEu=n0ajZ75)7)cw|wld(UHDU zc^+M^(7Tskl+u45B82l(7%MJOfjQM;| zx6C|r=a;>EetmXQ?Ac*LF;#5adr7O)jpck!mOfBQ$*8#|@rgkz>)w$Fbfr5deV>YB zC(pWzrTSRUyvvxGMwsk*KlN=7cxk1hlvB{$gPx&!xnvaEJSJ}=?P&618i_D_bmxw6 z2mbUJxxd~tNl>c+JqPM6yrfy!Fk7jmX~sL_m9biIq*Cn;*`N#cd$Ohu>xHjR>NU@< zXm$$(T$aeWX1#I!mWa@_64Wc4@fAHMzhjntyGN_Y`@J=Ju)}Mgn^y}LzE5{bdK^jh zX|^bJu5$c*?fn3MdugQBdp3Wf%4 zUgfB_@06VGpv2p!EwVa~`e?3*GetE#Pwlx9rF|!p=iA8rS4ibT_h3|78n2tnP3w!H zAuJef|40dF;-RIbM>=$SpCVrv#lgAeyfl?RH5t&pG#O^uEE8r_WNPdv{1bwH)-#kO zt45UOO#q^3b}T8xZ`FWZ^cj9!DxP=g0h(Kg(*Y{M~Iihb`H1^H5JT zpUkFp%ZHW*J(P%CY7%leZ-))Rjb%@}w)l}h{yNFE=vJM<8_?kJXR$C%Um3)?Snt3O zauHsm_xwu6w0Df9dWJvmY<-V;Imb+0c>D7WlkJe4S%=`gG>xGsLTLusO9MtS(IWEP z&(rY87Vo&^vFW>fa}kt&d`?oIE`cfk;*Qd&N$T^1e#Utm_ecVX!^u1|3rGCtQhlK zTGfuHbL^uoNjEFLq$z!XcHqol)EjQN&aL%9A@eLudC}A(XM~9}P&5sz&^@&AlQwjq zsbq9m&Z}BCLhaC*yDHOSm4ba}A11k8GFZLJ?_PNYMOy0FeCFI`zZB zCtn=s>}`^_A?7#Y1bpvNV~rxd3Y2Qw9m4X9^BdRgmSF%3=bbPY~M2%^P2pg ztt(_q`prd5l%`}jtJG2^&JxkV38?daZ>pZ#WI)@XUH=YuB;X9v5shQ=(#f`)>VT-Z zUd>t;OJOt-RGjDQoGa#}a&jZ7j0vf%&Zy4K_#i31^ET?o+b-rK3nuOX2DT!?e0;0f zo$Zh}=V1qs$KE&XJw_W$>|u-q105?}PbCNC4S3$Fr00Y2iv#aWP|Aa-sD>TG8l`K` z@vxt&G>7jU^giu2oQ=BGO{SV0+j?_ND?BUmWk}^EQW2U>Z8OId#R;3ZRv(^tX}=xw z>&q>wij?OQDuY{%r|W})ca!C~mbAH+bY?EnX>l1=LzLPq)Gk~!E^Z`cB&?hc?j*xw zn8T8Q(Sg0unDV5#d0_?QZi49=>MH2g%0sa?c2FdBqUPb(Nv@gVcjJX;JUOdx#ON)h zFBE5G8!^>7a}~JH=}q@lH<<}5@Rqkby63-rwiA%1NWKc&$r2|W(Q)VObWD|~9K02O zwm`9Pg$2aPR@^xfX-<-)4 z&@XRSN`ns^_w&$Z*edxf-&A|G-Q}L^BUEI|mhQ436P8Smy-xdRiE%q&`)#{)^^K{t zNUZxFCm(6&`&8t^T%P41yAUI*Alm^^Tghu}kZoM6MM?`PoxB2vwJT}iTtNRP`mJ~! zq>aHw&4-Tp?kB|$(qg(E7G1E4H)|}Z*c|>!nHlr$r>z5jZ(cjf?cMYA`k_MAOR4HP zv5FrA5~AD_v=Uxf)2_lP``ng=SQ9dH-aO7XN_R0XvNbO9G0q*og6%eLBrkBZ@Ih7kYrk>yrH!Gl)mn~*(MQXJ++d?{q|t0he42I-;ImOf|csx1&%kQ z>Y6JFHP={OluhG5M(Rk9br0bU8b*$w?joF`TmWsrf!7tKChs@>f@D!v`%c-dsv5D&9lPj94}wpskVKMA#A&; zR)XwpD|=J9%+K+&+GMjn-Jd9A$Aj4-5&Yx#_G~o8UWGVwyZpMu!j;g-kwAP_ULxo`7+ZKgWrRXw&`>`)Loj1Tyh8vr#^Xk1&-$4JD z71B#wRYyA`6GuUi!ast0Ppm!W=t=S@`z?Q)VgH2^?g4YWb5u3CSs&R%HeHR@dev4OYF9WXp&YZ;m3FuN_1j{e0=aT0u64o! z?SY>$d)IgfqaL6oJvd(U3%!7mqw;yTf+#bm`)q_w?KKGwN$%^jURSJz3SnP#r>PaTX0hIn&q201(mVs>>n*Q@1}IQHMF4e?m68e_99N$7jV&LHa2pT|7Z z_wP4U47*8P`rYfP?wgs~C~4?*=oi|d>=y~AbEf3nJ7?d&m5=EtXsswvALdyKv=evY zaaEdCiC0MbvgkRpPMhT)RH0>6t2ZQTlWtU?>B;rT^R4O+-GY*dJO%>;2U`%UA3ef5QV`ofnP)m~OF>2j=Uvze!KR7g7IS8d%po~|_> z{3Tp@3>7W?ic|YFpVX`m#kh=S7n|`T=Stg^Sstb^CaEU-UG&R$62X4vd(Bn%LJC%G z@1T(`gjHsRQ*Wx!D$23-AlbDzCNV6$titRD$!W<^CGo>9DEu$^ET);(H81SZ!(E*{|n$qeD_j z`0aR&^Wt&>Fky9O`JpSU)|rNmZ$3ZJ?Ej&{I(g`FAl~x;-cKo)ui}V8dL&0BCSn_j zc^k)zHr3Akw0KIru2onndu_S+&F-_Mo?=znAw+k}5uEY{>5ns`prgw7`%ys3HYDpZhVL-SSw9|2l^n&A`vnm#KPc6LR6EPdf6X8> zjWcqE(zS6Nr>F&LF)M+ihx%sFgl%;pN z>30YBb&aTC^&S0!LbE&jbwywmGL=rJgcNOdORJK+! zP|$~rDW+Lhc{4>+_jatFstvn-?$r$0y>hD(mKb+agfM(BU}Ger$yVIh=czc)E5FM| ztCNBq=B1+7`Kcp&#;`Y2CdQ50jmG^gTQUiv-%m6``gzlFhK%rcp6)Z>?ghR&yu|v;>05Hp zbYJYq==S%RqCOE87mZNu;xQFV7AuaCdwPp=-bC&pFGO65<~+6;%j2w~kBs@=zH9c` zM+=N+Uuk7@bV?oLy_nu`P7$A%-<3W063xnKM@TS-=&c&Gqg&#lTN3$bG3!gb=lt0v zi7VnHXHkmNMR~I6rAsSh1uKp?rsIt#gGQ%UkcH#y=h@)nw1t&7f9=Z zzEPCI=aoBdzg%;Fv~)_s>blczh;?S-!2OceZll<&vR>UT5zpNXH`CQ`YF2|8Qv;#W zob#j!5}nXKBz<>FI;U>fG2hZx`@vY}jIPnfN4t<$V~pg|MR({7N>xL&v(V?iFK6`t*6%ROF~lT-l&dd_A9ZYsMSf6sBCYuL4TU$nfZiRBg^> zEsj+kHrvE@o68{gSgzUiz4=S)gzk;K70Z?^4SC6O%e}GorP>+6p6hp%WykZg>lH5D zJr6JLT`z;0I(5&_WKr44vx{K6@=J+%Gv+V@b*`B+ra5(Q7v4CE%y+1cR$hGn zfyFu#{8SbnQpU;8Vk_S$!d~r~>C%B@ACC{I;8eTn_^9=@YbI6W&S=z)9%Mc#Z-(0= zxo)J^j44NxQsZcRNR2QnuS!Bo`6z-tjy-Gym29AMh$c1AK8tRUG(AZ`t?zkG@Dw*l{%Dg_`?`ldgSJC(io>hhabmCq4ETyFk)-H^UKTo zuimqZnklnjO&o+`?cPR}{k(s;+18lVmg{P`xm+-{S}DJ=GdCL=O8)%itFri7FQ!I< zW5g@jNftRN35dO+omTyDN3HdFnU#Kx@5FvlUn=CeH|63~twq?ffcRJ-N3gMQ<8Xdy z%kGm9o%gw>?geol$Grl>yI<(_-6R;9w#yvyC&^xvMR6D)HO@{}8fgL}KXfY4Bd{dM| z=T&6XaWCM9b8?`dBuX#PNj#f&wi2)^<%b`@q)|+$B`9sm3 z_{9=~Y5WkR@#RZg=NZ(EBLm#+I6o1_%bJt~@3YsLwhWJ36ss$JzAWLs`i5TGL=(g1 z{K#SBxHp3$=0L8^JN|*NG6!PwR%mdrFZ}E&YzI3h)D-P;7Oq~tBbhYOz&T)TL>mNXjn@&dk4JuP88A&GrosAY_Eb)Yj$ zV$aAtDM)&4bN+lf;>E^*)<`IZzS}q7KGSd@(E9NdbsmZLQ^6Z8l&jNcyjf|#Q^))B zEFQ@HIHzBDR%}qCqPjHwYBXcV_g4fnE**5PNwqsu5NERg;ssl~hhwCa#pf`eEp^45 zuX{3Q8V}JOFb(y9lJlQxK|CHa_Z2T@X5@oa}q1?*WXZw12qo$C>fvp)+SM^0FD-uc~;HKJ`=C{`{<;3c=KrlW16y5;F2X4_ec_Y3HUNhCmH4tX@U(wUIR?IC{K*LNa^&v3)a??Qo~i+W;RYdd2i60uEXd$g7|F@#n@^ci zDbuFxi^UNvDoS^)&iG@jbUnM0G>qi1)ZJP@RPTf-!hc_3(I69&s@iN+9D_jUJ2i$n zAf}EODqnZwXM<4;|5OBUS#C_Nm+4e8E9-*Zk9**a$!74!>sf(co62YBc&Cq zEP_;!pF|%;HCC0#j>F$@7?Tjd)54|aozj4r%HG7FMU?wM?Ow4sKW2h!E!V$%J$53gqd7~k1hRA5TU-64(1KZl z;>y2Kgc;QHR!2AAdkA8rPonbq-IVjzQMjPm`AC(WxWeww z{(w|C&{DE?v$XTvw;_75!TNa_WAT82q)tvytVb?@oaNXW^PZ^oL&88#^n#lhfK_?v&v zI4;68{|7TxhrlzNPiyZj6k;AHf)+z2?%EmZXq@29(+18ZMOu6F>myTUb$x%c;&~s18j}$ph4tUHPV`g_DiCx-=?XhI4%;Td za`A7#(kp&y##YmqlGGYnWLy^xjwa$s5|%8Yk;`oord%59X5+BXgePCncXV0Y1Qt7P zSzIxLy|Mg}n~21J$1raw?Ww4aSBHS52mXQfoFe4N^7r~t`fL#x(c}YiX-;*nzYuOnad(5K!K)1+P+$J z#~VCLcgGLD0*{B5G;>39>EQ)bVZ@|!O@E~GF+q$7zd9YwBD|erDXi9ViLHydVR!r# zk5wqGc6uT**7ehR)`o%W>~+NewHhJUvwP9f)B=w8T7E@+znV=y3cP=Fp+asSI1zp9 zzwl?#Ay-XU^or|1+d;&VXEfS1@$>v}ZuW#Ca@Rl3)F^}eQw>8N_)^&@v>QTfsdDC4 z!r0GS!;~rBb2+>ZyXL_Cegvs3I&jV88Lnv)c&=-9dv8a7gUA=($hdE6{8P^qsIebY z(?G=7c5{Y%MiJ6=$diA2{=0|J{nELUq1dsnRgro_Z5N0?!%Gr|lP6Uh&Y&j3wzdNKGkP&d2UM5!z=Z z2PSk*$3-eNk)+PlH&4njjW}!#Lw4YrUFH+KvhP7QJs+|TfoFe0*4m46gk*GY-b&Gh z6+T?xT>=>^J-kae3RoJLJH%g8{JK)%2C~xjUT9ENM)zG~B(C2ge%?i*Ro2{e_SvdG zSJzk96k!60n%^0YRWm&WrZmPe7*E1kGH_6LWYC50C(a>MXaoEKV@L4M@9RxD=jqVd z(15qzQaqdnva5gSP4GM#rg6oN>wCoUMW8RwtLBu9ao)Wox32VY)g6nc;T!w)sKJM&~~YM^Vr$Q0jlH=&dIjmO;uK+piB=!|JY{ zQ3UIVPnO;@Yfr-rE6FHDuB{QxDfMs^sw-vkP95A1dIY>F>> zoRGA@7ZoD;I{bQPA=P>-pq+v6I;og%y!Y&rG>lT0@Ify4A3foC_m^R60~ePN*aRnk zGBP+mJ`Dh{s=%S z7%zqc2_F7S2&E@<2!WD9MKIprp-*3brSxD~4F|Z^@3MaXG#vcvfcqbe{~QiJqDc7o zcn8qZCp-Fl)F+a#qcTZ^rvmVkP(%r<^n{N@p}i2-D3DMtFKm8cxN%3?fp4@?;CtbJjsjm-6-W{5e#6fYSJxvPDFb(uh|o81Q&{U*j@^;(tkAbPJ;2h{PML03XlDhuJ4L_I z_z5oNfIEtuP4PUR5j8E@nLR_}J2U)2iVL$I+>w-qYmMUQcOw2EK4eyA*^s;dK?_(A z6lJ4~>7-$Y#CIelBie$_)7Hs<_C3k0<|V`31Fi)lR3i3kaA#IRm67-O7&?_8x9`@q zQPb~iRZa%M&JC?r*@X;dWCAf%Te5=K)1yVjNKS#)om;yP8)Q$vH%??O5y^v=np(ir z9mUK^8lK4(Lz|(9TB*S~rGv+JD1iBL(#XMi1(hHao~%*nV9P-{TAL|<8Zf2!=WOYg zT*%3PvS~uvj!?5R1KBjAZ5!aFTSs?hj~sGzIBGde)XzlW*9D;gkEp1zpqj&Ej~lx> z5tzWPqSLrG8M(1s&zbdQdFD^~8a4{MmMzCkv9FMsEfeJTcs1u>erqz?q&2uwI|oB- zDgmMEseE4wPj^)rTu=3XM;=#LEjxNM8T8{!sXnWuV$T3Btji^&CT!)7GLAEgVBqXQ zBIPPlMUSQ0*8=-;$I`1k%5U|km&kfb`2Jgj1pPu(q=k-ZA^$YZrJbn=BY8zFVn;1# zYqtrfjNG-Eaf6#L8&rnL*~#1qK5&*ZcCAKnDb2f$>I+GvGelp1*>>za;c8Bvms|YIYiKZb^ zobx5n^Y7d#5&1Rn2wMOHyyB|nph?fUPj{3fzzv8F)A%m=^(&p8bHU*L+%#v!0piM; znQn+eK2w$P)3zsnV15(|Kk0Y-EMVcA20nF@K%Nc!C(d@$GAn{2LjAcGk{IC>CG`4wuzwEFCWvN7JjUxOC#urGlbk+R>u92$UP1Xw8M9 z;J~T&+_>7tl?+5ETZ11%tSQ9!^h}FIq#2`=TAh(@8feddEijUp^<5Pu-AW?vH9XKw z$Hsb~xyi=2XI^EW8imsxWhX!KEL)?Dl<>q03KHPKt*=7IVh<*RYfnzs2Jrhjg${(& zU4uuxXA_}coF!;3_oi2(Ad^UhmxgJ5U8$X&n)=e6D;QX1C)ghAfj6^hcZ%2To&oF{ zm)c}IWOTb^J>5azkgc03o$`!8iCe2EEk&PWfge-z>o|6`hNHTM{~r!Up78iDicpZ3 z2!&r|`2B%jW-*Se;o$GzARi7ist7deQ%NjBjcD?Bo3CL?-)#?@bUBwQhWi5ks#X33 zEYkh$mtkrH7nk4O1T76YG&e6uWoc(L96;;vtdZDe=DV`@Y0WM|ayD?0(;SMT(cyRL6-kiG?2u zkHunDsef4Yz2E!lD;iB^m0BwjOZfcxcYgWqTmSMeKl$lD{rJakzW(~(zxwLyXU_JV zI(_EksnaJ-a>^V#3#=ykPl%Rl&yZ+`Q9+uzr|_O(}DdF9PF z-+b$>w|?=9U;OGHzxUqsvY@}=5YSNnpVq9^B{?z#FIzkdr3&a|dD@Oc^s9&CvNj~>K(a+Az&$v&T17rQ9ZH$U-f${0qz<7`KH(U!3(`%u%vuo=jAN{j0F?8%V z+q%EUTVXDi+LiLiQ%CLXS6cdrM(R8N#KDE!u&ed`Y^CioZ{F3z{_%!xy7M7wihmDB zDgkpSnu7*&KpNT&U-!fG-z1y<@}tOuk9{7G8jd%3r_e{_^HH@BfsPjP3iUhO+^;^ddU^3=nRJ$;=ux_kRBWsh

T^xn9H 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%0D4l#gMN<9l`fvAW7U7fOxT40} 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≫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�xZ3^%4jv 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 QxEtfBNB->d= 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�@RqH%hoBnmwRmTjTLjR=~_tOWs@KaSKi?Bq|& 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

CZ9sDQW1 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 Date: Thu, 23 Apr 2015 23:11:05 -0700 Subject: [PATCH 052/112] 2.004.0003: Checkboxes removed from LapList --- PitsideConsole/ArtLib/ArtUI.h | 29 +++++++++++++++++++ .../PitsideConsole/DlgPlotSelect.cpp | 2 +- PitsideConsole/PitsideConsole/LapData.h | 4 +-- .../PitsideConsole/PitsideConsole.cpp | 18 ++++++------ .../PitsideConsole/PitsideConsole.rc | 2 +- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index a9c0620..b9516c1 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -345,6 +345,35 @@ class ArtListBox return ret; // Return the set of items } + + set GetSelectedItemsData3() const // Version to capture the Lap List for multi-select choices more efficiently + { + set ret; + int ixSelect = -1; + do + { + ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); + if(ixSelect >= 0) + { + LVITEM sfItem = {0}; + sfItem.iItem = ixSelect; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + + if(ListView_GetItem(m_hWnd,&sfItem)) + { + // found an item! + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); + } + else {DASSERT(FALSE); break;} // Added by KDJ to prevent locks when no data is passed + } + } while(ixSelect >= 0); + + return ret; // Return the set of items + } + private: HWND m_hWnd; int m_cColumns; // used for debugging diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp index b09d069..03c0b2e 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp @@ -35,7 +35,7 @@ void LoadLaps(ILapReceiver* pReceiver, int m_iRaceId) vector GetAllLaps() { - set setSelectedLaps = m_LapList.GetSelectedItemsData2(); + set setSelectedLaps = m_LapList.GetSelectedItemsData3(); vector lstLaps; for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) { diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 8c9441c..4579980 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -130,9 +130,9 @@ static bool SetDistance(int b_KmOrLat) // Function to set X-Axis units in either static void GetStringHeaders(vector& lstCols, vector& lstWidths) { lstCols.push_back(L"Time"); - lstWidths.push_back(73); + lstWidths.push_back(60); lstCols.push_back(L"Laptime"); - lstWidths.push_back(55); + lstWidths.push_back(60); lstCols.push_back(L"Comment"); lstWidths.push_back(75); } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 8168e0f..04cec30 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -614,7 +614,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) vector lstCols; vector lstWidths; CExtendedLap::GetStringHeaders(lstCols,lstWidths); - m_sfLapList.Init2(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); + m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); } m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); m_sfSubDisplay.Init(GetDlgItem(hWnd,IDC_SUBDISPLAY)); @@ -1652,7 +1652,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } case ID_DATA_DASHWARE: // Save the data to a .CSV file { - set setSelectedData = m_sfLapList.GetSelectedItemsData2(); + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); if(setSelectedData.size() > 0) { TCHAR szFilename[MAX_PATH]; @@ -1733,7 +1733,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) case IDC_SETREFERENCE: { // they want to set a given lap as a reference lap - set setSelected = m_sfLapList.GetSelectedItemsData2(); + set setSelected = m_sfLapList.GetSelectedItemsData3(); if(setSelected.size() == 1) { CExtendedLap* pNewRefLap = (CExtendedLap*)*(setSelected.begin()); @@ -1955,7 +1955,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } void UpdateUI_Internal(DWORD fdwUpdateFlags) { - set setSelectedData = m_sfLapList.GetSelectedItemsData2(); + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); vector laps = GetSortedLaps(m_sfLapOpts.eSortPreference); // translates our m_mapLaps into a vector sorted by time // do some memory cleanup for(int x = 0;x < laps.size(); x++) @@ -2578,7 +2578,7 @@ void UpdateSectors() int w = 0; // Lap tracker for Sector display int s = 0; // Sector tracker for Listview - set setSelected = m_sfLapList.GetSelectedItemsData2(); // Get the list of highlighted lap time ID's + set setSelected = m_sfLapList.GetSelectedItemsData3(); // Get the list of highlighted lap time ID's vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list // Get the points from the Ref Lap for computation @@ -2774,7 +2774,7 @@ void UpdateSectors() { // Update the data channels that are being displayed as values // List of highlighted laps - set setSelectedData = m_sfLapList.GetSelectedItemsData2(); + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); if(setSelectedData.size() > 0) { HWND hWndDataValues = GetDlgItem(m_hWnd, IDC_DATAVALUES); // Get the handle for the control @@ -3054,7 +3054,7 @@ void UpdateDisplays() void ApplyDriverNameToSelectedLaps(ILapReceiver* pLapDB) { - set setSelectedData = m_sfLapList.GetSelectedItemsData2(); + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) { // the ints of this set are actually pointers to CExtendedLap objects @@ -3093,7 +3093,7 @@ void UpdateDisplays() virtual vector GetAllLaps() const override { - set setSelectedLaps = m_sfLapList.GetSelectedItemsData2(); + set setSelectedLaps = m_sfLapList.GetSelectedItemsData3(); vector lstLaps; for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) { @@ -3105,7 +3105,7 @@ void UpdateDisplays() } virtual vector GetLapsToShow() const override { - set setSelectedLaps = m_sfLapList.GetSelectedItemsData2(); + set setSelectedLaps = m_sfLapList.GetSelectedItemsData3(); vector lstLaps; map mapFastestDriver; CExtendedLap* pFastest = NULL; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 287a8ed..24ee693 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -179,7 +179,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0002\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0003\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From bec206f44e30752b0e1c1dafd923100f7048565c Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Tue, 26 May 2015 14:43:32 -0700 Subject: [PATCH 053/112] 2.004.0004: Fixed Lat/Long and Wifi Dots bounds issue --- PitsideConsole/PitsideConsole/LapPainter.cpp | 27 ++++++++----------- .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index c220178..ddd420e 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -275,39 +275,34 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi break; } } + if(mapMinYTemp.find(eType) == mapMinYTemp.end()) { - mapMinYTemp[eType] = min(pChannel->GetMin(),mapMinYTemp[eType]); - mapMaxYTemp[eType] = max(pChannel->GetMax(),mapMaxYTemp[eType]); + mapMinYTemp[eType] = min(pChannel->GetMin(),m_pLapSupplier->GetDataHardcodedMin(eType)); + mapMaxYTemp[eType] = max(pChannel->GetMax(),m_pLapSupplier->GetDataHardcodedMax(eType)); + } + else + { + mapMinYTemp[eType] = min(pChannel->GetMin(),mapMinYTemp[eType]); // Make the minimum the least of the min of this lap, or the previous ones + mapMaxYTemp[eType] = max(pChannel->GetMax(),mapMaxYTemp[eType]); // Make the maximum the greater of the max of this lap, or the previous ones } //////////////////////////////// // Adding transformation functions here for Min/MaxY - // This needs to be fixed, NOT CORRECT FOR SETTING THE BOUNDS -// if (b_TransformY == true && mapMinYTemp[eType] > (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue)) if (b_TransformY == true && (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue) > (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue)) { mapMinY[eType] = (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); - } - else if (b_TransformY == true) - { - mapMinY[eType] = (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); - } - else - { - mapMinY[eType] = mapMinYTemp[eType]; - } - - if (b_TransformY == true && (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue) > (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue)) - { mapMaxY[eType] = (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); } else if (b_TransformY == true) { + mapMinY[eType] = (float)PolynomialFilter(mapMinYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); mapMaxY[eType] = (float)PolynomialFilter(mapMaxYTemp[eType], sfLapOpts.m_PlotPrefs[i_TransInt].fTransAValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransBValue, sfLapOpts.m_PlotPrefs[i_TransInt].fTransCValue); } else { + mapMinY[eType] = mapMinYTemp[eType]; mapMaxY[eType] = mapMaxYTemp[eType]; } + //////////////////////////////// if (ValueDisplay == false) { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 24ee693..d79bd09 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -179,7 +179,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0003\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0004\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 545beaf99cd3dd62df81bf6ab732e074d872cb6f Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Wed, 7 Oct 2015 14:11:44 -0700 Subject: [PATCH 054/112] 2.004.0005. WIP CSV export, increased size of secondary display 1) Updated transformations.txt file 2) Swapped locations for Traction Circle and 2nd display 3) Improved data integrity on CSV export, but slow and a memory hog. --- PitsideConsole/ArtLib/ArtUI.h | 4 +- PitsideConsole/PitsideConsole/DashWare.cpp | 93 +- PitsideConsole/PitsideConsole/LapData.cpp | 2 +- PitsideConsole/PitsideConsole/LapPainter.cpp | 1 - .../PitsideConsole/PitsideConsole.cpp | 84 +- .../PitsideConsole/PitsideConsole.rc | 17 +- PitsideConsole/PitsideConsole/resource.h | 2 +- .../PitsideConsole/transformations.txt | 58 +- PitsideConsole/ZLib/.gitignore | 2 - PitsideConsole/ZLib/ReadMe.txt | 29 - PitsideConsole/ZLib/ZLib.vcxproj | 109 - PitsideConsole/ZLib/ZLib.vcxproj.filters | 105 - PitsideConsole/ZLib/ZLib.vcxproj.user | 3 - PitsideConsole/ZLib/adler32.c | 179 -- PitsideConsole/ZLib/compress.c | 80 - PitsideConsole/ZLib/crc32.c | 425 ---- PitsideConsole/ZLib/crc32.h | 441 ---- PitsideConsole/ZLib/deflate.c | 1965 ----------------- PitsideConsole/ZLib/deflate.h | 346 --- PitsideConsole/ZLib/gzclose.c | 25 - PitsideConsole/ZLib/gzguts.h | 193 -- PitsideConsole/ZLib/gzlib.c | 620 ------ PitsideConsole/ZLib/gzread.c | 589 ----- PitsideConsole/ZLib/gzwrite.c | 565 ----- PitsideConsole/ZLib/infback.c | 640 ------ PitsideConsole/ZLib/inffast.c | 340 --- PitsideConsole/ZLib/inffast.h | 11 - PitsideConsole/ZLib/inffixed.h | 94 - PitsideConsole/ZLib/inflate.c | 1496 ------------- PitsideConsole/ZLib/inflate.h | 122 - PitsideConsole/ZLib/inftrees.c | 306 --- PitsideConsole/ZLib/inftrees.h | 62 - PitsideConsole/ZLib/test.h | 0 PitsideConsole/ZLib/trees.c | 1224 ---------- PitsideConsole/ZLib/trees.h | 128 -- PitsideConsole/ZLib/uncompr.c | 59 - PitsideConsole/ZLib/zconf.h | 506 ----- PitsideConsole/ZLib/zlib.h | 1744 --------------- PitsideConsole/ZLib/zutil.c | 324 --- PitsideConsole/ZLib/zutil.h | 252 --- 40 files changed, 136 insertions(+), 13109 deletions(-) delete mode 100644 PitsideConsole/ZLib/.gitignore delete mode 100644 PitsideConsole/ZLib/ReadMe.txt delete mode 100644 PitsideConsole/ZLib/ZLib.vcxproj delete mode 100644 PitsideConsole/ZLib/ZLib.vcxproj.filters delete mode 100644 PitsideConsole/ZLib/ZLib.vcxproj.user delete mode 100644 PitsideConsole/ZLib/adler32.c delete mode 100644 PitsideConsole/ZLib/compress.c delete mode 100644 PitsideConsole/ZLib/crc32.c delete mode 100644 PitsideConsole/ZLib/crc32.h delete mode 100644 PitsideConsole/ZLib/deflate.c delete mode 100644 PitsideConsole/ZLib/deflate.h delete mode 100644 PitsideConsole/ZLib/gzclose.c delete mode 100644 PitsideConsole/ZLib/gzguts.h delete mode 100644 PitsideConsole/ZLib/gzlib.c delete mode 100644 PitsideConsole/ZLib/gzread.c delete mode 100644 PitsideConsole/ZLib/gzwrite.c delete mode 100644 PitsideConsole/ZLib/infback.c delete mode 100644 PitsideConsole/ZLib/inffast.c delete mode 100644 PitsideConsole/ZLib/inffast.h delete mode 100644 PitsideConsole/ZLib/inffixed.h delete mode 100644 PitsideConsole/ZLib/inflate.c delete mode 100644 PitsideConsole/ZLib/inflate.h delete mode 100644 PitsideConsole/ZLib/inftrees.c delete mode 100644 PitsideConsole/ZLib/inftrees.h delete mode 100644 PitsideConsole/ZLib/test.h delete mode 100644 PitsideConsole/ZLib/trees.c delete mode 100644 PitsideConsole/ZLib/trees.h delete mode 100644 PitsideConsole/ZLib/uncompr.c delete mode 100644 PitsideConsole/ZLib/zconf.h delete mode 100644 PitsideConsole/ZLib/zlib.h delete mode 100644 PitsideConsole/ZLib/zutil.c delete mode 100644 PitsideConsole/ZLib/zutil.h diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index b9516c1..1e6dd74 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -204,7 +204,7 @@ class ArtListBox if( setData.find(sfItem.lParam) != end(setData) ) { // found the item in the selection set, so make it selected and checkbox checked - sfItem.state |= LVIS_SELECTED; + sfItem.state |= LVIS_FOCUSED | LVIS_SELECTED; sfItem.stateMask |= LVIS_SELECTED | LVIS_STATEIMAGEMASK; ListView_SetItem(m_hWnd,&sfItem); // Highlight the lap ListView_SetCheckState(m_hWnd,ixItem,true); // Check the checkbox @@ -212,7 +212,7 @@ class ArtListBox else { // this item is not supposed to be selected - sfItem.state &= ~LVIS_SELECTED; + sfItem.state &= ~LVIS_SELECTED & ~LVIS_FOCUSED; sfItem.stateMask &= ~LVIS_SELECTED & ~LVIS_STATEIMAGEMASK; ListView_SetItem(m_hWnd, &sfItem); // Unhighlight the lap ListView_SetCheckState(m_hWnd,ixItem,false); // Uncheck the checkbox diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 99171c3..3481c0b 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -15,7 +15,7 @@ namespace DashWare void WriteChannelHeaders(wofstream& out, const vector& lstLaps, map& mapData) { // if you update this function, update the dashware.xml file too! - out<::iterator i = begin(mapData); i != end(mapData); i++) @@ -23,34 +23,38 @@ namespace DashWare TCHAR szDataChannelName[MAX_PATH]; const DATA_CHANNEL eChannel = i->first; GetDataChannelName(eChannel, szDataChannelName, NUMCHARS(szDataChannelName)); - out<<","<& lstLaps) { - if(lstLaps.size() <= 0) return E_FAIL; + // lstLaps: Vector of chosen laps to output, lpszFileaname: Filename to output CSV file to + if(lstLaps.size() <= 0) return E_FAIL; - vector lstSortedLaps = lstLaps; - sort(begin(lstSortedLaps),end(lstSortedLaps),SortLapsByTime); + vector lstSortedLaps = lstLaps; // Get all of the chosen laps + sort(begin(lstSortedLaps),end(lstSortedLaps),SortLapsByTime); // Sort all of the chosen laps by lap time wofstream out; - out.open(lpszFilename); + out.open(lpszFilename); // Open up the CSV file for input - map mapChannels; + map mapChannels; // mapChannels is the list of Data Channels for all laps for(int ixLap = 0;ixLap < lstLaps.size(); ixLap++) { + // Find all of the populated data channels for this lap for(int y = 0; y < DATA_CHANNEL_COUNT; y++) { const IDataChannel* pChannel = g_pLapDB->GetDataChannel(lstLaps[ixLap]->GetLapId(),(DATA_CHANNEL)y); - DASSERT(pChannel->IsLocked() && pChannel->IsValid()); + DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues +// DASSERT(pChannel->IsLocked() && pChannel->IsValid()); // if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) if(pChannel && pChannel->IsValid()) { - mapChannels[(DATA_CHANNEL)y] = pChannel; + mapChannels[(DATA_CHANNEL)y] = pChannel; // Add Data Channel to the list } else { @@ -58,36 +62,21 @@ namespace DashWare } } } - - WriteChannelHeaders(out, lstSortedLaps, mapChannels); - - - int msLastLine = 0; + WriteChannelHeaders(out, lstSortedLaps, mapChannels); // Put all Data Channel names into the header for the CSV file + + int msLastLine = 0; // Indexer for pulling correct timestamp data for each data channel float flStartTime = 0; // start time in seconds; - for(int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) + for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) { - const ILap* pLap = lstSortedLaps[ixLap]; + const ILap* pLap = lstSortedLaps[ixLap]; // Get the chosen lap int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) int msEndTime = -INT_MAX; - for(int y = 0; y < DATA_CHANNEL_COUNT; y++) - { - const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)y); - DASSERT(pChannel->IsLocked() && pChannel->IsValid() && pChannel->GetChannelType() == (DATA_CHANNEL)y); -// if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) - if(pChannel && pChannel->IsValid()) - { - mapChannels[(DATA_CHANNEL)y] = pChannel; - } - else - { - DASSERT(FALSE); - } - } - - for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) + // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available + for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) { - const IDataChannel* pDC = mapChannels[i->first]; + const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); +// const IDataChannel* pDC = mapChannels[i->first]; // Removed this as it didn't give the correct lap times if(pDC) { msStartTime = min(pDC->GetStartTimeMs(),msStartTime); @@ -96,32 +85,39 @@ namespace DashWare } msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); - const vector& lstPoints = pLap->GetPoints(); + const vector& lstPoints = pLap->GetPoints(); // List of points for this lap float flRunningAverage[DATA_CHANNEL_COUNT] = {0.0f}; bool fUseRunningAverage[DATA_CHANNEL_COUNT] = {0}; fUseRunningAverage[DATA_CHANNEL_X_ACCEL] = true; fUseRunningAverage[DATA_CHANNEL_Y_ACCEL] = true; fUseRunningAverage[DATA_CHANNEL_Z_ACCEL] = true; +// for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 2000) // Increased time movement for debug purposes for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 100) { if(msQuery > msLastLine) { - out<::iterator i = begin(mapChannels); i != end(mapChannels); i++) { - const IDataChannel* pDC = i->second; + const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // Get the data for this lap/channel +// const IDataChannel* pDC = i->second; // Removed this as it didn't give the correct lap data if(pDC) { float flValue = pDC->GetValue(msQuery); @@ -130,15 +126,16 @@ namespace DashWare flRunningAverage[i->first] = 0.7*flValue + 0.3*flRunningAverage[i->first]; } _snwprintf(szTemp,NUMCHARS(szTemp),L"%5.6f",fUseRunningAverage[i->first] ? flRunningAverage[i->first] : flValue); - out<<","<& lstPoints, CExtende ixCheck = (ixCheck+1)%cReferenceSize; if(ixCheck == iRefCheckStart) break; // we've done the whole loop } - } + } if(pTimeSlip && pTimeSlip->IsValid()) { diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index ddd420e..be6590b 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1427,7 +1427,6 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) // the mouse is in our window, so let's enable panning and zooming! const double dTranslateShiftX = (rcAllLaps.left + rcAllLaps.right)/2; const double dTranslateShiftY = (rcAllLaps.top + rcAllLaps.bottom)/2; - double dScaleAmt = pow(1.1,sfLapOpts.iZoomLevels); GLdouble dXShift,dYShift,dZ; // Project the window shift stuff so we know how far to translate the view diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 04cec30..2237850 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -803,7 +803,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; if(pDetails->iItem >= 0) // Single select Listview, requires special handling { - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD | UPDATE_VALUES); } } return TRUE; @@ -824,7 +824,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; if(pDetails->iItem >= 0) { - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD | UPDATE_VALUES); } } return TRUE; @@ -1120,7 +1120,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_iRaceId[0] = sfResult.iRaceId; ClearUILaps(); LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); + UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD ); } bEditSessions = false; } @@ -1136,7 +1136,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) CPlotSelectDlg dlgPlot(g_pLapDB, &sfResult, m_iRaceId[0], &m_sfLapOpts); ArtShowDialog(&dlgPlot); bSetPlot = false; - UpdateUI(UPDATE_ALL); + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); } return TRUE; } @@ -1211,7 +1211,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } if(!sfResult.fCancelled) { - UpdateUI(UPDATE_ALL); + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE | UPDATE_DASHBOARD); } return TRUE; } @@ -1235,7 +1235,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) ABOUT_RESULT sfResult; CAboutDlg dlgAbout(&sfResult); ArtShowDialog(&dlgAbout); - UpdateUI(UPDATE_ALL); + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE | UPDATE_DASHBOARD); return TRUE; } case ID_OPTIONS_TRACTIONCIRCLE: @@ -1582,7 +1582,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) DeleteObject(hdcMemDC); ReleaseDC(NULL,hdcSource); ReleaseDC(hWnd,hdcWindow); - UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST | UPDATE_MENU | UPDATE_ALL); + UpdateUI(UPDATE_ALL); // InitAxes(setSelectedChannels); return TRUE; } @@ -1708,7 +1708,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return TRUE; } - case IDC_DISPLAYTYPE_RECEPTION: +/* case IDC_DISPLAYTYPE_RECEPTION: { switch(HIWORD(wParam)) { @@ -1719,7 +1719,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return TRUE; } - case IDC_DISPLAYTYPE_PLOT: +*/ case IDC_DISPLAYTYPE_PLOT: { switch(HIWORD(wParam)) { @@ -1760,23 +1760,24 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { case BN_CLICKED: ApplyDriverNameToSelectedLaps(::g_pLapDB); - UpdateUI(UPDATE_ALL); //the list causes everything to redraw + UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); // Redraw the laplist and buttons break; } return TRUE; } - case IDC_CLEARSELECTION: +/* case IDC_CLEARCOMMENT: // This button clears the comment field { switch(HIWORD(wParam)) { case BN_CLICKED: - m_sfLapList.Clear(); - UpdateUI(UPDATE_ALL); + m_szCommentText[0] = '\0'; + SendMessage(GetDlgItem(m_hWnd, IDC_COMMENTTEXT), WM_SETTEXT, NUMCHARS(m_szCommentText), (LPARAM)m_szCommentText); +// UpdateUI(UPDATE_ALL); break; } return TRUE; } - case IDC_COMMENTTEXT: +*/ case IDC_COMMENTTEXT: { switch(HIWORD(wParam)) { @@ -1979,14 +1980,15 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) vector laps = GetSortedLaps(m_sfLapOpts.eSortPreference); // translates our m_mapLaps into a vector sorted by time for(int x = 0;x < laps.size(); x++) { - vector lstStrings; - laps[x]->GetStrings(lstStrings); - m_sfLapList.AddStrings(lstStrings, (LPARAM)laps[x]); + vector lstStrings; + laps[x]->GetStrings(lstStrings); + m_sfLapList.AddStrings(lstStrings, (LPARAM)laps[x]); } m_sfLapList.SetSelectedData(setSelectedData); if(laps.size() > 0) { - m_sfLapList.MakeVisible((LPARAM)laps[laps.size()-1]); + m_sfLapList.MakeVisible((LPARAM)laps[laps.size()-1]); // Always set the last lap as visible in the Lap List +// m_sfLapList.MakeVisible( (LPARAM)m_sfLapList.GetSelectedItemsData3() ); } } if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_VALUES)) @@ -2222,7 +2224,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) void HandleResize(SIZE sNewSize) { HandleCtlResize(sNewSize, IDC_DISPLAY, true, true); // main display window - HandleCtlResize(sNewSize, IDC_SUBDISPLAY, false, false); // sub display window +// HandleCtlResize(sNewSize, IDC_SUBDISPLAY, false, false); // sub display window + HandleCtlResize(sNewSize, IDC_SUBDISPLAY, true, false); // sub display window HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window } @@ -2500,49 +2503,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } } -COLORREF colorShade (COLORREF c, float fPercent) -// create a darker shade (by fPercent %) of a given colour -{ - return RGB ((BYTE) ((float) GetRValue (c) * fPercent / 100.0), - (BYTE) ((float) GetGValue (c) * fPercent / 100.0), - (BYTE) ((float) GetBValue (c) * fPercent / 100.0)); -} - -void EraseAlternatingRowBkgnds (HWND hWnd, HDC hDC) -// re-draw row backgrounds with the appropriate background colour -{ - COLORREF d_BlackColor = RGB(0, 0, 0); // Black - COLORREF d_WhiteColor = RGB(255, 255, 255); // White - COLORREF d_RedColor = RGB(230, 20, 20); // Red - COLORREF d_GreenColor = RGB(20, 230, 20); // Green - COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey - RECT rect; // row rectangle - POINT pt; - int iItems, - iTop; - HBRUSH brushCol1, // 1st colour - brushCol2; // 2nd colour - - brushCol1 = CreateSolidBrush (GetSysColor (COLOR_WINDOW)); // create coloured brushes - brushCol2 = CreateSolidBrush (colorShade (GetSysColor (COLOR_WINDOW), 90.0)); - GetClientRect (hWnd, &rect); // get horizontal dimensions of row - iItems = ListView_GetCountPerPage (hWnd); // number of displayed rows - iTop = ListView_GetTopIndex (hWnd); // first visible row - ListView_GetItemPosition (hWnd, iTop, &pt); - - for (int i=iTop ; i<=iTop+iItems ; i++) - { - rect.top = pt.y; // set row vertical dimensions - ListView_GetItemPosition (hWnd, i+1, &pt); - rect.bottom = pt.y; - FillRect (hDC, &rect, (i % 2) ? brushCol2 : brushCol1); // fill row with appropriate colour - } - -// cleanup - DeleteObject (brushCol1); - DeleteObject (brushCol2); -} - void UpdateSectors() { // Update the Sector Times display diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index d79bd09..9d15e84 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -14,8 +14,10 @@ BEGIN CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 LTEXT "",IDC_DISPLAY,155,63,590,282 - LTEXT "",IDC_SUBDISPLAY,520,0,87,63 - LTEXT "",IDC_TRACTIONCIRCLEMAP,610,0,63,63 +// LTEXT "",IDC_SUBDISPLAY,520,0,87,63 +// LTEXT "",IDC_TRACTIONCIRCLEMAP,610,0,63,63 + LTEXT "",IDC_TRACTIONCIRCLEMAP,520,0,63,63 + LTEXT "",IDC_SUBDISPLAY,586,0,87,63 AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 AUTORADIOBUTTON "Data Plot",IDC_DISPLAYTYPE_PLOT,185,0,45,12 //AUTORADIOBUTTON "Reception",IDC_DISPLAYTYPE_RECEPTION,230,0,50,12 @@ -24,14 +26,17 @@ BEGIN EDITTEXT IDC_COMMENTTEXT, 155,12,93,12 PUSHBUTTON "Set Comment", IDC_SETDRIVER, 250,0,75,12 +// PUSHBUTTON "Clear Comment", IDC_CLEARCOMMENT, 250,14,75,12 +// PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,28,75,12 +// PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,42,75,12 PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,14,75,12 - PUSHBUTTON "Clear Selection", IDC_CLEARSELECTION, 250,28,75,12 - PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,42,75,12 + PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,28,75,12 LTEXT "", IDC_CURRENTREFERENCE, 155,26,93,24 LTEXT "", IDC_MESSAGESTATUS, 155,43,93,24 LTEXT "Phone: ", IDC_CURRENTREMOTEIP, 155,55,100,10 - LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,55,70,10 +// LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,55,70,10 + LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,42,70,10 CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 END @@ -179,7 +184,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0004\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0005\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index fedba0e..95bacc7 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -16,7 +16,7 @@ #define IDC_LIVELAPTIME 17 #define IDC_CURRENTREFERENCE 18 #define IDC_CURRENTREMOTEIP 19 -#define IDC_CLEARSELECTION 20 +#define IDC_CLEARCOMMENT 20 #define IDM_OPTIONS 21 #define ID_OPTIONS_KMH 22 #define ID_OPTIONS_MPH 23 diff --git a/PitsideConsole/PitsideConsole/transformations.txt b/PitsideConsole/PitsideConsole/transformations.txt index 2f239df..428751d 100644 --- a/PitsideConsole/PitsideConsole/transformations.txt +++ b/PitsideConsole/PitsideConsole/transformations.txt @@ -3,7 +3,7 @@ P951: Oil Pressure (Bars) 3.26 0.0 0 -P951: Fuel Level % +P951: Fuel Level %% 115.6 -40.1 0.0 @@ -18,18 +18,63 @@ P951: Alternator Voltage 3.57 0.0 0 +P951: Brake Pos %% +0.0 +37.0 +0.0 +0 P951: Tachometer RPM 0.0 31.8 0.0 0 +P924S: Tachometer RPM +0.0 +31.8 +0.0 +0 +P924S: Oil Pressure (Bars) +1.12 +-2.52 +1.41 +0 +P924S: Oil Temp (F) +392.6 +-87.83 +0 +0 +P924S: Fuel Level %% +116 +-49.8 +0.0 +0 +P924S: Coolant T (C) +154.5 +-77.43 +13.0 +0 +P924S: Alternator Voltage +0.0 +5.17 +0.0 +0 +P924S: Brake Pos %% +0.0 +37.0 +0.0 +0 +P924S: Throttle Pos %% +-22.45 +51.0 +0.0 +0 P924: Oil Pressure (Bars) -1.16 +1.16 –2.96 1.84 0 -P924: Gas Tank Reading % -125 +P924: Fuel Level %% +125 -51.8 0.0 0 @@ -43,6 +88,11 @@ P924: Alternator Voltage 5.28 0.0 0 +P924: Brake Pos %% +0.0 +37.0 +0.0 +0 // This file contains quadratic coefficients for transforming raw voltages into meaningful units. You can put up to 100 different transformations into this file for your setup. diff --git a/PitsideConsole/ZLib/.gitignore b/PitsideConsole/ZLib/.gitignore deleted file mode 100644 index 043d84f..0000000 --- a/PitsideConsole/ZLib/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -Debug -Release \ No newline at end of file diff --git a/PitsideConsole/ZLib/ReadMe.txt b/PitsideConsole/ZLib/ReadMe.txt deleted file mode 100644 index 693f898..0000000 --- a/PitsideConsole/ZLib/ReadMe.txt +++ /dev/null @@ -1,29 +0,0 @@ -======================================================================== - STATIC LIBRARY : ZLib Project Overview -======================================================================== - -AppWizard has created this ZLib library project for you. - -No source files were created as part of your project. - - -ZLib.vcxproj - This is the main project file for VC++ projects generated using an Application Wizard. - It contains information about the version of Visual C++ that generated the file, and - information about the platforms, configurations, and project features selected with the - Application Wizard. - -ZLib.vcxproj.filters - This is the filters file for VC++ projects generated using an Application Wizard. - It contains information about the association between the files in your project - and the filters. This association is used in the IDE to show grouping of files with - similar extensions under a specific node (for e.g. ".cpp" files are associated with the - "Source Files" filter). - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -AppWizard uses "TODO:" comments to indicate parts of the source code you -should add to or customize. - -///////////////////////////////////////////////////////////////////////////// diff --git a/PitsideConsole/ZLib/ZLib.vcxproj b/PitsideConsole/ZLib/ZLib.vcxproj deleted file mode 100644 index ff5595f..0000000 --- a/PitsideConsole/ZLib/ZLib.vcxproj +++ /dev/null @@ -1,109 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {08C9BB96-9EF4-4E8B-9227-5AC50E394C7A} - Win32Proj - ZLib - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - MultiThreaded - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/PitsideConsole/ZLib/ZLib.vcxproj.filters b/PitsideConsole/ZLib/ZLib.vcxproj.filters deleted file mode 100644 index 7f0a7df..0000000 --- a/PitsideConsole/ZLib/ZLib.vcxproj.filters +++ /dev/null @@ -1,105 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/PitsideConsole/ZLib/ZLib.vcxproj.user b/PitsideConsole/ZLib/ZLib.vcxproj.user deleted file mode 100644 index ace9a86..0000000 --- a/PitsideConsole/ZLib/ZLib.vcxproj.user +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/PitsideConsole/ZLib/adler32.c b/PitsideConsole/ZLib/adler32.c deleted file mode 100644 index a868f07..0000000 --- a/PitsideConsole/ZLib/adler32.c +++ /dev/null @@ -1,179 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2011 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" - -#define local static - -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - -#define BASE 65521 /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware -- - try it both ways to see which is faster */ -#ifdef NO_DIVIDE -/* note that this assumes BASE is 65521, where 65536 % 65521 == 15 - (thank you to John Reiser for pointing this out) */ -# define CHOP(a) \ - do { \ - unsigned long tmp = a >> 16; \ - a &= 0xffffUL; \ - a += (tmp << 4) - tmp; \ - } while (0) -# define MOD28(a) \ - do { \ - CHOP(a); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD(a) \ - do { \ - CHOP(a); \ - MOD28(a); \ - } while (0) -# define MOD63(a) \ - do { /* this assumes a is not negative */ \ - z_off64_t tmp = a >> 32; \ - a &= 0xffffffffL; \ - a += (tmp << 8) - (tmp << 5) + tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - tmp = a >> 16; \ - a &= 0xffffL; \ - a += (tmp << 4) - tmp; \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD28(a) a %= BASE -# define MOD63(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD28(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* for negative len, return invalid adler32 as a clue for debugging */ - if (len2 < 0) - return 0xffffffffUL; - - /* the derivation of this formula is left as an exercise for the reader */ - MOD63(len2); /* assumes len2 >= 0 */ - rem = (unsigned)len2; - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 >= BASE) sum1 -= BASE; - if (sum1 >= BASE) sum1 -= BASE; - if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 >= BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} - -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ - return adler32_combine_(adler1, adler2, len2); -} diff --git a/PitsideConsole/ZLib/compress.c b/PitsideConsole/ZLib/compress.c deleted file mode 100644 index ea4dfbe..0000000 --- a/PitsideConsole/ZLib/compress.c +++ /dev/null @@ -1,80 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== - */ -int ZEXPORT compress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} - -/* =========================================================================== - If the default memLevel or windowBits for deflateInit() is changed, then - this function needs to be updated. - */ -uLong ZEXPORT compressBound (sourceLen) - uLong sourceLen; -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13; -} diff --git a/PitsideConsole/ZLib/crc32.c b/PitsideConsole/ZLib/crc32.c deleted file mode 100644 index 979a719..0000000 --- a/PitsideConsole/ZLib/crc32.c +++ /dev/null @@ -1,425 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id$ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Definitions for doing the crc four data bytes at a time. */ -#if !defined(NOBYFOUR) && defined(Z_U4) -# define BYFOUR -#endif -#ifdef BYFOUR - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); - - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local z_crc_t FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each - incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - z_crc_t c; - int n, k; - z_crc_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (z_crc_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (z_crc_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const z_crc_t FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const z_crc_t FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", - (unsigned long)(table[n]), - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const z_crc_t FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - z_crc_t endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - unsigned len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; - } - - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(ZSWAP32(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} - -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - return crc32_combine_(crc1, crc2, len2); -} diff --git a/PitsideConsole/ZLib/crc32.h b/PitsideConsole/ZLib/crc32.h deleted file mode 100644 index 9e0c778..0000000 --- a/PitsideConsole/ZLib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const z_crc_t FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/PitsideConsole/ZLib/deflate.c b/PitsideConsole/ZLib/deflate.c deleted file mode 100644 index 9e4c2cb..0000000 --- a/PitsideConsole/ZLib/deflate.c +++ /dev/null @@ -1,1965 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://tools.ietf.org/html/rfc1951 - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id$ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.7 Copyright 1995-2012 Jean-loup Gailly and Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ -#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->high_water = 0; /* nothing written to s->window yet */ - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ - deflate_state *s; - uInt str, n; - int wrap; - unsigned avail; - unsigned char *next; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) - return Z_STREAM_ERROR; - s = strm->state; - wrap = s->wrap; - if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead) - return Z_STREAM_ERROR; - - /* when using zlib wrappers, compute Adler-32 for provided dictionary */ - if (wrap == 1) - strm->adler = adler32(strm->adler, dictionary, dictLength); - s->wrap = 0; /* avoid computing Adler-32 in read_buf */ - - /* if dictionary would fill window, just replace the history */ - if (dictLength >= s->w_size) { - if (wrap == 0) { /* already empty otherwise */ - CLEAR_HASH(s); - s->strstart = 0; - s->block_start = 0L; - s->insert = 0; - } - dictionary += dictLength - s->w_size; /* use the tail */ - dictLength = s->w_size; - } - - /* insert dictionary into window and hash */ - avail = strm->avail_in; - next = strm->next_in; - strm->avail_in = dictLength; - strm->next_in = (Bytef *)dictionary; - fill_window(s); - while (s->lookahead >= MIN_MATCH) { - str = s->strstart; - n = s->lookahead - (MIN_MATCH-1); - do { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - } while (--n); - s->strstart = str; - s->lookahead = MIN_MATCH-1; - fill_window(s); - } - s->strstart += s->lookahead; - s->block_start = (long)s->strstart; - s->insert = s->lookahead; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - strm->next_in = next; - strm->avail_in = avail; - s->wrap = wrap; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateResetKeep (strm) - z_streamp strm; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ - int ret; - - ret = deflateResetKeep(strm); - if (ret == Z_OK) - lm_init(strm->state); - return ret; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePending (strm, pending, bits) - unsigned *pending; - int *bits; - z_streamp strm; -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (pending != Z_NULL) - *pending = strm->state->pending; - if (bits != Z_NULL) - *bits = strm->state->bi_valid; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ - deflate_state *s; - int put; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) - return Z_BUF_ERROR; - do { - put = Buf_size - s->bi_valid; - if (put > bits) - put = bits; - s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid); - s->bi_valid += put; - _tr_flush_bits(s); - value >>= put; - bits -= put; - } while (bits); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if ((strategy != s->strategy || func != configuration_table[level].func) && - strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_BLOCK); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. - */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ - deflate_state *s; - uLong complen, wraplen; - Bytef *str; - - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - - /* if can't get parameters, return conservative bound plus zlib wrapper */ - if (strm == Z_NULL || strm->state == Z_NULL) - return complen + 6; - - /* compute wrapper length */ - s = strm->state; - switch (s->wrap) { - case 0: /* raw deflate */ - wraplen = 0; - break; - case 1: /* zlib wrapper */ - wraplen = 6 + (s->strstart ? 4 : 0); - break; - case 2: /* gzip wrapper */ - wraplen = 18; - if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ - if (s->gzhead->extra != Z_NULL) - wraplen += 2 + s->gzhead->extra_len; - str = s->gzhead->name; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - str = s->gzhead->comment; - if (str != Z_NULL) - do { - wraplen++; - } while (*str++); - if (s->gzhead->hcrc) - wraplen += 2; - } - break; - default: /* for compiler happiness */ - wraplen = 6; - } - - /* if not default parameters, return conservative bound */ - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; - - /* default settings: return tight bound for that case */ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + - (sourceLen >> 25) + 13 - 6 + wraplen; -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending(strm) - z_streamp strm; -{ - unsigned len; - deflate_state *s = strm->state; - - _tr_flush_bits(s); - len = s->pending; - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, s->pending_out, len); - strm->next_out += len; - s->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - s->pending -= len; - if (s->pending == 0) { - s->pending_out = s->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_BLOCK || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == Z_NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != Z_NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - (s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush)); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - if (s->lookahead == 0) { - s->strstart = 0; - s->block_start = 0L; - s->insert = 0; - } - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, buf, len); - } -#endif - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); -#else - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; - register Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ - -#else /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for FASTEST only - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ - register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ - register int len; /* length of current match */ - register Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#endif /* FASTEST */ - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - register unsigned n, m; - register Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, last) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (last)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, last) { \ - FLUSH_BLOCK_ONLY(s, last); \ - if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if ((long)s->strstart > s->block_start) - FLUSH_BLOCK(s, 0); - return block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match (s, hash_head); - /* longest_match() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ - IPos hash_head; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - hash_head = NIL; - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - s->match_length = longest_match (s, hash_head); - /* longest_match() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} -#endif /* FASTEST */ - -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt prev; /* byte at distance one to match */ - Bytef *scan, *strend; /* scan goes up to strend for length of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest run, plus one for the unrolled loop. - */ - if (s->lookahead <= MAX_MATCH) { - fill_window(s); - if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - s->match_length = 0; - if (s->lookahead >= MIN_MATCH && s->strstart > 0) { - scan = s->window + s->strstart - 1; - prev = *scan; - if (prev == *++scan && prev == *++scan && prev == *++scan) { - strend = s->window + s->strstart + MAX_MATCH; - do { - } while (prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - prev == *++scan && prev == *++scan && - scan < strend); - s->match_length = MAX_MATCH - (int)(strend - scan); - if (s->match_length > s->lookahead) - s->match_length = s->lookahead; - } - Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, s->match_length); - - _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - s->strstart += s->match_length; - s->match_length = 0; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} - -/* =========================================================================== - * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. - * (It will be regenerated if this run of deflate switches away from Huffman.) - */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we have a literal to write. */ - if (s->lookahead == 0) { - fill_window(s); - if (s->lookahead == 0) { - if (flush == Z_NO_FLUSH) - return need_more; - break; /* flush the current block */ - } - } - - /* Output a literal byte */ - s->match_length = 0; - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - if (bflush) FLUSH_BLOCK(s, 0); - } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); - return finish_done; - } - if (s->last_lit) - FLUSH_BLOCK(s, 0); - return block_done; -} diff --git a/PitsideConsole/ZLib/deflate.h b/PitsideConsole/ZLib/deflate.h deleted file mode 100644 index fbac44d..0000000 --- a/PitsideConsole/ZLib/deflate.h +++ /dev/null @@ -1,346 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2012 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define Buf_size 16 -/* size of bit buffer in bi_buf */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to suppress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - uInt insert; /* bytes at end of window left to insert */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - - ulg high_water; - /* High water mark offset in window for initialized bytes -- bytes above - * this are set to zero in order to avoid memory check warnings when - * longest match routines access bytes past the input. This is then - * updated to the new high water mark. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - -#define WIN_INIT MAX_MATCH -/* Number of bytes after end of data in window to initialize in order to avoid - memory checker errors from longest match routines */ - - /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch ZLIB_INTERNAL _length_code[]; - extern uch ZLIB_INTERNAL _dist_code[]; -#else - extern const uch ZLIB_INTERNAL _length_code[]; - extern const uch ZLIB_INTERNAL _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/PitsideConsole/ZLib/gzclose.c b/PitsideConsole/ZLib/gzclose.c deleted file mode 100644 index caeb99a..0000000 --- a/PitsideConsole/ZLib/gzclose.c +++ /dev/null @@ -1,25 +0,0 @@ -/* gzclose.c -- zlib gzclose() function - * Copyright (C) 2004, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* gzclose() is in a separate file so that it is linked in only if it is used. - That way the other gzclose functions can be used instead to avoid linking in - unneeded compression or decompression routines. */ -int ZEXPORT gzclose(file) - gzFile file; -{ -#ifndef NO_GZCOMPRESS - gz_statep state; - - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file); -#else - return gzclose_r(file); -#endif -} diff --git a/PitsideConsole/ZLib/gzguts.h b/PitsideConsole/ZLib/gzguts.h deleted file mode 100644 index ee3f281..0000000 --- a/PitsideConsole/ZLib/gzguts.h +++ /dev/null @@ -1,193 +0,0 @@ -/* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#ifdef _LARGEFILE64_SOURCE -# ifndef _LARGEFILE_SOURCE -# define _LARGEFILE_SOURCE 1 -# endif -# ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -# endif -#endif - -#ifdef HAVE_HIDDEN -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif - -#include -#include "zlib.h" -#ifdef STDC -# include -# include -# include -#endif -#include - -#ifdef _WIN32 -# include -#endif - -#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) -# include -#endif - -#ifdef NO_DEFLATE /* for compatibility with old definition */ -# define NO_GZCOMPRESS -#endif - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif - -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif - -#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif - -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS -/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 -/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) -# define vsnprintf _vsnprintf -# endif -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -# ifdef VMS -# define NO_vsnprintf -# endif -# ifdef __OS400__ -# define NO_vsnprintf -# endif -# ifdef __MVS__ -# define NO_vsnprintf -# endif -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -/* gz* functions always use library allocation functions */ -#ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); -#endif - -/* get errno and strerror definition */ -#if defined UNDER_CE -# include -# define zstrerror() gz_strwinerror((DWORD)GetLastError()) -#else -# ifndef NO_STRERROR -# include -# define zstrerror() strerror(errno) -# else -# define zstrerror() "stdio error (consult errno)" -# endif -#endif - -/* provide prototypes for these when building zlib without LFS */ -#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); -#endif - -/* default memLevel */ -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif - -/* default i/o buffer size -- double this for output when reading */ -#define GZBUFSIZE 8192 - -/* gzip modes, also provide a little integrity check on the passed structure */ -#define GZ_NONE 0 -#define GZ_READ 7247 -#define GZ_WRITE 31153 -#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ - -/* values for gz_state how */ -#define LOOK 0 /* look for a gzip header */ -#define COPY 1 /* copy input directly */ -#define GZIP 2 /* decompress a gzip stream */ - -/* internal gzip file state data structure */ -typedef struct { - /* exposed contents for gzgetc() macro */ - struct gzFile_s x; /* "x" for exposed */ - /* x.have: number of bytes available at x.next */ - /* x.next: next output data to deliver or write */ - /* x.pos: current position in uncompressed data */ - /* used for both reading and writing */ - int mode; /* see gzip modes above */ - int fd; /* file descriptor */ - char *path; /* path or fd for error messages */ - unsigned size; /* buffer size, zero if not allocated yet */ - unsigned want; /* requested buffer size, default is GZBUFSIZE */ - unsigned char *in; /* input buffer */ - unsigned char *out; /* output buffer (double-sized when reading) */ - int direct; /* 0 if processing gzip, 1 if transparent */ - /* just for reading */ - int how; /* 0: get header, 1: copy, 2: decompress */ - z_off64_t start; /* where the gzip data started, for rewinding */ - int eof; /* true if end of input file reached */ - int past; /* true if read requested past end */ - /* just for writing */ - int level; /* compression level */ - int strategy; /* compression strategy */ - /* seek request */ - z_off64_t skip; /* amount to skip (already rewound if backwards) */ - int seek; /* true if seek request pending */ - /* error information */ - int err; /* error code */ - char *msg; /* error message */ - /* zlib inflate or deflate stream */ - z_stream strm; /* stream structure in-place (not a pointer) */ -} gz_state; -typedef gz_state FAR *gz_statep; - -/* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); -#if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); -#endif - -/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t - value -- needed when comparing unsigned to z_off64_t, which is signed - (possible z_off64_t types off_t, off64_t, and long are all signed) */ -#ifdef INT_MAX -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) -#else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) -#endif diff --git a/PitsideConsole/ZLib/gzlib.c b/PitsideConsole/ZLib/gzlib.c deleted file mode 100644 index ca55c6e..0000000 --- a/PitsideConsole/ZLib/gzlib.c +++ /dev/null @@ -1,620 +0,0 @@ -/* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010, 2011, 2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -#if defined(_WIN32) && !defined(__BORLANDC__) -# define LSEEK _lseeki64 -#else -#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 -# define LSEEK lseek64 -#else -# define LSEEK lseek -#endif -#endif - -/* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); - -#if defined UNDER_CE - -/* Map the Windows error number in ERROR to a locale-dependent error message - string and return a pointer to it. Typically, the values for ERROR come - from GetLastError. - - The string pointed to shall not be modified by the application, but may be - overwritten by a subsequent call to gz_strwinerror - - The gz_strwinerror function does not change the current setting of - GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror (error) - DWORD error; -{ - static char buf[1024]; - - wchar_t *msgbuf; - DWORD lasterr = GetLastError(); - DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_ALLOCATE_BUFFER, - NULL, - error, - 0, /* Default language */ - (LPVOID)&msgbuf, - 0, - NULL); - if (chars != 0) { - /* If there is an \r\n appended, zap it. */ - if (chars >= 2 - && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { - chars -= 2; - msgbuf[chars] = 0; - } - - if (chars > sizeof (buf) - 1) { - chars = sizeof (buf) - 1; - msgbuf[chars] = 0; - } - - wcstombs(buf, msgbuf, chars + 1); - LocalFree(msgbuf); - } - else { - sprintf(buf, "unknown win32 error (%ld)", error); - } - - SetLastError(lasterr); - return buf; -} - -#endif /* UNDER_CE */ - -/* Reset gzip file state */ -local void gz_reset(state) - gz_statep state; -{ - state->x.have = 0; /* no output data available */ - if (state->mode == GZ_READ) { /* for reading ... */ - state->eof = 0; /* not at end of file */ - state->past = 0; /* have not read past end yet */ - state->how = LOOK; /* look for gzip header */ - } - state->seek = 0; /* no seek request pending */ - gz_error(state, Z_OK, NULL); /* clear error */ - state->x.pos = 0; /* no uncompressed data yet */ - state->strm.avail_in = 0; /* no input data yet */ -} - -/* Open a gzip file either by name or file descriptor. */ -local gzFile gz_open(path, fd, mode) - const void *path; - int fd; - const char *mode; -{ - gz_statep state; - size_t len; - int oflag; -#ifdef O_CLOEXEC - int cloexec = 0; -#endif -#ifdef O_EXCL - int exclusive = 0; -#endif - - /* check input */ - if (path == NULL) - return NULL; - - /* allocate gzFile structure to return */ - state = malloc(sizeof(gz_state)); - if (state == NULL) - return NULL; - state->size = 0; /* no buffers allocated yet */ - state->want = GZBUFSIZE; /* requested buffer size */ - state->msg = NULL; /* no error message yet */ - - /* interpret mode */ - state->mode = GZ_NONE; - state->level = Z_DEFAULT_COMPRESSION; - state->strategy = Z_DEFAULT_STRATEGY; - state->direct = 0; - while (*mode) { - if (*mode >= '0' && *mode <= '9') - state->level = *mode - '0'; - else - switch (*mode) { - case 'r': - state->mode = GZ_READ; - break; -#ifndef NO_GZCOMPRESS - case 'w': - state->mode = GZ_WRITE; - break; - case 'a': - state->mode = GZ_APPEND; - break; -#endif - case '+': /* can't read and write at the same time */ - free(state); - return NULL; - case 'b': /* ignore -- will request binary anyway */ - break; -#ifdef O_CLOEXEC - case 'e': - cloexec = 1; - break; -#endif -#ifdef O_EXCL - case 'x': - exclusive = 1; - break; -#endif - case 'f': - state->strategy = Z_FILTERED; - break; - case 'h': - state->strategy = Z_HUFFMAN_ONLY; - break; - case 'R': - state->strategy = Z_RLE; - break; - case 'F': - state->strategy = Z_FIXED; - case 'T': - state->direct = 1; - default: /* could consider as an error, but just ignore */ - ; - } - mode++; - } - - /* must provide an "r", "w", or "a" */ - if (state->mode == GZ_NONE) { - free(state); - return NULL; - } - - /* can't force transparent read */ - if (state->mode == GZ_READ) { - if (state->direct) { - free(state); - return NULL; - } - state->direct = 1; /* for empty file */ - } - - /* save the path name for error messages */ -#ifdef _WIN32 - if (fd == -2) { - len = wcstombs(NULL, path, 0); - if (len == (size_t)-1) - len = 0; - } - else -#endif - len = strlen(path); - state->path = malloc(len + 1); - if (state->path == NULL) { - free(state); - return NULL; - } -#ifdef _WIN32 - if (fd == -2) - if (len) - wcstombs(state->path, path, len + 1); - else - *(state->path) = 0; - else -#endif - strcpy(state->path, path); - - /* compute the flags for open() */ - oflag = -#ifdef O_LARGEFILE - O_LARGEFILE | -#endif -#ifdef O_BINARY - O_BINARY | -#endif -#ifdef O_CLOEXEC - (cloexec ? O_CLOEXEC : 0) | -#endif - (state->mode == GZ_READ ? - O_RDONLY : - (O_WRONLY | O_CREAT | -#ifdef O_EXCL - (exclusive ? O_EXCL : 0) | -#endif - (state->mode == GZ_WRITE ? - O_TRUNC : - O_APPEND))); - - /* open the file with the appropriate flags (or just use fd) */ - state->fd = fd > -1 ? fd : ( -#ifdef _WIN32 - fd == -2 ? _wopen(path, oflag, 0666) : -#endif - open(path, oflag, 0666)); - if (state->fd == -1) { - free(state->path); - free(state); - return NULL; - } - if (state->mode == GZ_APPEND) - state->mode = GZ_WRITE; /* simplify later checks */ - - /* save the current position for rewinding (only if reading) */ - if (state->mode == GZ_READ) { - state->start = LSEEK(state->fd, 0, SEEK_CUR); - if (state->start == -1) state->start = 0; - } - - /* initialize stream */ - gz_reset(state); - - /* return stream */ - return (gzFile)state; -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzopen(path, mode) - const char *path; - const char *mode; -{ - return gz_open(path, -1, mode); -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzopen64(path, mode) - const char *path; - const char *mode; -{ - return gz_open(path, -1, mode); -} - -/* -- see zlib.h -- */ -gzFile ZEXPORT gzdopen(fd, mode) - int fd; - const char *mode; -{ - char *path; /* identifier for error messages */ - gzFile gz; - - if (fd == -1 || (path = malloc(7 + 3 * sizeof(int))) == NULL) - return NULL; - sprintf(path, "", fd); /* for debugging */ - gz = gz_open(path, fd, mode); - free(path); - return gz; -} - -/* -- see zlib.h -- */ -#ifdef _WIN32 -gzFile ZEXPORT gzopen_w(path, mode) - const wchar_t *path; - const char *mode; -{ - return gz_open(path, -2, mode); -} -#endif - -/* -- see zlib.h -- */ -int ZEXPORT gzbuffer(file, size) - gzFile file; - unsigned size; -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* make sure we haven't already allocated memory */ - if (state->size != 0) - return -1; - - /* check and set requested size */ - if (size < 2) - size = 2; /* need two bytes to check magic header */ - state->want = size; - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzrewind(file) - gzFile file; -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* back up and start over */ - if (LSEEK(state->fd, state->start, SEEK_SET) == -1) - return -1; - gz_reset(state); - return 0; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gzseek64(file, offset, whence) - gzFile file; - z_off64_t offset; - int whence; -{ - unsigned n; - z_off64_t ret; - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* check that there's no error */ - if (state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - - /* can only seek from start or relative to current position */ - if (whence != SEEK_SET && whence != SEEK_CUR) - return -1; - - /* normalize offset to a SEEK_CUR specification */ - if (whence == SEEK_SET) - offset -= state->x.pos; - else if (state->seek) - offset += state->skip; - state->seek = 0; - - /* if within raw area while reading, just go there */ - if (state->mode == GZ_READ && state->how == COPY && - state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); - if (ret == -1) - return -1; - state->x.have = 0; - state->eof = 0; - state->past = 0; - state->seek = 0; - gz_error(state, Z_OK, NULL); - state->strm.avail_in = 0; - state->x.pos += offset; - return state->x.pos; - } - - /* calculate skip amount, rewinding if needed for back seek when reading */ - if (offset < 0) { - if (state->mode != GZ_READ) /* writing -- can't go backwards */ - return -1; - offset += state->x.pos; - if (offset < 0) /* before start of file! */ - return -1; - if (gzrewind(file) == -1) /* rewind, then skip to offset */ - return -1; - } - - /* if reading, skip what's in output buffer (one less gzgetc() check) */ - if (state->mode == GZ_READ) { - n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ? - (unsigned)offset : state->x.have; - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - offset -= n; - } - - /* request skip (if not zero) */ - if (offset) { - state->seek = 1; - state->skip = offset; - } - return state->x.pos + offset; -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gzseek(file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ - z_off64_t ret; - - ret = gzseek64(file, (z_off64_t)offset, whence); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gztell64(file) - gzFile file; -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* return position */ - return state->x.pos + (state->seek ? state->skip : 0); -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gztell(file) - gzFile file; -{ - z_off64_t ret; - - ret = gztell64(file); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -z_off64_t ZEXPORT gzoffset64(file) - gzFile file; -{ - z_off64_t offset; - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return -1; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return -1; - - /* compute and return effective offset in file */ - offset = LSEEK(state->fd, 0, SEEK_CUR); - if (offset == -1) - return -1; - if (state->mode == GZ_READ) /* reading */ - offset -= state->strm.avail_in; /* don't count buffered input */ - return offset; -} - -/* -- see zlib.h -- */ -z_off_t ZEXPORT gzoffset(file) - gzFile file; -{ - z_off64_t ret; - - ret = gzoffset64(file); - return ret == (z_off_t)ret ? (z_off_t)ret : -1; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzeof(file) - gzFile file; -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return 0; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return 0; - - /* return end-of-file state */ - return state->mode == GZ_READ ? state->past : 0; -} - -/* -- see zlib.h -- */ -const char * ZEXPORT gzerror(file, errnum) - gzFile file; - int *errnum; -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return NULL; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return NULL; - - /* return error information */ - if (errnum != NULL) - *errnum = state->err; - return state->msg == NULL ? "" : state->msg; -} - -/* -- see zlib.h -- */ -void ZEXPORT gzclearerr(file) - gzFile file; -{ - gz_statep state; - - /* get internal structure and check integrity */ - if (file == NULL) - return; - state = (gz_statep)file; - if (state->mode != GZ_READ && state->mode != GZ_WRITE) - return; - - /* clear error and end-of-file */ - if (state->mode == GZ_READ) { - state->eof = 0; - state->past = 0; - } - gz_error(state, Z_OK, NULL); -} - -/* Create an error message in allocated memory and set state->err and - state->msg accordingly. Free any previous error message already there. Do - not try to free or allocate space if the error is Z_MEM_ERROR (out of - memory). Simply save the error message as a static string. If there is an - allocation failure constructing the error message, then convert the error to - out of memory. */ -void ZLIB_INTERNAL gz_error(state, err, msg) - gz_statep state; - int err; - const char *msg; -{ - /* free previously allocated message and clear */ - if (state->msg != NULL) { - if (state->err != Z_MEM_ERROR) - free(state->msg); - state->msg = NULL; - } - - /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */ - if (err != Z_OK && err != Z_BUF_ERROR) - state->x.have = 0; - - /* set error code, and if no message, then done */ - state->err = err; - if (msg == NULL) - return; - - /* for an out of memory error, save as static string */ - if (err == Z_MEM_ERROR) { - state->msg = (char *)msg; - return; - } - - /* construct error message with path */ - if ((state->msg = malloc(strlen(state->path) + strlen(msg) + 3)) == NULL) { - state->err = Z_MEM_ERROR; - state->msg = (char *)"out of memory"; - return; - } - strcpy(state->msg, state->path); - strcat(state->msg, ": "); - strcat(state->msg, msg); - return; -} - -#ifndef INT_MAX -/* portably return maximum value for an int (when limits.h presumed not - available) -- we need to do this to cover cases where 2's complement not - used, since C standard permits 1's complement and sign-bit representations, - otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax() -{ - unsigned p, q; - - p = 1; - do { - q = p; - p <<= 1; - p++; - } while (p > q); - return q >> 1; -} -#endif diff --git a/PitsideConsole/ZLib/gzread.c b/PitsideConsole/ZLib/gzread.c deleted file mode 100644 index 3493d34..0000000 --- a/PitsideConsole/ZLib/gzread.c +++ /dev/null @@ -1,589 +0,0 @@ -/* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); - -/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from - state->fd, and update state->eof, state->err, and state->msg as appropriate. - This function needs to loop on read(), since read() is not guaranteed to - read the number of bytes requested, depending on the type of descriptor. */ -local int gz_load(state, buf, len, have) - gz_statep state; - unsigned char *buf; - unsigned len; - unsigned *have; -{ - int ret; - - *have = 0; - do { - ret = read(state->fd, buf + *have, len - *have); - if (ret <= 0) - break; - *have += ret; - } while (*have < len); - if (ret < 0) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - if (ret == 0) - state->eof = 1; - return 0; -} - -/* Load up input buffer and set eof flag if last data loaded -- return -1 on - error, 0 otherwise. Note that the eof flag is set when the end of the input - file is reached, even though there may be unused data in the buffer. Once - that data has been used, no more attempts will be made to read the file. - If strm->avail_in != 0, then the current data is moved to the beginning of - the input buffer, and then the remainder of the buffer is loaded with the - available data from the input file. */ -local int gz_avail(state) - gz_statep state; -{ - unsigned got; - z_streamp strm = &(state->strm); - - if (state->err != Z_OK && state->err != Z_BUF_ERROR) - return -1; - if (state->eof == 0) { - if (strm->avail_in) { /* copy what's there to the start */ - unsigned char *p = state->in, *q = strm->next_in; - unsigned n = strm->avail_in; - do { - *p++ = *q++; - } while (--n); - } - if (gz_load(state, state->in + strm->avail_in, - state->size - strm->avail_in, &got) == -1) - return -1; - strm->avail_in += got; - strm->next_in = state->in; - } - return 0; -} - -/* Look for gzip header, set up for inflate or copy. state->x.have must be 0. - If this is the first time in, allocate required memory. state->how will be - left unchanged if there is no more input data available, will be set to COPY - if there is no gzip header and direct copying will be performed, or it will - be set to GZIP for decompression. If direct copying, then leftover input - data from the input buffer will be copied to the output buffer. In that - case, all further file reads will be directly to either the output buffer or - a user buffer. If decompressing, the inflate state will be initialized. - gz_look() will return 0 on success or -1 on failure. */ -local int gz_look(state) - gz_statep state; -{ - z_streamp strm = &(state->strm); - - /* allocate read buffers and inflate memory */ - if (state->size == 0) { - /* allocate buffers */ - state->in = malloc(state->want); - state->out = malloc(state->want << 1); - if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - state->size = state->want; - - /* allocate inflate memory */ - state->strm.zalloc = Z_NULL; - state->strm.zfree = Z_NULL; - state->strm.opaque = Z_NULL; - state->strm.avail_in = 0; - state->strm.next_in = Z_NULL; - if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */ - free(state->out); - free(state->in); - state->size = 0; - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - } - - /* get at least the magic bytes in the input buffer */ - if (strm->avail_in < 2) { - if (gz_avail(state) == -1) - return -1; - if (strm->avail_in == 0) - return 0; - } - - /* look for gzip magic bytes -- if there, do gzip decoding (note: there is - a logical dilemma here when considering the case of a partially written - gzip file, to wit, if a single 31 byte is written, then we cannot tell - whether this is a single-byte file, or just a partially written gzip - file -- for here we assume that if a gzip file is being written, then - the header will be written in a single operation, so that reading a - single byte is sufficient indication that it is not a gzip file) */ - if (strm->avail_in > 1 && - strm->next_in[0] == 31 && strm->next_in[1] == 139) { - inflateReset(strm); - state->how = GZIP; - state->direct = 0; - return 0; - } - - /* no gzip header -- if we were decoding gzip before, then this is trailing - garbage. Ignore the trailing garbage and finish. */ - if (state->direct == 0) { - strm->avail_in = 0; - state->eof = 1; - state->x.have = 0; - return 0; - } - - /* doing raw i/o, copy any leftover input to output -- this assumes that - the output buffer is larger than the input buffer, which also assures - space for gzungetc() */ - state->x.next = state->out; - if (strm->avail_in) { - memcpy(state->x.next, strm->next_in, strm->avail_in); - state->x.have = strm->avail_in; - strm->avail_in = 0; - } - state->how = COPY; - state->direct = 1; - return 0; -} - -/* Decompress from input to the provided next_out and avail_out in the state. - On return, state->x.have and state->x.next point to the just decompressed - data. If the gzip stream completes, state->how is reset to LOOK to look for - the next gzip stream or raw data, once state->x.have is depleted. Returns 0 - on success, -1 on failure. */ -local int gz_decomp(state) - gz_statep state; -{ - int ret = Z_OK; - unsigned had; - z_streamp strm = &(state->strm); - - /* fill output buffer up to end of deflate stream */ - had = strm->avail_out; - do { - /* get more input for inflate() */ - if (strm->avail_in == 0 && gz_avail(state) == -1) - return -1; - if (strm->avail_in == 0) { - gz_error(state, Z_BUF_ERROR, "unexpected end of file"); - break; - } - - /* decompress and handle errors */ - ret = inflate(strm, Z_NO_FLUSH); - if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { - gz_error(state, Z_STREAM_ERROR, - "internal error: inflate stream corrupt"); - return -1; - } - if (ret == Z_MEM_ERROR) { - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ - gz_error(state, Z_DATA_ERROR, - strm->msg == NULL ? "compressed data error" : strm->msg); - return -1; - } - } while (strm->avail_out && ret != Z_STREAM_END); - - /* update available output */ - state->x.have = had - strm->avail_out; - state->x.next = strm->next_out - state->x.have; - - /* if the gzip stream completed successfully, look for another */ - if (ret == Z_STREAM_END) - state->how = LOOK; - - /* good decompression */ - return 0; -} - -/* Fetch data and put it in the output buffer. Assumes state->x.have is 0. - Data is either copied from the input file or decompressed from the input - file depending on state->how. If state->how is LOOK, then a gzip header is - looked for to determine whether to copy or decompress. Returns -1 on error, - otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the - end of the input file has been reached and all data has been processed. */ -local int gz_fetch(state) - gz_statep state; -{ - z_streamp strm = &(state->strm); - - do { - switch(state->how) { - case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */ - if (gz_look(state) == -1) - return -1; - if (state->how == LOOK) - return 0; - break; - case COPY: /* -> COPY */ - if (gz_load(state, state->out, state->size << 1, &(state->x.have)) - == -1) - return -1; - state->x.next = state->out; - return 0; - case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */ - strm->avail_out = state->size << 1; - strm->next_out = state->out; - if (gz_decomp(state) == -1) - return -1; - } - } while (state->x.have == 0 && (!state->eof || strm->avail_in)); - return 0; -} - -/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ -local int gz_skip(state, len) - gz_statep state; - z_off64_t len; -{ - unsigned n; - - /* skip over len bytes or reach end-of-file, whichever comes first */ - while (len) - /* skip over whatever is in output buffer */ - if (state->x.have) { - n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ? - (unsigned)len : state->x.have; - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - len -= n; - } - - /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && state->strm.avail_in == 0) - break; - - /* need more data to skip -- load up output buffer */ - else { - /* get more output, looking for header if required */ - if (gz_fetch(state) == -1) - return -1; - } - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzread(file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - unsigned got, n; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return -1; - } - - /* if len is zero, avoid unnecessary operations */ - if (len == 0) - return 0; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return -1; - } - - /* get len bytes to buf, or less than len if at the end */ - got = 0; - do { - /* first just try copying data from the output buffer */ - if (state->x.have) { - n = state->x.have > len ? len : state->x.have; - memcpy(buf, state->x.next, n); - state->x.next += n; - state->x.have -= n; - } - - /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) { - state->past = 1; /* tried to read past end */ - break; - } - - /* need output data -- for small len or new stream load up our output - buffer */ - else if (state->how == LOOK || len < (state->size << 1)) { - /* get more output, looking for header if required */ - if (gz_fetch(state) == -1) - return -1; - continue; /* no progress yet -- go back to copy above */ - /* the copy above assures that we will leave with space in the - output buffer, allowing at least one gzungetc() to succeed */ - } - - /* large len -- read directly into user buffer */ - else if (state->how == COPY) { /* read directly */ - if (gz_load(state, buf, len, &n) == -1) - return -1; - } - - /* large len -- decompress directly into user buffer */ - else { /* state->how == GZIP */ - strm->avail_out = len; - strm->next_out = buf; - if (gz_decomp(state) == -1) - return -1; - n = state->x.have; - state->x.have = 0; - } - - /* update progress */ - len -= n; - buf = (char *)buf + n; - got += n; - state->x.pos += n; - } while (len); - - /* return number of bytes read into user buffer (will fit in int) */ - return (int)got; -} - -/* -- see zlib.h -- */ -#undef gzgetc -int ZEXPORT gzgetc(file) - gzFile file; -{ - int ret; - unsigned char buf[1]; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* try output buffer (no need to check for skip request) */ - if (state->x.have) { - state->x.have--; - state->x.pos++; - return *(state->x.next)++; - } - - /* nothing there -- try gzread() */ - ret = gzread(file, buf, 1); - return ret < 1 ? -1 : buf[0]; -} - -int ZEXPORT gzgetc_(file) -gzFile file; -{ - return gzgetc(file); -} - -/* -- see zlib.h -- */ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return -1; - } - - /* can't push EOF */ - if (c < 0) - return -1; - - /* if output buffer empty, put byte at end (allows more pushing) */ - if (state->x.have == 0) { - state->x.have = 1; - state->x.next = state->out + (state->size << 1) - 1; - state->x.next[0] = c; - state->x.pos--; - state->past = 0; - return c; - } - - /* if no room, give up (must have already done a gzungetc()) */ - if (state->x.have == (state->size << 1)) { - gz_error(state, Z_DATA_ERROR, "out of room to push characters"); - return -1; - } - - /* slide output data if needed and insert byte before existing data */ - if (state->x.next == state->out) { - unsigned char *src = state->out + state->x.have; - unsigned char *dest = state->out + (state->size << 1); - while (src > state->out) - *--dest = *--src; - state->x.next = dest; - } - state->x.have++; - state->x.next--; - state->x.next[0] = c; - state->x.pos--; - state->past = 0; - return c; -} - -/* -- see zlib.h -- */ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ - unsigned left, n; - char *str; - unsigned char *eol; - gz_statep state; - - /* check parameters and get internal structure */ - if (file == NULL || buf == NULL || len < 1) - return NULL; - state = (gz_statep)file; - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return NULL; - - /* process a skip request */ - if (state->seek) { - state->seek = 0; - if (gz_skip(state, state->skip) == -1) - return NULL; - } - - /* copy output bytes up to new line or len - 1, whichever comes first -- - append a terminating zero to the string (we don't check for a zero in - the contents, let the user worry about that) */ - str = buf; - left = (unsigned)len - 1; - if (left) do { - /* assure that something is in the output buffer */ - if (state->x.have == 0 && gz_fetch(state) == -1) - return NULL; /* error */ - if (state->x.have == 0) { /* end of file */ - state->past = 1; /* read past end */ - break; /* return what we have */ - } - - /* look for end-of-line in current output buffer */ - n = state->x.have > left ? left : state->x.have; - eol = memchr(state->x.next, '\n', n); - if (eol != NULL) - n = (unsigned)(eol - state->x.next) + 1; - - /* copy through end-of-line, or remainder if not found */ - memcpy(buf, state->x.next, n); - state->x.have -= n; - state->x.next += n; - state->x.pos += n; - left -= n; - buf += n; - } while (left && eol == NULL); - - /* return terminated string, or if nothing, end of file */ - if (buf == str) - return NULL; - buf[0] = 0; - return str; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzdirect(file) - gzFile file; -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - - /* if the state is not known, but we can find out, then do so (this is - mainly for right after a gzopen() or gzdopen()) */ - if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) - (void)gz_look(state); - - /* return 1 if transparent, 0 if processing a gzip stream */ - return state->direct; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzclose_r(file) - gzFile file; -{ - int ret, err; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're reading */ - if (state->mode != GZ_READ) - return Z_STREAM_ERROR; - - /* free memory and close file */ - if (state->size) { - inflateEnd(&(state->strm)); - free(state->out); - free(state->in); - } - err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK; - gz_error(state, Z_OK, NULL); - free(state->path); - ret = close(state->fd); - free(state); - return ret ? Z_ERRNO : err; -} diff --git a/PitsideConsole/ZLib/gzwrite.c b/PitsideConsole/ZLib/gzwrite.c deleted file mode 100644 index 27cb342..0000000 --- a/PitsideConsole/ZLib/gzwrite.c +++ /dev/null @@ -1,565 +0,0 @@ -/* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "gzguts.h" - -/* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); - -/* Initialize state for writing a gzip file. Mark initialization by setting - state->size to non-zero. Return -1 on failure or 0 on success. */ -local int gz_init(state) - gz_statep state; -{ - int ret; - z_streamp strm = &(state->strm); - - /* allocate input buffer */ - state->in = malloc(state->want); - if (state->in == NULL) { - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - - /* only need output buffer and deflate state if compressing */ - if (!state->direct) { - /* allocate output buffer */ - state->out = malloc(state->want); - if (state->out == NULL) { - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - - /* allocate deflate memory, set up for gzip compression */ - strm->zalloc = Z_NULL; - strm->zfree = Z_NULL; - strm->opaque = Z_NULL; - ret = deflateInit2(strm, state->level, Z_DEFLATED, - MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy); - if (ret != Z_OK) { - free(state->out); - free(state->in); - gz_error(state, Z_MEM_ERROR, "out of memory"); - return -1; - } - } - - /* mark state as initialized */ - state->size = state->want; - - /* initialize write buffer if compressing */ - if (!state->direct) { - strm->avail_out = state->size; - strm->next_out = state->out; - state->x.next = strm->next_out; - } - return 0; -} - -/* Compress whatever is at avail_in and next_in and write to the output file. - Return -1 if there is an error writing to the output file, otherwise 0. - flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. If gz->direct - is true, then simply write to the output file without compressing, and - ignore flush. */ -local int gz_comp(state, flush) - gz_statep state; - int flush; -{ - int ret, got; - unsigned have; - z_streamp strm = &(state->strm); - - /* allocate memory if this is the first time through */ - if (state->size == 0 && gz_init(state) == -1) - return -1; - - /* write directly if requested */ - if (state->direct) { - got = write(state->fd, strm->next_in, strm->avail_in); - if (got < 0 || (unsigned)got != strm->avail_in) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - strm->avail_in = 0; - return 0; - } - - /* run deflate() on provided input until it produces no more output */ - ret = Z_OK; - do { - /* write out current buffer contents if full, or if flushing, but if - doing Z_FINISH then don't write until we get to Z_STREAM_END */ - if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && - (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->x.next); - if (have && ((got = write(state->fd, state->x.next, have)) < 0 || - (unsigned)got != have)) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; - } - if (strm->avail_out == 0) { - strm->avail_out = state->size; - strm->next_out = state->out; - } - state->x.next = strm->next_out; - } - - /* compress */ - have = strm->avail_out; - ret = deflate(strm, flush); - if (ret == Z_STREAM_ERROR) { - gz_error(state, Z_STREAM_ERROR, - "internal error: deflate stream corrupt"); - return -1; - } - have -= strm->avail_out; - } while (have); - - /* if that completed a deflate stream, allow another to start */ - if (flush == Z_FINISH) - deflateReset(strm); - - /* all done, no errors */ - return 0; -} - -/* Compress len zeros to output. Return -1 on error, 0 on success. */ -local int gz_zero(state, len) - gz_statep state; - z_off64_t len; -{ - int first; - unsigned n; - z_streamp strm = &(state->strm); - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return -1; - - /* compress len zeros (len guaranteed > 0) */ - first = 1; - while (len) { - n = GT_OFF(state->size) || (z_off64_t)state->size > len ? - (unsigned)len : state->size; - if (first) { - memset(state->in, 0, n); - first = 0; - } - strm->avail_in = n; - strm->next_in = state->in; - state->x.pos += n; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return -1; - len -= n; - } - return 0; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzwrite(file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - unsigned put = len; - unsigned n; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return 0; - } - - /* if len is zero, avoid unnecessary operations */ - if (len == 0) - return 0; - - /* allocate memory if this is the first time through */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* for small len, copy to input buffer, otherwise compress directly */ - if (len < state->size) { - /* copy to input buffer, compress when full */ - do { - if (strm->avail_in == 0) - strm->next_in = state->in; - n = state->size - strm->avail_in; - if (n > len) - n = len; - memcpy(strm->next_in + strm->avail_in, buf, n); - strm->avail_in += n; - state->x.pos += n; - buf = (char *)buf + n; - len -= n; - if (len && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - } while (len); - } - else { - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* directly compress user buffer to file */ - strm->avail_in = len; - strm->next_in = (voidp)buf; - state->x.pos += len; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - } - - /* input was all buffered or compressed (put will fit in int) */ - return (int)put; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ - unsigned char buf[1]; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return -1; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* try writing to input buffer for speed (state->size == 0 if buffer not - initialized) */ - if (strm->avail_in < state->size) { - if (strm->avail_in == 0) - strm->next_in = state->in; - strm->next_in[strm->avail_in++] = c; - state->x.pos++; - return c & 0xff; - } - - /* no room in buffer or not initialized, use gz_write() */ - buf[0] = c; - if (gzwrite(file, buf, 1) != 1) - return -1; - return c & 0xff; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzputs(file, str) - gzFile file; - const char *str; -{ - int ret; - unsigned len; - - /* write string */ - len = (unsigned)strlen(str); - ret = gzwrite(file, str, len); - return ret == 0 && len != 0 ? -1 : ret; -} - -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -#include - -/* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (gzFile file, const char *format, ...) -{ - int size, len; - gz_statep state; - z_streamp strm; - va_list va; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf((char *)(state->in), format, va); - va_end(va); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; -# else - len = vsprintf((char *)(state->in), format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf((char *)(state->in), size, format, va); - va_end(va); - len = strlen((char *)(state->in)); -# else - len = vsnprintf((char *)(state->in), size, format, va); - va_end(va); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) - return 0; - - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; - state->x.pos += len; - return len; -} - -#else /* !STDC && !Z_HAVE_STDARG_H */ - -/* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ - int size, len; - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that can really pass pointer in ints */ - if (sizeof(int) != sizeof(void *)) - return 0; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* make sure we have some buffer space */ - if (state->size == 0 && gz_init(state) == -1) - return 0; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return 0; - } - - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; -# else - len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen((char *)(state->in)); -# else - len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, - a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, - a19, a20); -# endif -#endif - - /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) - return 0; - - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; - state->x.pos += len; - return len; -} - -#endif - -/* -- see zlib.h -- */ -int ZEXPORT gzflush(file, flush) - gzFile file; - int flush; -{ - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* check flush parameter */ - if (flush < 0 || flush > Z_FINISH) - return Z_STREAM_ERROR; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* compress remaining data with requested flush */ - gz_comp(state, flush); - return state->err; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzsetparams(file, level, strategy) - gzFile file; - int level; - int strategy; -{ - gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return Z_STREAM_ERROR; - - /* if no change is requested, then do nothing */ - if (level == state->level && strategy == state->strategy) - return Z_OK; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - return -1; - } - - /* change compression parameters for subsequent input */ - if (state->size) { - /* flush previous input with previous parameters before changing */ - if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) - return state->err; - deflateParams(strm, level, strategy); - } - state->level = level; - state->strategy = strategy; - return Z_OK; -} - -/* -- see zlib.h -- */ -int ZEXPORT gzclose_w(file) - gzFile file; -{ - int ret = Z_OK; - gz_statep state; - - /* get internal structure */ - if (file == NULL) - return Z_STREAM_ERROR; - state = (gz_statep)file; - - /* check that we're writing */ - if (state->mode != GZ_WRITE) - return Z_STREAM_ERROR; - - /* check for seek request */ - if (state->seek) { - state->seek = 0; - if (gz_zero(state, state->skip) == -1) - ret = state->err; - } - - /* flush, free memory, and close file */ - if (state->size) { - if (gz_comp(state, Z_FINISH) == -1) - ret = state->err; - if (!state->direct) { - (void)deflateEnd(&(state->strm)); - free(state->out); - } - free(state->in); - } - gz_error(state, Z_OK, NULL); - free(state->path); - if (close(state->fd) == -1) - ret = Z_ERRNO; - free(state); - return ret; -} diff --git a/PitsideConsole/ZLib/infback.c b/PitsideConsole/ZLib/infback.c deleted file mode 100644 index 981aff1..0000000 --- a/PitsideConsole/ZLib/infback.c +++ /dev/null @@ -1,640 +0,0 @@ -/* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2011 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - This code is largely copied from inflate.c. Normally either infback.o or - inflate.o would be linked into an application--not both. The interface - with inffast.c is retained so that optimized assembler-coded versions of - inflate_fast() can be used with either inflate.c or infback.c. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); - -/* - strm provides memory allocation functions in zalloc and zfree, or - Z_NULL to use the library memory allocation functions. - - windowBits is in the range 8..15, and window is a user-supplied - window and output buffer that is 2**windowBits bytes. - */ -int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) -z_streamp strm; -int windowBits; -unsigned char FAR *window; -const char *version; -int stream_size; -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL || window == Z_NULL || - windowBits < 8 || windowBits > 15) - return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - state = (struct inflate_state FAR *)ZALLOC(strm, 1, - sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->dmax = 32768U; - state->wbits = windowBits; - state->wsize = 1U << windowBits; - state->window = window; - state->wnext = 0; - state->whave = 0; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -/* Macros for inflateBack(): */ - -/* Load returned state from inflate_fast() */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Set state from registers for inflate_fast() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Assure that some input is available. If input is requested, but denied, - then return a Z_BUF_ERROR from inflateBack(). */ -#define PULL() \ - do { \ - if (have == 0) { \ - have = in(in_desc, &next); \ - if (have == 0) { \ - next = Z_NULL; \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflateBack() - with an error if there is no input available. */ -#define PULLBYTE() \ - do { \ - PULL(); \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflateBack() with - an error. */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Assure that some output space is available, by writing out the window - if it's full. If the write fails, return from inflateBack() with a - Z_BUF_ERROR. */ -#define ROOM() \ - do { \ - if (left == 0) { \ - put = state->window; \ - left = state->wsize; \ - state->whave = left; \ - if (out(out_desc, put, left)) { \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* - strm provides the memory allocation functions and window buffer on input, - and provides information on the unused input on return. For Z_DATA_ERROR - returns, strm will also provide an error message. - - in() and out() are the call-back input and output functions. When - inflateBack() needs more input, it calls in(). When inflateBack() has - filled the window with output, or when it completes with data in the - window, it calls out() to write out the data. The application must not - change the provided input until in() is called again or inflateBack() - returns. The application must not change the window/output buffer until - inflateBack() returns. - - in() and out() are called with a descriptor parameter provided in the - inflateBack() call. This parameter can be a structure that provides the - information required to do the read or write, as well as accumulated - information on the input and output such as totals and check values. - - in() should return zero on failure. out() should return non-zero on - failure. If either in() or out() fails, than inflateBack() returns a - Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it - was in() or out() that caused in the error. Otherwise, inflateBack() - returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format - error, or Z_MEM_ERROR if it could not allocate memory for the state. - inflateBack() can also return Z_STREAM_ERROR if the input parameters - are not correct, i.e. strm is Z_NULL or the state was not initialized. - */ -int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) -z_streamp strm; -in_func in; -void FAR *in_desc; -out_func out; -void FAR *out_desc; -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - /* Check that the strm exists and that the state was initialized */ - if (strm == Z_NULL || strm->state == Z_NULL) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* Reset the state */ - strm->msg = Z_NULL; - state->mode = TYPE; - state->last = 0; - state->whave = 0; - next = strm->next_in; - have = next != Z_NULL ? strm->avail_in : 0; - hold = 0; - bits = 0; - put = state->window; - left = state->wsize; - - /* Inflate until end of block marked as last */ - for (;;) - switch (state->mode) { - case TYPE: - /* determine and dispatch block type */ - if (state->last) { - BYTEBITS(); - state->mode = DONE; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - - case STORED: - /* get and verify stored block length */ - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - - /* copy stored block from input to output */ - while (state->length != 0) { - copy = state->length; - PULL(); - ROOM(); - if (copy > have) copy = have; - if (copy > left) copy = left; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - - case TABLE: - /* get dynamic table entries descriptor */ - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - - /* get code length code lengths (not a typo) */ - state->have = 0; - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - - /* get length and distance code code lengths */ - state->have = 0; - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } - else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = (unsigned)(state->lens[state->have - 1]); - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - - case LEN: - /* use inflate_fast() if we have enough input and output */ - if (have >= 6 && left >= 258) { - RESTORE(); - if (state->whave < state->wsize) - state->whave = state->wsize - left; - inflate_fast(strm, state->wsize); - LOAD(); - break; - } - - /* get a literal, length, or end-of-block code */ - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(here.bits); - state->length = (unsigned)here.val; - - /* process literal */ - if (here.op == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - ROOM(); - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - } - - /* process end of block */ - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - - /* invalid code */ - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - - /* length code -- get extra bits, if any */ - state->extra = (unsigned)(here.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - - /* get distance code */ - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(here.bits); - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - - /* get distance extra bits, if any */ - state->extra = (unsigned)(here.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } - if (state->offset > state->wsize - (state->whave < state->wsize ? - left : 0)) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - - /* copy match from window to output */ - do { - ROOM(); - copy = state->wsize - state->offset; - if (copy < left) { - from = put + copy; - copy = left - copy; - } - else { - from = put - state->offset; - copy = left; - } - if (copy > state->length) copy = state->length; - state->length -= copy; - left -= copy; - do { - *put++ = *from++; - } while (--copy); - } while (state->length != 0); - break; - - case DONE: - /* inflate stream terminated properly -- write leftover output */ - ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } - goto inf_leave; - - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - - default: /* can't happen, but makes compilers happy */ - ret = Z_STREAM_ERROR; - goto inf_leave; - } - - /* Return unused input */ - inf_leave: - strm->next_in = next; - strm->avail_in = have; - return ret; -} - -int ZEXPORT inflateBackEnd(strm) -z_streamp strm; -{ - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} diff --git a/PitsideConsole/ZLib/inffast.c b/PitsideConsole/ZLib/inffast.c deleted file mode 100644 index 2f1d60b..0000000 --- a/PitsideConsole/ZLib/inffast.c +++ /dev/null @@ -1,340 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - wnext = state->wnext; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - here = lcode[hold & lmask]; - dolen: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - PUP(out) = (unsigned char)(here.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - here = dcode[hold & dmask]; - dodist: - op = (unsigned)(here.bits); - hold >>= op; - bits -= op; - op = (unsigned)(here.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - if (state->sane) { - strm->msg = - (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - if (len <= op - whave) { - do { - PUP(out) = 0; - } while (--len); - continue; - } - len -= op - whave; - do { - PUP(out) = 0; - } while (--op > whave); - if (op == 0) { - from = out - dist; - do { - PUP(out) = PUP(from); - } while (--len); - continue; - } -#endif - } - from = window - OFF; - if (wnext == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (wnext < op) { /* wrap around window */ - from += wsize + wnext - op; - op -= wnext; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (wnext < len) { /* some from start of window */ - op = wnext; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += wnext - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and wnext == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/PitsideConsole/ZLib/inffast.h b/PitsideConsole/ZLib/inffast.h deleted file mode 100644 index e5c1aa4..0000000 --- a/PitsideConsole/ZLib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/PitsideConsole/ZLib/inffixed.h b/PitsideConsole/ZLib/inffixed.h deleted file mode 100644 index d628327..0000000 --- a/PitsideConsole/ZLib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. - It is part of the implementation of this library and is - subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/PitsideConsole/ZLib/inflate.c b/PitsideConsole/ZLib/inflate.c deleted file mode 100644 index 47418a1..0000000 --- a/PitsideConsole/ZLib/inflate.c +++ /dev/null @@ -1,1496 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common wnext == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - if (state->wrap) /* to support ill-conceived Java test suite */ - strm->adler = state->wrap & 1; - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - state->sane = 1; - state->back = -1; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - state->wsize = 0; - state->whave = 0; - state->wnext = 0; - return inflateResetKeep(strm); -} - -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ - int wrap; - struct inflate_state FAR *state; - - /* get the state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* extract wrap request from windowBits parameter */ - if (windowBits < 0) { - wrap = 0; - windowBits = -windowBits; - } - else { - wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) - windowBits &= 15; -#endif - } - - /* set number of window bits, free window if different */ - if (windowBits && (windowBits < 8 || windowBits > 15)) - return Z_STREAM_ERROR; - if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { - ZFREE(strm, state->window); - state->window = Z_NULL; - } - - /* update state and reset the rest of it */ - state->wrap = wrap; - state->wbits = (unsigned)windowBits; - return inflateReset(strm); -} - -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ - int ret; - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; -#endif - } - if (strm->zfree == (free_func)0) -#ifdef Z_SOLO - return Z_STREAM_ERROR; -#else - strm->zfree = zcfree; -#endif - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->window = Z_NULL; - ret = inflateReset2(strm, windowBits); - if (ret != Z_OK) { - ZFREE(strm, state); - strm->state = Z_NULL; - } - return ret; -} - -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits < 0) { - state->hold = 0; - state->bits = 0; - return Z_OK; - } - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, - state.lencode[low].bits, state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow(strm, out) -z_streamp strm; -unsigned out; -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->wnext = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->wnext = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->wnext; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->wnext = copy; - state->whave = state->wsize; - } - else { - state->wnext += dist; - if (state->wnext == state->wsize) state->wnext = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code here; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (state->wbits == 0) - state->wbits = len; - else if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = ZSWAP32(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN_; /* decode codes */ - if (flush == Z_TREES) { - DROPBITS(2); - goto inf_leave; - } - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY_; - if (flush == Z_TREES) goto inf_leave; - case COPY_: - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.val < 16) { - DROPBITS(here.bits); - state->lens[state->have++] = here.val; - } - else { - if (here.val == 16) { - NEEDBITS(here.bits + 2); - DROPBITS(here.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (here.val == 17) { - NEEDBITS(here.bits + 3); - DROPBITS(here.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(here.bits + 7); - DROPBITS(here.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* check for end-of-block code (better have one) */ - if (state->lens[256] == 0) { - strm->msg = (char *)"invalid code -- missing end-of-block"; - state->mode = BAD; - break; - } - - /* build code tables -- note: do not change the lenbits or distbits - values here (9 and 6) without reading the comments in inftrees.h - concerning the ENOUGH constants, which depend on those values */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN_; - if (flush == Z_TREES) goto inf_leave; - case LEN_: - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - if (state->mode == TYPE) - state->back = -1; - break; - } - state->back = 0; - for (;;) { - here = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if (here.op && (here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - state->length = (unsigned)here.val; - if ((int)(here.op) == 0) { - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - state->mode = LIT; - break; - } - if (here.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->back = -1; - state->mode = TYPE; - break; - } - if (here.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(here.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->was = state->length; - state->mode = DIST; - case DIST: - for (;;) { - here = state->distcode[BITS(state->distbits)]; - if ((unsigned)(here.bits) <= bits) break; - PULLBYTE(); - } - if ((here.op & 0xf0) == 0) { - last = here; - for (;;) { - here = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + here.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - state->back += last.bits; - } - DROPBITS(here.bits); - state->back += here.bits; - if (here.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)here.val; - state->extra = (unsigned)(here.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - state->back += state->extra; - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->whave) { - if (state->sane) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - Trace((stderr, "inflate.c too far\n")); - copy -= state->whave; - if (copy > state->length) copy = state->length; - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = 0; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; -#endif - } - if (copy > state->wnext) { - copy -= state->wnext; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->wnext - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - ZSWAP32(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (out != strm->avail_out && state->mode < BAD && - (state->mode < CHECK || flush != Z_FINISH))) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0) + - (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ - struct inflate_state FAR *state; - unsigned long dictid; - unsigned char *next; - unsigned avail; - int ret; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary identifier */ - if (state->mode == DICT) { - dictid = adler32(0L, Z_NULL, 0); - dictid = adler32(dictid, dictionary, dictLength); - if (dictid != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - next = strm->next_out; - avail = strm->avail_out; - strm->next_out = (Bytef *)dictionary + dictLength; - strm->avail_out = 0; - ret = updatewindow(strm, dictLength); - strm->avail_out = avail; - strm->next_out = next; - if (ret) { - state->mode = MEM; - return Z_MEM_ERROR; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -unsigned char FAR *buf; -unsigned len; -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); - zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} - -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - state->sane = !subvert; -#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR - return Z_OK; -#else - state->sane = 1; - return Z_DATA_ERROR; -#endif -} - -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; - state = (struct inflate_state FAR *)strm->state; - return ((long)(state->back) << 16) + - (state->mode == COPY ? state->length : - (state->mode == MATCH ? state->was - state->length : 0)); -} diff --git a/PitsideConsole/ZLib/inflate.h b/PitsideConsole/ZLib/inflate.h deleted file mode 100644 index 95f4986..0000000 --- a/PitsideConsole/ZLib/inflate.h +++ /dev/null @@ -1,122 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2009 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY_, /* i/o: same as COPY below, but only first time in */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN_, /* i: same as LEN below, but only first time in */ - LEN, /* i: waiting for length/lit/eob code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to BAD or MEM on error -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) or (raw) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> - HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - (raw) -> TYPEDO - Read deflate blocks: - TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK - STORED -> COPY_ -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN_ - LEN_ -> LEN - Read deflate codes in fixed or dynamic block: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 10K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned wnext; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ - int sane; /* if false, allow invalid distance too far */ - int back; /* bits back of last unprocessed length/lit */ - unsigned was; /* initial length of match */ -}; diff --git a/PitsideConsole/ZLib/inftrees.c b/PitsideConsole/ZLib/inftrees.c deleted file mode 100644 index abcd7c4..0000000 --- a/PitsideConsole/ZLib/inftrees.c +++ /dev/null @@ -1,306 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2012 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.7 Copyright 1995-2012 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code here; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 78, 68}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)1; - here.val = (unsigned short)0; - *(*table)++ = here; /* make a table to force an error */ - *(*table)++ = here; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - here.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - here.op = (unsigned char)0; - here.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - here.op = (unsigned char)(extra[work[sym]]); - here.val = base[work[sym]]; - } - else { - here.op = (unsigned char)(32 + 64); /* end of block */ - here.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = here; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if ((type == LENS && used >= ENOUGH_LENS) || - (type == DISTS && used >= ENOUGH_DISTS)) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff != 0) { - here.op = (unsigned char)64; /* invalid code marker */ - here.bits = (unsigned char)(len - drop); - here.val = (unsigned short)0; - next[huff] = here; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/PitsideConsole/ZLib/inftrees.h b/PitsideConsole/ZLib/inftrees.h deleted file mode 100644 index baa53a0..0000000 --- a/PitsideConsole/ZLib/inftrees.h +++ /dev/null @@ -1,62 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005, 2010 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of the dynamic table. The maximum number of code structures is - 1444, which is the sum of 852 for literal/length codes and 592 for distance - codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that - program are the number of symbols, the initial root table size, and the - maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the - inflate_table() calls in inflate.c and infback.c. If the root table size is - changed, then these maximum sizes would be need to be recalculated and - updated. */ -#define ENOUGH_LENS 852 -#define ENOUGH_DISTS 592 -#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) - -/* Type of code to build for inflate_table() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); diff --git a/PitsideConsole/ZLib/test.h b/PitsideConsole/ZLib/test.h deleted file mode 100644 index e69de29..0000000 diff --git a/PitsideConsole/ZLib/trees.c b/PitsideConsole/ZLib/trees.c deleted file mode 100644 index 8c32b21..0000000 --- a/PitsideConsole/ZLib/trees.c +++ /dev/null @@ -1,1224 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2012 Jean-loup Gailly - * detect_data_type() function provided freely by Cosmin Truta, 2006 - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id$ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (ush)value << s->bi_valid; - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += length - Buf_size; - } else { - s->bi_buf |= (ush)value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (ush)val << s->bi_valid;\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (ush)(value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ -#ifdef NO_INIT_GLOBAL_POINTERS - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; -#endif - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, - "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree(s) - deflate_state *s; -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) - */ -void ZLIB_INTERNAL _tr_flush_bits(s) - deflate_state *s; -{ - bi_flush(s); -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (s->strm->data_type == Z_UNKNOWN) - s->strm->data_type = detect_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int ZLIB_INTERNAL _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - ct_data *ltree; /* literal tree */ - ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("white-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/PitsideConsole/ZLib/trees.h b/PitsideConsole/ZLib/trees.h deleted file mode 100644 index d35639d..0000000 --- a/PitsideConsole/ZLib/trees.h +++ /dev/null @@ -1,128 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; - diff --git a/PitsideConsole/ZLib/uncompr.c b/PitsideConsole/ZLib/uncompr.c deleted file mode 100644 index ad98be3..0000000 --- a/PitsideConsole/ZLib/uncompr.c +++ /dev/null @@ -1,59 +0,0 @@ -/* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. -*/ -int ZEXPORT uncompress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; -} diff --git a/PitsideConsole/ZLib/zconf.h b/PitsideConsole/ZLib/zconf.h deleted file mode 100644 index 8a46a58..0000000 --- a/PitsideConsole/ZLib/zconf.h +++ /dev/null @@ -1,506 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2012 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - * Even better than compiling with -DZ_PREFIX would be to use configure to set - * this permanently in zconf.h using "./configure --zprefix". - */ -#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ -# define Z_PREFIX_SET - -/* all linked symbols */ -# define _dist_code z__dist_code -# define _length_code z__length_code -# define _tr_align z__tr_align -# define _tr_flush_block z__tr_flush_block -# define _tr_init z__tr_init -# define _tr_stored_block z__tr_stored_block -# define _tr_tally z__tr_tally -# define adler32 z_adler32 -# define adler32_combine z_adler32_combine -# define adler32_combine64 z_adler32_combine64 -# ifndef Z_SOLO -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# endif -# define crc32 z_crc32 -# define crc32_combine z_crc32_combine -# define crc32_combine64 z_crc32_combine64 -# define deflate z_deflate -# define deflateBound z_deflateBound -# define deflateCopy z_deflateCopy -# define deflateEnd z_deflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateInit_ z_deflateInit_ -# define deflateParams z_deflateParams -# define deflatePending z_deflatePending -# define deflatePrime z_deflatePrime -# define deflateReset z_deflateReset -# define deflateResetKeep z_deflateResetKeep -# define deflateSetDictionary z_deflateSetDictionary -# define deflateSetHeader z_deflateSetHeader -# define deflateTune z_deflateTune -# define deflate_copyright z_deflate_copyright -# define get_crc_table z_get_crc_table -# ifndef Z_SOLO -# define gz_error z_gz_error -# define gz_intmax z_gz_intmax -# define gz_strwinerror z_gz_strwinerror -# define gzbuffer z_gzbuffer -# define gzclearerr z_gzclearerr -# define gzclose z_gzclose -# define gzclose_r z_gzclose_r -# define gzclose_w z_gzclose_w -# define gzdirect z_gzdirect -# define gzdopen z_gzdopen -# define gzeof z_gzeof -# define gzerror z_gzerror -# define gzflush z_gzflush -# define gzgetc z_gzgetc -# define gzgetc_ z_gzgetc_ -# define gzgets z_gzgets -# define gzoffset z_gzoffset -# define gzoffset64 z_gzoffset64 -# define gzopen z_gzopen -# define gzopen64 z_gzopen64 -# ifdef _WIN32 -# define gzopen_w z_gzopen_w -# endif -# define gzprintf z_gzprintf -# define gzputc z_gzputc -# define gzputs z_gzputs -# define gzread z_gzread -# define gzrewind z_gzrewind -# define gzseek z_gzseek -# define gzseek64 z_gzseek64 -# define gzsetparams z_gzsetparams -# define gztell z_gztell -# define gztell64 z_gztell64 -# define gzungetc z_gzungetc -# define gzwrite z_gzwrite -# endif -# define inflate z_inflate -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define inflateBackInit_ z_inflateBackInit_ -# define inflateCopy z_inflateCopy -# define inflateEnd z_inflateEnd -# define inflateGetHeader z_inflateGetHeader -# define inflateInit2_ z_inflateInit2_ -# define inflateInit_ z_inflateInit_ -# define inflateMark z_inflateMark -# define inflatePrime z_inflatePrime -# define inflateReset z_inflateReset -# define inflateReset2 z_inflateReset2 -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateUndermine z_inflateUndermine -# define inflateResetKeep z_inflateResetKeep -# define inflate_copyright z_inflate_copyright -# define inflate_fast z_inflate_fast -# define inflate_table z_inflate_table -# ifndef Z_SOLO -# define uncompress z_uncompress -# endif -# define zError z_zError -# ifndef Z_SOLO -# define zcalloc z_zcalloc -# define zcfree z_zcfree -# endif -# define zlibCompileFlags z_zlibCompileFlags -# define zlibVersion z_zlibVersion - -/* all zlib typedefs in zlib.h and zconf.h */ -# define Byte z_Byte -# define Bytef z_Bytef -# define alloc_func z_alloc_func -# define charf z_charf -# define free_func z_free_func -# ifndef Z_SOLO -# define gzFile z_gzFile -# endif -# define gz_header z_gz_header -# define gz_headerp z_gz_headerp -# define in_func z_in_func -# define intf z_intf -# define out_func z_out_func -# define uInt z_uInt -# define uIntf z_uIntf -# define uLong z_uLong -# define uLongf z_uLongf -# define voidp z_voidp -# define voidpc z_voidpc -# define voidpf z_voidpf - -/* all zlib structs in zlib.h and zconf.h */ -# define gz_header_s z_gz_header_s -# define internal_state z_internal_state - -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -#if defined(ZLIB_CONST) && !defined(z_const) -# define z_const const -#else -# define z_const -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -/* ./configure may #define Z_U4 here */ - -#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) -# include -# if (UINT_MAX == 0xffffffffUL) -# define Z_U4 unsigned -# else -# if (ULONG_MAX == 0xffffffffUL) -# define Z_U4 unsigned long -# else -# if (USHRT_MAX == 0xffffffffUL) -# define Z_U4 unsigned short -# endif -# endif -# endif -#endif - -#ifdef Z_U4 - typedef Z_U4 z_crc_t; -#else - typedef unsigned long z_crc_t; -#endif - -#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ -# define Z_HAVE_UNISTD_H -#endif - -#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */ -# define Z_HAVE_STDARG_H -#endif - -#ifdef STDC -# ifndef Z_SOLO -# include /* for off_t */ -# endif -#endif - -#ifdef _WIN32 -# include /* for wchar_t */ -#endif - -/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and - * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even - * though the former does not conform to the LFS document), but considering - * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as - * equivalently requesting no 64-bit operations - */ -#if defined(LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 -# undef _LARGEFILE64_SOURCE -#endif - -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H -#endif -#ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(LARGEFILE64_SOURCE) -# include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ -# ifdef VMS -# include /* for off_t */ -# endif -# ifndef z_off_t -# define z_off_t off_t -# endif -# endif -#endif - -#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 -# define Z_LFS64 -#endif - -#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) -# define Z_LARGE64 -#endif - -#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) -# define Z_WANT64 -#endif - -#if !defined(SEEK_SET) && !defined(Z_SOLO) -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif - -#ifndef z_off_t -# define z_off_t long -#endif - -#if !defined(_WIN32) && defined(Z_LARGE64) -# define z_off64_t off64_t -#else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) -# define z_off64_t __int64 -# else -# define z_off64_t z_off_t -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) - #pragma map(deflateInit_,"DEIN") - #pragma map(deflateInit2_,"DEIN2") - #pragma map(deflateEnd,"DEEND") - #pragma map(deflateBound,"DEBND") - #pragma map(inflateInit_,"ININ") - #pragma map(inflateInit2_,"ININ2") - #pragma map(inflateEnd,"INEND") - #pragma map(inflateSync,"INSY") - #pragma map(inflateSetDictionary,"INSEDI") - #pragma map(compressBound,"CMBND") - #pragma map(inflate_table,"INTABL") - #pragma map(inflate_fast,"INFA") - #pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/PitsideConsole/ZLib/zlib.h b/PitsideConsole/ZLib/zlib.h deleted file mode 100644 index 3edf3ac..0000000 --- a/PitsideConsole/ZLib/zlib.h +++ /dev/null @@ -1,1744 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.7, May 2nd, 2012 - - Copyright (C) 1995-2012 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 - (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define ZLIB_VERSION "1.2.7" -#define ZLIB_VERNUM 0x1270 -#define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 7 -#define ZLIB_VER_SUBREVISION 0 - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed data. - This version of the library supports only one compression method (deflation) - but other algorithms will be added later and will have the same stream - interface. - - Compression can be done in a single step if the buffers are large enough, - or can be done by repeated calls of the compression function. In the latter - case, the application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never crash - even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - z_const Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total number of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total number of bytes output so far */ - - z_const char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has dropped - to zero. It must update next_out and avail_out when avail_out has dropped - to zero. The application must initialize zalloc, zfree and opaque before - calling the init function. All other fields are set by the compression - library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this if - the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers - returned by zalloc for objects of exactly 65536 bytes *must* have their - offset normalized to zero. The default allocation function provided by this - library ensures this (see zutil.c). To reduce memory requirements and avoid - any allocation of 64K objects, at the expense of compression ratio, compile - the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or progress - reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly - if the decompressor wants to decompress everything in a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -#define Z_TREES 6 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative values - * are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - - /* basic functions */ - -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is not - compatible with the zlib.h header file used by the application. This check - is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. If - zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at all - (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION - requests a default compromise between speed and compression (currently - equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if level is not a valid compression level, or - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). msg is set to null - if there is no error message. deflateInit does not perform any compression: - this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). Some - output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating avail_in or avail_out accordingly; avail_out should - never be zero before the call. The application can consume the compressed - output when it wants, for example when the output buffer is full (avail_out - == 0), or after each call of deflate(). If deflate returns Z_OK and with - zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumulate before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In - particular avail_in is zero after the call if enough output space has been - provided before the call.) Flushing may degrade compression for some - compression algorithms and so it should be used only when necessary. This - completes the current deflate block and follows it with an empty stored block - that is three bits plus filler bits to the next byte, followed by four bytes - (00 00 ff ff). - - If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the - output buffer, but the output is not aligned to a byte boundary. All of the - input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. - This completes the current deflate block and follows it with an empty fixed - codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed code - block. - - If flush is set to Z_BLOCK, a deflate block is completed and emitted, as - for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to - seven bits of the current block are held to be written as the next byte after - the next deflate block is completed. In this case, the decompressor may not - be provided enough bits at this point in order to complete decompression of - the data provided so far to the compressor. It may need to wait for the next - block to be emitted. This is for advanced applications that need to control - the emission of deflate blocks. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the stream - are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). Then deflate is guaranteed to - return Z_STREAM_END. If not enough output space is provided, deflate will - not return Z_STREAM_END, and it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect the - compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, msg - may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the - exact value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit() does not process any header information -- that is deferred - until inflate() is called. -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing will - resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there is - no more input data or no more space in the output buffer (see below about - the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. The - application can consume the uncompressed output when it wants, for example - when the output buffer is full (avail_out == 0), or after each call of - inflate(). If inflate returns Z_OK and with zero avail_out, it must be - called again after making room in the output buffer because there might be - more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, - Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() - stop if and when it gets to the next deflate block boundary. When decoding - the zlib or gzip format, this will cause inflate() to return immediately - after the header and before the first block. When doing a raw inflate, - inflate() will go ahead and process the first block, and will return when it - gets to the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 if - inflate() is currently decoding the last block in the deflate stream, plus - 128 if inflate() returned immediately after decoding an end-of-block code or - decoding the complete header up to just before the first byte of the deflate - stream. The end-of-block will not be indicated until all of the uncompressed - data from that block has been written to strm->next_out. The number of - unused bits may in general be greater than seven, except when bit 7 of - data_type is set, in which case the number of unused bits will be less than - eight. data_type is set as noted here every time inflate() returns for all - flush options, and so can be used to determine the amount of currently - consumed input in bits. - - The Z_TREES option behaves as Z_BLOCK does, but it also returns when the - end of each deflate block header is reached, before any actual data in that - block is decoded. This allows the caller to determine the length of the - deflate block header for later use in random access within a deflate block. - 256 is added to the value of strm->data_type when inflate() returns - immediately after reaching the end of the deflate block header. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step (a - single call of inflate), the parameter flush should be set to Z_FINISH. In - this case all pending input is processed and all pending output is flushed; - avail_out must be large enough to hold all of the uncompressed data for the - operation to complete. (The size of the uncompressed data may have been - saved by the compressor for this purpose.) The use of Z_FINISH is not - required to perform an inflation in one step. However it may be used to - inform inflate that a faster approach can be used for the single inflate() - call. Z_FINISH also informs inflate to not maintain a sliding window if the - stream completes, which reduces inflate's memory footprint. If the stream - does not complete, either because not all of the stream is provided or not - enough output space is provided, then a sliding window will be allocated and - inflate() can be called again to continue the operation as if Z_NO_FLUSH had - been used. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the effects of the flush parameter in this implementation are - on the return value of inflate() as noted below, when inflate() returns early - when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of - memory for a sliding window when Z_FINISH is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the Adler-32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the Adler-32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() can decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically, if requested when - initializing with inflateInit2(). Any information contained in the gzip - header is not retained, so applications that need that information should - instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. When processing - gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output - producted so far. The CRC-32 is checked against the gzip trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may - then call inflateSync() to look for a good compression block if a partial - recovery of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any pending - output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but is - slow and reduces compression ratio; memLevel=9 uses maximum memory for - optimal speed. The default value is 8. See zconf.h for total memory usage - as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as - fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The - strategy parameter only affects the compression ratio but not the - correctness of the compressed output even if it is not set appropriately. - Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler - decoder for special applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid - method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is - incompatible with the version assumed by the caller (ZLIB_VERSION). msg is - set to null if there is no error message. deflateInit2 does not perform any - compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. When using the zlib format, this - function must be called immediately after deflateInit, deflateInit2 or - deflateReset, and before any call of deflate. When doing raw deflate, this - function must be called either before any call of deflate, or immediately - after the completion of a deflate block, i.e. after all input has been - consumed and all output has been delivered when using any of the flush - options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The - compressor and decompressor must use exactly the same dictionary (see - inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size - provided in deflateInit or deflateInit2. Thus the strings most likely to be - useful should be put at the end of the dictionary, not at the front. In - addition, the current implementation of deflate will use at most the window - size minus 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if not at a block boundary for raw deflate). deflateSetDictionary does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and can - consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. The - stream will keep the same compression level and any other attributes that - may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different strategy. - If the compression level is changed, the input available so far is - compressed with the old level (and may be flushed); the new level will take - effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to be - compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if - strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() or - deflateInit2(), and after deflateSetHeader(), if used. This would be used - to allocate an output buffer for deflation in a single pass, and so would be - called before deflate(). If that first deflate() call is provided the - sourceLen input bytes, an output buffer allocated to the size returned by - deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed - to return Z_STREAM_END. Note that it is possible for the compressed size to - be larger than the value returned by deflateBound() if flush options other - than Z_FINISH or Z_NO_FLUSH are used. -*/ - -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); -/* - deflatePending() returns the number of bytes and bits of output that have - been generated, but not yet provided in the available output. The bytes not - provided would be due to the available output space having being consumed. - The number of bits of output not provided are between 0 and 7, where they - await more bits to join them in order to fill out a full byte. If pending - or bits are Z_NULL, then those values are not set. - - deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. - */ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the bits - leftover from a previous deflate stream when appending to it. As such, this - function can only be used for raw deflate, and must be used before the first - deflate() call after a deflateInit2() or deflateReset(). bits must be less - than or equal to 16, and that many of the least significant bits of value - will be inserted in the output. - - deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough - room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be zero to request that inflate use the window size in - the zlib header of the compressed stream. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller, or Z_STREAM_ERROR if the parameters are - invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit2 does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit2() does not process any header information -- that is - deferred until inflate() is called. -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called at any - time to set the dictionary. If the provided dictionary is smaller than the - window and there is already data in the window, then the provided dictionary - will amend what's there. The application must insure that the dictionary - that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a possible full flush point (see above - for the description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync searches for a 00 00 FF FF pattern in the compressed data. - All full flush points have this pattern, but not all occurences of this - pattern are full flush points. - - inflateSync returns Z_OK if a possible full flush point has been found, - Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point - has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being Z_NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. The - stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL). -*/ - -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); -/* - This function is the same as inflateReset, but it also permits changing - the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. - - inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being Z_NULL), or if - the windowBits parameter is invalid. -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - If bits is negative, then the input stream bit buffer is emptied. Then - inflatePrime() can be called again to put bits in the buffer. This is used - to clear out bits leftover after feeding inflate a block description prior - to feeding inflate codes. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); -/* - This function returns two values, one in the lower 16 bits of the return - value, and the other in the remaining upper bits, obtained by shifting the - return value down 16 bits. If the upper value is -1 and the lower value is - zero, then inflate() is currently decoding information outside of a block. - If the upper value is -1 and the lower value is non-zero, then inflate is in - the middle of a stored block, with the lower value equaling the number of - bytes from the input remaining to copy. If the upper value is not -1, then - it is the number of bits back from the current bit position in the input of - the code (literal or length/distance pair) currently being processed. In - that case the lower value is the number of bytes already emitted for that - code. - - A code is being processed if inflate is waiting for more input to complete - decoding of the code, or if it has completed decoding but is waiting for - more output space to write the literal or match data. - - inflateMark() is used to mark locations in the input data for random - access, which may be at bit positions, and to note those cases where the - output of a code may span boundaries of random access blocks. The current - location in the input stream can be determined from avail_in and data_type - as noted in the description for the Z_BLOCK flush parameter for inflate. - - inflateMark returns the value noted above or -1 << 16 if the provided - source stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be - used to force inflate() to return immediately after header processing is - complete and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When any - of extra, name, or comment are not Z_NULL and the respective field is not - present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the parameters are invalid, Z_MEM_ERROR if the internal state could not be - allocated, or Z_VERSION_ERROR if the version of the library does not match - the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free the - allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the normal - behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format error - in the deflate stream (in which case strm->msg is set to indicate the nature - of the error), or Z_STREAM_ERROR if the stream was not properly initialized. - In the case of Z_BUF_ERROR, an input or output error can be distinguished - using strm->next_in which will be Z_NULL only if in() returned an error. If - strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning - non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() - cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - -#ifndef Z_SOLO - - /* utility functions */ - -/* - The following utility functions are implemented on top of the basic - stream-oriented functions. To simplify the interface, some default options - are assumed (compression level and memory usage, standard memory allocation - functions). The source code of these utility functions can be modified if - you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before a - compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total size - of the destination buffer, which must be large enough to hold the entire - uncompressed data. (The size of the uncompressed data must have been saved - previously by the compressor and transmitted to the decompressor by some - mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed buffer. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In - the case where there is not enough room, uncompress() will fill the output - buffer with the uncompressed data up to that point. -*/ - - /* gzip file access functions */ - -/* - This library supports reading and writing files in gzip (.gz) format with - an interface similar to that of stdio, using the functions that start with - "gz". The gzip format is different from the zlib format. gzip is a gzip - wrapper, documented in RFC 1952, wrapped around a deflate stream. -*/ - -typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ - -/* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); - - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. - - "a" can be used instead of "w" to request that the gzip stream that will - be written be appended to the file. "+" will result in an error, since - reading and writing to the same gzip file is not supported. The addition of - "x" when writing will create the file exclusively, which fails if the file - already exists. On systems that support it, the addition of "e" when - reading or writing will set the flag to close the file on an execve() call. - - These functions, as well as gzip, will read and decode a sequence of gzip - streams in a file. The append function of gzopen() can be used to create - such a file. (Also see gzflush() for another way to do this.) When - appending, gzopen does not test whether the file begins with a gzip stream, - nor does it look for the end of the gzip streams to begin appending. gzopen - will simply append a gzip stream to the existing file. - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. When - reading, this will be detected automatically by looking for the magic two- - byte gzip header. - - gzopen returns NULL if the file could not be opened, if there was - insufficient memory to allocate the gzFile state, or if an invalid mode was - specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). - errno can be checked to determine if the reason gzopen failed was that the - file could not be opened. -*/ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. - - The next call of gzclose on the returned gzFile will also close the file - descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor - fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, - mode);. The duplicated descriptor should be saved to avoid a leak, since - gzdopen does not close fd if it fails. If you are using fileno() to get the - file descriptor from a FILE *, then you will have to use dup() to avoid - double-close()ing the file descriptor. Both gzclose() and fclose() will - close the associated file descriptor, so they need to have different file - descriptors. - - gzdopen returns NULL if there was insufficient memory to allocate the - gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not - provided, or '+' was provided), or if fd is -1. The file descriptor is not - used until the next gz* read, write, seek, or close operation, so gzdopen - will not detect if fd is invalid (unless fd is -1). -*/ - -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); -/* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Two buffers are allocated, either both of the specified size when - writing, or one of the specified size and the other twice that size when - reading. A larger buffer size of, for example, 64K or 128K bytes will - noticeably increase the speed of decompression (reading). - - The new buffer size also affects the maximum length for gzprintf(). - - gzbuffer() returns 0 on success, or -1 on failure, such as being called - too late. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. If - the input file is not in gzip format, gzread copies the given number of - bytes into the buffer directly from the file. - - After reaching the end of a gzip stream in the input, gzread will continue - to read, looking for another gzip stream. Any number of gzip streams may be - concatenated in the input file, and will all be decompressed by gzread(). - If something other than a gzip stream is encountered after a gzip stream, - that remaining trailing garbage is ignored (and no error is returned). - - gzread can be used to read a gzip file that is being concurrently written. - Upon reaching the end of the input, gzread will return with the available - data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then - gzclearerr can be used to clear the end of file indicator in order to permit - gzread to be tried again. Z_OK indicates that a gzip stream was completed - on the last gzread. Z_BUF_ERROR indicates that the input file ended in the - middle of a gzip stream. Note that gzread does not return -1 in the event - of an incomplete gzip stream. This error is deferred until gzclose(), which - will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip - stream. Alternatively, gzerror can be used before gzclose to detect this - case. - - gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. -*/ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. -*/ - -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or 0 in case of error. The number of - uncompressed bytes written is limited to 8191, or one less than the buffer - size given to gzbuffer(). The caller should assure that this limit is not - exceeded. If it is exceeded, then gzprintf() will return an error (0) with - nothing written. In this case, there may also be a buffer overflow with - unpredictable consequences, which is possible only if zlib was compiled with - the insecure functions sprintf() or vsprintf() because the secure snprintf() - or vsnprintf() functions were not available. This can be determined using - zlibCompileFlags(). -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. - - gzgets returns buf which is a null-terminated string, or it returns NULL - for end-of-file or in case of error. If there was an error, the contents at - buf are indeterminate. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. gzputc - returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte or -1 - in case of end of file or error. This is implemented as a macro for speed. - As such, it does not do all of the checking the other functions do. I.e. - it does not check to see if file is NULL, nor whether the structure file - points to has been clobbered or not. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. - gzungetc() returns the character pushed, or -1 on failure. gzungetc() will - fail if c is -1, and may fail if a character has been pushed but not read - yet. If gzungetc is used immediately after gzopen or gzdopen, at least the - output buffer size of pushed characters is allowed. (See gzbuffer above.) - The pushed character will be discarded if the stream is repositioned with - gzseek() or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. - - If the flush parameter is Z_FINISH, the remaining data is written and the - gzip stream is completed in the output. If gzwrite() is called again, a new - gzip stream will be started in the output. gzread() is able to read such - concatented gzip streams. - - gzflush should be called only when strictly necessary because it will - degrade compression if called too often. -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); - - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -/* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); - - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. - - If gzeof() returns true, then the read functions will return no more data, - unless the end-of-file indicator is reset by gzclearerr() and the input file - has grown since the previous end of file was detected. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns true (1) if file is being copied directly while reading, or false - (0) if file is a gzip stream being decompressed. - - If the input file is empty, gzdirect() will return true, since the input - does not contain a gzip stream. - - If gzdirect() is used immediately after gzopen() or gzdopen() it will - cause buffers to be allocated to allow reading the file to determine if it - is a gzip file. Therefore if gzbuffer() is used, it should be called before - gzdirect(). - - When writing, gzdirect() returns true (1) if transparent writing was - requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: - gzdirect() is not needed when writing. Transparent writing must be - explicitly requested, so the application already knows the answer. When - linking statically, using gzdirect() will include all of the zlib code for - gzip file reading and decompression, which may not be desired.) -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you - cannot call gzerror with file, since its structures have been deallocated. - gzclose must not be called more than once on the same file, just as free - must not be called more than once on the same allocation. - - gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a - file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the - last read ended in the middle of a gzip stream, or Z_OK on success. -*/ - -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); -/* - Same as gzclose(), but gzclose_r() is only for use when reading, and - gzclose_w() is only for use when writing or appending. The advantage to - using these instead of gzclose() is that they avoid linking in zlib - compression or decompression code that is not used when only reading or only - writing respectively. If gzclose() is used, then both compression and - decompression code will be included the application when linking to a static - zlib library. -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. - - The application must not modify the returned string. Future calls to - this function may invalidate the previously returned string. If file is - closed, then the string previously returned by gzerror will no longer be - available. - - gzerror() should be used to distinguish errors from end-of-file for those - functions above that do not distinguish those cases in their return values. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - -#endif /* !Z_SOLO */ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the compression - library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. - - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. - - Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); - - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note - that the z_off_t type (like off_t) is a signed integer. If len2 is - negative, the result has no meaning or utility. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -/* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) - -#ifndef Z_SOLO - -/* gzgetc() macro and its supporting function and exposed data structure. Note - * that the real internal state is much larger than the exposed structure. - * This abbreviated structure exposes just enough for the gzgetc() macro. The - * user should not mess with these exposed elements, since their names or - * behavior could change in the future, perhaps even capriciously. They can - * only be used by the gzgetc() macro. You have been warned. - */ -struct gzFile_s { - unsigned have; - unsigned char *next; - z_off64_t pos; -}; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ -#ifdef Z_PREFIX_SET -# undef z_gzgetc -# define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) -#else -# define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) -#endif - -/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or - * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if - * both are true, the application gets the *64 functions, and the regular - * functions are changed to 64 bits) -- in case these are set on systems - * without large file support, _LFS64_LARGEFILE must also be true - */ -#ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); -#endif - -#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) -# ifdef Z_PREFIX_SET -# define z_gzopen z_gzopen64 -# define z_gzseek z_gzseek64 -# define z_gztell z_gztell64 -# define z_gzoffset z_gzoffset64 -# define z_adler32_combine z_adler32_combine64 -# define z_crc32_combine z_crc32_combine64 -# else -# define gzopen gzopen64 -# define gzseek gzseek64 -# define gztell gztell64 -# define gzoffset gzoffset64 -# define adler32_combine adler32_combine64 -# define crc32_combine crc32_combine64 -# endif -# ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -# endif -#else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); -#endif - -#else /* Z_SOLO */ - - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); - -#endif /* !Z_SOLO */ - -/* hack for buggy compilers */ -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; -#endif - -/* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if defined(_WIN32) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* ZLIB_H */ diff --git a/PitsideConsole/ZLib/zutil.c b/PitsideConsole/ZLib/zutil.c deleted file mode 100644 index 65e0d3b..0000000 --- a/PitsideConsole/ZLib/zutil.c +++ /dev/null @@ -1,324 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#include "zutil.h" -#ifndef Z_SOLO -# include "gzguts.h" -#endif - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch ((int)(sizeof(uInt))) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch ((int)(sizeof(uLong))) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch ((int)(sizeof(voidpf))) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch ((int)(sizeof(z_off_t))) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#if defined(STDC) || defined(Z_HAVE_STDARG_H) -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -} - -#ifdef DEBUG - -# ifndef verbose -# define verbose 0 -# endif -int ZLIB_INTERNAL z_verbose = verbose; - -void ZLIB_INTERNAL z_error (m) - char *m; -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(err) - int err; -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - -#ifndef Z_SOLO - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void ZLIB_INTERNAL zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ - -#endif /* !Z_SOLO */ diff --git a/PitsideConsole/ZLib/zutil.h b/PitsideConsole/ZLib/zutil.h deleted file mode 100644 index 4e3dcc6..0000000 --- a/PitsideConsole/ZLib/zutil.h +++ /dev/null @@ -1,252 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2012 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id$ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#ifdef HAVE_HIDDEN -# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) -#else -# define ZLIB_INTERNAL -#endif - -#include "zlib.h" - -#if defined(STDC) && !defined(Z_SOLO) -# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) -# include -# endif -# include -# include -#endif - -#ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# ifndef Z_SOLO -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# if defined(M_I86) && !defined(Z_SOLO) -# include -# endif -#endif - -#if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - -#if defined(__BORLANDC__) && !defined(MSDOS) - #pragma warn -8004 - #pragma warn -8008 - #pragma warn -8066 -#endif - -/* provide prototypes for these when building zlib without LFS */ -#if !defined(_WIN32) && (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(pyr) || defined(Z_SOLO) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#ifdef DEBUG -# include - extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -#endif - -#ifndef Z_SOLO - voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); - void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); -#endif - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -/* Reverse the bytes in a 32-bit value */ -#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -#endif /* ZUTIL_H */ From 322c0e35eba7518172958671d8ec12bf6e82a59a Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Tue, 20 Oct 2015 13:34:19 -0700 Subject: [PATCH 055/112] Improved race name editing, hyperlinks to SpeedFreq --- PitsideConsole/PitsideConsole/DashWare.cpp | 28 +++++++++++++++---- .../PitsideConsole/DlgRaceNameEdit.cpp | 10 +++++-- .../PitsideConsole/DlgRaceSelectEdit.cpp | 20 +++++++++++++ PitsideConsole/PitsideConsole/Hyperlinks.cpp | 2 +- .../PitsideConsole/PitsideConsole.rc | 4 +-- 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 3481c0b..ad10d1d 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -72,11 +72,28 @@ namespace DashWare int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) int msEndTime = -INT_MAX; + // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available + for(int y = 0; y < DATA_CHANNEL_COUNT; y++) + { + const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)y); + DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues +// DASSERT(pChannel->IsLocked() && pChannel->IsValid()); +// if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) + if(pChannel && pChannel->IsValid()) + { + mapChannels[(DATA_CHANNEL)y] = pChannel; + } + else + { + DASSERT(FALSE); + } + } + // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) { - const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); -// const IDataChannel* pDC = mapChannels[i->first]; // Removed this as it didn't give the correct lap times +// const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); + const IDataChannel* pDC = mapChannels[i->first]; // Removed this as it didn't give the correct lap times if(pDC) { msStartTime = min(pDC->GetStartTimeMs(),msStartTime); @@ -114,10 +131,11 @@ namespace DashWare out << "," << szTemp; // For all of the hard coded channels, loop through them to get the data channel value at this point in time - for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) +// const ILap* pLap_temp = g_pLapDB->GetLap(pLap->GetLapId()); // Get the data for this lap/channel + for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) { - const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // Get the data for this lap/channel -// const IDataChannel* pDC = i->second; // Removed this as it didn't give the correct lap data +// const IDataChannel* pDC_temp = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // Get the data for this lap/channel + const IDataChannel* pDC = i->second; // Removed this as it didn't give the correct lap data if(pDC) { float flValue = pDC->GetValue(msQuery); diff --git a/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp b/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp index e576832..d961f50 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp +++ b/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp @@ -18,6 +18,8 @@ LRESULT CRenameDlg::DlgProc case WM_INITDIALOG: { // Initialize the send message parameters. + HWND hWndMsg = GetDlgItem(hWnd,IDC_EDTMESSAGE2); + SendMessageW(hWndMsg, WM_SETTEXT, (WPARAM)m_pResults->szName, (LPARAM)m_pResults->szName); return TRUE; } case WM_COMMAND: @@ -27,10 +29,14 @@ LRESULT CRenameDlg::DlgProc case IDOK: { HWND hWndMsg = GetDlgItem(hWnd,IDC_EDTMESSAGE2); - SendMessage(hWndMsg, WM_GETTEXT, NUMCHARS(m_pResults->szName), (LPARAM)m_pResults->szName); - if(wcslen(m_pResults->szName) > 0) + TCHAR szTemp[MAX_PATH]; +// SendMessage(hWndMsg, WM_GETTEXT, NUMCHARS(m_pResults->szName), (LPARAM)m_pResults->szName); +// if(wcslen(m_pResults->szName) > 0 ) + SendMessage(hWndMsg, WM_GETTEXT, NUMCHARS(szTemp), (LPARAM)szTemp); + if(wcslen(szTemp) > 0 && wcscmp( m_pResults->szName, szTemp ) != 0 ) { // User actually entered something. Let's return this for updating. + wcscpy_s( m_pResults->szName, NUMCHARS(m_pResults->szName), szTemp ); // Copy the string to the sfResult pointer m_pResults->fCancelled = false; } else diff --git a/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp b/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp index a52b594..115ccf8 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp +++ b/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp @@ -125,6 +125,26 @@ LRESULT CRaceSelectEditDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM { // Let's make sure that the user really wants to do this. RENAMEDLG_RESULT sfResult; + set setSelected = sfListBox.GetSelectedItemsData2(); + if(setSelected.size() >= 1) + { + // Get the current Race Name to insert into edit dialog + int iFirstRaceId = -1; + for(set::const_iterator i = setSelected.begin(); i != setSelected.end(); i++) + { + // Let's find the race name in the database to display in the edit dialog + vector lstRaces = m_pLapDB->GetRaces(); + + for(int x = 0;x < lstRaces.size(); x++) + { + if( lstRaces[x].raceId == *i) + { + wcscpy_s( sfResult.szName, NUMCHARS(sfResult.szName), lstRaces[x].strName.c_str() ); // Copy the string to the sfResult pointer + break; + } + } + } + } CRenameDlg dlgRaceRename(&sfResult); ArtShowDialog(&dlgRaceRename); if(!sfResult.fCancelled) diff --git a/PitsideConsole/PitsideConsole/Hyperlinks.cpp b/PitsideConsole/PitsideConsole/Hyperlinks.cpp index ca4b613..cbd4dea 100644 --- a/PitsideConsole/PitsideConsole/Hyperlinks.cpp +++ b/PitsideConsole/PitsideConsole/Hyperlinks.cpp @@ -115,7 +115,7 @@ LRESULT CALLBACK _HyperlinkProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM l { // Shell to the website TCHAR lpOpen[MAX_PATH] = L"open"; - TCHAR lpFile[MAX_PATH] = L"https://sites.google.com/site/wifilapper/"; + TCHAR lpFile[MAX_PATH] = L"http://sites.google.com/site/speedfreqapp"; int nShowCmd = SW_RESTORE; // Restore the Help document, if it is minimized or whatever. HINSTANCE Check = ShellExecuteW(hwnd, lpOpen, lpFile, NULL, NULL, nShowCmd); if ((int)Check <= 32) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 9d15e84..3d96bc5 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -184,8 +184,8 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for Wifilapper\n\nVersion 2.004.0005\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 - CTEXT "https://sites.google.com/site/wifilapper",IDC_LBLMESSAGE6,5,270,245,20 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0005\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 0540d748494133941a03f57e4d0aa8c604a48906 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 22 Oct 2015 14:12:58 -0700 Subject: [PATCH 056/112] Improved CSV Export coding, with better lap management 1) Improved lap detection within CSV Export function 2) Improved Session renaming, with autopopulated names --- PitsideConsole/PitsideConsole/DashWare.cpp | 15 +++++++++------ PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp | 8 +++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index ad10d1d..009707e 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -89,18 +89,21 @@ namespace DashWare } } + const IDataChannel* pDC = mapChannels[DATA_CHANNEL_VELOCITY]; // Use the Velocity data channel to set time boundary conditions for this lap // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available - for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) +/* for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) { -// const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); - const IDataChannel* pDC = mapChannels[i->first]; // Removed this as it didn't give the correct lap times +// const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // This is a huge memory hog + const IDataChannel* pDC = mapChannels[i->first]; // Not sure if this gives the correct lap times if(pDC) { msStartTime = min(pDC->GetStartTimeMs(),msStartTime); - msEndTime = max(pDC->GetEndTimeMs(),msEndTime); +// msEndTime = max(pDC->GetEndTimeMs(),msEndTime); } } - msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); +*/ + msStartTime = pDC->GetStartTimeMs(); + msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); const vector& lstPoints = pLap->GetPoints(); // List of points for this lap float flRunningAverage[DATA_CHANNEL_COUNT] = {0.0f}; @@ -135,7 +138,7 @@ namespace DashWare for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) { // const IDataChannel* pDC_temp = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // Get the data for this lap/channel - const IDataChannel* pDC = i->second; // Removed this as it didn't give the correct lap data + const IDataChannel* pDC = i->second; // Not sure if this gives the correct lap data if(pDC) { float flValue = pDC->GetValue(msQuery); diff --git a/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp b/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp index d961f50..99a9e21 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp +++ b/PitsideConsole/PitsideConsole/DlgRaceNameEdit.cpp @@ -17,7 +17,7 @@ LRESULT CRenameDlg::DlgProc { case WM_INITDIALOG: { - // Initialize the send message parameters. + // Initialize the send message parameters, and fill in the dialog with the old item for editing. HWND hWndMsg = GetDlgItem(hWnd,IDC_EDTMESSAGE2); SendMessageW(hWndMsg, WM_SETTEXT, (WPARAM)m_pResults->szName, (LPARAM)m_pResults->szName); return TRUE; @@ -29,9 +29,7 @@ LRESULT CRenameDlg::DlgProc case IDOK: { HWND hWndMsg = GetDlgItem(hWnd,IDC_EDTMESSAGE2); - TCHAR szTemp[MAX_PATH]; -// SendMessage(hWndMsg, WM_GETTEXT, NUMCHARS(m_pResults->szName), (LPARAM)m_pResults->szName); -// if(wcslen(m_pResults->szName) > 0 ) + TCHAR szTemp[MAX_PATH] = {NULL}; SendMessage(hWndMsg, WM_GETTEXT, NUMCHARS(szTemp), (LPARAM)szTemp); if(wcslen(szTemp) > 0 && wcscmp( m_pResults->szName, szTemp ) != 0 ) { @@ -41,7 +39,7 @@ LRESULT CRenameDlg::DlgProc } else { - // User did not enter anything. Let's not make any changes. + // User did not enter or change anything. Let's not make any changes. m_pResults->fCancelled = true; } EndDialog(hWnd,0); From b5e4c452f74ec54d44a6e8862cafaa3979a1eee3 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 22 Oct 2015 16:56:54 -0700 Subject: [PATCH 057/112] Minor tweak to Send Message, adding a default message and saving last message --- PitsideConsole/PitsideConsole/DlgMessage.cpp | 2 ++ PitsideConsole/PitsideConsole/PitsideConsole.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/DlgMessage.cpp b/PitsideConsole/PitsideConsole/DlgMessage.cpp index 9f9ac1e..64f104c 100644 --- a/PitsideConsole/PitsideConsole/DlgMessage.cpp +++ b/PitsideConsole/PitsideConsole/DlgMessage.cpp @@ -18,6 +18,8 @@ LRESULT CMessageDlg::DlgProc case WM_INITDIALOG: { // Initialize the send message parameters. + HWND hWndMsg = GetDlgItem(hWnd,IDC_EDTMESSAGE); + SendMessage(hWndMsg, WM_SETTEXT, NUMCHARS(m_pResults->szMessage), (LPARAM)m_pResults->szMessage); TCHAR szTime[100] = L"1"; HWND hWndTime = GetDlgItem(hWnd, IDC_EDTTIME); SendMessage(hWndTime, WM_SETTEXT, NUMCHARS(szTime), (LPARAM)szTime); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 2237850..353e2c7 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -956,7 +956,11 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { case IDC_SENDMESSAGE: { - MESSAGEDLG_RESULT sfResult; + static MESSAGEDLG_RESULT sfResult; + if(wcslen(sfResult.szMessage) <= 0) + { + wcscpy_s( sfResult.szMessage, L"Pit Now"); // Add default string if nothing is there + } CMessageDlg dlgMessage(&sfResult); HWND hWndButton = GetDlgItem(this->m_hWnd,IDC_SENDMESSAGE); From 00ad769088a7b5dc1cd46b3ae7a6e1f7401b1278 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 29 Oct 2015 17:01:54 -0700 Subject: [PATCH 058/112] Added Sector Split cancel, file pathname to Title caption --- .../PitsideConsole/DlgRaceSelectEdit.cpp | 1 - .../PitsideConsole/PitsideConsole.cpp | 78 ++++++++++++++++++- .../PitsideConsole/PitsideConsole.rc | 6 +- PitsideConsole/PitsideConsole/resource.h | 1 + 4 files changed, 76 insertions(+), 10 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp b/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp index 115ccf8..ca57556 100644 --- a/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp +++ b/PitsideConsole/PitsideConsole/DlgRaceSelectEdit.cpp @@ -129,7 +129,6 @@ LRESULT CRaceSelectEditDlg::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM if(setSelected.size() >= 1) { // Get the current Race Name to insert into edit dialog - int iFirstRaceId = -1; for(set::const_iterator i = setSelected.begin(); i != setSelected.end(); i++) { // Let's find the race name in the database to display in the edit dialog diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 353e2c7..b6b5445 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -627,6 +627,26 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) InitBaseWindowPos(); tmLast = timeGetTime(); // Initialize time lap was received + + // Find all of the Names of the selected Race Sessions for addition to title bar + vector lstRaces = g_pLapDB->GetRaces(); + TCHAR lstSessions[MAX_PATH] = {NULL}; + for(int x = 0;x < lstRaces.size(); x++) + { + for (int z = 0; z < 50; z++) + { + if ( m_iRaceId[z] == lstRaces[x].raceId ) + { + _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); + break; + } + } + } + + TCHAR szTemp[MAX_PATH] = {NULL}; + _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); + SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened + return 0; } case WM_CLOSE: @@ -1102,6 +1122,26 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) ClearUILaps(); LoadLaps(g_pLapDB); UpdateUI(UPDATE_ALL); + + // Find all of the Names of the selected Race Sessions for addition to title bar + vector lstRaces = g_pLapDB->GetRaces(); + TCHAR lstSessions[MAX_PATH] = {NULL}; + for(int x = 0;x < lstRaces.size(); x++) + { + for (int z = 0; z < 50; z++) + { + if ( m_iRaceId[z] == lstRaces[x].raceId ) + { + _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); + break; + } + } + } + + TCHAR szTemp[MAX_PATH] = {NULL}; + _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); + SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened + // Just loaded a new session. Let's reset the timer tmLast = timeGetTime(); // Save last time lap was received } @@ -1219,7 +1259,20 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return TRUE; } - case ID_HELP_SHOWHELP: + case ID_OPTIONS_CANCELSPLITS: + { + if (HC_ShowSplits) // If the window showing all of the lap data is present, let's kill it + { + if (GetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow) ) + { + DestroyWindow(hWndShowSplits); + hWndShowSplits = NULL; + } + } + m_sfLapOpts.fDrawSplitPoints = false; + return TRUE; + } + case ID_HELP_SHOWHELP: { ShowHelp(hWnd); return TRUE; @@ -1607,7 +1660,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) SELECTSESSIONS_RESULT sfResult; CDlgSelectSessions dlgRace(g_pLapDB, &sfResult); ArtShowDialog(&dlgRace); - if(!sfResult.fCancelled /*&& sfResult.m_RaceId[0] != -1 */) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet + if( !sfResult.fCancelled ) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet { // Now display the T&S page and pass these RaceID's to this class TS_RESULT ts_sfResult; @@ -1649,6 +1702,24 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) UpdateUI(UPDATE_ALL); // Let's reset the timer tmLast = timeGetTime(); // Save last time lap was received + + // Find all of the Names of the selected Race Sessions for addition to title bar + vector lstRaces = g_pLapDB->GetRaces(); + TCHAR lstSessions[MAX_PATH] = {NULL}; + for(int x = 0;x < lstRaces.size(); x++) + { + for (int z = 0; z < 50; z++) + { + if ( m_iRaceId[z] == lstRaces[x].raceId ) + { + _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); + break; + } + } + } + TCHAR szTemp[MAX_PATH] = {NULL}; + _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); + SetWindowText(hWnd, szTemp); // Change the title bar to show the file name opened } } } @@ -2228,7 +2299,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) void HandleResize(SIZE sNewSize) { HandleCtlResize(sNewSize, IDC_DISPLAY, true, true); // main display window -// HandleCtlResize(sNewSize, IDC_SUBDISPLAY, false, false); // sub display window HandleCtlResize(sNewSize, IDC_SUBDISPLAY, true, false); // sub display window HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window @@ -3709,7 +3779,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine fDBOpened = true; } } - + } else { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 3d96bc5..3f908aa 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -14,8 +14,6 @@ BEGIN CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 LTEXT "",IDC_DISPLAY,155,63,590,282 -// LTEXT "",IDC_SUBDISPLAY,520,0,87,63 -// LTEXT "",IDC_TRACTIONCIRCLEMAP,610,0,63,63 LTEXT "",IDC_TRACTIONCIRCLEMAP,520,0,63,63 LTEXT "",IDC_SUBDISPLAY,586,0,87,63 AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 @@ -27,15 +25,12 @@ BEGIN EDITTEXT IDC_COMMENTTEXT, 155,12,93,12 PUSHBUTTON "Set Comment", IDC_SETDRIVER, 250,0,75,12 // PUSHBUTTON "Clear Comment", IDC_CLEARCOMMENT, 250,14,75,12 -// PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,28,75,12 -// PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,42,75,12 PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,14,75,12 PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,28,75,12 LTEXT "", IDC_CURRENTREFERENCE, 155,26,93,24 LTEXT "", IDC_MESSAGESTATUS, 155,43,93,24 LTEXT "Phone: ", IDC_CURRENTREMOTEIP, 155,55,100,10 -// LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,55,70,10 LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,42,70,10 CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 END @@ -460,6 +455,7 @@ POPUP "&Graphing" MENUITEM "X-Axis in LAT", ID_OPTIONS_XAXIS_LAT MENUITEM SEPARATOR MENUITEM "Set Split Points", ID_OPTIONS_SETSPLITS + MENUITEM "Cancel Split Points", ID_OPTIONS_CANCELSPLITS MENUITEM SEPARATOR MENUITEM "Show Traction Circle", ID_OPTIONS_TRACTIONCIRCLE MENUITEM SEPARATOR diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index 95bacc7..e71d097 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -262,6 +262,7 @@ #define IDM_SAVE_BM 332 #define IDC_TRACTIONCIRCLEMAP 333 #define ID_OPTIONS_TRACTIONCIRCLE 334 +#define ID_OPTIONS_CANCELSPLITS 335 #define IDD_SHOWSECTORS 340 #define IDC_SHOW_SECTORS 341 From 9726ed0be66a85029f48960c4196275ab5bf730b Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Sun, 3 Jan 2016 20:24:33 -0700 Subject: [PATCH 059/112] Code cleanup --- PitsideConsole/PitsideConsole.sln | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/PitsideConsole/PitsideConsole.sln b/PitsideConsole/PitsideConsole.sln index 74597a8..f59215d 100644 --- a/PitsideConsole/PitsideConsole.sln +++ b/PitsideConsole/PitsideConsole.sln @@ -8,18 +8,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PitsideConsole", "PitsideCo EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArtLib", "ArtLib\ArtLib.vcxproj", "{D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}" EndProject -Project("{911E67C6-3D85-4FCE-B560-20A9C3E3FF48}") = "PitsideConsole_", "Release\PitsideConsole_.exe", "{F69D9218-3460-4995-99F5-393C45152E4F}" - ProjectSection(DebuggerProjectSystem) = preProject - PortSupplier = 00000000-0000-0000-0000-000000000000 - Executable = E:\gitroot\wifilapper\PitsideConsole\Release\PitsideConsole_.exe - RemoteMachine = ARTNEW - StartingDirectory = E:\gitroot\wifilapper\PitsideConsole\Release - Environment = Default - LaunchingEngine = 00000000-0000-0000-0000-000000000000 - LaunchSQLEngine = No - AttachLaunchAction = No - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Mixed Platforms = Debug|Mixed Platforms @@ -50,12 +38,6 @@ Global {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Win32.ActiveCfg = Release|Win32 {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|Win32.Build.0 = Release|Win32 {D18EBEAA-1DDF-4898-8BC1-286BFB5BFA7B}.Release|x86.ActiveCfg = Release|Win32 - {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|Win32.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Debug|x86.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Mixed Platforms.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Release|Win32.ActiveCfg = Debug|x86 - {F69D9218-3460-4995-99F5-393C45152E4F}.Release|x86.ActiveCfg = Debug|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 353b3d7594bf8779bfcd47eb3cc640043bed177c Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Sun, 3 Jan 2016 21:31:15 -0700 Subject: [PATCH 060/112] 2.004.0006: Connection Level channel added, fixed HRM units --- PitsideConsole/PitsideConsole/LapData.cpp | 8 +++++++- PitsideConsole/PitsideConsole/LapData.h | 1 + PitsideConsole/PitsideConsole/PitsideConsole.rc | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index dd17b6c..f963038 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -252,6 +252,7 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) case DATA_CHANNEL_RECEPTION_X: lpszDataName = L"Wifi Dots X"; break; case DATA_CHANNEL_RECEPTION_Y: lpszDataName = L"Wifi Dots Y"; break; case DATA_CHANNEL_HRM: lpszDataName = L"Heart Rate"; break; + case DATA_CHANNEL_STRENGTH: lpszDataName = L"Conn. Level"; break; default: if(eDC >= DATA_CHANNEL_IOIOPIN_START && eDC <= DATA_CHANNEL_IOIOPIN_END) { @@ -340,9 +341,13 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP break; } case DATA_CHANNEL_LAPTIME_SUMMARY: + { + sprintf(lpsz, "%4.1f", flValue); + break; + } case DATA_CHANNEL_HRM: { - sprintf(lpsz, "%4.1fs", flValue); + sprintf(lpsz, "%4.1fBPM", flValue); break; } case DATA_CHANNEL_TIME: @@ -444,6 +449,7 @@ void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPS } case DATA_CHANNEL_LAPTIME_SUMMARY: case DATA_CHANNEL_HRM: + case DATA_CHANNEL_STRENGTH: { sprintf(lpsz, "%4.1f", flValue); break; diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 4579980..6fbac93 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -25,6 +25,7 @@ enum DATA_CHANNEL DATA_CHANNEL_ELAPSEDTIME = 12, DATA_CHANNEL_LAPTIME_SUMMARY = 13, + DATA_CHANNEL_STRENGTH = 0x11, DATA_CHANNEL_HRM = 0x80, DATA_CHANNEL_PID_START = 0x100, DATA_CHANNEL_PID_END = 0x200, diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 3f908aa..ccf3ad8 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -179,7 +179,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0005\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0006\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 82ab4397531f08de00fe41e9a2f7aceb527438e6 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Mon, 4 Jan 2016 08:10:43 -0700 Subject: [PATCH 061/112] Corrected Connection Level coding, window dressing on graphs --- PitsideConsole/PitsideConsole/LapData.cpp | 5 +++++ PitsideConsole/PitsideConsole/PitsideConsole.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index f963038..46fbd22 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -349,6 +349,11 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP { sprintf(lpsz, "%4.1fBPM", flValue); break; + } + case DATA_CHANNEL_STRENGTH: + { + sprintf(lpsz, "%4.1f", flValue); + break; } case DATA_CHANNEL_TIME: { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index b6b5445..28e5ee9 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3341,6 +3341,10 @@ void UpdateDisplays() int iMin = (int)(flMin); return (float)(iMin); } + case DATA_CHANNEL_STRENGTH: + { + return 0.0f; + } case DATA_CHANNEL_X_ACCEL: case DATA_CHANNEL_Y_ACCEL: case DATA_CHANNEL_Z_ACCEL: @@ -3506,6 +3510,7 @@ void UpdateDisplays() case DATA_CHANNEL_Y_ACCEL: return 0.5f; case DATA_CHANNEL_Z_ACCEL: return 0.5f; case DATA_CHANNEL_TEMP: return 10.0f; + case DATA_CHANNEL_STRENGTH: return 1.0f; default: if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || From 7e615b5c353741d545f908ad6b410dc6a07422c3 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Mon, 4 Jan 2016 21:07:38 -0700 Subject: [PATCH 062/112] Velocity Delta channel added to Pitside Console --- PitsideConsole/PitsideConsole/LapData.cpp | 34 +++++++++++++++++++ PitsideConsole/PitsideConsole/LapData.h | 1 + .../PitsideConsole/PitsideConsole.cpp | 25 ++++++++++---- 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 46fbd22..02823f5 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -244,6 +244,7 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) case DATA_CHANNEL_ELAPSEDTIME: lpszDataName = L"Elapsed Time"; break; case DATA_CHANNEL_LAPTIME_SUMMARY: lpszDataName = L"Lap Time"; break; case DATA_CHANNEL_VELOCITY: lpszDataName = L"Velocity"; break; + case DATA_CHANNEL_VELOCITYDELTA: lpszDataName = L"Vel. Delta"; break; case DATA_CHANNEL_TIMESLIP: lpszDataName = L"Time-slip"; break; case DATA_CHANNEL_X_ACCEL: lpszDataName = L"X accel"; break; case DATA_CHANNEL_Y_ACCEL: lpszDataName = L"Y accel"; break; @@ -367,6 +368,7 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP } case DATA_CHANNEL_VELOCITY: + case DATA_CHANNEL_VELOCITYDELTA: { LPCSTR lpszUnits = GetUnitText(eUnits); // note: velocity is in m/s, but most humans will like km/h (well... except for americans, but screw them for now) @@ -470,6 +472,7 @@ void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPS break; } case DATA_CHANNEL_VELOCITY: + case DATA_CHANNEL_VELOCITYDELTA: { // note: velocity is in m/s, but most humans will like km/h (well... except for americans, but screw them for now) sprintf(lpsz, "%4.1f", ConvertSpeed(eUnits,flValue)); @@ -608,6 +611,7 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende // the distance-from-start/finish for P is thus (percentage) * (d2's distance) + (100 - percentage) * (d1's distance) IDataChannel* pDistance = pLapDB->AllocateDataChannel(); IDataChannel* pVelocity = pLapDB->AllocateDataChannel(); + IDataChannel* pVelocityDelta = pLapDB->AllocateDataChannel(); IDataChannel* pX = pLapDB->AllocateDataChannel(); IDataChannel* pY = pLapDB->AllocateDataChannel(); IDataChannel* pTime = pLapDB->AllocateDataChannel(); @@ -621,6 +625,7 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pY->Init(GetLap()->GetLapId(), DATA_CHANNEL_Y); pDistance->Init(GetLap()->GetLapId(), DATA_CHANNEL_DISTANCE); pVelocity->Init(GetLap()->GetLapId(), DATA_CHANNEL_VELOCITY); + pVelocityDelta->Init(GetLap()->GetLapId(), DATA_CHANNEL_VELOCITYDELTA); int iStartPoint = 0; for(int x = 0;x < lstPoints.size(); x++) { @@ -656,6 +661,13 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende m_lstPoints.push_back(TimePoint2D(p)); pDistance->AddPoint((int)p.iTime,dThisDistance); pVelocity->AddPoint((int)p.iTime,p.flVelocity); + + // Let's compute the Velocity delta between the Reference and current lap + const IDataChannel* pReferenceVelocityChannel = pReferenceLap->GetChannel(DATA_CHANNEL_VELOCITY); + const double dD1Velocity = pReferenceVelocityChannel->GetValue(sfD1.iTime); + const double dD2Velocity = pReferenceVelocityChannel->GetValue(sfD2.iTime); + const double dRefVelocity = (dD1Velocity * (1-dPercent)) + (dD2Velocity * dPercent); + pVelocityDelta->AddPoint((int)p.iTime,p.flVelocity - (float)dRefVelocity ); // Insert the velocity delta into the vector for this channel } } else @@ -668,6 +680,13 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende m_lstPoints.push_back(TimePoint2D(p)); pDistance->AddPoint((int)p.iTime,dThisDistance); pVelocity->AddPoint((int)p.iTime,p.flVelocity); + + // Let's compute the Velocity delta between the Reference and current lap + const IDataChannel* pReferenceVelocityChannel = pReferenceLap->GetChannel(DATA_CHANNEL_VELOCITY); + const double dD1Velocity = pReferenceVelocityChannel->GetValue(sfD1.iTime); + const double dD2Velocity = pReferenceVelocityChannel->GetValue(sfD2.iTime); + const double dRefVelocity = (dD1Velocity * (1-dPercent)) + (dD2Velocity * dPercent); + pVelocityDelta->AddPoint((int)p.iTime,p.flVelocity - (float)dRefVelocity ); // Insert the velocity delta into the vector for this channel } } @@ -756,6 +775,16 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pLapDB->FreeDataChannel(pVelocity); pVelocity = NULL; } + if(pVelocityDelta->IsValid()) + { + pVelocityDelta->Lock(); + AddChannel(pVelocityDelta); + } + else + { + pLapDB->FreeDataChannel(pVelocityDelta); + pVelocityDelta = NULL; + } if(fComputeTimeSlip && m_lstPoints.size() > 0) { @@ -853,6 +882,7 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende IDataChannel* pDistance = pLapDB->AllocateDataChannel(); IDataChannel* pVelocity = pLapDB->AllocateDataChannel(); + IDataChannel* pVelocityDelta = pLapDB->AllocateDataChannel(); IDataChannel* pTimeSlip = pLapDB->AllocateDataChannel(); IDataChannel* pTime = pLapDB->AllocateDataChannel(); IDataChannel* pLapTime = pLapDB->AllocateDataChannel(); @@ -862,6 +892,7 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pLapTime->Init(GetLap()->GetLapId(), DATA_CHANNEL_ELAPSEDTIME); pLapTimeSummary->Init(GetLap()->GetLapId(), DATA_CHANNEL_LAPTIME_SUMMARY); // Preparing to add Laptime Summary channel for X-axis pVelocity->Init(GetLap()->GetLapId(), DATA_CHANNEL_VELOCITY); + pVelocityDelta->Init(GetLap()->GetLapId(), DATA_CHANNEL_VELOCITYDELTA); pTimeSlip->Init(GetLap()->GetLapId(), DATA_CHANNEL_TIMESLIP); for(int x = 1;x < lstPoints.size(); x++) { @@ -891,6 +922,7 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pDistance->AddPoint(p.iTime, dDistance); pVelocity->AddPoint(p.iTime, p.flVelocity); + pVelocityDelta->AddPoint(p.iTime, 0); // No delta from reference lap, since we ARE the reference lap pTimeSlip->AddPoint(p.iTime, 0); } @@ -901,12 +933,14 @@ void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtende pLapTimeSummary->Lock(); pLapTime->Lock(); pVelocity->Lock(); + pVelocityDelta->Lock(); pTimeSlip->Lock(); AddChannel(pDistance); AddChannel(pTime); AddChannel(pLapTime); AddChannel(pLapTimeSummary); AddChannel(pVelocity); + AddChannel(pVelocityDelta); AddChannel(pTimeSlip); AddChannel(pX); AddChannel(pY); diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 6fbac93..0aca648 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -24,6 +24,7 @@ enum DATA_CHANNEL DATA_CHANNEL_TIME = 11, DATA_CHANNEL_ELAPSEDTIME = 12, DATA_CHANNEL_LAPTIME_SUMMARY = 13, + DATA_CHANNEL_VELOCITYDELTA = 14, DATA_CHANNEL_STRENGTH = 0x11, DATA_CHANNEL_HRM = 0x80, diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 28e5ee9..6b321b5 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3280,6 +3280,7 @@ void UpdateDisplays() case DATA_CHANNEL_X: return 1e30; case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude case DATA_CHANNEL_VELOCITY: + case DATA_CHANNEL_VELOCITYDELTA: { int iMin = (int)(flMin); return (float)(iMin); @@ -3336,18 +3337,16 @@ void UpdateDisplays() int iMin = (int)(flMin/1000.0f); return (float)(iMin)*1000.0f; } + case DATA_CHANNEL_STRENGTH: return 0.0f; case DATA_CHANNEL_LAPTIME_SUMMARY: + case DATA_CHANNEL_X_ACCEL: + case DATA_CHANNEL_Y_ACCEL: + case DATA_CHANNEL_Z_ACCEL: { int iMin = (int)(flMin); return (float)(iMin); } - case DATA_CHANNEL_STRENGTH: - { - return 0.0f; - } - case DATA_CHANNEL_X_ACCEL: - case DATA_CHANNEL_Y_ACCEL: - case DATA_CHANNEL_Z_ACCEL: + case DATA_CHANNEL_VELOCITYDELTA: { int iMin = (int)(flMin); return (float)(iMin); @@ -3379,6 +3378,7 @@ void UpdateDisplays() case DATA_CHANNEL_X: return 1e30; case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude case DATA_CHANNEL_VELOCITY: // We need to fix the X-channel call before putting these back into the code. + case DATA_CHANNEL_VELOCITYDELTA: { switch(m_sfLapOpts.eUnitPreference) { @@ -3459,6 +3459,17 @@ void UpdateDisplays() } return 10.0; } + case DATA_CHANNEL_VELOCITYDELTA: + { + if(flSpread < 1) return 0.5f; + if(flSpread < 5) return 1.0f; + if(flSpread < 10) return 2.0f; + if(flSpread < 20) return 5.0f; + if(flSpread < 40) return 10.0f; + if(flSpread < 60) return 15.0f; + if(flSpread < 100) return 20.0f; + return 2.0; + } case DATA_CHANNEL_DISTANCE: { if(flSpread < 0.001) return 0.0001f; From 10b140fc43d35d653087d0071bfcef527c27fa71 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Thu, 7 Jan 2016 20:24:58 -0700 Subject: [PATCH 063/112] Minor performance refining --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index b6b5445..ef2ed18 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -802,12 +802,12 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if (pLVInfo->iSubItem == SORTSTYLE_BYTIMEOFRACE && m_sfLapOpts.eSortPreference != SORTSTYLE_BYTIMEOFRACE) { m_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; - UpdateUI(UPDATE_MENU | UPDATE_DASHBOARD | UPDATE_LIST); + UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST); } else if (pLVInfo->iSubItem == SORTSTYLE_BYLAPTIME && m_sfLapOpts.eSortPreference != SORTSTYLE_BYLAPTIME) { m_sfLapOpts.eSortPreference = SORTSTYLE_BYLAPTIME; - UpdateUI(UPDATE_MENU | UPDATE_DASHBOARD | UPDATE_LIST); + UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST); } } } @@ -823,7 +823,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; if(pDetails->iItem >= 0) // Single select Listview, requires special handling { - UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP| UPDATE_DASHBOARD | UPDATE_VALUES); } } return TRUE; @@ -844,7 +844,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; if(pDetails->iItem >= 0) { - UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP| UPDATE_DASHBOARD | UPDATE_VALUES); } } return TRUE; From 9bc82574aeb5a029ea20b24fa008962c80c809dd Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 7 Jan 2016 21:30:42 -0700 Subject: [PATCH 064/112] Derived channels with fixes --- PitsideConsole/PitsideConsole/DashWare.cpp | 93 +++++++++++-------- PitsideConsole/PitsideConsole/DashWare.h | 3 +- PitsideConsole/PitsideConsole/LapData.cpp | 2 +- .../PitsideConsole/PitsideConsole.cpp | 10 +- 4 files changed, 63 insertions(+), 45 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 009707e..4c0c605 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -12,10 +12,10 @@ namespace DashWare { return lap1->GetStartTime() < lap2->GetStartTime(); } - void WriteChannelHeaders(wofstream& out, const vector& lstLaps, map& mapData) + void WriteChannelHeaders(wofstream& out, map& mapData) { // if you update this function, update the dashware.xml file too! - out << L"Lap,Time,x,y"; + out << L"Lap,Time"/*,x,y"*/; // column headers for(map::iterator i = begin(mapData); i != end(mapData); i++) @@ -30,31 +30,38 @@ namespace DashWare } // Subprogram saves the chosen lap's data out to a CSV file for import into rendering programs like Dashware and RaceRender - HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps) + HRESULT SaveToDashware(LPCTSTR lpszFilename, /*const vector& lstLaps,*/ vector lstLaps1) { // lstLaps: Vector of chosen laps to output, lpszFileaname: Filename to output CSV file to - if(lstLaps.size() <= 0) return E_FAIL; - +// if(lstLaps.size() <= 0) return E_FAIL; + if(lstLaps1.size() <= 0) return E_FAIL; +/* vector lstSortedLaps = lstLaps; // Get all of the chosen laps sort(begin(lstSortedLaps),end(lstSortedLaps),SortLapsByTime); // Sort all of the chosen laps by lap time - +*/ wofstream out; out.open(lpszFilename); // Open up the CSV file for input - map mapChannels; // mapChannels is the list of Data Channels for all laps + map dwMapChannels; // dwMapChannels is the list of Data Channels for all laps - for(int ixLap = 0;ixLap < lstLaps.size(); ixLap++) +// for(int ixLap = 0;ixLap < lstLaps.size(); ixLap++) + for(int ixLap = 0;ixLap < lstLaps1.size(); ixLap++) { // Find all of the populated data channels for this lap - for(int y = 0; y < DATA_CHANNEL_COUNT; y++) + set setLapData = lstLaps1[ixLap]->GetAvailableChannels(); // Load the CExtendedLap data for the lap list +// for(int y = 0; y < DATA_CHANNEL_COUNT; y++) +// { + for(set::iterator i = setLapData.begin(); i != setLapData.end(); i++) { - const IDataChannel* pChannel = g_pLapDB->GetDataChannel(lstLaps[ixLap]->GetLapId(),(DATA_CHANNEL)y); +// const IDataChannel* pChannel = g_pLapDB->GetDataChannel(lstLaps[ixLap]->GetLapId(),(DATA_CHANNEL)y); + const IDataChannel* pChannel = lstLaps1[ixLap]->GetChannel(*i); DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues // DASSERT(pChannel->IsLocked() && pChannel->IsValid()); // if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) if(pChannel && pChannel->IsValid()) { - mapChannels[(DATA_CHANNEL)y] = pChannel; // Add Data Channel to the list +// dwMapChannels[(DATA_CHANNEL)y] = pChannel; // Add Data Channel to the list + dwMapChannels[*i] = pChannel; // Add Data Channel to the list } else { @@ -62,39 +69,44 @@ namespace DashWare } } } - WriteChannelHeaders(out, lstSortedLaps, mapChannels); // Put all Data Channel names into the header for the CSV file + WriteChannelHeaders(out, dwMapChannels); // Put all Data Channel names into the header for the CSV file int msLastLine = 0; // Indexer for pulling correct timestamp data for each data channel float flStartTime = 0; // start time in seconds; - for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) +// for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) + for (int ixLap = 0; ixLap < lstLaps1.size(); ixLap++) { - const ILap* pLap = lstSortedLaps[ixLap]; // Get the chosen lap +// const ILap* pLap = lstSortedLaps[ixLap]; // Get the chosen lap + const ILap* pLap = lstLaps1[ixLap]->GetLap(); // Get the chosen lap int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) int msEndTime = -INT_MAX; - - // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available - for(int y = 0; y < DATA_CHANNEL_COUNT; y++) - { - const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)y); - DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues -// DASSERT(pChannel->IsLocked() && pChannel->IsValid()); -// if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) - if(pChannel && pChannel->IsValid()) - { - mapChannels[(DATA_CHANNEL)y] = pChannel; - } - else - { - DASSERT(FALSE); - } - } - - const IDataChannel* pDC = mapChannels[DATA_CHANNEL_VELOCITY]; // Use the Velocity data channel to set time boundary conditions for this lap +/* + // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available + for(int y = 0; y < DATA_CHANNEL_COUNT; y++) + { + // const IDataChannel* pChannel = lstLaps1[ixLap]->GetChannel((DATA_CHANNEL)y); + const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)y); + DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues + // DASSERT(pChannel->IsLocked() && pChannel->IsValid()); + // if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) + if(pChannel && pChannel->IsValid()) + { + dwMapChannels[(DATA_CHANNEL)y] = pChannel; + } + else + { + DASSERT(FALSE); + } + } + // WriteChannelHeaders(out, dwMapChannels); // Put all Data Channel names into the header for the CSV file +*/ +// const IDataChannel* pDC = dwMapChannels[DATA_CHANNEL_VELOCITY]; // Use the Velocity data channel to set time boundary conditions for this lap + const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(DATA_CHANNEL_VELOCITY); // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available -/* for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) +/* for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) { // const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // This is a huge memory hog - const IDataChannel* pDC = mapChannels[i->first]; // Not sure if this gives the correct lap times + const IDataChannel* pDC = dwMapChannels[i->first]; // Not sure if this gives the correct lap times if(pDC) { msStartTime = min(pDC->GetStartTimeMs(),msStartTime); @@ -123,7 +135,7 @@ namespace DashWare TCHAR szTemp[100] = L"0"; _snwprintf(szTemp,NUMCHARS(szTemp),L"%6.3f",((float)msQuery/1000.0f)+flStartTime); out << szTemp; - // Position X +/* // Position X _snwprintf(szTemp,NUMCHARS(szTemp),L"%0.1f",0.0f); TimePoint2D pt = ::GetPointAtTime(lstPoints,msQuery); _snwprintf(szTemp,NUMCHARS(szTemp),L"%4.6f",pt.flX); @@ -132,13 +144,15 @@ namespace DashWare _snwprintf(szTemp,NUMCHARS(szTemp),L"%1.1f",0.0f); _snwprintf(szTemp,NUMCHARS(szTemp),L"%4.6f",pt.flY); out << "," << szTemp; - +*/ // For all of the hard coded channels, loop through them to get the data channel value at this point in time // const ILap* pLap_temp = g_pLapDB->GetLap(pLap->GetLapId()); // Get the data for this lap/channel - for(map::iterator i = begin(mapChannels); i != end(mapChannels); i++) +// for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) + for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) { // const IDataChannel* pDC_temp = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // Get the data for this lap/channel - const IDataChannel* pDC = i->second; // Not sure if this gives the correct lap data +// const IDataChannel* pDC = i->second; // Not sure if this gives the correct lap data + const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(i->first);; // Not sure if this gives the correct lap data if(pDC) { float flValue = pDC->GetValue(msQuery); @@ -158,6 +172,7 @@ namespace DashWare out << "," << endl << flush; msLastLine = msQuery; // Index the time in preparation for the next lap } +// msLastLine = 0; // Reset the last line query, but this would allow out of time order laps } } diff --git a/PitsideConsole/PitsideConsole/DashWare.h b/PitsideConsole/PitsideConsole/DashWare.h index eca1c97..8c59fd3 100644 --- a/PitsideConsole/PitsideConsole/DashWare.h +++ b/PitsideConsole/PitsideConsole/DashWare.h @@ -8,5 +8,6 @@ using namespace std; namespace DashWare { - HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps); +// HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps); + HRESULT SaveToDashware(LPCTSTR lpszFilename, /*const vector& lstLaps,*/ vector lstLaps1); } \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 02823f5..b7142bb 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -597,7 +597,7 @@ bool FindClosestTwoPoints(const TimePoint2D& p, int* pixStartIndex, double dInpu void CExtendedLap::ComputeLapData(const vector& lstPoints, CExtendedLap* pReferenceLap, const ILapReceiver* pLapDB, bool fComputeTimeSlip) { if(lstPoints.size() <= 3) return; // Check so that following operations don't choke. - +// if(lstPoints.size() <= 2) return; // Check so that following operations don't choke. // for calculating distance and time-slip, we need the reference lap if(pReferenceLap != NULL) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 6b321b5..c81baa6 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1749,19 +1749,21 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } vector lstLaps; - map mapData; +// map mapData; + vector lstLaps1 = GetLapsToShow(); for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) { CExtendedLap* pLap = (CExtendedLap*)*i; - for(int x = 0;x < DATA_CHANNEL_COUNT; x++) +/* for(int x = 0;x < DATA_CHANNEL_COUNT; x++) { const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLap()->GetLapId(),(DATA_CHANNEL)x); mapData[pLap->GetLap()] = pChannel; } - lstLaps.push_back(pLap->GetLap()); +*/ lstLaps.push_back(pLap->GetLap()); } - DashWare::SaveToDashware(szFilename, lstLaps); + DashWare::SaveToDashware(szFilename, /*lstLaps,*/ lstLaps1); +// DashWare::SaveToDashware(szFilename, lstLaps); DestroyWindow(hwndGoto); // Close the "Working..." dialog hwndGoto = NULL; } From 733b77dcabc04fbade6bf0bc47d49bae920dad85 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Sun, 10 Jan 2016 10:31:58 -0700 Subject: [PATCH 065/112] Comment export to CSV added, plus final tweak to epxort routine --- PitsideConsole/PitsideConsole/DashWare.cpp | 92 ++++--------------- PitsideConsole/PitsideConsole/DashWare.h | 2 +- .../PitsideConsole/PitsideConsole.cpp | 12 +-- 3 files changed, 23 insertions(+), 83 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 4c0c605..71cc0b3 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -15,7 +15,7 @@ namespace DashWare void WriteChannelHeaders(wofstream& out, map& mapData) { // if you update this function, update the dashware.xml file too! - out << L"Lap,Time"/*,x,y"*/; + out << L"Lap,Time,Comment"; // column headers for(map::iterator i = begin(mapData); i != end(mapData); i++) @@ -30,37 +30,31 @@ namespace DashWare } // Subprogram saves the chosen lap's data out to a CSV file for import into rendering programs like Dashware and RaceRender - HRESULT SaveToDashware(LPCTSTR lpszFilename, /*const vector& lstLaps,*/ vector lstLaps1) + HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps, vector lstLaps1) { // lstLaps: Vector of chosen laps to output, lpszFileaname: Filename to output CSV file to -// if(lstLaps.size() <= 0) return E_FAIL; - if(lstLaps1.size() <= 0) return E_FAIL; -/* + if(lstLaps.size() <= 0) return E_FAIL; + vector lstSortedLaps = lstLaps; // Get all of the chosen laps sort(begin(lstSortedLaps),end(lstSortedLaps),SortLapsByTime); // Sort all of the chosen laps by lap time -*/ + wofstream out; out.open(lpszFilename); // Open up the CSV file for input map dwMapChannels; // dwMapChannels is the list of Data Channels for all laps -// for(int ixLap = 0;ixLap < lstLaps.size(); ixLap++) - for(int ixLap = 0;ixLap < lstLaps1.size(); ixLap++) + for(int ixLap = 0;ixLap < lstLaps.size(); ixLap++) { // Find all of the populated data channels for this lap - set setLapData = lstLaps1[ixLap]->GetAvailableChannels(); // Load the CExtendedLap data for the lap list -// for(int y = 0; y < DATA_CHANNEL_COUNT; y++) -// { + set setLapData = lstLaps1[ixLap]->GetAvailableChannels(); // Load the CExtendedLap data for the lap list for(set::iterator i = setLapData.begin(); i != setLapData.end(); i++) { -// const IDataChannel* pChannel = g_pLapDB->GetDataChannel(lstLaps[ixLap]->GetLapId(),(DATA_CHANNEL)y); const IDataChannel* pChannel = lstLaps1[ixLap]->GetChannel(*i); DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues // DASSERT(pChannel->IsLocked() && pChannel->IsValid()); // if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) if(pChannel && pChannel->IsValid()) { -// dwMapChannels[(DATA_CHANNEL)y] = pChannel; // Add Data Channel to the list dwMapChannels[*i] = pChannel; // Add Data Channel to the list } else @@ -73,48 +67,15 @@ namespace DashWare int msLastLine = 0; // Indexer for pulling correct timestamp data for each data channel float flStartTime = 0; // start time in seconds; -// for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) - for (int ixLap = 0; ixLap < lstLaps1.size(); ixLap++) + for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) { -// const ILap* pLap = lstSortedLaps[ixLap]; // Get the chosen lap const ILap* pLap = lstLaps1[ixLap]->GetLap(); // Get the chosen lap int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) int msEndTime = -INT_MAX; -/* - // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available - for(int y = 0; y < DATA_CHANNEL_COUNT; y++) - { - // const IDataChannel* pChannel = lstLaps1[ixLap]->GetChannel((DATA_CHANNEL)y); - const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)y); - DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues - // DASSERT(pChannel->IsLocked() && pChannel->IsValid()); - // if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) - if(pChannel && pChannel->IsValid()) - { - dwMapChannels[(DATA_CHANNEL)y] = pChannel; - } - else - { - DASSERT(FALSE); - } - } - // WriteChannelHeaders(out, dwMapChannels); // Put all Data Channel names into the header for the CSV file -*/ -// const IDataChannel* pDC = dwMapChannels[DATA_CHANNEL_VELOCITY]; // Use the Velocity data channel to set time boundary conditions for this lap - const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(DATA_CHANNEL_VELOCITY); - // Go through all of the mapped data channels to determine the msStart and msEnd times for this lap, based upon all data available -/* for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) - { -// const IDataChannel* pDC = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // This is a huge memory hog - const IDataChannel* pDC = dwMapChannels[i->first]; // Not sure if this gives the correct lap times - if(pDC) - { - msStartTime = min(pDC->GetStartTimeMs(),msStartTime); -// msEndTime = max(pDC->GetEndTimeMs(),msEndTime); - } - } -*/ - msStartTime = pDC->GetStartTimeMs(); + + const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(DATA_CHANNEL_VELOCITY); // Use the Velocity data channel to set time boundary conditions for this lap + + msStartTime = pDC->GetStartTimeMs(); msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); const vector& lstPoints = pLap->GetPoints(); // List of points for this lap @@ -127,32 +88,20 @@ namespace DashWare // for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 2000) // Increased time movement for debug purposes for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 100) { - if(msQuery > msLastLine) - { +// if(msQuery > msLastLine) +// { // Lap counter out << ixLap << ","; // Time TCHAR szTemp[100] = L"0"; _snwprintf(szTemp,NUMCHARS(szTemp),L"%6.3f",((float)msQuery/1000.0f)+flStartTime); - out << szTemp; -/* // Position X - _snwprintf(szTemp,NUMCHARS(szTemp),L"%0.1f",0.0f); - TimePoint2D pt = ::GetPointAtTime(lstPoints,msQuery); - _snwprintf(szTemp,NUMCHARS(szTemp),L"%4.6f",pt.flX); - out << "," << szTemp; - // Position Y - _snwprintf(szTemp,NUMCHARS(szTemp),L"%1.1f",0.0f); - _snwprintf(szTemp,NUMCHARS(szTemp),L"%4.6f",pt.flY); - out << "," << szTemp; -*/ + out << szTemp << ","; + // Comment + out << pLap->GetComment(); // For all of the hard coded channels, loop through them to get the data channel value at this point in time -// const ILap* pLap_temp = g_pLapDB->GetLap(pLap->GetLapId()); // Get the data for this lap/channel -// for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) { -// const IDataChannel* pDC_temp = g_pLapDB->GetDataChannel(pLap->GetLapId(),(DATA_CHANNEL)i->first); // Get the data for this lap/channel -// const IDataChannel* pDC = i->second; // Not sure if this gives the correct lap data - const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(i->first);; // Not sure if this gives the correct lap data + const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(i->first);; // Get the data for this lap/channel if(pDC) { float flValue = pDC->GetValue(msQuery); @@ -166,13 +115,12 @@ namespace DashWare } else { - out << ","; // if this lap didn't include the data channel, skip it + out << "," ; // if this lap didn't include the data channel, skip it } } out << "," << endl << flush; msLastLine = msQuery; // Index the time in preparation for the next lap - } -// msLastLine = 0; // Reset the last line query, but this would allow out of time order laps +// } } } diff --git a/PitsideConsole/PitsideConsole/DashWare.h b/PitsideConsole/PitsideConsole/DashWare.h index 8c59fd3..17e00b0 100644 --- a/PitsideConsole/PitsideConsole/DashWare.h +++ b/PitsideConsole/PitsideConsole/DashWare.h @@ -9,5 +9,5 @@ using namespace std; namespace DashWare { // HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps); - HRESULT SaveToDashware(LPCTSTR lpszFilename, /*const vector& lstLaps,*/ vector lstLaps1); + HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps, vector lstLaps1); } \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 240bd8f..c9dd8ce 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1749,21 +1749,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } vector lstLaps; -// map mapData; vector lstLaps1 = GetLapsToShow(); for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) { CExtendedLap* pLap = (CExtendedLap*)*i; - -/* for(int x = 0;x < DATA_CHANNEL_COUNT; x++) - { - const IDataChannel* pChannel = g_pLapDB->GetDataChannel(pLap->GetLap()->GetLapId(),(DATA_CHANNEL)x); - mapData[pLap->GetLap()] = pChannel; - } -*/ lstLaps.push_back(pLap->GetLap()); + lstLaps.push_back(pLap->GetLap()); } - DashWare::SaveToDashware(szFilename, /*lstLaps,*/ lstLaps1); -// DashWare::SaveToDashware(szFilename, lstLaps); + DashWare::SaveToDashware(szFilename, lstLaps, lstLaps1); DestroyWindow(hwndGoto); // Close the "Working..." dialog hwndGoto = NULL; } From ba26d9c181e01ac0bff7c16b73afcc9f86e6e891 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Tue, 12 Jan 2016 08:43:59 -0700 Subject: [PATCH 066/112] Final Dashware code cleanup. No functionality changes --- PitsideConsole/PitsideConsole/DashWare.cpp | 5 +---- PitsideConsole/PitsideConsole/DashWare.h | 1 - PitsideConsole/PitsideConsole/PitsideConsole.cpp | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 71cc0b3..3dae98d 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -35,7 +35,7 @@ namespace DashWare // lstLaps: Vector of chosen laps to output, lpszFileaname: Filename to output CSV file to if(lstLaps.size() <= 0) return E_FAIL; - vector lstSortedLaps = lstLaps; // Get all of the chosen laps + vector lstSortedLaps = lstLaps; // Get all of the chosen laps, lstLaps is used to remove Reference Lap from the list sort(begin(lstSortedLaps),end(lstSortedLaps),SortLapsByTime); // Sort all of the chosen laps by lap time wofstream out; @@ -88,8 +88,6 @@ namespace DashWare // for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 2000) // Increased time movement for debug purposes for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 100) { -// if(msQuery > msLastLine) -// { // Lap counter out << ixLap << ","; // Time @@ -120,7 +118,6 @@ namespace DashWare } out << "," << endl << flush; msLastLine = msQuery; // Index the time in preparation for the next lap -// } } } diff --git a/PitsideConsole/PitsideConsole/DashWare.h b/PitsideConsole/PitsideConsole/DashWare.h index 17e00b0..dbc8517 100644 --- a/PitsideConsole/PitsideConsole/DashWare.h +++ b/PitsideConsole/PitsideConsole/DashWare.h @@ -8,6 +8,5 @@ using namespace std; namespace DashWare { -// HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps); HRESULT SaveToDashware(LPCTSTR lpszFilename, const vector& lstLaps, vector lstLaps1); } \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index c9dd8ce..874279b 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1755,7 +1755,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) CExtendedLap* pLap = (CExtendedLap*)*i; lstLaps.push_back(pLap->GetLap()); } - DashWare::SaveToDashware(szFilename, lstLaps, lstLaps1); + DashWare::SaveToDashware(szFilename, lstLaps, lstLaps1); // lstLaps does not have the reference lap in it, lstLaps1 may have it DestroyWindow(hwndGoto); // Close the "Working..." dialog hwndGoto = NULL; } From c2dcdeee9f4758c608cf60196672efbe5b376223 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Tue, 12 Jan 2016 13:57:06 -0700 Subject: [PATCH 067/112] 2.004.0007: Clear comment box added --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 6 +++--- PitsideConsole/PitsideConsole/PitsideConsole.rc | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 874279b..3b1c290 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1834,19 +1834,19 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return TRUE; } -/* case IDC_CLEARCOMMENT: // This button clears the comment field + case IDC_CLEARCOMMENT: // This button clears the comment field { switch(HIWORD(wParam)) { case BN_CLICKED: m_szCommentText[0] = '\0'; SendMessage(GetDlgItem(m_hWnd, IDC_COMMENTTEXT), WM_SETTEXT, NUMCHARS(m_szCommentText), (LPARAM)m_szCommentText); -// UpdateUI(UPDATE_ALL); +// UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); break; } return TRUE; } -*/ case IDC_COMMENTTEXT: + case IDC_COMMENTTEXT: { switch(HIWORD(wParam)) { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index ccf3ad8..8276078 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -22,9 +22,9 @@ BEGIN CONTROL "", IDC_XAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 0,0,75,150 CONTROL "", IDC_YAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 75,0,75,150 - EDITTEXT IDC_COMMENTTEXT, 155,12,93,12 + EDITTEXT IDC_COMMENTTEXT, 155,12,81,12 PUSHBUTTON "Set Comment", IDC_SETDRIVER, 250,0,75,12 -// PUSHBUTTON "Clear Comment", IDC_CLEARCOMMENT, 250,14,75,12 + PUSHBUTTON "X", IDC_CLEARCOMMENT, 237,13,10,10 PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,14,75,12 PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,28,75,12 @@ -179,7 +179,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0006\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0007\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 7d54c726a9accfa56065907537e3f948b5e81c83 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Tue, 19 Jan 2016 08:08:28 -0700 Subject: [PATCH 068/112] Remarked out Sub_Display coding for new window --- PitsideConsole/PitsideConsole/LapPainter.h | 1 + .../PitsideConsole/PitsideConsole.cpp | 63 +++++++++++-------- .../PitsideConsole/PitsideConsole.rc | 10 +++ PitsideConsole/PitsideConsole/resource.h | 1 + 4 files changed, 48 insertions(+), 27 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.h b/PitsideConsole/PitsideConsole/LapPainter.h index 8585920..350bfaa 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.h +++ b/PitsideConsole/PitsideConsole/LapPainter.h @@ -30,6 +30,7 @@ enum SUPPLIERID SUPPLIERID_SECTORDISPLAY, SUPPLIERID_TRACTIONCIRCLEDISPLAY, // Draw the traction circle SUPPLIERID_ALLDATADISPLAY, // Show a window with all data for that lap for the given point +// SUPPLIERID_SUBWINDOW, }; enum LAPDISPLAYSTYLE diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 3b1c290..59490e0 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -271,6 +271,7 @@ class CMainUI : public IUI,public ILapSupplier CMainUI() : m_sfLapPainter(static_cast(this),SUPPLIERID_MAINDISPLAY), m_sfSubDisplay(static_cast(this),SUPPLIERID_SUBDISPLAY), +// m_sfSubWindow(static_cast(this),SUPPLIERID_SUBWINDOW), m_sfTractionDisplay(static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view m_fShowTractionCircle(false), @@ -565,6 +566,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) LVITEM p_ADlvi; // Listview global pointer for Hot Laps HWND hWndShowSplits; // Show Sectors window control handle HWND HC_ShowSplits; // Handle to the Splits listview control +// HWND sub_hWnd; // Handle to the SubWindow, to get to the SubDisplay control BOOL b_GreyColor; // Switch for painting listviews with alternating lines of color INT i_SubItemBest, i_SubItemWorst; @@ -617,8 +619,12 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); } m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); - m_sfSubDisplay.Init(GetDlgItem(hWnd,IDC_SUBDISPLAY)); - m_sfTractionDisplay.Init(GetDlgItem(hWnd,IDC_TRACTIONCIRCLEMAP)); +// ArtShowDialog(s_pUI); +// sub_hWnd = GetDlgItem(m_hWnd,IDD_DLGSUBDISPLAY); +// sub_hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, L"SubDisplay", L"SubDisplay", WS_POPUP | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION, 586, 0, 87, 63, m_hWnd, NULL, GetModuleHandle(0), NULL); +// m_sfSubDisplay.Init(GetDlgItem(sub_hWnd,IDC_SUBDISPLAY)); + m_sfSubDisplay.Init(GetDlgItem(m_hWnd,IDC_SUBDISPLAY)); + m_sfTractionDisplay.Init(GetDlgItem(m_hWnd,IDC_TRACTIONCIRCLEMAP)); set setAvailable; InitAxes(setAvailable); @@ -1861,7 +1867,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } } // end switch for finding out what control WM_COMMAND hit break; // break out of WM_COMMAND handling - } + } // End of COMMAND loop case WM_UPDATEUI: { DWORD dwCurrentUpdate = m_fdwUpdateNeeded; @@ -1972,31 +1978,31 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return 0; } - case WM_RBUTTONUP: - { - m_sfLapOpts.flWindowShiftX = 0; - m_sfLapOpts.flWindowShiftY = 0; - m_sfLapOpts.iZoomLevels = 0; - UpdateUI(UPDATE_MAP); - return TRUE; - } - case WM_PAINT: - { - UpdateDisplays(); - return FALSE; - } - case WM_SIZE: - { - SIZE sNewSize; - sNewSize.cx = LOWORD(lParam); - sNewSize.cy = HIWORD(lParam); - HandleResize(sNewSize); - return TRUE; - } + case WM_RBUTTONUP: + { + m_sfLapOpts.flWindowShiftX = 0; + m_sfLapOpts.flWindowShiftY = 0; + m_sfLapOpts.iZoomLevels = 0; + UpdateUI(UPDATE_MAP); + return TRUE; + } + case WM_PAINT: + { + UpdateDisplays(); + return FALSE; + } + case WM_SIZE: + { + SIZE sNewSize; + sNewSize.cx = LOWORD(lParam); + sNewSize.cy = HIWORD(lParam); + HandleResize(sNewSize); + return TRUE; } - - return FALSE; } + + return FALSE; +} DWORD GetDlgId() const {return IDD_DLGFIRST;} const static DWORD UPDATE_MAP = 0x1; @@ -2277,6 +2283,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_baseWindowPos[IDD_DLGFIRST] = wp.rcNormalPosition; GET_WINDOWPOS(IDC_DISPLAY); +// GET_WINDOWPOS(IDD_DLGSUBDISPLAY); GET_WINDOWPOS(IDC_SUBDISPLAY); GET_WINDOWPOS(IDC_LAPS); GET_WINDOWPOS(IDC_TRACTIONCIRCLEMAP); @@ -2293,7 +2300,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) void HandleResize(SIZE sNewSize) { HandleCtlResize(sNewSize, IDC_DISPLAY, true, true); // main display window - HandleCtlResize(sNewSize, IDC_SUBDISPLAY, true, false); // sub display window +// HandleCtlResize(sNewSize, IDD_DLGSUBDISPLAY, true, true); // sub display window + HandleCtlResize(sNewSize, IDC_SUBDISPLAY, true, false); // sub display control HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window } @@ -3606,6 +3614,7 @@ void UpdateDisplays() ArtListBox m_sfXAxis; CLapPainter m_sfLapPainter; +// CLapPainter m_sfSubWindow; CLapPainter m_sfSubDisplay; CLapPainter m_sfTractionDisplay; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 8276078..af7c495 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -34,7 +34,17 @@ BEGIN LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,42,70,10 CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 END +/* +// Window for sub-display to appear in +IDD_DLGSUBDISPLAY DIALOG 586,0,87,63 +STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_CHILD | WS_POPUP | WS_THICKFRAME +CAPTION "Map Display" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "",IDC_SUBDISPLAY,5,5,77,53 +END +*/ // Dialog box for sending messages to the car IDD_DLGMESSAGE DIALOG 280, 200, 200, 85 STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU diff --git a/PitsideConsole/PitsideConsole/resource.h b/PitsideConsole/PitsideConsole/resource.h index e71d097..865bc9d 100644 --- a/PitsideConsole/PitsideConsole/resource.h +++ b/PitsideConsole/PitsideConsole/resource.h @@ -4,6 +4,7 @@ #define IDC_DISPLAYTYPE_LINE 4 #define IDC_DISPLAYTYPE_PLOT 5 #define IDC_DISPLAYTYPE_RECEPTION 6 +//#define IDD_DLGSUBDISPLAY 7 // don't use 5-10, we might want more radiobuttons #define IDC_DISPLAYTYPE_LAST 10 From d0cb8416a10e42103f57e3edffc7243881284ddc Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Tue, 19 Jan 2016 17:33:27 -0700 Subject: [PATCH 069/112] Enabled map zooming/centering to the highlighted point when as secondary display --- PitsideConsole/PitsideConsole/LapPainter.cpp | 35 +++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index be6590b..63eb311 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1410,6 +1410,7 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) GLdouble rgModelviewMatrix[16]; GLdouble rgProjMatrix[16]; GLint rgViewport[4]; + vector lstLaps = m_pLapSupplier->GetLapsToShow(); // Moved up-code to allow for Reference lap zooming { // Now that the matrices are correct, let's graph them. @@ -1443,6 +1444,39 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) glGetDoublev(GL_PROJECTION_MATRIX, rgProjMatrix); glGetIntegerv(GL_VIEWPORT, rgViewport); } + else if(dScaleAmt > 1) // If image is Zoomed In, center the panning of the secondary display (map) to the highlighted point of the Reference Lap + { + // the mouse outside our window, let's match the zooming of the main display and pan to the highlighted location + const double dTranslateShiftX = (rcAllLaps.left + rcAllLaps.right)/2; + const double dTranslateShiftY = (rcAllLaps.top + rcAllLaps.bottom)/2; + CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + const vector& lstPoints = pLap->GetPoints(); // Get the list of point for the Reference Lap + float dBestLength = -1; + float dTimeToHighlight = -1; + TimePoint2D ptBest; // Best highlighted point where the mouse is on the Reference Lap + for(int x = 0; x< lstPoints.size(); x++) + { + const TimePoint2D& p = lstPoints[x]; + glVertex2f(p.flX,p.flY); + int iTime = m_pLapSupplier->GetLapHighlightTime(pLap); + if(abs(p.iTime - iTime) < dBestLength || dBestLength < 0) + { + dBestLength = abs(p.iTime - iTime); + ptBest = p; // ptBest contains the X/Y values for the highlighted point of the Reference Lap + dTimeToHighlight = iTime; // This is the highlighted time by the mouse on the Ref Lap. Now let's figure out its location in OGL space and zoom to it. + } + } + // Set up to perform the ZOOM function for MAP. + glTranslated(dTranslateShiftX, dTranslateShiftY, 0); // Translate the map to origin + glScaled(dScaleAmt*1.25, dScaleAmt*1.25, 1.0f); // Scale the sucker + glTranslated(-dTranslateShiftX, -dTranslateShiftY, 0); // Now put the map back in its place + + glTranslated(dTranslateShiftX-(double)ptBest.flX, dTranslateShiftY-(double)ptBest.flY, 0); // Now move the map to the highlighted location + // now having shifted, let's get our new model matrices + glGetDoublev(GL_MODELVIEW_MATRIX, rgModelviewMatrix); + glGetDoublev(GL_PROJECTION_MATRIX, rgProjMatrix); + glGetIntegerv(GL_VIEWPORT, rgViewport); + } } POINT ptMouse; Vector2D vHighlight; @@ -1456,7 +1490,6 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) } vector lstMousePointsToDraw; - vector lstLaps = m_pLapSupplier->GetLapsToShow(); for(int x = 0; x < lstLaps.size(); x++) { CExtendedLap* pLap = lstLaps[x]; From 234238f5181477bd459db05dc01c88c321287e7b Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Wed, 20 Jan 2016 13:32:28 -0700 Subject: [PATCH 070/112] Vast improvement in panning and zoom algorithms --- PitsideConsole/PitsideConsole/LapPainter.cpp | 35 +++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 63eb311..0efef21 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -392,23 +392,34 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi // Set up to perform the ZOOM function for DATA PLOT. static double dTranslateShiftX; static GLdouble dX,dY,dZ; - if (sfLapOpts.iZoomLevels != OldiZoomLevels) - { - // The mouse is in our window, let's determine the closest X point to the mouse - gluUnProject(ptMouse.x, 0, 0, rgModelviewMatrix, rgProjMatrix, rgViewport, &dX, &dY, &dZ); - dTranslateShiftX = dX - dXShift; - } - else + + CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + const IDataChannel* pDataX = pLap->GetChannel(m_pLapSupplier->GetXChannel()); // Get the list of X-Axis points for the Reference Lap + const vector &lstPointsX = pDataX->GetData(); + float dBestLength = -1; + float dTimeToHighlight = -1; + DataPoint ptBest; // Best highlighted point where the mouse is on the Reference Lap + for(int x = 0; x< lstPointsX.size(); x++) { - dTranslateShiftX = dX - dXShift; + const DataPoint& p = lstPointsX[x]; + int iTime = m_pLapSupplier->GetLapHighlightTime(pLap); + if(abs(p.iTimeMs - iTime) < dBestLength || dBestLength < 0) + { + dBestLength = abs(p.iTimeMs - iTime); + ptBest = p; // ptBest contains the X/Y values for the highlighted point of the Reference Lap + dTimeToHighlight = iTime; // This is the highlighted time by the mouse on the Ref Lap. Now let's figure out its location in OGL space and zoom to it. + } } - OldiZoomLevels = sfLapOpts.iZoomLevels; + + + dTranslateShiftX = ptBest.flValue - dXShift; // Calculate the shift amount for the highlighted point in the Reference Lap + OldiZoomLevels = sfLapOpts.iZoomLevels; // Save the zoom level glTranslated(dTranslateShiftX, 0, 0); // Translate the map to origin on x-axis only - glScaled(dScaleAmt, 1.0, 1.0); // No scaling of Y-axis on Data Plot. + glScaled(dScaleAmt, 1.0, 1.0); // No scaling of Y-axis on Data Plot, only scale the X-axis. glTranslated(-dTranslateShiftX, 0, 0); // Now put the map back in its place // Panning functionality - glTranslated(dXShift - dMinX, 0, 0); // Offset for this is still slight wrong, but the best for now. + glTranslated(dXShift - dMinX, 0, 0); // Shift the graph based upon the mouse movement // Now having shifted, let's get our new model matrices glGetDoublev(GL_MODELVIEW_MATRIX, rgModelviewMatrix); @@ -1468,7 +1479,7 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) } // Set up to perform the ZOOM function for MAP. glTranslated(dTranslateShiftX, dTranslateShiftY, 0); // Translate the map to origin - glScaled(dScaleAmt*1.25, dScaleAmt*1.25, 1.0f); // Scale the sucker + glScaled(dScaleAmt*1.5, dScaleAmt*1.5, 1.0f); // Scale the sucker glTranslated(-dTranslateShiftX, -dTranslateShiftY, 0); // Now put the map back in its place glTranslated(dTranslateShiftX-(double)ptBest.flX, dTranslateShiftY-(double)ptBest.flY, 0); // Now move the map to the highlighted location From 8aa97b4dead1cdbb5809b45a93f568f5a53130d5 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 21 Jan 2016 21:02:28 -0700 Subject: [PATCH 071/112] Minor fix for panning --- PitsideConsole/PitsideConsole/LapPainter.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 0efef21..8687f69 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -411,8 +411,10 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi } } - - dTranslateShiftX = ptBest.flValue - dXShift; // Calculate the shift amount for the highlighted point in the Reference Lap + if(dScaleAmt > 1) + { + dTranslateShiftX = ptBest.flValue - dXShift; // Calculate the shift amount for the highlighted point in the Reference Lap if we are zoomed in + } OldiZoomLevels = sfLapOpts.iZoomLevels; // Save the zoom level glTranslated(dTranslateShiftX, 0, 0); // Translate the map to origin on x-axis only From 3a8ba7239e53ecf533263be4391518890a1de05d Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 21 Jan 2016 22:53:12 -0700 Subject: [PATCH 072/112] Code cleanup --- PitsideConsole/PitsideConsole/LapPainter.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 8687f69..36aec4c 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -397,7 +397,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi const IDataChannel* pDataX = pLap->GetChannel(m_pLapSupplier->GetXChannel()); // Get the list of X-Axis points for the Reference Lap const vector &lstPointsX = pDataX->GetData(); float dBestLength = -1; - float dTimeToHighlight = -1; DataPoint ptBest; // Best highlighted point where the mouse is on the Reference Lap for(int x = 0; x< lstPointsX.size(); x++) { @@ -407,7 +406,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi { dBestLength = abs(p.iTimeMs - iTime); ptBest = p; // ptBest contains the X/Y values for the highlighted point of the Reference Lap - dTimeToHighlight = iTime; // This is the highlighted time by the mouse on the Ref Lap. Now let's figure out its location in OGL space and zoom to it. } } @@ -1465,7 +1463,6 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling const vector& lstPoints = pLap->GetPoints(); // Get the list of point for the Reference Lap float dBestLength = -1; - float dTimeToHighlight = -1; TimePoint2D ptBest; // Best highlighted point where the mouse is on the Reference Lap for(int x = 0; x< lstPoints.size(); x++) { @@ -1476,7 +1473,6 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) { dBestLength = abs(p.iTime - iTime); ptBest = p; // ptBest contains the X/Y values for the highlighted point of the Reference Lap - dTimeToHighlight = iTime; // This is the highlighted time by the mouse on the Ref Lap. Now let's figure out its location in OGL space and zoom to it. } } // Set up to perform the ZOOM function for MAP. From a22f1c12c30355e7e96a8d5ec59651d191284696 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Fri, 22 Jan 2016 14:12:35 -0700 Subject: [PATCH 073/112] Code cleanup --- PitsideConsole/PitsideConsole/LapPainter.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 8687f69..36aec4c 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -397,7 +397,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi const IDataChannel* pDataX = pLap->GetChannel(m_pLapSupplier->GetXChannel()); // Get the list of X-Axis points for the Reference Lap const vector &lstPointsX = pDataX->GetData(); float dBestLength = -1; - float dTimeToHighlight = -1; DataPoint ptBest; // Best highlighted point where the mouse is on the Reference Lap for(int x = 0; x< lstPointsX.size(); x++) { @@ -407,7 +406,6 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi { dBestLength = abs(p.iTimeMs - iTime); ptBest = p; // ptBest contains the X/Y values for the highlighted point of the Reference Lap - dTimeToHighlight = iTime; // This is the highlighted time by the mouse on the Ref Lap. Now let's figure out its location in OGL space and zoom to it. } } @@ -1465,7 +1463,6 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling const vector& lstPoints = pLap->GetPoints(); // Get the list of point for the Reference Lap float dBestLength = -1; - float dTimeToHighlight = -1; TimePoint2D ptBest; // Best highlighted point where the mouse is on the Reference Lap for(int x = 0; x< lstPoints.size(); x++) { @@ -1476,7 +1473,6 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) { dBestLength = abs(p.iTime - iTime); ptBest = p; // ptBest contains the X/Y values for the highlighted point of the Reference Lap - dTimeToHighlight = iTime; // This is the highlighted time by the mouse on the Ref Lap. Now let's figure out its location in OGL space and zoom to it. } } // Set up to perform the ZOOM function for MAP. From a8751cdcb5ed2bc849c9735489ca9a7aa855cdb9 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Fri, 22 Jan 2016 15:20:07 -0700 Subject: [PATCH 074/112] Bug fix when Reference Lap is not shown, no laps are selected and graphs are zoomed it. Still 2.004.0007 --- PitsideConsole/PitsideConsole/LapPainter.cpp | 31 +++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 36aec4c..841e59a 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -392,8 +392,15 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi // Set up to perform the ZOOM function for DATA PLOT. static double dTranslateShiftX; static GLdouble dX,dY,dZ; - - CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + CExtendedLap* pLap; + if (lstLaps.size() > 0) + { + pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + } + else + { + return; + } const IDataChannel* pDataX = pLap->GetChannel(m_pLapSupplier->GetXChannel()); // Get the list of X-Axis points for the Reference Lap const vector &lstPointsX = pDataX->GetData(); float dBestLength = -1; @@ -435,7 +442,15 @@ void CLapPainter::DrawGeneralGraph(const LAPSUPPLIEROPTIONS& sfLapOpts, bool fHi { if (sfLapOpts.m_SplitPoints[z].m_sfXPoint != 0.0f) { - CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Last lap is the Reference Lap + CExtendedLap* pLap; + if (lstLaps.size() > 0) + { + pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + } + else + { + return; + } const IDataChannel* pDistance = pLap->GetChannel(DATA_CHANNEL_DISTANCE); const double dDistance = pDistance->GetValue(sfLapOpts.m_SplitPoints[z].m_sfSectorTime) - pDistance->GetValue(sfLapOpts.m_SplitPoints[0].m_sfSectorTime); double flLine = dDistance; @@ -1460,7 +1475,15 @@ void CLapPainter::DrawLapLines(const LAPSUPPLIEROPTIONS& sfLapOpts) // the mouse outside our window, let's match the zooming of the main display and pan to the highlighted location const double dTranslateShiftX = (rcAllLaps.left + rcAllLaps.right)/2; const double dTranslateShiftY = (rcAllLaps.top + rcAllLaps.bottom)/2; - CExtendedLap* pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + CExtendedLap* pLap; + if (lstLaps.size() > 0) + { + pLap = lstLaps[lstLaps.size() - 1]; // Get the Reference Lap for scaling + } + else + { + return; + } const vector& lstPoints = pLap->GetPoints(); // Get the list of point for the Reference Lap float dBestLength = -1; TimePoint2D ptBest; // Best highlighted point where the mouse is on the Reference Lap From 259475748a4da7f29dc61959a3c9b3c7dd542309 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Sun, 24 Jan 2016 18:50:42 -0700 Subject: [PATCH 075/112] 2.004.0008: Improved graphing contrast routine. No more hard to see graphs! --- PitsideConsole/PitsideConsole/LapPainter.cpp | 27 ++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 36aec4c..3157104 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1306,26 +1306,49 @@ void CLapPainter::drawOval (float x_center, float y_center, float w, float h) void CLapPainter::MakeColor(const CExtendedLap* pLap, bool RefLapFlag, float* pR, float* pG, float* pB) { srand((int)pLap); // <-- makes sure that we randomize the colours consistently, so that lap plots don't change colour from draw to draw... + + // Background color options: 0 (00),0,0 (Black) or 0.95 (F2),0.95.0.95 (Lt. Grey) + // Need to check contrast ratio before allowing the color + // Contrast ratio is defined as Luminace ratio L1/L2 + // Luminance = (0.2126 × red) + (0.7152 × green) + (0.0722 × blue) + // Hexadecimal value of colour component (00-FF) + if (m_pLapSupplier->GetDisplayOptions().fColorScheme) // Background color is black, make sure there is enough contrast with the lines { + float fLBackground = (0.2126 * 0.05) + (0.7152 * 0.05) + (0.0722 * 0.05); // Background Luminace value is zero (black) + float fLForeground; + float fContrastRatio; + do { *pR = RandDouble(); *pG = RandDouble(); *pB = RandDouble(); + // Contrast Ratio is (L1 + 0.05) / (L2 + 0.05) where L1 is the relative luminance of the lighter of the colors, + // L2 is the relative luminance of the darker of the colors. Contrast ratios can range from 1 to 21 (commonly written 1:1 to 21:1) + fLForeground = (0.2126 * *pR) + (0.7152 * *pG) + (0.0722 * *pB); + fContrastRatio = (fLForeground + 0.05) / (fLBackground + 0.05); } - while(*pR + *pG + *pB < 1.20f || *pR + *pG + *pB > 2.25f ); + while(fContrastRatio < 4.5 ); // Cinema standard is for greater than 4.5 to 1 contrast ratio glColor3d( *pR, *pG, *pB ); // Final color to use. Tells opengl to draw the following in the colour we just made up } else // Background color is light grey, keep these colors low enough alpha to provide contrast { + // Calculate the Background Luminace value + float fLBackground = (0.2126 * 0.95) + (0.7152 * 0.95) + (0.0722 * 0.95); + float fLForeground; + float fContrastRatio; do { *pR = RandDouble(); *pG = RandDouble(); *pB = RandDouble(); + // Contrast Ratio is (L1 + 0.05) / (L2 + 0.05) where L1 is the relative luminance of the lighter of the colors, + // L2 is the relative luminance of the darker of the colors. Contrast ratios can range from 1 to 21 (commonly written 1:1 to 21:1) + fLForeground = (0.2126 * *pR) + (0.7152 * *pG) + (0.0722 * *pB); + fContrastRatio = (fLBackground + 0.05) / (fLForeground + 0.05); } - while(*pR * *pG * *pB > 0.45 && *pR + *pG + *pB > 0.75 && *pR * *pG > 0.75); + while(fContrastRatio < 3.5 ); // Cinema standard is for greater than 4.5 to 1 contrast ratio glColor3d( *pR, *pG, *pB ); // Final color to use. Tells opengl to draw the following in the colour we just made up } // Check if this the is the Reference Lap. If so, change the color to full White/Black From 852d0c4b79857eb38d8953d9cbc447fd1766ea3d Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Mon, 25 Jan 2016 12:45:59 -0700 Subject: [PATCH 076/112] 2.004.0008 --- PitsideConsole/PitsideConsole/PitsideConsole.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index af7c495..b472281 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0007\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0008\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 1a70948488ffa60ce9f42fe200e2dca366a3e458 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Tue, 16 Feb 2016 06:48:54 -0700 Subject: [PATCH 077/112] 2.004.0009: Bug fix for Export to CSV format. --- PitsideConsole/PitsideConsole/DashWare.cpp | 145 ++++++++++-------- .../PitsideConsole/DlgTimingScoring.cpp | 2 +- .../PitsideConsole/PitsideConsole.rc | 2 +- 3 files changed, 82 insertions(+), 67 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 3dae98d..9ec9c42 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -42,83 +42,98 @@ namespace DashWare out.open(lpszFilename); // Open up the CSV file for input map dwMapChannels; // dwMapChannels is the list of Data Channels for all laps - - for(int ixLap = 0;ixLap < lstLaps.size(); ixLap++) + for(int ixLap = 0;ixLap < lstSortedLaps.size(); ixLap++) { - // Find all of the populated data channels for this lap - set setLapData = lstLaps1[ixLap]->GetAvailableChannels(); // Load the CExtendedLap data for the lap list - for(set::iterator i = setLapData.begin(); i != setLapData.end(); i++) - { - const IDataChannel* pChannel = lstLaps1[ixLap]->GetChannel(*i); - DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues -// DASSERT(pChannel->IsLocked() && pChannel->IsValid()); -// if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) - if(pChannel && pChannel->IsValid()) - { - dwMapChannels[*i] = pChannel; // Add Data Channel to the list - } - else - { - DASSERT(FALSE); - } - } + // Find all of the populated data channels for this lap + set setLapData = lstLaps1[ixLap]->GetAvailableChannels(); // Load the CExtendedLap data for the lap list + for(set::iterator i = setLapData.begin(); i != setLapData.end(); i++) + { + const IDataChannel* pChannel = lstLaps1[ixLap]->GetChannel(*i); + DASSERT(pChannel->IsValid()); // Ensure that channel doesn't cause execution issues +// DASSERT(pChannel->IsLocked() && pChannel->IsValid()); +// if(pChannel && pChannel->IsLocked() && pChannel->IsValid()) + if(pChannel && pChannel->IsValid()) + { + dwMapChannels[*i] = pChannel; // Add Data Channel to the list + } + else + { + DASSERT(FALSE); + } + } } WriteChannelHeaders(out, dwMapChannels); // Put all Data Channel names into the header for the CSV file int msLastLine = 0; // Indexer for pulling correct timestamp data for each data channel float flStartTime = 0; // start time in seconds; + // Need to go through the lstSortedLaps sequentially and find each lap in lstLaps1 for output to file for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) { - const ILap* pLap = lstLaps1[ixLap]->GetLap(); // Get the chosen lap - int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) - int msEndTime = -INT_MAX; + int iFoundLap; + // First find this lap in the lstLaps1 array + for(iFoundLap = 0; iFoundLap < lstLaps1.size(); iFoundLap++) + { + if(lstLaps1[iFoundLap]->GetLap()->GetStartTime() == lstSortedLaps[ixLap]->GetStartTime()) + { + // We found the lap. Let's get all of the populated data channels for this lap + + const ILap* pLap = lstLaps1[iFoundLap]->GetLap(); // Get the chosen lap + int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) + int msEndTime = -INT_MAX; - const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(DATA_CHANNEL_VELOCITY); // Use the Velocity data channel to set time boundary conditions for this lap + const IDataChannel* pDC = lstLaps1[iFoundLap]->GetChannel(DATA_CHANNEL_VELOCITY); // Use the Velocity data channel to set time boundary conditions for this lap - msStartTime = pDC->GetStartTimeMs(); - msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); + msStartTime = pDC->GetStartTimeMs(); + msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); - const vector& lstPoints = pLap->GetPoints(); // List of points for this lap - float flRunningAverage[DATA_CHANNEL_COUNT] = {0.0f}; - bool fUseRunningAverage[DATA_CHANNEL_COUNT] = {0}; - fUseRunningAverage[DATA_CHANNEL_X_ACCEL] = true; - fUseRunningAverage[DATA_CHANNEL_Y_ACCEL] = true; - fUseRunningAverage[DATA_CHANNEL_Z_ACCEL] = true; + const vector& lstPoints = pLap->GetPoints(); // List of points for this lap + float flRunningAverage[DATA_CHANNEL_COUNT] = {0.0f}; + bool fUseRunningAverage[DATA_CHANNEL_COUNT] = {0}; + fUseRunningAverage[DATA_CHANNEL_X_ACCEL] = true; + fUseRunningAverage[DATA_CHANNEL_Y_ACCEL] = true; + fUseRunningAverage[DATA_CHANNEL_Z_ACCEL] = true; -// for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 2000) // Increased time movement for debug purposes - for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 100) - { - // Lap counter - out << ixLap << ","; - // Time - TCHAR szTemp[100] = L"0"; - _snwprintf(szTemp,NUMCHARS(szTemp),L"%6.3f",((float)msQuery/1000.0f)+flStartTime); - out << szTemp << ","; - // Comment - out << pLap->GetComment(); - // For all of the hard coded channels, loop through them to get the data channel value at this point in time - for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) - { - const IDataChannel* pDC = lstLaps1[ixLap]->GetChannel(i->first);; // Get the data for this lap/channel - if(pDC) - { - float flValue = pDC->GetValue(msQuery); - if(fUseRunningAverage[i->first]) - { - flRunningAverage[i->first] = 0.7*flValue + 0.3*flRunningAverage[i->first]; - } - _snwprintf(szTemp,NUMCHARS(szTemp),L"%5.6f",fUseRunningAverage[i->first] ? flRunningAverage[i->first] : flValue); -// _snwprintf(szTemp, NUMCHARS(szTemp), L"%5.6f", flValue); // Used for debug purposes - out << "," << szTemp; // Output the value to the CSV file - } - else - { - out << "," ; // if this lap didn't include the data channel, skip it - } - } - out << "," << endl << flush; - msLastLine = msQuery; // Index the time in preparation for the next lap - } +// for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 2000) // Increased time movement for debug purposes + for(int msQuery = msStartTime; msQuery < msEndTime; msQuery += 100) + { + // Lap counter + out << ixLap << ","; + // Time + TCHAR szTemp[100] = L"0"; + _snwprintf(szTemp,NUMCHARS(szTemp),L"%6.3f",((float)msQuery/1000.0f)+flStartTime); + out << szTemp << ","; + // Comment + out << pLap->GetComment(); + // For all of the hard coded channels, loop through them to get the data channel value at this point in time + for(map::iterator i = begin(dwMapChannels); i != end(dwMapChannels); i++) + { + const IDataChannel* pDC = lstLaps1[iFoundLap]->GetChannel(i->first);; // Get the data for this lap/channel + if(pDC) + { + float flValue = pDC->GetValue(msQuery); + if(fUseRunningAverage[i->first]) + { + flRunningAverage[i->first] = 0.7*flValue + 0.3*flRunningAverage[i->first]; + } + _snwprintf(szTemp,NUMCHARS(szTemp),L"%5.6f",fUseRunningAverage[i->first] ? flRunningAverage[i->first] : flValue); + // _snwprintf(szTemp, NUMCHARS(szTemp), L"%5.6f", flValue); // Used for debug purposes + out << "," << szTemp; // Output the value to the CSV file + } + else + { + out << "," ; // if this lap didn't include the data channel, skip it + } + } + out << "," << endl << flush; + msLastLine = msQuery; // Index the time in preparation for the next lap + } + break; // We have our informtation, let's get out of the loop and move to the next lap + } + else + { + // Lap was not found, skip and move on + } + } } out.close(); diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index 6a49712..0e80a79 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -45,7 +45,7 @@ int CALLBACK CompareHLListItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSor } // b_TextResult = wcscmp(sz_Result2, sz_Result1); - b_TextResult = wcscmp(sz_Result1, sz_Result2); + b_TextResult = _wcsicmp(sz_Result1, sz_Result2); if (bSortAscending > 0 && b_TextResult < 0) // if (bSortAscending && b_TextResult < 0) { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index b472281..ca6cf09 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0008\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0009\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 44b95d01dd13e1b4d340c07a290be811b9dc857d Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Wed, 13 Apr 2016 15:11:06 -0700 Subject: [PATCH 078/112] 2.004.0010: Turns off Phone data Receive thread when HTTP server is disabled Added a couple of default settings if no information is in SETTINGS.TXT file --- .../PitsideConsole/PitsideConsole.cpp | 18 ++++++++++++++---- .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 59490e0..24c820e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3891,6 +3891,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.bSmoothYesNo = sfSettings.bSmoothYesNo; // Assign smoothing setting from Settings.txt file break; } + default: + { + x_sfLapOpts.bSmoothYesNo = false; // No smoothing of accelerometer data as a default + } } switch (sfSettings.bXAxis_KM) { @@ -3900,6 +3904,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.bXAxis_KM = sfSettings.bXAxis_KM; // Assign choice of LAT or KM for X-Axis setting from Settings.txt file break; } + default: + { + x_sfLapOpts.bXAxis_KM = false; // Distance in LAT degrees as a default + } } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap sfUI.SetDisplayOptions(x_sfLapOpts); @@ -3916,8 +3924,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine fTryAgain = false; if(!g_pHTTPServer->Init(sfSettings.iHTTPPort,&aResponder)) { - TCHAR szMsg[200]; - _snwprintf(szMsg,NUMCHARS(szMsg),L"Pitside was unable to start the HTTP server on port %d. Do you want to open settings.txt to try another port or disable the server?",sfSettings.iHTTPPort); + TCHAR szMsg[512]; + _snwprintf(szMsg,NUMCHARS(szMsg),L"Pitside was unable to start the HTTP server on port %d. Do you want to open settings.txt to try another port or disable the server?\n\nNOTE: This will also stop all communication from the phone to Pitside",sfSettings.iHTTPPort); int iRet = MessageBox(NULL,szMsg,L"Failed to start HTTP server",MB_ICONERROR | MB_YESNO); if(iRet == IDYES) { @@ -3939,8 +3947,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { g_pHTTPServer = NULL; } - - HANDLE hRecvThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ReceiveThreadProc, (LPVOID)&sfLaps, 0, NULL); + if(sfSettings.fRunHTTP) // Only try to receive phone information when the HTTP server is turned on + { + HANDLE hRecvThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ReceiveThreadProc, (LPVOID)&sfLaps, 0, NULL); + } ArtShowDialog(&sfUI); exit(0); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index ca6cf09..5f3651a 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0009\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0010\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From d8321df281817e335e0b4018e28e0fd266c9ed04 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Wed, 11 May 2016 22:18:59 -0700 Subject: [PATCH 079/112] 2.004.0011: Added User inputs for saving TempDatabase to a specified location 1) Changed the routine for new DB when re-transmitted from phone to Pitside to allow the user to specify the filename and location. --- PitsideConsole/ArtLib/ArtUI.cpp | 28 ++++++++++++ PitsideConsole/ArtLib/ArtUI.h | 3 +- PitsideConsole/PitsideConsole/LapReceiver.cpp | 43 +++++++++++++++---- .../PitsideConsole/PitsideConsole.rc | 2 +- 4 files changed, 65 insertions(+), 11 deletions(-) diff --git a/PitsideConsole/ArtLib/ArtUI.cpp b/PitsideConsole/ArtLib/ArtUI.cpp index 7751685..9e4f2ca 100644 --- a/PitsideConsole/ArtLib/ArtUI.cpp +++ b/PitsideConsole/ArtLib/ArtUI.cpp @@ -155,4 +155,32 @@ bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int BOOL fSuccess = GetSaveFileName(&ofn); return fSuccess; } +bool ArtGetSaveFileNameNewDB(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter) +{ + OPENFILENAME ofn; + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = hWndOwner; + ofn.hInstance = NULL; + ofn.lpstrFilter = lpszFilter; + ofn.lpstrCustomFilter = NULL; + ofn.nMaxCustFilter = 0; + ofn.nFilterIndex = 0; + ofn.lpstrFile = lpszPath; + ofn.nMaxFile = cchPath; + ofn.lpstrFileTitle = lpszPath; + ofn.nMaxFileTitle = 0; + ofn.lpstrInitialDir = NULL; + ofn.lpstrTitle = lpszTitle; + ofn.Flags = 0; + ofn.nFileOffset = 0; + ofn.nFileExtension = 0; + ofn.lpstrDefExt = NULL; + ofn.lpfnHook = NULL; + ofn.lpTemplateName = NULL; + ofn.pvReserved = 0; + ofn.dwReserved = 0; + ofn.FlagsEx = 0; + BOOL fSuccess = GetSaveFileName(&ofn); + return fSuccess; +} map mapDialogs; \ No newline at end of file diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index 1e6dd74..c0fe977 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -529,4 +529,5 @@ void ArtShowDialog(IUI* pDlg) // true -> path is good // false -> was cancelled bool ArtGetOpenFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); -bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); \ No newline at end of file +bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); +bool ArtGetSaveFileNameNewDB(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 34d6f6b..4d449b6 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -486,6 +486,20 @@ void GetIPString(DWORD ip, LPTSTR lpsz, int cchBuf) swprintf(lpsz, cchBuf, L"%d.%d.%d.%d",pBytes[0],pBytes[1],pBytes[2],pBytes[3]); } +int str_ends_with2(const TCHAR * str, const TCHAR * suffix) +{ + if( str == NULL || suffix == NULL ) + return 0; + + size_t str_len = wcslen(str); + size_t suffix_len = wcslen(suffix); + + if(suffix_len > str_len) + return 0; + + return 0 == wcsncmp( str + str_len - suffix_len, suffix, suffix_len ); +} + int TimeoutRead(SOCKET s, char* buf, int cbBuf, int flags, int timeout, bool* pfConnectionLost) { *pfConnectionLost = false; @@ -654,17 +668,28 @@ class LapSocketReceiver if(aDBDone.Process(buf[x])) { eRecv = RECV_NONE; - // we have received a raw database. Save it to a temp folder, then send the path to the pitside UI so it can decide what to do - TCHAR szTemp[MAX_PATH]; - if(GetTempPath(MAX_PATH, szTemp)) + // First, let the user know that the database has been recieved and determine where to save it + DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone.\n\nSpecify a name and folder to save it to",L"New database",MB_OK); + + // we have received a raw database. Select a folder to save it to, then send the path to the pitside UI so it can decide what to do + TCHAR szDBPath[MAX_PATH]; + wcscat(szDBPath,L"TempPitsideDB.wflp"); + if(ArtGetSaveFileNameNewDB(NULL,L"Select location and filename to save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { - wcscat(szTemp,L"TempPitsideDB.wflp"); - if(SaveBufferToFile(szTemp, &lstDBBuf[0], lstDBBuf.size()-aDBDone.GetSize())) - { - pLaps->NotifyDBArrival(szTemp); - } + const bool fFileIsNew = !DoesFileExist(szDBPath); + if(fFileIsNew) + { + // let's make sure there's a .wflp suffix on that bugger. + if(!str_ends_with2(szDBPath,L".wflp")) + { + wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); + } + } + if(SaveBufferToFile(szDBPath, &lstDBBuf[0], lstDBBuf.size()-aDBDone.GetSize())) + { + pLaps->NotifyDBArrival(szDBPath); + } } - } } // end processing loop diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 5f3651a..28de96c 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0010\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0011\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From f22657e6adf9a613f7e1fb6162c18365caf856a3 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 12 May 2016 17:59:55 -0700 Subject: [PATCH 080/112] Improved algorithm for setting TempDB name/foler --- PitsideConsole/PitsideConsole/LapReceiver.cpp | 212 ++++++++++-------- 1 file changed, 113 insertions(+), 99 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 4d449b6..af2f3d0 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -585,112 +585,126 @@ class LapSocketReceiver { for(int x = 0;x < cbRead; x++) { - lstLapBuf.push_back(buf[x]); - if(aV1Start.Process(buf[x])) - { - eRecv = RECV_V1_LAP; - aV1Start.Reset(); - // we have detected the start of a new lap - lstLapBuf.clear(); - } - if(aV1End.Process(buf[x])) - { - eRecv = RECV_NONE; - aV1End.Reset(); - // we have found the end of a lap - int iLapId = 0; - ILap* pLap = pLaps->AllocateLap(true); - if(ProcessV1LapData(lstLapBuf, &iLapId, pLap)) - { - pLaps->AddLap(pLap, 0xffffffff); - } - else - { - pLap->Free(); - } - lstLapBuf.clear(); - } - if(aV2Start.Process(buf[x])) - { - eRecv = RECV_V2_LAP; - aV2Start.Reset(); - lstLapBuf.clear(); - } - if(aV2End.Process(buf[x])) - { - eRecv = RECV_NONE; - aV2End.Reset(); - int iLapId = 0; - ILap* pLap = pLaps->AllocateLap(true); - if(ProcessV2LapData(lstLapBuf, &iLapId, pLap)) - { - pLaps->AddLap(pLap, 0xffffffff); - } - } - - lstDataBuf.push_back(buf[x]); - if(aDataStart.Process(buf[x])) - { - eRecv = RECV_DATA; - aDataStart.Reset(); - lstDataBuf.clear(); - } - if(aDataEnd.Process(buf[x])) - { - eRecv = RECV_NONE; - int iLapId = 0; - aDataEnd.Reset(); - IDataChannel* pDataChannel = pLaps->AllocateDataChannel(); - if(ProcessDataChannel(lstDataBuf,&iLapId, pDataChannel)) - { - pLaps->AddDataChannel(pDataChannel); - } - lstDataBuf.clear(); - } + lstLapBuf.push_back(buf[x]); + if(aV1Start.Process(buf[x])) + { + eRecv = RECV_V1_LAP; + aV1Start.Reset(); + // we have detected the start of a new lap + lstLapBuf.clear(); + } + if(aV1End.Process(buf[x])) + { + eRecv = RECV_NONE; + aV1End.Reset(); + // we have found the end of a lap + int iLapId = 0; + ILap* pLap = pLaps->AllocateLap(true); + if(ProcessV1LapData(lstLapBuf, &iLapId, pLap)) + { + pLaps->AddLap(pLap, 0xffffffff); + } + else + { + pLap->Free(); + } + lstLapBuf.clear(); + } + if(aV2Start.Process(buf[x])) + { + eRecv = RECV_V2_LAP; + aV2Start.Reset(); + lstLapBuf.clear(); + } + if(aV2End.Process(buf[x])) + { + eRecv = RECV_NONE; + aV2End.Reset(); + int iLapId = 0; + ILap* pLap = pLaps->AllocateLap(true); + if(ProcessV2LapData(lstLapBuf, &iLapId, pLap)) + { + pLaps->AddLap(pLap, 0xffffffff); + } + } + + lstDataBuf.push_back(buf[x]); + if(aDataStart.Process(buf[x])) + { + eRecv = RECV_DATA; + aDataStart.Reset(); + lstDataBuf.clear(); + } + if(aDataEnd.Process(buf[x])) + { + eRecv = RECV_NONE; + int iLapId = 0; + aDataEnd.Reset(); + IDataChannel* pDataChannel = pLaps->AllocateDataChannel(); + if(ProcessDataChannel(lstDataBuf,&iLapId, pDataChannel)) + { + pLaps->AddDataChannel(pDataChannel); + } + lstDataBuf.clear(); + } - if(aHTBT.Process(buf[x])) - { - eRecv = RECV_NONE; - aHTBT.Reset(); - const char* pbResponse = "HTBT"; - send(sData, pbResponse, 4, 0); - - lstLapBuf.clear(); - lstDataBuf.clear(); - } - lstDBBuf.push_back(buf[x]); - - if(aDBIncoming.Process(buf[x])) - { - eRecv = RECV_DB; - lstDBBuf.clear(); - } - if(aDBDone.Process(buf[x])) - { - eRecv = RECV_NONE; - // First, let the user know that the database has been recieved and determine where to save it - DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone.\n\nSpecify a name and folder to save it to",L"New database",MB_OK); - - // we have received a raw database. Select a folder to save it to, then send the path to the pitside UI so it can decide what to do - TCHAR szDBPath[MAX_PATH]; - wcscat(szDBPath,L"TempPitsideDB.wflp"); - if(ArtGetSaveFileNameNewDB(NULL,L"Select location and filename to save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) - { - const bool fFileIsNew = !DoesFileExist(szDBPath); - if(fFileIsNew) + if(aHTBT.Process(buf[x])) + { + eRecv = RECV_NONE; + aHTBT.Reset(); + const char* pbResponse = "HTBT"; + send(sData, pbResponse, 4, 0); + + lstLapBuf.clear(); + lstDataBuf.clear(); + } + lstDBBuf.push_back(buf[x]); + + if(aDBIncoming.Process(buf[x])) + { + eRecv = RECV_DB; + lstDBBuf.clear(); + } + if(aDBDone.Process(buf[x])) + { + eRecv = RECV_NONE; + // First, let the user know that the database has been recieved and determine where to save it + DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone.\n\nSpecify a name and folder to save it to",L"New database",MB_OK); + + // we have received a raw database. Select a folder to save it to, then send the path to the pitside UI so it can decide what to do + TCHAR szDBPath[MAX_PATH]; + wcscat(szDBPath,L"TempPitsideDB.wflp"); + while (true) { - // let's make sure there's a .wflp suffix on that bugger. - if(!str_ends_with2(szDBPath,L".wflp")) - { - wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); - } + ArtGetSaveFileNameNewDB(NULL,L"Select location and filename to save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0"); + const bool fFileIsNew = !DoesFileExist(szDBPath); + if(fFileIsNew) + { + // let's make sure there's a .wflp suffix on that bugger. + if(!str_ends_with2(szDBPath,L".wflp")) + { + wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); + break; + } + } + else + { + DWORD dwRet = MessageBox(NULL,L"A database already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; + } + } } if(SaveBufferToFile(szDBPath, &lstDBBuf[0], lstDBBuf.size()-aDBDone.GetSize())) { pLaps->NotifyDBArrival(szDBPath); } - } - } + else + { + MessageBox(NULL,L"An error occurred while saving the database",L"ERROR",MB_APPLMODAL | MB_ICONERROR | MB_TOPMOST | MB_OK); + } + } } // end processing loop From ee882dbad7dfdaeca3ec2338321cc62b4d7cad71 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Thu, 12 May 2016 21:34:42 -0700 Subject: [PATCH 081/112] Improved algorithm for setting TempDB name/foler. Better file naming and checking for overwriting of existing files --- PitsideConsole/ArtLib/ArtUI.cpp | 29 --- PitsideConsole/ArtLib/ArtUI.h | 1 - .../PitsideConsole/DlgTimingScoring.cpp | 34 ++- PitsideConsole/PitsideConsole/LapReceiver.cpp | 219 ++++++++++-------- .../PitsideConsole/PitsideConsole.cpp | 81 +++++-- 5 files changed, 210 insertions(+), 154 deletions(-) diff --git a/PitsideConsole/ArtLib/ArtUI.cpp b/PitsideConsole/ArtLib/ArtUI.cpp index 9e4f2ca..9a8c2ee 100644 --- a/PitsideConsole/ArtLib/ArtUI.cpp +++ b/PitsideConsole/ArtLib/ArtUI.cpp @@ -127,35 +127,6 @@ bool ArtGetOpenFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int return fSuccess; } bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter) -{ - lpszPath[0] = '\0'; - OPENFILENAME ofn; - ofn.lStructSize = sizeof(ofn); - ofn.hwndOwner = hWndOwner; - ofn.hInstance = NULL; - ofn.lpstrFilter = lpszFilter; - ofn.lpstrCustomFilter = NULL; - ofn.nMaxCustFilter = 0; - ofn.nFilterIndex = 0; - ofn.lpstrFile = lpszPath; - ofn.nMaxFile = cchPath; - ofn.lpstrFileTitle = NULL; - ofn.nMaxFileTitle = 0; - ofn.lpstrInitialDir = NULL; - ofn.lpstrTitle = lpszTitle; - ofn.Flags = 0; - ofn.nFileOffset = 0; - ofn.nFileExtension = 0; - ofn.lpstrDefExt = NULL; - ofn.lpfnHook = NULL; - ofn.lpTemplateName = NULL; - ofn.pvReserved = 0; - ofn.dwReserved = 0; - ofn.FlagsEx = 0; - BOOL fSuccess = GetSaveFileName(&ofn); - return fSuccess; -} -bool ArtGetSaveFileNameNewDB(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter) { OPENFILENAME ofn; ofn.lStructSize = sizeof(ofn); diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index c0fe977..7891bf7 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -530,4 +530,3 @@ void ArtShowDialog(IUI* pDlg) // false -> was cancelled bool ArtGetOpenFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); -bool ArtGetSaveFileNameNewDB(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index 0e80a79..f4323ca 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -379,14 +379,37 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l // swprintf(szText, NUMCHARS(szText), L"Race Start = %i\n\nRace End = %i", tmStartRace, tmEndRace); // MessageBox(hWnd, szText, L"Saving", MB_OK); TCHAR szFilename[MAX_PATH]; - if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"TXT Files (*.txt)\0*.TXT\0\0")) + szFilename[0]=L'\0'; + wcscat(szFilename,L"TimingScoring.txt"); + while (true) { - // let's make sure there's a .txt suffix on that bugger. - if(!str_ends_with(szFilename,L".txt") || !str_ends_with(szFilename,L".TXT") ) + if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"TXT Files (*.txt)\0*.TXT\0\0")) { - wcsncat(szFilename,L".txt", NUMCHARS(szFilename)); + const bool fFileIsNew = !DoesFileExist(szFilename); + if(fFileIsNew) + { + // let's make sure there's a .txt suffix on that bugger. + if(!str_ends_with(szFilename,L".txt") || !str_ends_with(szFilename,L".TXT") ) + { + wcsncat(szFilename,L".txt", NUMCHARS(szFilename)); + } + break; + } + else + { + DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; + } + } } - + else + { + return 0; + } + } + // Open up the file and write the information to it wofstream out; out.open(szFilename); @@ -446,7 +469,6 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l m_pResults->fCancelled = false; return TRUE; - } } else { diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 4d449b6..a7d8447 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -585,112 +585,133 @@ class LapSocketReceiver { for(int x = 0;x < cbRead; x++) { - lstLapBuf.push_back(buf[x]); - if(aV1Start.Process(buf[x])) - { - eRecv = RECV_V1_LAP; - aV1Start.Reset(); - // we have detected the start of a new lap - lstLapBuf.clear(); - } - if(aV1End.Process(buf[x])) - { - eRecv = RECV_NONE; - aV1End.Reset(); - // we have found the end of a lap - int iLapId = 0; - ILap* pLap = pLaps->AllocateLap(true); - if(ProcessV1LapData(lstLapBuf, &iLapId, pLap)) - { - pLaps->AddLap(pLap, 0xffffffff); - } - else - { - pLap->Free(); - } - lstLapBuf.clear(); - } - if(aV2Start.Process(buf[x])) - { - eRecv = RECV_V2_LAP; - aV2Start.Reset(); - lstLapBuf.clear(); - } - if(aV2End.Process(buf[x])) - { - eRecv = RECV_NONE; - aV2End.Reset(); - int iLapId = 0; - ILap* pLap = pLaps->AllocateLap(true); - if(ProcessV2LapData(lstLapBuf, &iLapId, pLap)) - { - pLaps->AddLap(pLap, 0xffffffff); - } - } - - lstDataBuf.push_back(buf[x]); - if(aDataStart.Process(buf[x])) - { - eRecv = RECV_DATA; - aDataStart.Reset(); - lstDataBuf.clear(); - } - if(aDataEnd.Process(buf[x])) - { - eRecv = RECV_NONE; - int iLapId = 0; - aDataEnd.Reset(); - IDataChannel* pDataChannel = pLaps->AllocateDataChannel(); - if(ProcessDataChannel(lstDataBuf,&iLapId, pDataChannel)) - { - pLaps->AddDataChannel(pDataChannel); - } - lstDataBuf.clear(); - } + lstLapBuf.push_back(buf[x]); + if(aV1Start.Process(buf[x])) + { + eRecv = RECV_V1_LAP; + aV1Start.Reset(); + // we have detected the start of a new lap + lstLapBuf.clear(); + } + if(aV1End.Process(buf[x])) + { + eRecv = RECV_NONE; + aV1End.Reset(); + // we have found the end of a lap + int iLapId = 0; + ILap* pLap = pLaps->AllocateLap(true); + if(ProcessV1LapData(lstLapBuf, &iLapId, pLap)) + { + pLaps->AddLap(pLap, 0xffffffff); + } + else + { + pLap->Free(); + } + lstLapBuf.clear(); + } + if(aV2Start.Process(buf[x])) + { + eRecv = RECV_V2_LAP; + aV2Start.Reset(); + lstLapBuf.clear(); + } + if(aV2End.Process(buf[x])) + { + eRecv = RECV_NONE; + aV2End.Reset(); + int iLapId = 0; + ILap* pLap = pLaps->AllocateLap(true); + if(ProcessV2LapData(lstLapBuf, &iLapId, pLap)) + { + pLaps->AddLap(pLap, 0xffffffff); + } + } + + lstDataBuf.push_back(buf[x]); + if(aDataStart.Process(buf[x])) + { + eRecv = RECV_DATA; + aDataStart.Reset(); + lstDataBuf.clear(); + } + if(aDataEnd.Process(buf[x])) + { + eRecv = RECV_NONE; + int iLapId = 0; + aDataEnd.Reset(); + IDataChannel* pDataChannel = pLaps->AllocateDataChannel(); + if(ProcessDataChannel(lstDataBuf,&iLapId, pDataChannel)) + { + pLaps->AddDataChannel(pDataChannel); + } + lstDataBuf.clear(); + } - if(aHTBT.Process(buf[x])) - { - eRecv = RECV_NONE; - aHTBT.Reset(); - const char* pbResponse = "HTBT"; - send(sData, pbResponse, 4, 0); - - lstLapBuf.clear(); - lstDataBuf.clear(); - } - lstDBBuf.push_back(buf[x]); - - if(aDBIncoming.Process(buf[x])) - { - eRecv = RECV_DB; - lstDBBuf.clear(); - } - if(aDBDone.Process(buf[x])) - { - eRecv = RECV_NONE; - // First, let the user know that the database has been recieved and determine where to save it - DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone.\n\nSpecify a name and folder to save it to",L"New database",MB_OK); - - // we have received a raw database. Select a folder to save it to, then send the path to the pitside UI so it can decide what to do - TCHAR szDBPath[MAX_PATH]; - wcscat(szDBPath,L"TempPitsideDB.wflp"); - if(ArtGetSaveFileNameNewDB(NULL,L"Select location and filename to save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) - { - const bool fFileIsNew = !DoesFileExist(szDBPath); - if(fFileIsNew) + if(aHTBT.Process(buf[x])) + { + eRecv = RECV_NONE; + aHTBT.Reset(); + const char* pbResponse = "HTBT"; + send(sData, pbResponse, 4, 0); + + lstLapBuf.clear(); + lstDataBuf.clear(); + } + lstDBBuf.push_back(buf[x]); + + if(aDBIncoming.Process(buf[x])) + { + eRecv = RECV_DB; + lstDBBuf.clear(); + } + if(aDBDone.Process(buf[x])) + { + eRecv = RECV_NONE; + // First, let the user know that the database has been recieved and determine where to save it + DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone.\n\nSpecify a name and folder to save it to",L"New database",MB_OK); + + // we have received a raw database. Select a folder to save it to, then send the path to the pitside UI so it can decide what to do + TCHAR szDBPath[MAX_PATH]; + szDBPath[0]=L'\0'; + wcscat(szDBPath,L"TempPitsideDB.wflp"); + while (true) { - // let's make sure there's a .wflp suffix on that bugger. - if(!str_ends_with2(szDBPath,L".wflp")) - { - wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); - } + if(ArtGetSaveFileName(NULL,L"Select location and filename to save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) + { + const bool fFileIsNew = !DoesFileExist(szDBPath); + if(fFileIsNew) + { + // let's make sure there's a .wflp suffix on that bugger. + if(!str_ends_with2(szDBPath,L".wflp")) + { + wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); + } + break; + } + else + { + DWORD dwRet = MessageBox(NULL,L"A database already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; + } + } + } + else + { + return; + } } if(SaveBufferToFile(szDBPath, &lstDBBuf[0], lstDBBuf.size()-aDBDone.GetSize())) { pLaps->NotifyDBArrival(szDBPath); } - } - } + else + { + MessageBox(NULL,L"An error occurred while saving the database",L"ERROR",MB_APPLMODAL | MB_ICONERROR | MB_TOPMOST | MB_OK); + } + } } // end processing loop diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 24c820e..73a2c06 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1453,6 +1453,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Let's get the output file name from the user. TCHAR szTempPath[MAX_PATH]; TCHAR szFileName[MAX_PATH], szTempName[MAX_PATH]; + szFileName[0]=L'\0'; if (PrintFlag) { GetTempPath(NUMCHARS(szTempPath),szTempPath); // Get the TEMP folder path @@ -1460,21 +1461,40 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } else { - if(ArtGetSaveFileName(hWnd, L"Choose Filename to save as a JPEG File.", szFileName, NUMCHARS(szFileName),L"JPG Files (*.jpg)\0*.JPG\0\0")) + + wcscat(szFileName,L"Picture.jpg"); + while (true) { - if(!str_ends_with(szFileName,L".jpg")) + if(ArtGetSaveFileName(hWnd, L"Choose Filename to save as a JPEG File.", szFileName, NUMCHARS(szFileName),L"JPG Files (*.jpg)\0*.JPG\0\0")) { - wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); + const bool fFileIsNew = !DoesFileExist(szFileName); + if(fFileIsNew) + { + // let's make sure there's a .jpg suffix on that bugger. + if(!str_ends_with(szFileName,L".jpg")) + { + wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); + } + break; + } + else + { + DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; + } + } + } + else + { + return 0; } } - else - { - break; - } - // Create a temporary BMP file, this is where we will save the screen capture. - swprintf(szTempName, NUMCHARS(szTempName), L"%s.bmp", szFileName); + + // Create a temporary BMP file, this is where we will save the screen capture. + swprintf(szTempName, NUMCHARS(szTempName), L"%s.bmp", szFileName); } - // Add the size of the headers to the size of the bitmap to get the total file size DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); @@ -1736,15 +1756,38 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) set setSelectedData = m_sfLapList.GetSelectedItemsData3(); if(setSelectedData.size() > 0) { - TCHAR szFilename[MAX_PATH]; - if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"CSV Files (*.csv)\0*.CSV\0\0")) - { - // let's make sure there's a .csv suffix on that bugger. - if(!str_ends_with(szFilename,L".csv")) + TCHAR szFilename[MAX_PATH]; + szFilename[0]=L'\0'; + wcscat(szFilename,L"Export.csv"); + while (true) + { + if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"CSV Files (*.csv)\0*.CSV\0\0")) { - wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); + const bool fFileIsNew = !DoesFileExist(szFilename); + if(fFileIsNew) + { + // let's make sure there's a .csv suffix on that bugger. + if(!str_ends_with(szFilename,L".csv")) + { + wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); + } + break; + } + else + { + DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; + } + } } - + else + { + return 0; + } + } + // Display the "Working...." dialog, as this is going to take some time. DLGPROC working = NULL; HWND hwndGoto = NULL; // Window handle of dialog box @@ -1764,7 +1807,6 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) DashWare::SaveToDashware(szFilename, lstLaps, lstLaps1); // lstLaps does not have the reference lap in it, lstLaps1 may have it DestroyWindow(hwndGoto); // Close the "Working..." dialog hwndGoto = NULL; - } } else { @@ -3758,6 +3800,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine int iRaceId[50] = {0}; TCHAR szDBPath[MAX_PATH]; + szDBPath[0] = '\0'; + wcscat(szDBPath,L"NewDatabase.wflp"); if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { const bool fFileIsNew = !DoesFileExist(szDBPath); @@ -3798,7 +3842,6 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine fDBOpened = true; } } - } else { From 0e61ec2251cccde802cbd4ed982987b3c2ef7bb2 Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Fri, 13 May 2016 16:00:21 -0700 Subject: [PATCH 082/112] Final tweaking for file naming routines --- .../PitsideConsole/DlgTimingScoring.cpp | 5 ++--- PitsideConsole/PitsideConsole/LapReceiver.cpp | 3 +-- .../PitsideConsole/PitsideConsole.cpp | 17 +++++++---------- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index f4323ca..697526d 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -378,8 +378,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l { // swprintf(szText, NUMCHARS(szText), L"Race Start = %i\n\nRace End = %i", tmStartRace, tmEndRace); // MessageBox(hWnd, szText, L"Saving", MB_OK); - TCHAR szFilename[MAX_PATH]; - szFilename[0]=L'\0'; + TCHAR szFilename[MAX_PATH] = {NULL}; wcscat(szFilename,L"TimingScoring.txt"); while (true) { @@ -389,7 +388,7 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l if(fFileIsNew) { // let's make sure there's a .txt suffix on that bugger. - if(!str_ends_with(szFilename,L".txt") || !str_ends_with(szFilename,L".TXT") ) + if(!str_ends_with(szFilename,L".txt") && !str_ends_with(szFilename,L".TXT") ) { wcsncat(szFilename,L".txt", NUMCHARS(szFilename)); } diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index a7d8447..0c41bd2 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -672,8 +672,7 @@ class LapSocketReceiver DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone.\n\nSpecify a name and folder to save it to",L"New database",MB_OK); // we have received a raw database. Select a folder to save it to, then send the path to the pitside UI so it can decide what to do - TCHAR szDBPath[MAX_PATH]; - szDBPath[0]=L'\0'; + TCHAR szDBPath[MAX_PATH] = {NULL}; wcscat(szDBPath,L"TempPitsideDB.wflp"); while (true) { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 73a2c06..734ab09 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1451,9 +1451,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { // Let's get the output file name from the user. - TCHAR szTempPath[MAX_PATH]; - TCHAR szFileName[MAX_PATH], szTempName[MAX_PATH]; - szFileName[0]=L'\0'; + TCHAR szTempPath[MAX_PATH], szTempName[MAX_PATH]; + TCHAR szFileName[MAX_PATH] = {NULL}; if (PrintFlag) { GetTempPath(NUMCHARS(szTempPath),szTempPath); // Get the TEMP folder path @@ -1471,7 +1470,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if(fFileIsNew) { // let's make sure there's a .jpg suffix on that bugger. - if(!str_ends_with(szFileName,L".jpg")) + if(!str_ends_with(szFileName,L".jpg") && !str_ends_with(szFileName,L".JPG")) { wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); } @@ -1756,8 +1755,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) set setSelectedData = m_sfLapList.GetSelectedItemsData3(); if(setSelectedData.size() > 0) { - TCHAR szFilename[MAX_PATH]; - szFilename[0]=L'\0'; + TCHAR szFilename[MAX_PATH] = {NULL}; wcscat(szFilename,L"Export.csv"); while (true) { @@ -1767,7 +1765,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if(fFileIsNew) { // let's make sure there's a .csv suffix on that bugger. - if(!str_ends_with(szFilename,L".csv")) + if(!str_ends_with(szFilename,L".csv") && !str_ends_with(szFilename,L".CSV")) { wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); } @@ -3799,8 +3797,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine bool fDBOpened = false; int iRaceId[50] = {0}; - TCHAR szDBPath[MAX_PATH]; - szDBPath[0] = '\0'; + TCHAR szDBPath[MAX_PATH] = {NULL}; wcscat(szDBPath,L"NewDatabase.wflp"); if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { @@ -3808,7 +3805,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine if(fFileIsNew) { // let's make sure there's a .wflp suffix on that bugger. - if(!str_ends_with(szDBPath,L".wflp")) + if(!str_ends_with(szDBPath,L".wflp") && !str_ends_with(szDBPath,L".WFLP")) { wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); } From bc049a046201ba160bed40b7ddca88460eb4992a Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Wed, 18 May 2016 15:19:46 -0700 Subject: [PATCH 083/112] More save name logic tweaking --- .../PitsideConsole/DlgTimingScoring.cpp | 16 +++---- PitsideConsole/PitsideConsole/LapReceiver.cpp | 16 +++---- .../PitsideConsole/PitsideConsole.cpp | 43 +++++++++---------- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp index 697526d..6c151d7 100644 --- a/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp +++ b/PitsideConsole/PitsideConsole/DlgTimingScoring.cpp @@ -384,28 +384,28 @@ LRESULT CDlgTimingScoring::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l { if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"TXT Files (*.txt)\0*.TXT\0\0")) { + // let's make sure there's a .txt suffix on that bugger. + if(!str_ends_with(szFilename,L".txt") && !str_ends_with(szFilename,L".TXT") ) + { + wcsncat(szFilename,L".txt", NUMCHARS(szFilename)); + } const bool fFileIsNew = !DoesFileExist(szFilename); if(fFileIsNew) { - // let's make sure there's a .txt suffix on that bugger. - if(!str_ends_with(szFilename,L".txt") && !str_ends_with(szFilename,L".TXT") ) - { - wcsncat(szFilename,L".txt", NUMCHARS(szFilename)); - } - break; + break; // Exit loop, as file name is valid and new } else { DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); if (dwRet == IDYES) { - break; + break; // User wants to overwrite file, so exit loop and proceed } } } else { - return 0; + return 0; // User cancelled the save operation, so leave subroutine } } diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 0c41bd2..836678a 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -678,28 +678,28 @@ class LapSocketReceiver { if(ArtGetSaveFileName(NULL,L"Select location and filename to save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { + // let's make sure there's a .wflp suffix on that bugger. + if(!str_ends_with2(szDBPath,L".wflp") && !str_ends_with2(szDBPath,L".WFLP")) + { + wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); + } const bool fFileIsNew = !DoesFileExist(szDBPath); if(fFileIsNew) { - // let's make sure there's a .wflp suffix on that bugger. - if(!str_ends_with2(szDBPath,L".wflp")) - { - wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); - } - break; + break; // Exit loop, as file name is valid and new } else { DWORD dwRet = MessageBox(NULL,L"A database already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); if (dwRet == IDYES) { - break; + break; // User wants to overwrite file, so exit loop and proceed } } } else { - return; + return; // User cancelled the save operation, so leave subroutine } } if(SaveBufferToFile(szDBPath, &lstDBBuf[0], lstDBBuf.size()-aDBDone.GetSize())) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 734ab09..83fb4b1 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1466,28 +1466,28 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { if(ArtGetSaveFileName(hWnd, L"Choose Filename to save as a JPEG File.", szFileName, NUMCHARS(szFileName),L"JPG Files (*.jpg)\0*.JPG\0\0")) { + // let's make sure there's a .jpg suffix on that bugger. + if(!str_ends_with(szFileName,L".jpg") && !str_ends_with(szFileName,L".JPG")) + { + wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); + } const bool fFileIsNew = !DoesFileExist(szFileName); if(fFileIsNew) { - // let's make sure there's a .jpg suffix on that bugger. - if(!str_ends_with(szFileName,L".jpg") && !str_ends_with(szFileName,L".JPG")) - { - wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); - } - break; + break; // Exit loop, as file name is valid and new } else { DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); if (dwRet == IDYES) { - break; + break; // User wants to overwrite file, so exit loop and proceed } } } else { - return 0; + return 0; // User cancelled the save operation, so leave subroutine } } @@ -1761,28 +1761,28 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"CSV Files (*.csv)\0*.CSV\0\0")) { + // let's make sure there's a .csv suffix on that bugger. + if(!str_ends_with(szFilename,L".csv") && !str_ends_with(szFilename,L".CSV")) + { + wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); + } const bool fFileIsNew = !DoesFileExist(szFilename); if(fFileIsNew) { - // let's make sure there's a .csv suffix on that bugger. - if(!str_ends_with(szFilename,L".csv") && !str_ends_with(szFilename,L".CSV")) - { - wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); - } - break; + break; // Exit loop, as file name is valid and new } else { DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); if (dwRet == IDYES) { - break; + break; // User wants to overwrite file, so exit loop and proceed } } } else { - return 0; + return 0; // User cancelled the save operation, so leave subroutine } } @@ -3801,15 +3801,12 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine wcscat(szDBPath,L"NewDatabase.wflp"); if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { - const bool fFileIsNew = !DoesFileExist(szDBPath); - if(fFileIsNew) + // let's make sure there's a .wflp suffix on that bugger. + if(!str_ends_with(szDBPath,L".wflp") && !str_ends_with(szDBPath,L".WFLP")) { - // let's make sure there's a .wflp suffix on that bugger. - if(!str_ends_with(szDBPath,L".wflp") && !str_ends_with(szDBPath,L".WFLP")) - { - wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); - } + wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); } + const bool fFileIsNew = !DoesFileExist(szDBPath); // they chose one to open, so open it. if(sfLaps.Init(szDBPath)) { From ea8a86c83a28c8c5762e53b3a3566fbefec0fd0e Mon Sep 17 00:00:00 2001 From: "kdjones2@yahoo.com" Date: Fri, 20 May 2016 20:28:18 -0700 Subject: [PATCH 084/112] 2.004.0012: Added Windows file extension association functionality --- .../PitsideConsole/PitsideConsole.cpp | 127 ++++++++++++------ 1 file changed, 83 insertions(+), 44 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 83fb4b1..96d2d5c 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3774,14 +3774,17 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) p_sfLapOpts.m_Tranformations[i].b_LoadTrans = false; } } +// Converts ANSI strings to UNICODE strings +BOOL AnsiToUnicode( LPSTR pszAnsiString, LPWSTR pszwUniBuff, DWORD dwUniBuffSize ) +{ + int iRet = 0; + iRet = MultiByteToWideChar(CP_ACP, 0, pszAnsiString, -1, pszwUniBuff, dwUniBuffSize); + return ( 0 != iRet ); +} INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - if(strcmp(lpCmdLine,"unit") == 0) - { - return UnitTests(); - } INITCOMMONCONTROLSEX initCtrls; initCtrls.dwICC = ICC_LISTVIEW_CLASSES; initCtrls.dwSize = sizeof(initCtrls); @@ -3792,54 +3795,88 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_pUI = &sfUI; //CLapReceiver sfLaps(&sfUI); - CSQLiteLapDB sfLaps(&sfUI); bool fDBOpened = false; int iRaceId[50] = {0}; - TCHAR szDBPath[MAX_PATH] = {NULL}; - wcscat(szDBPath,L"NewDatabase.wflp"); - if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) + TCHAR szDBPath[MAX_PATH] = {NULL}; // Filename and path are contained in this string + TCHAR szTemp[512] = {NULL}; + TCHAR szLoadFileName[MAX_PATH] = {NULL}; + TCHAR wCmdLine[MAX_PATH] = {NULL}; + AnsiToUnicode(lpCmdLine, wCmdLine, sizeof(wCmdLine)); // Convert ANSI command line to UNICODE command + + if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line { - // let's make sure there's a .wflp suffix on that bugger. - if(!str_ends_with(szDBPath,L".wflp") && !str_ends_with(szDBPath,L".WFLP")) - { - wcsncat(szDBPath,L".wflp", NUMCHARS(szDBPath)); - } - const bool fFileIsNew = !DoesFileExist(szDBPath); - // they chose one to open, so open it. - if(sfLaps.Init(szDBPath)) - { - if(!fFileIsNew) - { - // show the race-selection dialog - RACESELECT_RESULT sfRaceResult; - CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); - ::ArtShowDialog(&sfRaceSelect); - if(!sfRaceResult.fCancelled) - { + return UnitTests(); +// DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); + } + else if( str_ends_with( wCmdLine, L".wflp\"") ) // Check if user clicked on an associated WFLP file and load it + { + // First we must remove the quote marks from the beginning and end of the file name in the command line + int start = 1; + int end = NUMCHARS(wCmdLine); + for (int q=start; q(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { for (int z = 0; z < 50; z++) { iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session } - fDBOpened = true; - } - else - { - iRaceId[0] = -1; - fDBOpened = true; - } - } - else - { - iRaceId[0] = -1; - fDBOpened = true; - } - } - } - else - { - return 0; + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + fDBOpened = true; + } + } + else + { + iRaceId[0] = -1; + fDBOpened = true; + } } if(!fDBOpened) @@ -3847,11 +3884,13 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine // they didn't choose a file, so just use a temp DB. TCHAR szTempPath[MAX_PATH]; GetTempPath(NUMCHARS(szTempPath),szTempPath); - wcscat(szTempPath,L"\\pitsidetemp.wflp"); + wcscat(szTempPath,L"pitsidetemp.wflp"); if(sfLaps.Init(szTempPath)) { // success! wcscpy(szDBPath,szTempPath); + iRaceId[0] = -1; + fDBOpened = true; } } if(!fDBOpened) From 4de9276206a93c3b5429d6e169994a09884a2506 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 13 Sep 2016 12:05:44 -0700 Subject: [PATCH 085/112] 2.004.0013. CSV export improvements. 1) Improved time offsets in CSV export routine to work with RaceRender better. 2) Initial code to save current settings for opening Pitside back to where it was previously. --- PitsideConsole/PitsideConsole/DashWare.cpp | 15 ++-- .../PitsideConsole/PitsideConsole.cpp | 76 ++++++++++++++++++- .../PitsideConsole/PitsideConsole.rc | 2 +- 3 files changed, 84 insertions(+), 9 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DashWare.cpp b/PitsideConsole/PitsideConsole/DashWare.cpp index 9ec9c42..6c50fd7 100644 --- a/PitsideConsole/PitsideConsole/DashWare.cpp +++ b/PitsideConsole/PitsideConsole/DashWare.cpp @@ -64,8 +64,8 @@ namespace DashWare } WriteChannelHeaders(out, dwMapChannels); // Put all Data Channel names into the header for the CSV file - int msLastLine = 0; // Indexer for pulling correct timestamp data for each data channel - float flStartTime = 0; // start time in seconds; + long long msLastLine = 0; // Indexer for pulling correct timestamp data for each data channel + long long msTimeOffset = 0; // Time in ms to offset the Time in seconds column in the CSV offset file; used to fix phone reset issues // Need to go through the lstSortedLaps sequentially and find each lap in lstLaps1 for output to file for (int ixLap = 0; ixLap < lstSortedLaps.size(); ixLap++) { @@ -78,13 +78,18 @@ namespace DashWare // We found the lap. Let's get all of the populated data channels for this lap const ILap* pLap = lstLaps1[iFoundLap]->GetLap(); // Get the chosen lap - int msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) - int msEndTime = -INT_MAX; + long long msStartTime = INT_MAX; // start time and end time for this lap (gotten by looking at start and end time for data channels) + long long msEndTime = -INT_MAX; const IDataChannel* pDC = lstLaps1[iFoundLap]->GetChannel(DATA_CHANNEL_VELOCITY); // Use the Velocity data channel to set time boundary conditions for this lap msStartTime = pDC->GetStartTimeMs(); msEndTime = max(msEndTime, msStartTime + pLap->GetTime()*1000); + if ((msStartTime + 2000) < msLastLine) // Time stamp for this lap is less than previous lap; possible phone reset. + // Add an offset to following laps for RaceRender to work correctly + { + msTimeOffset = msLastLine + msTimeOffset + 5000 - msStartTime; + } const vector& lstPoints = pLap->GetPoints(); // List of points for this lap float flRunningAverage[DATA_CHANNEL_COUNT] = {0.0f}; @@ -100,7 +105,7 @@ namespace DashWare out << ixLap << ","; // Time TCHAR szTemp[100] = L"0"; - _snwprintf(szTemp,NUMCHARS(szTemp),L"%6.3f",((float)msQuery/1000.0f)+flStartTime); + _snwprintf( szTemp, NUMCHARS(szTemp), L"%6.3f", ((float)(msQuery + msTimeOffset)/1000.0f) ); out << szTemp << ","; // Comment out << pLap->GetComment(); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 96d2d5c..5667488 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3904,7 +3904,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_pLapDB = &sfLaps; - +// LAPSUPPLIEROPTIONS m_sfLapOpts; //sfLapOpts contains all lap display options LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything @@ -4027,8 +4027,78 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { HANDLE hRecvThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ReceiveThreadProc, (LPVOID)&sfLaps, 0, NULL); } - + // Show the Open Dialog and start Pitside Console ArtShowDialog(&sfUI); - exit(0); + + // Exiting the program. + // Let's save as many preferences and current settings as we can for next execution cycle before closing + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + +// LoadPitsideSettings(&sfSettings); + wofstream out; + out.open(szTempPath); + if(!out.eof() && !out.fail()) + { + out << sfSettings.fRunHTTP << endl; + out << sfSettings.iHTTPPort << endl; + out << sfSettings.iVelocity << endl; + out << sfSettings.iMapLines << endl; + out << sfSettings.iColorScheme << endl; + out << sfSettings.bSmoothYesNo << endl; + out << sfSettings.bXAxis_KM << endl; + + out << x_sfLapOpts.bShowReferenceLap << endl; + out << x_sfLapOpts.bSmoothYesNo << endl; + out << x_sfLapOpts.bTractionCircle << endl; + out << x_sfLapOpts.bXAxis_KM << endl; + out << x_sfLapOpts.eSortPreference << endl; + out << x_sfLapOpts.eUnitPreference << endl; + out << x_sfLapOpts.e_Orientation << endl; + out << x_sfLapOpts.fColorScheme << endl; + out << x_sfLapOpts.fDrawGuides << endl; + out << x_sfLapOpts.fDrawLines << endl; + out << x_sfLapOpts.fDrawSplitPoints << endl; + out << x_sfLapOpts.fElapsedTime << endl; + out << x_sfLapOpts.fIOIOHardcoded << endl; + out << x_sfLapOpts.flWindowShiftX << endl; + out << x_sfLapOpts.flWindowShiftY << endl; + out << x_sfLapOpts.hWndLap << endl; + out << x_sfLapOpts.iZoomLevels << endl; +// out << x_sfLapOpts.m_PlotPrefs << endl; +// out << x_sfLapOpts.m_SplitPoints << endl; +// out << x_sfLapOpts.m_Tranformations << endl; + + for (int i=0; i < 50; i++) + { +// out << x_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; + out << x_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << x_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel + out << x_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 + out << x_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 + out << x_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph + out << x_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 + out << x_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 + out << x_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 + out << x_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points + out << x_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points + out << x_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times + out << x_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; + out << x_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points +// out << x_sfLapOpts.m_Tranformations[i].f_CoeffA << endl; +// out << x_sfLapOpts.m_Tranformations[i].f_CoeffB << endl; +// out << x_sfLapOpts.m_Tranformations[i].f_CoeffC << endl; +// out << x_sfLapOpts.m_Tranformations[i].c_Name << endl; +// out << x_sfLapOpts.m_Tranformations[i].b_LoadTrans << endl; + } + + out.close(); + } + + } + + exit(0); // } diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 28de96c..8694bf7 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0011\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0013\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 0121fea79e8da827bf1a3996835d77dd620a0bdd Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 16 Sep 2016 06:32:37 -0700 Subject: [PATCH 086/112] More settings savings coding. Now it is saving the transformation values, but not the alarm limits. --- .../PitsideConsole/PitsideConsole.cpp | 72 +++++++++---------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 5667488..09f1c4e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3904,9 +3904,11 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_pLapDB = &sfLaps; -// LAPSUPPLIEROPTIONS m_sfLapOpts; //sfLapOpts contains all lap display options LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything + sfUI.SetDisplayOptions(x_sfLapOpts); +// LAPSUPPLIEROPTIONS m_sfLapOpts; //sfLapOpts contains all lap display options + LAPSUPPLIEROPTIONS& px_sfLapOpts(x_sfLapOpts); //sfLapOpts contains all lap display options PITSIDE_SETTINGS sfSettings; LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file @@ -4050,48 +4052,40 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine out << sfSettings.bSmoothYesNo << endl; out << sfSettings.bXAxis_KM << endl; - out << x_sfLapOpts.bShowReferenceLap << endl; - out << x_sfLapOpts.bSmoothYesNo << endl; - out << x_sfLapOpts.bTractionCircle << endl; - out << x_sfLapOpts.bXAxis_KM << endl; - out << x_sfLapOpts.eSortPreference << endl; - out << x_sfLapOpts.eUnitPreference << endl; - out << x_sfLapOpts.e_Orientation << endl; - out << x_sfLapOpts.fColorScheme << endl; - out << x_sfLapOpts.fDrawGuides << endl; - out << x_sfLapOpts.fDrawLines << endl; - out << x_sfLapOpts.fDrawSplitPoints << endl; - out << x_sfLapOpts.fElapsedTime << endl; - out << x_sfLapOpts.fIOIOHardcoded << endl; - out << x_sfLapOpts.flWindowShiftX << endl; - out << x_sfLapOpts.flWindowShiftY << endl; - out << x_sfLapOpts.hWndLap << endl; - out << x_sfLapOpts.iZoomLevels << endl; -// out << x_sfLapOpts.m_PlotPrefs << endl; -// out << x_sfLapOpts.m_SplitPoints << endl; -// out << x_sfLapOpts.m_Tranformations << endl; + out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; + out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; + out << sfUI.m_sfLapOpts.bTractionCircle << endl; + out << sfUI.m_sfLapOpts.bXAxis_KM << endl; + out << sfUI.m_sfLapOpts.eSortPreference << endl; + out << sfUI.m_sfLapOpts.eUnitPreference << endl; + out << sfUI.m_sfLapOpts.e_Orientation << endl; + out << sfUI.m_sfLapOpts.fColorScheme << endl; + out << sfUI.m_sfLapOpts.fDrawGuides << endl; + out << sfUI.m_sfLapOpts.fDrawLines << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; + out << sfUI.m_sfLapOpts.fElapsedTime << endl; + out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; + out << sfUI.m_sfLapOpts.flWindowShiftX << endl; + out << sfUI.m_sfLapOpts.flWindowShiftY << endl; + out << sfUI.m_sfLapOpts.hWndLap << endl; + out << sfUI.m_sfLapOpts.iZoomLevels << endl; for (int i=0; i < 50; i++) { // out << x_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; - out << x_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; - out << x_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel - out << x_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 - out << x_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 - out << x_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph - out << x_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 - out << x_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 - out << x_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 - out << x_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points - out << x_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points - out << x_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times - out << x_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; - out << x_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points -// out << x_sfLapOpts.m_Tranformations[i].f_CoeffA << endl; -// out << x_sfLapOpts.m_Tranformations[i].f_CoeffB << endl; -// out << x_sfLapOpts.m_Tranformations[i].f_CoeffC << endl; -// out << x_sfLapOpts.m_Tranformations[i].c_Name << endl; -// out << x_sfLapOpts.m_Tranformations[i].b_LoadTrans << endl; + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points } out.close(); From dbb20fb147fdf5ba9091ea0cbec82125a16f9108 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 16 Sep 2016 21:11:47 -0700 Subject: [PATCH 087/112] Save Settings interim coding. Saving settings and loading them, but not using them yet. --- .../PitsideConsole/PitsideConsole.cpp | 497 +++++++++++++++--- 1 file changed, 426 insertions(+), 71 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 09f1c4e..fe535ea 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3774,6 +3774,421 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) p_sfLapOpts.m_Tranformations[i].b_LoadTrans = false; } } + +void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI) +{ + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + wofstream out; + out.open(szTempPath); + if(!out.eof() && !out.fail()) + { + out << szDBPath << endl; // The file name for the database + out << sfSettings.fRunHTTP << endl; + out << sfSettings.iHTTPPort << endl; + out << sfSettings.iVelocity << endl; + out << sfSettings.iMapLines << endl; + out << sfSettings.iColorScheme << endl; + out << sfSettings.bSmoothYesNo << endl; + out << sfSettings.bXAxis_KM << endl; + + out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; + out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; + out << sfUI.m_sfLapOpts.bTractionCircle << endl; + out << sfUI.m_sfLapOpts.bXAxis_KM << endl; + out << sfUI.m_sfLapOpts.eSortPreference << endl; + out << sfUI.m_sfLapOpts.eUnitPreference << endl; + out << sfUI.m_sfLapOpts.e_Orientation << endl; + out << sfUI.m_sfLapOpts.fColorScheme << endl; + out << sfUI.m_sfLapOpts.fDrawGuides << endl; + out << sfUI.m_sfLapOpts.fDrawLines << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; + out << sfUI.m_sfLapOpts.fElapsedTime << endl; + out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; + out << sfUI.m_sfLapOpts.flWindowShiftX << endl; + out << sfUI.m_sfLapOpts.flWindowShiftY << endl; + out << sfUI.m_sfLapOpts.hWndLap << endl; + out << sfUI.m_sfLapOpts.iZoomLevels << endl; + + for (int i=0; i < 50; i++) + { + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points + } + out << "//" << endl; // End of file marker + out.close(); + } + + } +} + +int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI) +{ + TCHAR szTempPath[MAX_PATH]; + TCHAR szText[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + vector lines; + ifstream in; + in.open(szTempPath); + // Read in all of the lines of the "LatestSettings.txt" file at once, or it doesn't work right + // Store them in the 'lines' vector + for (int i = 0; i < 1000; i++) + { + string Line; + if(!in.eof() && !in.fail()) + { + getline(in, Line); + if (Line != "//") + { + lines.push_back(Line); + } + else + { + break; + } + } + else + { + break; + } + } + in.close(); + + // Now let's process the information and load it in the sfUI data structure + string Line = lines[0]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath + } + if ( !_wcsnicmp(szText, szDBPath, NUMCHARS(szText)) ) // If opened file is the same as the last opened file, load previous settings for Pitside + { + // If not break and load default settings + Line = lines[1]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + } + + Line = lines[2]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure + } + + Line = lines[3]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure + } + + Line = lines[4]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure + } + + Line = lines[5]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure + } + + Line = lines[6]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure + } + + Line = lines[7]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure + } + + Line = lines[8]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure + } + + Line = lines[9]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // LLoad the boolean for accel smoothing into LapOpts data structuree + } + + Line = lines[10]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure + } + + Line = lines[11]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure + } + + Line = lines[12]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure + } + + Line = lines[13]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure + } + + Line = lines[14]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure + } + + Line = lines[15]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure + } + + Line = lines[16]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure + } + + Line = lines[17]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure + } + + Line = lines[18]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure + } + + Line = lines[19]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure + } + + Line = lines[20]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure + } + + Line = lines[21]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure + } + + Line = lines[22]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure + } + + Line = lines[23]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + // sfUI.m_sfLapOpts.hWndLap = (HWND)_wtoi(c_Name); // Load the Lap Handle into sfSettings data structure + } + + Line = lines[24]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure + } + + int arraycounter = 1; + for (int i = 25; i < lines.size(); i+=13) + { + Line = lines[i]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel + } + + Line = lines[i+1]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel + } + + Line = lines[i+2]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+3]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel + } + + Line = lines[i+4]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel + } + + Line = lines[i+5]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel + } + + Line = lines[i+6]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel + } + + Line = lines[i+7]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel + } + + Line = lines[i+8]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+9]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+10]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times + } + + Line = lines[i+11]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+12]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points + } + arraycounter++; + } + } + + in.close(); + } + return 1; +} + // Converts ANSI strings to UNICODE strings BOOL AnsiToUnicode( LPSTR pszAnsiString, LPWSTR pszwUniBuff, DWORD dwUniBuffSize ) { @@ -3805,10 +4220,13 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine TCHAR wCmdLine[MAX_PATH] = {NULL}; AnsiToUnicode(lpCmdLine, wCmdLine, sizeof(wCmdLine)); // Convert ANSI command line to UNICODE command + PITSIDE_SETTINGS sfSettings; + LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file + if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line { return UnitTests(); -// DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); + DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); } else if( str_ends_with( wCmdLine, L".wflp\"") ) // Check if user clicked on an associated WFLP file and load it { @@ -3826,14 +4244,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } // Now let's put the file name/path into our loading string, szDBPath wcsncat(szDBPath, szLoadFileName, NUMCHARS(szLoadFileName)); -// _snwprintf(szTemp, NUMCHARS(szTemp), L"Start = %i End = %i\n szDBPath= %s\n szLoadFileName = %s\n wCmdLine= %s", start, end, szDBPath, szLoadFileName, wCmdLine); -// DWORD dwRet = MessageBox(NULL,szTemp,L"Load File", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); } else { -// _snwprintf(szTemp, NUMCHARS(szTemp), L"wCmdLine= %s", wCmdLine); -// DWORD dwRet = MessageBox(NULL,szTemp,L"New File", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); - wcscat(szDBPath,L"NewDatabase.wflp"); + wcscat(szDBPath,L"NewDatabase.wflp"); // Retrieve last file failed. Load a new database if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { // let's make sure there's a .wflp suffix on that bugger. @@ -3848,6 +4262,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } } + if( DoesFileExist(szDBPath) ) // File exists, so load it and return back to where you last left off + { + LoadSettings(szDBPath, sfSettings, sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing + } const bool fFileIsNew = !DoesFileExist(szDBPath); // they chose one to open, so open it. if(sfLaps.Init(szDBPath)) @@ -3906,13 +4324,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything - sfUI.SetDisplayOptions(x_sfLapOpts); -// LAPSUPPLIEROPTIONS m_sfLapOpts; //sfLapOpts contains all lap display options - LAPSUPPLIEROPTIONS& px_sfLapOpts(x_sfLapOpts); //sfLapOpts contains all lap display options +// sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer - PITSIDE_SETTINGS sfSettings; - LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file - switch (sfSettings.iVelocity) { case 0: @@ -4033,65 +4446,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ArtShowDialog(&sfUI); // Exiting the program. - // Let's save as many preferences and current settings as we can for next execution cycle before closing - TCHAR szTempPath[MAX_PATH]; - if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) - { - wcscat(szTempPath,L"LatestSettings.txt"); - -// LoadPitsideSettings(&sfSettings); - wofstream out; - out.open(szTempPath); - if(!out.eof() && !out.fail()) - { - out << sfSettings.fRunHTTP << endl; - out << sfSettings.iHTTPPort << endl; - out << sfSettings.iVelocity << endl; - out << sfSettings.iMapLines << endl; - out << sfSettings.iColorScheme << endl; - out << sfSettings.bSmoothYesNo << endl; - out << sfSettings.bXAxis_KM << endl; - - out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; - out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; - out << sfUI.m_sfLapOpts.bTractionCircle << endl; - out << sfUI.m_sfLapOpts.bXAxis_KM << endl; - out << sfUI.m_sfLapOpts.eSortPreference << endl; - out << sfUI.m_sfLapOpts.eUnitPreference << endl; - out << sfUI.m_sfLapOpts.e_Orientation << endl; - out << sfUI.m_sfLapOpts.fColorScheme << endl; - out << sfUI.m_sfLapOpts.fDrawGuides << endl; - out << sfUI.m_sfLapOpts.fDrawLines << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; - out << sfUI.m_sfLapOpts.fElapsedTime << endl; - out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; - out << sfUI.m_sfLapOpts.flWindowShiftX << endl; - out << sfUI.m_sfLapOpts.flWindowShiftY << endl; - out << sfUI.m_sfLapOpts.hWndLap << endl; - out << sfUI.m_sfLapOpts.iZoomLevels << endl; - - for (int i=0; i < 50; i++) - { -// out << x_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points - } - - out.close(); - } - - } + SaveSettings(szDBPath, sfSettings, sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing exit(0); // } From 457157531b1c4913dc20594d27f2a7128c8458d7 Mon Sep 17 00:00:00 2001 From: Keith Date: Sat, 17 Sep 2016 12:42:13 -0700 Subject: [PATCH 088/112] Save Settings interim coding. Saving settings and loading them, but not using them yet. --- .../PitsideConsole/PitsideConsole.cpp | 585 +++++++++++++++--- 1 file changed, 499 insertions(+), 86 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 09f1c4e..fa06c7e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3774,6 +3774,436 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) p_sfLapOpts.m_Tranformations[i].b_LoadTrans = false; } } + +void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI, int iRaceId[50]) +{ + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + wofstream out; + out.open(szTempPath); + if(!out.eof() && !out.fail()) + { + out << szDBPath << endl; // The file name for the database + for (int t=0; t<50; t++) // Save the RaceID's currently displayed + { + out << iRaceId[t] << endl; + } + out << sfSettings.fRunHTTP << endl; + out << sfSettings.iHTTPPort << endl; + out << sfSettings.iVelocity << endl; + out << sfSettings.iMapLines << endl; + out << sfSettings.iColorScheme << endl; + out << sfSettings.bSmoothYesNo << endl; + out << sfSettings.bXAxis_KM << endl; + + out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; + out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; + out << sfUI.m_sfLapOpts.bTractionCircle << endl; + out << sfUI.m_sfLapOpts.bXAxis_KM << endl; + out << sfUI.m_sfLapOpts.eSortPreference << endl; + out << sfUI.m_sfLapOpts.eUnitPreference << endl; + out << sfUI.m_sfLapOpts.e_Orientation << endl; + out << sfUI.m_sfLapOpts.fColorScheme << endl; + out << sfUI.m_sfLapOpts.fDrawGuides << endl; + out << sfUI.m_sfLapOpts.fDrawLines << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; + out << sfUI.m_sfLapOpts.fElapsedTime << endl; + out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; + out << sfUI.m_sfLapOpts.flWindowShiftX << endl; + out << sfUI.m_sfLapOpts.flWindowShiftY << endl; + out << sfUI.m_sfLapOpts.hWndLap << endl; + out << sfUI.m_sfLapOpts.iZoomLevels << endl; + + for (int i=0; i < 50; i++) + { + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points + } + out << "//" << endl; // End of file marker + out.close(); + } + + } +} + +int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI, int iRaceId[50]) +{ + TCHAR szTempPath[MAX_PATH]; + TCHAR szText[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + vector lines; + ifstream in; + in.open(szTempPath); + // Read in all of the lines of the "LatestSettings.txt" file at once, or it doesn't work right + // Store them in the 'lines' vector + for (int i = 0; i < 1000; i++) + { + string Line; + if(!in.eof() && !in.fail()) + { + getline(in, Line); + if (Line != "//") + { + lines.push_back(Line); + } + else + { + break; + } + } + else + { + break; + } + } + in.close(); + + // Now let's process the information and load it in the sfUI data structure + string Line = lines[0]; + int t; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath + } + for (t=0; t<50; t++) // Load the RaceID's to be displayed + { + Line = lines[t+1]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + iRaceId[t] = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + } + } + if ( !_wcsnicmp(szText, szDBPath, NUMCHARS(szText)) ) // If opened file is the same as the last opened file, load previous settings for Pitside + { + // If not break and load default settings + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // LLoad the boolean for accel smoothing into LapOpts data structuree + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + // sfUI.m_sfLapOpts.hWndLap = (HWND)_wtoi(c_Name); // Load the Lap Handle into sfSettings data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure + } + + int arraycounter = 1; + for (int i = t++; i < lines.size(); i+=13) + { + Line = lines[i]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel + } + + Line = lines[i+1]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel + } + + Line = lines[i+2]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+3]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel + } + + Line = lines[i+4]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel + } + + Line = lines[i+5]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel + } + + Line = lines[i+6]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel + } + + Line = lines[i+7]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel + } + + Line = lines[i+8]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+9]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+10]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times + } + + Line = lines[i+11]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+12]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points + } + arraycounter++; + } + } + + in.close(); + } + return 1; +} + // Converts ANSI strings to UNICODE strings BOOL AnsiToUnicode( LPSTR pszAnsiString, LPWSTR pszwUniBuff, DWORD dwUniBuffSize ) { @@ -3805,10 +4235,13 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine TCHAR wCmdLine[MAX_PATH] = {NULL}; AnsiToUnicode(lpCmdLine, wCmdLine, sizeof(wCmdLine)); // Convert ANSI command line to UNICODE command + PITSIDE_SETTINGS sfSettings; + LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file + if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line { return UnitTests(); -// DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); + DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); } else if( str_ends_with( wCmdLine, L".wflp\"") ) // Check if user clicked on an associated WFLP file and load it { @@ -3826,14 +4259,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } // Now let's put the file name/path into our loading string, szDBPath wcsncat(szDBPath, szLoadFileName, NUMCHARS(szLoadFileName)); -// _snwprintf(szTemp, NUMCHARS(szTemp), L"Start = %i End = %i\n szDBPath= %s\n szLoadFileName = %s\n wCmdLine= %s", start, end, szDBPath, szLoadFileName, wCmdLine); -// DWORD dwRet = MessageBox(NULL,szTemp,L"Load File", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); } else { -// _snwprintf(szTemp, NUMCHARS(szTemp), L"wCmdLine= %s", wCmdLine); -// DWORD dwRet = MessageBox(NULL,szTemp,L"New File", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); - wcscat(szDBPath,L"NewDatabase.wflp"); + wcscat(szDBPath,L"NewDatabase.wflp"); // Retrieve last file failed. Load a new database if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { // let's make sure there's a .wflp suffix on that bugger. @@ -3854,23 +4283,70 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { if(!fFileIsNew) { - // show the race-selection dialog - RACESELECT_RESULT sfRaceResult; - CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); - ::ArtShowDialog(&sfRaceSelect); - if(!sfRaceResult.fCancelled) - { - for (int z = 0; z < 50; z++) + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + vector lines; + ifstream in; + if ( DoesFileExist(szTempPath) ) // Make sure that the file exists before opening it { - iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + in.open(szTempPath); + // Read in the first line of the "LatestSettings.txt" file + // Store them in the 'lines' vector + string Line; + if(!in.eof() && !in.fail()) + { + getline(in, Line); + if (Line != "//") + { + lines.push_back(Line); + } + } + in.close(); + TCHAR szText[MAX_PATH]; + + // Now let's process the information and load it in the sfUI data structure + { + string Line = lines[0]; + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath + } + if (!wcsncmp( szText, szDBPath, NUMCHARS(szDBPath) )) // Opening the same file, so load see if user wants to return to previous session + { + // TCHAR szMsg[MAX_PATH] = L"Do you want to pick up where you left off?"; + int iRet = MessageBoxW(NULL,L"Do you want to pick up where you left off?",L"Database loaded previously",MB_ICONERROR | MB_YESNO); + if(iRet == IDYES) + { + LoadSettings(szDBPath, sfSettings, sfUI, iRaceId); // Let's load as many preferences and current settings as we can from the last instance run + // iRaceId has all of the previous race sessions + fDBOpened = true; + } + } } - fDBOpened = true; - } - else - { - iRaceId[0] = -1; - fDBOpened = true; - } + else + { + // show the race-selection dialog + RACESELECT_RESULT sfRaceResult; + CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); + ::ArtShowDialog(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + } + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + fDBOpened = true; + } + } + } } else { @@ -3906,13 +4382,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything - sfUI.SetDisplayOptions(x_sfLapOpts); -// LAPSUPPLIEROPTIONS m_sfLapOpts; //sfLapOpts contains all lap display options - LAPSUPPLIEROPTIONS& px_sfLapOpts(x_sfLapOpts); //sfLapOpts contains all lap display options +// sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer - PITSIDE_SETTINGS sfSettings; - LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file - switch (sfSettings.iVelocity) { case 0: @@ -4033,65 +4504,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ArtShowDialog(&sfUI); // Exiting the program. - // Let's save as many preferences and current settings as we can for next execution cycle before closing - TCHAR szTempPath[MAX_PATH]; - if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) - { - wcscat(szTempPath,L"LatestSettings.txt"); - -// LoadPitsideSettings(&sfSettings); - wofstream out; - out.open(szTempPath); - if(!out.eof() && !out.fail()) - { - out << sfSettings.fRunHTTP << endl; - out << sfSettings.iHTTPPort << endl; - out << sfSettings.iVelocity << endl; - out << sfSettings.iMapLines << endl; - out << sfSettings.iColorScheme << endl; - out << sfSettings.bSmoothYesNo << endl; - out << sfSettings.bXAxis_KM << endl; - - out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; - out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; - out << sfUI.m_sfLapOpts.bTractionCircle << endl; - out << sfUI.m_sfLapOpts.bXAxis_KM << endl; - out << sfUI.m_sfLapOpts.eSortPreference << endl; - out << sfUI.m_sfLapOpts.eUnitPreference << endl; - out << sfUI.m_sfLapOpts.e_Orientation << endl; - out << sfUI.m_sfLapOpts.fColorScheme << endl; - out << sfUI.m_sfLapOpts.fDrawGuides << endl; - out << sfUI.m_sfLapOpts.fDrawLines << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; - out << sfUI.m_sfLapOpts.fElapsedTime << endl; - out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; - out << sfUI.m_sfLapOpts.flWindowShiftX << endl; - out << sfUI.m_sfLapOpts.flWindowShiftY << endl; - out << sfUI.m_sfLapOpts.hWndLap << endl; - out << sfUI.m_sfLapOpts.iZoomLevels << endl; - - for (int i=0; i < 50; i++) - { -// out << x_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points - } - - out.close(); - } - - } + SaveSettings(szDBPath, sfSettings, sfUI, iRaceId); // Let's save as many preferences and current settings as we can for next execution cycle before closing exit(0); // } From 93d229d29b41bd1fabdaf61389651198fa3be919 Mon Sep 17 00:00:00 2001 From: Keith Date: Mon, 19 Sep 2016 06:05:36 -0700 Subject: [PATCH 089/112] More Pitside saving coding --- .../PitsideConsole/PitsideConsole.cpp | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index fa06c7e..232ad2c 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3884,7 +3884,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI copy(Line.begin(), Line.end(), c_Name); swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath } - for (t=0; t<50; t++) // Load the RaceID's to be displayed + for (t=1; t<51; t++) // Load the RaceID's to be displayed { Line = lines[t+1]; { @@ -3894,7 +3894,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI iRaceId[t] = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure } } - if ( !_wcsnicmp(szText, szDBPath, NUMCHARS(szText)) ) // If opened file is the same as the last opened file, load previous settings for Pitside + if ( _wcsnicmp(szText, szDBPath, NUMCHARS(szText)) == 0 ) // If opened file is the same as the last opened file, load previous settings for Pitside { // If not break and load default settings Line = lines[t++]; @@ -4090,7 +4090,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI } int arraycounter = 1; - for (int i = t++; i < lines.size(); i+=13) + for (int i = t++; i < lines.size() && arraycounter < 50; i+=13) { Line = lines[i]; { @@ -4314,7 +4314,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine copy(Line.begin(), Line.end(), c_Name); swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath } - if (!wcsncmp( szText, szDBPath, NUMCHARS(szDBPath) )) // Opening the same file, so load see if user wants to return to previous session + if ( _wcsnicmp( szText, szDBPath, NUMCHARS(szDBPath) ) == 0 ) // Opening the same file, so load see if user wants to return to previous session { // TCHAR szMsg[MAX_PATH] = L"Do you want to pick up where you left off?"; int iRet = MessageBoxW(NULL,L"Do you want to pick up where you left off?",L"Database loaded previously",MB_ICONERROR | MB_YESNO); @@ -4325,6 +4325,26 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine fDBOpened = true; } } + else + { + // show the race-selection dialog + RACESELECT_RESULT sfRaceResult; + CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); + ::ArtShowDialog(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + } + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + fDBOpened = true; + } + } } else { From 28b291d6bd67ad9e9e4c806df0e3a6f7bdc4fa07 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Tue, 20 Sep 2016 16:19:15 -0700 Subject: [PATCH 090/112] Save Settings interim coding. Saving settings and loading them, but not using them yet. --- .../PitsideConsole/PitsideConsole.cpp | 497 +++++++++++++++--- 1 file changed, 426 insertions(+), 71 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 09f1c4e..fe535ea 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3774,6 +3774,421 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) p_sfLapOpts.m_Tranformations[i].b_LoadTrans = false; } } + +void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI) +{ + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + wofstream out; + out.open(szTempPath); + if(!out.eof() && !out.fail()) + { + out << szDBPath << endl; // The file name for the database + out << sfSettings.fRunHTTP << endl; + out << sfSettings.iHTTPPort << endl; + out << sfSettings.iVelocity << endl; + out << sfSettings.iMapLines << endl; + out << sfSettings.iColorScheme << endl; + out << sfSettings.bSmoothYesNo << endl; + out << sfSettings.bXAxis_KM << endl; + + out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; + out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; + out << sfUI.m_sfLapOpts.bTractionCircle << endl; + out << sfUI.m_sfLapOpts.bXAxis_KM << endl; + out << sfUI.m_sfLapOpts.eSortPreference << endl; + out << sfUI.m_sfLapOpts.eUnitPreference << endl; + out << sfUI.m_sfLapOpts.e_Orientation << endl; + out << sfUI.m_sfLapOpts.fColorScheme << endl; + out << sfUI.m_sfLapOpts.fDrawGuides << endl; + out << sfUI.m_sfLapOpts.fDrawLines << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; + out << sfUI.m_sfLapOpts.fElapsedTime << endl; + out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; + out << sfUI.m_sfLapOpts.flWindowShiftX << endl; + out << sfUI.m_sfLapOpts.flWindowShiftY << endl; + out << sfUI.m_sfLapOpts.hWndLap << endl; + out << sfUI.m_sfLapOpts.iZoomLevels << endl; + + for (int i=0; i < 50; i++) + { + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 + out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times + out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; + out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points + } + out << "//" << endl; // End of file marker + out.close(); + } + + } +} + +int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI) +{ + TCHAR szTempPath[MAX_PATH]; + TCHAR szText[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + vector lines; + ifstream in; + in.open(szTempPath); + // Read in all of the lines of the "LatestSettings.txt" file at once, or it doesn't work right + // Store them in the 'lines' vector + for (int i = 0; i < 1000; i++) + { + string Line; + if(!in.eof() && !in.fail()) + { + getline(in, Line); + if (Line != "//") + { + lines.push_back(Line); + } + else + { + break; + } + } + else + { + break; + } + } + in.close(); + + // Now let's process the information and load it in the sfUI data structure + string Line = lines[0]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath + } + if ( !_wcsnicmp(szText, szDBPath, NUMCHARS(szText)) ) // If opened file is the same as the last opened file, load previous settings for Pitside + { + // If not break and load default settings + Line = lines[1]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + } + + Line = lines[2]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure + } + + Line = lines[3]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure + } + + Line = lines[4]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure + } + + Line = lines[5]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure + } + + Line = lines[6]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure + } + + Line = lines[7]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure + } + + Line = lines[8]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure + } + + Line = lines[9]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // LLoad the boolean for accel smoothing into LapOpts data structuree + } + + Line = lines[10]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure + } + + Line = lines[11]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure + } + + Line = lines[12]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure + } + + Line = lines[13]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure + } + + Line = lines[14]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure + } + + Line = lines[15]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure + } + + Line = lines[16]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure + } + + Line = lines[17]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure + } + + Line = lines[18]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure + } + + Line = lines[19]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure + } + + Line = lines[20]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure + } + + Line = lines[21]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure + } + + Line = lines[22]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure + } + + Line = lines[23]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + // sfUI.m_sfLapOpts.hWndLap = (HWND)_wtoi(c_Name); // Load the Lap Handle into sfSettings data structure + } + + Line = lines[24]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure + } + + int arraycounter = 1; + for (int i = 25; i < lines.size(); i+=13) + { + Line = lines[i]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel + } + + Line = lines[i+1]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel + } + + Line = lines[i+2]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+3]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel + } + + Line = lines[i+4]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel + } + + Line = lines[i+5]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel + } + + Line = lines[i+6]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel + } + + Line = lines[i+7]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel + } + + Line = lines[i+8]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+9]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+10]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times + } + + Line = lines[i+11]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+12]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points + } + arraycounter++; + } + } + + in.close(); + } + return 1; +} + // Converts ANSI strings to UNICODE strings BOOL AnsiToUnicode( LPSTR pszAnsiString, LPWSTR pszwUniBuff, DWORD dwUniBuffSize ) { @@ -3805,10 +4220,13 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine TCHAR wCmdLine[MAX_PATH] = {NULL}; AnsiToUnicode(lpCmdLine, wCmdLine, sizeof(wCmdLine)); // Convert ANSI command line to UNICODE command + PITSIDE_SETTINGS sfSettings; + LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file + if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line { return UnitTests(); -// DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); + DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); } else if( str_ends_with( wCmdLine, L".wflp\"") ) // Check if user clicked on an associated WFLP file and load it { @@ -3826,14 +4244,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } // Now let's put the file name/path into our loading string, szDBPath wcsncat(szDBPath, szLoadFileName, NUMCHARS(szLoadFileName)); -// _snwprintf(szTemp, NUMCHARS(szTemp), L"Start = %i End = %i\n szDBPath= %s\n szLoadFileName = %s\n wCmdLine= %s", start, end, szDBPath, szLoadFileName, wCmdLine); -// DWORD dwRet = MessageBox(NULL,szTemp,L"Load File", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); } else { -// _snwprintf(szTemp, NUMCHARS(szTemp), L"wCmdLine= %s", wCmdLine); -// DWORD dwRet = MessageBox(NULL,szTemp,L"New File", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); - wcscat(szDBPath,L"NewDatabase.wflp"); + wcscat(szDBPath,L"NewDatabase.wflp"); // Retrieve last file failed. Load a new database if(ArtGetSaveFileName(NULL,L"Select .wflp to open or save to",szDBPath,NUMCHARS(szDBPath),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) { // let's make sure there's a .wflp suffix on that bugger. @@ -3848,6 +4262,10 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } } + if( DoesFileExist(szDBPath) ) // File exists, so load it and return back to where you last left off + { + LoadSettings(szDBPath, sfSettings, sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing + } const bool fFileIsNew = !DoesFileExist(szDBPath); // they chose one to open, so open it. if(sfLaps.Init(szDBPath)) @@ -3906,13 +4324,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything - sfUI.SetDisplayOptions(x_sfLapOpts); -// LAPSUPPLIEROPTIONS m_sfLapOpts; //sfLapOpts contains all lap display options - LAPSUPPLIEROPTIONS& px_sfLapOpts(x_sfLapOpts); //sfLapOpts contains all lap display options +// sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer - PITSIDE_SETTINGS sfSettings; - LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file - switch (sfSettings.iVelocity) { case 0: @@ -4033,65 +4446,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ArtShowDialog(&sfUI); // Exiting the program. - // Let's save as many preferences and current settings as we can for next execution cycle before closing - TCHAR szTempPath[MAX_PATH]; - if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) - { - wcscat(szTempPath,L"LatestSettings.txt"); - -// LoadPitsideSettings(&sfSettings); - wofstream out; - out.open(szTempPath); - if(!out.eof() && !out.fail()) - { - out << sfSettings.fRunHTTP << endl; - out << sfSettings.iHTTPPort << endl; - out << sfSettings.iVelocity << endl; - out << sfSettings.iMapLines << endl; - out << sfSettings.iColorScheme << endl; - out << sfSettings.bSmoothYesNo << endl; - out << sfSettings.bXAxis_KM << endl; - - out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; - out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; - out << sfUI.m_sfLapOpts.bTractionCircle << endl; - out << sfUI.m_sfLapOpts.bXAxis_KM << endl; - out << sfUI.m_sfLapOpts.eSortPreference << endl; - out << sfUI.m_sfLapOpts.eUnitPreference << endl; - out << sfUI.m_sfLapOpts.e_Orientation << endl; - out << sfUI.m_sfLapOpts.fColorScheme << endl; - out << sfUI.m_sfLapOpts.fDrawGuides << endl; - out << sfUI.m_sfLapOpts.fDrawLines << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; - out << sfUI.m_sfLapOpts.fElapsedTime << endl; - out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; - out << sfUI.m_sfLapOpts.flWindowShiftX << endl; - out << sfUI.m_sfLapOpts.flWindowShiftY << endl; - out << sfUI.m_sfLapOpts.hWndLap << endl; - out << sfUI.m_sfLapOpts.iZoomLevels << endl; - - for (int i=0; i < 50; i++) - { -// out << x_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points - } - - out.close(); - } - - } + SaveSettings(szDBPath, sfSettings, sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing exit(0); // } From 99e7c9c41c5021a95d05ebd28724a7042cdebca5 Mon Sep 17 00:00:00 2001 From: Keith Date: Tue, 20 Sep 2016 22:03:22 -0700 Subject: [PATCH 091/112] More save settings coding --- .../PitsideConsole/PitsideConsole.cpp | 553 +++++++++--------- 1 file changed, 287 insertions(+), 266 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 232ad2c..3c8997b 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3650,6 +3650,7 @@ void UpdateDisplays() ArtListBox m_sfYAxis; ArtListBox m_sfLapList; ArtListBox m_sfListBox; + int m_iRaceId[50]; // Made public by KDJ private: ArtListBox m_sfXAxis; @@ -3691,7 +3692,7 @@ void UpdateDisplays() vector m_lstMulticast; MCResponder m_sfResponder; - int m_iRaceId[50]; +// int m_iRaceId[50]; ILapSupplier* z_ILapSupplier; }; @@ -3775,7 +3776,7 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) } } -void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI, int iRaceId[50]) +void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) { TCHAR szTempPath[MAX_PATH]; if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) @@ -3789,49 +3790,52 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI out << szDBPath << endl; // The file name for the database for (int t=0; t<50; t++) // Save the RaceID's currently displayed { - out << iRaceId[t] << endl; + out << sfUI->m_iRaceId[t] << endl; +// TCHAR szText[MAX_PATH]={0}; +// swprintf(szText, NUMCHARS(szText), L"%d", sfUI.m_sfLapOpts.hWndLap[t]); +// out << szText << endl; + out << sfUI->m_sfLapOpts.hWndLap[t] << endl; } - out << sfSettings.fRunHTTP << endl; - out << sfSettings.iHTTPPort << endl; - out << sfSettings.iVelocity << endl; - out << sfSettings.iMapLines << endl; - out << sfSettings.iColorScheme << endl; - out << sfSettings.bSmoothYesNo << endl; - out << sfSettings.bXAxis_KM << endl; - - out << sfUI.m_sfLapOpts.bShowReferenceLap << endl; - out << sfUI.m_sfLapOpts.bSmoothYesNo << endl; - out << sfUI.m_sfLapOpts.bTractionCircle << endl; - out << sfUI.m_sfLapOpts.bXAxis_KM << endl; - out << sfUI.m_sfLapOpts.eSortPreference << endl; - out << sfUI.m_sfLapOpts.eUnitPreference << endl; - out << sfUI.m_sfLapOpts.e_Orientation << endl; - out << sfUI.m_sfLapOpts.fColorScheme << endl; - out << sfUI.m_sfLapOpts.fDrawGuides << endl; - out << sfUI.m_sfLapOpts.fDrawLines << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; - out << sfUI.m_sfLapOpts.fElapsedTime << endl; - out << sfUI.m_sfLapOpts.fIOIOHardcoded << endl; - out << sfUI.m_sfLapOpts.flWindowShiftX << endl; - out << sfUI.m_sfLapOpts.flWindowShiftY << endl; - out << sfUI.m_sfLapOpts.hWndLap << endl; - out << sfUI.m_sfLapOpts.iZoomLevels << endl; + out << sfSettings->fRunHTTP << endl; + out << sfSettings->iHTTPPort << endl; + out << sfSettings->iVelocity << endl; + out << sfSettings->iMapLines << endl; + out << sfSettings->iColorScheme << endl; + out << sfSettings->bSmoothYesNo << endl; + out << sfSettings->bXAxis_KM << endl; + + out << sfUI->m_sfLapOpts.bShowReferenceLap << endl; + out << sfUI->m_sfLapOpts.bSmoothYesNo << endl; + out << sfUI->m_sfLapOpts.bTractionCircle << endl; + out << sfUI->m_sfLapOpts.bXAxis_KM << endl; + out << sfUI->m_sfLapOpts.eSortPreference << endl; + out << sfUI->m_sfLapOpts.eUnitPreference << endl; + out << sfUI->m_sfLapOpts.e_Orientation << endl; + out << sfUI->m_sfLapOpts.fColorScheme << endl; + out << sfUI->m_sfLapOpts.fDrawGuides << endl; + out << sfUI->m_sfLapOpts.fDrawLines << endl; + out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; + out << sfUI->m_sfLapOpts.fElapsedTime << endl; + out << sfUI->m_sfLapOpts.fIOIOHardcoded << endl; + out << sfUI->m_sfLapOpts.flWindowShiftX << endl; + out << sfUI->m_sfLapOpts.flWindowShiftY << endl; + out << sfUI->m_sfLapOpts.iZoomLevels << endl; for (int i=0; i < 50; i++) { - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 - out << sfUI.m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times - out << sfUI.m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; - out << sfUI.m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; + out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points } out << "//" << endl; // End of file marker out.close(); @@ -3840,7 +3844,7 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI } } -int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI sfUI, int iRaceId[50]) +int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) { TCHAR szTempPath[MAX_PATH]; TCHAR szText[MAX_PATH]; @@ -3884,319 +3888,315 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS sfSettings, CMainUI copy(Line.begin(), Line.end(), c_Name); swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath } - for (t=1; t<51; t++) // Load the RaceID's to be displayed + for (t=0; t<50; t++) // Load the RaceID's to be displayed { - Line = lines[t+1]; + Line = lines[2*t+1]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - iRaceId[t] = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + sfUI->m_iRaceId[t] = _wtoi(c_Name); // Load the last Race session ID's into Pitside Console for loading and display } - } - if ( _wcsnicmp(szText, szDBPath, NUMCHARS(szText)) == 0 ) // If opened file is the same as the last opened file, load previous settings for Pitside - { - // If not break and load default settings - Line = lines[t++]; + + Line = lines[2*t+2]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfSettings.fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + sfUI->m_sfLapOpts.hWndLap[t] = (HWND)_wtol(c_Name); // Load the Lap Handle into sfSettings data structure } + } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings.iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings.iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings.iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings.iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // LLoad the boolean for accel smoothing into LapOpts data structuree - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // LLoad the boolean for accel smoothing into LapOpts data structuree + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure + } - Line = lines[t++]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure - } + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure + } - Line = lines[t++]; + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure + } + + Line = lines[t++]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure + } + + int arraycounter = 1; + for (int i = t++; i < lines.size() && arraycounter < 50; i+=13) + { + Line = lines[i]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel } - Line = lines[t++]; + Line = lines[i+1]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel } - Line = lines[t++]; + Line = lines[i+2]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel } - Line = lines[t++]; + Line = lines[i+3]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel } - Line = lines[t++]; + Line = lines[i+4]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel } - Line = lines[t++]; + Line = lines[i+5]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel } - Line = lines[t++]; + Line = lines[i+6]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel } - Line = lines[t++]; + Line = lines[i+7]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel } - Line = lines[t++]; + Line = lines[i+8]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points } - Line = lines[t++]; + Line = lines[i+9]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points } - Line = lines[t++]; + Line = lines[i+10]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times } - Line = lines[t++]; + Line = lines[i+11]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - // sfUI.m_sfLapOpts.hWndLap = (HWND)_wtoi(c_Name); // Load the Lap Handle into sfSettings data structure + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel } - Line = lines[t++]; + Line = lines[i+12]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure + sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points } - - int arraycounter = 1; - for (int i = t++; i < lines.size() && arraycounter < 50; i+=13) - { - Line = lines[i]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel - } - - Line = lines[i+1]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel - } - - Line = lines[i+2]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel - } - - Line = lines[i+3]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel - } - - Line = lines[i+4]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel - } - - Line = lines[i+5]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel - } - - Line = lines[i+6]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel - } - - Line = lines[i+7]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel - } - - Line = lines[i+8]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points - } - - Line = lines[i+9]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points - } - - Line = lines[i+10]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times - } - - Line = lines[i+11]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel - } - - Line = lines[i+12]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI.m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points - } - arraycounter++; - } + arraycounter++; } in.close(); @@ -4237,6 +4237,11 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine PITSIDE_SETTINGS sfSettings; LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file + LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options + InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything +// sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer + sfUI.SetRaceId(&iRaceId[0]); + if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line { @@ -4320,10 +4325,33 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine int iRet = MessageBoxW(NULL,L"Do you want to pick up where you left off?",L"Database loaded previously",MB_ICONERROR | MB_YESNO); if(iRet == IDYES) { - LoadSettings(szDBPath, sfSettings, sfUI, iRaceId); // Let's load as many preferences and current settings as we can from the last instance run - // iRaceId has all of the previous race sessions + LoadSettings(szDBPath, &sfSettings, &sfUI); // Let's overwrite the default preferences with the settings from the last instance run + for (int t=0; t<50; t++) + { + iRaceId[t]=sfUI.m_iRaceId[t]; + } fDBOpened = true; } + else + { + // show the race-selection dialog + RACESELECT_RESULT sfRaceResult; + CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); + ::ArtShowDialog(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + } + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + fDBOpened = true; + } + } } else { @@ -4395,15 +4423,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine MessageBox(NULL,L"Pitside was unable to create a database to save data to. Is your hard drive full?",L"Failed to create DB",MB_ICONERROR); exit(0); } - sfUI.SetRaceId(&iRaceId[0]); - - g_pLapDB = &sfLaps; - LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options - InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything -// sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer - switch (sfSettings.iVelocity) { case 0: @@ -4524,7 +4545,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine ArtShowDialog(&sfUI); // Exiting the program. - SaveSettings(szDBPath, sfSettings, sfUI, iRaceId); // Let's save as many preferences and current settings as we can for next execution cycle before closing + SaveSettings(szDBPath, &sfSettings, &sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing exit(0); // } From 8689df382c62b179c023be216b8c3b61f4f2f0b2 Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 23 Sep 2016 06:32:15 -0700 Subject: [PATCH 092/112] More save settings coding --- PitsideConsole/PitsideConsole/LapData.h | 3 +- .../PitsideConsole/PitsideConsole.cpp | 74 ++++++++++++++++++- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 0aca648..4f80aa7 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -230,10 +230,11 @@ static bool SetDistance(int b_KmOrLat) // Function to set X-Axis units in either private: ILapReceiver* m_pLapDB; CExtendedLap* m_pReferenceLap; - const ILap* m_pLap; +// const ILap* m_pLap; // Made public by KDJ SYSTEMTIME m_tmRecv; // when was this thing constructed? SYSTEMTIME m_tmStart; // when was this thing started on-track? public: + const ILap* m_pLap; vector m_lstPoints; // Made public by KDJ // mutable map m_mapChannels; // we own these pointers. We get them allocated in ComputeLapData, and it is our responsibility to get them de-allocated diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 3c8997b..d461f6f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3647,7 +3647,9 @@ void UpdateDisplays() } public: vector m_lstYChannels; + DATA_CHANNEL m_eXChannel; // Made public by KDJ ArtListBox m_sfYAxis; + CExtendedLap* m_pReferenceLap; ArtListBox m_sfLapList; ArtListBox m_sfListBox; int m_iRaceId[50]; // Made public by KDJ @@ -3663,7 +3665,7 @@ void UpdateDisplays() map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls LAPDISPLAYSTYLE m_eLapDisplayStyle; - DATA_CHANNEL m_eXChannel; +// DATA_CHANNEL m_eXChannel; // vector m_lstYChannels; bool m_fShowTractionCircle; bool m_fSmooth; @@ -3671,7 +3673,7 @@ void UpdateDisplays() bool m_fShowDriverBests; bool m_fShowReferenceLap; - CExtendedLap* m_pReferenceLap; +// CExtendedLap* m_pReferenceLap; // Made public by KDJ map m_mapLaps; // maps from iLapId to a lap object HWND m_hWnd; @@ -3837,6 +3839,22 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points } + + set setSelectedLaps = sfUI->m_sfLapList.GetSelectedItemsData3(); // First let's get the list of selected laps + vector lstLaps; + for(set::iterator i = setSelectedLaps.begin(); i != setSelectedLaps.end(); i++) + { + CExtendedLap* pLap = (CExtendedLap*)*i; + lstLaps.push_back(pLap); + out << lstLaps[0] << endl; // Load the list of Laps to display + } + out << L"End_of_Laps" << endl; + + out << sfUI->m_eXChannel << endl; // Save X-Axis data channel + for (int i=0; i < sfUI->m_lstYChannels.size(); i++) // Save the list of selected Y-Axis channels + { + out << sfUI->m_lstYChannels[i] << endl; // Save the list of selected Y-Axis channels + } out << "//" << endl; // End of file marker out.close(); } @@ -3906,6 +3924,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI sfUI->m_sfLapOpts.hWndLap[t] = (HWND)_wtol(c_Name); // Load the Lap Handle into sfSettings data structure } } + t = 2*t+1; // Move the line counter forward Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; @@ -4198,6 +4217,57 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI } arraycounter++; } + t = t + (arraycounter-1) * 13; // Reset the line counter to collect the next set of data +// t++; + + Line = lines[t]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_pReferenceLap->m_pLap->GetLapId(); // Load the X-Axis data channel + } + t++; + + for (t; t < lines.size(); t++) // Load the list of selected Laps + { + Line = lines[t]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + if ( _wcsnicmp( c_Name, L"End_of_Laps", NUMCHARS(c_Name) ) != 0) + { + sfUI->m_sfLapList.GetSelectedItemsData3().insert((LPARAM)_wtoi(c_Name)); + } + else + { + break; + } + } + } + + t++; + Line = lines[t]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_eXChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the X-Axis data channel + } + t++; + + sfUI->m_lstYChannels.clear(); // Clear the current list of Data channels + for (t; t < lines.size(); t++ ) + { + Line = lines[t]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_lstYChannels.push_back( (DATA_CHANNEL)_wtoi(c_Name) ); // Load the Y-Axis data channels + } + } in.close(); } From acb6e18ca6045c7f7b4e3f69d9f696ab7470a284 Mon Sep 17 00:00:00 2001 From: Keith Date: Wed, 28 Sep 2016 06:22:51 -0700 Subject: [PATCH 093/112] More save settings coding. Things are sort of working now. --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index d461f6f..7d6f54e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3840,6 +3840,7 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points } + out << sfUI->m_pReferenceLap << endl; // Save the Reference Lap ID set setSelectedLaps = sfUI->m_sfLapList.GetSelectedItemsData3(); // First let's get the list of selected laps vector lstLaps; for(set::iterator i = setSelectedLaps.begin(); i != setSelectedLaps.end(); i++) @@ -4109,8 +4110,9 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI sfUI->m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure } - int arraycounter = 1; - for (int i = t++; i < lines.size() && arraycounter < 50; i+=13) + t++; + int arraycounter = 0; + for (int i = t; i < lines.size() && arraycounter < 50; i+=13) { Line = lines[i]; { @@ -4217,15 +4219,14 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI } arraycounter++; } - t = t + (arraycounter-1) * 13; // Reset the line counter to collect the next set of data -// t++; + t = t - 1 + (arraycounter) * 13; // Reset the line counter to collect the next set of data Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_pReferenceLap->m_pLap->GetLapId(); // Load the X-Axis data channel +// sfUI->m_pReferenceLap = (CExtendedLap*)_wtoi(c_Name); // Load the X-Axis data channel } t++; From 67bc3382f96eeb76490e80ab999102ed7ed9804b Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Thu, 29 Sep 2016 19:44:01 -0700 Subject: [PATCH 094/112] More save settings coding. Data channel saving and loading working, still need to work on menu loading --- .../PitsideConsole/PitsideConsole.cpp | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 7d6f54e..1e39c68 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3825,7 +3825,8 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU for (int i=0; i < 50; i++) { - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; // Save the Data Channel number + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; // Save the Data Channel Name out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 @@ -3925,7 +3926,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI sfUI->m_sfLapOpts.hWndLap[t] = (HWND)_wtol(c_Name); // Load the Lap Handle into sfSettings data structure } } - t = 2*t+1; // Move the line counter forward + t = 2*t + 1; // Move the line counter forward Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; @@ -4110,9 +4111,8 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI sfUI->m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure } - t++; - int arraycounter = 0; - for (int i = t; i < lines.size() && arraycounter < 50; i+=13) + int arraycounter = 0; // Now load the Plotting Preferences into the m_sfLapOpts.PlotPrefs array + for (int i = t; i < lines.size() && arraycounter < 50; i+=14) { Line = lines[i]; { @@ -4127,7 +4127,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel + swprintf(sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].m_ChannelName, NUMCHARS(sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].m_ChannelName), c_Name); // Load the data channel } Line = lines[i+2]; @@ -4135,7 +4135,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel } Line = lines[i+3]; @@ -4143,7 +4143,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel } Line = lines[i+4]; @@ -4151,7 +4151,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel } Line = lines[i+5]; @@ -4159,7 +4159,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel } Line = lines[i+6]; @@ -4167,7 +4167,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel } Line = lines[i+7]; @@ -4175,7 +4175,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel } Line = lines[i+8]; @@ -4183,7 +4183,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel } Line = lines[i+9]; @@ -4191,7 +4191,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points } Line = lines[i+10]; @@ -4199,7 +4199,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points } Line = lines[i+11]; @@ -4207,7 +4207,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times } Line = lines[i+12]; @@ -4215,11 +4215,20 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+13]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points +// x_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points } arraycounter++; } - t = t - 1 + (arraycounter) * 13; // Reset the line counter to collect the next set of data + t = t + (arraycounter) * 14; // Reset the line counter to collect the next set of data Line = lines[t]; { @@ -4257,7 +4266,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI sfUI->m_eXChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the X-Axis data channel } t++; - + sfUI->m_lstYChannels.clear(); // Clear the current list of Data channels for (t; t < lines.size(); t++ ) { @@ -4269,7 +4278,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI sfUI->m_lstYChannels.push_back( (DATA_CHANNEL)_wtoi(c_Name) ); // Load the Y-Axis data channels } } - + in.close(); } return 1; @@ -4310,7 +4319,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything -// sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer + sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer sfUI.SetRaceId(&iRaceId[0]); @@ -4571,7 +4580,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap - sfUI.SetDisplayOptions(x_sfLapOpts); +// sfUI.SetDisplayOptions(x_sfLapOpts); sfUI.SetDBPath(szDBPath); PitsideHTTP aResponder(g_pLapDB,&sfUI); From d9cd39e5e2eb12d981c365c8969b541549c43cf1 Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 30 Sep 2016 06:44:09 -0700 Subject: [PATCH 095/112] Basic settings loading now working. --- PitsideConsole/PitsideConsole/DlgPlotSelect.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp index 03c0b2e..5bde56e 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp @@ -192,7 +192,7 @@ vector GetAllLaps() case WM_INITDIALOG: { // Initialize all data channels, if not already set by user. - if (m_sfLapOpts->m_PlotPrefs[1].m_ChannelName[512] == m_sfLapOpts->m_PlotPrefs[0].m_ChannelName[512]) +// if (m_sfLapOpts->m_PlotPrefs[1].m_ChannelName[512] == m_sfLapOpts->m_PlotPrefs[0].m_ChannelName[512]) { InitPlotPrefs(hWnd, lParam); LoadTransformations(*m_sfLapOpts); // Load transformations from "Transformations.txt" file @@ -207,11 +207,11 @@ vector GetAllLaps() } } - else +// else { set setAvailable; - SetPlotPrefs(hWnd, setAvailable); - LoadDropDown(hWnd); // Now load those names into drop down list for selection +// SetPlotPrefs(hWnd, setAvailable); +// LoadDropDown(hWnd); // Now load those names into drop down list for selection } return TRUE; } From 87e53a11e8d15fbedcfe28936001a1a0d6626512 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Fri, 30 Sep 2016 16:09:51 -0700 Subject: [PATCH 096/112] 2.004.0014: Save settings coding added when re-opening the previous databasse --- .../PitsideConsole/PitsideConsole.cpp | 17 ++++++++++++++--- PitsideConsole/PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 1e39c68..df296d8 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3789,7 +3789,7 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU out.open(szTempPath); if(!out.eof() && !out.fail()) { - out << szDBPath << endl; // The file name for the database + out << sfUI->m_szPath << endl; // The file name for the database for (int t=0; t<50; t++) // Save the RaceID's currently displayed { out << sfUI->m_iRaceId[t] << endl; @@ -3906,7 +3906,8 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath + swprintf(sfUI->m_szPath, NUMCHARS(sfUI->m_szPath), c_Name); // Load name of last-processed file in sfUI Pointer for szDBPath +// swprintf(szDBPath, NUMCHARS(c_Name), c_Name); // Load name of last-processed file in szDBPath } for (t=0; t<50; t++) // Load the RaceID's to be displayed { @@ -4423,12 +4424,14 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine for (int z = 0; z < 50; z++) { iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer } fDBOpened = true; } else { iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; fDBOpened = true; } } @@ -4444,12 +4447,14 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine for (int z = 0; z < 50; z++) { iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer } fDBOpened = true; } else { iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; fDBOpened = true; } } @@ -4465,12 +4470,14 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine for (int z = 0; z < 50; z++) { iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer } fDBOpened = true; } else { iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; fDBOpened = true; } } @@ -4479,6 +4486,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine else { iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; fDBOpened = true; } } @@ -4494,9 +4502,11 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine // success! wcscpy(szDBPath,szTempPath); iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; fDBOpened = true; } } + if(!fDBOpened) { // disaster. @@ -4581,7 +4591,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap // sfUI.SetDisplayOptions(x_sfLapOpts); - sfUI.SetDBPath(szDBPath); +// sfUI.SetDBPath(szDBPath); + swprintf(sfUI.m_szPath, NUMCHARS(sfUI.m_szPath), szDBPath); // Load name of the chosen file into the sfUI pointer PitsideHTTP aResponder(g_pLapDB,&sfUI); if(sfSettings.fRunHTTP && sfSettings.iHTTPPort > 0 && sfSettings.iHTTPPort < 65536) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 8694bf7..b44119e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0013\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0014\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From e533c4566c0ea92db0d46507d733ea74355ed6fa Mon Sep 17 00:00:00 2001 From: Keith Date: Mon, 3 Oct 2016 21:27:18 -0700 Subject: [PATCH 097/112] Reference Lap saving routine added --- .../PitsideConsole/DlgPlotSelect.cpp | 13 +--- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 1 + .../PitsideConsole/PitsideConsole.cpp | 60 +++++++++---------- 3 files changed, 31 insertions(+), 43 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp index 5bde56e..48d63f2 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp @@ -191,9 +191,7 @@ vector GetAllLaps() { case WM_INITDIALOG: { - // Initialize all data channels, if not already set by user. -// if (m_sfLapOpts->m_PlotPrefs[1].m_ChannelName[512] == m_sfLapOpts->m_PlotPrefs[0].m_ChannelName[512]) - { + // Initialize all data channels, if not already set by user. InitPlotPrefs(hWnd, lParam); LoadTransformations(*m_sfLapOpts); // Load transformations from "Transformations.txt" file LoadDropDown(hWnd); // Now load those names into drop down list for selection @@ -206,14 +204,9 @@ vector GetAllLaps() SendMessage(hWndComboBox, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); } - } -// else - { set setAvailable; -// SetPlotPrefs(hWnd, setAvailable); -// LoadDropDown(hWnd); // Now load those names into drop down list for selection - } - return TRUE; + SetPlotPrefs(hWnd, setAvailable); + return TRUE; } case WM_COMMAND: diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index 2c265de..f60b9ad 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -120,6 +120,7 @@ struct LAPSUPPLIEROPTIONS bool bSmoothYesNo; // Whether or not to smooth the accelerometer graphs bool bShowReferenceLap; // Whether or not the Reference Lap is displayed ORIENTATION e_Orientation; // Phone orientation when installed in the car + int LapId; }; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index df296d8..746c8f8 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -626,7 +626,28 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfSubDisplay.Init(GetDlgItem(m_hWnd,IDC_SUBDISPLAY)); m_sfTractionDisplay.Init(GetDlgItem(m_hWnd,IDC_TRACTIONCIRCLEMAP)); - set setAvailable; + LoadLaps(g_pLapDB); + if (m_sfLapOpts.LapId != 0) // Reference lap needs to be loaded. Identify which one it is and set it + { + for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + if(i->second->GetLap()->GetLapId() == m_sfLapOpts.LapId) + { + m_pReferenceLap = i->second; // Set the Reference lap to this lap + } + } + m_pReferenceLap->ComputeDistances(NULL, g_pLapDB); // Now recompute distances, based upon this Reference Lap + for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + if(i->second != m_pReferenceLap) + { + i->second->ComputeDistances(m_pReferenceLap, g_pLapDB); // tell this lap to recompute using pLap as the reference lap + } + } + } + + + set setAvailable; InitAxes(setAvailable); LoadLaps(::g_pLapDB); UpdateUI(UPDATE_ALL); @@ -3841,17 +3862,8 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points } - out << sfUI->m_pReferenceLap << endl; // Save the Reference Lap ID - set setSelectedLaps = sfUI->m_sfLapList.GetSelectedItemsData3(); // First let's get the list of selected laps - vector lstLaps; - for(set::iterator i = setSelectedLaps.begin(); i != setSelectedLaps.end(); i++) - { - CExtendedLap* pLap = (CExtendedLap*)*i; - lstLaps.push_back(pLap); - out << lstLaps[0] << endl; // Load the list of Laps to display - } - out << L"End_of_Laps" << endl; - + out << sfUI->m_pReferenceLap->m_pLap->GetLapId() << endl; // Save the Reference Lap ID + out << sfUI->m_eXChannel << endl; // Save X-Axis data channel for (int i=0; i < sfUI->m_lstYChannels.size(); i++) // Save the list of selected Y-Axis channels { @@ -4236,29 +4248,10 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); -// sfUI->m_pReferenceLap = (CExtendedLap*)_wtoi(c_Name); // Load the X-Axis data channel + sfUI->m_sfLapOpts.LapId = _wtoi(c_Name); // Get the LapId for the reference lap } + t++; - - for (t; t < lines.size(); t++) // Load the list of selected Laps - { - Line = lines[t]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - if ( _wcsnicmp( c_Name, L"End_of_Laps", NUMCHARS(c_Name) ) != 0) - { - sfUI->m_sfLapList.GetSelectedItemsData3().insert((LPARAM)_wtoi(c_Name)); - } - else - { - break; - } - } - } - - t++; Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; @@ -4322,6 +4315,7 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer sfUI.SetRaceId(&iRaceId[0]); + x_sfLapOpts.LapId = 0; if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line From c4c9ca7c3e50cb907c0d3173fd5467f943cce5bd Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Wed, 5 Oct 2016 10:13:48 -0700 Subject: [PATCH 098/112] Save settings code cleanup. --- .../PitsideConsole/PitsideConsole.cpp | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 746c8f8..417304a 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3814,10 +3814,6 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU for (int t=0; t<50; t++) // Save the RaceID's currently displayed { out << sfUI->m_iRaceId[t] << endl; -// TCHAR szText[MAX_PATH]={0}; -// swprintf(szText, NUMCHARS(szText), L"%d", sfUI.m_sfLapOpts.hWndLap[t]); -// out << szText << endl; - out << sfUI->m_sfLapOpts.hWndLap[t] << endl; } out << sfSettings->fRunHTTP << endl; out << sfSettings->iHTTPPort << endl; @@ -3848,18 +3844,18 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU { out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; // Save the Data Channel number out << sfUI->m_sfLapOpts.m_PlotPrefs[i].m_ChannelName << endl; // Save the Data Channel Name - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save current display mode for channel - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Set all lower limits to -3.0 - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Set all upper limits to 1000000.0 - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Default to display as a graph - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Set all A constants to 0.0 - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Set all B constants to 1.0 - out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Set all C constants to 0.0 - out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Initialize all split points - out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Initialize all split points - out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Initialize all sector times - out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; - out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Default to not show split points + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iPlotView << endl; // Save how channel is displayed (graph/value) + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMinValue << endl; // Save the lower limit for the Alarm + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fMaxValue << endl; // Save the upper limit for the Alarm + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iTransformYesNo << endl; // Save whether channel is transformed + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransAValue << endl; // Save A constants + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransBValue << endl; // Save B constants + out << sfUI->m_sfLapOpts.m_PlotPrefs[i].fTransCValue << endl; // Save C constants + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Save split points + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Save split points + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Save sector times + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; // Save best sector time + out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Save setting to show/hide split points } out << sfUI->m_pReferenceLap->m_pLap->GetLapId() << endl; // Save the Reference Lap ID @@ -3919,7 +3915,6 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); swprintf(sfUI->m_szPath, NUMCHARS(sfUI->m_szPath), c_Name); // Load name of last-processed file in sfUI Pointer for szDBPath -// swprintf(szDBPath, NUMCHARS(c_Name), c_Name); // Load name of last-processed file in szDBPath } for (t=0; t<50; t++) // Load the RaceID's to be displayed { @@ -3930,16 +3925,8 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI copy(Line.begin(), Line.end(), c_Name); sfUI->m_iRaceId[t] = _wtoi(c_Name); // Load the last Race session ID's into Pitside Console for loading and display } - - Line = lines[2*t+2]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.hWndLap[t] = (HWND)_wtol(c_Name); // Load the Lap Handle into sfSettings data structure - } } - t = 2*t + 1; // Move the line counter forward + t = t + 1; // Move the line counter forward Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; @@ -4009,7 +3996,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // LLoad the boolean for accel smoothing into LapOpts data structuree + sfUI->m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into LapOpts data structuree } Line = lines[t++]; @@ -4237,7 +4224,6 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points -// x_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points } arraycounter++; } From 2e8e16dbf76f13819edcb9e31eb0e2206505f93c Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Wed, 5 Oct 2016 16:14:35 -0700 Subject: [PATCH 099/112] Save settings code cleanup. Added Split Points recovery. --- .../PitsideConsole/DlgPlotSelect.cpp | 3 - .../PitsideConsole/PitsideConsole.cpp | 62 ++++++++++++++----- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp index 48d63f2..4df0f87 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.cpp @@ -704,9 +704,6 @@ vector GetAllLaps() // Send CB_GETCURSEL message to get the index of the selected list item. { int ItemIndex = SendMessage((HWND) lParam, (UINT) CB_GETCURSEL, (WPARAM) 0, (LPARAM) 0); -// TCHAR ListItem[256]; -// (TCHAR) SendMessage((HWND) lParam, (UINT) CB_GETLBTEXT, (WPARAM) ItemIndex, (LPARAM) ListItem); -// MessageBox(hWnd, (LPCWSTR) ListItem, TEXT("WM_COMMAND"), MB_OK); m_sfLapOpts->m_PlotPrefs[1].fTransAValue = m_sfLapOpts->m_Tranformations[ItemIndex].f_CoeffA; m_sfLapOpts->m_PlotPrefs[1].fTransBValue = m_sfLapOpts->m_Tranformations[ItemIndex].f_CoeffB; m_sfLapOpts->m_PlotPrefs[1].fTransCValue = m_sfLapOpts->m_Tranformations[ItemIndex].f_CoeffC; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 417304a..40bcb8e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -673,7 +673,48 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) TCHAR szTemp[MAX_PATH] = {NULL}; _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened - + + if (m_sfLapOpts.fDrawSplitPoints == true) // Initialize the Sector Times window + { + // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE + DLGPROC ShowSplits = NULL; + // Create the window for displaying sector times for the selected laps + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); + hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, (DLGPROC)ShowSplits); // Create resource + HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window + + // Set up the Sector Times list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Lap ID"); + lstCols.push_back(L"1"); + lstCols.push_back(L"2"); + lstCols.push_back(L"3"); + lstCols.push_back(L"4"); + lstCols.push_back(L"5"); + lstCols.push_back(L"6"); + lstCols.push_back(L"7"); + lstCols.push_back(L"8"); + lstCols.push_back(L"9"); + lstWidths.push_back(195); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + + m_sfListBox.Init(HC_ShowSplits,lstCols,lstWidths); // Initialize and show the Sector Splits window + ShowWindow(hWndShowSplits, SW_SHOW); + } + return 0; } case WM_CLOSE: @@ -3875,7 +3916,6 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) { TCHAR szTempPath[MAX_PATH]; - TCHAR szText[MAX_PATH]; if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) { wcscat(szTempPath,L"LatestSettings.txt"); @@ -3916,17 +3956,16 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI copy(Line.begin(), Line.end(), c_Name); swprintf(sfUI->m_szPath, NUMCHARS(sfUI->m_szPath), c_Name); // Load name of last-processed file in sfUI Pointer for szDBPath } - for (t=0; t<50; t++) // Load the RaceID's to be displayed + for (t=1; t<=50; t++) // Load the RaceID's to be displayed { - Line = lines[2*t+1]; + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; copy(Line.begin(), Line.end(), c_Name); - sfUI->m_iRaceId[t] = _wtoi(c_Name); // Load the last Race session ID's into Pitside Console for loading and display + sfUI->m_iRaceId[t-1] = _wtoi(c_Name); // Load the last Race session ID's into Pitside Console for loading and display } } - t = t + 1; // Move the line counter forward Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; @@ -4382,7 +4421,6 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } if ( _wcsnicmp( szText, szDBPath, NUMCHARS(szDBPath) ) == 0 ) // Opening the same file, so load see if user wants to return to previous session { - // TCHAR szMsg[MAX_PATH] = L"Do you want to pick up where you left off?"; int iRet = MessageBoxW(NULL,L"Do you want to pick up where you left off?",L"Database loaded previously",MB_ICONERROR | MB_YESNO); if(iRet == IDYES) { @@ -4551,10 +4589,6 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.bSmoothYesNo = sfSettings.bSmoothYesNo; // Assign smoothing setting from Settings.txt file break; } - default: - { - x_sfLapOpts.bSmoothYesNo = false; // No smoothing of accelerometer data as a default - } } switch (sfSettings.bXAxis_KM) { @@ -4564,14 +4598,8 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine x_sfLapOpts.bXAxis_KM = sfSettings.bXAxis_KM; // Assign choice of LAT or KM for X-Axis setting from Settings.txt file break; } - default: - { - x_sfLapOpts.bXAxis_KM = false; // Distance in LAT degrees as a default - } } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap -// sfUI.SetDisplayOptions(x_sfLapOpts); -// sfUI.SetDBPath(szDBPath); swprintf(sfUI.m_szPath, NUMCHARS(sfUI.m_szPath), szDBPath); // Load name of the chosen file into the sfUI pointer PitsideHTTP aResponder(g_pLapDB,&sfUI); From 4c94c796f07a75f339669b1d8d03489af222439b Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Thu, 13 Oct 2016 07:14:58 -0700 Subject: [PATCH 100/112] 2.004.0015a: Fixed crash bug when opening/saving an empty database. --- .../PitsideConsole/PitsideConsole.cpp | 40 +++++++++++++------ .../PitsideConsole/PitsideConsole.rc | 2 +- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 40bcb8e..ff36e02 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -627,7 +627,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) m_sfTractionDisplay.Init(GetDlgItem(m_hWnd,IDC_TRACTIONCIRCLEMAP)); LoadLaps(g_pLapDB); - if (m_sfLapOpts.LapId != 0) // Reference lap needs to be loaded. Identify which one it is and set it + if (m_sfLapOpts.LapId != 0 && m_mapLaps.size() > 0) // Reference lap needs to be loaded. Identify which one it is and set it { for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) { @@ -3896,10 +3896,14 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Save split points out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Save sector times out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; // Save best sector time - out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Save setting to show/hide split points } + out << "End of Plot Prefs" << endl; - out << sfUI->m_pReferenceLap->m_pLap->GetLapId() << endl; // Save the Reference Lap ID + out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Save setting to show/hide split points + if ( sfUI->m_pReferenceLap ) + out << sfUI->m_pReferenceLap->m_pLap->GetLapId() << endl; // Save the Reference Lap ID + else + out << "0" << endl; out << sfUI->m_eXChannel << endl; // Save X-Axis data channel for (int i=0; i < sfUI->m_lstYChannels.size(); i++) // Save the list of selected Y-Axis channels @@ -4151,7 +4155,7 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI } int arraycounter = 0; // Now load the Plotting Preferences into the m_sfLapOpts.PlotPrefs array - for (int i = t; i < lines.size() && arraycounter < 50; i+=14) + for (int i = t; i < lines.size() && arraycounter < 50; i+=13) { Line = lines[i]; { @@ -4256,18 +4260,28 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI copy(Line.begin(), Line.end(), c_Name); sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel } - - Line = lines[i+13]; - { - TCHAR *c_Name = new TCHAR[Line.size()+1]; - c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points - } arraycounter++; } - t = t + (arraycounter) * 14; // Reset the line counter to collect the next set of data + t = t + (arraycounter) * 13; // Reset the line counter to collect the next set of data + + Line = lines[t]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); +// sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // End of Data Channels + } + + t++; + Line = lines[t]; + { + TCHAR *c_Name = new TCHAR[Line.size()+1]; + c_Name[Line.size()] = 0; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points + } + t++; Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index b44119e..368720f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0014\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0015a\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 6efa942d55a304d1cab64845dc13570f179a15bb Mon Sep 17 00:00:00 2001 From: Keith Date: Fri, 14 Oct 2016 19:11:29 -0700 Subject: [PATCH 101/112] 2.004.0016: RaceDAC channels implemented inside of Pitside Console --- PitsideConsole/PitsideConsole/LapData.cpp | 54 ++++++++++++++++++- PitsideConsole/PitsideConsole/LapData.h | 6 ++- .../PitsideConsole/PitsideConsole.cpp | 28 ++++++---- .../PitsideConsole/PitsideConsole.rc | 2 +- 4 files changed, 77 insertions(+), 13 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index b7142bb..9688a70 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -232,6 +232,19 @@ PIDDATA g_rgIOIOCustomData[] = { {L"Alt Voltage","%3.2f"}, }; +PIDDATA g_rgRaceDACCustomData[] = { + {L"RaceDAC A1%%","%3.2f"}, + {L"RaceDAC A2%%","%3.2f"}, + {L"RaceDAC A3%%","%3.2f"}, + {L"RaceDAC A4%%","%3.2f"}, + {L"RaceDAC A5%%","%3.2f"}, + {L"RaceDAC A6%%","%3.2f"}, + {L"RaceDAC A7%%","%3.2f"}, + {L"RaceDAC A8%%","%3.2f"}, + {L"RaceDAC D1%%","%4.1f"}, + {L"RaceDAC D2%%","%4.1f"}, +}; + void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) { LPCTSTR lpszDataName = NULL; @@ -272,6 +285,23 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) lpszDataName = L"Ukwn IOIO pin"; } } + else if(eDC >= DATA_CHANNEL_RACEDAC_START && eDC <= DATA_CHANNEL_RACEDAC_END) + { + _snwprintf(lpszName, cch, L"RaceDAC Pin %d",(eDC - DATA_CHANNEL_RACEDAC_START)); + return; + } + else if(eDC >= DATA_CHANNEL_RACEDACCUSTOM_START && eDC <= DATA_CHANNEL_RACEDACCUSTOM_END) + { + const int custom = eDC - DATA_CHANNEL_RACEDACCUSTOM_START; + if(custom >= 0 && custom < NUMITEMS(g_rgRaceDACCustomData)) + { + lpszDataName = ::g_rgRaceDACCustomData[custom].pListDesc; + } + else + { + lpszDataName = L"Ukwn RaceDAC pin"; + } + } else { DASSERT(eDC >= DATA_CHANNEL_PID_START && eDC < DATA_CHANNEL_PID_END); @@ -320,7 +350,7 @@ LPCSTR GetUnitText(UNIT_PREFERENCE eUnits) void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch) { - CASSERT(DATA_CHANNEL_COUNT == 0x401); + CASSERT(DATA_CHANNEL_COUNT == 0x601); switch(eX) { @@ -424,6 +454,16 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP const int custom = eX - DATA_CHANNEL_IOIOCUSTOM_START; sprintf(lpsz,g_rgIOIOCustomData[custom].pDataFormat, flValue); } + else if(eX >= DATA_CHANNEL_RACEDAC_START && eX <= DATA_CHANNEL_RACEDAC_END) + { + const int pin = eX - DATA_CHANNEL_RACEDAC_START; + sprintf(lpsz, "%4.1fV", flValue); + } + else if(eX >= DATA_CHANNEL_RACEDACCUSTOM_START && eX <= DATA_CHANNEL_RACEDACCUSTOM_END) + { + const int custom = eX - DATA_CHANNEL_RACEDACCUSTOM_START; + sprintf(lpsz,g_rgRaceDACCustomData[custom].pDataFormat, flValue); + } else { sprintf(lpsz,"%4.1f",flValue); @@ -435,7 +475,7 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPSTR lpsz, int cch) { - CASSERT(DATA_CHANNEL_COUNT == 0x401); + CASSERT(DATA_CHANNEL_COUNT == 0x601); switch(eX) { @@ -526,6 +566,16 @@ void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPS const int custom = eX - DATA_CHANNEL_IOIOCUSTOM_START; sprintf(lpsz,g_rgIOIOCustomData[custom].pDataFormat, flValue); } + else if(eX >= DATA_CHANNEL_RACEDAC_START && eX <= DATA_CHANNEL_RACEDAC_END) + { + const int pin = eX - DATA_CHANNEL_RACEDAC_START; + sprintf(lpsz, "%4.1f", flValue); + } + else if(eX >= DATA_CHANNEL_RACEDACCUSTOM_START && eX <= DATA_CHANNEL_RACEDACCUSTOM_END) + { + const int custom = eX - DATA_CHANNEL_RACEDACCUSTOM_START; + sprintf(lpsz,g_rgRaceDACCustomData[custom].pDataFormat, flValue); + } else { sprintf(lpsz,"%3.2f",flValue); diff --git a/PitsideConsole/PitsideConsole/LapData.h b/PitsideConsole/PitsideConsole/LapData.h index 4f80aa7..4d1df3a 100644 --- a/PitsideConsole/PitsideConsole/LapData.h +++ b/PitsideConsole/PitsideConsole/LapData.h @@ -35,7 +35,11 @@ enum DATA_CHANNEL DATA_CHANNEL_IOIOPIN_END = 0x300, DATA_CHANNEL_IOIOCUSTOM_START = 0x301, DATA_CHANNEL_IOIOCUSTOM_END = 0x400, - DATA_CHANNEL_COUNT, + DATA_CHANNEL_RACEDAC_START = 0x401, + DATA_CHANNEL_RACEDAC_END = 0x500, + DATA_CHANNEL_RACEDACCUSTOM_START = 0x501, + DATA_CHANNEL_RACEDACCUSTOM_END = 0x600, + DATA_CHANNEL_COUNT = 0x601, }; enum XAXIS_PREFERENCE diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index ff36e02..03dcf9e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -3359,7 +3359,9 @@ void UpdateDisplays() virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const override { if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END) + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) { return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; } @@ -3368,7 +3370,9 @@ void UpdateDisplays() virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const override { if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END) + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) { return m_sfLapOpts.fIOIOHardcoded ? 5 : -1e30; } @@ -3377,7 +3381,7 @@ void UpdateDisplays() virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) override { - CASSERT(DATA_CHANNEL_COUNT == 0x401); + CASSERT(DATA_CHANNEL_COUNT == 0x601); switch(eChannel) { @@ -3416,7 +3420,9 @@ void UpdateDisplays() case (DATA_CHANNEL_PID_START+0x5c): return -40; default: if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END) + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) { return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; } @@ -3426,7 +3432,7 @@ void UpdateDisplays() virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) override { - CASSERT(DATA_CHANNEL_COUNT == 0x401); + CASSERT(DATA_CHANNEL_COUNT == 0x601); switch(eChannel) { @@ -3459,7 +3465,9 @@ void UpdateDisplays() default: if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END) + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) { return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; } @@ -3475,7 +3483,7 @@ void UpdateDisplays() virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) override { // Function sets up the spacing for the vertical guidelines on the data plots - CASSERT(DATA_CHANNEL_COUNT == 0x401); + CASSERT(DATA_CHANNEL_COUNT == 0x601); const float flSpread = flMax - flMin; switch(eChannel) { @@ -3547,7 +3555,7 @@ void UpdateDisplays() virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) override { - CASSERT(DATA_CHANNEL_COUNT == 0x401); + CASSERT(DATA_CHANNEL_COUNT == 0x601); const float flSpread = flMax - flMin; switch(eChannel) { @@ -3629,7 +3637,9 @@ void UpdateDisplays() default: if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END) + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) { if(flSpread < 1) return m_sfLapOpts.fIOIOHardcoded ? 0.1f : 1e30; if(flSpread < 10) return m_sfLapOpts.fIOIOHardcoded ? 1.0f : 1e30; diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 368720f..8eb3ac6 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0015a\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0016\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END From 56b247af9dc4e8bb4c883fb7a52aac4f78893791 Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 16 Oct 2016 18:36:29 -0700 Subject: [PATCH 102/112] RaceDAC tweaks to default names. Still .0016 --- PitsideConsole/PitsideConsole/LapData.cpp | 35 ++++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index 9688a70..eb502e6 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -232,17 +232,17 @@ PIDDATA g_rgIOIOCustomData[] = { {L"Alt Voltage","%3.2f"}, }; -PIDDATA g_rgRaceDACCustomData[] = { - {L"RaceDAC A1%%","%3.2f"}, - {L"RaceDAC A2%%","%3.2f"}, - {L"RaceDAC A3%%","%3.2f"}, - {L"RaceDAC A4%%","%3.2f"}, - {L"RaceDAC A5%%","%3.2f"}, - {L"RaceDAC A6%%","%3.2f"}, - {L"RaceDAC A7%%","%3.2f"}, - {L"RaceDAC A8%%","%3.2f"}, - {L"RaceDAC D1%%","%4.1f"}, - {L"RaceDAC D2%%","%4.1f"}, +PIDDATA g_rgRaceDACData[] = { + {L"RaceDAC A1","%3.2f"}, + {L"RaceDAC A2","%3.2f"}, + {L"RaceDAC A3","%3.2f"}, + {L"RaceDAC A4","%3.2f"}, + {L"RaceDAC A5","%3.2f"}, + {L"RaceDAC A6","%3.2f"}, + {L"RaceDAC A7","%3.2f"}, + {L"RaceDAC A8","%3.2f"}, + {L"RaceDAC D1","%4.1f"}, + {L"RaceDAC D2","%4.1f"}, }; void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) @@ -287,15 +287,16 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) } else if(eDC >= DATA_CHANNEL_RACEDAC_START && eDC <= DATA_CHANNEL_RACEDAC_END) { - _snwprintf(lpszName, cch, L"RaceDAC Pin %d",(eDC - DATA_CHANNEL_RACEDAC_START)); - return; +// _snwprintf(lpszName, cch, L"RaceDAC Pin %d",(eDC - DATA_CHANNEL_RACEDAC_START + 1)); +// return; + lpszDataName = ::g_rgRaceDACData[eDC - DATA_CHANNEL_RACEDAC_START].pListDesc; } else if(eDC >= DATA_CHANNEL_RACEDACCUSTOM_START && eDC <= DATA_CHANNEL_RACEDACCUSTOM_END) { const int custom = eDC - DATA_CHANNEL_RACEDACCUSTOM_START; - if(custom >= 0 && custom < NUMITEMS(g_rgRaceDACCustomData)) + if(custom >= 0 && custom < NUMITEMS(g_rgIOIOCustomData)) { - lpszDataName = ::g_rgRaceDACCustomData[custom].pListDesc; + lpszDataName = ::g_rgIOIOCustomData[custom].pListDesc; } else { @@ -462,7 +463,7 @@ void GetChannelString(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LP else if(eX >= DATA_CHANNEL_RACEDACCUSTOM_START && eX <= DATA_CHANNEL_RACEDACCUSTOM_END) { const int custom = eX - DATA_CHANNEL_RACEDACCUSTOM_START; - sprintf(lpsz,g_rgRaceDACCustomData[custom].pDataFormat, flValue); + sprintf(lpsz,g_rgIOIOCustomData[custom].pDataFormat, flValue); } else { @@ -574,7 +575,7 @@ void GetChannelValue(DATA_CHANNEL eX, UNIT_PREFERENCE eUnits, float flValue, LPS else if(eX >= DATA_CHANNEL_RACEDACCUSTOM_START && eX <= DATA_CHANNEL_RACEDACCUSTOM_END) { const int custom = eX - DATA_CHANNEL_RACEDACCUSTOM_START; - sprintf(lpsz,g_rgRaceDACCustomData[custom].pDataFormat, flValue); + sprintf(lpsz,g_rgIOIOCustomData[custom].pDataFormat, flValue); } else { From 9a3f984000e9d0f43542318251aed812bd5fabd2 Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Mon, 17 Oct 2016 18:31:03 -0700 Subject: [PATCH 103/112] Efficiency improvement attempt --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index ff36e02..d0fe3e9 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1880,7 +1880,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { case BN_CLICKED: m_eLapDisplayStyle = LAPDISPLAYSTYLE_MAP; - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD); break; } return TRUE; @@ -1902,7 +1902,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { case BN_CLICKED: m_eLapDisplayStyle = LAPDISPLAYSTYLE_PLOT; - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD); break; } return TRUE; @@ -2008,7 +2008,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) else { LoadLaps((ILapReceiver*)lParam); - UpdateUI(UPDATE_LIST | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); +// UpdateUI(UPDATE_LIST | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); } // Just loaded a new lap. Let's reset the timer tmLast = timeGetTime(); // Save last time lap was received From 5876fe5d0ab86320239a1445ea5042f7e740c7de Mon Sep 17 00:00:00 2001 From: Keith Date: Tue, 18 Oct 2016 19:47:31 -0700 Subject: [PATCH 104/112] 2.004.0016: Improved efficiency for new received laps --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 8179d4d..dd17cd5 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -2008,7 +2008,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) else { LoadLaps((ILapReceiver*)lParam); -// UpdateUI(UPDATE_LIST | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + UpdateUI(UPDATE_LIST); } // Just loaded a new lap. Let's reset the timer tmLast = timeGetTime(); // Save last time lap was received From 2b3e3bc375fa6cbca49a85b051cbba2cc42b085e Mon Sep 17 00:00:00 2001 From: kdjones2 Date: Wed, 19 Oct 2016 12:42:42 -0700 Subject: [PATCH 105/112] Minor code cleanup --- PitsideConsole/PitsideConsole/LapData.cpp | 2 -- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/LapData.cpp b/PitsideConsole/PitsideConsole/LapData.cpp index eb502e6..c272fde 100644 --- a/PitsideConsole/PitsideConsole/LapData.cpp +++ b/PitsideConsole/PitsideConsole/LapData.cpp @@ -287,8 +287,6 @@ void GetDataChannelName(DATA_CHANNEL eDC, LPTSTR lpszName, int cch) } else if(eDC >= DATA_CHANNEL_RACEDAC_START && eDC <= DATA_CHANNEL_RACEDAC_END) { -// _snwprintf(lpszName, cch, L"RaceDAC Pin %d",(eDC - DATA_CHANNEL_RACEDAC_START + 1)); -// return; lpszDataName = ::g_rgRaceDACData[eDC - DATA_CHANNEL_RACEDAC_START].pListDesc; } else if(eDC >= DATA_CHANNEL_RACEDACCUSTOM_START && eDC <= DATA_CHANNEL_RACEDACCUSTOM_END) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 8179d4d..cf36f7c 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1989,7 +1989,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if(!fWarnedOnce) { fWarnedOnce = true; - MessageBox(NULL,L"You just received a lap from a car, but you're looking at old data. Hit data->'new race session' or else Pitside will keep ignoring it",L"Not ready to receive",0); + MessageBox(NULL,L"You just received a new lap from a car, but you're looking at old data.\n\nChoose File->'Switch Race Session' to look at the new information",L"Not ready to receive",0); } return TRUE; } From 4a4cd37b80572ffcde524a307239d17a1c18c5a4 Mon Sep 17 00:00:00 2001 From: Paul McMahon Date: Sun, 23 Oct 2016 10:07:17 -0400 Subject: [PATCH 106/112] efficiency improvement when adding laps to the laplist --- PitsideConsole/ArtLib/ArtUI.h | 988 +-- PitsideConsole/PitsideConsole/LapReceiver.h | 813 +-- .../PitsideConsole/PitsideConsole.cpp | 6292 ++++++++--------- .../PitsideConsole/PitsideConsole.cpp.rej | 14 + .../PitsideConsole/PitsideConsole.rc | 606 +- PitsideConsole/PitsideConsole/SQLiteLapDB.cpp | 1687 ++--- PitsideConsole/PitsideConsole/SQLiteLapDB.h | 3 + 7 files changed, 5168 insertions(+), 5235 deletions(-) create mode 100644 PitsideConsole/PitsideConsole/PitsideConsole.cpp.rej diff --git a/PitsideConsole/ArtLib/ArtUI.h b/PitsideConsole/ArtLib/ArtUI.h index 7891bf7..b20f5a6 100644 --- a/PitsideConsole/ArtLib/ArtUI.h +++ b/PitsideConsole/ArtLib/ArtUI.h @@ -1,267 +1,293 @@ -#pragma once -#include -#include "ArtTools.h" -#include -#include -#include -#include "gl/gl.h" -#include -#include "commctrl.h" - -void DrawGLFilledSquare(double dX, double dY, double dRadius); - -GLuint LoadTextureSDL( const char * filename); - -HRESULT InitGLFont(GLuint* pBase, int iFontSize, HDC hdc); -void KillFont(GLuint base); - - -using namespace std; -class ArtListBox -{ -public: - ArtListBox() - { - } - // Initialization routine for Listviews with checkboxes for multiple-select options - void Init2(HWND hWnd, const vector& lstColumnHeaders, const vector& lstColWidths) - { - DASSERT(lstColumnHeaders.size() == lstColWidths.size()); - - m_hWnd = hWnd; - - m_cColumns = lstColumnHeaders.size(); - if(lstColumnHeaders.size() <= 0) // No data to display - { - RECT rc; - GetClientRect(m_hWnd,&rc); - - LVCOLUMN LvCol = {0}; - LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; - LvCol.pszText=L""; - LvCol.cx=RECT_WIDTH(&rc) - 30; - - SendMessage(m_hWnd,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum - } - else // Data to display - { - LVCOLUMN LvCol = {0}; - LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; - - for(unsigned int x = 0; x < lstColumnHeaders.size(); x++) - { - TCHAR szTemp[MAX_PATH]; - wcsncpy_s(szTemp,lstColumnHeaders[x].c_str(),NUMCHARS(szTemp)); - LvCol.cx=lstColWidths[x]; - LvCol.pszText=szTemp; - SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum - } - } - ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS); - } - - // Original Listview initialization function for non-checkbox Listviews - void Init(HWND hWnd, const vector& lstColumnHeaders, const vector& lstColWidths) - { - DASSERT(lstColumnHeaders.size() == lstColWidths.size()); - - m_hWnd = hWnd; - - m_cColumns = lstColumnHeaders.size(); - if(lstColumnHeaders.size() <= 0) // No data to display - { - RECT rc; - GetClientRect(m_hWnd,&rc); - - LVCOLUMN LvCol = {0}; - LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; - LvCol.pszText=L""; - LvCol.cx=RECT_WIDTH(&rc) - 30; - - SendMessage(m_hWnd,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum - } - else // Data to display - { - LVCOLUMN LvCol = {0}; - LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; - - for(unsigned int x = 0; x < lstColumnHeaders.size(); x++) - { - TCHAR szTemp[MAX_PATH]; - wcsncpy_s(szTemp,lstColumnHeaders[x].c_str(),NUMCHARS(szTemp)); - LvCol.cx=lstColWidths[x]; - LvCol.pszText=szTemp; - SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum - } - } - ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS, LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS); - } - void AddString(LPCTSTR lpszString, int iData) - { - TCHAR szString[MAX_PATH]; - wcsncpy_s(szString,lpszString,NUMCHARS(szString)); - - LVITEM lvItem = {0}; - lvItem.mask = LVIF_PARAM | LVIF_TEXT; - lvItem.lParam = iData; - lvItem.pszText = szString; - lvItem.iItem = ListView_GetItemCount(m_hWnd); - lvItem.state = 0; - lvItem.stateMask = -1; - lvItem.cchTextMax = wcslen(szString); - - VERIFY(ListView_InsertItem(m_hWnd,&lvItem) >= 0); - } - void AddStrings(vector lstCols, int iData) - { - DASSERT(lstCols.size() == m_cColumns); - - const int iItem = ListView_GetItemCount(m_hWnd); - - TCHAR szString[MAX_PATH]; - wcsncpy_s(szString,lstCols[0].c_str(),NUMCHARS(szString)); - - { - LVITEM lvItem = {0}; - lvItem.mask = LVIF_PARAM | LVIF_TEXT; - lvItem.lParam = iData; - lvItem.pszText = szString; - lvItem.iItem = iItem; - lvItem.iSubItem = 0; - lvItem.state = 0; - lvItem.stateMask = -1; - lvItem.cchTextMax = wcslen(szString); - VERIFY(ListView_InsertItem(m_hWnd,&lvItem) >= 0); - } - - for(unsigned int x = 0;x < lstCols.size(); x++) - { - TCHAR szString[MAX_PATH]; - wcsncpy_s(szString,lstCols[x].c_str(),NUMCHARS(szString)); - - LVITEM lvItem = {0}; - lvItem.mask = LVIF_TEXT; - lvItem.pszText = szString; - lvItem.iItem = iItem; - lvItem.iSubItem = x; - lvItem.state = 0; - lvItem.stateMask = -1; - lvItem.cchTextMax = wcslen(szString); - - VERIFY(ListView_SetItem(m_hWnd,&lvItem)); - } - } - void Clear() - { - ListView_DeleteAllItems(m_hWnd); - } - int GetPosition() - { - return ListView_GetTopIndex(m_hWnd); - } - void MakeVisible(LPARAM iData) - { - // makes sure that the item containing the LPARAM lParam is visible - LVFINDINFO sfFind = {0}; - sfFind.flags = LVFI_PARAM; - sfFind.lParam = iData; - int ixIndex = ListView_FindItem(m_hWnd,-1,&sfFind); - if(ixIndex >= 0) - { - ListView_EnsureVisible(m_hWnd,ixIndex,FALSE); - } - - } - vector GetSelectedIndices() - { - vector ret; - int ixSelect = -1; - do - { - ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED | LVNI_BELOW); - if(ixSelect >= 0) ret.push_back(ixSelect); - } while(ixSelect >= 0); - return ret; - } - void SetSelectedData(const set& setData) - { - int ixItem = -1; - do - { - ixItem = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixItem, LVNI_ALL); // Search sequentially through the LV index - if(ixItem >= 0) - { - LVITEM sfItem = {0}; - sfItem.iItem = ixItem; - sfItem.iSubItem = 0; - sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; - sfItem.mask = LVIF_STATE | LVIF_PARAM; - - if(ListView_GetItem(m_hWnd,&sfItem)) // If item is exists, let's check it against the setData set for a match - { - DASSERT(sfItem.lParam); - // See if the item is part of the selected set - if( setData.find(sfItem.lParam) != end(setData) ) - { - // found the item in the selection set, so make it selected and checkbox checked - sfItem.state |= LVIS_FOCUSED | LVIS_SELECTED; - sfItem.stateMask |= LVIS_SELECTED | LVIS_STATEIMAGEMASK; - ListView_SetItem(m_hWnd,&sfItem); // Highlight the lap - ListView_SetCheckState(m_hWnd,ixItem,true); // Check the checkbox - } - else - { - // this item is not supposed to be selected - sfItem.state &= ~LVIS_SELECTED & ~LVIS_FOCUSED; - sfItem.stateMask &= ~LVIS_SELECTED & ~LVIS_STATEIMAGEMASK; - ListView_SetItem(m_hWnd, &sfItem); // Unhighlight the lap - ListView_SetCheckState(m_hWnd,ixItem,false); // Uncheck the checkbox - } - } - else - { - break; - } - } - } while(ixItem >= 0); - } - - set GetSelectedItemsData() const // GetSelectedItems for single select Listviews - { - set ret; - int ixSelect = -1; - do - { - ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); - if(ixSelect >= 0) - { - LVITEM sfItem = {0}; - sfItem.iItem = ixSelect; - sfItem.iSubItem = 0; - sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; - sfItem.mask = LVIF_STATE | LVIF_PARAM; - - if(ListView_GetItem(m_hWnd,&sfItem)) - { - // found an item! - DASSERT(sfItem.lParam != NULL); - ret.insert(sfItem.lParam); - } - else {DASSERT(FALSE); break;} // Added by KDJ to prevent locks when no data is passed - } - } while(ixSelect >= 0); - - return ret; - } - - set GetSelectedItemsData2() const // New version to capture the checkbox selections for multi-select Listviews - { - set ret; - int ixSelect = -1; - int iCount = 0; - int iTotCount = ListView_GetItemCount(m_hWnd); // Returns the number of items in the Listview -/* - // First let's clean up the selected or deselected the items and associated checkboxes +#pragma once +#include +#include "ArtTools.h" +#include +#include +#include +#include "gl/gl.h" +#include +#include "commctrl.h" + +void DrawGLFilledSquare(double dX, double dY, double dRadius); + +GLuint LoadTextureSDL( const char * filename); + +HRESULT InitGLFont(GLuint* pBase, int iFontSize, HDC hdc); +void KillFont(GLuint base); + + +using namespace std; +class ArtListBox +{ +public: + ArtListBox() + { + } + // Initialization routine for Listviews with checkboxes for multiple-select options + void Init2(HWND hWnd, const vector& lstColumnHeaders, const vector& lstColWidths) + { + DASSERT(lstColumnHeaders.size() == lstColWidths.size()); + + m_hWnd = hWnd; + + m_cColumns = lstColumnHeaders.size(); + if(lstColumnHeaders.size() <= 0) // No data to display + { + RECT rc; + GetClientRect(m_hWnd,&rc); + + LVCOLUMN LvCol = {0}; + LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + LvCol.pszText=L""; + LvCol.cx=RECT_WIDTH(&rc) - 30; + + SendMessage(m_hWnd,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum + } + else // Data to display + { + LVCOLUMN LvCol = {0}; + LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + + for(unsigned int x = 0; x < lstColumnHeaders.size(); x++) + { + TCHAR szTemp[MAX_PATH]; + wcsncpy_s(szTemp,lstColumnHeaders[x].c_str(),NUMCHARS(szTemp)); + LvCol.cx=lstColWidths[x]; + LvCol.pszText=szTemp; + SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum + } + } + ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS); + } + + // Original Listview initialization function for non-checkbox Listviews + void Init(HWND hWnd, const vector& lstColumnHeaders, const vector& lstColWidths) + { + DASSERT(lstColumnHeaders.size() == lstColWidths.size()); + + m_hWnd = hWnd; + + m_cColumns = lstColumnHeaders.size(); + if(lstColumnHeaders.size() <= 0) // No data to display + { + RECT rc; + GetClientRect(m_hWnd,&rc); + + LVCOLUMN LvCol = {0}; + LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + LvCol.pszText=L""; + LvCol.cx=RECT_WIDTH(&rc) - 30; + + SendMessage(m_hWnd,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum + } + else // Data to display + { + LVCOLUMN LvCol = {0}; + LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + + for(unsigned int x = 0; x < lstColumnHeaders.size(); x++) + { + TCHAR szTemp[MAX_PATH]; + wcsncpy_s(szTemp,lstColumnHeaders[x].c_str(),NUMCHARS(szTemp)); + LvCol.cx=lstColWidths[x]; + LvCol.pszText=szTemp; + SendMessage(m_hWnd,LVM_INSERTCOLUMN,x,(LPARAM)&LvCol); // Insert/Show the coloum + } + } + ListView_SetExtendedListViewStyleEx(m_hWnd, LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS, LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS); + } + + void AddString(LPCTSTR lpszString, int iData) + { + TCHAR szString[MAX_PATH]; + wcsncpy_s(szString,lpszString,NUMCHARS(szString)); + + LVITEM lvItem = {0}; + lvItem.mask = LVIF_PARAM | LVIF_TEXT; + lvItem.lParam = iData; + lvItem.pszText = szString; + lvItem.iItem = ListView_GetItemCount(m_hWnd); + lvItem.state = 0; + lvItem.stateMask = -1; + lvItem.cchTextMax = wcslen(szString); + + VERIFY(ListView_InsertItem(m_hWnd,&lvItem) >= 0); + } + + int GetCount() + { + return ListView_GetItemCount(m_hWnd); + } + + // Insert the table row at the specified row number, iItem + void InsertStrings(vector lstCols, int iData, int iItem) + { + DASSERT(lstCols.size() == m_cColumns); + + TCHAR szString[MAX_PATH]; + wcsncpy_s(szString,lstCols[0].c_str(),NUMCHARS(szString)); + + { + LVITEM lvItem = {0}; + lvItem.mask = LVIF_PARAM | LVIF_TEXT; + lvItem.lParam = iData; + lvItem.pszText = szString; + lvItem.iItem = iItem; + lvItem.iSubItem = 0; + lvItem.state = 0; + lvItem.stateMask = -1; + lvItem.cchTextMax = wcslen(szString); + VERIFY(ListView_InsertItem(m_hWnd,&lvItem) >= 0); + } + + for(unsigned int x = 0;x < lstCols.size(); x++) + { + TCHAR szString[MAX_PATH]; + wcsncpy_s(szString,lstCols[x].c_str(),NUMCHARS(szString)); + ListView_SetItemText(m_hWnd, iItem, x, szString); + } + } + + // Add the row at the end of the table + void AddStrings(vector lstCols, int iData) + { + DASSERT(lstCols.size() == m_cColumns); + const int iItem = ListView_GetItemCount(m_hWnd); + + TCHAR szString[MAX_PATH]; + wcsncpy_s(szString,lstCols[0].c_str(),NUMCHARS(szString)); + + { + LVITEM lvItem = {0}; + lvItem.mask = LVIF_PARAM | LVIF_TEXT; + lvItem.lParam = iData; + lvItem.pszText = szString; + lvItem.iItem = iItem; + lvItem.iSubItem = 0; + lvItem.state = 0; + lvItem.stateMask = -1; + lvItem.cchTextMax = wcslen(szString); + VERIFY(ListView_InsertItem(m_hWnd,&lvItem) >= 0); + } + + for(unsigned int x = 0;x < lstCols.size(); x++) + { + TCHAR szString[MAX_PATH]; + wcsncpy_s(szString,lstCols[x].c_str(),NUMCHARS(szString)); + ListView_SetItemText(m_hWnd, iItem, x, szString); + } + } + void Clear() + { + ListView_DeleteAllItems(m_hWnd); + } + int GetPosition() + { + return ListView_GetTopIndex(m_hWnd); + } + void MakeVisible(LPARAM iData) + { + // makes sure that the item containing the LPARAM lParam is visible + LVFINDINFO sfFind = {0}; + sfFind.flags = LVFI_PARAM; + sfFind.lParam = iData; + int ixIndex = ListView_FindItem(m_hWnd,-1,&sfFind); + if(ixIndex >= 0) + { + ListView_EnsureVisible(m_hWnd,ixIndex,FALSE); + } + + } + vector GetSelectedIndices() + { + vector ret; + int ixSelect = -1; + do + { + ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED | LVNI_BELOW); + if(ixSelect >= 0) ret.push_back(ixSelect); + } while(ixSelect >= 0); + return ret; + } + void SetSelectedData(const set& setData) + { + int ixItem = -1; + do + { + ixItem = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixItem, LVNI_ALL); // Search sequentially through the LV index + if(ixItem >= 0) + { + LVITEM sfItem = {0}; + sfItem.iItem = ixItem; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + + if(ListView_GetItem(m_hWnd,&sfItem)) // If item is exists, let's check it against the setData set for a match + { + DASSERT(sfItem.lParam); + // See if the item is part of the selected set + if( setData.find(sfItem.lParam) != end(setData) ) + { + // found the item in the selection set, so make it selected and checkbox checked + sfItem.state |= LVIS_FOCUSED | LVIS_SELECTED; + sfItem.stateMask |= LVIS_SELECTED | LVIS_STATEIMAGEMASK; + ListView_SetItem(m_hWnd,&sfItem); // Highlight the lap + ListView_SetCheckState(m_hWnd,ixItem,true); // Check the checkbox + } + else + { + // this item is not supposed to be selected + sfItem.state &= ~LVIS_SELECTED & ~LVIS_FOCUSED; + sfItem.stateMask &= ~LVIS_SELECTED & ~LVIS_STATEIMAGEMASK; + ListView_SetItem(m_hWnd, &sfItem); // Unhighlight the lap + ListView_SetCheckState(m_hWnd,ixItem,false); // Uncheck the checkbox + } + } + else + { + break; + } + } + } while(ixItem >= 0); + } + + set GetSelectedItemsData() const // GetSelectedItems for single select Listviews + { + set ret; + int ixSelect = -1; + do + { + ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); + if(ixSelect >= 0) + { + LVITEM sfItem = {0}; + sfItem.iItem = ixSelect; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + + if(ListView_GetItem(m_hWnd,&sfItem)) + { + // found an item! + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); + } + else {DASSERT(FALSE); break;} // Added by KDJ to prevent locks when no data is passed + } + } while(ixSelect >= 0); + + return ret; + } + + set GetSelectedItemsData2() const // New version to capture the checkbox selections for multi-select Listviews + { + set ret; + int ixSelect = -1; + int iCount = 0; + int iTotCount = ListView_GetItemCount(m_hWnd); // Returns the number of items in the Listview +/* + // First let's clean up the selected or deselected the items and associated checkboxes do { ixSelect = SendMessage(m_hWnd, LVM_GETNEXTITEM, ixSelect, LVNI_SELECTED); // Go through all of the selected items sequentially @@ -278,17 +304,17 @@ class ArtListBox if ( ListView_GetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED) ) // Item is selected { // Item is highlighted - ListView_SetCheckState(m_hWnd,sfItem.iItem, true); // Check the checkbox for this item - ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the item + ListView_SetCheckState(m_hWnd,sfItem.iItem, true); // Check the checkbox for this item + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the item DASSERT(sfItem.lParam != NULL); ret.insert(sfItem.lParam); // Add the item to the selected Set } else if ( !ListView_GetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED) ) // Item is not highlighted, should not hit this { // Item is not highlighted - ListView_SetCheckState(m_hWnd,sfItem.iItem, false); // Uncheck the checkbox for this item - ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Unhighlight the item - ret.erase(sfItem.lParam); // Remove this item from the set + ListView_SetCheckState(m_hWnd,sfItem.iItem, false); // Uncheck the checkbox for this item + ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Unhighlight the item + ret.erase(sfItem.lParam); // Remove this item from the set } } else @@ -297,58 +323,58 @@ class ArtListBox break; } // Added by KDJ to prevent locks when no data is passed } - } while(ixSelect >= 0); - // Now let's find any other items that have their checkboxes checked, and add them to the set - for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items - { - LVITEM sfItem = {0}; - sfItem.iItem = iCount; - sfItem.iSubItem = 0; - sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; - sfItem.mask = LVIF_STATE | LVIF_PARAM; - // found an item! - ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam - if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item - { - ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked item - DASSERT(sfItem.lParam != NULL); - ret.insert(sfItem.lParam); - } - else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) ) // Checkbox is not checked, let's unhighlight the item - { - ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Deselect the highlighted item - DASSERT(sfItem.lParam != NULL); - ret.erase(sfItem.lParam); // Remove this item from the set - } - } -*/ - for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items - { - LVITEM sfItem = {0}; - sfItem.iItem = iCount; - sfItem.iSubItem = 0; - sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; - sfItem.mask = LVIF_STATE | LVIF_PARAM; - // found an item! - ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam - if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item - { - ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked item - DASSERT(sfItem.lParam != NULL); - ret.insert(sfItem.lParam); - } - else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) && ListView_GetItemState(m_hWnd,sfItem.iItem,LVIS_SELECTED)) // Check box is not checked, let's unhighlight this item - { - ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Unhighlight this item - } - } - - return ret; // Return the set of items - } - - set GetSelectedItemsData3() const // Version to capture the Lap List for multi-select choices more efficiently - { - set ret; + } while(ixSelect >= 0); + // Now let's find any other items that have their checkboxes checked, and add them to the set + for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items + { + LVITEM sfItem = {0}; + sfItem.iItem = iCount; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + // found an item! + ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam + if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked item + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); + } + else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) ) // Checkbox is not checked, let's unhighlight the item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Deselect the highlighted item + DASSERT(sfItem.lParam != NULL); + ret.erase(sfItem.lParam); // Remove this item from the set + } + } +*/ + for(iCount = 0; iCount < iTotCount; iCount++) // Let's clean up the Checkboxes and Selected items + { + LVITEM sfItem = {0}; + sfItem.iItem = iCount; + sfItem.iSubItem = 0; + sfItem.stateMask = LVIS_SELECTED | LVIS_STATEIMAGEMASK; + sfItem.mask = LVIF_STATE | LVIF_PARAM; + // found an item! + ListView_GetItem(m_hWnd,&sfItem); // Get the details about the item and store the lParam + if(ListView_GetCheckState(m_hWnd,sfItem.iItem)) // Check box is checked, let's highlight the item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, LVIS_SELECTED, LVIS_SELECTED); // Highlight the checked item + DASSERT(sfItem.lParam != NULL); + ret.insert(sfItem.lParam); + } + else if(!ListView_GetCheckState(m_hWnd,sfItem.iItem) && ListView_GetItemState(m_hWnd,sfItem.iItem,LVIS_SELECTED)) // Check box is not checked, let's unhighlight this item + { + ListView_SetItemState(m_hWnd,sfItem.iItem, ~LVIS_SELECTED, LVIS_SELECTED); // Unhighlight this item + } + } + + return ret; // Return the set of items + } + + set GetSelectedItemsData3() const // Version to capture the Lap List for multi-select choices more efficiently + { + set ret; int ixSelect = -1; do { @@ -370,163 +396,163 @@ class ArtListBox else {DASSERT(FALSE); break;} // Added by KDJ to prevent locks when no data is passed } } while(ixSelect >= 0); - - return ret; // Return the set of items - } - -private: - HWND m_hWnd; - int m_cColumns; // used for debugging -}; - -#include "gl/gl.h" -#include "gl/glu.h" - -class ArtOpenGLWindow -{ -public: - ArtOpenGLWindow() : m_hdc(NULL), m_hRC(NULL), m_hWnd(NULL), m_iFontSize(12) - { - } - virtual ~ArtOpenGLWindow() - { - DeInit(); - } - void Init(HWND hWnd) - { - m_hWnd = hWnd; - m_hdc = GetDC(hWnd); - - PIXELFORMATDESCRIPTOR pfd; - ZeroMemory( &pfd, sizeof( pfd ) ); - pfd.nSize = sizeof( pfd ); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | - PFD_DOUBLEBUFFER; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = 24; - pfd.cDepthBits = 16; - pfd.iLayerType = PFD_MAIN_PLANE; - int iFormat = ChoosePixelFormat( m_hdc, &pfd ); - SetPixelFormat( m_hdc, iFormat, &pfd ); - m_hRC = wglCreateContext(m_hdc); - - HDC hOldDC = wglGetCurrentDC(); - HGLRC hOldRC = wglGetCurrentContext(); - wglMakeCurrent(m_hdc, m_hRC); - - VERIFY(SUCCEEDED(InitGLFont(&m_uFontBase, m_iFontSize, m_hdc))); - - wglMakeCurrent(hOldDC,hOldRC); - } - void DeInit() - { - //DeInitGLText(); - if(m_hRC != NULL && m_hdc != NULL) - { - wglDeleteContext(m_hRC); - ReleaseDC(m_hWnd, m_hdc); - } - } - HDC OGL_GetDC() {return m_hdc;} - HGLRC OGL_GetRC() {return m_hRC;} - HWND OGL_GetHWnd() const {return m_hWnd;} - BOOL HandleMessage(HWND hWnd, UINT uMsg, LPARAM lParam, WPARAM wParam) - { - switch(uMsg) - { - case WM_MOUSEMOVE: - { - POINT ptLastMouse = m_ptMouse; - RECT rcParent,rcThis; - GetWindowRect(GetParent(m_hWnd),&rcParent); - GetWindowRect(m_hWnd,&rcThis); - m_ptMouse.x = LOWORD(wParam); - m_ptMouse.y = HIWORD(wParam); - - m_ptMouse.x -= (rcThis.left - rcParent.left); - m_ptMouse.y -= (rcThis.top - rcParent.top); - - RECT rcClient; - GetClientRect(m_hWnd, &rcClient); - - RECT rcParentClient; - GetClientRect(GetParent(m_hWnd), &rcParentClient); - // the difference between rcParent and rcParentClient's height will be the height of the title bar - m_ptMouse.y += (RECT_HEIGHT(&rcParent) - RECT_HEIGHT(&rcParentClient)); - m_ptMouse.y = RECT_HEIGHT(&rcClient) - m_ptMouse.y; - bool fLastMouseValid = m_fMouseValid; - m_fMouseValid = m_ptMouse.x >= 0 && m_ptMouse.y >= 0 && m_ptMouse.x < RECT_WIDTH(&rcClient) && m_ptMouse.y < RECT_HEIGHT(&rcClient); - return FALSE; - } - case WM_MOUSELEAVE: - m_fMouseValid = false; - return TRUE; - } - return FALSE; - } - virtual void OGL_Paint() = 0; - - void Refresh() - { - HDC hOldDC = wglGetCurrentDC(); - HGLRC hOldRC = wglGetCurrentContext(); - wglMakeCurrent(m_hdc, m_hRC); - OGL_Paint(); - wglMakeCurrent(hOldDC,hOldRC); - } -protected: - int GetWindowFontSize() const {return m_iFontSize*4/3;} - void DrawText(float flX, float flY, const char* text) const; -public: - bool GetMouse(POINT* ppt) - { - if(m_fMouseValid) - { - *ppt = m_ptMouse; - return true; - } - return false; - } -private: - HDC m_hdc; - HWND m_hWnd; - HGLRC m_hRC; - - // semi-separate stuff about mouse position - POINT m_ptMouse; - bool m_fMouseValid; - - GLuint m_uFontBase; - const int m_iFontSize; -}; - - -class IUI -{ -public: - virtual void NotifyChange(WPARAM wParam, LPARAM lParam) = 0; // note: can be called on any thread - virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) = 0; - virtual DWORD GetDlgId() const = 0; -}; - -// for n, I recommend using your dialog's resource ID -extern map mapDialogs; -template -INT_PTR CALLBACK MessageDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - return mapDialogs[n]->DlgProc(hWnd,uMsg,wParam,lParam); -} -template -void ArtShowDialog(IUI* pDlg) -{ - mapDialogs[n] = pDlg; - - DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(pDlg->GetDlgId()), NULL, ::MessageDlgProc); -} - -// shows the open file dialog, sticks result in szPath... -// true -> path is good -// false -> was cancelled -bool ArtGetOpenFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); -bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); + + return ret; // Return the set of items + } + +private: + HWND m_hWnd; + int m_cColumns; // used for debugging +}; + +#include "gl/gl.h" +#include "gl/glu.h" + +class ArtOpenGLWindow +{ +public: + ArtOpenGLWindow() : m_hdc(NULL), m_hRC(NULL), m_hWnd(NULL), m_iFontSize(12) + { + } + virtual ~ArtOpenGLWindow() + { + DeInit(); + } + void Init(HWND hWnd) + { + m_hWnd = hWnd; + m_hdc = GetDC(hWnd); + + PIXELFORMATDESCRIPTOR pfd; + ZeroMemory( &pfd, sizeof( pfd ) ); + pfd.nSize = sizeof( pfd ); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | + PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 24; + pfd.cDepthBits = 16; + pfd.iLayerType = PFD_MAIN_PLANE; + int iFormat = ChoosePixelFormat( m_hdc, &pfd ); + SetPixelFormat( m_hdc, iFormat, &pfd ); + m_hRC = wglCreateContext(m_hdc); + + HDC hOldDC = wglGetCurrentDC(); + HGLRC hOldRC = wglGetCurrentContext(); + wglMakeCurrent(m_hdc, m_hRC); + + VERIFY(SUCCEEDED(InitGLFont(&m_uFontBase, m_iFontSize, m_hdc))); + + wglMakeCurrent(hOldDC,hOldRC); + } + void DeInit() + { + //DeInitGLText(); + if(m_hRC != NULL && m_hdc != NULL) + { + wglDeleteContext(m_hRC); + ReleaseDC(m_hWnd, m_hdc); + } + } + HDC OGL_GetDC() {return m_hdc;} + HGLRC OGL_GetRC() {return m_hRC;} + HWND OGL_GetHWnd() const {return m_hWnd;} + BOOL HandleMessage(HWND hWnd, UINT uMsg, LPARAM lParam, WPARAM wParam) + { + switch(uMsg) + { + case WM_MOUSEMOVE: + { + POINT ptLastMouse = m_ptMouse; + RECT rcParent,rcThis; + GetWindowRect(GetParent(m_hWnd),&rcParent); + GetWindowRect(m_hWnd,&rcThis); + m_ptMouse.x = LOWORD(wParam); + m_ptMouse.y = HIWORD(wParam); + + m_ptMouse.x -= (rcThis.left - rcParent.left); + m_ptMouse.y -= (rcThis.top - rcParent.top); + + RECT rcClient; + GetClientRect(m_hWnd, &rcClient); + + RECT rcParentClient; + GetClientRect(GetParent(m_hWnd), &rcParentClient); + // the difference between rcParent and rcParentClient's height will be the height of the title bar + m_ptMouse.y += (RECT_HEIGHT(&rcParent) - RECT_HEIGHT(&rcParentClient)); + m_ptMouse.y = RECT_HEIGHT(&rcClient) - m_ptMouse.y; + bool fLastMouseValid = m_fMouseValid; + m_fMouseValid = m_ptMouse.x >= 0 && m_ptMouse.y >= 0 && m_ptMouse.x < RECT_WIDTH(&rcClient) && m_ptMouse.y < RECT_HEIGHT(&rcClient); + return FALSE; + } + case WM_MOUSELEAVE: + m_fMouseValid = false; + return TRUE; + } + return FALSE; + } + virtual void OGL_Paint() = 0; + + void Refresh() + { + HDC hOldDC = wglGetCurrentDC(); + HGLRC hOldRC = wglGetCurrentContext(); + wglMakeCurrent(m_hdc, m_hRC); + OGL_Paint(); + wglMakeCurrent(hOldDC,hOldRC); + } +protected: + int GetWindowFontSize() const {return m_iFontSize*4/3;} + void DrawText(float flX, float flY, const char* text) const; +public: + bool GetMouse(POINT* ppt) + { + if(m_fMouseValid) + { + *ppt = m_ptMouse; + return true; + } + return false; + } +private: + HDC m_hdc; + HWND m_hWnd; + HGLRC m_hRC; + + // semi-separate stuff about mouse position + POINT m_ptMouse; + bool m_fMouseValid; + + GLuint m_uFontBase; + const int m_iFontSize; +}; + + +class IUI +{ +public: + virtual void NotifyChange(WPARAM wParam, LPARAM lParam) = 0; // note: can be called on any thread + virtual LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) = 0; + virtual DWORD GetDlgId() const = 0; +}; + +// for n, I recommend using your dialog's resource ID +extern map mapDialogs; +template +INT_PTR CALLBACK MessageDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return mapDialogs[n]->DlgProc(hWnd,uMsg,wParam,lParam); +} +template +void ArtShowDialog(IUI* pDlg) +{ + mapDialogs[n] = pDlg; + + DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(pDlg->GetDlgId()), NULL, ::MessageDlgProc); +} + +// shows the open file dialog, sticks result in szPath... +// true -> path is good +// false -> was cancelled +bool ArtGetOpenFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); +bool ArtGetSaveFileName(HWND hWndOwner, LPCTSTR lpszTitle, LPTSTR lpszPath, int cchPath, LPCTSTR lpszFilter); diff --git a/PitsideConsole/PitsideConsole/LapReceiver.h b/PitsideConsole/PitsideConsole/LapReceiver.h index 6d5c5f7..0a7669f 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.h +++ b/PitsideConsole/PitsideConsole/LapReceiver.h @@ -1,413 +1,414 @@ -#pragma once - -#include -#include -#include -#include "ArtVector.h" -#include "ArtTools.h" -#include -#include "ArtSQL/ArtSQLite.h" - -using namespace std; - -struct TimePoint2D -{ -public: - TimePoint2D() {} - TimePoint2D(const TimePoint2D* pToFlip) // flips all the input bits - { - flX = FLIPBITS(pToFlip->flX); - flY = FLIPBITS(pToFlip->flY); - iTime = FLIPBITS(pToFlip->iTime); - flVelocity = FLIPBITS(pToFlip->flVelocity); - flSum = FLIPBITS(pToFlip->flSum); - } - bool IsValid() - { - float flComputedSum = flX + flY; - if(flSum == flComputedSum) return true; - return false; - } - bool operator != (const TimePoint2D& pt) const - { - return flX != pt.flX || flY != pt.flY || iTime != pt.iTime || flVelocity != pt.flVelocity; - } - - // flWeight: 0.0 -> entirely pt1. 1.0 -> entirely pt2. 0.5 -> normal averaging - static TimePoint2D Average(const TimePoint2D& pt1, const TimePoint2D& pt2, float flWeight) - { - float fl1Minus = 1.0f - flWeight; - TimePoint2D ptRet; - ptRet.flVelocity = fl1Minus*pt1.flVelocity + flWeight*pt2.flVelocity; - ptRet.flX = fl1Minus*pt1.flX + flWeight*pt2.flX; - ptRet.flY = fl1Minus*pt1.flY + flWeight*pt2.flY; - ptRet.iTime = (int)(fl1Minus*pt1.iTime + flWeight*pt2.iTime); - ptRet.flSum = (ptRet.flX + ptRet.flY); - return ptRet; - } - Vector2D operator - (const TimePoint2D& pt) const - { - Vector2D ret; - ret.m_v[0] = flX - pt.flX; - ret.m_v[1] = flY - pt.flY; - return ret; - } - Vector2D V2D() const - { - Vector2D ret; - ret.m_v[0] = flX; - ret.m_v[1] = flY; - return ret; - } - - float flX; - float flY; - int iTime; // the time since the phone app started that this point was received (in milliseconds) - float flVelocity; - float flSum; -}; - -struct DataPoint -{ - DataPoint() : flValue(0),iTimeMs(0) {} - DataPoint(int iTimeMs, float flValue) : flValue(flValue),iTimeMs(iTimeMs) {} - float flValue; - int iTimeMs; -}; - -enum DATA_CHANNEL; -struct InputChannelRaw -{ - int iLapId; - int eChannelType; - int cPoints; - DataPoint rgPoints[1]; -}; - -struct V1InputLapRaw -{ - int iLapId; - int cCount; - float dTime; - int iStartTime; // start time of the lap in unix time (seconds since 1970) - float rgSF[12]; // the 6 points (in 3 pairs) designating split 1, split 2, and start/finish. - float rgSFDir[6]; // the 3 vectors (x1,y1,x2,y2,x3,y3) showing direction of the SF lines - TimePoint2D rgPoints[1]; -}; -struct V2InputLapRaw -{ - int iVersion_1; // redundant versions. we don't want to get it wrong - int iVersion_2; - int iCarNumber; - int iSecondaryCarNumber; - int iLapId; - int cCount; - float dTime; - int iStartTime; // start time of the lap in unix time (seconds since 1970) - float rgSF[12]; // the 6 points (in 3 pairs) designating split 1, split 2, and start/finish. - float rgSFDir[6]; // the 3 vectors (x1,y1,x2,y2,x3,y3) showing direction of the SF lines - TimePoint2D rgPoints[1]; -}; - +#pragma once + +#include +#include +#include +#include "ArtVector.h" +#include "ArtTools.h" +#include +#include "ArtSQL/ArtSQLite.h" + +using namespace std; + +struct TimePoint2D +{ +public: + TimePoint2D() {} + TimePoint2D(const TimePoint2D* pToFlip) // flips all the input bits + { + flX = FLIPBITS(pToFlip->flX); + flY = FLIPBITS(pToFlip->flY); + iTime = FLIPBITS(pToFlip->iTime); + flVelocity = FLIPBITS(pToFlip->flVelocity); + flSum = FLIPBITS(pToFlip->flSum); + } + bool IsValid() + { + float flComputedSum = flX + flY; + if(flSum == flComputedSum) return true; + return false; + } + bool operator != (const TimePoint2D& pt) const + { + return flX != pt.flX || flY != pt.flY || iTime != pt.iTime || flVelocity != pt.flVelocity; + } + + // flWeight: 0.0 -> entirely pt1. 1.0 -> entirely pt2. 0.5 -> normal averaging + static TimePoint2D Average(const TimePoint2D& pt1, const TimePoint2D& pt2, float flWeight) + { + float fl1Minus = 1.0f - flWeight; + TimePoint2D ptRet; + ptRet.flVelocity = fl1Minus*pt1.flVelocity + flWeight*pt2.flVelocity; + ptRet.flX = fl1Minus*pt1.flX + flWeight*pt2.flX; + ptRet.flY = fl1Minus*pt1.flY + flWeight*pt2.flY; + ptRet.iTime = (int)(fl1Minus*pt1.iTime + flWeight*pt2.iTime); + ptRet.flSum = (ptRet.flX + ptRet.flY); + return ptRet; + } + Vector2D operator - (const TimePoint2D& pt) const + { + Vector2D ret; + ret.m_v[0] = flX - pt.flX; + ret.m_v[1] = flY - pt.flY; + return ret; + } + Vector2D V2D() const + { + Vector2D ret; + ret.m_v[0] = flX; + ret.m_v[1] = flY; + return ret; + } + + float flX; + float flY; + int iTime; // the time since the phone app started that this point was received (in milliseconds) + float flVelocity; + float flSum; +}; + +struct DataPoint +{ + DataPoint() : flValue(0),iTimeMs(0) {} + DataPoint(int iTimeMs, float flValue) : flValue(flValue),iTimeMs(iTimeMs) {} + float flValue; + int iTimeMs; +}; + +enum DATA_CHANNEL; +struct InputChannelRaw +{ + int iLapId; + int eChannelType; + int cPoints; + DataPoint rgPoints[1]; +}; + +struct V1InputLapRaw +{ + int iLapId; + int cCount; + float dTime; + int iStartTime; // start time of the lap in unix time (seconds since 1970) + float rgSF[12]; // the 6 points (in 3 pairs) designating split 1, split 2, and start/finish. + float rgSFDir[6]; // the 3 vectors (x1,y1,x2,y2,x3,y3) showing direction of the SF lines + TimePoint2D rgPoints[1]; +}; +struct V2InputLapRaw +{ + int iVersion_1; // redundant versions. we don't want to get it wrong + int iVersion_2; + int iCarNumber; + int iSecondaryCarNumber; + int iLapId; + int cCount; + float dTime; + int iStartTime; // start time of the lap in unix time (seconds since 1970) + float rgSF[12]; // the 6 points (in 3 pairs) designating split 1, split 2, and start/finish. + float rgSFDir[6]; // the 3 vectors (x1,y1,x2,y2,x3,y3) showing direction of the SF lines + TimePoint2D rgPoints[1]; +}; + // CDataChannelFilter is a functino to allow for data transformations inputed by the user - KDJ class CDataChannelFilter { public: virtual float ApplyTo(float flValue) const = 0; }; - -class IDataChannel -{ -public: - virtual void Load(InputChannelRaw* pData) = 0; - virtual bool Load(CSfArtSQLiteDB& db, CSfArtSQLiteQuery& dc, bool fLazyLoad) = 0; - virtual void Init(int iLapId, DATA_CHANNEL eChannel) = 0; - virtual bool IsValid() const = 0; - virtual bool IsSameChannel(const IDataChannel* pOther) const = 0; - - virtual int GetLapId() const = 0; - - // random-access version: slower - virtual float GetValue(int iTime) const = 0; - // the iterator points to the DataPoint with time greater than the current time - virtual float GetValue(int iTime, const vector::const_iterator& i) const = 0; - virtual float GetMin() const = 0; - virtual float GetMax() const = 0; - virtual int GetEndTimeMs() const = 0; - virtual int GetStartTimeMs() const = 0; - - virtual const vector& GetData() const = 0; - - virtual void AddPoint(int iTime, float flValue) = 0; - virtual DATA_CHANNEL GetChannelType() const = 0; - // when you lock a data channel, it means that no more points may be added to it ever. - // it also sorts the vector - virtual void Lock() = 0; - virtual bool IsLocked() const = 0; -}; -class CDataChannel : public IDataChannel -{ -public: - CDataChannel(); - virtual ~CDataChannel(); - - void Load(InputChannelRaw* pData) override; - bool Load(CSfArtSQLiteDB& db, CSfArtSQLiteQuery& dc, bool fLazyLoad) override; - void Init(int iLapId, DATA_CHANNEL eChannel) override; - bool IsValid() const override; - bool IsSameChannel(const IDataChannel* pOther) const override; - - int GetLapId() const override; - - // random-access version: slower - float GetValue(int iTime) const override; - // the iterator points to the DataPoint with time greater than the current time - float GetValue(int iTime, const vector::const_iterator& i) const override; - float GetMin() const override; - float GetMax() const override; - int GetEndTimeMs() const override; - int GetStartTimeMs() const override; - - const vector& GetData() const override {return lstData;} - - void AddPoint(int iTime, float flValue) override; // iTime must be in milliseconds since the phone app started. flValue can be whatever you want - DATA_CHANNEL GetChannelType() const override {return eChannelType;} - // when you lock a data channel, it means that no more points may be added to it ever. - // it also sorts the vector - void Lock() override; - bool IsLocked() const override {return fLocked;} -private: - void DoLoad(CSfArtSQLiteDB& db, int channelId); - void CheckLazyLoad() const - { - CDataChannel* pChan = (CDataChannel*)this; // gross.... - if(m_fLazyLoad && !fLocked) - { - pChan->DoLoad(*m_db,m_iChannelId); - pChan->Lock(); - } - } -private: - int m_iChannelId; - - bool fLocked; - int iLapId; - DATA_CHANNEL eChannelType; - mutable vector lstData; - - float m_dMin; - float m_dMax; - - int m_msMin; // start time (milliseconds since app start) - int m_msMax; // end time (milliseconds since app start) - - bool m_fLazyLoad; - mutable CSfArtSQLiteDB* m_db; -}; - - -class StartFinish -{ -public: - StartFinish() - { - } - StartFinish(float* pPointData) - { - m_pt1.m_v[0] = pPointData[0]; - m_pt1.m_v[1] = pPointData[1]; - m_pt2.m_v[0] = pPointData[2]; - m_pt2.m_v[1] = pPointData[3]; - } - const Vector2D& GetPt1() const {return m_pt1;} - const Vector2D& GetPt2() const {return m_pt2;} -// Vector2D& GetPt1() const {return m_pt1;} -// Vector2D& GetPt2() const {return m_pt2;} -//private: // Made public by KDJ - Vector2D m_pt1; - Vector2D m_pt2; -}; - -struct CARNUMBERCOMBO -{ - int iCarNumber; - int iSecondaryCarNumber; - bool IsOldVersion() const {return iCarNumber == -1 && iSecondaryCarNumber == -1;} - bool operator <(const CARNUMBERCOMBO& sfOther) const - { - return Hash() < sfOther.Hash(); - } -private: - int Hash() const - { - return (iCarNumber<<16) | iSecondaryCarNumber; - } -}; - -// a more civilized lap, constructed from InputLapRaw and sent to the user's ILapReceiver -interface ILap -{ -public: - virtual void Load(V1InputLapRaw* pLap) = 0; - virtual void Load(V2InputLapRaw* pLap) = 0; - virtual bool Load(CSfArtSQLiteDB& db, StartFinish* rgSF, CSfArtSQLiteQuery& line) = 0; - virtual void Free() = 0; // delete the lap - - virtual bool IsValid() const = 0; - virtual int GetStartTime() const = 0; - virtual int GetLapId() const = 0; - virtual float GetTime() const = 0; - virtual const vector GetPoints() const = 0; - virtual const StartFinish* GetSF() const = 0; - virtual wstring GetComment() const = 0; - virtual void SetComment(wstring strComment) const = 0; - - virtual CARNUMBERCOMBO GetCarNumbers() const = 0; -private: -}; -class CMemoryLap : public ILap -{ -public: - CMemoryLap() - { - - } - void Load(V1InputLapRaw* pLap); - void Load(V2InputLapRaw* pLap); - bool Load(CSfArtSQLiteDB& db, StartFinish* rgSF, CSfArtSQLiteQuery& line); - virtual void Free()override {delete this;}; - - bool IsValid() const - { - return dTime < 3600 && dTime > 3.0 && lstPoints.size() > 0; - } - int GetStartTime() const {return iStartTime;} // returns the start time in unix time (seconds since 1970) - int GetLapId() const {return iLapId;} - float GetTime() const {return dTime;} - const vector GetPoints() const {return lstPoints;} - const StartFinish* GetSF() const {return rgSF;} - wstring GetComment() const {return strComment;} - void SetComment(wstring strComment) const override {this->strComment = strComment;} - - virtual CARNUMBERCOMBO GetCarNumbers() const override - { - return sfCarNumbers; - } -private: - vector lstPoints; - StartFinish rgSF[3]; - Vector2D vDir[3]; - float dTime; - int iLapId; - int iStartTime; // seconds since Jan 1 1970 - mutable wstring strComment; - CARNUMBERCOMBO sfCarNumbers; -}; -template -struct TextMatcher -{ - char szToMatch[cToMatch]; - int cMatched; - bool Process(char c) - { - if(cMatched == cToMatch) - { - cMatched = 0; - } - if(szToMatch[cMatched] == c) - { - cMatched++; - } - else - { - cMatched = szToMatch[0] == c; - } - return cMatched == cToMatch; - } - int GetSize() const {return cToMatch;} - void Reset() - { - cMatched = 0; - } - TextMatcher(const char* pbMatch) - { - strcpy(szToMatch,pbMatch); - cMatched = 0; - } -}; - -enum NETSTATUSSTRING -{ - NETSTATUS_STATUS, - NETSTATUS_THISIP, - NETSTATUS_REMOTEIP, - NETSTATUS_DB, // parameter is the file location of the transmitted database file - - NETSTATUS_COUNT, -}; - -struct RACEDATA -{ - RACEDATA() - { - unixtime = 0; - laps = 0; - raceId = -1; - } - wstring strName; - int unixtime; - int laps; - int raceId; -}; - -interface ILapReceiver -{ -public: - // loading from file - virtual bool Init(LPCTSTR lpszSQL) = 0; - virtual bool InitRaceSession(int* iRaceId, LPCTSTR lpszName) = 0; - - // memory management - virtual ILap* AllocateLap(bool fMemory) = 0; - - virtual IDataChannel* AllocateDataChannel() const = 0; - virtual void FreeDataChannel(IDataChannel* pChannel) const = 0; - - // data access - // I chose to access all the laps at once to avoid race condition issues if the network thread updates - // the databank while the UI is displaying it - virtual bool IsActivelyReceiving(int iRaceId) const = 0; // returns whether a given raceId is receiving new laps this session - virtual int GetLastReceivedRaceId() const = 0; // gets the race ID of the last race that received a lap - virtual void GetLastLapTimeStamp(const vector& lstCarNumbers, vector& lstTimeStamps) const = 0; - virtual int GetLapCount(int iRaceId) const = 0; // gets the lap count for a given race - virtual vector GetRaces() = 0; - virtual vector GetLaps(int iRaceId) = 0; - virtual vector GetScoring(int iRaceId) = 0; - virtual const ILap* GetLap(int iLapId) = 0; - virtual const IDataChannel* GetDataChannel(int iLapId, DATA_CHANNEL eChannel) const = 0; - virtual set GetAvailableChannels(int iLapId) const = 0; - virtual void GetComments(int iLapId, vector& lstComments) const = 0; - - // modifying data - virtual void AddLap(const ILap* pLap, int iRaceId) = 0; - virtual void AddDataChannel(const IDataChannel* pChannel) = 0; - virtual void Clear() = 0; - virtual void AddComment(int iLapId, LPCTSTR strComment) = 0; - - // status strings - virtual void NotifyDBArrival(LPCTSTR lpszPath) = 0; - virtual void SetNetStatus(NETSTATUSSTRING eString, LPCTSTR szData) = 0; // network man tells us the latest status - virtual LPCTSTR GetNetStatus(NETSTATUSSTRING eString) const = 0; - virtual bool MergeLaps(int m_iRaceId1, int m_iRaceId2) = 0; - virtual bool RenameLaps(TCHAR szName[260], int m_RaceId1) = 0; -}; - -// net-thread entry point. Fills a ILapReceiver from the network -bool ReceiveLaps(int iPort, ILapReceiver* pLaps); - -// fills an ILapReceiver from an SQLite database -void LoadFromSQLite(LPCTSTR lpszSQL, int iRaceId, ILapReceiver* pRecv); - + +class IDataChannel +{ +public: + virtual void Load(InputChannelRaw* pData) = 0; + virtual bool Load(CSfArtSQLiteDB& db, CSfArtSQLiteQuery& dc, bool fLazyLoad) = 0; + virtual void Init(int iLapId, DATA_CHANNEL eChannel) = 0; + virtual bool IsValid() const = 0; + virtual bool IsSameChannel(const IDataChannel* pOther) const = 0; + + virtual int GetLapId() const = 0; + + // random-access version: slower + virtual float GetValue(int iTime) const = 0; + // the iterator points to the DataPoint with time greater than the current time + virtual float GetValue(int iTime, const vector::const_iterator& i) const = 0; + virtual float GetMin() const = 0; + virtual float GetMax() const = 0; + virtual int GetEndTimeMs() const = 0; + virtual int GetStartTimeMs() const = 0; + + virtual const vector& GetData() const = 0; + + virtual void AddPoint(int iTime, float flValue) = 0; + virtual DATA_CHANNEL GetChannelType() const = 0; + // when you lock a data channel, it means that no more points may be added to it ever. + // it also sorts the vector + virtual void Lock() = 0; + virtual bool IsLocked() const = 0; +}; +class CDataChannel : public IDataChannel +{ +public: + CDataChannel(); + virtual ~CDataChannel(); + + void Load(InputChannelRaw* pData) override; + bool Load(CSfArtSQLiteDB& db, CSfArtSQLiteQuery& dc, bool fLazyLoad) override; + void Init(int iLapId, DATA_CHANNEL eChannel) override; + bool IsValid() const override; + bool IsSameChannel(const IDataChannel* pOther) const override; + + int GetLapId() const override; + + // random-access version: slower + float GetValue(int iTime) const override; + // the iterator points to the DataPoint with time greater than the current time + float GetValue(int iTime, const vector::const_iterator& i) const override; + float GetMin() const override; + float GetMax() const override; + int GetEndTimeMs() const override; + int GetStartTimeMs() const override; + + const vector& GetData() const override {return lstData;} + + void AddPoint(int iTime, float flValue) override; // iTime must be in milliseconds since the phone app started. flValue can be whatever you want + DATA_CHANNEL GetChannelType() const override {return eChannelType;} + // when you lock a data channel, it means that no more points may be added to it ever. + // it also sorts the vector + void Lock() override; + bool IsLocked() const override {return fLocked;} +private: + void DoLoad(CSfArtSQLiteDB& db, int channelId); + void CheckLazyLoad() const + { + CDataChannel* pChan = (CDataChannel*)this; // gross.... + if(m_fLazyLoad && !fLocked) + { + pChan->DoLoad(*m_db,m_iChannelId); + pChan->Lock(); + } + } +private: + int m_iChannelId; + + bool fLocked; + int iLapId; + DATA_CHANNEL eChannelType; + mutable vector lstData; + + float m_dMin; + float m_dMax; + + int m_msMin; // start time (milliseconds since app start) + int m_msMax; // end time (milliseconds since app start) + + bool m_fLazyLoad; + mutable CSfArtSQLiteDB* m_db; +}; + + +class StartFinish +{ +public: + StartFinish() + { + } + StartFinish(float* pPointData) + { + m_pt1.m_v[0] = pPointData[0]; + m_pt1.m_v[1] = pPointData[1]; + m_pt2.m_v[0] = pPointData[2]; + m_pt2.m_v[1] = pPointData[3]; + } + const Vector2D& GetPt1() const {return m_pt1;} + const Vector2D& GetPt2() const {return m_pt2;} +// Vector2D& GetPt1() const {return m_pt1;} +// Vector2D& GetPt2() const {return m_pt2;} +//private: // Made public by KDJ + Vector2D m_pt1; + Vector2D m_pt2; +}; + +struct CARNUMBERCOMBO +{ + int iCarNumber; + int iSecondaryCarNumber; + bool IsOldVersion() const {return iCarNumber == -1 && iSecondaryCarNumber == -1;} + bool operator <(const CARNUMBERCOMBO& sfOther) const + { + return Hash() < sfOther.Hash(); + } +private: + int Hash() const + { + return (iCarNumber<<16) | iSecondaryCarNumber; + } +}; + +// a more civilized lap, constructed from InputLapRaw and sent to the user's ILapReceiver +interface ILap +{ +public: + virtual void Load(V1InputLapRaw* pLap) = 0; + virtual void Load(V2InputLapRaw* pLap) = 0; + virtual bool Load(CSfArtSQLiteDB& db, StartFinish* rgSF, CSfArtSQLiteQuery& line) = 0; + virtual void Free() = 0; // delete the lap + + virtual bool IsValid() const = 0; + virtual int GetStartTime() const = 0; + virtual int GetLapId() const = 0; + virtual float GetTime() const = 0; + virtual const vector GetPoints() const = 0; + virtual const StartFinish* GetSF() const = 0; + virtual wstring GetComment() const = 0; + virtual void SetComment(wstring strComment) const = 0; + + virtual CARNUMBERCOMBO GetCarNumbers() const = 0; +private: +}; +class CMemoryLap : public ILap +{ +public: + CMemoryLap() + { + + } + void Load(V1InputLapRaw* pLap); + void Load(V2InputLapRaw* pLap); + bool Load(CSfArtSQLiteDB& db, StartFinish* rgSF, CSfArtSQLiteQuery& line); + virtual void Free()override {delete this;}; + + bool IsValid() const + { + return dTime < 3600 && dTime > 3.0 && lstPoints.size() > 0; + } + int GetStartTime() const {return iStartTime;} // returns the start time in unix time (seconds since 1970) + int GetLapId() const {return iLapId;} + float GetTime() const {return dTime;} + const vector GetPoints() const {return lstPoints;} + const StartFinish* GetSF() const {return rgSF;} + wstring GetComment() const {return strComment;} + void SetComment(wstring strComment) const override {this->strComment = strComment;} + + virtual CARNUMBERCOMBO GetCarNumbers() const override + { + return sfCarNumbers; + } +private: + vector lstPoints; + StartFinish rgSF[3]; + Vector2D vDir[3]; + float dTime; + int iLapId; + int iStartTime; // seconds since Jan 1 1970 + mutable wstring strComment; + CARNUMBERCOMBO sfCarNumbers; +}; +template +struct TextMatcher +{ + char szToMatch[cToMatch]; + int cMatched; + bool Process(char c) + { + if(cMatched == cToMatch) + { + cMatched = 0; + } + if(szToMatch[cMatched] == c) + { + cMatched++; + } + else + { + cMatched = szToMatch[0] == c; + } + return cMatched == cToMatch; + } + int GetSize() const {return cToMatch;} + void Reset() + { + cMatched = 0; + } + TextMatcher(const char* pbMatch) + { + strcpy(szToMatch,pbMatch); + cMatched = 0; + } +}; + +enum NETSTATUSSTRING +{ + NETSTATUS_STATUS, + NETSTATUS_THISIP, + NETSTATUS_REMOTEIP, + NETSTATUS_DB, // parameter is the file location of the transmitted database file + + NETSTATUS_COUNT, +}; + +struct RACEDATA +{ + RACEDATA() + { + unixtime = 0; + laps = 0; + raceId = -1; + } + wstring strName; + int unixtime; + int laps; + int raceId; +}; + +interface ILapReceiver +{ +public: + // loading from file + virtual bool Init(LPCTSTR lpszSQL) = 0; + virtual bool InitRaceSession(int* iRaceId, LPCTSTR lpszName) = 0; + + // memory management + virtual ILap* AllocateLap(bool fMemory) = 0; + + virtual IDataChannel* AllocateDataChannel() const = 0; + virtual void FreeDataChannel(IDataChannel* pChannel) const = 0; + + // data access + // I chose to access all the laps at once to avoid race condition issues if the network thread updates + // the databank while the UI is displaying it + virtual bool IsActivelyReceiving(int iRaceId) const = 0; // returns whether a given raceId is receiving new laps this session + virtual int GetLastReceivedRaceId() const = 0; // gets the race ID of the last race that received a lap + virtual void GetLastLapTimeStamp(const vector& lstCarNumbers, vector& lstTimeStamps) const = 0; + virtual int GetLapCount(int iRaceId) const = 0; // gets the lap count for a given race + virtual vector GetRaces() = 0; + virtual vector GetLaps(int iRaceId) = 0; + virtual vector GetScoring(int iRaceId) = 0; + virtual const ILap* GetLap(int iLapId) = 0; + virtual const ILap* GetLastLap() = 0; + virtual const IDataChannel* GetDataChannel(int iLapId, DATA_CHANNEL eChannel) const = 0; + virtual set GetAvailableChannels(int iLapId) const = 0; + virtual void GetComments(int iLapId, vector& lstComments) const = 0; + + // modifying data + virtual void AddLap(const ILap* pLap, int iRaceId) = 0; + virtual void AddDataChannel(const IDataChannel* pChannel) = 0; + virtual void Clear() = 0; + virtual void AddComment(int iLapId, LPCTSTR strComment) = 0; + + // status strings + virtual void NotifyDBArrival(LPCTSTR lpszPath) = 0; + virtual void SetNetStatus(NETSTATUSSTRING eString, LPCTSTR szData) = 0; // network man tells us the latest status + virtual LPCTSTR GetNetStatus(NETSTATUSSTRING eString) const = 0; + virtual bool MergeLaps(int m_iRaceId1, int m_iRaceId2) = 0; + virtual bool RenameLaps(TCHAR szName[260], int m_RaceId1) = 0; +}; + +// net-thread entry point. Fills a ILapReceiver from the network +bool ReceiveLaps(int iPort, ILapReceiver* pLaps); + +// fills an ILapReceiver from an SQLite database +void LoadFromSQLite(LPCTSTR lpszSQL, int iRaceId, ILapReceiver* pRecv); + class PassThroughFilter : public CDataChannelFilter { public: @@ -428,6 +429,6 @@ class SmoothedFilter : public CDataChannelFilter // Smoothes the data channel fo return flValue; } }; - -void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ); + +void fBoxMovingAvg( int n, vector& lstPoints, int w, vector& lstSmoothPts ); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index dd17cd5..2d3f162 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1,37 +1,37 @@ -// PitsideConsole.cpp : Defines the entry point for the console application. -// - -#include "stdafx.h" -#include "pitsideconsole.h" -#include "LapReceiver.h" -#include -#include "AutoCS.h" -#include -#include -//#include "sdl.h" -#include "resource.h" -#include "ArtUI.h" -#include "ArtTools.h" -#include "Windowsx.h" -#include -#include -#include "ArtVector.h" -#include "LapPainter.h" -#include "LapData.h" -#include "DlgMessage.h" -#include "DlgRaceSelect.h" -#include "DlgRaceSelectEdit.h" -#include "DlgPlotSelect.h" // Added by KDJ for Preferences menu -#include "Iphlpapi.h" -#include "ArtSQL/ArtSQLite.h" -#include -#include "DashWare.h" -#include "Multicast.h" -#include "PitsideHTTP.h" -#include "SQLiteLapDB.h" -#include "UnitTests.h" -#include -#include "Winuser.h" +// PitsideConsole.cpp : Defines the entry point for the console application. +// + +#include "stdafx.h" +#include "pitsideconsole.h" +#include "LapReceiver.h" +#include +#include "AutoCS.h" +#include +#include +//#include "sdl.h" +#include "resource.h" +#include "ArtUI.h" +#include "ArtTools.h" +#include "Windowsx.h" +#include +#include +#include "ArtVector.h" +#include "LapPainter.h" +#include "LapData.h" +#include "DlgMessage.h" +#include "DlgRaceSelect.h" +#include "DlgRaceSelectEdit.h" +#include "DlgPlotSelect.h" // Added by KDJ for Preferences menu +#include "Iphlpapi.h" +#include "ArtSQL/ArtSQLite.h" +#include +#include "DashWare.h" +#include "Multicast.h" +#include "PitsideHTTP.h" +#include "SQLiteLapDB.h" +#include "UnitTests.h" +#include +#include "Winuser.h" #include "Hyperlinks.h" #include "DlgAbout.h" #include @@ -43,256 +43,98 @@ #include "DlgSelectSessions.h" #include "DlgTimingScoring.h" -//#pragma comment(lib,"sdl.lib") -using namespace std; - -ILapReceiver* g_pLapDB = NULL; - -SimpleHTTPServer* g_pHTTPServer = NULL; - -struct COMPUTERDESC -{ -public: - char szDesc[100]; // computer name -}; - -class MCResponder : public MulticastResponseGenerator -{ -public: - virtual void GetResponse(const char* pbReceived, int cbReceived, char** ppbResponse, int* pcbResponse) override - { - COMPUTERDESC* pResp = new COMPUTERDESC(); - - TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH +1] = L""; - DWORD cchComputerName = MAX_COMPUTERNAME_LENGTH +1; - BOOL fSuccess = GetComputerName(szComputerName, &cchComputerName); - - if(fSuccess) - { - sprintf(pResp->szDesc,"%S",szComputerName); - } - else - { - sprintf(pResp->szDesc,"Unknown Computer"); - } - *ppbResponse = (char*)pResp; - *pcbResponse = sizeof(*pResp); - } -}; - -bool CLap_SortByTime(const ILap* p1, const ILap* p2) -{ - return p1->GetStartTime() < p2->GetStartTime(); -} -// this object takes the laps received on the net thread, stores them, and notifies the UI of the new laps -class CLapReceiver : public ILapReceiver -{ -public: - CLapReceiver(IUI* pUI) : m_pUI(pUI) - { - for(int x = 0; x < NETSTATUS_COUNT; x++) - { - szLastNetStatus[x][0] = '\0'; - } - } - virtual ~CLapReceiver() {}; - - void Clear() override - { - AutoLeaveCS _cs(&m_cs); - - for(int x = 0;x < m_lstLaps.size(); x++) - { - delete m_lstLaps[x]; - } - m_lstLaps.clear(); - - ChannelMap::iterator i = m_mapChannels.begin(); - while(i != m_mapChannels.end()) - { - map::iterator i2 = i->second.begin(); - while(i2 != i->second.end()) - { - FreeDataChannel((IDataChannel*)(i2->second)); - i2++; - } - i++; - } - m_mapChannels.clear(); - m_pUI->NotifyChange(NOTIFY_NEWDATA,(LPARAM)this); - } - - void AddLap(const ILap* pLap, int iRaceId) override - { - { - AutoLeaveCS _cs(&m_cs); - m_lstLaps.push_back(pLap); - } - m_pUI->NotifyChange(NOTIFY_NEWLAP,(LPARAM)this); - } - void AddDataChannel(const IDataChannel* pDataChannel) override - { - DASSERT(pDataChannel->IsLocked()); - - bool fFoundHome = false; - { - AutoLeaveCS _cs(&m_cs); - map& mapChannels = m_mapChannels[pDataChannel->GetLapId()]; - map::iterator i = mapChannels.find(pDataChannel->GetChannelType()); - if(i != mapChannels.end()) - { - // we already had one. The correct thing to do would be to free it. - IDataChannel* pChannel = const_cast(i->second); - } - - mapChannels[pDataChannel->GetChannelType()] = pDataChannel; - } - - m_pUI->NotifyChange(NOTIFY_NEWDATA,(LPARAM)this); - } - ILap* AllocateLap(bool fMemory) override - { - return new CMemoryLap(); - } - IDataChannel* AllocateDataChannel() const override - { - return new CDataChannel(); - } - void FreeDataChannel(IDataChannel* pInput) const override - { - delete pInput; - } - void SetNetStatus(NETSTATUSSTRING eString, LPCTSTR sz) override - { - wcscpy(szLastNetStatus[eString], sz); - m_pUI->NotifyChange(NOTIFY_NEWNETSTATUS,(LPARAM)this); - } - void NotifyDBArrival(LPCTSTR szPath) - { - wcscpy(szLastNetStatus[NETSTATUS_DB],szPath); - m_pUI->NotifyChange(NOTIFY_NEWDATABASE,(LPARAM)szLastNetStatus[NETSTATUS_DB]); - } - LPCTSTR GetNetStatus(NETSTATUSSTRING eString) const - { - return szLastNetStatus[eString]; - } - virtual vector GetLaps(int iRaceId) override - { - AutoLeaveCS _cs(&m_cs); - vector ret; - for(int x = 0;x < m_lstLaps.size();x++) - { - ret.push_back(m_lstLaps[x]); - } - return ret; - } - virtual const ILap* GetLap(int iLapId) override - { - AutoLeaveCS _cs(&m_cs); - for(int x = 0; x < m_lstLaps.size(); x++) - { - if(m_lstLaps[x]->GetLapId() == iLapId) - { - return m_lstLaps[x]; - } - } - return NULL; - } - virtual const IDataChannel* GetDataChannel(int iLapId,DATA_CHANNEL eChannel) const override - { - AutoLeaveCS _cs(&m_cs); - ChannelMap::const_iterator i = m_mapChannels.find(iLapId); - if(i != m_mapChannels.end()) - { - // ok, we've got stuff about that lap... - map::const_iterator i2 = i->second.find(eChannel); - if(i2 != i->second.end()) - { - return i2->second; - } - } - return NULL; - } - virtual set GetAvailableChannels(int iLapId) const override - { - AutoLeaveCS _cs(&m_cs); - set setRet; - - ChannelMap::const_iterator i = m_mapChannels.find(iLapId); - if(i != m_mapChannels.end()) - { - // ok, we've got stuff about that lap... - map::const_iterator i2 = i->second.begin(); - while(i2 != i->second.end()) - { - setRet.insert(i2->first); - i2++; - } - } - return setRet; - }; -private: - vector m_lstLaps; - - typedef map > ChannelMap; // for each lapid, defines a map from channeltype to channel - mutable ChannelMap m_mapChannels; // maps from a lapid to a list of data channels for that lap - - IUI* m_pUI; - TCHAR szLastNetStatus[NETSTATUS_COUNT][200]; - mutable ManagedCS m_cs; -}; - -IUI* g_pUI = NULL; - -INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if(g_pUI) - { - return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); - } - return FALSE; -} - -#define WM_NOTIFYUPDATE (WM_USER+0x1) -#define WM_UPDATEUI (WM_USER+0x2) - -bool CExtendedLap_SortByTime(const CExtendedLap* p1, const CExtendedLap* p2) -{ - return p1->GetLap()->GetStartTime() < p2->GetLap()->GetStartTime(); -} +//#pragma comment(lib,"sdl.lib") +using namespace std; + +ILapReceiver* g_pLapDB = NULL; + +SimpleHTTPServer* g_pHTTPServer = NULL; + +struct COMPUTERDESC +{ +public: + char szDesc[100]; // computer name +}; + +class MCResponder : public MulticastResponseGenerator +{ +public: + virtual void GetResponse(const char* pbReceived, int cbReceived, char** ppbResponse, int* pcbResponse) override + { + COMPUTERDESC* pResp = new COMPUTERDESC(); + + TCHAR szComputerName[MAX_COMPUTERNAME_LENGTH +1] = L""; + DWORD cchComputerName = MAX_COMPUTERNAME_LENGTH +1; + BOOL fSuccess = GetComputerName(szComputerName, &cchComputerName); + + if(fSuccess) + { + sprintf(pResp->szDesc,"%S",szComputerName); + } + else + { + sprintf(pResp->szDesc,"Unknown Computer"); + } + *ppbResponse = (char*)pResp; + *pcbResponse = sizeof(*pResp); + } +}; + +bool CLap_SortByTime(const ILap* p1, const ILap* p2) +{ + return p1->GetStartTime() < p2->GetStartTime(); +} +IUI* g_pUI = NULL; + +INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(g_pUI) + { + return g_pUI->DlgProc(hWnd,uMsg,wParam,lParam); + } + return FALSE; +} + +#define WM_NOTIFYUPDATE (WM_USER+0x1) +#define WM_UPDATEUI (WM_USER+0x2) + +bool CExtendedLap_SortByTime(const CExtendedLap* p1, const CExtendedLap* p2) +{ + return p1->GetLap()->GetStartTime() < p2->GetLap()->GetStartTime(); +} bool CExtendedLap_SortByLapTime(const CExtendedLap* p1, const CExtendedLap* p2) { return p1->GetLap()->GetTime() < p2->GetLap()->GetTime(); // GetTime() or whatever the function is that gets lap time } - -class CMainUI : public IUI,public ILapSupplier -{ -public: - CMainUI() - : m_sfLapPainter(static_cast(this),SUPPLIERID_MAINDISPLAY), - m_sfSubDisplay(static_cast(this),SUPPLIERID_SUBDISPLAY), -// m_sfSubWindow(static_cast(this),SUPPLIERID_SUBWINDOW), - m_sfTractionDisplay(static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), - m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view - m_fShowTractionCircle(false), - m_fSmooth(false), - m_fShowBests(false), - m_fShowDriverBests(false), - m_fShowReferenceLap(true), - m_pReferenceLap(NULL), - m_eXChannel(DATA_CHANNEL_DISTANCE), - m_fdwUpdateNeeded(0), - m_flShiftX(0), - m_flShiftY(0) - { - m_iRaceId[0] = 0; - m_lstYChannels.push_back(DATA_CHANNEL_VELOCITY); - m_szCommentText[0] = '\0'; - m_szMessageStatus[0] = '\0'; - SetupMulticast(); - } - DWORD tmNow, tmLast; // Variables for setting up receive time / live car position - + +class CMainUI : public IUI,public ILapSupplier +{ +public: + CMainUI() + : m_sfLapPainter(static_cast(this),SUPPLIERID_MAINDISPLAY), + m_sfSubDisplay(static_cast(this),SUPPLIERID_SUBDISPLAY), +// m_sfSubWindow(static_cast(this),SUPPLIERID_SUBWINDOW), + m_sfTractionDisplay(static_cast(this),SUPPLIERID_TRACTIONCIRCLEDISPLAY), + m_eLapDisplayStyle(LAPDISPLAYSTYLE_PLOT), // Make data plot the default initial view + m_fShowTractionCircle(false), + m_fSmooth(false), + m_fShowBests(false), + m_fShowDriverBests(false), + m_fShowReferenceLap(true), + m_pReferenceLap(NULL), + m_eXChannel(DATA_CHANNEL_DISTANCE), + m_fdwUpdateNeeded(0), + m_flShiftX(0), + m_flShiftY(0) + { + m_iRaceId[0] = 0; + m_lstYChannels.push_back(DATA_CHANNEL_VELOCITY); + m_szCommentText[0] = '\0'; + m_szMessageStatus[0] = '\0'; + SetupMulticast(); + } + DWORD tmNow, tmLast; // Variables for setting up receive time / live car position + ////////////////////////////////////////////////////////////////////////////////// RECT rect; HBITMAP hBitmap; @@ -303,23 +145,23 @@ class CMainUI : public IUI,public ILapSupplier HPALETTE hpal; int cxsize, cxpage; int cysize, cypage; -////////////////////////////////////////////////////////////////////////////////// - -void SetRaceId(int iRaceId[50]) - { - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = iRaceId[z]; // Load all of the race sessions chosen - } - } - void NotifyChange(WPARAM wParam, LPARAM lParam) override - { - if(m_hWnd != NULL) - { - PostMessage(m_hWnd,WM_NOTIFYUPDATE,wParam,(LPARAM)lParam); - } - } - +////////////////////////////////////////////////////////////////////////////////// + +void SetRaceId(int iRaceId[50]) + { + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = iRaceId[z]; // Load all of the race sessions chosen + } + } + void NotifyChange(WPARAM wParam, LPARAM lParam) override + { + if(m_hWnd != NULL) + { + PostMessage(m_hWnd,WM_NOTIFYUPDATE,wParam,(LPARAM)lParam); + } + } + int str_ends_with(const TCHAR * str, const TCHAR * suffix) { if( str == NULL || suffix == NULL ) @@ -333,9 +175,9 @@ void SetRaceId(int iRaceId[50]) return 0 == wcsncmp( str + str_len - suffix_len, suffix, suffix_len ); } - LAPSUPPLIEROPTIONS m_sfLapOpts; - TCHAR m_szPath[MAX_PATH]; - + LAPSUPPLIEROPTIONS m_sfLapOpts; + TCHAR m_szPath[MAX_PATH]; + ///////////////////////////////////////////////////////////////////////////////// // Functions for enabling Printing of OpenGL graphs HDC GetPrinterDC (HWND Hwnd) @@ -488,8 +330,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // Return the modified DevMode structure. return pDevMode; } -/////////////////////////////////////////////////////////////////////////////////// -// Tentative code for Custom Draw of ListViews implementation +/////////////////////////////////////////////////////////////////////////////////// +// Tentative code for Custom Draw of ListViews implementation LRESULT ProcessCustomDraw (LPARAM lParam, WPARAM wParam, INT i_Color) { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; @@ -557,372 +399,372 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } return CDRF_DODEFAULT; } - -///////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////// HWND hWnd_AllData; // AllData window control handle HWND AD_hWnd; // AllData listview control handle - LVITEM p_ADlvi; // Listview global pointer for Hot Laps - HWND hWndShowSplits; // Show Sectors window control handle + LVITEM p_ADlvi; // Listview global pointer for Hot Laps + HWND hWndShowSplits; // Show Sectors window control handle HWND HC_ShowSplits; // Handle to the Splits listview control // HWND sub_hWnd; // Handle to the SubWindow, to get to the SubDisplay control BOOL b_GreyColor; // Switch for painting listviews with alternating lines of color INT i_SubItemBest, i_SubItemWorst; - LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) - { - if(m_sfLapPainter.HandleMessage(hWnd,uMsg,wParam,lParam)) - { - return 0; - } - - // Update and show Current Lap Time - TCHAR szTemp[512], szLap[512]; - HWND hWndIp = GetDlgItem(m_hWnd, IDC_LIVELAPTIME); - static WINDOWPLACEMENT w_AllDataWindow; // Save the location for the AllData display window - static WINDOWPLACEMENT w_SectorTimesWindow; // Save the location for the Sector Times display window + LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + if(m_sfLapPainter.HandleMessage(hWnd,uMsg,wParam,lParam)) + { + return 0; + } + + // Update and show Current Lap Time + TCHAR szTemp[512], szLap[512]; + HWND hWndIp = GetDlgItem(m_hWnd, IDC_LIVELAPTIME); + static WINDOWPLACEMENT w_AllDataWindow; // Save the location for the AllData display window + static WINDOWPLACEMENT w_SectorTimesWindow; // Save the location for the Sector Times display window ::FormatTimeMinutesSecondsMs((float)(timeGetTime() - tmLast) / 1000, szLap, NUMCHARS(szLap) ); - swprintf(szLap, _tcslen(szLap) - 2, L"%s", szLap); // Remove the fractional time - swprintf(szTemp, NUMCHARS(szTemp), L"Current Lap: %s", szLap); // Final string to show current lap time - SendMessage(hWndIp, WM_SETTEXT, 0, (LPARAM)szTemp); - - switch(uMsg) - { - case WM_INITDIALOG: - { - m_hWnd = hWnd; + swprintf(szLap, _tcslen(szLap) - 2, L"%s", szLap); // Remove the fractional time + swprintf(szTemp, NUMCHARS(szTemp), L"Current Lap: %s", szLap); // Final string to show current lap time + SendMessage(hWndIp, WM_SETTEXT, 0, (LPARAM)szTemp); + + switch(uMsg) + { + case WM_INITDIALOG: + { + m_hWnd = hWnd; hWndShowSplits = NULL; - { - vector lstCols; - vector lstWidths; - CExtendedLap::GetStringHeadersXAxis(lstCols,lstWidths); - m_sfXAxis.Init(GetDlgItem(m_hWnd, IDC_XAXIS),lstCols,lstWidths); - CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file - } - { - vector lstCols; - vector lstWidths; - CExtendedLap::GetStringHeadersYAxis(lstCols,lstWidths); - m_sfYAxis.Init2(GetDlgItem(m_hWnd, IDC_YAXIS),lstCols,lstWidths); - } - { - vector lstCols; - vector lstWidths; - CExtendedLap::GetStringHeadersDataValues(lstCols,lstWidths); - m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_DATAVALUES), lstCols,lstWidths); - } - { - vector lstCols; - vector lstWidths; - CExtendedLap::GetStringHeaders(lstCols,lstWidths); - m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); - } - m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); -// ArtShowDialog(s_pUI); -// sub_hWnd = GetDlgItem(m_hWnd,IDD_DLGSUBDISPLAY); + { + vector lstCols; + vector lstWidths; + CExtendedLap::GetStringHeadersXAxis(lstCols,lstWidths); + m_sfXAxis.Init(GetDlgItem(m_hWnd, IDC_XAXIS),lstCols,lstWidths); + CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file + } + { + vector lstCols; + vector lstWidths; + CExtendedLap::GetStringHeadersYAxis(lstCols,lstWidths); + m_sfYAxis.Init2(GetDlgItem(m_hWnd, IDC_YAXIS),lstCols,lstWidths); + } + { + vector lstCols; + vector lstWidths; + CExtendedLap::GetStringHeadersDataValues(lstCols,lstWidths); + m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_DATAVALUES), lstCols,lstWidths); + } + { + vector lstCols; + vector lstWidths; + CExtendedLap::GetStringHeaders(lstCols,lstWidths); + m_sfLapList.Init(GetDlgItem(m_hWnd, IDC_LAPS), lstCols,lstWidths); + } + m_sfLapPainter.Init(GetDlgItem(hWnd,IDC_DISPLAY)); +// ArtShowDialog(s_pUI); +// sub_hWnd = GetDlgItem(m_hWnd,IDD_DLGSUBDISPLAY); // sub_hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, L"SubDisplay", L"SubDisplay", WS_POPUP | WS_SYSMENU | WS_THICKFRAME | WS_CAPTION, 586, 0, 87, 63, m_hWnd, NULL, GetModuleHandle(0), NULL); -// m_sfSubDisplay.Init(GetDlgItem(sub_hWnd,IDC_SUBDISPLAY)); - m_sfSubDisplay.Init(GetDlgItem(m_hWnd,IDC_SUBDISPLAY)); - m_sfTractionDisplay.Init(GetDlgItem(m_hWnd,IDC_TRACTIONCIRCLEMAP)); - - LoadLaps(g_pLapDB); - if (m_sfLapOpts.LapId != 0 && m_mapLaps.size() > 0) // Reference lap needs to be loaded. Identify which one it is and set it - { - for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) - { - if(i->second->GetLap()->GetLapId() == m_sfLapOpts.LapId) - { - m_pReferenceLap = i->second; // Set the Reference lap to this lap - } - } - m_pReferenceLap->ComputeDistances(NULL, g_pLapDB); // Now recompute distances, based upon this Reference Lap - for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) - { - if(i->second != m_pReferenceLap) - { - i->second->ComputeDistances(m_pReferenceLap, g_pLapDB); // tell this lap to recompute using pLap as the reference lap - } - } - } - - - set setAvailable; - InitAxes(setAvailable); - LoadLaps(::g_pLapDB); - UpdateUI(UPDATE_ALL); - InitBaseWindowPos(); - - tmLast = timeGetTime(); // Initialize time lap was received - - // Find all of the Names of the selected Race Sessions for addition to title bar - vector lstRaces = g_pLapDB->GetRaces(); - TCHAR lstSessions[MAX_PATH] = {NULL}; - for(int x = 0;x < lstRaces.size(); x++) - { - for (int z = 0; z < 50; z++) - { - if ( m_iRaceId[z] == lstRaces[x].raceId ) - { - _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); - break; - } - } - } - - TCHAR szTemp[MAX_PATH] = {NULL}; - _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); - SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened - - if (m_sfLapOpts.fDrawSplitPoints == true) // Initialize the Sector Times window - { - // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE +// m_sfSubDisplay.Init(GetDlgItem(sub_hWnd,IDC_SUBDISPLAY)); + m_sfSubDisplay.Init(GetDlgItem(m_hWnd,IDC_SUBDISPLAY)); + m_sfTractionDisplay.Init(GetDlgItem(m_hWnd,IDC_TRACTIONCIRCLEMAP)); + + LoadLaps(g_pLapDB); + if (m_sfLapOpts.LapId != 0 && m_mapLaps.size() > 0) // Reference lap needs to be loaded. Identify which one it is and set it + { + for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + if(i->second->GetLap()->GetLapId() == m_sfLapOpts.LapId) + { + m_pReferenceLap = i->second; // Set the Reference lap to this lap + } + } + m_pReferenceLap->ComputeDistances(NULL, g_pLapDB); // Now recompute distances, based upon this Reference Lap + for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + if(i->second != m_pReferenceLap) + { + i->second->ComputeDistances(m_pReferenceLap, g_pLapDB); // tell this lap to recompute using pLap as the reference lap + } + } + } + + + set setAvailable; + InitAxes(setAvailable); + LoadLaps(::g_pLapDB); + UpdateUI(UPDATE_ALL); + InitBaseWindowPos(); + + tmLast = timeGetTime(); // Initialize time lap was received + + // Find all of the Names of the selected Race Sessions for addition to title bar + vector lstRaces = g_pLapDB->GetRaces(); + TCHAR lstSessions[MAX_PATH] = {NULL}; + for(int x = 0;x < lstRaces.size(); x++) + { + for (int z = 0; z < 50; z++) + { + if ( m_iRaceId[z] == lstRaces[x].raceId ) + { + _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); + break; + } + } + } + + TCHAR szTemp[MAX_PATH] = {NULL}; + _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); + SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened + + if (m_sfLapOpts.fDrawSplitPoints == true) // Initialize the Sector Times window + { + // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE DLGPROC ShowSplits = NULL; // Create the window for displaying sector times for the selected laps - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&InitCtrlEx); + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, (DLGPROC)ShowSplits); // Create resource - HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window - SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window - - // Set up the Sector Times list box columns - vector lstCols; - vector lstWidths; - lstCols.push_back(L"Lap ID"); - lstCols.push_back(L"1"); - lstCols.push_back(L"2"); - lstCols.push_back(L"3"); - lstCols.push_back(L"4"); - lstCols.push_back(L"5"); - lstCols.push_back(L"6"); - lstCols.push_back(L"7"); - lstCols.push_back(L"8"); - lstCols.push_back(L"9"); - lstWidths.push_back(195); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - - m_sfListBox.Init(HC_ShowSplits,lstCols,lstWidths); // Initialize and show the Sector Splits window + HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window + + // Set up the Sector Times list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Lap ID"); + lstCols.push_back(L"1"); + lstCols.push_back(L"2"); + lstCols.push_back(L"3"); + lstCols.push_back(L"4"); + lstCols.push_back(L"5"); + lstCols.push_back(L"6"); + lstCols.push_back(L"7"); + lstCols.push_back(L"8"); + lstCols.push_back(L"9"); + lstWidths.push_back(195); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + + m_sfListBox.Init(HC_ShowSplits,lstCols,lstWidths); // Initialize and show the Sector Splits window ShowWindow(hWndShowSplits, SW_SHOW); - } - - return 0; - } - case WM_CLOSE: - { - DestroyWindow(hWnd); - EndDialog(hWnd,0); - return 0; - } - case WM_MOUSEWHEEL: - { - short iDist = HIWORD(wParam); - m_sfLapOpts.iZoomLevels += (iDist/WHEEL_DELTA); - UpdateUI(UPDATE_MAP); - return 0; - } - case WM_MOUSEMOVE: - { - const int INVALID_MOUSEPOS = 0x80000000; - static int lastX = INVALID_MOUSEPOS; - static int lastY = INVALID_MOUSEPOS; - const int x = LOWORD(lParam); - const int y = HIWORD(lParam); - const int moveX = lastX == INVALID_MOUSEPOS ? 0 : x - lastX; - const int moveY = lastY == INVALID_MOUSEPOS ? 0 : y - lastY; - lastX = x; - lastY = y; - + } + + return 0; + } + case WM_CLOSE: + { + DestroyWindow(hWnd); + EndDialog(hWnd,0); + return 0; + } + case WM_MOUSEWHEEL: + { + short iDist = HIWORD(wParam); + m_sfLapOpts.iZoomLevels += (iDist/WHEEL_DELTA); + UpdateUI(UPDATE_MAP); + return 0; + } + case WM_MOUSEMOVE: + { + const int INVALID_MOUSEPOS = 0x80000000; + static int lastX = INVALID_MOUSEPOS; + static int lastY = INVALID_MOUSEPOS; + const int x = LOWORD(lParam); + const int y = HIWORD(lParam); + const int moveX = lastX == INVALID_MOUSEPOS ? 0 : x - lastX; + const int moveY = lastY == INVALID_MOUSEPOS ? 0 : y - lastY; + lastX = x; + lastY = y; + switch(wParam) { case MK_CONTROL: // Ctrl + Mouse movement { - short iDist = HIWORD(wParam); - m_sfLapOpts.iZoomLevels += - moveY; - UpdateUI(UPDATE_MAP); - break; + short iDist = HIWORD(wParam); + m_sfLapOpts.iZoomLevels += - moveY; + UpdateUI(UPDATE_MAP); + break; + } + case MK_LBUTTON: + { + // they're dragging! + m_sfLapOpts.flWindowShiftX += moveX; + m_sfLapOpts.flWindowShiftY -= moveY; + break; + } + case MK_MBUTTON: + { + // Dynamic update of All Data display + UpdateUI(UPDATE_ALLDATA); + break; } - case MK_LBUTTON: - { - // they're dragging! - m_sfLapOpts.flWindowShiftX += moveX; - m_sfLapOpts.flWindowShiftY -= moveY; - break; - } - case MK_MBUTTON: - { - // Dynamic update of All Data display - UpdateUI(UPDATE_ALLDATA); - break; - } } - UpdateUI(UPDATE_MAP); - return 0; - } - case WM_LBUTTONDOWN: - { - const int x = LOWORD(lParam); - const int y = HIWORD(lParam); - // figure out if we should put focus on the main map - RECT rcMap; - HWND hWndMap = GetDlgItem(this->m_hWnd,IDC_DISPLAY); - GetClientRect(hWndMap,&rcMap); - if(x >= rcMap.left && x < rcMap.right && y >= rcMap.top && y < rcMap.bottom) - { - SetFocus(hWndMap); - return TRUE; - } - return FALSE; - } - // Left/Middle mouse button activates a modal window that dispalys all of the data for a given point in a table - case WM_MBUTTONDOWN: - case WM_MBUTTONDBLCLK: - case WM_LBUTTONDBLCLK: - { - if ( GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY) && uMsg != WM_MBUTTONDOWN ) // If the window showing all of the lap data is present, let's kill it - { - if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) - { - DestroyWindow(hWnd_AllData); - hWnd_AllData = NULL; - AD_hWnd = NULL; - } - return TRUE; - } + UpdateUI(UPDATE_MAP); + return 0; + } + case WM_LBUTTONDOWN: + { + const int x = LOWORD(lParam); + const int y = HIWORD(lParam); + // figure out if we should put focus on the main map + RECT rcMap; + HWND hWndMap = GetDlgItem(this->m_hWnd,IDC_DISPLAY); + GetClientRect(hWndMap,&rcMap); + if(x >= rcMap.left && x < rcMap.right && y >= rcMap.top && y < rcMap.bottom) + { + SetFocus(hWndMap); + return TRUE; + } + return FALSE; + } + // Left/Middle mouse button activates a modal window that dispalys all of the data for a given point in a table + case WM_MBUTTONDOWN: + case WM_MBUTTONDBLCLK: + case WM_LBUTTONDBLCLK: + { + if ( GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY) && uMsg != WM_MBUTTONDOWN ) // If the window showing all of the lap data is present, let's kill it + { + if (GetWindowPlacement(hWnd_AllData, &w_AllDataWindow) ) + { + DestroyWindow(hWnd_AllData); + hWnd_AllData = NULL; + AD_hWnd = NULL; + } + return TRUE; + } else // If the window showing all of the lap data isn't there, let's create it { DLGPROC ShowAllData = NULL; if (!GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Make sure that the display isn't already showing { // Create the window for displaying all of the data points for the selected laps - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&InitCtrlEx); + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); hWnd_AllData = CreateDialog(NULL, MAKEINTRESOURCE (IDD_ALLDATADISPLAY), hWnd, (DLGPROC)ShowAllData); - AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // All Data listview control - SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); - - // Set up the AllData list box columns - vector lstCols; - vector lstWidths; - lstCols.push_back(L"Data Channel"); - lstCols.push_back(L"Lap 1"); - lstCols.push_back(L"Lap 2"); - lstCols.push_back(L"Lap 3"); - lstCols.push_back(L"Lap 4"); - lstCols.push_back(L"Lap 5"); - lstCols.push_back(L"Lap 6"); - lstCols.push_back(L"Lap 7"); - lstCols.push_back(L"Lap 8"); - lstCols.push_back(L"Lap 9"); - lstCols.push_back(L"Lap 10"); - lstWidths.push_back(130); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - lstWidths.push_back(60); - - m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize the listview + AD_hWnd = GetDlgItem(hWnd_AllData,IDC_ALLDATADISPLAY); // All Data listview control + SetWindowPlacement(hWnd_AllData, &w_AllDataWindow); + + // Set up the AllData list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Data Channel"); + lstCols.push_back(L"Lap 1"); + lstCols.push_back(L"Lap 2"); + lstCols.push_back(L"Lap 3"); + lstCols.push_back(L"Lap 4"); + lstCols.push_back(L"Lap 5"); + lstCols.push_back(L"Lap 6"); + lstCols.push_back(L"Lap 7"); + lstCols.push_back(L"Lap 8"); + lstCols.push_back(L"Lap 9"); + lstCols.push_back(L"Lap 10"); + lstWidths.push_back(130); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + lstWidths.push_back(60); + + m_sfListBox.Init(AD_hWnd,lstCols,lstWidths); // Initialize the listview ShowWindow(hWnd_AllData, SW_SHOW); // Show the listview - } - - UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); - return TRUE; - } - } - case WM_NOTIFY: - { - NMHDR* notifyHeader = (NMHDR*)lParam; - switch(wParam) - { - case IDC_LAPS: - switch(notifyHeader->code) - { - case LVN_ITEMCHANGED: - { - NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; - if(pDetails->iItem >= 0) - { - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - } - return TRUE; - } + } + + UpdateUI(UPDATE_MAP | UPDATE_ALLDATA); + return TRUE; + } + } + case WM_NOTIFY: + { + NMHDR* notifyHeader = (NMHDR*)lParam; + switch(wParam) + { + case IDC_LAPS: + switch(notifyHeader->code) + { + case LVN_ITEMCHANGED: + { + NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; + if(pDetails->iItem >= 0) + { + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + } + return TRUE; + } case LVN_COLUMNCLICK: { - LPNMLISTVIEW pLVInfo = (LPNMLISTVIEW)lParam; - // User clicked the column header, let's re-sort the list - if (pLVInfo->iSubItem == SORTSTYLE_BYTIMEOFRACE && m_sfLapOpts.eSortPreference != SORTSTYLE_BYTIMEOFRACE) - { - m_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; - UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST); - } - else if (pLVInfo->iSubItem == SORTSTYLE_BYLAPTIME && m_sfLapOpts.eSortPreference != SORTSTYLE_BYLAPTIME) - { - m_sfLapOpts.eSortPreference = SORTSTYLE_BYLAPTIME; - UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST); - } - } - } - break; - case IDC_XAXIS: - switch(notifyHeader->code) - { - case LVN_ITEMCHANGED: - const set sel = m_sfXAxis.GetSelectedItemsData(); - if(sel.size() == 1) - { - m_eXChannel = (DATA_CHANNEL)*sel.begin(); // Just take the first selected item for our choice - NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; - if(pDetails->iItem >= 0) // Single select Listview, requires special handling - { - UpdateUI(UPDATE_MAP| UPDATE_DASHBOARD | UPDATE_VALUES); - } - } - return TRUE; - } - break; - case IDC_YAXIS: - switch(notifyHeader->code) - { - case LVN_ITEMCHANGED: - const set sel = m_sfYAxis.GetSelectedItemsData2(); - if(sel.size() >= 1) - { - m_lstYChannels.clear(); - for(set::iterator i = sel.begin(); i != sel.end(); i++) - { - m_lstYChannels.push_back((DATA_CHANNEL)*i); - } - NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; - if(pDetails->iItem >= 0) - { - UpdateUI(UPDATE_MAP| UPDATE_DASHBOARD | UPDATE_VALUES); - } - } - return TRUE; - } - break; - } // end switch on wParam - + LPNMLISTVIEW pLVInfo = (LPNMLISTVIEW)lParam; + // User clicked the column header, let's re-sort the list + if (pLVInfo->iSubItem == SORTSTYLE_BYTIMEOFRACE && m_sfLapOpts.eSortPreference != SORTSTYLE_BYTIMEOFRACE) + { + m_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; + UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST); + } + else if (pLVInfo->iSubItem == SORTSTYLE_BYLAPTIME && m_sfLapOpts.eSortPreference != SORTSTYLE_BYLAPTIME) + { + m_sfLapOpts.eSortPreference = SORTSTYLE_BYLAPTIME; + UpdateUI(UPDATE_DASHBOARD | UPDATE_LIST); + } + } + } + break; + case IDC_XAXIS: + switch(notifyHeader->code) + { + case LVN_ITEMCHANGED: + const set sel = m_sfXAxis.GetSelectedItemsData(); + if(sel.size() == 1) + { + m_eXChannel = (DATA_CHANNEL)*sel.begin(); // Just take the first selected item for our choice + NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; + if(pDetails->iItem >= 0) // Single select Listview, requires special handling + { + UpdateUI(UPDATE_MAP| UPDATE_DASHBOARD | UPDATE_VALUES); + } + } + return TRUE; + } + break; + case IDC_YAXIS: + switch(notifyHeader->code) + { + case LVN_ITEMCHANGED: + const set sel = m_sfYAxis.GetSelectedItemsData2(); + if(sel.size() >= 1) + { + m_lstYChannels.clear(); + for(set::iterator i = sel.begin(); i != sel.end(); i++) + { + m_lstYChannels.push_back((DATA_CHANNEL)*i); + } + NMITEMACTIVATE* pDetails = (NMITEMACTIVATE*)notifyHeader; + if(pDetails->iItem >= 0) + { + UpdateUI(UPDATE_MAP| UPDATE_DASHBOARD | UPDATE_VALUES); + } + } + return TRUE; + } + break; + } // end switch on wParam + LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam; - switch (pnm->hdr.code) // Switch for ListView coloring and painting routines - { + switch (pnm->hdr.code) // Switch for ListView coloring and painting routines + { case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam; @@ -1005,13 +847,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if (pnm->hdr.hwndFrom == HC_ShowSplits || pnm->hdr.hwndFrom == AD_hWnd) { - return CDRF_NOTIFYSUBITEMDRAW; // Returns this to start the SubItem painting + return CDRF_NOTIFYSUBITEMDRAW; // Returns this to start the SubItem painting } else { return CDRF_NEWFONT; // No subitem painting, reduce overhead } - + case CDDS_SUBITEM | CDDS_ITEMPREPAINT: // SubItem painting routines if ( lplvcd->iSubItem == i_SubItemBest) // Best time/value, let's paint it with green background { @@ -1031,367 +873,367 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) return CDRF_NEWFONT; default: - return CDRF_DODEFAULT; - } - } + return CDRF_DODEFAULT; + } + } default: - return CDRF_DODEFAULT; - } - } // end body of case WM_NOTIFY - case WM_COMMAND: - { - switch(LOWORD(wParam)) // find out the control ID - { - case IDC_SENDMESSAGE: - { - static MESSAGEDLG_RESULT sfResult; - if(wcslen(sfResult.szMessage) <= 0) - { - wcscpy_s( sfResult.szMessage, L"Pit Now"); // Add default string if nothing is there - } - CMessageDlg dlgMessage(&sfResult); + return CDRF_DODEFAULT; + } + } // end body of case WM_NOTIFY + case WM_COMMAND: + { + switch(LOWORD(wParam)) // find out the control ID + { + case IDC_SENDMESSAGE: + { + static MESSAGEDLG_RESULT sfResult; + if(wcslen(sfResult.szMessage) <= 0) + { + wcscpy_s( sfResult.szMessage, L"Pit Now"); // Add default string if nothing is there + } + CMessageDlg dlgMessage(&sfResult); HWND hWndButton = GetDlgItem(this->m_hWnd,IDC_SENDMESSAGE); EnableWindow(hWndButton,FALSE); ArtShowDialog(&dlgMessage); - EnableWindow(hWndButton,TRUE); - LPCTSTR lpsz = g_pLapDB->GetNetStatus(NETSTATUS_REMOTEIP); - sprintf(sfResult.szIP, "%S", lpsz); - - if(!sfResult.fCancelled) - { - // now that we're done, we should have a result! - SendMsg(sfResult, this); - } - return TRUE; - } - case IDOK: - { - return TRUE; - } - case ID_OPTIONS_KMH: - { - m_sfLapOpts.eUnitPreference = UNIT_PREFERENCE_KMH; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_MPH: - { - m_sfLapOpts.eUnitPreference = UNIT_PREFERENCE_MPH; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_MS: - { - m_sfLapOpts.eUnitPreference = UNIT_PREFERENCE_MS; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_VERTICAL_LANDSCAPE: - { - m_sfLapOpts.e_Orientation = VERTICAL_LANDSCAPE; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_VERTICAL_PORTRAIT: - { - m_sfLapOpts.e_Orientation = VERTICAL_PORTRAIT; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_FLAT_LANDSCAPE: - { - m_sfLapOpts.e_Orientation = FLAT_LANDSCAPE; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_FLAT_PORTRAIT: - { - m_sfLapOpts.e_Orientation = FLAT_PORTRAIT; - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_XAXIS_KM: - { - m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_KM; - CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file + EnableWindow(hWndButton,TRUE); + LPCTSTR lpsz = g_pLapDB->GetNetStatus(NETSTATUS_REMOTEIP); + sprintf(sfResult.szIP, "%S", lpsz); + + if(!sfResult.fCancelled) + { + // now that we're done, we should have a result! + SendMsg(sfResult, this); + } + return TRUE; + } + case IDOK: + { + return TRUE; + } + case ID_OPTIONS_KMH: + { + m_sfLapOpts.eUnitPreference = UNIT_PREFERENCE_KMH; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_MPH: + { + m_sfLapOpts.eUnitPreference = UNIT_PREFERENCE_MPH; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_MS: + { + m_sfLapOpts.eUnitPreference = UNIT_PREFERENCE_MS; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_VERTICAL_LANDSCAPE: + { + m_sfLapOpts.e_Orientation = VERTICAL_LANDSCAPE; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_VERTICAL_PORTRAIT: + { + m_sfLapOpts.e_Orientation = VERTICAL_PORTRAIT; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_FLAT_LANDSCAPE: + { + m_sfLapOpts.e_Orientation = FLAT_LANDSCAPE; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_FLAT_PORTRAIT: + { + m_sfLapOpts.e_Orientation = FLAT_PORTRAIT; + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_XAXIS_KM: + { + m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_KM; + CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file MessageBox(hWnd, L"X-Axis will be displayed in KM's\n\nYou need to re-load the Race Session for this change to take effect!",L"NOTICE", MB_OK); - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_XAXIS_LAT: - { - m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_LAT; - CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_XAXIS_LAT: + { + m_sfLapOpts.bXAxis_KM = XAXIS_PREFERENCE_LAT; + CExtendedLap::SetDistance(m_sfLapOpts.bXAxis_KM); // Set the X Axis as read from SETTINGS.TXT file MessageBox(hWnd, L"X-Axis will be displayed in Latitude/Longitudinal degrees\n\nYou need to re-load the Race Session for this change to take effect!",L"NOTICE", MB_OK); - UpdateUI(UPDATE_MAP | UPDATE_MENU); - return TRUE; - } - case ID_OPTIONS_SHOWBESTS: - { - m_fShowBests = !m_fShowBests; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - return TRUE; - } - case ID_OPTIONS_SHOWREFERENCELAP: - { - m_fShowReferenceLap = !m_fShowReferenceLap; - m_sfLapOpts.bShowReferenceLap = m_fShowReferenceLap; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - return TRUE; - } - case ID_OPTIONS_DRAWLINES: - { - m_sfLapOpts.fDrawLines = !m_sfLapOpts.fDrawLines; - UpdateUI(UPDATE_MENU | UPDATE_MAP); - return TRUE; - } - case ID_OPTIONS_BACKGROUND: - { - m_sfLapOpts.fColorScheme = !m_sfLapOpts.fColorScheme; - UpdateUI(UPDATE_MENU | UPDATE_MAP); - return TRUE; - } - case ID_OPTIONS_IOIO5VSCALE: - { - m_sfLapOpts.fIOIOHardcoded = !m_sfLapOpts.fIOIOHardcoded; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD); - return TRUE; - } - case ID_OPTIONS_SHOWDRIVERBESTS: - { - m_fShowDriverBests = !m_fShowDriverBests; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - return TRUE; - } - case ID_DATA_SWITCHSESSION: - { - static bool bSwitchSession; // Flag to prevent multiple windows from being opened - if (!bSwitchSession) - { - RACESELECT_RESULT sfResult; - bSwitchSession = true; - // Zero out the Race ID's before selecting them - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = -1; - sfResult.iRaceId[z] = -1; - } - - CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); - - if(!sfResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen - } - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); - - // Find all of the Names of the selected Race Sessions for addition to title bar - vector lstRaces = g_pLapDB->GetRaces(); - TCHAR lstSessions[MAX_PATH] = {NULL}; - for(int x = 0;x < lstRaces.size(); x++) - { - for (int z = 0; z < 50; z++) - { - if ( m_iRaceId[z] == lstRaces[x].raceId ) - { - _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); - break; - } - } - } - - TCHAR szTemp[MAX_PATH] = {NULL}; - _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); - SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened - - // Just loaded a new session. Let's reset the timer - tmLast = timeGetTime(); // Save last time lap was received - } - bSwitchSession = false; - } - return TRUE; - } - case ID_DATA_EDITSESSION: - { - RACESELECTEDIT_RESULT sfResult; - static bool bEditSessions; // Flag to prevent multiple windows from being opened - if (!bEditSessions) - { - bEditSessions = true; - CRaceSelectEditDlg dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); - - if(!sfResult.fCancelled) - { - m_iRaceId[0] = sfResult.iRaceId; - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD ); - } - bEditSessions = false; - } - return TRUE; - } - case ID_OPTIONS_PLOTPREFS: - { - bool static bSetPlot; - PLOTSELECT_RESULT sfResult; - if (!bSetPlot) // Prevent duplicate windows from appearing - { - bSetPlot = true; - CPlotSelectDlg dlgPlot(g_pLapDB, &sfResult, m_iRaceId[0], &m_sfLapOpts); - ArtShowDialog(&dlgPlot); - bSetPlot = false; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - } - return TRUE; - } - case ID_OPTIONS_SETSPLITS: - { - bool static bSetSplits; - SETSPLITSDLG_RESULT sfResult; - if (!bSetSplits) // Prevent duplicate windows from appearing - { - bSetSplits = true; - CSetSplitsDlg dlgSetSplits(g_pLapDB, m_pReferenceLap, &sfResult, m_iRaceId[0], &m_sfLapOpts); - ArtShowDialog(&dlgSetSplits); - bSetSplits = false; - } - else - { - return TRUE; - } - - const int cSectors = 9; // Maximum numbers of Split Times + UpdateUI(UPDATE_MAP | UPDATE_MENU); + return TRUE; + } + case ID_OPTIONS_SHOWBESTS: + { + m_fShowBests = !m_fShowBests; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + return TRUE; + } + case ID_OPTIONS_SHOWREFERENCELAP: + { + m_fShowReferenceLap = !m_fShowReferenceLap; + m_sfLapOpts.bShowReferenceLap = m_fShowReferenceLap; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + return TRUE; + } + case ID_OPTIONS_DRAWLINES: + { + m_sfLapOpts.fDrawLines = !m_sfLapOpts.fDrawLines; + UpdateUI(UPDATE_MENU | UPDATE_MAP); + return TRUE; + } + case ID_OPTIONS_BACKGROUND: + { + m_sfLapOpts.fColorScheme = !m_sfLapOpts.fColorScheme; + UpdateUI(UPDATE_MENU | UPDATE_MAP); + return TRUE; + } + case ID_OPTIONS_IOIO5VSCALE: + { + m_sfLapOpts.fIOIOHardcoded = !m_sfLapOpts.fIOIOHardcoded; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD); + return TRUE; + } + case ID_OPTIONS_SHOWDRIVERBESTS: + { + m_fShowDriverBests = !m_fShowDriverBests; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + return TRUE; + } + case ID_DATA_SWITCHSESSION: + { + static bool bSwitchSession; // Flag to prevent multiple windows from being opened + if (!bSwitchSession) + { + RACESELECT_RESULT sfResult; + bSwitchSession = true; + // Zero out the Race ID's before selecting them + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = -1; + sfResult.iRaceId[z] = -1; + } + + CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + + if(!sfResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen + } + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_ALL); + + // Find all of the Names of the selected Race Sessions for addition to title bar + vector lstRaces = g_pLapDB->GetRaces(); + TCHAR lstSessions[MAX_PATH] = {NULL}; + for(int x = 0;x < lstRaces.size(); x++) + { + for (int z = 0; z < 50; z++) + { + if ( m_iRaceId[z] == lstRaces[x].raceId ) + { + _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); + break; + } + } + } + + TCHAR szTemp[MAX_PATH] = {NULL}; + _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); + SetWindowText(m_hWnd, szTemp ); // Change the title bar to show the file name and Session(s) opened + + // Just loaded a new session. Let's reset the timer + tmLast = timeGetTime(); // Save last time lap was received + } + bSwitchSession = false; + } + return TRUE; + } + case ID_DATA_EDITSESSION: + { + RACESELECTEDIT_RESULT sfResult; + static bool bEditSessions; // Flag to prevent multiple windows from being opened + if (!bEditSessions) + { + bEditSessions = true; + CRaceSelectEditDlg dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + + if(!sfResult.fCancelled) + { + m_iRaceId[0] = sfResult.iRaceId; + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_MAP | UPDATE_MENU | UPDATE_DASHBOARD ); + } + bEditSessions = false; + } + return TRUE; + } + case ID_OPTIONS_PLOTPREFS: + { + bool static bSetPlot; + PLOTSELECT_RESULT sfResult; + if (!bSetPlot) // Prevent duplicate windows from appearing + { + bSetPlot = true; + CPlotSelectDlg dlgPlot(g_pLapDB, &sfResult, m_iRaceId[0], &m_sfLapOpts); + ArtShowDialog(&dlgPlot); + bSetPlot = false; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + } + return TRUE; + } + case ID_OPTIONS_SETSPLITS: + { + bool static bSetSplits; + SETSPLITSDLG_RESULT sfResult; + if (!bSetSplits) // Prevent duplicate windows from appearing + { + bSetSplits = true; + CSetSplitsDlg dlgSetSplits(g_pLapDB, m_pReferenceLap, &sfResult, m_iRaceId[0], &m_sfLapOpts); + ArtShowDialog(&dlgSetSplits); + bSetSplits = false; + } + else + { + return TRUE; + } + + const int cSectors = 9; // Maximum numbers of Split Times const int MaxLaps = 8; // Maximum number of laps to display - if (!IsWindow(hWndShowSplits) && m_sfLapOpts.fDrawSplitPoints) - { - // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE + if (!IsWindow(hWndShowSplits) && m_sfLapOpts.fDrawSplitPoints) + { + // Create non-modal dialog to display the sector times window if DrawSplitPoints is TRUE DLGPROC ShowSplits = NULL; // Create the window for displaying sector times for the selected laps - INITCOMMONCONTROLSEX InitCtrlEx; - InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); - InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; - InitCommonControlsEx(&InitCtrlEx); + INITCOMMONCONTROLSEX InitCtrlEx; + InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX); + InitCtrlEx.dwICC = ICC_PROGRESS_CLASS; + InitCommonControlsEx(&InitCtrlEx); hWndShowSplits = CreateDialog(NULL, MAKEINTRESOURCE (IDD_SHOWSECTORS), hWnd, (DLGPROC)ShowSplits); // Create resource - HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window - SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window - - // Set up the Sector Times list box columns - vector lstCols; - vector lstWidths; - lstCols.push_back(L"Lap ID"); - lstCols.push_back(L"1"); - lstCols.push_back(L"2"); - lstCols.push_back(L"3"); - lstCols.push_back(L"4"); - lstCols.push_back(L"5"); - lstCols.push_back(L"6"); - lstCols.push_back(L"7"); - lstCols.push_back(L"8"); - lstCols.push_back(L"9"); - lstWidths.push_back(195); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - lstWidths.push_back(40); - - m_sfListBox.Init(HC_ShowSplits,lstCols,lstWidths); // Initialize and show the Sector Splits window + HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + SetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow); // Maintains the location of the Sector Times window + + // Set up the Sector Times list box columns + vector lstCols; + vector lstWidths; + lstCols.push_back(L"Lap ID"); + lstCols.push_back(L"1"); + lstCols.push_back(L"2"); + lstCols.push_back(L"3"); + lstCols.push_back(L"4"); + lstCols.push_back(L"5"); + lstCols.push_back(L"6"); + lstCols.push_back(L"7"); + lstCols.push_back(L"8"); + lstCols.push_back(L"9"); + lstWidths.push_back(195); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + lstWidths.push_back(40); + + m_sfListBox.Init(HC_ShowSplits,lstCols,lstWidths); // Initialize and show the Sector Splits window ShowWindow(hWndShowSplits, SW_SHOW); - } - else if (!m_sfLapOpts.fDrawSplitPoints) - { - if (HC_ShowSplits) // If the window showing all of the lap data is present, let's kill it - { - if (GetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow) ) - { - DestroyWindow(hWndShowSplits); - hWndShowSplits = NULL; - } - } - } - if(!sfResult.fCancelled) - { - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE | UPDATE_DASHBOARD); - } - return TRUE; - } - case ID_OPTIONS_CANCELSPLITS: - { - if (HC_ShowSplits) // If the window showing all of the lap data is present, let's kill it - { - if (GetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow) ) - { - DestroyWindow(hWndShowSplits); - hWndShowSplits = NULL; - } - } - m_sfLapOpts.fDrawSplitPoints = false; - return TRUE; - } - case ID_HELP_SHOWHELP: - { - ShowHelp(hWnd); - return TRUE; - } - case ID_HELP_SHOWWFLHELP: - { - ShowWFLHelp(hWnd); - return TRUE; - } - case ID_HELP_IPS: - { - ShowNetInfo(); - return TRUE; - } - case ID_HELP_ABOUT: - { - ABOUT_RESULT sfResult; - CAboutDlg dlgAbout(&sfResult); - ArtShowDialog(&dlgAbout); - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE | UPDATE_DASHBOARD); - return TRUE; - } - case ID_OPTIONS_TRACTIONCIRCLE: - { - m_fShowTractionCircle = !m_fShowTractionCircle; - m_sfLapOpts.bTractionCircle = m_fShowTractionCircle; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); - return TRUE; - } - case ID_OPTIONS_SMOOTH: - { - m_sfLapOpts.bSmoothYesNo = !m_sfLapOpts.bSmoothYesNo; - UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); - return TRUE; - } - // Nested loop for the following functions - case ID_EDIT_COPY: - { - // Option is not working and causes crashes right now, so disable it - return TRUE; - } - case IDM_PRINT_BM: - case IDM_SAVE_BM: - { - int SaveFlag = false, PrintFlag = false; - // Set flag to sending image to Clipboard, if requested by user - if (LOWORD(wParam) == IDM_SAVE_BM) - SaveFlag = true; - if (LOWORD(wParam) == IDM_PRINT_BM) - PrintFlag = true; - + } + else if (!m_sfLapOpts.fDrawSplitPoints) + { + if (HC_ShowSplits) // If the window showing all of the lap data is present, let's kill it + { + if (GetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow) ) + { + DestroyWindow(hWndShowSplits); + hWndShowSplits = NULL; + } + } + } + if(!sfResult.fCancelled) + { + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE | UPDATE_DASHBOARD); + } + return TRUE; + } + case ID_OPTIONS_CANCELSPLITS: + { + if (HC_ShowSplits) // If the window showing all of the lap data is present, let's kill it + { + if (GetWindowPlacement(hWndShowSplits, &w_SectorTimesWindow) ) + { + DestroyWindow(hWndShowSplits); + hWndShowSplits = NULL; + } + } + m_sfLapOpts.fDrawSplitPoints = false; + return TRUE; + } + case ID_HELP_SHOWHELP: + { + ShowHelp(hWnd); + return TRUE; + } + case ID_HELP_SHOWWFLHELP: + { + ShowWFLHelp(hWnd); + return TRUE; + } + case ID_HELP_IPS: + { + ShowNetInfo(); + return TRUE; + } + case ID_HELP_ABOUT: + { + ABOUT_RESULT sfResult; + CAboutDlg dlgAbout(&sfResult); + ArtShowDialog(&dlgAbout); + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE | UPDATE_DASHBOARD); + return TRUE; + } + case ID_OPTIONS_TRACTIONCIRCLE: + { + m_fShowTractionCircle = !m_fShowTractionCircle; + m_sfLapOpts.bTractionCircle = m_fShowTractionCircle; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); + return TRUE; + } + case ID_OPTIONS_SMOOTH: + { + m_sfLapOpts.bSmoothYesNo = !m_sfLapOpts.bSmoothYesNo; + UpdateUI(UPDATE_MENU | UPDATE_MAP | UPDATE_TRACTIONCIRCLE); + return TRUE; + } + // Nested loop for the following functions + case ID_EDIT_COPY: + { + // Option is not working and causes crashes right now, so disable it + return TRUE; + } + case IDM_PRINT_BM: + case IDM_SAVE_BM: + { + int SaveFlag = false, PrintFlag = false; + // Set flag to sending image to Clipboard, if requested by user + if (LOWORD(wParam) == IDM_SAVE_BM) + SaveFlag = true; + if (LOWORD(wParam) == IDM_PRINT_BM) + PrintFlag = true; + // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A @@ -1427,7 +1269,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) MessageBox(hWnd, L"CreateCompatibleDC has failed",L"Failed", MB_OK); break; } - + // Get the client area for size calculation RECT rcClient; // Get the windows coordinates for the Window, hWnd @@ -1513,49 +1355,49 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { // Let's get the output file name from the user. - TCHAR szTempPath[MAX_PATH], szTempName[MAX_PATH]; - TCHAR szFileName[MAX_PATH] = {NULL}; - if (PrintFlag) - { - GetTempPath(NUMCHARS(szTempPath),szTempPath); // Get the TEMP folder path - swprintf(szTempName,NUMCHARS(szTempName), L"%sTmpFile.bmp", szTempPath); - } - else - { - - wcscat(szFileName,L"Picture.jpg"); - while (true) - { - if(ArtGetSaveFileName(hWnd, L"Choose Filename to save as a JPEG File.", szFileName, NUMCHARS(szFileName),L"JPG Files (*.jpg)\0*.JPG\0\0")) - { - // let's make sure there's a .jpg suffix on that bugger. - if(!str_ends_with(szFileName,L".jpg") && !str_ends_with(szFileName,L".JPG")) - { - wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); - } - const bool fFileIsNew = !DoesFileExist(szFileName); - if(fFileIsNew) - { - break; // Exit loop, as file name is valid and new - } - else - { - DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); - if (dwRet == IDYES) - { - break; // User wants to overwrite file, so exit loop and proceed - } - } - } - else - { - return 0; // User cancelled the save operation, so leave subroutine - } - } - + TCHAR szTempPath[MAX_PATH], szTempName[MAX_PATH]; + TCHAR szFileName[MAX_PATH] = {NULL}; + if (PrintFlag) + { + GetTempPath(NUMCHARS(szTempPath),szTempPath); // Get the TEMP folder path + swprintf(szTempName,NUMCHARS(szTempName), L"%sTmpFile.bmp", szTempPath); + } + else + { + + wcscat(szFileName,L"Picture.jpg"); + while (true) + { + if(ArtGetSaveFileName(hWnd, L"Choose Filename to save as a JPEG File.", szFileName, NUMCHARS(szFileName),L"JPG Files (*.jpg)\0*.JPG\0\0")) + { + // let's make sure there's a .jpg suffix on that bugger. + if(!str_ends_with(szFileName,L".jpg") && !str_ends_with(szFileName,L".JPG")) + { + wcsncat(szFileName,L".jpg", NUMCHARS(szFileName)); + } + const bool fFileIsNew = !DoesFileExist(szFileName); + if(fFileIsNew) + { + break; // Exit loop, as file name is valid and new + } + else + { + DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; // User wants to overwrite file, so exit loop and proceed + } + } + } + else + { + return 0; // User cancelled the save operation, so leave subroutine + } + } + // Create a temporary BMP file, this is where we will save the screen capture. - swprintf(szTempName, NUMCHARS(szTempName), L"%s.bmp", szFileName); - } + swprintf(szTempName, NUMCHARS(szTempName), L"%s.bmp", szFileName); + } // Add the size of the headers to the size of the bitmap to get the total file size DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); @@ -1608,19 +1450,19 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) GlobalUnlock(hDIB); GlobalFree(hDIB); } - else if (PrintFlag) - { + else if (PrintFlag) + { //Unlock and Free the DIB from the heap GlobalUnlock(hDIB); GlobalFree(hDIB); - //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// cxsize=0, cxpage=0; cysize=0, cypage=0; PAINTSTRUCT ps; // Let's get the Bitmap image for printing - { + { ZeroMemory(&hBitmap, sizeof(HBITMAP)); hBitmap = (HBITMAP)LoadImage(NULL,szTempName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE|LR_VGACOLOR); @@ -1680,13 +1522,13 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) DeleteDC(hdcMem); } DeleteFile(szTempName); - //////////////////////////////////////////////////////////////////////////////// - } - } - } - else - { - // User wants to copy image to Clipboard. + //////////////////////////////////////////////////////////////////////////////// + } + } + } + else + { + // User wants to copy image to Clipboard. //Unlock and Free the DIB from the heap GlobalUnlock(hDIB); @@ -1718,7 +1560,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL); } - } + } //Unlock and Free the DIB from the heap GlobalUnlock(hDIB); GlobalFree(hDIB); @@ -1726,719 +1568,747 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) DeleteObject(hdcMemDC); ReleaseDC(NULL,hdcSource); ReleaseDC(hWnd,hdcWindow); - UpdateUI(UPDATE_ALL); -// InitAxes(setSelectedChannels); - return TRUE; - } - case ID_FILE_EXIT: - { + UpdateUI(UPDATE_ALL); +// InitAxes(setSelectedChannels); + return TRUE; + } + case ID_FILE_EXIT: + { DestroyWindow(hWnd); - break; - } - case ID_TIMINGSCORING: - { - // Let's set up for displaying the T&S page - int m_RaceId[50] = {NULL}; - // Show the race-selection dialog and let the User pick which ones to use on T&S page - static bool bSelectSessions; - if (!bSelectSessions) // Prevent duplicate windows - { - bSelectSessions = true; - SELECTSESSIONS_RESULT sfResult; - CDlgSelectSessions dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); - if( !sfResult.fCancelled ) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet - { - // Now display the T&S page and pass these RaceID's to this class - TS_RESULT ts_sfResult; - CDlgTimingScoring dlgTS(g_pLapDB, &ts_sfResult, m_szPath, &sfResult); - ArtShowDialog(&dlgTS); - } - bSelectSessions = false; - } - return TRUE; - } - case ID_DATA_OPENDB: - { - TCHAR szFilename[MAX_PATH]; - if(ArtGetOpenFileName(hWnd, L"Choose WFLP file", szFilename, NUMCHARS(szFilename),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) - { - if(g_pLapDB->Init(szFilename)) - { - _snwprintf(m_szPath, NUMCHARS(m_szPath), szFilename); - RACESELECT_RESULT sfResult; - - // Zero out the Race ID's before selecting them - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = -1; - sfResult.iRaceId[z] = -1; - } - - CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); - - if(!sfResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen - } - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); - // Let's reset the timer - tmLast = timeGetTime(); // Save last time lap was received - - // Find all of the Names of the selected Race Sessions for addition to title bar - vector lstRaces = g_pLapDB->GetRaces(); - TCHAR lstSessions[MAX_PATH] = {NULL}; - for(int x = 0;x < lstRaces.size(); x++) - { - for (int z = 0; z < 50; z++) - { - if ( m_iRaceId[z] == lstRaces[x].raceId ) - { - _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); - break; - } - } - } - TCHAR szTemp[MAX_PATH] = {NULL}; - _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); - SetWindowText(hWnd, szTemp); // Change the title bar to show the file name opened - } - } - } - return TRUE; - } - case ID_DATA_DASHWARE: // Save the data to a .CSV file - { - set setSelectedData = m_sfLapList.GetSelectedItemsData3(); - if(setSelectedData.size() > 0) - { - TCHAR szFilename[MAX_PATH] = {NULL}; - wcscat(szFilename,L"Export.csv"); - while (true) - { - if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"CSV Files (*.csv)\0*.CSV\0\0")) - { - // let's make sure there's a .csv suffix on that bugger. - if(!str_ends_with(szFilename,L".csv") && !str_ends_with(szFilename,L".CSV")) - { - wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); - } - const bool fFileIsNew = !DoesFileExist(szFilename); - if(fFileIsNew) - { - break; // Exit loop, as file name is valid and new - } - else - { - DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); - if (dwRet == IDYES) - { - break; // User wants to overwrite file, so exit loop and proceed - } - } - } - else - { - return 0; // User cancelled the save operation, so leave subroutine - } - } - - // Display the "Working...." dialog, as this is going to take some time. - DLGPROC working = NULL; - HWND hwndGoto = NULL; // Window handle of dialog box - if (!IsWindow(hwndGoto)) - { - hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_PROGRESS), hWnd, working); - ShowWindow(hwndGoto, SW_SHOW); - } - - vector lstLaps; - vector lstLaps1 = GetLapsToShow(); - for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) - { - CExtendedLap* pLap = (CExtendedLap*)*i; - lstLaps.push_back(pLap->GetLap()); - } - DashWare::SaveToDashware(szFilename, lstLaps, lstLaps1); // lstLaps does not have the reference lap in it, lstLaps1 may have it - DestroyWindow(hwndGoto); // Close the "Working..." dialog - hwndGoto = NULL; - } - else - { - MessageBox(NULL,L"Please Select Laps",L"You must select some laps first!",MB_OK | MB_ICONWARNING); - } - return TRUE; - } - case IDC_DISPLAYTYPE_LINE: - { - switch(HIWORD(wParam)) - { - case BN_CLICKED: - m_eLapDisplayStyle = LAPDISPLAYSTYLE_MAP; - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD); - break; - } - return TRUE; - } -/* case IDC_DISPLAYTYPE_RECEPTION: - { - switch(HIWORD(wParam)) - { - case BN_CLICKED: - m_eLapDisplayStyle = LAPDISPLAYSTYLE_RECEPTION; - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - break; - } - return TRUE; - } -*/ case IDC_DISPLAYTYPE_PLOT: - { - switch(HIWORD(wParam)) - { - case BN_CLICKED: - m_eLapDisplayStyle = LAPDISPLAYSTYLE_PLOT; - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD); - break; - } - return TRUE; - } - case IDC_SETREFERENCE: - { - // they want to set a given lap as a reference lap - set setSelected = m_sfLapList.GetSelectedItemsData3(); - if(setSelected.size() == 1) - { - CExtendedLap* pNewRefLap = (CExtendedLap*)*(setSelected.begin()); - pNewRefLap->ComputeDistances(NULL, g_pLapDB); - for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) - { - if(i->second != pNewRefLap) - { - i->second->ComputeDistances(pNewRefLap, g_pLapDB); // tell this lap to recompute using pLap as the reference lap - } - } - m_pReferenceLap = pNewRefLap; - } - else - { - // what's going on? This should've been disabled - } - UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); - return TRUE; - } - case IDC_SETDRIVER: // they want to set the driver of the selected laps - { - switch(HIWORD(wParam)) - { - case BN_CLICKED: - ApplyDriverNameToSelectedLaps(::g_pLapDB); - UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); // Redraw the laplist and buttons - break; - } - return TRUE; - } - case IDC_CLEARCOMMENT: // This button clears the comment field - { - switch(HIWORD(wParam)) - { - case BN_CLICKED: - m_szCommentText[0] = '\0'; - SendMessage(GetDlgItem(m_hWnd, IDC_COMMENTTEXT), WM_SETTEXT, NUMCHARS(m_szCommentText), (LPARAM)m_szCommentText); -// UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); - break; - } - return TRUE; - } - case IDC_COMMENTTEXT: - { - switch(HIWORD(wParam)) - { - case EN_CHANGE: - { - SendMessage(GetDlgItem(m_hWnd, IDC_COMMENTTEXT), WM_GETTEXT, NUMCHARS(m_szCommentText), (LPARAM)m_szCommentText); -// UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); - break; - } - } - return TRUE; - } - } // end switch for finding out what control WM_COMMAND hit - break; // break out of WM_COMMAND handling - } // End of COMMAND loop - case WM_UPDATEUI: - { - DWORD dwCurrentUpdate = m_fdwUpdateNeeded; - UpdateUI_Internal(dwCurrentUpdate); - m_fdwUpdateNeeded &= ~dwCurrentUpdate; - return TRUE; - } - case WM_NOTIFYUPDATE: - { - switch(wParam) - { - case NOTIFY_NEEDRECVCONFIG: - { - // a lap has been received, but the database isn't set up to receive (aka it's pointing at a high-quality race). - // let's tell the user about it and ask them for input. - static bool fWarnedOnce = false; - if(!fWarnedOnce) - { - fWarnedOnce = true; - MessageBox(NULL,L"You just received a lap from a car, but you're looking at old data. Hit data->'new race session' or else Pitside will keep ignoring it",L"Not ready to receive",0); - } - return TRUE; - } - case NOTIFY_NEWLAP: - { - ILapReceiver* pLapDB = (ILapReceiver*)lParam; - int iLastRaceId = pLapDB->GetLastReceivedRaceId(); - if(m_iRaceId[0] < 0 || pLapDB->GetLapCount(m_iRaceId[0]) <= 0 || // if we don't have a race or our current race has no laps (aka sucks) - (pLapDB->IsActivelyReceiving(iLastRaceId) && !pLapDB->IsActivelyReceiving(m_iRaceId[0]))) // or if the new race ID is receiving and the current race ID isn't... - { - m_iRaceId[0] = pLapDB->GetLastReceivedRaceId(); // since we just got told there's a new lap, there must be a last-received-race - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); - } - else - { - LoadLaps((ILapReceiver*)lParam); - UpdateUI(UPDATE_LIST); - } - // Just loaded a new lap. Let's reset the timer - tmLast = timeGetTime(); // Save last time lap was received - return TRUE; - } - case NOTIFY_NEWDATABASE: - { - // a new database has shown up! - - // first, check if the user cares... - DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone. Do you want to load it?",L"New database",MB_YESNO); - if(dwRet == IDYES) - { - LPCTSTR lpszFilename = (LPCTSTR)lParam; - if(g_pLapDB->Init(lpszFilename)) - { - RACESELECT_RESULT sfResult; - - // Zero out the Race ID's before selecting them - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = -1; - sfResult.iRaceId[z] = -1; - } - - CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); - ArtShowDialog(&dlgRace); - if(!sfResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen - } - - ClearUILaps(); - LoadLaps(g_pLapDB); - UpdateUI(UPDATE_ALL); - } - } - // Let's reset the timer - tmLast = timeGetTime(); // Save last time lap was received - } - return TRUE; - - } - case NOTIFY_NEWNETSTATUS: - { - ILapReceiver* pLaps = (ILapReceiver*)lParam; - SendMessage(m_hWnd, WM_SETTEXT, 0, (LPARAM)pLaps->GetNetStatus(NETSTATUS_STATUS)); - - TCHAR szTemp[512]; -// HWND hWndIp = GetDlgItem(m_hWnd, IDC_CURRENTIP); -// swprintf(szTemp, NUMCHARS(szTemp), L"PC: %s", pLaps->GetNetStatus(NETSTATUS_THISIP)); -// SendMessage(hWndIp, WM_SETTEXT, 0, (LPARAM)szTemp); - - HWND hWndRemoteIp = GetDlgItem(m_hWnd, IDC_CURRENTREMOTEIP); - swprintf(szTemp, NUMCHARS(szTemp), L"Phone: %s", pLaps->GetNetStatus(NETSTATUS_REMOTEIP)); - SendMessage(hWndRemoteIp, WM_SETTEXT, 0, (LPARAM)szTemp); - return TRUE; - } - case NOTIFY_NEWMSGDATA: - { - CMsgThread* pThd = (CMsgThread*)lParam; - pThd->GetStatusMessage(m_szMessageStatus, NUMCHARS(m_szMessageStatus)); - UpdateUI(UPDATE_DASHBOARD); - return TRUE; - } - } - - return 0; - } - case WM_RBUTTONUP: - { - m_sfLapOpts.flWindowShiftX = 0; - m_sfLapOpts.flWindowShiftY = 0; - m_sfLapOpts.iZoomLevels = 0; - UpdateUI(UPDATE_MAP); - return TRUE; - } - case WM_PAINT: - { - UpdateDisplays(); - return FALSE; - } - case WM_SIZE: - { - SIZE sNewSize; - sNewSize.cx = LOWORD(lParam); - sNewSize.cy = HIWORD(lParam); - HandleResize(sNewSize); - return TRUE; - } - } - - return FALSE; -} - DWORD GetDlgId() const {return IDD_DLGFIRST;} - - const static DWORD UPDATE_MAP = 0x1; - const static DWORD UPDATE_LIST = 0x2; - const static DWORD UPDATE_DASHBOARD = 0x4; - const static DWORD UPDATE_MENU = 0x8; - const static DWORD UPDATE_VALUES = 0x10; - const static DWORD UPDATE_TRACTIONCIRCLE = 0x20; - const static DWORD UPDATE_ALLDATA = 0x40; - - const static DWORD UPDATE_ALL = 0xffffffff; - // Pull in PlotPrefs array as well as lines vs. dots and Painting color scheme settings from Settings.txt file - void SetDisplayOptions(const LAPSUPPLIEROPTIONS& lapOpts) - { - m_sfLapOpts = lapOpts; - } - void SetDBPath(const TCHAR szPath[MAX_PATH]) - { - _snwprintf(m_szPath, NUMCHARS(m_szPath), szPath); - } - - void UpdateUI(DWORD fdwUpdateFlags) - { - m_fdwUpdateNeeded|= fdwUpdateFlags; - PostMessage(m_hWnd,WM_UPDATEUI,0,0); - } - void UpdateUI_Internal(DWORD fdwUpdateFlags) - { - set setSelectedData = m_sfLapList.GetSelectedItemsData3(); - vector laps = GetSortedLaps(m_sfLapOpts.eSortPreference); // translates our m_mapLaps into a vector sorted by time - // do some memory cleanup - for(int x = 0;x < laps.size(); x++) - { - if(setSelectedData.find((LPARAM)laps[x]) != setSelectedData.end() || laps[x] == m_pReferenceLap) - { - // this lap is still selected, as it is in the set of selected items - } - else - { - // this lap is not selected. we should compact it so that it doesn't gobble memory. - laps[x]->Compact(); - } - } - - - if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_LIST)) - { - int iPosition = m_sfLapList.GetPosition(); - m_sfLapList.Clear(); - vector laps = GetSortedLaps(m_sfLapOpts.eSortPreference); // translates our m_mapLaps into a vector sorted by time - for(int x = 0;x < laps.size(); x++) - { - vector lstStrings; - laps[x]->GetStrings(lstStrings); - m_sfLapList.AddStrings(lstStrings, (LPARAM)laps[x]); - } - m_sfLapList.SetSelectedData(setSelectedData); - if(laps.size() > 0) - { - m_sfLapList.MakeVisible((LPARAM)laps[laps.size()-1]); // Always set the last lap as visible in the Lap List -// m_sfLapList.MakeVisible( (LPARAM)m_sfLapList.GetSelectedItemsData3() ); - } - } - if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_VALUES)) - { - UpdateValues(); - UpdateSectors(); - } - if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_MAP)) - { - UpdateDisplays(); - } - if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_MENU)) - { - UpdateMenus(); - } - if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_ALLDATA)) - { - UpdateAllData(); - } - - if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_DASHBOARD)) - { - set setSelectedChannels; - - for(set::const_iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) - { - CExtendedLap* pLap = (CExtendedLap*)(*i); - set setLapData = pLap->GetAvailableChannels(); - for(set::iterator i = setLapData.begin(); i != setLapData.end(); i++) - { - setSelectedChannels.insert(*i); - } - } - - CASSERT(LAPDISPLAYSTYLE_COUNT == 4); - switch(m_eLapDisplayStyle) - { - case LAPDISPLAYSTYLE_MAP: CheckRadioButton(m_hWnd, IDC_DISPLAYTYPE_LINE, IDC_DISPLAYTYPE_LAST, IDC_DISPLAYTYPE_LINE); break; - case LAPDISPLAYSTYLE_PLOT: CheckRadioButton(m_hWnd, IDC_DISPLAYTYPE_LINE, IDC_DISPLAYTYPE_LAST, IDC_DISPLAYTYPE_PLOT); break; - case LAPDISPLAYSTYLE_RECEPTION: CheckRadioButton(m_hWnd, IDC_DISPLAYTYPE_LINE, IDC_DISPLAYTYPE_LAST, IDC_DISPLAYTYPE_RECEPTION); break; - default: DASSERT(FALSE); break; - } - - set setXSelected,setYSelected; - setXSelected.insert(m_eXChannel); - m_sfXAxis.SetSelectedData(setXSelected); - - for(int x = 0; x < m_lstYChannels.size(); x++) - { - setYSelected.insert(m_lstYChannels[x]); - } - m_sfYAxis.SetSelectedData(setYSelected); - - HWND hDriverButton = GetDlgItem(m_hWnd, IDC_SETDRIVER); - Button_Enable(hDriverButton, setSelectedData.size() > 0); - HWND hReferenceButton = GetDlgItem(m_hWnd, IDC_SETREFERENCE); - Button_Enable(hReferenceButton, setSelectedData.size() == 1); - - HWND hWndReference = GetDlgItem(m_hWnd, IDC_CURRENTREFERENCE); - if(m_pReferenceLap) - { - TCHAR szRefString[512] = L""; - TCHAR szLapString[512] = L""; - m_pReferenceLap->GetString(szLapString, NUMCHARS(szLapString)); - swprintf(szRefString, NUMCHARS(szRefString), L"Reference Lap: %s", szLapString); - SendMessage(hWndReference, WM_SETTEXT, 0, (LPARAM)szRefString); - } - else - { - SendMessage(hWndReference, WM_SETTEXT, 0, (LPARAM)L"No Reference Lap"); - } - HWND hWndMessageStatus = GetDlgItem(m_hWnd, IDC_MESSAGESTATUS); - SendMessage(hWndMessageStatus, WM_SETTEXT, 0, (LPARAM)m_szMessageStatus); - - InitAxes(setSelectedChannels); - } - } -private: - void ClearUILaps() - { - m_mapLapHighlightTimes.clear(); - m_pReferenceLap = NULL; - m_mapLaps.clear(); - m_sfLapList.Clear(); - } - bool ShowHelp(HWND hWnd) - { - TCHAR lpOpen[MAX_PATH] = L"open"; - - TCHAR lpFile[MAX_PATH] = L"PitsideHelp.pdf"; - TCHAR lpDir[MAX_PATH]; - if(GetAppFolder(lpDir,NUMCHARS(lpDir))) - { - // Set up the Filename string for the Help PDF file. - wcsncat(lpDir,L"", NUMCHARS(lpDir)-1); - } - else - { - // trouble. just bail. - return false; - } - int nShowCmd = SW_RESTORE; // Restore the Help document, if it is minimized or whatever. - - // Shell to the Help PDF file - HINSTANCE Check = ShellExecuteW(hWnd, lpOpen, lpFile, NULL, lpDir, nShowCmd); - if ((int)Check <= 32) - MessageBox(NULL, L"The Help file requires Acrobat Reader\n\nPlease install Reader and try again", L"Acrobat Reader Not Found", MB_OK); - return true; - } - bool ShowWFLHelp(HWND hWnd) - { - TCHAR lpOpen[MAX_PATH] = L"open"; - - TCHAR lpFile[MAX_PATH] = L"WifilapperHelp.pdf"; - TCHAR lpDir[MAX_PATH]; - if(GetAppFolder(lpDir,NUMCHARS(lpDir))) - { - // Set up the Filename string for the Help PDF file. - wcsncat(lpDir,L"", NUMCHARS(lpDir)-1); - } - else - { - // trouble. just bail. - return false; - } - int nShowCmd = SW_RESTORE; // Restore the Help document, if it is minimized or whatever. - - // Shell to the Help PDF file - HINSTANCE Check = ShellExecuteW(hWnd, lpOpen, lpFile, NULL, lpDir, nShowCmd); - if ((int)Check <= 32) - MessageBox(NULL, L"The Help file requires Acrobat Reader\n\nPlease install Reader and try again", L"Acrobat Reader Not Found", MB_OK); - return true; - } - void ShowNetInfo() - { - while(true) - { - TCHAR szBuf[1000]; - szBuf[0] = '\0'; - _snwprintf(szBuf, NUMCHARS(szBuf), L"PC IP Address[es] are displayed below. You will need one of these to put in the phone app.\n\n"); - - IP_ADAPTER_INFO sfAdapter[255] = {0}; - ULONG cbAdapter = sizeof(sfAdapter); - ULONG ret = GetAdaptersInfo(sfAdapter, &cbAdapter); - int cConnected = 0; - if(ret == NO_ERROR) - { - IP_ADAPTER_INFO* pInfo = &sfAdapter[0]; - while(pInfo) - { - TCHAR szLine[255]; - if(strcmp(pInfo->IpAddressList.IpAddress.String, "0.0.0.0") != 0) - { - _snwprintf(szLine, NUMCHARS(szLine), L"%S - %S\n", pInfo->Description, pInfo->IpAddressList.IpAddress.String); - wcsncat(szBuf,szLine, NUMCHARS(szBuf)); - cConnected++; - } - - pInfo = pInfo->Next; - } - - if(cConnected > 0) - { - MessageBox(NULL, szBuf, L"Ip address info", MB_OK); - return; - } - else - { - int iResult = MessageBox(NULL, L"WifiLapper Pitside cannot find any network devices connected. Please connect to a network and try again.", L"Could not find IP addresses", MB_ABORTRETRYIGNORE | MB_ICONWARNING); - if(iResult == IDABORT) - { - exit(0); - } - else if(iResult == IDRETRY) - { - // just let the loop roll - } - else if(iResult == IDIGNORE) - { - // ok, they just want to get to the app. - return; - } - } - } - } // loop for retrying - } - void InitAxes(set setAvailable) - { - static set setLast; - if(AreSetsEqual(setLast,setAvailable)) return; // nothing to do - - m_sfXAxis.Clear(); - m_sfYAxis.Clear(); - TCHAR szDataChannelName[MAX_PATH]; - for(set::const_iterator i = setAvailable.begin(); i != setAvailable.end(); i++) - { - GetDataChannelName(*i, szDataChannelName, NUMCHARS(szDataChannelName)); - m_sfXAxis.AddString(szDataChannelName,*i); - m_sfYAxis.AddString(szDataChannelName,*i); - } - setLast = setAvailable; - } - void InitBaseWindowPos() - { -#define GET_WINDOWPOS(idc) \ - { \ - WINDOWPLACEMENT wp; \ - wp.length = sizeof(wp); \ - HWND hWnd = GetDlgItem(m_hWnd,idc); \ - GetWindowPlacement(hWnd, &wp); \ - m_baseWindowPos[idc] = wp.rcNormalPosition; \ - } - WINDOWPLACEMENT wp; - wp.length = sizeof(wp); - HWND hWnd = m_hWnd; - GetWindowPlacement(hWnd, &wp); - m_baseWindowPos[IDD_DLGFIRST] = wp.rcNormalPosition; - - GET_WINDOWPOS(IDC_DISPLAY); -// GET_WINDOWPOS(IDD_DLGSUBDISPLAY); - GET_WINDOWPOS(IDC_SUBDISPLAY); - GET_WINDOWPOS(IDC_LAPS); - GET_WINDOWPOS(IDC_TRACTIONCIRCLEMAP); - GET_WINDOWPOS(IDC_ALLDATADISPLAY); - - } - void HandleCtlResize(SIZE sNewSize, int idc, bool fResizeX, bool fResizeY) - { - HWND hwndMainView = GetDlgItem(m_hWnd, idc); - RECT rcBasePos = m_baseWindowPos[idc]; - SIZE sNewCtlSize = {fResizeX ? (sNewSize.cx - rcBasePos.left) : RECT_WIDTH(&rcBasePos), fResizeY ? (sNewSize.cy - rcBasePos.top) : RECT_HEIGHT(&rcBasePos)}; - MoveWindow(hwndMainView, rcBasePos.left, rcBasePos.top, sNewCtlSize.cx, sNewCtlSize.cy, TRUE); - } - void HandleResize(SIZE sNewSize) - { - HandleCtlResize(sNewSize, IDC_DISPLAY, true, true); // main display window -// HandleCtlResize(sNewSize, IDD_DLGSUBDISPLAY, true, true); // sub display window - HandleCtlResize(sNewSize, IDC_SUBDISPLAY, true, false); // sub display control - HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list - HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window - } - - // Function updates the data points in the window showing all of the data for the selected laps, activated by the middle mouse button - void UpdateAllData() - { - // hWnd_AllData is the handle for the window we want. Let's make sure that it is displayed - // Let's define some colors for the List Views to use - COLORREF d_BlackColor = RGB(0, 0, 0); // Black - COLORREF d_WhiteColor = RGB(255, 255, 255); // White - COLORREF d_RedColor = RGB(230, 20, 20); // Red - COLORREF d_GreenColor = RGB(20, 230, 20); // Green - COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey - HDC AD_Rect = GetDC(AD_hWnd); // HDC for the display control - - if (GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Only execute data display functions if window is showing - { - // First let's get all of the information about the data points for this lap/location - ListView_DeleteAllItems(AD_hWnd); // Clear the list before displaying the update - vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list - if(lstLaps.size() > 0) - { - const int cLaps = 10; // The maximum number of Laps to display Data channels for, limited by the window form - int iLap = 0; // Tracking variable for which Lap we are on in the loop - int iChannel = 0; // Tracking variable for which Y-Channel we are on within each lap + break; + } + case ID_TIMINGSCORING: + { + // Let's set up for displaying the T&S page + int m_RaceId[50] = {NULL}; + // Show the race-selection dialog and let the User pick which ones to use on T&S page + static bool bSelectSessions; + if (!bSelectSessions) // Prevent duplicate windows + { + bSelectSessions = true; + SELECTSESSIONS_RESULT sfResult; + CDlgSelectSessions dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + if( !sfResult.fCancelled ) // Allow the user to show the menu and start a race, even if no data has been collected from the racers yet + { + // Now display the T&S page and pass these RaceID's to this class + TS_RESULT ts_sfResult; + CDlgTimingScoring dlgTS(g_pLapDB, &ts_sfResult, m_szPath, &sfResult); + ArtShowDialog(&dlgTS); + } + bSelectSessions = false; + } + return TRUE; + } + case ID_DATA_OPENDB: + { + TCHAR szFilename[MAX_PATH]; + if(ArtGetOpenFileName(hWnd, L"Choose WFLP file", szFilename, NUMCHARS(szFilename),L"WifiLapper Files (*.wflp)\0*.WFLP\0\0")) + { + if(g_pLapDB->Init(szFilename)) + { + _snwprintf(m_szPath, NUMCHARS(m_szPath), szFilename); + RACESELECT_RESULT sfResult; + + // Zero out the Race ID's before selecting them + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = -1; + sfResult.iRaceId[z] = -1; + } + + CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + + if(!sfResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen + } + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_ALL); + // Let's reset the timer + tmLast = timeGetTime(); // Save last time lap was received + + // Find all of the Names of the selected Race Sessions for addition to title bar + vector lstRaces = g_pLapDB->GetRaces(); + TCHAR lstSessions[MAX_PATH] = {NULL}; + for(int x = 0;x < lstRaces.size(); x++) + { + for (int z = 0; z < 50; z++) + { + if ( m_iRaceId[z] == lstRaces[x].raceId ) + { + _snwprintf(lstSessions, NUMCHARS(lstSessions), L"%s | %s", lstSessions, lstRaces[x].strName.c_str()); + break; + } + } + } + TCHAR szTemp[MAX_PATH] = {NULL}; + _snwprintf(szTemp, NUMCHARS(szTemp), L"Pitside - %s%s", m_szPath, lstSessions); + SetWindowText(hWnd, szTemp); // Change the title bar to show the file name opened + } + } + } + return TRUE; + } + case ID_DATA_DASHWARE: // Save the data to a .CSV file + { + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); + if(setSelectedData.size() > 0) + { + TCHAR szFilename[MAX_PATH] = {NULL}; + wcscat(szFilename,L"Export.csv"); + while (true) + { + if(ArtGetSaveFileName(hWnd, L"Choose Output file", szFilename, NUMCHARS(szFilename),L"CSV Files (*.csv)\0*.CSV\0\0")) + { + // let's make sure there's a .csv suffix on that bugger. + if(!str_ends_with(szFilename,L".csv") && !str_ends_with(szFilename,L".CSV")) + { + wcsncat(szFilename,L".csv", NUMCHARS(szFilename)); + } + const bool fFileIsNew = !DoesFileExist(szFilename); + if(fFileIsNew) + { + break; // Exit loop, as file name is valid and new + } + else + { + DWORD dwRet = MessageBox(NULL,L"A file already exists with that name.\n\nAre you sure you want to overwrite it?",L"WARNING", MB_APPLMODAL | MB_ICONWARNING | MB_YESNO | MB_TOPMOST | MB_DEFBUTTON2); + if (dwRet == IDYES) + { + break; // User wants to overwrite file, so exit loop and proceed + } + } + } + else + { + return 0; // User cancelled the save operation, so leave subroutine + } + } + + // Display the "Working...." dialog, as this is going to take some time. + DLGPROC working = NULL; + HWND hwndGoto = NULL; // Window handle of dialog box + if (!IsWindow(hwndGoto)) + { + hwndGoto = CreateDialog(NULL, MAKEINTRESOURCE (IDD_PROGRESS), hWnd, working); + ShowWindow(hwndGoto, SW_SHOW); + } + + vector lstLaps; + vector lstLaps1 = GetLapsToShow(); + for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) + { + CExtendedLap* pLap = (CExtendedLap*)*i; + lstLaps.push_back(pLap->GetLap()); + } + DashWare::SaveToDashware(szFilename, lstLaps, lstLaps1); // lstLaps does not have the reference lap in it, lstLaps1 may have it + DestroyWindow(hwndGoto); // Close the "Working..." dialog + hwndGoto = NULL; + } + else + { + MessageBox(NULL,L"Please Select Laps",L"You must select some laps first!",MB_OK | MB_ICONWARNING); + } + return TRUE; + } + case IDC_DISPLAYTYPE_LINE: + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + m_eLapDisplayStyle = LAPDISPLAYSTYLE_MAP; + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD); + break; + } + return TRUE; + } +/* case IDC_DISPLAYTYPE_RECEPTION: + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + m_eLapDisplayStyle = LAPDISPLAYSTYLE_RECEPTION; + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + break; + } + return TRUE; + } +*/ case IDC_DISPLAYTYPE_PLOT: + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + m_eLapDisplayStyle = LAPDISPLAYSTYLE_PLOT; + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD); + break; + } + return TRUE; + } + case IDC_SETREFERENCE: + { + // they want to set a given lap as a reference lap + set setSelected = m_sfLapList.GetSelectedItemsData3(); + if(setSelected.size() == 1) + { + CExtendedLap* pNewRefLap = (CExtendedLap*)*(setSelected.begin()); + pNewRefLap->ComputeDistances(NULL, g_pLapDB); + for(map::iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + if(i->second != pNewRefLap) + { + i->second->ComputeDistances(pNewRefLap, g_pLapDB); // tell this lap to recompute using pLap as the reference lap + } + } + m_pReferenceLap = pNewRefLap; + } + else + { + // what's going on? This should've been disabled + } + UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); + return TRUE; + } + case IDC_SETDRIVER: // they want to set the driver of the selected laps + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + ApplyDriverNameToSelectedLaps(::g_pLapDB); + UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); // Redraw the laplist and buttons + break; + } + return TRUE; + } + case IDC_CLEARCOMMENT: // This button clears the comment field + { + switch(HIWORD(wParam)) + { + case BN_CLICKED: + m_szCommentText[0] = '\0'; + SendMessage(GetDlgItem(m_hWnd, IDC_COMMENTTEXT), WM_SETTEXT, NUMCHARS(m_szCommentText), (LPARAM)m_szCommentText); +// UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); + break; + } + return TRUE; + } + case IDC_COMMENTTEXT: + { + switch(HIWORD(wParam)) + { + case EN_CHANGE: + { + SendMessage(GetDlgItem(m_hWnd, IDC_COMMENTTEXT), WM_GETTEXT, NUMCHARS(m_szCommentText), (LPARAM)m_szCommentText); +// UpdateUI(UPDATE_LIST | UPDATE_DASHBOARD); + break; + } + } + return TRUE; + } + } // end switch for finding out what control WM_COMMAND hit + break; // break out of WM_COMMAND handling + } // End of COMMAND loop + case WM_UPDATEUI: + { + DWORD dwCurrentUpdate = m_fdwUpdateNeeded; + UpdateUI_Internal(dwCurrentUpdate); + m_fdwUpdateNeeded &= ~dwCurrentUpdate; + return TRUE; + } + case WM_NOTIFYUPDATE: + { + switch(wParam) + { + case NOTIFY_NEEDRECVCONFIG: + { + // a lap has been received, but the database isn't set up to receive (aka it's pointing at a high-quality race). + // let's tell the user about it and ask them for input. + static bool fWarnedOnce = false; + if(!fWarnedOnce) + { + fWarnedOnce = true; + MessageBox(NULL,L"You just received a lap from a car, but you're looking at old data. Hit data->'new race session' or else Pitside will keep ignoring it",L"Not ready to receive",0); + } + return TRUE; + } + case NOTIFY_NEWLAP: + { + ILapReceiver* pLapDB = (ILapReceiver*)lParam; + int iLastRaceId = pLapDB->GetLastReceivedRaceId(); + if(m_iRaceId[0] < 0 || pLapDB->GetLapCount(m_iRaceId[0]) <= 0 || // if we don't have a race or our current race has no laps (aka sucks) + (pLapDB->IsActivelyReceiving(iLastRaceId) && !pLapDB->IsActivelyReceiving(m_iRaceId[0]))) // or if the new race ID is receiving and the current race ID isn't... + { + m_iRaceId[0] = pLapDB->GetLastReceivedRaceId(); // since we just got told there's a new lap, there must be a last-received-race + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_ALL); + } + else + { + LoadLaps((ILapReceiver*)lParam); + UpdateUI(UPDATE_ADD2LIST); // Add the recently received lap to the laplist window + } + // Just loaded a new lap. Let's reset the timer + tmLast = timeGetTime(); // Save last time lap was received + return TRUE; + } + case NOTIFY_NEWDATABASE: + { + // a new database has shown up! + + // first, check if the user cares... + DWORD dwRet = MessageBox(NULL,L"A new database has been sent from a phone. Do you want to load it?",L"New database",MB_YESNO); + if(dwRet == IDYES) + { + LPCTSTR lpszFilename = (LPCTSTR)lParam; + if(g_pLapDB->Init(lpszFilename)) + { + RACESELECT_RESULT sfResult; + + // Zero out the Race ID's before selecting them + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = -1; + sfResult.iRaceId[z] = -1; + } + + CRaceSelectDlg dlgRace(g_pLapDB, &sfResult); + ArtShowDialog(&dlgRace); + if(!sfResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + m_iRaceId[z] = sfResult.iRaceId[z]; // Load all of the race sessions chosen + } + + ClearUILaps(); + LoadLaps(g_pLapDB); + UpdateUI(UPDATE_ALL); + } + } + // Let's reset the timer + tmLast = timeGetTime(); // Save last time lap was received + } + return TRUE; + + } + case NOTIFY_NEWNETSTATUS: + { + ILapReceiver* pLaps = (ILapReceiver*)lParam; + SendMessage(m_hWnd, WM_SETTEXT, 0, (LPARAM)pLaps->GetNetStatus(NETSTATUS_STATUS)); + + TCHAR szTemp[512]; +// HWND hWndIp = GetDlgItem(m_hWnd, IDC_CURRENTIP); +// swprintf(szTemp, NUMCHARS(szTemp), L"PC: %s", pLaps->GetNetStatus(NETSTATUS_THISIP)); +// SendMessage(hWndIp, WM_SETTEXT, 0, (LPARAM)szTemp); + + HWND hWndRemoteIp = GetDlgItem(m_hWnd, IDC_CURRENTREMOTEIP); + swprintf(szTemp, NUMCHARS(szTemp), L"Phone: %s", pLaps->GetNetStatus(NETSTATUS_REMOTEIP)); + SendMessage(hWndRemoteIp, WM_SETTEXT, 0, (LPARAM)szTemp); + return TRUE; + } + case NOTIFY_NEWMSGDATA: + { + CMsgThread* pThd = (CMsgThread*)lParam; + pThd->GetStatusMessage(m_szMessageStatus, NUMCHARS(m_szMessageStatus)); + UpdateUI(UPDATE_DASHBOARD); + return TRUE; + } + } + + return 0; + } + case WM_RBUTTONUP: + { + m_sfLapOpts.flWindowShiftX = 0; + m_sfLapOpts.flWindowShiftY = 0; + m_sfLapOpts.iZoomLevels = 0; + UpdateUI(UPDATE_MAP); + return TRUE; + } + case WM_PAINT: + { + UpdateDisplays(); + return FALSE; + } + case WM_SIZE: + { + SIZE sNewSize; + sNewSize.cx = LOWORD(lParam); + sNewSize.cy = HIWORD(lParam); + HandleResize(sNewSize); + return TRUE; + } + } + + return FALSE; +} + DWORD GetDlgId() const {return IDD_DLGFIRST;} + + const static DWORD UPDATE_MAP = 0x1; + const static DWORD UPDATE_LIST = 0x2; + const static DWORD UPDATE_DASHBOARD = 0x4; + const static DWORD UPDATE_MENU = 0x8; + const static DWORD UPDATE_VALUES = 0x10; + const static DWORD UPDATE_TRACTIONCIRCLE = 0x20; + const static DWORD UPDATE_ALLDATA = 0x40; + + const static DWORD UPDATE_ALL = 0xffffffff; + // Pull in PlotPrefs array as well as lines vs. dots and Painting color scheme settings from Settings.txt file + void SetDisplayOptions(const LAPSUPPLIEROPTIONS& lapOpts) + { + m_sfLapOpts = lapOpts; + } + void SetDBPath(const TCHAR szPath[MAX_PATH]) + { + _snwprintf(m_szPath, NUMCHARS(m_szPath), szPath); + } + + void UpdateUI(DWORD fdwUpdateFlags) + { + m_fdwUpdateNeeded|= fdwUpdateFlags; + PostMessage(m_hWnd,WM_UPDATEUI,0,0); + } + + + void UpdateUI_Internal(DWORD fdwUpdateFlags) + { + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); + vector laps = GetSortedLaps(m_sfLapOpts.eSortPreference); // translates our m_mapLaps into a vector sorted by time + // do some memory cleanup + for(int x = 0;x < laps.size(); x++) + { + if(setSelectedData.find((LPARAM)laps[x]) != setSelectedData.end() || laps[x] == m_pReferenceLap) + { + // this lap is still selected, as it is in the set of selected items + } + else + { + // this lap is not selected. we should compact it so that it doesn't gobble memory. + laps[x]->Compact(); + } + } + + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_LIST)) // rebuild the laplist from scratch + { + m_sfLapList.Clear(); + for(int x = 0;x < laps.size(); x++) + { + vector lstStrings; + laps[x]->GetStrings(lstStrings); + m_sfLapList.AddStrings(lstStrings, (LPARAM)laps[x]); + } + + m_sfLapList.SetSelectedData(setSelectedData); + if(laps.size() > 0) + { + m_sfLapList.MakeVisible((LPARAM)laps[laps.size()-1]); // Always set the last lap as visible in the Lap List + } + } + + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_ADD2LIST)) + { + int iLapId; + int x; + const ILap *iLap; + + // Loop through the list of laps to add, making sure avoid duplicates. Find the row to add it + while( m_sfLapList.GetCount() < laps.size() && (iLap = g_pLapDB->GetLastLap()) != NULL ) { + iLapId = iLap->GetLapId(); + + // Find which row this lap needs to appear + for(x = 0;x < laps.size(); x++) { + if( laps[x]->GetLap()->GetLapId() == iLapId ) break; + } + if(x < laps.size()) + { + // x is the index which matches our most recent lap. We need to insert this one into m_sfLapList + vector lstStrings; + laps[x]->GetStrings(lstStrings); + m_sfLapList.InsertStrings(lstStrings, (LPARAM)laps[x], x); + m_sfLapList.MakeVisible((LPARAM)laps[x]); // Always set the last lap as visible in the Lap List + } + else + DASSERT(1);// we didn't find the lap ID from the list of laps to add in the laps vector !! + } + m_sfLapList.SetSelectedData(setSelectedData); + } + + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_VALUES)) + { + UpdateValues(); + UpdateSectors(); + } + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_MAP)) + { + UpdateDisplays(); + } + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_MENU)) + { + UpdateMenus(); + } + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_ALLDATA)) + { + UpdateAllData(); + } + + if(IS_FLAG_SET(fdwUpdateFlags, UPDATE_DASHBOARD)) + { + set setSelectedChannels; + + for(set::const_iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) + { + CExtendedLap* pLap = (CExtendedLap*)(*i); + set setLapData = pLap->GetAvailableChannels(); + for(set::iterator i = setLapData.begin(); i != setLapData.end(); i++) + { + setSelectedChannels.insert(*i); + } + } + + CASSERT(LAPDISPLAYSTYLE_COUNT == 4); + switch(m_eLapDisplayStyle) + { + case LAPDISPLAYSTYLE_MAP: CheckRadioButton(m_hWnd, IDC_DISPLAYTYPE_LINE, IDC_DISPLAYTYPE_LAST, IDC_DISPLAYTYPE_LINE); break; + case LAPDISPLAYSTYLE_PLOT: CheckRadioButton(m_hWnd, IDC_DISPLAYTYPE_LINE, IDC_DISPLAYTYPE_LAST, IDC_DISPLAYTYPE_PLOT); break; + case LAPDISPLAYSTYLE_RECEPTION: CheckRadioButton(m_hWnd, IDC_DISPLAYTYPE_LINE, IDC_DISPLAYTYPE_LAST, IDC_DISPLAYTYPE_RECEPTION); break; + default: DASSERT(FALSE); break; + } + + set setXSelected,setYSelected; + setXSelected.insert(m_eXChannel); + m_sfXAxis.SetSelectedData(setXSelected); + + for(int x = 0; x < m_lstYChannels.size(); x++) + { + setYSelected.insert(m_lstYChannels[x]); + } + m_sfYAxis.SetSelectedData(setYSelected); + + HWND hDriverButton = GetDlgItem(m_hWnd, IDC_SETDRIVER); + Button_Enable(hDriverButton, setSelectedData.size() > 0); + HWND hReferenceButton = GetDlgItem(m_hWnd, IDC_SETREFERENCE); + Button_Enable(hReferenceButton, setSelectedData.size() == 1); + + HWND hWndReference = GetDlgItem(m_hWnd, IDC_CURRENTREFERENCE); + if(m_pReferenceLap) + { + TCHAR szRefString[512] = L""; + TCHAR szLapString[512] = L""; + m_pReferenceLap->GetString(szLapString, NUMCHARS(szLapString)); + swprintf(szRefString, NUMCHARS(szRefString), L"Reference Lap: %s", szLapString); + SendMessage(hWndReference, WM_SETTEXT, 0, (LPARAM)szRefString); + } + else + { + SendMessage(hWndReference, WM_SETTEXT, 0, (LPARAM)L"No Reference Lap"); + } + HWND hWndMessageStatus = GetDlgItem(m_hWnd, IDC_MESSAGESTATUS); + SendMessage(hWndMessageStatus, WM_SETTEXT, 0, (LPARAM)m_szMessageStatus); + + InitAxes(setSelectedChannels); + } + } +private: + void ClearUILaps() + { + m_mapLapHighlightTimes.clear(); + m_pReferenceLap = NULL; + m_mapLaps.clear(); + m_sfLapList.Clear(); + } + bool ShowHelp(HWND hWnd) + { + TCHAR lpOpen[MAX_PATH] = L"open"; + + TCHAR lpFile[MAX_PATH] = L"PitsideHelp.pdf"; + TCHAR lpDir[MAX_PATH]; + if(GetAppFolder(lpDir,NUMCHARS(lpDir))) + { + // Set up the Filename string for the Help PDF file. + wcsncat(lpDir,L"", NUMCHARS(lpDir)-1); + } + else + { + // trouble. just bail. + return false; + } + int nShowCmd = SW_RESTORE; // Restore the Help document, if it is minimized or whatever. + + // Shell to the Help PDF file + HINSTANCE Check = ShellExecuteW(hWnd, lpOpen, lpFile, NULL, lpDir, nShowCmd); + if ((int)Check <= 32) + MessageBox(NULL, L"The Help file requires Acrobat Reader\n\nPlease install Reader and try again", L"Acrobat Reader Not Found", MB_OK); + return true; + } + bool ShowWFLHelp(HWND hWnd) + { + TCHAR lpOpen[MAX_PATH] = L"open"; + + TCHAR lpFile[MAX_PATH] = L"WifilapperHelp.pdf"; + TCHAR lpDir[MAX_PATH]; + if(GetAppFolder(lpDir,NUMCHARS(lpDir))) + { + // Set up the Filename string for the Help PDF file. + wcsncat(lpDir,L"", NUMCHARS(lpDir)-1); + } + else + { + // trouble. just bail. + return false; + } + int nShowCmd = SW_RESTORE; // Restore the Help document, if it is minimized or whatever. + + // Shell to the Help PDF file + HINSTANCE Check = ShellExecuteW(hWnd, lpOpen, lpFile, NULL, lpDir, nShowCmd); + if ((int)Check <= 32) + MessageBox(NULL, L"The Help file requires Acrobat Reader\n\nPlease install Reader and try again", L"Acrobat Reader Not Found", MB_OK); + return true; + } + void ShowNetInfo() + { + while(true) + { + TCHAR szBuf[1000]; + szBuf[0] = '\0'; + _snwprintf(szBuf, NUMCHARS(szBuf), L"PC IP Address[es] are displayed below. You will need one of these to put in the phone app.\n\n"); + + IP_ADAPTER_INFO sfAdapter[255] = {0}; + ULONG cbAdapter = sizeof(sfAdapter); + ULONG ret = GetAdaptersInfo(sfAdapter, &cbAdapter); + int cConnected = 0; + if(ret == NO_ERROR) + { + IP_ADAPTER_INFO* pInfo = &sfAdapter[0]; + while(pInfo) + { + TCHAR szLine[255]; + if(strcmp(pInfo->IpAddressList.IpAddress.String, "0.0.0.0") != 0) + { + _snwprintf(szLine, NUMCHARS(szLine), L"%S - %S\n", pInfo->Description, pInfo->IpAddressList.IpAddress.String); + wcsncat(szBuf,szLine, NUMCHARS(szBuf)); + cConnected++; + } + + pInfo = pInfo->Next; + } + + if(cConnected > 0) + { + MessageBox(NULL, szBuf, L"Ip address info", MB_OK); + return; + } + else + { + int iResult = MessageBox(NULL, L"WifiLapper Pitside cannot find any network devices connected. Please connect to a network and try again.", L"Could not find IP addresses", MB_ABORTRETRYIGNORE | MB_ICONWARNING); + if(iResult == IDABORT) + { + exit(0); + } + else if(iResult == IDRETRY) + { + // just let the loop roll + } + else if(iResult == IDIGNORE) + { + // ok, they just want to get to the app. + return; + } + } + } + } // loop for retrying + } + void InitAxes(set setAvailable) + { + static set setLast; + if(AreSetsEqual(setLast,setAvailable)) return; // nothing to do + + m_sfXAxis.Clear(); + m_sfYAxis.Clear(); + TCHAR szDataChannelName[MAX_PATH]; + for(set::const_iterator i = setAvailable.begin(); i != setAvailable.end(); i++) + { + GetDataChannelName(*i, szDataChannelName, NUMCHARS(szDataChannelName)); + m_sfXAxis.AddString(szDataChannelName,*i); + m_sfYAxis.AddString(szDataChannelName,*i); + } + setLast = setAvailable; + } + void InitBaseWindowPos() + { +#define GET_WINDOWPOS(idc) \ + { \ + WINDOWPLACEMENT wp; \ + wp.length = sizeof(wp); \ + HWND hWnd = GetDlgItem(m_hWnd,idc); \ + GetWindowPlacement(hWnd, &wp); \ + m_baseWindowPos[idc] = wp.rcNormalPosition; \ + } + WINDOWPLACEMENT wp; + wp.length = sizeof(wp); + HWND hWnd = m_hWnd; + GetWindowPlacement(hWnd, &wp); + m_baseWindowPos[IDD_DLGFIRST] = wp.rcNormalPosition; + + GET_WINDOWPOS(IDC_DISPLAY); +// GET_WINDOWPOS(IDD_DLGSUBDISPLAY); + GET_WINDOWPOS(IDC_SUBDISPLAY); + GET_WINDOWPOS(IDC_LAPS); + GET_WINDOWPOS(IDC_TRACTIONCIRCLEMAP); + GET_WINDOWPOS(IDC_ALLDATADISPLAY); + + } + void HandleCtlResize(SIZE sNewSize, int idc, bool fResizeX, bool fResizeY) + { + HWND hwndMainView = GetDlgItem(m_hWnd, idc); + RECT rcBasePos = m_baseWindowPos[idc]; + SIZE sNewCtlSize = {fResizeX ? (sNewSize.cx - rcBasePos.left) : RECT_WIDTH(&rcBasePos), fResizeY ? (sNewSize.cy - rcBasePos.top) : RECT_HEIGHT(&rcBasePos)}; + MoveWindow(hwndMainView, rcBasePos.left, rcBasePos.top, sNewCtlSize.cx, sNewCtlSize.cy, TRUE); + } + void HandleResize(SIZE sNewSize) + { + HandleCtlResize(sNewSize, IDC_DISPLAY, true, true); // main display window +// HandleCtlResize(sNewSize, IDD_DLGSUBDISPLAY, true, true); // sub display window + HandleCtlResize(sNewSize, IDC_SUBDISPLAY, true, false); // sub display control + HandleCtlResize(sNewSize, IDC_LAPS, false, true); // lap list + HandleCtlResize(sNewSize, IDC_TRACTIONCIRCLEMAP, false, false); // Traction circle window + } + + // Function updates the data points in the window showing all of the data for the selected laps, activated by the middle mouse button + void UpdateAllData() + { + // hWnd_AllData is the handle for the window we want. Let's make sure that it is displayed + // Let's define some colors for the List Views to use + COLORREF d_BlackColor = RGB(0, 0, 0); // Black + COLORREF d_WhiteColor = RGB(255, 255, 255); // White + COLORREF d_RedColor = RGB(230, 20, 20); // Red + COLORREF d_GreenColor = RGB(20, 230, 20); // Green + COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey + HDC AD_Rect = GetDC(AD_hWnd); // HDC for the display control + + if (GetDlgItem(hWnd_AllData, IDC_ALLDATADISPLAY)) // Only execute data display functions if window is showing + { + // First let's get all of the information about the data points for this lap/location + ListView_DeleteAllItems(AD_hWnd); // Clear the list before displaying the update + vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list + if(lstLaps.size() > 0) + { + const int cLaps = 10; // The maximum number of Laps to display Data channels for, limited by the window form + int iLap = 0; // Tracking variable for which Lap we are on in the loop + int iChannel = 0; // Tracking variable for which Y-Channel we are on within each lap int iTotChannel = 0; // The number of Y Data channels in the Listview // Loop through each lap and pick up all of their values for each data channel - for(vector::iterator a = lstLaps.begin(); a != lstLaps.end(); a++) - { - CExtendedLap* pLap = (CExtendedLap*)*a; + for(vector::iterator a = lstLaps.begin(); a != lstLaps.end(); a++) + { + CExtendedLap* pLap = (CExtendedLap*)*a; // For each lap let's get all of the available data channels for display int TotalYChannels = 0; // Total numbber of Data Channels availalbe for this lap - int iLapId = pLap->GetLap()->GetLapId(); - set channels = pLap->GetAvailableChannels(); // Get all of the data channels for this lap + int iLapId = pLap->GetLap()->GetLapId(); + set channels = pLap->GetAvailableChannels(); // Get all of the data channels for this lap if ( !iTotChannel ) iTotChannel = channels.size(); // Only update the first time through the LV creation loop for(set::const_iterator i = channels.begin(); i != channels.end(); i++) // Loop through them, insert them into our "all data channels" set { @@ -2455,17 +2325,17 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) flVal = pChannel->GetValue(m_mapLapHighlightTimes[pLap]); // The value that we are looking for ////////////////////////////////////////// // Adding transformation functions here for Y - if (m_sfLapOpts.m_PlotPrefs[iChannel].iTransformYesNo == true) - { - if (m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue < 0) - { + if (m_sfLapOpts.m_PlotPrefs[iChannel].iTransformYesNo == true) + { + if (m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue < 0) + { flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; - } - else - { + } + else + { flVal = m_sfLapOpts.m_PlotPrefs[iChannel].fTransAValue + flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransBValue + flVal * flVal * m_sfLapOpts.m_PlotPrefs[iChannel].fTransCValue; - } - } + } + } ////////////////////////////////////////// // Now assign these values to the Data Value variable for display TCHAR szChannelName[MAX_PATH]; @@ -2473,14 +2343,14 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) char szVal[MAX_PATH]; GetChannelValue(eChannel,m_sfLapOpts.eUnitPreference,flVal,szVal,NUMCHARS(szVal)); // Value for data channels - - TCHAR szDate[100]; + + TCHAR szDate[100]; pLap->GetString(szDate, 9); // Truncated timestamp of this lap, to used to name it // Let's load the Listview with this result - TCHAR lstVal[MAX_PATH] ; + TCHAR lstVal[MAX_PATH] ; swprintf(lstVal,NUMCHARS(lstVal), L"%S", szVal); - wchar_t result[MAX_PATH] ; + wchar_t result[MAX_PATH] ; bool b_LV_ChannelFound = false; // ListView boolean for Data Channel searches // First set up the Main listview item (Data Channel Name) for the first lap int i_TextResult = 0; // Data channel matching integer @@ -2523,7 +2393,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) else // Let's match up the Data Channel Name with those in the first lap for displaying in-line { // First let's get the channel name for this data channel - wchar_t result2[MAX_PATH]; + wchar_t result2[MAX_PATH]; p_ADlvi.iItem = iChannel + 1; // The first lap's data channel name p_ADlvi.iSubItem = 0; // The first lap's subscript p_ADlvi.lParam = 0; @@ -2605,8 +2475,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) if (b_LV_ChannelFound ) { // Now populate the listview subitem with the datapoint value, if it's valid - if (iChannel == 0) // Put in Lap Name if it's the first row - { + if (iChannel == 0) // Put in Lap Name if it's the first row + { p_ADlvi.mask = LVIF_TEXT; p_ADlvi.iItem = 0; // Which Data Channel subscript p_ADlvi.iSubItem = iLap + 1; // Which Lap subscript incremented to be positioned correctly @@ -2657,7 +2527,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } // End Test Loop } // End of Dialog present conditional return; - } + } float fAverage(DATA_CHANNEL eChannel, const IDataChannel* pChannel, float flVal) { @@ -2682,8 +2552,8 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) } void UpdateSectors() - { - // Update the Sector Times display + { + // Update the Sector Times display // The idea here is to get the sector positions and iTime from sfLapOpts, then for each highlighted // Lap run through the Ref Lap Time/Distance array and interpolate the iTime at the equivalent distance // Coding is similar to TimeSlip @@ -2693,11 +2563,11 @@ void UpdateSectors() COLORREF d_RedColor = RGB(230, 20, 20); // Red COLORREF d_GreenColor = RGB(20, 230, 20); // Green COLORREF d_LGreyColor = RGB(200, 200, 200); // Light Grey - LVBKIMAGE plvbki={0}; // Set background image to black + LVBKIMAGE plvbki={0}; // Set background image to black if ( m_pReferenceLap != NULL && m_sfLapOpts.fDrawSplitPoints ) // First, let's make sure that we have a Reference Lap, or let's not perform this { - HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window + HC_ShowSplits = GetDlgItem(hWndShowSplits, IDC_SHOW_SECTORS); // Let's get the handle for the display control in this window HDC HC_Rect = GetDC(hWndShowSplits); // HDC for the display control ListView_DeleteAllItems(HC_ShowSplits); // Clear the list before displaying the update const int cSectors = 9; // The maximum number of Sectors to display, gated by display area @@ -2714,35 +2584,35 @@ void UpdateSectors() i_TheoreticalBestLap[a] = 999999.0f; // Initialize the Theorectical Best Lap } int w = 0; // Lap tracker for Sector display - int s = 0; // Sector tracker for Listview - - set setSelected = m_sfLapList.GetSelectedItemsData3(); // Get the list of highlighted lap time ID's - vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list - - // Get the points from the Ref Lap for computation - const vector& lstRefPoints = m_pReferenceLap->GetPoints(); // For iTime - const IDataChannel* pReferenceDistance = m_pReferenceLap->GetChannel(DATA_CHANNEL_DISTANCE); - - // Strings for building the Sector Times output for each lap - TCHAR szLapString[50][512] = {NULL}; - TCHAR szString[50][512] = {NULL}; - TCHAR szSectorTime[MAX_PATH] = {NULL}; // String containing the formatted sector time - float dSectorTime = 0; // Initialize the Sector Times variable + int s = 0; // Sector tracker for Listview + + set setSelected = m_sfLapList.GetSelectedItemsData3(); // Get the list of highlighted lap time ID's + vector lstLaps = GetLapsToShow(); // Load the CExtendedLap data for the lap list + + // Get the points from the Ref Lap for computation + const vector& lstRefPoints = m_pReferenceLap->GetPoints(); // For iTime + const IDataChannel* pReferenceDistance = m_pReferenceLap->GetChannel(DATA_CHANNEL_DISTANCE); + + // Strings for building the Sector Times output for each lap + TCHAR szLapString[50][512] = {NULL}; + TCHAR szString[50][512] = {NULL}; + TCHAR szSectorTime[MAX_PATH] = {NULL}; // String containing the formatted sector time + float dSectorTime = 0; // Initialize the Sector Times variable BOOL b_LineColor = false; // Flag for making alternating rows different colors SendMessage(HC_ShowSplits,LVM_SETBKIMAGE,0,(LPARAM)(LPLVBKIMAGE)&plvbki); // Set background color of LV SendMessage(HC_ShowSplits,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT); // Set style - - // Lap Loop - // Now loop through the lap list, compute the sector times and store them in SplitPoints[] - for(vector::iterator i = lstLaps.begin(); i != lstLaps.end(); i++) - { - CExtendedLap* pLap = *i; // Get the data points for this lap, and compare the sector times to the Reference Lap (m_pReferenceLap) - const vector& lstLapPoints = pLap->GetPoints(); // Get the points from the Selected Lap for computation - pLap->GetString(szLapString[w], NUMCHARS(szLapString)); // Timestamp of this lap, to used to name it - + + // Lap Loop + // Now loop through the lap list, compute the sector times and store them in SplitPoints[] + for(vector::iterator i = lstLaps.begin(); i != lstLaps.end(); i++) + { + CExtendedLap* pLap = *i; // Get the data points for this lap, and compare the sector times to the Reference Lap (m_pReferenceLap) + const vector& lstLapPoints = pLap->GetPoints(); // Get the points from the Selected Lap for computation + pLap->GetString(szLapString[w], NUMCHARS(szLapString)); // Timestamp of this lap, to used to name it + // Let's load the Listview row titles with this result - wchar_t result[MAX_PATH] ; + wchar_t result[MAX_PATH] ; p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; p_ADlvi.iItem = w; // Which Lap subscript p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) @@ -2751,101 +2621,101 @@ void UpdateSectors() p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); ListView_InsertItem(HC_ShowSplits, &p_ADlvi); // Using the lap time stamp/string for its name - - const IDataChannel* pDistance = pLap->GetChannel(DATA_CHANNEL_DISTANCE); - int iLapStartTime = lstLapPoints[0].iTime; - - // Sector Loop - // Now loop through the split points and determine lap times for each sector - for(s = 1; s <= cSectors; s++) - { - const int SectorStartTime = m_sfLapOpts.m_SplitPoints[s].m_sfSectorTime; // Get the Split Point iTime and it's distance value - const double dSectorDistance = pReferenceDistance->GetValue((int)SectorStartTime); // First iTime for the lap array - bool b_SectorFlag = false; - double dLastLapDist = 0; - - // Interpolation Loop - // Now go through the lap array and find the 2 points that span the dSectorDistance distance - for (int x = 1; x < lstLapPoints.size(); x++) - { - const int iElapsedTime = lstLapPoints[x].iTime - iLapStartTime; - const double dDistance = pDistance->GetValue(lstLapPoints[x].iTime); - dLastLapDist = pDistance->GetValue(lstLapPoints[x-1].iTime); - - TimePoint2D pLapPoint = lstLapPoints[x]; - // this lap's time at {dDistance} was {iElapsedTime}. - // we now need to estimate what the lap time at {dDistance} was, and then we can get our sector time - const int cLapSize = lstLapPoints.size(); - if(dDistance >= dSectorDistance && dLastLapDist <= dSectorDistance) - { - // we have found two points straddling the distance we're curious about, dSectorDistance - const double dOffset = dSectorDistance - dLastLapDist; // how far into the {dLastRefDist,dRefDist} x axis we are - const double dWidth = dDistance - dLastLapDist; // how far apart {dLastRefDist,dRefDist} are - double dFraction = 0; - if(dWidth != 0) - { - dFraction = dOffset / dWidth; // the fraction that dDistance is between dLastLapDist and dDistance - if(dFraction >= 0.0 && dFraction <= 1.0) - { - const int iLastTime = lstLapPoints[x-1].iTime; - const int iThisTime = lstLapPoints[x].iTime; - const double dEstimatedElapsedTime = dFraction * (iThisTime - iLastTime) + (double)iLastTime; - // this is the estimated time for the previous lap at this position - if(dEstimatedElapsedTime >= 0) - { - dSectorTime = dEstimatedElapsedTime - (double)iLapStartTime; + + const IDataChannel* pDistance = pLap->GetChannel(DATA_CHANNEL_DISTANCE); + int iLapStartTime = lstLapPoints[0].iTime; + + // Sector Loop + // Now loop through the split points and determine lap times for each sector + for(s = 1; s <= cSectors; s++) + { + const int SectorStartTime = m_sfLapOpts.m_SplitPoints[s].m_sfSectorTime; // Get the Split Point iTime and it's distance value + const double dSectorDistance = pReferenceDistance->GetValue((int)SectorStartTime); // First iTime for the lap array + bool b_SectorFlag = false; + double dLastLapDist = 0; + + // Interpolation Loop + // Now go through the lap array and find the 2 points that span the dSectorDistance distance + for (int x = 1; x < lstLapPoints.size(); x++) + { + const int iElapsedTime = lstLapPoints[x].iTime - iLapStartTime; + const double dDistance = pDistance->GetValue(lstLapPoints[x].iTime); + dLastLapDist = pDistance->GetValue(lstLapPoints[x-1].iTime); + + TimePoint2D pLapPoint = lstLapPoints[x]; + // this lap's time at {dDistance} was {iElapsedTime}. + // we now need to estimate what the lap time at {dDistance} was, and then we can get our sector time + const int cLapSize = lstLapPoints.size(); + if(dDistance >= dSectorDistance && dLastLapDist <= dSectorDistance) + { + // we have found two points straddling the distance we're curious about, dSectorDistance + const double dOffset = dSectorDistance - dLastLapDist; // how far into the {dLastRefDist,dRefDist} x axis we are + const double dWidth = dDistance - dLastLapDist; // how far apart {dLastRefDist,dRefDist} are + double dFraction = 0; + if(dWidth != 0) + { + dFraction = dOffset / dWidth; // the fraction that dDistance is between dLastLapDist and dDistance + if(dFraction >= 0.0 && dFraction <= 1.0) + { + const int iLastTime = lstLapPoints[x-1].iTime; + const int iThisTime = lstLapPoints[x].iTime; + const double dEstimatedElapsedTime = dFraction * (iThisTime - iLastTime) + (double)iLastTime; + // this is the estimated time for the previous lap at this position + if(dEstimatedElapsedTime >= 0) + { + dSectorTime = dEstimatedElapsedTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's put it in the Sector times string - if ( dSectorTime > 1 ) // 1 used for roundoff error - { - swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); - } - else - { - swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); - } - iLapStartTime = dEstimatedElapsedTime; - dLastLapDist = dSectorDistance; - break; - } - } - } - else - { - const int iLastTime = lstLapPoints[x-1].iTime; - dSectorTime = iLastTime - (double)iLapStartTime; + if ( dSectorTime > 1 ) // 1 used for roundoff error + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); + } + else + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); + } + iLapStartTime = dEstimatedElapsedTime; + dLastLapDist = dSectorDistance; + break; + } + } + } + else + { + const int iLastTime = lstLapPoints[x-1].iTime; + dSectorTime = iLastTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's put it in the Sector times string - if ( dSectorTime > 1 ) // 1 used for roundoff error - { - swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); - } - else - { - swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); - } - iLapStartTime = iLastTime; - dLastLapDist = dSectorDistance; - break; - } - } - if (x == lstLapPoints.size()-1) - { - // We've reached the end of the loop. Dump the last point as the last sector time, if other conditions failed - const int iLastTime = lstLapPoints[lstLapPoints.size()-1].iTime; - dSectorTime = iLastTime - (double)iLapStartTime; + if ( dSectorTime > 1 ) // 1 used for roundoff error + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); + } + else + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); + } + iLapStartTime = iLastTime; + dLastLapDist = dSectorDistance; + break; + } + } + if (x == lstLapPoints.size()-1) + { + // We've reached the end of the loop. Dump the last point as the last sector time, if other conditions failed + const int iLastTime = lstLapPoints[lstLapPoints.size()-1].iTime; + dSectorTime = iLastTime - (double)iLapStartTime; // Now that we have computed the Sector Time, let's put it in the Sector times string - if ( dSectorTime > 1 ) // 1 used for roundoff error - { - swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); - } - else - { - swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); - } - iLapStartTime = iLastTime; - dLastLapDist = dSectorDistance; - break; - } - } // End Interpolation Loop + if ( dSectorTime > 1 ) // 1 used for roundoff error + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"%4.2f", dSectorTime/1000); + } + else + { + swprintf(szSectorTime, NUMCHARS(szSectorTime), L"", NULL); + } + iLapStartTime = iLastTime; + dLastLapDist = dSectorDistance; + break; + } + } // End Interpolation Loop // Insert the item into the Listview p_ADlvi.mask = LVIF_TEXT; @@ -2863,19 +2733,19 @@ void UpdateSectors() i_TheoreticalBestLap[s] = dSectorTime; } - } // End Sector Loop - w++; // Increment "w" counter and do the next lap - if (w >= MaxLaps) break; // Stop building these if we already have as many as we need. + } // End Sector Loop + w++; // Increment "w" counter and do the next lap + if (w >= MaxLaps) break; // Stop building these if we already have as many as we need. } // Lap Loop end // Now let's load the Listview with the Best Theorectical Lap information - float f_TheoreticalBestLap = 0.0f; - for (int t = 1; t <= cSectors; t++) - { - f_TheoreticalBestLap = f_TheoreticalBestLap + i_TheoreticalBestLap[t]; - } - TCHAR szLap[MAX_PATH]; - wchar_t result[MAX_PATH] ; + float f_TheoreticalBestLap = 0.0f; + for (int t = 1; t <= cSectors; t++) + { + f_TheoreticalBestLap = f_TheoreticalBestLap + i_TheoreticalBestLap[t]; + } + TCHAR szLap[MAX_PATH]; + wchar_t result[MAX_PATH] ; p_ADlvi.mask = LVIF_TEXT | LVIF_PARAM; p_ADlvi.iItem = w; // Which Lap subscript p_ADlvi.iSubItem = 0; // Which Sector subscript (0 = Lap Name string) @@ -2893,24 +2763,24 @@ void UpdateSectors() p_ADlvi.iItem = w; // Which Lap subscript p_ADlvi.iSubItem = c; // Which Sector subscript incremented to be positioned correctly p_ADlvi.lParam = c; - if ( i_TheoreticalBestLap[c] > 1 ) // 1 used for roundoff error - { - swprintf( result,NUMCHARS(result), L"%4.2f", i_TheoreticalBestLap[c] / 1000 ); - } - else - { - swprintf( result,NUMCHARS(result), L"", NULL); - } + if ( i_TheoreticalBestLap[c] > 1 ) // 1 used for roundoff error + { + swprintf( result,NUMCHARS(result), L"%4.2f", i_TheoreticalBestLap[c] / 1000 ); + } + else + { + swprintf( result,NUMCHARS(result), L"", NULL); + } p_ADlvi.pszText = result; p_ADlvi.cchTextMax = wcslen(result); ListView_SetItem(HC_ShowSplits, &p_ADlvi); } } } - - void UpdateValues() - { - // Update the data channels that are being displayed as values + + void UpdateValues() + { + // Update the data channels that are being displayed as values // List of highlighted laps set setSelectedData = m_sfLapList.GetSelectedItemsData3(); if(setSelectedData.size() > 0) @@ -2958,23 +2828,23 @@ void UpdateSectors() // See if the Minimum or Maximum are outside of the PlotPrefs setpoints ////////////////////////////////////////// // Adding transformation functions here for Y - if (m_sfLapOpts.m_PlotPrefs[u].iTransformYesNo == true) - { - if (m_sfLapOpts.m_PlotPrefs[u].fTransBValue < 0) - { + if (m_sfLapOpts.m_PlotPrefs[u].iTransformYesNo == true) + { + if (m_sfLapOpts.m_PlotPrefs[u].fTransBValue < 0) + { flAvg = m_sfLapOpts.m_PlotPrefs[u].fTransAValue + flAvg * m_sfLapOpts.m_PlotPrefs[u].fTransBValue + flAvg * flAvg * m_sfLapOpts.m_PlotPrefs[u].fTransCValue; flMaxTemp = m_sfLapOpts.m_PlotPrefs[u].fTransAValue + flMin * m_sfLapOpts.m_PlotPrefs[u].fTransBValue + flMin * flMin * m_sfLapOpts.m_PlotPrefs[u].fTransCValue; flMinTemp = m_sfLapOpts.m_PlotPrefs[u].fTransAValue + flMax * m_sfLapOpts.m_PlotPrefs[u].fTransBValue + flMax * flMax * m_sfLapOpts.m_PlotPrefs[u].fTransCValue; - } - else - { + } + else + { flAvg = m_sfLapOpts.m_PlotPrefs[u].fTransAValue + flAvg * m_sfLapOpts.m_PlotPrefs[u].fTransBValue + flAvg * flAvg * m_sfLapOpts.m_PlotPrefs[u].fTransCValue; flMinTemp = m_sfLapOpts.m_PlotPrefs[u].fTransAValue + flMin * m_sfLapOpts.m_PlotPrefs[u].fTransBValue + flMin * flMin * m_sfLapOpts.m_PlotPrefs[u].fTransCValue; flMaxTemp = m_sfLapOpts.m_PlotPrefs[u].fTransAValue + flMax * m_sfLapOpts.m_PlotPrefs[u].fTransBValue + flMax * flMax * m_sfLapOpts.m_PlotPrefs[u].fTransCValue; - } - flMin = flMinTemp; - flMax = flMaxTemp; - } + } + flMin = flMinTemp; + flMax = flMaxTemp; + } ////////////////////////////////////////// if (flMax > m_sfLapOpts.m_PlotPrefs[u].fMaxValue) { @@ -3081,59 +2951,59 @@ void UpdateSectors() } if (m_Warning) // Pop up dialog saying the alarm has been triggered { - static bool fWarnedOnce; // Prevent multiple windows from appearing - if(!fWarnedOnce) - { - // Display a warning dialog box about an alarm being triggered. - fWarnedOnce = true; - WARNING_RESULT sfResult; - CWarningDlg dlgWarning(&sfResult, m_szYString); - ArtShowDialog(&dlgWarning); - fWarnedOnce = false; - } + static bool fWarnedOnce; // Prevent multiple windows from appearing + if(!fWarnedOnce) + { + // Display a warning dialog box about an alarm being triggered. + fWarnedOnce = true; + WARNING_RESULT sfResult; + CWarningDlg dlgWarning(&sfResult, m_szYString); + ArtShowDialog(&dlgWarning); + fWarnedOnce = false; + } } } - } -void UpdateDisplays() - { - m_sfLapPainter.Refresh(); - m_sfSubDisplay.Refresh(); + } +void UpdateDisplays() + { + m_sfLapPainter.Refresh(); + m_sfSubDisplay.Refresh(); if (m_sfLapOpts.bTractionCircle) { - m_sfTractionDisplay.Refresh(); - } - } - void CheckMenuHelper(HMENU hMainMenu, int id, bool fChecked) - { - DWORD dwFlags = fChecked ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED); - DWORD dwRet = CheckMenuItem(hMainMenu, id, dwFlags); - DASSERT(dwRet != -1); - } - void UpdateMenus() - { - HMENU hWndMenu = GetMenu(m_hWnd); - HMENU hSubMenu = GetSubMenu(hWndMenu, 2); // Graphing... menu - HMENU hSubMenu2 = GetSubMenu(hWndMenu, 3); // Phone Orientation... menu - - CheckMenuHelper(hSubMenu, ID_OPTIONS_KMH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_KMH); - CheckMenuHelper(hSubMenu, ID_OPTIONS_MPH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MPH); - CheckMenuHelper(hSubMenu, ID_OPTIONS_MS, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MS); - CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_KM, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_KM); - CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_LAT, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_LAT); - CheckMenuHelper(hSubMenu, ID_OPTIONS_TRACTIONCIRCLE, m_sfLapOpts.bTractionCircle); - CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWBESTS, m_fShowBests); - CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWDRIVERBESTS, m_fShowDriverBests); - CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWREFERENCELAP, m_fShowReferenceLap); - CheckMenuHelper(hSubMenu, ID_OPTIONS_DRAWLINES, m_sfLapOpts.fDrawLines); - CheckMenuHelper(hSubMenu, ID_OPTIONS_SMOOTH, m_sfLapOpts.bSmoothYesNo); - CheckMenuHelper(hSubMenu, ID_OPTIONS_BACKGROUND, m_sfLapOpts.fColorScheme); - CheckMenuHelper(hSubMenu, ID_OPTIONS_IOIO5VSCALE, m_sfLapOpts.fIOIOHardcoded); - CheckMenuHelper(hSubMenu, ID_OPTIONS_ELAPSEDTIME, m_sfLapOpts.fElapsedTime); - CheckMenuHelper(hSubMenu2, ID_OPTIONS_VERTICAL_LANDSCAPE, m_sfLapOpts.e_Orientation == VERTICAL_LANDSCAPE); - CheckMenuHelper(hSubMenu2, ID_OPTIONS_VERTICAL_PORTRAIT, m_sfLapOpts.e_Orientation == VERTICAL_PORTRAIT); - CheckMenuHelper(hSubMenu2, ID_OPTIONS_FLAT_LANDSCAPE, m_sfLapOpts.e_Orientation == FLAT_LANDSCAPE); - CheckMenuHelper(hSubMenu2, ID_OPTIONS_FLAT_PORTRAIT, m_sfLapOpts.e_Orientation == FLAT_PORTRAIT); - } + m_sfTractionDisplay.Refresh(); + } + } + void CheckMenuHelper(HMENU hMainMenu, int id, bool fChecked) + { + DWORD dwFlags = fChecked ? (MF_BYCOMMAND | MF_CHECKED) : (MF_BYCOMMAND | MF_UNCHECKED); + DWORD dwRet = CheckMenuItem(hMainMenu, id, dwFlags); + DASSERT(dwRet != -1); + } + void UpdateMenus() + { + HMENU hWndMenu = GetMenu(m_hWnd); + HMENU hSubMenu = GetSubMenu(hWndMenu, 2); // Graphing... menu + HMENU hSubMenu2 = GetSubMenu(hWndMenu, 3); // Phone Orientation... menu + + CheckMenuHelper(hSubMenu, ID_OPTIONS_KMH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_KMH); + CheckMenuHelper(hSubMenu, ID_OPTIONS_MPH, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MPH); + CheckMenuHelper(hSubMenu, ID_OPTIONS_MS, m_sfLapOpts.eUnitPreference == UNIT_PREFERENCE_MS); + CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_KM, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_KM); + CheckMenuHelper(hSubMenu, ID_OPTIONS_XAXIS_LAT, m_sfLapOpts.bXAxis_KM == XAXIS_PREFERENCE_LAT); + CheckMenuHelper(hSubMenu, ID_OPTIONS_TRACTIONCIRCLE, m_sfLapOpts.bTractionCircle); + CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWBESTS, m_fShowBests); + CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWDRIVERBESTS, m_fShowDriverBests); + CheckMenuHelper(hSubMenu, ID_OPTIONS_SHOWREFERENCELAP, m_fShowReferenceLap); + CheckMenuHelper(hSubMenu, ID_OPTIONS_DRAWLINES, m_sfLapOpts.fDrawLines); + CheckMenuHelper(hSubMenu, ID_OPTIONS_SMOOTH, m_sfLapOpts.bSmoothYesNo); + CheckMenuHelper(hSubMenu, ID_OPTIONS_BACKGROUND, m_sfLapOpts.fColorScheme); + CheckMenuHelper(hSubMenu, ID_OPTIONS_IOIO5VSCALE, m_sfLapOpts.fIOIOHardcoded); + CheckMenuHelper(hSubMenu, ID_OPTIONS_ELAPSEDTIME, m_sfLapOpts.fElapsedTime); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_VERTICAL_LANDSCAPE, m_sfLapOpts.e_Orientation == VERTICAL_LANDSCAPE); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_VERTICAL_PORTRAIT, m_sfLapOpts.e_Orientation == VERTICAL_PORTRAIT); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_FLAT_LANDSCAPE, m_sfLapOpts.e_Orientation == FLAT_LANDSCAPE); + CheckMenuHelper(hSubMenu2, ID_OPTIONS_FLAT_PORTRAIT, m_sfLapOpts.e_Orientation == FLAT_PORTRAIT); + } vector GetSortedLaps(LAPSORTSTYLE eSortStyle) { @@ -3152,680 +3022,680 @@ void UpdateDisplays() break; } return lstLaps; - } - - void LoadLaps(ILapReceiver* pReceiver) - { - int z_iRaceId = 0; - for (int z = 0; z < 50; z++) - { - if (m_iRaceId[z] <= 0) break; // Only load the valid Race Id's - z_iRaceId = m_iRaceId[z]; - vector laps = pReceiver->GetLaps(z_iRaceId); - for(int x = 0;x < laps.size(); x++) - { - const ILap* pLap = laps[x]; - // let's see if we already have this lap - if(m_mapLaps.count(pLap->GetLapId()) != 0) - { - // we've already got this lap. THere is nothing to be added from this lap - ((ILap*)pLap)->Free(); - laps[x] = NULL; - } - else - { - // we don't have this lap yet, so let's put it in - CExtendedLap* pNewLap = new CExtendedLap(pLap, m_pReferenceLap, pReceiver, true); - if(m_pReferenceLap == NULL) // If there is no reference lap currently - { - m_pReferenceLap = pNewLap; // by default, make the first lap received the reference lap - } - if(pLap->GetComment().size() <= 0) - { - pLap->SetComment(m_szCommentText); - } - m_mapLaps[pLap->GetLapId()] = pNewLap; - } - } - } - } - - void ApplyDriverNameToSelectedLaps(ILapReceiver* pLapDB) - { - set setSelectedData = m_sfLapList.GetSelectedItemsData3(); - for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) - { - // the ints of this set are actually pointers to CExtendedLap objects - CExtendedLap* pLap = (CExtendedLap*)(*i); - pLap->GetLap()->SetComment(m_szCommentText); - } - } - - virtual void SetLapHighlightTime(const CExtendedLap* pLap, int iTimeMs) override - { - m_mapLapHighlightTimes[pLap] = iTimeMs; - } - virtual int GetLapHighlightTime(const CExtendedLap* pLap) const override - { - DASSERT(m_mapLapHighlightTimes.find(pLap) != m_mapLapHighlightTimes.end()); // this should have always ended up set from the "master" highlighter. This function is only called by "slave" highlight-users - return m_mapLapHighlightTimes.find(pLap)->second; - } - virtual bool IsHighlightSource(int iSupplierId) const override - { - switch(iSupplierId) - { - case SUPPLIERID_MAINDISPLAY: - return true; // main display is always the driver of highlight data - case SUPPLIERID_SUBDISPLAY: - return false; - case SUPPLIERID_SECTORDISPLAY: - return true; // Allow the Set Split Sectors to be highlight source - case SUPPLIERID_TRACTIONCIRCLEDISPLAY: - case SUPPLIERID_ALLDATADISPLAY: - return false; // main display is always the driver of highlight data - default: - DASSERT(FALSE); - return false; - } - } - - virtual vector GetAllLaps() const override - { - set setSelectedLaps = m_sfLapList.GetSelectedItemsData3(); - vector lstLaps; - for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) - { - CExtendedLap* pLap = i->second; - lstLaps.push_back(pLap); - } - - return lstLaps; - } - virtual vector GetLapsToShow() const override - { - set setSelectedLaps = m_sfLapList.GetSelectedItemsData3(); - vector lstLaps; - map mapFastestDriver; - CExtendedLap* pFastest = NULL; - CExtendedLap* pReference = NULL; // Added to show Reference Lap - KDJ - for(set::iterator i = setSelectedLaps.begin(); i != setSelectedLaps.end(); i++) - { - CExtendedLap* pLap = (CExtendedLap*)*i; - - lstLaps.push_back(pLap); - } - - for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) - { - CExtendedLap* pLap = i->second; - if(m_fShowDriverBests && (mapFastestDriver.count(pLap->GetLap()->GetComment()) == 0 || pLap->GetLap()->GetTime() < mapFastestDriver[pLap->GetLap()->GetComment()]->GetLap()->GetTime())) - { - mapFastestDriver[pLap->GetLap()->GetComment()] = pLap; - } - if(m_fShowBests) - { - if(pFastest == NULL || pLap->GetLap()->GetTime() < pFastest->GetLap()->GetTime()) - { - pFastest = pLap; - } - } - } - - if(m_fShowBests && pFastest) - { - lstLaps.push_back(pFastest); - } - for(map::iterator i = mapFastestDriver.begin(); i != mapFastestDriver.end(); i++) - { - lstLaps.push_back(i->second); - } - - // Set up for showing Reference lap similar to how we show Fastest Lap. - if(m_fShowReferenceLap && m_pReferenceLap != NULL) - { - lstLaps.push_back(m_pReferenceLap); - } -/* else - { - lstLaps.push_back(m_pReferenceLap); // Push the reference lap anyway, so that we can get the lap Split Points - } -*/ - - return lstLaps; - } - virtual FLOATRECT GetAllLapsBounds() const override - { - FLOATRECT rc; - rc.left = 1e30; - rc.top = -1e30; - rc.bottom = 1e30; - rc.right = -1e30; - - // changed this so it returns the bounds of the reference lap. This way, data-viewing isn't ruined by errant points - // it used to be based on all the laps, but if you had just one messed-up lap it would make viewing pointless - if(m_pReferenceLap != NULL) - { - const vector& lstPoints = m_pReferenceLap->GetPoints(); - for(int x = 0; x< lstPoints.size(); x++) - { - const TimePoint2D& p = lstPoints[x]; - rc.left = min(rc.left,p.flX); - rc.top = max(rc.top,p.flY); - rc.bottom = min(rc.bottom,p.flY); - rc.right = max(rc.right,p.flX); - } - - rc.left += m_flShiftX; - rc.top += m_flShiftY; - rc.right += m_flShiftX; - rc.bottom += m_flShiftY; - } - return rc; - } - virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const override - { - switch(iSupplierId) - { - case SUPPLIERID_MAINDISPLAY: - { - vector lstLaps = GetLapsToShow(); - if(lstLaps.size() <= 0) return LAPDISPLAYSTYLE_NOLAPS; - return m_eLapDisplayStyle; - } - case SUPPLIERID_SUBDISPLAY: - switch(m_eLapDisplayStyle) - { - case LAPDISPLAYSTYLE_MAP: return LAPDISPLAYSTYLE_PLOT; - default: return LAPDISPLAYSTYLE_MAP; - } - case SUPPLIERID_TRACTIONCIRCLEDISPLAY: - { - return LAPDISPLAYSTYLE_TRACTIONCIRCLE; - } - case SUPPLIERID_ALLDATADISPLAY: - { - return LAPDISPLAYSTYLE_ALLDATADISPLAY; - } - case SUPPLIERID_SECTORDISPLAY: - { - return LAPDISPLAYSTYLE_MAP; - } - default: - DASSERT(FALSE); - break; - } - return m_eLapDisplayStyle; - } - virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const override - { - if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || - eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || - eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) - { - return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; - } - return 1e30; - } - virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const override - { - if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || - eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || - eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) - { - return m_sfLapOpts.fIOIOHardcoded ? 5 : -1e30; - } - return -1e30; - } - - virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) override - { - CASSERT(DATA_CHANNEL_COUNT == 0x601); - - switch(eChannel) - { - case DATA_CHANNEL_X: return 1e30; - case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude - case DATA_CHANNEL_VELOCITY: - case DATA_CHANNEL_VELOCITYDELTA: - { - int iMin = (int)(flMin); - return (float)(iMin); - } - case DATA_CHANNEL_DISTANCE: - { - int iMin = (int)(flMin); - return (float)(iMin); - } - case DATA_CHANNEL_TIME: - case DATA_CHANNEL_ELAPSEDTIME: - case DATA_CHANNEL_TIMESLIP: - case DATA_CHANNEL_LAPTIME_SUMMARY: - { - int iMin = (int)(flMin/1000.0f); - return (float)(iMin)*1000.0f; - } - case DATA_CHANNEL_X_ACCEL: - case DATA_CHANNEL_Y_ACCEL: - case DATA_CHANNEL_Z_ACCEL: - { - int iMin = (int)(flMin); - return (float)(iMin); - } - case DATA_CHANNEL_TEMP: return 0; - case (DATA_CHANNEL_PID_START+0x5): return -40; - case (DATA_CHANNEL_PID_START+0xc): return 0; - case (DATA_CHANNEL_PID_START+0xA): return 0; - case (DATA_CHANNEL_PID_START+0x5c): return -40; - default: - if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || - eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || - eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) - { - return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; - } - return 1e30; - } - } - - virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) override - { - CASSERT(DATA_CHANNEL_COUNT == 0x601); - - switch(eChannel) - { - case DATA_CHANNEL_X: return 1e30; - case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude - case DATA_CHANNEL_VELOCITY: return 0; - case DATA_CHANNEL_DISTANCE: return 1e30; - case DATA_CHANNEL_TIME: - case DATA_CHANNEL_ELAPSEDTIME: - case DATA_CHANNEL_TIMESLIP: - { - int iMin = (int)(flMin/1000.0f); - return (float)(iMin)*1000.0f; - } - case DATA_CHANNEL_STRENGTH: return 0.0f; - case DATA_CHANNEL_LAPTIME_SUMMARY: - case DATA_CHANNEL_X_ACCEL: - case DATA_CHANNEL_Y_ACCEL: - case DATA_CHANNEL_Z_ACCEL: - { - int iMin = (int)(flMin); - return (float)(iMin); - } - case DATA_CHANNEL_VELOCITYDELTA: - { - int iMin = (int)(flMin); - return (float)(iMin); - } - case DATA_CHANNEL_TEMP: return 0; - - default: - if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || - eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || - eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) - { - return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; - } - else if(eChannel >= DATA_CHANNEL_PID_START && eChannel < DATA_CHANNEL_PID_END) - { - int iMin = (int)(flMin); - return (float)(iMin); - } - return 1e30; - } - } - - virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) override - { - // Function sets up the spacing for the vertical guidelines on the data plots - CASSERT(DATA_CHANNEL_COUNT == 0x601); - const float flSpread = flMax - flMin; - switch(eChannel) - { - case DATA_CHANNEL_X: return 1e30; - case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude - case DATA_CHANNEL_VELOCITY: // We need to fix the X-channel call before putting these back into the code. - case DATA_CHANNEL_VELOCITYDELTA: - { - switch(m_sfLapOpts.eUnitPreference) - { - case UNIT_PREFERENCE_KMH: return KMH_TO_MS(25.0); - case UNIT_PREFERENCE_MPH: return MPH_TO_MS(20.0); // Adjusted by KDJ - case UNIT_PREFERENCE_MS: return 5; - } - return 10.0; - } - case DATA_CHANNEL_DISTANCE: - { - if(flSpread < 0.001) return 0.0001f; - if(flSpread < 0.005) return 0.0005f; - if(flSpread < 0.010) return 0.0010f; - if(flSpread < 0.050) return 0.0050f; - if(flSpread < 1.000) return 0.1000f; - if(flSpread < 10.00) return 1.0000f; - if(flSpread < 500) return 50.0f; - if(flSpread < 1000) return 100.0f; - if(flSpread < 5000) return 500.0f; - if(flSpread < 10000) return 1000.0f; - if(flSpread < 50000) return 2500.0f; - if(flSpread < 110000) return 5000.0f; - if(flSpread < 1100000) return 10000.0f; - if(flSpread < 10000000) return 100000.0f; - return 10000000; - } - - case DATA_CHANNEL_TIME: - case DATA_CHANNEL_ELAPSEDTIME: - { - if(flSpread < 1000) return 50.0f; - if(flSpread < 5000) return 100.0f; - if(flSpread < 10000) return 500.0f; - if(flSpread < 50000) return 2500.0f; - if(flSpread < 110000) return 5000.0f; - if(flSpread < 1100000) return 10000.0f; - if(flSpread < 10000000) return 100000.0f; - if(flSpread < 100000000) return 1000000.0f; - return 10000000.0f; - } - case DATA_CHANNEL_LAPTIME_SUMMARY: - { - if(flSpread < 1) return 0.50f; - if(flSpread < 5) return 1.0f; - if(flSpread < 10) return 5.0f; - if(flSpread < 50) return 25.0f; - if(flSpread < 110) return 50.0f; - if(flSpread < 1100) return 100.0f; - if(flSpread < 10000) return 1000.0f; - if(flSpread < 50000) return 2500.0f; - if(flSpread < 110000) return 5000.0f; - if(flSpread < 1100000) return 10000.0f; - if(flSpread < 10000000) return 100000.0f; - if(flSpread < 100000000) return 1000000.0f; - return 10000000.0f; - } - default: - return 1e30; - } - } - - virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) override - { - CASSERT(DATA_CHANNEL_COUNT == 0x601); - const float flSpread = flMax - flMin; - switch(eChannel) - { - case DATA_CHANNEL_X: return 1e30; - case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude - case DATA_CHANNEL_VELOCITY: - { - switch(m_sfLapOpts.eUnitPreference) - { - case UNIT_PREFERENCE_KMH: return KMH_TO_MS(25.0); - case UNIT_PREFERENCE_MPH: return MPH_TO_MS(20.0); // Adjusted by KDJ - case UNIT_PREFERENCE_MS: return 5; - } - return 10.0; - } - case DATA_CHANNEL_VELOCITYDELTA: - { - if(flSpread < 1) return 0.5f; - if(flSpread < 5) return 1.0f; - if(flSpread < 10) return 2.0f; - if(flSpread < 20) return 5.0f; - if(flSpread < 40) return 10.0f; - if(flSpread < 60) return 15.0f; - if(flSpread < 100) return 20.0f; - return 2.0; - } - case DATA_CHANNEL_DISTANCE: - { - if(flSpread < 0.001) return 0.0001f; - if(flSpread < 0.005) return 0.0005f; - if(flSpread < 0.010) return 0.0010f; - if(flSpread < 0.050) return 0.0050f; - if(flSpread < 1.000) return 0.1000f; - if(flSpread < 10.00) return 1.0000f; - if(flSpread < 1000) return 100.0f; - if(flSpread < 5000) return 500.0f; - if(flSpread < 10000) return 1000.0f; - if(flSpread < 50000) return 5000.0f; - if(flSpread < 110000) return 10000.0f; - if(flSpread < 1100000) return 100000.0f; - if(flSpread < 10000000) return 1000000.0f; - return 10000000; - } - - case DATA_CHANNEL_TIME: return 1e30; // No guidelines for Y-axis - case DATA_CHANNEL_TIMESLIP: - case DATA_CHANNEL_ELAPSEDTIME: - { - if(flSpread < 10) return 1.0f; - if(flSpread < 100) return 10.0f; - if(flSpread < 1000) return 100.0f; - if(flSpread < 5000) return 500.0f; - if(flSpread < 10000) return 1000.0f; - if(flSpread < 50000) return 5000.0f; - if(flSpread < 110000) return 10000.0f; - if(flSpread < 1100000) return 100000.0f; - if(flSpread < 10000000) return 1000000.0f; - return 10000000.0f; - } - case DATA_CHANNEL_LAPTIME_SUMMARY: - { - if(flSpread < 5) return 0.5f; - if(flSpread < 10) return 1.0f; - if(flSpread < 50) return 5.0f; - if(flSpread < 100) return 10.0f; - if(flSpread < 1100) return 100.0f; - if(flSpread < 10000) return 1000.0f; - if(flSpread < 50000) return 5000.0f; - if(flSpread < 110000) return 10000.0f; - if(flSpread < 1100000) return 100000.0f; - if(flSpread < 10000000) return 1000000.0f; - return 10000000.0f; - } - case DATA_CHANNEL_X_ACCEL: return 0.5f; - case DATA_CHANNEL_Y_ACCEL: return 0.5f; - case DATA_CHANNEL_Z_ACCEL: return 0.5f; - case DATA_CHANNEL_TEMP: return 10.0f; - case DATA_CHANNEL_STRENGTH: return 1.0f; - - default: - if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || - eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || - eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || - eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) - { - if(flSpread < 1) return m_sfLapOpts.fIOIOHardcoded ? 0.1f : 1e30; - if(flSpread < 10) return m_sfLapOpts.fIOIOHardcoded ? 1.0f : 1e30; - if(flSpread < 25) return m_sfLapOpts.fIOIOHardcoded ? 2.5f : 1e30; - if(flSpread < 50) return m_sfLapOpts.fIOIOHardcoded ? 5.0f : 1e30; - if(flSpread < 150) return m_sfLapOpts.fIOIOHardcoded ? 20.0f : 1e30; - if(flSpread < 500) return m_sfLapOpts.fIOIOHardcoded ? 50.0f : 1e30; - if(flSpread < 10000) return m_sfLapOpts.fIOIOHardcoded ? 1000.0f : 1e30; - if(flSpread < 100000) return m_sfLapOpts.fIOIOHardcoded ? 5000.0f : 1e30; - if(flSpread < 1000000) return m_sfLapOpts.fIOIOHardcoded ? 50000.0f : 1e30; - return m_sfLapOpts.fIOIOHardcoded ? 1.0f : 1e30; // Original code, and default for non-transformed IOIO data - } - else if(eChannel >= DATA_CHANNEL_PID_START && eChannel < DATA_CHANNEL_PID_END) - { - if(flSpread < 1) return 0.1f; - if(flSpread < 10) return 1.0f; - if(flSpread < 25) return 2.5f; - if(flSpread < 50) return 5.0f; - if(flSpread < 150) return 20.0f; - if(flSpread < 500) return 50.0f; - if(flSpread < 10000) return 1000.0f; - if(flSpread < 100000) return 5000.0f; - if(flSpread < 1000000) return 50000.0f; - return 1e30; - } - return 1e30; - } - } - virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const override - { - return m_sfLapOpts; - } - virtual DATA_CHANNEL GetXChannel() const override - { - return m_eXChannel; - } - virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const override - { - return g_pLapDB->GetDataChannel(iLapId, eChannel); - } - virtual vector GetYChannels() const override - { - return m_lstYChannels; - } - virtual void GetResponse(const char* pbData, int cbData, char** ppbResponse, int* pcbResponse) - { - - } - void SetupMulticast() - { - IP_ADAPTER_INFO sfAdapter[255] = {0}; - ULONG cbAdapter = sizeof(sfAdapter); - ULONG ret = GetAdaptersInfo(sfAdapter, &cbAdapter); - int cConnected = 0; - if(ret == NO_ERROR) - { - IP_ADAPTER_INFO* pInfo = &sfAdapter[0]; - while(pInfo) - { - if(strcmp(pInfo->IpAddressList.IpAddress.String, "0.0.0.0") != 0) - { - // found an adapter. That means we need a multicast checker - MulticastListener* pListener = new MulticastListener(&m_sfResponder, pInfo->IpAddressList.IpAddress.String); - if(pListener->Start()) - { - m_lstMulticast.push_back(pListener); - } - else - { - delete pListener; - } - } - - pInfo = pInfo->Next; - } - } - } -public: - vector m_lstYChannels; - DATA_CHANNEL m_eXChannel; // Made public by KDJ - ArtListBox m_sfYAxis; - CExtendedLap* m_pReferenceLap; - ArtListBox m_sfLapList; - ArtListBox m_sfListBox; - int m_iRaceId[50]; // Made public by KDJ -private: - ArtListBox m_sfXAxis; - - CLapPainter m_sfLapPainter; -// CLapPainter m_sfSubWindow; - CLapPainter m_sfSubDisplay; - CLapPainter m_sfTractionDisplay; - - // lap display style data - map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls - - LAPDISPLAYSTYLE m_eLapDisplayStyle; -// DATA_CHANNEL m_eXChannel; -// vector m_lstYChannels; - bool m_fShowTractionCircle; - bool m_fSmooth; - bool m_fShowBests; - bool m_fShowDriverBests; - bool m_fShowReferenceLap; - -// CExtendedLap* m_pReferenceLap; // Made public by KDJ - map m_mapLaps; // maps from iLapId to a lap object - HWND m_hWnd; - - map m_baseWindowPos; - - TCHAR m_szCommentText[512]; - TCHAR m_szMessageStatus[512]; - - // what updates are needed. When we call UpdateUI, it will |= the requested flags onto this, and then do a PostMessage with a custom UPDATEUI message - // when the UPDATEUI message is received, it will do an UpdateUI_Internal call using all the flags that have been built up, and clear the ones it handled. - DWORD m_fdwUpdateNeeded; - - // panning/zooming - float m_flShiftX; - float m_flShiftY; - - // multicast responses for each network device detected - vector m_lstMulticast; - MCResponder m_sfResponder; - -// int m_iRaceId[50]; - ILapSupplier* z_ILapSupplier; -}; - -DWORD ReceiveThreadProc(LPVOID param) -{ - ILapReceiver* pLaps = (ILapReceiver*)param; - while(true) - { - ReceiveLaps(63939, pLaps); - } - return 0; -} - -int str_ends_with(const TCHAR * str, const TCHAR * suffix) -{ - if( str == NULL || suffix == NULL ) - return 0; - - size_t str_len = wcslen(str); - size_t suffix_len = wcslen(suffix); - - if(suffix_len > str_len) - return 0; - - return 0 == wcsncmp( str + str_len - suffix_len, suffix, suffix_len ); -} - -void LoadPitsideSettings(PITSIDE_SETTINGS* pSettings) -{ - pSettings->Default(); - - TCHAR szModule[MAX_PATH]; - if(GetAppFolder(szModule,NUMCHARS(szModule))) - { - wcsncat(szModule,L"settings.txt", NUMCHARS(szModule)); - - ifstream in; - in.open(szModule); - if(!in.eof() && !in.fail()) - { - in>>pSettings->fRunHTTP; - in>>pSettings->iHTTPPort; - in>>pSettings->iVelocity; - in>>pSettings->iMapLines; - in>>pSettings->iColorScheme; - in>>pSettings->bSmoothYesNo; - in>>pSettings->bXAxis_KM; - in.close(); - } - } - else - { - // trouble. just bail. - return; - } -} - -void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) - { + } + + void LoadLaps(ILapReceiver* pReceiver) + { + int z_iRaceId = 0; + for (int z = 0; z < 50; z++) + { + if (m_iRaceId[z] <= 0) break; // Only load the valid Race Id's + z_iRaceId = m_iRaceId[z]; + vector laps = pReceiver->GetLaps(z_iRaceId); + for(int x = 0;x < laps.size(); x++) + { + const ILap* pLap = laps[x]; + // let's see if we already have this lap + if(m_mapLaps.count(pLap->GetLapId()) != 0) + { + // we've already got this lap. THere is nothing to be added from this lap + ((ILap*)pLap)->Free(); + laps[x] = NULL; + } + else + { + // we don't have this lap yet, so let's put it in + CExtendedLap* pNewLap = new CExtendedLap(pLap, m_pReferenceLap, pReceiver, true); + if(m_pReferenceLap == NULL) // If there is no reference lap currently + { + m_pReferenceLap = pNewLap; // by default, make the first lap received the reference lap + } + if(pLap->GetComment().size() <= 0) + { + pLap->SetComment(m_szCommentText); + } + m_mapLaps[pLap->GetLapId()] = pNewLap; + } + } + } + } + + void ApplyDriverNameToSelectedLaps(ILapReceiver* pLapDB) + { + set setSelectedData = m_sfLapList.GetSelectedItemsData3(); + for(set::iterator i = setSelectedData.begin(); i != setSelectedData.end(); i++) + { + // the ints of this set are actually pointers to CExtendedLap objects + CExtendedLap* pLap = (CExtendedLap*)(*i); + pLap->GetLap()->SetComment(m_szCommentText); + } + } + + virtual void SetLapHighlightTime(const CExtendedLap* pLap, int iTimeMs) override + { + m_mapLapHighlightTimes[pLap] = iTimeMs; + } + virtual int GetLapHighlightTime(const CExtendedLap* pLap) const override + { + DASSERT(m_mapLapHighlightTimes.find(pLap) != m_mapLapHighlightTimes.end()); // this should have always ended up set from the "master" highlighter. This function is only called by "slave" highlight-users + return m_mapLapHighlightTimes.find(pLap)->second; + } + virtual bool IsHighlightSource(int iSupplierId) const override + { + switch(iSupplierId) + { + case SUPPLIERID_MAINDISPLAY: + return true; // main display is always the driver of highlight data + case SUPPLIERID_SUBDISPLAY: + return false; + case SUPPLIERID_SECTORDISPLAY: + return true; // Allow the Set Split Sectors to be highlight source + case SUPPLIERID_TRACTIONCIRCLEDISPLAY: + case SUPPLIERID_ALLDATADISPLAY: + return false; // main display is always the driver of highlight data + default: + DASSERT(FALSE); + return false; + } + } + + virtual vector GetAllLaps() const override + { + set setSelectedLaps = m_sfLapList.GetSelectedItemsData3(); + vector lstLaps; + for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + CExtendedLap* pLap = i->second; + lstLaps.push_back(pLap); + } + + return lstLaps; + } + virtual vector GetLapsToShow() const override + { + set setSelectedLaps = m_sfLapList.GetSelectedItemsData3(); + vector lstLaps; + map mapFastestDriver; + CExtendedLap* pFastest = NULL; + CExtendedLap* pReference = NULL; // Added to show Reference Lap - KDJ + for(set::iterator i = setSelectedLaps.begin(); i != setSelectedLaps.end(); i++) + { + CExtendedLap* pLap = (CExtendedLap*)*i; + + lstLaps.push_back(pLap); + } + + for(map::const_iterator i = m_mapLaps.begin(); i != m_mapLaps.end(); i++) + { + CExtendedLap* pLap = i->second; + if(m_fShowDriverBests && (mapFastestDriver.count(pLap->GetLap()->GetComment()) == 0 || pLap->GetLap()->GetTime() < mapFastestDriver[pLap->GetLap()->GetComment()]->GetLap()->GetTime())) + { + mapFastestDriver[pLap->GetLap()->GetComment()] = pLap; + } + if(m_fShowBests) + { + if(pFastest == NULL || pLap->GetLap()->GetTime() < pFastest->GetLap()->GetTime()) + { + pFastest = pLap; + } + } + } + + if(m_fShowBests && pFastest) + { + lstLaps.push_back(pFastest); + } + for(map::iterator i = mapFastestDriver.begin(); i != mapFastestDriver.end(); i++) + { + lstLaps.push_back(i->second); + } + + // Set up for showing Reference lap similar to how we show Fastest Lap. + if(m_fShowReferenceLap && m_pReferenceLap != NULL) + { + lstLaps.push_back(m_pReferenceLap); + } +/* else + { + lstLaps.push_back(m_pReferenceLap); // Push the reference lap anyway, so that we can get the lap Split Points + } +*/ + + return lstLaps; + } + virtual FLOATRECT GetAllLapsBounds() const override + { + FLOATRECT rc; + rc.left = 1e30; + rc.top = -1e30; + rc.bottom = 1e30; + rc.right = -1e30; + + // changed this so it returns the bounds of the reference lap. This way, data-viewing isn't ruined by errant points + // it used to be based on all the laps, but if you had just one messed-up lap it would make viewing pointless + if(m_pReferenceLap != NULL) + { + const vector& lstPoints = m_pReferenceLap->GetPoints(); + for(int x = 0; x< lstPoints.size(); x++) + { + const TimePoint2D& p = lstPoints[x]; + rc.left = min(rc.left,p.flX); + rc.top = max(rc.top,p.flY); + rc.bottom = min(rc.bottom,p.flY); + rc.right = max(rc.right,p.flX); + } + + rc.left += m_flShiftX; + rc.top += m_flShiftY; + rc.right += m_flShiftX; + rc.bottom += m_flShiftY; + } + return rc; + } + virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const override + { + switch(iSupplierId) + { + case SUPPLIERID_MAINDISPLAY: + { + vector lstLaps = GetLapsToShow(); + if(lstLaps.size() <= 0) return LAPDISPLAYSTYLE_NOLAPS; + return m_eLapDisplayStyle; + } + case SUPPLIERID_SUBDISPLAY: + switch(m_eLapDisplayStyle) + { + case LAPDISPLAYSTYLE_MAP: return LAPDISPLAYSTYLE_PLOT; + default: return LAPDISPLAYSTYLE_MAP; + } + case SUPPLIERID_TRACTIONCIRCLEDISPLAY: + { + return LAPDISPLAYSTYLE_TRACTIONCIRCLE; + } + case SUPPLIERID_ALLDATADISPLAY: + { + return LAPDISPLAYSTYLE_ALLDATADISPLAY; + } + case SUPPLIERID_SECTORDISPLAY: + { + return LAPDISPLAYSTYLE_MAP; + } + default: + DASSERT(FALSE); + break; + } + return m_eLapDisplayStyle; + } + virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const override + { + if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) + { + return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; + } + return 1e30; + } + virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const override + { + if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) + { + return m_sfLapOpts.fIOIOHardcoded ? 5 : -1e30; + } + return -1e30; + } + + virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) override + { + CASSERT(DATA_CHANNEL_COUNT == 0x601); + + switch(eChannel) + { + case DATA_CHANNEL_X: return 1e30; + case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude + case DATA_CHANNEL_VELOCITY: + case DATA_CHANNEL_VELOCITYDELTA: + { + int iMin = (int)(flMin); + return (float)(iMin); + } + case DATA_CHANNEL_DISTANCE: + { + int iMin = (int)(flMin); + return (float)(iMin); + } + case DATA_CHANNEL_TIME: + case DATA_CHANNEL_ELAPSEDTIME: + case DATA_CHANNEL_TIMESLIP: + case DATA_CHANNEL_LAPTIME_SUMMARY: + { + int iMin = (int)(flMin/1000.0f); + return (float)(iMin)*1000.0f; + } + case DATA_CHANNEL_X_ACCEL: + case DATA_CHANNEL_Y_ACCEL: + case DATA_CHANNEL_Z_ACCEL: + { + int iMin = (int)(flMin); + return (float)(iMin); + } + case DATA_CHANNEL_TEMP: return 0; + case (DATA_CHANNEL_PID_START+0x5): return -40; + case (DATA_CHANNEL_PID_START+0xc): return 0; + case (DATA_CHANNEL_PID_START+0xA): return 0; + case (DATA_CHANNEL_PID_START+0x5c): return -40; + default: + if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) + { + return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; + } + return 1e30; + } + } + + virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) override + { + CASSERT(DATA_CHANNEL_COUNT == 0x601); + + switch(eChannel) + { + case DATA_CHANNEL_X: return 1e30; + case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude + case DATA_CHANNEL_VELOCITY: return 0; + case DATA_CHANNEL_DISTANCE: return 1e30; + case DATA_CHANNEL_TIME: + case DATA_CHANNEL_ELAPSEDTIME: + case DATA_CHANNEL_TIMESLIP: + { + int iMin = (int)(flMin/1000.0f); + return (float)(iMin)*1000.0f; + } + case DATA_CHANNEL_STRENGTH: return 0.0f; + case DATA_CHANNEL_LAPTIME_SUMMARY: + case DATA_CHANNEL_X_ACCEL: + case DATA_CHANNEL_Y_ACCEL: + case DATA_CHANNEL_Z_ACCEL: + { + int iMin = (int)(flMin); + return (float)(iMin); + } + case DATA_CHANNEL_VELOCITYDELTA: + { + int iMin = (int)(flMin); + return (float)(iMin); + } + case DATA_CHANNEL_TEMP: return 0; + + default: + if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) + { + return m_sfLapOpts.fIOIOHardcoded ? 0 : 1e30; + } + else if(eChannel >= DATA_CHANNEL_PID_START && eChannel < DATA_CHANNEL_PID_END) + { + int iMin = (int)(flMin); + return (float)(iMin); + } + return 1e30; + } + } + + virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) override + { + // Function sets up the spacing for the vertical guidelines on the data plots + CASSERT(DATA_CHANNEL_COUNT == 0x601); + const float flSpread = flMax - flMin; + switch(eChannel) + { + case DATA_CHANNEL_X: return 1e30; + case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude + case DATA_CHANNEL_VELOCITY: // We need to fix the X-channel call before putting these back into the code. + case DATA_CHANNEL_VELOCITYDELTA: + { + switch(m_sfLapOpts.eUnitPreference) + { + case UNIT_PREFERENCE_KMH: return KMH_TO_MS(25.0); + case UNIT_PREFERENCE_MPH: return MPH_TO_MS(20.0); // Adjusted by KDJ + case UNIT_PREFERENCE_MS: return 5; + } + return 10.0; + } + case DATA_CHANNEL_DISTANCE: + { + if(flSpread < 0.001) return 0.0001f; + if(flSpread < 0.005) return 0.0005f; + if(flSpread < 0.010) return 0.0010f; + if(flSpread < 0.050) return 0.0050f; + if(flSpread < 1.000) return 0.1000f; + if(flSpread < 10.00) return 1.0000f; + if(flSpread < 500) return 50.0f; + if(flSpread < 1000) return 100.0f; + if(flSpread < 5000) return 500.0f; + if(flSpread < 10000) return 1000.0f; + if(flSpread < 50000) return 2500.0f; + if(flSpread < 110000) return 5000.0f; + if(flSpread < 1100000) return 10000.0f; + if(flSpread < 10000000) return 100000.0f; + return 10000000; + } + + case DATA_CHANNEL_TIME: + case DATA_CHANNEL_ELAPSEDTIME: + { + if(flSpread < 1000) return 50.0f; + if(flSpread < 5000) return 100.0f; + if(flSpread < 10000) return 500.0f; + if(flSpread < 50000) return 2500.0f; + if(flSpread < 110000) return 5000.0f; + if(flSpread < 1100000) return 10000.0f; + if(flSpread < 10000000) return 100000.0f; + if(flSpread < 100000000) return 1000000.0f; + return 10000000.0f; + } + case DATA_CHANNEL_LAPTIME_SUMMARY: + { + if(flSpread < 1) return 0.50f; + if(flSpread < 5) return 1.0f; + if(flSpread < 10) return 5.0f; + if(flSpread < 50) return 25.0f; + if(flSpread < 110) return 50.0f; + if(flSpread < 1100) return 100.0f; + if(flSpread < 10000) return 1000.0f; + if(flSpread < 50000) return 2500.0f; + if(flSpread < 110000) return 5000.0f; + if(flSpread < 1100000) return 10000.0f; + if(flSpread < 10000000) return 100000.0f; + if(flSpread < 100000000) return 1000000.0f; + return 10000000.0f; + } + default: + return 1e30; + } + } + + virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) override + { + CASSERT(DATA_CHANNEL_COUNT == 0x601); + const float flSpread = flMax - flMin; + switch(eChannel) + { + case DATA_CHANNEL_X: return 1e30; + case DATA_CHANNEL_Y: return 1e30; // we don't want guides for either latitude or longitude + case DATA_CHANNEL_VELOCITY: + { + switch(m_sfLapOpts.eUnitPreference) + { + case UNIT_PREFERENCE_KMH: return KMH_TO_MS(25.0); + case UNIT_PREFERENCE_MPH: return MPH_TO_MS(20.0); // Adjusted by KDJ + case UNIT_PREFERENCE_MS: return 5; + } + return 10.0; + } + case DATA_CHANNEL_VELOCITYDELTA: + { + if(flSpread < 1) return 0.5f; + if(flSpread < 5) return 1.0f; + if(flSpread < 10) return 2.0f; + if(flSpread < 20) return 5.0f; + if(flSpread < 40) return 10.0f; + if(flSpread < 60) return 15.0f; + if(flSpread < 100) return 20.0f; + return 2.0; + } + case DATA_CHANNEL_DISTANCE: + { + if(flSpread < 0.001) return 0.0001f; + if(flSpread < 0.005) return 0.0005f; + if(flSpread < 0.010) return 0.0010f; + if(flSpread < 0.050) return 0.0050f; + if(flSpread < 1.000) return 0.1000f; + if(flSpread < 10.00) return 1.0000f; + if(flSpread < 1000) return 100.0f; + if(flSpread < 5000) return 500.0f; + if(flSpread < 10000) return 1000.0f; + if(flSpread < 50000) return 5000.0f; + if(flSpread < 110000) return 10000.0f; + if(flSpread < 1100000) return 100000.0f; + if(flSpread < 10000000) return 1000000.0f; + return 10000000; + } + + case DATA_CHANNEL_TIME: return 1e30; // No guidelines for Y-axis + case DATA_CHANNEL_TIMESLIP: + case DATA_CHANNEL_ELAPSEDTIME: + { + if(flSpread < 10) return 1.0f; + if(flSpread < 100) return 10.0f; + if(flSpread < 1000) return 100.0f; + if(flSpread < 5000) return 500.0f; + if(flSpread < 10000) return 1000.0f; + if(flSpread < 50000) return 5000.0f; + if(flSpread < 110000) return 10000.0f; + if(flSpread < 1100000) return 100000.0f; + if(flSpread < 10000000) return 1000000.0f; + return 10000000.0f; + } + case DATA_CHANNEL_LAPTIME_SUMMARY: + { + if(flSpread < 5) return 0.5f; + if(flSpread < 10) return 1.0f; + if(flSpread < 50) return 5.0f; + if(flSpread < 100) return 10.0f; + if(flSpread < 1100) return 100.0f; + if(flSpread < 10000) return 1000.0f; + if(flSpread < 50000) return 5000.0f; + if(flSpread < 110000) return 10000.0f; + if(flSpread < 1100000) return 100000.0f; + if(flSpread < 10000000) return 1000000.0f; + return 10000000.0f; + } + case DATA_CHANNEL_X_ACCEL: return 0.5f; + case DATA_CHANNEL_Y_ACCEL: return 0.5f; + case DATA_CHANNEL_Z_ACCEL: return 0.5f; + case DATA_CHANNEL_TEMP: return 10.0f; + case DATA_CHANNEL_STRENGTH: return 1.0f; + + default: + if(eChannel >= DATA_CHANNEL_IOIOPIN_START && eChannel < DATA_CHANNEL_IOIOPIN_END || + eChannel >= DATA_CHANNEL_IOIOCUSTOM_START && eChannel < DATA_CHANNEL_IOIOCUSTOM_END || + eChannel >= DATA_CHANNEL_RACEDAC_START && eChannel < DATA_CHANNEL_RACEDAC_END || + eChannel >= DATA_CHANNEL_RACEDACCUSTOM_START && eChannel < DATA_CHANNEL_RACEDACCUSTOM_END) + { + if(flSpread < 1) return m_sfLapOpts.fIOIOHardcoded ? 0.1f : 1e30; + if(flSpread < 10) return m_sfLapOpts.fIOIOHardcoded ? 1.0f : 1e30; + if(flSpread < 25) return m_sfLapOpts.fIOIOHardcoded ? 2.5f : 1e30; + if(flSpread < 50) return m_sfLapOpts.fIOIOHardcoded ? 5.0f : 1e30; + if(flSpread < 150) return m_sfLapOpts.fIOIOHardcoded ? 20.0f : 1e30; + if(flSpread < 500) return m_sfLapOpts.fIOIOHardcoded ? 50.0f : 1e30; + if(flSpread < 10000) return m_sfLapOpts.fIOIOHardcoded ? 1000.0f : 1e30; + if(flSpread < 100000) return m_sfLapOpts.fIOIOHardcoded ? 5000.0f : 1e30; + if(flSpread < 1000000) return m_sfLapOpts.fIOIOHardcoded ? 50000.0f : 1e30; + return m_sfLapOpts.fIOIOHardcoded ? 1.0f : 1e30; // Original code, and default for non-transformed IOIO data + } + else if(eChannel >= DATA_CHANNEL_PID_START && eChannel < DATA_CHANNEL_PID_END) + { + if(flSpread < 1) return 0.1f; + if(flSpread < 10) return 1.0f; + if(flSpread < 25) return 2.5f; + if(flSpread < 50) return 5.0f; + if(flSpread < 150) return 20.0f; + if(flSpread < 500) return 50.0f; + if(flSpread < 10000) return 1000.0f; + if(flSpread < 100000) return 5000.0f; + if(flSpread < 1000000) return 50000.0f; + return 1e30; + } + return 1e30; + } + } + virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const override + { + return m_sfLapOpts; + } + virtual DATA_CHANNEL GetXChannel() const override + { + return m_eXChannel; + } + virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const override + { + return g_pLapDB->GetDataChannel(iLapId, eChannel); + } + virtual vector GetYChannels() const override + { + return m_lstYChannels; + } + virtual void GetResponse(const char* pbData, int cbData, char** ppbResponse, int* pcbResponse) + { + + } + void SetupMulticast() + { + IP_ADAPTER_INFO sfAdapter[255] = {0}; + ULONG cbAdapter = sizeof(sfAdapter); + ULONG ret = GetAdaptersInfo(sfAdapter, &cbAdapter); + int cConnected = 0; + if(ret == NO_ERROR) + { + IP_ADAPTER_INFO* pInfo = &sfAdapter[0]; + while(pInfo) + { + if(strcmp(pInfo->IpAddressList.IpAddress.String, "0.0.0.0") != 0) + { + // found an adapter. That means we need a multicast checker + MulticastListener* pListener = new MulticastListener(&m_sfResponder, pInfo->IpAddressList.IpAddress.String); + if(pListener->Start()) + { + m_lstMulticast.push_back(pListener); + } + else + { + delete pListener; + } + } + + pInfo = pInfo->Next; + } + } + } +public: + vector m_lstYChannels; + DATA_CHANNEL m_eXChannel; // Made public by KDJ + ArtListBox m_sfYAxis; + CExtendedLap* m_pReferenceLap; + ArtListBox m_sfLapList; + ArtListBox m_sfListBox; + int m_iRaceId[50]; // Made public by KDJ +private: + ArtListBox m_sfXAxis; + + CLapPainter m_sfLapPainter; +// CLapPainter m_sfSubWindow; + CLapPainter m_sfSubDisplay; + CLapPainter m_sfTractionDisplay; + + // lap display style data + map m_mapLapHighlightTimes; // stores the highlight times (in milliseconds since phone app start) for each lap. Set from ILapSupplier calls + + LAPDISPLAYSTYLE m_eLapDisplayStyle; +// DATA_CHANNEL m_eXChannel; +// vector m_lstYChannels; + bool m_fShowTractionCircle; + bool m_fSmooth; + bool m_fShowBests; + bool m_fShowDriverBests; + bool m_fShowReferenceLap; + +// CExtendedLap* m_pReferenceLap; // Made public by KDJ + map m_mapLaps; // maps from iLapId to a lap object + HWND m_hWnd; + + map m_baseWindowPos; + + TCHAR m_szCommentText[512]; + TCHAR m_szMessageStatus[512]; + + // what updates are needed. When we call UpdateUI, it will |= the requested flags onto this, and then do a PostMessage with a custom UPDATEUI message + // when the UPDATEUI message is received, it will do an UpdateUI_Internal call using all the flags that have been built up, and clear the ones it handled. + DWORD m_fdwUpdateNeeded; + + // panning/zooming + float m_flShiftX; + float m_flShiftY; + + // multicast responses for each network device detected + vector m_lstMulticast; + MCResponder m_sfResponder; + +// int m_iRaceId[50]; + ILapSupplier* z_ILapSupplier; +}; + +DWORD ReceiveThreadProc(LPVOID param) +{ + ILapReceiver* pLaps = (ILapReceiver*)param; + while(true) + { + ReceiveLaps(63939, pLaps); + } + return 0; +} + +int str_ends_with(const TCHAR * str, const TCHAR * suffix) +{ + if( str == NULL || suffix == NULL ) + return 0; + + size_t str_len = wcslen(str); + size_t suffix_len = wcslen(suffix); + + if(suffix_len > str_len) + return 0; + + return 0 == wcsncmp( str + str_len - suffix_len, suffix, suffix_len ); +} + +void LoadPitsideSettings(PITSIDE_SETTINGS* pSettings) +{ + pSettings->Default(); + + TCHAR szModule[MAX_PATH]; + if(GetAppFolder(szModule,NUMCHARS(szModule))) + { + wcsncat(szModule,L"settings.txt", NUMCHARS(szModule)); + + ifstream in; + in.open(szModule); + if(!in.eof() && !in.fail()) + { + in>>pSettings->fRunHTTP; + in>>pSettings->iHTTPPort; + in>>pSettings->iVelocity; + in>>pSettings->iMapLines; + in>>pSettings->iColorScheme; + in>>pSettings->bSmoothYesNo; + in>>pSettings->bXAxis_KM; + in.close(); + } + } + else + { + // trouble. just bail. + return; + } +} + +void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) + { for (int i=0; i < 50; i++) { swprintf(p_sfLapOpts.m_PlotPrefs[i].m_ChannelName, L"Velocity"); @@ -3840,57 +3710,57 @@ void InitPlotPrefs(LAPSUPPLIEROPTIONS &p_sfLapOpts) p_sfLapOpts.m_SplitPoints[i].m_sfXPoint = 0.0f; // Initialize all split points p_sfLapOpts.m_SplitPoints[i].m_sfYPoint = 0.0f; // Initialize all split points p_sfLapOpts.m_SplitPoints[i].m_sfSectorTime = 0; // Initialize all sector times - p_sfLapOpts.m_SplitPoints[i].m_sfSplitTime = 0.0f; + p_sfLapOpts.m_SplitPoints[i].m_sfSplitTime = 0.0f; p_sfLapOpts.fDrawSplitPoints = false; // Default to not show split points - p_sfLapOpts.m_Tranformations[i].f_CoeffA= -1.0; - p_sfLapOpts.m_Tranformations[i].f_CoeffB= -1.0; - p_sfLapOpts.m_Tranformations[i].f_CoeffC= -1.0; + p_sfLapOpts.m_Tranformations[i].f_CoeffA= -1.0; + p_sfLapOpts.m_Tranformations[i].f_CoeffB= -1.0; + p_sfLapOpts.m_Tranformations[i].f_CoeffC= -1.0; swprintf(p_sfLapOpts.m_Tranformations[i].c_Name, L""); - p_sfLapOpts.m_Tranformations[i].b_LoadTrans = false; + p_sfLapOpts.m_Tranformations[i].b_LoadTrans = false; } - } - -void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) -{ - TCHAR szTempPath[MAX_PATH]; - if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) - { - wcscat(szTempPath,L"LatestSettings.txt"); - - wofstream out; - out.open(szTempPath); - if(!out.eof() && !out.fail()) - { - out << sfUI->m_szPath << endl; // The file name for the database - for (int t=0; t<50; t++) // Save the RaceID's currently displayed - { - out << sfUI->m_iRaceId[t] << endl; - } - out << sfSettings->fRunHTTP << endl; - out << sfSettings->iHTTPPort << endl; - out << sfSettings->iVelocity << endl; - out << sfSettings->iMapLines << endl; - out << sfSettings->iColorScheme << endl; - out << sfSettings->bSmoothYesNo << endl; - out << sfSettings->bXAxis_KM << endl; - - out << sfUI->m_sfLapOpts.bShowReferenceLap << endl; - out << sfUI->m_sfLapOpts.bSmoothYesNo << endl; - out << sfUI->m_sfLapOpts.bTractionCircle << endl; - out << sfUI->m_sfLapOpts.bXAxis_KM << endl; - out << sfUI->m_sfLapOpts.eSortPreference << endl; - out << sfUI->m_sfLapOpts.eUnitPreference << endl; - out << sfUI->m_sfLapOpts.e_Orientation << endl; - out << sfUI->m_sfLapOpts.fColorScheme << endl; - out << sfUI->m_sfLapOpts.fDrawGuides << endl; - out << sfUI->m_sfLapOpts.fDrawLines << endl; - out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; - out << sfUI->m_sfLapOpts.fElapsedTime << endl; - out << sfUI->m_sfLapOpts.fIOIOHardcoded << endl; - out << sfUI->m_sfLapOpts.flWindowShiftX << endl; - out << sfUI->m_sfLapOpts.flWindowShiftY << endl; - out << sfUI->m_sfLapOpts.iZoomLevels << endl; - + } + +void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) +{ + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + wofstream out; + out.open(szTempPath); + if(!out.eof() && !out.fail()) + { + out << sfUI->m_szPath << endl; // The file name for the database + for (int t=0; t<50; t++) // Save the RaceID's currently displayed + { + out << sfUI->m_iRaceId[t] << endl; + } + out << sfSettings->fRunHTTP << endl; + out << sfSettings->iHTTPPort << endl; + out << sfSettings->iVelocity << endl; + out << sfSettings->iMapLines << endl; + out << sfSettings->iColorScheme << endl; + out << sfSettings->bSmoothYesNo << endl; + out << sfSettings->bXAxis_KM << endl; + + out << sfUI->m_sfLapOpts.bShowReferenceLap << endl; + out << sfUI->m_sfLapOpts.bSmoothYesNo << endl; + out << sfUI->m_sfLapOpts.bTractionCircle << endl; + out << sfUI->m_sfLapOpts.bXAxis_KM << endl; + out << sfUI->m_sfLapOpts.eSortPreference << endl; + out << sfUI->m_sfLapOpts.eUnitPreference << endl; + out << sfUI->m_sfLapOpts.e_Orientation << endl; + out << sfUI->m_sfLapOpts.fColorScheme << endl; + out << sfUI->m_sfLapOpts.fDrawGuides << endl; + out << sfUI->m_sfLapOpts.fDrawLines << endl; + out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; + out << sfUI->m_sfLapOpts.fElapsedTime << endl; + out << sfUI->m_sfLapOpts.fIOIOHardcoded << endl; + out << sfUI->m_sfLapOpts.flWindowShiftX << endl; + out << sfUI->m_sfLapOpts.flWindowShiftY << endl; + out << sfUI->m_sfLapOpts.iZoomLevels << endl; + for (int i=0; i < 50; i++) { out << sfUI->m_sfLapOpts.m_PlotPrefs[i].iDataChannel << endl; // Save the Data Channel number @@ -3905,45 +3775,45 @@ void SaveSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainU out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfXPoint << endl; // Save split points out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfYPoint << endl; // Save split points out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSectorTime << endl; // Save sector times - out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; // Save best sector time + out << sfUI->m_sfLapOpts.m_SplitPoints[i].m_sfSplitTime << endl; // Save best sector time } - out << "End of Plot Prefs" << endl; + out << "End of Plot Prefs" << endl; out << sfUI->m_sfLapOpts.fDrawSplitPoints << endl; // Save setting to show/hide split points - if ( sfUI->m_pReferenceLap ) - out << sfUI->m_pReferenceLap->m_pLap->GetLapId() << endl; // Save the Reference Lap ID - else - out << "0" << endl; + if ( sfUI->m_pReferenceLap ) + out << sfUI->m_pReferenceLap->m_pLap->GetLapId() << endl; // Save the Reference Lap ID + else + out << "0" << endl; out << sfUI->m_eXChannel << endl; // Save X-Axis data channel for (int i=0; i < sfUI->m_lstYChannels.size(); i++) // Save the list of selected Y-Axis channels { out << sfUI->m_lstYChannels[i] << endl; // Save the list of selected Y-Axis channels } - out << "//" << endl; // End of file marker - out.close(); - } - - } -} - -int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) -{ - TCHAR szTempPath[MAX_PATH]; - if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) - { - wcscat(szTempPath,L"LatestSettings.txt"); - - vector lines; - ifstream in; - in.open(szTempPath); - // Read in all of the lines of the "LatestSettings.txt" file at once, or it doesn't work right - // Store them in the 'lines' vector - for (int i = 0; i < 1000; i++) - { + out << "//" << endl; // End of file marker + out.close(); + } + + } +} + +int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI* sfUI) +{ + TCHAR szTempPath[MAX_PATH]; + if(GetTempPathW(NUMCHARS(szTempPath),szTempPath)) + { + wcscat(szTempPath,L"LatestSettings.txt"); + + vector lines; + ifstream in; + in.open(szTempPath); + // Read in all of the lines of the "LatestSettings.txt" file at once, or it doesn't work right + // Store them in the 'lines' vector + for (int i = 0; i < 1000; i++) + { string Line; - if(!in.eof() && !in.fail()) - { + if(!in.eof() && !in.fail()) + { getline(in, Line); if (Line != "//") { @@ -3953,610 +3823,610 @@ int LoadSettings(TCHAR szDBPath[MAX_PATH], PITSIDE_SETTINGS* sfSettings, CMainUI { break; } - } - else - { - break; - } - } - in.close(); - + } + else + { + break; + } + } + in.close(); + // Now let's process the information and load it in the sfUI data structure string Line = lines[0]; int t; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - swprintf(sfUI->m_szPath, NUMCHARS(sfUI->m_szPath), c_Name); // Load name of last-processed file in sfUI Pointer for szDBPath - } - for (t=1; t<=50; t++) // Load the RaceID's to be displayed - { - Line = lines[t]; + copy(Line.begin(), Line.end(), c_Name); + swprintf(sfUI->m_szPath, NUMCHARS(sfUI->m_szPath), c_Name); // Load name of last-processed file in sfUI Pointer for szDBPath + } + for (t=1; t<=50; t++) // Load the RaceID's to be displayed + { + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_iRaceId[t-1] = _wtoi(c_Name); // Load the last Race session ID's into Pitside Console for loading and display - } - } - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_iRaceId[t-1] = _wtoi(c_Name); // Load the last Race session ID's into Pitside Console for loading and display + } + } + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->fRunHTTP = _wtoi(c_Name); // Load the boolean on whether to run the HTTP server into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iHTTPPort = _wtoi(c_Name); // Load the HTTP port number into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iVelocity = _wtoi(c_Name); // Load the Velocity (km/mi/mps) into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iMapLines = _wtoi(c_Name); // Load the boolean for map lines display into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->iColorScheme = _wtoi(c_Name); // Load the color scheme into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfSettings->bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfSettings->bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into sfSettings data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bShowReferenceLap = _wtoi(c_Name); // Load the booelean to display Ref Lap into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into LapOpts data structuree - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bSmoothYesNo = _wtoi(c_Name); // Load the boolean for accel smoothing into LapOpts data structuree + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bTractionCircle = _wtoi(c_Name); // Load the boolean to display Traction Circle into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.bXAxis_KM = _wtoi(c_Name); // Load the Distance setting into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.eSortPreference = (LAPSORTSTYLE)_wtoi(c_Name); // Load the Lap Sort pref into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.eUnitPreference = (UNIT_PREFERENCE)_wtoi(c_Name); // Load the kph/mph/mps seeting into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.e_Orientation = (ORIENTATION)_wtoi(c_Name); // Load the Phone Orientation into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fColorScheme = _wtoi(c_Name); // Load the Color Scheme into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawGuides = _wtoi(c_Name); // Load the Guidelines Drawing boolean into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawLines = _wtoi(c_Name); // Load the Lines/Dots Drawing boolean into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the Split Points boolean into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fElapsedTime = _wtoi(c_Name); // Load the Elapsed Time boolean into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fIOIOHardcoded = _wtoi(c_Name); // Load the IOIO Hardcoded boolean into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.flWindowShiftX = _wtof(c_Name); // Load the Window ShiftX into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure - } - - Line = lines[t++]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.flWindowShiftY = _wtof(c_Name); // Load the Window ShiftY into LapOpts data structure + } + + Line = lines[t++]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure - } - - int arraycounter = 0; // Now load the Plotting Preferences into the m_sfLapOpts.PlotPrefs array - for (int i = t; i < lines.size() && arraycounter < 50; i+=13) - { - Line = lines[i]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.iZoomLevels = _wtoi(c_Name); // Load the Zoom Level into LapOpts data structure + } + + int arraycounter = 0; // Now load the Plotting Preferences into the m_sfLapOpts.PlotPrefs array + for (int i = t; i < lines.size() && arraycounter < 50; i+=13) + { + Line = lines[i]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel - } - - Line = lines[i+1]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iDataChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the data channel + } + + Line = lines[i+1]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - swprintf(sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].m_ChannelName, NUMCHARS(sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].m_ChannelName), c_Name); // Load the data channel - } - - Line = lines[i+2]; + copy(Line.begin(), Line.end(), c_Name); + swprintf(sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].m_ChannelName, NUMCHARS(sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].m_ChannelName), c_Name); // Load the data channel + } + + Line = lines[i+2]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel - } - - Line = lines[i+3]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iPlotView = _wtoi(c_Name); // Load current display mode for channel + } + + Line = lines[i+3]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel - } - - Line = lines[i+4]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMinValue = _wtof(c_Name); // Load the lower limit for channel + } + + Line = lines[i+4]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel - } - - Line = lines[i+5]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fMaxValue = _wtof(c_Name); // Load the upper limit for channel + } + + Line = lines[i+5]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel - } - - Line = lines[i+6]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].iTransformYesNo = _wtoi(c_Name); // Load the transform flag for channel + } + + Line = lines[i+6]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel - } - - Line = lines[i+7]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransAValue = _wtof(c_Name); // Load the A constant for channel + } + + Line = lines[i+7]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel - } - - Line = lines[i+8]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransBValue = _wtof(c_Name); // Load the B constant for channel + } + + Line = lines[i+8]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel - } - - Line = lines[i+9]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_PlotPrefs[arraycounter].fTransCValue = _wtof(c_Name); // Load the C constant for channel + } + + Line = lines[i+9]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points - } - - Line = lines[i+10]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfXPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+10]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points - } - - Line = lines[i+11]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfYPoint = _wtof(c_Name); // Load the split points + } + + Line = lines[i+11]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times - } - - Line = lines[i+12]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSectorTime = _wtoi(c_Name); // Load all sector times + } + + Line = lines[i+12]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel - } - arraycounter++; - } + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.m_SplitPoints[arraycounter].m_sfSplitTime = _wtof(c_Name); // Load the lower limit for channel + } + arraycounter++; + } t = t + (arraycounter) * 13; // Reset the line counter to collect the next set of data - - Line = lines[t]; + + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); -// sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // End of Data Channels - } + copy(Line.begin(), Line.end(), c_Name); +// sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // End of Data Channels + } - t++; - Line = lines[t]; + t++; + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points - } + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.fDrawSplitPoints = _wtoi(c_Name); // Load the setting to show split points + } - t++; - Line = lines[t]; + t++; + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_sfLapOpts.LapId = _wtoi(c_Name); // Get the LapId for the reference lap - } - - t++; - Line = lines[t]; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_sfLapOpts.LapId = _wtoi(c_Name); // Get the LapId for the reference lap + } + + t++; + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_eXChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the X-Axis data channel - } - t++; + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_eXChannel = (DATA_CHANNEL)_wtoi(c_Name); // Load the X-Axis data channel + } + t++; sfUI->m_lstYChannels.clear(); // Clear the current list of Data channels for (t; t < lines.size(); t++ ) { - Line = lines[t]; + Line = lines[t]; { TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - sfUI->m_lstYChannels.push_back( (DATA_CHANNEL)_wtoi(c_Name) ); // Load the Y-Axis data channels - } + copy(Line.begin(), Line.end(), c_Name); + sfUI->m_lstYChannels.push_back( (DATA_CHANNEL)_wtoi(c_Name) ); // Load the Y-Axis data channels + } } - - in.close(); - } - return 1; -} - -// Converts ANSI strings to UNICODE strings + + in.close(); + } + return 1; +} + +// Converts ANSI strings to UNICODE strings BOOL AnsiToUnicode( LPSTR pszAnsiString, LPWSTR pszwUniBuff, DWORD dwUniBuffSize ) { int iRet = 0; iRet = MultiByteToWideChar(CP_ACP, 0, pszAnsiString, -1, pszwUniBuff, dwUniBuffSize); return ( 0 != iRet ); -} - -INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) - -{ - INITCOMMONCONTROLSEX initCtrls; - initCtrls.dwICC = ICC_LISTVIEW_CLASSES; - initCtrls.dwSize = sizeof(initCtrls); - LoadIcon(hInstance,_T("IDI_EXPLORERICON")); - InitCommonControlsEx(&initCtrls); - - CMainUI sfUI; - g_pUI = &sfUI; - //CLapReceiver sfLaps(&sfUI); - - CSQLiteLapDB sfLaps(&sfUI); - bool fDBOpened = false; - - int iRaceId[50] = {0}; - TCHAR szDBPath[MAX_PATH] = {NULL}; // Filename and path are contained in this string - TCHAR szTemp[512] = {NULL}; - TCHAR szLoadFileName[MAX_PATH] = {NULL}; - TCHAR wCmdLine[MAX_PATH] = {NULL}; - AnsiToUnicode(lpCmdLine, wCmdLine, sizeof(wCmdLine)); // Convert ANSI command line to UNICODE command - - PITSIDE_SETTINGS sfSettings; +} + +INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) + +{ + INITCOMMONCONTROLSEX initCtrls; + initCtrls.dwICC = ICC_LISTVIEW_CLASSES; + initCtrls.dwSize = sizeof(initCtrls); + LoadIcon(hInstance,_T("IDI_EXPLORERICON")); + InitCommonControlsEx(&initCtrls); + + CMainUI sfUI; + g_pUI = &sfUI; + //CLapReceiver sfLaps(&sfUI); + + CSQLiteLapDB sfLaps(&sfUI); + bool fDBOpened = false; + + int iRaceId[50] = {0}; + TCHAR szDBPath[MAX_PATH] = {NULL}; // Filename and path are contained in this string + TCHAR szTemp[512] = {NULL}; + TCHAR szLoadFileName[MAX_PATH] = {NULL}; + TCHAR wCmdLine[MAX_PATH] = {NULL}; + AnsiToUnicode(lpCmdLine, wCmdLine, sizeof(wCmdLine)); // Convert ANSI command line to UNICODE command + + PITSIDE_SETTINGS sfSettings; LoadPitsideSettings(&sfSettings); // Load preferences from "Settings.txt" file - LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options - InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything - sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer - sfUI.SetRaceId(&iRaceId[0]); - x_sfLapOpts.LapId = 0; - - - if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line - { - return UnitTests(); - DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); - } - else if( str_ends_with( wCmdLine, L".wflp\"") ) // Check if user clicked on an associated WFLP file and load it - { - // First we must remove the quote marks from the beginning and end of the file name in the command line - int start = 1; - int end = NUMCHARS(wCmdLine); - for (int q=start; q lines; - ifstream in; - if ( DoesFileExist(szTempPath) ) // Make sure that the file exists before opening it - { - in.open(szTempPath); - // Read in the first line of the "LatestSettings.txt" file - // Store them in the 'lines' vector + LAPSUPPLIEROPTIONS x_sfLapOpts; //sfLapOpts contains all lap display options + InitPlotPrefs(x_sfLapOpts); // Initialize all PlotPrefs variables before displaying anything + sfUI.SetDisplayOptions(x_sfLapOpts); // Link x_sfLapOpts with CMainUI pointer + sfUI.SetRaceId(&iRaceId[0]); + x_sfLapOpts.LapId = 0; + + + if(strcmp(lpCmdLine,"unit") == 0) // Check for special test command line + { + return UnitTests(); + DWORD dwRet = MessageBox(NULL,wCmdLine,L"Unit", MB_APPLMODAL | MB_ICONWARNING | MB_OK | MB_TOPMOST | MB_DEFBUTTON2); + } + else if( str_ends_with( wCmdLine, L".wflp\"") ) // Check if user clicked on an associated WFLP file and load it + { + // First we must remove the quote marks from the beginning and end of the file name in the command line + int start = 1; + int end = NUMCHARS(wCmdLine); + for (int q=start; q lines; + ifstream in; + if ( DoesFileExist(szTempPath) ) // Make sure that the file exists before opening it + { + in.open(szTempPath); + // Read in the first line of the "LatestSettings.txt" file + // Store them in the 'lines' vector string Line; - if(!in.eof() && !in.fail()) - { + if(!in.eof() && !in.fail()) + { getline(in, Line); if (Line != "//") { lines.push_back(Line); } - } - in.close(); + } + in.close(); TCHAR szText[MAX_PATH]; - + // Now let's process the information and load it in the sfUI data structure { string Line = lines[0]; TCHAR *c_Name = new TCHAR[Line.size()+1]; c_Name[Line.size()] = 0; - copy(Line.begin(), Line.end(), c_Name); - swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath - } - if ( _wcsnicmp( szText, szDBPath, NUMCHARS(szDBPath) ) == 0 ) // Opening the same file, so load see if user wants to return to previous session - { - int iRet = MessageBoxW(NULL,L"Do you want to pick up where you left off?",L"Database loaded previously",MB_ICONERROR | MB_YESNO); - if(iRet == IDYES) - { - LoadSettings(szDBPath, &sfSettings, &sfUI); // Let's overwrite the default preferences with the settings from the last instance run + copy(Line.begin(), Line.end(), c_Name); + swprintf(szText, NUMCHARS(szText), c_Name); // Load name of last-processed file in szDBPath + } + if ( _wcsnicmp( szText, szDBPath, NUMCHARS(szDBPath) ) == 0 ) // Opening the same file, so load see if user wants to return to previous session + { + int iRet = MessageBoxW(NULL,L"Do you want to pick up where you left off?",L"Database loaded previously",MB_ICONERROR | MB_YESNO); + if(iRet == IDYES) + { + LoadSettings(szDBPath, &sfSettings, &sfUI); // Let's overwrite the default preferences with the settings from the last instance run for (int t=0; t<50; t++) { iRaceId[t]=sfUI.m_iRaceId[t]; } - fDBOpened = true; - } - else - { - // show the race-selection dialog - RACESELECT_RESULT sfRaceResult; - CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); - ::ArtShowDialog(&sfRaceSelect); - if(!sfRaceResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session - sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer - } - fDBOpened = true; - } - else - { - iRaceId[0] = -1; - sfUI.m_iRaceId[0] = -1; - fDBOpened = true; - } - } - } - else - { - // show the race-selection dialog - RACESELECT_RESULT sfRaceResult; - CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); - ::ArtShowDialog(&sfRaceSelect); - if(!sfRaceResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session - sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer - } - fDBOpened = true; - } - else - { - iRaceId[0] = -1; - sfUI.m_iRaceId[0] = -1; - fDBOpened = true; - } - } - } - else - { - // show the race-selection dialog - RACESELECT_RESULT sfRaceResult; - CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); - ::ArtShowDialog(&sfRaceSelect); - if(!sfRaceResult.fCancelled) - { - for (int z = 0; z < 50; z++) - { - iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session - sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer - } - fDBOpened = true; - } - else - { - iRaceId[0] = -1; - sfUI.m_iRaceId[0] = -1; - fDBOpened = true; - } - } - } - } - else - { - iRaceId[0] = -1; - sfUI.m_iRaceId[0] = -1; - fDBOpened = true; - } - } - - if(!fDBOpened) - { - // they didn't choose a file, so just use a temp DB. - TCHAR szTempPath[MAX_PATH]; - GetTempPath(NUMCHARS(szTempPath),szTempPath); - wcscat(szTempPath,L"pitsidetemp.wflp"); - if(sfLaps.Init(szTempPath)) - { - // success! + fDBOpened = true; + } + else + { + // show the race-selection dialog + RACESELECT_RESULT sfRaceResult; + CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); + ::ArtShowDialog(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer + } + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; + fDBOpened = true; + } + } + } + else + { + // show the race-selection dialog + RACESELECT_RESULT sfRaceResult; + CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); + ::ArtShowDialog(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer + } + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; + fDBOpened = true; + } + } + } + else + { + // show the race-selection dialog + RACESELECT_RESULT sfRaceResult; + CRaceSelectDlg sfRaceSelect(&sfLaps,&sfRaceResult); + ::ArtShowDialog(&sfRaceSelect); + if(!sfRaceResult.fCancelled) + { + for (int z = 0; z < 50; z++) + { + iRaceId[z] = sfRaceResult.iRaceId[z]; // Load the first selected race session + sfUI.m_iRaceId[z] = sfRaceResult.iRaceId[z]; // Load these RaceId's into the global pointer + } + fDBOpened = true; + } + else + { + iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; + fDBOpened = true; + } + } + } + } + else + { + iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; + fDBOpened = true; + } + } + + if(!fDBOpened) + { + // they didn't choose a file, so just use a temp DB. + TCHAR szTempPath[MAX_PATH]; + GetTempPath(NUMCHARS(szTempPath),szTempPath); + wcscat(szTempPath,L"pitsidetemp.wflp"); + if(sfLaps.Init(szTempPath)) + { + // success! wcscpy(szDBPath,szTempPath); - iRaceId[0] = -1; - sfUI.m_iRaceId[0] = -1; - fDBOpened = true; - } - } - - if(!fDBOpened) - { - // disaster. - MessageBox(NULL,L"Pitside was unable to create a database to save data to. Is your hard drive full?",L"Failed to create DB",MB_ICONERROR); - exit(0); - } - g_pLapDB = &sfLaps; - + iRaceId[0] = -1; + sfUI.m_iRaceId[0] = -1; + fDBOpened = true; + } + } + + if(!fDBOpened) + { + // disaster. + MessageBox(NULL,L"Pitside was unable to create a database to save data to. Is your hard drive full?",L"Failed to create DB",MB_ICONERROR); + exit(0); + } + g_pLapDB = &sfLaps; + switch (sfSettings.iVelocity) { case 0: @@ -4624,52 +4494,52 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine } } x_sfLapOpts.eSortPreference = SORTSTYLE_BYTIMEOFRACE; // Default sort Lap List by time of lap - swprintf(sfUI.m_szPath, NUMCHARS(sfUI.m_szPath), szDBPath); // Load name of the chosen file into the sfUI pointer - - PitsideHTTP aResponder(g_pLapDB,&sfUI); - if(sfSettings.fRunHTTP && sfSettings.iHTTPPort > 0 && sfSettings.iHTTPPort < 65536) - { - g_pHTTPServer = new SimpleHTTPServer(); - - bool fTryAgain = false; - do - { - fTryAgain = false; - if(!g_pHTTPServer->Init(sfSettings.iHTTPPort,&aResponder)) - { - TCHAR szMsg[512]; - _snwprintf(szMsg,NUMCHARS(szMsg),L"Pitside was unable to start the HTTP server on port %d. Do you want to open settings.txt to try another port or disable the server?\n\nNOTE: This will also stop all communication from the phone to Pitside",sfSettings.iHTTPPort); - int iRet = MessageBox(NULL,szMsg,L"Failed to start HTTP server",MB_ICONERROR | MB_YESNO); - if(iRet == IDYES) - { - TCHAR szPath[MAX_PATH]; - if(GetAppFolder(szPath,NUMCHARS(szPath))) - { - wcscat(szPath,L"settings.txt"); - _wsystem(szPath); - - LoadPitsideSettings(&sfSettings); - fTryAgain = sfSettings.fRunHTTP; - } - } - } - } - while(fTryAgain); - } - else - { - g_pHTTPServer = NULL; - } - if(sfSettings.fRunHTTP) // Only try to receive phone information when the HTTP server is turned on - { - HANDLE hRecvThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ReceiveThreadProc, (LPVOID)&sfLaps, 0, NULL); - } - // Show the Open Dialog and start Pitside Console - ArtShowDialog(&sfUI); - - // Exiting the program. - SaveSettings(szDBPath, &sfSettings, &sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing - - exit(0); // -} - + swprintf(sfUI.m_szPath, NUMCHARS(sfUI.m_szPath), szDBPath); // Load name of the chosen file into the sfUI pointer + + PitsideHTTP aResponder(g_pLapDB,&sfUI); + if(sfSettings.fRunHTTP && sfSettings.iHTTPPort > 0 && sfSettings.iHTTPPort < 65536) + { + g_pHTTPServer = new SimpleHTTPServer(); + + bool fTryAgain = false; + do + { + fTryAgain = false; + if(!g_pHTTPServer->Init(sfSettings.iHTTPPort,&aResponder)) + { + TCHAR szMsg[512]; + _snwprintf(szMsg,NUMCHARS(szMsg),L"Pitside was unable to start the HTTP server on port %d. Do you want to open settings.txt to try another port or disable the server?\n\nNOTE: This will also stop all communication from the phone to Pitside",sfSettings.iHTTPPort); + int iRet = MessageBox(NULL,szMsg,L"Failed to start HTTP server",MB_ICONERROR | MB_YESNO); + if(iRet == IDYES) + { + TCHAR szPath[MAX_PATH]; + if(GetAppFolder(szPath,NUMCHARS(szPath))) + { + wcscat(szPath,L"settings.txt"); + _wsystem(szPath); + + LoadPitsideSettings(&sfSettings); + fTryAgain = sfSettings.fRunHTTP; + } + } + } + } + while(fTryAgain); + } + else + { + g_pHTTPServer = NULL; + } + if(sfSettings.fRunHTTP) // Only try to receive phone information when the HTTP server is turned on + { + HANDLE hRecvThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ReceiveThreadProc, (LPVOID)&sfLaps, 0, NULL); + } + // Show the Open Dialog and start Pitside Console + ArtShowDialog(&sfUI); + + // Exiting the program. + SaveSettings(szDBPath, &sfSettings, &sfUI); // Let's save as many preferences and current settings as we can for next execution cycle before closing + + exit(0); // +} + diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp.rej b/PitsideConsole/PitsideConsole/PitsideConsole.cpp.rej new file mode 100644 index 0000000..21e8f23 --- /dev/null +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp.rej @@ -0,0 +1,14 @@ +diff a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp (rejected hunks) +@@ -2114,8 +1956,11 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) + const static DWORD UPDATE_VALUES = 0x10; + const static DWORD UPDATE_TRACTIONCIRCLE = 0x20; + const static DWORD UPDATE_ALLDATA = 0x40; ++ const static DWORD UPDATE_ALL = 0xFFFF; ++ ++ const static DWORD UPDATE_ADD2LIST = 0x10000; ++ + +- const static DWORD UPDATE_ALL = 0xffffffff; + // Pull in PlotPrefs array as well as lines vs. dots and Painting color scheme settings from Settings.txt file + void SetDisplayOptions(const LAPSUPPLIEROPTIONS& lapOpts) + { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index 8eb3ac6..fdb627f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -1,211 +1,211 @@ -#include "Resource.h" -#include -#include "commctrl.h" - -"IDI_EXPLORERICON" ICON "res\\pitside.ico" -IDB_SPLASHIMAGE BITMAP "res\\splash.bmp" - -IDD_DLGFIRST DIALOG 100, 100, 745, 350 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX -CAPTION "Pitside" -FONT 8, "MS Shell Dlg" -MENU IDM_OPTIONS -BEGIN - - CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 - LTEXT "",IDC_DISPLAY,155,63,590,282 - LTEXT "",IDC_TRACTIONCIRCLEMAP,520,0,63,63 - LTEXT "",IDC_SUBDISPLAY,586,0,87,63 - AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 - AUTORADIOBUTTON "Data Plot",IDC_DISPLAYTYPE_PLOT,185,0,45,12 - //AUTORADIOBUTTON "Reception",IDC_DISPLAYTYPE_RECEPTION,230,0,50,12 - CONTROL "", IDC_XAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 0,0,75,150 - CONTROL "", IDC_YAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 75,0,75,150 - - EDITTEXT IDC_COMMENTTEXT, 155,12,81,12 - PUSHBUTTON "Set Comment", IDC_SETDRIVER, 250,0,75,12 - PUSHBUTTON "X", IDC_CLEARCOMMENT, 237,13,10,10 - PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,14,75,12 - PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,28,75,12 - - LTEXT "", IDC_CURRENTREFERENCE, 155,26,93,24 - LTEXT "", IDC_MESSAGESTATUS, 155,43,93,24 - LTEXT "Phone: ", IDC_CURRENTREMOTEIP, 155,55,100,10 - LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,42,70,10 - CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 -END -/* -// Window for sub-display to appear in -IDD_DLGSUBDISPLAY DIALOG 586,0,87,63 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_CHILD | WS_POPUP | WS_THICKFRAME -CAPTION "Map Display" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "",IDC_SUBDISPLAY,5,5,77,53 - -END -*/ -// Dialog box for sending messages to the car -IDD_DLGMESSAGE DIALOG 280, 200, 200, 85 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Pit->Car Message" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Message",IDC_LBLMESSAGE,5,5,100,12 - EDITTEXT IDC_EDTMESSAGE,105,5,100,12 - LTEXT "Time to display, min (Max=3)",IDC_LBLTIME,5,19,100,12 - EDITTEXT IDC_EDTTIME,105,19,100,12 - LTEXT "Send attempt time, min (Max=3)",IDC_LBLATTEMPTTIME,5,33,100,12 - EDITTEXT IDC_EDTATTEMPTTIME,105,33,100,12 - LTEXT "Pitside may hang for up to 60s on next message send\nif previous attempt failed or was aborted",IDC_LBLMESSAGE2,5,47,195,24 - PUSHBUTTON "OK", IDOK, 5,67,95,18 - PUSHBUTTON "Cancel", IDCANCEL, 100,67,95,18 -END - -// Dialog box for setting sector split points -IDD_SETSPLITPOINTS DIALOG 50, 50, 400, 300 -STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_TABSTOP -CAPTION "Set Sector Split Points" -FONT 10, "MS Shell Dlg" -BEGIN - CTEXT "Left-Click on the map, then choose your split point\n(Clear All to end sector displaying)",IDC_LBLSPLIT1,5,5,390,25 - PUSHBUTTON "Set Split 1", IDC_SETSPLIT1, 5,30,50,20 - PUSHBUTTON "Set Split 2", IDC_SETSPLIT2, 5,55,50,20 - PUSHBUTTON "Set Split 3", IDC_SETSPLIT3, 5,80,50,20 - PUSHBUTTON "Set Split 4", IDC_SETSPLIT4, 5,105,50,20 - PUSHBUTTON "Set Split 5", IDC_SETSPLIT5, 5,130,50,20 - PUSHBUTTON "Set Split 6", IDC_SETSPLIT6, 5,155,50,20 - PUSHBUTTON "Set Split 7", IDC_SETSPLIT7, 5,180,50,20 - PUSHBUTTON "Set Split 8", IDC_SETSPLIT8, 5,205,50,20 - PUSHBUTTON "Clear All", IDRESET, 5,250,50,20 - LTEXT "",IDC_LBLSPLITMAP,60,27,335,250 - PUSHBUTTON "OK", IDOK, 5,280,195,20 - PUSHBUTTON "Cancel", IDCANCEL, 200,280,195,20 -END - -// Dialog box for displaying all data for a given point -IDD_ALLDATADISPLAY DIALOG 250, 75, 400, 250 -STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE | WS_CAPTION -CAPTION "Data Point Information" -FONT 10, "MS Shell Dlg" -BEGIN - CTEXT "****Data Details****", IDC_RACE_TITLE, 5,5,365,12 - CONTROL "", IDC_ALLDATADISPLAY, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,20,390,225 -END - -// Dialog box for displaying sector split times -IDD_SHOWSECTORS DIALOG 250, 75, 380, 99 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION -CAPTION "Sector Times" -FONT 9, "MS Shell Dlg" -BEGIN - CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,380,99 -END - -// dialog for selecting which race in a DB we want to use -IDD_SELECTRACE DIALOG 150, 200, 200, 200 -STYLE DS_MODALFRAME | WS_POPUP | DS_SETFONT | WS_CAPTION | WS_SYSMENU -CAPTION "Select one or more race sessions to load" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT/* | LVS_SINGLESEL*/ | LVS_SHOWSELALWAYS, 0,0,200,180 - PUSHBUTTON "OK", IDOK, 5,180,95,20 - PUSHBUTTON "Cancel", IDCANCEL, 100,180,95,20 -END - -// dialog for selecting which race sessions in DB we want to use for T&S -IDD_SELECTSESSIONS DIALOG 150, 200, 200, 200 -STYLE DS_MODALFRAME | WS_POPUP | DS_SETFONT | WS_CAPTION | WS_SYSMENU -CAPTION "Select T&S Race Sessions (MAX = 50)" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,200,180 - PUSHBUTTON "OK", IDOK, 5,180,95,20 - PUSHBUTTON "Cancel", IDCANCEL, 100,180,95,20 -END - -// dialog for displaying T&S data results -IDD_TIMINGSCORING DIALOG 150, 200, 500, 390 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_MINIMIZEBOX -CAPTION "Best Laps & Race Standings from Selected Sessions" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "", IDC_TIMINGSCORING, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,0,298,370 - CTEXT "****RACE STANDINGS****", IDC_RACE_TITLE, 308,10,187,12 - CTEXT "", IDC_RACE_PROGRESS, 308,25,187,12 - CONTROL "", IDC_RACESCORING, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 308,40,187,240 - PUSHBUTTON "Save Results", IDC_RACE_SAVE, 313,285,85,15 - PUSHBUTTON "Re-Run Race Scenario", IDC_RACE_RERUN, 400,285,85,15 - CTEXT "Enter race information below", IDC_RACE_INFO, 308,305,187,12 +#include "Resource.h" +#include +#include "commctrl.h" + +"IDI_EXPLORERICON" ICON "res\\pitside.ico" +IDB_SPLASHIMAGE BITMAP "res\\splash.bmp" + +IDD_DLGFIRST DIALOG 100, 100, 745, 350 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX +CAPTION "Pitside" +FONT 8, "MS Shell Dlg" +MENU IDM_OPTIONS +BEGIN + + CONTROL "", IDC_LAPS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,150,150,200 + LTEXT "",IDC_DISPLAY,155,63,590,282 + LTEXT "",IDC_TRACTIONCIRCLEMAP,520,0,63,63 + LTEXT "",IDC_SUBDISPLAY,586,0,87,63 + AUTORADIOBUTTON "Map",IDC_DISPLAYTYPE_LINE,155,0,30,12 + AUTORADIOBUTTON "Data Plot",IDC_DISPLAYTYPE_PLOT,185,0,45,12 + //AUTORADIOBUTTON "Reception",IDC_DISPLAYTYPE_RECEPTION,230,0,50,12 + CONTROL "", IDC_XAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS, 0,0,75,150 + CONTROL "", IDC_YAXIS, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 75,0,75,150 + + EDITTEXT IDC_COMMENTTEXT, 155,12,81,12 + PUSHBUTTON "Set Comment", IDC_SETDRIVER, 250,0,75,12 + PUSHBUTTON "X", IDC_CLEARCOMMENT, 237,13,10,10 + PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,14,75,12 + PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,28,75,12 + + LTEXT "", IDC_CURRENTREFERENCE, 155,26,93,24 + LTEXT "", IDC_MESSAGESTATUS, 155,43,93,24 + LTEXT "Phone: ", IDC_CURRENTREMOTEIP, 155,55,100,10 + LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,42,70,10 + CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 +END +/* +// Window for sub-display to appear in +IDD_DLGSUBDISPLAY DIALOG 586,0,87,63 +STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_CHILD | WS_POPUP | WS_THICKFRAME +CAPTION "Map Display" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "",IDC_SUBDISPLAY,5,5,77,53 + +END +*/ +// Dialog box for sending messages to the car +IDD_DLGMESSAGE DIALOG 280, 200, 200, 85 +STYLE DS_MODALFRAME | WS_EX_TOPMOST | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Pit->Car Message" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Message",IDC_LBLMESSAGE,5,5,100,12 + EDITTEXT IDC_EDTMESSAGE,105,5,100,12 + LTEXT "Time to display, min (Max=3)",IDC_LBLTIME,5,19,100,12 + EDITTEXT IDC_EDTTIME,105,19,100,12 + LTEXT "Send attempt time, min (Max=3)",IDC_LBLATTEMPTTIME,5,33,100,12 + EDITTEXT IDC_EDTATTEMPTTIME,105,33,100,12 + LTEXT "Pitside may hang for up to 60s on next message send\nif previous attempt failed or was aborted",IDC_LBLMESSAGE2,5,47,195,24 + PUSHBUTTON "OK", IDOK, 5,67,95,18 + PUSHBUTTON "Cancel", IDCANCEL, 100,67,95,18 +END + +// Dialog box for setting sector split points +IDD_SETSPLITPOINTS DIALOG 50, 50, 400, 300 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_TABSTOP +CAPTION "Set Sector Split Points" +FONT 10, "MS Shell Dlg" +BEGIN + CTEXT "Left-Click on the map, then choose your split point\n(Clear All to end sector displaying)",IDC_LBLSPLIT1,5,5,390,25 + PUSHBUTTON "Set Split 1", IDC_SETSPLIT1, 5,30,50,20 + PUSHBUTTON "Set Split 2", IDC_SETSPLIT2, 5,55,50,20 + PUSHBUTTON "Set Split 3", IDC_SETSPLIT3, 5,80,50,20 + PUSHBUTTON "Set Split 4", IDC_SETSPLIT4, 5,105,50,20 + PUSHBUTTON "Set Split 5", IDC_SETSPLIT5, 5,130,50,20 + PUSHBUTTON "Set Split 6", IDC_SETSPLIT6, 5,155,50,20 + PUSHBUTTON "Set Split 7", IDC_SETSPLIT7, 5,180,50,20 + PUSHBUTTON "Set Split 8", IDC_SETSPLIT8, 5,205,50,20 + PUSHBUTTON "Clear All", IDRESET, 5,250,50,20 + LTEXT "",IDC_LBLSPLITMAP,60,27,335,250 + PUSHBUTTON "OK", IDOK, 5,280,195,20 + PUSHBUTTON "Cancel", IDCANCEL, 200,280,195,20 +END + +// Dialog box for displaying all data for a given point +IDD_ALLDATADISPLAY DIALOG 250, 75, 400, 250 +STYLE DS_MODALFRAME | WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Data Point Information" +FONT 10, "MS Shell Dlg" +BEGIN + CTEXT "****Data Details****", IDC_RACE_TITLE, 5,5,365,12 + CONTROL "", IDC_ALLDATADISPLAY, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,20,390,225 +END + +// Dialog box for displaying sector split times +IDD_SHOWSECTORS DIALOG 250, 75, 380, 99 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION +CAPTION "Sector Times" +FONT 9, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_SHOW_SECTORS, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,380,99 +END + +// dialog for selecting which race in a DB we want to use +IDD_SELECTRACE DIALOG 150, 200, 200, 200 +STYLE DS_MODALFRAME | WS_POPUP | DS_SETFONT | WS_CAPTION | WS_SYSMENU +CAPTION "Select one or more race sessions to load" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT/* | LVS_SINGLESEL*/ | LVS_SHOWSELALWAYS, 0,0,200,180 + PUSHBUTTON "OK", IDOK, 5,180,95,20 + PUSHBUTTON "Cancel", IDCANCEL, 100,180,95,20 +END + +// dialog for selecting which race sessions in DB we want to use for T&S +IDD_SELECTSESSIONS DIALOG 150, 200, 200, 200 +STYLE DS_MODALFRAME | WS_POPUP | DS_SETFONT | WS_CAPTION | WS_SYSMENU +CAPTION "Select T&S Race Sessions (MAX = 50)" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,200,180 + PUSHBUTTON "OK", IDOK, 5,180,95,20 + PUSHBUTTON "Cancel", IDCANCEL, 100,180,95,20 +END + +// dialog for displaying T&S data results +IDD_TIMINGSCORING DIALOG 150, 200, 500, 390 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_MINIMIZEBOX +CAPTION "Best Laps & Race Standings from Selected Sessions" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_TIMINGSCORING, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 5,0,298,370 + CTEXT "****RACE STANDINGS****", IDC_RACE_TITLE, 308,10,187,12 + CTEXT "", IDC_RACE_PROGRESS, 308,25,187,12 + CONTROL "", IDC_RACESCORING, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_SHOWSELALWAYS, 308,40,187,240 + PUSHBUTTON "Save Results", IDC_RACE_SAVE, 313,285,85,15 + PUSHBUTTON "Re-Run Race Scenario", IDC_RACE_RERUN, 400,285,85,15 + CTEXT "Enter race information below", IDC_RACE_INFO, 308,305,187,12 EDITTEXT IDC_RACE_COMMENT,308,318,187,12 - PUSHBUTTON "Start Race", IDSTARTRACE, 313,335,177,20 - PUSHBUTTON "End Race", IDENDRACE, 313,360,177,20 - PUSHBUTTON "Refresh", IDRESCAN, 5,370,149,20 - PUSHBUTTON "Close", IDCANCEL, 154,370,149,20 -END - -// dialog for choosing Start/End times for T&S -IDD_RACE_RERUN DIALOG 250, 250, 200, 120 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU -CAPTION "Enter Time Markers" -FONT 8, "MS Shell Dlg" -BEGIN - CTEXT "Enter START marker from .txt file", IDC_RACE_START_TEXT, 5,5,190,12 + PUSHBUTTON "Start Race", IDSTARTRACE, 313,335,177,20 + PUSHBUTTON "End Race", IDENDRACE, 313,360,177,20 + PUSHBUTTON "Refresh", IDRESCAN, 5,370,149,20 + PUSHBUTTON "Close", IDCANCEL, 154,370,149,20 +END + +// dialog for choosing Start/End times for T&S +IDD_RACE_RERUN DIALOG 250, 250, 200, 120 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU +CAPTION "Enter Time Markers" +FONT 8, "MS Shell Dlg" +BEGIN + CTEXT "Enter START marker from .txt file", IDC_RACE_START_TEXT, 5,5,190,12 EDITTEXT IDC_RACE_START,5,25,190,12 - CTEXT "Enter END marker from .txt file", IDC_RACE_END_TEXT, 5,60,190,12 + CTEXT "Enter END marker from .txt file", IDC_RACE_END_TEXT, 5,60,190,12 EDITTEXT IDC_RACE_END,5,80,190,12 - PUSHBUTTON "OK", IDOK, 5,100,95,20 - PUSHBUTTON "Cancel", IDCANCEL, 100,100,95,20 -END - -// dialog for selecting which race in a DB we want to edit -IDD_SELECTRACEEDIT DIALOG 150, 200, 200, 213 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU -CAPTION "Select race(s) to edit" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,200,180 - PUSHBUTTON "Rename", IDC_RACEEDIT_RENAME, 5,180,95,12 - PUSHBUTTON "Merge", IDC_RACEEDIT_MERGE, 100,180,95,12 - PUSHBUTTON "OK", IDOK, 5,193,95,20 - PUSHBUTTON "Cancel", IDCANCEL, 100,193,95,20 -END - -// confirm dialog for editing races in a DB -IDD_RACEEDITCONFIRM DIALOG 350, 200, 250, 125 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU -CAPTION "**WARNING**" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Are you sure you want to merge these race sessions?\n\nONLY merge race sessions that are on the same track!\n\nEven then, Start/Finish differences will disrupt graphs such as Time Slip.\n\n\nTHIS OPERATION CANNOT BE UNDONE",IDC_LBLMESSAGE3,5,5,245,90 - PUSHBUTTON "Merge", IDOK, 5,100,120,24 - PUSHBUTTON "Cancel", IDCANCEL, 125,100,120,24 -END - -// About... dialog with hyperlink now -IDD_ABOUT DIALOG 300, 125, 250, 325 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME -CAPTION "About Pitside Console" -FONT 8, "MS Shell Dlg" -BEGIN - CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0016\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 - CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 - PUSHBUTTON "OK", IDOK, 5,290,240,30 -END - -// name input dialog for renaming races in a DB -IDD_RACENAMECHANGE DIALOG 350, 200, 200, 85 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU -CAPTION "Enter New Race Session Name" -FONT 8, "MS Shell Dlg" -BEGIN - LTEXT "Race Session(s) name?",IDC_LBLMESSAGE4,5,5,100,12 - EDITTEXT IDC_EDTMESSAGE2,5,25,190,12 - PUSHBUTTON "Rename", IDOK, 5,67,95,18 - PUSHBUTTON "Cancel", IDCANCEL, 100,67,95,18 -END - + PUSHBUTTON "OK", IDOK, 5,100,95,20 + PUSHBUTTON "Cancel", IDCANCEL, 100,100,95,20 +END + +// dialog for selecting which race in a DB we want to edit +IDD_SELECTRACEEDIT DIALOG 150, 200, 200, 213 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU +CAPTION "Select race(s) to edit" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_RACE, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_SHOWSELALWAYS, 0,0,200,180 + PUSHBUTTON "Rename", IDC_RACEEDIT_RENAME, 5,180,95,12 + PUSHBUTTON "Merge", IDC_RACEEDIT_MERGE, 100,180,95,12 + PUSHBUTTON "OK", IDOK, 5,193,95,20 + PUSHBUTTON "Cancel", IDCANCEL, 100,193,95,20 +END + +// confirm dialog for editing races in a DB +IDD_RACEEDITCONFIRM DIALOG 350, 200, 250, 125 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU +CAPTION "**WARNING**" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Are you sure you want to merge these race sessions?\n\nONLY merge race sessions that are on the same track!\n\nEven then, Start/Finish differences will disrupt graphs such as Time Slip.\n\n\nTHIS OPERATION CANNOT BE UNDONE",IDC_LBLMESSAGE3,5,5,245,90 + PUSHBUTTON "Merge", IDOK, 5,100,120,24 + PUSHBUTTON "Cancel", IDCANCEL, 125,100,120,24 +END + +// About... dialog with hyperlink now +IDD_ABOUT DIALOG 300, 125, 250, 325 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME +CAPTION "About Pitside Console" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0017\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 + PUSHBUTTON "OK", IDOK, 5,290,240,30 +END + +// name input dialog for renaming races in a DB +IDD_RACENAMECHANGE DIALOG 350, 200, 200, 85 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU +CAPTION "Enter New Race Session Name" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Race Session(s) name?",IDC_LBLMESSAGE4,5,5,100,12 + EDITTEXT IDC_EDTMESSAGE2,5,25,190,12 + PUSHBUTTON "Rename", IDOK, 5,67,95,18 + PUSHBUTTON "Cancel", IDCANCEL, 100,67,95,18 +END + // dialog for selecting plotting preferences IDD_PLOTPREFS DIALOG 250, 120, 524, 312 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX @@ -222,7 +222,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A1,305,32,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B1,342,32,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C1,379,32,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD1, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,32,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD1, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,32,100,200 LTEXT " 2: ", IDC_PLOTTYPE_CHANNEL2,5,44,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH2,105,44,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE2,150,44,45,12 @@ -232,7 +232,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A2,305,44,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B2,342,44,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C2,379,44,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD2, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,44,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD2, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,44,100,200 LTEXT " 3: ", IDC_PLOTTYPE_CHANNEL3,5,56,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH3,105,56,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE3,150,56,45,12 @@ -242,7 +242,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A3,305,56,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B3,342,56,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C3,379,56,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD3, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,56,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD3, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,56,100,200 LTEXT " 4: ", IDC_PLOTTYPE_CHANNEL4,5,68,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH4,105,68,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE4,150,68,45,12 @@ -252,7 +252,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A4,305,68,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B4,342,68,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C4,379,68,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD4, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,68,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD4, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,68,100,200 LTEXT " 5: ", IDC_PLOTTYPE_CHANNEL5,5,80,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH5,105,80,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE5,150,80,45,12 @@ -262,7 +262,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A5,305,80,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B5,342,80,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C5,379,80,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD5, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,80,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD5, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,80,100,200 LTEXT " 6: ", IDC_PLOTTYPE_CHANNEL6,5,92,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH6,105,92,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE6,150,92,45,12 @@ -272,7 +272,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A6,305,92,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B6,342,92,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C6,379,92,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD6, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,92,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD6, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,92,100,200 LTEXT " 7: ", IDC_PLOTTYPE_CHANNEL7,5,104,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH7,105,104,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE7,150,104,45,12 @@ -282,7 +282,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A7,305,104,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B7,342,104,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C7,379,104,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD7, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,104,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD7, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,104,100,200 LTEXT " 8: ", IDC_PLOTTYPE_CHANNEL8,5,116,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH8,105,116,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE8,150,116,45,12 @@ -292,7 +292,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A8,305,116,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B8,342,116,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C8,379,116,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD8, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,116,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD8, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,116,100,200 LTEXT " 9: ", IDC_PLOTTYPE_CHANNEL9,5,128,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH9,105,128,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE9,150,128,45,12 @@ -302,7 +302,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A9,305,128,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B9,342,128,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C9,379,128,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD9, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,128,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD9, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,128,100,200 LTEXT "10: ", IDC_PLOTTYPE_CHANNEL10,5,140,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH10,105,140,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE10,150,140,45,12 @@ -312,7 +312,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A10,305,140,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B10,342,140,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C10,379,140,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD10, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,140,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD10, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,140,100,200 LTEXT "11: ", IDC_PLOTTYPE_CHANNEL11,5,152,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH11,105,152,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE11,150,152,45,12 @@ -322,7 +322,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A11,305,152,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B11,342,152,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C11,379,152,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD11, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,152,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD11, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,152,100,200 LTEXT "12: ", IDC_PLOTTYPE_CHANNEL12,5,164,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH12,105,164,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE12,150,164,45,12 @@ -332,7 +332,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A12,305,164,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B12,342,164,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C12,379,164,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD12, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,164,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD12, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,164,100,200 LTEXT "13: ", IDC_PLOTTYPE_CHANNEL13,5,176,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH13,105,176,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE13,150,176,45,12 @@ -342,7 +342,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A13,305,176,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B13,342,176,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C13,379,176,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD13, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,176,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD13, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,176,100,200 LTEXT "14: ", IDC_PLOTTYPE_CHANNEL14,5,188,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH14,105,188,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE14,150,188,45,12 @@ -352,7 +352,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A14,305,188,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B14,342,188,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C14,379,188,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD14, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,188,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD14, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,188,100,200 LTEXT "15: ", IDC_PLOTTYPE_CHANNEL15,5,200,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH15,105,200,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE15,150,200,45,12 @@ -362,7 +362,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A15,305,200,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B15,342,200,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C15,379,200,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD15, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,200,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD15, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,200,100,200 LTEXT "16: ", IDC_PLOTTYPE_CHANNEL16,5,212,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH16,105,212,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE16,150,212,45,12 @@ -372,7 +372,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A16,305,212,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B16,342,212,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C16,379,212,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD16, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,212,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD16, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,212,100,200 LTEXT "17: ", IDC_PLOTTYPE_CHANNEL17,5,224,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH17,105,224,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE17,150,224,45,12 @@ -382,7 +382,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A17,305,224,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B17,342,224,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C17,379,224,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD17, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,224,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD17, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,224,100,200 LTEXT "18: ", IDC_PLOTTYPE_CHANNEL18,5,236,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH18,105,236,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE18,150,236,45,12 @@ -392,7 +392,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A18,305,236,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B18,342,236,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C18,379,236,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD18, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,236,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD18, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,236,100,200 LTEXT "19: ", IDC_PLOTTYPE_CHANNEL19,5,248,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH19,105,248,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE19,150,248,45,12 @@ -402,7 +402,7 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A19,305,248,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B19,342,248,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C19,379,248,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD19, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,248,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD19, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,248,100,200 LTEXT "20: ", IDC_PLOTTYPE_CHANNEL20,5,260,100,12 AUTORADIOBUTTON "Graph",IDC_PLOTTYPE_GRAPH20,105,260,45,12 AUTORADIOBUTTON "Value",IDC_PLOTTYPE_VALUE20,150,260,45,12 @@ -412,91 +412,91 @@ BEGIN EDITTEXT IDC_PLOTTYPE_TRANS_A20,305,260,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_B20,342,260,32,12 EDITTEXT IDC_PLOTTYPE_TRANS_C20,379,260,32,12 - CONTROL "", IDC_PLOTTYPE_LOAD20, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,260,100,200 + CONTROL "", IDC_PLOTTYPE_LOAD20, WC_COMBOBOX, CBS_DROPDOWNLIST |CBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE, 415,260,100,200 PUSHBUTTON "Rescan/Reset", IDC_PLOTTYPE_RESCAN, 122,275,180,12 PUSHBUTTON "OK", IDOK, 5,290,207,22 PUSHBUTTON "Cancel", IDCANCEL, 212,290,207,22 END - - -IDD_PROGRESS DIALOG 250, 150, 200, 50 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT -CAPTION "Working..." -FONT 8, "MS Shell Dlg" -BEGIN -END - -IDD_WARNING DIALOG 300, 250, 250, 150 -STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU -CAPTION "*****WARNING*****" -FONT 8, "MS Shell Dlg" -BEGIN - CTEXT "",IDC_WARNING1,5,5,245,100 - PUSHBUTTON "OK", IDOK, 5,100,240,50 -END - + + +IDD_PROGRESS DIALOG 250, 150, 200, 50 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT +CAPTION "Working..." +FONT 8, "MS Shell Dlg" +BEGIN +END + +IDD_WARNING DIALOG 300, 250, 250, 150 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | DS_SETFONT | WS_SYSMENU +CAPTION "*****WARNING*****" +FONT 8, "MS Shell Dlg" +BEGIN + CTEXT "",IDC_WARNING1,5,5,245,100 + PUSHBUTTON "OK", IDOK, 5,100,240,50 +END + //hMenu MENU DISCARDABLE -IDM_OPTIONS MENU +IDM_OPTIONS MENU BEGIN -POPUP "&File" - BEGIN - MENUITEM "Open .wflp DB", ID_DATA_OPENDB - MENUITEM "Switch Race Session", ID_DATA_SWITCHSESSION - MENUITEM "Edit/Merge Race Sessions", ID_DATA_EDITSESSION - MENUITEM SEPARATOR - MENUITEM "Print...", IDM_PRINT_BM +POPUP "&File" + BEGIN + MENUITEM "Open .wflp DB", ID_DATA_OPENDB + MENUITEM "Switch Race Session", ID_DATA_SWITCHSESSION + MENUITEM "Edit/Merge Race Sessions", ID_DATA_EDITSESSION + MENUITEM SEPARATOR + MENUITEM "Print...", IDM_PRINT_BM MENUITEM SEPARATOR - MENUITEM "Export selected laps to CSV format", ID_DATA_DASHWARE - MENUITEM SEPARATOR - MENUITEM "Exit", ID_FILE_EXIT - END -POPUP "&Edit" - BEGIN - MENUITEM "Copy", ID_EDIT_COPY + MENUITEM "Export selected laps to CSV format", ID_DATA_DASHWARE + MENUITEM SEPARATOR + MENUITEM "Exit", ID_FILE_EXIT + END +POPUP "&Edit" + BEGIN + MENUITEM "Copy", ID_EDIT_COPY MENUITEM "Save Image", IDM_SAVE_BM - END -POPUP "&Graphing" - BEGIN - MENUITEM "Km/h", ID_OPTIONS_KMH - MENUITEM "MPH", ID_OPTIONS_MPH - MENUITEM "m/s", ID_OPTIONS_MS - MENUITEM SEPARATOR - MENUITEM "X-Axis in KM", ID_OPTIONS_XAXIS_KM - MENUITEM "X-Axis in LAT", ID_OPTIONS_XAXIS_LAT - MENUITEM SEPARATOR - MENUITEM "Set Split Points", ID_OPTIONS_SETSPLITS - MENUITEM "Cancel Split Points", ID_OPTIONS_CANCELSPLITS - MENUITEM SEPARATOR - MENUITEM "Show Traction Circle", ID_OPTIONS_TRACTIONCIRCLE - MENUITEM SEPARATOR - MENUITEM "Show all-time bests",ID_OPTIONS_SHOWBESTS - MENUITEM "Show driver bests",ID_OPTIONS_SHOWDRIVERBESTS - MENUITEM "Show Reference Lap",ID_OPTIONS_SHOWREFERENCELAP - MENUITEM SEPARATOR - MENUITEM "Smooth Accelerometer Graphs", ID_OPTIONS_SMOOTH - MENUITEM "Draw lines between data points",ID_OPTIONS_DRAWLINES - MENUITEM "Use dark background for plots",ID_OPTIONS_BACKGROUND - MENUITEM SEPARATOR - MENUITEM "Force plotted data to fixed scales",ID_OPTIONS_IOIO5VSCALE - MENUITEM SEPARATOR + END +POPUP "&Graphing" + BEGIN + MENUITEM "Km/h", ID_OPTIONS_KMH + MENUITEM "MPH", ID_OPTIONS_MPH + MENUITEM "m/s", ID_OPTIONS_MS + MENUITEM SEPARATOR + MENUITEM "X-Axis in KM", ID_OPTIONS_XAXIS_KM + MENUITEM "X-Axis in LAT", ID_OPTIONS_XAXIS_LAT + MENUITEM SEPARATOR + MENUITEM "Set Split Points", ID_OPTIONS_SETSPLITS + MENUITEM "Cancel Split Points", ID_OPTIONS_CANCELSPLITS + MENUITEM SEPARATOR + MENUITEM "Show Traction Circle", ID_OPTIONS_TRACTIONCIRCLE + MENUITEM SEPARATOR + MENUITEM "Show all-time bests",ID_OPTIONS_SHOWBESTS + MENUITEM "Show driver bests",ID_OPTIONS_SHOWDRIVERBESTS + MENUITEM "Show Reference Lap",ID_OPTIONS_SHOWREFERENCELAP + MENUITEM SEPARATOR + MENUITEM "Smooth Accelerometer Graphs", ID_OPTIONS_SMOOTH + MENUITEM "Draw lines between data points",ID_OPTIONS_DRAWLINES + MENUITEM "Use dark background for plots",ID_OPTIONS_BACKGROUND + MENUITEM SEPARATOR + MENUITEM "Force plotted data to fixed scales",ID_OPTIONS_IOIO5VSCALE + MENUITEM SEPARATOR MENUITEM "Plotting Options...",ID_OPTIONS_PLOTPREFS - END - POPUP "&Phone Orientation" - BEGIN - MENUITEM "Vertical/Landscape", ID_OPTIONS_VERTICAL_LANDSCAPE - MENUITEM "Vertical/Portrait", ID_OPTIONS_VERTICAL_PORTRAIT - MENUITEM "Flat/Landscape", ID_OPTIONS_FLAT_LANDSCAPE - MENUITEM "Flat/Portrait", ID_OPTIONS_FLAT_PORTRAIT - END - POPUP "&Timing" - BEGIN - MENUITEM "Timing and Scoring", ID_TIMINGSCORING - END - POPUP "&Help" - BEGIN - MENUITEM "Show Pitside Help File", ID_HELP_SHOWHELP - MENUITEM "Show Wifilapper Help File", ID_HELP_SHOWWFLHELP - MENUITEM "Show IPs", ID_HELP_IPS - MENUITEM "About", ID_HELP_ABOUT - END -END + END + POPUP "&Phone Orientation" + BEGIN + MENUITEM "Vertical/Landscape", ID_OPTIONS_VERTICAL_LANDSCAPE + MENUITEM "Vertical/Portrait", ID_OPTIONS_VERTICAL_PORTRAIT + MENUITEM "Flat/Landscape", ID_OPTIONS_FLAT_LANDSCAPE + MENUITEM "Flat/Portrait", ID_OPTIONS_FLAT_PORTRAIT + END + POPUP "&Timing" + BEGIN + MENUITEM "Timing and Scoring", ID_TIMINGSCORING + END + POPUP "&Help" + BEGIN + MENUITEM "Show Pitside Help File", ID_HELP_SHOWHELP + MENUITEM "Show Wifilapper Help File", ID_HELP_SHOWWFLHELP + MENUITEM "Show IPs", ID_HELP_IPS + MENUITEM "About", ID_HELP_ABOUT + END +END diff --git a/PitsideConsole/PitsideConsole/SQLiteLapDB.cpp b/PitsideConsole/PitsideConsole/SQLiteLapDB.cpp index 9fae7d1..9d4275e 100644 --- a/PitsideConsole/PitsideConsole/SQLiteLapDB.cpp +++ b/PitsideConsole/PitsideConsole/SQLiteLapDB.cpp @@ -1,532 +1,534 @@ -#include "stdafx.h" -#include "LapReceiver.h" -#include "PitsideConsole.h" -#include "ArtUI.h" -#include "SQLiteLapDB.h" -#include "LapData.h" -class CSQLiteLap : public ILap -{ -public: - CSQLiteLap(CSfArtSQLiteDB& sfDB, ILapReceiver* pWriteBack) : m_sfDB(sfDB),m_pWriteBack(pWriteBack), m_fLoaded(false) {}; - virtual ~CSQLiteLap() {}; - -public: // ILap overrides - virtual void Load(V1InputLapRaw* pLap) override - { - DASSERT(false); // this should never be called - memory laps should be loaded instead. - } - virtual void Load(V2InputLapRaw* pLap) override - { - DASSERT(false); // this should never be called - memory laps should be loaded instead. - } - virtual bool Load(CSfArtSQLiteDB& db, StartFinish* rgSF, CSfArtSQLiteQuery& line) override - { - bool fSuccess = true; - fSuccess &= (line.GetCol(0, &m_iLapId)); - fSuccess &= (line.GetCol(1, &m_flLapTime)); - fSuccess &= (line.GetCol(2, &m_iStartTime)); - - TCHAR szComment[200]; - szComment[0] = 0; - fSuccess &= (line.GetCol(3, szComment, NUMCHARS(szComment))); - m_strComment = wstring(szComment); - - memcpy(this->m_rgSF, rgSF, sizeof(this->m_rgSF)); - - return fSuccess; - } - virtual void Free()override {delete this;}; - - virtual bool IsValid() const override {return m_flLapTime < 3600 && m_flLapTime > 3.0 && m_iLapId != -1;}; - virtual int GetStartTime() const override {return m_iStartTime;} - virtual int GetLapId() const override {return m_iLapId;} - virtual float GetTime() const override {return m_flLapTime;} - virtual wstring GetComment() const override {return m_strComment;} - virtual void SetComment(wstring strComment) const override - { - m_strComment = strComment; - m_pWriteBack->AddComment(m_iLapId,strComment.c_str()); - } - virtual const vector GetPoints() const override - { - vector lstPoints; - bool fSuccess = false; - // they're asking for points. This is where stuff gets expensive - // now we need to get all the datapoints for this lap (data channels will come later) - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select points.x,points.y,points.time,points.velocity from points where points.lapid = %d", m_iLapId); - CSfArtSQLiteQuery sfPointQuery(m_sfDB); - if(sfPointQuery.Init(szQuery)) - { - while(sfPointQuery.Next()) - { - TimePoint2D pt; - fSuccess &= sfPointQuery.GetCol(0,&pt.flX); - fSuccess &= sfPointQuery.GetCol(1,&pt.flY); - fSuccess &= sfPointQuery.GetCol(2,&pt.iTime); - fSuccess &= sfPointQuery.GetCol(3,&pt.flVelocity); - pt.flSum = pt.flX + pt.flY; - DASSERT(pt.IsValid()); - if(pt.IsValid()) - { - lstPoints.push_back(pt); - } - } - } - return lstPoints; - } - virtual const StartFinish* GetSF() const override {return m_rgSF;} - virtual CARNUMBERCOMBO GetCarNumbers() const override - { - DASSERT(FALSE); // nobody should be calling this on an SQLite lap - CARNUMBERCOMBO sfCars; - sfCars.iCarNumber = -1; - sfCars.iSecondaryCarNumber = -1; - return sfCars; - } -public: // general CSQLiteLap functioning - -private: - CSfArtSQLiteDB& m_sfDB; - mutable ILapReceiver* m_pWriteBack; - - bool m_fLoaded; - - int m_iStartTime; - int m_iLapId; - float m_flLapTime; - mutable wstring m_strComment; -// StartFinish m_rgSF[3]; - StartFinish m_rgSF[50]; // Increased by KDJ -}; - -////////////////////////////////////////////////////////////// -static LPCTSTR CREATE_RACE_SQL_V20 = L"create table races ( _id integer primary key asc autoincrement, " \ - L"\"name\" string, " \ - L"\"date\" string, " \ - L"\"testmode\" integer, " \ - L"x1 real, " \ - L"y1 real, " \ - L"x2 real, " \ - L"y2 real, " \ - L"x3 real, " \ - L"y3 real, " \ - L"x4 real, " \ - L"y4 real, " \ - L"x5 real, " \ - L"y5 real, " \ - L"x6 real, " \ - L"y6 real, " \ - L"vx1 real," \ - L"vy1 real," \ - L"vx2 real," \ - L"vy2 real," \ - L"vx3 real," \ - L"vy3 real)"; - -static LPCTSTR CREATE_RACE_SQL_V21 = L"create table races ( _id integer primary key asc autoincrement, " \ - L"\"name\" string, " \ - L"\"date\" string, " \ - L"\"testmode\" integer, " \ - L"x1 real, " \ - L"y1 real, " \ - L"x2 real, " \ - L"y2 real, " \ - L"x3 real, " \ - L"y3 real, " \ - L"x4 real, " \ - L"y4 real, " \ - L"x5 real, " \ - L"y5 real, " \ - L"x6 real, " \ - L"y6 real, " \ - L"vx1 real," \ - L"vy1 real," \ - L"vx2 real," \ - L"vy2 real," \ - L"vx3 real," \ - L"vy3 real," \ - L"p2p integer not null default 0)"; - -static LPCTSTR CREATE_RACE_SQL_V22 = L"create table races ( _id integer primary key asc autoincrement, " \ - L"\"name\" string, " \ - L"\"date\" string, " \ - L"\"testmode\" integer, " \ - L"x1 real, " \ - L"y1 real, " \ - L"x2 real, " \ - L"y2 real, " \ - L"x3 real, " \ - L"y3 real, " \ - L"x4 real, " \ - L"y4 real, " \ - L"x5 real, " \ - L"y5 real, " \ - L"x6 real, " \ - L"y6 real, " \ - L"vx1 real," \ - L"vy1 real," \ - L"vx2 real," \ - L"vy2 real," \ - L"vx3 real," \ - L"vy3 real," \ - L"p2p integer not null default 0," \ - L"finishcount integer not null default 1)"; - -static LPCTSTR CREATE_LAPS_SQL = L"create table laps " \ - L"(_id integer primary key asc autoincrement, " \ - L"laptime real, " \ - L"unixtime integer, " \ - L"transmitted integer, " \ - L"raceid integer," \ - L"foreign key (raceid) references races(_id))"; - -static LPCTSTR CREATE_POINTS_SQL = L"create table points " \ - L"(_id integer primary key asc autoincrement, " \ - L"x real," \ - L"y real," \ - L"time integer," \ - L"velocity real," \ - L"lapid integer," \ - L"foreign key (lapid) references laps(_id))"; - -static LPCTSTR CREATE_CHANNELS_SQL = L"create table channels" \ - L"(_id integer primary key asc autoincrement, " \ - L"lapid integer NOT NULL," \ - L"channeltype integer NOT NULL," \ - L"foreign key(lapid) references laps(_id))"; - -static LPCTSTR CREATE_DATA_SQL =L"create table data " \ - L"(_id integer primary key asc autoincrement," \ - L"time integer NOT NULL," \ - L"value real NOT NULL," \ - L"channelid integer NOT NULL," \ - L"foreign key (channelid) references channels(_id))"; - -static LPCTSTR CREATE_EXTRA_SQL =L"create table extras " \ - L"(_id integer primary key asc autoincrement," \ - L"comment string," \ - L"lapid integer NOT NULL unique on conflict fail," \ - L"foreign key (lapid) references laps(_id))"; - -static LPCTSTR CREATE_INDICES =L"create index data_channelid on data(channelid);" \ - L"create index if not exists points_lapid on points(lapid);" \ - L"create index if not exists laps_raceid on laps(raceid)"; - -static LPCTSTR rgRequiredTables20[] = {CREATE_RACE_SQL_V20, CREATE_LAPS_SQL, CREATE_POINTS_SQL, CREATE_CHANNELS_SQL, CREATE_DATA_SQL, NULL}; -static LPCTSTR rgRequiredTables21[] = {CREATE_RACE_SQL_V21, CREATE_LAPS_SQL, CREATE_POINTS_SQL, CREATE_CHANNELS_SQL, CREATE_DATA_SQL, NULL}; -static LPCTSTR rgRequiredTables23[] = {CREATE_RACE_SQL_V22, CREATE_LAPS_SQL, CREATE_POINTS_SQL, CREATE_CHANNELS_SQL, CREATE_DATA_SQL, CREATE_EXTRA_SQL}; - -static LPCTSTR* rgSchemaList[] = -{ - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables20, - rgRequiredTables21, - rgRequiredTables21, - rgRequiredTables23 -}; - -const static int iMinSupportedVersion = 0; -const static int iMaxSupportedVersion = 23; -////////////////////////////////////////////////////////////// -bool CSQLiteLapDB::Init(LPCTSTR lpszPath) -{ - if(!DoesFileExist(lpszPath)) - { - vector lstSQL; - HRESULT hr = m_sfDB.Open(lpszPath, lstSQL); - if(SUCCEEDED(hr)) - { - for(int x = 0;x < 6; x++) - { - hr = E_FAIL; - CSfArtSQLiteQuery sfInsert(m_sfDB); - if(sfInsert.Init(rgSchemaList[iMaxSupportedVersion][x])) - { - if(sfInsert.Next()) - { - hr = S_OK; - } - if(sfInsert.IsDone()) - { - hr = S_OK; - } - } - if(FAILED(hr)) - break; - } - } - return SUCCEEDED(hr); - } - else - { - int iFindFailures = 0; - int ixFoundVersion = -1; - vector lstSQL; - HRESULT hr = m_sfDB.Open(lpszPath, lstSQL); - if(SUCCEEDED(hr)) - { - // find a schema version that matches - for(int ixVersion = iMaxSupportedVersion; ixVersion >= iMinSupportedVersion; ixVersion--) - { - bool fFoundAll = true; - for(int x = 0; x < 6 && fFoundAll; x++) - { - // we want to find rgSchemaList[ixVersion][x] in the lstSQL that we got from the DB. - if(!rgSchemaList[ixVersion][x]) continue; // don't need to find this one - - bool fFound = false; - for(int y = 0; y < lstSQL.size(); y++) - { - if(wcsstr(lstSQL[y].c_str(),L"android_metadata") != NULL) continue; // don't care about this table - if(nospacecompare(lstSQL[y].c_str(),rgSchemaList[ixVersion][x]) == 0) - { - fFound = true; - break; - } - } - if(!fFound) - { - iFindFailures++; - } - - fFoundAll = fFoundAll && fFound; - } - if(fFoundAll) - { - ixFoundVersion = ixVersion; - break; - } - } - - if(ixFoundVersion < 0) - { - DASSERT(FALSE); - // we didn't find or create all our required tables... - hr = E_FAIL; - } - - - if(SUCCEEDED(hr) && ixFoundVersion < 23) - { - // upgrade! - CSfArtSQLiteQuery sfQuery(m_sfDB); - if(sfQuery.Init(CREATE_EXTRA_SQL)) - { - while(sfQuery.Next()) - { - } - DASSERT(sfQuery.IsDone()); - } - } - /*if(ixFoundVersion < ...) future upgrades... - { - }*/ - } - return SUCCEEDED(hr); - } - -} -////////////////////////////////////////////////////////////// -bool CSQLiteLapDB::InitRaceSession(int* piRaceId, LPCTSTR lpszRaceName) -{ - AutoLeaveCS _cs(&m_cs); - bool fSuccess = true; - CSfArtSQLiteQuery sfQuery(m_sfDB); - if(sfQuery.Init(L"insert into races (name,date) values (?,?)")) - { - sfQuery.BindValue(lpszRaceName); - sfQuery.BindValue(GetSecondsSince1970()); - if(sfQuery.Next() || sfQuery.IsDone()) - { - // inserted new data, hooray! - long long lastInsert = m_sfDB.GetLastInsertId(); - *piRaceId = lastInsert; - return true; - } - } - return false; -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::DeInit() -{ - AutoLeaveCS _cs(&m_cs); - m_sfDB.Close(); -} -////////////////////////////////////////////////////////////// -ILap* CSQLiteLapDB::AllocateLap(bool fMemory) -{ - if(fMemory) - { - return new CMemoryLap(); - } - else - { - return new CSQLiteLap(m_sfDB, this); - } -} -////////////////////////////////////////////////////////////// -IDataChannel* CSQLiteLapDB::AllocateDataChannel() const -{ - AutoLeaveCS _cs(&m_cs); - cChannels++; - return new CDataChannel(); -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::FreeDataChannel(IDataChannel* pChannel) const -{ - AutoLeaveCS _cs(&m_cs); - cChannels--; - delete pChannel; -} -////////////////////////////////////////////////////////////// -int CSQLiteLapDB::GetLastReceivedRaceId() const -{ - AutoLeaveCS _cs(&m_cs); - DASSERT(m_iLastRaceId >= 0); // you shouldn't be calling this unless there's evidence we've received a lap! - return m_iLastRaceId; -} -////////////////////////////////////////////////////////////// -bool CSQLiteLapDB::IsActivelyReceiving(int iRaceId) const -{ - AutoLeaveCS _cs(&m_cs); - return this->m_setReceivingIds.find(iRaceId) != m_setReceivingIds.end(); -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::GetLastLapTimeStamp(const vector& lstCarNumbers, vector& lstTimeStamps) const -{ - AutoLeaveCS _cs(&m_cs); - for(int x = 0;x < lstCarNumbers.size(); x++) - { - const int iCar = lstCarNumbers[x]; - unsigned int msLatestTime = 0; - { - for(map::const_iterator i = mapCarNumberRaceIds.begin(); i != mapCarNumberRaceIds.end(); i++) - { - if(i->first.iCarNumber == iCar) - { - const int iRaceId = i->second; - map::const_iterator found = mapLastRaceTimes.find(iRaceId); - if(found != mapLastRaceTimes.end()) - { - const int msLastLapTime = found->second; - msLatestTime = max(msLatestTime, msLastLapTime); // figures out which one came later - } - else - { - // nothing to do, this race doesn't have a last lap time - } - } - } - lstTimeStamps.push_back(msLatestTime); - } - } -} -////////////////////////////////////////////////////////////// -vector CSQLiteLapDB::GetScoring(int iRaceId) -{ - AutoLeaveCS _cs(&m_cs); - vector lstLaps; - // gotta load all the laps that are in the DB, but we don't want to fully load them, just their laptimes and other directly lap-related data - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"Select laps._id,laps.laptime, laps.unixtime,extras.comment from laps left join extras on extras.lapid = laps._id where laps.raceid=%d", iRaceId); - if(sfQuery.Init(szQuery)) - { - while(sfQuery.Next()) - { - CSQLiteLap* pLap = (CSQLiteLap*)AllocateLap(false); - pLap->Load(m_sfDB,m_rgSF,sfQuery); - if(pLap->IsValid()) - { - lstLaps.push_back(pLap); - } - } - } - return lstLaps; -} -////////////////////////////////////////////////////////////// -int CSQLiteLapDB::GetLapCount(int iRaceId) const -{ - AutoLeaveCS _cs(&m_cs); - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select count(laps._id) from races,laps where races._id = %d and laps.raceid=races._id group by races._id", iRaceId); - - if(sfQuery.Init(szQuery)) - { - while(sfQuery.Next()) - { - int cLaps = 0; - if(sfQuery.GetCol(0,&cLaps)) - { - return cLaps; - } - } - } - return 0; -} -////////////////////////////////////////////////////////////// -vector CSQLiteLapDB::GetRaces() -{ - AutoLeaveCS _cs(&m_cs); - vector lstRaces; - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select races.name,races.date,count(laps._id),races._id from races,laps where laps.raceid=races._id group by races._id"); - - if(sfQuery.Init(szQuery)) - { - while(sfQuery.Next()) - { - RACEDATA raceData; - TCHAR szData[1000]; - if(sfQuery.GetCol(0,szData,NUMCHARS(szData))) - { - raceData.strName = szData; - int iRaceDate = 0; - if(sfQuery.GetCol(1,&iRaceDate)) - { - raceData.unixtime = iRaceDate; - } - int cLaps = 0; - if(sfQuery.GetCol(2,&cLaps)) - { - raceData.laps = cLaps; - } - int iRaceId = 0; - if(sfQuery.GetCol(3,&iRaceId)) - { - raceData.raceId = iRaceId; - } - lstRaces.push_back(raceData); - } - } - } - return lstRaces; -} -////////////////////////////////////////////////////////////// -bool CSQLiteLapDB::MergeLaps(int m_iRaceId1, int m_iRaceId2) -{ +#include "stdafx.h" +#include "LapReceiver.h" +#include "PitsideConsole.h" +#include "ArtUI.h" +#include "SQLiteLapDB.h" +#include "LapData.h" +class CSQLiteLap : public ILap +{ +public: + vector vLastLapId; + + CSQLiteLap(CSfArtSQLiteDB& sfDB, ILapReceiver* pWriteBack) : m_sfDB(sfDB),m_pWriteBack(pWriteBack), m_fLoaded(false) {}; + virtual ~CSQLiteLap() {}; + +public: // ILap overrides + virtual void Load(V1InputLapRaw* pLap) override + { + DASSERT(false); // this should never be called - memory laps should be loaded instead. + } + virtual void Load(V2InputLapRaw* pLap) override + { + DASSERT(false); // this should never be called - memory laps should be loaded instead. + } + virtual bool Load(CSfArtSQLiteDB& db, StartFinish* rgSF, CSfArtSQLiteQuery& line) override + { + bool fSuccess = true; + fSuccess &= (line.GetCol(0, &m_iLapId)); + fSuccess &= (line.GetCol(1, &m_flLapTime)); + fSuccess &= (line.GetCol(2, &m_iStartTime)); + + TCHAR szComment[200]; + szComment[0] = 0; + fSuccess &= (line.GetCol(3, szComment, NUMCHARS(szComment))); + m_strComment = wstring(szComment); + + memcpy(this->m_rgSF, rgSF, sizeof(this->m_rgSF)); + + return fSuccess; + } + virtual void Free()override {delete this;}; + + virtual bool IsValid() const override {return m_flLapTime < 3600 && m_flLapTime > 3.0 && m_iLapId != -1;}; + virtual int GetStartTime() const override {return m_iStartTime;} + virtual int GetLapId() const override {return m_iLapId;} + virtual float GetTime() const override {return m_flLapTime;} + virtual wstring GetComment() const override {return m_strComment;} + virtual void SetComment(wstring strComment) const override + { + m_strComment = strComment; + m_pWriteBack->AddComment(m_iLapId,strComment.c_str()); + } + virtual const vector GetPoints() const override + { + vector lstPoints; + bool fSuccess = false; + // they're asking for points. This is where stuff gets expensive + // now we need to get all the datapoints for this lap (data channels will come later) + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select points.x,points.y,points.time,points.velocity from points where points.lapid = %d", m_iLapId); + CSfArtSQLiteQuery sfPointQuery(m_sfDB); + if(sfPointQuery.Init(szQuery)) + { + while(sfPointQuery.Next()) + { + TimePoint2D pt; + fSuccess &= sfPointQuery.GetCol(0,&pt.flX); + fSuccess &= sfPointQuery.GetCol(1,&pt.flY); + fSuccess &= sfPointQuery.GetCol(2,&pt.iTime); + fSuccess &= sfPointQuery.GetCol(3,&pt.flVelocity); + pt.flSum = pt.flX + pt.flY; + DASSERT(pt.IsValid()); + if(pt.IsValid()) + { + lstPoints.push_back(pt); + } + } + } + return lstPoints; + } + virtual const StartFinish* GetSF() const override {return m_rgSF;} + virtual CARNUMBERCOMBO GetCarNumbers() const override + { + DASSERT(FALSE); // nobody should be calling this on an SQLite lap + CARNUMBERCOMBO sfCars; + sfCars.iCarNumber = -1; + sfCars.iSecondaryCarNumber = -1; + return sfCars; + } +public: // general CSQLiteLap functioning + +private: + CSfArtSQLiteDB& m_sfDB; + mutable ILapReceiver* m_pWriteBack; + + bool m_fLoaded; + + int m_iStartTime; + int m_iLapId; + float m_flLapTime; + mutable wstring m_strComment; +// StartFinish m_rgSF[3]; + StartFinish m_rgSF[50]; // Increased by KDJ +}; + +////////////////////////////////////////////////////////////// +static LPCTSTR CREATE_RACE_SQL_V20 = L"create table races ( _id integer primary key asc autoincrement, " \ + L"\"name\" string, " \ + L"\"date\" string, " \ + L"\"testmode\" integer, " \ + L"x1 real, " \ + L"y1 real, " \ + L"x2 real, " \ + L"y2 real, " \ + L"x3 real, " \ + L"y3 real, " \ + L"x4 real, " \ + L"y4 real, " \ + L"x5 real, " \ + L"y5 real, " \ + L"x6 real, " \ + L"y6 real, " \ + L"vx1 real," \ + L"vy1 real," \ + L"vx2 real," \ + L"vy2 real," \ + L"vx3 real," \ + L"vy3 real)"; + +static LPCTSTR CREATE_RACE_SQL_V21 = L"create table races ( _id integer primary key asc autoincrement, " \ + L"\"name\" string, " \ + L"\"date\" string, " \ + L"\"testmode\" integer, " \ + L"x1 real, " \ + L"y1 real, " \ + L"x2 real, " \ + L"y2 real, " \ + L"x3 real, " \ + L"y3 real, " \ + L"x4 real, " \ + L"y4 real, " \ + L"x5 real, " \ + L"y5 real, " \ + L"x6 real, " \ + L"y6 real, " \ + L"vx1 real," \ + L"vy1 real," \ + L"vx2 real," \ + L"vy2 real," \ + L"vx3 real," \ + L"vy3 real," \ + L"p2p integer not null default 0)"; + +static LPCTSTR CREATE_RACE_SQL_V22 = L"create table races ( _id integer primary key asc autoincrement, " \ + L"\"name\" string, " \ + L"\"date\" string, " \ + L"\"testmode\" integer, " \ + L"x1 real, " \ + L"y1 real, " \ + L"x2 real, " \ + L"y2 real, " \ + L"x3 real, " \ + L"y3 real, " \ + L"x4 real, " \ + L"y4 real, " \ + L"x5 real, " \ + L"y5 real, " \ + L"x6 real, " \ + L"y6 real, " \ + L"vx1 real," \ + L"vy1 real," \ + L"vx2 real," \ + L"vy2 real," \ + L"vx3 real," \ + L"vy3 real," \ + L"p2p integer not null default 0," \ + L"finishcount integer not null default 1)"; + +static LPCTSTR CREATE_LAPS_SQL = L"create table laps " \ + L"(_id integer primary key asc autoincrement, " \ + L"laptime real, " \ + L"unixtime integer, " \ + L"transmitted integer, " \ + L"raceid integer," \ + L"foreign key (raceid) references races(_id))"; + +static LPCTSTR CREATE_POINTS_SQL = L"create table points " \ + L"(_id integer primary key asc autoincrement, " \ + L"x real," \ + L"y real," \ + L"time integer," \ + L"velocity real," \ + L"lapid integer," \ + L"foreign key (lapid) references laps(_id))"; + +static LPCTSTR CREATE_CHANNELS_SQL = L"create table channels" \ + L"(_id integer primary key asc autoincrement, " \ + L"lapid integer NOT NULL," \ + L"channeltype integer NOT NULL," \ + L"foreign key(lapid) references laps(_id))"; + +static LPCTSTR CREATE_DATA_SQL =L"create table data " \ + L"(_id integer primary key asc autoincrement," \ + L"time integer NOT NULL," \ + L"value real NOT NULL," \ + L"channelid integer NOT NULL," \ + L"foreign key (channelid) references channels(_id))"; + +static LPCTSTR CREATE_EXTRA_SQL =L"create table extras " \ + L"(_id integer primary key asc autoincrement," \ + L"comment string," \ + L"lapid integer NOT NULL unique on conflict fail," \ + L"foreign key (lapid) references laps(_id))"; + +static LPCTSTR CREATE_INDICES =L"create index data_channelid on data(channelid);" \ + L"create index if not exists points_lapid on points(lapid);" \ + L"create index if not exists laps_raceid on laps(raceid)"; + +static LPCTSTR rgRequiredTables20[] = {CREATE_RACE_SQL_V20, CREATE_LAPS_SQL, CREATE_POINTS_SQL, CREATE_CHANNELS_SQL, CREATE_DATA_SQL, NULL}; +static LPCTSTR rgRequiredTables21[] = {CREATE_RACE_SQL_V21, CREATE_LAPS_SQL, CREATE_POINTS_SQL, CREATE_CHANNELS_SQL, CREATE_DATA_SQL, NULL}; +static LPCTSTR rgRequiredTables23[] = {CREATE_RACE_SQL_V22, CREATE_LAPS_SQL, CREATE_POINTS_SQL, CREATE_CHANNELS_SQL, CREATE_DATA_SQL, CREATE_EXTRA_SQL}; + +static LPCTSTR* rgSchemaList[] = +{ + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables20, + rgRequiredTables21, + rgRequiredTables21, + rgRequiredTables23 +}; + +const static int iMinSupportedVersion = 0; +const static int iMaxSupportedVersion = 23; +////////////////////////////////////////////////////////////// +bool CSQLiteLapDB::Init(LPCTSTR lpszPath) +{ + if(!DoesFileExist(lpszPath)) + { + vector lstSQL; + HRESULT hr = m_sfDB.Open(lpszPath, lstSQL); + if(SUCCEEDED(hr)) + { + for(int x = 0;x < 6; x++) + { + hr = E_FAIL; + CSfArtSQLiteQuery sfInsert(m_sfDB); + if(sfInsert.Init(rgSchemaList[iMaxSupportedVersion][x])) + { + if(sfInsert.Next()) + { + hr = S_OK; + } + if(sfInsert.IsDone()) + { + hr = S_OK; + } + } + if(FAILED(hr)) + break; + } + } + return SUCCEEDED(hr); + } + else + { + int iFindFailures = 0; + int ixFoundVersion = -1; + vector lstSQL; + HRESULT hr = m_sfDB.Open(lpszPath, lstSQL); + if(SUCCEEDED(hr)) + { + // find a schema version that matches + for(int ixVersion = iMaxSupportedVersion; ixVersion >= iMinSupportedVersion; ixVersion--) + { + bool fFoundAll = true; + for(int x = 0; x < 6 && fFoundAll; x++) + { + // we want to find rgSchemaList[ixVersion][x] in the lstSQL that we got from the DB. + if(!rgSchemaList[ixVersion][x]) continue; // don't need to find this one + + bool fFound = false; + for(int y = 0; y < lstSQL.size(); y++) + { + if(wcsstr(lstSQL[y].c_str(),L"android_metadata") != NULL) continue; // don't care about this table + if(nospacecompare(lstSQL[y].c_str(),rgSchemaList[ixVersion][x]) == 0) + { + fFound = true; + break; + } + } + if(!fFound) + { + iFindFailures++; + } + + fFoundAll = fFoundAll && fFound; + } + if(fFoundAll) + { + ixFoundVersion = ixVersion; + break; + } + } + + if(ixFoundVersion < 0) + { + DASSERT(FALSE); + // we didn't find or create all our required tables... + hr = E_FAIL; + } + + + if(SUCCEEDED(hr) && ixFoundVersion < 23) + { + // upgrade! + CSfArtSQLiteQuery sfQuery(m_sfDB); + if(sfQuery.Init(CREATE_EXTRA_SQL)) + { + while(sfQuery.Next()) + { + } + DASSERT(sfQuery.IsDone()); + } + } + /*if(ixFoundVersion < ...) future upgrades... + { + }*/ + } + return SUCCEEDED(hr); + } + +} +////////////////////////////////////////////////////////////// +bool CSQLiteLapDB::InitRaceSession(int* piRaceId, LPCTSTR lpszRaceName) +{ + AutoLeaveCS _cs(&m_cs); + bool fSuccess = true; + CSfArtSQLiteQuery sfQuery(m_sfDB); + if(sfQuery.Init(L"insert into races (name,date) values (?,?)")) + { + sfQuery.BindValue(lpszRaceName); + sfQuery.BindValue(GetSecondsSince1970()); + if(sfQuery.Next() || sfQuery.IsDone()) + { + // inserted new data, hooray! + long long lastInsert = m_sfDB.GetLastInsertId(); + *piRaceId = lastInsert; + return true; + } + } + return false; +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::DeInit() +{ + AutoLeaveCS _cs(&m_cs); + m_sfDB.Close(); +} +////////////////////////////////////////////////////////////// +ILap* CSQLiteLapDB::AllocateLap(bool fMemory) +{ + if(fMemory) + { + return new CMemoryLap(); + } + else + { + return new CSQLiteLap(m_sfDB, this); + } +} +////////////////////////////////////////////////////////////// +IDataChannel* CSQLiteLapDB::AllocateDataChannel() const +{ + AutoLeaveCS _cs(&m_cs); + cChannels++; + return new CDataChannel(); +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::FreeDataChannel(IDataChannel* pChannel) const +{ + AutoLeaveCS _cs(&m_cs); + cChannels--; + delete pChannel; +} +////////////////////////////////////////////////////////////// +int CSQLiteLapDB::GetLastReceivedRaceId() const +{ + AutoLeaveCS _cs(&m_cs); + DASSERT(m_iLastRaceId >= 0); // you shouldn't be calling this unless there's evidence we've received a lap! + return m_iLastRaceId; +} +////////////////////////////////////////////////////////////// +bool CSQLiteLapDB::IsActivelyReceiving(int iRaceId) const +{ + AutoLeaveCS _cs(&m_cs); + return this->m_setReceivingIds.find(iRaceId) != m_setReceivingIds.end(); +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::GetLastLapTimeStamp(const vector& lstCarNumbers, vector& lstTimeStamps) const +{ + AutoLeaveCS _cs(&m_cs); + for(int x = 0;x < lstCarNumbers.size(); x++) + { + const int iCar = lstCarNumbers[x]; + unsigned int msLatestTime = 0; + { + for(map::const_iterator i = mapCarNumberRaceIds.begin(); i != mapCarNumberRaceIds.end(); i++) + { + if(i->first.iCarNumber == iCar) + { + const int iRaceId = i->second; + map::const_iterator found = mapLastRaceTimes.find(iRaceId); + if(found != mapLastRaceTimes.end()) + { + const int msLastLapTime = found->second; + msLatestTime = max(msLatestTime, msLastLapTime); // figures out which one came later + } + else + { + // nothing to do, this race doesn't have a last lap time + } + } + } + lstTimeStamps.push_back(msLatestTime); + } + } +} +////////////////////////////////////////////////////////////// +vector CSQLiteLapDB::GetScoring(int iRaceId) +{ + AutoLeaveCS _cs(&m_cs); + vector lstLaps; + // gotta load all the laps that are in the DB, but we don't want to fully load them, just their laptimes and other directly lap-related data + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"Select laps._id,laps.laptime, laps.unixtime,extras.comment from laps left join extras on extras.lapid = laps._id where laps.raceid=%d", iRaceId); + if(sfQuery.Init(szQuery)) + { + while(sfQuery.Next()) + { + CSQLiteLap* pLap = (CSQLiteLap*)AllocateLap(false); + pLap->Load(m_sfDB,m_rgSF,sfQuery); + if(pLap->IsValid()) + { + lstLaps.push_back(pLap); + } + } + } + return lstLaps; +} +////////////////////////////////////////////////////////////// +int CSQLiteLapDB::GetLapCount(int iRaceId) const +{ + AutoLeaveCS _cs(&m_cs); + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select count(laps._id) from races,laps where races._id = %d and laps.raceid=races._id group by races._id", iRaceId); + + if(sfQuery.Init(szQuery)) + { + while(sfQuery.Next()) + { + int cLaps = 0; + if(sfQuery.GetCol(0,&cLaps)) + { + return cLaps; + } + } + } + return 0; +} +////////////////////////////////////////////////////////////// +vector CSQLiteLapDB::GetRaces() +{ + AutoLeaveCS _cs(&m_cs); + vector lstRaces; + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select races.name,races.date,count(laps._id),races._id from races,laps where laps.raceid=races._id group by races._id"); + + if(sfQuery.Init(szQuery)) + { + while(sfQuery.Next()) + { + RACEDATA raceData; + TCHAR szData[1000]; + if(sfQuery.GetCol(0,szData,NUMCHARS(szData))) + { + raceData.strName = szData; + int iRaceDate = 0; + if(sfQuery.GetCol(1,&iRaceDate)) + { + raceData.unixtime = iRaceDate; + } + int cLaps = 0; + if(sfQuery.GetCol(2,&cLaps)) + { + raceData.laps = cLaps; + } + int iRaceId = 0; + if(sfQuery.GetCol(3,&iRaceId)) + { + raceData.raceId = iRaceId; + } + lstRaces.push_back(raceData); + } + } + } + return lstRaces; +} +////////////////////////////////////////////////////////////// +bool CSQLiteLapDB::MergeLaps(int m_iRaceId1, int m_iRaceId2) +{ CSfArtSQLiteQuery sfQuery(m_sfDB); if(sfQuery.Init(L"Update laps set raceid = ? where raceid = ?")) { @@ -538,11 +540,11 @@ bool CSQLiteLapDB::MergeLaps(int m_iRaceId1, int m_iRaceId2) return true; } } - return false; -} -////////////////////////////////////////////////////////////// -bool CSQLiteLapDB::RenameLaps(TCHAR szName[MAX_PATH], int m_iRaceId1) -{ + return false; +} +////////////////////////////////////////////////////////////// +bool CSQLiteLapDB::RenameLaps(TCHAR szName[MAX_PATH], int m_iRaceId1) +{ CSfArtSQLiteQuery sfQuery(m_sfDB); if(sfQuery.Init(L"update races set name = ? where _id = ?")) { @@ -554,304 +556,321 @@ bool CSQLiteLapDB::RenameLaps(TCHAR szName[MAX_PATH], int m_iRaceId1) return true; } } - return false; -} -////////////////////////////////////////////////////////////// -vector CSQLiteLapDB::GetLaps(int iRaceId) -{ - AutoLeaveCS _cs(&m_cs); - vector lstLaps; - // gotta load all the laps that are in the DB, but we don't want to fully load them, just their laptimes and other directly lap-related data - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"Select laps._id,laps.laptime, laps.unixtime,extras.comment from laps left join extras on extras.lapid = laps._id where laps.raceid=%d", iRaceId); - if(sfQuery.Init(szQuery)) - { - while(sfQuery.Next()) - { - CSQLiteLap* pLap = (CSQLiteLap*)AllocateLap(false); - pLap->Load(m_sfDB,m_rgSF,sfQuery); - if(pLap->IsValid()) - { - lstLaps.push_back(pLap); - } - } - } - return lstLaps; -} -////////////////////////////////////////////////////////////// -const ILap* CSQLiteLapDB::GetLap(int iLapId) -{ - AutoLeaveCS _cs(&m_cs); - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"Select laps._id,laps.laptime, laps.unixtime from laps where laps._id = %d", iLapId); - if(sfQuery.Init(szQuery)) - { - if(sfQuery.Next()) - { - CSQLiteLap* pLap = (CSQLiteLap*)AllocateLap(false); - pLap->Load(m_sfDB,m_rgSF,sfQuery); - - return pLap; - } - } - return NULL; -} -////////////////////////////////////////////////////////////// -const IDataChannel* CSQLiteLapDB::GetDataChannel(int iLapId, DATA_CHANNEL eChannel) const -{ - AutoLeaveCS _cs(&m_cs); - if(eChannel == DATA_CHANNEL_VELOCITY) - { - // since velocity is stored as part of the points table, it is a bit different than the normal data channels - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select points.time, points.velocity from points where lapid=%d", iLapId); - if(sfQuery.Init(szQuery)) - { - IDataChannel* pChannel = AllocateDataChannel(); - pChannel->Init(iLapId,DATA_CHANNEL_VELOCITY); - while(sfQuery.Next()) - { - int iTime = 0; - double dVel = 0; - if(sfQuery.GetCol(0,&iTime) && sfQuery.GetCol(1,&dVel)) - { - pChannel->AddPoint(iTime, dVel); - } - } - pChannel->Lock(); - return pChannel; - } - } - else - { - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select channels._id, channels.lapid, channels.channeltype from channels where channels.lapid = %d and channels.channeltype=%d", iLapId, eChannel); - if(sfQuery.Init(szQuery)) - { - if(sfQuery.Next()) - { - IDataChannel* pChannel = AllocateDataChannel(); - pChannel->Load(m_sfDB,sfQuery,true); - // warning: massive memory leaks here - return pChannel; - } - } - } - return NULL; -} -////////////////////////////////////////////////////////////// -set CSQLiteLapDB::GetAvailableChannels(int iLapId) const -{ - AutoLeaveCS _cs(&m_cs); - set setRet; - - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select channels.channeltype from channels where channels.lapid = %d", iLapId); - if(sfQuery.Init(szQuery)) - { - while(sfQuery.Next()) - { - DATA_CHANNEL eType; - if(sfQuery.GetCol(0,(int*)&eType)) - { - setRet.insert(eType); - } - } - } - return setRet; -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::GetComments(int iLapId, vector& lstComments) const -{ - AutoLeaveCS _cs(&m_cs); - CSfArtSQLiteQuery sfQuery(m_sfDB); - TCHAR szQuery[MAX_PATH]; - _snwprintf(szQuery, NUMCHARS(szQuery), L"select extras.comment from extras where extras.lapid = %d", iLapId); - if(sfQuery.Init(szQuery)) - { - while(sfQuery.Next()) - { - TCHAR szComment[500]; - if(sfQuery.GetCol(0,szComment, NUMCHARS(szComment))) - { - lstComments.push_back(szComment); - } - } - } -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::AddLap(const ILap* pLap, int _iRaceId) -{ - AutoLeaveCS _cs(&m_cs); - CARNUMBERCOMBO sfCarNumber = pLap->GetCarNumbers(); - int iSaveRaceId = -1; - if(mapCarNumberRaceIds.find(sfCarNumber) == mapCarNumberRaceIds.end()) - { - // we've never seen this car number combo before. Time for a new race. - TCHAR szRaceName[200]; - if(sfCarNumber.IsOldVersion()) - { - _snwprintf(szRaceName,NUMCHARS(szRaceName),L"Received from old wifilappers"); - } - else - { - _snwprintf(szRaceName,NUMCHARS(szRaceName),L"Received laps (car %d) - (%d)", sfCarNumber.iCarNumber, sfCarNumber.iSecondaryCarNumber); - } - int iNewRaceId = -1; - if(InitRaceSession(&iNewRaceId,szRaceName)) - { - mapCarNumberRaceIds[sfCarNumber] = iNewRaceId; - iSaveRaceId = iNewRaceId; - } - else - { - return; - } - } - else - { - iSaveRaceId = mapCarNumberRaceIds[sfCarNumber]; - } - - m_setReceivingIds.insert(iSaveRaceId); // this race ID received a lap - m_iLastRaceId = iSaveRaceId; - - m_sfDB.StartTransaction(); - - bool fSuccess = true; - CSfArtSQLiteQuery sfQuery(m_sfDB); - if(sfQuery.Init(L"insert into laps (_id,laptime,unixtime,transmitted,raceid) values (?,?,?,?,?)")) - { - sfQuery.BindValue(pLap->GetLapId()); - sfQuery.BindValue(pLap->GetTime()); - sfQuery.BindValue(pLap->GetStartTime()); - sfQuery.BindValue(0); - sfQuery.BindValue(iSaveRaceId); - if(sfQuery.Next() || sfQuery.IsDone()) - { - // inserted new data, hooray! - - vector lstPoints = pLap->GetPoints(); - for(int x = 0;x < lstPoints.size(); x++) - { - const TimePoint2D& pt = lstPoints[x]; - sfQuery.DeInit(); - if(sfQuery.Init(L"insert into points (x,y,time,velocity,lapid) values (?,?,?,?,?)")) - { - sfQuery.BindValue(pt.flX); - sfQuery.BindValue(pt.flY); - sfQuery.BindValue(pt.iTime); - sfQuery.BindValue(pt.flVelocity); - sfQuery.BindValue(pLap->GetLapId()); - if(!sfQuery.Next() && !sfQuery.IsDone()) - { - fSuccess = false; - break; - } - } - } - } - else - { - fSuccess = false; - } - } - - if(fSuccess) - { - mapLastRaceTimes[iSaveRaceId] = timeGetTime(); - m_pUI->NotifyChange(NOTIFY_NEWLAP,(LPARAM)this); - } - - m_sfDB.StopTransaction(); -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::AddDataChannel(const IDataChannel* pChannel) -{ - AutoLeaveCS _cs(&m_cs); - m_sfDB.StartTransaction(); - - bool fSuccess = true; - CSfArtSQLiteQuery sfQuery(m_sfDB); - if(sfQuery.Init(L"insert into channels (lapid,channeltype) values (?,?)")) - { - sfQuery.BindValue(pChannel->GetLapId()); - sfQuery.BindValue((int)pChannel->GetChannelType()); - if(sfQuery.Next() || sfQuery.IsDone()) - { - // inserted new data, hooray! - long long lastInsert = m_sfDB.GetLastInsertId(); - - - vector lstPoints = pChannel->GetData(); - for(int x = 0;x < lstPoints.size(); x++) - { - const DataPoint& pt = lstPoints[x]; - sfQuery.DeInit(); - if(sfQuery.Init(L"insert into data (time,value,channelid) values (?,?,?)")) - { - sfQuery.BindValue(pt.iTimeMs); - sfQuery.BindValue(pt.flValue); - sfQuery.BindValue(lastInsert); - if(!sfQuery.Next() && !sfQuery.IsDone()) - { - fSuccess = false; - break; - } - } - } - } - else - { - fSuccess = false; - } - } - if(fSuccess) - { - m_pUI->NotifyChange(NOTIFY_NEWDATA,(LPARAM)this); - } - - m_sfDB.StopTransaction(); -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::Clear() -{ -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::AddComment(int iLapId, LPCTSTR strComment) -{ - CSfArtSQLiteQuery sfQuery(m_sfDB); - if(sfQuery.Init(L"insert or replace into extras (comment,lapid) values (?,?)")) - { - sfQuery.BindValue(strComment); - sfQuery.BindValue(iLapId); - if(!sfQuery.Next() && !sfQuery.IsDone()) - { - DASSERT(FALSE); - } - } -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::SetNetStatus(NETSTATUSSTRING eString, LPCTSTR sz) -{ - AutoLeaveCS _cs(&m_cs); - wcscpy(szLastNetStatus[eString], sz); - m_pUI->NotifyChange(NOTIFY_NEWNETSTATUS,(LPARAM)this); -} -////////////////////////////////////////////////////////////// -void CSQLiteLapDB::NotifyDBArrival(LPCTSTR szPath) -{ - AutoLeaveCS _cs(&m_cs); - wcscpy(szLastNetStatus[NETSTATUS_DB],szPath); - m_pUI->NotifyChange(NOTIFY_NEWDATABASE,(LPARAM)szLastNetStatus[NETSTATUS_DB]); -} -////////////////////////////////////////////////////////////// -LPCTSTR CSQLiteLapDB::GetNetStatus(NETSTATUSSTRING eString) const -{ - return szLastNetStatus[eString]; + return false; +} +////////////////////////////////////////////////////////////// +vector CSQLiteLapDB::GetLaps(int iRaceId) +{ + AutoLeaveCS _cs(&m_cs); + vector lstLaps; + // gotta load all the laps that are in the DB, but we don't want to fully load them, just their laptimes and other directly lap-related data + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"Select laps._id,laps.laptime, laps.unixtime,extras.comment from laps left join extras on extras.lapid = laps._id where laps.raceid=%d", iRaceId); + if(sfQuery.Init(szQuery)) + { + while(sfQuery.Next()) + { + CSQLiteLap* pLap = (CSQLiteLap*)AllocateLap(false); + pLap->Load(m_sfDB,m_rgSF,sfQuery); + if(pLap->IsValid()) + { + lstLaps.push_back(pLap); + } + } + } + return lstLaps; +} + +////////////////////////////////////////////////////////////// +const ILap* CSQLiteLapDB::GetLastLap() { + AutoLeaveCS _cs(&m_cs); + DASSERT(vLastLapId.size() < 2); + if( !vLastLapId.empty() ) { + const int ret = vLastLapId.back(); + vLastLapId.pop_back(); + return GetLap(ret); + } + else + return NULL; +} + +////////////////////////////////////////////////////////////// +const ILap* CSQLiteLapDB::GetLap(int iLapId) +{ + AutoLeaveCS _cs(&m_cs); + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"Select laps._id,laps.laptime, laps.unixtime from laps where laps._id = %d", iLapId); + if(sfQuery.Init(szQuery)) + { + if(sfQuery.Next()) + { + CSQLiteLap* pLap = (CSQLiteLap*)AllocateLap(false); + pLap->Load(m_sfDB,m_rgSF,sfQuery); + + return pLap; + } + } + return NULL; +} +////////////////////////////////////////////////////////////// +const IDataChannel* CSQLiteLapDB::GetDataChannel(int iLapId, DATA_CHANNEL eChannel) const +{ + AutoLeaveCS _cs(&m_cs); + if(eChannel == DATA_CHANNEL_VELOCITY) + { + // since velocity is stored as part of the points table, it is a bit different than the normal data channels + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select points.time, points.velocity from points where lapid=%d", iLapId); + if(sfQuery.Init(szQuery)) + { + IDataChannel* pChannel = AllocateDataChannel(); + pChannel->Init(iLapId,DATA_CHANNEL_VELOCITY); + while(sfQuery.Next()) + { + int iTime = 0; + double dVel = 0; + if(sfQuery.GetCol(0,&iTime) && sfQuery.GetCol(1,&dVel)) + { + pChannel->AddPoint(iTime, dVel); + } + } + pChannel->Lock(); + return pChannel; + } + } + else + { + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select channels._id, channels.lapid, channels.channeltype from channels where channels.lapid = %d and channels.channeltype=%d", iLapId, eChannel); + if(sfQuery.Init(szQuery)) + { + if(sfQuery.Next()) + { + IDataChannel* pChannel = AllocateDataChannel(); + pChannel->Load(m_sfDB,sfQuery,true); + // warning: massive memory leaks here + return pChannel; + } + } + } + return NULL; +} +////////////////////////////////////////////////////////////// +set CSQLiteLapDB::GetAvailableChannels(int iLapId) const +{ + AutoLeaveCS _cs(&m_cs); + set setRet; + + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select channels.channeltype from channels where channels.lapid = %d", iLapId); + if(sfQuery.Init(szQuery)) + { + while(sfQuery.Next()) + { + DATA_CHANNEL eType; + if(sfQuery.GetCol(0,(int*)&eType)) + { + setRet.insert(eType); + } + } + } + return setRet; +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::GetComments(int iLapId, vector& lstComments) const +{ + AutoLeaveCS _cs(&m_cs); + CSfArtSQLiteQuery sfQuery(m_sfDB); + TCHAR szQuery[MAX_PATH]; + _snwprintf(szQuery, NUMCHARS(szQuery), L"select extras.comment from extras where extras.lapid = %d", iLapId); + if(sfQuery.Init(szQuery)) + { + while(sfQuery.Next()) + { + TCHAR szComment[500]; + if(sfQuery.GetCol(0,szComment, NUMCHARS(szComment))) + { + lstComments.push_back(szComment); + } + } + } +} + +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::AddLap(const ILap* pLap, int _iRaceId) +{ + AutoLeaveCS _cs(&m_cs); + vLastLapId.push_back(pLap->GetLapId()); + + CARNUMBERCOMBO sfCarNumber = pLap->GetCarNumbers(); + int iSaveRaceId = -1; + if(mapCarNumberRaceIds.find(sfCarNumber) == mapCarNumberRaceIds.end()) + { + // we've never seen this car number combo before. Time for a new race. + TCHAR szRaceName[200]; + if(sfCarNumber.IsOldVersion()) + { + _snwprintf(szRaceName,NUMCHARS(szRaceName),L"Received from old wifilappers"); + } + else + { + _snwprintf(szRaceName,NUMCHARS(szRaceName),L"Received laps (car %d) - (%d)", sfCarNumber.iCarNumber, sfCarNumber.iSecondaryCarNumber); + } + int iNewRaceId = -1; + if(InitRaceSession(&iNewRaceId,szRaceName)) + { + mapCarNumberRaceIds[sfCarNumber] = iNewRaceId; + iSaveRaceId = iNewRaceId; + } + else + { + return; + } + } + else + { + iSaveRaceId = mapCarNumberRaceIds[sfCarNumber]; + } + + m_setReceivingIds.insert(iSaveRaceId); // this race ID received a lap + m_iLastRaceId = iSaveRaceId; + + m_sfDB.StartTransaction(); + + bool fSuccess = true; + CSfArtSQLiteQuery sfQuery(m_sfDB); + if(sfQuery.Init(L"insert into laps (_id,laptime,unixtime,transmitted,raceid) values (?,?,?,?,?)")) + { + sfQuery.BindValue(pLap->GetLapId()); + sfQuery.BindValue(pLap->GetTime()); + sfQuery.BindValue(pLap->GetStartTime()); + sfQuery.BindValue(0); + sfQuery.BindValue(iSaveRaceId); + if(sfQuery.Next() || sfQuery.IsDone()) + { + // inserted new data, hooray! + + vector lstPoints = pLap->GetPoints(); + for(int x = 0;x < lstPoints.size(); x++) + { + const TimePoint2D& pt = lstPoints[x]; + sfQuery.DeInit(); + if(sfQuery.Init(L"insert into points (x,y,time,velocity,lapid) values (?,?,?,?,?)")) + { + sfQuery.BindValue(pt.flX); + sfQuery.BindValue(pt.flY); + sfQuery.BindValue(pt.iTime); + sfQuery.BindValue(pt.flVelocity); + sfQuery.BindValue(pLap->GetLapId()); + if(!sfQuery.Next() && !sfQuery.IsDone()) + { + fSuccess = false; + break; + } + } + } + } + else + { + fSuccess = false; + } + } + + if(fSuccess) + { + mapLastRaceTimes[iSaveRaceId] = timeGetTime(); + m_pUI->NotifyChange(NOTIFY_NEWLAP,(LPARAM)this); + } + + m_sfDB.StopTransaction(); +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::AddDataChannel(const IDataChannel* pChannel) +{ + AutoLeaveCS _cs(&m_cs); + m_sfDB.StartTransaction(); + + bool fSuccess = true; + CSfArtSQLiteQuery sfQuery(m_sfDB); + if(sfQuery.Init(L"insert into channels (lapid,channeltype) values (?,?)")) + { + sfQuery.BindValue(pChannel->GetLapId()); + sfQuery.BindValue((int)pChannel->GetChannelType()); + if(sfQuery.Next() || sfQuery.IsDone()) + { + // inserted new data, hooray! + long long lastInsert = m_sfDB.GetLastInsertId(); + + + vector lstPoints = pChannel->GetData(); + for(int x = 0;x < lstPoints.size(); x++) + { + const DataPoint& pt = lstPoints[x]; + sfQuery.DeInit(); + if(sfQuery.Init(L"insert into data (time,value,channelid) values (?,?,?)")) + { + sfQuery.BindValue(pt.iTimeMs); + sfQuery.BindValue(pt.flValue); + sfQuery.BindValue(lastInsert); + if(!sfQuery.Next() && !sfQuery.IsDone()) + { + fSuccess = false; + break; + } + } + } + } + else + { + fSuccess = false; + } + } + if(fSuccess) + { + m_pUI->NotifyChange(NOTIFY_NEWDATA,(LPARAM)this); + } + + m_sfDB.StopTransaction(); +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::Clear() +{ +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::AddComment(int iLapId, LPCTSTR strComment) +{ + CSfArtSQLiteQuery sfQuery(m_sfDB); + if(sfQuery.Init(L"insert or replace into extras (comment,lapid) values (?,?)")) + { + sfQuery.BindValue(strComment); + sfQuery.BindValue(iLapId); + if(!sfQuery.Next() && !sfQuery.IsDone()) + { + DASSERT(FALSE); + } + } +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::SetNetStatus(NETSTATUSSTRING eString, LPCTSTR sz) +{ + AutoLeaveCS _cs(&m_cs); + wcscpy(szLastNetStatus[eString], sz); + m_pUI->NotifyChange(NOTIFY_NEWNETSTATUS,(LPARAM)this); +} +////////////////////////////////////////////////////////////// +void CSQLiteLapDB::NotifyDBArrival(LPCTSTR szPath) +{ + AutoLeaveCS _cs(&m_cs); + wcscpy(szLastNetStatus[NETSTATUS_DB],szPath); + m_pUI->NotifyChange(NOTIFY_NEWDATABASE,(LPARAM)szLastNetStatus[NETSTATUS_DB]); +} +////////////////////////////////////////////////////////////// +LPCTSTR CSQLiteLapDB::GetNetStatus(NETSTATUSSTRING eString) const +{ + return szLastNetStatus[eString]; } \ No newline at end of file diff --git a/PitsideConsole/PitsideConsole/SQLiteLapDB.h b/PitsideConsole/PitsideConsole/SQLiteLapDB.h index 0f5c440..e9201b9 100644 --- a/PitsideConsole/PitsideConsole/SQLiteLapDB.h +++ b/PitsideConsole/PitsideConsole/SQLiteLapDB.h @@ -5,6 +5,8 @@ class CSQLiteLapDB : public ILapReceiver { public: + vector vLastLapId; + CSQLiteLapDB(IUI* pUI) : cChannels(0), m_pUI(pUI),m_iLastRaceId(-1) {}; virtual ~CSQLiteLapDB() {}; @@ -26,6 +28,7 @@ class CSQLiteLapDB : public ILapReceiver virtual int GetLapCount(int iRaceId) const override; // gets the lap count for a given race virtual vector GetRaces() override; virtual vector GetLaps(int iRaceId) override; + virtual const ILap* GetLastLap() override; virtual vector GetScoring(int iRaceId) override; virtual bool MergeLaps(int m_iRaceId1, int m_iRaceId2); virtual bool RenameLaps(TCHAR szName[260], int m_RaceId1); From 1971cffe111d768a3062073e9d3e5cb33b8ece99 Mon Sep 17 00:00:00 2001 From: Paul McMahon Date: Sun, 23 Oct 2016 10:11:42 -0400 Subject: [PATCH 107/112] Fixing a failed merge --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 2d3f162..e0c392c 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -1957,7 +1957,9 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) const static DWORD UPDATE_TRACTIONCIRCLE = 0x20; const static DWORD UPDATE_ALLDATA = 0x40; - const static DWORD UPDATE_ALL = 0xffffffff; + const static DWORD UPDATE_ALL = 0xffff; + const static DWORD UPDATE_ADD2LIST = 0x10000; + // Pull in PlotPrefs array as well as lines vs. dots and Painting color scheme settings from Settings.txt file void SetDisplayOptions(const LAPSUPPLIEROPTIONS& lapOpts) { From 84cb5045d9c3b8cc17dc63151841630482b0f09d Mon Sep 17 00:00:00 2001 From: Keith Date: Thu, 17 Nov 2016 18:43:26 -0700 Subject: [PATCH 108/112] Added back in class CLapReceiver --- .../PitsideConsole/PitsideConsole.cpp | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index e0c392c..4a749ad 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -84,6 +84,165 @@ bool CLap_SortByTime(const ILap* p1, const ILap* p2) { return p1->GetStartTime() < p2->GetStartTime(); } + +// this object takes the laps received on the net thread, stores them, and notifies the UI of the new laps +class CLapReceiver : public ILapReceiver +{ +public: + CLapReceiver(IUI* pUI) : m_pUI(pUI) + { + for(int x = 0; x < NETSTATUS_COUNT; x++) + { + szLastNetStatus[x][0] = '\0'; + } + } + virtual ~CLapReceiver() {}; + + void Clear() override + { + AutoLeaveCS _cs(&m_cs); + + for(int x = 0;x < m_lstLaps.size(); x++) + { + delete m_lstLaps[x]; + } + m_lstLaps.clear(); + + ChannelMap::iterator i = m_mapChannels.begin(); + while(i != m_mapChannels.end()) + { + map::iterator i2 = i->second.begin(); + while(i2 != i->second.end()) + { + FreeDataChannel((IDataChannel*)(i2->second)); + i2++; + } + i++; + } + m_mapChannels.clear(); + m_pUI->NotifyChange(NOTIFY_NEWDATA,(LPARAM)this); + } + + void AddLap(const ILap* pLap, int iRaceId) override + { + { + AutoLeaveCS _cs(&m_cs); + m_lstLaps.push_back(pLap); + } + m_pUI->NotifyChange(NOTIFY_NEWLAP,(LPARAM)this); + } + void AddDataChannel(const IDataChannel* pDataChannel) override + { + DASSERT(pDataChannel->IsLocked()); + + bool fFoundHome = false; + { + AutoLeaveCS _cs(&m_cs); + map& mapChannels = m_mapChannels[pDataChannel->GetLapId()]; + map::iterator i = mapChannels.find(pDataChannel->GetChannelType()); + if(i != mapChannels.end()) + { + // we already had one. The correct thing to do would be to free it. + IDataChannel* pChannel = const_cast(i->second); + } + + mapChannels[pDataChannel->GetChannelType()] = pDataChannel; + } + + m_pUI->NotifyChange(NOTIFY_NEWDATA,(LPARAM)this); + } + ILap* AllocateLap(bool fMemory) override + { + return new CMemoryLap(); + } + IDataChannel* AllocateDataChannel() const override + { + return new CDataChannel(); + } + void FreeDataChannel(IDataChannel* pInput) const override + { + delete pInput; + } + void SetNetStatus(NETSTATUSSTRING eString, LPCTSTR sz) override + { + wcscpy(szLastNetStatus[eString], sz); + m_pUI->NotifyChange(NOTIFY_NEWNETSTATUS,(LPARAM)this); + } + void NotifyDBArrival(LPCTSTR szPath) + { + wcscpy(szLastNetStatus[NETSTATUS_DB],szPath); + m_pUI->NotifyChange(NOTIFY_NEWDATABASE,(LPARAM)szLastNetStatus[NETSTATUS_DB]); + } + LPCTSTR GetNetStatus(NETSTATUSSTRING eString) const + { + return szLastNetStatus[eString]; + } + virtual vector GetLaps(int iRaceId) override + { + AutoLeaveCS _cs(&m_cs); + vector ret; + for(int x = 0;x < m_lstLaps.size();x++) + { + ret.push_back(m_lstLaps[x]); + } + return ret; + } + virtual const ILap* GetLap(int iLapId) override + { + AutoLeaveCS _cs(&m_cs); + for(int x = 0; x < m_lstLaps.size(); x++) + { + if(m_lstLaps[x]->GetLapId() == iLapId) + { + return m_lstLaps[x]; + } + } + return NULL; + } + virtual const IDataChannel* GetDataChannel(int iLapId,DATA_CHANNEL eChannel) const override + { + AutoLeaveCS _cs(&m_cs); + ChannelMap::const_iterator i = m_mapChannels.find(iLapId); + if(i != m_mapChannels.end()) + { + // ok, we've got stuff about that lap... + map::const_iterator i2 = i->second.find(eChannel); + if(i2 != i->second.end()) + { + return i2->second; + } + } + return NULL; + } + virtual set GetAvailableChannels(int iLapId) const override + { + AutoLeaveCS _cs(&m_cs); + set setRet; + + ChannelMap::const_iterator i = m_mapChannels.find(iLapId); + if(i != m_mapChannels.end()) + { + // ok, we've got stuff about that lap... + map::const_iterator i2 = i->second.begin(); + while(i2 != i->second.end()) + { + setRet.insert(i2->first); + i2++; + } + } + return setRet; + }; +private: + vector m_lstLaps; + + typedef map > ChannelMap; // for each lapid, defines a map from channeltype to channel + mutable ChannelMap m_mapChannels; // maps from a lapid to a list of data channels for that lap + + IUI* m_pUI; + TCHAR szLastNetStatus[NETSTATUS_COUNT][200]; + mutable ManagedCS m_cs; +}; + IUI* g_pUI = NULL; INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) From 28859cc32f136140602a555a729d8b2a8722b84c Mon Sep 17 00:00:00 2001 From: Keith Date: Sat, 1 Jul 2017 12:45:41 -0700 Subject: [PATCH 109/112] 2.003.0018: Updated the phone application help file to reflect SpeedFreq. Removed the Wifilapper images and references --- PitsideConsole/PitsideConsole/PitsideConsole.cpp | 2 +- PitsideConsole/PitsideConsole/PitsideConsole.rc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 4a749ad..25a561f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -2310,7 +2310,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) { TCHAR lpOpen[MAX_PATH] = L"open"; - TCHAR lpFile[MAX_PATH] = L"WifilapperHelp.pdf"; + TCHAR lpFile[MAX_PATH] = L"SpeedFreqHelp.pdf"; TCHAR lpDir[MAX_PATH]; if(GetAppFolder(lpDir,NUMCHARS(lpDir))) { diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index fdb627f..c63327f 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -189,7 +189,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0017\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0018\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END @@ -495,7 +495,7 @@ POPUP "&Graphing" POPUP "&Help" BEGIN MENUITEM "Show Pitside Help File", ID_HELP_SHOWHELP - MENUITEM "Show Wifilapper Help File", ID_HELP_SHOWWFLHELP + MENUITEM "Show SpeedFreq Help File", ID_HELP_SHOWWFLHELP MENUITEM "Show IPs", ID_HELP_IPS MENUITEM "About", ID_HELP_ABOUT END From 450071521c43b1817af665cd5736c5cf627798dd Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 18 Aug 2019 08:43:38 -0700 Subject: [PATCH 110/112] 2.004.0019: Added transient traction circle and button for collecting live data or not --- PitsideConsole/PitsideConsole/DlgPlotSelect.h | 3 +- PitsideConsole/PitsideConsole/LapPainter.cpp | 14 ++- PitsideConsole/PitsideConsole/LapReceiver.cpp | 80 ++++++++++-------- PitsideConsole/PitsideConsole/LapReceiver.h | 61 ++++++++++++- .../PitsideConsole/PitsideConsole.cpp | 26 +++++- .../PitsideConsole/PitsideConsole.rc | 7 +- PitsideConsole/PitsideConsole/PitsideHelp.pdf | Bin 2454808 -> 5435039 bytes PitsideConsole/PitsideConsole/resource.h | 1 + 8 files changed, 147 insertions(+), 45 deletions(-) diff --git a/PitsideConsole/PitsideConsole/DlgPlotSelect.h b/PitsideConsole/PitsideConsole/DlgPlotSelect.h index f60b9ad..a082cd5 100644 --- a/PitsideConsole/PitsideConsole/DlgPlotSelect.h +++ b/PitsideConsole/PitsideConsole/DlgPlotSelect.h @@ -97,7 +97,7 @@ enum ORIENTATION // These are phone orientatino ENUMS, for setting up the Tracti struct LAPSUPPLIEROPTIONS { public: - LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false),bShowReferenceLap(true),e_Orientation(VERTICAL_LANDSCAPE) + LAPSUPPLIEROPTIONS() : eUnitPreference(UNIT_PREFERENCE_MPH),bXAxis_KM(false),fDrawSplitPoints(false),fDrawGuides(true),fDrawLines(true),fColorScheme(false),fIOIOHardcoded(true),flWindowShiftX(0),flWindowShiftY(0),iZoomLevels(0),bTractionCircle(false),bShowReferenceLap(true),e_Orientation(VERTICAL_LANDSCAPE), b_Button_LiveData(true) { } UNIT_PREFERENCE eUnitPreference; @@ -120,6 +120,7 @@ struct LAPSUPPLIEROPTIONS bool bSmoothYesNo; // Whether or not to smooth the accelerometer graphs bool bShowReferenceLap; // Whether or not the Reference Lap is displayed ORIENTATION e_Orientation; // Phone orientation when installed in the car + BOOL b_Button_LiveData; // Button for choosing to pause live data collection to allow for data processing int LapId; }; diff --git a/PitsideConsole/PitsideConsole/LapPainter.cpp b/PitsideConsole/PitsideConsole/LapPainter.cpp index 5bd2bf0..ecd7ed8 100644 --- a/PitsideConsole/PitsideConsole/LapPainter.cpp +++ b/PitsideConsole/PitsideConsole/LapPainter.cpp @@ -1209,6 +1209,7 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f else iYend = lstPointsY.end(); + dTimeToHighlight = m_pLapSupplier->GetLapHighlightTime(pLap); while(iX != iXend && iY != iYend) { float dX; @@ -1246,12 +1247,21 @@ void CLapPainter::DrawTractionCircle(const LAPSUPPLIEROPTIONS& sfLapOpts, bool f dY = PolynomialFilter(dY, sfLapOpts.m_PlotPrefs[y].fTransAValue, sfLapOpts.m_PlotPrefs[y].fTransBValue, sfLapOpts.m_PlotPrefs[y].fTransCValue); } ////////////////////////////////////////// - glVertex2f(dX,dY); + if (sfLapOpts.bTractionCircle) // User wants dynamic traction circle, not full lap to be displayed + { + if (iTimeUsed > (dTimeToHighlight - 1500) && iTimeUsed <= (dTimeToHighlight)) // Only display traction circle points near the highlighted point + { + glVertex2f(dX,dY); + } + } + else + { + glVertex2f(dX,dY); + } } glEnd(); // for each lap, draw an indicator of the closest thing to the mouse // if we're not a source, use the given time to highlight - dTimeToHighlight = m_pLapSupplier->GetLapHighlightTime(pLap); UpdateHighlightPointList(lstMousePointsToDraw, pLap, rgModelviewMatrix, rgProjMatrix, rgViewport, dTimeToHighlight, pDataX, pDataY); } } // end lap loop diff --git a/PitsideConsole/PitsideConsole/LapReceiver.cpp b/PitsideConsole/PitsideConsole/LapReceiver.cpp index 836678a..509cc1c 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.cpp +++ b/PitsideConsole/PitsideConsole/LapReceiver.cpp @@ -70,7 +70,11 @@ void CDataChannel::DoLoad(CSfArtSQLiteDB& db, int _id) } } } - +/* +bool CReceiveLapOpts::m_Button_LiveData() +{ +} +*/ bool CDataChannel::Load(CSfArtSQLiteDB& db, CSfArtSQLiteQuery& dc, bool fLazyLoad) { m_db = &db; @@ -575,12 +579,20 @@ class LapSocketReceiver char buf[1024]; bool fConnectionLost = false; int cbRead = TimeoutRead(sData,buf,sizeof(buf),0,10000, &fConnectionLost); +// CReceiveLapOpts::m_pLapSupplier()->GetDisplayOptions().; +// bool b_ButtonLiveData = CReceiveLapOpts::m_pLapSupplier->; if(cbRead <= 0 || fConnectionLost) { pLaps->SetNetStatus(NETSTATUS_STATUS, L"Probably lost connection"); pLaps->SetNetStatus(NETSTATUS_REMOTEIP, L""); break; } + else if (int b_Button_LiveData =! true) // Check if user wants to disable live data collection for lap processing + { + pLaps->SetNetStatus(NETSTATUS_STATUS, L"Data reception disabled"); + pLaps->SetNetStatus(NETSTATUS_REMOTEIP, L""); + break; + } else { for(int x = 0;x < cbRead; x++) @@ -761,7 +773,7 @@ class LapSocketReceiver { Sleep(1); // let's let the buffer fill up } - } + } } if(sData != INVALID_SOCKET) @@ -820,43 +832,43 @@ bool ReceiveLaps(int iPort, ILapReceiver* pLaps) closesocket(aSocket); aSocket = INVALID_SOCKET; } - else - { - sockaddr sfAddr = {0}; - int cbAddr = sizeof(sfAddr); - TCHAR szIPString[512] = {0}; - pLaps->SetNetStatus(NETSTATUS_STATUS, L"Waiting for incoming connection to accept"); - sDataSocket = accept(aSocket, &sfAddr, &cbAddr); - if(sDataSocket != INVALID_SOCKET) - { - sockaddr_in* pIn = (sockaddr_in*)&sfAddr; - pLaps->SetNetStatus(NETSTATUS_STATUS, L"Connected"); + else + { + sockaddr sfAddr = {0}; + int cbAddr = sizeof(sfAddr); + TCHAR szIPString[512] = {0}; + pLaps->SetNetStatus(NETSTATUS_STATUS, L"Waiting for incoming connection to accept"); + sDataSocket = accept(aSocket, &sfAddr, &cbAddr); + if(sDataSocket != INVALID_SOCKET) + { + sockaddr_in* pIn = (sockaddr_in*)&sfAddr; + pLaps->SetNetStatus(NETSTATUS_STATUS, L"Connected"); - TCHAR szIPString[512] = L""; - GetIPString(pIn->sin_addr.S_un.S_addr, szIPString, NUMCHARS(szIPString)); - pLaps->SetNetStatus(NETSTATUS_REMOTEIP, szIPString); + TCHAR szIPString[512] = L""; + GetIPString(pIn->sin_addr.S_un.S_addr, szIPString, NUMCHARS(szIPString)); + pLaps->SetNetStatus(NETSTATUS_REMOTEIP, szIPString); - new LapSocketReceiver(pLaps, sDataSocket); // creates the guy that will actually receive this data (and close the socket when he's done) + new LapSocketReceiver(pLaps, sDataSocket); // creates the guy that will actually receive this data (and close the socket when he's done) - { - sockaddr sfName = {0}; - int cbName = sizeof(sfName); - getsockname(sDataSocket, &sfName, &cbName); + { + sockaddr sfName = {0}; + int cbName = sizeof(sfName); + getsockname(sDataSocket, &sfName, &cbName); - pIn = (sockaddr_in*)&sfName; - GetIPString(pIn->sin_addr.S_un.S_addr, szIPString, NUMCHARS(szIPString)); - pLaps->SetNetStatus(NETSTATUS_THISIP, szIPString); - } - } - else - { - sockaddr sfName = {0}; - TCHAR szIPString[512] = {0}; - sockaddr_in* pIn = (sockaddr_in*)&sfName; - GetIPString(pIn->sin_addr.S_un.S_addr, szIPString, NUMCHARS(szIPString)); - pLaps->SetNetStatus(NETSTATUS_REMOTEIP, szIPString); - } + pIn = (sockaddr_in*)&sfName; + GetIPString(pIn->sin_addr.S_un.S_addr, szIPString, NUMCHARS(szIPString)); + pLaps->SetNetStatus(NETSTATUS_THISIP, szIPString); + } + } + else + { + sockaddr sfName = {0}; + TCHAR szIPString[512] = {0}; + sockaddr_in* pIn = (sockaddr_in*)&sfName; + GetIPString(pIn->sin_addr.S_un.S_addr, szIPString, NUMCHARS(szIPString)); + pLaps->SetNetStatus(NETSTATUS_REMOTEIP, szIPString); + } } } } diff --git a/PitsideConsole/PitsideConsole/LapReceiver.h b/PitsideConsole/PitsideConsole/LapReceiver.h index 0a7669f..c990c51 100644 --- a/PitsideConsole/PitsideConsole/LapReceiver.h +++ b/PitsideConsole/PitsideConsole/LapReceiver.h @@ -7,6 +7,9 @@ #include "ArtTools.h" #include #include "ArtSQL/ArtSQLite.h" +#include "PitsideConsole.h" +//#include "DlgPlotSelect.h" +//#include "LapPainter.h" using namespace std; @@ -401,8 +404,64 @@ interface ILapReceiver virtual LPCTSTR GetNetStatus(NETSTATUSSTRING eString) const = 0; virtual bool MergeLaps(int m_iRaceId1, int m_iRaceId2) = 0; virtual bool RenameLaps(TCHAR szName[260], int m_RaceId1) = 0; +// virtual bool m_Button_LiveData(); }; - +/* +// LapSupplier interface - needed so that LapReceiver knows whether or not to collect Live Data, from m_sfLapOpts +interface ILapSupplier +{ +public: + virtual vector GetLapsToShow() const = 0; // <-- returns which laps you want painted + virtual vector GetAllLaps() const = 0; // <-- returns all the laps + virtual LAPDISPLAYSTYLE GetLapDisplayStyle(int iSupplierId) const = 0; // <-- returns how you want the laps shown: this can be a map or a data plot + virtual DATA_CHANNEL GetXChannel() const = 0; // <-- returns what data channel you want to use for the x-axis + virtual vector GetYChannels() const = 0; // <-- returns what data channels you want to use for the y-axes (can be 1 or more) + virtual const IDataChannel* GetChannel(int iLapId, DATA_CHANNEL eChannel) const = 0; // <-- returns the actual data channel object for a given lap. + virtual FLOATRECT GetAllLapsBounds() const = 0; // <-- returns the x and y bounds for all the laps + + // guide-parameter functions - these configure the background horizontal/vertical lines + virtual float GetGuideStart(DATA_CHANNEL eChannel, float flMin, float flMax) = 0; // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw + virtual float GetGuideStartX(DATA_CHANNEL eChannel, float flMin, float flMax) = 0; // <-- returns the position (in the units of whatever data channel you're plotting) of the first line we should draw + virtual float GetGuideStep(DATA_CHANNEL eChannel, float flMin, float flMax) = 0; // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) + virtual float GetGuideStepX(DATA_CHANNEL eChannel, float flMin, float flMax) = 0; // <-- returns the distance between guidelines (in units of whatever data channel you're plotting) + virtual float GetDataHardcodedMin(DATA_CHANNEL eChannel) const = 0; // <-- returns the absolute lowest value we want to display for a given data channel type + virtual float GetDataHardcodedMax(DATA_CHANNEL eChannel) const = 0; // <-- returns the absolute highest value we want to display for a given data channel type + + // highlighting functions + virtual void SetLapHighlightTime(const CExtendedLap* pLap, int iTimeMs) = 0; // <-- only call if you are a HighlightSource. Sets the time in milliseconds that should be highlighted. + virtual int GetLapHighlightTime(const CExtendedLap* pLap) const = 0; // <-- gets the time in milliseconds that should be highlighted. + virtual bool IsHighlightSource(int iSupplierId) const = 0; // returns whether the caller should be a lap highlighter (calling SetLapHighlightTime) or a lap highlight-receiver (calling GetLapHighlightTime) + + virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const = 0; // <-- gets more display options. +}; +class CReceiveLapOpts +{ +public: + CReceiveLapOpts(ILapSupplier* pLapSupplier); + virtual ~CReceiveLapOpts(); +//private: + ILapSupplier* m_pLapSupplier; +}; +*/ + +/* +// Pull in the Lap Options information so that data collection can be turned on and off with the button +class CReceiveLapOpts +{ +public: + CReceiveLapOpts(LAPSUPPLIEROPTIONS* q_sfLapOpts) : m_sfLapOpts(q_sfLapOpts) + { + }; + // <-- gets more display options. + virtual const LAPSUPPLIEROPTIONS& GetDisplayOptions() const + { + return *m_sfLapOpts; + } +//private: + LAPSUPPLIEROPTIONS* m_sfLapOpts; + bool m_Button_LiveData(); +}; +*/ // net-thread entry point. Fills a ILapReceiver from the network bool ReceiveLaps(int iPort, ILapReceiver* pLaps); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.cpp b/PitsideConsole/PitsideConsole/PitsideConsole.cpp index 25a561f..3955e44 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.cpp +++ b/PitsideConsole/PitsideConsole/PitsideConsole.cpp @@ -42,6 +42,7 @@ #include // For Listview sorting routines #include "DlgSelectSessions.h" #include "DlgTimingScoring.h" +#include "LapReceiver.h" //#pragma comment(lib,"sdl.lib") using namespace std; @@ -570,6 +571,7 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) // HWND sub_hWnd; // Handle to the SubWindow, to get to the SubDisplay control BOOL b_GreyColor; // Switch for painting listviews with alternating lines of color INT i_SubItemBest, i_SubItemWorst; + BOOL b_Button_LiveData; LRESULT DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -1932,7 +1934,22 @@ LPDEVMODE GetLandscapeDevMode(HWND hWnd, wchar_t *pDevice, HANDLE hPrinter) UpdateUI(UPDATE_MAP | UPDATE_DASHBOARD | UPDATE_VALUES); return TRUE; } - case IDC_SETDRIVER: // they want to set the driver of the selected laps + case IDC_LIVEDATA: + { + // Let's toggle all live data collection threads on/off to allow for lap analysis + switch(HIWORD(wParam)) + { + case BN_CLICKED: + { + b_Button_LiveData = !b_Button_LiveData; + m_sfLapOpts.b_Button_LiveData = b_Button_LiveData; + UpdateUI(UPDATE_DASHBOARD); // Redraw the laplist and buttons + break; + } + } + return TRUE; + } + case IDC_SETDRIVER: // they want to set the driver of the selected laps { switch(HIWORD(wParam)) { @@ -3129,10 +3146,10 @@ void UpdateDisplays() { m_sfLapPainter.Refresh(); m_sfSubDisplay.Refresh(); - if (m_sfLapOpts.bTractionCircle) - { +// if (m_sfLapOpts.bTractionCircle) +// { m_sfTractionDisplay.Refresh(); - } +// } } void CheckMenuHelper(HMENU hMainMenu, int id, bool fChecked) { @@ -3804,6 +3821,7 @@ void UpdateDisplays() DWORD ReceiveThreadProc(LPVOID param) { ILapReceiver* pLaps = (ILapReceiver*)param; +// bool b_receive_data = pLaps->m_Button_LiveData(); while(true) { ReceiveLaps(63939, pLaps); diff --git a/PitsideConsole/PitsideConsole/PitsideConsole.rc b/PitsideConsole/PitsideConsole/PitsideConsole.rc index c63327f..01a7a3e 100644 --- a/PitsideConsole/PitsideConsole/PitsideConsole.rc +++ b/PitsideConsole/PitsideConsole/PitsideConsole.rc @@ -27,11 +27,12 @@ BEGIN PUSHBUTTON "X", IDC_CLEARCOMMENT, 237,13,10,10 PUSHBUTTON "Use as reference lap", IDC_SETREFERENCE, 250,14,75,12 PUSHBUTTON "Send Message", IDC_SENDMESSAGE, 250,28,75,12 + PUSHBUTTON "Live Data", IDC_LIVEDATA, 250,42,75,12 + LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,56,70,10 LTEXT "", IDC_CURRENTREFERENCE, 155,26,93,24 LTEXT "", IDC_MESSAGESTATUS, 155,43,93,24 LTEXT "Phone: ", IDC_CURRENTREMOTEIP, 155,55,100,10 - LTEXT "Current Lap: ", IDC_LIVELAPTIME, 255,42,70,10 CONTROL "", IDC_DATAVALUES, WC_LISTVIEW, WS_TABSTOP | LVS_REPORT | LVS_SHOWSELALWAYS, 328,0,190,60 END /* @@ -189,7 +190,7 @@ CAPTION "About Pitside Console" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_SPLASHIMAGE,"Static",SS_BITMAP,25,10,200,200 - CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0018\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 + CTEXT "Pitside Console for SpeedFreq/Wifilapper\n\nVersion 2.004.0019\n\nThis is an Open Source project. If you want to contribute\n\n",IDC_LBLMESSAGE5,5,230,245,40 CTEXT "http://sites.google.com/site/speedfreqapp",IDC_LBLMESSAGE6,5,270,245,20 PUSHBUTTON "OK", IDOK, 5,290,240,30 END @@ -467,7 +468,7 @@ POPUP "&Graphing" MENUITEM "Set Split Points", ID_OPTIONS_SETSPLITS MENUITEM "Cancel Split Points", ID_OPTIONS_CANCELSPLITS MENUITEM SEPARATOR - MENUITEM "Show Traction Circle", ID_OPTIONS_TRACTIONCIRCLE + MENUITEM "Transient Traction Circle", ID_OPTIONS_TRACTIONCIRCLE MENUITEM SEPARATOR MENUITEM "Show all-time bests",ID_OPTIONS_SHOWBESTS MENUITEM "Show driver bests",ID_OPTIONS_SHOWDRIVERBESTS diff --git a/PitsideConsole/PitsideConsole/PitsideHelp.pdf b/PitsideConsole/PitsideConsole/PitsideHelp.pdf index 6e2eb0fa8c70fe8960a7c771b2e775c75b2c2cfb..53d9955037f58bc28af464c46f8def1b44a868e2 100644 GIT binary patch literal 5435039 zcmV)IK)k;tP((&8F)lX>3N#=vAa7!73MffrWo~q7ba^QXWo~3|VrmLCATS_rVrmK~ zL1b@YWhn|}Ze(v_Y6>_YFd%PYY6?6&3NJ=!Y;|V3y4WH8sj@jCYecMc4Kxj zAv0MtlbDW^sNDYl>UM)moaOz$@AG`$^L*Z$-???`)~%|u)TvX|S3-=4Y#4i0wo9ifO~gl{WvlY7tTRCq!~b)uPIVLpKH8OcZ+%WsX-ZYj!S9 zxNbF3S}Bnz%x##r=qKmx)6mqzMEb0Gl}!y4NeO5#7WG-@EnG48u2=NiiTYnjlvP_> zQ(67Zqw0FpH3ZMIc}B?FmZi9F#(iS#qUNja$qYG8Bt)WrFDN1NCpzff8agEq)s9V z9)#yV2Ae4e&(Axg6TFPPlrjVP0$FJo&4831)n{orqI8{bkYrNiU2-P%Wl7p~thk%r z6=j74lOl<-WD=x%N$2yBb0(J{e{tMorxP-Do{@C%Y8m}mF|j9|#D1r>TP45EIVDli zm_x${{m`DaGdKMQhtTPpAbvpALMLU(8+;$q|H7fm_TA5~@}Fs$?g1LCr3d=2x^@~Y z&GP+vetG?E{%2abPtT>b`(`@Soi^xMq?Y#;b^NRLKp5fam zXI z6#4VXrQ3pM&rp)wLFKXm=?ZWwibQ<70MFTXNK^dT#lnFYJ27+c$w(n=k)@TmpfDWQTpt+O_nn#0u zUK&h8K!?y!(4iW=g029~r+nW}Dyjml zrfSd{ssWu#^L*dZJgNn))o2~nfzGG-pbKb$?;Bc3i$E7?bTKUkt*3g>25RtqO-rZ| zv{9o?)CAg0&7ezZsqb&JjFy2er>j7((&!3W0lJb_`u<8+)77A>Xf^0+jjo|Jpe@wm z`-;}mTF`4~9q2k*54v8X8)$>ClQz;u&`q=nbTe%M-J;QJ=~~~Hw3W7kUPsq~UQaiG z-at2k-U#{^x`}QAy_s$X-A3C$Z=qX3Zw38=w$pad+vqmX9kc`VcG?NLlkV_!&>b4x zMR$VUsnNUWF3`K_9^dD5k4Aq-yFqtr^j^9b^gg=Z_Zi(!4}dNsf=uOZ! z=`G*;^p-~7rnf=gp?5&vrFTK!qxXG)Mvu}5pdV=T7##!skUsLgOCQn4pdZsGpr2^; zQ~DJ2Gy2T;4t-7?pdA|hg8l;f7ma>NU;5srPWlS;EBY(wU+Hh4f79sK^tJCT`i8y% z{g%E1{Z6CD={V>KI^lbhzNha&|4u)E{y;y1{zxZ5Pl6typXeu0FL^b~Njrzz3%6}L0|4d~kk*8QRprb%0u7W^4 zzq*~96Hr+0xwTkBLVq)FBvNv3INCJ+yJtGVZ4z80eBzM6^WjCsBSwxIJ!UM8pHMP! z(&Q;qr%f*{n=$iB`kx+m-*dsO|L4E9p8Es93y1%0EfVa7Fc&zH3I^?k8DSXwaxuK` zIQZ2m@R()rWGgTRAH~Rd&S`TF?-h1N^7)9g@_kXh5amanSH2Sd?!xj=gYV0KaaQ?$ z0y;bH=~({RgLF6WiMpsy4I+|>WT`yG2CT!wif^34s=DUyUk=QbQRVZ`}L(ZqX|h9 zQYhQd#)_|CT0$r;%4-uy3F_CkH8ibNNGjr(-|D%p0twe})PyItb5Hj94qt!%Bf@Ll zDVsmVT6Kl3daYe&U8|?Em9BHP^*y}x`h8ZKQ;}w_c2!qi3CUHWk8LC-71d7RaxCJg zsCBkVs9Ym4$Z;0cI=8yGIErd3KwZP})+O_i9bQl>@kx{3wg&}mBVBFYVXOZ2;?B6sQaOl_h1w%XmwUOTWM0M3q=QU zQZtCQRt?gOC!vhtt&($ZwaQ6WmvigS)XFMcCyrm3QyIw7C0Tzao-B41S8Ux{>~a=w zt=L+*&$o7t%V~9OZ5uOYYeP{5S}iHXTl;*^T^G|@e0^D~wW5~gLH67NiYJxk$0UT5 zb>EhB-x5p;hGo*&ffVrHsK5nMrYWTfP6%phX;}>9RLav+koI4>A;EA5LB|2HaT(PN z>Jd+2AeoTBt@FBl9-4!j*0mE${r66q6SIdr?lkD5fAgcy;hjA6hLkz2A@BfPdy`#bCeA2z7H#dZ0)I|`Q*H+^bysEW*1%BWMi28~P>`o^ zq{~f1P>qvk6t{X@1#az0bqBSI9sfc7t&}ikO3#f@h#@{Qt=lvC??-hzJ=~U*p8tAJ zxlkIz#!SHofsZO^bFnQG+dOQ` zT0)-U&s(eIX-6Azc0ESfqj(G+vk)Z2v@xEw2RYBd1PqMY%`Aw;wBfBuTJ}D+w$0#) z@t0VO5*~jKw@f|P^wb%p?PkJj8bw0|{D9|*tc55`UCttBb*rbObX8gH)`~LjAJ=ig zw=zy=mL|BYtKTHJ@>IuBPn zu5$y|n!t5!;Mx+n&Iy#S4BS@)uCoKzS!}u|*zRcX-RwK;6MbOIG0cR%F;>P(wKq!x zHB8%ckIw;~rv`d7#eW6Q)7yir+4KVL8JSrT-Zel*!}nNy5MbdR3zu>M^+t8s z^W1&Rw#UXVY>&h*v`6HZAdd;TDzdt?d+VNXUV|x6uhCzF!IOk4&a%@}&oH0kH2EA~ z|25X}H=yA|<~hn5-eb;p)87@~3!iz{V9jng!jOFS4U;wd^;be2NPDjQv)P*cDsKJ= zybQc@OQ_>_yFwk0>~cEp0`AbMoyhKyUb_0k#$+lJPxC!8ldCrVC8o(@*>S;J?%N1n*f(6r~EAvk-= zfrqLaa~KAW9ynRj%!zsaooKz)UgHF3~bss z#<5{znq&ROJjccsm&3iWW#dg7#Wy#yd)I|Hb_46yj&WSmGRCpCCDO6FrN5(P%|NX? z53IqUNUa`RJ*K*>x}thnwa#iuaD<2Tap-jkj;P2!4oOUK*h2d_`u4N*NefO%wIufr zPE4}&as@jREb)%unAo_W$f)R`u<(eWP@6pn%M-IXDA;T;n#?-AViqOYjCGCKYFTR$ zJi4_y!6U8}1qXCc_t4JRyF@qI{B~NjPxr&1ZDUOm%)*3p7;DB3g z4A;p8t(j?K;Nd20tJqUY!Tew5`Quvi!D~uD)h<|1wERl}WX{^t6~EK1kc>PI^~-j>ewPxu)}KP1_I2Z_7ViC>N=U zTv$DKYx`4;YC2cTU?U%q{cMfzYxP_8QIw2Sx2fgy|LZuXbKf_pDS~#Zv(+-SOTCIV z)8@15eaF;;U4752@%8t`Kprm0KZHqimb~-@z01Fhg@mGzr;tkD&>_bf*4}oDuSgv_yY}`_PjBWlSaW1fL}!pSN6(2)FA9Q4^p-`i z7!V*zZ|U48GTr4TC_mF3nwvWyo$)crM3>D4NF6WzWo#Ruvv;)%<2Z=xzR1eBmYck36gz7PT1X270F+1PvLRI^GUweYlS&9Uy z;7bt!t(T{zQNDXX`ewO*+UC_Sl`{-B`RX%wsxL}&boO5!)|ZmNzps`bgZ1iR#k)O8 zIzzZ2TPzlfjnl>Hir!#QjG`=sNlDT)X|5zoyJekh*yrRw%+JgL@;tJ%Sy zhNy3_boDLy?X&ZRh^}wAjFAJw93FfR#e4sMKWiHZ#h3fZ>O zzzmWrrXr>xMvRGx*haRP7}3lF0jtTHV>Y{-t_d!|zFK^?7Yv7UlNOqb`I%d2emUrX z^m0}%J1JyfXij!wW`-0Yx{{M!y(q*Uo|%!IlPT(SdYw)WJRXHP9$FWov_A#qox8}zDq3Z2(E7V=;cYAi%PgCy-&9sJv zL-_ENx)x|S7@lah$CD^d6(=WDCp3r+3A(80=xg+fU9VRxt5-s1`;sh4EHPIpNY-cT zi}lm>OZBooF)1-m|8!#1Es7X@iyrow4?S7`nx?mwccztFz2zr1_fK1GeQ5xd!y@%M z$psaGsqk=lU~=zd{MXCn5;HS0aZ!NZsNcWP^%a8ezr4?+lEqEx;<4is z$E5dP);H)ASKfxytf`qd-zi?-rA}!a-cNqJV9?kvUzmGqKYN%goh^~&@aWMj8T|!s z@(bY2K=qywohax9z5W`-U{@4_BoS9hCO0`U8FLK<$x60TtV~yyDzaiU8S|8b>!a>GXt^ zX|j+l6brM2dSR8Ivxy;LbxU=!&KzXU(>-mLw!LNOFbL@e zkDNpn|e9{m(~rm0!hTY?-x z4MC#8XuL+0?4l@{bB$7zG)gLy>flEToFW(ca#0dFBcd2&P7m?~2?ps_ooEzqW#sP4 z$nVNXXXPveOlZ9?PxE)1l@EX`uw~j@=r1fwtUSAO=ue;hG*qnR7p92+#T50Iv-y7M z>z_m)%`9a<8GRj|kYFo~mz|sn8a3`iE*vM%HE6k78X|U!3=iLG57y>}wVrJFJQDSC zkSRorkmF2lDcRsQ_A#Z4d8W~(QmM>TZCq$tWmslxG1*CwzzFHhFvGJRK7Y|QCPA+d zv$ABC&5E%$t!JxvFcfT%vD7)}aifrKonFxgT{HrNf`c#ugGi7CqiB#!B#C;1s1LYJ zfNx5Kc;vZqi!92GW=vaaLDJI7)605P4>y{2_%P!Ju=(&|q*-W4MDBpXsio;<EJVv)EDQlx-86OW7wSCq9~-_^x5EvLRB8xX8jI zA|qho5w>lTqzk=8FX{s0@?vv7ac)$?16e7-#rvKS?sq_%>&ezh>Ik*@mIiLkLc}c} zP8dH)ox5h$o%6On^`exeo>HGvW8}9}1`N1+*YqiB!A-Cn#6-GY+RV7bGoA@Tz>ckY zx89?#(6`8I^*8HZfVO14tmGObCKZrq6_Z6ie@+)yiF#2nD0w6@Q8XwXL%pHJATnv2 zP87k&In!Peu_!Hy~H66ZW4GUA#3*=r>+nEVc8$t-i|NWBTPR*{} z`^n@xy4PT39>}7b`Q&b!J5r1;s#$T@k_+r;@G|D3g>q zO0#l{q9~GH5haVsVRD=DO=C}JUUUwBZKnpIhCg=pAP~= zS(~k0htm#YLfU+|ysLZ(0*7*BDTm89E7mv4mu%(%1YZck&54?i=oBdaHgUhNMp4 zN6AyhC@U37*^M{!#X6>2BTF)a@raU+BsrYya&JnOM^LdmMXr&T(^9PLWs(iKQh{EK zfca#JMFI0M7!B}@MuW@+9uY+2Oj3-LDh+34@SseuNQk2ZzY{1=OF!o){idV|1Sr>t zau|aHBb>1S=eqVT!$x(@HR_}6&KKD8h@9%X4h#Lo`@8lFBlw86`Tin#rS)W{4Ep_k z>Wj&Afx(<(vODa3!umv|r03Z)BL_r}HWf!tquHiOz3WYLdM|S>NnFyqp|35L%t0CP z8S(L((g)bn(+6bc4k$>^9GIDx>@fx9BqxWb_j_)jWuSYYpj#hKKgP!Pu}w&3$;rKT z_OWId99cFU=ciarfm-HpCh1qJx7rnN8+|T*Vw|7R&{*Da@2?$}$z1rkR>edQ(EL zggn#!1T#hK2(g;tck28CJCWbx95Gv3dHf8YuLWsZcqaH|(p%4``Rwe>49!JCDq=XK z7AjA#npS%JrdhY;#i+k$^Vs~B%BL1S*{-giRFgF~cb#kefQMcZ&fcMRELe0+a>^jA zr#>p2_~z+ZbCTk_UJnjodRYBv*v(hcI>g;qdrUEjm@^$tQ*cf&H{uus$OzWLLk*$f zg`rc$X@)6bQzI+Inn+VTkJkF3wABM*u~NLlYK@nyR{QN{YkYk4?Gzp#Z?!Os#pQ9a zi1oSy-O)9?fEHY90d`s%qHBzDxfc&TvjP!zcp$>=HVz(P3k#e6G-lMKrrNnI`LTJg zO&^;%__p##kF;#6eQapv*oF7U=MEXXXX))stejonzpwhnh@v0&u3j~Dp!$Y8g^!OS z-xu;x=r){^=~hqesNiu)lPyzX%aayJ3zJp}t4u3{o9rv&&0!JATF|#i2uIKt-a9wE zz#*_?AxkI{%7vwv(|f1%&U*{XW<-DW!Wv;MvV;^%3UjVEnxmoo1HHp3`u0$(;M!q0 zPtB*w{p@QKNMmOpIFhYg8CBW$83hjZgZKC13icf<^wklt_l(EDGU zH>322^;d2gS$}Wbti)+s)6+6$RSZ}(KxhB;_|k-|aJ&7z7k9I$g>|cvdb7{EMg>QV zEg1al)S4^%#&emB@%=@1N}HhK-qhk5kz~eFxEEisOJQMQMe!xdL~BWWrBZ9Iur^2y zVJ5?mEzvAG+NgWTW~D@HVo72}Vnd>wnCQIS7@n9I9%P6UH->9VD@+LC;i=YCcd8J# zG3Y=__tNS_NN&iv<&_q{uBuZ2H^##<*$xoSa|Q|-8eQRS?~ul;fOI*-nzTe_iS zfcklVH;?oS5f9JP#Zx3L_e2?`XsM4>5wX%FN02COGGXB?GbUR(H*Q2{R=qXa677f< zqOdlRqoSko^vQCTTqIAEm&&pn5)!sEh>4_o$Y9|M>#HQU5YCd=*mSkfi{EI73l=PAB+_J@1{2gfVnUfV|`{Nn0wbzrAI}XJd2vPJXmt_Vp=gnO1rH zuFB`%XUmwW;_mdQ5plB^=weY$wSjBQe$BYa1ruYc!wz3vY#RmmQ67P<%A(B%bBKYFg8RsMDfMnCMMY# zV6j=Pn?geEAt9m3h?zn{*>f?Ln2H!7IybZ+IV3BjC}dhlbBG)g9TS}wvOn5lqf}xjA60Vt7Q|eoe5our#fqXrH=+ z`~J0y_btBTLHOpe$z4f8KToNvaBx!6*-m)%H%(~9TAhc-g8rU*T?;}%ooL~)Os0PqsC&r* z<(9+ZPn7f3sTR8kJJhr2pTv&ktLyTmsxx;>Rjf_@I}1TusgU}9^v6V>c#2G73<63I zUkwQ&a~cwJ*d{!=R$+=>F*ptVbMyvg*dj0iF`Ut4oUUK47kCi7NtSgslgrd#5>0$- zEy8TcAzlv&CK6r7bfd>uf`FHgWS5y6F_x|kL4r9~SI|9#n=yp>%2wWQHu0G+2s58T zf+!m;dg9}mM{Vh87p!E`%CVYD8<6G?-3}ivr_EO7uyR=LT9Sr1mgnLMQ%^_`{n~>} zq)*k2pZ;#LUu8$xDfYXrU)T>fs`u#ZXJ@k?)Clrhqi|Z&({N8ei|mj~iZ?IZEGoWUz4J8ErB8~pEpBz4~X9Jg5 z67{hrMfJAzNp&VArS*2EWhZ5)4Nn@LHoy1E-j-ymWm8C8yxtyR?+x!D+3ge;<8;Kv zZivAC+g#RoiyRV%5yFSaMS~<`v$gzicL*8S0>OA;k$fsC-|TlOvu;ua?bpUYW0`aGpe_G&TJO;_*rIB`}TLwm@~GiZ>oE4*|4jG zSMO1eSIw*c;k_L!cwWuY6J0M9Ke&8e{pjKO&&_G78iCpHRkd241})gox2>LW7LkRT z?G7=-7Hc0ITqN*FzQMLEvc(Zp9JDM*FvQ0N2N{ia*o( zHPdH)b>ocNhc1L7s@VLPxlhzR`iz>E*1u#P59^&%`^~&wID4o1X|0tq z{>`oz@*k<1S&7j8wP4G59`Qm3jgWx_5$|1|C8L8!#mx+!AG}iE5_5Ij)y{@QLo!)H zZPt*GO|~Sv&6Z?LicU&R8k96YN$#DSRIt&;^tK3FZ(Fvl*tW>F%%->T(3fmho72`} zTWh=7rnA|26Z&$=EPkO}9WZGjVq76vy<6R}BCRShbH>2?UtBzM=JzXS-jp9DmIp^nx?<>~SC-H18!z@d z%>-l2P)oS=y%!&5@pZLLX~`LZaVlLY&7)9S?}^Gb6=R`x6-muzrZ<}~Gz~_(!C(yK zy3W8{5E^Q?*xh!)mTN3XHe?x!4ATtF2H9Y<+wu(iZA3bOq!vk#B#XslG4Kfk{1#3r z-79&p3QsG`bYHj)meyk#Tma=P5cr+vr6jX6vNUbPhTU?VG&(c zsp|J*W(f%8d_VcVkoH2)edvy-`5tLb6raIzkQf{~FuB+|I&^emadL&VK5><@Dy%WC zG1XjeuSgMsQ|!H@2#Vpqo0Y_{m>9=H5mt$F9E%)DGCf4$!5b;Xn&M1JPmxl3ZM3J@ z#b{o@i~`ZoeJy<(`U;{uu)l+KzxJCR5BvO!yAZzBp+)y{uS6}(i_lCwYoLF%mzZ$D zQV$Qq>=OI%X7%LAqJ;3mE3&SixMIb$&0jsjrm$XX&JHecjQG?1rmN>SzIQ-<*pZ#c zQf&RBA`%7-OzGpu+R@|MhDQeh57``@R)V%MVaIZTAdH4P`7H zemKZ#vzd*0o!MsFq%+xdI+G*URFJC6)s51X>E`RM(&=;#rz6i3(-I@Z!~}Dm4RGYa z!A?b|i71Tkku@OlwFc=QG8ru~F%b}#76IpHBKUWgb61d=$wkv00r%{JSceSJ^DTVD z2C{$0gRcSjZa&rnJ;NXqBY=HyV7F0Oxjkq5XjV6xP0CT9EH{Q07RSzvi61m{bNJOO zoI_Fs`w2Eoec^<O=;dZ~(H=_ya`;OH^YGot55OU7*QpDTPy`{~5?>K7 z#N}EGEOGI1c`24Ui(oN(qT_P3-_^`UYmS+$79sMszydf^^NX3~Ju9K|@+Ew#x@bzb zYF;w!qO~xjbDmUe^7TBTjLV+aKd-{Q{V{~XY~eK)i>It_Q{g@yV6Jiv4UG)B@w((; zy@ijv-t}DREEt@eD8}+pk11Nd4l>bE>wc1bhqZlJnQwXy;wiHnE0^gO=~n7wNw&*Q zS;UoZaSOW5cw3e>h@#LB)>y$Bn3S*ZF9P}gXN4E ziAS~MG|@QXqtj>zqOl|k{wNw_2l0L+{|VZ^S;_|u4=VX@sXUbA8~)6{3o2jNHAbEL zC~KO;+Wg`4*)yWdd3y>yNCR(XR?qjC4|ne|ANH8EJ!TK5n7w}Ke(;NDl=eX3)W}SV z$z*3SN{p#DOHIXQ(qDw zt)z85t*#rRZd6y#XAKGLCYE2suH>o`e(o|sU8hAI2R!#qSmX21n2El51}mIU8ZUCL zZ`V==oKlccaLR5I)?0dm(V!S*=mEuX$tZ-F-4M%#w{iZ5e$SX2%DLL z=u#2Tl0nh2C>E|yWy$(nmaQMfiuGk|n!b`P)-Pde^ucl$;2!s|K2t8Z|Il9$GOY3z5LDE2Mc@<^NV7ANx1~YEVqRJWW}`Ksr(XS zpQ|si4ehLu?e6+7=22HYt?p4Pg~39K`Y4;$^+wlQY=-)v_Ny#nnL8jUJ^hi7Td!v| zw^G54@&sz1mb}e@t-;P%CH=(#Byz8Kf%AV&;F<`W%2u2 zLnV8htx~Jm9%)>cQ|N$WIU)>^?vj7Nnk<8sdW(F4C>cmF{7P*#}zKxT067!=R24@ zZ*I~3?&#EU6e&=XRBZsz1FpdBms>H@*DUp3!ZFz54T4pki0MS6SdW$cng8=P(aNl%B#JU~ zhiHx@@EwtCJG1f%X_H`OW>_)*3wBbn{1M(9%sP4_qWR}H>5Q#2@$JR5agKu;480Zq)obmV6$F;->adBca z-|u8HxwRcnz8iGmt|#C0Ebrd&v}(J5hy>gx_+ltQ`+mW{`+!4>^67Pt=P%bu`ouYSI0~^5M-2%Y^DDz)PLlZ{%#T&uh>m6u1 zup4|oi^x__9Z`22*_C~VK6X(_$;Vqpec=91y#q^w{_(T=ui0Yn*%e;8J3T!$S{MH7 zad<$}j0up$a3XybB#}lLdy~S#QX==U(x($b&gezcK329Tmdpp3fn+i;3*~3#XJ($r z$jIj;B$L~**0=LFs-dag0ZmjLA|M!{$`1dlXI3Sz|rtPsydHjLXE=A6*nH2xbwvKI)rXf1N@2>ZDGwA#bJkt;L4h2xdcwM|gj;Ty=T)!x{h$K% z3+QpS?_1d-T}6=;-yS4{NQc-WieSUZh-(Nd(0bti+7(OQ3x3>m^&;&j57{z0b;^#czE619;!a=BZMwdU*ZW&9%!i3)J^#vG6yUj@{39^dSj(G$f&5R*ZZB z19&lHUZ^!mT)^74TP90zN?~ZgCi)lOE*BHoEi9i+R=23(b2pXx?%R2TH0QgI)PJZ8 z#VK6}I)2r()9H-zAy$u&h&NS_CWi&MW8u`G+^pxDaE4d z6*U(kT+dcx4RMA@Jgc=4*JhAkU=5_>S^<9z0lj44KVE50CcHy}-X&%Vzjg_^uipG> zo}lKva`P*vg~g{&ciqz6q!2~ zkC0(xlF@EVG>X?E=pTvf3G!@N7>bpH93!X6qES{PNpDj8eCW?<1H-jkW2IdC&RJ6p zb9H}gC(lvuzeD}Q=PT||_o72r-Nd%D2ZTG-v21S_y3_Tp(2vVB2{OG!v+=3zo3PU2 zee2KrrZ3S88G0t^?fOK$c&)$$t#86?K^Q79lMo}M38EegZrR^4si$M-^-7Zp?+}Br z+@wCQK5?V^9C|a660!y7!DX{ z7y$u)MB3LTg660~fhB$W;x0X>^{|d zY|cvc?EO`1nG*0&(g|>HdOb#qMhmLlkzg~7Ks-79-{$ ztZ2zI9;F0EoN$281r(%-@x-U)d}Q!ppP9k;+O$PZPO{+V9DNW6_V6xNMm$oH=gex^ z^uT`kgA?p#w&W+4rhZlR=AQd&>JINv8XSM?byrJVdZ|Iu!WE~VVAre7(wqmbJzdG}P(RqS9G>Aj-*M@2X&L|9MbFqGm`<`td{T5m z(_y$;ARWyC@+CaqoaOZ=_wJpj?aTUIAm5ag_@-=vGt86v;+IbsZ*!?fSpkdv`s2YV z_q=~7zn&ScQNL6lQ@<);*7XY={W8pR5AFSMwCbyGj8Bdqe{0#E@4;Cecu&>hg78Dy z)X$k+tg+1<6nF33+rfm7tIJ+ix4o<`8!D|AOV2(mmNFx0yP4m}m8ii^VQn_ULA+>T z3%kvh2X{ItLDL}LEDW=2TZIYI!GY@6>Sy1c4ZVrg-)y?KZf5ij_|IGZ^2(p~7LFGd zblsYse0$ka;d$EjQ*3mG!wJA#R_C<{9AIW#YDW%0on z7>3>Zb2oJjRkuFJ=G3xw9n;2ufcj>%$tb_>}j7iMS5}9}{T$t87 z{cOE3RL@NM7=4;vWJbMc5KO##I(U_ysoXP#p*a6!JY#yu9BZC$ zJ|1*+P)Bfm@NvsBOQ-eukVzr0|DQfXr-bhOkIttraem=HZ3}HbUOq3Mm(R=R<@54+ zsncF!KOC0)zkHU3JrMR;cu@Ei;d8^E2>(1nhqE}MGNLu&=SX*CRpj2t<53w=lcP37 z?Tr?rCq-X-`TW1?yyxGXdoQ0CpNMrwigSDZj$j6L|4l)L^ zNK059FAt<;td+I~(mD#I9f7o-2KUsXP#Eb0X#)k*!+~@V8%xgw(!tb6;J>jkiGLy+ zFANE!CF(Eq)zUKZqlNi_w1o0Aw6qTSc42!UEm5MdK}+kAA1>?*q$Nrg9@f%|R?laF zG_U7~mgfJjxoY8;K$=mocx51sdc;$Kv`Bg4JApLn6#p7X%M>Y@18E&4N{NBAo|g60 zqfj4F7f2f@RvH;d2MIf+>OeY}rs&RUX(N||z9Nu@9P}kx+JyW>{f&XNL<99}w6vM? zrT;@94Zieyv~;kRe>{-p`JZTMEAo3O;eoV78H&GeHqNgyGLQz3${;OmM}DlbIFOd8 zuQE$Zhw=U>y8>zSN7<^S`M%aND^5*l(o6nQKIUxT>oEhl@vYq4Vsv7H?>gP5)3+o#j>KiMY>*^Qx zcMe;)&^f7YUTt%eb5c!HP2;kf>i*Me8mlW8S32vOoR!Yz#>(oNMU{;Uob_{^&9yb> zRWz@$erW^GuBua1Bbhre{Ls>R)fFWDolcy-<4dCta~rsl@FDlY2tTF2`> zbq&@!kWzS!76FD~6oOIZ-o-ypp}E4h+RT(aa`+*kLM^4E89nPRQg zW~9da^HSm#@pwfy;(pvcf;Thx-%Y1%q{iXxD!f^bdg{?WueT7X zMrzP#C35PJTCDx0-C?v4r;{cjZywd+S(A2GgDY=;nb!aQzv*+GR?aUAUS~C)FT%AE zoI163`IB1YUb;u~wELy#Q+MeqTo>V~9jD32-}~j7^f+J5+M8usubmpND{x(^$;r>FUnX<47MnHc z@cRbsy+wH1tkuDLI!AlATRufJmBvC7{&ySCd(xosUX50&v>NL)UY2WZRe@f*UH?5V zTLq4mYPzY`%GQHcYtI|-#LoejM0KF8xR7} ztC6!@GOf|{S|6Z(uKekxxNFd;Q|s+AjhmXDdU(l&+Bo@F8miSK z*MRZi#<^TO`)d-taQyTSj59aVD>M%0X*@Qdh84)|=Aw!IxsR+1_{hS4=_AJ?zZR)w zsFA<1^dkSpb1!~pgw~g)3&!#iyi;=tpUM9Z1`FsEYWhZ#WHpY96$Fcn%tyf|-N z!%^6y`l=dt<~`*v;B+T}Q{ct${_2GwBsj(ABq3HdJd4dBBOVJ*4!%tI;o};HujJO# zQ&LHA0b+}Aeh)j3Ww|CX>Gizw)CoZLq4tUA(DUnd33rTDvKzt}+LnTOpp&w!veS_6Zs=ypg@9q{MMus= z&gWw`%lh)Se9YbW*3o+*tag-A5+^Y=dx%Ww^4=kcG4dfr~N+?jK|IYmW|;>hpa(Y4Ia$JLRiW?Vil+ElO1 zZ?pCV|F=_EAZ(;9N1ICt+;HxmZiF(Ttq}Y`Md|aUDP7yrnRvkxc|XIlI!&?g#Tt z@9RsNt_wiO!QOMgkjKK+!?Ve=Rk%GCSvT3koPd>t6{SEV5cl0O zwyn=xqugy+nwt(@b}U2=ELUfDM!f1MmL4cb$dujquw1)tDso1sJ}P%jWryxfSsIvq zuxdLdgz(6EoA5-;7n+?hP3v;?h)$YNjZki3K4vb^G{T<wV~g$oqrqbdL9#udnd$-BBTY!9JuSf-$+-{S)Jc z2Y=9-Px$4&k#mCLmi-e;%yllPe*A7X1wi9N>z(#vaQd}B&=&7}+_QC;{86jRm-fyU;i>#!^3Amw zibov+{}R@QFN)?$z+8jb!}70NFDixYFEegf>@Imp@kP5IEV#ooW%H6`XQsk5c@(6m zEDjQEgdaK9k&243*_|aly=}jY-#?0i<IxEuY^T>MKI((iTDNvFXiNNm=&QBTKtFm5ysdPhT$#d zXV^G@oVU0Ka6e$Y{e3?9cB1`&gY%QtfBPN52rkf1`z;1ODk@ActlEp;en|L;I4^=W z?71q$J~1=F;=hVS?0aG8Z{O*r4=WEV4NnOZ@BgvWDF-zLW(2+he&}6+^)vnzIc1cWFjk!M760RE38X(vGc=e!Zi-Lvp>75 zA1O|>dSe&v{1T>Z7&DUV41=djsc;ViOTGec0~X8w!&_`)Bv_449P*(&ecL=R)G(B= z@qUAyIQl&DK`o{Jg!&9iDM&N0&YfQRFjcSB;pq^M{1NK_@MiF7ei7c2JTsp3c5p}6 z;Gc%yB}(^_&prv<%EWXHWs7EK3#Y37Sk|}q%pEoLSM$~#^83*C{TrU*xiIp|zS}#0 zj?Wt+qy3Z{9e?Wx{!1g6#ecgVti3$Cs_}?D{|orOj249NCkxod@ZIj2&mF1%)JO(^ zGd~;7hNsG_Bl1bHyq8%wt;6%OFhvIu21ORofdu-aapEv5>X)*pq5AQC)G`oDNAo*_jtn|4ixl>?#D8loZ zK@mI(A_H~Dcx+0vpXck|DO3caALPLC9QdL0-?{4}cSVAqY$5pZ$XIoYfBb4(S}_oYs!;rcd8e*8|(}ab4dM zx2oP{L6hIAoTOn6UCT10e70w9iFu#QzrDU^ZOOp)w5ri%L5ugKob+Z6-Lo{Lz20z4 z4tO4 zx2huLP{$y$3PEe=L0mQnJgw?-Sr*46ZI`N5EZ`0&r1LGrNd+hpFR^4 zJU+5E%nlr>KEC`5oV*jeoR`#y;xFF&Pj=$#(=nmr$9Pb^py(9U$6_M5ds_0us4A+c zIQ0dlqS0{R^saf5l`T}=BF`=0dUomdF(|O!U^!V;2btx)iWJ5|iGG##i!_f?nw;EF)n*VIed#de$_F_T%rb~+Y zN%Nn0P2X%O@`DV_-oes~PM~NDW5i!n8`Wpto@~^+y7^EoAh_`6Pm04Yh5Ff>DpSX- zZ$AoDk+qGR3hH~m@Omi#Yrtn}*cy^SQsilWKmj`+BhHFxMhSZxBhHC=Kq*YJ{b)a@ zaI!phPiq%Eo@MAw>Lv2Cse9Wtljxv3e^MTvFfA;Yd;)62KZ#(PQNyB%<>bC(!}0$g zssIG{#`rp~8!!U_7PZ2!pnr)Nfu zj3$!|1Zd5?33(jCaA6UJzo+|$5GOGB z>x4WiVYrY8v)O<@w3Yt`)VOFr^KzBh62gNOC*^4fCB;OF|Ivrn&kZk)Fv6pm*8+&1 z6XZ=ypgoiC{>XMfg$&`Eh=Du((H*XQ?Eu&QBQN>&_0}gw^yh+TZnAP6R)8w8S+Bn; z@xd>DS>l5pe}QMjYLB-($Kxr!IjB|G@p;=1tayQ2Ps41|(k;^#7_wzq`~Fmv?G39nTT zNZeC;zcggkN>hYb5=fXsS%hE_$kPe$^-1SOBWAk-gU~OyGkKrr$_sk}hYfDjpUezK zGe9+m-K>Xe`SQ^vhyUOOPrz6X$^mkV{~56w#sv0V;EM^AYeYyVQJd)t{FjLSUBC2S z;v)z9Z*G9Vr+{qFhty3Dd{Vd`!)r(O2z66dKE&Ycz|CSNK5@a2TIgS&KEimVQ9E+k zthbz@TM6_vu(2zvJ$KrLZbvQmN{;NwF-TjFBX1W&719X;(BE5M@a_fi3$lP1zd7I^ z$@)9b@&CxL?}myRvakKK?*;GGYA{OPSgY)z~>mFXrfa}zRAOpOc0)QppHcr8}2e&#GnV~8Vf$>flSnp zY2Jto`}{#-&c4Va{G<#QYVkq=?GrTRA9?>PyhFJf?Dnc*%BCBU_~CPi z;WvW#eeneg(I*qQ0jn3OXm4v_{_6d+h8v$ADSuc0`Je&^JAzKM2L2oPP%mOofOCxm z6HY?nAo4Y2k~bog4osTp;(s3IA7==9tkAO{KD-pk`qw%8gK3z!2zk{i$4l66-8`ZT12{$M$vqdwL01s%%I?evH~$V3xDl-BlLFf<{Z1?qj`aeF};fO`J&0hu(A>g}{S zruZoz)q9z#u?{ATmaP$-DL0h_97O9cg(*X|dP-Lg#a<&Vuw9>-kjr3*?ykkx8cDvH z`p&sa&CHC)5@jy^HcLO|yFQ++>GLXhWrm#Qzt@RT_kv!Cc4DbGv$DaSm?OI9X6pCh z$<^u7??X;dg($C<&3jk$)#OGlk`|1Rjol+_C_u(Y$fl0?Z%5Y#GL_f>UJ+s z(Di#@thoHpkg7Ica1eI}!!6joAo?2#(vk-t{0Wu{^_VI|{|$~BbA5>ZD_{sg-W3VL zgF6NjzWgWQy8pdv&Lc^YFVfMv5F&}u1Qh-_n7@*7la;|CwgkgJ1du*Yx#w*j-$s` zMcRf@Xo(>?=koIzW5M0l)GK`%6`VAUxei2*E!2BXnqrN)E<_gd6*p$#jk#{=JVm8z z!AI6bx~(>wISkxIQayHlAzXe@_c%c)3wAK&vgVL7=vilOoF0oq25=gY1Y z=-sYV&z=Np6P@WBX5GFTX(%q8>9BR@PXeQ#^Mil;JOA%147>ipPxGrn1eFDI{u|$! zuj2G3&+u5(8>u<+ukfG{K~R5}|Ay6qAY4;eJ|cCgIeCd-t0fpW$YF%KAA8p=k612Y zJIsMkA)0FFLX!En_kH$PS7BsQh<;22&L@bf0TmE2N64EhbxS(`NDZ+!G&P zZ4foM2HETEf^50Z)CGVWzk$D3Fv^rZ(R_w;?c%p1dw`wlf;)e0nlPX(# zZs+JI>*R>U{YmyaiksicTZ{peOKz(0qdq!?S!b2m&7&!*l5W0zv~a(?9DHhYNx!%p z9BQ;jFA!+g#*W{4DfY`{GDJTd@;Ct6>kdM!m6RT#6rTjC!NWnqqM|YqrEYp6w;H zEXtI&eV=h4wk;6*6b!!G66k1(VLaQ8cy?7+`oqEM_GGkYhP~cpO){D;e?n$Z_Nt!__9D{I(mUd9!LTUfpIOyU(@^qPCw6YBko`!{J2%p}uW zLPXK{3o{l{nZEo%H@36aVZ5SS=&=m0Ra@w)$-L_JA)i;e!g=qYTvOoeF1qS-$*PCM z%N~jLOuv`prYplN1v`rOE^c_-U_xLem-FoPtN1*f=U7>j$cM8Hl-fM|khMP(u5?MF zRfIvaLMuaCD(i-70&$<)>iBnC#YUJUzKzblIk^uF_1Qe93&h>~%epRvJojx4N^w?o zADFFlh7+ml%u_LJzr<`3LR!%$v(fKG3RA}IH}R(J&mDGII$gK3ATr7wt~)mSnXQ(>>U|im&DmT{e@!}#g1N* ztyAu@Pw+r2L-~3Vv1Nt2KY@K&p_b$ipjcL@CfQw7$ok(Pwy2Om@}Ce%(z~GW2l$iV zE-3hs+$4n8?=x>r`c5`4NC^4P#ElDTCfNycX6=CYFN^LW(-O*S5O1X zU7&QaONs>*aw^jdEbr;BGuV^59$8-IHU!?&s%dmy+b-GGQjupWcKBPS%YwP@8m`Z= zHVSLLegTPz#nortk-8q~{{ysU0X|$Ni$2B;=wbbqBKQ45>`W=)rIp}k+~_t>58)9q zm|KHR?vca&w{qaAUrG8;@x<6v_i9;PycualxU%VL)3Smj`IH-AACvGj+F<6N*dk`w z7evsU&(XUiutfZWwD`uF%HLnT&vipA zAts$mULcRDR22I0&XDgBKSr=`JLZB|15qNWE7sV~$o@`~kMzy>r16Hv5@-@Nnkm|f zqSUZEouHnh(nc(*r6`+OHIL2tfSmn+eAVtvrX63uclLJ2xc$1Cu_(LBn}lu9CG>vj zOB(;=@s$PxtyT99q=Q!vLN5*wJOX|6nZWq4!2t&PT==5`{eIQ@#P}GLeqs7pFJa@m zaH36VQV=#e0Iu+Kj=-158&!om*_FseSDG*c`kuD}C;z+yTo=WKA2xNfpQ`CaqyBoDo z2<}(kpoQ!YH&kJeFJFD*7O1emqFhCpT|8eNw!@y7)gI)qocqx@*NrTAecatigaacc#4Jyo z@Pb0???i17#2$gI?IO-%4Q$pYRe$*=&{!W$eb{rZ zYY(&(+6)K-am?{%#WbY}Y}uWWA;xat$K;E$Z^HR1ZpzZE#lGaMD`g2gC&%n>dCAEz zh0(Y9F3jySIcZ#I$cL?ebMt6K=!OF@y(qt1N5SV`(_)A1FvSv6#`TCgxWy9deh9%E z+!XUD=lb) z{>0oa&i;Fuwb{f;ThW2I8xd<5_!oY)XvH5n}$1|#H>R5H|tIl2obmA}t z?gw-spV=CDhdHB$I`RG~U+hHbrlaW+u7ot~|dB52wAJWYJYD%G1dZuISj7Qyex7oU^M?K_< zFf*9CqE*kO19-fC;g+ZbVfXcYTob-=MLRoQXI&`pCE^)Q3;}C$mhXOY3ban!)}AIP z1ob09@8JYrX?r#!*?|V2o7hk{hrQ>tuVPJI`4yYaHILh7ltO^aDq>(lJ%SpPn#;tB zV-nmwBL643=aSN#xzZck%H@D3ake#}L);wk-qn7GA$p~^Yt86C$!Ddh=b?oj3#x2z z*B}!Y4q{06hLJXfCwrDnf;9ADG`2d6;we6?a;kSC-vo3JFAS_ zQT>DS@g1!Nr%yp|yC117k^R}13{R~6tY6JkT5@-Wq}^0L*&#-^8m~^+{o5(4=HYMB zI(4xZEMYxm^edmqg<#C(s`>Qvsu}o&_#EwVMB_?hci>dv< zc+1WhP2APO9yzGyo)|?egI~-*`hBq zLqDFFC-`Kq8l7j_(Udo$-Yzebn)^^nL*H+e$ZK|Gk%&7}Ljvoog(8bVu1aEBj)p zuuV@-L@t3>_LI8c)b~7lA-+v0s8J(l*oW`fOvGv5Z>!uj&vCj1z>Xa&tF#`c$-s_8 z2B%Iku@ahy_l%gO5TLQ<8DgDmZ{s{GgcNrZI<*^D=sN((?`CNyaz-*%h0Pmfpw zda$UG!Tysw%tGzOuG*6o9q-b@ZPaY9v~Qea%<6-{OZCwtpMYc;E|cG4L*mz+F4NCS zCKi1Sid4+x_#4+E`7&ZdSTF6wNyi3y2;8~eW0>x2K9iQLASbTx=txtWpLmErhrk`$ zy(K~a0bNL`=KKf-9C%i^T&C71j4YlN|be=qN#RqTLya$FzkI=?3#&_g~$%DetAK zOkam|cQ2QB11?br48HtPH(U5!u&eY9j=o5@uDp#Cu@uvKR(8#O8fp^6RD9f9Y|&g% z`~}thY&R)=q|*zAgr3rdG3F=CQT#uvli6+@R)3ze$!v~LssR)+mRt|9wOPZ}lhLE| z0vF~x6lYS#IbmdkSSN_@{NLnIm?3Beo-B&f5yVhzSD!A*=6U`9rk1&v%D&9bf^E;zl2*tzp~y3IiXcC4Kpr7rho+=UzMu! zth&jd+~0o93q2+v?GFHE4(7FRiHXV{V{(g^v4+;qSr#_!sq}~bVkWnb{7n2F>)%|5 zcp)2>0U5;R!MB_QJCuPdM&HvTllSEM@i&>hA92dEA%fy-ECX7I`BLv(KSmzm{~mtp z`)nn$g-PDU+!M@t-Ro)fnUZZp2EAx!cX=3P z_{2^@G0yMf&;gv^n@QYzPy!CQhhEIr6dw`_F|qD^IUVm&Bkuww|L}_z(-GCHwUb(t zd2Q3t8dLE_)8UFRGt;T3-dbZQHN2%`I@|^VXwN)aTE}?VNGu$a|Z*8mE&gf#x~*FV_N5rC~m%5$}VfK zXD7{d=0GrzR$;AOm);GzeK)9Nr3RJd>LNUFT{pMsRU71bRAa%K6E4w zQnIhaAzcbL-jUm*a~op0-i&V%z2F$GI%qd&ntHag-St?2zVJS~&2(9wL-(9>T|cBsCp)9&U;Ii}L; zsSUntQ%&5r@Vmd4-bdNCSS@|Ly1iMtU8oz1-zniMrl!SKG0sa-#)%L6%Az1m89pe= zoJviJ-D{MWB8?M&SR$NSL6Z=M949X{b%lJLaLV_7n{-SXKjW1MtAPp4$jGCC6HDTMw;d_(`k-x;W@r8$zeVpmUIbU(qAo7puOAY` zY4eNZW%aI)S3-_Y+K-5rvTJYU_QxN=H3<;3AhlcMFh-+~nB~TYYLg``V;nr9LeLkw zSQKKx_39WOrUJWOk|G6w+I+r)LN?x?Q*gmyh1I}N8AX36bpX&GV>az6&JEkoL&^kS zY;LeruJ6?IuEIq#J|A%!UqekGS8{`A>?r5NI~FKkk6bMKou?Nh`9 zpw5BFncCRo5pudJD9ubhF}iujYO&#riU|lTM@-&qsw%g=LsY1j2>qlW`4m%b{7r){ z2dw^4HEifBTw}@1w2qZ|%);=>zTZp3h>#QtaA^J(7w-I6c^DUkY(&A9l+9=_fsM~r zTa%>3Yep9 zC-|mxxA5|t`g^(IX>w8B?|8o`-M{$Ia|{n()+~@uW-ZWE4sun?tbK3nMR%82!vqfE zq|)3Bwq9nr=@kq+*?$snmdvup@G+HGz^` zoRaFJx2q~tvtQn*uFifvEDxAvS^T0ggS;qHu9$9&Q7;xW zxath=b54r695ci}!$V~;wC_3DgCK0+!B`8o&iqS{f~~Lo-iq8F*;jc1 zO`q45qB^Lu&_DWX>9m83sp6Vu3z6Bu8O(Q8uZD0zmk zYQ7zOkeU>8PBJzkm=pv4Y&mLI=G6G2inR)gE(s~4EDg)@kl3wsRfef)x03Uni=|oC za!JZO9B&z_xHericD=97s-c2t_@U+q9@Be9z|>TpNF~qd-4seqw^Vm|aB_$O`+|>F z7ns_Kh!`Y>Vx6oEckp={>>Y?nmf^YmqpjmIMEf~3WD5+_X$o7O0|gl$`;NVr;oEJ~ zi*BvsuRG{NJFGGJSFoDDk;)#g6%6et^Dmjz9Tck+46>Jpr1-9-q=f_?}`$e~Ze-s^R=_WROX=BF`6| zdFx9rDm8ibyY=!2kg|;+I21~A5B&JqW4|CT(d_8~z&}6#w0!jf0{OjIOEfH;_l+7Q zzN9--+^#&yOq~8K2hbnSpbOTU3=+dsz#3EeW(oRsL(5pdX-L$R3aQ|`en2?5jF_5F z#!Ea{IgaQf)*#`zYH-@gggchSNO19X*VN0JPG-KpY>mb4kBYUwXA#m{BOqXNk83Ms zBs&_Gwl;r#KjnR0x9K0ucR!`2mo%F^3o?d;39(WUJX{-Vc`s_{-OMC=Q^}%dnBo6m zlsNyz)}!uC@PpCxV7U3-;lk(?G7Q?a@NQPnvzbihrII5eFnT$g49z|8ap_9oo(0;2 z$>ikg-Pyw)sxhXA9L8jH-T{mxTF`@?hq>hYA z#z4?dF}(`NuArWb zW?m^k>&--R);-IUUJ}BSi-x-1o2g`7UyV2O$-URclK?uYgJE)LjmPBSDYIJs#Gj0^ zteWs)8Y8F45%phd7e3xF10TPo-Xw3u-N~-JZtT@5>1RC>5jdom8Xl?$T_4v~Vy~HZ z*FNT6l#WfVA!`Lv#w>YcA6Fj(8d}%KboZH><|yay)j291y!JgFz+i3g@ZxH{z?LSJ zX{95YWBI;m<<+%IIR?}uxs(?+&spjm_b(oM&FUN{ErQ1z=RtRf+5=QLvK?4tdgV`r z4^(M^N{2&7F%HP)+WD;Zh%w^fJQj?svaLMD0!rDXX3mnCs(M9?vua0?Ji~4KB=t(C zimkJxpbBIaV6pdz?z$RT5!{HLpwSIsL3g4IiDHP#w{T@LOI8i%Z>cBD&e~$kmS3|k zL-tvVm-x=8hl&wKqUMWbENW|5sMbmvicd#~_DX{+Vl~T>ia2K#>!s<{Y|U#;>*E%$ zEb7I}RgPy7>lNC|g|7*g^!7+2=?m4RZ}7W|E7`1SlaRj4(X4cq2;PAqpu`xK+hI0Op1hQD zm(`6+-gUi1au=Z-SZ2{!OFX=cb&>7XXKEtiL;a14fVLLA6+9Ju89Wqx6ucDNBAOG{ zH9oO4u{N#YAgUm~4L%lXBidkaYp_$#dy#_8R0Yf+x^tWd z#4MP??@My%)Rz^g_mvZ0eqQTAhZ+X5V0P})ZtF4Jq5q3X8Us7AD)6KbP+{)^2w^DUP9yj5nO;dFum;^&+AAg^cy~E5A#7k;aNskb zTKpjFZNDnYU#8``z!2ktOf%c4*o~ArDQXI?eFpY>gM8Ym*J3y)!50M{f@{*i{`6x= zQ}$X+;|%yh70PG=`18WZK%9$Elh5L_aY1$`~v*- zoS+8EKob;085!WOLZ}?I9Xq?&b*mN{Y*-5$pX9Z#g_>F33wNkS5BLiY+5_Qj-EH0K z0Z=JI+8ts$9ZUJA{jKb8j#BD@af7V#<>k?)R;{#!>OT48M{r=O*PU zs*N}&=+g7#qIqaS~7tSp2aqa-9&s+DAyz2aFOlGZl-PkK&9J zB;1bTjC$3V9oZNe*0Q@8*W=< z`@LboMc9SfwxMAk?RtC#fHv^f9O&N7fp+JG-o88)EfxOrD*^wsiH-Xq(v8AXUehif z!3y6lW%CytrZLVjJOu8W51Sy(i-G8hH}=M6BUikjCh!56Bh>Y}AJGIArlRQKZm7vj z;rC#QsAyf&hx0Y>&L`M?1g*L^axRo{~@Su1}g<=|+Rh8QrZ%~A! z8pe!BVlJ7vj7`8|CW-d+LifX==zdgc?i^W*;1Z(wfZOwdXRbHz`{rJ>Mfg-z)P zX9<2qKuJH}wk-XMl$}5v*(9sjAT{y645)xfF?Rh;xMYWz8Nggq!>uG+rKY7U6QH_Y zM0-?nuj*a+HBrR7GOI`$6gXEnKxWLRC6y3%{nB+;r=-axNsqu`g0bmv|6&z%b;pgW zf~q1aE5a|r9~&XCqZ926SQ@VuFQ$%_IMx!?dx&CJr-R_kN!tL<~_yXr&fi|CW; ztBhi1WYO5ek&4vlE9_g39FLTxU}A>LR~wRPE+wWZ9Qw(pY?COltMXgfXSW!+C}2nm zS20M1Sw$3A<)_LQ6(JRsdKEO4_)v2I%B-}r(yEHzQSpO{AiHLin&B*$ia1CCGE3L6 z_61GBL`7{>-nPiYq6nI{lx9dPQ9dy-rlex2_y#(REo&*#weTY>Lfqc-r}-=+?>M79 zD~zj#t3sh7p`ui;>^&>bF5giSYf-LQLRpe%k-t=eUQ)_ZyjBuI_#?O&)1oG=sITaY zMM+w*WN}SNWm-i+k-0?!VTHH?ZT%Iyb+0}-i!9wco7P@ZlTnUbZ=`GL#^5b2o2Xwh zHXU13Hc?{ajg(vHjRoYXTCA}{<;{1A>13HEl(mq;70qzd?k|Z} zqkN*CsUf6oa5|a-CEr|}OR*uELM5W_G(u@M>D!C3#Ecc7^lWJ>-A5@!3d!Lq<*=IT zn#XJB-C`_UW3duZV;;y_O-Y$#Vi7~B5(VLKpK_Q>4T(x#;K`@NgAcq46fFY`%3(G& zL@Ie9Cqjwm$&bomx;1#vZ;U$;Nj#teD?sOEw(=B+L;lKPT@FktUyFz(6Y&{Blqg`0 z->Q5~AQns95KqKs>{p_o912s0&iF+WQ^*VDDGCP7m7ya~M3t{e8DfbkJ#B_G?R(lK zzr47!X{zNJen`?KMHFLov82#cOEct4wo$C-NtS)5Ey60@wJ7E1ZZyOH+j`AI;-}`i|c*vYrB&jdOZPfEfcz2nc1hzVy9barR~< z{c)~h>jN<)J8m5Xqh*0|3HpN9&ABg+$X)AVh=3>44jbF2nkdw$>qWR(cwD@%0!O1G z)zpq-TO*88TO~~&b(=MeHqsTE4v*WVN|o1JXcG5`3w!xZA^;PGjZ8iUX69zb50`T6 z=TCA1BhvD>2E=OFA%{Mttv~1J6Z*LIPAAfM_b0tI4m#+Z^*9bXtY*A54m(Z?z%{LB z!`x1KW5r+xhSg+#CkYcue@3(Vnau4;lPg>?XM-tU`g^2h+p-!^)pLzfTY6ub&?p_9H~4 zGII~~PbbKEvV^Eb`zgGql0hdtR9aG2^z7>?J*V}pSS-vaj=X7^EIlBryd~u{S1#9O z4VFt&Y%on%EtnF!yk|RSP9^+(cR$1V8+F6ref;=UNC5@r(|d`e`2;Ob{>J2^xqMSU zIb5ZmCm}xrmm<^iAoBLhx~D@8$FuEU4A*b0E$ht>rYlrigF)V2G^sR3F-1GH5;K-F zY^NbnGF>$f5ts!W1c9kV=WQYH)FrDgJKIRH<+Ngc=xTaZYTe&;W2Uc{_@2344!X9C z4HL!Rl&u<79*hE$1a7{h(!>BseVz^IXA%OeQ+DT%QJ+69fl@kqlS?%xX5u}SkiZNAIhdrv%lGv9s1?DWmhGiDfMu^ z?7^)ebfW^twlo1-$Gm_NdqI9KmSfPS-Y7 zBVwW}(m!9C7kjbM1lg#TD-~;%|M(Gyfif=`-@G#e-BfS+fS5)_2$$WRkwH24aT^G? zBzN)IGL@Z{HZS;8IWY90U~P$LsK};(p+L5k_r#{LE$W!+2V9|y*CEx9LTUU$eyx5` z&+_y!pIm;D7=Kt*4Tmi=$aOr7X?4Znv&mG!SV1&Ekb@wJ6PyfCCYVA#qYgLcdgN0^f*;IhnRG}w|~VAxS%0X zw>=#VT&2XpXvxs7*o;Q_B4ki{+gLFR7;UJU>-Qv7wbrqz>fk&%{+0(=&2R^a0EpM# zYwl+x zi1-=o?jjY8wMH|TT`ueFSx3^OQVCO!(vN=6SVO-N0zbLrIA5^Lbc*y5xVSG!Fj~Qn zjRA2h-|joQqMBiFxf1P`)3X9qPF&?n%}2OYraYZ-f&qv3lc-9IuphZQPTPy^3cq8O za|T-z7?nH(rr4RTh0Wk{Up}SDSvLc=gj26TG#wz>`yOTrOM%Q}qmPLhGmusOY_$Vt z8yS<=>326N3nliao{LHSA5^XNT8Bc0J+EI4I1a0`T0Y!^3UV4r z+YCIY95-F(LV0(~P{{OdJicE|>&C;9FPE>+Dma}nwS0n(6V@BoTDCfVT&+<_-Qpd{ zQ>&d<{51F8c6#&tw5P8jdf*y8Oa)Rux2}_Mfm%FYxon{nuqTa{5#+9AJ ztYMWR6sc1J1I-$W<xYAt==^C!DDk!I%zvcyFIOwoc_W2lf4I` zXPV&U+O+$vCz*5R+LHl#KR9?7QOAoebU{-uK9_=70W8RCqO@h zMCMe+TCYlE-M1gT-o9>d?Z{H|UG+^}1t0ssLc=B~`@LYA_i5ZBAe~Ryvv0;f{?d)4 z%_zI^?DJ_U!fizs+tz2np5JH2?H)Gm0*%JPfbC64V`7_zB*WABUBpCZUp3-nQkOdv|&)jzl>RpBk(YH00(JYg{lelP+W4Lq5+MRCet6MRRD`azJxH`XQ zUNXE}0#{3f|8UZ)KZrnN4{q~hp|B7-o4cyGNmD(mI9$2l&PPN`5aUDMZG8~Qr6(AT zjy@w(D3zUxHy&oZyKTQ3OZXl}#&PBWiv7LgpXVr{+}h~sS$}_48xg~`+;;tgrR&zw zSLNz%-kKaM`v=3_UE##7DI3=mB%&A>Sv4!MRipE$7;dTYBMvU6!7<0)NX6V(@18@1 z>l==!j_H<-?^~uWNsM^Yd;5ffWWEa*!lR|pEfKA%6>HU76EK6`z|+=hP^O~{WwyGa zaj>Uzd&<&^ZN`nhp|LUKBQE+vwrXQ?uxR{83^o{@}=MR)fTrc{MRNe2B0 z3uA|XgYu&8b{~AT%4ovy9Q*IPhqZ+{P`OlU(fY*ff`G4?=H=c~RNoxPWgFlI7MzP| zw0zoVI&ItqWBryuKfUpJvI$Ci@QAF`&>y6#-`fNj`2V@X1O($ z+Gj^4^RUub4hw#$-?IKKc>*fE_JpX5itZV^<|Wq2UN>tIWXr9$>?JVH#6Nl$mVl|E z=ZD=KPlA5*p8B5R`82l;>UlQ%Q9YeoV&Mm=KzkL#9 zFk2q&L(@9nJ7#i$r5zUJjC4F+}LUH#gRy=CRm+uhb z$cmQ!=-DG*32(8TFbLm zE5s@Q&OS*`aoV@<*UoO3@;Az{NlI~`d#0Tl(m2BqzBJ5zXH#F`}fkht<#vuAQu$V&b!Gac=0+ueZa;1!?EV<@DbKoig>5K=YWtM7Gfg&E= zilMpGP9)ppCm5qVrBuVL0@L_t_wlSTMP}cV7@WH{2?A8CWdipOWPrBbdBQv+4>u|G zr?N52`Kvpphy?a}m9^1n8TT6zx>pkIytOMWLiN$@tM@_xj5YeILP@-*_t_03whm)O zeB0OI-qe}Zv+RboGRMRFmpV<26A!rf%Gp&M>?x}C&T;P+3dz}j_&W_APX z;Wk^3&{~vz-=&MrA3rM5Gt6gPc5IZwuqm0%MzXTl9nPB1z)ZH4O&jL?oIiVix{YQv z(--9s*SQUoSJqT#`rvaGR6NODz~NcnpEQ!QW00EjuvyHE_81-mA@)a)QrqYl>v|t5 zF^QbVJvXC~!oOvy%%asbOjj{S{j zUhd=nN7pw-XVz?6cgzktwv8vY?R4y+fF*RZRh#&o^#K=3D*CHDh_!)?;@8}pjY~!=HUbAb%ACv7|Vk2-6;2e)|c>dxn zvL+A3Ew{`z#l!K~`yz>$4!^qhQS(vjwiQPJ8D+&_x^>y}-dNS(^>!oA?y&#i68q9A zw-|rB>gqY!6w1<_@}Lw2l5O1fP}$~s+3*}7%Xh&t5SP4U(x0(4&CO%$9)9(KP>Jtl zDjHKXIRCWZzPI#R+}L;e0NhpTHg&ER!OS4w!tI)M-8pbYU!FMLbQNxeOp;?oz-}#F zuEl%dr&iTJc?lhk9AAFty7!Uk8C@i@74=rN5i80QE%$NAlTz7|(!zGNd46~o#_5+* z{R`|pUf3}n+NxMR$;wL(k_xO&Jln;vd)@P)qsG4SWp@3QWlQtUVr=IFe5@zIkH}CU zzzzu2eXFn=2>+q><|Jv+K>?gb;}S*VopbSN*UHIBXJhx#R2(FbZ`yht>^zSDsOoGb zZ`7ig{|vPBmBDMFc|UPpI}Vzzls+u-PFW%=Q)>LsRe8G5V=%e7NFq6e=hZefx9Y|V zl$)y3d`M}KEcsJa-dbf`fS^2yo>iMZAN_`wN;O@u=25do#qPj@NLFkORU zOrq5=Ro`sO599ntgR~6Q^6*|$?~H=r^|mdUO<>YAJDTbO`}Yxg$5pIF{Py;X%es#F zZf6AOjeO04*Nz|GSr>6Mo2zusLppw*gUayAZs<|ERO;ED-m$Ocd@Ts2xu5GS!WSF9 zu1z=Uzav~^nULIS})w0pYT^IUdHD(j4wO5`;IB|AiYed zCFO)xFo4OZErTjNi26Z#$AL^a!IMsJa^2z5=l%nFSNEc>NLR&sxDeoLEA3_Lc(ba8 z%RH30mF?;1pW%fY zc59pWY+FHk8KAz{WlA8P9d!r5xKg|otY0bzHL&WIeI5mfUs$Z!vIA~57h|L+5zI5M z??&paGp5tDcKnwEyw6NKS`T+##zGz!3)DRD5kGq9rXL$>(+n+bS9Ll?A7DPXA(BT~ z>CJkQC!06Do>$tSE-csGR#^^30zCzj`hN767Y=Is#sa)7RnC%aUeb@`rdxO0nMzL4 zWm|xvmC|6YVlEcvH$~$2DFne}_@AGe`Vqcg%W2{^<8|%k(*6BDxYdiCq`!5qrLOYd5io1tmCJfU zmJawouea^np0ce~Y;?V*u^nCQewF7y9{#;a&Uv$XvRy}^LieB+UugtJLhkD zrPf<)XBS(PY~)*IHmeu*YA*Q*XUA9H8ec3bI9eJsHV|n9AXxiWi?**6;dr^bUv26* z9wkqox0FrvRv@6Eo1S}lIrNq2RKQR%AEC<2+B7U`H$>dEhrt?}ZX!&3wNaBj?e5#l z_UEL}DK9tje{wh~ZigIhb<8(=#w0|%C2cX62y8ewUNzowED)c4z~u$^117FAoVM}-%vKo^UX(8qqC_z?*)!QS#mR)N!j64i*7yfYrHS* z>}Dks*!&hgOi9$d`=UApuzv&VOlEW4`yYToR86b&fzabLVWQOj1T zoT-={Y2z#j!gF2Id=eW6Ig@Xm?pSu(nk<3p2HajO+h$5y*Ln*^J;@(pCA{4R_E#=- zCcVys-X)@JeZ1O-B0OxRsxX-A`U42=(-}_B<;N4Cyo}5K7Wd}kf7G3Z}LUof3Zg-a1XI+Xft-+kt6fjlnJ9FXz`En5Q%SVl%d2Eu<&DZ&C2 zjZMwJLU1Q!{r9tyvz?ulv9<9RDg!JZAM8KS%C_Q?BC`5+gaApSFM+v}J1pQI?0+J0 zFt>BEb@-QS!GGd%B4lJ>VEr=Fx05h7H#Ku2WM^XkPtZ<;bW9AKU&dDYrjCSc|Mnsz zWa~!A_HXomyo#Ay88Z=b{7=Uhd9m^TE`g+zzLmM5ppB`O@mG`prLP243EBT`q3mw= zrTxFd`&S}L&IV5ZlKodP|50Ru1^kabEI^Hr^IuN*_y~1i0irgBwnqPy>c7*bllTJr zkDGrCzrdAkRcy?^6pgW%?5SGq9BZsUg*Wi1OuAbGdF>2t|1>lQC5`Uu55W!Ty zASJLTl0qt8zr_W`#v%zxk_2JIBN^5>Kje72s(m+<=mG+}pS=0>+z&UonO#k$(j2EU z9ZgK47=%VZk)u4A;o6G3-5fWXk=$z$h@NU6olJHz30%5<*BrG&yB{``m^R_L^>||R zC4&py;*^-Ka;G+DJrTcO>p)AQ%ja;L_Ue^*BTyye*#r5zSjI^c&xuUHi(<-dVK(_t^~%B=;bJv4@wk7?qb=4`Q7dd20F4 zoS$xjTaS~kM=XoiybUp47!|E8w!OYKt&rOa{hrgo-WV0`zp}ky`Zz*k%Pj9i*XZ#( z!9d;*=Y?J-wU(`XniS?>b^Jf2bcm~pfbYF`TOEY;ip$UPh4Cai9=kEZvV9+>fM%P| z8E%J^+r$oxF>0jXTMRFX_P}a!iK3wQjHHr*baL%`9iiVQG@3Ab92lU%n292mAm#i@ z01 zGhBJN51^-Lm+=uq-n^$td=bgg^Z|Axs}kKhBWEEz6q=Ow1r0`E=~Rrw_2WV-kVS}vVj|2 zlAD5eWHdn234#SDr%)uMT}wh`Uro+;93zx*_BH{w^~#3#2P( zI^@2Uv3Ph7B%w@}{5PV3+19gl=Swcv5B3fTg4N(pMD6Vm~%78bu}S%;>5sfGH5MAZKC9M{O{ohw^uI?^7(W|Ak<(Rt;sgxbl19~0HN|@ z+_u>4aFc#d0M9hqm|zP|A33z=fP=iyhrCcL#jH*3dV(3}N}vbPc>p1gZO{yeK4K6W z5}UxWKZ7r^OzzoL=+776cr(SzVx8qI{fe(p3%a!kFtloVO|O?v=%~tZ8Mqy>&iab{ zf|y9en%fV=SZ7AkM!Fn7dr5>b9&q3fWWgKr>yS*?L-K(;u%+JTr9Ny-2&4pYCL8rB zjGGWNao{u<(JUmPmCAEm{;wKjwNL5%I9)=cFw+r21Dkd3%&F88eO85~fb_>k%}fovoNSou4Lz;Y)gY^ZOQ z8_M?wqohB}NGK>}q(Lc&thkODy=DMg?xY!18-_QEHyp2jb|2aTjmY8rTVz)aU~g@A zZRd+VukZLc5j&sKUo$VnhK1lE?`~GLHbgu(=PXR$pHl}w( z>h&V1bL1x>5bB|K>)1kDzEc3NU=zPH>gXkh=zhr4mghqiAY=vSgWqs_u%)zcryLyBdsQf z@6yC2mQL0@H#$e^stnH{5U(x5y*GG>fs9qu5-5X zK`SQg`$)NRh4Mt$RvGF%m|z9aHHW6A?8hihPc2)yNfY&<6s2h&Usa}1csc&^r=s|k zIia#l(rn?O%S>~dY2<-LW5>DY1>$-~(t-C4M1pCD*HuR+=+9c_*H_2c7ha!a_Z80M zoM2mr=qCK`t+WE6>uR{V?X5^YJ>TdwxDy{!z9O2?!$;_yKl=RP*NM4c0oc8-*cx4otkx^aU9p3JFk08zS+ha z;!bmNy-qx!)FXMRdNCd5+-8kPt~u0sQF!4vXzL;99C63HnOwgXz-unzs6Ewxc#nHH z6e7an3X(2#`RGqA^18y13MwIaEWZWqOohcUxOF`~bP2j)j6DiXm;?#tByM*5$W{xG zx1>x8Wan2NVFQ_`GC?jcIK6pF{0-8_eXmFZFPgsd?KsOlq{1ffJ6$#bJxXZhsx@-KjdeJ9w;GO)cr{I*Yi!A~13|Me)JJ!z6fCe6R5v z``nBYN@0J5`PF25|6R9P4E(_ZnI%_E?`DS1hKXH^6leb95fRHK$FUn=srUqaS)}mrPTvGG&d(v&_iJ zq*49ndyDXFCaqIcVdTSiSk^HiPNmEng1`<_DU^*n&sAnQgD&0u%P;vq5o-{@lzjrh%+F-JKm4^B0Boq>U0r(z6i zTx+h5k2h5+V)UV6N*4n&);zt5-wY*yQ_fS`!w)OC^X>TTVI-u=M<{01hCZ%S9JXZ) z%6MH5-tN7#eXnPkJ|F67tvSg$+nl*R+aUf&kZIjQTML9)nOz8i3%C$4I}?n~pyNWJ z=nvoIE6`8WBK_3R1rFr=EhX3%y7UD>Gz8Khc9D&?JA|l}cc0+ioi-E@Dg#p1H{E$( zTnRJ}yuj^8IU)_KWA9`bhdU%jRHIm+-*n4h^1t)xCM zdLTJtjyVlMAb^Iy62Fnqjwl!zIJ7W^(g|^awo?CgHK+`nU=+G-M0`Z2v?f*$9?kXr zNYf8wf`{AYygPV+RQ0=tQ0PD_bSV|yrYYgqGZ14dK{IlcdsAZ!_~csi@FEQNb36)1 z>~h)i(64dq+Ki<9Q8yJnDlV>fH3?0O)JBVHk1m0`%VR+?uW7z}_v2NU@Sdi6y2{p1 zv*m|hkJ|Ui-|KZXC4NO*rv3#%O>N*m$&X_6YtLIrR;bP!dQsPYZ9kyRo{F851r9vOhHE( zcv=)^{4u{j$P%eaP;_f9!x$C7!j&@=Zth;0ztM#MbEdy9_vxsml~>JZ8S&8s!iYpV z`pMriBM0*sB$4i^B^f_iF`;VK(A*l2$%R&y@HH>MR%@fv(dAx)(e*Q9D#Y4CRmS1 z_P=nE>F4Dcxyu|Tg=eR}=2#-iEz zEi4WJ4wyLQHHMwKcyf)+NSPHZlXyg!B$lR>2;-O}DVuk?bDgQwK~3?YED7smZ1SOU?!Y52cf4g(Tz(r)+6CBDmbACt6{R z^I%LKeQPS|f<0{xH433x1nfm$K|%jH0x+nYrMK^Vodk*8fsZIva;3KnrnQKW<3LG? z)!=qJSKILr@%B01a_CYhzuFsYhWfTQ6Vxm*r2Vz3oLM=E&)@6sU1?v4>2tJ!>rJnU zR}DG=?I4u!ji8>_3>pE;Ae8Zqpn_K{20`HHT=>nf!8-=yXD4Pi*^q76 zjitdm4dZ7kCIQAC#=x_%O9Z%a6z0%szNQ$efZE& zMC)KX`q1*i&w5D8BN2g=FnJJtxX?62+TdSny+EW(|7(Vz5~9*ygc>&7pBrcB;?d^k4Yh7;njsqUFw9$+7@79NJ40aN>ub&%NwWY|&#JLhu6 zR`;O(mPu>JDL|&`m^laHagt$atr`wU5P>(*1?&Py0)Rj$0G2c_L~A zu5ZH~drr$Vs%xtJ-RaM&mQD{s1_o{H%F{e8CaxbF!WGMpgLaZ17@>9@j?h~!G-#$a z);p(qt!U*AQ|kiJ4Hh-^6(JM=qkkP7cy&`^Z%mnlQl>w$aiF4DX0P@tQZ zPkYa-NRW@xyKjUXmXl4`^{uN`rA%jvCeB3~3i`>(8Ip5fv|{45F>7l}=ZNABvte>- z0RZ zk&71;=dM&v+ME+%WreZoRP7mC#crIP)NgRIgo2etiZViqsp^c%b`>3JFXfy{c3n15 ze(RB3p!|&i%M?5su!)jAoJqwh9}>u5*;J)_gqwm4!-AHCru%1@SRNhq>yu8CNlF z;MpLty`!?lObaS!*UiipSgEm#q6(2&r)22{IEC3ybyKIX7}qfh9n0LF6m~Om$|GHm zP#seqaeJTPG$bY!miro77{vA9n0JI2T9RomIDcOVJ^I8_V-{$;UVY-!-L!Bo14{Kh zH&(QZuI&oA;b0vPIx-Vvhf8$V=;_z#(-PC)a(P|ryoL2HN!6_=dT_Z`HZ!<;O_~lI zrB@xpAG@?sfAm|KC%!xf?T)W%?A|CW}QKC z_j0rm%*uPaH&$gM*l}NkW<3BWEv1vrppPqysOeLC-HQN24iD7zPsa$8V@!tR8^G znSyEiQ8<5eU6;J&8N|VTtr^`0{7d0uu7x0v+2nfFTlsr{UJKUpwqoob#9XizT+GFg zDnOyyE~STA#kP$Tj0f^Y)TI!6p0ydT-Nn}I*)jEqMld}t4cR?_E?ZA4VBgT%%pU9Y z8v_ zTT^B{&*x@fD$tB3ow1eiL`gzU2Y%0yEOPwp*jSKzIKSS4fG43vl$7G62weI^Y4pe~F4n^5M_}~e$qOo zbSURM&^IZISM(`DdK$0mw&nePb;2!IS;YVTjPnhJ)#FDC8KFi9&qz#&;IggOLVuAL zG_4pQ`I#(o>dIA=! z+u`f&DcW_<1MClAxXGxf3*Vziz9`i)+g%JAO>XMVRxNeVCr#OcO=I%YLVzr`E%ZmW zrNy_BxY(Rn=rA=aK3^)Q#|45zAW!8%PJ$p1hcjp#A*(2jeBiWh0Vzy85NA zFvQn-{N-K#CFRBSxtUtk_$7zSs(EKWN3XXMQ6tD%GM879WF{LfDIX7F?5#1j{zlzYDyt&esCMG@lG)KnjsDqp-(@=|n`T zPk_0RwNKCgcj-faHNTUOikjM40yq2SFgxlf)RyUSTTMIt+$my}_wJZUiIKwMA$N?P z`|@Zur{!eGsInuqgjZAiBV4oZU71n}3{5>KaPk{&qP}yS981Bp9W&agTvX=H_7HR53PD3?OM`{~F+HIvm-{t7ya zrk8%QikikC#^TzeH#GVBAdo*-y;diRBS8+Ot3TdfF>lE6iwBPeAp9dylHA{ zw#&}O!YTHdUlW9qMfX0LFkHewjEsp~;|$BfNl*)aX6Q&e>EWbr%Yo&?B|{^@f%`NN zeuM-?-GaMvxawh@VI6D3oB{EN+0kTvCo)X}&0%mSGV^<=(8!QRWf6XZ7B?U1Ac((v z4;uu)BToPXa6QJ;tW9`50mSK~n&8PP8MGSNC)(v*8Mo&&T5j<1w9`fS%_y>1f6iPRR+u zY(F@VW+ly=oKCdpEJD6%ZDapfFvS^f_&!o)ohZ+&k;UVKBF3AI-M77Ne|wyFzD$vdVQZ0LSJS9R)5j6 zS5BGD=gf6lin66eiNvK- z{08N6Qi59}N8o+aLjAX6UijhDrMTwua}9%#GT|vN3jdoG6wlQF;6& ztdmzA?>)1OaGxclSI(tKg~XgmAG}DKbUPrOp(QCP&7QMwu__UAshJK{?r5L$|Wsaf_`Vn&cG7m9woa|H> zsX{7DTc!jolMF$WvN%as96K1BXzr2T`suEBjg&AwOU?)8q`;)A~ zDifcTMsxm0dE5=#)Q4rq`h;ypbn(c2{V(LG)fN5c8(nA z=f?3E=%>cHLpy@$I=FdFh#96>>=pd*F`_Bvq>5&xTGN_C$cp;DKO?q7c2WFjec!X1 zhPDVYtH!1h2Do%Z-4(l2q0k?&Ql#ur61nhwMd3Y#`?We#p662#?DA z0&1aMx`kEP6eSGKTv;j#iGLnaB~?^T?TUX>F6jSI5-q6hPb-~QP(mqXl@^F+QT7B= zOAcQkJ8daT6r6daNWlCll1;u#e13jpW&o=q`-dn3f=a(medxHPI2nQ$qMid+pDv-k z50p;-Jmpa>)cN%1$A}s6FJ*~vjSKi2g8gUy)hNiKro!LdT&T?wEIVB9>{dfC?{MJ? z!*XYQ-tzPJvGiH0IP3FF&wx8!x`-)FUPZCpi?r&FUbRUx=)gpU)%?kWLR%A^Sjn7E zm@@ibs=J^Q$ptvDsZnJMJJ8mT6t&gsS5Lk7^7|$QgH|94KjMZ#EwawX)GHKSi|QqK z{YLDy(O2N+dg@Tkk7?1+Z`dEoLBD%*eO!q`cC2S-*(;Q@mc+F#qDlhy_H&Kzc%9bvs{$Y|Q%Rwf3~< z-G3@pQvcc(eU zn&i~7gNQr1E&)~IDPlneiwANk>cN1fO?W9Tvg6Bz<`=!YYTSWjQ#)LWI=xS@E#LXd zdbY+^t;dS46G+IX?Yqq$y3m*E8${kw;6>icLd;9fO*L)HL-2Uca5~sKx4Uds7tYY% zK&hEtP0z!U@hx?@+%En#g>LBT4nNzUj*zzP&VCm{?ds=p(0Ft0Hc&&QI3RJ zZBx85{+xs6s8Yp=yhI8Nou;MVqiPMz^Dm?+VF&Emz<>d6t(_gp7R;~gXJBU z91rpEo*h!PVrA@X9mu9xZ~n0UAiLDrjv+r(#lNlDP~^GzFm5Qd^>SCO)25u3?fJB9 z>cHmT7@+xD6_>JGzr?QRNjH)fTyT|;14f{dt9GmItBeMlqzS=WiG0sOQ#alCv??fH zpCJ=4G@f?s(7Q{wtl~GQrJyMV&8ckBux7;w)D5AExkwsS3`6l^&qvS35Xp`5Z40N9 z@WKqZ2|>we*RQ&-D0b;Ote7>Rinl6^R91uW$Q#uBNmOJ40(|M!2ipnzY<`q(lF?Go zYjQa`-&pxQ4rEE}^!)(YYshYTB~vNFSw8Q`vp%avtopDf$aY;Jo3+xqn|m>i3$|=> zy?Pg0GTYP3sOLe>Qd+Jt(?x5(E8fhCdC;J1k%~QL(4XrDfkn*i1@#X74jmS0=A0>9 zj6!ZFC;pDP(~o5|!_Atx)T%}Oy$*u))_B7JPSYZ+<1UFx26Qfwp zs|uTZfxBzIZjAt`=pyVDZCQ=v5v#+f-|08+H;{tC6PQAStbD=vWDRM}@lgWpC`+ju zsn0HWwNpk)Ic~UQXaR1N{d%>`ZZ@>s#u+C58;K6x>7B?FOcYZ4FlKC4@!H+m+uN}b zn>A%BozxzPzZ0hKE;8CNNfW#8ETnRZyrQ=3b19nyU;)-$zsp3q1Z^QBLBBsNm1V8 zN=cW@Q}he{2i*lp(l>v{dy9{qtH z3BYZ`&!c34@E8YWmA3BiPTSAmYvb_`6|`@aJZyU%O5&r-@_>BLBS*egX#0o5IC_Uy z7P{+VEVnyWKdz`Q6~8t?{RsJj`NdSmcvWw%4G)e4@=bx?3(w`{mI$VQtYHaw>F_P0 z)*=t)QPVA=829gtkC$#OKoA46NC$GAmgM10>#}ZFQ?Kf=c?$BBXGUQaCp5W{ZNWW{ z^H;$CMvMqtuxkA7vQ-olxYJ9HH1pm$;Le{C0rwr%NjmvNyPT=_X_sZbRm>MDUgoay z>^c59RPaviYi-G!oEa?};W3%pAo&jB-4WM*7iUfgWTDEJ4`rU%~!r>gjf8F8~4K? z3cXaM81-YR_s4nN>$Oc*RelE{+F4FH_!m{A!O{1T_sl*{zRo&Hlc%7VI=6glnBO-3 zw<4EJ(IlxOr7?G#X?layR!pC^6{DxFD^z#1?Pr!-F6o9uUI__w=HJr#fNHa%B=w06 zs=vS%{|*iXXbQwLT^w8OR}W$=xIwAXK%jQ$%Z87IZij;%N)Az!!T9X-@QpEPJs-A!+~#C0Q_i1?6k(~-S76!SwWn$Zu%=~ zrDA1?evO%=Rz{eF(guhIg-J2}I>MJShe`T%Cb!;VWZh2^W94RleED_m!~mFoUe`4! zjS_KooII80%$Go1iT46hWo;zy{XW?YD63}Qj?PN)y3(5V>9$gUeYT=9>(K+%yw9zK zfOo@O)J=-R4CO!zG+PzbZk|IAnJ0?$Zt|`R$d31L|9ym_z6W6+{kDI!x4_tHhpr{6 zNqJgmVy`2SI1gHCbXlRYwRt~w<@)ipEV-2CFR`qEYb@dkS8>Ey(r@T+?LFr2df${Q zKe44j4^7_m86|tlQlnB=WGD_~DCUbT8(gVa{UUC2i$%=%g&M+vLXw2?5~x^a#6glo zohbQZc|h`ARn9Oj@X#MJe)RV-UvX(H%)1h9UZKG91i?^Pdyy#a>E9!pUwvjdwNun5dMy zB)QPs+cn2jw%1tUwqa{l16&2m9K$Vh5?W!irKC~}av>aKf#>R?=RxXW2ddHP=OYZ; zcHmw^Am(ujpOE=(0U~DhGBr3U7^FXM^{hN%k>H?HHoG0v0gS- z33MMGxw&=Q-B0{gx@u;F#H)rptJ2+H?kP^DTI-Xk@wXa`?iW6;&M8l-Y|@&y=Z3p< zx5C?PyDzFT{9V(LiSeg4S)S zP4IjQhX|NOE;M6g63$^myX1tD|PG4j5P{&!cYrhjzVI=k4n({yq&x6oyA&vm+d^+l)- zayC01&&ar|*Iix()wniSy6jAH*D1_wzUQ{;fcR`C-?+(I)}d zp@{_K{KoPc&`~fpVcX{}uF?wL*;NXF^k+nZfGfTvVL@up=2X~4iw(N`h(ONDQ z^4(OUIU>gLDOi%{v${c_+tXS@dtHm{uXKLFytX!7s(|s!LtBS2fW$>+aoLa8md;qI z9+$7WTpLeHHlJl2&4&$JPjM(Slt1jgs(^m4T62KYzY0}<`2I42q+%yHDa(G6;^h3^ zQ1hxIxv)rQ(td7elP9{&p{EvYlCEkuUA7;Kxz0e7JXlinHzW&oyY(2g4ZccSnW*(> zc#ZE5#rHn&pQt8r<~6_xZ#2qp973;L6T}+#^+H!1?mx*+XL40`;djiU?Q+$bR-mT2 zZEx%jd9oH26c)+S(&}7Yr*Ws8&Y*a12L!T8s;25$B37Xe(bZN?6C@$S^1mtQLqo*l ztM%WJP*IZt4ay-zG88LkV<)rr3L8=d(}j$NH3U}j-aKhmBS|Ae%{848AK);_S?(} zqdNz+7gwfg%rVzk{YF&+tn{^F`sNl|U<0#cO#A5EKBd|`YPmWass{4tGII7^E03eg z=gi}Zt}+>UFO^O9Ula;$gB2UZ{3|73HVNAJKlWso3-2no)pJ1KNFDN8prI~2)S z2vBDohKogl;p_JdIFAR&vjArAB=B+&y>e9c22Ot64)0#cP7^RY~osI5DTK4Fgk& z3fx&(nHpA_L6M5};!w{jhw=L24(PLc%l;y+_NXc!gQH46J%Px4w(0SFYUr6ECeL#} zr7HC_H*L9uKk<2s5fMyqDiHPV<$-sfA&PcfyZgI^kT}dLHGyjq5jzUf0P`@i&B3y) zATe=sj1$v0NF;=#d$6;*kkq&dy!TTPhCzd-L?DTvucHeX3d4i_(LpDpI6S4Up~@5v zE|Co`Vndg@^C~IE;UlOVA!tlatwb6*$?beP*gSpF(uagtyl_k?UqwRUjZbk5>}m0jJrV~Ma1+mX=$qukJwsfuKod@S31Cq zgOgk+{h_Pak=5v9K1#VBQoU|Stl{~PUVFW3Gp)T-U3_#-t^jVL=`8E9{Hl~qDKc&6 zTCQwqXtkfmNbxxsR&RGQFJ@i(iPy~PL|3N6G?T~HIqA%SW7)@A=4Lc2%6zE9#GL4b z$bbVnp?F^%2e+Y^I~=6Im>GxV%vC|owdWK)+seT@f8wwL{SFh-+UqA1DM`bAZ~;6L zSk#a9H(q0EB16f(by8%ouTFP)`Wqpo} zf2zsw9oNQkAfwJ)YtOj!^pk3$DX`8s^zMkTU9F=ka{3F-wF?eJcE?M~Kl_a@=v@Yq zH@5>nhwMK0kSl!fh?GVkGF2Jy*C7p3`41^85;g4Zf{5=d!LLv1b0Xx*l=>ysSx%Od z{)$=tCKt7Jdd?MjRP>Ts=+LKfFtnYScaJhY%zibDPT|voP!p?lB`EBc*(>7enD=~F zrHFPb!5?~yth}enCE`q?Pe>Y>X^w9QUivx(TQIL2zXmuw0&Jin-DcYILy;^W1}YtA zsOtwv+Pa*WGA5}LT2(v}Nnb;H8xBqZa&M*K=-NwZsbiy2kU z?s?m&U`IameJ1st!wPdBIWre!Q0I%d8uA=#{~NEV(I&e?sZnERg#Iv_X|8LoslCHZ zqysS%G}A@QTCS~2%-&WjVrgm&8|=kVFhdlW7K_A`5t;fE65iIKojpIvH(Q18twi-X zJc$p6h&HXk&s;_pB%|YFW9$8y0A2oX=oaLnO6yt7*2^bf0z%K$&P}^8EfA5c(btIL zK|vgj1_k|1=&|_QmN+jD6QXTt+Rj)(uPPHeHxt}8hMddGx6hE9M!rJFl)0v#g@2O4 z%i&-XMQn&%FqH*oQi#nbDwQCeOPAD7t7=phsEg)?)Mw1z*q2}V%6sc89_m#S@r3VWN1#4yPuWNY&JJ(RdAZDppOHQedOOe4s*H;Zy+*N(LTK+ zdK+viCov6gs^-$Nlw*BaR#0OD?G^v9W#B#OVZp6gfndW|MxR{mrgf>0RP->w4L%Sp zPkQn&Mnn_|(AjXxZ)0?6?WZW-cY=oCSm#kPhJK$C5HhGu4P{2pf@0*tg677Ws8ug; zC@*~%k>=KaWFx^7=D~L)Om|8jZXKoOf>s!}x6jwfe)1q!N(isMziS?xl@r{}ENZJD zyS*cumtiH6_s0gpwDb{d)c&AF?KkNmjj#U-0dmDG%AWAkFt*M^! z#?kNxTf(&=EsA`?t6Buqo8c>$CH7+_A<)XRWY$_hnQ1coq_749Qz^{vcueRD6V167 zF65tt5RCGH*RIR45#gILUbb5V;gqiT2~Jm8tDu#B^CD`@Uex-4-6hy%fo%>@oPiDA z{4>A>U?l9^WXPN?@ICpZc7v%pz%Mr6$K@=gJviheq@#v4|L5z%3-V&(sjDy*Rmhu6 zV4q9U?C!OOTzBAjwH!@gMJH8!sfF{fWzh+ntjd-bG3SSRZvH?~O5sgPFmOKs8fc2w znO+6{QTL-U_d&aJBl)+O5-IC|=prSTvThYRstId}>UYxxSY^>aAxNPNGMX-0N#?l| ztTQt+*p=9^K3xeK!Fc**FmI$ZyiWG)sVm^C?a#w1NHilG2<%L|3AXzej)1Fcq&^M)5Sw zcbA^cjkDRxPL?)ZX@B&HKE1yN&}{O1ZDuumT#X-g-;Ou?Vq~Pf^cb%^O;>wc?{gLW z(t;^?M2bvD5&hcS;0pVvFaaf+`1=V5MQXQPa5UD`ap4=Nf2wB>PgkJFJCE3olj5hH zBFG6!Q?=B+VfOyFq?WT6K*cvQpTYP}%g|>TefaBK{_7}P+73gV_^L?2>Sq$1&64N<}7uPF%ifVw3>4SsaokyUm{p`da zF;)M^Am=E?Rk*mHagW-%F%*UKLnz^etjdL*%(#5%Lf(c@eyN5NwWG?VroGp|eS1QE zPq(c71gQ`dme6t-OO~TOe>3s93UWGQL=1Mo==oQJL23M-53;2xH3?;7^&M7NHi0 zF#o-{^XQM1OKAv(GJ+VHb{aCZf;$5*r5XG9tOv73Cnar+Er}4QrvLWwyc(Y>+hvnA zfh}E8WQ^_j*HJ7MF)g9Ui(XS7sNgN#V>~(y)NeSU=0XV-VQJr*ZivkVnj9c<7vdqo))djhpnuZRf~lyp z4key83YF5_tTW?0O@s63bw9HTm3#$%KgnO?I{EtAz=+)2Ee*~>ZED@abN#s!%7D$H z2~5_x&)DkxT%C|{xBgCpnSO&c4o4yZL=dY%ey~fj$D93bf8$4nfQnO5LH_BN^Bmf$ zEFd^8GhpG*h?}fAVMdrY%QBn>qUJNBXq%g?JWG&Def(-DE>H0+n|GD-SKDT3&P0OJ z<|rZcTYHcF3UMt^8#tsqLqdPDj<>$?gMB z$QY&9INMaypk?Amd4V@`khdlBIVX10#b0L|{{IhzKzqM(T_8l%tR~;1vWhgJ%CXoj zZ>XfIjwCbIW|3u>Usx-TRen+_9mD=7dTXA1nns2#mhscl<1YO(z{4aeYA&lXM#K1b zuF8t)zu+deDKNr21GeBchu0HgKMmk-Gtr$LH9lXEq|=nWr1l?tJe88Qq>0t$sH}T9 z>QTNt0VCv_fDsRBs4L4G@_6<1UgT78Tpn0P!foQZqf_4Oe;veX4a$^naITIdNZM->xKa(vd&7(7m6 zMZT$Jr7|$EKIOEAk-Umu7^A@aC`vVv#@yHMk5_4BLfSpWkv;y>ILLXjEV53?)-P?l zkzarhUv%e1x9~syBv*|*Qosj&gE#{$gz+K{C#|-H0#+96X0Uh^N)1x0H8AHnk=stB ziKAHlEw?)<6|i9V9Oqg5Sb*`9LIbD5D_gpi4 z^bCNM4LrPi61|>&ui&k|3M9SYt&Ve6xuBVFa;4~hMwX(Ry6B`HcR@?W6(Z0AsR=G< zL6TE__x^G3o_~DhiNBtI%?JF|TefkFQ|9_r9T#7~Y&r4FqbK)V_0HjEczzev^!A@R zw%^rr_{WR?S5Z&u68R#IW^fUOPuNhRPpI!|Xl% z5i+!5MqE7^#hdxw>TFlzoU$>U?|T4C1?cJLa}8dULV}i#z=-!D;wA`Ll$J_TIVAkb z0a$v9m{P7%g65?3dT{-K(}`oz))XFK1o`)@U~^175_0C_8-hH*=HiO@xW+DSQpg|Q z5KVAF1d=h8T>u@wl~)nQ^a!frj%Rx>-&@ulZMTObVg7Kcw#yN4y2G{SH7{;(i`c+V zeW{=`Oh!cGt_|xBl_^b~9Xm?PU5fPdjn`LHTI3YXud!CmYHXZcW)Qe43)=bs&|Vo@ z!Bxq0o-iHv+OW-t%9t`rNy_4!QC$8oD&vB)H7>Y#!=C**U1@l~OjeFclV>=kG0_{# z99u5(*Q7%f)Z`6oQ#`QxH*M#yOw1^YEM32Bd-{Us_N;zz-nG8v^EwtKR`xExw1wOH zr4>hx)5_D+V$tly-OKjQ4JNTvfU+LwU>?u` zi@Lc85sqqu8pR?`;X)#_A%)%~3VT8+1FRATJ`@z^dIP|zl zlnDam)=oIRFr4u!Or@k0Y$)APtbDAZA{8r4O-0Etw#^?;R2u}mibokHsS^343>^Y{ z-Jh3SH5>2Wy7L3m0vL9?O)mGS4Sw1)(b+j+H?_b<(lczEF8VQ;UEul{H_&@48T_tq@ zlZ>%f%*~uWRXBsNRMZzPE>CYu%snC$<$KN1@!9Iu|@QZ$l0!A*530+UdWjasAesF_ze1A5o?y-sT= z!tV+$YW~YebrXxmDd8D^H5-|0$;fM5v39O{Gv_BZ_%kBH-(P-P{z!r`U+WbnrHt-V?+d z5(}$NO%@FJX8ff~+M)j>;I!6;__wjLq~7E319a*o=kcp9o+>B`C&I|n0F@DSaDlNs z_(PmtQQU(+G`6juK|r`K<+t=7JM)%)FbY#+Tk_elE%|qxC~ZlZcb?uy1^-gsQ0Ci7 zF1aYYVj=%Tnq29hxdhjw(dcO2zL7jbg|V>xM2de|HV+v&6-FMn+!DebRT#yqalBfX zm77V5`cU!|3V<%Rmz%9(3CklDqw=YM0adiHbCq%sBgdFKjaJSIrXtT-KMeRrGl7!` zmy#GABfeO9jEarW9~q2BIZ_3P>r`oJGJHy2+;VKl&qiAcw&J9XocaCqE0&9T$(S8n zQ=4CvF8nZ-WlS5Ku$LbHO*ZX<#^$BT7k*L!s8Zds`0?%~8dimU0+$mUF|0~ zQ00k|8Oh#F+IUB2bKT{kMCr1b|7Z#sHUBsQY{NG7)uB+|~uy7BGm<47Ib^YHALgF!aFw>-b2w7P(HQZ>P6Sxt?~U9n?J zm5PQ<WG5qbinv_V&{QmkeM-441w9q zKnx?~Bc%P=N?+sciV#DZ>(DxD*4Za3wq`Nt+bFPYJv1Q(7l#%NrRTt znu(d`wEvXJ>=KtN!SqQdXjtiF%k|wT`hg zkbYrjHZ^Hy_QZ|Za{>~$vL@lT_)4iVf+SC(O4N*IqFLx0T+A2lR)uL&Cf9e9Zq8)u?B?{G zLffg=%Wd)+Qp4-yUO5#ca=}>{hYY#A%!as%6J?F0k>|=jv}H(!=WKgtotSQtw7O$j zHdaB!kOVZlZ`Ie&Nj-s;C|2B@U0=_xWN8a_6L<6N!pED*%o+i>nx`Dr| zP!|`iC?CyKq(1N<2Z6s4j(n(LSQ6HSLgCR&=%nJ5$y8J2JykL$GshH|u?rg069+$l)tgy5E-KsbQ zZ9{dOi%=Y+)oMmF+7lMq2C~a`66-1bDY@KX7gVKT_? zgv4up(j9Puh8uZqg+%AH@^?!gfAGQ6$7HrhHTL^hqpVrZH>La*jijlF>8*h26zb!u z3z!Cz(L+2uhg2cNmzQglD&=TKb%M2q?FF36H3qNUW~)YHXa`0;R$$%yPaaI!?JJJJ z_ QJ6Q7g##w+8Ssx+$s9g^jZf8xH&_#usnx@_aMZ(}`mWY%U?z_N{T+oR#@cm0 zz&0_m(K&DWORUl+tTJgYKEoK~p~k}iwFyNzvq3+aF_=COw#SWTq$klSmC9n)kCW2G zNnuJCC-;M#ICE<--t>DQ)w|IpT&ojV3H%9UT;AS65?u+B7~#4;%%sz;qnY#xmDa~r zOX>oe+Ssm9#i_PFgBf$}Yr3BP!vO05#8p+P(M;6|y(vOUjImhBXeM@2bIN9`p)h-@toWNj6U4$KJPBkeOBJ@Sex_^? z(1A4oSXom?eLRtPMB?0+i1pmQZAE)gGhhMRUoM2lSFb6w7iyr zQxmikEp;Z2!YkydO^s!h2NVIHG2&J!-7J4+fp1nymZg%4{|JN)-f--Nny6henI#0d zJqt9&?a=oaTFaG4G%l77>nxy`Tl9K?Z1f+Z7!v~pF&5^+gb+Ub5eNX*B`6&lO_UY> zLjs8;j-tu4?%OP!N*?pkr%+ieT@Z1##wvZW^~*WO!E&N^*gpSffS*T2s9fB;_^z}G093wm%T7t}GF zLcz$4jKB#Tb0WXp5wu=$|D@I=H=U9u-vI5YGQWE=zpy(&gLH_aGII=c(_hFaEVlW zS#B$D=I7$y$jco%BCMoFNEQ7R=pPIAU3{w7ZZxAffyhad5wplV?zZ!W1iziw+lh|5 zmZ^?AJaspr)tE9)+6YIeSNGk1^AWw-Zo#WUZi!~meb*kyG77IB8$+dmW26dS%Wuc8 zmIm}R2zIkhX%77p-^=&D6pCn#Zb?(KvS9`<*hO}jx8wjv9lD5{hP19YZ4HPk;i-ar zp=D-blUnmaCXOT#msaW5qH06jm9!?Sl@duq#BZ>k#bMX-DGod9q=neYdjKPoz@G#= ze*Xcs*2&*%G0Qb`XPY&4C;z8FbM%&bEn&A2udo}Hn)XhO&Sl4zKy?Lu%X4uSW-_dn ztMtt31s1bPsU`mpd+z}r#dY<<1_Z*!j$=D^oEXOqw?r`n90wdbar}}vej{wayorl2iH&2l`<;7ccD2ITuk(H1 z`+WcB|9G!B+?m_X`JHpmJu^FV7cfb1?LTFW(y#^joJOiJ1kIhQF)LL%rXXJyok3@K zG@FhVm_VxCnPJ*sW3-Di!~_Q$yk)_kYbD{56bW40N)#L45+(P+7_FhhjP zm1HsaEt5X+H+sD^`jxHUP=y`Ie2?diy{R|GdYM%$e-4oyyu;!v;zlxoRFS1* zuY208@WnAX#Hq5C&lPdO&KPf*(;3VKS8|p8?qE?-ekoiwx=Rh*Vs7z4&JgKxnQY-X z<)RrxHEXWOtusxUu|+otlEhuTU^93<-I*Xh7}TAodZ)Ln0Tf?&aDLPi@|TSKMAHHZUUa`68`QoI6q%Z zm&}!nS0`Alwot1j)B@Twn~fRyp&=1fGb#$Xxcr?HC(d%s%qwggNtypec}n-h)(v5x zpBbQ^IihNqpJik^Ip&@{!9FcIo{0FzZDUln+zOG%U?}2>`rU@K4GPG8R?S9A{3VHN+K}Ke?wgYwA?bKj+WR9bZ@(`DEeQ$kcJ| zbq%xPT!#F$vn#rnBvtg3%-J%*m@zBAuzq%S^K-E?lAV!kNy*elro<-cL+mq4a`Xvo zUrJ*^R(?fc@|=+u3NN@Km*mdDXWx#BHZV`%d%baRHC*?#cWpb^9+qX9L6&~=ykyC$ z&X4KZ6OqY0;rWEVB#V8B-(sGSoPj<<+)D0OMeLKKO;!cemz;t6Uau!hw82{eV@jF- z7&%7hnN0Cp-igqIl({fMf2o)uX3u-fW+s_vNU&QjeOhxuE90J0L7+i&pI?G5`EXn6 zqTlSgm=$tG*4oyo327lJCONJ?c2>`(%6ZP&O_d9~=skMq@L_HUa`g9>qkqnx;OGq_ zjV7pqlWCl$!^RVYSqxM`s#69f!J(E1LgHrbAbgyRU zwHr9(h~`=D1j{^$^7`6#L$hRB7s{^?B0h^bDN(}JMTk%xCkU7mg!ft?8!7mV&(LEC|%E$aD+#@%i;VPNa&(Tp9vaQ@BT;zXWpKZnZ zk9($a7V!WHBTjd)0>6?`FoZs6O03E-@fHIZO8PCAX->MCKg`>ZNOYwzc}@Io8*rIr zdF9jIf`YzlFS@Iv6D)R{T5Y$)geRuW@Jwy|9W#w_Fp2QqZ6ht^8DuSe>(JF z?aZVYLkRGa;F-!E_3?r{z{L#mq_Bo5Z^MfLt`+q`Iu?9HW;$-PuLm1;@+m6e#ZT`p zyd5jzf%@~Fr#$a@{?qfMj}<06fED27hh8HWBtAtfB++f+anULmIj4YF$kI=g7V#E6 zvXg>)K=|%Riv!USz|r%_1id`mTTs07ljj<;Ga}++;}RpsWmo^LdXRxgj!`jLFE4Jh zTl1%Q{`jviJa0`a2&30_30@;0a*BjfF6f=Ze!4S{oFhCcp~~BHF$NbN7M%~27q0ac zj&fl#rbg$b&laCr`U}tRJpc0i!}Gep2b1tGMta}=%DhngrG-r}%RU$Pac|GHt7xI42+0^O}NjC z@AY%M@9$zVBq3~-Od4U2DI00bD~>iu>=sjISuXRlyCh6dsofH#P|N1b;X=aV@}ijM z;-W1n&5Wk{amryTaP%;6B;l%mNsrS!=ehgwxaL`UJkIl;Xs#$1B&enSmQ+Le+oEnL zuX~LiF9!+J#SKtikL8m+f9C!vN{8}>H|X&)C{M!jMl4_GIWLMpM8FFI&H_T>1!vUpA$KOloE0-a1Op+7|Uj82yr&tFtsdx!sCnWT)I8M|v4 zoaXmXjqyDh2@#6#C26{6nQ&`LLvI{~uy3m;C4?$g>TV7=f7UX;HhI>RX-h(%T(xy; z<)#yhwYIp5y22wfE=o;_F3-uKbkx@~RT;y?g6laJ!z7Cd`9xjfHJMISWgQ6OG=z~tj4JVn%=Tu5* zWF(Qk#E6NLXc_VIc6*W$WHP3l=f6U~NVf(~!Aq=w+akVwxyHV>VaUw#-GAd>*WmYw z6|On(Ta`>95|i${{_C~R)|GTG*?oWOyZ5hob;b!(^R&9UJ^QBo=!rQq9(1uE|5xjT zt&8XMEK8PKpWoK~OmnRB^Oa58?%KVxQ+n^7%%!!XjpJXE3I?#{9a*tL^9J^$)SeA_51DkR}Gh_Z!7Dvv4TknPmx5Lf| zoAiak97wG5wkc$Y)^4kR1LjMVKmyuW(ou^B7=`p~`a zta_PQ^6tMP^U{qPlUO3DuF08_5JL}jn|*J%51o*8(FBe z>QyF{E~nsy=aOfwp19{;W-HF^KZ{(j0%%CNTSe3=iCV%*j;Q4<)uMu7S(TU&ol=GR z!(b5g_W}`nhjJi>1G)ghL*Hu=7$#;inGyK#o*_cy8o73sdC#*XF2fP5>auVLxZ!{O zZGwo?YV2v*%t0dZtvRsD#*^_RkJP!x6Gj&#%5pfexUA!Dhe_r*o|(v@1QmKoz#jkg!XIZ-C)D8yEHdYd(tqs3-B=w;2UJi+(HbzcL@Y z{{$Co9NlDH!y32>wxet92mO2hV@*L_Is48Xf9?D5)Ao_~mMzMj=+Z1+uw;?4rn+EG zV(Pry%t^_H)9hR7q{r5*{&~%UpLEZ;bFM?ZY^eE%i+=vl$_E+Aww=k779?)mx?x1L zXMf=xa~5nZjh|c#!992$VdVu^l0ufaqgh4|p($9Q+@?~&s(Z|>QUzP-R`SOoFt$>2 zM2Dkd7@f?t%jrx@+NBe2h3fr=IK~bkgN7*1EEH$E0-sgT2L-btse#V0fZvCr=E&sc zHg(L-3X>_O+*8|e-?TLsk6ym^kmon=z7(04X*Nk^VsYY}!uq<|H!2uo{^Hg5OcrIP zHaxq2>sy@=&i?%?&!N|X*oQS%W3XBiVokd9g+&kCxBC!{G**EXRAS`OiLn=4>~JAC z568R1bs@p@QKl3Fr{N3+X^50=oBvpuG??sEse~_Z1LH4{%eS0WKJX&px_?V~E%FX? z@8I$3L5#W}`q&~~47{(wsHqmpZ^E^dgj@S-dfW!GRb%~iSU$}=B65o7!14MwF-r4( zDq4!NZ@}^yP`?E0-*KJVf`AQClZeqhSY&Voa@;MG(qB$E?j{!HPO~{mv-2DGV7aya z*Y{vy`4^ZVHX{uFm=FDdL)-(1Wvh<;p|ktq{hxp4@p|UEW|up2lN=grdRbEDq(p;m z2a|sNGE?v{T(&&wx!-e;{q0{oH}8mqZvfKrLJkfCz+hV<^Z;JIsvM z3_*c8*d0tS5`rxd2}VT`=}xC^r`?`nN+K4w3HLPlmN;-pKz?i}Xmw})`%JilEn}ak z|K|P|jEOZzf0KX@LxKWBO{j2STF^pG~PV8yM0x{in$nZ^1cKk&eweJ z>_<4Hav9Mva9M3LNToLJ*S0^}F55UbrQ&q37)Yg7xrD}@kCa(;?jWTcV$R@QVsW&M z?vd+{I!CwOp|fR#TGJB#dok)U`KZ%M!`y#kxG@v(_FXQBfvI?FB+EaTB1EzmqZ5ph zk*n;oi{WXpVd@r@S7DBKc$mL4a}^5D<0T4{t1#stAIL^0zjrXRD8?X%NcJ*BvLp2R z4{S6WJg$=o7cl$gc(&x*<5|hq;#mtzXe28mA#S5%Cq%OZFxB%vxE3@vqSbxZc-HzY z45t5^47#IlXV$kLcR}`d3#9LR*3vd_WpnSAv{i`<+37KnMs-{8$kF^wi#ER0wDE5b zwfwp8Un^Ji?cQ}jug+nAqA)u=zw-3!gBCwY1L=5b$-Y(3Oyc~%N}CoKMEfIaUo@@5 z*-V4!aMdoCD?t>#E7-pcXOMr(9{=9ndVfSs0gd@ieFrXkU+ZMSHwNVl-7;!496$N4 zXE;eQ?f#`*56|xSug3=dy5`r+^2?r^X>&_VipG}wnd!!57>R#%U6hqhBk|vMZv5=0 ze`7XWfk-?oEqwf>=TFiod@tR*cQeETb0HqkkQU#{NF-_q#8nW9OIUvp4$+;k3Dh?Q z;weQVr_qI>h50*iLoc|;x4(43En)iHkw2biKKGO+W<`dmx$L&<% zzVKs$b-!Z92J2RL^miJ>{7oG!`0vC0tlLEU5(&48?Owb2!?L;tRZDa6qO|m-MN<~X(m?<5HEW&{0{sYe^?H%fHc77;@HJ(8 zAV9Hj_SrdcqzGL^KmfrCx&7Co`xDQn}+b8Kcd!|pWos(2Jp=|O)aiJOW zaj1uX(7w?(gS2er3 zrg7#&tE-M@-W@V2cTZze!G_Iw603)l9Na*GM5Re zepF_O)hT2)2WR+7B#I1|_(QzY0rwUCZ_(azUy-3tUf%A$q5)ztE+m7gb6ORie&+CF z@(8OzK3n;?Dm2D(V2VU>?oDokEI2%N%5+xeAu^No$duR!`Yz6|XU*|^i1&)Oz}(bH z9wt#_w|kOG5vt%6AG#k1JrT-kL&HN^ITsolVW5xr8#EdtH{Hk>uV|d$-Wkv)6XA{! zaiXgcafaYvyXgb9n%K`vr7>gg9vWs$IiamuIR7crZEhhJeY^xip9Eh1CBo$sRcnUd z&HJMsX+((MkU`5^c0{b1Sg~ks@yt@@N1;Zoe6G$jD|t@N{NBmGe0uURZrS5^O`18a zN*~QUF3}p^c||G9ZJW~5Yo&Tz3UVic{Tks~ajHAkCNfD)oasXdm5o{>c-9ZWEodPI zxvGsLBwTquCMHf4{+0e~_X=-ux*7ZvVA3%m2`*t=WWY^ADi{0wy}yjeURgG?JAcN* z>mEC~%lpuC&ajYpl}uVbVdBI>$tPpLgUB+cLrh98c}+9 zcsiGU)g2xp4Tp&z62rw@b%(g530%TeXmKRYvU#gfF_cI~IH{P#Y%;L(m1$LBmSr?mD*%QhV?o$6^VD=u`G6cm?ACzNFr zm?jmKm5Kf#%Q`T*qae3+(vCt|?EK;hO<8$01*NqQOrBaXVZx*mPtMGliDj-S^QME1 zRDr|}kk~|`>D$v%vjXDN58VnykSPegU69K}O~nKzqLv1KWwSXW&#S-vE*`!kpIIo% z4*YcqSc~!Y9lx~E`*w|uRtrr%Zh>=W;M{;6kv<_eEkV<78@NelUuHf7Zj6AXnQ}vn zobf7go1HvcrdXpwd_E}U;^|wsF{BIc#%KEOZW*}rt&i8Grqn*MHKjZ|N^ee?G5N!V zlAmU@JoVuH&v)g`*Co$8)V1lsg$XyWa&G)i^)=4U#&S|_BOzZ65arJqLQXOcQk0oV z@7`_lT;PJ(SXRnyqUCUAiRS|QFFdnZIJ4aI8v7-l*&>`NhgNxPB%J9H&TN5kbgUcB z+$o${3TG0r)m_4w7SEep3~PonTZJ?8p^gjdY!l8@!5Igh*)E*f?wQ9abG{hlBd`s5H&wOaf*xF~L(Kg0h&;^+(hAhSpg{cD~h zMk&W;qu526LW{}t4kWg?5YS??Xa=-UJqs;ZCvAZBm*WVu{+3(n`$qt2*ox5+s#!5- z7dP;lh89#tsnoA&HiQepQht0u&nWe2nhjz9g=L$4WmaF=a#qZKiDg@SWt^|99Qw=? zFXJ^Wj41PuxCQvpi8t|@=38ncK21YeBKCThzopUNvV~Q1G2%JArumjCU(5N>(uFOz zVHs*VL^`TzD0g7_c7M-7QbE)7*LB#N;$z^q7rWC8Zk?gRpml3;-!Lr`Mt}AuY@$0< z8wnL2EsM6<>;}C()Gkrkw~0i~7~$Q^pbXvH-~O9AU;j;oe)b$k~DXiy(&CbcFN&aYAYNLZKT;5RHcj6RB2sH~}(rmEoU%j0k+lIV+3Fz)cI7434=G;S5%Kt}1mgk)B^ixq=iX#&GIyQf;u+ zFmmLBdafW_VhRr{w})lgqGCnaIr7wSLpr-|q*QM=X}N5sib;aGR0dqGf(V4Z9aBu) z&xD-I%d?+kg51{l_|nwkb5e6kJH#288mEV;iis`usHz}>EczIj{FvVEI-ko3QB_9D zMH=`8{Pr*I^(YOYdk$(uQLc3Q-4=ZzH!3LI$k7Knh4nvDS{4^6Vpxeij`>OWj9D{^ zoQo=4?j%cW*}`davTciErzC_;j+!R7M!RFD+AO*mvup`Et{_w9%!;)#cZDX8iMmzQDlZ^Q(GiYSw4E)hAN2pv(2;DIyG6+^vezU9)VP}$Y^u=BJBH2G% zmF9@#@TU_J=0v7PTjZ_rlWOKwAE-$)rB2FN(mQdBWW}H@EhfbC?6Y&`SYp#d2bDT? ze*6731zmMB!!orHu~1$71ax5|abPi_ap$Clry`}0;u9PmTdWhY_nQm+QSO9?8*hc4 zuDg;b7hFdX8-WyDLf zolB0bNnbXvGC$HFna?mx<%<2444_9jRRE_cq}r`Eo|8&b(;RNKzQPgnB4Z|D-a)qw zj>4v!mYLciFgK}*&aKc?=t4jQwKIv{cU8z$6-h3SAkN5{1SE9wE;*BcIUacf8ovL> zZ266A1RVq(Q1LjHipM_Fq71gWY(JQ6w&@k(g$pHWy)|U=k%)vagJOjmWlYGlF+HJ) z)Nan$6RaxFbw#i}^ysjo}K@5{sVsA8i% ztv+?JkMr{E7%Pv+QeI@0W{#Z%yf9ak#t5V5^U%m(nPBT&8`ydlseC%}DRmZ|-j+Bu zr0kruYiIy_`=UV{nYrg}*e+`Ch*^ z;?DG3;BJimUm)gOEt!^tr1bEf-s0GxWdm!<G2bhWC&oaqrwwbLr&(xm!uGqXM1 zE@Qb;W1Lc_5Y3!byFBx**XD(CB9U7DQdnw~;gKhv{7H63j5XF8BnIIl6VjpyuPf$F ze(t!9rgJh`m|a(;b*f>;uvJW~Ex^fs?4Q(Q^x)e`~5O&pN6GVNSdc984th+?k1C`P?L6Bcm!kHnl1()>Y+nMpwl+ixaie z&CAT~a4BLYfecOzWRQZb&pq!u1k2&yf4P<45WJ;8Lu=m~$cE83Wav-dQfmtNCZS}u z*n}jLBh*m9Y_`P2#6R=T;G}3zb4aLMqmwR>+YCmH@mmDntBOc9IU^FSDWC^dA0Gdb z=RjDJI4hgc1S>6}7Ud32jGTRR6dm>wphNE=>Zr$vaA-kv>JGw8U~*6U9YLUm47Vz1 zbgqw;rPC4Rva&0*-^A?5Kh#N;5nkMVhAR-Y0w={}syk73&R!hO^VN!m@XD;%)5Q+jf8>D*^L`nF42!nZ#jnI&)-}Nc-XZXML2w}z<(8|TayU}- zPjN0Vwr6Edi$|Dm41dKR@Xj%R&B_GZMf}_S^hbg;BIeQ?zZ>6ne|_um=JbM94|+y8 zmC>0S>&l5SDmj|ZamD63Lm;2@pKmRHuq`Kh`9NLAk5}a|uY^yXF*PqbGN)onh0R_$ zZOZtlh^z^d%Y_wxF-BkMWSrY(JQo)?&XIOb7Upp}NwP-`4uU#|m{I3I4ew)L$aRZL zz<>)Ptw<-oRUwz|d)!wVG{ym(%xs^Y9utyUQ9PkM!kKFZ!_zLDV@WEE369d;I)#)r zd$K#BxS_zN6*J6gYHdtM<)Wm57%jtiUJ;~t0i?(zC8We19egfMX35VlODQ=gi-MTZ zlI+ROCPjW}GH;P4x5y_@u0HqcGNCqv{Rio7e5cdr*XV-7jXpdkWiE^^n#{?(O^wCj z>b1j*QV2i`(`6xIcBu5csif}l^(zvMkMNtzo^$VxpMrL)=yeX-ZbK|sDFjjpW$zmRLP zi+yU&d_``J8y}Zj5R+46j-OHJbk}dpo4TWPjcH<$Dc+%v4~wjvRFZB_nOfj>+b8zV z7CEAGUBUS|F{zPug+3{7YI?=8@n*H=HzgC5rf5rSrp^!<9iKfhrFeO!Ni8<$-vH?n zLBDmNUkCVZBXdrzj))9(I6|}@lT%hDjTJ-8!|QY8Oh(FR$Q-!uD*X{4X%t2~qA0dd z6&vNLOLB^t{OIV=AO+XLWiRKH`cTlKYvi*4hsJ8u;W4qgzy4Jp7ZaueUQ%FI??qe7 zbnCQ)WXGSgMpZ>R9aRy|RG8XsMMx|#nt?^JyU~hf z^2>{B_SVG<`xYbxE;*`*+@#c8yIlO>EdjwF=Wm)G6ES)H0w%|jFs9^3apmK}966N< z)MnINDt8Y^5=kQ6h6oTrVT}!j5HhGrPlJ3v_vi6)PMUFgsbR3(RB@G!@5k2xSyWg1N zw6IxpCq6D!JPkOCCy8!LBmf!?{+}_zBCT}Fs}xQH7i*?d_k7WLA7{uLC%ho-fB!T~ zpFL*ZK(UnL3XVMe^Vg+1qdkP#AC{<*G^Z|3eenJcr4IPbHiQ}V8lB>OE|oQpTxIte zQ(U1;R;I`v4p-xzo%-e3U3NlMAs&MaG4WJVJ4V$;&MVu8YWcchvao zsvM^_f~1P9@l|n7S5>SttjZP}T4jwLYpT9w+yvey9rprc170l_?)Cf5(O($hZo3^I zCuO64tqo6!@pS6LOv(l36qClH)Q8ADucwrTJ#$JKYIg)NeQ6f?tV*3D+Qek(<6@m! zvDkCb6rT)B7N-vmiqrLiWCoW>6QmTwwYIJ->W@sAF4|#)AVTg4a%whI2d5cAgINf) ztj>5nNDYw=w-VRxT(=|q98829oh+d$J~p;04#c%MO;u)4n#?JI$#6^L;-8^3E^*%e zt!etpYQe$AVE;xB;>>)G$#~2Zqcqx?ADE)xQmS1O91+4qMu$hlzRD<_F`lMin?WgI zMXQ;j#C&xqjSG!tbF%);GnSN4s{xEo9vxNU84S&ccS!6`J5{AZYcvKaB~eNAH_0;~ zO1uVA8Hvp;2b1swJ5@45ugH~nMV>+b3ES?_pM3J|_Xiv^lTK>wHcPNt)G|`S{P@YJ zgs9LK_9S;uqK}SG4EidQeb$mS=@an8q+LiO%wudG`wG`9st|o7`bbTvb$|NkV-OwAv(dD_3|R_VS9x~V^C2!r%HxCmxK z?hE@`|1_PmEwVit#)b8UdF@U1E8$K^PlkIP zeU5)bH; z>BYEf@jplqCrnIuCE=AsYvQiNca!pxb|rn9yfOLHZ%Zk^Ouh4eAU%}&QtIi{^JCKW z)az;Xw2ZWdv^&!F|J&&aNT<{OGB%}0rZ=bmBz^e%^nLojmog0h2g#aIpV6Apov|@v zTgE*Z_huZ+_)*62xN+l-XWBA%Wrbwz&UzzzLH1kOf658Zapk1sWakv+Ow5^{GcRXZ z&a1h$-22DR89$u&V*d2}9~Mk0_^>dgu(j~5qNzpCy3^bT-LDsy7C$JYt0m5otdgRV zijtWn3rp%sT1!@!Y%b{&(!P=-B|k2CuHLPDGMrdlx_V!{ST*iCR9y0HsM-%efet>$3wbf;vE%=is=<^ zPb!^saMF!QHzu#2e056llpjp_OJ#QD&!>h>o$-D8K7F6QPv58S)A#B7^nLn1eV@Kh z->2`>_v!oeefs}WA_Vt!A?l-qVM|nm$eDYHh)BGD1gb!)M{4x`7f_RT5m2-D8K4$# z7tm1ey+Cc=R-oIw*MM&KUIE&Rv=8ZiqzAm813lz@8|Y!|v)}s=&?DZ*fDX_+bH#gs zh**|VF3Vd$#b#W3zQpcd~XprO!@m{`4k1!{xd#3T$$`@J6lJ%V%qs05^VAE*MU z9;wlL9q4xNXFz+A_95Mm^f2@zfqrPsBi^e(2Ouv69-aYe^1cbw;{6@aP~b!gJiG$b z<~;*6%=;dZG8esX0KJ6tGNmBJ`$PskTmvcru4KRurFx{>K^7TsLTMk;{YVcXJq%pQ zfS(IMk9dcG4nSTGy;T8~U|xY#k2DN)Bqv+Fj{x27JqENFX&=(NVMICE;e8S4UaY?l z>3%Fdfcblo9`rs7^e}KPM>OOx`Zb_Ov2*~>oTYh?HyY>%-qS!YVg54GE8Y`C4tji% zD1h6)0X2DF0&0Pp3PA5|pjPkSf!eT67}lX`mmXrlqC-vio>Db3q3ABJ=*)g0N5v=?a~()~#3 zoHF7ZH{zT!L7z6D5858iKpKJHg!-cUU9@cL)S`cXxLP z&f+W(+}-u=^ZmW&J@?)}?m7KAT~#f!(_P)uz0)=h+=m&tC zk5(CbEYzJ_3beGs)I@f2I|3iTCJ{~%vsH?#A_-1 zKjS_Cz%Yr(aB(d--S3%YVuk3J1ur{O-={qshWA>Ab|HgAe<}D;9XhJOA552FvUi0` zD_5p9fmY?5;0m;h+{ezIdT8V-l*I!>Tnj6BGcHo&PI3ee;cbK!N)IF#@y0!bnXPZY zU4$dq6ubWO&7bHHuSS>TLQk|WU^Vi8nuQSrHs+@2&)L5ZoPBJ;n|#4Oz&eM{6ISGV zZ`O5alig@H9|ka1147>sc!j5W4k%#%H#=zi^L=t8`(K|t2i}PaRl^IwF^ICE_0H^%=|h%8{gGvFH&B-#~Y_O$``X&lxY`OrKE zV0>dMY`x};DM^9E3uB3H%<=>#a(w2T22Q&O z-MAzDugUp@ll?aD#B$o>&qUfN469RRZA0t`gGp&cAoNO9|i@bu0$4K&i1%6aDs zxT881lWi4%d-X?f<(d_Mj+sM|b8}~er)-S>+ELp2T`G59PPiF13mR|ypSc8Z;f4E@ z>vi-RV>0fA3q1Vd-3t2~1Y=GiybMsj`~M`@k(BT1!|r~FKQl_Cw|>B%o$!UZfpbB= z{uAGa7j>_YBMF_QX&t^RN8V%Q=PlpjIs81IveI+lpNaq-_7x_B z%YvluK7!fhf7 z4F9Xp5c^6sp_mN+>N|EG3ig#VcA*^R6^ea3v_hF_1)M8->U7$KqqLt~H^&n2Bhqvpw)3^+g|$*wN+%cC`OSt4>?j>-TIB7z1k zCm6E9@-D%7vJp=EXlb96p4@E0jIT4;`;Mlpc}#KWuGa{v+&_<*u{yt9Qp3qO{|&=SgikgSkj9>o3GM`?MBI3el4`SqTqF*~JxVrX(wJ={ehyLS4Ym z$YVz}hFzQ!^9V~ZO8fjnl@IbyC?g!kRR$^MzN^Aa3#PjCrUa9S2E=2-NIRip+{k}H zq}3v=3;Af(Sl$KP3o!o8&izv!ftuX2*xh!4AhrZtpwYZbm87Agit2QCg+mr|%JTjWY#>PA$T$m(WnFFT2^US^ihmNiOK z>MUeGGkiy78|+u)NG1*ZLKXrzo@^QsAIk7yF?7oRI>=cJbreqRa~hQ={RA9}77)klmMwdy zh%l8j(+a6xzp!mBERW_7R0jvL)uIc?Pk5 zKASz-JIKv35jRomZ_Vm_M9qp%xsuvF|KSKm))xO$VRBvJ)q zw?Eu4UPpQORP?3yUa{4XZwP*V)9z|wG3h5wm_M1dVRGF_oj!}mM3R;0(n0la$H(_9>mG3vea#Ae;c^b1dpAqHQd;QE0u zyAFckcf3|xj5x1^O8^>0y)2pU2H{b@w zVQ_NWkiC?(kEN84rGkf?k8WLlOXK{^@+^1_vU^~6U~`~1r<|>)Q(xCqUpO?Q zH@8~?w6bymbGbIMH*$dah*$Z@PJuG|Zkac(mSPGZIo-tkqRRCd$e9(;!SJ7zjYG9Z z1u$ebW-__S-b!um^g!nae7|d>oz;P?yZq5m%p$vMl?Qu8V1zyyhg+9DFYjs~*BCLF z(YDmu#-ZGL5W8dpq6z>^a4=<7G6B)_J&CpLt$*2B!q?29h*nx#>7O4Qo!L3q$|6YW z=#Y?3oMtkStgN=>ItjaFeO&?UCKBWtn*%P8d`&PIh)EsEwc+h-+R{mQ$siLPJq}zz za90}%I*Fz`M?+Pv$%MWAp=j!{4zH0sxAyY-{Hc{Kpo+xC=CG7=rDq1tw*l;?5*L8# zUDOByidpI_Xa(h0wHDPERki1;89BKDUyqQ+K7DK>Z-c?NCHay!T~Ua0^$pHwd3vR$ zE*DLGY5hQZb^S*+xUQ}!{5wZ1eP6Mnk+s{OoPoA9bOfSCvD+;xKtQi5DcLEE6xCI5 zk1OqC>XmI-c`L}xR=~WlJZS~})B3V|hy4Q*0%=2Q8`)niG1l1D z>fR&fvT0^1kPpP>w;4a@v7MC;L}%_$dsSG9sBt*NO?11F2{I8w3;S&{q2|iLwISksD0_ zSd>m(4q)X53dJZld-o+f*D{jvv3=F6K^v3Rbhb}+6b#S8PaZ?7-vGB#J(M;RlW z-#OTEII=T@h$t;KR-cqu+rl!WuAocGN@XEvZl{OU>+-IW)&FB$nv1B~J3EWH{QA{) zu}Z<<@R**+TRPDFR3VdtY~on$sEx!p22pd+R0k;XY@__w+s3a4y+&HD}%9vqNXcc_R z|47<9(JI)RXwdgOnSkso8tK(nK%Ty%gT0=-c9HOxj?37XdYuCX45Bb#ph{bBQa~ai zjxL5~XH#WkC#|FMW~<~y+@{Ju3<&DOZ*)h7TQu7q%W2*Tv`Vt(4>$Vifjz}wF7|~0 zH=0FPw+iYvpWp$X6jJKu=Wohlin!u31qLj+KGByROCNAh->+(innB`g`Sf^@qo0-U zRk!mtI@vy(?F)-G)}R@~E?ZD$%)+0PZrj(KPdbLY&+Q9bggJsQN(W?8SPR7-CUlf| zI2<_yvIUs7e@D1`nh2*eCDqNaW_pe)gAc@{&ZtCozRe_3V8MGu{E9Qgq<&;#jYl1j zXU0K&{OEmw&443sCy#(^nlP$K8*67eHtKG{d1#&-FK9v2n*Kw|{adFQoeRtI;7iAZ|fiP5fM!Z^jccylxW&lI~1P27&@utuVw+6fBAbC z*a((y#{nn$<23GEE~%Y=TKmvzeu3i5m$U0-?>?8C`1hOF`tR{B-?uW~sa2(Sj#lpN ztPxL+RPN@rxarY1XEAJYIwrRAwRo-3R%NY@H#+I&>=>UhpJAPSxc}k-cjM>I=)UFv zomODnIeVDNWnB(lm3!JzFjqVKtAOvO<4Ajp* z;CXshVB5uem`Q3FU{8wR-BDrNk$UXWj6CR!nh9!r5Ndp|YkaV3p7D(CiH+`&jPA91 z&b}Mn^ZXf*i#v$MpwhX&25N2ezFjK$*;_8Kq_wZs`>11PP{HYV+W0&zbqi zE3^iLad}>RzQc3)ntB-b+5mmd-;*#W$*}G~=xu?Bk^Z~TGosNwMF1H{c0f*)5RLUa zvx!L^OgnM_M777B$*38l#^+-VAM#Qr;>jD#QYXd|2yQ7luKfqka&OwG;(~;Gt$iJd z<8nV|V&{oYk3F4{2Zhl+p^*o64IkQ4C-TxORDxDRLMg>VMzm=+j-v3Gp>D|k@DZm}SF9o)py=M|_ zNda(@2HVaD+nyf)nG1lF2S9WKAU*+*;Q+{=0u0CYbTrr#Xg4|qKwNw5zZx}@*Q~-W zk-?v2A)FY%ofrU4)?rW90Vg3cLc{UY8Td7k2qy`!?QlKz%tp;0Yjn|a%aejbxvvlUCTjw|W^^p>o~hoI(} z&*&b{BUF17h^^Z?VM5R>kYP*hbjLPFKrA0D_(#;j?p6OlEBBMOz3ZiJ$aL1wEKo^&K8!WFKKsT(Q_sU z)$|_pJ;rCE!(f=4SX4R>7a22vmbkmK+$gg>&ho@5jZaHQM2-5#t%SS(c+uQsSVUk^{f*pS+X3L~l4cvU> z>$ZF~zcQO^Y$56;w`3mUR`0hByy`VSc-c2Tkl9B+WUuK!N6F_zU6#}dV4SOyhcvol z`e!AlbeitXCTYLF0*tLa0#r%Pv9gqJag+I%Ve&}+7A__xk9${2=BnH+%S$b_wY8T; z@}g$5FHa&5;C<84Xie^oC2x2+`vtA)@~WzCB1dI`s7|~Ebo93~dDC2ZakIRCHZK=6 zhTw&2TOjZSZuNp@Ixu4dm*QsH_EaK8b~IFgd!6nU0*NHh^7{qgskGdjOB2H==rP@v zG_3X%_QAtRHG|j&^&gMF`i9?!rTSe3uU{lmJF4>8uW{G^DEj<;KIur(Bi{$HU@ePX zntOomc7lf|JSkh4<@+H)W5ajXUw!MQiVBs2AT=sVY#FI;FGz5-GjhCKXj!>P+roky zHY+X+bx^h22u+k;nrR5{#c~)T8G-#Y9BX`}voM0Vlw$je=RZ-Ysp#lc`;kJ}P7oD= z$i$J&_kl&+v6U|gzRSvu0kz^HpU0|4#>fRh{9od+!*7u8L{pQh_yE~%uHW8Hcvr&E zUsbr82v~d8)5XZ>LcSz_J3!-xWJExG#Yu3l8q?F&)YNF4sZ@N|>JusuFeDO{lhb(L zS*~VmVgN{`A-g;UjFANCgb?L#WViwmX$*Uu#=@*dPPK$06(;sDN(WD82s<` zL(IkVM3TS^e`=`W<%{NcNbNl^sA;K2(UQXABh|_Q!AfprC^?w@?|sGIaoagV@EH67 zykesw?)=hZL-ZYo>n&2|MJqRCJ0Prw;5{wqs@YuL(A{9l0x^4**&IxA&nYUhlh@btfbg$gD6 zlu&u&XOJGlKeDAR{NAvu$fx*{&mqt_e@k*)ZYyA=*N4TyA<5kD{_a)9k)4+2xnybM z%yZ-1S&Y=3yd+IbIUj#4z>V=s_Lgf`mP!j9t&&)eqXkoy=JWmLAf?^2$P~TyIDTAd z9Ifb6!1TYJ7sgO)L3%j!VYcY&j!V>5LWG}>9N>6(Vv(8PRQtWbpyg-^{;MgsdOd}m zvSS{%HeUTbc=lcNG)m;8q1_ZzAqK6TO|Cnh0#r@C zjSRXjo+)YZ=5enOji^a4VbFNSA7M|wYrY9D#LR2(j(J~3F*-(!Dxcy-J$bBA9`rn| z|F3KE*k4{sNf=UG0Dwcui+SHT!BYov7yN#ge}~)KchbyBzaH(cP9KpS8EC}lRLR(W zF^<23DTAT5K%{4sDGJ}R*WL+#wdeGw*#Jk=X z&fufuDMMW~vYJFtNffjcx9kUr1V^cS;s3VFHRpA%B25(BQFEz*vRxh>jKY(z?0rB$ zB#>VkZyNsX5L%f7)lvF6))tE=oypfu{`o1$k zugJGn_p*|?DJzxD4HwxPHXf@%l%!p4EZd zsgaeISUs2F3->ll;WF2Pv}bi;0*Zm$$K`*1nfY5t*&H4z6aBIr`O^=b z_>YVlU`js9?p!&yihPNcfIMTBZh1PF1A0=fntA9NrMw%FR>`RR-FibJ_iADO<-QA* z9dEO}Bvp@M2ein0qwiXBJd&hWqNTR4Q6gNE8xxZolZ!ZyT2?GVU+%7j@lRORumOkg z+(?9SH^-7aH~n%{t{7>m^!s$=CBNP?x`DhGnZ~!Y*~7nR8wZ087al;RiKaB*VRd0Q z=h=jl!wT>C{GQDb5^e{9oD|F64b=AT>#!&5qc#gIK}U+J&3el(RU*L>#lg|CK=d&d(29qwR%t6vIw`A(9aSH zU0SRlO^LVd>3H1tY0Lb`3wPse0(WC`!pd*^FxQPU>{Cy=%#bJBV6zX~t;fAZjcXZP z=W=US{SFvD9jTNH2Q-n+T5)i^E)UO(-Lb6gQG``5+pd2-1RQsrmAQu>~PW%p?k5Y zUD8T+@^8C$qgXRvg7eWeNS5qH ze^qx5)&7FLU{N$(EFDNzrmjJM#5j!=(8)XC32T=Vqj)>Z5CcwAGf4d%Kf0Ky zw%h#ERDCquCJI2J-El~QFY5VXhjbE<%YMx2JoEp5J^ zo+y4a(n?SMb+1&-kfM>fr#@Hc#z)bLOuN;39Pgb#z!A9!#W8EX|2tZ|HGC)CZMJ9Z zd7|!6{3u~6W(Sw*;RA90l>>eVDecQ^J4YW3HVk5N%s=0jFZoVYQ-wd32Au>y5+c^- zHfKL1O&4?Zh$)z*_4vTD>lHU6?cONDbYkVS0on4X=|(Vf*@QDOw82}^DYrrXM7}}Z zYoPRyfsSFsKMdwXr73M|wSrpFf`1IWFffkI#A&3m8MyUt+EgVO?+*ql=%8H=1_^VL_Saj0Poj(X`$Z8k%oqMY}%(mt)JxEp~Y-vb^4+q_HWi5{d-tRVLElZ#3 zQi@ngu&9s8IK(yssxHIvCCxQZlH0aO=r0EMe`%0BJVX6&F*Z1#>tpwlJbPL1jDB%Y z@X8QxM1QHJ?V+%Rd#N4TkJZqTER~x_<5T_bECW$3Yq(vZ6Tp)V@Ut0L;biwQT z_*m6$H4Vnu8|{}}^v3j}H#>kaLYUDF#P?2uY}%3`2ZXO{%H;v+ETP6Py&3}gW@yWz z3n;U$A3;1({g4X`%s5Yb_9z{$jBaL2GG85~S@3T$HK3x~eEwO7S`s`5eLT^*= zP;XH$uQW%{B2q1P#&m7SknaHzj1A*B|1@k~*$X$)5o~Oz{l{|i9xs)}!Q6jtkM5NX z=h5jlG!2*NohqHfxs=VcA}oe*^@d8V>Oe59{YMXV5B2>P7bF*NXYW4mK54?G55Ve$ z{*7o1BtGW5O^VS@MQ6TXAs@=x{W+oN=#p^+qFn0Tn;lVryHynpt;s?7Q7KV}pm<~w zKeaOK&fVk;PFcg?DY;?-H83ikO&m zzjRg1)-C_qd*%xj+#ef`kT##TV#@@1+C-V}GPH^1Sd?&7COg=z2ngchAHzmyOu}Hr zT2Ki42LncEjDEpjVf{!p|AGHQ+$=siOpnR}i`7ItDlA~6Zlo?OY=_USs1;$^5@MOX z@3V3K%p~!C?CLgOs#aV+Rhs7N)>xi!FB;-*l$Xt9tu;^12>#<3TLaR9zC3BO0lWPh z_6~)6K|w|4aY@>^MU>QiZCE-g)(m7@^so_#IxyZ~p;n@x%Xf!7ybpILZ=O$XyjNJ1 z@}@XO(=Bok6zSIS+?_ipFV|~58(#o+Ev0ld{!)}i#**={@z~p=EvcC-qM)(>cIn3k zBHkBDR%SHr!N;n`LZbbWBB3oLLr6~C->1bk-!cA5PLMa=pFx1=7Fo!XO;vkcB-exS ze8y|nprq|RdAkBQQZoT3?vj2Yr8D|?k>qhk(p0Cl_xURp4}Xu`hbVgDmN-%LvN|W5 zpcy{_N*Gck9MK{4F|nBD_HR zN7=jlVGCCINc2-FOv7OKs%x`eS~2llCf@+p*N#NC==aEFYDAyRWkCSZj?Lfdq?W9% zf8PZ|myoRCbZ`i-ei=N%K4WKX8df^9=nM23R%aT6|BYQF^nI)&rzaEtUbgeTDmSX+ zf_y*nZX+AMT!nxXW>90B3&zU&$21Pp74*IAdzt;l-JGr7y7OGr_f@Y|%5GGH?|eZi zLOf*N|U1UcwxVELLe7YH;NB%6JND3Oytj~zFbrz&QoP)|7<#8UntVD1g-wqNL zULb&2qQ}_T_;QhJ;PNkwVB3LL1U>3)l$}P6floKR>p!kQ9<9SbZYzBnl>sHa9ZkaK zMymUs%oDLE_}DB*!_as*$5Nb%4)n)c$^;m7oLRW6hNjQy{Nm(+#OK2vvr?PhfJZ@* zZ$cmKWj-QfaHPV{ zjMLds3;@o>p-K4Q%hxS%DBTtxI+{OisX7YZvLM|9gQ*+$G(|KaalT9Yo9Ikcrsm0E3 z4aXu+@xx)Fv!g*R7N)p2T_#s2(|h@$b#mCP!t7X(Fu{R>+#uAU3)-+s%vEZ4v6CQf zM9a=Vr4EWdyxv!weS`KC!sA7>)Or7uqOf& z^kiz7sVo1`Jfq?_qOs;Q+!~8-uZ`=}Z~k-&i5nHRzp1(j@BS(W1fwGQY(G&H5NY@B zyi*k!0sOyyXB@6@;F~TNjQq*+PuncA@)D3hDlE4tLI<`8zSmjCxrFJuZKT6m5EsJ@T$d%nB=0 zmS7ss6&|8^KSzDTXgWR!SHbhwq;nZlbD*dW(GGESOwpM|X}i*kbLyX$FI@I0!-Gv% z>iHhv5!p{<>6cbP_yU#gPLJB><0iysVxjp5y*QG|IR|bBKM0Q*K9P97)})5$@6qU~ zMyAExP?y(lS*R~Ebm&hXi$e6EzM}ggGBr9DeTcyu^b_d3B8f_IIN#EQg1aQ& z^c0Qky)%?qC8H!TcBsk>N|O%d8e3Nwft&>;u4MXviiNq`Uq8uKgb5+iTz$B&Tw7dF zGxUg!pVg9Q9mw6$T)PvSQM32fXm=!W0U(w_Bfd|KUo(7+{FD*u4>Jq0^a||b29OFN zPqKYCg-_Km47VBqEMg=(_Z+)_l)oEI{w}Sg&Nzb|^^0{%Z6e>o*nDw|`rDxOA*g;g zz9rhJwH%$UTnl1gylL-i!AE&oA$oEKRj1S#K3h90q@dE;TC(fA@4y^T&qZ{|{ z>>Pyve70GPbB10%*+YvqBAX@I=AVKax#yUH91Pm^5gfKRVo#K{GqH!m;>FpsO2+7V zO2^@uNp-3wb*Xl=PQnycvKbx8iwT$)f&iH>)!S~LqbRmQ!y+m6LS?wC_iqO#VlSva z|D@QJ3J;~&9+oc9rccJM_WaQypEtm;g@?^#fLEPBc$wxI{V-5HP%X`P*TH?_b-Cqs z$$J?YJ2?DV#Ft8t685t6;rHi=sR7H+GQP}$bfa6SmxwZ0QiCc9^fBS4pA|AN=|-5g zShiR`>%VBcB(2eR;cUdyZuwjav?{!O^82JPsI)~lE6<7>WcH=VBw-b=c@;;)fA^*$ix{l`npSN@tpIvH@oFGP2mM zQZg#4(z?6&yZEz;ts1RK4O;eU_S9s*Eo9je3fHRE6wfqtzA#Bk?V|6Z&&pU=Hqd5X zW_k4bWTAE1G9RLJmPfhH;R`EuDET0Jn_vL3ZU(YeOb!C?ZRK(Sce4f|kJ-!}4IPE@Q4}5ct^*E2p>sM0YoWyo&zjlreFLWyhQ8o-)RO*YdEFoFxFNS|NUui_cbAn|Hpsyvqs>tFp zsha#IkyR`F znpt7?h3JN;uyr;ApMfbU`Q}Gq(riTX7mu$VGhfFbV?4YXJk=SNsbh${0QXpDnbz@@ zQuRVcIlMBX`?3(5x|lM<+j{1sQyZ7$%Js_iiMG;Hu=|N%WBp31o7TBndp)_0(k-le z_fy&vv5&HT;al3RijcaH8E8Hh9J|ziG<-D7C?$}aW%LSmn0NT$4=mtJ5Xi%`k+2Kk z)Fc@uPkc*7TcEX0T*3rKa3-P6zvTceV{Ol^&ueRSqBZ-6tSM|L>MmELR;28HYL?H} z6*q1-_1fhLs#hENFD@Q#T0&d;F3g?nJ`!-GX@Pnso?uh*WU$ z3)k4=+>od#Wwup^9piRl)b3FE3z2DIZGw>P%g_T83#*^yONo(eU>>?ii~ENE^1$omzzci&8e#hSbKbs; z=u~1<79FC161{g8`wf3{&c2M)lnaA*7VUwTz1Y+ou7DET4L=c-k(!z#6;MLG;b)q; zUJJ}B#`DhNo4Ia~oN^)X&f+}qI+L7A4A0spzu^Z$#n7VU0!n}z{vXg3iK#g(0ZF{SCQEGX!3jp?!J{lYaza7) zuRj{5{}v+B0H%L_Z^$9dx;ihR&z5*<^2I;od}N#z8nukqgrW<6YMIZq-8bPN^x?DH zA0_N``sc5!U!Olc3*U*jOZyF~2U2oUqNo`S<@X5n;VQ(Ri?Lo|KJot)jLn-eJ-Ft6 z;wO3HhX-YmfwIB{rve41!Ub7yL0M4y2ojJ1?o*lejmG6c`O85$_OupFUbU>KVNz5V zy@dDI1o}=~nM8w#H7aQQ2O2|pYbYIM*wZdN#Z#UUlm+jO>5aN1a=>H+7$uuUPgsDW zy@2d95Q=+gKIs)%DCGF0d7*UOe=;b~E5j$C>8@Cqii&DE$?RQYiMJeBpmFG>rwC z-$Jfka!j6?AuMIu5dQV7QhSTTjF zGP{~P&i@h}5~pjlQ@#DCI3sR7?N=OU0aN(rQyGG-AUeV)l0#&Xw@gQv@i~B~l?+n+ z@F>~CZAJU#Uv1#1HsPxqB}<}V{JI$j|3+-w?T*68J-%1^PP|b3{m6&9Q1wJsGnQXY z1xS6KSCl-$v~fCDJgM?s0pBuxWn$v@N02|T#HnFgB+l*dM`5ujOX8~vDFm@@R5lR( z5OXMQPTZKoZ$SH@#AfYNmufLnwF6wqy!(7UW6(elSc^#}eK#%Qiuss=o~sn6!CsETMelfHG?aGqzF$ zRhv9fSyWE>@8aL0Pi?9NQAPgBLtnQKNXEnqf7`2C(6b%3kJ*`XLUPA7@Tc#8?~YMe zHC}}{XOL@>m8A!llF$Fm16y%~Jc6}3vIa|$ZPb!;EJ}zfQdd-gqu;@rHYD!tE4rr> zI;9|R*NGyB6xrBHNo;w)wk3xW2z^MB4UA`(qEo(5UwVXf%fKo1sv|J8SGrNMQS*3Y z2&PzqyOp|?x{FxJ;jGyup2xi_!!IqY*U-UXN(augS&J>xtz55MpYWYB0a5wN$ried z_8YcWVo#ucjhV7mfyhmy>)?eA&QOf{iTccca(0%tAN*uu!OzIuZ((l*gk`bQ*;uAG zmbYG8JfJQEO8g_}qS++1OX*#?BhSCU|Fglo(1H*a!;RAI)Ijyk)Gf71qo2AE{Q^;u zal{6RJ+){B7ge-$ZEx6jlL3k-ZE6F%@7Phem&x%K1>r(O7=##M^wh%#bnC3-tmIhd z#IeM&;bcQbrX@?}{PsJMHu*hYFrPOMBLZsw9&@{U!Amlw8=p}bom_E7sc)8su#WkB z^I$bPQB{y9YzJe~Md{xK2|W<*F*8HiKp}2%3@i)*`R-5g+_5ozUastKZ}|N}TXaSZ zwd%fdI$_;kfFrIc$o8L}dl@J`3H_`d0}SKI!dK9oGdgd|*o)O|TAwLAB~pIQ#*Gg* zDz+G9IZeca{&y?f6nA>zdPe8A^TD&Ieus)?6I=e-qVLqd#-X7*_>$y~iO`|$9c!EG z)IqERs{}~s(D07D&2^#y6?X?+rr&u``oUkF_IT#M3Pf$xoDX;=f(V8jR_=v6kgqgM zJ7(Slha8sfO*%&3V4>pokC*9j4irNqrxYeHAt0fl^b-o>mm&~@v7;N`CdnNnApL|R zz~POA_>oZe4d7E*n5x7$LE6B6U0RsRE60}ogP6z6ddEeM+EAOgw3+>?urQuFS+c8+ z{i?Ar-ZWV zDo0Wt3mjI8z+qwol{P_HffB5_4>ki0&`Spq^RW0t$P`G*-)_u>9YUq9NE{|1(99wK z#nAF001lJ3AYxYPpTw*J&e zZ#aSyN`XqP!v79){~RcN;|cT^H~oohVoI+TKKThVXgO8pgz;A}HUQPq9=k8ga;jhN zUeS+k-0k^-PP*m00g;mG#O0nR;VNsZ9L~n5$0fuUqk8ZBy7L9zp#Pmw7x_w|Pjif4 z?m^XH)Nt?b1A{M*e^T{k^(*6)|HS^-!Lns^R{C~hW?bmzMncu@2W=jmk#0j)-z2yr z!|-k`Lxvf&_n*sGD~4VV^nJa;>SHO@zaF$ayX1!)yX4p>1) zzb;U^Qo4IAuX%i#vxoma_;v+!kNka<^QAQWydPR(`V(m4i}udM`gr`}MkvP?_oZj` z68*(sJ>2rzz5~#mjjgek1>g4LS2FMWg(p|^5 zv7TBLi>&v=2hYcQAcVJHFpFPQbug%SdaP%bbkLp4u(veFVw2p|sSNB|9b3uy#@xl+ zeO{QEnTa3Z;pO8^^pt9%PJbYSkV2$?(g1Z!C{ejRU}GSGY7}pn=YJ{ocseM~rzrlx zKjd>Aw(8{;mc#kdcxJuPDYSegYCm5yUl>=QBwAP#kQhHJl2s_=v37#Wf8p6n2Jp ziL5{?rh{g9Ii_i7g_mB%`fN6RX8*}pDNZ&xS&@p<>IWdMm~8|T(AF0FP`Q%(n~_>> zY2j5e{7L6tjpoHD^YXSGq0i6V+JB7M0;4EPAD}y?L6qe$ngf#ctagkf!$bARC)S+t3O`dJ zY!xX2e`S|&Ig=Dj=ax}V;GP5Z&4lXYPUzfIIeLtKIuG#>=>4N#Y>7Tz+jO^g26$Xy zl8^PbM25O>#cq<5BeS)CA)hd9QJOsS*yuro@Ti+6yk>daS6cH*Bb3peLDK!9dSwi@Q94BbNh!w#ipmocM zRi2;nYQQlb!=)FFRWu4$DO{9Q7B}3X;<=U%msB@J&l+O=YdDrVES7!xAv#1HZhPAr1VVHqud8yS z-2QwD^2V|V`~%Jg|FsE{G{PTYuR>OsQCFC=ORFME(`Vxd-2;m@C^N~s^peh$OIXk7 zMD5L)G;%W;T-ze+2+M&J8qAm^auFQO3>uJ`lpGysoG8o zIBYizq_f*tQe5e3%&dDIbYHpCS|wVQSdDFxYs$9!14QGU`P$-Kg{nWJp+5&~t0HOB z_c%}#5XYGBcl|?N)qeXyz~KHE*;`l%oOoj@uA5GkRe0A?^T^DsI-N=hR)2jY#boE z?5z(4Nm6W6=2u_VWbl!^8lUmQSWLo44@Zf7^B_0*$l+{!$3O1bH^LS|@;H?EEt1?g ziaqN)O0i*S z2FD?vO<`L`S7`Tu#@~(42gRI&_)1Ev_O-j;$oym5|Gt15AF4hmw|U*3CMmZbmu8{tS08*snoB-zhUqHfYE8RW z%rS_2His2r38$8M(*G_IidCXnwSm^6JcUp(ecq{4M4ZW)J=I~y=sGhifJP=gbx^mk3s&m)P3@jvzUMDza2Bm#{`aWVSWH5 zb)n?XCEaMnnWDWi`H@^^JDu8G9zL-+n#+>=yjqf9y#IQC7TS4z>)yFt!gz1@Q+ic? zm44M0$n`5tAcPZU)^RcM?ZY8Vt__k@Ac<^{*ajo?dRYi1@%sqVdf`(!LIVOcQ&B@ir#E z>B6cT*1rVViJEp7W6ZnU4&NF-;do~W>P;0^LitnEmPb>^ z^*01J%TJ`BD#7!j^{Zq5e#5lx9@C;D>nElIuJkpq%Q|w`HFIaQUvt*-Na*@AMyFNv zJEhRdQsmuJ_C@{?EpW;IRIV4PnPzT;F-3ohmM=W|gm!+%pzaUpr%V|p9+5M;4b|X} zB0|p}+d~^^1}g-P#bvb#79xMwtyf@tH3co_??~JclE^35<=TDu5z;Nv(YJ2Ck+@5x z>iU@?vetxgcTCv)6W-V-b4-ojlw+7>^rlI*>WSUT%IVIUJQ(YbKb-@4lOo5I*u|}t ziO{ry%VwlCv>@z~w|(&Grd%@h4-M%nDyQ=2YW4H>4RoG&y*IFKCD5I2 zl_2t4r!YtXY8+N#3vP66mh4|%Kw<44RND)y`#B0tu=%!bciOaxvgz`sx=E%fSiY92_BEbn>CNo< z7ol@uZoJ+u*lUu1%5Q(f_5Y&lEx_Vvwsm17KoZ>DgF6Hn zV9*ePYjBs~GT5LYxVr}n?iOrtmjJ)$hAjRdx01u9~Xu zu4=QNSGPjQ0mPZOzU%IOhd))D`DEu6kRzB(N>k|zBcLDtey=MW+Q)k4pUSoq+GLW& zhUcst*_`wrTc$EepH3E59=4F!*0Y&O4+zfDZ&qxGv!Ds_jx z_I{^QkGmja@<-9iB6PWM;XRJ^A3M(HpY=bNWrQ1AY}0yeY%E$*ZaY=U>E9R?MaRFh z3L9i=7#5^!lsypt?ssJ=WuL+qumsPyY2Z}U8p4Ue0%0CQmdg^_I{8AS#F7YQC(1GJ zcK`fMz3&5jNg)=g`|;if>3Ouo-+n)vl=&KeTcIMA=<#8Oi36S(EjnlVW|H#fj%$}O zf67>;=hijm)m11j%oy?D$G;)?^X^FbT#?a(u-aPxmygjO&$ui`4<5didoL%jz`n}4 z##}N9*-2a(Q+#{}69t`aRUy~Um~wi}nf}4|A6v(FgettKs(&-r-D&5pXI7i0lP~Bl z==Q$3DD8Ros(-^mrr1sK0lThB%qGFsKv%eKi@?%YcM-9H>|DS-cGK+DZ8(ov?h#F$ zHS^rd>vJ5frw}NAc~@y7-pE7Is}T`Hou^Nqss?4P;F7fifM6q~M{(>v}mp z@zCE6a!KKkIgOXG@;h<_j7 zjx`lb>i9Dn-!zDNIeQ*ucu(31`1vX=;@X@(5>nMhE{sKIgT6=Kz9}&%^IBcUq7?9b6PWO{G(M~Xl~SWfA=3AsdS0=o93J5COpZc!(sNV#;xLLn|7Oa2(-RVWmm@| ztmPMWryR`pDaxlD51#}82wkY)4Wh8zx9(|{pfXDdlhdOlEpM+rOoKHV8Rf6A@40@n z);xMA<65d1U*2EL^-d~Eb5o}Ddud_Z`zwtrjd=E#b_M%Be(mpTLadGJLaYjBtTMV#GkQqf+GE!h zfHU((n932`+S z&zj6Ih9_UDhf;r*rbLkr6K)^RY{8>5@E3Q&hcj1m31f{GIpH#3)sBtQOKuWQr=(q( zThlS{R@RBqC$n9AHP_+KkqbjbA+L*QMS*K8@k^lZkmzRi1;=d)>=_rYC_8f>ca2^- z7E2#mOhIj-^DldGdo*sTt$%q-0r^ZT8xQC7YSlhmofpzn50>yO)SYT95*MDt~2h z_)&JN-RmdqLxO3Os^Ttw`R92d!}nK_x5|bURe$*RbuXEHirO_-t0<=qu1xQlp31+9 zci6t};gmp+S?59c_ZA{mI-9YeUIF6_zENVrqgV1ZR^a)zYXPr#;BuC+gZWsU#eD4%@W|)z z=_uf^=Md?d=HZoBjZd>ra@$DzxPg_Sv7w!z#j541N!8Djy4g9*xr4*2Ytw7B>)LD7 z>)}F9be^fpR1qGd!Zd~7$zMoo+vevF?XUTqNBq82ra2IN-yHe1qwZV?m}TWpNge+E zc}K@NplN>T%kj4&i)?Kh3htQB(1-VtjU3&2(ypl(DLn_F&hG$|1K};<4dHd+BVlMOk%Yt)7Edq!26`B(%v%}EU$3q3 zC3z5f6!&fEv$(he>CN;Pp>q<>3*$}86bci-j z`crhvXmC9?kD5VpG%y3R32#WkE@xC3Z0S-g`kt;%#`0o(CdW=vDA*142!Da!MQk^A zymdS-$5etLI5{vmcoah)O9#7|)#dZTyn`R1Q|GWP)Vu8D>@SyDC?%*K&K>Q$u*DM(66nre@thUBl z=5yiI)5Ztgd_i{Tixdq)<@Duzhstwt)wsq*J)=STE`GEifWEzE-SCMlh!?~Qu6L^k zySll8uiUmF$jwgrca;*e0<&hb>a+5*dYVl(VKz-RNj4QW0XDTZ={7|+RW=<5KMtx7 zQV$Xj$`AYxoFK5riIP2S>!5X+^}TiC^@?tup4#r(9x(^QJvSkx~U<4UNM# zrJ?^QAC-zL7faB+Uhl z^vCG13?cxplZF|r!5ADG#E&bZot3hWT*A@DZ{l%s*zy}}9=snkjVq!VlQOu(soLjl zW3QSeg({pEdZl|Uy4SWYx3;zVv>~=iw%)BsoCutlow%IXo**~`fz!YR;3#k#I02jv zE&^A9J8pj5RNoZer*zWUUBal{1c z0s%S6QP{NfIO5c|;IdtVk1VVm|tOuf1MQtMI+x!6p(O@EsF zH1+Jij3OpVAWfiDBjREI;xsaqn#N_$h0ir?qS0R-rcGJP^u=c6I(3-&9HcE^WqMn{k@@@p`0P9p_ieBA=uEtFxugVL#ji*Lq^q{=6?Et z?yl~R?w;;&$wAmvAF|0Gll1?O!C$(zp9~LvN4I+BTgxQ2L?$guO9g*<_-?uWsHR-sX=(xAkYFn~nVrF{|W; zxV}{F?Cm1YT8|~SwP%DI91lUOry=*iui2t&N*DZBjhBsQjW^(H@XgIN^cLmb`RVRi z;zi)a>_z=W{zcEX$u|u4OY*Jo4e+h?P4^AySm+otJP_Ry-4Iq>AB8z2fOg zT2ly>`y~5GY4DR}QfyjmQf%fpPmYqrOQ86h9-Oy0;W+f~@EGKkQj?UEt2uMHjitKx z16|*c;x^D9ews^nq*_<*o(NQX1I1xS`p}66L0A#fqhgAs7<^s#)(rV4!n|LWpNQYH zpSWMEn6Z(>k9V9r$^^x)SuxAsmZRIgw#BeTJ$$W>a*bq-7=j>;z<^MM2t^>omC5~X zN#Bgq76uBF3EK-J4y(Z7!L7xq#r2}wd50l8BF8G95er+Xn+IfX;;|9myB$`BGfQv( zX($-DvM!=#>nU#!-5gr6`=@&J+gg=Vizo=kLDrRh3mu$lsBvNLZkEmETXE zVkvQ${FYBG;~_(v(Em_)j;d^EsRSAui_T*4LugpOLADx}TLROtn3H_d!s=lhv zWKF)B3^bmdF2amwKJ!pcQPw_wNw~??X>lw1*K)iU-Hif8tnfR4XcMD{$@$cl_Ak`< zly_C13^H5UJxtGGD{60L{_;w=VW5<+R1%5vroWSTD^pVtSm>^{p&G9`sm86UQ(#tT zR$x|iDZiJ_&1tSRG?)lt>SHQka#kBsOU`Fi(oXuxXD&IklW4~zq*|(WT`*NhCJTsn zqS zmDH*Zs}dG!z~(3EXEw9Dn!?;tI+a=CrFK(9ArH*(e1DZsb~Q1Jy(;F73KH5-?6vMC z>3!lPc-7l#6CuSfO{VLW<| z-iaqJ-KxM=dgQ!7umNOP@Rt@h{4p2 z`h#{UtYr;-WzNcZ&NUUzaqK-m%^4+$li7MM?*=_Y3^HTPp_|ixp;K0j>hBN_X4()g zi>4r5Y`W|e&TYD_Q=Gz%z&%uKLSwcF&M}&i+SfMPf%UB2Is`C<*Z_{Xenicb32Qx( z99#dR9G4GMAxGb3L8?I*Q<9cf!4&mpbH&c6&~)roac@iz<_1crqXV7Eipz)epmgj; z8re$0N#t`r&KN%rG?ph|FEEsnYDkrShl{JPPF0M5%5P6`Yv+T#BFpywaSP*cuu+!s z7FKYx0x}f0hSVqcoSbW?%w_9$|vbRf)1EBaXmc>Jed;U=HS55KFFn zjD+CZJrZr%wb|^V^%PSQpI8S;bOnDE^(9~zDLa31}y9tGfh>18Bmj(9ZWARtq}LuDoz>3prs%WLov_xp!!f0>;o)J>LI6#fb9=*9@6l$a*1@` zzM@$DGK~x32I4w@F&UMIoy>gmtOA0W-0crujB0Q;*qAgk)D#lJkqw~Qq%w-L*BdIm zrtaid;^?S0HJa@Km*TyGy^^8vdBz|Y6N6UGDLZ4fjeqNYW-Lw)VA*c}SJ=X~%aI=& z$hb@8S(SyYsh7qu+O1Ou`?}~`GRo9Y_75CXDW=#&A+I+1%Wq}x4{jr0RiWyHY$m<` zfCvzvW6m=RpQKbnvzZFYQ>Z}zC3$XR76_b z%4p)QaVg{jCT?dK4M+NG#fmgYHy|vxNLeYxw-YM~H zv5Uwis#iEp9M<0CmK)R{o$2>7AMz|#h^R*`gh~wK1<~cjp`_my?Uy^H?dR~C9+mBJI7<#)-R52glE?%jP#q1BJRq{%0w2BLZ$y^j^wY56h2 ziBbPCyK746%+|_LIJ(VE(Ar4QdJW9@nW-?*M3(7#N_C1ivazO(yB`~{l0bZJUkqM@ zI2TT_u7=$EP#mNNwSLK2u`pKhfj?PcKdfp|&Qq292_5Nbb*^4%niJj80b1B|q93G( z(Cy?DLXE??^N0Q4@32aGm@o3{oOuydHM-y=`uYX^bn(Ed(GY7!6e;QA~cpG%wdgS)g~}DG|oq0Geb(&i_{~aZF{vxH}hJ5 zGD(21s<$jjYoOdnA=QE_`Z9$^5qA|aD{+C44iAVKeUK4q-)s4(tK(7)9-JtcLd*K= zQ3FPIee`QWqF*Onan~ATY{LfL>V?IWM&VXb$)IGa2ihNxUTuDLes#E343qZx%do!| z@-Ub8lM|nWVr!Y}*`#L~qlD&Cs4)tW%_C4pMa>KgNuu{BCROX|-Xog-3E;typXJgY z;A&t$iOMiHDvL7efD0?bT0gdWB|Yb6Q&@vSmr#f30dPb+!V(yW1?r5xkCnE>;?iWC zVLW0=VSFG!M=dl~U>`Y#9gP>QG{G6S2Bv=mkSrsUBuCk}+vrU`t&_qt?HOW^GRh&viMJ?V87wSCiy zhG4-eCdLL%uWYY*=mi#3E^!8_8d;5R@J6K$y_16|MfXgCrLuYhpwZeJ&Qd`Hu}R5) z|7|-I6`KVMO2sZ-{vmPlR>f0P_C$K`iLsG#`#NvwYvNoC4hko1h1tJCm$XwAo)sS^ zwkSJ)!k3lX8h2X%FM(=Kf>hR4GR%&V%Lr+M3^rjXDOA<}U82AnIz@@F1m%tY!16~} zK{xg4NK{s`UA7XUy(i<81f4!fW9$u5lMfe~&eOZsrv=Gjv0$fAk4k35_>_{U%uFKK zSozi0b?WH+sAG#&Lf!gR?254Q2vp!G_UH@=(<=Rl~O~E!4*NeVo{(F2Mm=*&VVL=z;d`$cqFer+02c>!; z+sY1jbdL4Ka2gi32Mn^IocKmhXFHWYCz@Urk(G&VYdtXy>?;8@e1~f8)&9$*m&if5 zJuG$Sq|*Ms!J7J}xdpwgOq*Zd|KAYtlY0?7x7pr9aYKF$IjJ7-2>~7p9fDSkV;(Tf zhkE$7j7iU{(LES_C}gukCZRb?9*kg-ow0$(yHrui#f+GO^BQ%L&6Oo>gm$_UTdYvdlXTp^FN)9o?f5%m%faPXIW>58iJ;*c-OJeW7yL1!PE!VE7^Z zZ%%|imi_~^?qHt6aD}}VseF!LD+k|DK$Yr$Qw4Woh&`hm$ctx;E;ZQl+Jlh#gl0=Q zkgVV6nJd*ocyhDm(4AF?qJY#vUq2FpcV_;tbEO)8#`w!U(G15aJ#dMhx>07(?tg>D z2Qo9j?`F$+|Lf-2J?4HBxF2&P|Bt~Y4rWN|t){_Ee) zdwnR&>Hgb@N+i9YOOjsT?eKMrc(2O2y$q>AKB#rHw8F6OhD!EcvbTeFhIVFSS|{R} zs2XFhCp0DQC5XyoNJ(q>+uG+|jx`r;b*x{=gafXF=RULk~k2L7*N*KVJt$ojIqoHNng=yFKkrdQLX)$-& za8CJ>I;hFR=UO5xMpB&M?0mZ!k(7f*2ZFi|UX0EH(CbIxIT})wCW^;G>ZjoG50wNC zcsekhCojf$vM-h`0||2E=wYKHnYAk$#&hQ~= zI;COtP2jD0lPV9tE~r}jUS5BBBR1?H>D258`#`{5&?iOy34Rd%fUcNBj_)g-uWa#u z?CRcH-u?chxLV-ki+{KMNfA7;3^Dw~JAU$~O>DU8lheILGp6Mon~b7pF3PuL!^Evi zTu&^^JAIfUFB_h%gZbgN>>j3`h>S3eC>k#|Z#{`1ymt3}TsRF2E=_p+J)b$E*mY%ruIL8&fW*}Nj{gF>g zXmqgZk;jI7m~`fbn;(|`mQwGJ#97M=nr4IY3=+A$N}4Wbcb zBWR-%4sEtgd5QGf`aWT}&?`vYYbP)>LzD;Vfp14)oGl5XImjhbKff&0*!c zKHneP--($!9x&_l0Fv9YFMi1f7R5`5aF$Ks!9$sF-;!;tikC29G&guiAO2hNfpzf` zDcmluY7eA8c<2f4bx#tX`te)1Iz0!;?G-q&;m`c)$5=4xCAlpEFE)%XpngmMcWGTi zqFmXN<1_~MW80dH8H@pU4>kc#(P{1|H$}kZKZ=V{;!?ha*g!NwhB6VU^eg9boL*pY zo5`8M*l;?PD>+Ua@ISUmD44-`FuIlFWC;JG1J4kizo|522#8E2Re6--R0NCimXi5~ z6z=}rHDl94$WR*!%yO6Ggo5w`_M$iQ4K>`o!-nuyVj1jaW&)h*mJSs&m>%w48uX@e z$W>hZSXGRu5+m112^O7%`maf+5--=u7e+l{lnF*ja-FJRbOA}`7<{!3Kki~}UKdK))!YJs&wg`$?5tG%a z{I6+g^CMR^9Bq2&THcc9prWg2eCm>Ez3l)sgsWcHHj62!EtTZsnsM5rNFb-x0 zBUm))gbe|4s0yOIzk;N(!-c|?msA2bqG|BJcsY=~*L~ztjK_=;|HGudNW}(M8IXH^ z@DjLg&B%NM2Pt`h^y<3lit2%|B%PMR>v%*1?yOf~Y81X+6!gMT5W5&w8#@oxWX zE5(wRMx|j=3lWM{lbpuj^pnfBH8XifGwu=x|F?&2zP=}?MJ<59DQc}HyvDNm#5t+( zIza^v3Me6zfs%tnMixsB8`kp>D;LuXhB)=E6OGO!L4C4q274g`$U^XcJ|IR zls*?_A|^E&HW9p{AjL2^4$=_!Vtb;1tFzJCd|?i;#kXWQ@A%w((E)oOwq5?k`fIdM z?Z+2gb+nNwlukxl?vWT4?gSL-ixuHZ1+5zDd>I+~zIB+YIVp1*Cq^6Q7D;YW?t-WY-_u@;Ja zHV=HPNwP%+n?TQxm;JNZ<<{Ol^4a~f0}CXEtAnr~B=_t}v=XMZsp_8vH`sgojE(ls z-c;CoKlMcR&x-2L+RgXIqL`_nRi zH6vZHR!=HP9=Oj!UHZnUmHLBgba@i|1to+_tj&pzcq*!( z3RKxFQ;b+bkZYz9ns#iMyq4g!5_loSGKC_k9*zdPw`T+VTrx0eYc=}bL5GTst-?d+ zpw3CEzJbUF56OcKtTrJtlK zkc8Nt_;tN0+#CO#6f~=qOZws>&#bN_fN{IZh z@Qj;H$f)*kRd1$hvmUV7e$R7vXrjWZF=;v4g}Gvr9E%rF!O(P8*?bql_7!A)e|+>UYHpDpz@mgmz@hUM}mq8#QL-&WAs0So-lJ z(|PR)^6{dXDI4$iAVp*HBj4-3sz328f4uox=zaKOgRhS~A|l*^fP-b_t+7zxa-VA- zH0$X4@S6q7+TDmn2+*rCUsr}&uZo3{nX+g`?j0?!rLDGx;+mnKV@a z^NqwXx)dt1@2cF}r|LITS!$@Vqw<*oeWI=$flq3f3P8YB_j^7zJDqf^wnFqY4NkkI zy1hRH^132+({<#3tP7`=gn&ogF0Rd9o|i5!3T!?22aZ0Lm%U1qP8V3-qYn4^1|B+9 znCAei%RmK6XSTtz*=&^T+;kweW_I|2WL~>S+vN`RTt`s~ptNoL0*KQ2T|?f`y{|Nl zw5STK$IbC6UC?J(vLJeYPpHr^k&l&G>e^>qHK>54F79VyEAk~iy2cMScBFPX%b=?L zi6-(<*{)m-QHy{w$8A7S9-f*UXQF|FVHI-SIrk@B?>3;D{5NG!XCYP~{5`@RI&;;W zF)OC|2vM_;mJVBq=0*Aj*n4@jqE@ofpkG)a*{n}19A3a>A|7i=hIPHRMccR zNaBpw?_#{+75nCA5xGUCy~&F#1m8m6zYu{yb?m z8P@MjVj!_$2lqc6H&cAkK0UC7G}04Q)-L@l(og)#ubi*Y-1;ef6s6b?*pQ3sso5W=*gR)cL4bM4(e<%@uU6b|R zJ{-E^bdq$$bVhj^6UA6ddrnfm8Af!k?KhU*gliuoZsq4kfo`M{_KO`$q6A!C$@ zVWNm*QlU@jB0hE`of}73Q>_wMCME8^)&pReM{7+EJMk)47Gi^=7vjDHFxYtF2C%0_ zFxG0|-d~)#evhmFockr3_kEJE@rnWbE#aq};%&_zz0%4iEc=`Ap_F#+xU#lMB#8Q1 zA@Qa^wg|37;>&(p?%K2>56B9*b=8m_e-&_CGPb%>>O6vc_AUJUl0K6Oa9B>W>a5tI zbox`^-ML5Au%;4vk%Kg_Ca@BVS@7KyGroc`SP)aESr_T5(%&;h=SoB8$N;loR&r07 zv8`AoQ^V()4_)^#hIdQX^LI!KsC8XfTXHJc)1-6VzXv^}Xq`3emA)4#Mgk)wWy0~6 zM1*F~@km49dnbsLOkv#;abVfetQ&+$hS@bi7#*@c=$A)H_O$N)DjMEV`0c>IT*^3= zfI6`0h!(K@$n8(^qs?y#i;N~{e z=wLGX%YG=2kJ5>nq0P-j&esS~)d^TDUW3Q~pe(6o8&ud!VC%LZA@_&xr*WjyXY{mi~1f4&n!rB%PUuG-I(3;FfHtPqsyeuXo#QdHt8)IwZ9Eb^>!20-B zN|cNY`&p1^?Yr~_BU)QtUS>$`)>F2T68RmQaUr-}j~rH^gcqhp@9=@U_n z;{j}Q;dZ-yi*wN(LCe}c?kFc4z{AefGm&S%OykDG!-PzqpS4PE*S|(Z=I0rN9?UGV z552YAL|BC=N873N(ttRGCV1@KeUMjqASU*nZN{Fw23_<+cetzYxc-V z!krIyhtkf?_R{X00t65VUE0XlgCK&9k(bm)SqDzKY!{s!IYx{}^}LZjS6+M;HhQpe zA8#80KO-#i9v@LJMl6+y1gl+cPkBC_G<2NI;VjD8y}*g~#wf>7ZZh05k(|Cx-W07y z5bYT|WBlqjP>mC_DLN5om`mKzU3Eq(?6zTIvFPsWnA}C$G;Z$?qce4E8xnp8qtNkFv=s zqO}PI8!Su2yj{r)zbZBYGHb=WoyqgRDm7~R7cBFaawv8*X*!1I0axO$RO2GG|u+9Y+Uy8HUV;BCHZx}5KjcNN+zQ!lJ>I}r{D9#lc z?Kt+B?d%8_0f+%e{SIp_*S?sm130XGn5QtG{rifue7%ZFAx=xt$8k!eu>pGQ=Y`Ev zJw?;0LB5YM%G|WG956h?F~C@rv!ag2wU2Q@Mx=q&S9jGlD?1VqPo(cNNXQC;g^^Z%*u0@&GIG6KXsD*kGY%!;V1!+YqB(AKD<-HY$x zPAf&xpCCXD%O#E_oJCP@j%%houZX6`Ipb?eVlpC9GcQi>uOrX_Z~GBwzoOIQ>fsH5 zD;xI$P&2lH_As#E8)OsH0|ga4&93RlcM|46qxYIjJ&#kfg!qv7*T2a3y+_Ia;w&<|v|Adf4LP5^K4NbJwd(C@5k> ztkHSt0#LYCuMsx+m5=85YsNiz-@nA3=^Ah#tbT&M{)j6=G!<;K4ITNx?#*;t;{2c5 zn{DY&f>TUAm6Ts;b}ICUt<<#hr(bk^tRb7L!2~_4&-uFTn`>p980o^9W@})|gr8`?@T^hEM94q~9kLZ6JLC=PpYDC|G2eLKFEaxJwx=GaT6dDz? zAaeB%u5+Kw|9M{j)siel;E$59WbkST*pyq(>~{SPTGQpfDDdouMX2S!VDe;zj;+1R zh+Jpv>M(}=g_a1QXZP)`WH*0g8tv7-B^&K;T9;?Z7G%k8J{0PXKJ@bG_c0D(ooAHe z8;Xwt_@XxcO0)x<7)hs&)W{}q{mS4x3`JV!ORMGDnZG+3(PH&x(l9bKPK~^(b?{w8 z(E?G1Dy=0jb{9=A_GCCiHl^1-RmE^q90B|KH@QYU7&hKPJw~;{Y`jFY8x)f563iFP z=J{As1k;iulRQt-ZZmu=Hpw!eKtdwvb(#Tow-`;xD(F_Y-RR{rgk+m2ChRuenMKbT zr*gndz6(86$SvXQKj+^b>@C>K&P2@@}A{whi05a;41W6a(|4- zp!vlVUz06xQnb=2e7HtJ>g@2QaeF0v(Glgimkh!Y9nb3cf^^*0+3qjvjntY?HLVF5 zL-?xF$??|ua1$SCwYz8E*ymQYD`sN%N>(`f-)(&xl;0hpqwnO@;$hpf3wc%{m}mL` z1$E`MAv0MePD&sts#W`VD`8duY8&5J&`#5-$tIm~{3abL$JITzp8d4WmsXk#Z2@*Y z-CK`Yu9u*lj`2rA#l!>YLZPOYoJuxs&Cir0DW=|lewb*A*h`)TDd*|Qo@1`fWDIb6~Zc-ShM(OGx)u(NFaT2y}#`LKu#^qzaiCkzy%qU zDV`BCaO)oVSI8G(LASY<o@)m1x?=t9C{wZtBef2iR z(d0cz7Qye2tilS?yjs%uvnqYA>LBvZdjAWorz5`-fBwQTmwJYF z&7%?(ukX`YAFt>OSLD?lOsp03GQ-MvxOfXcMunAe;ZCQf-s8+x^qD>d!0(TIaHX#t zmDjW=EaUkzownBufv~ezMnseW0!%{$PaIEx2-3m7trc1M#zjEmu$x6-(6YWBm@tMM z+AOJjczcEwGWUjPr@?jP4*&Sf&Z)~fOf;UzLP zb4}}E`;#ABnF`tarV1duLX-Zu@~HJ)b5#=feaet4N2?sUQ5Qt_62R0uD! znZy}m<)13}NPcKk57T@vrth21hj`+t#hC1?$OFSmq`9sb3n}`hb5nKj)FMo*Rpi;i zOQg8!87m23N{9}g=6{rD{>`T!t}Jss->dvr!l}H}zqwgY<&j(!e*~7Q#E?w?TeY#T zq6Z8wlg6FSgJr`aOe?JN*K9on+tpMtLEqF52nn8Mz=pN59(s70IEdFWH`=>e5Kk?{ zWM8@bbiwGG4jyLo##R~N&RX%AnZfY4kA`#h^pXYdjrMd!RHy@yqbd|#y>owzqJ!S6Ud%g+8?G*&uOs{G_p)oE6!a}_ z#-9Aiq#tM)LfS@mBO=B3i%3yEwi}I2GY+`x1=!@2$+d|t9@tjZGOR_w1}Omp zLRZdlQ*HLLPal|kQV!ax=zM%jrhSHw9k3_83|6j2(tstklnPJ6Ot*m#?n^$x$08J9 z%9xgz0dk+EiTh=xT>}a*M@&n~!1D0s@iyq@9OC7%)FymvK!N$Q)kboM0jw`B^N!$| z*(o0i7!tseHpN2TBqEF0qysK!A%ye7|ou0tr!rhn;=1O$B=7P)5E$^s8=Nf8t!%MYB12}QD3A@ z@e93$_Ks1E`dZSL>>J|Q8*dzxbt7*<+bA;Yc1+alNHU6cEC9`;ika9PE3Gw1f0X*L2RB=*dM7R!e$I{*?EQ2Qyp(mPL}S*<&ZJvzW~`zx z(&aIQ)cvgE&P>R#&+kt8r6}#umI2@>->4t2-~28&seatl&Ap*`k+3&9=|l*)o1pgR zQaLL>%kb|Zr~eh6A95Lk-2jDwKJ%cZP%DVkQQNfVDc=%t!}sDXFIIXU8oE zj|uf1a&5eS0Sw&^1;+&E+nFHnP9irui6~N(Zwo*85>=wpObq*PeDaAU7a{cyXCN%hfhmn5t+kEj`1t96j-s1)P4u8T{|wai9*}!MAqT5rEu4rvKBLR2 zL0)3h@Sjm`a+94*Z{K66kzy2`(z=Wyw(^;B*GUC842}~JFVINpnpsAm*~R6s{iFOs zypZuci^IP`zqGBx!-)$vP4@ZQPg+|U=@^HI9!678h!6sC5PRw;OrscrdvX~O%$ZjbJQHs&~e>)q3)VR@bIaaNd z*vAIQ>%Pwbt%m`!2R^UwW|Z~t0%n88c9ufZ9i8Vgc!u3EDO_yZYx+Gfi3vTFD$X7Z zIJiU(Jjd2K+$lKLq@d-J2zKs$(29Ywbsj+G?%OhF*noI;Zuj2WSP=)fPO>Z!VV@IJ zTL(%ch@R|L(1FMdiR(b5P#Z1R34W9121(XA2HHoDccbe-#8LSz*OA#Wegxsx4Ym`^ z&(b{Tm>EXM+ay@oaaYI{y8fyYOw(ZaqhqGiD1VS_Rl;f$XRiOVTq?PKu>5$*EOo>O zXglIVTR!Hac5R2D33Urea9Vvkuysw;DA3NUm)64O&E81pVA|s2>-;r)%zeOX1wDJr zXRJx68`b&6-g_1B;y9`}i{5kJN@Y755m>s{2sA7ySEl(qQA}( z$Q$p6N!N)LL8B!CYqtCTb(8HxzaOF)FVe(d#%V^Mw zbdd)k;Kt;E1GHiZ)!)B0k2a(j{Y`30b^xgC6oC4ycxVcqpk{3|Lz9F=R(LDB>Z6q$ zA0wibTrxQT&#Jd(D}QgZ!J5*EFm~Hco4HVhPaCeSe*gDHc1wDHis3H4;N9nfsf9h@F_IMYOVZAY?qGIYCn?;3;k?-~KnYe$pk z%TvEcp`N}waFFXAj}d-~FTcCZGjKiauC}N9(W|H6?#AQfsn})YE&B`0`t4)sY4>B5 z;Ir6V#tZMslOTml#oapX9V*#N@QtQv&L;2516KR?ZKJ+J+-5{u2NPNH%d4-H8c@*# zgX|vqMH$;SA^2N?N(5vvIYeO*-Oc`Gk(#EZM^+FP@5$01bdyTv*2+oyJTI`$)93Iq zS>96Bl+vjm%)G_2=%uOw|1bRWxnOV4_kydh-d>Ch4C&8QMpDmV|6KeLzf>j2T0Mv4 zbFm!$zG_gj>WhH{lBF^{iTXE1{2$^-#hUONOKpBFv(7gH7FEy{+Qh=6cX%|77rzTNH8N23i)FjdETlsa))HZGqSm&K?axbWk)8 z1|d2;nq}+O&P@xqk!5V#*64Z_er3F7dKFP+^`Ls`zvlGe=|boFGrbDxO>1(!3ffKU z-+C3nWxuzrH=A@&H4oNcT08iEav`bY%PgyRtjDOF>6#{Ru1ESOYM-7Rx@P+5^!Fwm zQcaspYgEXBUL{{jnF7?hPp=}V%=K@QhSV~)HEUiyJ9bT$9cwndih#d*SkixT*WuFC z?fF|6zQ4H(LKbNM$=y!R4rc0{-f^mj6@dSQEZQAbIR>yl+x-)9BeHDTvA&7;pY#Nk zGyT&GkOh;Utb3@e6eKC z4o(}@|KgN_d_38uF9?xC0b8xJk2$B19CN3%$ZxX$UMh%csRN}T{VVFQexY-UWRn~! zcyEoJe94>(oHnd)4H?!uRvm$5C`Ssm8iov;{3|V#oo>k-{a+Ein&i;`#@ug`1A@bx z|L&|)e`ASmRDb`fK@+)e;@Bu~h3{(BL0V}l8;BPjO5fdYiE|Qy`}001sz%OVs_EC- z)Y5E#v(swl&X4zvi?_)>z^SIb>lvd@$8J?GUs^Cv7QT)_dTzn{Pa&Y9Sz|{of)tCg*QgG3RBRn!AgdfhMkoqMqQG>URpzgj8*8_gnKHax6rg1kEW{-)^7@*Oj zBT>ANMQ|YK+u0``;qjWhHi|&gL!lY>3{dC|p^#hatR&Y+J8o1qSJu|tum1H)U^k#> z&X-xS_N2D|Pn5-vsWYA^i*@JgY&+oruQA>%=-j81w((~b$XvTzWL{K?Ae4J^dz5%H zqvqPsZ)_1b+Cp)M4V2K(SCHxVr}nfgpM5-shcr?s#{M`+w)%{}>;?G1uf< zYkpbDlIexVs=LMt{J6v}ca2+A2Fatrj!r5fjS_g=bvAwWF6#Nb*2g`2GqRFjNk1H0@@2xCOF?$(qOE_~?3}UhAXAKR6v8(C8 z#M+cDhbD-ts!Xr-N?t4*Y^#I#9IrJ|9>@WXEmYxf{MpA2PAUAPr8_4RCE>%T&~Wom z;W36S%5jk0@uy4_jiOcwnQ%}}-Ve}YjoXMAMB+g47swiA(@YspHKwel4{7Fc!TbI023vW-alSYrfoB*zi=cJ1xznYU* z7Q83<2TKP5(Lz;d-R$ahWT~N4!68C=9b0c|f`2RM{+|%ohbVQ*WJB zPn#1hWAL~+ip5N4qedCe22fz5Sfjj(ENMs-qT(G<*}G`H8vG&m8qPGZc`VoCzXuXO61o+v-%T@y^0lF$p=eR{`UtDvVJ<#SZ z$Tn-I$F_A*EnZ}tEo(;zr8AO!fEQ4G@kb#JrfOhTF)&M>*owU{fti4VS%cV4Tiz7=Tp9a3Qc#86>X8kZ zwxXr^D7=ZCMT6Q-yVvh#JQV}t;wb+3inlnStL=Bmr4h+7|2w&WdZ$NSZ~Njsa;@lP z3FYYce6Riba4*|^5#k|*RyezG++IG%rdm{H#or>u*EqI*wv7k(Qrki&?DBSk?fh@V zk&<(MaCii}o!X**wZPb^1(n9Qta{-WWim3*7ZL)A&!Gey_8fSz1z&nFAO{RcIpuj| z(rSvXnliqYHWMq)q^$a{`DMyvyH_)DMApOB-R?_f%m zaU%u5yJ7a)KSJBw^45SJ_`Viaip8|95lH}KDBkRfc7?GY{YhX7cFQVt%aV^A=kSnV zO?$KYvNM&eIc;^8y*hg~X+lKwCiuG~CIjGuLC$n^pYyso6qUI;s%Vd!5~yfv4yfvD ztI{?+4OD>5dNy@5v#!cu-Stx&<+-n%4B9yyM z#NlS>@F}^Csh=__$dXsn&_QHw$aYNa+3>n)UGvzGPeu!&(3H!j#L&E29m2LT$(GZh zbTccLux{Mew{=)UskLq)73*SK(jD`3yhV2Wd?90F8h87FS9rrs`zns~wxsN_I715@ zcgularg^~*E>`)exrf&;jEP|eAx-_rr2%AWp&8$7{14;~vyAfhk<=yn%xl-=C9Vy? zz|7w8Hx}Est<+R*_u#2ZE+2N?bqfU9XdiH!!g4tOCEJ1i43TB-U=)ZRA6k80C$`8PClZbS z0~v7Ht{nn-UNkR}7XylVcX?wn zkdbydxkY?=b3b+BO}{B;q)z{ZTFL9+y*ixy;tZN7qdz-9I>UZojYzs>?HYgKVE?sM}Bs~43X|61s;4^>d<)rE>|`@Rn4u z>)Wue*)*cou~TY3C+Wvh1ux0{wpyuijCpqB=tc5rVsk_n`> zM&+2J7&)9Wtrp3Xav{a4QS|*dMJ$#iUHhF7tBB4jol1^;q!qgd2Wu|}4n%ZtYz@$N z@f5L0lD;>qZ&gfHB9CK8XgO*UN!YY-)7z3r_=>-W{o3Qdocxz4+!aH}s!{k|AVnP6ZV=+l58O^lyZvLClV7uE)-70r(cJpQVEL2%~{RNObx&-$xeS)mBWLCHLl>h z5Jyco3FVtrw_n0(ar>71S`|*Z5RSH0afVk;;P!i}LMIn#r)|kXE>hZog?`XpB}>2@ zx^d#E$qn?m)?s~jGhDH`IauDUk#A~IIKQ%PW}t4u3}<&cnNL1?A%4J}a6=u`rko=B z>4b2g@&_#k!~=r7dZx8VH9)KG&yzBx=0BWCe#w#|8hO%t*P^7^HOfijYAHLVJ~Onn zTVmJvg_%Jqbm{;+xTKpY)3%la7+-LH96ns|m5alP)u!Q%KD`akmr5>P<*M% zVK0D((E1swW-zBHuF7F2urZ+p|9i_z(Ck1Zs=O!zk8J#BmZr;I6ZnBlmm>OPN4hWdka78IFOg$T-v67U?t zb;}f!y=$ke1TC@(1s7gC@Tj|b*SEP=&hE7#B}`FcDi8723=E$E25_wMQwdYB}K}E6zD#ULFkaKD=h$dHWC% zMH%9qM-P8FfJN|o5_vkOf6Q&4V(8mwt3S8dVXu0DcY8*|!fFalp0+9!&e715RX2yyPxJFySH z4^pu6ACW#^a9c9ya;k;j@72j6qC)N_?I?`r(|!JB)f+!^yk{!`YQ1Fh@5Nj{KKcQr))9Ezw5&h>X-?oj+zkR;l><=xIstt2stjVJ zeM>J?;uIFj8AN`1^c(CGWbNfp-ycDD5EsuV3hxoEm|TcZSPC%o0^aOVW2MD}AiPwW zXtOo+QLs$S)3P5Xj#v1-jPEiJ7{!|wFRUQIch}{oG+j<744t0W`1;Fs_TO>wAB?wn z-(}obzsn;3>kyC!N*mIVe+M7^pRpk3-~S3hx+dp4*dGj}ruW0!JLZ%a4S($Sn6~DD za$B6}(KC@ETDJmxldt4+xL~RpdY~NRVkgwk&CcRhpbahd==Xd$R?RRKNTSi}p0d2e z{|D%;wV(R!Ur|E>yq)$x>aGXf#n+8)sbYG_sUk+!RDymtSaD3TlET?%GJd;ElO?w3 zO7}1`{QffPWGkHOq=UNpe&No3$2jKTXaf0WncC{IXWE_uH2jkHp2y%ts=!4NR1M2%JJ)g_4ilO$34U6fs z%CHj?*k23eDrB2uIMfk$Z`IFT6X*LDZXVyI5NE+nnBF=k2vNzqgM>47m#*%&aC|VPxcI(B(9?b3k<+i%3kV(_>DjX^-F$W9uU_5LJ zkS)A^pDB;7BE0Lf< z{~F|4WY#oVJ!qdkH-~aj4mQzVN}H%))!XsaYc)%CH7J=wy;E*C)aFZ@h-UqtBiEx2 zOl!X;Q?->F6qFga;%6Tst$#dVuto4574ZuZD zY!?)c$25Jza0Ng;Bn}@V{o_?mbJL#a3O^5WzUtK;y|(5kN`wECxr=osDkB2^H+N(G!JOiZWHPU$ zcN*G5%2DFV0&Ex(Taa&qV)fv^gF>Q(N%%$ zdEf71Px8O9X??_bQs`pjjvVNsy4}U%zWqiQiF-%+<*j5vKp33n7wRbHWEkWUcP%2Q zH*zK3fCwkb@A&M#_!rXb*Y))n8^|@wB8DXHJWh0ts}E!i(3tJlu7DfSIqS}L@(QJS zL<-PZRUUZgLnPi-`$&r#!IcTDJz|Gq2j`n{0H>j*PLGVO{i;P#ok&eCSolhjd%%Ro zxBoM>;5$Y0_5-s_eyQ9CvJYwX;47KcFx`(T3MJfP$y-w=7-Msb!8s@YK%RW_UQqh+ z&fR$Pv>itSdD*q;ez7~0$7=*Iaq))U;Yv4vzlENwm*HSV+A-Ls&5;^noCXLn%m(~k z>9Erhl~=L-KLSG|f~R%d7v-*P))3b=c~SG)E77){URCck)=byy#rD?YK%oV{IsyQM zV5+ifp`uH;!W|8^R|gv)fFlI!FvX6td83|bR zm5*{6?*oK_f=AFD5j+LD#_Vp2Q7z&Kp0N#zQ5|Awa*t`|0M0@XGoi_MOQ^Uru^IWO z9u7RF??$M*{{yO6#hgRCpNZ{p!ds*2s#hy3{#(+!P(fmpIoCc>qy9CUaWN^+SR}=c zeDwcs?0(Qcg*|PG!ihPlcpXCiPl+x1e=ot~%UygG_x}vre=VzXfe|x#swO=wzJsiE z6j$QeGVB!wpNSy?avW8_h;Cg_V1_O>X;<%ziR_K)?+sTWl3+mDq@?a1Js3rZ2#9cO zmlK{U|0jd4EbES**B2bOVX?p%`KIb$CeN4uli>y4m2SY`cfRJNQ5Kggv;7S*p{>sI zpP?$ixGGP-0)*IgX!v(XY%(h4l?vK(X$9I*Ku9MsJd{IoK;$=%;K%ssr^sTGGpy3l9{c(X`B4tk~^(w)lUBoh zRq%nF^t$$+4Y~fe5Nawt3f9fDS?#Il{sU7lQCm2Oj~7J zgmA9Uiq)?hbrdlkR;>8HVcsz2#&R!?xrmGjy@cA~_v{2$Wd>ITt~PLzLMGMPvd*In z#<3%-h^OZ2{|=DFs9YV32c0K*Yk)#*QMulX2~h^SS2<>hMofZSf`8#HTqNx!W8$YW8-4*lnn3Z8W_3*1Q~ z@{mU=@?N?2A_{{CSA}a+;d}D+I`WbV^~&Kz>E@%a++{gOmu3EC zp`#?#q&q&$?Ha{Xk!KQ#=4@ko@&UQ8A^)G4+NsY>nQ9r&2-P#WVeC}2>&8k|vCbOU z{h|??4ML|B`AyI&s?!bylE#cP+&IJ+%@x%SwR*^Hf)=GmRUliRs#<>OX*P?hmhpL2 zN+Xj+c6+0BsO_16GiT|5Mh0n<|5r9n!8bY8?4xGKGZ>J4m>+f@SJ~um6~Aq7a3|j$ z6hhQ}Z~wOcTnPxy{c)`;S+fP2g+kG0veM?MhpTQvhnO7?9q%+(Zq&i*&3Q1ZY1*ww z4UegfOVhxtD*|f|xXN@-^%>^e%hH<^uBdde0&^~5R94^>`}|B2ef^xDGrx|wJ2nMC zdsrU~Y<|ft`g!AC&HS>zh+p30JiD;1nSUYwyyJR5Sqs68B2}Wf^>H7{Ly~EC$ab*Z z@KI~TIjdt~gYUe6p4QLe;=au8yi)E}nGm`h6#@-(h+iar#6MLV`s`3+$slm@ z^YVJ7j=SQU6g>(u=!h?R=1^vC!47)m49Gvgm4pv&{NKzlrip3w@CDsz_27kxbWA#1 zZpx&xWiDANW{M>@Wn5YOe+Xv zRdlspQ&hej5I0xEZ*4mifH5{w$`gm}bN|XXVqLWi?5K8^>-c48NnGcRP^##T9WAkR z^QK;y96!@^!P0efN>I;71G+^|vbz?q*^UB@FT*_ankN@3eMFs3^B;?D%0}?cWz%WC zQ=K;9XW!?gim`InyHM;ztk8D;J{r*#Quv0_jJQ$WAe^*F^I-l@5}r|cKaVp#;#~r_ z$Y$)O;?B!euPe_eLV*i)dAtX-3>+((C|BN-Ce**^s2Fz zX?C2)t`S3z#IXWYwxSK_f*KX|F2B87rU7OT@83GD<4Cp z=sv$RC+Zato7_7cA3Y>F;2k~WY=-X=74#&@NJz@IB&-}6&G{;wQ^WmRD>lPMXYq}pRHE6r1OHQ0NuQ34T*Wv=_J>n5t zMBVw(*v?T3z*&l%CkDxhtUg)3BJfFV+#p;*et|f{Q-0}G1)5_Dn zPqa!@Bbr-%WS0WrzO4?RY~R+M(mC$4tZ?(XpH373!>`Qq1s5Ritg@x>*lIlYJ zg!(UNx7g*gvCgbwYZ*TG4k0_Z<$#K5x)+<@o0M$zFrbK9Ib9*mtRwM6|d#($i)4f);b9Y8@kOHo4s)^eZE6 zJNVQlR=jN?XDa(Nzza5+0}6k&(n`(8yvk@BQUdxSES!Ln3Y9Rl|3?1U8L^K{$u*m)i;Be`k!TC7T1mLT<)Od3Xe{5tVIcM`W@)7rnWvWrQzSB+D zA2RxxK3~@&Xo$R=kKidFJzIK8xS$mWfWdBZb{v)l|CxJmIkLifWub^anO%j8i8IR- zgL5~4Y6Ut(x%-jbfzuz*?P$i{-22^0p>MakLhlz!&OP+Bb{ooodilO&IQMG9!Z$;2 zVsVDLD?-9PayrYv-{R_nQ_zIpYvSnbmY$GB_~7+HC*R~OPxI%jOR!0b%=<=;P_3Y5 zEKBzJR=QJznroK{t{|taeEa~j1`lx$7K6%_U z9+*x;{&Jf5@~%H(%_;aOl;Zx01pcPh!oiT_I-5>)LtnHc_Dj7mcvwt@R>ek6$RD9@ z$-?d&8)t36qmK9)`W3$KQ}N2j7BV^{oK+(sH0jc-m{CP+>r}@1T!Wm3t*=$DaDux^ zK-Fnzj3(7S$8=Xjm1SMK32svbw>gM#bb0_Mq*VZEc+=>WOXz_$Qo*E|u8BJonXcqq zs6dO|N>>;cV;Zg`M=*dW_2f?)m7S7Y^I06o%%Ts{zt@>b&Gq~Z(o}p!k}Sx3c!}t+ zKVTCa`pOI`WEH+O%8CYfH$|Fj;%)DJB)+TnP95J9fmTe6yjT=E#3i>9?N$7;mB!Mo zGZX!ty4(q^lL^P!ZytS1T;?_kOTc8l)yW`3KXp@$3WPQ{Mf*#-?XA1yuI7UElo`^< zPOV=)Iph1h{Pr(9PgvK-3%2jFTJE7!-TZW*y9#)q6>nVTt2-gQ$G@4(hAJADH`TkQ zdLiigUA>uweYc5cd+G1*AoTXC#n!$3K02%0)oa>?5UPikNp07(LC%pIt?l{U!7h~b zb}dRL4mX)Sd4{$5NaVHHC!aZxTtC4BZZDiw)meCsQ2zy0C+PC)V5!1*(X(<)FgRo> zqG%Vz|ERAcYWK2rJJEK}LIEwYrT3QPJnDJJb}F^<>|yDF>px&p;cSN)<4qjg`dP+I zo)NOWLEhe0m~L=(618|X6x20zEwkVamz*-XA652_+qbcJn}w5qz+ zCCm-2iJa=9bYnA=P;%uV>`l}e9gbVjOP&iaaI~mz!Q44TUsFl0b)F%7?dhpl|0|8! zH+Y(;wuj=c!AT&@qCeO_@QJ#(A6WGPfwY5_Hwr%_2@98593_f4JW2So&sYxif&q6C z?X*{n5oaeIra`-SwP*|2E-DzBC8<`fZMSe5(9GpJ|azhU1kCf|jrT5AC0QHhrG4g&;f4K*z!iuO0_$5@irJ&zS%~-P5ARR3vKA#dUtxE``HdR>8+l*TyC0X;#AtCCzx;Jzi3#>!x`Wz()`WPaOA1QQdxX;b7s zv)xKN+y}J;N#~w>gB2N@4R!&F!qAZihhCvqISC$+2ZuhPdur|w()qo+XbGmZ*QE2v zk1;IjuO+pgqG-!P?I-o>1!U%(Z6Spz$1A5sQ>7CLGuTpt;GH^=l97QC8cJW=V43+G zA6D2CUmG)eSe_mOY?w1&`3{0|`_uWpOHGq#uz9}p z!<;L9jF(RSnf|WVxCvy2B(ky@JzqSa@etb9$`Ld$nN?}ht-fP0Y@}l*iJH34V%|=^ zZma&F$!6it>f@u#O4@G9I@d;Np6gP;Q&T{ebkirNAk5=c3UthP7i6{$jwo%;&+eKt ztAS^Vwk%Ef=l~LC^IN0z+$YgNrPcgS4(>T4rWE?PZ=Zqg3G}HSvxo#0^_3;R)J@X> zEH?f&w)Ru#r!R%eva#yDX24`;b&Ol04G4R?TY6@pMaMu<2i!9tV~lRyN`Zm-GIy)x}>kwTw@peu@N+urxM61 z@ANvM0d0||nqRk->NSun#6m@N4MlhSi z3}Vci&C1mizkKd5_0@A49He4U4ygcg* z!dS`N)R+wr(6Bq*vnjddTpmx+qo!LO-?}=xd@kD!8bUuf4eq*bhwMkGntJr-aox(> zCA983R0pJOiA!c!7^a25CfIaCaAgyzWy8j7e_T*ch_Kv<5@k#6`6rUl(0#zA&71O_ z80FCJf5ufV;s3kBg?-Ex+0;tFmWJZ|`EbT36L&7x?t_dtql{SbWLw4(g&%>0~s5r&G>+qdSL`$KVHQRsulgw?MQvpEP z5Av#4UAg8D3R9w6=Li5ME3T9+g9?YWW4YWXkSTb zw5UE83EU6!cof%z`^mkdW6YzVrpZeSen~aL5cyDmfO6%XY3S(R32WiU(-LjJN>xbl zOj^x{^2cmpuIF#u`KuqU?LI)B6{prLjV|4KTECW1(yqP{5GOgHd@fJ)LhI*ONsIG= z)WaAjzNp~8t|qb&rghC-QI0phVL3aSa3Pr_A=yM#M*WMJ_7gi!A6dl(p-_`hNCp&g zntwI@L7kk9$>qYRXTWmj?VU$- z!eU!4Z#3bAus+gp;PCTTMd7`-4w_U?B!|uu&m@1Idz?T1uvaE1^p33ri`hAvrpDd1 ze)rLGjzJH`XIy{oCn9EiQsEx-S0eleDXjwA@2<7MLZ$C$Tsy0pAE(9v5&oxdwtS>R zhP*(YtwAtJ#&^|=ZEahS@>|e>8Bn>Qa+zqSBTu3sVT#QBez3}ly(#U`HXvVYvw07M zu5#?O?40#(ql^S(QW+dYM@=kokan|*V_(a9DeNcxV9G<+OxrYyS8kaXUvYS9k{_0L z=>eK|#}7I5J}9{}+aB$-+wtd4LG83c zkeD-~!W#iCs!I>8`-1Mh3x zA2`u`q!MP2!M?nzsnWc4yGc1)II3?4YC8&hW+8q!=tuN;a&G!9ELJG??a@IV#$hea zG8A@HE-kKxf@FkJN7U4>hW6wAh9}zFND-LSGz2InAPE&) z!xF0v52H4&ykC?b+P-l2#`w!%xKppB29xS7LN1KX&nOvpxXurLV|X005&{{VM_va9 zM6->duWA4!JNhN(Ewq5+m+5tqNsMcg*zYBS*qvO{{u0#|Zw_4WF}!5HIfXXebB!s- z?>-wtS7e0y>Ms(Xq3eUHxH|_v@5Z+hy5^L%w1F?>jBAamQo|&gb=FI!8&oJ=l^(onDp5xjw zf;sWUlMglRf}U>trU|;eeU8tw@uh^WJ|!&8^C#2G4(X6CRrvyKGEN1i4Gs>z@{7;$ zbh-UatXG_C9Y3u(JJO2vjyu6l7Qw#QXhI)OJ*l)EH7;}|m~dob7~8m4x(mXH2}-jt z`YtVK&27LK#gOiBNh$Jn?<(UFaNLjJ@?em*Hwo>{Q5%t9Zq0@MD9Z#gr+XYuzb4s44+Me$v2f)`{y3TfGWx zEg>>EAp*Q0_pD_$TLAd{B3=>d7w;WVGg=(WPVDHuC8<0k8Emy$fqdr%j=lI+h|ws_&H>@UR#YbB(8oaC?zw#c7Y)i z-uzj7W+U0gAzw=HCRm9Y!o8Mi(^l)u2$_eH@(9V=Y=ZW!+C2>@jnDb6Yn>sy-fm0W zgBP|Ay}#ckdA#q~Klp94Y=|!PU?bP&(C6In~~i@26409 zxNKRl+u?8QFW+oT)Um8#$**M_0_KRb*X9GY)=+YORINb`UtaNS=LbS0+&cokRy{8m%xB%gc+GmW z$({05^zvZi!4(sS1Py!D7-+?9-~uAXy98t2YD|9+7pJi_TGXpsLPNXLp&2g0WL5wt zSyDN!TF)fEt_`)&KN=(mG3w;wy0CWikqK&IEQRSU&Y{nZ!VRo#gS2LsJQsX`$5Ohz zgx@_HBfj~!Rdwm;4{Q@q=NhBiv(Fp%#+H!!N2O5Ciz-+zx`oOEaF!7)@ZL~IOLovOu*G@p8C-}D;lfbn3l|$K;A%Gi_NU(%1P^F zNt>@di{n_7gp9f4D zj|5C^)GZ=WL3ya0uH2kgJDLT#t4t96FH`pyz3v{6$0zYAmgD(~g=_OE(yD#(u4K4V z{_O=Pe?kE7y+R%KV~!L*@V?nQQ{A4IMNe*ji`zZ=$&btfORJyPIwWwz^3LlRDTN`S z(Yse3qcm>|1)7t~^#T@s=lhLiMKBqym&orc9i)9Tk_9?tSHH$BYR~Iu4pxJ1i%CK$ zRkFOb)Qo$oKEl7L;IW3~z8IWV@{f(j)t&~a_7Isv&h`N_@u#z@JwdC`ir-o`gKzyD zBcWNW$g&gH&%QZcN|cMk+`#POK}qUxEYY&xq%0Vu9O)m@51$ZKX&A7Ws@JRR!A`Wpzm6Al^}EZ{&Brx+{JF*^k@HJ?DtJvVbnjT-icgoRb6oY zU^c52Jbn(U>xeizMJI$%c3$1^j!j)%vO3h@SQTS(;DM`m9c`3J4fz(6@kgqN)4*P% zehEgGwd7O1K!xCr%B6UbX+CRd2W=u;!$T`QGx61CHuAOz_Ro$}oS;rbO2Y1&R5x%15jz`$y z?Q7&f)1`mR)euzv>>L#-)t`(s%EOe=%kOZgNDi&$}4aWGm-) zH~uZ))VGZu8liN;>&za%xiEbrm4pg09x=s1f5Kgo74u8y2gP7}zakJuoOFRyJHKXr6j*g0Kl!%~8Oq#xTjlLDh5 zZyAsEg2=BjAe&fQlZ&hC;Ko?sH`%xO$MF|R&XU*+;E>E#{?W)ZA>p9!sacTdTsQiJ zZ$>8MJ>y&a3#O3I^y?9qmgnTMz40}WOXZNP;BKzwbb77kt{DLZ1Ml;8k}r2_)>L>( zD6WjkD?Zkas|2&g=&=u{*qUk?v-32A>-A^d)ptt2yUTfShsWA2z6@JaL-tQP0K#R?mctZ~dRp0{jj)0ER^$bDPlRA4n z78BYHk8W#ir}l#q(~35Zrk+Qn^-(%$3=gNeBU-h z*>5OHE5_@%j*+6CmgMJEg4l0Rj~1#Q{X9iwr@X`rW4s1l2RF)S`s)CVEWT8ZSs*C6 zDp0^3H%=!MIfh{4&JFzyy-m?=^=8x$pCrb#p?XCGQ%0<4u_n?G?E&?Ops{--a;QZbW7+F2 z+`}%aSnkjp)=MSa?KkZw-#{H5Yvb5hGiF%c8iVQ$K)3|G4f+xg!_!OA@NL@GS?6Kw zL9cJak7>(mB_0vNyLZ9Ce`MX0FSEMSidS3?e8^5fRStiY!Qd`$M(sY(RUeS1k@mbQ za)V-!-Z*B1bx_r~(B^~9hcs({#0hwE@FZ(Pm}lms)h09To&R9%tHJsY5Cmbvu4jkTSSH?hJJHtrnbN5 z$TIwAU7Bx)(UNnS^ji@D69=my5!=86;=1G+gUZLX3fqg+;K`JIzaQ^&p8GfuKd{RbaE5oZ^bEsw0)TKgvBnK4i2(yKix(Hc_ zF8!1dO3&u1&)t;VysxJ zCruAhgh#R9w^hEtU#leDN8d+L+0fH%uqAM*D)KS1wvOgP~&JeI1CnEXOR@Rbiq z{n$uTnXOh|M`l3{8&8dFtaB|H2_*9^14sw0Qt=TYA7C$GQ8}W{IYk1$t#rZ|tQm)(mlOeS_;rue49qYJWPb}`5e3{r}lj=3cskGO#XViGEvO_u+Kp%(R5fv0f ztBVnuYk^72!uh~wqX~|yx|t1WTv@z!LPogvByLDvuO#oZ(m?S0auFZ%MOE5sLaw;3 z<>92zVmC7Dc?ph=XMx%N*nnrf?5)q%Zko^v$mkHPfZG=|WYHSQ?It{=bymPBJU0q_ zdNshYafM|v@|N-Z!_nlx%!lLpIxquFr+wRT_f`8BO_wuXOarm!`R#YHQ`n8kf}4%o z5zMFGFoH8N&%&4CeX&1=pt@GE)#9g*@M2Gh{L|tdnCepZ%pUfkj=%tNc4J4vl^ zGjp9u*N5Wsmpvz%3op@;$1*z1jPO`gA1eKhAV>3ReS+1x(tzI6GxoC@uRyc=>rlRY z>I9-=UFp`eX5-$nwq1tE#^4}_0&gNc9>(3{gdvk5J!0=g(;d0wvHL@eraPy@!Wmqx z_oo=q86#DBJGbVWW81S8`Doyao*DuO;QblUYZ7(I8^V}`7r8_P7Ds=$j~6lT<64GA zb0G~Vi(iW)v58){Ri&I|g{vg!Ew>Lvdf31YGz0#Ny?LWH%f*%=mF1Ouj z=ksG5K$K1$BYpC9d$BerIhwrIdR{$h*wAUfrq>gWR#Szu49F%ZuXuIh__>Uj4fvP`wY))i8@YfycO> zV)X88dClkY{AZ!Z1sX^ z5x2znJ>X|BZ9>iL50-B$h%5CAcaEzhs-rXV0x3R;$7-v9q!vxvNL#(h+_j z4&{7?z48WDkLRq%-tfI5XM^WALBt|hyj`Bru}&MP!>-nKVotSsWLjmOnaWr+Z;Bi# zdm@RKgmO>eRm26`cBx!nVJJi3(CJh?-*%&#f1Nj1i7m{bg@*n$Zu zeSGZ%O|3v$m|Kl-w8;S6`<-;>pcUh$(4lMIz>-x{9^nb3Rss6eE3TC?K#l2e=03gm zxiYMYuM2IEJaQZTF|P%uu4ulGGC#ZRz9IttFjyo(dMyUFxdnnu6SVDx52{Y?J{g*I z0tsOp7w>Gz4ySH1vuwm@7^-7WJF^h-VE@HBIj~GAdYM|ia{)H$S$fWEDlE9e+&kB} zT5o`cz(x`@pB8gXK3y?co7$0ZcddRa5_}Wji>Q*&__VM_&uJhO#p%|{+yzlQZbxF;{6FQ6+xV-W8p@2>GSPIvlrf&W~evo|KJ)OSan@p z%2{EOG1_&bDHYt1{KlhlHKXIPc`E9J59x{YoVgd@-#WMHv{x6guf%eb715;c)gyjV zK5AGjy(>qKOGLBS1`-B#Oq7vvb$GoMRf$DEz2v^mu|wH;X2)RiS=L5U?3@h5MdcbD zo?Yhm1^|9t>5B`nhH=MXB;p=z#UgnxvZVrPvzWGcZ_#rHoBs3mBUkSSzuESmPzn+& zB3tZ$UFJ!`;q#93i8}~Wt@?QxWO8k4PzBN{*tlp+b`%>FR0K>lKTD(&AJcf_W89O< zg{rvW`sq@UBk8uGyZu?WHB|Ev)DS?jDT{sW$j3{Xuk zGT2;(@?AcWP#4Usx7z-t~57v>g8Y+KfdDQ9JB>O{&^0-$@Xgj19kXouDp8vh$*0O6-3sI;*Yj~kN*9p zM7e0_=n_TxaSm;nWkJpktV|=jn-QdqtWV)Q?i0_Mn(M~TvnLNp1eT|rBuJQcS6D- z%i^Sr2v7EOL5_Har;^h0$>lkvKebz+mx=+YGKFFFpJ1OBlq23^I5~^B%-{+3-Nw^C0w$%{%>|+x)BgbuW_{j6&+%U{qZrXCwrhA?6PohEk7q`y< zzh$xme)Cs5{7q2#@VArZ`QNQ;r}IOl3xY~0YS|DZDA($8ImAj^4d%T>mS`$e`K1A#m!B=U=wd4Fa(3|KT z`EET*kK#wgE)x8h*hPXL7rRLCpY%-K#(x(3NAO?toAsL&tA30Ayb`F-)@LhO`W$_p zk}da=$k$)hUsYWCYx-ivt^Z4ZLn+YT)ZbK!<-QUn`bzyBrBv=K(MRqpag)A5-=N&A zZ_>9aW%@S#OXYUCm&CpLxB5|Kq<&mKr92>akr*d;k$A+g8bQirqn1%ynJV{>m?rj* zQ09pJBb2#DccYK;ir6_q`9$m-p?qNsHtte(8TT0XD0_@y#xP~C*grzqXFOs&q8u8-l7@yI8xbnzfrXK{c$sti9A= zYj10&TFYv;=BgpqJZqlX!0NKP)rQ2`kLbZF^&kyaAstpD12&WbU=6ZJE8bbM!Un?D zfDMv1Sgxzp#&0mfYr%%#Uu~qV1KUtOp$nzDuwnQO1z)cRn?Utpn^FVVM8s-Hy{Hjv z3Sxy(b7~AL^!VDKR1wq`WoSnoQL0W9g*-Y_cZ9?t7c2Fo3|u#pY$%HzHW*_u3)dH; zu{K7d3)go8Q-sn@um<&|GF;&nx(y{6Km(D-9W)dr8Ac;ehWjvTn*-N8fUA#&4Z&!B z5NRKRZAD{Yqv$WNt!W%=2YMJbg2uzPrAJ`f(W9`f=&!IHF!m>aEBp;Mk|x4-pvPzu z&OQ$55C!Qlg}Tv`u;Tk8Q|Si!J8TD<1{+IH!FH$VuzB<}Y%I-yjiYC14s!S>&Bb+J zq?b{W1+Z=C71$265E3T>5@$I|@)oT?%(v;^2wzL@qa^ESJxa0xwgY_t+Xj+pBm5uH zCy2QfGAW97!A8(-+KaO7gUpJNGOLr6SvSyO`VsL@($6T{Y4TDmalv%h}CEHsWEH78c;ZE$Qn`;)`&Hto-B-oQ4(v+8dEY0XW`V0HDOJt1#8OM zq9pBDdt5h?MWG~}nfU5RSJnd|@hlN#u(K?bA)95R3^^tr63q=5BB{F~X$ zh+oF~p$xaO+fjyrY!J#Ym<>l6?qwr!_50Zi6&32QW?O}T_sa@jF<4B_9i?-72S9Y^>N><5IOz!t zJIzib{1^5M!Yfz>!oAE(Hq0NK(zwDEO6Mw9;n%nZzs_~|4Q{}X*@e1@*@e1_*#&;g zF7RV^fgiIAbrrJK{-u^@{3YIfr?kvC{)!|E7ey6)f&`P4N~jCAEJg* zbG4q@oLZ?Z)OHl1wpSymgW5suN>OUG+MPP9acU2Q#H+pFPgYYYR!vhK#MC^skaWyp zH&b1;OudcjsRPv8sfjvJy$k*!>fO`~bK6i#P=~3*=mvGTI-J7A?n=mQv^ttPirJ17 zG22lnX1iW+leH8I)Kaxn_|vpBGPHCpoh)J&q(sbuHk`FYlI%#@TMW=d*_nes-seY8Flr`@F8L_uPgCTg$UtlbQMnN|k>E!r*AL+hvY zLk_oUw<5Rx+CXZm-JuOa_?_CFD9K>$F0yJvv>~|qpR~IXXQ(z5ISarP1I5tQUn?NNmM zRr@RQoS;oW4u8}Bh8!kpk0b45Z8A02p3t5^_!MmlY1)(8lT=%qs!he6PSd6#?Ni!Q z$a%Up9dVx4o<`c4+Du&WS?yV*ou$n}_;cDn5OcOR8#%n7y@;IWX$uhZ73~$&^FnPQ z?&4MLUntd5Z5i(LO>G6P^0xL4LRM+-;qKOG?<3VZZ9VFFgZ3fv-=uA!cshy;@0@IM#2aBjZ1RkR(fo$jofov!a z$i{?g)dO+1hF*hO=|OrBbbL~nu|n(9rFTQj{G&NkOuB7Q5qHR89?Baly9y&Yn<*CVN$-a+q(5MU|9>8f`{ zs%SkL{usSG;>7836f1BQ{F!aI`K|4w=OG#zuC{*?YS$~i-yfgGOEpF#YY`b@-mR(}>}XX&#L{+#|C zb<&^LpQnxj`5|PEju}w@r~XfrVXi(GIlQR9i1_pLc__on`pa+^=nIGoTu5~VE`<9p z{aPt!0-_YNn0D%#yr@)9*6BuzN)e$?8Ar6otH4sRV!Ua;K7Gei7xSRD)sD{{w zjF{Mm3^6~`zn~`iPW?X!*`@CyUEi(mAyeP0??s;b^e++TfPN5ZztX=#__zAExXNMu zJH$VtA4UA*`VWY6LjRE(=_mD{klQK!6iWV!{tMg+y#i^yx|hVHs#0A;Gc;;u=mzFl z1BO&1zzCpPhQ+W@xY+HCxDjXsQWK+wQ3G*;j3Cm1Tx(Gyqqb2SY3mvF5MJK^?lT%0 zjgUi_(G)p1Gg=~MYoj#<7;TI;WCGoGrkX|Kr<0dhRIEb61I;qa=D3JH}5$ zh``O!z|D^%{$$u2=n2?n5<^Ez3>_yibiBmS2@*XgO7z@UqUR)uo|A!|pTV8Xgl$aE z(hKm<0g`SEB>f_Cn@2AJCC>+vZU!X15Lo$D*k-hdmcainVC!b|2GDgUdJ_n{qeR$U zfw12OBUuR>Meopi@UMZ50`C4d%C;6Z3h4WNgs+3`3Jks;;TwRwyV54uuE5_PA!M`M zYj+E5G_d$qAn#9Mo6$Df0sj}k<;{T0cjN3{*l3{heYoo{X+Jp90U-4_`U*(B1APOe z9uK5`7~JSP*aSL4Kfr$i*gZjF_e5a#(_lNlz$Q@zaC|Q&wrWXc9B4k7DNLbgiRqhG z!Sq&%>1zVhg9S<)Uz62fLGT9yyIUo8uPL#+Rbuy=61!U^cCRI|dmV}0LnLSU&++zb6oXO_s!xD3JAHy%3(vl7aqHSPJ~9EE9ekv%{aw9B}iQ z6RwN75#IwoU$6 zg*xm`b|-~`GYrPP-^GT)KMedKMDmAB@Q3@UAuDI)sDVF&OEd(RcmVbAAQ(j>$tbLn zQCQemHWvQBu$h!1R)hS^p;$79e90V&C37f|%;84K97-i~=p&g!iDV8pO6E{1nL{7R z9Ev4#a7*S;Aen6S%E;Yq*_wC#uJL@E&jrc_9_? zTlg(-`|*CH@!R-qa0m0jaLai)+{gH1l*6a<>C}op$DgAJKAX=b2Y->jNGBo0=;Pm4g~R>r^` zt2_$#4do5Ef;FXr9n}G!5xl4Ycu_rStkwrR3I{uC0Y1|b94QhUsXe$*B$!eZm{JFX zcLZOG0bl9{e~cOne|K=FX5dbc&1w%YsGeX@3Gnw+li*KQlPO6}0h{UtHkAf8l@3m& zf>Y&@Rm}&p3Q&vGBC4SltHlT@QA?<%S_-aZf@|FZe?PT9{I`L3)dcSvKq2bwU|*qN zUw6PiNF5CSU0`A%U}8hS^!@}s)==`Xbjio!B_FG!maC(XzhGril9hGP617C2aKXWX zCHo4}dTYJm7aS}@GOi#nu3Ur&mX)p*Xa!VPE7S_9fn;1^l1-&b9u+KkR9(rVQYDX4 zB#-hjs9?#Og0=g!`;ez#O{tP81xt=pS8|~+$%RrS3ksGjsDWfbsgeZ+Oa7BCnNMBG zd{VU;+6?6OjP?x93g**5GM`k*d4eUw36>ltSn`%M$y?GTZ>cMJONQhvHpyGEByVXT zc}tjNCSl+t$H8!Z(0-t1l9R+pPSQ*}rJbU#+Rxh0bc19jT{W-frD!qvQ!~j=no52W zuWPzSNs^@`OP10MEX7J)^+0fyXvtN=C0FSzxk?PUN-!npwZK?$8pzwy^ zDxD-(=_&$yg#KW9cjzON?YJoh4)GDH%&wy|dmK zX$5admb|60-c3iZmh2@)vX@?Z54{Is#_RFOIYCdr9VP0$5GPqr1_wydQ;;@IPeVwC zo&i_zoM_2&k|fV*EO|~-$#Wtl&uJ!kPNd#f?+d?RI~^q3=_J`sSFoMi!6gRj1Ch@i zU_PC}eC|fL;5^abJby;nMuGX<0Os=`LdNK05a%JVplGn5zo1m(^oOa3J|2uHPBNl+ zFrvp$tCPTsdP-iDBzaMyf(7-KEXb8SWN+3tS%~`c(fE>`3q;Q}Uva zD!hn;7wtx#d(N<B8m$pl9_fP8!$>1+LK_ytq4o?%Kyz}Aj}FIn|t`uDhs zU`?iEO@Wd%h3G%)Kf`}oKaDtoH8t|HCNhYuk~^7_JJqkkooY(fRHq74vKqlgFv0~> zs$YdEStV04B~!A3DK!U2Y5~4vHCh?1;1{gP>Ss+6MqBvX8SN<0Xm50Yzmw4k{wOdg zt7K3n7*sm^f;-ic+^LS_P9c&z^_JWzQ*tM}A9X zCd)^ZW7%&xfbc_>LkRiK@*QFxwHyV@0$8GUree;2b0+$1xJnwzO+Dz!G#&2(yGW}2ClYuZd3!kwm*T8e$ADciioycKZ< zn|I;tP;)54hnvF@a<6$WQr&0XhY-OAo0)$G4{Tx%oE5n=8$gV2tmY?^24n-dvCH zt>#v^d(FMb^MHAPlFWnVK}s~gGQXl^$qW-DGi+*&wnkGk$phmg4~&-#FkUjirjh|R zlMJwf)n>K9ZwCYHDj8t3WPmqV9aabYPOFoWBoFK>d0?{DWA#vDYk{>0scy91NS&>H zt$is$>~~G=0#5{~R#(T)8D|fZ~Q2TbR zI4?}<+nlr8^yA(+-eHxyO;-s&=KaL`m#e$B_e<|zE(mPv{Zu|l-g`#pr>oR@7jKJ; zom#{@4*qw2{+OLvaP<&*-&cF}kgL@=7>s+@SFIy9`;&CmW>dc0| zT=k#rjPFDFhR}5`nfLLk{X>R4Ouv)C9of*2&x{A}VegD{M@MB%T%Vc$d?TgD*&V?S zTwd+UR#<+C^A});i^SU`-u655?<48{%HBCX6yjZevG*b_#16lb-xYk_!&_Y4wa#AW zSKl^q`QwRNZ!dJIg%*8fjeB3gQBS__`8ed-hv&99X355WpLieTLvII(kwrWo_P+-G z?rS#p{8|Kz=-*17T=vcl6?^GAn~Gn3H|N~ltYygWv{TNnjJ)$o?p<+(xmWIU{vKU} z`D5M)^vx$=msi{$Do)Zh7_S^9Vz%-9Udww?)#QFf=DOd3#CNqRfOqFT z$mFR!m1^*8o=rhKm*-MV?&MAimU>RLcnL3|+WaQokLvK-_yB4kzN<}*q_$I-_@Xv7 z=0o{V3g`Fod#MQ@$wyLC@pWx#CcdssEu=0~Yd)DzrZ#*EpF$DhOWV{|d}*87@mc(N zYR_l$7pNnj%U`4@{t|zgy6{){E7Xm@&R?e(zKk!Y8~6&og5vnQ{9Wq7*YGtI&)4#G zlpwyhO-WLBsu%y5Z>40ujekbzds7$G))TVw)h!RTumHJA3x?O3kgwsH!h0=-! zDQ%QCbeHkE@j4AL{$(tqKZ&m|(=hS%Wg0HNyG-|r?=I5_@!e&*&p2TGOn(m00s?8W z`0g@I4|pixDS9bjUceDrCBD1NEaJP%td{uhGK;V*u)M-Li!Uy-uHuW!ELwbVnROFi zTxLDQ7nfOr_~J6_CBC@KQp6XRS+4lvGP}|8z2yhi$MU14g57K~le61R%?xCBh_5WO zd(05C5xZA>Wtlx-wlO2wI5WoV&L)U2E3--B%gSt;__8vaF21bHW{NK>vsq@LS;A(U zeaxGf{IW8eXO1vOu%&@}0>5N$h^M*it-y-F3igh8n#)$9Uw$h4C71eioHs@9RAuk< z>DF=CJ9XJREwXo-=$+9B?}k3AqK|gR*|;-3HCp!6_OhqO$ewzG?5W*kPmM-Ty$NUg z@-l=A9ldT+M~_JzJ;n#12P?7%`}Fmg?7^Ds!2z-dN6H>-NIgEr|BQaDpdUYoIAhS8 zBV}*yD0_2F*_&(0-dsoa=6dMOvoMx~#$N;eJbHF#srMJfUqJtEB)%sPSLguNMK6B| z?tJw1da|$AlzqLH__jQ9dlNmruI%xhWseV+J-(^b6KpQNGf!RlI`sZ_viG-;y}yN+luiJA$1A6@Xs(R+K8{v!~FtdqZ!7=f8g%I2x%opNK>h4*qncj zane?NksdjJ$B$4;ev}_Y8IED(M97iTL5`dtjGSK}DJpmcWP}%^sIeSHwdE)Z#V86O ztJG2qlv;}Q6)VP7nABD5qy%AfH56a7hb#0JLomid;MT=R3zZ`+NRG5%@nw7D*%IR| zM2@#GIo@=Pw|~K1icx3EQP*CMy7qF^X>!zQ7x${SzfWcLUqN6rJ7>IQXP!grEuS{yn(aJEXxr7mgOy~A+=W;NbQv<%PPxi zoLy^K3-^7?`-s2Z@*(^}lcl3&v*lx|W!Yl+gz8zgTDIcs=a!xD|HrbMI$QQw_8{h7 z%U0;_;0JV`?GvTIbTB*7CayxYuG6mrw zW?h7bn)MJ~-)umw%!Xz|oNZ(_qIQrq%@NYVY()`}IBk%Bgc*TUZOyju3yqsDW~3QO zZN-<~siAp;c>{%*v1Tk;&F*G*3W99vLAA|zGoBio31$-fz06*SnQSKGY?_%yfl@c8 zzSPa>WZKLuoOPHExOrwC;zNqTFZ6Uen8juZ1w)qgLHJGPO~~^WvpCRF|x~tTY?jm)hqos~?N2w#-N$N;gk) zsUzJ<>OTjZBd;%%)IJ0ubfFENz!M-ll6f*@hmg)uyf^O+nIdF#3n`=HrHoGS%jhCr zg!sk081aR?j^d@f6!CB5eIR#)>~0}tcfvWc`&ND{q;ORUK9CPQBgY5vJK^_9^Sk&E z_{b>%Ji1}ettjZlBzQO0Y3U1$=;HW?$oDqAM?jWh%T}R6CcKkg^@J3RCHi4W$(%eod*nUR%oj5UIi5Lu#-G z7#)p{q!^2h#h3$@7)#&^9YVucXRMt(e%Q>Ju<^Uaj z12aKADg7hO8fFc|3^IeLfmzcGhQAi(gL+c0GEB|^k!E8v9N|L8GEC}NHkLC%6SKA1 z8Zp~oCTJw*fc8@BvauOuMj^M(W@m&84a~-7SFW{y7aE(va#pAVo+wwaAMVuq+GXNbCHzL^id(C4gS zx=c6x9?TgQIcKysOE72DlygR1^JcRQexdCdEa!|6IcHcfXADBPm?t8n{$~wym^lm~ zLJKrlYJt|4TA(!qYNlF&2Lcbk6`GKZr6y!!sRKb(e zF$$#G;sq&pC@*q{y2ISf-4X7N?r3+MJIS5y&T{9w3*CL({oDiHL)^pNm@9^xy^$#OVT>WcY`v~$mfjmza za8FD@KtYf@v>>FQVL?-O^Mcj|kp*1}Vhef}q!!rRaRmFxj17Fs)!_K`CO-b}uTJC$3$v(7mo;iTilL@`6g94k0kP~qucs1}-q!G)oSQD4+oVOU}F!ia+Hg&jS5p=gCZ z_>C(}@`M+r7gQ8f6lN9X7Z$ps3;PuIb4Q~rk%dWx1Ks6?Lkfo%mKTme>%|q0M>{n~ zd(1DKSU9C{I$Ef_a8}`*LbOuhBKL5_Tw1sS?OI;Ax^P|LroyeB4TU=j<`wR7A1^%U z8C7`L6H|EH)3WfCds7h==|zD>wTtQ(g^N}!YFX5-C<-kkYBIbirYOEB*^^w9QIu2U zDk?7OTh!mZ6|n{t-CZ;S^-xhX3T?5jXl&7=$ZJy3)S?-vqeVr}7tKXYZ1ltzEht)C zw5(`l(VC(Sh%u^YvnQ}*7fCfMtc{#a+Zv9P5rN?pd5#Z1d>ok;jW2DDi2}wqj3lX>nQcfa1Z$ zLp?K!M;4DR9#=d8xlAseRyAm_Y{m167ZxvZPedQ+Cwf8g^5RuEx3+jK zdPC0w8*EuYs(XClnBoxhfQH2z5ob&B_TpW|`-=}1A1gjtIKH4~aYc!WVIEu(S`y~z zU$CmAc}YY`NB54B=#sdSB=?Gvbc}&`PfSTx!LE}0lERWcC4Jm`O8S)yM18C&*oD5E z;b~cvff~&z8G;cLQ!>1yyktz#)ROTf6Wv=&rWBqk8Cc-)EGU`oo>(%ga7;mD$(-UX zXzBEl`6Y|oeM*)V9VuDijxJeUvaV!P$<~ssh2MAWR?Tb8DyTeNR zmkuhuyKqYB2((RHK}hMS(y^tFmaHzFR65l?ymUtC^CeqLM-?HR+9U*~|r1a^Bu@0$&G2a|D8j0Sp&fVw6 zfC2}`mG}xjQ-2~(&&#)ON$z07E+QnnVADoO>BIgqFhAmG7{I$~RW) z(I>F=X(wz0xl2q#Isn^^q0fe}o?gOLW zN~3}G_RynzA8_20KyU|Ws$}BRBwm}&f8ZzRX?{{6dIo^L9?el2C}Ff*X#xzjQfa0% zqj!LzTGJ{eLTOL$snKdQy|2cr@w84YQ_E<*I#3-*8`NRyaQZ+Up^l&r)pGR#+9coT z+9KcO`b0aW{Y+cs&Jx=|5)|65Yr2JY$o(RA%eSxg=wW&o?bSQ!ooJtYU+PQwrqq5t zUhhc<^dvovzSeu|Haenb>)CW%AE%F_AN1M!3v@!Ct8b!{;@utAOuW0pnv3^xSPStk z4r?ji!eOn%`!}q$en>yW+K9afScHCBuV8J(n=~xa(2Y>m!Dw%^XFZKfBa{fs+V zl5v-D7qc1n7(^@7erI?KbdOF4Kx12Tu z*jT}Z+2g=Lwb>KkzoG0Y@Zb7ux*2AMv8RD|nz9*!^Rj2acH6U=W=GS(o&(k>V5`AH zi`hD})GTG|&Aw(|w!!RY_G2Fi?#VWSbw12KG#@n|WnY^U%_rD5=9A`=?5O#7a|SzR zK5IV9PMXh~|6o6vFPL-L&*pq{KJ%Ij%vU*?ubGRvDs~Cry7{*GHaE=o%rAL>dBFUd zw>1x$$9M^WMM#DGG zH6e$)CcCELnCY7Bn&(>RTH;#nTIE`sSBf+n5f>@4=48!rZ9#02Vmso_cI`sU{rG># zbxh=)AMHBn8h|t-UE7iO09S>`*{!-J6+&bc89uF3B=?otBRRq$&lWi`BHPl;axUaiIl1i&g00&<9R$~ z@yGbzA@QH$3n0xG^4Dk(U&5Er5WbWzr9XlDzeRWRxA`g>rs}Fr_o+c@5RH`Y9pA6s zr`}KHS`V#^9?%ABgXy2zpR_;GTy3Z}j9%34)$XI0i+OzbU zwpd$CE472#QF=%JNdJh|>mTbM(+2$${S*2?Kd2w1jruqGH}s+Lnz58N8E+cz&{oN9 zzX)g=(3Ext6a^H~evnC!GU9Zrw4)LG^nfMc*@iDS8QX!c3xNatwhxZM8E*3JpeNati{ zm+Z2vc;_^y!?xWy6ESD|Vj|^a+c@VunYY8a(AfoPQf;jf*M_vnIb$7SFG23h5r0)) z1oB<$+=z2qoZFqdoco=JoX4E49i=jTDav-zS>aN1>$^;(PW7jabS$^8a|Js`yF#5d zSD350E5g;$743?1B_U?IE6bJdSR(GnRp{#D>gP;#4Rn^dhPZ~i${ovHV>0GDhq}h& z8Z%uJ#of53I7(g9k#~it3FJIWls7j@)Prk|YrbodYpE!&W4UdbYlUldZhzN0*iEjj zt{tvDndCa?I_x@*xZ?jQH`zj*6&ds0I_|v-?kv)_9ch=i15rPyZO3GH?c5yaIFxFW zYmK5oc?PI*oSEbuVx)#+^htTf3JzD{Rx8OWZ5bgE&U` zrvHuU|AsNG_YW8;#xz?*w-cq#|KIW7eek06_>}$*kE7I4<`|GN!ZA3lJo9V)y$r$q-qmgE=W1(Y7+HuH|RgSfejgBpj?djVb zyHfUL<~a5{4mtLxZprNLIEH^G9TjOu_Q0du{^K2V@qCyV^{juj$MxZ zc^!Q*GjsC7@}g54+Q#LC=Ed2D<|U<-rwqzaQ%2;aXHH5h&&$foPl?JaOzEH3M_fOz zU+Na*73|oUamukJeOt<0arL}`j{WK6IFvWUaV&3m%CbDQcTiq=dVFr*yfG;*hbM2m z{jhy&-o)O=a&v6B_nc72VB|OjcRV3)dfu$OIeBv&j=cG41M?Q;EzMhzD(Yfr?_;(B zdDBxyqy*y1YsIzmR^!_1@;0TM$lIE?BV`}zKwcMf&#}Bcc?WUNhkLKhI}Up)^<>_j ze9G6;DL>G0%&`Rbi~7pjfi%bR4kKiLer?q6Xvcok*GR{)^!WVx!a8Q=hi9J1jd2Wi z3`mR1Z|N8*+9kgoj;Q}qFD!pl+UoqV`H$vLa;(aqnm;4|`TV&lr}Gzx zR?J_VzYHNOMNK-6<*z~Aq7_pQ8cLq3v@=Rxlv!Syo=F^SN$owOzkP#5MpeKPxxKF%3078GUgK(!&B*%oAswL-VHO$MintT$nj1e~@!Y z@1desPd(;bg?n9_ci6d6_6o6RtU9;!Uh52UZcja#dJ>~xtLz0Ed#_E|mlv8h zJQX7+ub*=ldXMTj1_Uw^_7KjuMvYEFKkJ`X?)0SecOJ`+K|en1JSkc_x3BZ0V>D)5 zn;g$kE)_FxFl?y6BPmgip|0lk2vF?%Wa3gGfRv}S3lcmjD!){yIcb^RM(J{sNNN>;b{Y1 z<*qTV@!8As#@L$XgyJk}&o#w0J$I^OfNPd(yltdwPJUEgoNIpOHi2T&%3UiUSx{of zU?F{aSD;=Ybr9wecb6ZN5sWc0IVUuoQchr|FJueZLL#=9Ehfg6vZch?a<-fl_6~c8 zRQ4Wwk2Ll^d!Kan0sDXq_7VGt0@x?)6SA<+*k@$2U2GRw`8Ym~0{M78o@yu^m5vmo zY*n^WO=X+1je?c!%66)y>`-=4ZDpsjlj{0emU1guLk3yCG%6_V+KCM1Y z_0?z8XQ+Yttokf9RG(9yqekjK)PGQz`hxlbHCA6#U!-vLCG{n0qQ0uWN=?;I)K93H z`l}bkE%y0QvFf=kvgcqsJ~E0&D2clqy=h$6r}}eLDX3b)`F>vR$Hr0U9}J`grc=j zEtI-x^|ksGqczkT(hXXe7DlmJxE4;`wWeBAiqo2F&8dghQfo=^T5GK}C1`E6w$xK= zueGN{t%KHqlC(}*C+ekj);d$N)>Z3DDOxwJ8>MQoS}dg*j~b6sx-r3+K)sEL#ze|6 zCK;0`)0k{LK{n$_<4MXg{%!z28BZBcQI7Gn@igTc<~;!+6%1O?k!~<5emMd_VAg zx+QRZ;Ckv8_(9+YbZg*;fge);z>fkyqT2#L4*Zw~{BK?Gf9rz(TNnI)Xvux3}xRg{|k}VzntmKup{It!sLR+7- zl?nT8{Zhx+1}3e=nIXMqA=dEZl?X{nIc6)*tgwwqoo^d&n`oQTYm;qy<~-Xh+nm^S zw)wV2wxyYaZ7Xc6ZR>2CY+G$RYvyG4KV<((jnmWX` zRM^-)sd08)`0Ro9+KCJ7y1hPf+!9-!e#jnfZ<*=IOtrVmm|>4fO-hVGEF6go;u^-5 z+oKRSK5>IBRNPtOf?l(54;}5v;!e|w?HRVXq?7g>yQ|l%Ok48GxN*HqTOWI|y)WWN z*!%a2h}{#{&^{<_kexEt*zb<*ld;o2B6eNEWc#S3GW*!X6TR|d*V!MnPl{Wf)DtnL z+Gp6Gx6jQi6{SZx7T{Q%8fObmnvMTcMCmhA6Bi`zv@J!-a{IEB)J%_krG1UBe8Q%V zPumx}sMjp}29&O&uWTuv#3T02z51k-B79q~fxU(#^|bFqnFk=nj$X6kMyGgeS+UdY z`|N}4U-vZaIVl5Dj-gCtNoA??)3@7?*iWFmr)?dxcX!qGzT~Pg@x`GizSfLQ#uZOR|$(9<@h`@ZCMvE|vrZOs#x*`{Pn%1q5JPZ^m#CVPD5mgIIxks^QF((XG` z=VT{kcT5Tq<1srlab@;I*eUVhh&jFYtn686pM%+RQs<|IXV1@Gl#0G6+9sh4V`WxK zWQrquY4(a1_QCAK=qE#PJskFB zwxwyy(l%!w&pw4xgrcAKwU4k(!6;wj`&T&@&?;*akMx?ALpb!b&1su+0^=Zka%zhf z%N}p*ms3A=I{N##>^V8%IW2SAiP4f1l{Eo!qn=`&Fu!I}G$W<%mE%juiAAZ1>!r8)i6+T{$&xjSKU&WPAP2@`TgWzLRWiu^+{ z`i^8x$ex%!A!lsPqv#2aoJl!Tb7rJ$%y~X%Zq9N_H?_ya1W&Fl z*OBW<+>l$ETh{Y<)~b|{Oh@LD#J)*onY-+#a|dKPY-8+Exr1|u=8m+5*_!8$wyn+` zmpdVMa$>urRk_nL*5uB#P0yW;mI|>g&7GIKP_7{^Ro}o&vlU2D?C}r;yl0^Z*amV9 zv7uZ&Y($x`VRH4bv0Ob2m#c?OLsyfiu{U6Dt$eVC{f9Z(qw@GX|fvpYyLH>3A}lf1@q(lXI6**q7Z8Yq*;SCQEDpnSbKptS+u~LELI>* z)?I0TdcIQVd6^?Y`FG>Hl5w8 z&D5S{4~Ugk_Mmo9`4r$-Azi8iSKeC5`XDiqwopjEgL;-a+O%Kom+0z2gvRMMp zvggEZqU?ErXW2jWE_xR>TkQYIUJ!eJvN?LHp2l7jUx;Ea=~;Rnds%ntPWGB!pck;k zdOy7%dtD%0wnYDjKAZhZ?2XCZ&|lP-vN!c*`rB;1{*M0tvG+FMRb*A#XjPr6bHX7_ zr$aiVLkJ=NIY~}({;KNy*ZIu>GYlOOF(O7LVvHDL1~DHpF(MOVM8udu#E6)VG=mtC zp)s9~$Y8`s$A~dTM8p_rL^=~O!ysY|-`a1XJ@>o!`rLb;=ey5*-_tqIS=qH}*Zx_1 z?X};vs!r|i@;@|w&-i2hD$wpL>`ndrEyB68{B0oISJ_+m`B}oYPw@X{dWsP4e*oM5 zk+AJ{e!b^d8gu1m5(1(;mUd-mfU6n%Yh6!gA9-Q>T!|BFMrsrk70L5>}i3 z)%0B<-}F7xkAzawlxa$kO;=4n7Zk#_Hw8a?Hc|+)D6 zFt3ncm{(ZKqR+xQ7JU}pz@pDW^^&hG`MU5o?8!!9!;*7LhJ|OBd~3-CVKaN0QK(%q zvgDHRR`$HRuyx7zmwaD%`;s3l`GHW!;?%-BSe#ne#^Th%-?2EgP`~8YOYR8oTr#`l zuJCTc*Z(0jvF8V~T)$&5C*s@r=2qc^dAE75@Ky6Z zbEj~Q(E2BYm&~6u9}vE2{0SnRFafqLFKq z8jnmzZbinOnbz*eEXx&{cTYqf_!}aNN;E1)&C0rHN;Ey170rznN3Bt3)DzXB@o06l zCb~JgHCi8Sj5bGiMfXJaMmwViqCL?g(PL4<8g$JWx@M5BIZydVDEH;)70NyJIA=Yb zyB?i!Z;#$qwnXQ&Yk?!~%IH0RL%bcLp-WI zmLF}5S)$FcO2XW7%ojZt3&#@HZqI&~80?FThaSe($2LYLW3>UZd%M5E*QKlr-L`F` ze%^}J`C4P!V>@Ckp&qx-x-HhK=DG*0+mvXmEw<0sS1SWAa<7O9g1CuU5bqnzPTE^5xW_?6T2I`A6uXtdzrlAG~MIN;%V{B zXk$Fbx-MQAFN@nF*P@+~@#vMf8V^L~<59OIzRqcnro=bIH^sNaw>dMFElPX5A)H~$ zA<0;snUV2$Q+#K9cf38`p+uD?`F?zV#ly&?wS&%d#}CJk#`~R_@ss{p)vAiIc7t$*41aEj}H;6`zgP#OK*4lK-$+C03c4Be$^X8k4HcRa>j-s~V%ntD38J zRqd(T8`Y{htKwA$s(PY(s*W&h9nFp1tUB(Wr9P4VRhympDsfmo(dPgGC9Xz3JOJoPb;o8SKFs=?Wp4SE@?&{vT1)v{`6*|z*6JFy9@5(KAC{(;dkVJOYPEfq^OYX!fYzlQ z)DD#&*LsW2Ykk^@@>2zJ`6<_^HlUp?_h>`fh4SMTr>)L0l4mbSROY$_?UFK9woV%> zy6nuav{pLvqS}OZwWO(1({5B&m$p`nI$O1ym0Ptt-hSY+!`kQS4+TO|?M`W5Xk9^eXhUcd<=#TyZLVdZ2J1kmDYTQ$ z?Jn-Jr84;x4LU|NDxv(CYd9~he2#b|ozfPPPpb8hVl4MmW|fj`T$8eg&ea9xOZzmg zY)h!!QWNTMXrcYNS1XG{-PGd4)Uu-m37aw0pJxx9%!}GmL#J~Wv^%!!+=bA&&~WHt zXw+t5eF|-niK^`O&NI%XXxPA)%h%aA?gS6C}qJ455z zjtZf))mm4;S;w5o)MB)eM%JTtlwP%*4^5WeE4^8I$2#GiFTZYyhpq*07Y$n1mtQGO zWn*t0t4In>hi-*tU8A;ITV3vg&8YZ7^Od=_jip1SeYRSQHF(=XBUnD8P2|~ab=u9) z181vkhc(02Vr%i|+gd9(hZb%7@}i0_EK<)kHu4s$#p%$(X1kCVEp08jl4mcOWqk~% zCw^lS&G%)?INUQWz z94MjRtF#-9Af@L>3S_D<>Qy1qo#=)M2};3`7!<^$N|?$i~vv zyg;!rf3qz=6fKzz9S$uP4VLyrY9n>IH(W$e~DY$!w&L9akJJy%{+X83>yl*2r0Ebw*^! z6^L9=?p9V?iu3G|OOdh2MC7WqPq`ntp)5phM(#xJx&n^e$o;UH=7k(t2rXLTju~r4 zUO>Cb?1o(+XYqb0d(*fJv z%B-Tn^5fBE(X{-|Xr?^n&`K5y15VkI>nM)qgiaR?76#ZiG#o7q&qT|@@u)qjYGctr zG@8H1VGS*^Z*g*HizC;b>256C8C~btT#od6*lmBu<)lN=!_lL8c5Naupk1K$7Cp6Kc5Iqi~m$r6ta+jdk|(-jw^qtWr`Wb|5eI(n<$vPT$Kv5rRykHpE5d@~ieoA??6_Xi z6sw7Cc4QSz708k7*jD<~#~NeJv0c_3&Q^;jJQdp$O`_Sp%$^w*-CJ!&hqa>2;*9ML z6Le%c#LiioW1W^}cVjpnjyscM2P&rX9~LCadt&q{9g7`tX0Umjd$qL1vAJ|8b}V+> zp*bz(bJj!F`!siU6eRLgXQib&FG{w4efa@8>&soBH7y)FRcy3ga;`6FQtp;_k_9X- zpRuiXl6`g7S)2t4XRmX6#kSZP=Z=ylOWe|FTZj#Y_IoNz`kigD^K`x|Hlke(pQn}{ zie09aF*7_86=<$|Vpl@@sdrPfieA<3$F4_{XihA|W@5K1tHV>))bbhYLDD<+bbShc zoxjd;{4e-laJ=ER;Wj6TUlmVt2Jv6SZ*V4YNW8=)i$4@6xo5;*iofDkiFd?Txg7D| z#rs^Y_(ySpD}=XGEYXK6krYYcERsj^aHXa*rZZd_)$zIiNzd~3au)bYRpc#wjjm?? zQZ-`of5TnkM!EIynw~{Wz6LS*H^PH@6FjI*@Sxrd4{9^_8}gvu0uO2nJgB#k2eq2p z3g78N@SXkvzEc}~rw_w-YKQOi5%^9Yh3~WvzEcN$r;ovR>V)s~arjPM@SQ$^xcvdd z?GGYue@gHXmK=az^fI18{uSc$vn)Q(3oJg*8`)FHyop8W`6S_6!przl_ag%TWklegM+E*Pd)Ar% z3VYU>A7IZq^It;*eptF~Oy<9d==uzz>%U??6@L>k_E!*Nzh$K9$p4yoR{R~K*Z3^| zDvPKK0*j~%1{P5lMB}@R?-C^DUkOIzbH*PFCgx2E9_CF6UKT$Wd@O!01ehNsgqR;C zgqa^D#F!r?#F-x@yqWn?!e;WLI)%3&Lf&S2$@Ft!AM=HT=Me)RKn(nAh=HF*4E*be zfuBJP{9h0QKZ_Xn3y6WALk#>I>2^P>zA@}uSrQSx>IhRfvVyu$nXNk^D5u_n)i}^`G2|ZUyWiH7rWCq zLve0yBmEbOGjq2QO>-v`Z&~gp`Y#k4-DW!C+~)FXPAGcdPT~wj^XdZq7mDt$!Ckltu0rjjpq@K+^Lf2fNYcA2JRUOOj$nLPrsuSu# z^{RR!t5LnF-k~e*79CYjsP_wpEVESRf?IGWxtF=q+?n*raTmJF=qQt@-K|n8;EuZ2 zxi`2sxwp`{LiaXzgS&~Y*-7ViQ@(b}$vz$Q-A}v??rzGd(z!DC;Z;8OQTp_|Pr6SR zHLaX>pK}lACEOR?qeV^barb0)$Exg=)2lMFJMwCu-r&CGo_61I&${Q)rU&jtD!<8H z=n<)`Oplqh$df{Kl(_?*boVAtmM7P}%~R~Ls@pwIk7tc)QPozD=81c%JvE-qo~@qh zRT(6YLo28AdeyU@dUdF%$9I_B7IGm&fDTvqn|NJbUwon1nM^J=N+MXW>{vu+3G@JmwLjRub%Z<91Y$|udH6O%oc6&`qVbkic8+G+Tu-+CbX&tDgXMC zyWWlY8@#o7L%B!1b!w}3yLX4$>usUyTfJ@GecmqbLGK}NFV%U8`oAx4$lIrG_nsh4 z+ecRnWHo!wdWXChyq7#jykp)8HtOE1-W%SV-aER+c<*}edl%f9K7mGkzc0zR%$MfN zWaC30>Yuy8m*Xq+mAMOjc6XUiB^_Jlv-<+>GLq&NUzA2T)3?sI!MDk`#kbAZ;A^6h z&h+i{?e?|PwH?0wzHZ-PlJ^GRQD49BBxz$I(+lr}@3gy6UC3&tIYJum_4&@(Qfw){ zVc$jHXm*Ehyr9N1OQYE5&dENVeOf)?8(rmFIqjRwJ>ov-!#4b0l( zoA*6%Px}_LJN%;G>`x(ScKOpuS4peA6CRO9G|Qjm&-EAkt$ruXin5i{eh-bQ)l==) zEVKT&zZ$w%o-6+A{_7-Trmcne*xft*GrmIV&jbH)%6Hp8N1uEChb%{cBi+pO zoCz3LP8Z$?BnMIh8J>6`+q2iZqi|m!KVV_AG`pkF7^n=$>b`;+W`~|uS7iizfp8!Z zSRY8JeSwXETE97OC{P#J9;mfjEVF?fftEmPpe^@Efb=QQ_4Mw*!N8$FZ=lb2E|Blp zo81vOu__}so*NGg1kSR4t1W?{!imC(zyQTIB&F)W z&A=UMO@VrnfI7r1FYIos@0=$d?9cAVY7U;Hnomqj_ChA zME~!Ld&G9`_tLyEnOguBT>&hb0WA6quxKW*=t^MGEMU>qz@j;Lx~hm$2v+-iIiEBclB8L6m<7qWtegl)nj4{`Vou-;5~#`w``DL6rXki1P13l>cLh z@^>b&# z@_#^F{vkt>{2v*T6!P#SLkXT_u;59CQas5}#*m~?&XA;FWk^yu%aEk-uZV;H3UTmP z2%Q|}hF-%c$?gBA?_Wh~={fQOXGqVK7ZibxQssL@ljYmQGs?H+IZk+b@fkvDPd|{a z$+zg}Zr&+6x+9OtH|S_aK2Jy2<@53g9ZkyPbTlrXrvLv>=F(qqR#HZi6@AF$NZFPS z|M_cJEUnJ4uih(nX(&822JYPn8QB>Y3k7hSy z^vmP&B(-*0zEym@RFr4slbIV=)XKy1y!;@~Cod|ZJgu0QCFiYQvn_ojFQKF;=_}{+ zb|_g&Zt<0z`#IsP8KqdUE;py2f3lF}$g9n(Q=H3t6i?pv)wdNbeME7toLAy`JFJb* zRA=nWu`Hd)Yf-B6T9q1Qv$A!?!t#15p+4)LV$Hg(G^QU}aUob9V?ls(Gc)W!T!r895+3X5_eceB#7^rmve`cOHRm#n0(+Myg*PEqbN%Aj&y z8Bs1Por+btl9!xyZ_UXSwM;(pNo6Xxhx&b3xlZ!wS7w-W^4814%I*AX#WQ(6Wlp&# zk17vUuC!V;s>!JxYO0!{W@k*R`RNB#OU3r|DYa6S(+^}fTrPZs>=5*y>BOdi=#Rclql(Hw|oYJ`>HTz=j z=AvO`GqrL*Yp2?h+e4VA?Wy%oG^_ilm522@We>LF<^Dz^t?nyw|gh)&0twe z(P<^FY<2I>*uUn%s$|mqX?J_Z{#E(%u-fMCkh=*Nbh9ybA7=WmqjuHD#@M}$$~^5p zm(lMYb`P%@WB8q+cZS!Ww#yfB4BSp7?JP-kKag*^7d>L;Mvr+#xM)11U77Ku$VWZt zPbIP&)Ug%xS-qK|cTcgK+OlG7O;g_by!C{noarMT56zmCf)S6Vy zbLs=n*5y5(`qGqw8NyA?o?UCYm2}S@O7Hb_uGr@}pg2pLJw2WyN>;%`hSrrDbz^!n z!$6)higg*MI6Z@TiS)+Q?&U{3=RG5N>(fV8&U-GWpC{b*7_$>%pIfzk#fcSd`5hUD zGqyc3lYS)qNM5q%9_guXb&cntm#f(BH7|o-6p*i}>sQsKA7fv&&U?eNhoOFk_mwPly?0@C4U-J} ztVm5i^-T3M53{$Wt@jCe#yrcP{QzM99ABBw?kUdLEsy$CU%(gD@%|GdzAc_y9rH81 zpWTq%;A{Ug;wOB6v}A}Oe&1=|Ifm-V_LBa|!@g19xNlM(&DhOQyziEqP`onZBkl7& z@GTZ~kmX6&F}y!LFL_1k>RfME(P4kqnn{M<6{q542;T20I=ON_{kmWC$355m)eN)y z9;}+k+rFl|>=Mascd5s}HLosx#9v=D>~Ac(STvf^R5YG4VlDPJ=k}~h&LIE6zstYJ zzn8E&p>*#+ez%U%Ne6nA9{(x-8UJ9`od3Lk#D6)b%YVf`<-hJ7@Xz>fTOY2jp}Ak9 zWANO~D|-D8^R@@LfH9D484jd+9tJXs_pF>>IUmR_-do(6KbpOpG@P_}MfNJ6V$H~; zRb+5kB}3*6kq3OM_of^uKBCq=Q~XSEAY5`cXUEbD*{78nhRrQa44JzdXthbKSkKUT z*`>6N+3jT$CHn$9GL2a?d0iRP45>dU1lqh8*tx*IK$m)<_;}!;wXyhA;7~?;iM;$& zb|GQ+-i-O;GsS~BeZ}Wf&#jp(9!VJq^aW0=8DDPAZ6>YCPd{EfReZg8rucU89b-m@Nq_k+ep6&^n-||{ut>`fF1z-Hl9PqRl;4+6QEx181Z@J z`68}8k90HWG31#;x)W!?7uY_sJdd2B9>4t^_&%C9ybxz)8qU%D-s3=|2)p7fvTXnkj5DL`|n797SiZO`V8nIBvXm>X{47U{ZYuu z3|bFPI_f%sl0~FTkS;(v1Ue7Szo7kvNV~v)AKLIADCb3#`Cf2FQR7qKUjv;7=gXib zaIS+kfX;xjoq2fU)5wzmXE#d2$VzVnrw^Q8a{ZJR!T&z!G|uWR*^0K!qP4$AYo7(x z$NC*Oi@u0=K&_w{W#jumo5A^Kl<*tmKM%fuv_9g?xt~#CEI1oSlbR-zw9 z&L2Wge9*}{wD4OP_isL)J7=jDz2!sb`zTElURc1{S3!S;v(-q?VywT0Uf%@gH?*$t z!V%=z$kO~c(ogEMjK4_fZpJs9M#faB{)53gIAxk!V)@r7J1CzoIxJwDt{7s zxDHbKd&s8*=@6(c=Y5dgD@Y4SUq%`uWn2T!3*cm-gi@q+t^PddQ>gt%sQrs*+aHkr zC-7kz47y&yVi=)yCKGZ##c!gsFQXjY4j%;lDYRlEs6Ow0fpiPf&aH`*GF- z4y=R`eKDrv?B5{&UeISr<9Nd;S_KIkNrO!BAC6puQTJZl7)cCmk30MpcZD4s)k^VQF{S4BuNYaPFfeeKQ zXwTO{_k)i-!XJ?z)_`QoDDoJ-0U8G#01be?3v>kKuK*oJId{PS8A?N1x&^B9VJ8h} zv!Lgn0DV8~66`jucO2G1M!y4&zK$b5%|Vv`wEb&|E z+Kr2S#CZpDURb<99DM~m&PtFrAZLv}@6hWrj4yUUCTE!KHT-aKo=FTfesA$5O2d*9 zJ;d}xzY4AW6iPEA-NNdUz5wX~aT$gdZx9E%A=QG@&e}$@ZDKYVCKTDYWMz-vP?b{tIh^ zm|*!uSS0aNC}(kTC2Kj8p|J_FJ;2h!2RI+oip716u<8tj;O0~~#QgoF+7P{fCzt3Y!=QI2>V6!uNjQGqT`NWh?b zPpHfAX7FJZ4e)CWUjoI7OtX^N5NM`22tHOZ14c@O+ysn>2#hCu8~Jra@iEZ1gT4{; zGoaUjI)InRk~5Bu?N5V#5)^ALd2?*d1(qXU>{-ksM#EU06G(p-bO!Vn$Pa`=9txw- z8A10uAVb4WQ0OyxHyp4i<7`0wdQcs)e+~3Ls2e%oiJY+i2Iz(X9;E^6xCkU5>c~f* z7Z`U#?_)h=ZTk{R(|x^Hz|nEzL8O6U3{yz!euR$MfMZ2qHiM38bfgMYY}kVJ%Za*l zLV;l_*VP~((eX+9`xg&9|kH0 zMiMaA0(vLv{el-G>QdE5Y5)|Tjsc#FgwiBnZwVeN%?oxm3Tk2m}=py6Ynx-HrQdie1;>Z1=$0|t(O z53C{r_lnRiQA5d#`uqZReG?=Ak6wgdK)S)oxr%f<(nFxN;QS-#rylDeD@R`+VGTsY zB}8}!h9^LiK@rCgux5#{Bs4BeA9QN~oGGF&60nvCtSF$Tf^IV{-~$mEfDH_91xL3q zy0+`970{`u`xpNL3ad!SnU(fiXcW+hps#wm<$-T5L2d&4aRHJSuzpGCml3r{@Kptr zEHz-&##&&2?_h-IE&&fqn2!?BwV=lVevdT#3-Kz_SQiWxi(6n57ze1>q}x^4ZQ;W> zJHA*0i^TXk{*0nbtR`Y3qx|m|-%otRHzbrS051u81W9k9?%}quG6h}cShd9|(22#{ zRKi=p*D(g{g8=&==sp_O7cmW`p?9JlIr#|E@B}5u-w1>(>9`^e?C~n<)nx)aAYkj(!+`@K@W{O#s*@M5MvR6dBpk0 z5@QJY4QLhCKJfx-c^j@pR85404f^^H+#+JON{H+UIh>g|`dW|iH9*6Su;c=8l%)Hc zuyT?fwfk>K!>=@8j0ibXe@*btOzn%iiG$f{LTtwbt0-Y*6uyA71xRDP6MzH+J#qqV z7qMarXo)z9^52C%{sZV^eTHn;K<4m|48ZEbEI2PAC+xET>?G(>Cag+i>(COE58W_4 zulJoHa1&O46)Bw$VxN)v%M#Fump=dM%RbleV1V#I19AbusmG8pw4vA}B_iw{tK5wT@jr)rs0 zL61NQkfTA=bY9uMuVl89TiE?I<=Q{Fy5$Vt1?Awvn*KUlpsIN^}VMX2l zg5PJ<*JZ?rj9B++jbqowQBEGx&w`!-N0-0@(8kAoVOPPg5n&HSU_2ABfeBbt0v<3z zZ;in7M%Xvq_3?PkbW8EybAgg&;b@(Fv5>B>QO9xy}QpeN_sOp zD`H(Rx^Q-s@dbDUMm<6W>rL25k_zr01XF<_^Q!V6k3w_yuoX>+k33?aQ#pn`=ze71ch^yYKbC5ocJii3p z2YKED)ur)MPzP!}jame7#=wF08h(ZJB&b{099n;vr(cV;hF$drP#I?rK5jqLBE%ad zMDq;5S4OP1lJ4hz5BYUXz&s@nh0$-JfRxjjFo-&g>WJSI_qwfLz1Nil5Pa!xJ z;EW*sG$?dfx(ur4!H5{sQ1VUGQU^{C=v%?rh%zyQOg3;nhifq}NHZA+(S8v)(+E^) z0POZ=ikPV7;IwBD&mHZI=qo8MS z7AwA}N7SDOzXtSgK(Vq5I_^CNP6g;cqDB?;S#SbKe?X5iFs%q&Btqt59?t6b z*Pch75IFiB&wWUrK&xItj2h7)!xT7!x+IYYaZAH1;CvKm#EuN-FgkC*Sl5Dojn!iK zAxj%|Z$;0eM;gDQmxlCSUD`}ahWnsD1pOSNVj6mvkCt51M+8^BA8q&~IB1FZWu(`F zmZC2Go=YbeHboX>#20@Q()=&`#m>Ggt!L7zhY51{r0 zIBlSZLESjp&k(F(6e9xfOyn>YHsqPtM-x;8=kGy>K@oK^yb=2OG&tX7WeRs5WfDh6 z^);wv6QqQwtcZw#sDb~_xa#Xje*@`nAbk|H0QBqN{{zxSP<@p@hB7aLa~*U7^gO5? zG!D8GbY8ar(3$4N1Vb+ht9w=s)RNr)w#$-3n>k1N|-de?l6wMrhM5 z8|r!yXLX%_4=BnvJcm4ckbWa5B9;csL}3o}cbJJl;7PF6M$FbE-Fw1HDj|9!Lbpw@ zGe*qTB>lcX824ztDtwrs7xKf%);$U{tz&nHgcliK08$n9aJN{0{}g2uoEIL=!beUe z`e~HYhWkDV#uwl7$PYxsa(?{L49D(xvO73OA9b?QgjD#y43l4bw29K6Vj4oFU1RNG z`Nf@FIcpF9B=d8T{?=p8DwKAXQGPkR0OCu(UHlWr?(mi)|EnCk4~YCMZ75`ELkBoL zNblsHA^LYr4-M7epX9PR_Qb*?p!J;JPXur@zhO0-w-5T{|$!p^cgM=yAAJuc zEC-+2mU^@~g1dxY#N1heoIVyAppiqbQ9>u~7rzs=|A5_%qO%jAYy=VGl0MITc`?N5 zCHYLCCG5V{FOjp8I}Zskel7BJ0Y7&=I*ndX$>Nvz7||qsEcha3SJA?jM-h%ivsv4I z56(YAZl6J4c#KyM{|2<@KOoh2g03c7_vk9>{XEkdF3vO!n)4zdR$llLlN-r%Bb9@g zEum9(pZz(e35HTUm+}epU4Q!JF4xM+5elJKyNLe+^tlVV{qL|sM?gP^UcUed=$@31 zJ;y@6{{&V9k{kPF5~aUD9z2Ut+(LWUwcma;z%gI%EVF))(pS-jFl)J?^$}}%59R_7 zX}lYf(Pdb|q$hqK`q{Ly&Ek)&r)^{35=m~3s^a|$wlRV86I4dPDjTT#ntHd73n{=}YE+O)Wf@nQFNvymnJA-_*(=W~hwD~xgv+Pn#t>O1H~ z*CU?U3O2IB3y@pVqY_G=dGs{p+|49!n0fSjSQs~>i(h541M>VB^x^xE`Dgg|Qu?DP zp^}v#W}%!e^syZ+>EZ0ecd{0WhZ&_-VaeO!S)at&PPDKKtv!aT zy14zwqg$bBHZK_8ScbE|pOFtF@m!`5`U2=@ z88!To^;&q9BWW0Z!?Rv@{i%n|6edIAMYLf*T7DFBd;_yH0-~vguc8;bnB=8$CMyYd zOiVAcvC_#TdwioFV;0oXn5qBBH?;`yYXb==A zQPQ6Xg_j{70A4)>K2WFt|4W2_A?nXjbR)9Lp-la*{m+5T@Kk_Ne_j{&M?@e`aS2)i zk56&}DIv}*UVnV;IAU(_XpsMBK-YSF7%?shcu7JOUBa_)Mzqa{xTORiN5cIhBjUzJ z;A*4J(VxWo0ZImHG8{+xWl;T&@D1=k1fPZ%=97Dh{%r#QA(2@@rJ}C_(T%cVx#`7uO9P9 z%u`y05u8Q6U68;(KpMEKWz?U0fgXzRAOt+0mV{>yOdmsjJ=&a#zTiH)q+f;S$IOVG zE`h&bg5P0;{F9)=Cis;m#7UA6A(Rk95IfOk1%BuuMx|9qe-Y^~px!rt{t`KV0f}K0 zL_A|A!uJ$`+Xekz##h17ed_zT7O@Kh@OhH{48RQ9qtBoNIQvM~6U?0-vpyPKKzgH$ z8t)*_B--YOCy020@Bmc5o3BUOFQLpWC?^~F(PqhvS@UDGAJ4x@`jgV|3&<;H{C8k{ zaW~3%3!LZiR9hEIFM)Tq1UAa}LFmjw z0qp{Hpht+eNCIp=yb=MrEw~@sG}f-Uo^{NElNiA_LO%po5^g99{;6uWG!E+TX5I z^y>!7gr{%Bb3P(UNYbCP#gn%ZJYs1nuKFP4_7UjG6nu(*L&>`5u178OxW}8phcys? zh!Rqe{t4=x*1cVDV2eb=uZ+-AaXIpDLkW5w$V9S&zDKt_ptzfCDg z`de5JeWrf`6!T8dV=wUi#Z=_f*EPf?q+jVd!C#F$PP74h17bDYLGJi#zl7K3{__2+ zzv9;}YgagfHlkh8rs!x`n zFdelaXREf4<@~?-1>RqNxo>DBU;Qt82xx)-{N=yQO4N>O{n|-t$2n@rMQv0Y*Cw@V z+O&2{o2Bo(_CQ+I-bf`E~ z9jXa!4s8w9vpumwyFzVRCUl$Xp9|d!Jq&YUV>mgS8qNr3hx3VA!j)k;>!H!#k+NVZA)+@nX0o+!{&=w`t?yec`U~!SJDQZ@4dff^rUo&xVJn zFC>fbh47{Dm^K`q&~AmVhHr##hVO*$hVN5P2Ez-Xtq~!Tq%B64MbaXfq2rO9a3WF| zDT~-c#SxX#0lKPII~|FJTO#XNzakr$TqBzzTO!*c4Xj^ubyH+#WOpbl(oUa_$o@!o zpa+>m})?UD1?q<$v1yAvf&%zuNx+<5wT5kEZ+&J3*v} zHb;*T?-+gAju2;}gQO)#BW3Ixnj$^A6+Isv!M+ev7!_aix^_BzKROe=9i5BbWBWkF zjIrc!ZzzTB0};y(*M{a|`7ukZGV*}!_Ye!S5h7hnk0sbn53$-<9hEquT?}8<_jb_6 zW38lxw<7J@Eh-~5)<$F58`~G_iXDs$#|~-hV!h#7wy#5|J~j~A96K8u3f1U)IfQ+$ z?dA}z(f4!E_i>0evm>^fLpɄutuIj}t(;?elJ_y*E63){cpFPgn4zAbtr)EI9F zT@KCR-S)gh&W>b|3^Wssl93anBq<5+w*Tz^ygl2wee@~kI_P8NI_Xovb#Vu%Y_<=R z3%`z4xJ&d=$@d%pb!J^IyUa^L^N1{yDZ25_cT?%s-EP=6`^F=C5F%`5$7R`5$4Q`6=u( z{}b#pe+~Q0{|x)g-V3*mzbCE?`Qi7@h#>ub2{J zWIn`y$ovKKQGSp4nE6Y5o4McI&$pZZ+58p$Bj&G~zsm13pD~}||Iz${`6a%?{7v(D z{*&el<`Mo==3C}le2@86^Q-(nEp;q)@rRa%mWKGxEv;I*mOrxe4NI%}FD$KDTEl;F z>E@-I`D07pw)AcMmzKVL>D&1}?B4$zcJJ?})v$*<{o0!7w)`Kye{~)ASc3u1;3*CU zf>Aok3Cct>gFfP=1ugVn@FWL4bYu)>(SO0c7*sif`$2FS{TJMKDZjyehbB8+=bi~V z>F9c3p8o%J>+#x-K;7hfQ_J}{M~F*pe*OFZ{>y*af5|`QpYUJx-|*k`-|^q|-}f&B zgg{bYSs=}SCy+_soIqiqEMO0)fj}TisdfHKferqNz$X8Vz!v}gz&6U=5J;k&O^a-wg~?nL^+q zYe8U?N*xbm1}3T8Yu;;A|8(FM)j#XG6POP?2rLFg@2#LYm=a76W(5uhbA!b}YtV@j zsm!3qe

`lEy8TAk4QR~ZsTZ8q1Xs|KZ9NZP$6Wkl@3?2yf1djxd1&;^H zC`TcaMetPc4CNgRp7-Agjs!0UuLP%9kAhRd>%o~o2bE{1^S9Y2&=H*Tk5Rezf)4|m zG>%DCGX^I8H??Ff)xW^{k}!UB zU1%A*R@=_@Q3&M(cWD(|p+aisMDQN_2CgwZV!JAYRLvI(1kE%m)=)IG zF0enefyU)78$U)vn}P=dJ1O@VMyMvVg~n*kf7jO;+7@bHBZN;h)D&#iDnmO%yFoQqW2 zcsPY@(|Z2v?AMX}3;YXYr(Wb=d&OSvY4NCdluH+niO0AVVxQQ@Wr+P^KlhAy zTs+QYiYLSq+)DAJc#_K!Pl>0vRpJ@(43{lViBsHa@v3;0%Mq`M*SIy}b@4ivE8Y-q zaCzdiIL+mYuZXX31>Uvq`xZ^YklMdF+|#}$ir#k*XII4{m~7V&}jfGZUj#YL_R zR=gZm+zKmR0V`f9EtQsXHt7lJ3C=D(DLu(Kq^G2(IH$B+TF$wor=_PkSy~~j;1uZ@ z=^0LyR!S>5x3o%H#d)OF(rV5tt&!GnJ}FPiyob|U*X=6 zJdr%XRVPm-PZIuo9kITSSYJo1|78#>KWylE4fk1FU;qAp`2JO7?`%;8&fwgk3ThG^ z)hiE)ZdEzrZC2*!zu?@UEYi_BWlUZL3G+VftQ_yKQDyn>@%Mx$Z2cQfHLg?9Hj{ zy{SyD?9Hj{y{YKeIyGA^v)^|uI4-LBs)fBhwS1JlH&soj>nZQXKff)N`f*-uvD0|5 zH=o*#>OQs05wKeAb!wZOsUEbRQV+??oSIWpd*y(7P|l&=Usn6n6Rtkz0g^Y3hcd`^ z53pZ&?d_+oJ958zRX(cTVEYBAch&oBj{x~JjUOAYlkOz>q&o0;$ABEAULBJAE6=$L z>09>aH)x&AE2rG;%3gPed%rbqdEoALAGY6B zdzC%zql(kruf*A&0j2fwGPY-c`yv}5d7He=Jz9QJ+4}hHqu1m#HjdP@WyG7d%_-L% z7iBxicaM8i-lAqd-c8_vdr?lROmY@`M31>l_N2)Do^(%^{svNyRmt@@Np26}- z*8t5Z_6z;j@#yP#^mRP?UnhdvN%P|`D_-91zmBacPdZL>2FK}&Hpe+msMzH=%L(Nz zL=BGKibfpOJI>J2fr>5kUnt*Hxs#4gR;;J%gvuR`0Xk}_(CEKl+g`buj_NDyj-J2R zhS&Ckxhc)Qwx4_62KE(hIa(cUj(wF0N0;NEwtl8J5W<#+G9@74RNzS>p0)>*xJ zY4;zeyBB@{VjE{P51RN?0ev_wHBPqnwvM(AwoaVfS=oHYo$IR?XZ9Cvu6#&*alEfN zRL7a~&XYVHX6ZNj#T!K<0w3G}@SH4XJtuiSJ01Yt0X+^zS@!J|`(f2>fYa=A{=_k= zu93Z%cubgLx;+AKHl(Tx;wsYcqr?svN zO)sb(cPc&jYwkie?-bjLXf%=hjQ4_f|HuXCnB$;R$Jq|`YiYBJq2^Y;(`vwF)n$-F z;(blBT9i*3mZ0Xe2FG&PW;y#b_q1SQRFX$iK80=18qk@oz_XU|!!$~VX1qZGkuPg6 zcsIWb*!&$xz06CQO%Tfn2-2albGze7GS^whcccBA0<%mU^CsdUwTdH^wV`z2T$-ZE zpuVrxE(fHVH&@S2L>ddDB^>K^)Yr^*-UBO9Xp7tjoeO4suHxUTaLX=V(W+le*~fM= z9mU%Fev{5GSt2*{TzS_`vXy+fr#kLNU_)M__YytIaO30Azi3^*a*ENfT1!qduG21? z>C~Di<5Qrh?wBlEGO=1LY^<}4p$fyzMWa{>+MuXeX8n`1{<=URs3D|{O2#%V#YQ%0 zuK282DU-Tc+rmvZ^)wj~*N{)9{pafC+0TxB>-{=5WuA&VI;xcUDc}8U)+!wpNg3dI za*;lc+eIqc7`d)0bs6n4y*kT@Sj|C08><}I(vNP-1numovFZj-PG$VGWKB~&kL`2= z!FWqoXH`aSz#=-w;By~~N`3pBI%`?!DUo`8=6+lLf!0F`Ld9S#8iiAFt=tiZkB&oG zg_dgBi6RF_jT+zl0dvWIv-V?iWkT+>_SUrh)Do4JU(mEZ7X%lWna#sG!yDCiHcpqyW(39;jF0`1 zl8+>AwZ?(g%4wa`ditCi?c0Jog!XwZNWZ*vwJpp_dCE4iWDhpdq+ut|bUd=WCIk#u zcX}-49JfZeQYXpg%7OJW(feY?Bz3&{57t|isW9vP>N6PUJ40mTMI zB>q!=JpQZ&@RlFLy6feDC_q-{()_kX;xIqo_ZqL%UjpeQ(BBo3ybXem!_R5~TruYe zW*!kjdq+y8=l7{Tv4ZN|W!Mkk_Wy(6yI$H!t!`pZl(!tJC*gp@OVb zSMQZ0BM*HoBRJN#EfSs5Qf}6d5x@y8Vqna$lyZxgv-6;+RVI+2bC=%R0>nhhIU{ z^jq>2ajA(Ubj_)f%R}U##JKhEx z)0CZT9I2i^f6JXm5cT)t$#i^|3@2>tu`L!AxR=y{Zr08Vye1tDjFkbS!}Xi>#*>Rx zJBuM!Q;FV^Hiv4!2|I05mnLp4HmNbh6_sMU{C6 z7ZlBEpsoA}cZLI6TpV3uF#4rp+5*F^+w1YeVasRhb?M{fhl`7wOL>KpJjVGmO}9E9 zB(h!75ziw+mrF`FPnl-EWE z`Q(jlhF}#`e5VA{%UcYoo`P9@DQ7Q*@0YD(%ft1?3WQotj7iMw4hIyj_ zggZFZSdUp3x$)%FQOZ+oK0MXn`^k8#HPq_YUado>Zb{bkryZGbAmV9gudDv8|~#OSzYyjS1y;*P5GR(`;7ULrt%H1o&Dha%`=NsBAHXJQ!|U| zyNWmuCJ!b}>8KeGj@4~5^oXdp$!Wj^*Lm_u>{{aqs*Th+#kosQnfdpo{oJaD`VO}u zlT}$4xVw~Q4|(~nUi#^UjD$s5FBJe&R*BPGyOUxKM;^b~J-%+dbx}QcYEq(iuUteACo~jyPP3mwbHCZ#k0Sq+M-K& zO%@%C@@5?f4~GKaF4~)Mr>@kfI+gg~&I4HF0f^qa1Qc|L%fj4 z(;3#MkxghWha7k=X)auwttYaJ0mbqz8{a1-_t|REU5MTE)C(#b2uC1~^g1xxr)L&5 z4(T|loduh0o8v%d!8{$8;LFT)1HExPqCC2Q#FvE|!@=~J9g7v>k6Aj&aU8XF-uO)! z1JjhbEpcnjk~MZ`2fK9NUAT{Tr)vkaqaFD#IA+T@Ue+098T-nFu!8kCuRV4b37!{U zDK9Nvi(e*gG`EuqE)EC|8|RWXINITSt4Ys2ILgHAwA1p}Bwq9r9}#cNDxU?%>=Jkx z>nH^<1RNxi6$+3n*!EgAvJRXU4_jo@1Bdxh7 z&9x;POMFwyOX>%=BPFf1c$X4hS~tE;Vi9)vfKofDnlZLOcX^neP5ualNmWhtS48rU zJDafB3)P-Kkbar&3%O|Ruv_d@#(!ndh}Mc`xRgEC-MVw;+!}e6F?M%PbH%-H__xrP zcOTMxZb#kOhf2pD{fF6xvrZhhigdF1mEYB{w!IRwMflC}-2O7?tM^I}Wjck-GVf9Yx`@tO zW(Ow~sJx1o+VTz~P3TPNBA_C7Y+pF;SsdhU;I815pictX4SjRG`QJrx*G~!;33Myn zFV~pHnAU!cF-0D5+62ALvS=Qd_H35PzO05zP zqPO^Cf;L8K`)d8S4*8S6mSCyx@O!Lw-aVb;9{yw-ZkqS7`LH=(iB0;J$1=J4-|<)7 zht6LSBDGpe^Oq%6(T`R4P@ZVrA*}*ZTEvEN%sf|lmlwFpt|le0y);)D2OgOgO5R>hvR&9T_kFnrj9ncOUyC&AeU}D~m1o}P5?#-%>r!cGtGcI@z-uxsIZ-?XHc z*q-2CqpZ$fk(PR0wmx6l5F;n+_GoTK9sS=3DYTzW1S+^;#x(~i8g!_7q0uQ!R;#GP zy5E#Umxd!PsduUiGpQ{jlnSZUag&U1WPEvKvaS<9F_hATdnm@udb~?g3dJoXFkzCl zkACHL}~g0 z5qqSrzCiCCF9@M8TBI#9_OG9rzaPI%ZhJxaJrNf0c*o6v^+=h2v4QA&{8qi~6})sM zAd2@yNP_%@hWkQ)aX6x+Tm1s=A@wStW z-D=XR!i80ktZ54;&5JYDO1!_=W*TowA^m}+Y$cNEt+!yZlAF7R(FPm`O)*di`a>Q8Z#%AOh)Re(j?XtWS;D;C^$>~D*hTS$wSU7&OXL6%TlN) zA1;p^^>2pnR+{mM&j3A18|iMvnhlwzKII^j~NXv@kKA=y5;QA(eVS{iKGm&{s{OrboKj1tq3tt-zy2I~qr zOI^95Dqdt#uPI(sWw?wS(-5mG#XdHDHZ5LcZN!BVlQ@2W8snJIEzLf5d3O1wh+*xQ zVlmy4>|+QIP_xvnE85~k$qgl6uX@w3SL42TkxD~~coDy09&*f0vX3nL7@Z(0+H0tf z7|rVAnOC7=^nj#z(N`X^YVKG(=z$T5Y;bm5ZMs9q>B zg{YNZ5T=)M^`KULswLS2#;a1m9L^k$iuN)6F+Hs`uM}^XB~=bpj#P6RV?1LquQb+o zEam<=XA9m%nGThX=lnPsKT;?t6L6}w%uA*%9kyUIgl<ypteUT87w#^-jJT}!q+%bNQ|m2 ztxaL6QGEDL@m=j>uWD_4TD)r0>6cm;)z!Q`T<6u6V5!MfJAV*8SP5>$rRk8;51Fu# zMPW#LwI^-l(4+EDEstg;CgZGLGVaOjf!b$d>_I0qqiF^j)RV$VO>I9q6(ePY*F@DM zS#6?k7K;Di5gXDu!{iJzT0K8=81okx#!O1}3hVy9W&!yc-!yr6_I-|atDZx}xISwo z<_7sS+=p7BUazVQeU9IPu;i^ag|1F4p@}%;C|5e3dElEcGKDnkwH-Xk8noniDrqx( zA!$Sj@jG!3n7CWKsIx}2AH4)G=>U_6Byu7`@QOV4{QERYF0(J{z|s3Dw*vMw-fkVK z6U=TcnaDR|SwnQ{01i+GS!PUh$$;O~zei?8B@tLNgTsF!e@1M6&rsr5976|UwMPy1xPZnR~Hv#M(MfmEcstM&b4rwEL5j)B9U*#&wr_N&J zN|>7hS7sx$n;hmF3Q0SoEa4`{@SWi6nh*RxGIO{W&@dVEB=4XX-T^=1&?yF(sP3&^ zcry7UbwwS~k#CtlFo!fmmq6!qrL*YY@Li4p1ss?kEGMXYaEfW$($ND!^(&v~0Wj^_ zl2H7*=gRn$ZM@>CtRR>H=vyYlgfKk%gC>EF#5e56BBl0uZ;i%x8>;b8xS@R+5b|J- zLh&^HxxtT4$WxPHcYJ!d26&7+B~3iVN%;ubL9ObbQf5Kk2wpqbTA;%Qd|QyL_z%E9 zK9;{FJGg=;xe)HSP{^i4WaKcjagjUj{H-9er?3`nya*h0;-$mx5-Y(~KNL9tI+^1SdvxZ_g8vY=JuFPllJohk8+R1_~WO?q!J}F8o5i#Wr#vSw->~ z#FinzS&;q^kNd89XQ zYpxCJc5x#ZB^p%BxD3t!})+myTUAKMn+2&`{jj|eGh#MC1eGEgvpKmHmpWF0!kns^j--4M|nUD zSBjDQWxii?yG#aE_%~mgaCe$35bKxK4D?nK(H!!CXN{?Em2Rr5&U>$fgJY&SaZC*446F|>iqi~ zKy|>Kdprwq0Y0YDAGGPzG&d1F@MCbVLorWE>2MaNx~c?LSa@NmHIlh%i#=_yvahQb zq9Aq)?B#FhM%$c?(jroR7(6go!idoA@HMs&4LEyU5HRm>9&uosScgjfGSqbm{YAo< zTysVV3Z!*v@qQt9qU3#lM%42kFT?0;1Fax~=%JtK98nFJ>`~MCh>?5@DeH(t=7`<; zfSSbX!c!>HpYX?_#Fs%`5U7RsXacn$-D72jwSAMW=+0z$;GT)@=H7_ntde?+H^z{* zLWwmAnNit>SFzanA!ITsB2hsdh!G7Vh2n+iiMk{mv^Ovb<)i+(MGh)pzN|6tU^I{A zrv|Z60VDJ5tfHE20AlyLsd%Ud$ZIbT9I$h5P9^m1^x^nVkUgXLbK#Fb9Y_O8;Vna| z0B-~y%sMO$(t)HsQ?z*4cx{n~pi26XJHzPLV7q9pY~nLUw=gb9PZOc$02y}X ziEG|H@>{|eyn013+q(;lLa1b$%phEe*j)WB{rrE=kb zP?qE)&S^U2Ajy>Nb>a0el@-!$A)$aK)M?06n%FHd;@{V-#8ssCDCr$aRaoJWQ(y=w zp&p#%?Jzp#_%KTcqJN}+LR_aLM8rg!@BLaT6`SAgBt-}s)I`5ZmFSBwjYrzRyMVof zC}e6>YD?0LN3yBqr4fco|4C0G>RaLN-G`c}dtgg4DFAhd3^f~T5I>s)>kmeP5+WvkM6y0hjlDz zvg!m$Gw#@sBq8*8Z*I8J38Qodls_8;Q9!;Gqdg0NCh6r54I!By*V}mk@(z6_ApKmbZ(ZH+lZf(sEr5) zOjBHzBxQ_e5|z*b-vgVT$L-0FprQWeM2R#;#0P_{`P)FDt}GX_3hG0kEDetD=-koP z3gendC3rGiWmuuL7sy*s6CH1ioSVcK#yMqOxnbfOEwarDFMu+2bJl9p@3iyMpQZSR z{rTZfb@Fw6f-UzGF-R|7V8aRJ&T1x=eTj0e%y1|U2hP)xt&46UKL0wM@JffYd<*1A zHXN`U+4 zb#wW42tQtoqA~jWAhW*j&T!fSm1GA+ zljMT2a`5i6))306d)qorJosA5SK$;mdKw$BOJr_5eUt@}`MKWTnogGW^8u4n$$v10 zy-7;gw%NX^th?*wh5OHs6vq6?@H>k$UwaW60En5YURmkkL;F`<`G6{tUhI zBtPQ|^fRnmrmSh~V@e@zg`7=|PME-VP z*yGom%Mo@Y))xEFihm}y3!(?hfE`{D?ZDkL9KnG*Hofu*ft2=&wZjZjLaQ9r7~U4t!7GY=`0} z6E)C}Y>ucHTpD+eF}|L-U;-(XxM1%wj>HDu0;qQDLL5jJzi3Ox&-T`+JzcU=or>L2 z2368iL6vq_a$ni>PoYp9E=7RK;%xwk5={AQZ< zi+#m()<*LAX9{2C_~OpvG7BJx&+WL>aX;H(Ua)krZlxf>0kOKX)xmteJ4sL&W4q|v z!ZQRd*m{#vWi}6wV8S_9Ub&aa#){!if=;Bg+ABg*08tVtYl(CZN)9QiVp%K!r+u^< z{%rU<#>RXq?;2%E3r|O|m(j~ren;*2(*aVdmYyG%&qSu#Flk!5{%C^(k;8A7{ezJ^ z{lMEFO0i1HOw&vblS?WWtxTNS#TL50%~Rm@8jal8JJu1m0 z73r<67B3>M2l-1jFBlIzDFPj;?>mOAW7*@zOj$z8A@sWfSf<#=jId=NT?s?rw1yR~HW@BOHOuSzE)^TE0G& zY1&cYKWP8HFHNL(p92wCS@?(72zh?CU5#EP*@|`hX(>OyZAh?|%u?Hk2FaDg*b9TI>y7_aOPywpB z$4%hc5AIWJ1L`GH7=ST8t(#~n>;_WeZ}1PX+2Wm_G!4zmil^1zYx|;gr>A%f#kCr56W}5b_MxM*)KG&E+W6aw9lgO&|Y#F)p3Z?>JnyT4g zQvb{ji|Drs=?=i)AoD6 z#q+yG6r$BU0c8r8d&hCCahK^jj3JM@0tddL-Jj{!qBp#I2HU&xS$V#}`y-3ncJzqk z@_MTBp=eQtFiT;t)el841h8fUleRw7m*0R~l)_7T93`xZ%eGK`Q(WH~+LXZCKHsyu z5+XM|j!0@4CAU9?p&?;IQoK$0XhO~^8+A|DU8#S)xe*Slm8`mXgbGU*XjkqIo+dwY zUf$dy%~aK#FRHCX;5MjYfBL!s{6;s8zjuyxTJt#lsYpsX-gR0%=me+IVJm;WQIzFCv-@oO)a9Ww z5jXv6PY0ybmEF?2NYA}{>3Vhw+T4_KU7s}rRuEVCte3yk#1wHBr|HH2u;_i6Y&v_f zVSrawldC*SxDsiasEO)FQW0RRb9|KZ*aj9w#;dNMp=nhNVKDSAnwFd+~X>_H*oIs18-RJbY*l;#ACx$!$C9Ffr-VBaWzzx7tGzvBEom24{W`hEXI z1|CvuQ+VL;=SDL8!Vl#G2W2xV?R0B-oQ=XVs}}*lE$$G0=Q1(Vebl-pdAxHLSkQy$M4HSyTAw z%v}1K)-9e(BXw_jcfaHj4|G$3($RVCU z;IpQ$5P~B9sihLiQg6HI(2uYK3MH%iEK=3i`U*2b2Nzg6qb#4d{*kvO!=f1;)!suc z?-h%KJ!7r704qen4X$7EeZhY(9Ae|zlf2MKUmwvp*c+I6{1!=fCFb=DJ?+%pH~ntK zEESh?_vwtVB&ji4=sf(i&)+2G5h!35opr)VGab(hq;%iyk(DxG|!c%v9k1>+vc-{6t zS#s03cpYSvPL`D$+g*--~aZt_0jnuOBt062U`MbJG1KwdEL8IdNJ4yoLW*9;QNy&}us>tLol{|dy z=Gx43m>79`Yau&F<E&H||M$+?7oimz)H9Z*0Tom#MDI*Nz@jzZo<+8zYmJ zmQR%~`*K9r!&`-Dw+L+TOf{Kp0&Umx1%#SnOXV8V^bsn0xSbpkVVkw7VZYm&pFIug8;4G(X>E==N>}eGWe`=@$vm>|A zvpT&hopGDPhM4BKHu%Q03m%qUXxIf6c_qr-G>S#BF7RruXDfbl7F5x9{v>dtUdt#`gZIk{a|y8uD+#oU4*4qCC&An+kF-_^ND?&7=`DqqUR| zEj3i%TqTm_=M|s;wZp`SGL7TMxx_B@Uf>oaCr!r^Yi{aR^tq%d=WD;#UN~6tu9)?D zKd1MLaT%*gQ;X?oE!Lx?Y{)goNTb=u(Ec8-aqeBD1`|(;#+Qht`N{p^DHCprGk|J% z&f=t6R}{!W_hXhSx+*Hf9WYx#K(!&x^m@)~oSKHjC?$SQXs&H${tL+C6& zPml7N)2?NwjY5qYYhtST+@Mnv zyvrZxK?5vA>!rq9QH@?K&{sN$@>A?`U1xIJxJ#S|vN2uC za22T%DK8M$xNkmc@!)*4q)Z$+UwJA%og7d1}9kHbycx^ET+?kW{W z=tOd#&0qDI06mx?Cy3j?YK7)h@JidDKyKy+<9SJ*EAuGW$%bUzl{1@ntj{mlu0K%EEl$h>c)uN5r0&7^Med=zY1{|tKh z?OLj73v7YxkvUW+_v$%XaOx>qdJfnBF|c>x<;%KxljFVi>qOwk$(edk#gr=_x7BRi zD=hwQ4zyo*K`+%<=*1nrDbh;}7e(O7j3t-EP*L0>i5NiE#9sTjhev4`RE}&~uu<~sQZ9SQg z7d6eD@1keEIw;_KoB)sY`sv!jYFyyD!|GSKn&*PuVoN3-k0M3bT-lHEE|t|C-_D`c z1KZO^Dg+tEERS?RB%WmHjKl|*g_4%;`sf`2ADVv@7=b0QLEd?RVm1~Xb4mG{& zDE+}MdHbVt3qgaczos8K-DSFyGFI+Rre!A-Jg;DEMQl@BJ;|J>x9$~*D}SK3uu*+j z{I}R8w|oTq1I=R2W6CcUuxX<$C7RzntM1DJv~1Y0%4X&(JgR-`k=;6!6W%LNvb{S( zPovCY^Ayjsak5uQnm7H}p~YVqj+=`ceOttXxGzO4Ij}nenxl2OYT%ZCrPjked5Puq zQVZo~HAMD$K)cHFa+#uVnSLCm6`O=-jc|NA^JtkIzh7Eg4U}J9jwT`C;ox!!@;`X( z&pajQL`_4^WDn_`8%Vi)B@~gUP-Dm;6dD;OdSGM7$53f+DPNQ4<=GR;EMX@q@viuc zzaV;~b};U`j<{Rxhm2o~nT(&(|MH{q?w|9gNScb{%5|f5jGvqTyiaIzA}jOdp6S{+ zGD!-u@zcBYUTMAxVm)L-9>71)K*VgWk1 z+=ym7b=}GS7_#`Vr6$W)Gp4`t&+MAXB{jY_D;QEV8_ebJ==JdX^oqF?RTM9cVYMO&i7)W_ai18Djup)g87lZ!sbU)6{o{CE8wkK zAC`X~p3I7ui|*1i-_vwT8BHNCE^qmLaty=rJ-;X6<&@wOjqCQ*cw{*|tnD7E*XpID zQ+wexwau2g+3b%psr3kQ8@YwuC59QJRuQQ_(G%D$?(CMF-xL^+wRBf!JlDxP4%Shw zTeiuz>}G4X4n@P~ZJljI=H~Dc{kWhQmo2Y#{oy?~N8S3|i6CJGjXx%<4YYEemKU*s z1(T;ITA!xoF&}unu0%X1;&FV6u-(d9mOFFQO8I?YPjhCbMgF&x{zD(H#tsRl_pO@T zX-rY?`CH6Nyduu>hZuZ&6qB}#3Z>3@Hv;!_8k#1CqK!&xivSqjMkTkKRYZtNcMy!6 z1=9hkWsXtR$!Lg42UVwH|4jW~X{_DPR5Xc>BybE-UfiwY(D=8XiMX;c(~dH(FKGgN zCf;Y|Bn}1jV#8kV{hW<7q!rWY>LKSz5Bmplk)PGuu3@Q*y)}_JO}AgSrb?mst9@p1 z-G3AKxS4u~Q=?;#lD_oH8>W1P@B@FXqPel5o1(NKf*4#h1=Z-qjRO zwVSRx>w%<{cBgi(3}QmDNsRKoTMLHsEZ;Zp@@PBR%W|bWE~H=2b1q*yvCuQY#l&q& z_03(a6J9Rdqnzk22Ic^~8<~0@^WL)iwH?_-3UD2s?j2dr-E9V)q$AGB@|Enk3xJ10 z=xMN)qX)Tgzi#c`ipo{)QuVRE+a&o;8%+a;ZD=fk%_+X)$hT$oEs2nBRS8W738Wf) zBENDTmpRpCcl{ICaaGn*%j-}qnf}`&{kPDM^c2xfl*fVN?*uX`G|u3OszjLw*`KR> zXRV)CYL#+`+f|laqrCbb{?w#cpIuT_tQ2}hvC2-CDS2AE)u*pzm>H~$Uat>q6ie$5 zmwN2P&T8VqA_Ol;^XA^#5jn_pR-3q;#tEEFNw23>Wjg)mf?~8~46_#v=htUBI;PDx zqrmbRK{7b`$LVXGP77xZvgN7HM%QQ?+D$&w58-y>-S;TB=O>9Dnk<5@IvSr=SSRu) zv%;5-&U2f8<{KEghOh|N&v>SKjee(x@OiQ8UD+-sj{D5J>Q$Ss`aOPaf;XzjQ>Oez zWIA4?Z7(g_gQBy6L^5aFmt22n?{r<)_UgUtYEtg4bY&L3N_Y%jSiUlnw5?q2pZYFU zQEq8F?PPFz*3E9-68>PSa70Y5p(F2<$Z0gvue-SnjYmdo$^&0%x-Yg_47qaW*NV5) z3A5KF)Ypz>eJhc&T53GC>&=$MKVKS>a}_L?elC21Ce(si!J68dI5|6-8ru8=*%?{F zvhWZy6aNG7^TRTU8akOu+Sxi2Gl|KF{{zrTvcfWnn>rbPQ5)Ji|ATTO)+YY{(|*lU z_Hc4GwUMzkv-=mFf}@G4qlGPin1%IAk`gSFk}1IAO9u~P7PfyQlwIuYtxauAzvME* z3JSvhBV5H!N=97H(4Lq{#^h_j!r23s=^yF;=;CN$?`-GzFXkfuXy#1J!@>MD%g|oh z)B<4cOw7s2`5&#Fi5XZ~zig1SHUu~kf1&?jA}VUS&3OV{}&@~ zXk+?+y&&UkXl-FEVhgY~{Zf-j`O8K%Vit~nPf_u(|04gt3jWI!Wfvpoe~taOL;oTC zQs;l^VVTs4S-AeiMNp7f7nVuF*4WPEAAkLifb`z9j$m@^a5U>-I2ER()aio@)PY`%ogYR{A}$ zl)+{`aV|xcq;+O4HPF<`0=xinj8@TRRZFi+7`ZOm%64X zHZn4rw=kL&5uE%v*U8pa8pW^n^77Hw&wJ~%sz09m&l&=L?q|s zz!EyOA+1^5U_BxE-b-D&=1)-^)WUVKv?Z*$ z>19MBUZ0nWk;zd1CJ@BtaAMP-Q*s|?R?$%7t9Mp0|4kYTH2NkfjgTQyM1-&$VmR1* zX3>q9vvzEUE(|*fu*Bf?5XUyt+?!DwDXWnnR8r4`Lx^0eHv#GB(GfNR+wb*}ls~TB zk)5*-2G7i?JQe45rTD*X$@T93`Azat8lLo5jI@@PZ?kQyU<)31ztS9XRO->`v2fU+ zSJS=_deCatYR}1;4Sx$N59I>5GCbqgygeZQ)D@Ns{tB^@r}8p;URN9BgX6}8*zY2B z+`S|CsU#WP(g>&)VKfBirQQfs3zxXEkc56-pAo4Ci{){S&x)uyxDXrs&2ePvOK~Rz zd6*qAeQgf;*>OW-9n!;bMEgP4w&i6`)m?Vr#4e^0cLG{T>a7>)Yq0wnh++@aqd*E!f;8z3QG}UtKUXA-r|GZ`_U~ ztegkch?VORf7RagbKYIAkF%4iogsK{`k$v9!TEr3CGPhJ!x>Y4Udw-;&q}U3$X5eD z_=hdJ^F~3}#7Xxb&3JeGhI|#vXJPM<;b;mXKMX~)o^hLUwn9ChDhn=kRsPsXHbUUN z@bnVOZGVQS!ALee4M$5+i!M9r=Vv{$wy8tY?r-^fRf~>4Da^_W`qMtE&v*w&(fKZP zc7I#m0=v9J>`=i5&pS0(7JlQ!yobRtC!!ML-wKetB@*lX_MZ3qLPFtNTA?7}6xPf3 zt%K|4U>!7sfM;+oT1q5R5zbrfEOrm{{_jWif`8j_X=8%IdneQ(82<37P;19$MvTN=0Set)c4He=+h5RGTnB>UtX4loP-8bLaP|O-1ukQ9SFh*$V_;2 z{Wn$;G+{PY@Fr$+3AL|Vo2VQS8fwUV0v-@vY-ducK9yu#zL>e6xP4!_vqz#hAZ*wZ z;u-bI)NrPt6OyYSne)*CJd0#+kDfp&4ta!+ahPub)VL?dFVq9_GGhaO^}3AZ`BrA?74~66Pp}X@w;qUW#^SY)$YC&~4fM80L_DDdrS?s^+R^m*yN=2v?|0P}{gr z%Z1G#%LOj=MdkupNcP|_IDL66?lc|f#2ObXWnX8n->wdiSpCxq#zFO_wlR((S5TZO zI#9P&k7)g~X3YGvaJq1H30@&=M6^Nlf@(nB89ETRU5-5cm%-n#H~nov+AwS&-N`yo zw&jk@{JFs2zP*FJgKaa-GJygEZ9(1X)}ZY1Iv8BBH;1;*j}ZOcn4jqG==|LZJB^46 zJF&a)Y@pk6`n_fZKrSU72L**63tmBi)7!PP;2=Z>S0Z-?XFhj$ciR5FrdK3)%za@v zZv-#8XLd)AM=1Vr`BI>QkuRVRY;EA@;oV`bg*hN@1)CslMZ+M1p${M%;8(hL+@AQ` zdQC{%f_D&oR5M8+c@R&CxWeEdpZ*^pS2TC*ePy%0{;#ua^}U4vY;Q~fxGSDJ{=UOm zI1qi1Cr(~}M36VK7qY&fBjP@x0xZy;aJ|Ux5Is>ps3!oFz9bX)8=NQPHr>(UO4gAo z6jFg0h`v}Ys5e13;uXT38N4ghmZ%-LcUFIIVK10BbT^(CL3b1o{E6@dudkQoNzjvM z8~P|{#p+1R8GG9hN=TFl{4Kp-VTP(+?C9GI`gYk7bzjlZCCKO0HsGjnrSiz>j;D`l zMhN61sGn&z4J59>xL$om{fN$Azi1aEuE-DUjp_wzn+xPKut#DGj6Xmgx}k#=^gBHe)4k76%;^TSU=c5z3ev3i*e*cgJ`v_u6m96^Z2Z z)IY)b1819>Ss+w!GczZ5P(`EG^=nFJhyY8i4mvV6I=m)F#Ieb7BBh@idrXWtxYPt{ zYI=&AssddHfhf&nDP9X)(KgnWgv+eHzeB3gsN`~4o2$Q$0RiSO(Vy4iGdXS)L;@4_ zaRlbew%aNzxxw$ppUumC;6BJlen?I9XEBogABcf!I?zgw$RlHncMxvBs0NcRMsN1K zP6WDhn{z9j@XMYx;7MF11Um~6?}{7;<-@6y=~#EwtM06W>HN{_6`|1Qu3-oGxR*r6&~)eKU!F-}qYv2F*BdA#%~ZUfR2$^n>h{0vU2cA#)je zUM^k||E7)-Al&2V+5Hy)RY0o0XGyUKy6ZjtxZBgvKX&zkv@H$vgnpa9pX4>reNn%B zO*b@r^h6EbNzO^`mP%JBs&jxpuDw&F=OadVD>zW_0v(v*1}f z5DaF))DAi(x_2+|^z(2v0~yd0A0qv3K{r5OJzRC(e&}|N>Dc7mpV4oF&xU@hzrPXA zXk2$BgWJ-Ow$MWlw`|$u>EAx7Bl%k|g`J(9X@k%();G3$%a*Y|&)6;9TW0NzZJh1% zSbSS{w6tvLZRqy&qlq2;82X>MCZm7swVnNz?gjV)cxCz?V<&e6GrU%~i`Prv_nN&j znhgj28z*%r#~w60V<(aW{?2~VO~2W%e&cAP-)vOBNnGCTW4IpE!DSG*amy56%cM|; zr(sKXe8BOZ;paQ*Cu0D~&3-syhc?uLTc(Z%0uVHMhYxR_v_r<5r-VB8S%B3yPwm)A zFd5T5x^qV^eAlthgOJR63GJnw^uR+8=$$6RfyB_IXpr#X9hD#EBT@XK8f^RJJn94y~M_oUswkkd^UoZaX`$wou0| z1A@yKga?hLTO7s7Sf{wA$Zkkm0G%B^PlKnYU!K^pp>x5O?oP_Dm(gqbF@@7Rygp06 z$MvU-EtXFyg{J#E3}j2olzu*+-cdI^Lzi?0(46)T1=6o@aVFfUvw!1k_1uiiPG8cY0WM|Cy(^P)UE*o$)u%0o zr_sh1^>O`k&igbNeLtQ~A^T&)-%*8p%JcdB_(QkM*b?%2ect{o`r!CD;Lw!W$?gCn z*+xh5B$|p_P!S#{r?-Dw_D%aY_|5izdf#k6{$|YG_08Ac5cfBDFD}>#-FxwnUGQP9 zbKrX9hMk~RJO=o#6^}+;uoGN|i@~*b<2+P>b5T3arPtM2v5bQdM!0bhkAeWejYr{H z2rk@sBz(5OXYI~llY1|A@BE5>WbZsiKeBe>kKm!1JNXzK0Sm?4bs1oNi*P!4dwPE zb^CW7-%02xy^p1)Rk`c2x!v7PTHCtX$kM6!?x~MXC6lJ4@{^}H`6-hf{J7@H{MhDd zzOlKCZ-TwKvWBk>mhmHlBl%H5FFz)j#g7h7=IdaWVGmZ8@nz*be0gOBUs*Aguc*xC zU#&P?alC@t8~bY4?!2a|y|Kf)c3XV#`IT(ktu^H*MW)mM_y9Yp60W!JdQI^G6&!@bv-W zc|m@GpxGGBw#+8-tnIUic{(n!Tlr#p9`Co;@J03%zR>RA-S%wW>lwp)?6v%#Tn)S{ zqmj>W)$%TT8SjAeQee0?yNkEN-fPFQy>3jE*;M34A~rtP;x;_n;@0hNacf~023p+w zA6nepz7{umqQ#B(w7AjZE$-)@EpqRFy2$+pxqZOveqx{3{rDcQ``PE7H$J`p8RNho zo-*uv;z`4v$M+g60~-g3yl>+^V%`(n)4Hc`4{zQRfaX$YKE3CaJ+VEKPFu|zj07AI zj)0;j69o{|81A>VAh1LIDInG@Q%3J_mib%ydnS**^1AD?`fmZd(!VjQ6I6c-STEd< zukY-aTBgLC$WONwD_5-WpJ(gm8v4bC1+)4^U;PStV4?>mF!`p2elu;Gef56aZ*N%8 zZ->_RZn8q%{43&LDi2}+tvcT`=~z|*r0tpXycIK*13YsDI?wqlzxPCc{Az!iU(6Qm z!g1jczkv^P@6(F6*xzFxMb|`oqMh6?kQ;o!Tfht52l3Qj68_-;L|t@S4Zi7qh^3OZ zpF@=T07O>rg72tq+aUUU7^1@DZ7b`&AEL@fs80+L9D+FcM(F)D#Fb~ar4U2k0P*a0 z^g7Op_dQ4KSQ)|R$UqL^75IAaVT(~cngNmir4W1XLzYpR{x)nk1RMZ2#v`^WVffs)@#LW*vIItAjn_#@RpXYu*Ctl)3 zDa}{U zc>pk+b!wvkfh&BXjWo<8=r`OUju-9h>U`NjM3K{AvsTs;t{748kT2E*j+KW4$HFLB zTOOz#R*E?v`^WMAEBwEKU9?C3K*rFWj$%a&j1N#ikJ3;B`bb`?HK&_v4W*9Ktjdy6 zBU@dKS*`VJGxdw|x`XS5)zW(N>a2Bny`y@AT0s(v#A>_b%(55Rs~y2YLs3?Kb*WUU z1J_a4Y^bxhW{$}k>lyE@E2*oUBy}36=PeZGNf(*Bv$BH*XO_p8&QU`)!j@XiJ(O-N z){YW9VC_<0vkG?88NSAZTbv@ni*t^R9f9jkB{G>_!)Mxl$bYE5=&BJ60YD z)7@%It+Co_Y68as$DoOV!DB)AJmwETC;Sa74To_USLFM0M2Fp(T2+;TMNuQtgYvQ} z?68X(>>DDAzMS03imK|Ws_OiFrBPnyq~F5X7<#MnE4j2~9Wz$8UOs#7v(X&)D0gP= z!*_-s#}}2=;&tDBy5e}>tI=Z>KHq}Mi)U3hHohaQs2)V!j~~#aL77BIBXU$D&`pJ%L5AG@n!zaae~7Yk41YpGhE?7 z?eZ8c)@ssmx~70D5L$5)*Ce!Rx^S0fDPF4S!)wSIu}@>uU~E{&V~IWwnGIlx+RO&6 z7NDEo?6jOX=Jx~UYvGAOcwiX&@`=@At1fp?#1e_JtVOFyFV~y0+U~Gn-mnT`Tad>*uiqOxv6~KFy>^Pf9*3(@#0DS2&`6=X<${*cOYr;Qwgfls(&#Hi+RBZD_jf)^pR z(buD%mvjw(T)z=#K72neSl{<_v+kv+2S)xNSjD?gDZyv}TZx54HVcM3sPqin$z zNn>aQs##2g;|0BFEYS8EuptmGKbBfk76?<;r+|__3~yEr%pWKZlmp*mzdwvMc`3dW zVMtzHwZN5gd8q=wOpe|n{#=OOT8DoYy}S-D5`V727s=5pxJxd6GrA2gcwA>)DTNf2}>hbrZK z7cRnnQi*Cv18M^Lb&?)1MlWy%VEc9+ECz8wgblA8K$a6_0Y*;jOCiDN(VHH@S&?Pr z20HrN$S_Vzj>0`XvK@~$L#%EVT2ZUeg}MY#umsRW2YQSSveL_GBU?!?8TJ^xHUi*F zHXhF&(vBrmg7?NglXaAz0ub^L90>c5p&(rA^;ygDmtTJkXXDt%(O0<{OiHWdJPsoP zJ8>Q!j+#+DZpZWSCHN|=!#2VNU^G<9=paxq5QZ^qIu_ovA6^7=Ga}``CohWjlLMN1 zY6q^4eZ=1&d<}H)p~vN%DqN$lFpRK`NUO+hz|H!4LyN5?tv=h}Xx0*MGp94x8Dl5u z92J&P2$^GN=uB0-ePWNn00Qkr;Joi<;z0$*sna0ufL2vm zkq<%#x>?c4pg2G&^EaH1o{XOO_bIH!hJQ!@<4aG^^{wrixjr{1-I?oM+cR?m`8>Kb zdNtmFx8UpW`e@&o$0ogZ`?kXuPPp*G)^T55|Et%gTsZkcARcxCpVSI(Av5~(E~EM? zCbeO-uy=wUXw(@QZg{|x5h-m>ZOc_5VXP<`I1|@|C9~CSB?57qvDs`eF>IKO27}mU z@{l06l$(OCrxyByNSSwRww7M=2}Mx!;O`uU{)}@#@!+`85>NkS*_X4?k+CO zhlT0dc57Gq%#3hmS5{Z{BCbcAYn|;_n%zrQTKimmnSI%L@KT@creh~mHoUZj%ocNr z6v!+!%VyCmGggxg@RGDmnaCV6oAu*T2yu_YlAB0%x+G4OR8EzhA<64x+S|ztkdvpl zb5bm()0;Y-^l46~=dK)cjys0{&TsQtz5}FDz%T_!wAC>DfxAG_I;@oH#V}xys(s3V zl>Mj?D5v2dGx+f5KczN{S@>5q9F@gE;=%Y^BxNA?tJ3C zzLl5DqhIq~@ctj#ZXP{qP4mJRrc%A}AV}&4!1qXWT<*~8g@8-%2o&n`1BJD<`bzt- zoQl9WeS>{W&X_YxJuFD=XL6x+*THzkrOm0O){AtRd&h-yod%5;#i_`MlMPC#!kNUDYDRQFZoE=b#Imi3_|TrTb%x$O0$4*5nD6qjzEzF}XQNh$|TIsxQi7sM1gknN6LlBy20Y6GhcqBbN|Q)tx& zRvScZNPutU9JPVf22mPvPKYqizrVYj>U^s)Q(HfhvK>dbv+ARp2 zhU285u2o0C;<(L3W8j&812lrhx3Y$TPah*$%>jB=)uYQh2PKG|vl{@O?x^Re+J zON8I=$Km7%9s8Kc$K}>?uNCvV-rpaoCWrREADt6<8s8TU<=idTU6UTDVABCmFJ`T+P%{fuYTlm9x`A zdERk(Vm2}B+<-fsX`HC@K1fpR z2}wx{*}ceQa{>t&AoBnwDx{oh3P5#@W#w#m|ODY2uznsx=-w1AFq|P7muH7?!Vh4U_!Bcf( zTgr1^uV^kP^RH>0u*j3|PBW0$qtTT-UszH7NZfmPP&kHiP&Im9E*FhXV@+Q9u=48W zywStPRCnQa<3!Iy?_BSyVI~(>*qoJ;k~%JnGm}biC0xY;+Ycz5J)m!pO$+|RS7#jw z#)gP76QY>5Q0$^#)tGDCH6)-4RX}kmc7+07EnKySUas9XTyfKx$^oUL;1t-5x)8P+ zz#~L@G_J#TM6sApDl2T&Rk;*p4j;uL(x?d3oY%d0F#6^@7w>Lp54VLouyfytiG{k% zWh35>A;;AFF6z2*d`IU?)xn{?BinA8KuBH9(2IgMK7c>@B>GYPm?_xy%mG|>$+AA3 z@o95L^xIF%D}9wCpSUi(uEb+6C~_9M?|QtlxNryM=-WZd{1P}?L~H7-;7goL_+KQc z&BabDNR`V&TC5|vxCytA4zd=cA0zAmZx@_DZk)go$t=00^@QUPA-tLTjXZT;K@x2= z00>5`H324!$H0T6yymBVB)AIvFC#PGA}^om=T7tAoHhwLkJ2o_y4VN&uY_+=Ix0Zb zc)>oD56Z;|G|1ZrHeh$`0bVJ#0VI~Mn4AFg`J&6?OV?fdi(|juc235zkPme?& zvt7)JYuQSx_PPDbdsS-!V{8GGzCCU296*j-mobAtE>gvfRvvSuQV6cH(v-i0y);K_wza z^lfRyAq17Rk=l631ZK1x3~4!O{u(w;##yKDqbX#9jzYA2Q~X}zp@J-+ybc#LvO8y0nnLSF>v`eBGC><7!!pOKDn?7jOX4IbbBS2b3!*3L0gX9}C0- zZJG@bZaqDdznAWuX?tW~JH0yq?ig@jCi0+#awGNYbM0JZS}SSgT7~+w8N$@Gh5SNG zPuj|~m6-;qSBtfxE8FR`Rk(=cZp)TDez#k6_d&nep-rV38kDN&$zv>ONCWnA$~H7{ z7-nWUtXO4@!)N_|RN%zmwsObD)(pRC@~*mDOD~XbTf6v~;kvPJcfb9g=&C>enO`yc zwh=WwfsgR8ypEEJrR~d>*8BdP;Xich!47D^-~8Jy>RmHV=hX(F4ZOaS zEQS)*hK35tTG|>XHfV@etCPqkz@{B;qt$Vnc+A@cLEIp&&=9UdCsTh;CsQ+9s*`oS zI!>q6i5wQvEEd!zNM-{D|B@37C>PbB(IA)$}B}@?7gt@|cK_m3& z!J~l~3UHQ6EsMW4Nb^h}ew01H*$eOAzhC)~_A{>!QFG(KX)q(kJcieONhB?sCII^4Gj(#OuS%kZ+(p)K5lI&!~WmNJb z#deK}-VsQ6W;Y!hG~QLx02+zPxQ6;l^a;@Tf;|Bm|71^~jXjM1iz`_2gl!SOzbvdC zvWQmk&4Hui)(AR|F;6_s$v%*;T4b`m`l{8JmJ{^^d$alG%od&f;4 zw>Wg`Bhg*C1%a#Pe2G!`;y_?XUsYr2)w832!s2BQR1UAeFD`wkdh~GNP+Go!)67M` zERozV5x#0%YKAd7IVC&0D{^~iQC_+^@>WLfkRIv{t%!Xpj1|5F|9+d?EMTKnv^#Nz z*6zr2R5`}jr%N5W4%2kY^nz|~mc5s(Huu_7oK9DTjT9B-SBN?%S_b|$rY?7&I9R;2 zSV%VSifiw27!2_~gQVCIOUPiSG%#dR%o`T?6*N*i0vN4jK04hg>heUzHP1bdQ#r_m ztS%SER(CdyyrKQx=)Y%oFJ3Ua3mflW^Yu;U_1|n+_E=-XgtjqbpImUmsU@bxX+^0i z8PjKV;k;+};+&pY^Db!q$NZVi6IwpK<<5^A$2HELO|>4Chn*k~CX|IflpQs;X4^ut zz{op+@l%2ES0ijr@IJhh*@1M7YenX1?~Q$&aK3jlGeS8l&cr9EL;%aKber7)x9skA z^QkK8QWIR8`hSLNv(IwvF*O0m+F{k6DJELsQ2wkr2AiYs;?5m6&pZ8cbTeN0F2+ zR^^-X<$U5&5$aMkj?1AnB(g_}#&L$UHu?xH(>PiKy_I%BUL04+LcucQ<$$VyA{^z^ zBT;4|Ko{|GMPxx#PN)`QUMsTFj;d}+OJyAQ@i69_QdWu z@{cOqh9njBavnR^#wegLaSB8I8jw=iIMK*SoSGHlR5EaC0)exG2lX0zilFkekl<;7 zJw;GiSx}jqHRz*ggYmR*j?gBVU9|%RYlF2wre%I*)`xO;IlyvZ#DPfqfdl042go~- zA;O`^UeW|uy&BZ}n@lI|uJfILc7e@0oJAv-)aH}C7A_I)=7O>+6FD7Mh9%ZCD0^>O)3t}qJS<7P?ujx>1oopWRURozo@s#aqtff3 zA;_DN-OoKo#y|JmHvXP%+fH{;?Nl852l;||a@WeXMR)@ywsHrj(da8UZAywQ?sq9~ zX;a^9SIA~(Mk~%2r&L+|N|nX0R9SpiPFFaC@dRN!aY?E<6^nD7H1C!qOLPt`q69J2 z4LT>sMg@j^@%5idw^!*4*92!Qab=jJFA$6`fBp@tVV^0xXh^}z@!Z_I=v%!^e}{|7 zf=OPPu5HINzX#c8(h)So;#_6O8`?WQ=Mq8Iqa&ca7ra@87>JlE&}Hn=I=h;WX;$FI(>QVh!VX zT#kiR(O6{HFM#J?KOUJ+ZoMn20T=(@oHkOg+O5@qLji5sLpUDnF7uyR)*2y=S%Z1? zMfrs7<^N~4_lvmg6$iT^*75*zl$pt;^JS~gOg=z96AqpFFg{Y@I~b_}Z<8zAb$B=# zE>!83l5TFP(5>quy+jSv5*Tb#kRslQc2&WYZBD}0dbhDNGvp>YMc#N0n zfO!^`f$`z%`Kdf?8oidoU}trDkXdH94Chs*r(`2D^LCW2s!zE}NvtXf6ecPx*N

hxg$km`QLX9zEE9*ui~zO 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�xB6P-Nf>7PxXgEwq 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≧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 b0FT z?MPR5FkR8k5II-HDzNrl98L?|ak;z47u8%Zp14fTzJaCJl^Eo(_b#>{T-I#$g|CF6 z_e;umOx`p%O&rs)^WaT`bFnwp19-X|9*T)|J9hSucG;KNuT!GZV=Np@p@{) z@#=1y2w!n?<@Z-#U32AkGG9&8u{#+qnXJNfFn!zJ3>ezpyl@7(3;TS{#d`PIn!x

j7uVY_SGHZA2`mdNy8!;qw*N(X|KAYi`Ka{9 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

xPW}F^zCc?^ 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

1r%e8BJYKrl^er#T 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

$ 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�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

Y&|$K}hshYID5x0zkN@p|fY2T# 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%0DEobuN^s|zj{0Zq1DEHxah{wm&?r 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

X@Byq~zP0aFmE1ZRkiPzc)$QhpnS9)MPrB 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�HA44~ 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

de|(kSLs&t@ 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 delta 86019 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 z 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