anchor.diff:                  }
               }
           });
  -        
  -
  -        // [0, 1].forEach((index) {
  -        //     Point nextCP = checkpoints[pods[index].nextCP];
  -        //     //calc outer point on next checkpoint
  -        //     //vector from previous to next next cp
  -        //     int prevCPid = pods[index].nextCP - 1;
  -        //     if(prevCPid < 0 ){ prevCPid = cpCount - 1; }
  -        //     int nextNextCPid = pods[index].nextCP + 1;
  -        //     if(nextNextCPid >= cpCount  ){ nextNextCPid = 0; }
  -            
  -        //     num dx = checkpoints[prevCPid].x - checkpoints[nextNextCPid].x;
  -        //     num dy = checkpoints[prevCPid].y - checkpoints[nextNextCPid].y; 
  -        //     num length = sqrt(dx * dx + dy * dy);
  -        //     num scaleddx = (490 / length) * dx;
  -        //     num scaleddy = (490 / length) * dy;
  -        //     // Point target = new Point(
  -        //     //     nextCP.x - pods[index].vx * 3,
  -        //     //     nextCP.y - pods[index].vy * 3);
  -        //     Point target = new Point(
  -        //         nextCP.x + scaleddx.round() - pods[index].vx * 3,
  -        //         nextCP.y + scaleddy.round() - pods[index].vy * 3);
  -        //     bool shield = false;
  -        //     Collision col1 = pods[index].collision(pods[2]);
  -        //     Collision col2 = pods[index].collision(pods[3]);
  -        //     // Collision col3 = pods[index].collision(checkpoints[pods[index].nextCP]);
  -        //     if(col1 != null || col2 != null){
  -        //         shield = true;
  -        //     }
  -            
  -        //     num nextCheckpointAngle = pods[index].diffAngle(target);
  -        //     num nextCheckpointDist2 = pods[index].distance2(target);
  -        //     stderr.writeln("$index Next CP angle: $nextCheckpointAngle");
  -        //     stderr.writeln("$index Next CP Dist2: $nextCheckpointDist2");
  -            
  -            
  -        //     if(shield){
  -        //         print("${target.x} ${target.y} SHIELD SHIELDS UP!");
  -        //     // } else if (col3 != null){
  -        //     //     //going to collide with next CP next turn
  -        //     //     Point nextNextCP = checkpoints[nextNextCPid];
  -        //     //     print("${nextNextCP.x} ${nextNextCP.y} 100");
  -                
  -        //     } else if(!pods[index].boostUsed &&
  -        //         nextCheckpointAngle.abs() < 2 &&
  -        //         nextCheckpointDist2 > (6000 * 6000)){
  -        //         pods[index].boostUsed = true;
  -        //         print("${target.x} ${target.y} BOOST BOOSTERS ENGAGED!");
  -        //     } else if(nextCheckpointAngle.abs() > 20){
  -        //          int thrust = thrustSigmoid(nextCheckpointAngle);
  -        //          print("${target.x} ${target.y} 20");
  -        //     } else if( nextCheckpointDist2 < 700 * 700){
  -        //         print("${target.x} ${target.y} 50");
  -        //     } else if( nextCheckpointDist2 < 650 * 650){
  -        //         print("${target.x} ${target.y} 30");
  -        //     } else {
  -        //         print("${target.x} ${target.y} 100");
  -        //     }
  -        // });
   
           turn++;
       }
  
positive.code:     return bestSolution;
  }
  
  Solution genetic(List<Pod> startPods, int length, int timeout, Solution lastSolution){
      int poolSize = 10;
      
      Stopwatch sw = new Stopwatch();
      sw.start();
      Solution naive = naiveSolution(startPods, length);
      
      Map<num, Solution> pool = new SplayTreeMap();
      num naiveEval = naive.score(startPods);
      pool[naiveEval] = naive;
      stderr.writeln("Created naive $naiveEval ${sw.elapsedMilliseconds}");
      
      
      for(int i = 0; i < poolSize; i++){
          Solution randomSolution = new Solution(
              new List.generate(length, (index) => randomMove()),
              new List.generate(length, (index) => randomMove()),
              naive.moves2,
              naive.moves3);
          num randomEval = randomSolution.score(startPods);
          //stderr.writeln("${pool.length} $poolSize Random eval $randomEval");
          pool[randomEval] = randomSolution;
      }
      
      stderr.writeln("Filled pool ${pool.length} ${sw.elapsedMilliseconds}");
      stderr.writeln("Pool first ${pool.keys.first} last ${pool.keys.last}");
      
      while(sw.elapsedMilliseconds < timeout){
          // stderr.writeln("Creating GAs ${sw.elapsedMilliseconds}");
          //TODO generate new solution with mutation and crossover
              
          Solution mutatedSolution = pool[pool.keys.toList()[rand.nextInt(pool.length)]].clone();
          mutatedSolution.mutate();
          
          num geneticEval = mutatedSolution.score(startPods);
          if( geneticEval > pool.keys.first && !pool.containsKey(geneticEval)){
  
negative.code:             pool.remove(pool.keys.first);
          }
      }
      stderr.writeln("End Pool first ${pool.keys.first} last ${pool.keys.last}");
     
      return pool[pool.keys.last];
      
  