]> git.quilime.com - stars.git/commitdiff
install
authorGabriel Dunne <gdunne@quilime.com>
Thu, 31 Dec 2009 23:35:13 +0000 (15:35 -0800)
committerGabriel Dunne <gdunne@quilime.com>
Thu, 31 Dec 2009 23:35:13 +0000 (15:35 -0800)
intern/Global.cpp
intern/Global.h
intern/Thingy.cpp
intern/jttoolkit.cpp
media/move.txt [new file with mode: 0644]

index 7f3fa2de3a3b8e4fbb74dee46369b55a1a39da31..0088d85c44f61feeef36bbf911050c3ec9645076 100755 (executable)
@@ -20,18 +20,29 @@ Global::Global()
 
     glEnable(GL_LINE_SMOOTH);
     glEnable(GL_POINT_SMOOTH);
-    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
+    glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
 
     for(int i=0;i<10000;i++){
         thingies.push_back(new Thingy());
         thingies.back()->z = ((rnd[i+7] - .5) * 100000000);
     }
 
-    hideMouse();
     
-    INC = 550;
     
-    toggleFullScreen();
+    movecount = 0;
+    //toggleFullScreen();
+    //hideMouse();    
+        
+      ifstream infile("media/move.txt");
+      while(  infile.good()  ) {
+          int p;
+          infile >> p;
+          move.push_back(p);
+      }    
+      
+      
+      cout << move.size() << endl;
+      
 }
 
 
@@ -43,23 +54,50 @@ Global::~Global()
 void Global::loop()
 {
     vector<Thingy*>::iterator it;
+
+    int MPOS = move[movecount];
     
-    INC += (704 - INC) * 0.001; 
-    
-    int cnt = 0;
+
+    if (movecount != move.size() + 1000) {
+        movecount++;  
+    }
+    else {
+        rnd.clear();
+        for(int i=0;i<1000;i++){
+            rnd.push_back(randomFloat());
+        }
+        vector<Thingy*>::iterator it;
+
+        int cnt = 0;
+        for(it=thingies.begin();it!=thingies.end();it++)
+        {
+            (*it)->resetRandoms();
+            (*it)->z = ((rnd[cnt+7] - .5) * 100000000);
+            cnt++;
+        }
+        movecount = 0;            
+    }
+
+  
     for(int i=0; i<thingies.size(); i++)
     {
         thingies[i]->x = rnd[i] * width();
         thingies[i]->y = rnd[i+3] * height();
 
         // position
-        thingies[i]->z += ((INC - (width() / 2 )) * .04);
+        
+        float ddd = .01;
+        if (movecount > 3000) {
+            ddd = .005;
+        }
+        
+        thingies[i]->z += (( MPOS - (width() / 2)) * ddd);
 
         thingies[i]->step();
         thingies[i]->draw();
     }
 
-    glColor4f(1, 1, 1, 0.1);
+    glColor4f(1, 1, 1, 0.03);
     glBegin(GL_LINE_STRIP);
     for(it = thingies.begin(); it != thingies.end(); it++) {
         (*it)->glVertex();
@@ -72,6 +110,10 @@ void Global::loop()
         (*it)->glVertex();
     }
     glEnd();
+    
+    
+    //cout << mouseX() << ",\n";
+    
 }
 
 
@@ -86,7 +128,7 @@ void Global::keyDown(int k, int special)
 
 void Global::mouseDown()
 {
-    /*
+/*    
     rnd.clear();
     for(int i=0;i<1000;i++){
         rnd.push_back(randomFloat());
@@ -97,10 +139,11 @@ void Global::mouseDown()
     for(it=thingies.begin();it!=thingies.end();it++)
     {
         (*it)->resetRandoms();
-        (*it)->z = ((rnd[cnt+7] - .5) * 9000000);
+        (*it)->z = ((rnd[cnt+7] - .5) * 100000000);
         cnt++;
-    }*/
-    cout << INC << endl;
+    }
+  */  
+
 }
 
 
index 4693edf01cb3f1ca353eed02251559aaeaf379e0..e052019f4573c127f4ff87cbcc318b8eec963495 100755 (executable)
@@ -25,8 +25,9 @@ class Global{
   static Global*instance;
   vector<Thingy*>thingies;
   vector<float> rnd;
-  
-  float INC;
+
+  int movecount;
+  vector<int> move;
   
   void loop();
   void keyDown(int k,int special);
index c64d97229402c9f432b9a1d95b78fba16a667049..a5f3e45439da4c4ed029ae65f744041fcaa04082 100644 (file)
@@ -19,6 +19,10 @@ Thingy::Thingy(){
        dest.z = 0;
   
        this->copyFrom(dest);
+       
+       
+       
+       
 }
 
 void Thingy::resetRandoms(){
@@ -50,11 +54,11 @@ void Thingy::step(){
   
   // (*this)+=JPoint( randomFloat()-0.5, randomFloat()-0.5, randomFloat()-0.5);
   
-  size += (destSize - size) * 0.01;
+  size += (destSize - size) * 0.005;
   
-  float xx = (dest.x-x) * .002;
-  float yy = (dest.y-y) * .002;
-  float zz = (dest.z-z) * .002;
+  float xx = (dest.x-x) * .0045;
+  float yy = (dest.y-y) * .0045;
+  float zz = (dest.z-z) * .0045;
   
   x += xx;
   y += yy;
@@ -76,7 +80,6 @@ void Thingy::draw(){
 
        float rot = sin(ticks() * .01 * rnd[5]) * 3.2;
 
-
   glBegin(GL_LINE_LOOP);
   
   for(int i=0; i<steps; i++) {
index 59b8901c804da1143cc82e9778fd7b760eb342e8..42497b532a1890029de4f561742e3b991abd7fab 100755 (executable)
@@ -1 +1 @@
-#include "jttoolkit.h"\r#include <stdio.h>\r#include <stdlib.h>\r#include <string.h>\r#include <iostream.h> \r#include <fstream.h>\r\r\r#define INIT_WINDOW_X 100\r#define INIT_WINDOW_Y 100\r#define INIT_WINDOW_WIDTH 810\r#define INIT_WINDOW_HEIGHT 510\r\r\r//#include "gl2ps.h"\r#if defined (__DARWIN__)\r#include <ApplicationServices/ApplicationServices.h>\r#endif\r\r#define use_perspective\r#define VERBOSE 0\r//turn this on and off for speed\r\r\r//---- user-global access functions\r\rint ticks(){return _ticks;}\rint width(){return _width;}\rint height(){return _height;}\r\rint mouseX(){return _mouseX;}\rint mouseY(){return _mouseY;}\r\r\rvoid setMouseX(long xx){_mouseX = xx;}\rvoid setMouseY(long yy){_mouseY = yy;}\r\rvoid ignoreMouse(int state){_ignoreMouse = state;}\r\r//--------------\r\rvoid *threadFunc(void*stuff){\r}\r\r//------------------------------------------------------------------------\rvoid initfmod(){\r  /*  \r  if (FSOUND_GetVersion() < FMOD_VERSION){\r    printf("Error : You are using the wrong DLL version!  You should be using FMOD %.02f\n", FMOD_VERSION);\r    exit(1);\r  }\r  \r  if(!FSOUND_Init(48000, 1024, FSOUND_INIT_GLOBALFOCUS)){\r    printf("%s\n",FMOD_ErrorString(FSOUND_GetError()));\r  }\r  */\r}\r//------------------------------------------------------------------------\r\r\r\rfloat friction(){return _friction;}\rvoid setFriction(float f){_friction = f;}\r\rfloat frequencyRange(){return _frequencyRange;}\rvoid setFrequencyRange(float f){_frequencyRange = f;}\r\rvoid drawUnitSquare(){\r  glBegin(GL_QUADS);\r  glTexCoord2f(0,0);glVertex2f(0,0);     \r  glTexCoord2f(1,0);glVertex2f(1,0);\r  glTexCoord2f(1,1);glVertex2f(1,1);\r  glTexCoord2f(0,1);glVertex2f(0,1);\r  glEnd();\r}\r\r\rvoid  drawUnitSquareSlightlySmaller(){\r  glBegin(GL_QUADS);\r  glTexCoord2f(0.01,0.01);glVertex2f(0,0);   \r  glTexCoord2f(0.99,0.01);glVertex2f(1,0);\r  glTexCoord2f(0.99,0.99);glVertex2f(1,1);\r  glTexCoord2f(0.01,0.99);glVertex2f(0,1);\r  glEnd();\r}\r\r\r\r\rvoid toggleFullScreen(){\r  fullscreenmode=!fullscreenmode;\r  if(fullscreenmode){\r    glutFullScreen();\r  } else {\r    glutReshapeWindow(INIT_WINDOW_WIDTH,INIT_WINDOW_HEIGHT);\r    glutPositionWindow(0,10);\r  }\r}\r\rchar* trimLeft(char*buff){\r  //count how many to offset backward\r  int whiteCount = 0;\r  for(int i=0;i<strlen(buff);i++){\r    if(buff[i]==' '||buff[i]=='\r'||buff[i]=='\n'||buff[i]=='\t'){\r      whiteCount++;\r    }else{\r      break;\r    }\r  }\r  if(whiteCount>0){\r    for(int b=0;b<strlen(buff)-whiteCount;b++){\r      buff[b] = buff[b+whiteCount];\r    }\r  }\r  return buff;\r}\r\rvoid fileFromString(unsigned char *fname, char *data, long datasize){\r    long i=0;\r      FILE *fp = fopen((const char*)fname,"wb");\r     for(i=0;i<datasize;i++){\r               fputc(data[i],fp);\r     }\r      fclose(fp);\r}\r\r\r//--------------------------------------------------------------------\r\r\runsigned char* stringFromFile(char *fname){\r   long fsize;\r    unsigned char *a;\r\r     if(fname==NULL){\r         if(VERBOSE)printf("err: stringFromFile: filename was null\n",NULL);\r    return 0;\r    }\r      fsize = getFileSize(fname);\r\r   if(fsize==0){\r    if(VERBOSE)printf("err: stringFromFile: file size was zero\n",NULL);\r   return 0;\r    }\r      a = new unsigned char[fsize+1];\r        \r       if(a==NULL){\r     if(VERBOSE)printf("err: stringFromFile: memory allocation failed\n",NULL);\r     return 0;\r    }\r      \r       getFile((char*)fname,a,fsize);\r a[fsize]=0;\r    return a;\r}\r\r\r//--------------------------------------------------------------------\r\rlong getFileSize( char *fname){\r  FILE *fp;\r      long fsize;\r    if (fname == NULL){\r            if(VERBOSE)printf("err: getFileSize: filename was null\n",NULL);\r               return 0;\r      }\r      fp = fopen((const char*)fname, "rb");\r  if (fp == NULL){\r               if(VERBOSE)printf("err: getFileSize: file stream failed\n",NULL);\r              return 0;\r      }\r      if(fseek(fp, 0, SEEK_END)!=0){\r                 if(VERBOSE)printf("err: getFileSize: fseek failed\n",NULL);\r    }\r      fsize = ftell(fp);\r     fclose(fp);\r    return fsize;\r}\r\r\r//--------------------------------------------------------------------\r\rvoid getFile( char *filename, unsigned char *buff, int length){\r      unsigned char c=0;\r     long buffcnt=0;\r        long i=0;\r      ifstream f;\r    //#if defined(__DARWIN__)\r      //      f.open(filename);\r      //#else\r        f.open((const char*)filename, ios::binary);\r    //#endif\r       f.read((char*)buff, length);\r   //for(i=0;i<length;i++){\r       //      printf("{%c}",buff[i]);\r        //}\r    f.close();\r}\r\r\r//--------------------------------------------------------------------\r\rvoid hideMouse(){\r\r#if defined(__DARWIN__)\r      //MAC\r  HideCursor();\r#elif defined(linux)\r     //LINUX\r        //ignore\r#else\r         //WINDOWS\r      ShowCursor(FALSE);\r#endif\r\r\r}\r\r//--------------------------------------------------------------------\r\rvoid showMouse(){\r#if defined(__DARWIN__)\r       //MAC\r  ShowCursor();\r#elif defined(linux)\r     //ignore\r#else\r         //WINDOWS\r      ShowCursor(TRUE);\r#endif\r}\r\rvoid display(){}\rvoid display2(){}\r\rvoid _execute_frame(){\r  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);\r  glPushMatrix();\r#if defined(use_perspective)\r  glTranslatef(-width()/2.0f,height()/2.0,-height()/2.0);\r  glScalef(1,-1,1);\r#endif \r  if(penta_firstloop){//first time!\r    penta_firstloop = false;\r    font = new JoshFont("media/usethis.ttf",40,JF_BITMAP,true,true);\r    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r    setup();\r  }else{\r    loop();\r    //glFlush();\r    //glutPostRedisplay();\r    _ticks++;\r  }\r  glPopMatrix();\r  glutSwapBuffers();\r  \r}\r\rvoid idle(){\r  /*\r  if(glutGet(GLUT_ELAPSED_TIME) - lastGlutFrameTime > frameRate){\r    _execute_frame();\r    lastGlutFrameTime = glutGet(GLUT_ELAPSED_TIME);\r  }\r  */\r}\r\r\rvoid timerFunc(int v) {\r  //if(glutGet(GLUT_ELAPSED_TIME) - lastGlutFrameTime > frameRate){\r    _execute_frame();\r    //}\r  glutTimerFunc(frameRate,timerFunc,0);\r}\r\rvoid preKeyDown(unsigned char k, int special){\r  if(special){\r    if(k==11){\r      toggleFullScreen();\r    }\r  } else {\r    //non special\r    if(k==27){\r      //exit(0);\r    }else if (k==KEY_DELETE || k==KEY_BACKSPACE){\r\r\r    } else if (k==6){//ctrl+f on a mac\r      toggleFullScreen();\r    } else {\r\r    }\r  }\r\r}\r\rvoid keyboardDown(unsigned char k,int x,int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }\r  preKeyDown(k,0);\r  jttoolkit_keyDown(k,0);\r}\r\rvoid keyboardUp(unsigned char k,int x,int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }\r  //printf("keyboardUp: %c %i\n",k);\r  jttoolkit_keyUp(k,0);\r}\r\r\rvoid specialFunc(int k,int x,int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }\r  preKeyDown(k,1);\r  jttoolkit_keyDown(k,1);\r}\r\rvoid mouseMotionFunc(int x, int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }else{\r    ignored_mouseMove(x,y);\r  }\r\r}\r\rvoid mousePassiveMotionFunc(int x, int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }else{\r    ignored_mouseMove(x,y);\r  }\r  //  printf("%i %i\n",_mouseX,_mouseY);\r}\r\rvoid mouseFunc(int button, int state, int x, int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r    \r    if(state==GLUT_DOWN){\r      jttoolkit_mouseDown();\r    } else {\r      jttoolkit_mouseUp();\r    }\r    \r  }else{\r    \r    if(state==GLUT_DOWN){\r      ignored_mouseDown(x,y);\r    } else {\r      ignored_mouseUp(x,y);\r    }\r    \r  }\r}\r\rvoid viewPerspective(float angle){\r  glMatrixMode(GL_PROJECTION);\r  glLoadIdentity();\r  gluPerspective(angle,(float)width()/(float)height(),0.0001,10000);\r  //glFrustum(-2, 2, -2, 2, 1.0f, 100.0f);\r  glMatrixMode(GL_MODELVIEW);\r}\r\r\rvoid viewOrtho(){\r  glMatrixMode(GL_PROJECTION);\r  glLoadIdentity();\r  glOrtho(0,width(),-height(),0,-10000,10000);\r  glMatrixMode(GL_MODELVIEW);\r}\r\rvoid reshape(int w,int h){\r  //  if(glutGetWindow()==MainWindowID){\r  if(1){\r    \r    _width = w;\r    _height = h;\r    //      to keep it propertional & let the window stretch\r    // glMatrixMode(GL_PROJECTION);\r    //     glLoadIdentity();\r    glViewport(0,0,w,h);\r    //       if(w<h){\r    //         float r = ((float)h/(float)w);\r    //           glOrtho(-1,1,-r,r,-2,2);\r    // }else{\r    float r = ((float)w/(float)h);\r    //                glOrtho(-r,r,-1,1,-2,2);\r    // }\r    //        this->draw();\r    \r    viewPerspective(90);\r    glLoadIdentity();\r    \r  } else { //then i can assume for now that it was the output console window.\r    \r    glViewport(0,0,w,h);\r    float r = ((float)w/(float)h);\r    \r    glMatrixMode(GL_PROJECTION);\r    glLoadIdentity();\r    \r    //#if defined(use_perspective)\r    //gluPerspective(90,(float)w/(float)h,0.0001,10000);\r    //#else\r    glOrtho(0,w,h,0,-10000,10000);\r    //#endif\r    //glFrustum(-2, 2, -2, 2, 1.0f, 100.0f);\r    \r    glMatrixMode(GL_MODELVIEW);\r    glLoadIdentity();\r  }\r  //  jt_resizeDrawBuffer();\r}\r\rvoid jt_resizeDrawBuffer(){\r  //  delete [] drawbuffer;\r  //  drawbuffer = new unsigned char[width()*height()*4];\r}\r\rint main(int argc,char** argv){\r\r\r  glutInit(&argc,argv);\r  glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGBA);\r  glutInitWindowSize (INIT_WINDOW_WIDTH,INIT_WINDOW_HEIGHT);\r  glutInitWindowPosition (INIT_WINDOW_X,INIT_WINDOW_Y);\r\r  int gameMode = 0;\r  if(argc>1){\r    for(int i=0;i<strlen(argv[1]);i++){\r      switch(argv[1][i]){\r      case 'g':\r     gameMode = true;\r      }\r    }\r  }\r\r  if(gameMode){\r    glutGameModeString("1440x900:16@60");\r    glutEnterGameMode();\r  }else{\r    glutCreateWindow (" ");\r  }\r  \r  jttoolkit_init();\r  glutMainLoop();\r\r  //do we ever even get here?\r  //FSOUND_Close();\r  stop();\r  exit(0);\r  return 0;\r}\r\rint jttoolkit_init(){\r  glutIdleFunc(idle);\r  glutDisplayFunc(display);\r  glutReshapeFunc(reshape);\r  glutMouseFunc(mouseFunc);\r  glutMotionFunc(mouseMotionFunc);\r  glutPassiveMotionFunc(mousePassiveMotionFunc);\r  glutKeyboardFunc (keyboardDown);\r  glutKeyboardUpFunc (keyboardUp);\r  glutSpecialFunc (specialFunc);\r  glutTimerFunc(frameRate,timerFunc,0);\r  \r  // a whole bunch of switches for the openGL engine\r  glEnable(GL_TEXTURE_2D);\r  glEnable(GL_BLEND);\r  glEnable(GL_DEPTH_TEST);\r  //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR);\r  //glEnable(GL_LINE_SMOOTH);\r  //glEnable(GL_POLYGON_SMOOTH);\r  glLineWidth(1);\r  //  glDepthFunc(GL_LESS);//was GL_LEQUAL\r  glDepthFunc(GL_LEQUAL);//was GL_LEQUAL\r  glClearDepth(1.0f);\r  glDisable(GL_DITHER);\r  //glShadeModel(GL_SMOOTH);\r  glMatrixMode(GL_PROJECTION);    //       The Projection Matrix\r  glLoadIdentity();                      // The Projection Matrix\r  // Calculate The Aspect Ratio Of The Window\r  //gluPerspective(45.0f,(float)wW/(float)wH,0.1f,100.0f);\r  //gluLookAt(0,0,1,0,0,0,0,1,0);\r  glMatrixMode(GL_MODELVIEW); // The Modelview Matrix\r  glLoadIdentity();    // The Modelview Matrix\r  //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Perspective Calculations\r  //glEnable(GL_FOG);\r  //glFogf(GL_FOG_START,-100);\r  //glFogf(GL_FOG_END,-200);\r  //glFogf(GL_FOG_DENSITY,0.1);\r  //float r[] = {0.5,0.5,0.5,0.5};\r  //glFogfv(GL_FOG_COLOR,r);\r  //--------------------------------------------------------------------------------\r  glClearColor(0,0,0,0);\r  //also, if that doesn't work,  check if the users screen is 640x48, then fullscreen the game.\r  //#if defined(__DARWIN__)\r  //problem with fullscreen - it disables the glut passive motion func.\r  //#else\r  //if(fullscreenmode)glutFullScreen();\r  //#endif\r\r}\r\rint buildScreenFont(char *fontName, int size){\r  return 0;\r}\r\r\rvoid _draw_single_screenFont(int fontID, char*text){\r  \r  glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);\r  \r}\r\rvoid drawScreenFont(int fontID, char*text,int tracking){\r  int i;\r  int drawScreenFont_buffpt=0;\r  int lineCounter=0;\r  if (text == NULL)return;\r  glPushAttrib(GL_LIST_BIT);\r  glRasterPos3f(0,lineCounter,0);\r  glListBase(fontID);\r  for(i=0;i<strlen(text);i++){\r    if(text[i]=='\n'){\r      drawScreenFont_buff[drawScreenFont_buffpt]=0;\r      _draw_single_screenFont(fontID,drawScreenFont_buff);\r      lineCounter+=tracking;\r      glRasterPos3f(0,lineCounter,0);\r      drawScreenFont_buffpt=0;\r    }else{\r      drawScreenFont_buff[drawScreenFont_buffpt] = text[i];\r      drawScreenFont_buffpt++;\r    }\r  }\r  drawScreenFont_buff[drawScreenFont_buffpt]=0;\r  _draw_single_screenFont(fontID,drawScreenFont_buff);\r  glPopAttrib();\r}\r\r\rvoid killScreenFont(int fontID){\r  glDeleteLists(fontID,256);\r}\r\r\rvoid lights(){\r  glEnable(GL_LIGHT0);\r  glEnable(GL_LIGHTING);\r  glEnable(GL_COLOR_MATERIAL);\r  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r}\r\r\r\rvoid nolights(){\r  glDisable(GL_LIGHT0);\r  glDisable(GL_LIGHTING);\r  glDisable(GL_COLOR_MATERIAL);\r}\r\r\rfloat randomFloat(){\r  return ((float)rand())/((float)RAND_MAX);\r}\r\rvoid line(JPoint p1,JPoint p2){\r  glBegin(GL_LINES);\r  p1.glVertex();\r  p2.glVertex();\r  glEnd();\r}\r\rvoid bezier(JPoint p1,JPoint p2,JPoint p3,JPoint p4,int steps){\r  float *Xs = new float[steps];\r  float *Ys = new float[steps];\r  float *Zs = new float[steps];\r\r\r  interpolateBezier(\r               p1.x,p1.y,p1.z,\r                p2.x,p2.y,p2.z,\r                p3.x,p3.y,p3.z,\r                p4.x,p4.y,p4.z,\r                 steps,Xs,Ys,Zs) ;\r    \r  glBegin(GL_LINE_STRIP);\r  p1.glVertex();\r  for(int i=1;i<steps-1;i++){\r    glVertex3f(Xs[i],Ys[i],Zs[i]);\r  }\r  p4.glVertex();\r  glEnd();\r  \r  delete Xs;\r  delete Ys;\r  delete Zs;\r\r}\r\r\rvoid interpolateBezier(\r                float P0X,float P0Y,float P0Z,\r                 float P1X,float P1Y,float P1Z,\r                 float P2X,float P2Y,float P2Z,\r                 float P3X,float P3Y,float P3Z,\r                 int segs,\r                      float Xs[] , float Ys[] , float Zs[]) {\r  \r  float t=0.0f,dt=1.0f/(float)segs;           // calculating increment\r  float Q0X,Q0Y,Q0Z;\r  float Q1X,Q1Y,Q1Z;\r  float Q2X,Q2Y,Q2Z;\r  float R0X,R0Y,R0Z;\r  float R1X,R1Y,R1Z;\r  float x;float y;float z;\r  float xx=P0X;float yy=P0Y;float zz=P0Z;\r  for (int i=1;i<segs;i++) {\r    Q0X = P0X + t*(P1X-P0X); Q0Y = P0Y + t*(P1Y-P0Y); Q0Z = P0Z + t*(P1Z-P0Z);\r    Q1X = P1X + t*(P2X-P1X); Q1Y = P1Y + t*(P2Y-P1Y); Q1Z = P1Z + t*(P2Z-P1Z);\r    Q2X = P2X + t*(P3X-P2X); Q2Y = P2Y + t*(P3Y-P2Y); Q2Z = P2Z + t*(P3Z-P2Z);\r    R0X = Q0X + t*(Q1X-Q0X); R0Y = Q0Y + t*(Q1Y-Q0Y); R0Z = Q0Z + t*(Q1Z-Q0Z);\r    R1X = Q1X + t*(Q2X-Q1X); R1Y = Q1Y + t*(Q2Y-Q1Y); R1Z = Q1Z + t*(Q2Z-Q1Z);\r    x = R0X + t*(R1X-R0X);\r    y = R0Y + t*(R1Y-R0Y);\r    z = R0Z + t*(R1Z-R0Z);\r    //drawLine(xx,yy,zz,x,y,z);\r    Xs[i-1]=x;\r    Ys[i-1]=y;\r    Zs[i-1]=z;\r    xx=x;\r    yy=y;\r    zz=z;\r    t+=dt;\r  }\r}\r\r\rfloat absf(float a){\r  if(a<0)return -a;\r  return a;\r}\r\r\rfloat getDist(float x1,float y1,float x2,float y2){\r     double x = absf(x1-x2);\r        double y = absf(y1-y2);\r        x=x*x;\r y=y*y;\r return (float)sqrt(x+y);\r}\r\r\rvoid rect2polar(double x,double y,double returnPair[2]){\r  returnPair[0] = getDist(0.0,0.0,x,y);\r  returnPair[1] = atan2(y,x);\r}\r\rvoid polar2rect(double r,double theta,double returnPair[2]){\r    returnPair[0] = r*cos(theta);\r  returnPair[1] = r*sin(theta);\r}\r\r\r\r//tess\r\rvoid JTTessVertex(float x,float y, float z){\r  //first look for available memory before allocating more.\r  //printf("%f %f %f\n",x,y,z);\r  doTessErrorCheck();\r  //printf("1 %i\n",tessPtr);\r  GLdouble *p = tesscache[tessBase+tessPtr];\r  //printf("2\n",0);\r  tessPtr++;\r  \r  p[0] = x;\r  p[1] = y;\r  p[2] = z;\r  p[3] = 0;\r  //printf("3\n",0);\r  //if(tesscache!=0)tesscache->push((long)p);\r}\r\r\rvoid JTTessEnd(){\r  //FLUSH IT!\r  \r  tobj = gluNewTess();\r  _tessBind();\r  \r  if(tesscache!=0){\r    gluTessBeginPolygon(tobj,NULL);\r    gluTessBeginContour(tobj);\r    \r    for(int i=tessBase;i<tessBase+tessPtr;i++){\r      GLdouble*t = tesscache[i];\r      if((long)t==TESSCACHE_NEWCONTOUR){\r        gluTessEndContour(tobj);\r    gluTessBeginContour(tobj);\r      } else {\r      GLdouble *g = (GLdouble*)t;\r    gluTessVertex(tobj,g,g);\r      }\r    }\r    \r    gluTessEndContour(tobj);\r    gluTessEndPolygon(tobj);\r  }\r  gluDeleteTess(tobj);\r  glFlush();\r  //JTTessBegin();//reset to new.\r  \r}\r\r\r/*\rvoid JTTessInit(int memsize){\r  tessfreemem = new Vector();\r  tesscache = new GLdouble*[memsize];\r  tessmax = memsize;\r  for(int i=0;i<memsize;i++){\r    tesscache[i] = new GLdouble[12];\r  }\r}\r*/\r\r\r\rvoid JTTessNewContour(){\r  doTessErrorCheck();\r  tesscache[tessBase+tessPtr] = (GLdouble*)TESSCACHE_NEWCONTOUR;\r  tessPtr++;\r\r}\r\r\rvoid JTTessBegin(){\r  /*\r  if(tesscache!=0){\r    //     for(int i=0;i<tesscache->count ;i++){\r    //       long t = tesscache->get(i);\r    //       switch(t){\r    //       case TESSCACHE_NEWCONTOUR:break;\r    //       default:\r    //printf("%i\n",t);\r    //printf("%i\n",((GLdouble*)(t))[0]);\r    //delete [] (GLdouble*)t;//i'm leaving this all in memory, but it's dangerous!\r    //tessfreemem->push(t);\r    //break;\r    //      }\r    //}\r    //delete tesscache;\r    //tesscache = new Vector();\r    \r  } else { //it WAS zero.\r    //tesscache = new Vector();\r  }\r  tessBase += tessPtr;//advance forward.\r  tessPtr = 0;\r*/\r}\r\r\rvoid doTessErrorCheck(){\r  if(tessPtr+tessBase>tessmax){\r    printf("error:not enough memory allocated to JTTess",0);\r    exit(0);\r  }\r}\r\r\r\rvoid _tessBind(){  \r\r  //#if defined (__DARWIN__)\r  //#define TESSTYPE (GLvoid (*)(...))\r  //#else\r  //typedef GLvoid ( *GluTessCallbackType)(...);\r  //#define TESSTYPE reinterpret_cast<GluTessCallbackType>\r  //#endif\r  /*\r  \r  gluTessCallback(tobj, GLU_TESS_VERTEX,\r                TESSTYPE(glVertex3dv));\r  gluTessCallback(tobj, GLU_TESS_BEGIN,\r                TESSTYPE(JTTess_beginCallback));\r  gluTessCallback(tobj, GLU_TESS_END,\r                 TESSTYPE(&JTTess_endCallback));\r  gluTessCallback(tobj, GLU_TESS_ERROR,\r                TESSTYPE(JTTess_errorCallback));\r  gluTessCallback(tobj, GLU_TESS_COMBINE,\r             TESSTYPE(JTTess_combineCallback));  \r  gluTessProperty(tobj, GLU_TESS_WINDING_RULE,\r            GLU_TESS_WINDING_POSITIVE);\r  */\r}\r\r\r/*  the callback routines registered by gluTessCallback() */\r\r\rvoid JTTESSCALLBACK JTTess_combineCallback(GLdouble coords[3], \r                     GLdouble *vertex_data[4],\r                     GLfloat weight[4], GLdouble **dataOut ){\r  GLdouble *vertex;\r  int i;\r  doTessErrorCheck();\r  vertex = tesscache[tessBase+tessPtr];//(GLdouble *) malloc(6 * sizeof(GLdouble));\r  tessPtr++;\r  vertex[0] = coords[0];\r  vertex[1] = coords[1];\r  vertex[2] = coords[2];\r  for (i = 3; i < 7; i++)\r    vertex[i] = weight[0] * vertex_data[0][i] \r      + weight[1] * vertex_data[1][i]\r      + weight[2] * vertex_data[2][i] \r      + weight[3] * vertex_data[3][i];\r  *dataOut = vertex;\r}\r\r\rvoid JTTESSCALLBACK JTTess_beginCallback(GLenum which){\r  glBegin(which);\r}\r\rvoid JTTESSCALLBACK JTTess_endCallback(void)\r{\r  glEnd();\r}\r\rvoid JTTESSCALLBACK JTTess_errorCallback(GLenum errorCode)\r{\r  const GLubyte *estring;\r\r  estring = gluErrorString(errorCode);\r  fprintf (stderr, "Tessellation Error: %s\n", estring);\r  exit (0);\r}\r\r\r/*  new callback routines registered by these calls */\rvoid JTTESSCALLBACK JTTess_vertexCallback(GLvoid *vertex){\r  const GLdouble *pointer;\r  \r  pointer = (GLdouble *) vertex;\r  glColor3dv(pointer+3);\r  glVertex3dv((const GLdouble*)vertex);\r}\r\r\r\rJoshFont *getFont(){\r  return font;\r}\r\rJPoint mouse(){\r  return JPoint(mouseX(),mouseY(),0);\r}\r\r/**\r   saves the screen to a file. format support provided by image magick.\r   supported formats: http://www.imagemagick.org/script/formats.php\r*/\rvoid saveScreen(char *filename){\r  using namespace Magick; \r  if(rawpixels==NULL){\r    rawpixels = new unsigned char[width()*height()*3];\r  }\r  glReadPixels(0,0,width(),height(), GL_RGB , GL_UNSIGNED_BYTE ,rawpixels);\r  \r  /*\r  //reverse the alpha vals.\r  for(int i=0;i<width()*height();i++){\r    rawpixels[i*4+3] = 255 - rawpixels[i*4+3];\r  }\r  */\r  \r  Image image(width(),height(),"RGB" , CharPixel , rawpixels);\r  //image.modifyImage();\r  image.flip();\r  \r  \r  image.write(filename);//save\r  //delete [] rawpixels;\r}\r\r\r\r/**\r   saves the screen to a file. format support provided by image magick.\r   supported formats: http://www.imagemagick.org/script/formats.php\r*/\rImage* getPixels(){\r  using namespace Magick; \r  if(rawpixels==NULL){\r    rawpixels = new unsigned char[width()*height()*3];\r  }\r  glReadPixels(0,0,width(),height(), GL_RGB , GL_UNSIGNED_BYTE ,rawpixels);\r  \r  /*\r  //reverse the alpha vals.\r  for(int i=0;i<width()*height();i++){\r  rawpixels[i*4+3] = 255 - rawpixels[i*4+3];\r  }\r  */\r  \r  Image*image = new Image(width(),height(),"RGB" , CharPixel , rawpixels);\r  //image.modifyImage();\r  image->flip();\r  return image;\r}\r\r\r\r\r\r\r\r/* allocates new storage for an 8-bit image of the specified dimensions\r */\rpng_bytep* make_pixels(int width, int height) {\r  int pixel_size = 3;\r  //printf("debug debug debug 1\n",0);\r  png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\r  if (png_ptr == NULL) {\r    \r    return NULL;\r  }\r  //printf("debug debug debug 2\n",0);\r  png_bytep *row_pointers = (unsigned char **)png_malloc(png_ptr, height*sizeof(png_bytep));\r  for (int i = 0; i < height; i++)\r    row_pointers[i] = (unsigned char *)png_malloc(png_ptr, width*pixel_size);\r  //printf("debug debug debug 3\n",0);\r  \r  return row_pointers;\r}\r//--------------------------------------------------------------------------------------------\r\rvoid jt_frameRate(unsigned long f){\r  frameRate = f;\r}\r\r\rvoid roundedRect(int gl_style,float x1,float y1,float x2,float y2,float radius,int steps){\r  float inc = (PI*0.5)/steps;\r  glBegin(gl_style);\r  //draw a quarter circle here.\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i-PI*0.5) + x2 - radius;\r    float y = radius*sin(inc*i-PI*0.5) + y1 + radius;\r    glVertex2f(x,y);\r  }\r\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i) + x2 - radius;\r    float y = radius*sin(inc*i) + y2 - radius;\r    glVertex2f(x,y);\r  }\r\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i+PI*0.5) + x1 + radius;\r    float y = radius*sin(inc*i+PI*0.5) + y2 - radius;\r    glVertex2f(x,y);\r  }\r\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i+PI) + x1 + radius;\r    float y = radius*sin(inc*i+PI) + y1 + radius;\r    glVertex2f(x,y);\r  }\r\r  \r\r  glEnd();\r}\r
\ No newline at end of file
+#include "jttoolkit.h"\r#include <stdio.h>\r#include <stdlib.h>\r#include <string.h>\r#include <iostream.h> \r#include <fstream.h>\r\r\r#define INIT_WINDOW_X 0\r#define INIT_WINDOW_Y 0\r#define INIT_WINDOW_WIDTH 1024\r#define INIT_WINDOW_HEIGHT 768\r\r\r//#include "gl2ps.h"\r#if defined (__DARWIN__)\r#include <ApplicationServices/ApplicationServices.h>\r#endif\r\r#define use_perspective\r#define VERBOSE 0\r//turn this on and off for speed\r\r\r//---- user-global access functions\r\rint ticks(){return _ticks;}\rint width(){return _width;}\rint height(){return _height;}\r\rint mouseX(){return _mouseX;}\rint mouseY(){return _mouseY;}\r\r\rvoid setMouseX(long xx){_mouseX = xx;}\rvoid setMouseY(long yy){_mouseY = yy;}\r\rvoid ignoreMouse(int state){_ignoreMouse = state;}\r\r//--------------\r\rvoid *threadFunc(void*stuff){\r}\r\r//------------------------------------------------------------------------\rvoid initfmod(){\r  /*  \r  if (FSOUND_GetVersion() < FMOD_VERSION){\r    printf("Error : You are using the wrong DLL version!  You should be using FMOD %.02f\n", FMOD_VERSION);\r    exit(1);\r  }\r  \r  if(!FSOUND_Init(48000, 1024, FSOUND_INIT_GLOBALFOCUS)){\r    printf("%s\n",FMOD_ErrorString(FSOUND_GetError()));\r  }\r  */\r}\r//------------------------------------------------------------------------\r\r\r\rfloat friction(){return _friction;}\rvoid setFriction(float f){_friction = f;}\r\rfloat frequencyRange(){return _frequencyRange;}\rvoid setFrequencyRange(float f){_frequencyRange = f;}\r\rvoid drawUnitSquare(){\r  glBegin(GL_QUADS);\r  glTexCoord2f(0,0);glVertex2f(0,0);        \r  glTexCoord2f(1,0);glVertex2f(1,0);\r  glTexCoord2f(1,1);glVertex2f(1,1);\r  glTexCoord2f(0,1);glVertex2f(0,1);\r  glEnd();\r}\r\r\rvoid  drawUnitSquareSlightlySmaller(){\r  glBegin(GL_QUADS);\r  glTexCoord2f(0.01,0.01);glVertex2f(0,0);   \r  glTexCoord2f(0.99,0.01);glVertex2f(1,0);\r  glTexCoord2f(0.99,0.99);glVertex2f(1,1);\r  glTexCoord2f(0.01,0.99);glVertex2f(0,1);\r  glEnd();\r}\r\r\r\r\rvoid toggleFullScreen(){\r  fullscreenmode=!fullscreenmode;\r  if(fullscreenmode){\r    glutFullScreen();\r  } else {\r    glutReshapeWindow(INIT_WINDOW_WIDTH,INIT_WINDOW_HEIGHT);\r    glutPositionWindow(0,10);\r  }\r}\r\rchar* trimLeft(char*buff){\r  //count how many to offset backward\r  int whiteCount = 0;\r  for(int i=0;i<strlen(buff);i++){\r    if(buff[i]==' '||buff[i]=='\r'||buff[i]=='\n'||buff[i]=='\t'){\r      whiteCount++;\r    }else{\r      break;\r    }\r  }\r  if(whiteCount>0){\r    for(int b=0;b<strlen(buff)-whiteCount;b++){\r      buff[b] = buff[b+whiteCount];\r    }\r  }\r  return buff;\r}\r\rvoid fileFromString(unsigned char *fname, char *data, long datasize){\r    long i=0;\r      FILE *fp = fopen((const char*)fname,"wb");\r     for(i=0;i<datasize;i++){\r               fputc(data[i],fp);\r     }\r      fclose(fp);\r}\r\r\r//--------------------------------------------------------------------\r\r\runsigned char* stringFromFile(char *fname){\r   long fsize;\r    unsigned char *a;\r\r     if(fname==NULL){\r         if(VERBOSE)printf("err: stringFromFile: filename was null\n",NULL);\r    return 0;\r    }\r      fsize = getFileSize(fname);\r\r   if(fsize==0){\r    if(VERBOSE)printf("err: stringFromFile: file size was zero\n",NULL);\r   return 0;\r    }\r      a = new unsigned char[fsize+1];\r        \r       if(a==NULL){\r     if(VERBOSE)printf("err: stringFromFile: memory allocation failed\n",NULL);\r     return 0;\r    }\r      \r       getFile((char*)fname,a,fsize);\r a[fsize]=0;\r    return a;\r}\r\r\r//--------------------------------------------------------------------\r\rlong getFileSize( char *fname){\r  FILE *fp;\r      long fsize;\r    if (fname == NULL){\r            if(VERBOSE)printf("err: getFileSize: filename was null\n",NULL);\r               return 0;\r      }\r      fp = fopen((const char*)fname, "rb");\r  if (fp == NULL){\r               if(VERBOSE)printf("err: getFileSize: file stream failed\n",NULL);\r              return 0;\r      }\r      if(fseek(fp, 0, SEEK_END)!=0){\r                 if(VERBOSE)printf("err: getFileSize: fseek failed\n",NULL);\r    }\r      fsize = ftell(fp);\r     fclose(fp);\r    return fsize;\r}\r\r\r//--------------------------------------------------------------------\r\rvoid getFile( char *filename, unsigned char *buff, int length){\r      unsigned char c=0;\r     long buffcnt=0;\r        long i=0;\r      ifstream f;\r    //#if defined(__DARWIN__)\r      //      f.open(filename);\r      //#else\r        f.open((const char*)filename, ios::binary);\r    //#endif\r       f.read((char*)buff, length);\r   //for(i=0;i<length;i++){\r       //      printf("{%c}",buff[i]);\r        //}\r    f.close();\r}\r\r\r//--------------------------------------------------------------------\r\rvoid hideMouse(){\r\r#if defined(__DARWIN__)\r      //MAC\r  HideCursor();\r#elif defined(linux)\r     //LINUX\r        //ignore\r#else\r         //WINDOWS\r      ShowCursor(FALSE);\r#endif\r\r\r}\r\r//--------------------------------------------------------------------\r\rvoid showMouse(){\r#if defined(__DARWIN__)\r       //MAC\r  ShowCursor();\r#elif defined(linux)\r     //ignore\r#else\r         //WINDOWS\r      ShowCursor(TRUE);\r#endif\r}\r\rvoid display(){}\rvoid display2(){}\r\rvoid _execute_frame(){\r  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);\r  glPushMatrix();\r#if defined(use_perspective)\r  glTranslatef(-width()/2.0f,height()/2.0,-height()/2.0);\r  glScalef(1,-1,1);\r#endif \r  if(penta_firstloop){//first time!\r    penta_firstloop = false;\r    font = new JoshFont("media/usethis.ttf",40,JF_BITMAP,true,true);\r    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r    setup();\r  }else{\r    loop();\r    //glFlush();\r    //glutPostRedisplay();\r    _ticks++;\r  }\r  glPopMatrix();\r  glutSwapBuffers();\r  \r}\r\rvoid idle(){\r  /*\r  if(glutGet(GLUT_ELAPSED_TIME) - lastGlutFrameTime > frameRate){\r    _execute_frame();\r    lastGlutFrameTime = glutGet(GLUT_ELAPSED_TIME);\r  }\r  */\r}\r\r\rvoid timerFunc(int v) {\r  //if(glutGet(GLUT_ELAPSED_TIME) - lastGlutFrameTime > frameRate){\r    _execute_frame();\r    //}\r  glutTimerFunc(frameRate,timerFunc,0);\r}\r\rvoid preKeyDown(unsigned char k, int special){\r  if(special){\r    if(k==11){\r      toggleFullScreen();\r    }\r  } else {\r    //non special\r    if(k==27){\r      //exit(0);\r    }else if (k==KEY_DELETE || k==KEY_BACKSPACE){\r\r\r    } else if (k==6){//ctrl+f on a mac\r      toggleFullScreen();\r    } else {\r\r    }\r  }\r\r}\r\rvoid keyboardDown(unsigned char k,int x,int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }\r  preKeyDown(k,0);\r  jttoolkit_keyDown(k,0);\r}\r\rvoid keyboardUp(unsigned char k,int x,int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }\r  //printf("keyboardUp: %c %i\n",k);\r  jttoolkit_keyUp(k,0);\r}\r\r\rvoid specialFunc(int k,int x,int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }\r  preKeyDown(k,1);\r  jttoolkit_keyDown(k,1);\r}\r\rvoid mouseMotionFunc(int x, int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }else{\r    ignored_mouseMove(x,y);\r  }\r\r}\r\rvoid mousePassiveMotionFunc(int x, int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r  }else{\r    ignored_mouseMove(x,y);\r  }\r  //  printf("%i %i\n",_mouseX,_mouseY);\r}\r\rvoid mouseFunc(int button, int state, int x, int y){\r  if(!_ignoreMouse){\r    _mouseX=x;\r    _mouseY=y;\r    \r    if(state==GLUT_DOWN){\r      jttoolkit_mouseDown();\r    } else {\r      jttoolkit_mouseUp();\r    }\r    \r  }else{\r    \r    if(state==GLUT_DOWN){\r      ignored_mouseDown(x,y);\r    } else {\r      ignored_mouseUp(x,y);\r    }\r    \r  }\r}\r\rvoid viewPerspective(float angle){\r  glMatrixMode(GL_PROJECTION);\r  glLoadIdentity();\r  gluPerspective(angle,(float)width()/(float)height(),0.0001,10000);\r  //glFrustum(-2, 2, -2, 2, 1.0f, 100.0f);\r  glMatrixMode(GL_MODELVIEW);\r}\r\r\rvoid viewOrtho(){\r  glMatrixMode(GL_PROJECTION);\r  glLoadIdentity();\r  glOrtho(0,width(),-height(),0,-10000,10000);\r  glMatrixMode(GL_MODELVIEW);\r}\r\rvoid reshape(int w,int h){\r  //  if(glutGetWindow()==MainWindowID){\r  if(1){\r    \r    _width = w;\r    _height = h;\r    //      to keep it propertional & let the window stretch\r    // glMatrixMode(GL_PROJECTION);\r    //     glLoadIdentity();\r    glViewport(0,0,w,h);\r    //       if(w<h){\r    //         float r = ((float)h/(float)w);\r    //           glOrtho(-1,1,-r,r,-2,2);\r    // }else{\r    float r = ((float)w/(float)h);\r    //                glOrtho(-r,r,-1,1,-2,2);\r    // }\r    //        this->draw();\r    \r    viewPerspective(90);\r    glLoadIdentity();\r    \r  } else { //then i can assume for now that it was the output console window.\r    \r    glViewport(0,0,w,h);\r    float r = ((float)w/(float)h);\r    \r    glMatrixMode(GL_PROJECTION);\r    glLoadIdentity();\r    \r    //#if defined(use_perspective)\r    //gluPerspective(90,(float)w/(float)h,0.0001,10000);\r    //#else\r    glOrtho(0,w,h,0,-10000,10000);\r    //#endif\r    //glFrustum(-2, 2, -2, 2, 1.0f, 100.0f);\r    \r    glMatrixMode(GL_MODELVIEW);\r    glLoadIdentity();\r  }\r  //  jt_resizeDrawBuffer();\r}\r\rvoid jt_resizeDrawBuffer(){\r  //  delete [] drawbuffer;\r  //  drawbuffer = new unsigned char[width()*height()*4];\r}\r\rint main(int argc,char** argv){\r\r\r  glutInit(&argc,argv);\r  glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGBA);\r  glutInitWindowSize (INIT_WINDOW_WIDTH,INIT_WINDOW_HEIGHT);\r  glutInitWindowPosition (INIT_WINDOW_X,INIT_WINDOW_Y);\r\r  int gameMode = 0;\r  if(argc>1){\r    for(int i=0;i<strlen(argv[1]);i++){\r      switch(argv[1][i]){\r      case 'g':\r     gameMode = true;\r      }\r    }\r  }\r\r  if(gameMode){\r    glutGameModeString("1440x900:16@60");\r    glutEnterGameMode();\r  }else{\r    glutCreateWindow (" ");\r  }\r  \r  jttoolkit_init();\r  glutMainLoop();\r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r    \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r  \r\r  //do we ever even get here?\r  //FSOUND_Close();\r  stop();\r  exit(0);\r  return 0;\r}\r\rint jttoolkit_init(){\r  glutIdleFunc(idle);\r  glutDisplayFunc(display);\r  glutReshapeFunc(reshape);\r  glutMouseFunc(mouseFunc);\r  glutMotionFunc(mouseMotionFunc);\r  glutPassiveMotionFunc(mousePassiveMotionFunc);\r  glutKeyboardFunc (keyboardDown);\r  glutKeyboardUpFunc (keyboardUp);\r  glutSpecialFunc (specialFunc);\r  glutTimerFunc(frameRate,timerFunc,0);\r  \r  // a whole bunch of switches for the openGL engine\r  glEnable(GL_TEXTURE_2D);\r  glEnable(GL_BLEND);\r  glEnable(GL_DEPTH_TEST);\r  //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR);\r  //glEnable(GL_LINE_SMOOTH);\r  //glEnable(GL_POLYGON_SMOOTH);\r  glLineWidth(1);\r  //  glDepthFunc(GL_LESS);//was GL_LEQUAL\r  glDepthFunc(GL_LEQUAL);//was GL_LEQUAL\r  glClearDepth(1.0f);\r  glDisable(GL_DITHER);\r  //glShadeModel(GL_SMOOTH);\r  glMatrixMode(GL_PROJECTION);     //       The Projection Matrix\r  glLoadIdentity();                      // The Projection Matrix\r  // Calculate The Aspect Ratio Of The Window\r  //gluPerspective(45.0f,(float)wW/(float)wH,0.1f,100.0f);\r  //gluLookAt(0,0,1,0,0,0,0,1,0);\r  glMatrixMode(GL_MODELVIEW); // The Modelview Matrix\r  glLoadIdentity();    // The Modelview Matrix\r  //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Perspective Calculations\r  //glEnable(GL_FOG);\r  //glFogf(GL_FOG_START,-100);\r  //glFogf(GL_FOG_END,-200);\r  //glFogf(GL_FOG_DENSITY,0.1);\r  //float r[] = {0.5,0.5,0.5,0.5};\r  //glFogfv(GL_FOG_COLOR,r);\r  //--------------------------------------------------------------------------------\r  glClearColor(0,0,0,0);\r  //also, if that doesn't work,  check if the users screen is 640x48, then fullscreen the game.\r  //#if defined(__DARWIN__)\r  //problem with fullscreen - it disables the glut passive motion func.\r  //#else\r  //if(fullscreenmode)glutFullScreen();\r  //#endif\r\r}\r\rint buildScreenFont(char *fontName, int size){\r  return 0;\r}\r\r\rvoid _draw_single_screenFont(int fontID, char*text){\r  \r  glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);\r  \r}\r\rvoid drawScreenFont(int fontID, char*text,int tracking){\r  int i;\r  int drawScreenFont_buffpt=0;\r  int lineCounter=0;\r  if (text == NULL)return;\r  glPushAttrib(GL_LIST_BIT);\r  glRasterPos3f(0,lineCounter,0);\r  glListBase(fontID);\r  for(i=0;i<strlen(text);i++){\r    if(text[i]=='\n'){\r      drawScreenFont_buff[drawScreenFont_buffpt]=0;\r      _draw_single_screenFont(fontID,drawScreenFont_buff);\r      lineCounter+=tracking;\r      glRasterPos3f(0,lineCounter,0);\r      drawScreenFont_buffpt=0;\r    }else{\r      drawScreenFont_buff[drawScreenFont_buffpt] = text[i];\r      drawScreenFont_buffpt++;\r    }\r  }\r  drawScreenFont_buff[drawScreenFont_buffpt]=0;\r  _draw_single_screenFont(fontID,drawScreenFont_buff);\r  glPopAttrib();\r}\r\r\rvoid killScreenFont(int fontID){\r  glDeleteLists(fontID,256);\r}\r\r\rvoid lights(){\r  glEnable(GL_LIGHT0);\r  glEnable(GL_LIGHTING);\r  glEnable(GL_COLOR_MATERIAL);\r  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\r}\r\r\r\rvoid nolights(){\r  glDisable(GL_LIGHT0);\r  glDisable(GL_LIGHTING);\r  glDisable(GL_COLOR_MATERIAL);\r}\r\r\rfloat randomFloat(){\r  return ((float)rand())/((float)RAND_MAX);\r}\r\rvoid line(JPoint p1,JPoint p2){\r  glBegin(GL_LINES);\r  p1.glVertex();\r  p2.glVertex();\r  glEnd();\r}\r\rvoid bezier(JPoint p1,JPoint p2,JPoint p3,JPoint p4,int steps){\r  float *Xs = new float[steps];\r  float *Ys = new float[steps];\r  float *Zs = new float[steps];\r\r\r  interpolateBezier(\r               p1.x,p1.y,p1.z,\r                p2.x,p2.y,p2.z,\r                p3.x,p3.y,p3.z,\r                p4.x,p4.y,p4.z,\r                 steps,Xs,Ys,Zs) ;\r    \r  glBegin(GL_LINE_STRIP);\r  p1.glVertex();\r  for(int i=1;i<steps-1;i++){\r    glVertex3f(Xs[i],Ys[i],Zs[i]);\r  }\r  p4.glVertex();\r  glEnd();\r  \r  delete Xs;\r  delete Ys;\r  delete Zs;\r\r}\r\r\rvoid interpolateBezier(\r                float P0X,float P0Y,float P0Z,\r                 float P1X,float P1Y,float P1Z,\r                 float P2X,float P2Y,float P2Z,\r                 float P3X,float P3Y,float P3Z,\r                 int segs,\r                      float Xs[] , float Ys[] , float Zs[]) {\r  \r  float t=0.0f,dt=1.0f/(float)segs;           // calculating increment\r  float Q0X,Q0Y,Q0Z;\r  float Q1X,Q1Y,Q1Z;\r  float Q2X,Q2Y,Q2Z;\r  float R0X,R0Y,R0Z;\r  float R1X,R1Y,R1Z;\r  float x;float y;float z;\r  float xx=P0X;float yy=P0Y;float zz=P0Z;\r  for (int i=1;i<segs;i++) {\r    Q0X = P0X + t*(P1X-P0X); Q0Y = P0Y + t*(P1Y-P0Y); Q0Z = P0Z + t*(P1Z-P0Z);\r    Q1X = P1X + t*(P2X-P1X); Q1Y = P1Y + t*(P2Y-P1Y); Q1Z = P1Z + t*(P2Z-P1Z);\r    Q2X = P2X + t*(P3X-P2X); Q2Y = P2Y + t*(P3Y-P2Y); Q2Z = P2Z + t*(P3Z-P2Z);\r    R0X = Q0X + t*(Q1X-Q0X); R0Y = Q0Y + t*(Q1Y-Q0Y); R0Z = Q0Z + t*(Q1Z-Q0Z);\r    R1X = Q1X + t*(Q2X-Q1X); R1Y = Q1Y + t*(Q2Y-Q1Y); R1Z = Q1Z + t*(Q2Z-Q1Z);\r    x = R0X + t*(R1X-R0X);\r    y = R0Y + t*(R1Y-R0Y);\r    z = R0Z + t*(R1Z-R0Z);\r    //drawLine(xx,yy,zz,x,y,z);\r    Xs[i-1]=x;\r    Ys[i-1]=y;\r    Zs[i-1]=z;\r    xx=x;\r    yy=y;\r    zz=z;\r    t+=dt;\r  }\r}\r\r\rfloat absf(float a){\r  if(a<0)return -a;\r  return a;\r}\r\r\rfloat getDist(float x1,float y1,float x2,float y2){\r     double x = absf(x1-x2);\r        double y = absf(y1-y2);\r        x=x*x;\r y=y*y;\r return (float)sqrt(x+y);\r}\r\r\rvoid rect2polar(double x,double y,double returnPair[2]){\r  returnPair[0] = getDist(0.0,0.0,x,y);\r  returnPair[1] = atan2(y,x);\r}\r\rvoid polar2rect(double r,double theta,double returnPair[2]){\r    returnPair[0] = r*cos(theta);\r  returnPair[1] = r*sin(theta);\r}\r\r\r\r//tess\r\rvoid JTTessVertex(float x,float y, float z){\r  //first look for available memory before allocating more.\r  //printf("%f %f %f\n",x,y,z);\r  doTessErrorCheck();\r  //printf("1 %i\n",tessPtr);\r  GLdouble *p = tesscache[tessBase+tessPtr];\r  //printf("2\n",0);\r  tessPtr++;\r  \r  p[0] = x;\r  p[1] = y;\r  p[2] = z;\r  p[3] = 0;\r  //printf("3\n",0);\r  //if(tesscache!=0)tesscache->push((long)p);\r}\r\r\rvoid JTTessEnd(){\r  //FLUSH IT!\r  \r  tobj = gluNewTess();\r  _tessBind();\r  \r  if(tesscache!=0){\r    gluTessBeginPolygon(tobj,NULL);\r    gluTessBeginContour(tobj);\r    \r    for(int i=tessBase;i<tessBase+tessPtr;i++){\r      GLdouble*t = tesscache[i];\r      if((long)t==TESSCACHE_NEWCONTOUR){\r        gluTessEndContour(tobj);\r    gluTessBeginContour(tobj);\r      } else {\r      GLdouble *g = (GLdouble*)t;\r    gluTessVertex(tobj,g,g);\r      }\r    }\r    \r    gluTessEndContour(tobj);\r    gluTessEndPolygon(tobj);\r  }\r  gluDeleteTess(tobj);\r  glFlush();\r  //JTTessBegin();//reset to new.\r  \r}\r\r\r/*\rvoid JTTessInit(int memsize){\r  tessfreemem = new Vector();\r  tesscache = new GLdouble*[memsize];\r  tessmax = memsize;\r  for(int i=0;i<memsize;i++){\r    tesscache[i] = new GLdouble[12];\r  }\r}\r*/\r\r\r\rvoid JTTessNewContour(){\r  doTessErrorCheck();\r  tesscache[tessBase+tessPtr] = (GLdouble*)TESSCACHE_NEWCONTOUR;\r  tessPtr++;\r\r}\r\r\rvoid JTTessBegin(){\r  /*\r  if(tesscache!=0){\r    //     for(int i=0;i<tesscache->count ;i++){\r    //       long t = tesscache->get(i);\r    //       switch(t){\r    //       case TESSCACHE_NEWCONTOUR:break;\r    //       default:\r    //printf("%i\n",t);\r    //printf("%i\n",((GLdouble*)(t))[0]);\r    //delete [] (GLdouble*)t;//i'm leaving this all in memory, but it's dangerous!\r    //tessfreemem->push(t);\r    //break;\r    //      }\r    //}\r    //delete tesscache;\r    //tesscache = new Vector();\r    \r  } else { //it WAS zero.\r    //tesscache = new Vector();\r  }\r  tessBase += tessPtr;//advance forward.\r  tessPtr = 0;\r*/\r}\r\r\rvoid doTessErrorCheck(){\r  if(tessPtr+tessBase>tessmax){\r    printf("error:not enough memory allocated to JTTess",0);\r    exit(0);\r  }\r}\r\r\r\rvoid _tessBind(){  \r\r  //#if defined (__DARWIN__)\r  //#define TESSTYPE (GLvoid (*)(...))\r  //#else\r  //typedef GLvoid ( *GluTessCallbackType)(...);\r  //#define TESSTYPE reinterpret_cast<GluTessCallbackType>\r  //#endif\r  /*\r  \r  gluTessCallback(tobj, GLU_TESS_VERTEX,\r                TESSTYPE(glVertex3dv));\r  gluTessCallback(tobj, GLU_TESS_BEGIN,\r                TESSTYPE(JTTess_beginCallback));\r  gluTessCallback(tobj, GLU_TESS_END,\r                 TESSTYPE(&JTTess_endCallback));\r  gluTessCallback(tobj, GLU_TESS_ERROR,\r                TESSTYPE(JTTess_errorCallback));\r  gluTessCallback(tobj, GLU_TESS_COMBINE,\r             TESSTYPE(JTTess_combineCallback));  \r  gluTessProperty(tobj, GLU_TESS_WINDING_RULE,\r            GLU_TESS_WINDING_POSITIVE);\r  */\r}\r\r\r/*  the callback routines registered by gluTessCallback() */\r\r\rvoid JTTESSCALLBACK JTTess_combineCallback(GLdouble coords[3], \r                     GLdouble *vertex_data[4],\r                     GLfloat weight[4], GLdouble **dataOut ){\r  GLdouble *vertex;\r  int i;\r  doTessErrorCheck();\r  vertex = tesscache[tessBase+tessPtr];//(GLdouble *) malloc(6 * sizeof(GLdouble));\r  tessPtr++;\r  vertex[0] = coords[0];\r  vertex[1] = coords[1];\r  vertex[2] = coords[2];\r  for (i = 3; i < 7; i++)\r    vertex[i] = weight[0] * vertex_data[0][i] \r      + weight[1] * vertex_data[1][i]\r      + weight[2] * vertex_data[2][i] \r      + weight[3] * vertex_data[3][i];\r  *dataOut = vertex;\r}\r\r\rvoid JTTESSCALLBACK JTTess_beginCallback(GLenum which){\r  glBegin(which);\r}\r\rvoid JTTESSCALLBACK JTTess_endCallback(void)\r{\r  glEnd();\r}\r\rvoid JTTESSCALLBACK JTTess_errorCallback(GLenum errorCode)\r{\r  const GLubyte *estring;\r\r  estring = gluErrorString(errorCode);\r  fprintf (stderr, "Tessellation Error: %s\n", estring);\r  exit (0);\r}\r\r\r/*  new callback routines registered by these calls */\rvoid JTTESSCALLBACK JTTess_vertexCallback(GLvoid *vertex){\r  const GLdouble *pointer;\r  \r  pointer = (GLdouble *) vertex;\r  glColor3dv(pointer+3);\r  glVertex3dv((const GLdouble*)vertex);\r}\r\r\r\rJoshFont *getFont(){\r  return font;\r}\r\rJPoint mouse(){\r  return JPoint(mouseX(),mouseY(),0);\r}\r\r/**\r   saves the screen to a file. format support provided by image magick.\r   supported formats: http://www.imagemagick.org/script/formats.php\r*/\rvoid saveScreen(char *filename){\r  using namespace Magick; \r  if(rawpixels==NULL){\r    rawpixels = new unsigned char[width()*height()*3];\r  }\r  glReadPixels(0,0,width(),height(), GL_RGB , GL_UNSIGNED_BYTE ,rawpixels);\r  \r  /*\r  //reverse the alpha vals.\r  for(int i=0;i<width()*height();i++){\r    rawpixels[i*4+3] = 255 - rawpixels[i*4+3];\r  }\r  */\r  \r  Image image(width(),height(),"RGB" , CharPixel , rawpixels);\r  //image.modifyImage();\r  image.flip();\r  \r  \r  image.write(filename);//save\r  //delete [] rawpixels;\r}\r\r\r\r/**\r   saves the screen to a file. format support provided by image magick.\r   supported formats: http://www.imagemagick.org/script/formats.php\r*/\rImage* getPixels(){\r  using namespace Magick; \r  if(rawpixels==NULL){\r    rawpixels = new unsigned char[width()*height()*3];\r  }\r  glReadPixels(0,0,width(),height(), GL_RGB , GL_UNSIGNED_BYTE ,rawpixels);\r  \r  /*\r  //reverse the alpha vals.\r  for(int i=0;i<width()*height();i++){\r  rawpixels[i*4+3] = 255 - rawpixels[i*4+3];\r  }\r  */\r  \r  Image*image = new Image(width(),height(),"RGB" , CharPixel , rawpixels);\r  //image.modifyImage();\r  image->flip();\r  return image;\r}\r\r\r\r\r\r\r\r/* allocates new storage for an 8-bit image of the specified dimensions\r */\rpng_bytep* make_pixels(int width, int height) {\r  int pixel_size = 3;\r  //printf("debug debug debug 1\n",0);\r  png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);\r  if (png_ptr == NULL) {\r    \r    return NULL;\r  }\r  //printf("debug debug debug 2\n",0);\r  png_bytep *row_pointers = (unsigned char **)png_malloc(png_ptr, height*sizeof(png_bytep));\r  for (int i = 0; i < height; i++)\r    row_pointers[i] = (unsigned char *)png_malloc(png_ptr, width*pixel_size);\r  //printf("debug debug debug 3\n",0);\r  \r  return row_pointers;\r}\r//--------------------------------------------------------------------------------------------\r\rvoid jt_frameRate(unsigned long f){\r  frameRate = f;\r}\r\r\rvoid roundedRect(int gl_style,float x1,float y1,float x2,float y2,float radius,int steps){\r  float inc = (PI*0.5)/steps;\r  glBegin(gl_style);\r  //draw a quarter circle here.\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i-PI*0.5) + x2 - radius;\r    float y = radius*sin(inc*i-PI*0.5) + y1 + radius;\r    glVertex2f(x,y);\r  }\r\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i) + x2 - radius;\r    float y = radius*sin(inc*i) + y2 - radius;\r    glVertex2f(x,y);\r  }\r\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i+PI*0.5) + x1 + radius;\r    float y = radius*sin(inc*i+PI*0.5) + y2 - radius;\r    glVertex2f(x,y);\r  }\r\r  \r  for(int i=0;i<steps;i++){\r    float x = radius*cos(inc*i+PI) + x1 + radius;\r    float y = radius*sin(inc*i+PI) + y1 + radius;\r    glVertex2f(x,y);\r  }\r\r  \r\r  glEnd();\r}\r
\ No newline at end of file
diff --git a/media/move.txt b/media/move.txt
new file mode 100644 (file)
index 0000000..6124e86
--- /dev/null
@@ -0,0 +1,4612 @@
+981
+981
+981
+983
+1013
+1018
+1019
+1019
+1019
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1020
+1019
+1019
+1018
+1017
+1016
+1009
+974
+941
+913
+877
+834
+803
+770
+750
+738
+734
+714
+707
+697
+678
+671
+655
+642
+610
+596
+569
+559
+552
+549
+546
+545
+543
+541
+541
+539
+538
+535
+534
+532
+531
+531
+530
+529
+527
+526
+522
+520
+519
+518
+517
+515
+513
+512
+503
+501
+499
+497
+494
+492
+491
+489
+482
+475
+470
+465
+455
+453
+451
+450
+446
+446
+445
+445
+444
+444
+443
+443
+441
+428
+411
+396
+384
+378
+377
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+375
+387
+401
+431
+469
+506
+561
+613
+663
+731
+777
+791
+829
+861
+869
+876
+885
+905
+919
+925
+932
+936
+937
+940
+942
+943
+945
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+946
+947
+956
+961
+962
+966
+968
+969
+970
+970
+971
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+972
+971
+956
+953
+952
+950
+948
+947
+945
+944
+942
+939
+936
+935
+933
+931
+929
+926
+922
+917
+907
+899
+895
+893
+891
+889
+888
+887
+886
+884
+884
+882
+881
+880
+878
+876
+875
+874
+871
+869
+867
+863
+862
+862
+862
+862
+861
+860
+859
+857
+856
+856
+854
+853
+852
+851
+850
+850
+849
+848
+847
+847
+845
+845
+843
+838
+838
+837
+837
+836
+835
+834
+833
+832
+832
+831
+831
+830
+829
+828
+827
+826
+825
+823
+823
+822
+822
+821
+821
+820
+820
+820
+819
+819
+818
+817
+816
+815
+814
+813
+812
+811
+810
+809
+808
+807
+806
+805
+803
+802
+802
+801
+799
+797
+797
+795
+795
+794
+793
+792
+791
+791
+790
+788
+788
+787
+786
+785
+784
+783
+782
+781
+780
+779
+778
+777
+776
+775
+773
+773
+772
+771
+769
+769
+768
+768
+768
+768
+768
+768
+768
+768
+768
+770
+778
+778
+778
+776
+776
+776
+775
+774
+772
+772
+771
+771
+771
+771
+770
+769
+769
+769
+768
+768
+767
+766
+765
+763
+762
+762
+761
+760
+759
+759
+758
+758
+758
+757
+757
+757
+756
+756
+755
+754
+754
+753
+752
+752
+751
+750
+750
+749
+749
+749
+749
+749
+748
+748
+748
+748
+748
+747
+747
+747
+746
+746
+746
+745
+745
+745
+745
+744
+744
+744
+744
+743
+743
+743
+742
+742
+742
+741
+741
+741
+740
+740
+740
+740
+740
+739
+739
+739
+738
+738
+738
+738
+737
+737
+737
+736
+735
+735
+734
+734
+734
+734
+734
+733
+733
+733
+733
+733
+732
+732
+731
+731
+731
+730
+729
+729
+728
+727
+727
+726
+725
+725
+724
+724
+723
+723
+722
+722
+722
+721
+720
+720
+720
+720
+719
+719
+718
+718
+717
+717
+717
+717
+716
+716
+715
+715
+714
+714
+713
+713
+712
+712
+712
+711
+711
+710
+710
+710
+709
+709
+709
+708
+708
+707
+707
+707
+707
+706
+706
+705
+705
+705
+705
+705
+704
+703
+703
+703
+703
+703
+703
+703
+702
+702
+701
+700
+700
+699
+699
+699
+698
+698
+697
+697
+696
+696
+695
+695
+694
+694
+694
+694
+693
+693
+692
+692
+691
+691
+690
+690
+690
+690
+689
+689
+689
+689
+689
+689
+688
+688
+688
+688
+687
+687
+687
+687
+686
+686
+686
+686
+685
+684
+683
+682
+682
+682
+682
+682
+681
+681
+680
+680
+679
+679
+679
+679
+678
+678
+677
+677
+677
+676
+676
+675
+675
+675
+675
+674
+674
+674
+673
+673
+673
+672
+672
+672
+672
+671
+671
+671
+670
+670
+670
+669
+669
+668
+668
+668
+667
+667
+667
+666
+666
+666
+665
+665
+664
+664
+663
+662
+662
+661
+661
+660
+660
+659
+658
+658
+657
+657
+657
+657
+656
+656
+655
+654
+654
+653
+652
+652
+650
+649
+649
+648
+648
+647
+646
+646
+645
+645
+644
+643
+643
+643
+643
+643
+641
+640
+640
+639
+639
+638
+638
+637
+636
+636
+634
+634
+634
+633
+633
+632
+632
+631
+631
+631
+630
+630
+629
+629
+628
+627
+626
+626
+625
+625
+625
+625
+623
+623
+623
+622
+622
+622
+622
+620
+619
+618
+618
+618
+617
+617
+616
+616
+616
+615
+614
+613
+613
+613
+612
+611
+611
+610
+610
+609
+609
+609
+608
+608
+607
+607
+607
+606
+605
+605
+604
+604
+603
+603
+602
+601
+601
+600
+600
+599
+599
+599
+598
+597
+597
+597
+596
+595
+595
+594
+594
+593
+593
+592
+592
+592
+590
+590
+590
+589
+588
+588
+587
+586
+586
+585
+585
+584
+583
+582
+582
+581
+580
+579
+578
+578
+577
+576
+576
+574
+573
+572
+572
+571
+570
+570
+569
+568
+568
+567
+566
+565
+564
+562
+562
+561
+560
+559
+559
+558
+557
+556
+555
+554
+553
+552
+551
+551
+550
+549
+548
+547
+546
+545
+545
+543
+543
+542
+541
+540
+539
+537
+537
+537
+536
+535
+535
+534
+532
+531
+530
+529
+528
+527
+526
+526
+525
+524
+523
+522
+521
+520
+518
+517
+516
+515
+514
+513
+511
+510
+509
+508
+507
+506
+505
+504
+502
+501
+500
+499
+498
+496
+495
+494
+493
+492
+490
+490
+489
+488
+487
+486
+485
+484
+483
+482
+481
+479
+478
+476
+474
+472
+470
+469
+468
+467
+465
+464
+462
+460
+459
+459
+457
+457
+455
+454
+453
+452
+450
+449
+448
+446
+445
+443
+442
+441
+438
+436
+435
+435
+434
+433
+432
+431
+430
+429
+429
+428
+427
+427
+426
+425
+423
+423
+422
+422
+421
+420
+419
+417
+417
+416
+415
+414
+413
+411
+410
+409
+407
+404
+400
+398
+394
+393
+392
+390
+387
+386
+385
+384
+383
+382
+380
+378
+377
+377
+376
+375
+374
+374
+373
+372
+371
+370
+370
+369
+369
+368
+367
+366
+365
+364
+363
+363
+362
+362
+361
+360
+360
+359
+357
+355
+353
+351
+348
+345
+346
+348
+354
+354
+354
+354
+354
+354
+354
+356
+370
+369
+366
+365
+365
+364
+350
+339
+333
+318
+315
+308
+305
+303
+302
+299
+286
+286
+284
+282
+282
+280
+280
+279
+276
+276
+276
+273
+272
+272
+272
+272
+272
+271
+271
+271
+270
+268
+264
+263
+263
+262
+256
+253
+252
+251
+250
+248
+244
+241
+239
+237
+236
+235
+232
+230
+226
+225
+221
+220
+218
+218
+218
+218
+218
+218
+218
+220
+221
+221
+222
+223
+224
+225
+226
+226
+227
+227
+227
+228
+228
+229
+229
+229
+229
+229
+229
+229
+229
+229
+229
+229
+229
+230
+230
+230
+230
+230
+230
+230
+228
+227
+226
+224
+223
+223
+222
+222
+221
+220
+220
+220
+220
+219
+218
+218
+218
+217
+217
+216
+215
+215
+215
+215
+215
+215
+215
+215
+216
+218
+219
+220
+220
+220
+220
+221
+222
+222
+222
+223
+223
+227
+227
+228
+230
+231
+232
+234
+240
+241
+251
+258
+261
+268
+274
+279
+280
+286
+290
+291
+303
+309
+319
+340
+346
+357
+371
+376
+388
+392
+393
+398
+400
+405
+418
+421
+445
+449
+457
+476
+481
+496
+500
+503
+519
+524
+526
+531
+542
+543
+544
+545
+547
+548
+549
+550
+552
+553
+554
+555
+558
+560
+564
+565
+568
+569
+570
+572
+573
+574
+575
+575
+576
+577
+578
+578
+579
+579
+579
+580
+581
+581
+582
+582
+583
+583
+584
+585
+585
+585
+585
+585
+585
+585
+585
+585
+586
+586
+586
+586
+586
+586
+586
+586
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+586
+584
+579
+578
+577
+576
+576
+575
+574
+573
+572
+571
+570
+570
+569
+569
+569
+569
+568
+567
+567
+566
+565
+564
+563
+561
+561
+561
+560
+560
+559
+558
+557
+557
+557
+557
+557
+559
+559
+560
+561
+561
+563
+563
+564
+565
+567
+568
+569
+570
+571
+572
+573
+575
+575
+576
+577
+578
+578
+579
+579
+579
+580
+580
+581
+581
+581
+582
+582
+582
+583
+583
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+584
+583
+582
+582
+582
+580
+580
+580
+579
+579
+579
+578
+577
+576
+575
+575
+574
+574
+573
+573
+572
+572
+572
+572
+572
+572
+572
+572
+572
+572
+572
+573
+574
+574
+575
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+576
+577
+577
+577
+577
+578
+578
+578
+578
+579
+579
+579
+580
+580
+580
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+581
+582
+582
+582
+582
+582
+582
+582
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+583
+584
+584
+584
+584
+584
+584
+584
+585
+585
+586
+586
+586
+586
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+587
+588
+588
+588
+588
+588
+588
+588
+588
+588
+588
+588
+588
+588
+588
+588
+589
+589
+589
+589
+589
+589
+589
+589
+589
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+590
+591
+591
+591
+592
+592
+592
+592
+592
+592
+592
+592
+592
+593
+593
+594
+594
+594
+595
+595
+595
+596
+596
+597
+597
+597
+597
+597
+597
+597
+597
+597
+597
+598
+598
+598
+598
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+599
+600
+600
+600
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+601
+602
+603
+604
+604
+605
+605
+605
+606
+607
+607
+607
+608
+608
+608
+608
+609
+609
+610
+610
+610
+610
+610
+611
+611
+611
+611
+612
+612
+613
+613
+613
+613
+614
+614
+614
+615
+615
+615
+615
+616
+616
+616
+617
+617
+617
+618
+618
+618
+618
+619
+619
+619
+620
+620
+620
+620
+621
+621
+621
+623
+623
+623
+623
+623
+623
+624
+624
+624
+624
+624
+624
+625
+625
+625
+625
+625
+625
+625
+625
+625
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+626
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+627
+628
+628
+628
+628
+628
+628
+628
+629
+629
+629
+629
+630
+630
+630
+630
+630
+630
+630
+631
+631
+631
+631
+632
+632
+632
+633
+634
+634
+634
+635
+635
+635
+635
+636
+636
+637
+637
+638
+638
+638
+639
+639
+639
+639
+640
+640
+640
+641
+641
+641
+641
+641
+641
+642
+642
+642
+642
+642
+642
+643
+643
+643
+644
+644
+645
+645
+646
+647
+647
+647
+647
+647
+648
+648
+649
+649
+649
+649
+649
+649
+650
+650
+650
+650
+650
+650
+651
+651
+651
+652
+652
+652
+652
+652
+652
+652
+653
+653
+653
+653
+653
+654
+654
+654
+654
+654
+654
+654
+654
+654
+654
+655
+655
+655
+655
+656
+656
+656
+656
+656
+656
+657
+657
+657
+657
+657
+658
+658
+658
+658
+659
+659
+659
+659
+659
+660
+660
+660
+661
+661
+661
+661
+661
+661
+662
+662
+662
+663
+663
+663
+663
+663
+663
+664
+664
+664
+664
+665
+665
+665
+665
+666
+666
+666
+666
+666
+666
+666
+667
+667
+667
+667
+667
+667
+667
+668
+668
+668
+668
+668
+668
+668
+668
+668
+668
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+669
+672
+672
+672
+672
+672
+672
+672
+673
+673
+673
+673
+674
+674
+675
+675
+675
+676
+676
+676
+676
+676
+676
+676
+676
+676
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+677
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+678
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+679
+680
+680
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+681
+682
+682
+682
+682
+682
+682
+682
+683
+683
+684
+684
+684
+684
+684
+684
+684
+684
+685
+685
+685
+685
+685
+685
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+686
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+687
+688
+688
+688
+688
+688
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+689
+690
+691
+691
+691
+692
+692
+692
+692
+692
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+693
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+694
+695
+695
+695
+695
+695
+695
+695
+695
+695
+695
+695
+696
+696
+696
+696
+696
+696
+696
+696
+696
+696
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+697
+698
+698
+698
+698
+698
+698
+698
+698
+698
+698
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+699
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+700
+701
+701
+701
+701
+701
+701
+701
+702
+702
+702
+702
+702
+702
+702
+702
+702
+702
+702
+702
+703
+703
+703
+703
+703
+703
+703
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+704
+705
+705
+705
+705
+705
+705
+705
+705
+705
+705
+705
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+706
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+707
+708
+708
+708
+708
+708
+708
+708
+708
+708
+708
+708
+709
+709
+709
+710
+710
+710
+710
+710
+710
+710
+710
+710
+711
+711
+711
+711
+711
+711
+711
+711
+711
+711
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+712
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+713
+714
+714
+714
+714
+714
+714
+714
+714
+714
+714
+714
+714
+714
+714
+715
+715
+715
+715
+715
+715
+715
+715
+715
+715
+715
+715
+715
+715
+716
+716
+716
+716
+716
+716
+716
+716
+716
+716
+716
+716
+717
+717
+717
+717
+717
+717
+717
+717
+717
+717
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+718
+719
+719
+719
+719
+719
+719
+719
+719
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+720
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+721
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+722
+723
+723
+723
+723
+723
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+724
+725
+725
+725
+725
+725
+725
+725
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+726
+727
+727
+727
+727
+727
+727
+727
+727
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728
+728