|  | # Fuchsia archive format (FAR) | 
|  |  | 
|  | ## Overview | 
|  |  | 
|  | The Fuchsia archive format is a format for storing a directory tree in a | 
|  | file. Like a `.tar` or `.zip` file, a Fuchsia archive file stores a mapping | 
|  | from path names to file contents. | 
|  |  | 
|  | Fuchsia archive files are sometimes referred to as FARs or FAR archives, | 
|  | and are given the filename extension `.far`. | 
|  |  | 
|  | ## Format | 
|  |  | 
|  | An archive is a sequence of bytes, divided into chunks: | 
|  |  | 
|  | * The first chunk is the index chunk, which describes where other chunks are | 
|  | located in the archive. | 
|  | * All the chunks listed in the index must appear in the archive in the order | 
|  | listed in the index (which is sorted by their type). | 
|  | * The archive may contain additional chunks that are not referenced in the | 
|  | index, but these chunks must appear in the archive after all the chunks | 
|  | listed in the index. For example, content chunks are not listed in the | 
|  | index. Instead, the content chunks are reachable from the directory chunk. | 
|  | * The chunks must not overlap. | 
|  | * All chunks are aligned on 64 bit boundaries. | 
|  | * All chunks must be packed as tightly as possible subject to their alignment | 
|  | constraints. | 
|  | * Any gaps between chunks must be filled with zeros. | 
|  |  | 
|  | All offsets and lengths are encoded as unsigned integers in little endian. | 
|  |  | 
|  | ## Index chunk | 
|  |  | 
|  | The index chunk is required and must start at the beginning of the archive. | 
|  |  | 
|  | * 8 bytes of magic. | 
|  | - Must be 0xc8 0xbf 0x0b 0x48 0xad 0xab 0xc5 0x11. | 
|  | * 64 bit length of concatenated index entries, in bytes. | 
|  | * Concatenated index entries. | 
|  |  | 
|  | No two index entries can have the same type and the entries must be sorted by | 
|  | type in increasing lexicographical octet order (e.g., as compared by memcmp). | 
|  | The chunks listed in the index must be stored in the archive in the order listed | 
|  | in the index. | 
|  |  | 
|  | ### Index entry | 
|  |  | 
|  | * 64 bit chunk type. | 
|  | * 64 bit offset from start of the archive to the start of the referenced | 
|  | chunk, in bytes. | 
|  | * 64 bit length of referenced chunk, in bytes. | 
|  |  | 
|  | ## Directory chunk (Type "DIR-----") | 
|  |  | 
|  | The directory chunk is required.  Entries in the directory chunk must have | 
|  | unique names and the entries must be sorted by name in increasing | 
|  | lexicographical octet order (e.g., as compared by memcmp). | 
|  |  | 
|  | * Concatenated directory table entries. | 
|  |  | 
|  | These entries represent the files contained in the archive. Directories | 
|  | themselves are not represented explicitly, which means archives cannot represent | 
|  | empty directories. | 
|  |  | 
|  | ### Directory table entry | 
|  |  | 
|  | * Name. | 
|  | - 32 bit offset from the start of the directory names chunk to the path | 
|  | data, in bytes. | 
|  | - 16 bit length of name, in bytes. | 
|  | * 16 bits of zeros, reserved for future use. | 
|  | * Data. | 
|  | - 64 bit offset from start of archive to the start of the content chunk, in | 
|  | bytes. | 
|  | - 64 bit length of the data, in bytes. | 
|  | * 64 bits of zeros, reserved for future use. | 
|  |  | 
|  | ## Directory names chunk (Type "DIRNAMES") | 
|  |  | 
|  | The directory names chunk is required and is used by the directory chunk to name | 
|  | the content chunks. Path data must be sorted in increasing lexicographical | 
|  | octet order (e.g., as compared by memcmp). | 
|  |  | 
|  | * Concatenated path data (no encoding specified). | 
|  | * Zero padding to next 8 byte boundary. | 
|  |  | 
|  | Note: The offsets used to index into the path data are 32 bits long, which means | 
|  | there is no reason to create a directory name chunk that is larger than 4 GB. | 
|  |  | 
|  | Although no encoding is specified, clients that wish to display path data using | 
|  | unicode may attempt to decode the data as UTF-8. The path data might or might | 
|  | not be UTF-8, which means that decoding might fail. | 
|  |  | 
|  | ### Path data | 
|  |  | 
|  | * Octets of path. | 
|  | - Must not be empty. | 
|  | - Must not contain a 0x00 octet. | 
|  | - The leading octet must not be 0x2F ('/'). | 
|  | - The trailing octet must not be 0x2F ('/'). | 
|  | - Let *segments* be the result of splitting the path on 0x2F ('/'). Each | 
|  | segment must meet the following requirements: | 
|  | - Must not be empty. | 
|  | - Must not be exactly 0x2E ('.') | 
|  | - Must not be exactly 0x2E 0x2E ('..') | 
|  |  | 
|  | ## Content chunk | 
|  |  | 
|  | Content chunks must be after all the chunks listed in the index chunk. The | 
|  | content chunks must appear in the archive in the order they are listed in the | 
|  | directory. | 
|  |  | 
|  | * data | 
|  |  | 
|  | The data must be aligned on a 4096 byte boundary from the start of the archive | 
|  | and the data must be padded with zeros until the next 4096 byte boundary. |