code: private Path resolveConflict(Path conflictingPath, String ciphertextFileName, String dirId) throws IOException {
  		String conflictingFileName = conflictingPath.getFileName().toString();
  		Preconditions.checkArgument(conflictingFileName.contains(ciphertextFileName), "%s does not contain %s", conflictingPath, ciphertextFileName);
  
  		Path parent = conflictingPath.getParent();
  		String inflatedFileName;
  		Path canonicalPath;
  		if (longFileNameProvider.isDeflated(conflictingFileName)) {
  			String deflatedName = ciphertextFileName + LONG_NAME_FILE_EXT;
  			inflatedFileName = longFileNameProvider.inflate(deflatedName);
  			canonicalPath = parent.resolve(deflatedName);
  		} else {
  			inflatedFileName = ciphertextFileName;
  			canonicalPath = parent.resolve(ciphertextFileName);
  		}
  
  		CiphertextFileType type = CiphertextFileType.forFileName(inflatedFileName);
  		assert inflatedFileName.startsWith(type.getPrefix());
  		String ciphertext = inflatedFileName.substring(type.getPrefix().length());
  
  		if (CiphertextFileType.DIRECTORY.equals(type) && resolveDirectoryConflictTrivially(canonicalPath, conflictingPath)) {
  			return canonicalPath;
  		} else {
  			return renameConflictingFile(canonicalPath, conflictingPath, ciphertext, dirId, type.getPrefix());
  		}
  	}
docs: Resolves a conflict.
  
  @param conflictingPath The path of a file containing a valid base 32 part.
  @param ciphertextFileName The base32 part inside the filename of the conflicting file.
  @param dirId The directory id of the file's parent directory.
  @return The new path of the conflicting file after the conflict has been resolved.
  @throws IOException