@Override
	public FileAttributes getFileAttributes(GFile file, TaskMonitor monitor) {

		FileAttributes result = new FileAttributes();

		SquashedFile squashedFile = fsIndex.getMetadata(file);

		if (squashedFile != null) {

			SquashInode inode = squashedFile.getInode();

			// Add additional attributes to the root directory
			if (fsIndex.getRootDir().equals(file)) {
				result.add("Compression used", superBlock.getCompressionTypeString());
				result.add("Block size", superBlock.getBlockSize());
				result.add("Inode count", superBlock.getInodeCount());
				result.add("Fragment count", superBlock.getTotalFragments());
				result.add("SquashFS version", superBlock.getVersionString());
				result.add(MODIFIED_DATE_ATTR, new Date(superBlock.getModTime()));
			}
			else {
				result.add(MODIFIED_DATE_ATTR, new Date(inode.getModTime()));
			}

			// Add general attributes
			result.add(NAME_ATTR, squashedFile.getName());
			result.add(FSRL_ATTR, file.getFSRL());

			// Add file-related attributes
			if (inode.isFile()) {
				SquashBasicFileInode fileInode = (SquashBasicFileInode) inode;

				result.add(SIZE_ATTR, squashedFile.getUncompressedSize());
				result.add(COMPRESSED_SIZE_ATTR, fileInode.getCompressedFileSize());

			}
			else if (inode.isSymLink()) {

				SquashSymlinkInode symLinkInode = (SquashSymlinkInode) inode;
				result.add(SYMLINK_DEST_ATTR, symLinkInode.getPath());

			}
		}

		return result;
	}
Decompress (if needed) the tail end of the given file and write to OutputStream
@param squashedFile The file to process
@param fileInode The inode associated with the file
@param os The stream to write to
@param monitor The monitor to keep track of the progress with
@return The number of uncompressed bytes the tail end used
@throws CancelledException The user cancelled the file read
@throws IOException Any read error
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/squashfs/SquashFileSystem.java