anchor.diff:      }
     }
   
  -  Future _pushViaUSB(ProgressMonitor monitor) {
  -    USBDeployer dep = new USBDeployer(appContainer, _prefs);
  -    return dep.init().then((_) {
  -      return dep.deploy(monitor);
  -    });
  -    /*
  -    List<int> httpRequest;
  -    AndroidDevice _device;
  -    List<String> fileToDelete = [];
  -    List<String> fileToAdd = [];
  -
  -    Future _setTimeout(Future httpPushFuture) {
  -      return httpPushFuture.timeout(new Duration(seconds: 30), onTimeout: () {
  -        return new Future.error('Push timed out: Total time exceeds 30 seconds');
  -      });
  -    }
  -    /*
  -     * 1. Request the asset manifest file for this app from the device
  -     * 2. Compare the asset manifest from the device with the one build here
  -     * 3. All the differences betwenn the two are either added for deletion or for addition
  -     * 4. The zip that is pushed contains only files that are changed since the last deployement.
  -     */
  -    httpRequest = _buildAssetManifestRequest('localhost');
  -    return _fetchAndroidDevice().then((deviceResult) {
  -      _device = deviceResult;
  -       return _setTimeout(_device.sendHttpRequest(httpRequest, DEPLOY_PORT));})
  -    .then((msg) {
  -      return _expectHttpOkResponse(msg);
  -    }).then((String result) {
  -      Map<String, Map<String, String>> assetManifestOnDevice = JSON.decode(result);
  -      if (assetManifestOnDevice['assetManifest'] != null) {
  -        Map<String, Map<String, String>> assetManifestLocal
  -            = JSON.decode(buildAssetManifest(appContainer));
  -        if (getEtag(appContainer) != assetManifestOnDevice['assetManifestEtag']) {
  -          setDeploymentTime(appContainer, 0);
  -        }
  -        assetManifestOnDevice['assetManifest'].keys.forEach((key) {
  -          if ((key.startsWith("www/"))
  -              && (!assetManifestLocal.containsKey(key))) {
  -            fileToDelete.add(key);
  -          }
  -        });
  -
  -        assetManifestLocal.keys.forEach((key) {
  -          if ((key.startsWith("www/")) &&
  -              (!assetManifestOnDevice['assetManifest'].containsKey(key))) {
  -            fileToAdd.add(key);
  -          }
  -        });
  -
  -        if (fileToDelete.isNotEmpty) {
  -          Map<String, List<String>> toDeleteMap = {};
  -          toDeleteMap["paths"] = fileToDelete;
  -          String command = JSON.encode(toDeleteMap);
  -          httpRequest = _buildDeleteRequest('localhost', command.codeUnits);
  -          return _setTimeout(_device.sendHttpRequest(httpRequest, DEPLOY_PORT));
  -        }
  -        return new Future.value();
  -      } else {
  -        return setDeploymentTime(appContainer, 0);
  -      }
  -    }).then((msg) {
  -      if (msg != null) {
  -        monitor.worked(6);
  -        return _expectHttpOkResponse(msg);
  -      }
  -    }).then((_) {
  -      return archiveModifiedFilesInContainer(appContainer, true)
  -          .then((List<int> archivedData) {
  -            monitor.worked(3);
  -            httpRequest = _buildPushRequest('localhost', archivedData);
  -            return _setTimeout(_device.sendHttpRequest(httpRequest, DEPLOY_PORT));
  -          }).then((msg) {
  -            monitor.worked(6);
  -            return _expectHttpOkResponse(msg);
  -    }).then((String response) {
  -      Map<String, String> etagResponse = JSON.decode(response);
  -      setEtag(appContainer, etagResponse['assetManifestEtag']);
  -      monitor.worked(8);
  -      httpRequest = _buildLaunchRequest('localhost');
  -      return _setTimeout(_device.sendHttpRequest(httpRequest, DEPLOY_PORT));
  -    }).then((msg) {
  -      monitor.worked(6);
  -      return _expectHttpOkResponse(msg);
  -    }).whenComplete(() {
  -      if (_device != null) _device.dispose();
  -    });
  -    });*/
  -  }
  -}
  -
  -abstract class AbstractDeployer {
  -  static const int DEPLOY_PORT = 2424;
  -
  -  final Container appContainer;
  -  final PreferenceStore _prefs;
  -
  -  List<DeviceInfo> _knownDevices = [];
  -
  -  AbstractDeployer(this.appContainer, this._prefs) {
  -    if (appContainer == null) {
  -      throw new ArgumentError('must provide an app to push');
  -    }
  -
  -    final List permissions = chrome.runtime.getManifest()['permissions'];
  -
  -    for (final p in permissions) {
  -      if (p is Map && (p as Map).containsKey('usbDevices')) {
  -        final List usbDevices = (p as Map)['usbDevices'];
  -        for (final Map<String, dynamic> d in usbDevices) {
  -          _knownDevices.add(
  -              new DeviceInfo(d['vendorId'], d['productId'], d['description']));
  -        }
  -      }
  -    }
  -  }
  -
  -  List<int> _buildHttpRequest(String target, String path, {List<int> payload}) {
  -    List<int> httpRequest = [];
  -
  -    // Build the HTTP request headers.
  -    String header =
  -        'POST /$path HTTP/1.1\r\n'
  -        'User-Agent: Chrome Dev Editor\r\n'
  -        'Host: ${target}:$DEPLOY_PORT\r\n';
  -    List<int> body = [];
  -
  -    if (payload != null) {
  -      body.addAll(payload);
  -    }
  -    httpRequest.addAll(header.codeUnits);
  -    httpRequest.addAll('Content-length: ${body.length}\r\n\r\n'.codeUnits);
  -    httpRequest.addAll(body);
  -
  -    return httpRequest;
  -  }
  -
  -  List<int> _buildHttpRequest2(String target, String path, {List<int> payload}) {
  -    List<int> httpRequest = [];
  -
  -    // Build the HTTP request headers.
  -    String header =
  -        'GET /$path HTTP/1.1\r\n'
  -        'User-Agent: Chrome Dev Editor\r\n'
  -        'Host: ${target}:$DEPLOY_PORT\r\n';
  -    List<int> body = [];
  -
  -    if (payload != null) {
  -      body.addAll(payload);
  -    }
  -    httpRequest.addAll(header.codeUnits);
  -    httpRequest.addAll('Content-length: ${body.length}\r\n\r\n'.codeUnits);
  -    httpRequest.addAll(body);
  -
  -    return httpRequest;
  -  }
  -
  -
  -  List<int> _buildPushRequest(String target, List<int> archivedData) {
  -    return _buildHttpRequest(target,
  -        "zippush?appId=${appContainer.project.name}&appType=chrome&movetype=file",
  -        payload: archivedData);
  -  }
  -
  -  List<int> _buildDeleteRequest(String target, List<int> archivedData) {
  -    return _buildHttpRequest(target,
  -        "deletefiles?appId=${appContainer.project.name}",
  -        payload: archivedData);
  -  }
  -
  -
  -  List<int> _buildLaunchRequest(String target) {
  -    return _buildHttpRequest(target, "launch?appId=${appContainer.project.name}");
  -  }
  -
  -  List<int> _buildAssetManifestRequest(String target) {
  -    return _buildHttpRequest2(target,
  -        "assetmanifest?appId=${appContainer.project.name}");
  -  }
  -
  -  Future<AndroidDevice> _fetchAndroidDevice() {
  -    AndroidDevice device = new AndroidDevice(_prefs);
  -
  -    Future doOpen(int index) {
  -      if (_knownDevices.length == 0) {
  -        return new Future.error('No known mobile devices.');
  -      }
  -      if (index >= _knownDevices.length) {
  -        return new Future.error('No known mobile device connected.\n'
  -            'Please ensure that you have a mobile device connected.');
  -      }
  -
  -      DeviceInfo di = _knownDevices[index];
  -      return device.open(di.vendorId, di.productId).catchError((e) {
  -        if ((e == 'no-device') || (e == 'no-connection')) {
  -          // No matching device found, try again.
  -          return doOpen(index + 1);
  -        } else {
  -          return new Future.error('Connection to the Android device failed.\n'
  -              'Please check whether "Developer Options" and "USB debugging" is enabled on your device.\n'
  -              'Enable Developer Options by going in Settings > System > About phone and press 7 times on Build number.\n'
  -              '"Developer options" should now appear in Settings > System > Developer options. '
  -              'You can now enable "USB debugging" in that menu.');
  -        }
  -      });
  -    }
  -
  -    return doOpen(0).then((_) {
  -      return device.connect(new SystemIdentity()).catchError((e) {
  -        device.dispose();
  -        throw e;
  -      });
  -    }).then((_) => device);
  -  }
  -
  -  Future _expectHttpOkResponse(List<int> msg) {
  -    print("expect");
  -    String response = new String.fromCharCodes(msg);
  -    List<String> lines = response.split('\r\n');
  -    Iterable<String> header = lines.takeWhile((l) => l.isNotEmpty);
  -
  -    print(response);
  -
  -    if (header.isEmpty) return new Future.error('Unexpected error during deploy.');
  -
  -    String body = lines.skip(header.length + 1).join('<br>\n');
  -
  -    if (!header.first.contains('200')) {
  -      // Error! Fail with the error line.
  -      return new Future.error(
  -          '${header.first.substring(header.first.indexOf(' ') + 1)}: $body');
  -    } else {
  -      return new Future.value(body);
  -    }
  -  }
  -
  +  ///This method sends the command to the device and it's
  +  ///implementation depends on the deployment choice
     Future<List<int>> _pushRequestToDevice(String);
  +
  +  //Get the deployment targte URL
     String _getTarget();
   
     Future _setTimeout(Future httpPushFuture) {
  
positive.code:     Map<String, String> etagResponse = JSON.decode(response);
      setEtag(appContainer, etagResponse['assetManifestEtag']);
    }
  
  
    Future _deleteObsoleteFiles(String result) {
      List<String> fileToDelete = [];
  
negative.code:     TcpClient client;
      return TcpClient.createClient(_target, DEPLOY_PORT).then((TcpClient client) {
        client.write(httpRequest);
        Stream st = client.stream;
        var broadcastStream = st.asBroadcastStream();
        List<int> l3 = new List<int>();
        return broadcastStream.forEach((List<int> l1) {
          l3.addAll(l1);
        }).catchError((_) {
          return l3;
        }).whenComplete(() {
          return l3;
        });
      }).whenComplete(() {
        if (client != null) {
          client.dispose();
  