anchor.diff:    String get enumName => '_Resolved';
   
     static const USED_AS_IS = const _Resolved._('');
  -  static const STAR_PATH_MAPPED = const _Resolved._(
  -      '"*" path resolved using mappings from config files');
     static const NORMAL_PATH_OVERRIDDEN = const _Resolved._(
         'original path overridden using mappings from config files');
     static const VERSION_RANGE_RESOLVED = const _Resolved._(
  
positive.code: 
  class _Package {
    /// E.g.: "Polymer/platform".
    static const _PACKAGE_PATH = r"[-\w.]+(?:/[-\w.]+)+";
    /// E.g.: "Polymer/platform#1.2.3", "Polymer/platform#>=1.2.3 <2.0.0".
    // TODO(ussuri): Support "*" as well (=> "ask Bower registry").
    static const _PACKAGE_SPEC = "^($_PACKAGE_PATH)(?:#(.+))?\$";
    static final _PACKAGE_SPEC_REGEXP = new RegExp(_PACKAGE_SPEC);
  
    static const _GITHUB_ROOT_URL = 'https://github.com';
    static const _GITHUB_API_ROOT_URL = 'https://api.github.com/repos';
    static const _GITHUB_USER_CONTENT_URL = 'https://raw.githubusercontent.com';
  
    final String name;
    final String fullPath;
  
negative.code:       return _resolveWith(_Ignored.PER_CONFIG_DIRECTIVE);
      }
  
      if (hash == 'master') {
        _resolvedDirectTag = 'master';
        return _resolveWith(_Resolved.USED_AS_IS);
      }
  
      return _resolvePath().then((_) => _resolveTag());
    }
  
    Future _resolvePath() {
      // TODO(ussuri): See above. This, too, allows only either a "*" path,
      // or a non-* path with a hash, but not a direct version/tag without a path.
      if (path != null && path != '*') {
        return new Future.value();
      } else {
        return util.downloadFileViaXhr(getRegistryInfoUrl()).then(
            (String regResponse) {
          Map<String, dynamic> regInfo;
          try {
            regInfo = JSON.decode(regResponse);
          } on FormatException catch (e) {
            // Also handles registryResponse=='Package not found'.
            return _resolveWith(_Unresolved.STAR_PATH_FOR_UNKNOWN_PACKAGE);
          }
  
          Match m = _BOWER_REGISTRY_INFO_URL_REGEXP.matchAsPrefix(regInfo['url']);
          if (m == null) {
            return _resolveWith(_Unresolved.MALFORMED_BOWER_REGISTRY_INFO);
          }
          path = m.group(1);
          if (path == null) {
            return _resolveWith(_Unresolved.MALFORMED_BOWER_REGISTRY_INFO);
          }
          path = path.replaceFirst(new RegExp(r'.git$'), '');
          return new Future.value();
        });
      }
    }
  
    Future _resolveTag() {
      semver.VersionConstraint constraint;
  
      if (hash == null || hash == 'latest') {
  