public URI relativize(URI relative) {if (relative.opaque || opaque) {return relative;}if (scheme == null ? relative.scheme != null : !scheme.equals(relative.scheme)) {return relative;}if (authority == null ? relative.authority != null : !authority.equals(relative.authority)) {return relative;}String thisPath = normalize(path, false);String relativePath = normalize(relative.path, false);if (!thisPath.equals(relativePath)) {thisPath = thisPath.substring(0, thisPath.lastIndexOf('/') + 1);if (!relativePath.startsWith(thisPath)) {return relative;}}URI result = new URI();result.fragment = relative.fragment;result.query = relative.query;result.path = relativePath.substring(thisPath.length());result.setSchemeSpecificPart();return result;}

public java.net.URI relativize(java.net.URI relative){if (relative.opaque || opaque){return relative;}if (scheme == null ? relative.scheme != null : !scheme.Equals(relative.scheme)){return relative;}if (authority == null ? relative.authority != null : !authority.Equals(relative.authority)){return relative;}string thisPath = normalize(path, false);string relativePath = normalize(relative.path, false);if (!thisPath.Equals(relativePath)){thisPath = Sharpen.StringHelper.Substring(thisPath, 0, thisPath.LastIndexOf('/')+ 1);if (!relativePath.StartsWith(thisPath)){return relative;}}java.net.URI result = new java.net.URI();result.fragment = relative.fragment;result.query = relative.query;result.path = Sharpen.StringHelper.Substring(relativePath, thisPath.Length);result.setSchemeSpecificPart();return result;}
