anchor.diff:  
   List parseToRows(Map json) {
     var jsScores = {};
  -  var dartScores = {};
  +  var ssaScores = {};
  +  var cpsScores = {};
     for (var result in json['js']) {
       jsScores[result['benchmark']] = result['score'];
     }
  -  for (var result in json['dart2js']) {
  -    dartScores[result['benchmark']] = result['score'];
  +  for (var result in json['ssa']) {
  +    ssaScores[result['benchmark']] = result['score'];
  +  }
  +  for (var result in json['cps']) {
  +    cpsScores[result['benchmark']] = result['score'];
     }
     var rows = [];
     for (var benchmark in jsScores.keys) {
  -    rows.add([benchmark, jsScores[benchmark], dartScores[benchmark]]);
  +    rows.add([benchmark, jsScores[benchmark], ssaScores[benchmark], cpsScores[benchmark]]);
     }
     return rows;
   }
  
positive.code:   var naiveInfiniteScrollMean =
        showMean('naive_infinite_scroll', naiveInfiniteScrollBenchmarks);
    var totalMean = showMean(
        'all macro',
        treeBenchmarks
            .union(largetableBenchmarks)
            .union(naiveInfiniteScrollBenchmarks)
            .union(staticTreeBenchmarks));
  
    var meansDiv = querySelector('#means');
    meansDiv.append(new UListElement()
  
negative.code:     ..append(new LIElement()..text = staticTreeMean)
      ..append(new LIElement()..text = largeTableMean)
      ..append(new LIElement()..text = naiveInfiniteScrollMean)
      ..append(new LIElement()..text = totalMean)
      ..append(new LIElement()..text = cpsJsMean)
      ..append(new LIElement()..text = cpsSsaMean));
  }
  
  // XXX: rename denom and numer
  String showMean(String name, Set<String> benchmarks, {int denom: 2, int numer: 1}) {
    var mean = geoMean(
        rawRows.where((x) => benchmarks.contains(x[0])).map((x) => x[denom] / x[numer]));
    return 'Average performance on $name benchmarks: $mean';
  }
  
  