anchor.diff:    }
   
     String path = args[0];
  -  var sessionInfo = await loadSessionInfo(path);
     var f = new io.File(path);
   
  -  completionExtractionStart(sessionInfo);
     LogItemProcessor proc = new LogItemProcessor(completionExtraction);
     var extracted = <String>[];
   
  -  // Process each line to extract information
  +  /// Process each line to extract information
     await for (String ln
         in f.openRead().transform(UTF8.decoder).transform(new LineSplitter())) {
       proc.addRawLine(ln);
  -    processMessages(proc, extracted);
  +
  +    String nextMessage;
  +    while (proc.hasMoreMessages) {
  +      try {
  +        nextMessage = null;
  +        nextMessage = proc.readNextMessage();
  +      } catch (e, st) {
  +        var exMsg = e.toString();
  +        if (exMsg.length > 300) exMsg = '${exMsg.substring(0, 300)} ...';
  +        print("Error in line \n${exMsg} \n$st");
  +      }
  +
  +      if (nextMessage != null) {
  +        print(nextMessage);
  +        extracted.add(nextMessage);
  +      }
  +      // if (nextMessage != null) print("${nextMessage[0]}, ${nextMessage[1]}");
  +      //
  +      // String messageType = nextMessage[1];
  +      // msgTyps.putIfAbsent(messageType, () => msgTyps.length);
  +      // print("${nextMessage[0]}, ${msgTyps[messageType]}");
  +
  +    }
     }
  -  proc.close();
  -  processMessages(proc, extracted);
   
     // Finish the extraction process
     var finalResults = completionExtractionFinished();
  
positive.code:   var reduced = completionReductionMerge(reduced1, reduced2);
    print(reduced);
  }
  
  Future<Map> loadSessionInfo(String path) async {
    var index = path.indexOf('-', path.lastIndexOf('/'));
    var priPath = '${path.substring(0, index)}-PRI${path.substring(index + 1)}';
    var f = new io.File(priPath);
  
    var firstLine;
    LogItemProcessor proc = new LogItemProcessor((line) {
      if (firstLine == null) firstLine = line;
    });
    await for (String ln
        in f.openRead().transform(UTF8.decoder).transform(new LineSplitter())) {
      proc.addRawLine(ln);
      processMessages(proc);
    }
    proc.close();
    processMessages(proc);
  
    var data = firstLine.split(':');
    return {
      'uuid': data[2],
      'clientId': data[3],
      'clientVersion': data[4],
      'serverVersion': data[5],
      'sdkVersion': data[6]
    };
  }
  
  void processMessages(LogItemProcessor proc, [List<String> extracted]) {
    String nextMessage;
    while (proc.hasMoreMessages) {
      try {
        nextMessage = null;
        nextMessage = proc.readNextMessage();
      } catch (e, st) {
        var exMsg = e.toString();
        if (exMsg.length > 300) exMsg = '${exMsg.substring(0, 300)} ...';
        print("Error in line \n${exMsg} \n$st");
      }
  
      if (nextMessage != null) {
        print(nextMessage);
        if (extracted != null) extracted.add(nextMessage);
      }
      // if (nextMessage != null) print("${nextMessage[0]}, ${nextMessage[1]}");
      //
      // String messageType = nextMessage[1];
      // msgTyps.putIfAbsent(messageType, () => msgTyps.length);
      // print("${nextMessage[0]}, ${msgTyps[messageType]}");
  
    }
  }
  
negative.code: 
  import 'package:sintr_worker_lib/completion_metrics.dart'
      show
          completionExtraction,
          completionExtractionFinished,
          completionReducer,
          completionReductionMerge;
  import 'package:sintr_worker_lib/instrumentation_lib.dart';
  
  main(List<String> args) async {
    if (args.length != 1) {
  