[BACK]Return to xfs_filesystem_structure.doc CVS log [TXT][DIR] Up to [Development] / xfs-website / papers

File: [Development] / xfs-website / papers / xfs_filesystem_structure.doc (download)

Revision 1.1, Wed Jan 17 07:01:30 2007 UTC (10 years, 9 months ago) by chatz
Branch: MAIN
CVS Tags: HEAD

training/docs/xfs_filesystem_structure.doc 1.1 Renamed to papers/xfs_filesystem_structure.doc
The XFS ondisk filesystem structure doc by Barry.

ࡱ>	
A?0123456789:;B`	bjbj	EF.>T4xxxxP:P:P:d:tetete8ehjLd:#r
}}}}ҁ
ދtR<H#J#J#J#J#J#J#$%h(n#P:d~t^n#xx}}#@x*}9R}H#H#4.:.:"}r teΤZ>t#0#<((
(|(P:n#n##d:D?DDD0,D9d:?D0,d:d:d:xxxxxx
XFS 
Filesystem Structure


2nd Edition
Revision 1



[This document is incomplete and currently undergoing revision]




Copyright  2006, Silicon Graphics, Inc.
Table of Contents
 TOC \o "1-3" \h \z \u  HYPERLINK \l "_Toc147739793" Introduction	 PAGEREF _Toc147739793 \h 4
 HYPERLINK \l "_Toc147739794" Common XFS Types	 PAGEREF _Toc147739794 \h 5
 HYPERLINK \l "_Toc147739795" Allocation Groups	 PAGEREF _Toc147739795 \h 6
 HYPERLINK \l "_Toc147739796" Superblocks	 PAGEREF _Toc147739796 \h 7
 HYPERLINK \l "_Toc147739797" AG Free Space Management	 PAGEREF _Toc147739797 \h 13
 HYPERLINK \l "_Toc147739798" AG Free Space Block	 PAGEREF _Toc147739798 \h 13
 HYPERLINK \l "_Toc147739799" AG Free Space B+trees	 PAGEREF _Toc147739799 \h 14
 HYPERLINK \l "_Toc147739800" AG Free List	 PAGEREF _Toc147739800 \h 16
 HYPERLINK \l "_Toc147739801" AG Inode Management	 PAGEREF _Toc147739801 \h 18
 HYPERLINK \l "_Toc147739802" Inode Numbers	 PAGEREF _Toc147739802 \h 18
 HYPERLINK \l "_Toc147739803" Inode Information	 PAGEREF _Toc147739803 \h 18
 HYPERLINK \l "_Toc147739804" Inode B+trees	 PAGEREF _Toc147739804 \h 19
 HYPERLINK \l "_Toc147739805" Real-time Devices	 PAGEREF _Toc147739805 \h 22
 HYPERLINK \l "_Toc147739806" On-disk Inode	 PAGEREF _Toc147739806 \h 23
 HYPERLINK \l "_Toc147739807" Inode Core	 PAGEREF _Toc147739807 \h 24
 HYPERLINK \l "_Toc147739808" Unlinked Pointer	 PAGEREF _Toc147739808 \h 28
 HYPERLINK \l "_Toc147739809" Data Fork	 PAGEREF _Toc147739809 \h 29
 HYPERLINK \l "_Toc147739810" Regular Files (S_IFREG)	 PAGEREF _Toc147739810 \h 29
 HYPERLINK \l "_Toc147739811" Directories (S_IFDIR)	 PAGEREF _Toc147739811 \h 29
 HYPERLINK \l "_Toc147739812" Symbolic Links (S_IFLNK)	 PAGEREF _Toc147739812 \h 29
 HYPERLINK \l "_Toc147739813" Other File Types	 PAGEREF _Toc147739813 \h 29
 HYPERLINK \l "_Toc147739814" Attribute Fork	 PAGEREF _Toc147739814 \h 30
 HYPERLINK \l "_Toc147739815" Extended Attribute Versions	 PAGEREF _Toc147739815 \h 30
 HYPERLINK \l "_Toc147739816" Data Extents	 PAGEREF _Toc147739816 \h 31
 HYPERLINK \l "_Toc147739817" Extent List	 PAGEREF _Toc147739817 \h 32
 HYPERLINK \l "_Toc147739818" B+tree Extent List	 PAGEREF _Toc147739818 \h 34
 HYPERLINK \l "_Toc147739819" Directories	 PAGEREF _Toc147739819 \h 38
 HYPERLINK \l "_Toc147739820" Shortform Directories	 PAGEREF _Toc147739820 \h 39
 HYPERLINK \l "_Toc147739821" Block Directories	 PAGEREF _Toc147739821 \h 42
 HYPERLINK \l "_Toc147739822" Leaf Directories	 PAGEREF _Toc147739822 \h 47
 HYPERLINK \l "_Toc147739823" Node Directories	 PAGEREF _Toc147739823 \h 53
 HYPERLINK \l "_Toc147739824" B+tree Directories	 PAGEREF _Toc147739824 \h 58
 HYPERLINK \l "_Toc147739825" Symbolic Links	 PAGEREF _Toc147739825 \h 61
 HYPERLINK \l "_Toc147739826" Shortform Symbolic Links	 PAGEREF _Toc147739826 \h 61
 HYPERLINK \l "_Toc147739827" Extent Symbolic Links	 PAGEREF _Toc147739827 \h 62
 HYPERLINK \l "_Toc147739828" Extended Attributes	 PAGEREF _Toc147739828 \h 63
 HYPERLINK \l "_Toc147739829" Shortform Attributes	 PAGEREF _Toc147739829 \h 64
 HYPERLINK \l "_Toc147739830" Leaf Attributes	 PAGEREF _Toc147739830 \h 68
 HYPERLINK \l "_Toc147739831" Node Attributes	 PAGEREF _Toc147739831 \h 72
 HYPERLINK \l "_Toc147739832" B+tree Attributes	 PAGEREF _Toc147739832 \h 75
 HYPERLINK \l "_Toc147739833" Internal Inodes	 PAGEREF _Toc147739833 \h 76
 HYPERLINK \l "_Toc147739834" Quota Inodes	 PAGEREF _Toc147739834 \h 76
 HYPERLINK \l "_Toc147739835" Real-time Inodes	 PAGEREF _Toc147739835 \h 79
 HYPERLINK \l "_Toc147739836" Journaling Log	 PAGEREF _Toc147739836 \h 80
Introduction
This document describes the layout of an XFS filesystem. 
It shows how to manually inspect it by showing examples using the xfs_db user-space tool supplied with the XFS filesystem driver.
TODO:
Common XFS Types
All the following XFS types can be found in xfs_types.h. NULL values are always -1 on disk (ie. all bits for the value set to one).
xfs_ino_t
Unsigned 64 bit absolute  HYPERLINK  \l "_Inode_Numbers" inode number.
xfs_off_t
Signed 64 bit file offset.
xfs_daddr_t
Signed 64 bit disk address.
xfs_agnumber_t
Unsigned 32 bit  HYPERLINK  \l "_Allocation_Groups" AG number.
xfs_agblock_t
Unsigned 32 bit AG relative block number.
xfs_extlen_t
Unsigned 32 bit  HYPERLINK  \l "_Data_Extents_1" extent length in blocks.
xfs_extnum_t
Signed 32 bit number of extents in a file.
xfs_dablk_t
Unsigned 32 bit block number for  HYPERLINK  \l "_Directories" directories and  HYPERLINK  \l "_Extended_Attributes_1" extended attributes.
xfs_dahash_t
Unsigned 32 bit hash of a directory file name or extended attribute name.
xfs_dfsbno_t
Unsigned 64 bit filesystem block number combining  HYPERLINK  \l "_Allocation_Groups" AG number and block offset into the AG.
xfs_drfsbno_t
Unsigned 64 bit raw filesystem block number.
xfs_drtbno_t
Unsigned 64 bit extent number in the  HYPERLINK  \l "_Real-time_Devices" real-time sub-volume.
xfs_dfiloff_t
Unsigned 64 bit block offset into a file.
xfs_dfilblks_t
Unsigned 64 bit block count for a file.

Allocation Groups
XFS filesystems are divided into a number of equally sized chunks called Allocation Groups. Each AG can almost be thought of as an individual filesystem that maintains it's own space usage. Each AG can be up to one terabyte in size (512 bytes * 231), regardless of the underlying device's sector size.
Each AG has the following characteristics:
A super block describing overall filesystem info
Free space management
Inode allocation and tracking
Having multiple AGs allows XFS to handle most operations in parallel without degrading performance as the number of concurrent accessing increases. 
The only global information maintained by the first AG (primary) is free space across the filesystem and total inode counts. If the XFS_SB_VERSION2_LAZYSBCOUNTBIT flag is set in the superblock, these are only updated on-disk when the filesystem is cleanly unmounted (umount or shutdown).
Immediately after a mkfs.xfs, the primary AG has the following disk layout the subsequent AGs do not have any inodes allocated:
 SHAPE  \* MERGEFORMAT 
Each of these structures are expanded upon in the following sections.
Superblocks
Each AG starts with a superblock. The first one is the primary superblock that stores aggregate AG information. Secondary superblocks are only used by xfs_repair when the primary superblock has been corrupted. 
The superblock is defined by the following structure. The description of each field follows.
typedef struct xfs_sb
{
	__uint32_t	sb_magicnum;	
	__uint32_t	sb_blocksize;	
	xfs_drfsbno_t	sb_dblocks;	
	xfs_drfsbno_t	sb_rblocks;	
	xfs_drtbno_t	sb_rextents;	
	uuid_t	sb_uuid;	
	xfs_dfsbno_t	sb_logstart;	
	xfs_ino_t	sb_rootino;	
	xfs_ino_t	sb_rbmino;	
	xfs_ino_t	sb_rsumino;	
	xfs_agblock_t	sb_rextsize;	
	xfs_agblock_t	sb_agblocks;	
	xfs_agnumber_t	sb_agcount;	
	xfs_extlen_t	sb_rbmblocks;	
	xfs_extlen_t	sb_logblocks;	
	__uint16_t	sb_versionnum;	
	__uint16_t	sb_sectsize;	
	__uint16_t	sb_inodesize;	
	__uint16_t	sb_inopblock;	
	char	sb_fname[12];	
	__uint8_t	sb_blocklog;	
	__uint8_t	sb_sectlog;	
	__uint8_t	sb_inodelog;	
	__uint8_t	sb_inopblog;	
	__uint8_t	sb_agblklog;	
	__uint8_t	sb_rextslog;	
	__uint8_t	sb_inprogress;	
	__uint8_t	sb_imax_pct;	
	__uint64_t	sb_icount;	
	__uint64_t	sb_ifree;	
	__uint64_t	sb_fdblocks;	
	__uint64_t	sb_frextents;	
	xfs_ino_t	sb_uquotino;	
	xfs_ino_t	sb_gquotino;	
	__uint16_t	sb_qflags;	
	__uint8_t	sb_flags;	
	__uint8_t	sb_shared_vn;	
	xfs_extlen_t	sb_inoalignmt;	
	__uint32_t	sb_unit;	
	__uint32_t	sb_width;	
	__uint8_t	sb_dirblklog;	
	__uint8_t	sb_logsectlog;	
	__uint16_t	sb_logsectsize;	
	__uint32_t	sb_logsunit;	
	__uint32_t	sb_features2;	
} xfs_sb_t;
sb_magicnum
Identifies the filesystem. It's value is XFS_SB_MAGIC = 0x58465342 "XFSB".
sb_blocksize	
The size of a basic unit of space allocation in bytes. Typically, this is 4096 (4KB) but can range from 512 to 65536 bytes.
sb_dblocks
Total number of blocks available for data and metadata on the filesystem.
sb_rblocks
Number blocks in the real-time disk device. Refer to  HYPERLINK  \l "_Realtime_Devices" Real-time Devices for more information.
sb_rextents
Number of extents on the real-time device.
sb_uuid
UUID (Universally Unique ID) for the filesystem. Filesystems can be mounted by the UUID instead of device name.
sb_logstart
First block number for the journaling log if the log is internal (ie. not on a separate disk device). For an external log device, this will be zero (the log will also start on the first block on the log device).
sb_rootino
Root inode number for the filesystem. Typically, this is 128 when using a 4KB block size.
sb_rbmino
Bitmap inode for real-time extents.
sb_rsumino
Summary inode for real-time bitmap.
sb_rextsize
Realtime extent size in blocks.
sb_agblocks
Size of each AG in blocks. For the actual size of the last AG, refer to the  HYPERLINK  \l "_AG_Free_Space_Management" AG Freespace Block's agf_length value.
sb_agcount
Number of AGs in the filesystem.
sb_rbmblocks
Number of real-time bitmap blocks.
sb_logblocks
Number of blocks for the journaling log.
sb_versionnum
Filesystem version number. This is a bitmask specifying the features enabled when creating the filesystem. Any disk checking tools or drivers that do not recognize any set bits must not operate upon the filesystem. Most of the flags indicate features introduced over time. The value must be 4 including the following flags:
FlagDescriptionXFS_SB_VERSION_ATTRBITSet if any inode have extended attributes.XFS_SB_VERSION_NLINKBITSet if any inodes use 32-bit di_nlink values.XFS_SB_VERSION_QUOTABITQuotas are enabled on the filesystem. This also brings in the various quota fields in the superblock.XFS_SB_VERSION_ALIGNBITSet if sb_inoalignmt is used.XFS_SB_VERSION_DALIGNBITSet if sb_unit and sb_width are used.XFS_SB_VERSION_SHAREDBITSet if sb_shared_vn is used.XFS_SB_VERSION_LOGV2BITVersion 2 journaling logs are used.XFS_SB_VERSION_SECTORBITSet if sb_sectsize is not 512.XFS_SB_VERSION_EXTFLGBITUnwritten extents are used. This is always set.XFS_SB_VERSION_DIRV2BITVersion 2 directories are used. This is always set.XFS_SB_VERSION_MOREBITSBITSet if the sb_features2 field in the superblock contains more flags.
sb_sectsize
Specifies the underlying disk sector size in bytes. Majority of the time, this is 512 bytes. This determines the minimum I/O alignment including Direct I/O.
sb_inodesize
Size of the inode in bytes. The default is 256 (2 inodes per standard sector) but can be made as large as 2048 bytes when creating the filesystem.
sb_inopblock
Number of inodes per block. This is equivalent to sb_blocksize / sb_inodesize.
sb_fname[12]
Name for the filesystem. This value can be used in the mount command.
sb_blocklog
log2 value of sb_blocksize. In other terms, sb_blocksize = 2sb_blocklog.
sb_sectlog
log2 value of sb_sectsize.
sb_inodelog
log2 value of sb_inodesize.
sb_inopblog
log2 value of sb_inopblock.
sb_agblklog
log2 value of sb_agblocks (rounded up). This value is used to generate inode numbers and absolute block numbers defined in extent maps.
sb_rextslog
log2 value of sb_rextents.
sb_inprogress
Flag specifying that the filesystem is being created.
sb_imax_pct
Maximum percentage of filesystem space that can be used for inodes. The default value is 25%.
sb_icount
Global count for number inodes allocated on the filesystem. This is only maintained in the first superblock.
sb_ifree
Global count of free inodes on the filesystem. This is only maintained in the first superblock.
sb_fdblocks
Global count of free data blocks on the filesystem. This is only maintained in the first superblock.
sb_frextents
Global count of free real-time extents on the filesystem. This is only maintained in the first superblock.
sb_uquotino
Inode for user quotas. This and the following two quota fields only apply if XFS_SB_VERSION_QUOTABIT flag is set in sb_versionnum. Refer to  HYPERLINK  \l "_Quota_Inodes" Quota Inodes for more information.
sb_gquotino
Inode for group or project quotas. Group and Project quotas cannot be used at the same time.
sb_qflags
Quota flags. It can be a combination of the following flags:
FlagDescriptionXFS_UQUOTA_ACCTUser quota accounting is enabled.XFS_UQUOTA_ENFDUser quotas are enforced.XFS_UQUOTA_CHKDUser quotas have been checked and updated on disk.XFS_PQUOTA_ACCTProject quota accounting is enabled.XFS_OQUOTA_ENFDOther (group/project) quotas are enforced.XFS_OQUOTA_CHKDOther (group/project) quotas have been checked.XFS_GQUOTA_ACCTGroup quota accounting is enabled.sb_flags
Miscellaneous flags.
sb_shared_vn
Reserved and must be zero ("vn" stands for version number).
sb_inoalignmt
Inode chunk alignment in fsblocks. 
sb_unit
Underlying stripe or raid unit in blocks.
sb_width	
Underlying stripe or raid width in blocks.
sb_dirblklog
log2 value multiplier that determines the granularity of directory block allocations in fsblocks.
sb_logsectlog
log2 value of the log subvolume's sector size. This is only used if the journaling log is on a separate disk device (i.e. not internal).
sb_logsectsize
The log's sector size in bytes if the filesystem uses an external log device.
sb_logsunit
The log device's stripe or raid unit size. This only applies to version 2 logs (XFS_SB_VERSION_LOGV2BIT is set in sb_versionnum).
sb_features2
Additional version flags if XFS_SB_VERSION_MOREBITSBIT is set in sb_versionnum. The currently defined additional features include:
XFS_SB_VERSION2_LAZYSBCOUNTBIT  (0x02): Lazy global counters. Making a filesystem with this bit set can improve performance. The global free space and inode counts are only updated in the primary superblock when the filesystem is cleanly unmounted.
XFS_SB_VERSION2_ATTR2BIT  (0x08): Extended attributes version 2. Making a filesystem with this optimises the inode layout of extended attributes. 
XFS_SB_VERSION2_PARENTBIT  (0x10): Parent pointers. All inodes must have an extended attribute that points back to its parent inode. The primary purpose for this information is in backup systems.
xfs_db Example:
A filesystem is made on a single SATA disk with the following command:
# mkfs.xfs -i attr=2 -n size=16384 -f /dev/sda7
meta-data=/dev/sda7              isize=256    agcount=16, agsize=3923122 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=62769952, imaxpct=25
         =                       sunit=0      swidth=0 blks, unwritten=1
naming   =version 2              bsize=16384
log      =internal log           bsize=4096   blocks=30649, version=1
         =                       sectsz=512   sunit=0 blks
realtime =none                   extsz=65536  blocks=0, rtextents=0
And in xfs_db, inspecting the superblock:
xfs_db> sb
xfs_db> p
magicnum = 0x58465342
blocksize = 4096
dblocks = 62769952
rblocks = 0
rextents = 0
uuid = 32b24036-6931-45b4-b68c-cd5e7d9a1ca5
logstart = 33554436
rootino = 128
rbmino = 129
rsumino = 130
rextsize = 16
agblocks = 3923122
agcount = 16
rbmblocks = 0
logblocks = 30649
versionnum = 0xb084
sectsize = 512
inodesize = 256
inopblock = 16
fname = "\000\000\000\000\000\000\000\000\000\000\000\000"
blocklog = 12
sectlog = 9
inodelog = 8
inopblog = 4
agblklog = 22
rextslog = 0
inprogress = 0
imax_pct = 25
icount = 64
ifree = 61
fdblocks = 62739235
frextents = 0
uquotino = 0
gquotino = 0
qflags = 0
flags = 0
shared_vn = 0
inoalignmt = 2
unit = 0
width = 0
dirblklog = 2
logsectlog = 0
logsectsize = 0
logsunit = 0
features2 = 8
AG Free Space Management
The XFS filesystem tracks free space in an allocation group using two B+trees. One B+tree tracks space by block number, the second by the size of the free space block. This scheme allows XFS to quickly find free space near a given block or of a given size.
All block numbers, indexes and counts are AG relative.
AG Free Space Block
The second sector in an AG contains the information about the two free space B+trees and associated free space information for the AG. The "AG Free Space Block", also knows as the AGF, uses the following structure:
typedef struct xfs_agf {
	__be32	agf_magicnum;
	__be32	agf_versionnum;
	__be32	agf_seqno;
	__be32	agf_length;
	__be32	agf_roots[XFS_BTNUM_AGF];
	__be32	agf_spare0;
	__be32	agf_levels[XFS_BTNUM_AGF];
	__be32	agf_spare1;
	__be32	agf_flfirst;
	__be32	agf_fllast;
	__be32	agf_flcount;
	__be32	agf_freeblks;
	__be32	agf_longest;
	__be32	agf_btreeblks;
} xfs_agf_t;

The rest of the bytes in the sector are zeroed. XFS_BTNUM_AGF is set to 2, index 0 for the count B+tree and index 1 for the size B+tree.
agf_magicnum
Specifies the magic number for the AGF sector: "XAGF" (0x58414746).
agf_versionnum
Set to XFS_AGF_VERSION which is currently 1.
agf_seqno
Specifies the AG number for the sector.
agf_length
Specifies the size of the AG in filesystem blocks. For all AGs except the last, this must be equal to the superblock's sb_agblocks value. For the last AG, this could be less than the sb_agblocks value. It is this value that should be used to determine the size of the AG.
agf_roots
Specifies the block number for the root of the two free space B+trees. 
agf_levels
Specifies the level or depth of the two free space B+trees. For a fresh AG, this will be one, and the "roots" will point to a single leaf of level 0.
agf_flfirst
Specifies the index of the first "free list" block. Free lists are covered in more detail later on.
agf_fllast
Specifies the index of the last "free list" block.
agf_flcount
Specifies the number of blocks in the "free list".
agf_freeblks
Specifies the current number of free blocks in the AG.
agf_longest
Specifies the number of blocks of longest contiguous free space in the AG.
agf_btreeblks
Specifies the number of blocks used for the free space B+trees. This is only used if the XFS_SB_VERSION2_LAZYSBCOUNTBIT bit is set in sb_features2.
AG Free Space B+trees
The two Free Space B+trees store a sorted array of block offset and block counts in the leaves of the B+tree. The first B+tree is sorted by the offset, the second by the count or size.
The trees use the following header:
typedef struct xfs_btree_sblock {
	__be32	bb_magic;
	__be16	bb_level;
	__be16	bb_numrecs;
	__be32	bb_leftsib;
	__be32	bb_rightsib;
} xfs_btree_sblock_t;

Leaves contain a sorted array of offset/count pairs which are also used for node keys:
typedef struct xfs_alloc_rec {
	__be32	ar_startblock;
	__be32	ar_blockcount;
} xfs_alloc_rec_t, xfs_alloc_key_t;

Node pointers are an AG relative block pointer:
typedef __be32 xfs_alloc_ptr_t;

As the free space tracking is AG relative, all the block numbers are only 32-bits.
The bb_magic value depends on the B+tree: "ABTB" (0x41425442) for the block offset B+tree, "ABTC" (0x41425443) for the block count B+tree.
The xfs_btree_sblock_t header is used for intermediate B+tree node as well as the leaves.
For a typical 4KB filesystem block size, the offset for the xfs_alloc_ptr_t array would be 0xab0 (2736 decimal).
There are a series of macros in xfs_btree.h for deriving the offsets, counts, maximums, etc for the B+trees used in XFS.
The following diagram shows a single level B+tree which consists of one leaf:
 SHAPE  \* MERGEFORMAT 
With the intermediate nodes, the associated leaf pointers are stored in a separate array about two thirds into the block. The following diagram illustrates a 2-level B+tree for a free space B+tree:
 SHAPE  \* MERGEFORMAT 
AG Free List
The AG Free List is located in the 4th sector of each AG and is known as the AGFL. It is an array of AG relative block pointers for reserved space for growing the free space B+trees. This space cannot be used for general user data including inodes, data, directories and extended attributes.
With a freshly made filesystem, 4 blocks are reserved immediately after the free space B+tree root blocks (blocks 4 to 7). As they are used up as the free space fragments, additional blocks will be reserved from the AG and added to the free list array.
As the free list array is located within a single sector, a typical device will have space for 128 elements in the array (512 bytes per sector, 4 bytes per AG relative block pointer). The actual size can be determined by using the XFS_AGFL_SIZE macro.
Active elements in the array are specified by the  HYPERLINK  \l "_AG_Free_Space_Block" AGF's agf_flfirst, agf_fllast and agf_flcount values. The array is managed as a circular list.
 SHAPE  \* MERGEFORMAT 
The presence of these reserved block guarantees that the free space B+trees can be updated if any blocks are freed by extent changes in a full AG.
xfs_db Examples:
These examples are derived from an AG that has been deliberately fragmented.
The AGF:
xfs_db> agf <ag#>
xfs_db> p
magicnum = 0x58414746
versionnum = 1
seqno = 0
length = 3923122
bnoroot = 7
cntroot = 83343
bnolevel = 2
cntlevel = 2
flfirst = 22
fllast = 27
flcount = 6
freeblks = 3654234
longest = 3384327
btreeblks = 0

In the AGFL, the active elements are from 22 to 27 inclusive which are obtained from the flfirst and fllast values from the agf in the previous example:
xfs_db> agfl 0
xfs_db> p
bno[0-127] = 0:4 1:5 2:6 3:7 4:83342 5:83343 6:83344 7:83345 8:83346 9:83347 10:4 11:5 12:80205 13:80780 14:81496 15:81766 16:83346 17:4 18:5 19:80205 20:82449 21:81496 22:81766 23:82455 24:80780 25:5 26:80205 27:83344

The free space B+tree sorted by block offset, the root block is from the AGF's bnoroot value:
xfs_db> fsblock 7
xfs_db> type bnobt
xfs_db> p
magic = 0x41425442
level = 1
numrecs = 4
leftsib = null
rightsib = null
keys[1-4] = [startblock,blockcount] 
	1:[12,16] 2:[184586,3] 3:[225579,1] 4:[511629,1]
ptrs[1-4] = 1:2 2:83347 3:6 4:4
Blocks 2, 83347, 6 and 4 contain the leaves for the free space B+tree by starting block. Block 2 would contain offsets 16 up to but not including 184586 while block 4 would have all offsets from 511629 to the end of the AG.
The free space B+tree sorted by block count, the root block is from the AGF's cntroot value:
xfs_db> fsblock 83343
xfs_db> type cntbt
xfs_db> p
magic = 0x41425443
level = 1
numrecs = 4
leftsib = null
rightsib = null
keys[1-4] = [blockcount,startblock] 
	1:[1,81496] 2:[1,511729] 3:[3,191875] 4:[6,184595]
ptrs[1-4] = 1:3 2:83345 3:83342 4:83346
The leaf in block 3, in this example, would only contain single block counts. The offsets are sorted in ascending order if the block count is the same.
Inspecting the leaf in block 83346, we can see the largest block at the end:
xfs_db> fsblock 83346
xfs_db> type cntbt
xfs_db> p
magic = 0x41425443
level = 0
numrecs = 344
leftsib = 83342
rightsib = null
recs[1-344] = [startblock,blockcount] 
	1:[184595,6] 2:[187573,6] 3:[187776,6]
	...
	342:[513712,755] 343:[230317,258229] 344:[538795,3384327]
The longest block count must be the same as the AGF's longest value.

AG Inode Management
Inode Numbers
Inode numbers in XFS come in two forms: AG relative and absolute.
AG relative inode numbers always fit within 32 bits. The number of bits actually used is determined by the sum of the  HYPERLINK  \l "_Superblocks" superblock's sb_inoplog and sb_agblklog values. Relative inode numbers are found within the AG's inode structures.
Absolute inode numbers include the AG number in the high bits, above the bits used for the AG relative inode number. Absolute inode numbers are found in  HYPERLINK  \l "_Directories" directory entries.
 SHAPE  \* MERGEFORMAT 
Inode Information
Each AG manages its own inodes. The third sector in the AG contains information about the AG's inodes and is known as the AGI.
The AGI uses the following structure:
typedef struct xfs_agi {
	__be32	agi_magicnum;
	__be32	agi_versionnum;
	__be32	agi_seqno
	__be32	agi_length;
	__be32	agi_count;
	__be32	agi_root;
	__be32	agi_level;
	__be32	agi_freecount;
	__be32	agi_newino;
	__be32	agi_dirino;
	__be32	agi_unlinked[64];
} xfs_agi_t;
agi_magicnum
Specifies the magic number for the AGI sector: "XAGI" (0x58414749).
agi_versionnum
Set to XFS_AGI_VERSION which is currently 1.
agi_seqno
Specifies the AG number for the sector.
agi_length
Specifies the size of the AG in filesystem blocks. 
agi_count
Specifies the number of inodes allocated for the AG.
agi_root
Specifies the block number in the AG containing the root of the inode B+tree.
agi_level
Specifies the number of levels in the inode B+tree.
agi_freecount
Specifies the number of free inodes in the AG.
agi_newino
Specifies AG relative inode number most recently allocated.
agi_dirino
Deprecated and not used, it's always set to NULL (-1).
agi_unlinked[64]
Hash table of unlinked (deleted) inodes that are still being referenced. Refer to  HYPERLINK  \l "_Unlinked_Pointer" Inode Unlinked Pointer for more information.
Inode B+trees
Inodes are allocated in chunks of 64, and a B+tree is used to track these chunks of inodes as they are allocated and freed. The block containing root of the B+tree is defined by the AGI's agi_root value.
The B+tree header for the nodes and leaves use the xfs_btree_sblock structure which is the same as the header used in the  HYPERLINK  \l "_AG_Free_Space_B+trees" AGF B+trees:
typedef struct xfs_btree_sblock xfs_inobt_block_t;

Leaves contain an array of the following structure:
typedef struct xfs_inobt_rec {
	__be32		ir_startino;
	__be32		ir_freecount;
	__be64		ir_free;
} xfs_inobt_rec_t;

Nodes contain key/pointer pairs using the following types:
typedef struct xfs_inobt_key {
	__be32		ir_startino;
} xfs_inobt_key_t;

typedef __be32 xfs_inobt_ptr_t;

For the leaf entries, ir_startino specifies the starting inode number for the chunk, ir_freecount specifies the number of free entries in the chuck, and the ir_free is a 64 element bit array specifying which entries are free in the chunk.
The following diagram illustrates a single level inode B+tree:
 SHAPE  \* MERGEFORMAT 
And a 2-level inode B+tree:
 SHAPE  \* MERGEFORMAT 
xfs_db Examples:
TODO:
Real-time Devices
TODO:
On-disk Inode
All files, directories and links are stored on disk with inodes and descend from the root inode with it's number defined in the  HYPERLINK  \l "_Superblocks" superblock. The previous section on  HYPERLINK  \l "_AG_Inode_Management" AG Inode Management describes the allocation and management of inodes on disk. This section describes the contents of inodes themselves.
An inode is divided into 3 parts:  SHAPE  \* MERGEFORMAT 
The core contains what the inode represents, stat data and information describing the data and attribute forks. 
The di_u "data fork" contains normal data related to the inode. It's contents depends on the file type specified by di_core.di_mode (eg. regular file, directory, link, etc) and how much information is contained in the file which determined by di_core.di_format. The following union to represent this data is declared as follows:
union {
	xfs_bmdr_block_t	di_bmbt;
	xfs_bmbt_rec_t	di_bmx[1];
	xfs_dir2_sf_t	di_dir2sf;
	char	di_c[1];
	xfs_dev_t	di_dev;	
	uuid_t	di_muuid;
	char	di_symlink[1];
} di_u;
The di_a "attribute fork" contains extended attributes. Its layout is determined by the di_core.di_aformat value. Its representation is declared as follows:
union {
	xfs_bmdr_block_t	di_abmbt;	 
	xfs_bmbt_rec_t	di_abmx[1];   
	xfs_attr_shortform_t	di_attrsf; 
} di_a;
Note: The above two unions are rarely used in the XFS code, but the structures within the union are directly cast depending on the di_mode/di_format and di_aformat values. They are referenced in this document to make it easier to explain the various structures in use within the inode.
The remaining space in the inode after di_next_unlinked where the two forks are located is called the inode's "literal area". This starts at offset 100 (0x64) in the inode.
The space for each of the two forks in the literal area is determined by the inode size, and di_core.di_forkoff. The data fork is located between the start of the literal area and di_forkoff. The attribute fork is located between di_forkoff and the end of the inode.

Inode Core
The inode's core is 96 bytes in size and contains information about the file itself including most stat data information about data and attribute forks after the core within the inode. It uses the following structure:
typedef struct xfs_dinode_core {
	__uint16_t	di_magic;
	__uint16_t	di_mode;
	__int8_t	di_version;
	__int8_t	di_format;
	__uint16_t	di_onlink;
	__uint32_t	di_uid;	
	__uint32_t	di_gid;	
	__uint32_t	di_nlink;
	__uint16_t	di_projid;
	__uint8_t	di_pad[8];
	__uint16_t	di_flushiter;
	xfs_timestamp_t	di_atime;
	xfs_timestamp_t	di_mtime;
	xfs_timestamp_t	di_ctime;
	xfs_fsize_t	di_size;
	xfs_drfsbno_t	di_nblocks;
	xfs_extlen_t	di_extsize;
	xfs_extnum_t	di_nextents;
	xfs_aextnum_t	di_anextents;
	__uint8_t	di_forkoff;
	__int8_t	di_aformat;
	__uint32_t	di_dmevmask;
	__uint16_t	di_dmstate;
	__uint16_t	di_flags;
	__uint32_t	di_gen;	
} xfs_dinode_core_t;
di_magic
The inode signature where these two bytes are 0x494e, or "IN" in ASCII.
di_mode
Specifies the mode access bits and type of file using the standard S_Ixxx values defined in stat.h. 
di_version
Specifies the inode version which currently can only be 1 or 2. The inode version specifies the usage of the di_onlink, di_nlink and di_projid values in the inode core. Initially, inodes are created as v1 but can be converted on the fly to v2 when required.
di_format
Specifies the format of the data fork in conjunction with the di_mode type. This can be one of several values. For directories and links, it can be "local" where all metadata associated with the file is within the inode, "extents" where the inode contains an array of extents to other filesystem blocks which contain the associated metadata or data or "btree" where the inode contains a B+tree root node which points to filesystem blocks containing the metadata or data. Migration between the formats depends on the amount of metadata associated with the inode. "dev" is used for character and block devices while "uuid" is currently not used.
typedef enum xfs_dinode_fmt {
	XFS_DINODE_FMT_DEV,	
	XFS_DINODE_FMT_LOCAL,	
	XFS_DINODE_FMT_EXTENTS,	
	XFS_DINODE_FMT_BTREE,	
	XFS_DINODE_FMT_UUID	
} xfs_dinode_fmt_t;
di_onlink
In v1 inodes, this specifies the number of links to the inode from directories. When the number exceeds 65535, the inode is converted to v2 and the link count is stored in di_nlink.
di_uid
Specifies the owner's UID of the inode. 
di_gid
Specifies the owner's GID of the inode.
di_nlink
Specifies the number of links to the inode from directories. This is maintained for both inode versions for current versions of XFS. Old versions of XFS did not support v2 inodes, and therefore this value was never updated and was classed as reserved space (part of di_pad).
di_projid
Specifies the owner's project ID in v2 inodes. An inode is converted to v2 if the project ID is set.  This value must be zero for v1 inodes.
di_pad[8]
Reserved, must be zero.
di_flushiter
Incremented on flush.
di_atime
Specifies the last access time of the files using UNIX time conventions the following structure. This value maybe undefined if the filesystem is mounted with the "noatime" option.
typedef struct xfs_timestamp {
	__int32_t	t_sec;	
	__int32_t	t_nsec;	
} xfs_timestamp_t;
di_mtime
Specifies the last time the file was modified.
di_ctime
Specifies when the inode's status was last changed. 
di_size
Specifies the EOF of the inode in bytes. This can be larger or smaller than the extent space (therefore actual disk space) used for the inode. For regular files, this is the filesize in bytes, directories, the space taken by directory entries and for links, the length of the symlink.
di_nblocks
Specifies the number of filesystem blocks used to store the inode's data including relevant metadata like B+trees. This does not include blocks used for extended attributes.
di_extsize
Specifies the extent size for filesystems with real-time devices and an extent size hint for standard filesystems. For normal filesystems, and with directories, the XFS_DIFLAG_EXTSZINHERIT flag must be set in di_flags if this field is used. Inodes created in these directories will inherit the di_extsize value and have XFS_DIFLAG_EXTSIZE set in their di_flags. When a file is written to beyond allocated space, XFS will attempt to allocate additional disk space based on this value.
di_nextents
Specifies the number of data extents associated with this inode.
di_anextents
Specifies the number of extended attribute extents associated with this inode.
di_forkoff
Specifies the offset into the inode's literal area where the extended attribute fork starts. This is an 8-bit value that is multiplied by 8 to determine the actual offset in bytes (ie. attribute data is 64-bit aligned). This also limits the maximum size of the inode to 2048 bytes. This value is initially zero until an extended attribute is created. When in attribute is added, the nature of di_forkoff depends on the XFS_SB_VERSION2_ATTR2BIT  flag in the superblock. Refer to the  HYPERLINK  \l "_Extended_Attribute_Versions" Extended Attribute Versions section for more details.
di_aformat
Specifies the format of the attribute fork. This uses the same values as di_format, but restricted to "local", "extents" and "btree" formats for extended attribute data.
di_dmevmask
DMAPI event mask.
di_dmstate
DMAPI state.
di_flags
Specifies flags associated with the inode. This can be a combination of the following values:
FlagDescriptionXFS_DIFLAG_REALTIMEThe inode's data is located on the real-time device.XFS_DIFLAG_PREALLOCThe inode's extents have been preallocated.XFS_DIFLAG_NEWRTBMSpecifies the sb_rbmino uses the new real-time bitmap formatXFS_DIFLAG_IMMUTABLESpecifies the inode cannot be modified.XFS_DIFLAG_APPENDThe inode is in append only mode.XFS_DIFLAG_SYNCThe inode is written synchronously.XFS_DIFLAG_NOATIMEThe inode's di_atime is not updated.XFS_DIFLAG_NODUMPSpecifies the inode is to be ignored by xfsdump.XFS_DIFLAG_RTINHERITFor directory inodes, new inodes inherit the XFS_DIFLAG_REALTIME bit.XFS_DIFLAG_PROJINHERITFor directory inodes, new inodes inherit the di_projid value.XFS_DIFLAG_NOSYMLINKSFor directory inodes, symlinks cannot be created.XFS_DIFLAG_EXTSIZESpecifies the extent size for real-time files or a and extent size hint for regular files.XFS_DIFLAG_EXTSZINHERITFor directory inodes, new inodes inherit the di_extsize value.XFS_DIFLAG_NODEFRAGSpecifies the inode is to be ignored when defragmenting the filesystem.di_gen
A generation number used for inode identification. This is used by tools that do inode scanning such as backup tools and xfsdump. An inode's generation number can change by unlinking and creating a new file that reuses the inode.
Unlinked Pointer
The di_next_unlinked value in the inode is used to track inodes that have been unlinked (deleted) but which are still referenced. When an inode is unlinked and there is still an outstanding reference, the inode is added to one of the  HYPERLINK  \l "_AG_Inode_Management" AGI's agi_unlinked hash buckets. The AGI unlinked bucket points to an inode and the di_next_unlinked value points to the next inode in the chain. The last inode in the chain has di_next_unlinked set to NULL (-1).
Once the last reference is released, the inode is removed from the unlinked hash chain, and di_next_unlinked is set to NULL. In the case of a system crash, XFS recovery will complete the unlink process for any inodes found in these lists.
The only time the unlinked fields can be seen to be used on disk is either on an active filesystem or a crashed system. A cleanly unmounted or recovered filesystem will not have any inodes in these unlink hash chains.
 SHAPE  \* MERGEFORMAT 
Data Fork
The structure of the inode's data fork based is on the inode's type and di_format. It always starts at offset 100 (0x64) in the inode's space which is the start of the inode's "literal area". The size of the data fork is determined by the type and format. The maximum size is determined by the inode size and di_forkoff. In code, use the XFS_DFORK_PTR macro specifying XFS_DATA_FORK for the "which" parameter. Alternatively, the XFS_DFORK_DPTR macro can be used.
Each of the following sub-sections summarises the contents of the data fork based on the inode type.
Regular Files (S_IFREG)
The data fork specifies the file's data extents. The extents specify where the file's actual data is located within the filesystem. Extents can have 2 formats which is defined by the di_format value: 
XFS_DINODE_FMT_EXTENTS: The extent data is fully contained within the inode which contains an array of extents to the filesystem blocks for the file's data. To access the extents, cast the return value from XFS_DFORK_DPTR to xfs_bmbt_rec_t*.
XFS_DINODE_FMT_BTREE: The extent data is contained in the leaves of a B+tree. The inode contains the root node of the tree and is accessed by casting the return value from XFS_DFORK_DPTR to xfs_bmdr_block_t*.
Details for each of these data extent formats are covered in the  HYPERLINK  \l "_Data_Extents_1" Data Extents section later on.
Directories (S_IFDIR)
The data fork contains the directory's entries and associated data. The format of the entries is also determined by the di_format value and can be one of 3 formats:
XFS_DINODE_FMT_LOCAL: The directory entries are fully contained within the inode. This is accessed by casting the value from XFS_DFORK_DPTR to xfs_dir2_sf_t*.
XFS_DINODE_FMT_EXTENTS: The actual directory entries are located in another filesystem block, the inode contains an array of extents to these filesystem blocks (xfs_bmbt_rec_t*).
XFS_DINODE_FMT_BTREE: The directory entries are contained in the leaves of a B+tree. The inode contains the root node (xfs_bmdr_block_t*).
Details for each of these directory formats are covered in the  HYPERLINK  \l "_Directories" Directories section later on.
Symbolic Links (S_IFLNK)
The data fork contains the contents of the symbolic link. The format of the link is determined by the di_format value and can be one of 2 formats:
XFS_DINODE_FMT_LOCAL: The symbolic link is fully contained within the inode. This is accessed by casting the return value from XFS_DFORK_DPTR to char*.
XFS_DINODE_FMT_EXTENTS: The actual symlink is located in another filesystem block, the inode contains the extents to these filesystem blocks (xfs_bmbt_rec_t*).
Details for symbolic links is covered in the  HYPERLINK  \l "_Symbolic_Links" Symbolic Links section later on.
Other File Types
For character and block devices (S_IFCHR and S_IFBLK), cast the value from XFS_DFORK_DPTR to xfs_dev_t*.
Attribute Fork
The attribute fork in the inode always contains the location of the extended attributes associated with the inode. 
The location of the attribute fork in the inode's literal area (offset 100 to the end of the inode) is specified by the di_forkoff value in the inode's core. If this value is zero, the inode does not contain any extended attributes. Non-zero, the byte offset into the literal area = di_forkoff * 8, which also determines the 2048 byte maximum size for an inode. Attributes must be allocated on a 64-bit boundary on the disk. To access the extended attributes in code, use the XFS_DFORK_PTR macro specifying XFS_ATTR_FORK for the "which" parameter. Alternatively, the XFS_DFORK_APTR macro can be used.
Which structure in the attribute fork is used depends on the di_aformat value in the inode. It can be one of the following values:
XFS_DINODE_FMT_LOCAL: The extended attributes are contained entirely within the inode. This is accessed by casting the value from XFS_DFORK_APTR to xfs_attr_shortform_t*.
XFS_DINODE_FMT_EXTENTS: The attributes are located in another filesystem block, the inode contains an array of pointers to these filesystem blocks. They are accessed by casting the value from XFS_DFORK_APTR to xfs_bmbt_rec_t*.
XFS_DINODE_FMT_BTREE: The extents for the attributes are contained in the leaves of a B+tree. The inode contains the root node of the tree and is accessed by casting the value from XFS_DFORK_APTR to xfs_bmdr_block_t*.
Detailed information on the layouts of extended attributes are covered in the  HYPERLINK  \l "_Extended_Attributes" Extended Attributes section later on in this document.
Extended Attribute Versions
Extended attributes come in two versions: "attr1" or "attr2". The attribute version is specified by the XFS_SB_VERSION2_ATTR2BIT  flag in the sb_features2 field in the superblock. It determines how the inode's extra space is split between di_u and di_a forks which also determines how the di_forkoff value is maintained in the inode's core.
With "attr1" attributes, the di_forkoff is set to somewhere in the middle of the space between the core and end of the inode and never changes (which has the effect of artificially limiting the space for data information). As the data fork grows, when it gets to di_forkoff, it will move the data to the level format level (ie. local > extent > btree). If very little space is used for either attributes or data, then a good portion of the available inode space is wasted with this version.
"Attr2" was introduced to maximum the utilisation of the inode's literal area. The di_forkoff starts at the end of the inode and works its way to the data fork as attributes are added. Attr2 is highly recommended if extended attributes are used.
The following diagram compares the two versions:
 SHAPE  \* MERGEFORMAT 
Data Extents
XFS allocates space for a file using extents: starting location and length. XFS extents also specify the file's logical starting offset for a file. This allows a files extent map to automatically support sparse files (i.e. "holes" in the file). A flag is also used to specify if the extent has been preallocated and not yet been written to (unwritten extent).
A file can have more than one extent if one chunk of contiguous disk space is not available for the file. As a file grows, the XFS space allocator will attempt to keep space contiguous and merge extents. If more than one file is being allocated space in the same AG at the same time, multiple extents for the files will occur as the extents get interleaved. The effect of this can vary depending on the extent allocator used in the XFS driver.
An extent is 128 bits in size and uses the following packed layout:
 SHAPE  \* MERGEFORMAT 
The extent is represented by the xfs_bmbt_rec_t structure which uses a big endian format on-disk. In-core management of extents use the xfs_bmbt_irec_t structure which is the unpacked version of xfs_bmbt_rec_t:
typedef struct xfs_bmbt_irec {
	xfs_fileoff_t	br_startoff;
	xfs_fsblock_t	br_startblock;
	xfs_filblks_t	br_blockcount;
	xfs_exntst_t	br_state;
} xfs_bmbt_irec_t;
The extent br_state field uses the following enum declaration:
typedef enum {
	XFS_EXT_NORM, 
	XFS_EXT_UNWRITTEN,
	XFS_EXT_INVALID
} xfs_exntst_t;
Some other points about extents:
The xfs_bmbt_rec_32_t and xfs_bmbt_rec_64_t structures are effectively the same as xfs_bmbt_rec_t, just different representations of the same 128 bits in on-disk big endian format.
When a file is created and written to, XFS will endeavour to keep the extents within the same AG as the inode. It may use a different AG if the AG is busy or there is no space left in it.
If a file is zero bytes long, it will have no extents, di_nblocks and di_nexents will be zero. Any file with data will have at least one extent, and each extent can use from 1 to over 2 million blocks (221) on the filesystem. For a default 4KB block size filesystem, a single extent can be up to 8GB in length. 
The following two subsections cover the two methods of storing extent information for a file. The first is the fastest and simplest where the inode completely contains an extent array to the file's data. The second is slower and more complex B+tree which can handle thousands to millions of extents efficiently.

Extent List
Local extents are where the entire extent array is stored within the inode's data fork itself. This is the most optimal in terms of speed and resource consumption. The trade-off is the file can only have a few extents before the inode runs out of space.
The "data fork" of the inode contains an array of extents, the size of the array determined by the inode's di_nextents value.
 SHAPE  \* MERGEFORMAT 
The number of extents that can fit in the inode depends on the inode size and di_forkoff. For a default 256 byte inode with no extended attributes, a file can up to 19 extents with this format. Beyond this, extents have to use the B+tree format.
xfs_db Example:
An 8MB file with one extent:
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 0100644
core.version = 1
core.format = 2 (extents)
...
core.size = 8294400
core.nblocks = 2025
core.extsize = 0
core.nextents = 1
core.naextents = 0
core.forkoff = 0
...
u.bmx[0] = [startoff,startblock,blockcount,extentflag] 
0:[0,25356,2025,0]
A 24MB file with three extents:
xfs_db> inode <inode#>
xfs_db> p
...
core.format = 2 (extents)
...
core.size = 24883200
core.nblocks = 6075
core.nextents = 3
...
u.bmx[0-2] = [startoff,startblock,blockcount,extentflag] 
0:[0,27381,2025,0] 
1:[2025,31431,2025,0] 
2:[4050,35481,2025,0]
Raw disk version of the inode with the third extent highlighted (di_u always starts at offset 0x64):
xfs_db> type text
xfs_db> p
00:  49 4e 81 a4 01 02 00 01 00 00 00 00 00 00 00 00  IN..............
10:  00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01  ................
20:  44 b6 88 dd 2f 8a ed d0 44 b6 88 f7 10 8c 5b d0  D.......D.......
30:  44 b6 88 f7 10 8c 5b d0 00 00 00 00 01 7b b0 00  D...............
40:  00 00 00 00 00 00 17 bb 00 00 00 00 00 00 00 03  ................
50:  00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................
60:  ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 0d  ................
70:  5e a0 07 e9 00 00 00 00 00 0f d2 00 00 00 00 0f  ................
80:  58 e0 07 e9 00 00 00 00 00 1f a4 00 00 00 00 11  X...............
90:  53 20 07 e9 00 00 00 00 00 00 00 00 00 00 00 00  S...............
a0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
b0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
c0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
d0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
e0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
f0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
We can expand the highlighted section into the following bit array from MSB to LSB with the file offset and the block count highlighted:
127-96:  0000 0000  0000 0000  0000 0000  0000 0000
 95-64:  0000 0000  0001 1111  1010 0100  0000 0000
 63-32:  0000 0000  0000 0000  0000 0000  0000 1111
 31-0 :  0101 1000  1110 0000  0000 0111  1110 1001

Grouping by highlights we get: 
   file offset = 0x0fd2 (4050)
   start block = 0x7ac7 (31431)
   block count = 0x07e9 (2025)
A 4MB file with two extents and a hole in the middle, the first extent containing 64KB of data, the second about 4MB in containing 32KB (write 64KB, lseek ~4MB, write 32KB operations):
xfs_db> inode <inode#>
xfs_db> p
...
core.format = 2 (extents)
...
core.size = 4063232
core.nblocks = 24
core.nextents = 2
...
u.bmx[0-1] = [startoff,startblock,blockcount,extentflag] 
0:[0,37506,16,0] 
1:[984,37522,8,0]

B+tree Extent List
Beyond the simple extent array, to efficiently manage large extent maps, XFS uses B+trees. The root node of the B+tree is stored in the inode's data fork. All block pointers for extent B+trees are 64-bit absolute block numbers.
For a single level B+tree, the root node points to the B+tree's leaves. Each leaf occupies one filesystem block and contains a header and an array of extents sorted by the file's offset. Each leaf has left and right (or backward and forward) block pointers to adjacent leaves. For a standard 4KB filesystem block, a leaf can contain up to 254 extents before a B+tree rebalance is triggered. 
For a multi-level B+tree, the root node points to other B+tree nodes which eventually point to the extent leaves. B+tree keys are based on the file's offset. The nodes at each level in the B+tree point to the adjacent nodes.
The base B+tree node is used for extents, directories and extended attributes. The structures used for inode's B+tree root are:
typedef struct xfs_bmdr_block {
	__be16	bb_level;
	__be16	bb_numrecs;
} xfs_bmdr_block_t;

typedef struct xfs_bmbt_key {
	xfs_dfiloff_t	br_startoff;
} xfs_bmbt_key_t, xfs_bmdr_key_t;

typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
On disk, the B+tree node starts with the xfs_bmbr_block_t header followed by an array of xfs_bmbt_key_t values and then an array of xfs_bmbt_ptr_t values. The size of both arrays is specified by the header's bb_numrecs value.
The root node in the inode can only contain up to 19 key/pointer pairs for a standard 256 byte inode before a new level of nodes is added between the root and the leaves. This will be less if di_forkoff is not zero (i.e. attributes are in use on the inode).
The subsequent nodes and leaves of the B+tree use the xfs_bmbt_block_t declaration:
typedef struct xfs_btree_lblock xfs_bmbt_block_t;

typedef struct xfs_btree_lblock {
	__be32	bb_magic;
	__be16	bb_level;
	__be16	bb_numrecs;
	__be64	bb_leftsib;
	__be64	bb_rightsib;
} xfs_btree_lblock_t;
For intermediate nodes, the data following xfs_bmbt_block_t is the same as the root node: array of xfs_bmbt_key_t value followed by an array of xfs_bmbt_ptr_t values that starts halfway through the block (offset 0x808 for a 4096 byte filesystem block).
For leaves, an array of xfs_bmbt_rec_t extents follow the xfs_bmbt_block_t header.
Nodes and leaves use the same value for bb_magic: 
#define XFS_BMAP_MAGIC	0x424d4150	/* 'BMAP' */
The bb_level value determines if the node is an intermediate node or a leaf. Leaves have a bb_level of zero, nodes are one or greater.
Intermediate nodes, like leaves, can contain up to 254 pointers to leaf blocks for a standard 4KB filesystem block size as both the keys and pointers are 64 bits in size.
The following diagram illustrates a single level extent B+tree:
 SHAPE  \* MERGEFORMAT 
The following diagram illustrates a two level extent B+tree:
 SHAPE  \* MERGEFORMAT 
xfs_db Example:
TODO:

Directories
Only v2 directories covered here. v1 directories are obsolete.
The size of a "directory block" is defined by the  HYPERLINK  \l "_Superblocks" superblock's sb_dirblklog value. The size in bytes = sb_blocksize * 2sb_dirblklog. For example, if sb_blocksize = 4096, sb_dirblklog = 2, the directory block size is 16384 bytes. Directory blocks are always allocated in multiples based on sb_dirblklog.  Directory blocks cannot be more that 65536 bytes in size. Note: the term "block" in this section will refer to directory blocks, not filesystem blocks unless otherwise specified.
All directory entries contain the following "data":
Entry's name (counted string consisting of a single byte namelen followed by name consisting of an array of 8-bit chars without a NULL terminator).
Entry's  HYPERLINK  \l "_Inode_Numbers" absolute inode number, which are always 64 bits (8 bytes) in size except a special case for shortform directories.
An offset or tag used for iterative readdir calls.
All non-shortform directories also contain two additional structures: "leaves" and "freespace indexes".
Leaves contain the sorted hashed name value (xfs_da_hashname() in xfs_da_btree.c) and associated "address" which points to the effective offset into the directory's data structures. Leaves are used to optimise lookup operations.
Freespace indexes contain free space/empty entry tracking for quickly finding an appropriately sized location for new entries. They maintain the largest free space for each "data" block.
A few common types are used for the directory structures:
typedef __uint16_t	xfs_dir2_data_off_t;
typedef __uint32_t	xfs_dir2_dataptr_t;

Shortform Directories
Directory entries are stored within the inode.
Only data stored is the name, inode # and offset, no "leaf" or "freespace index" information is required as an inode can only store a few entries.
"." is not stored (as it's in the inode itself), and ".." is a dedicated parent field in the header.
The number of directories that can be stored in an inode depends on the  HYPERLINK  \l "_On-disk_Inode" inode size, the number of entries, the length of the entry names and extended attribute data.
Once the number of entries exceed the space available in the inode, the format is converted to a " HYPERLINK  \l "_Single_Block_Directories" Block Directory".
Shortform directory data is packed as tightly as possible on the disk with the remaining space zeroed:
typedef struct xfs_dir2_sf {
	xfs_dir2_sf_hdr_t	hdr;	
	xfs_dir2_sf_entry_t	list[1];
} xfs_dir2_sf_t;

typedef struct xfs_dir2_sf_hdr {
	__uint8_t	count;	
	__uint8_t	i8count;
	xfs_dir2_inou_t	parent;
} xfs_dir2_sf_hdr_t;

typedef struct xfs_dir2_sf_entry {
	__uint8_t	namelen;
	xfs_dir2_sf_off_t	offset;	
	__uint8_t	name[1];
	xfs_dir2_inou_t	inumber;
} xfs_dir2_sf_entry_t;
 SHAPE  \* MERGEFORMAT 
Inode numbers are stored using 4 or 8 bytes depending on whether all the inode numbers for the directory fit in 4 bytes (32 bits) or not. If all inode numbers fit in 4 bytes, the header's count value specifies the number of entries in the directory and i8count will be zero. If any inode number exceeds 4 bytes, all inode numbers will be 8 bytes in size and the header's i8count value specifies the number of entries and count will be zero. The following union covers the shortform inode number structure:
typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t;
typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t;

typedef union {
	xfs_dir2_ino8_t	i8;
	xfs_dir2_ino4_t	i4;
} xfs_dir2_inou_t;
xfs_db Example:
A directory is created with 4 files, all inode numbers fitting within 4 bytes:
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 1 (local)
core.nlinkv1 = 2
...
core.size = 94
core.nblocks = 0
core.extsize = 0
core.nextents = 0
...
u.sfdir2.hdr.count = 4
u.sfdir2.hdr.i8count = 0
u.sfdir2.hdr.parent.i4 = 128			/* parent = root inode */
u.sfdir2.list[0].namelen = 15
u.sfdir2.list[0].offset = 0x30
u.sfdir2.list[0].name = "frame000000.tst"
u.sfdir2.list[0].inumber.i4 = 25165953
u.sfdir2.list[1].namelen = 15
u.sfdir2.list[1].offset = 0x50
u.sfdir2.list[1].name = "frame000001.tst"
u.sfdir2.list[1].inumber.i4 = 25165954
u.sfdir2.list[2].namelen = 15
u.sfdir2.list[2].offset = 0x70
u.sfdir2.list[2].name = "frame000002.tst"
u.sfdir2.list[2].inumber.i4 = 25165955
u.sfdir2.list[3].namelen = 15
u.sfdir2.list[3].offset = 0x90
u.sfdir2.list[3].name = "frame000003.tst"
u.sfdir2.list[3].inumber.i4 = 25165956
The raw data on disk with the first entry highlighted. The six byte header precedes the first entry:
xfs_db> type text
xfs_db> p
00:  49 4e 41 ed 01 01 00 02 00 00 00 00 00 00 00 00  INA.............
10:  00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 02  ................
20:  44 ad 3a 83 1d a9 4a d0 44 ad 3a ab 0b c7 a7 d0  D.....J.D.......
30:  44 ad 3a ab 0b c7 a7 d0 00 00 00 00 00 00 00 5e  D...............
40:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
50:  00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................
60:  ff ff ff ff 04 00 00 00 00 80 0f 00 30 66 72 61  ............0fra
70:  6d 65 30 30 30 30 30 30 2e 74 73 74 01 80 00 81  me000000.tst....
80:  0f 00 50 66 72 61 6d 65 30 30 30 30 30 31 2e 74  ..Pframe000001.t
90:  73 74 01 80 00 82 0f 00 70 66 72 61 6d 65 30 30  st......pframe00
a0:  30 30 30 32 2e 74 73 74 01 80 00 83 0f 00 90 66  0002.tst.......f
b0:  72 61 6d 65 30 30 30 30 30 33 2e 74 73 74 01 80  rame000003.tst..
c0:  00 84 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
...
Next, an entry is deleted (frame000001.tst), and any entries after the deleted entry are moved or compacted to "cover" the hole:
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 1 (local)
core.nlinkv1 = 2
...
core.size = 72
core.nblocks = 0
core.extsize = 0
core.nextents = 0
...
u.sfdir2.hdr.count = 3
u.sfdir2.hdr.i8count = 0
u.sfdir2.hdr.parent.i4 = 128
u.sfdir2.list[0].namelen = 15
u.sfdir2.list[0].offset = 0x30
u.sfdir2.list[0].name = "frame000000.tst"
u.sfdir2.list[0].inumber.i4 = 25165953
u.sfdir2.list[1].namelen = 15
u.sfdir2.list[1].offset = 0x70
u.sfdir2.list[1].name = "frame000002.tst"
u.sfdir2.list[1].inumber.i4 = 25165955
u.sfdir2.list[2].namelen = 15
u.sfdir2.list[2].offset = 0x90
u.sfdir2.list[2].name = "frame000003.tst"
u.sfdir2.list[2].inumber.i4 = 25165956
Raw disk data, the space beyond the shortform entries is invalid and could be non-zero:
xfs_db> type text
xfs_db> p
00:  49 4e 41 ed 01 01 00 02 00 00 00 00 00 00 00 00  INA.............
10:  00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 03  ................
20:  44 b2 45 a2 09 fd e4 50 44 b2 45 a3 12 ee b5 d0  D.E....PD.E.....
30:  44 b2 45 a3 12 ee b5 d0 00 00 00 00 00 00 00 48  D.E............H
40:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
50:  00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................
60:  ff ff ff ff 03 00 00 00 00 80 0f 00 30 66 72 61  ............0fra
70:  6d 65 30 30 30 30 30 30 2e 74 73 74 01 80 00 81  me000000.tst....
80:  0f 00 70 66 72 61 6d 65 30 30 30 30 30 32 2e 74  ..pframe000002.t
90:  73 74 01 80 00 83 0f 00 90 66 72 61 6d 65 30 30  st.......frame00
a0:  30 30 30 33 2e 74 73 74 01 80 00 84 0f 00 90 66  0003.tst.......f
b0:  72 61 6d 65 30 30 30 30 30 33 2e 74 73 74 01 80  rame000003.tst..
c0:  00 84 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
...
TODO: 8-byte inode number example
Block Directories
When the shortform directory space exceeds the space in an inode, the directory data is moved into a new single directory block outside the inode. The inode's format is changed from "local" to "extent". Following is a list of points about block directories.
All directory data is stored within the one directory block, including "." and ".." entries which are mandatory. 
The block also contains "leaf" and "freespace index " information.
The location of the block is defined by the inode's  HYPERLINK  \l "_In-core_Extent_List" in-core extent list: the di_u.u_bmx[0] value. The file offset in the extent must always be zero and the length = (directory block size / filesystem block size). The block number points to the filesystem block containing the directory data.
Block directory data is stored in the following structures:
#define XFS_DIR2_DATA_FD_COUNT	3

typedef struct xfs_dir2_block {
	xfs_dir2_data_hdr_t	hdr;	
	xfs_dir2_data_union_t	u[1];
	xfs_dir2_leaf_entry_t	leaf[1];
	xfs_dir2_block_tail_t	tail;
} xfs_dir2_block_t;

typedef struct xfs_dir2_data_hdr {
	__uint32_t	magic;	
	xfs_dir2_data_free_t	bestfree[XFS_DIR2_DATA_FD_COUNT];
} xfs_dir2_data_hdr_t;

typedef struct xfs_dir2_data_free {
	xfs_dir2_data_off_t	offset;	
	xfs_dir2_data_off_t	length;	
} xfs_dir2_data_free_t;

typedef union {
	xfs_dir2_data_entry_t	entry;
	xfs_dir2_data_unused_t	unused;
} xfs_dir2_data_union_t;

typedef struct xfs_dir2_data_entry {
	xfs_ino_t	inumber;
	__uint8_t	namelen;
	__uint8_t	name[1];
	xfs_dir2_data_off_t	tag;	
} xfs_dir2_data_entry_t;

typedef struct xfs_dir2_data_unused {
	__uint16_t	freetag;  /* 0xffff */
	xfs_dir2_data_off_t	length;	
	xfs_dir2_data_off_t	tag;	
} xfs_dir2_data_unused_t;

typedef struct xfs_dir2_leaf_entry {
	xfs_dahash_t	hashval;
	xfs_dir2_dataptr_t	address;
} xfs_dir2_leaf_entry_t;

typedef struct xfs_dir2_block_tail {
	__uint32_t	count;		
	__uint32_t	stale;		
} xfs_dir2_block_tail_t;
 SHAPE  \* MERGEFORMAT 
The tag in the xfs_dir2_data_entry_t structure stores its offset from the start of the block.
Start of a free space region is marked with the xfs_dir2_data_unused_t structure where the freetag is 0xffff. The freetag and length overwrites the inumber for an entry. The tag is located at length - sizeof(tag) from the start of the unused entry on-disk. 
The bestfree array in the header points to as many as three of the largest spaces of free space within the block for storing new entries sorted by largest to third largest. If there are less than 3 empty regions, the remaining bestfree elements are zeroed. The offset specifies the offset from the start of the block in bytes, and the length specifies the size of the free space in bytes. The location each points to must contain the above xfs_dir2_data_unused_t structure. As a block cannot exceed 64KB in size, each is a 16-bit value. bestfree is used to optimise the time required to locate space to create an entry. It saves scanning through the block to find a location suitable for every entry created.
The tail structure specifies the number of elements in the leaf array and the number of stale entries in the array. The tail is always located at the end of the block. The leaf data immediately precedes the tail structure.
The leaf array, which grows from the end of the block just before the tail structure, contains an array of hash/address pairs for quickly looking up a name by a hash value. Hash values are covered by the introduction to directories. The address on-disk is the offset into the block divided by 8 (XFS_DIR2_DATA_ALIGN). Hash/address pairs are stored on disk to optimise lookup speed for large directories. If they were not stored, the hashes have to be calculated for all entries each time a lookup occurs in a directory.
xfs_db Example:
A directory is created with 8 entries, directory block size = filesystem block size:
xfs_db> sb 0
xfs_db> p
magicnum = 0x58465342
blocksize = 4096
...
dirblklog = 0
...
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 2 (extents)
core.nlinkv1 = 2
...
core.size = 4096
core.nblocks = 1
core.extsize = 0
core.nextents = 1
...
u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,2097164,1,0]

Go to the "startblock" and show the raw disk data:
xfs_db> dblock 0
xfs_db> type text
xfs_db> p
000:  58 44 32 42 01 30 0e 78 00 00 00 00 00 00 00 00  XD2B.0.x........
010:  00 00 00 00 02 00 00 80 01 2e 00 00 00 00 00 10  ................
020:  00 00 00 00 00 00 00 80 02 2e 2e 00 00 00 00 20  ................
030:  00 00 00 00 02 00 00 81 0f 66 72 61 6d 65 30 30  .........frame00
040:  30 30 30 30 2e 74 73 74 80 8e 59 00 00 00 00 30  0000.tst..Y....0
050:  00 00 00 00 02 00 00 82 0f 66 72 61 6d 65 30 30  .........frame00
060:  30 30 30 31 2e 74 73 74 d0 ca 5c 00 00 00 00 50  0001.tst.......P
070:  00 00 00 00 02 00 00 83 0f 66 72 61 6d 65 30 30  .........frame00
080:  30 30 30 32 2e 74 73 74 00 00 00 00 00 00 00 70  0002.tst.......p
090:  00 00 00 00 02 00 00 84 0f 66 72 61 6d 65 30 30  .........frame00
0a0:  30 30 30 33 2e 74 73 74 00 00 00 00 00 00 00 90  0003.tst........
0b0:  00 00 00 00 02 00 00 85 0f 66 72 61 6d 65 30 30  .........frame00
0c0:  30 30 30 34 2e 74 73 74 00 00 00 00 00 00 00 b0  0004.tst........
0d0:  00 00 00 00 02 00 00 86 0f 66 72 61 6d 65 30 30  .........frame00
0e0:  30 30 30 35 2e 74 73 74 00 00 00 00 00 00 00 d0  0005.tst........
0f0:  00 00 00 00 02 00 00 87 0f 66 72 61 6d 65 30 30  .........frame00
100:  30 30 30 36 2e 74 73 74 00 00 00 00 00 00 00 f0  0006.tst........
110:  00 00 00 00 02 00 00 88 0f 66 72 61 6d 65 30 30  .........frame00
120:  30 30 30 37 2e 74 73 74 00 00 00 00 00 00 01 10  0007.tst........
130:  ff ff 0e 78 00 00 00 00 00 00 00 00 00 00 00 00  ...x............

The "leaf" and "tail" structures are stored at the end of the block, so as the directory grows, the middle is filled in:
fa0:  00 00 00 00 00 00 01 30 00 00 00 2e 00 00 00 02  .......0........
fb0:  00 00 17 2e 00 00 00 04 83 a0 40 b4 00 00 00 0e  ................
fc0:  93 a0 40 b4 00 00 00 12 a3 a0 40 b4 00 00 00 06  ................
fd0:  b3 a0 40 b4 00 00 00 0a c3 a0 40 b4 00 00 00 1e  ................
fe0:  d3 a0 40 b4 00 00 00 22 e3 a0 40 b4 00 00 00 16  ................
ff0:  f3 a0 40 b4 00 00 00 1a 00 00 00 0a 00 00 00 00  ................

In a readable format:
xfs_db> type dir2
xfs_db> p
bhdr.magic = 0x58443242
bhdr.bestfree[0].offset = 0x130
bhdr.bestfree[0].length = 0xe78
bhdr.bestfree[1].offset = 0
bhdr.bestfree[1].length = 0
bhdr.bestfree[2].offset = 0
bhdr.bestfree[2].length = 0
bu[0].inumber = 33554560
bu[0].namelen = 1
bu[0].name = "."
bu[0].tag = 0x10
bu[1].inumber = 128
bu[1].namelen = 2
bu[1].name = ".."
bu[1].tag = 0x20
bu[2].inumber = 33554561
bu[2].namelen = 15
bu[2].name = "frame000000.tst"
bu[2].tag = 0x30
bu[3].inumber = 33554562
bu[3].namelen = 15
bu[3].name = "frame000001.tst"
bu[3].tag = 0x50
...
bu[8].inumber = 33554567
bu[8].namelen = 15
bu[8].name = "frame000006.tst"
bu[8].tag = 0xf0
bu[9].inumber = 33554568
bu[9].namelen = 15
bu[9].name = "frame000007.tst"
bu[9].tag = 0x110
bu[10].freetag = 0xffff
bu[10].length = 0xe78
bu[10].tag = 0x130
bleaf[0].hashval = 0x2e
bleaf[0].address = 0x2
bleaf[1].hashval = 0x172e
bleaf[1].address = 0x4
bleaf[2].hashval = 0x83a040b4
bleaf[2].address = 0xe
...
bleaf[8].hashval = 0xe3a040b4
bleaf[8].address = 0x16
bleaf[9].hashval = 0xf3a040b4
bleaf[9].address = 0x1a
btail.count = 10
btail.stale = 0
Note that with block directories, all xfs_db fields are preceded with "b". 
For a simple lookup example, the hash of frame000000.tst is 0xb3a040b4. Looking up that value, we get an address of 0x6. Multiply that by 8, it becomes offset 0x30 and the inode at that point is 33554561. 
When we remove an entry from the middle (frame000004.tst), we can see how the freespace details are adjusted:
bhdr.magic = 0x58443242
bhdr.bestfree[0].offset = 0x130
bhdr.bestfree[0].length = 0xe78
bhdr.bestfree[1].offset = 0xb0
bhdr.bestfree[1].length = 0x20
bhdr.bestfree[2].offset = 0
bhdr.bestfree[2].length = 0
...
bu[5].inumber = 33554564
bu[5].namelen = 15
bu[5].name = "frame000003.tst"
bu[5].tag = 0x90
bu[6].freetag = 0xffff
bu[6].length = 0x20
bu[6].tag = 0xb0
bu[7].inumber = 33554566
bu[7].namelen = 15
bu[7].name = "frame000005.tst"
bu[7].tag = 0xd0
...
bleaf[7].hashval = 0xd3a040b4
bleaf[7].address = 0x22
bleaf[8].hashval = 0xe3a040b4
bleaf[8].address = 0
bleaf[9].hashval = 0xf3a040b4
bleaf[9].address = 0x1a
btail.count = 10
btail.stale = 1

A new "bestfree" value is added for the entry, the start of the entry is marked as unused with 0xffff (which overwrites the inode number for an actual entry), and the length of the space. The tag remains intact at the offset+length - sizeof(tag). The address for the hash is also cleared. The affected areas are highlighted below:
090:  00 00 00 00 02 00 00 84 0f 66 72 61 6d 65 30 30  .........frame00
0a0:  30 30 30 33 2e 74 73 74 00 00 00 00 00 00 00 90  0003.tst........
0b0:  ff ff 00 20 02 00 00 85 0f 66 72 61 6d 65 30 30  .........frame00
0c0:  30 30 30 34 2e 74 73 74 00 00 00 00 00 00 00 b0  0004.tst........
0d0:  00 00 00 00 02 00 00 86 0f 66 72 61 6d 65 30 30  .........frame00
0e0:  30 30 30 35 2e 74 73 74 00 00 00 00 00 00 00 d0  0005.tst........
...
fb0:  00 00 17 2e 00 00 00 04 83 a0 40 b4 00 00 00 0e  ................
fc0:  93 a0 40 b4 00 00 00 12 a3 a0 40 b4 00 00 00 06  ................
fd0:  b3 a0 40 b4 00 00 00 0a c3 a0 40 b4 00 00 00 1e  ................
fe0:  d3 a0 40 b4 00 00 00 22 e3 a0 40 b4 00 00 00 00  ................
ff0:  f3 a0 40 b4 00 00 00 1a 00 00 00 0a 00 00 00 01  ................
Leaf Directories
Once a  HYPERLINK  \l "_Block_Directories" Block Directory has filled the block, the directory data is changed into a new format. It still uses  HYPERLINK  \l "_Data_Extents" extents and the same basic structures, but the "data" and "leaf" are split up into their own extents. The "leaf" information only occupies one extent. As "leaf" information is more compact than "data" information, more than one "data" extent is common.
Block to Leaf conversions retain the existing block for the data entries and allocate a new block for the leaf and freespace index information.
As with all directories, data blocks must start at logical offset zero. 
The "leaf" block has a special offset defined by XFS_DIR2_LEAF_OFFSET. Currently, this is 32GB and in the extent view, a block offset of 32GB/sb_blocksize. On a 4KB block filesystem, this is 0x800000 (8388608 decimal).
The "data" extents have a new header (no "leaf" data):
typedef struct xfs_dir2_data {
	xfs_dir2_data_hdr_t	hdr;
	xfs_dir2_data_union_t	u[1];
} xfs_dir2_data_t;
The "leaf" extent uses the following structures:
typedef struct xfs_dir2_leaf {
	xfs_dir2_leaf_hdr_t	hdr;	
	xfs_dir2_leaf_entry_t	ents[1];
					
	xfs_dir2_data_off_t	bests[1];
	xfs_dir2_leaf_tail_t	tail;	
} xfs_dir2_leaf_t;

typedef struct xfs_dir2_leaf_hdr {
	xfs_da_blkinfo_t	info;	
	__uint16_t	count;	
	__uint16_t	stale;	
} xfs_dir2_leaf_hdr_t;

typedef struct xfs_dir2_leaf_tail {
	__uint32_t	bestcount;
} xfs_dir2_leaf_tail_t;
The leaves use the xfs_da_blkinfo_t filesystem block header. This header is used for directory and  HYPERLINK  \l "_Extended_Attributes_1" extended attribute leaves and B+tree nodes:
typedef struct xfs_da_blkinfo {
	__be32		forw;	
	__be32		back;	
	__be16		magic;	
	__be16		pad;	
} xfs_da_blkinfo_t;

The size of the ents array is specified by hdr.count.
The size of the bests array is specified by the tail.bestcount which is also the number of "data" blocks for  the directory. The bests array maintains each data block's bestfree[0].length value.
 SHAPE  \* MERGEFORMAT xfs_db Example:
For this example, a directory was created with 256 entries (frame000000.tst to frame000255.tst) and then deleted some files (frame00005*, frame00018* and frame000240.tst) to show free list characteristics.
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 2 (extents)
core.nlinkv1 = 2
...
core.size = 12288
core.nblocks = 4
core.extsize = 0
core.nextents = 3
...
u.bmx[0-2] = [startoff,startblock,blockcount,extentflag] 
0:[0,4718604,1,0] 
1:[1,4718610,2,0] 
2:[8388608,4718605,1,0]

As can be seen in this example, three blocks are used for "data" in two extents, and the "leaf" extent has a logical offset of 8388608 blocks (32GB).
Examining the first block:
xfs_db> dblock 0
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0x670
dhdr.bestfree[0].length = 0x140
dhdr.bestfree[1].offset = 0xff0
dhdr.bestfree[1].length = 0x10
dhdr.bestfree[2].offset = 0
dhdr.bestfree[2].length = 0
du[0].inumber = 75497600
du[0].namelen = 1
du[0].name = "."
du[0].tag = 0x10
du[1].inumber = 128
du[1].namelen = 2
du[1].name = ".."
du[1].tag = 0x20
du[2].inumber = 75497601
du[2].namelen = 15
du[2].name = "frame000000.tst"
du[2].tag = 0x30
du[3].inumber = 75497602
du[3].namelen = 15
du[3].name = "frame000001.tst"
du[3].tag = 0x50
...
du[51].inumber = 75497650
du[51].namelen = 15
du[51].name = "frame000049.tst"
du[51].tag = 0x650
du[52].freetag = 0xffff
du[52].length = 0x140
du[52].tag = 0x670
du[53].inumber = 75497661
du[53].namelen = 15
du[53].name = "frame000060.tst"
du[53].tag = 0x7b0
...
du[118].inumber = 75497758
du[118].namelen = 15
du[118].name = "frame000125.tst"
du[118].tag = 0xfd0
du[119].freetag = 0xffff
du[119].length = 0x10
du[119].tag = 0xff0
Note that the xfs_db field output is preceded by a "d" for "data".
The next "data" block:
xfs_db> dblock 1
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0x6d0
dhdr.bestfree[0].length = 0x140
dhdr.bestfree[1].offset = 0xe50
dhdr.bestfree[1].length = 0x20
dhdr.bestfree[2].offset = 0xff0
dhdr.bestfree[2].length = 0x10
du[0].inumber = 75497759
du[0].namelen = 15
du[0].name = "frame000126.tst"
du[0].tag = 0x10
...
du[53].inumber = 75497844
du[53].namelen = 15
du[53].name = "frame000179.tst"
du[53].tag = 0x6b0
du[54].freetag = 0xffff
du[54].length = 0x140
du[54].tag = 0x6d0
du[55].inumber = 75497855
du[55].namelen = 15
du[55].name = "frame000190.tst"
du[55].tag = 0x810
...
du[104].inumber = 75497904
du[104].namelen = 15
du[104].name = "frame000239.tst"
du[104].tag = 0xe30
du[105].freetag = 0xffff
du[105].length = 0x20
du[105].tag = 0xe50
du[106].inumber = 75497906
du[106].namelen = 15
du[106].name = "frame000241.tst"
du[106].tag = 0xe70
...
du[117].inumber = 75497917
du[117].namelen = 15
du[117].name = "frame000252.tst"
du[117].tag = 0xfd0
du[118].freetag = 0xffff
du[118].length = 0x10
du[118].tag = 0xff0
And the last data block:
xfs_db> dblock 2
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0x70
dhdr.bestfree[0].length = 0xf90
dhdr.bestfree[1].offset = 0
dhdr.bestfree[1].length = 0
dhdr.bestfree[2].offset = 0
dhdr.bestfree[2].length = 0
du[0].inumber = 75497918
du[0].namelen = 15
du[0].name = "frame000253.tst"
du[0].tag = 0x10
du[1].inumber = 75497919
du[1].namelen = 15
du[1].name = "frame000254.tst"
du[1].tag = 0x30
du[2].inumber = 75497920
du[2].namelen = 15
du[2].name = "frame000255.tst"
du[2].tag = 0x50
du[3].freetag = 0xffff
du[3].length = 0xf90
du[3].tag = 0x70
Examining the "leaf" block (with the fields preceded by an "l" for "leaf"):
The directory before deleting some entries:
xfs_db> dblock 8388608
xfs_db> type dir2
xfs_db> p
lhdr.info.forw = 0
lhdr.info.back = 0
lhdr.info.magic = 0xd2f1
lhdr.count = 258
lhdr.stale = 0
lbests[0-2] = 0:0x10 1:0x10 2:0xf90
lents[0].hashval = 0x2e
lents[0].address = 0x2
lents[1].hashval = 0x172e
lents[1].address = 0x4
lents[2].hashval = 0x23a04084
lents[2].address = 0x116
...
lents[257].hashval = 0xf3a048bc
lents[257].address = 0x366
ltail.bestcount = 3
Note how the lbests array correspond with the bestfree[0].length values in the "data" blocks:
xfs_db> dblock 0
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0xff0
dhdr.bestfree[0].length = 0x10
...
xfs_db> dblock 1
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0xff0
dhdr.bestfree[0].length = 0x10
...
xfs_db> dblock 2
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0x70
dhdr.bestfree[0].length = 0xf90
Now after the entries have been deleted:
xfs_db> dblock 8388608
xfs_db> type dir2
xfs_db> p
lhdr.info.forw = 0
lhdr.info.back = 0
lhdr.info.magic = 0xd2f1
lhdr.count = 258
lhdr.stale = 21
lbests[0-2] = 0:0x140 1:0x140 2:0xf90
lents[0].hashval = 0x2e
lents[0].address = 0x2
lents[1].hashval = 0x172e
lents[1].address = 0x4
lents[2].hashval = 0x23a04084
lents[2].address = 0x116
...
As can be seen, the lbests values have been update to contain each hdr.bestfree[0].length values. The leaf's hdr.stale value has also been updated to specify the number of stale entries in the array. The stale entries have an address of zero.

TODO: Need an example for where new entries get inserted with several large free spaces.
Node Directories
When the "leaf" information fills a block, the extents undergo another separation. All "freeindex" information moves into its own extent. Like  HYPERLINK  \l "_Leaf_Directories" Leaf Directories, the "leaf" block maintained the best free space information for each "data" block. This is not possible with more than one leaf.
The "data" blocks stay the same as leaf directories.
The "leaf" blocks eventually change into a B+tree with the generic B+tree header pointing to directory "leaves" as described in Leaf Directories. The top-level blocks are called "nodes". It can exist in a state where there is still a single leaf block before it's split. Interpretation of the node vs. leaf blocks has to be performed by inspecting the magic value in the header. The combined leaf/freeindex blocks has a magic value of XFS_DIR2_LEAF1_MAGIC (0xd2f1), a node directory's leaf/leaves have a magic value of XFS_DIR2_LEAFN_MAGIC  (0xd2ff) and intermediate nodes have a magic value of XFS_DA_NODE_MAGIC (0xfebe).
The new "freeindex" block(s) only contains the bests for each data block.
The freeindex block uses the following structures:
typedef struct xfs_dir2_free_hdr {
	__uint32_t	magic;	
	__int32_t	firstdb;
	__int32_t	nvalid;	
	__int32_t	nused;	
} xfs_dir2_free_hdr_t;

typedef struct xfs_dir2_free {
	xfs_dir2_free_hdr_t	hdr;	
	xfs_dir2_data_off_t	bests[1];
} xfs_dir2_free_t;
The location of the leaf blocks can be in any order, the only way to determine the appropriate is by the node block hash/before values. Given a hash to lookup, you read the node's btree array and first hashval in the array that exceeds the given hash and it can then be found in the block pointed to by the before value. 
typedef struct xfs_da_intnode {
	struct xfs_da_node_hdr {
		xfs_da_blkinfo_t	info;
		__uint16_t	count;
		__uint16_t	level;
	} hdr;
	struct xfs_da_node_entry {
		xfs_dahash_t	hashval;
		xfs_dablk_t	before;
	} btree[1];		
} xfs_da_intnode_t;
The freeindex's bests array starts from the end of the block and grows to the start of the block.
When an data block becomes unused (ie. all entries in it have been deleted), the block is freed, the data extents contain a hole, and the freeindex's hdr.nused value is decremented and the associated bests[] entry is set to 0xffff. 
As the first data block always contains "." and "..", it's invalid for the directory to have a hole at the start.
The freeindex's hdr.nvalid should always be the same as the number of allocated data directory blocks containing name/inode data and will always be less than or equal to hdr.nused. hdr.nused should be the same as the index of the last data directory block plus one (i.e. when the last data block is freed, nused and nvalid are decremented).

 SHAPE  \* MERGEFORMAT 
xfs_db Example:
With the node directory examples, we are using a filesystems with 4KB block size, and a 16KB directory size. The directory has over 2000 entries:
xfs_db> sb 0
xfs_db> p
magicnum = 0x58465342
blocksize = 4096
...
dirblklog = 2
...

xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 2 (extents)
...
core.size = 81920
core.nblocks = 36
core.extsize = 0
core.nextents = 8
...
u.bmx[0-7] = [startoff,startblock,blockcount,extentflag] 0:[0,7368,4,0] 1:[4,7408,4,0] 2:[8,7444,4,0] 3:[12,7480,4,0] 4:[16,7520,4,0] 5:[8388608,7396,4,0] 6:[8388612,7524,8,0] 7:[16777216,7516,4,0]
As can already be observed, all extents are allocated is multiples of 4 blocks.
Blocks 0 to 19 (16+4-1) are used for the data. Looking at blocks 16-19, it can seen that it's the same as the single-leaf format, except the length values are  a lot larger to accommodate the increased directory block size:
xfs_db> dblock 16
xfs_db> type dir2
xfs_db> p
dhdr.magic = 0x58443244
dhdr.bestfree[0].offset = 0xb0
dhdr.bestfree[0].length = 0x3f50
dhdr.bestfree[1].offset = 0
dhdr.bestfree[1].length = 0
dhdr.bestfree[2].offset = 0
dhdr.bestfree[2].length = 0
du[0].inumber = 120224
du[0].namelen = 15
du[0].name = "frame002043.tst"
du[0].tag = 0x10
du[1].inumber = 120225
du[1].namelen = 15
du[1].name = "frame002044.tst"
du[1].tag = 0x30
du[2].inumber = 120226
du[2].namelen = 15
du[2].name = "frame002045.tst"
du[2].tag = 0x50
du[3].inumber = 120227
du[3].namelen = 15
du[3].name = "frame002046.tst"
du[3].tag = 0x70
du[4].inumber = 120228
du[4].namelen = 15
du[4].name = "frame002047.tst"
du[4].tag = 0x90
du[5].freetag = 0xffff
du[5].length = 0x3f50
du[5].tag = 0
Next, the "node" block, the fields are preceded with 'n' for node blocks:
xfs_db> dblock 8388608
xfs_db> type dir2
xfs_db> p
nhdr.info.forw = 0
nhdr.info.back = 0
nhdr.info.magic = 0xfebe
nhdr.count = 2
nhdr.level = 1
nbtree[0-1] = [hashval,before] 0:[0xa3a440ac,8388616] 1:[0xf3a440bc,8388612]
The following leaf blocks have been allocated once as XFS knows it needs at two blocks when allocating a B+tree, so the length is 8 fsblocks. For all hashes < 0xa3a440ac, they are located in the directory offset 8388616 and hashes below 0xf3a440bc are in offset 8388612. Hashes above f3a440bc don't exist in this directory.
xfs_db> dblock 8388616
xfs_db> type dir2
xfs_db> p
lhdr.info.forw = 8388612
lhdr.info.back = 0
lhdr.info.magic = 0xd2ff
lhdr.count = 1023
lhdr.stale = 0
lents[0].hashval = 0x2e
lents[0].address = 0x2
lents[1].hashval = 0x172e
lents[1].address = 0x4
lents[2].hashval = 0x23a04084
lents[2].address = 0x116
...
lents[1021].hashval = 0xa3a440a4
lents[1021].address = 0x1fa2
lents[1022].hashval = 0xa3a440ac
lents[1022].address = 0x1fca

xfs_db> dblock 8388612
xfs_db> type dir2
xfs_db> p
lhdr.info.forw = 0
lhdr.info.back = 8388616
lhdr.info.magic = 0xd2ff
lhdr.count = 1027
lhdr.stale = 0
lents[0].hashval = 0xa3a440b4
lents[0].address = 0x1f52
lents[1].hashval = 0xa3a440bc
lents[1].address = 0x1f7a
...
lents[1025].hashval = 0xf3a440b4
lents[1025].address = 0x1f66
lents[1026].hashval = 0xf3a440bc
lents[1026].address = 0x1f8e
An example lookup using xfs_db:
xfs_db> hash frame001845.tst
0xf3a26094

Doing a binary search through the array, we get address 0x1ce6, which is offset 0xe730. Each fsblock is 4KB in size (0x1000), so it will be offset 0x730 into directory offset 14. From the extent map, this will be fsblock 7482:

xfs_db> fsblock 7482
xfs_db> type text
xfs_db> p
...
730:  00 00 00 00 00 01 d4 da 0f 66 72 61 6d 65 30 30  .........frame00
740:  31 38 34 35 2e 74 73 74 00 00 00 00 00 00 27 30  1845.tst.......0

Looking at the freeindex information (fields with an 'f' tag):
xfs_db> fsblock 7516
xfs_db> type dir2
xfs_db> p
fhdr.magic = 0x58443246
fhdr.firstdb = 0
fhdr.nvalid = 5
fhdr.nused = 5
fbests[0-4] = 0:0x10 1:0x10 2:0x10 3:0x10 4:0x3f50
Like the  HYPERLINK  \l "_Single-Leaf_Directories" Leaf Directory, each of the fbests values correspond to each data block's bestfree[0].length value. 
The raw disk layout, old data is not cleared after the array. The fbests array is highlighted:
xfs_db> type text
xfs_db> p
000:  58 44 32 46 00 00 00 00 00 00 00 05 00 00 00 05  XD2F............
010:  00 10 00 10 00 10 00 10 3f 50 00 00 1f 01 ff ff  .........P......
TODO: Example with a hole in the middle
B+tree Directories
When the extent map in an inode grows beyond the inode's space, the inode format is changed to a "btree". The inode contains a filesystem block point to the B+tree extent map for the directory's blocks. The B+tree extents contain the extent map for the "data", "node", "leaf" and "freeindex" information as described in  HYPERLINK  \l "_Multi-Leaf_Directories" Node Directories.
Refer to the previous section on  HYPERLINK  \l "_B*Tree_Extent_List" B+tree Data Extents for more information on XFS B+tree extents.
The following situations and changes can apply over Node Directories, and apply here as inode extents generally cannot contain the number of directory blocks that B+trees can handle:
The node/leaf trees can be more than one level deep. 
More than one freeindex block may exist, but this will be quite rare. It would required hundreds of thousand files with quite long file names (or millions with shorter names) to get a second freeindex block.
xfs_db Example:
A directory has been created with 200,000 entries with each entry being 100 characters long. The filesystem block size and directory block size are 4KB:
xfs_db> inode 772
xfs_db> p
core.magic = 0x494e
core.mode = 040755
core.version = 1
core.format = 3 (btree)
...
core.size = 22757376
core.nblocks = 6145
core.extsize = 0
core.nextents = 234
core.naextents = 0
core.forkoff = 0
...
u.bmbt.level = 1
u.bmbt.numrecs = 1
u.bmbt.keys[1] = [startoff] 1:[0]
u.bmbt.ptrs[1] = 1:89

xfs_db> fsblock 89
xfs_db> type bmapbtd
xfs_db> p
magic = 0x424d4150
level = 0
numrecs = 234
leftsib = null
rightsib = null
recs[1-234] = [startoff,startblock,blockcount,extentflag]
   1:[0,53,1,0] 2:[1,55,13,0] 3:[14,69,1,0] 4:[15,72,13,0] 
   5:[28,86,2,0] 6:[30,90,21,0] 7:[51,112,1,0] 8:[52,114,11,0]
   ...
   125:[5177,902,15,0] 126:[5192,918,6,0] 127:[5198,524786,358,0]
   128:[8388608,54,1,0] 129:[8388609,70,2,0] 130:[8388611,85,1,0]
   ...
   229:[8389164,917,1,0] 230:[8389165,924,19,0] 231:[8389184,944,9,0]
   232:[16777216,68,1,0] 233:[16777217,7340114,1,0] 234:[16777218,5767362,1,0]

We have 128 extents and a total of 5555 blocks being used to store name/inode pairs. With only about 2000 values that can be stored in the freeindex block, 3 blocks have been allocated for this information. The firstdb field specifies the starting directory block number for each array:
xfs_db> dblock 16777216
xfs_db> type dir2
xfs_db> p
fhdr.magic = 0x58443246
fhdr.firstdb = 0
fhdr.nvalid = 2040
fhdr.nused = 2040
fbests[0-2039] = ...

xfs_db> dblock 16777217
xfs_db> type dir2
xfs_db> p
fhdr.magic = 0x58443246
fhdr.firstdb = 2040
fhdr.nvalid = 2040
fhdr.nused = 2040
fbests[0-2039] = ...

xfs_db> dblock 16777218
xfs_db> type dir2
xfs_db> p
fhdr.magic = 0x58443246
fhdr.firstdb = 4080
fhdr.nvalid = 1476
fhdr.nused = 1476
fbests[0-1475] = ...
Looking at the root node in the node block, it's a pretty deep tree:
xfs_db> dblock 8388608
xfs_db> type dir2
xfs_db> p
nhdr.info.forw = 0
nhdr.info.back = 0
nhdr.info.magic = 0xfebe
nhdr.count = 2
nhdr.level = 2
nbtree[0-1] = [hashval,before] 0:[0x6bbf6f39,8389121] 1:[0xfbbf7f79,8389120]

xfs_db> dblock 8389121
xfs_db> type dir2
xfs_db> p
nhdr.info.forw = 8389120
nhdr.info.back = 0
nhdr.info.magic = 0xfebe
nhdr.count = 263
nhdr.level = 1
nbtree[0-262] = ... 262:[0x6bbf6f39,8388928]

xfs_db> dblock 8389120
xfs_db> type dir2
xfs_db> p
nhdr.info.forw = 0
nhdr.info.back = 8389121
nhdr.info.magic = 0xfebe
nhdr.count = 319
nhdr.level = 1
nbtree[0-318] = [hashval,before] 0:[0x70b14711,8388919] ...
The leaves at each the end of a node always point to the end leaves in adjacent nodes. Directory block 8388928 forward pointer is to block 8388919, and vice versa as highlighted in the following example:
xfs_db> dblock 8388928
xfs_db> type dir2
xfs_db> p
lhdr.info.forw = 8388919
lhdr.info.back = 8388937
lhdr.info.magic = 0xd2ff
...

xfs_db> dblock 8388919
xfs_db> type dir2
xfs_db> p
lhdr.info.forw = 8388706
lhdr.info.back = 8388928
lhdr.info.magic = 0xd2ff
...
Symbolic Links
Symbolic links to a file can be stored in one of two formats: "local" and "extents". The length of the symlink contents is always specified by the inode's di_size value.
Shortform Symbolic Links
Symbolic links are stored with the "local" di_format if the symbolic link can fit within the inode's data fork. The link data is an array of characters (di_symlink array in the data fork union).
 SHAPE  \* MERGEFORMAT 
xfs_db Example:
A short symbolic link to a file is created:
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 0120777
core.version = 1
core.format = 1 (local)
...
core.size = 12
core.nblocks = 0
core.extsize = 0
core.nextents = 0
...
u.symlink = "small_target"
Raw on-disk data with the link contents highlighted:
xfs_db> type text
xfs_db> p
00:  49 4e a1 ff 01 01 00 01 00 00 00 00 00 00 00 00  IN..............
10:  00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01  ................
20:  44 bc e1 c7 03 c4 d4 18 44 bc e1 c7 03 c4 d4 18  D.......D.......
30:  44 bc e1 c7 03 c4 d4 18 00 00 00 00 00 00 00 0c  D...............
40:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
50:  00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00  ................
60:  ff ff ff ff 73 6d 61 6c 6c 5f 74 61 72 67 65 74  ....small.target
70:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
...
Extent Symbolic Links
If the length of the symbolic link exceeds the space available in the inode's data fork, the link is moved to a new filesystem block and the inode's di_format is changed to "extents". The location of the block(s) is specified by the data fork's di_bmx[] array. In the significant majority of cases, this will be in one filesystem block as a symlink cannot be longer than 1024 characters.
 SHAPE  \* MERGEFORMAT 
xfs_db Example:
A longer link is created (greater than 156 bytes):
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 0120777
core.version = 1
core.format = 2 (extents)
...
core.size = 182
core.nblocks = 1
core.extsize = 0
core.nextents = 1
...
u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,37530,1,0]

xfs_db> dblock 0
xfs_db> type symlink
xfs_db> p
"symlink contents..."
Extended Attributes
Extended attributes implement the ability for a user to attach name:value pairs to inodes within the XFS filesystem. They could be used to store meta-information about the file.
The attribute names can be up to 256 bytes in length, terminated by the first 0 byte. The intent is that they be printable ASCII (or other character set) names for the attribute. The values can be up to 64KB of arbitrary binary data. Some XFS internal attributes (eg. parent pointers) use non-printable names for the attribute.
Access Control Lists (ACLs) and Data Migration Facility (DMF) use extended attributes to store their associated metadata with an inode.
XFS uses two disjoint attribute name spaces associated with every inode. They are the root and user address spaces. The root address space is accessible only to the superuser, and then only by specifying a flag argument to the function call. Other users will not see or be able to modify attributes in the root address space. The user address space is protected by the normal file permissions mechanism, so the owner of the file can decide who is able to see and/or modify the value of attributes on any particular file.
To view extended attributes from the command line, use the getfattr command. To set or delete extended attributes, use the setfattr command. ACLs control should use the getfacl and setfacl commands.
XFS attributes supports three namespaces: "user", "trusted" (or "root" using IRIX terminology) and "secure".
The location of the attribute fork in the inode's literal area is specified by the di_forkoff value in the inode's core. If this value is zero, the inode does not contain any extended attributes. Non-zero, the byte offset into the literal area = di_forkoff * 8, which also determines the 2048 byte maximum size for an inode. Attributes must be allocated on a 64-bit boundary on the disk except shortform attributes (they are tightly packed). To determine the offset into the inode itself, add 100 (0x64) to di_forkoff * 8.
The following four sections describe each of the on-disk formats.

Shortform Attributes
When the all extended attributes can fit within the inode's attribute fork, the inode's di_aformat is set to "local" and the attributes are stored in the inode's literal area starting at offset di_forkoff * 8.
Shortform attributes use the following structures:
typedef struct xfs_attr_shortform {
	struct xfs_attr_sf_hdr {	
		__be16	totsize;
		__u8	count;
	} hdr;
	struct xfs_attr_sf_entry {
		__uint8_t	namelen;
		__uint8_t	valuelen;
		__uint8_t	flags;
		__uint8_t	nameval[1];
	} list[1];
} xfs_attr_shortform_t;

typedef struct xfs_attr_sf_hdr xfs_attr_sf_hdr_t;
typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t;
 SHAPE  \* MERGEFORMAT 
namelen and valuelen specify the size of the two byte arrays containing the name and value pairs. valuelen is zero for extended attributes with no value.
nameval[] is a single array where it's size is the sum of namelen and valuelen. The names and values are not null terminated on-disk. The value immediately follows the name in the array.
flags specifies the namespace for the attribute (0 = "user"):
FlagDescriptionXFS_ATTR_ROOTThe attribute's namespace is "trusted".XFS_ATTR_SECUREThe attribute's namespace is "secure".xfs_db Example:
A file is created and two attributes are set:
# setfattr -n user.empty few_attr
# setfattr -n trusted.trust -v val1 few_attr
Using xfs_db, we dump the inode:
xfs_db> inode <inode#>
xfs_db> p
core.magic = 0x494e
core.mode = 0100644
...
core.naextents = 0
core.forkoff = 15
core.aformat = 1 (local)
...
a.sfattr.hdr.totsize = 24
a.sfattr.hdr.count = 2
a.sfattr.list[0].namelen = 5
a.sfattr.list[0].valuelen = 0
a.sfattr.list[0].root = 0
a.sfattr.list[0].secure = 0
a.sfattr.list[0].name = "empty"
a.sfattr.list[1].namelen = 5
a.sfattr.list[1].valuelen = 4
a.sfattr.list[1].root = 1
a.sfattr.list[1].secure = 0
a.sfattr.list[1].name = "trust"
a.sfattr.list[1].value = "val1"
We can determine the actual inode offset to be 220 (15 x 8 + 100) or 0xdc.
Examining the raw dump, the second attribute is highlighted:
xfs_db> type text
xfs_db> p
00:  49 4e 81 a4 01 02 00 01 00 00 00 00 00 00 00 00  IN..............
10:  00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 02  ................
20:  44 be 1a be 38 d1 26 98 44 be 1a be 38 d1 26 98  D...8...D...8...
30:  44 be 1a e1 3a 9a ea 18 00 00 00 00 00 00 00 04  D...............
40:  00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01  ................
50:  00 00 0f 01 00 00 00 00 00 00 00 00 00 00 00 00  ................
60:  ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 12  ................
70:  53 a0 00 01 00 00 00 00 00 00 00 00 00 00 00 00  S...............
80:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
90:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
a0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
b0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
c0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
d0:  00 00 00 00 00 00 00 00 00 00 00 00 00 18 02 00  ................
e0:  05 00 00 65 6d 70 74 79 05 04 02 74 72 75 73 74  ...empty...trust
f0:  76 61 6c 31 00 00 00 00 00 00 00 00 00 00 00 00  val1............
Adding another attribute with attr1, the format is converted to extents and di_forkoff remains unchanged (and all those zeros in the dump above remain unused):
xfs_db> inode <inode#>
xfs_db> p
...
core.naextents = 1
core.forkoff = 15
core.aformat = 2 (extents)
...
a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,37534,1,0]
Performing the same steps with attr2, adding one attribute at a time, you can see di_forkoff change as attributes are added:
xfs_db> inode <inode#>
xfs_db> p
...
core.naextents = 0
core.forkoff = 15
core.aformat = 1 (local)
...
a.sfattr.hdr.totsize = 17
a.sfattr.hdr.count = 1
a.sfattr.list[0].namelen = 10
a.sfattr.list[0].valuelen = 0
a.sfattr.list[0].root = 0
a.sfattr.list[0].secure = 0
a.sfattr.list[0].name = "empty_attr"
Attribute added:
xfs_db> p
...
core.naextents = 0
core.forkoff = 15
core.aformat = 1 (local)
...
a.sfattr.hdr.totsize = 31
a.sfattr.hdr.count = 2
a.sfattr.list[0].namelen = 10
a.sfattr.list[0].valuelen = 0
a.sfattr.list[0].root = 0
a.sfattr.list[0].secure = 0
a.sfattr.list[0].name = "empty_attr"
a.sfattr.list[1].namelen = 7
a.sfattr.list[1].valuelen = 4
a.sfattr.list[1].root = 1
a.sfattr.list[1].secure = 0
a.sfattr.list[1].name = "trust_a"
a.sfattr.list[1].value = "val1"
Another attribute is added:
xfs_db> p
...
core.naextents = 0
core.forkoff = 13
core.aformat = 1 (local)
...
a.sfattr.hdr.totsize = 52
a.sfattr.hdr.count = 3
a.sfattr.list[0].namelen = 10
a.sfattr.list[0].valuelen = 0
a.sfattr.list[0].root = 0
a.sfattr.list[0].secure = 0
a.sfattr.list[0].name = "empty_attr"
a.sfattr.list[1].namelen = 7
a.sfattr.list[1].valuelen = 4
a.sfattr.list[1].root = 1
a.sfattr.list[1].secure = 0
a.sfattr.list[1].name = "trust_a"
a.sfattr.list[1].value = "val1"
a.sfattr.list[2].namelen = 6
a.sfattr.list[2].valuelen = 12
a.sfattr.list[2].root = 0
a.sfattr.list[2].secure = 0
a.sfattr.list[2].name = "second"
a.sfattr.list[2].value = "second_value"
One more is added:
xfs_db> p
core.naextents = 0
core.forkoff = 10
core.aformat = 1 (local)
...
a.sfattr.hdr.totsize = 69
a.sfattr.hdr.count = 4
a.sfattr.list[0].namelen = 10
a.sfattr.list[0].valuelen = 0
a.sfattr.list[0].root = 0
a.sfattr.list[0].secure = 0
a.sfattr.list[0].name = "empty_attr"
a.sfattr.list[1].namelen = 7
a.sfattr.list[1].valuelen = 4
a.sfattr.list[1].root = 1
a.sfattr.list[1].secure = 0
a.sfattr.list[1].name = "trust_a"
a.sfattr.list[1].value = "val1"
a.sfattr.list[2].namelen = 6
a.sfattr.list[2].valuelen = 12
a.sfattr.list[2].root = 0
a.sfattr.list[2].secure = 0
a.sfattr.list[2].name = "second"
a.sfattr.list[2].value = "second_value"
a.sfattr.list[3].namelen = 6
a.sfattr.list[3].valuelen = 8
a.sfattr.list[3].root = 0
a.sfattr.list[3].secure = 1
a.sfattr.list[3].name = "policy"
a.sfattr.list[3].value = "contents"
A raw dump is shown to compare with the attr1 dump on a prior page, the header is highlighted:
xfs_db> type text
xfs_db> p
00:  49 4e 81 a4 01 02 00 01 00 00 00 00 00 00 00 00  IN..............
10:  00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 05  ................
20:  44 be 24 cd 0f b0 96 18 44 be 24 cd 0f b0 96 18  D.......D.......
30:  44 be 2d f5 01 62 7a 18 00 00 00 00 00 00 00 04  D....bz.........
40:  00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01  ................
50:  00 00 0a 01 00 00 00 00 00 00 00 00 00 00 00 00  ................
60:  ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 01  ................
70:  41 c0 00 01 00 00 00 00 00 00 00 00 00 00 00 00  A...............
80:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
90:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
a0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
b0:  00 00 00 00 00 45 04 00 0a 00 00 65 6d 70 74 79  .....E.....empty
c0:  5f 61 74 74 72 07 04 02 74 72 75 73 74 5f 61 76  .attr...trust.av
d0:  61 6c 31 06 0c 00 73 65 63 6f 6e 64 73 65 63 6f  al1...secondseco
e0:  6e 64 5f 76 61 6c 75 65 06 08 04 70 6f 6c 69 63  nd.value...polic
f0:  79 63 6f 6e 74 65 6e 74 73 64 5f 76 61 6c 75 65  ycontentsd.value
It can be clearly seen that attr2 allows many more attributes to be stored in an inode before they are moved to another filesystem block.
Leaf Attributes
When an inode's attribute fork space is used up with  HYPERLINK  \l "_Shortform_Attributes" shortform attributes and more are added, the attribute format is migrated to "extents".
Extent based attributes use hash/index pairs to speed up an attribute lookup. The first part of the "leaf" contains an array of fixed size hash/index pairs with the flags stored as well. The remaining part of the leaf block contains the array name/value pairs, where each element varies in length.
Each leaf is based on the xfs_da_blkinfo_t block header declared in  HYPERLINK  \l "_Single-Leaf_Directories" Leaf Directories. The structure encapsulating all other structures in the xfs_attr_leafblock_t.
The structures involved are:
typedef struct xfs_attr_leaf_map {		
	__be16	base;
	__be16	size;
} xfs_attr_leaf_map_t;

typedef struct xfs_attr_leaf_hdr {
	xfs_da_blkinfo_t	info;
	__be16	count;
	__be16	usedbytes; 
	__be16	firstused;
	__u8	holes;	
	__u8	pad1;
	xfs_attr_leaf_map_t	freemap[3];
} xfs_attr_leaf_hdr_t;

typedef struct xfs_attr_leaf_entry {
	__be32	hashval;
 	__be16	nameidx;
	__u8	flags;
	__u8	pad2;
} xfs_attr_leaf_entry_t;

typedef struct xfs_attr_leaf_name_local {
	__be16	valuelen;
	__u8	namelen;
	__u8	nameval[1];
} xfs_attr_leaf_name_local_t;

typedef struct xfs_attr_leaf_name_remote {
	__be32	valueblk;
	__be32	valuelen;
	__u8	namelen;
	__u8	name[1];
} xfs_attr_leaf_name_remote_t;

typedef struct xfs_attr_leafblock {
	xfs_attr_leaf_hdr_t	hdr;
	xfs_attr_leaf_entry_t	entries[1];
	xfs_attr_leaf_name_local_t	namelist;
	xfs_attr_leaf_name_remote_t	valuelist;
} xfs_attr_leafblock_t;
Each leaf header uses the following magic number:
#define XFS_ATTR_LEAF_MAGIC	0xfbee	
The hash/index elements in the entries[] array are packed from the top of the block.  Name/values grow from the bottom but are not packed. The freemap contains run-length-encoded entries for the free bytes after the entries[] array, but only the three largest runs are stored (smaller runs are dropped).  When the freemap doesnt show enough space for an allocation, name/value area is compacted and allocation is tried again.  If there still isn't enough space, then the block is split. The name/value structures (both local and remote versions) must be 32-bit aligned.
For attributes with small values (ie. the value can be stored within the leaf), the XFS_ATTR_LOCAL flag is set for the attribute. The entry details are stored using the xfs_attr_leaf_name_local_t structure. For large attribute values that cannot be stored within the leaf, separate filesystem blocks are allocated to store the value. They use the xfs_attr_leaf_name_remote_t structure.
 SHAPE  \* MERGEFORMAT 
Both local and remote entries can be interleaved as they are only addressed by the hash/index entries. The flag is stored with the hash/index pairs so the appropriate structure can be used.
Since duplicate hash keys are possible, for each hash that matches during a lookup, the actual name string must be compared.
An incomplete bit is also used for attribute flags.  It shows that an attribute is in the middle of being created and should not be shown to the user if we crash during the time that the bit is set.  The bit is cleared when attribute has finished being setup.  This is done because some large attributes cannot be created inside a single transaction.
xfs_db Example:
A single 30KB extended attribute is added to an inode:
xfs_db> inode <inode#>
xfs_db> p
...
core.nblocks = 9
core.nextents = 0
core.naextents = 1
core.forkoff = 15
core.aformat = 2 (extents)
...
a.bmx[0] = [startoff,startblock,blockcount,extentflag]
0:[0,37535,9,0]

xfs_db> ablock 0
xfs_db> p
hdr.info.forw = 0
hdr.info.back = 0
hdr.info.magic = 0xfbee
hdr.count = 1
hdr.usedbytes = 20
hdr.firstused = 4076
hdr.holes = 0
hdr.freemap[0-2] = [base,size] 0:[40,4036] 1:[0,0] 2:[0,0]
entries[0] = [hashval,nameidx,incomplete,root,secure,local]
0:[0xfcf89d4f,4076,0,0,0,0]
nvlist[0].valueblk = 0x1
nvlist[0].valuelen = 30692
nvlist[0].namelen = 8
nvlist[0].name = "big_attr"
Attribute blocks 1 to 8 (filesystem blocks 37536 to 37543) contain the raw binary value data for the attribute.
Index 4076 (0xfec) is the offset into the block where the name/value information is. As can be seen by the value, it's at the end of the block:
xfs_db> type text
xfs_db> p
000:  00 00 00 00 00 00 00 00 fb ee 00 00 00 01 00 14  ................
010:  0f ec 00 00 00 28 0f c4 00 00 00 00 00 00 00 00  ................
020:  fc f8 9d 4f 0f ec 00 00 00 00 00 00 00 00 00 00  ...O............
030:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
...
fe0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01  ................
ff0:  00 00 77 e4 08 62 69 67 5f 61 74 74 72 00 00 00  ..w..big.attr...
A 30KB attribute and a couple of small attributes are added to a file:
xfs_db> inode <inode#>
xfs_db> p
...
core.nblocks = 10
core.extsize = 0
core.nextents = 1
core.naextents = 2
core.forkoff = 15
core.aformat = 2 (extents)
...
u.bmx[0] = [startoff,startblock,blockcount,extentflag] 
0:[0,81857,1,0]
a.bmx[0-1] = [startoff,startblock,blockcount,extentflag] 
0:[0,81858,1,0] 
1:[1,182398,8,0]

xfs_db> ablock 0
xfs_db> p
hdr.info.forw = 0
hdr.info.back = 0
hdr.info.magic = 0xfbee
hdr.count = 3
hdr.usedbytes = 52
hdr.firstused = 4044
hdr.holes = 0
hdr.freemap[0-2] = [base,size] 0:[56,3988] 1:[0,0] 2:[0,0]
entries[0-2] = [hashval,nameidx,incomplete,root,secure,local]
0:[0x1e9d3934,4044,0,0,0,1] 
1:[0x1e9d3937,4060,0,0,0,1] 
2:[0xfcf89d4f,4076,0,0,0,0]
nvlist[0].valuelen = 6
nvlist[0].namelen = 5
nvlist[0].name = "attr2"
nvlist[0].value = "value2"
nvlist[1].valuelen = 6
nvlist[1].namelen = 5
nvlist[1].name = "attr1"
nvlist[1].value = "value1"
nvlist[2].valueblk = 0x1
nvlist[2].valuelen = 30692
nvlist[2].namelen = 8
nvlist[2].name = "big_attr"
As can be seen in the entries array, the two small attributes have the local flag set and the values are printed.
A raw disk dump shows the attributes. The last attribute added is highlighted (offset 4044 or 0xfcc):
000:  00 00 00 00 00 00 00 00 fb ee 00 00 00 03 00 34  ...............4
010:  0f cc 00 00 00 38 0f 94 00 00 00 00 00 00 00 00  .....8..........
020:  1e 9d 39 34 0f cc 01 00 1e 9d 39 37 0f dc 01 00  ..94......97....
030:  fc f8 9d 4f 0f ec 00 00 00 00 00 00 00 00 00 00  ...O............
040:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
...
fc0:  00 00 00 00 00 00 00 00 00 00 00 00 00 06 05 61  ...............a
fd0:  74 74 72 32 76 61 6c 75 65 32 00 00 00 06 05 61  ttr2value2.....a
fe0:  74 74 72 31 76 61 6c 75 65 31 00 00 00 00 00 01  ttr1value1......
ff0:  00 00 77 e4 08 62 69 67 5f 61 74 74 72 00 00 00  ..w..big.attr...
Node Attributes
When the number of attributes exceeds the space that can fit in one filesystem block (ie. hash, flag, name and local values), the first attribute block becomes the root of a B+tree where the leaves contain the hash/name/value information that was stored in a single leaf block. The inode's attribute format itself remains extent based. The nodes use the xfs_da_intnode_t structure introduced in  HYPERLINK  \l "_Node_Directories" Node Directories.
The location of the attribute leaf blocks can be in any order, the only way to determine the appropriate is by the node block hash/before values. Given a hash to lookup, you read the node's btree array and first hashval in the array that exceeds the given hash and it can then be found in the block pointed to by the before value. 
 SHAPE  \* MERGEFORMAT 
xfs_db Example:
An inode with 1000 small attributes with the naming "attribute_n" where 'n' is a number:
xfs_db> inode <inode#>
xfs_db> p
...
core.nblocks = 15
core.nextents = 0
core.naextents = 1
core.forkoff = 15
core.aformat = 2 (extents)
...
a.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,525144,15,0]

xfs_db> ablock 0
xfs_db> p
hdr.info.forw = 0
hdr.info.back = 0
hdr.info.magic = 0xfebe
hdr.count = 14
hdr.level = 1
btree[0-13] = [hashval,before] 
0:[0x3435122d,1] 
1:[0x343550a9,14] 
2:[0x343553a6,13] 
3:[0x3436122d,12] 
4:[0x343650a9,8] 
5:[0x343653a6,7] 
6:[0x343691af,6] 
7:[0x3436d0ab,11] 
8:[0x3436d3a7,10] 
9:[0x3437122d,9] 
10:[0x3437922e,3] 
11:[0x3437d22a,5] 
12:[0x3e686c25,4] 
13:[0x3e686fad,2]
The hashes are in ascending order in the btree array, and if the hash for the attribute we are looking up is before the entry, we go to the addressed attribute block.
For example, to lookup attribute "attribute_267":
xfs_db> hash attribute_267
0x3437d1a8
In the root btree node, this falls between 0x3437922e and 0x3437d22a, therefore leaf 11 or attribute block 5 will contain the entry.
xfs_db> ablock 5
xfs_db> p
hdr.info.forw = 4
hdr.info.back = 3
hdr.info.magic = 0xfbee
hdr.count = 96
hdr.usedbytes = 2688
hdr.firstused = 1408
hdr.holes = 0
hdr.freemap[0-2] = [base,size] 0:[800,608] 1:[0,0] 2:[0,0]
entries[0-95] = [hashval,nameidx,incomplete,root,secure,local]
0:[0x3437922f,4068,0,0,0,1] 
1:[0x343792a6,4040,0,0,0,1] 
2:[0x343792a7,4012,0,0,0,1] 
3:[0x343792a8,3984,0,0,0,1] 
...
82:[0x3437d1a7,2892,0,0,0,1]
83:[0x3437d1a8,2864,0,0,0,1] 
84:[0x3437d1a9,2836,0,0,0,1] 
...
95:[0x3437d22a,2528,0,0,0,1]
nvlist[0].valuelen = 10
nvlist[0].namelen = 13
nvlist[0].name = "attribute_310"
nvlist[0].value = "value_310\d"
nvlist[1].valuelen = 10
nvlist[1].namelen = 13
nvlist[1].name = "attribute_309"
nvlist[1].value = "value_309\d"
nvlist[2].valuelen = 10
nvlist[2].namelen = 13
nvlist[2].name = "attribute_308"
nvlist[2].value = "value_308\d"
nvlist[3].valuelen = 10
nvlist[3].namelen = 13
nvlist[3].name = "attribute_307"
nvlist[3].value = "value_307\d"
...
nvlist[82].valuelen = 10
nvlist[82].namelen = 13
nvlist[82].name = "attribute_268"
nvlist[82].value = "value_268\d"
nvlist[83].valuelen = 10
nvlist[83].namelen = 13
nvlist[83].name = "attribute_267"
nvlist[83].value = "value_267\d"
nvlist[84].valuelen = 10
nvlist[84].namelen = 13
nvlist[84].name = "attribute_266"
nvlist[84].value = "value_266\d"
...
Each of the hash entries has XFS_ATTR_LOCAL flag set (1), which means the attribute's value follows immediately after the name. Raw disk of the name/value pair at offset 2864 (0xb30), highlighted with "value_267\d" following immediately after the name:
b00:  62 75 74 65 5f 32 36 35 76 61 6c 75 65 5f 32 36  bute.265value.26
b10:  35 0a 00 00 00 0a 0d 61 74 74 72 69 62 75 74 65  5......attribute
b20:  5f 32 36 36 76 61 6c 75 65 5f 32 36 36 0a 00 00  .266value.266...
b30:  00 0a 0d 61 74 74 72 69 62 75 74 65 5f 32 36 37  ...attribute.267
b40:  76 61 6c 75 65 5f 32 36 37 0a 00 00 00 0a 0d 61  value.267......a
b50:  74 74 72 69 62 75 74 65 5f 32 36 38 76 61 6c 75  ttribute.268valu
b60:  65 5f 32 36 38 0a 00 00 00 0a 0d 61 74 74 72 69  e.268......attri
b70:  62 75 74 65 5f 32 36 39 76 61 6c 75 65 5f 32 36  bute.269value.26
Each entry starts on a 32-bit (4 byte) boundary, therefore the highlighted entry has 2 unused bytes after it.

B+tree Attributes
When the attribute's extent map in an inode grows beyond the available space, the inode's attribute format is changed to a "btree". The inode contains root node of the extent B+tree which then address the leaves that contains the extent arrays for the attribute data. The attribute data itself in the allocated filesystem blocks use the same layout and structures as described in  HYPERLINK  \l "_Node_Attributes" Node Attributes.
Refer to the previous section on  HYPERLINK  \l "_B*Tree_Extent_List" B+tree Data Extents for more information on XFS B+tree extents.
xfs_db Example:
Added 2000 attributes with 729 byte values to a file:
xfs_db> inode <inode#>
xfs_db> p
...
core.nblocks = 640
core.extsize = 0
core.nextents = 1
core.naextents = 274
core.forkoff = 15
core.aformat = 3 (btree)
...
a.bmbt.level = 1
a.bmbt.numrecs = 2
a.bmbt.keys[1-2] = [startoff] 1:[0] 2:[219]
a.bmbt.ptrs[1-2] = 1:83162 2:109968

xfs_db> fsblock 83162
xfs_db> type bmapbtd
xfs_db> p
magic = 0x424d4150
level = 0
numrecs = 127
leftsib = null
rightsib = 109968
recs[1-127] = [startoff,startblock,blockcount,extentflag] 
1:[0,81870,1,0] 
...

xfs_db> fsblock 109968
xfs_db> type bmapbtd
xfs_db> p
magic = 0x424d4150
level = 0
numrecs = 147
leftsib = 83162
rightsib = null
recs[1-147] = [startoff,startblock,blockcount,extentflag]
...

xfs_db> ablock 0             (which is fsblock 81870)
xfs_db> p
hdr.info.forw = 0
hdr.info.back = 0
hdr.info.magic = 0xfebe
hdr.count = 2
hdr.level = 2
btree[0-1] = [hashval,before] 0:[0x343612a6,513] 1:[0x3e686fad,512]
The extent B+tree has two leaves that specify the 274 extents used for the attributes. Looking at the first block, it can be seen that the attribute B+tree is two levels deep. The two blocks at offset 513 and 512 (ie. access using the ablock command) are intermediate xfs_da_intnode_t nodes that index all the attribute leaves.
Internal Inodes
XFS allocates several inodes when a filesystem is created. These are internal and not accessible from the standard directory structure. These inodes are only accessible from the  HYPERLINK  \l "_Superblocks" superblock.
Quota Inodes
If quotas are used, two inodes are allocated for user and group quota management. If project quotas are used, these replace the group quota management and therefore uses the group quota inode.
Project quota's primary purpose is to track and monitor disk usage for directories. For this to occur, the directory inode must have the XFS_DIFLAG_PROJINHERIT flag set so all inodes created underneath the directory inherit the project ID.
Inodes and blocks owned by ID zero do not have enforced quotas, but only quota accounting.
Extended attributes do not contribute towards the ID's quota .
To access each ID's quota information in the file, seek to the ID offset multiplied by the size of xfs_dqblk_t (136 bytes). 
 SHAPE  \* MERGEFORMAT Quota information stored in the two inodes (in  HYPERLINK  \l "_Data_Extents_1" data extents) are an array of the xfs_dqblk_t structure where there is one instance for each ID in the system:
typedef struct xfs_disk_dquot {
	__be16	d_magic;	
	__u8	d_version;	
	__u8	d_flags;	
	__be32	d_id;		
	__be64	d_blk_hardlimit;
	__be64	d_blk_softlimit;
	__be64	d_ino_hardlimit;
	__be64	d_ino_softlimit;
	__be64	d_bcount;	
	__be64	d_icount;	
	__be32	d_itimer;	
	__be32	d_btimer;	
	__be16	d_iwarns;	
	__be16	d_bwarns;	
	__be32	d_pad0;		
	__be64	d_rtb_hardlimit;
	__be64	d_rtb_softlimit;
	__be64	d_rtbcount;	
	__be32	d_rtbtimer;	
	__be16	d_rtbwarns;	
	__be16	d_pad;
} xfs_disk_dquot_t;

typedef struct xfs_dqblk {
	xfs_disk_dquot_t	dd_diskdq;	
	char	dd_fill[32];	
} xfs_dqblk_t;
d_magic
Specifies the signature where these two bytes are 0x4451 (XFS_DQUOT_MAGIC), or "DQ" in ASCII.
d_version
Specifies the structure version, currently this is one (XFS_DQUOT_VERSION).
d_flags
Specifies which type of ID the structure applies to:
#define XFS_DQ_USER	0x0001
#define XFS_DQ_PROJ	0x0002
#define XFS_DQ_GROUP	0x0004
d_id
The ID for the quota structure. This will be a uid, gid or projid based on the value of d_flags.
d_blk_hardlimit
Specifies the hard limit for the number of filesystem blocks the ID can own. The ID will not be able to use more space than this limit. If it is attempted, ENOSPC will be returned.
d_blk_softlimit
Specifies the soft limit for the number of filesystem blocks the ID can own.  The ID can temporarily use more space than by d_blk_softlimit up to d_blk_hardlimit. If the space is not freed by the time limit specified by ID zero's d_btimer value, the ID will be denied more space until the total blocks owned goes below d_blk_softlimit.
d_ino_hardlimit
Specifies the hard limit for the number of inodes the ID can own. The ID will not be able to create or own any more inodes if d_icount reaches this value.
d_ino_softlimit
Specifies the soft limit for the number of inodes the ID can own. The ID can temporarily create or own more inodes than specified by d_ino_softlimit up to d_ino_hardlimit. If the inode count is not reduced by the time limit specified by ID zero's d_itimer value, the ID will be denied from creating or owning more inodes until the count goes below d_ino_softlimit.
d_bcount
Specifies how many filesystem blocks are actually owned by the ID.
d_icount
Specifies how many inodes are actually owned by the ID.
d_itimer
Specifies the time when the ID's d_icount exceeded d_ino_softlimit. The soft limit will turn into a hard limit after the elapsed time exceeds ID zero's d_itimer value. When d_icount goes back below d_ino_softlimit, d_itimer is reset back to zero. 
d_btimer
Specifies the time when the ID's d_bcount exceeded d_blk_softlimit. The soft limit will turn into a hard limit after the elapsed time exceeds ID zero's d_btimer value. When d_bcount goes back below d_blk_softlimit, d_btimer is reset back to zero.
d_iwarns
d_bwarns
d_rtbwarns
Specifies how many times a warning has been issued. Currently not used.
d_rtb_hardlimit
Specifies the hard limit for the number of real-time blocks the ID can own. The ID cannot own more space on the real-time subvolume beyond this limit.
d_rtb_softlimit
Specifies the soft limit for the number of real-time blocks the ID can own. The ID can temporarily own more space than specified by d_rtb_softlimit up to d_rtb_hardlimit. If d_rtbcount is not reduced by the time limit specified by ID zero's d_rtbtimer value, the ID will be denied from owning more space until the count goes below d_rtb_softlimit
d_rtbcount
Specifies how many real-time blocks are currently owned by the ID.
d_rtbtimer
Specifies the time when the ID's d_rtbcount exceeded d_rtb_softlimit. The soft limit will turn into a hard limit after the elapsed time exceeds ID zero's d_rtbtimer value. When d_rtbcount goes back below d_rtb_softlimit, d_rtbtimer is reset back to zero.
Real-time Inodes
There are two inodes allocated to managing the real-time device's space, the Bitmap Inode and the Summary Inode.
Real-Time Bitmap Inode
The Bitmap Inode tracks the used/free space in the real-time device using an old-style bitmap. One bit is allocated per real-time extent. The size of an extent is specified by the  HYPERLINK  \l "_Superblocks" superblock's sb_rextsize value.
The number of blocks used by the bitmap inode is equal to the number of real-time extents (sb_rextents) divided by the block size (sb_blocksize) and bits per byte. This value is stored in sb_rbmblocks. The nblocks and extent array for the inode should match this.

	xfs_ino_t	sb_rbmino;	

Real-Time Summary Inode
	xfs_ino_t	sb_rsumino;	

Journaling Log
TODO:









XFS Filesystem Structure		sgi

	 PAGE 2	


di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_LOCAL (1)
    di_nblocks = 0
    di_nextents = 0


di_u.di_dir2sf	xfs_dir2_sf_t
    

	xfs_dinode_t





  di_next_unlinked

hdr	xfs_dir2_sf_hdr_t
    count = number in list[]
    parent = parent inode number

list[]	xfs_dir2_sf_entry_t

namelen/offset/name/inumbernamelen/offset/name/inumber

di_a.di_attrsf	xfs_attr_shortform_t

di_a.di_attrsf	xfs_attr_shortform_t

fsblock	xfs_dir2_block_t


hdr	xfs_dir2_data_hdr_t
  magic = XFS_DIR2_BLOCK_MAGIC (0x58443242: "XD2B")
    

di_u.di_bmx[0]	xfs_bmbt_rec_32_t
    
offset = 0 / block / #blocks

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_EXTENTS (2)
    di_nblocks = dirblksz / fsblksz
    di_nextents = 1


	xfs_dinode_t





  di_next_unlinked

bestfree[]	xfs_dir2_data_free_t
offset / lengthoffset / lengthoffset / length

u[]	xfs_dir2_data_union_t




or



...
...

entry	xfs_dir2_data_entry_t
inumber / namelen / name / tag

leaf[]	xfs_dir2_leaf_entry_t
hashval / addresshashval / address...

tail	xfs_dir2_block_tail_t
    count = total number of leaf[] entries
    stale = number of free leaf[] entries

di_a.di_attrsf	xfs_attr_shortform_t

di_u.di_bmx[]	xfs_bmbt_rec_32_t
    
offset = 0 / block / #blocks...offset = XFS_DIR2_LEAF_OFFSET / block / #blocks

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_EXTENTS (2)
    di_nblocks = > 1
    di_nextents = > 1


	xfs_dinode_t





  di_next_unlinked

bests[tail.bestcount]
    array of bestfree[0].length for each "data" extent

hdr	xfs_dir2_leaf_hdr_t
    info = 0 / 0 / magic = 0xd2f1 (XFS_DIR2_LEAF1_MAGIC)
    count = number of ents
    stale = number of stale/zeroed ents


tail	xfs_dir2_leaf_tail_t
    bestcount = number of "bests" preceeding

ents[]	xfs_dir2_leaf_entry_t
hashval/addresshashval/address...

block[XFS_DIR2_LEAF_OFFSET/<blocksize>]	xfs_dir2_leaf_t

entry	xfs_dir2_data_entry_t
inumber/namelen/name/taginumber/namelen/name/tag...

u[]	xfs_dir2_data_union_t


bestfree[]	xfs_dir2_data_free_t
offset/lengthoffset/lengthoffset/length

hdr	xfs_dir2_data_hdr_t
  magic = XFS_DIR2_DATA_MAGIC (0x58443244: "XD2D")
    

block[]	xfs_dir2_data_t


bests[hdr.nvalid]	
    array of bestfree[0].length for each "data" block

hdr	xfs_dir2_leaf_hdr_t
  info.forw 
  info.back = 0
  info.magic = 0xd2ff (XFS_DIR2_LEAFN_MAGIC)
  count = number of ents
  stale = number of stale/zeroed ents


hdr	xfs_dir2_free_hdr_t
    magic = XFS_DIR2_FREE_MAGIC (0x58443246: "XD2F")
    firstdb = 0
    nvalid = number of element in bests array
    nused = number of valid elements in bests array


ents[]	xfs_dir2_leaf_entry_t
hashval/addresshashval/address...

block[XFS_DIR2_FREE_OFFSET/<sb_blocksize>]	xfs_dir2_free_t

block[]
   hdr.info.forw
   hdr.info.back

block	xfs_da_intnode_t
   

block[]
   hdr.info.forw = 0
   hdr.info.back 


block[0]   

xfs_dir2_data_t



di_a.di_attrsf	xfs_attr_shortform_t

di_u.di_bmx[]	xfs_bmbt_rec_32_t
    
offset = 0 / block / #blocks...offset = XFS_DIR2_LEAF_OFFSET / block / #blocksoffset = XFS_DIR2_LEAF_OFFSET+1 / block / #blocks...offset = XFS_DIR2_FREE_OFFSET / block / #blocks

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_EXTENTS (2)
    di_nblocks = > 4
    di_nextents = > 4


	xfs_dinode_t





  di_next_unlinked

block[]	xfs_dir2_leaf_t

btree[]	xfs_da_node_entry
hashval/beforehashval/before...

hdr	xfs_da_node_hdr





  count = size of btree array
  level = 1



info 
  forw = 0 / back = 0
  magic = 0xfebe 
	(XFS_DA_NODE_MAGIC)


"freeindex" block

"node" block

"leaf" blocks

"data" blocks

block[1]

block[]

Superblock (one sector)	xfs_sb_t

AG free block info (one sector)	xfs_agf_t

AG inode B+tree info (one sector)	xfs_agi_t

AG internal free list (one sector)	xfs_agfl_t



  Root of free space B+tree (1 block)	xfs_btree_sblock_t
    B+tree key is block number

  Root of free space B+tree (1 block)	xfs_btree_sblock_t
    B+tree key is block count

  Root of inode B+tree (1 block)	xfs_inobt_block_t
    (1 block)

  Free list (4 blocks)	

  Inodes (64 inodes)	xfs_dinode_t

di_a	extended attribute fork

Remaining space for metadata and data



di_u	data fork
    

di_core (96 bytes)	xfs_dinode_core_t
    


	xfs_dinode_t



  di_next_unlinked (4 bytes)










di_core

di_core

di_u

di_a

di_u	di_a

"attr1" growth:

"attr2" growth:

Fixed di_forkoff

Moving di_forkoff

flag

bits 72 to 126 (54)
logical file block offset

bits 21 to 72 (52)
absolute block number

bit 0-20 (21)
# blocks

MSB	LSB

di_a.di_attrsf	xfs_attr_shortform_t

First part of the file's data

Second part of the file's data

di_u.di_bmx[di_core.di_nextents]	xfs_bmbt_rec_32_t
    
offset / block / #blocksoffset / block / #blocks...

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_EXTENTS (2)
    di_nblocks = > 0
    di_nextents = > 0


	xfs_dinode_t





  di_next_unlinked


...

di_a.di_attrsf	xfs_attr_shortform_t

bb_keys[bb_numrecs]	xfs_bmbt_key_t
file offsetfile offset...

di_bmbt	xfs_bmdr_block_t
    bb_level = 1
    bb_numrecs = number of leaves

di_u	
    

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_BTREE (3)
    di_nblocks = >0
    di_nextents = >0


inode	xfs_dinode_t





  di_next_unlinked

bb_ptrs[bb_numrecs]	xfs_bmbt_ptr_t
filesystem block numberfilesystem block number...



leaf	xfs_bmbt_block_t
   bb_magic = XFS_BMAP_MAGIC: "BMAP"
   bb_level = 0
   bb_numrecs = number of extents
   bb_leftsib = 0
   bb_rightsib


extents[bb_numrecs]	xfs_bmbt_rec_t
offset / block / #blocksoffset / block / #blocks...

extents[bb_numrecs]	xfs_bmbt_rec_t
offset / block / #blocksoffset / block / #blocks...

leaf	xfs_bmbt_block_t
   bb_magic = 0x424d4150: "BMAP"
   bb_level = 0
   bb_numrecs = number of extents
   bb_leftsib
   bb_rightsib: right most = 0




File data (each block discontiguous on-disk extent of the file)
...









bb_ptrs[bb_numrecs]	xfs_bmbt_ptr_t
filesystem block number...





leaf	xfs_bmbt_block_t
   bb_level = 0
   bb_numrec = number of extents

extents[]	xfs_bmbt_rec_t
offset / block / #blocks...

bb_ptrs[bb_numrecs]	xfs_bmbt_ptr_t
filesystem block number...

node	xfs_bmbt_block_t
   bb_magic = 0x424d4150: "BMAP"
   bb_level = 1
   bb_numrecs = number of leaves
   bb_leftsib
   bb_rightsib: right most = 0




bb_keys[bb_numrecs]	xfs_bmbt_key_t
file offset...

node	xfs_bmbt_block_t
   bb_magic = XFS_BMAP_MAGIC: "BMAP"
   bb_level = 1
   bb_numrecs = number of leaves
   bb_leftsib = 0
   bb_rightsib




bb_ptrs[bb_numrecs]	xfs_bmbt_ptr_t
filesystem block number...

bb_keys[bb_numrecs]	xfs_bmbt_key_t
file offset...

bb_keys[bb_numrecs]	xfs_bmbt_key_t
file offset...

di_u.di_bmbt	xfs_bmdr_block_t
    bb_level = 2
    bb_numrecs = number of nodes


	
    

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_BTREE (3)

inode	xfs_dinode_t



  di_next_unlinked

File data (each block discontiguous on-disk extent of the file)

	...	...	...

leaf	xfs_bmbt_block_t
   bb_level = 0
   bb_numrec = number of extents

extents[]	xfs_bmbt_rec_t
offset / block / #blocks...









di_a.di_attrsf	xfs_attr_shortform_t

* can be 2 with a 512 byte block size and a link > 512 bytes

di_a.di_attrsf	xfs_attr_shortform_t

di_u.di_symlink[di_core.di_size]	char
    

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_LOCAL (1)
    di_nblocks = 0
    di_size = size of di_u.di_symlink[] array
    di_nextents = 0


	xfs_dinode_t







  di_next_unlinked

Symlink contents
valid length = di_core.di_size

di_a.di_attrsf	xfs_attr_shortform_t

di_u.di_bmx[di_core.di_nextents]	xfs_bmbt_rec_32_t
    
offset / block / #blocks...

di_core 	xfs_dinode_core_t
    di_format = XFS_DINODE_FMT_EXTENTS (2)
    di_nblocks = 1*
    di_size = length of symbolic link
    di_nextents = 1*


	xfs_dinode_t







  di_next_unlinked

list[hdr.count]	xfs_attr_sf_entry_t
namelen / valuelen / flags /name[namelen] / value[valuelen]...

hdr	xfs_attr_sf_hdr_t
   totsize = total size of di_attrsf
   count = number of entries in list[]

di_u	
    

di_core 	xfs_dinode_core_t
    di_anextents = 0
    di_forkoff > 0
    di_aformat = XFS_DINODE_FMT_LOCAL (1)

	xfs_dinode_t





  di_next_unlinked

hdr.totsize

di_a.di_abmx[di_core.di_anextents]	xfs_bmbt_rec_32_t
    
offset / block / #blocks...

di_u


di_core 	xfs_dinode_core_t
    di_anextents > 0
    di_forkoff > 0
    di_aformat = XFS_DINODE_FMT_EXTENTS (2)


	xfs_dinode_t





  di_next_unlinked

valuelist	xfs_attr_leaf_name_remote_t
valueblk / valuelen / namelen / name[]...

flags & XFS_ATTR_LOCAL != 0

namelist	xfs_attr_leaf_name_local_t
namelen / valuelen / name[] / value[]...

flags & XFS_ATTR_LOCAL == 0

block[valueblk]	__u8[]

    value[valuelist.valuelen]	

entries[]	xfs_attr_leaf_entry_t
hashval / index / flags...

"node" block

"leaf" blocks

hdr	xfs_attr_leaf_hdr_t
  magic = XFS_ATTR_LEAF_MAGIC (0xfbee)
  count = number of entries[]
  usedbytes = number of bytes used in the leaf block
  firstused = index of first entry
  holes = 
  freemap[0-2] = 

block[0]	xfs_attr_leafblock_t
xfs_attr_leaf_name_remote_t

info 
  forw = 0 / back = 0
  magic = XFS_DA_NODE_MAGIC


hdr	xfs_da_node_hdr





  count = size of btree array
  level = 1



btree[]	xfs_da_node_entry
hashval/beforehashval/before...

block	xfs_da_intnode_t
   

block[last]
   hdr.info.forw = 0
   hdr.info.back 


block[]
   hdr.info.forw
   hdr.info.back

hdr	xfs_attr_leaf_hdr_t
  info.forw 
  info.back = 0
  info.magic = XFS_ATTR_LEAF_MAGIC
  count = number of entries


entries[]	xfs_attr_leaf_entry_t
hashval/index/flags...

block[first]	xfs_attr_leafblock_t

di_a.di_abmx[di_core.di_anextents]	xfs_bmbt_rec_32_t
    
offset / block / #blocks...

di_u


di_core 	xfs_dinode_core_t
    di_anextents > 0
    di_forkoff > 0
    di_aformat = XFS_DINODE_FMT_EXTENTS (2)


	xfs_dinode_t





  di_next_unlinked

namelist	xfs_attr_leaf_name_local_t

valuelist	xfs_attr_leaf_name_remote_t




































agf	xfs_agf_t
    agf_roots[2]
    agf_levels[2] = 1



[0]	xfs_btree_sblock_t
  bb_magic = XFS_ABTB_MAGIC
  bb_level = 0 (leaf)
  bb_numrecs = size of recs array
  bb_leftsib/bb_rightsib = NULL

recs[bb_numrecs]	xfs_alloc_rec_t
startblock / blockcountstartblock / blockcount...

recs[bb_numrecs]	xfs_alloc_rec_t
startblock / blockcountstartblock / blockcount...

[1]	xfs_btree_sblock_t
  bb_magic = XFS_ABTC_MAGIC
  bb_level = 0 (leaf)
  bb_numrecs = size of recs array
  bb_leftsib/bb_rightsib = NULL



keys[bb_numrecs]	xfs_alloc_key_t
startblock / blockcountstartblock / blockcount...

[0]	xfs_btree_sblock_t
  bb_magic
  bb_level = 1 (node)
  bb_numrecs = size of recs array
  bb_leftsib/bb_rightsib = NULL



agf	xfs_agf_t
    agf_roots[2]
    agf_levels[2] = 2

ptrs[bb_numrecs]	xfs_alloc_ptr_t
AG block numberAG block number...

recs[bb_numrecs]	xfs_alloc_rec_t
startblock / blockcountstartblock / blockcount...

	xfs_btree_sblock_t
  bb_magic
  bb_level = 0 (leaf)
  bb_numrecs = size of recs array
  bb_leftsib = NULL
  bb_rightsib



	xfs_btree_sblock_t
  ...
  bb_leftsib
  bb_rightsib
  ...

	xfs_btree_sblock_t
  ...
  bb_leftsib
  bb_rightsib = NULL
  ...

startblock

blockcount

agf	xfs_agf_t
    agf_flfirst
    agf_fllast
    agf_flcount

	xfs_agfl_t
block numberblock numberblock numberblock numberblock number...

unused	xfs_dir2_data_unused_t
freetag / length /  / tag

di_a	extended attribute fork

di_u	data fork
    

di_core (96 bytes)	xfs_dinode_core_t
    


	xfs_dinode_t



  di_next_unlinked 

di_a	extended attribute fork

di_u	data fork
    

di_core (96 bytes)	xfs_dinode_core_t
    


	xfs_dinode_t



  di_next_unlinked = NULL (0xffffffff)

agi	xfs_agi_t
   ...
   agi_unlinked[64]

#bits = sb_agblklog

# bits =
sb_inoplog

# bits =
sb_inoplog


#bits = sb_agblklog


AG number

Relative Inode number format

Absolute Inode number format

MSB	LSB

agi	xfs_agi_t
   agi_root
   agi_level = 1

chunk of 64 inodes


recs[bb_numrecs]	xfs_inobt_rec_t
startino / freecnt / fmaskstartino / freecnt / fmask...

	xfs_inobt_block_t
  bb_magic = XFS_IBT_MAGIC
  bb_level = 0 (leaf)
  bb_numrecs = size of recs array
  bb_leftsib/bb_rightsib = NULL



chunk of 64 inodes


chunk of 64 inodes


	xfs_inobt_block_t
  ...
  bb_leftsib
  bb_rightsib = NULL
  ...

	xfs_inobt_block_t
  ...
  bb_leftsib
  bb_rightsib
  ...

recs[bb_numrecs]	xfs_inobt_rec_t
startino / fcnt / fmaskstartino / fcnt / fmask...

	xfs_inobt_block_t
  bb_magic
  bb_level = 0 (leaf)
  bb_numrecs = size of recs array
  bb_leftsib = NULL
  bb_rightsib



ptrs[bb_numrecs]	xfs_inobt_ptr_t
AG block numberAG block number...

keys[bb_numrecs]	xfs_inobt_key_t
startinostartino...

[0]	xfs_inobt_block_t
  bb_magic
  bb_level = 1 (node)
  bb_numrecs = size of recs array
  bb_leftsib/bb_rightsib = NULL



agi	xfs_agi_t
    agi_root
    agi_level = 2

sb	xfs_sb_t
   sb_uquotino
   sb_gquotino

user quota inode	xfs_dinode_t


di_u
    extents

di_u
    extents

grp/prj quota inode	xfs_dinode_t


quots[]	xfs_dqblk_t
UID 0UID 1...

quots[]	xfs_dqblk_t
GID 0GID 1...







 ()37XbglvwȬȡ~z~gYPYh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHuhjhUhshhQ9h"hhQ9B*phh"B*phh"h"B*phh1OJQJhG>hG>H*OJQJhG>OJQJh]hhQ9OJQJh]h0HCJOJQJaJh]hhQ9CJOJQJaJh]hHCJOJQJaJ)4567wxyz{	q		
o

o2gd0X$^a$gdhQ9,gd$-gd$.l								 	<	=	>	?	O	P	Q	k	l	m	n	o	p	q	r	s			źӈeźTӈ jwhvUmHnHu2jh"hv>*B*UmHnHphuh"mHnHu#h"5OJQJ\^JmHnHu j}hvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2jh"hv>*B*UmHnHphu 																						





źӈeźT jkhvUmHnHu2jh"hv>*B*UmHnHphuh"mHnHu#h"5OJQJ\^JmHnHu jqhvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2jh"hv>*B*UmHnHphu



1
2
3
4
L
M
N
h
i
j
l
m
n
o
p
q












ʧʜ|bʜQ j_hvUmHnHu2jh"hv>*B*UmHnHphu jehvUmHnHujh"UmHnHuh"mHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu'h"5CJOJQJ\aJmHnHu











 !=>?@LMNhijlmnΫΠfΠU jShvUmHnHu2jh"hv>*B*UmHnHphu jYhvUmHnHujh"UmHnHuh"mHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu!h"CJOJQJaJmHnHu$jh0h"0JUmHnHu!nopqͪ͟kQ͟2jh"hv>*B*UmHnHphu'h"5CJOJQJ\aJmHnHu jMhvUmHnHujh"UmHnHuh"mHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu!h"CJOJQJaJmHnHuol
c

Rbg\YW^
5678IJKefgijklmn±££o±£U£2j
h"hv>*B*UmHnHphu jA
hvUmHnHu2j	h"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu!h"CJOJQJaJmHnHu$jh0h"0JUmHnHuh"mHnHujh"UmHnHu jG	hvUmHnHu 









0
1
±££o[£'h"5CJOJQJ\aJmHnHu j5hvUmHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu!h"CJOJQJaJmHnHu$jh0h"0JUmHnHuh"mHnHujh"UmHnHu j;hvUmHnHu1
2
3
@
A
B
\
]
^
`
a
b
c
d
e













źӈeźT j)hvUmHnHu2j
h"hv>*B*UmHnHphuh"mHnHu#h"5OJQJ\^JmHnHu j/
hvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2jh"hv>*B*UmHnHphu












#$%&/01KLMOPʧʜ|bʜQ jhvUmHnHu2jh"hv>*B*UmHnHphu j#hvUmHnHujh"UmHnHuh"mHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu'h"5CJOJQJ\aJmHnHuPQRSTpqrs˨˝}lR˝2jh"hv>*B*UmHnHphu!h"CJOJQJaJmHnHu jhvUmHnHujh"UmHnHuh"mHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu'h"5CJOJQJ\aJmHnHu$jh0h"0JUmHnHu$%&'?@A[\]_`abcd±££o±£U£2jh"hv>*B*UmHnHphu jhvUmHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu!h"CJOJQJaJmHnHu$jh0h"0JUmHnHuh"mHnHujh"UmHnHu jhvUmHnHu 	
&'±££o[£'h"5CJOJQJ\aJmHnHu jhvUmHnHu2jh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu!h"CJOJQJaJmHnHu$jh0h"0JUmHnHuh"mHnHujh"UmHnHu jhvUmHnHu'()DEF`abdefghiźӉŀfźU jhvUmHnHu2jvh"hv>*B*UmHnHphuh"mHnHu!h"CJOJQJaJmHnHu jhvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2j|h"hv>*B*UmHnHphu$%&'9:;U̩̞~jP̞2jjh"hv>*B*UmHnHphu'h"5CJOJQJ\aJmHnHu jhvUmHnHujh"UmHnHuh"mHnHu2jph"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu#h"5OJQJ\^JmHnHuUVWYZ[\]^z{|}® } lZ #h"5OJQJ\^JmHnHu jhvUmHnHu2jdh"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu'h"5CJOJQJ\aJmHnHu$jh0h"0JUmHnHuh"mHnHujh"UmHnHu jhvUmHnHu"#$%678RSTVWXYZ[wxźӆ}cźRӆ} jhvUmHnHu2jXh"hv>*B*UmHnHphuh"mHnHu'h"5CJOJQJ\aJmHnHu jhvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2j^h"hv>*B*UmHnHphu xyz źӆ}cźRӆ} jhvUmHnHu2jLh"hv>*B*UmHnHphuh"mHnHu'h"5CJOJQJ\aJmHnHu jhvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2jRh"hv>*B*UmHnHphu  !"456PQRTUVWXYuvwxźӆ}cźR jhvUmHnHu2j@h"hv>*B*UmHnHphuh"mHnHu'h"5CJOJQJ\aJmHnHu jhvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2jFh"hv>*B*UmHnHphu#$%&;<=W̩̞~jP̞2j4!h"hv>*B*UmHnHphu'h"5CJOJQJ\aJmHnHu j hvUmHnHujh"UmHnHuh"mHnHu2j: h"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu#h"5OJQJ\^JmHnHuWXY[\]^_`|}~® } lZ #h"5OJQJ\^JmHnHu j"hvUmHnHu2j."h"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu'h"5CJOJQJ\aJmHnHu$jh0h"0JUmHnHuh"mHnHujh"UmHnHu j!hvUmHnHu

+,-.=>?YZ[]^_`ab~źӆ}cźRӆ} j$hvUmHnHu2j"$h"hv>*B*UmHnHphuh"mHnHu'h"5CJOJQJ\aJmHnHu j#hvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2j(#h"hv>*B*UmHnHphu 
`[Q_!20<Xg= gdz6gdz6gdpwgd#GgdGgd6	
&'źӆ}cźRӆ} j&hvUmHnHu2j&h"hv>*B*UmHnHphuh"mHnHu'h"5CJOJQJ\aJmHnHu j%hvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2j%h"hv>*B*UmHnHphu '()89:TUVXYZ[\]yz{|źӈeźT j(hvUmHnHu2j
(h"hv>*B*UmHnHphuh"mHnHu#h"5OJQJ\^JmHnHu j'hvUmHnHujh"UmHnHuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu2j'h"hv>*B*UmHnHphu ./0JKLNOʧʜ|bʜQ j{*hvUmHnHu2j)h"hv>*B*UmHnHphu j)hvUmHnHujh"UmHnHuh"mHnHu2j)h"hv>*B*UmHnHphuh"mHnHuh0h"0JmHnHu$jh0h"0JUmHnHu'h"5CJOJQJ\aJmHnHuOPQR_ !2fg	
/0WXwx!ǿzzzozzjw+hUhz6hz6hz6hz60Jj*hz6Ujhz6Uhz6h(?}hz6hFDqh*hpwh
hGhzhzhp6hGhhjhCJUaJ#h"5OJQJ\^JmHnHu$jh0h"0JUmHnHu*!"#)*tu<FOSekl̸ԭ̸Ԧԛ}tmihhz6h0 hz6h0 0Jj-h0 Ujh0 Uh0 hL	hL	hJUhL	hL	hJUhJUj,hUhJUhJU0Jj,hUjhJUUhJUhz6hz6hz6hz6hz60Jjhz6Uj+hz6U'=Ju"ly	6C(V
&Fgd^gd#Ggd`C gd0 gd0  gdL	 gdJUgdJU gdz6gdp6	56Chi'( UVW{ ; > F     !!񾺶}yyhE|HhhB6hp6hB60J/h&hzhp6hXPh2zBh^hskhb@hb@H*h0hb@h>h4h0 h0 hL	h0 hz6hz60Jj.hUjhz6Uhhz6hz6hz6h
/{ !8!~!!]"""""###?#[#m######
$'$D$a$}$

gdUgd[@gd#Ggd^!!3!4!5!6!7!8!}!~!!!!!["\"]""##&)&p&]'e'g'r''''' (@(F(G(R(((((((((¾ʺƭƠƘƑ|xtphb,hWhPhp6hJ%hzhp6hYC0J1hYChYCh8/Dh[@5h(?}h[@mHnHsHh[@h[@mHnHsHhYChg5hwyh[@h4hb@hZsh^h^j.hdFUjh^UmHnHuh^jh^U+}$$$$$$%,%E%^%w%%%%%%&(&A&Y&o&&&&&&	'&'@'

gdU@'['g's'''H(S(((,)8)c)k)))** +*+N+Y+}++++W, gdq gdYCgdYCgd[@

gdU(())))))+)7)Q)Z)[)a)b)j)p)))))))**'*K*L*****++ +)+*+;+D+M+N+X+Y+k+t+|+}++++++++++++,ǿǻǻdzódzdzódzódzódzhwrh[hqhqhzx#hhHchqhKjhb,hshp6hYChYChYChFhhF0Jhhp60Jj'/h0UhjhU:,,-,.,/,1,2,3,A,C,D,E,O,V,W,a,b,,,,,,,,,,,,,,,,,---...:.;.M.d..........¾¾¾¾hAhOJQJhAhAOJQJhTiBh[h[hAzxh[hh[hp6hqhYChYChYChqhqhwrhwr0J/
hwr0Jhwrhwr0Jj/h8UhwrjhwrU3W,b,,,,,,,;.@.L.($Ifgd0l gdqgdYC
L.M.d..jWD)$Ifgd0l*$Ifgd0lkdA0$$Ifl0%	
	@@
t0 644
lahp....q^)$Ifgd0l*$Ifgd0lzkd1$$Ifl0%	

t0 644
lah...U/q^)$Ifgd0l*$Ifgd0lzkd1$$Ifl0%	

t0 644
lah....T/V/m/n/u/////////////////0000&000?0A0Y0Z0a0l0x0z000000011+1,171C1p1r1s1~1111模h4hJxhYChYChYChqh[hTiBhTiBhTiBhTiBOJQJhp6hhOJQJhx!Vhx!Vhx!Vhx!VOJQJhx!Vh[hhTiBhh[hh9U/V/n//q^)$Ifgd0l*$Ifgd0lzkdM2$$Ifl0%	

t0 644
lah////q^)$Ifgd0l*$Ifgd0lzkd2$$Ifl0%	

t0 644
lah///0q^)$Ifgd0l*$Ifgd0lzkd3$$Ifl0%	

t0 644
lah000@0q^)$Ifgd0l*$Ifgd0lzkd$4$$Ifl0%	

t0 644
lah@0A0Z0y0q^)$Ifgd0l*$Ifgd0lzkd4$$Ifl0%	

t0 644
lahy0z000q^)$Ifgd0l*$Ifgd0lzkd^5$$Ifl0%	

t0 644
lah0001q^)$Ifgd0l*$Ifgd0lzkd5$$Ifl0%	

t0 644
lah11,1q1q^)$Ifgd0l*$Ifgd0lzkd6$$Ifl0%	

t0 644
lahq1r1s112)2223%3k3w333zzzuzuzuz gdgdYC gdqzkd57$$Ifl0%	

t0 644
lah
1111122(2)2X2w222222333$3%3=3C3I3j3k3v3w3z3{333333333333333333344
444444(4445464A4B4E4F4P4޺޺޺޺h|Lh|Lhp6h|L0J1hh|LH*h|LhhH*hn(hI@hhhp6h0J1hYChYChYChqhqhJ3hmp1hhq@3334464B4444455A555666666h7t7F8R8888 gd4gdYC gd|LP4[4h444444444444444444555@5A555556666~6666666677g7h7t777777778ĽĽĽĽĽĹĽh;&hp6hAB0J1hABh?hABmHsHh?h4mHsHh4hYCmHnHsHhp6h4h4h4hp6hRo0J1hhRoH*hRohYChYChYChZ4h|Lh|Lh|Lhp6h|L0J1388 8!8"8.8/8E8F8R8b8d8m8t88888899"989;9K9f9v9999999999:::,:4:9:::@:A:]:m:x::::::::::ƿѻhoh4h4hYChYChYChn)Yh:h:hAzxh:h4h:hqYhXhqYhqYh4h?hYChABh4h;&h;&0Jj7hUh;&jh;&U888999:9WD1)$Ifgd0l*$Ifgd0lkdO8$$Ifl0%	
	@@
t0 644
lahp($Ifgd0l:9;9K9e9q^)$Ifgd0l*$Ifgd0lzkd!9$$Ifl0%	

t0 644
lahe9f9v99q^)$Ifgd0l*$Ifgd0lzkd9$$Ifl0%	

t0 644
lah9999q^)$Ifgd0l*$Ifgd0lzkd[:$$Ifl0%	

t0 644
lah999:q^)$Ifgd0l*$Ifgd0lzkd:$$Ifl0%	

t0 644
lah::,:\:q^)$Ifgd0l*$Ifgd0lzkd;$$Ifl0%	

t0 644
lah\:]:m::q^)$Ifgd0l*$Ifgd0lzkd2<$$Ifl0%	

t0 644
lah::::::;*;2;\;f;;;zuzzz gdo gd4gdYCzkd<$$Ifl0%	

t0 644
lah:::::;;;);*;1;2;[;\;e;f;;;;;;;;;;;<
<<<<V<`<<<<<<<<<<=*=P=g=r========Ͽ⴬ôôⴥ⡝␌h1Sh*KKhp6h!0J1h!h{h(h(hhPH*hPhhh(hp6hhH*hh4h4h4h2uhYChYChYChohohohJ7hz5;<<<<<===>??b@r@@@7AlAAA,BrBBBC$gddFgdItgd1Z^gd1Z^ 
&Fgd0+ gd(gdYC gd======>>0>1>>
??#?$????#@a@b@j@q@r@@@BBCC&C/CCCNEEEFF
FFFFGGTG]GhGGGHǿÿÿhhShGhhmuh1,h4h1Z^hIthY{Ih?hItmHnHsHh?hIth-hIthT&h1Z^hFAh8)hTJh0+h0+hp6h0+0J1h(h0+h*KKhp6h00J1h02C&C0CFCWCjCvCCCCCCCC
DD(D:DND]DmD|DDDDDDDEgdIt$gddFEE#E/E:ENE\EiEvEEEEEEEEEEEFFGTGhG?HXHnHHgdgdgd#GgdItH!HIIIIIIIIcJdJeJkJJJJJJ.KrK}KKKKLL
LLLLLLL	M
M0M1MBMCMdMlMmMnMMMMMM.N/NNNOO&O׽׽hY{IhY{I0J/hp6hY{I0J1hY{IhE;hShJtdhmuhth#hth#h:hth#hwrhwr0J/h?hh?h0J/h?hhwrhdEehh0J/hjoYh8/Dh5h5IxhhP7HHHHHII/ICIXInIIIII1J>JJJJJJJLL]LhL gdth#gdth# gdgdgdgdhLL
MnMyMMMMM/N;NNN(O>OOP=POPaPuPPPPgdwJgd4gdY1 gdY{IgdY{I gdE;gdE; gdJtdgdJtdgdth# gdth#&O'O(O1O=O>OFOGOJOLOOOPPPPPPPQ[QjQlQ{Q|Q}QQQQQQ&R.RRRCSRSbSgSSS?T@TATXTZTݾݩݠݗݗݎ݇{hKejhKeUhwJhjoYhZhjoY0J/hhjoY0J/hhjoY0J/h_HhjoY0J/h:fhwJhwJ5hwJhwJh\"hs5hsh\"hwJ5hwJhjoYhk&ht9h4hY1hShY{IhY{IhY{I-PPQ+QBQYQ}Q~QQQQ"RRSxSS@T]T#U@UNUrVoWkXgd)gdE6gdgd]gd<gd/
&Fgd/gdsgdjoYgdwJZT[T\T]TTTTUUUUU!U"U#U$U;U<U=U>U?U@UAUHUJUMUNUPU[UrUtUUUUUUUUUVqVrV'XVXcXkXXXX˽ӱӱөөөөәӕӄhn{jhn{Uh1h10J/h1hshPhihiH*hih!*hE6j=hjoYUjhUmHnHujhUhShwhk2hhh:0
h<jhKeUjl=hwJU0XXXXXXXXXXXXY%Y&Y'Y>Y?Y@YAYBYCYYYYYZ'Z(Z3Z4Z:Z;ZOZYZ~ZZ[['[([,[IJ̦tmih6MRh?hChhChhChmHnHsHh?hChmHnHsHhmhChhUhCPhZhihTb0j?hTb0Ujh1UmHnHuh1jh1Uh/hShS0J/hShn{hS0J
hm0Jjhn{Uj>h&U)kX&YCYYY4Z=ZOZYZoZ~ZZZZZZZZZZ[['[([[[[gd$gdgdChgdZgdZgd),[1[3[T[U[Z[[[d[[[[[[[[[[\\]]]
_-_0_7_;```a aaaa,b-b>b`bcbjbqbrbsb|bbbbbbbbMcNclcɾ®jh[Uh	[h"Bh[h?huh4hZhQf/hh0J/hhQf/hQf/hQf/hVheh9q0J/h9qh9q0J/h9qhChh'x*h'x*0J/h'x*hmh5[\\]&]9]C]V]`]l]{]]]]^^?_U_h_r_______`;`gd9qgd9q	v^	`vgd9q;`` a6aIaSafapa~aaaaaa-brbsbbbbcddd^eegd4gd	[gd?gd#GgdQf/gdQf/gdVlcmcnczc{c|ccccccccdddd d=d@dVd{d|dddddddddddddddddDeIePeQe]e^e˿왑슆{w{w{sh4h(;rhPh?h?h?h	[h[j@h.dUjh[UmHnHuha%h"|0Jj"@h@FUha%jha%Uh"Bh"|h[h[h[h[0J/h[h[h[0Jjh[Uj?h@FU,^ee}ffffffffffffffffgggFgLgPgQggggghhhhhhh&i'i7i8iFiiiiiiiiiiiiiihChX>hX>0J
hX>0Jj-Ah(?}UjhX>UhX>h5h4hhhhh^h^hh:0J/
h#nw0J/hzsh#nwh_h:hw/h\"h^5hhh^h#95eeeeeeff)f@fTfhffffffg&gNgYggggg#h gd^ gdzsgdzsgd: gd:gdw/gd^#h-hahohhhhh'i8iiijkkkkkkll1lDlElllgdlgd	gd8/DgdX>gdX> gdhgdh gd^gd^iiijjjjjjjjk2k3k[k\k]khkikkkrkskkkkkk3lBlClDllllllllllmm?mKmmmmmmmmmҾ㷯竣竣瘏h)EhhUh
8h
80J/h
8hlhlhlhl5hlh8/Dh8/D5h8/Dh8/Dh8/Dh8/D0JjAh
.Ujh8/DUh8/Dh8/D0J/h8/Dh	hh0J/hhX>h	3llllllmn6nRnonnnnnn%pdppr&rAr\rgdu{
&Fgdf*
&F	gdSgd4gd#Ggd(1jgd %gdigdigd
8gdlmnnn1n2n3n4n5n6n<nQnRnSnjnknlnmnnnonnnnnnnnnnn,o-oKoLoMoWoXorosooƴΨzozfzzhf*hf*0JjaCh/LKUjhf*Uhf*h4h(1jh(1jh	h %hp6hihihxhijBh}Ujh}UmHnHuh}jh}UhNhyjABhfUjh8UmHnHuh8jh8Uh
8heo'ooooo$p%pGpHp_p`papbpcpdpupppppppppppppppp<qIqXqqqqqqqqrrrr.r/r]rߵ߱߭ϤϠϘϔϔχ߇{hP	h0h>hu{hp6h0J/hh-i*hE7h@hp6hXP0J/hphghSjgDh]UjhXPUmHnHuhXPjhXPUh4hf*hf*hf*0Jjhf*UjCh/LKU/\rvrrrrrresmssssstuvvvwwwwwxxgdl\gdl\gd#GgdPgd-i*gd!
&Fgdf*gdu{]rrrrrrrrrrrrss s2s9s>sPsdsesmsvssssssWt^t_thtmtwtttttttu)uuuuѼѼ{tphj,h3h3hp6h30J/h3	h>6	hE6	hy;/6h>h>6OJQJ	hQ6h>h>6hPS5hP	h0h!hp6hZ'"hp6hu{0J/hu{hu{mHnHsHhu{hu{h?hu{mHnHsHhu{hu{mHnHsH,uuuuuuuvvvvvv)vOvSv]v_vrv|vvvvvv/w5w[wwwzzzzzzzz{{{{{{{{ѯ|xxtthX_hD/hhAhl\hl\hdFh_h_hu{hl\h,h,h,hl\hLMhl\hl;hrhl;hH+hH+hrhp6hr0J/hrhH+h9hwhj,hj,0J#h3hj,hH+hH+h"(UhH+hj,-x3xHx^xuxxxxxxy'yAy\yyyyyyyyzz zhzpzzz{ gd gdl\gdl\gdl\{M{V{W{X{`{a{e{o{{{{{{{
||*|1|:|v|}|||||}A}I}M}N}R}d}m}o}u}v}}}}\~j~o~~~~"VZ_˿˿˷˯˳˯˫˧Ӕ˘hp6hi hi h3Lhh'hhuhhP
hh"h?hV:hi hFhl\hhh"7hAhp6hD/0J1hD/hp6hX_0J1hX_:{{p~~~~~~"7@S]/8gdy gdi gdX_ gdX_gdl\$67@JPRS]_
./8EDEN|}ÃуԃՃ؃R߄6>FUкжвh5=hVhVhQh[nh{hVh%lh>vhyhyhi hyh@h62hyh)hzh/LKhp6h3L0J1h3Lhi hi hp6hi hl\;2EN}ÃՇ1<;GYdq gd63 gd] gd gdv gdV gdygdl\gdyU[Ӆ܅!I`u}ʆԆ'>TsԇՇ01<_n‰ωЉ߉MNOj;ͺͨ}h5*h]0JjDh<Uh5*jh5*Uh`sh0+h`shp6h`s0J1hp6h]0J1h]h
h9hhhhvhvhQhp6hv0J1hp6hvhl\hVhVhVh1jkڊ:;GXYdpqz؋!*4Huƌی9Inލ-hnYh+hQhAzxhAzxOJQJhp6hAzxhnYhAzxhAzxhAzx5^JhAzxhAzxh63h63h]h]hhhp6h630J1hNywh63hl\h]jh5*U5qz؋݋M:*$IfgdnYlkdE$$Ifl0%	@@
t0 644
lahp($IfgdnYl gd63gdl\34Htq^*$IfgdnYlzkddF$$Ifl0%
t0 644
lah)$IfgdnYltuŌq^)$IfgdnYl*$IfgdnYlzkdG$$Ifl0%
t0 644
lahŌƌیq^)$IfgdnYl*$IfgdnYlzkdG$$Ifl0%
t0 644
lah8q^)$IfgdnYl*$IfgdnYlzkd;H$$Ifl0%
t0 644
lah89Imq^)$IfgdnYl*$IfgdnYlzkdH$$Ifl0%
t0 644
lahmnq^)$IfgdnYl*$IfgdnYlzkduI$$Ifl0%
t0 644
lahq^)$IfgdnYl*$IfgdnYlzkdJ$$Ifl0%
t0 644
lahFq^)$IfgdnYl*$IfgdnYlzkdJ$$Ifl0%
t0 644
lah-@EG^ Um
)BCn~ !".pΒޒ"M]mߓǾǺǺDzǧǾǾǾǚǾǚh=wbh8=h8=0JjNh(?}Ujh8=Uhh8=h8=0J/h8=h5h|hw
hl\hp6hnYhnYhnYhAzxhAzxhnYhnYhnYOJQJ9FG^q^)$IfgdnYl*$IfgdnYlzkdLK$$Ifl0%
t0 644
lahq^)$IfgdnYl*$IfgdnYlzkdK$$Ifl0%
t0 644
lahTq^)$IfgdnYl*$IfgdnYlzkdL$$Ifl0%
t0 644
lahTUmq^)$IfgdnYl*$IfgdnYlzkd#M$$Ifl0%
t0 644
lah	q^)$IfgdnYl*$IfgdnYlzkdM$$Ifl0%
t0 644
lah	
הzuppkkufagdgdEgdhgd5gd| gd|gdl\zkd]N$$Ifl0%
t0 644
lahҔӔԔՔ֔ה)234now !3@R_in	,-ξεα|uh hhEhqOhhEh h#HhX0J/hXhp6h;|0J/hh.|h;|h hp6hB)0J/hs;h3Sh29h]xQhB)h$_.h5hhjOhA?UjhA?UmHnHuhA?jhA?U-->TK֜Un9&5gdjzgd#Ggd`Qgd`Qgd
&FgdHgdMxgd1gda8
&Fgda8
&Fgd gd gd#G-.1;H—×AŘϘИӘטݘߘ.4v}*ګ秣͛ʹvh h 0JjPhXUjh UhP	hP	0J/hP	hDhhhp6h0J/
h}=0J/
hu0J/h#Hh#H0J/hh#Hhp6hz"0J/hp6h 0J/hz"h hJThJThJTh hJTh.*+>TUXbk̚՚ۚ
_gvЛ79HIKZ[_e{œȜʜӜ՜ҡҝɔҡ}
hHs0J/hhhp6h0J/hp6h,0J/hEhoAhh0J/
hu0J/hh'0J/h'hhhp6ha80J/ha8hdhdhdhdhhdh)shh jh U0456ABUcmnԝݝbi{Ǟ	
%'689efg¾ӉӉӁ}u}jhAFUhAFhhmh.B?h_ h_ 0J/h0h_ h0h0
hu0J/
h00J/h"X"h0h_ h0h0h_ hMxhp6hH0J/hHh`Qh1ha8ha80JjPhNYUha8jha8U,ޟ#$%&459HJ!+ġҡRúúЪ|sssshaha0J/h0Bh2hp6h20J/h2hahph
$h
$h
$hph"h$_.
h)9 0J/
hu0J/h)9 h)9 0J/h)9 hp6h`Q0J/h`Qh`Qh`QhHhhAFhAF0JjhAFUjQh/:^U,+./?Iڣ-.0FLZ֤"#'-HLioȥ֥ڥ;<bcd軲~jQhw@Ujhw@Uhw@h(}h(}0J/h(}hhhco&h<hp6h0J/hp6hf0J/hh0J/h
h0J/hOhO0J/hOhhp6hp0J/hjzhphjzhp/0
<Imήܯ0Cgdgdgdy"gd#Ggd]gd<Lgdw@
&Fgdpgdpdwx 89FR٧
&*4fhk9EJKUЪĻķختآآطآĻآhyhd>h(%hhfhp6hG0J/hp6hp6h]0J/h]h0+h+hp6h+0J/hGh+hOhphw@hw@jhw@Uh1.hw@0J9 789:;<I۫ݫ#'=ݬ3Slm}ɮʮˮ̮ͮή023¾ʺΦΞΞ΄{wwwsh"hhp6hIw0J/hIwjRhb9UjhsUmHnHujhsUhb9hMhahMh|hyOQhy"hhcIh(%hsh.&jhhGjRhdu UjhGUmHnHuhGjhGU-3Vef}CNV]auְ"JXgh1357IOsشzh"hhU+hghh
h
H*h
hp6h0J/hh"h:Zh:Zh"hWhp6hW0J/hWh"hk2php6ha0J/hah`oh=
h"0J/hb9h`hhp6h0J/h0ưְhشٴa~t·ַgdrgdrgdR=gd.&jgd#GgdW
&Fgd"gdagdaشٴNY`abyz{|}~̶ֶeghkst·øĸָ׸龵vrrkghe>NhrhrhL6h?hrmHnHsHh-h-mHnHsHh-hrmHnHsHhrh
OhR=h
h"Fh&1h#hC[0J/hC[j=Sh0UjhTUmHnHujhTUhJhT0J/hThp6h{h.&jhhW'-ARdwĸ׸6:Ocuyǹ޹>2^>`2gdogde>N$gdo$gde>N>2^>`2gdL6gdr
6:uyƹǹݹ޹ 359Wktػtmnx¿ɴɧɈ|tot	*h*hh"*h"h"hxh"*hhomHnHsHhhomHnHsHhohomHnHsHh-hp6h.0J/h.hhohe>NhcTh-h-mHnHsHh-homHnHsHh-he>NmHnHsHh:Z+YkuJػf;ɽWnֿ
>?_~gd"gdxgdogdo¿ſǿɿ!=?@G\^br}~DFKOPRW\^cghrstuv./@ARSTZgҽⰣ֛֗֟֟h
`h.&jhhhh[;h-h-mHnHsHh-h~mHnHsHh>9h,.hfhJh?x0J/h?xh~hT
hhl*hh"h"*hh"	*h5~v/ASTgK4TfzgdEgd^gd#G>2^>`2gd[;gd~gdlgd" (3IJ=CHJ`2JZz	;KWY%P`hp6h:l0J/h:lhQhwWhwWhp6hwW0J/h{hylhylhVhp6hqw0J/hqwhmh}K!hylhp6hE0J/hEhEhQh;p
h3:6h{rhZAhIh+?hE5z!Y%"ugd
&Fgd:lgdQgdwWgdE
&FgdylgdE !":H\lmu*2:;=^	HIJabcdefӿvfjShh_B*	UphD)jhhKxB*	UmHnHphDuhhKxB*	phDjhhKxB*	UphDhKxhIh;p
h+php6h2C0J/h2Chhhp6h0J/hh`hp6h`0J/h:lhQh^`Xh\-hp6h:l0J/h:l&^	If"*^,
&FgdS
&FgdO
&Fgd4gd#Ggd0tgdB$gd_gd:l$gdKx

&F
gd

&F
gd2Cf"TUstu(ǿǻuh`(BhQ0J/H*h`(BhI0J/H*hp6hI0J/hp6hQ0J/hHhI0JjTh@FUhHjhHUhIhkUhch4h^h0th0thebj]ThUjh_UmHnHujh_UhEh_,(ehqs()*678@&234guļ~zvrvkgkhqhdhdhhFh3gha%hO0Jha%ha%0JjhUh@FUha%jha%Uhp6hO0J/h
hrhOh+DhI6	hD6	hfY6h+Dh"+6h+Dh+D6hDh"+hE\hp6h
9I0J/hp6hQ0J/h
9I'	!")+,?FYjuvz!#*,/0JT
-.56TUVl򹵹ꩢڇhh4h7c.hthnhnhT-ahTkhTkhTkhSh&1hrhfYhnh=hh,hp6hO0J/hw~}h+hZ{*hlhRhShCuhO
hd0J/hd3.UVl.]g.CDg{gdJ>
&Fgd+gd#GgdTk
&FgdTk!-Xw}]9Ee.쿷||nfjVhkUjhJ>UmHnHujhJ>Uh?hJ>mHnHsHh*hehJ>hbmhbm0J
h~.k0JjfVhsUjhbmUhbmh+h+0JjUh+Ujh+Uhp6h+0J/hh+hAhhqh	$('[\l)=Paygd1)gdUgdGZgdt$
&F^`gdkgdJ>gdJ>2HP;Clsz侱~hUhbh1)!h?hUB*CJmHphsHh?h ;mHsHh?hUmHsHhGZhtmHnHsHhthtmHnHsHh#vh[>h")hkhk0J/hkhth)hh/h+hJ>jhJ>U,()P'0vwK.78_ɽɵɨɖɒ}}pieahrh)h)h*h?h*mHnHsHh-h*mHnHsHhk8hwh]h*h*h*mHnHsHh*h*mHnHsH*h*h*h-hd.h5h*h?Fh
h1)h1)h1)mHnHsHh-h-mHnHsHh-h1)mHnHsH&>\{	3Zx%Ov>gd*gd*gd1)Z/vK.8L_p1gdr$gdDU$gdDUgd*1On&Mk3EO$k@\gd*gd)gd*gdr %1ENO$@"#$5PZ_
456边zvkzjWhsUhC1jhC1Uh_h7i?hh>h
hIh16h+h=(h=(hh_h=(h4	h(R6hNUhNU6h*h*h*h*mHnHsHh?h*h?h-h*h"#hY5hzSJh;ho$G("$'c./RfgdPgdxq
&Fgd+gd=(gd#GgdNUgd*689IJP]eu&'(;bckSe/}ؼyh]h]h?hyhPhxqmHnHsHh?hxqhxqhxqmHnHsHhxqhxqhhxqhch="	hMhe	h6{hzht{h~i^h16hp6h160J/hC1jhC1U
hC10JhC1hC10J*./?]},-Sv#<=bgdgd]gdxqgdP,-;< Pf{
μέzqqhp6he0J/h&m)h
]0J/h
]h
]h
]0J/heh=`h?}h>hp6h>0J/he	hxqh4jXhKUjh#UmHnHuh#jh#UhhxqhxqhxqhPhxqmHnHsHh]h]mHnHsH)bw "3@J`qugd/gdugdC4gd/
&Fgde

&F
gde	gd4gd"&.JX
"'-qw:;C"&?D_cgnżżŸָ֯뚑hp6hCo0J/hCohKThp6hA0J/hAh6qhp6h!0J/h!hp6h;*=0J/hOZhp6h=`0J/h=`hp6h>0J/h>h;*=h_h}hp6h
0J/h
hUheh?}h?}0J/1%13@Iu
 TX¾~w~~ss~hBwh?h/h/h/h/h/h/mHnHsHh?h-h?hC4h?huhuhuh-huhhC4hC4hC4h ;hUhp6hoU0J/hoUhp6hA40J/hA4h\hCoh`h`0J/h`* 1BTXJ"jBbgdC4gd/gd/IJ!"ijABab9:YZ<hM%h?hM%aJmHnHsHhyh^{aJmHnHsHh^{h^{aJmHnHsHh^{
h^{aJ
hC4aJhC4hC4aJhC4hC4aJmHnHsHhC4hC4mHnHsHh?hC4mHnHsHh?h-mHnHsH0:Zd<7WsgdM%gdM%gd^{gd5gdC4:rzR	S	'
B

(.9pHL$NYغحwwslhdh[h4h#Gh4h*h?hs-mHnHsHhs-hs-mHnHsHh?hs-mHnHsH*h?h$mHnHsHh?h$mHnHsH*h$h$h$h$mHnHsHh&1h$0J/h$hUh#hA4h&1h&hY2h|thM%h-%(:L]v2Edu+BgdM%B\s*:T				
9
X
t






gd$$gd$gdA4gdM%,EXw+<LM

(pHL$lgds-gd$gd$ly	R-d8X^}
&Fgd`gd`

&F
gdxgd[gd#Ggds-YZyz{=xy"&.QR]c&·ƮҪҢҞ~zhzhp6hx0J/hih/`PhFrOh[h4h ?hxhGVhM~hh{bh[0Jj-YhsUh{bjh{bUh9)zh[h<h[0Jh<h<0JjXhtUh<jh<U.&*-cd}	
78!diżŸŸzzzzrnh>jh>Uhp6h>p0J/h>php6hXb60J/hXb6hk=hShS0JjYhUjhSUh&hShp6h;0J/h;h?hymHnHsHh?h`mHnHsHh`h`mHnHsHhyh`hxh+)*Ne}8Xhx$gd
Kgdjgdj
&Fgd>p
&FgdXb6gdS
&Fgd;gd`
2ABC}mnrݸрyyyyuqumhohhfhW%h
Kh
Kh
Kh?h
KmHnHsHh-h-mHnHsHh-h
KmHnHsHh-ha|mHnHsHh-hmHnHsHhJ<h:}h,kh?hUh ;hjj9Zh>Ujh>UmHnHujh>U)$(:K\nr!A`|gd=.jgd@@gdW%>2^>`2gd
Kgd
K    .$/$7$?$R$[$s&t&&&&&&&&&&&&&'''~'''x((((((((((((((
))ȽȶȶȲh]hp6hsF0J/hyhp6h180J/h18hFNhFNh
Kh&Fh&FhFNhUhmRhaUhp&h3wh&1hhw,h
Kh=.jh-hDh@@<.GZy8Kcygdw,gd=.j!BVo    8 X x     !"!A!R!V!p!!!!!gdgdw,!!!"&"F"Y"]"x""""""# #5#V#j#n######$$/$@$gdgdw,@$R$\$t$$$$$%#%<%O%n%%%%%%%&&&7&N&c&t&&&''gdFNgdgdw,''2'E'^'o'~'''''( (9(=(](x((((
))/)O)n)r))))gd18gd18gdFN)z){)))))**	*
**&*~**********+++,,>,T,h,q,,,,,,,H-L----------.
...hnhn0JjZhtUhnjhnUh#]h$hhtHMh^hj1uhnhn6hnh&1h55hp6h980J/h
h
Kh~Jh~Jh98hfh-h]h184)))))**'*?*^*~******++*+:+`+x+++++++gd98$gdgd18+,,H-Y-..F111112"252L2M2l22223454
gdB%Z

&F
gd1gd&

&F
gd$gd^gdR{gd98........./// //00h0t0000000000*1;1D1F1P1X1_1b11112@3m3o3r333333333ڴⰬh	Thp6hT0J/hp6hR8h0J/hp6h0J/hp6h**T0J/hR8hhcVh&hXhp6hX0J/hp6h0J/hrIh&1hh'bhh^h$jhnUhnhn0Jhnh$0J23334G4H4P4[4n4o444444444445L5M555566465666666	7R7[7\7]7f77žŰxttpgphp6h%0J/h%hIhp6hhL0J/h_hhLhp6h:00J/hp6hI0J/h:0hR8hhp6hm0J/hmhqThmhqThhqThB%ZhqThO@0h?h/H.h?hO@0h?hqThqTmHnHsHhO@0hO@0mHnHsHh&hO@0(54N4b4v4~444444M5666778+8888888
9gdgd9Vgd9V^gdigd&

&F
gd1
gdB%Z77777777777888888+848B8w888888889
99)92939Z9::2;5;<;C;w;};;ǿٸ~zzqhp6h0J/hOph?hmHnHsHh?h-h?hhhh-hhj'hOh`h9Vh^h$jN[hd#hUjh(UmHnHuh(jh(Uh$h&h1hhLhp6h3
0J/h&1h3
+
999)939G9Z9k99999999::;;;;</<P<l<<<<<gd9Vgd;;;;>>>>??????0?9????M@S@(A0A>AQAZAAA\BtB}BBBBBBBBBBBBBBBBCCCCD$D:D<DDDED[D\D]DaDbDDDDDDD»»»»ʻ»»»ʻ»𰩰h1h1h1hI:h3hI:hI:hI:hbh3hhrhrhOphrhrh=>h&1h$?hOph-hh[B<<	==1=D=c=t=======>(>?>R>q>>>>>??0?:?M?gdOp$gdOpgdM?`?y????(A?AQA[AtAAAAAAA
B!B?BXB\B}BBBBBBgdI:gd3gdOpgdOpBCCC8CQCcCrCCCCCCD$DEDbDDDDDEEEEEEFgd1gdOpgdI:gd3DEEEEEEETFUFyF{FFFFFFF?G@GIGJGtGuGvGGGGGGGGGGGGH9H:H;HMHVHHHHξʅy*hhh7hhh7h=6h=hh&1hp6h0J/h\yh0Jj[h[@Uh\yjh\yUhh9khWh$?hYYh?hvmHnHsHh?h1mHnHsHh-hOph%h}th1,FTFUFFFFFFFF
G@GG;HMHWHHHI"IJ+KKL

&F
gdgd=(gdR{gd7gd7gd$?gd$?gdYYgd1HIII!I"IbIfIkIIIIIIIIIIIIIJ'J/J1JDJbJcJJJJJJJJJJJJJJJJJJǿۙۑz
h>0J
h0Jj]hkUjhY>UhY>hh0J
hO0Jjq\hkUjhUhh'%hNF~hNYh\hh'dh:*h^h=(h4h+hhzeh76hzehU6,JJJK!K"K)K+K_KdKKKK?LL)MSMXMMMMMMMMMNNNOPOOOOOOOPPP5P6PMPNPQPPPPP+Q-QQRRJRKRLRǶDzǫǫǫǫǧǧhp6hK0J/hKhnhlIhlIhlIhrhrhfh?hrmHnHsHh-hrh-ThXh<hNYh2Rhh#5hh^jhY>UhY>h^0J8LLLMMMMMMMNN*N;NONbNsNwNNNNNNNNOOgdrgdgd

&F
gdO#O1O@OPOOOPPNPPPP,Q-QLRdRvRRRRRRRRRSSgdn$gdgdrLRTRcRvRRRRSSSSSSSST]T^TmTtTTTTTTDURUeUnUUUUUV
VV+V4VVVVV|WWWWWWWWW-X;X<XNXWXXXXXX
YQY췰쬨hMhhX$h^hFhKhFhF*h~hKh~hQ 
hKhKhFhhyhlIh)h)hKhEdh-h
5mhn>S0SDSWSiS~SSSSSSSSTT^TuTTTTTTTT;U<USUeUoUgdKgdngdnoUUUUUUVVV+V5VHVaVzVVVVWWWWWX X$X%X<XNX$gd
gdKgdKNXXXqXXXXX`YyY<ZYZiZZZZZZZ[[[+[<[N[R[gd!gd!gd!gd$gdCgdLgdR{gd*DgdKQYXY_Y`YiYyYYYZZZ:Z;Z<Z=ZTZUZVZWZXZYZhZiZZZZ}[[[[[[\\y]]]]ŷ֫֫xkc_hcV*h;uhhhmHnHsHh?hmHnHsHh-hh@3h!h!mHnHsHh?h!mHnHsHh!j]h$Ujh$UmHnHujh$Uhp6h$0J/h$hp6hdZC0J/hdZChh(|+hLhMhp6hM0J/%R[m[[[[\L\\\!]h]]]]^____``)`=`N`h`l`gd/:^gd&Dgd&DgdgdCgdgd!gd!]]^^i^^^^_
_____________```=`h`l`````"a+aAaBaVaaaʸƣƁ}vrnjh#hnhh&Dhh-hh/:^h?h/:^mHnHsHh-h-mHnHsHh-h/:^mHnHsHj^h&DUjh&DUmHnHuh&Djh&DUh''hp6h'0J/h'hp6h#0J/h#hh!hhW&l`|```````
a"a,aBaVabPccefg ibicixiJjgd
`gd
`gdgdngd"gd|gdgdngdR{gd/:^abbbcc#c$cPcrcccccccccccccddddddddd d!d%d&d)d*dKdLdOdPdfdpdddddddddddddddee!e"e&e'e.e/eeeeeeeeeeeef$fhp6h4S0J/h4Sh&1hWxhth|h$h}SEh=hhWhnh#h#M$f8f\f`fdfmfffffffffgg%g)g3g8g9g=gTghgrgg	hhhYhhhhiii i.i2iaibicixiiƿưƧưƧƜưƏ|xh*h
`hhphnh:*hG0Rhp6hRV40J/hh0Bh"hp6h"0J/hRV4hDhDh|hDh"h"h#hSh`vhShp6hC0J/hChp6hw0J/hp6h4S0J/hwh4S+iij&j:jHjIjJjkkkkkkkllllbljllllllllUmZmemmmmmmmmmmn#n$nQnRnnnvh-h'mHnHsHh'h'h`lh`lhAzxh`l5^JhAzxh`lhlCh`lh6Php6h6P0J/hhHhp6hH0J/j^h`lUjhFUmHnHuhFjhFUh
`h`h*hp6h*0J/.Jj}jjjjjjkk+k>kVkbkzk{kkkllUmmmm($Ifgd"il
&FgdHgd*gd*
gd*gd
`mmmmjWD)$Ifgd"il*$Ifgd"ilkd;_$$Ifl0%	@@
t0 644
lahpmmmnq^)$Ifgd"il*$Ifgd"ilzkd
`$$Ifl0%
t0 644
lahnn$nRntnnnnnnoo"ozuupuuuuuugd'gd'gd'gd'zkd`$$Ifl0%
t0 644
lahnnnop	q
qq^qgq=rss.t/tttiuuuuuu&v0vBvXvdvxvyvzvvvv|wwwwwwxշշՙՕwwjjfhh-hmHnHsHh-hKmHnHsHhah=Zhp6hK0J/hK*h'h'*h'h'mHnHsHjhKUh'h'mHnHsHh-hp6h#^0J/h#^h'h?h'mHnHsHh-h'mHnHsHh-h-mHnHsH("o4oMoQokoooooop0pNphppppqLq^qhqqq=rrrsYssgd'gd'ss.tvttuLuuuzvvvvvvvv*wwwwwww
xx(xgdgdKgdKgd'gd'(x?x]x{xxxxxxxyy3y7yQyhyyyyyyz:zTzpzzzzzgd"igdgdxxxxzzzzz{T}e}f}g}p}8CDž$YZۆ܆ 01yuh3hp6h30J/h}phDhh~bh~b0JjGahDUjh~bUh~bh
`hhhhhmHnHsHhhmHnHsH*hhhh[*h[h"ih"ih-hhK-zzz{{{8{O{m{{{{{|!|;|W|y|||||},}T}g}q}}}gdgd[gd"i}}}}}~ ~:~V~{~~~~~.Kj$>Z{gdgda6}ĂR'nC$܆؈(gdDgdgd
`gd
`gdgd17>@JKuvwˆֈr[s]gnҌیBIǍ25>?CVbtнЩХКh&1h>Xhp6h}p0J/h}phphph;chSh?hDhDhDmHnHsHhDmHnHsHhp6hD0J/hDh3Fh3F0JjahUjh3FUh3Fhh3h!2(6MNq͉ى7HZgsɊ؊	4FXgdDXgvԋE]pKȑ)9pgdgd"gd"gd2*gdaugd}pgdpgdD	
@gdDgdDBPIdopqJR|)89op~U^ؕGHזؖ|xtpxt|thh.uh3
h-h?hh?h-mHnHsHh?hX
mHnHsHh?hmHnHsHhh6Qh"hPvvh2*h@phpjgbh6QUjh
UmHnHuh
jh
Uhhauhp6hau0J/hau,˓ݓ3CDU_qєߔVrؕHؖgd3
>2^>`2gdgdؖ<̗`&7I\nřՙ 1>2^>`2gdgdtA$gdM$gdMgdgd.uęř 12EFbcÜĜt2=Vs'(,-8áġ𫧣jhUhhnghng0J/hnghzh
`h_\hj1uh"h*hhhhmHnHsHh?hmHnHsHhtAhhMh?htAmHnHsHh-hhX
h.uh3
/12CM_q͚Fcɛ*C^wĜ>2^>`2gdgdtAĜ6,tP(8HeuΣ*gd2Y$gd2Y$gd2Ygd2Ygdnggd2Ygd
`gdgdТע9?HI`abcdẹΣ89JK]^pq̥ͥߥƸ۬۟ۑhUmHnHsHh?hUh?h2Yh2Yh2Yh2Yh2YmHnHsHh4'j|chUjhzUmHnHujhzUhp6hz0J/hzh2Yhnghh0JjhUjbhKU2*<W[Ҥ9K^qͥ+=>2^>`2gdUgd2Y*+=fglmqv٨nөo­íĭʮ*/5=b)ûߴ߰ߣߴ߻߻߈߀|h"Fh\hjq`h
qh
qh`*hjq`h`huh)hN|hp6hyY0J/hyYh`h`*h`h`h?h`mHnHsH
hI0J/hp6h`0J/h`h2Yh4'h4'h4'h4'hUh4'h2Y.=1<ҧܧ'<Q_٨0MQn>2^>`2gd`$>2^>`2gd`$gd`gd`gd`gd2Y˩;Sjêڪ3Jk4Vwgd`>2^>`2gd`wʬ4|ĮT,`0GQUhygdKgd"Fgd"Fgd\gd`gd`)*LMN]^/0QTBCҵj{}~η{wh/h	hKhK0J/h>Zh>Z0J/h((Eh>Zhh6hh[h?hKh?hKmHnHsHhJyuhKhY>h"F0J
h"F0Jjdh"FUh"Fh"F0JjdhKUh"Fjh"FU-y˳ϳCDZoyŴ-BL_i>2^>`2gdKgdKiwѵյֵ(:R`n
C
&Fgd/$gdgd/gd/gdK>2^>`2gd[gd[gdK۸ܸݸ3AWú˺κҺػٻڻۻܻ-{wsksjhgUhgh2)jeh/Ujh<JUmHnHuh<Jjh<JUh$h$hVJh$0J/hVJh$h$hhDXh5hR/hR/0J/h
I0h<h/hR/h/0Jjehq_UhR/jhR/Uh/hO'-./;<=R]gm}~Ͼھܾ-Կտ+,9?Rab{ƾۺ߮ߝh
hF(hhphphphp0J/hphdhd0J/hdh.hwhw5hwhHhH5hHh
I0h <hwhw0J/h2)hghghg0JjhgUj#fhU2Ѽ5Ngzƽٽ2G\k;gdwgdHgd/;ܾBLտ',Rb]m&/ gdDXgdDX gdF(gdF( gdpgdpgdpgdd gddgdggdw=EGHPQXx!<@H[\]Ycdlmrz%6Eū֫ŢڙڕڑhqSh2hqShqS0J/hDXhDX0J/h& h& 0J/h+ShDhD0J/hDhDXhhX#hX#0J/h& hX#h7
h70J/h7h7hF(hF(0J/h
hF(9/gphqhqzt-87HgdgduMgd^gd gd R gd+S gd<[ gd5gd+Sgd<[gd5gdDX gdDXEGOfgh{~	&7FGHPghpqzst

 #-2<uz罹繧繞h RhDXh+S0J/h+Sh+S0J/
h+S0J/h& h+S0J/h<[h<[h5h5hVih+Sh<[hDXhDXhh50J/hh20J/h2h20J/h5hDXh&h2hqShqS0J/hqS2,-78Y[^cmor|	7HRXYſſſſſ价h#+hd0J/hdhd0JjfhpUjhdUhdhhuMh^h^h^h/
hzz0J/hh R0J/
h R0J/h2h R0J/h<[h<[h RhDXh<[h+Sh+ShX#h+S0J/2!,GIUV"'-./124578:;UXùâuqfhhPCJ0aJ0hPjhPUmHnHuhpjhpUhhhhh&1hxh[@huMmHsHhuMmHsHhuMmHnHsHh[@huMmHnHsHhhuMhhh rh r0J/h rh#+hm0J/h*hmh%'-.0134679:Z[jk%
9r 'gd	@
$
*Q'V^Vgdgd>3RgdgdR{gdS gduM

gduMgdXY[]^_efghiklu
"#µwodZhPmHnHsH	hP5mHnHsH	hFhP5hFhP6mHnHsH	h8hPmHnHsH	h8hPhFhPh|GhPhFhP5mHnHsH	h|GhPmHnHsH	hph`0J'mHnHu
hP0J'jhP0J'UjhPUmHnHuhPhhPCJEHaJ#kl

"#9Vwx	
BgdF	
B&gdF	
BgdFgdJ>gd|G#'89ENVcwx}~"2349MͿؿرأ~p~pbbZhhP5hhP5mHnHsH	h-
hP5mHnHsH	h-
hPmHnHsH	hrXhPmHnHsH	hP5mHnHsH	hFhP5mHnHsH	hPmHnHsH	hPhFhP6mHnHsH	hP6mHnHsH	hFhPmHnHsH	hC1hP5mHnHsH	hC1hPmHnHsH	 xgkdg$$Iflb
t0644
la$
B&<<$Ifa$gdi7^l345M{ytyjjyegd	
Bgdgd#gdYY77]7^7gdrX	
B&gdFgkdmg$$Iflb
t0644
laMOw"$7IJKLMN[`bst޽⡽⓽ވ{m{{eeh"JhP5h]hP5mHnHsH	h]hPmHnHsH	hP5mHnHsH	hFhP6mHnHsH	h
9IhP6mHnHsH	hFhP5mHnHsH	h|GhPmHnHsH		hP5hhP5h|GhPhPhPmHnHsH	hhPmHnHsH	hshP'M7Kxgkdg$$Ifl
t0644
la$Ifgdlgd#gd
KLM[\]^_`st$Ifgd]l%0
B&<gd"J	
Bgd#gd#gkdWh$$Ifl}
t0644
la$Ifgd]lgkd	h$$Ifl}
t0644
lazxsssssiii	$<a$gdKgd]	
Bgd]gkdh$$Ifl}
t0644
la$Ifgd]l1234Qlb[<gd"J	
B&gd"Jgkdh$$Ifl}
t0644
la$Ifgd"Jl%0
B&<gd"J	$<a$gdK
4;PQ|}~"4׻׻yl_h|GhPmHnHsH	hjdhPmHnHsH	hhP5h|GhPh-
hP5mHnHsH	h-
hPmHnHsH	hzUhPmHnHsH	hP6mHnHsH	h_1PhP6mHnHsH	hM94hP6mHnHsH	hPmHnHsH	hThP5mHnHsH	h"JhPmHnHsH	hPQcdvq$Ifgd"JlgkdAi$$Ifl
t0644
la$Ifgd"Jl%0vw{|gkdi$$Ifl
t0644
la$Ifgd"Jlgkdi$$Ifl
t0644
la|}~49VWngkd+j$$Ifl
t0644
la$Ifgdlgd`gd>gdzUgd"JW[\gkdyj$$Ifl
t0644
la$Ifgdl	
Bgd>gd>gkdj$$Ifl
t0644
la()/=CLuvw{
Ͳ׮׮͖͈}pbTT}h.@uhP6mHnHsH	hQhP5mHnHsH	hQhPmHnHsH	hP6mHnHsH	h/4hP6mHnHsH	hAVhPmHnHsH	hP5mHnHsH	hPhFhP6mHnHsH	h8hPmHnHsH	hPmHnHsH	h|GhPmHnHsH	hhPmHnHsH	hFhP5mHnHsH	()?vw
'TUr$Ifgd"Jl%0<gd>gd>
&7STUY\qr/EGRfg珞tftt^WhX6hPhhP5h]hP5mHnHsH	h]hPmHnHsH	h"JhP5h+hP5mHnHsH	hw:hPmHnHsH	h1)hPmHnHsH	h"JhPmHnHsH	h|AWhP6mHnHsH	hThP5mHnHsH	hP5mHnHsH	hPmHnHsH	hPh/4hPmHnHsH	"gkdck$$Ifl
t0644
la$Ifgd"Jlgkdk$$Ifl
t0644
la	}s}gT$Ifgd"Jl%0
B&<gd>	
Bgd>gd>gkdk$$Ifl
t0644
la$Ifgd"Jl	
#$gkdMl$$Ifl}
t0644
la$Ifgd"Jlgkdk$$Ifl}
t0644
la$()*+EFGguzxssxgT$Ifgd]l%0
B&<gd>gd>	
B&gd>gkdl$$Ifl}
t0644
la$Ifgd"Jl	uvgkd7m$$Ifl}
t0644
la$Ifgd]lgkdl$$Ifl}
t0644
lazxsssxiix	
Bgd>gd>	
Bgd>gkdm$$Ifl}
t0644
la$Ifgd]l!IJKObcevevWvWvh^hP6mHnHsH	 hG:hPCJaJmHnHsH	h:1hPmHnHsH	hUhPmHnHsH	hP5mHnHsH	hQhP5mHnHsH	hQhPmHnHsH	hP6mHnHsH	h/4hP6mHnHsH	hhP5mHnHsH	hX6hP5mHnHsH	hPmHnHsH	hX6hPhPJKcp;Ky$Ifgd"Jl%0
B<gdab	
B&gd>mgd#	
Bgdabgd(Xx 01[\csyջ՘~sesWhhP5mHnHsH	hX6hP5mHnHsH	hP5mHnHsH	h>mhPmHnHsH	hA
hPmHnHsH	hN5hP5hRShPmHnHsH	h>mhP5mHnHsH	h(hPmHnHsH	h"JhPmHnHsH	hPh?x~hP6mHnHsH	hPmHnHsH	hThP5mHnHsH	"gkd!n$$Ifl
.
t0.644
la$Ifgd"Jlgkdm$$Ifl
.
t0.644
la01:K\]t}s}nnn}d	
BfgdN5gdRS	
Bgd>mgd(gkdon$$Ifl
.
t0.644
la$Ifgd"Jltxy1$Ifgdlgd(	
B&gd>m$
Ba$gd>m	
Bgd(gdA
	
BJ
gd>3R(-.@CDEFGTY[lmtuᱣqfYh1)hPmHnHsH	hP5mHnHsH	hFhP6mHnHsH	h8hPmHnHsH	hPmHnHsH	hhPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hjhPmHnHsH	h(hPhhP5h|GhPhPh-
hP5mHnHsH	h-
hPmHnHsH	"1267gkdo$$Ifl}a
t0a644
la$Ifgdlgkdn$$Ifl}a
t0a644
la7ghq$Ifgd(lgkdYo$$Ifl}a
t0a644
la$Ifgdlgkdo$$Ifl}a
t0a644
la$Ifgd(lgkdo$$Ifl}a
t0a644
la.DEFTU}s}ngd>m	
B&gd>mgd(gkdCp$$Ifl}a
t0a644
la$Ifgd(lUVWXYlmigkdp$$Ifl	
t0	644
la$Ifgd"l%0	
BJ
gd'p4	
B+gdabgd(u	
()+<=NOPQؽ횀yynaShZshP5mHnHsH	h>hPmHnHsH	h5DhPmHsHhK+hPh5DhPmHnHsH	h'p4hPmHnHsH	hPmHnHsH	hP6mHnHsH	hhP6mHnHsH	hhPmHnHsH	hhP5mHnHsH	hhPmHnHsH	hN5hP5hPh+hP5mHnHsH	gkdp$$Ifl	
t0	644
la$Ifgd"l

	
BJ
gd'p4^gkd-q$$Ifl	
t0	644
la
);PQRdersgd^gd>$a$gdU^	
Bgd5D	
BJ
gd5D6@ABMPvz!"4ABCNY[q~׿hP6mHnHsH	h-
hPmHnHsH	hZshP5heDhPmHnHsH	hhPmHnHsH	hP5mHnHsH	hZshP5mHnHsH	hPmHnHsH	hPh^hPmHnHsH	4MNOP4BC[\~$a$gdgdXP	
BgdCN	
Bgd	
BgdeD^gd^*45]fghinoxyzּ툮ּּ{tjtjtjtjhoyhP5^J
hP5^JhGhPmHnHsH	hP5mHnHsH	hFhP6mHnHsH	hXPhPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH		hP6hXPhP6hPmHnHsH	hhPmHnHsH	hPh-
hP5mHnHsH	'56789:;<=>?GHPQVgdG	
BgdXPgdXPVW\]ghxy
%&$a$gdm.gdoy^	
BgdGgdG
$%/>STqrs!P[`asvﰢyl_h8hPmHnHsH	h+hPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hDhP5mHnHsH	h7hP6mHnHsH	hDhPmHnHsH	h7hPmHnHsH	h-
hP5mHnHsH	h-
hPmHnHsH	hPmHnHsH	hPhm.hPmHnHsH	%&./STrs$Ifgd+l%0gd+$a$gdq|gdT	
BgdMkgkdq$$Ifl&|
t0|644
la$Ifgd+lgkd{q$$Ifl&|
t0|644
la!Lawxy}}s	
BgdTgdTgkdr$$Ifl&|
t0|644
la$Ifgd+l
vwxyz
%'(཰ࣕ཈ս{n``nhC1hP5mHnHsH	hC1hPmHnHsH	hrXhPmHnHsH	hFhPmHnHsH	h-
hP5mHnHsH	h-
hPmHnHsH	h?_hPmHnHsH	hPmHnHsH	hFhP5mHnHsH	hP5mHnHsH	hPh|GhPmHnHsH	hFhP6mHnHsH	%$
B&<<$Ifa$gdi7^l
B&xgd:\gd:\$a$gd?_gdTx$
B&<<$Ifa$gdi7^lgkder$$Iflb
t0644
lax$
B&<<$Ifa$gdi7^lgkdr$$Iflb
t0644
la
(9[\bgh||||||gd:\	
Bgd:\	
B&gd:\gkds$$Iflb
t0644
la(,4789=GJZ[\ghq
#οܿ銲βzo鲿boh]`6hPmHnHsH	hP5mHnHsH	h)	
hP56mHnHsH	h8hPmHnHsH	hKxhPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hPhP6mHnHsH	hFhP6mHnHsH	h=ShPmHnHsH	hPmHnHsH	hFhPmHnHsH	&&>$
B&<<$Ifa$gdi7^l
B&xgd:\	
Bgd:\gd:\#%&>?WX\]^aefwMNOVcqr2CDGؽܯܢܕ؊}}؊}}ؽܯܢohc#hP6mHnHsH	h|DhPmHnHsH	hP6mHnHsH	h
hPmHnHsH	hAhPmHnHsH	h|DhP5mHnHsH	h
hP6mHnHsH	hrXhPmHnHsH	hPhPmHnHsH	hP5mHnHsH	hFhP5mHnHsH	)>?Wx$
B&<<$Ifa$gdi7^lgkdOs$$Iflb
t0644
laWX\x$
B&<<$Ifa$gdi7^lgkds$$Iflb
t0644
la\]^_`awxssssssgd:\	
B
gd:\^gd:\	
B&gd:\gkds$$Iflb
t0644
la
-.Gxe$Ifgd|Dlgkd9t$$Ifl/
t0644
la$Ifgd|Dl%0
B
xgd:\GHLMgkdt$$Ifl/
t0644
la$Ifgd|Dlgkdt$$Ifl/
t0644
laMNOrlY$Ifgd|Dlgkd#u$$Ifl/
t0644
la$Ifgd|Dl%0
B
xgd:\	
B
gd:\gkdu$$Ifl/
t0644
la$Ifgd|Dlgkdqu$$Ifl/
t0644
la$CDEFGgd:\$a$gd:\^gd:\gd:\	
B
gd:\GK!"*-<UVZ]depquµ鵧ԏԁssµ鵧hjhP5mHnHsH	hjhP6mHnHsH	hrXhPmHnHsH	hP5mHnHsH	hFhP5mHnHsH	hFhPmHnHsH	hP6mHnHsH	h:\hPhP h:\hPCJ(aJ(mHnHsH	hPmHnHsH	h:\hPmHnHsH	-lgkd
v$$Ifl/
t0644
la$
B&<<$Ifa$gdi7^l
BJ
PgdC"#<{{{{{	
BJ
gdp6^	
B&gd_gkd[v$$Ifl/
t0644
la<UVZxgkdv$$Ifl/
t0644
la$
B&<<$Ifa$gd
FlZ[\]d$
B&<<$Ifa$gdi7^l
BJ
PgdC^gkdv$$Ifl/
t0644
lau}$569@ALMQY[\himnoptuܲܥܗ܉|naaܲhFhPmHnHsH	h'&hP6mHnHsH	h
hPmHnHsH	hc#hP6mHnHsH	h$hP6mHnHsH	hAhPmHnHsH	h|DhP5mHnHsH	hP6mHnHsH	hrXhPmHnHsH	hPhPmHnHsH	hFhP5mHnHsH	hP5mHnHsH	&x$
B&<<$Ifa$gdi7^lgkdEw$$Ifl/
t0644
la56789||||||s^gd_gd_	
B
gd_	
B&gd_gkdw$$Ifl/
t0644
la
9\himlgkdw$$Ifl/
t0644
la$
B&<<$Ifa$gdi7^l
BJ
Pgd'&mnop||||||s^gd_gd_	
B
gd_	
B&gd_gkd/x$$Ifl/
t0644
la
	!#$<=ABCDKLWX\dfgstxyz{ʿ鲤ʌ~鲤ʌ~鲤ʌh'&hP6mHnHsH	hrXhPmHnHsH	hP5mHnHsH	hFhP5mHnHsH	hFhPmHnHsH	hP6mHnHsH	hPh
hPmHnHsH	h$hP6mHnHsH	hPmHnHsH	hAhPmHnHsH	1$<=Algkd}x$$Iflb
t0644
la$
B&<<$Ifa$gdi7^l
B&Pgd]`6ABCDgs`$
B&<<$Ifa$gdi7^l
BJ
Pgd'&	
B&gd_gkdx$$Iflb
t0644
lastxx$
B&<<$Ifa$gdi7^lgkdy$$Ifl/
t0644
laxyz{`$
B&<<$Ifa$gdi7^l
B&Pgd]`6	
B&gd_gkdgy$$Ifl/
t0644
lax$
B&<<$Ifa$gdi7^lgkdy$$Iflb
t0644
la'Pwrrrrgd_	
Bgd"hT	
Bgd_	
B&gd_gkdz$$Iflb
t0644
la
'PQVWdgiz{õͪ~qa~ÌTTh:\hPmHnHsH	h)	
hP56mHnHsH	hKxhPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	h=ShPmHnHsH	hPhP6mHnHsH	hFhP6mHnHsH	hPmHnHsH	hFhPmHnHsH	hP5mHnHsH	hC1hP5mHnHsH	hC1hPmHnHsH	 PQdefgz{+D$
B&<<$Ifa$gd
Fl	
BJ
gdp6$a$gd"hT
B3gdlBPgda;gd_	
Bgd_gd"hT+DEITcxy#ﱣﱣreWhFhP5mHnHsH	h|GhPmHnHsH	h$hP5mHnHsH	h-hP6mHnHsH	h$hPmHnHsH	h}hP6h-
hP5mHnHsH	h-
hPmHnHsH	hP6mHnHsH	hjhP5mHnHsH	hPmHnHsH	hjhP6mHnHsH	hPhlBhPmHnHsH	DEIx$
B&<<$Ifa$gd
FlgkdQz$$Ifl/
t0644
laIJKLMNOPQRSTxygd}gd$^gkdz$$Ifl/
t0644
la#L_$xa$gd&D	
Bgd$gd$gdF#3BLP[^m!".ACǹѬިިǂugZLZh7hP6mHnHsH	hDhPmHnHsH	h-
hP5mHnHsH	h-
hPmHnHsH	h7hPmHnHsH	hFhP5mHnHsH	hP5mHnHsH	hPh$hPmHnHsH	h$hP6mHnHsH	hPmHnHsH	h8hPmHnHsH	h|GhPmHnHsH	h8hPhFhPh|GhP!"UZstx}j$Ifgd&Dlgkdz$$Ifl&|
t0|644
la$Ifgd&Dl%0gd&DCUZyz{
 %):;@IK_ŸӮӮzӮm_mQmh/hP5mHnHsH	hhP6mHnHsH	hkhPmHnHsH	hP5mHnHsH	hFhP6mHnHsH	h8hPmHnHsH	h}hP6mHnHsH	hPmHnHsH	h+hPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hPhDhPmHnHsH	hDhP5mHnHsH	xyz{ !"#$	
Bgd&Dgd&Dgkd;{$$Ifl&|
t0|644
la$%&':;_s`$Ifgdlgkd{$$Ifl}
t0644
la$Ifgdl	
B&gdkgd&D	
.CV||||||||gdF	
B&gdF	
B&gdkgkd{$$Ifl}
t0644
la.56ABUVZ]^gvȻ绠̋ȋ}rj_Rh-
hPmHnHsH	hKhPCJaJhPCJaJhP5mHnHsH	h8hPhFhPh|GhPhFhP6mHnHsH	h8hPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hPhFhPmHnHsH	h/hP6mHnHsH	hPmHnHsH	h/hP5mHnHsH	 $IfgdN|l%0gd
y5$^a$gdK	
BgdFgdF 29DEFYZ^Ϳ}pbUHh=FhPmHnHsH	hFhPmHnHsH	hFhP6mHnHsH	h8hPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hhP5h-
hP5mHnHsH	hPhDhPmHnHsH	hDhP5mHnHsH	h-
hPmHnHsH	h
y5hP6mHnHsH	he hP6mHnHsH	hPmHnHsH		
gkds|$$Ifl&|
t0|644
la$IfgdN|lgkd%|$$Ifl&|
t0|644
la2GZ$IfgdN|l%0<gds{	
Bgd
gd=Fgd
!)*DEqr%Ͼ˾Ͼ˾ˣχyl^h:>hP5mHnHsH	h:>hPmHnHsH	h+hP5mHnHsH	hithP6mHnHsH	h/hP6mHnHsH	h1)hPmHnHsH	huhP5mHnHsH	huhPmHnHsH	hPhPmHnHsH	h|GhPmHnHsH	hFhP5mHnHsH	hP5mHnHsH	!gkd}$$Ifl}
t0644
la$IfgdN|lgkd|$$Ifl}
t0644
la !Eklpq^$IfgdN|lgkd]}$$Ifl}
t0644
la$IfgdN|l%0<gds{gd/:gdupqrszg$Ifgd=Fl%0<gdq|	
Bgd
gd/:gdugkd}$$Ifl}
t0644
lagkdG~$$Ifl}
t0644
la$Ifgd=Flgkd}$$Ifl}
t0644
la$%=d239Okl^gdng	
Bgdng	
BJ
gdng	
Bgd
gd7Fgd
$a$gdng	
B&gd
%)=^bdfkn123NOQYk۳۳۔yllehK+hPh5DhPmHnHsH	huhP5mHnHsH	huhPmHnHsH	hv;hP5mHnHsH	h PhPmHnHsH	hPhhPmHnHsH	h7FhP6mHnHsH	h7FhPmHnHsH	hPmHnHsH	h.hP5mHnHsH	h.hPmHnHsH	#klmq
CDEopqu}ɻ񦃦vi\QhP5mHnHsH	hQhPmHnHsH	hRShPmHnHsH	hA
hPmHnHsH	hnghP6mHnHsH	hN5hP5h'p4hPmHnHsH	hPmHnHsH	hP6mHnHsH	hhP6mHnHsH	hhPmHnHsH	hhP5mHnHsH	hhPmHnHsH	hPh5DhPmHsHlm$Ifgd"l%0^gdng	
BJ
gdnggkd~$$Ifl	
t0	644
la$Ifgd"lgkd~$$Ifl	
t0	644
la1CD{yoey````gdng	
BJ
gdng	
Bfgdng^gdnggkd1$$Ifl	
t0	644
la$Ifgd"lDEN_pq$Ifgd"Jl%0
B<gdng	
Bgdnggdng}~!"#)./08=BEF̿~p~ccUUh+hP5mHnHsH	h1)hPmHnHsH	hThP5mHnHsH	h"JhPmHnHsH	hPhPmHnHsH	hP6mHnHsH	h^hP6mHnHsH	hzhPmHnHsH	h:1hPmHnHsH	hhPmHnHsH	hUhPmHnHsH	hP5mHnHsH	hQhP5mHnHsH	  !gkd$$Ifl
.
t0.644
la$Ifgd"Jlgkd$$Ifl
.
t0.644
la!"#EF{s`$IfgdN|lgkd$$Ifl&|
t0|644
la$IfgdN|l%0	
B+gdnggdng	FOS[ghi{󿲮}pbUHh=FhPmHnHsH	hFhPmHnHsH	hFhP6mHnHsH	h8hPmHnHsH	hFhP5mHnHsH	h|GhPmHnHsH	hhP5h-
hP5mHnHsH	hPhDhPmHnHsH	hDhP5mHnHsH	h
y5hP6mHnHsH	he hP6mHnHsH	hPmHnHsH	h-
hPmHnHsH	'()	
Bgdnggdnggkdi$$Ifl&|
t0|644
la',.?@Ideo}?FKQRqrs%&Ͻ˰Ϣϕχynynaχaχah	hPmHnHsH	hP6mHnHsH	h	hP6mHnHsH	h	hP5mHnHsH	hKehPmHnHsH	hKehP5mHnHsH	hnghPmHnHsH	hnghP5mHnHsH	hPhPmHnHsH	h|GhPmHnHsH	hFhP5mHnHsH	hP5mHnHsH	&)*+,?@de
gdnggdng
BJ
<gd	^	
BygdKe	
BgdKegdsr0RrslY$Ifgd	lgkd$$Ifl

t0
644
la$Ifgd	l%0
BJ
<gd		
BJ
gd		gkdS$$Ifl

t0
644
la$Ifgd	lgkd$$Ifl

t0
644
lalY$Ifgd	lgkd$$Ifl

t0
644
la$Ifgd	l%0
BJ
<gd		
BJ
gd	 $%gkd=$$Ifl

t0
644
la$Ifgd	lgkd$$Ifl

t0
644
la%&'>Zp$Ifgd	l%0
Bf<gdKM}^
BJ
<gd		
BJ
gd	&'+>
&V]bhi
-defgzhKehPmHnHsH	hKehP5mHnHsH	hP5mHnHsH	h	hPmHnHsH	hP6mHnHsH	h	hP6mHnHsH	h	hP5mHnHsH	hPmHnHsH	hP8gkdق$$Ifl
t0644
la$Ifgd	lgkd$$Ifl
t0644
la
&1Gizxlzzzzxc^gdKM}
Bf<gdKM}	
BJ
gdKM}gkd'$$Ifl
t0644
la$Ifgd	lbO$Ifgd	lgkdu$$Ifl
t0644
la$Ifgd	l%0
Bf<gdKM}	
BygdKM}	
BgdKM}		
gkd$$Ifl
t0644
la$Ifgd	lgkdÃ$$Ifl
t0644
la
-EF^lY$Ifgd	lgkd_$$Ifl

t0
644
la$Ifgd	l%0
BJ
<gdKM}	
BJ
gdKM}^_cdgkd$$Ifl

t0
644
la$Ifgd	lgkd$$Ifl

t0
644
ladefz	28EZ`algd_-	
BfgdKM}^gdKM}
BJ
<gdKM}	
BJ
gdKM}2_`almrwxy}.LQó}pbUh-
hPmHnHsH	hzchP5mHnHsH	hzchPmHnHsH	h1hPmHnHsH	h1hP5mHnHsH	hKehPmHnHsH	hKehP5mHnHsH	hPOJQJ^JmHnHsH	$h_-hPOJQJ^JmHnHsH	hPhKM}hPmHnHsH	hPmHnHsH	hKM}hP5mHnHsH	lmxy$Ifgd1l%0
Bxgd1	
Bygd1	
Bgd1gd_-
gkd$$Ifle
t0e644
la$Ifgd1lgkdI$$Ifle
t0e644
lagkd$$Ifle
t0e644
la$Ifgd1l	gkd$$Ifle
t0e644
la$Ifgd1lgkd3$$Ifle
t0e644
la	
.IzxiQ
&$Ifgdw:l%0$
B&<a$gdK	
Bgd1gkdφ$$Ifle
t0e644
la$Ifgd1lIJKLijy~	
BgdA?gdA?^gkd$$Ifl}
t0644
laQhiosx)-./01>ACSghimȾȰ⊰ȾȾ}ȾȰ⊰ȾȾh-
hPmHnHsH	hP5mHnHsH	hFhP6mHnHsH	hXPhPmHnHsH	hFhP5mHnHsH	hPmHnHsH	h|GhPmHnHsH		hP6hXPhP6hPh-
hP5mHnHsH	hP6mHnHsH	.)./0>?@Ahiw~$a$gd.d	
B]gdA?	
BgdA?gdA?mw9=Gcde(1qx֚珁t珁fh	hP6mHnHsH	h	hPmHnHsH	h	hP5mHnHsH	hP5mHnHsH	hfhPmHnHsH	hBhPmHnHsH	hBhP5mHnHsH	h"|hPmHnHsH	h"|hPhPhA?hPmHnHsH	hPmHnHsH	hA?hP5mHnHsH	%/089GSde	
BgdB	
BgdB	
Bgd.d(gd.dgd.d$a$gd.dexyz{|}~$$Ifa$gdflFf`$$Ifa$gdfl%0$a$gdfFfX$$Ifa$gdfl
B
<gdf$a$gdfFfHFfP$$Ifa$gdflq$Ifgd	lgkdK$$Ifl/
t0644
la$Ifgd	l%0gkd$$Ifl/
t0644
la$Ifgd	lgkd$$Ifl/
t0644
la1Lb$$Ifa$gdfl%0$a$gdf^gdB
B
<gdf	
BJ
gdBx}#$45EFVWXYZ^cl./01:Csz˾˾ܰܘܰܘܥܥh	hP5mHnHsH	hKM}hPmHnHsH	hP5mHnHsH	hKM}hP5mHnHsH	hfhPmHnHsH	hPh	hPmHnHsH	hPmHnHsH	h	hP6mHnHsH	hP6mHnHsH	6Ff"$$Ifa$gdflFf*$$Ifa$gdfl%0Ff$$Ifa$gdfl$$Ifa$gdfl%0$a$gdfFf$$Ifa$gdfl !"#$%&'()*+,-./012345Ff$$Ifa$gdflFf
$$Ifa$gdfl%056789:;<=>?@ABCDEFGHIJKLMNOFf$$Ifa$gdflOPQRSTUVWXYlr	
Bfgd}$a$gdfFf$$Ifa$gdfl(xe$Ifgd	lgkd$$Ifl

t0
644
la$Ifgd	l%0
BJ
<gd}()-.gkd$$Ifl

t0
644
la$Ifgd	lgkdC$$Ifl

t0
644
la./0CNd$Ifgd	l%0
Bf<gd}^gd}
BJ
<gd}	
BJ
gd}
/015>Gw~$&/78AI^̥呉{{h<JhP6mHnHsH	h/hP5h/hPhKehPmHnHsH	hKehP5mHnHsH	hP6mHnHsH	h	hP6mHnHsH	hP5mHnHsH	h	hP5mHnHsH	hPh	hPmHnHsH	hPmHnHsH	0gkd-$$Ifl
t0644
la$Ifgd	lgkd߸$$Ifl
t0644
lazxlY$Ifgd	l%0
Bf<gd}	
BJ
gd}gkd{$$Ifl
t0644
la$Ifgd	l )*gkd$$Ifl
t0644
la$Ifgd	lgkdɹ$$Ifl
t0644
la*./01GRhzxlzzzzxc^gd}
Bf<gd}	
BJ
gd}gkde$$Ifl
t0644
la$Ifgd	l$%&+78=IJklmgd<J	
Bgd<J	
Bfgd<J	
Bgd<J	
Bygd}	
Bgd}^kuhhh<hU?hPh2DhPh/hP5mxe$Ifgd/lgkd$$Ifli	
t0i	644
la$Ifgd/l%0
BJ
<gd/gkdO$$Ifli	
t0i	644
la$Ifgd/lgkd$$Ifli	
t0i	644
lalY$Ifgd/lgkd$$Ifli	
t0i	644
la$Ifgd/l%0
BJ
<gd/	
BJ
gd/gkd9$$Ifli	
t0i	644
la$Ifgd/lgkd$$Ifli	
t0i	644
lagd$gdHp	
BJ
gd/C	0
00&P	P/R :p. A!n"n#$%7}DyK_Toc147739793}DyK_Toc147739793}DyK_Toc147739794}DyK_Toc147739794}DyK_Toc147739795}DyK_Toc147739795}DyK_Toc147739796}DyK_Toc147739796}DyK_Toc147739797}DyK_Toc147739797}DyK_Toc147739798}DyK_Toc147739798}DyK_Toc147739799}DyK_Toc147739799}DyK_Toc147739800}DyK_Toc147739800}DyK_Toc147739801}DyK_Toc147739801}DyK_Toc147739802}DyK_Toc147739802}DyK_Toc147739803}DyK_Toc147739803}DyK_Toc147739804}DyK_Toc147739804}DyK_Toc147739805}DyK_Toc147739805}DyK_Toc147739806}DyK_Toc147739806}DyK_Toc147739807}DyK_Toc147739807}DyK_Toc147739808}DyK_Toc147739808}DyK_Toc147739809}DyK_Toc147739809}DyK_Toc147739810}DyK_Toc147739810}DyK_Toc147739811}DyK_Toc147739811}DyK_Toc147739812}DyK_Toc147739812}DyK_Toc147739813}DyK_Toc147739813}DyK_Toc147739814}DyK_Toc147739814}DyK_Toc147739815}DyK_Toc147739815}DyK_Toc147739816}DyK_Toc147739816}DyK_Toc147739817}DyK_Toc147739817}DyK_Toc147739818}DyK_Toc147739818}DyK_Toc147739819}DyK_Toc147739819}DyK_Toc147739820}DyK_Toc147739820}DyK_Toc147739821}DyK_Toc147739821}DyK_Toc147739822}DyK_Toc147739822}DyK_Toc147739823}DyK_Toc147739823}DyK_Toc147739824}DyK_Toc147739824}DyK_Toc147739825}DyK_Toc147739825}DyK_Toc147739826}DyK_Toc147739826}DyK_Toc147739827}DyK_Toc147739827}DyK_Toc147739828}DyK_Toc147739828}DyK_Toc147739829}DyK_Toc147739829}DyK_Toc147739830}DyK_Toc147739830}DyK_Toc147739831}DyK_Toc147739831}DyK_Toc147739832}DyK_Toc147739832}DyK_Toc147739833}DyK_Toc147739833}DyK_Toc147739834}DyK_Toc147739834}DyK_Toc147739835}DyK_Toc147739835}DyK_Toc147739836}DyK_Toc147739836DyK_Inode_NumbersDyK_Allocation_GroupsDyK_Data_Extents_1{DyK
_DirectoriesDyK_Extended_Attributes_1DyK_Allocation_GroupsDyK_Real-time_DevicesDd -}D

3@@"?DyK_Realtime_DevicesDyK_AG_Free_Space_Management$$Ifh!vh5	
5#v	
#v:Vl	@@
t0 6,5	
5ahp$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah}DyK_Quota_Inodes$$Ifh!vh5	
5#v	
#v:Vl	@@
t0 6,5	
5ahp$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ah$$Ifh!vh5	
5#v	
#v:Vl
t0 6,5	
5ahDd -eD

3@@"?Dd -)D

3@@"?DyK_AG_Free_Space_BlockDd -D

3@@"?{DyK
_Superblocks{DyK
_DirectoriesDd -D

3@@"?DyK_Unlinked_PointerDyK_AG_Free_Space_B+treesDd -D

3@@"?DdD%D

3@@"?{DyK
_SuperblocksDyK_AG_Inode_ManagementDdD%D

3@@"?DyK_Extended_Attribute_Versions$$Ifh!vh55#v#v:Vl	@@
t0 6,55ahp$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ahDyK_AG_Inode_ManagementDd -D
	
3@@"?DyK_Data_Extents_1{DyK
_DirectoriesDyK_Symbolic_LinksDyK_Extended_AttributesDd D


3@@"?	Dd $D

3@@"?
DdD%)D

3@@"?DdD%S	D


3@@"?Ddk%4D

3@@"?
{DyK
_SuperblocksDyK_Inode_NumbersDyK_On-disk_InodeDyK_Single_Block_DirectoriesDd -_D

3@@"?DyK_In-core_Extent_ListDdD%D

3@@"?DyK_Block_Directories}DyK_Data_ExtentsDyK_Extended_Attributes_1DdD%7D

3@@"?DyK_Leaf_DirectoriesDdD%9D

3@@"?DyK_Single-Leaf_DirectoriesDyK_Multi-Leaf_DirectoriesDyK_B*Tree_Extent_ListDdD%D

3@@"?Ddt"4D

3@@"?DdD%D

3@@"?$$Ifh!vh55#v#v:Vl	@@
t0 6,55ahp$$Ifh!vh55#v#v:Vl
t0 6,55ah$$Ifh!vh55#v#v:Vl
t0 6,55ahDyK_Shortform_AttributesDyK_Single-Leaf_DirectoriesDdD%6hD

3@@"?DyK_Node_DirectoriesDdE%OD

3@@"?DyK_Node_AttributesDyK_B*Tree_Extent_List{DyK
_SuperblocksDd -D

3@@"?DyK_Data_Extents_1{DyK
_SuperblocksL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5.#v.:Vl
t.65.aL$$If!vh5.#v.:Vl
t.65.aL$$If!vh5.#v.:Vl
t.65.aL$$If!vh5a#va:Vl
ta65aaL$$If!vh5a#va:Vl
ta65aaL$$If!vh5a#va:Vl
ta65aaL$$If!vh5a#va:Vl
ta65aaL$$If!vh5a#va:Vl
ta65aaL$$If!vh5a#va:Vl
ta65aaL$$If!vh5	#v	:Vl
t	65	aL$$If!vh5	#v	:Vl
t	65	aL$$If!vh5	#v	:Vl
t	65	aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5	#v	:Vl
t	65	aL$$If!vh5	#v	:Vl
t	65	aL$$If!vh5	#v	:Vl
t	65	aL$$If!vh5.#v.:Vl
t.65.aL$$If!vh5.#v.:Vl
t.65.aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5|#v|:Vl
t|65|aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5e#ve:Vl
te65eaL$$If!vh5e#ve:Vl
te65eaL$$If!vh5e#ve:Vl
te65eaL$$If!vh5e#ve:Vl
te65eaL$$If!vh5e#ve:Vl
te65eaL$$If!vh5e#ve:Vl
te65eaL$$If!vh5#v:Vl
t65a$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkdk$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkdc$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd[$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkdS$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
laL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65a$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd5$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd-$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd%$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd
$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
la$$If!vh555555555	5	
5
55
5
55#v#v:Vl
t033333333333365hkd$$Ifld	

hhhhhhhhhhhhhhhh
t03333333333336@@@@44
laL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5
#v
:Vl
t
65
aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5#v:Vl
t65aL$$If!vh5i	#vi	:Vl
ti	65i	aL$$If!vh5i	#vi	:Vl
ti	65i	aL$$If!vh5i	#vi	:Vl
ti	65i	aL$$If!vh5i	#vi	:Vl
ti	65i	aL$$If!vh5i	#vi	:Vl
ti	65i	aL$$If!vh5i	#vi	:Vl
ti	65i	a4L@LdFNormal7x^7OJQJ_HmH	sH	tH	@`	Heading 1,$$&d@&P`&^'5B*	CJ(KH OJQJ\^JaJ phDn@n`	Heading 2$$@&^&5B*	CJ OJQJ\]^JaJphDh@hlF	Heading 3$x@&^#5B*	CJOJQJ\^JaJphDP@P$	Heading 4$@&B*	CJ\aJphDDA@DDefault Paragraph FontVi@VTable Normal :V44
la(k@(No List6U@6+	Hyperlink>*B*phbOb"p6Code 
@@xx^m$ B*	CJOJQJmHnHph=lufOfng	Structure
B^#CJOJQJ^JaJmHnHsHur@#rrX
Table Grid7:V0
7^7TO2Ti7^Array contents$
B&<<a$sH	@OC@i7^Array TableCJOJQJ2OR2#p6Example
n^nT@T
ETOC 1$
%5CJOJQJ\^JaJD@D
q_TOC 2
%S(^S5\:@:
ukgTOC 3
%^22
sTOC 4^22
sTOC 5X^X22
sTOC 6 ^ 22
sTOC 7^22
sTOC 8^22
sTOC 9x^xHOH<[
Parameters$xm$5mHnHu:O:+YCDescription
 n^n>@>YC
Normal Indent
!^VO!Vp6	Code Char,B*	CJOJQJ_HmHnHph=lsH	tH	u0O"10p6Example CharT@BTTHHeader$
B*^5B*CJ OJQJph< @R<78Footer
%
9r OJQJFV@aF78FollowedHyperlink>*B*ph.)@q.78Page NumberRORnY
Table Heading(<^5OJQJ^JJOJnYTable Description)<^HOHnYTable Values*<^OJQJHOH Description Char_HmH	sH	tH	O$@Style 24 pt Bold Custom Color(RGB(9638168)) Centered Left:  0...,$^a$5B*	CJ0\phDO3$@Style 60 pt Bold Custom Color(RGB(9638168)) Centered Left:  0...-$^a$5B*	CJx\phDRY@R$Document Map.-D M
OJQJ^JBOBp6Style Courier NewOJQJnOn1p6Style Description + Courier New0OJQJmHnHutOt0p6$Style Description + Courier New CharOJQJmHnHujOjXTOC Heading"2$&d	PD^5B*	CJ(OJQJphDO1-9qEStyle 60 pt Bold Custom Color(RGB(9638168)) Centered Left:  0... Char+5B*	CJxOJQJ\_HmH	phDsH	tH	mda]#/h*{	C




>^g

[



%/9[=1XYZo
0CIx'
4:_kA "$&(kmo4F^
Kp7`8 < I   !C!!!"$"\""""##$G$$$$%{%%%5&<&&&& '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'y'{'(a((G)I))* *V***t+v+++,
,K,,,,-?-e-----'.<.Q.g.}......R//90;000/1j11=2?222?3A3o333334*4S4	 #$'KJHGLX_ZA@?>=<defgijkopuvwxyz{|}BCGHIJKLM	N
	

"! ,+*/.DCA@?=<;:98
	O
 !"#$%&'()*+,-hiklonmwvutz}|{~.mda]#/h*{	C




>^g

[



%/9[=1XYZo
0CIx'
4:_kA "$&(kmo4F^
Kp7`8 < I   !C!!!"$"\""""##$G$$$$%{%%%5&<&&&& '!'"'#'$'%'&'''(')'*'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'y'{'(a((G)I))* *V***t+v+++,
,K,,,,-?-e-----'.<.Q.g.}......R//90;000/1j11=2?222?3A3o333334*4S4V4	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

F->TK֔Un9&WWXX)X=XNXhXlX|XXXXXXX
Y"Y,YBY{00;000;000;000s;000;000T;000!;000ƃ;000K;000a;00	0;00
0;000[;000
;00
0;000;0008;000;000u;000;0000;000eY;000Y;000Y;000Y;000Y;000Y;000Y;000Z;000Z;000 Z;0001Z;00 0BZ;00!0TZ;00"0XZ;00#0Z;00$0Z;00%0Z;00&0Z;00'0Z;00(0Z->TK֔Un9&WWXX)X=XNXhXlX|XXXXXXX
Y"Y,YBY{00<	;00<	0<	;00<	0<	;00<	0s<	;00<	0<	;00<	0T<	;00<	0!<	;00<	0ƃ<	;00<	0K<	;00<	0a<	;00	<	0<	;00
<	0<	;00<	0[<	;00<	0
<	;00
<	0<	;00<	0<	;00<	08<	;00<	0<	;00<	0u<	;00<	0<	;00<	0<	0;000eY;000Y;000Y;000Y;000Y;000Y;000Y;000Z;000Z;000 Z;0001Z;00 0BZ;00!0TZ;00"0XZ;00#0Z;00$0Z;00%0Z;00&0Z;00'0Z;00(0Z)4567wxyz{qoolcRbg	\		
Y

W^

`

[Q_!20<Xg=Ju"ly	6C(V{8~]#?[m
'Da},E^w(AYo	&@[gsH S   ,!8!c!k!!!"" #*#N#Y#}####W$b$$$$$$$;&@&L&M&d&&&&&&&U'V'n'''''''(((@(A(Z(y(z((((()),)q)r)s))*)***+%+k+w+++++,,6,B,,,,,5-A---......h/t/F0R00000111:1;1K1e1f1v111111122,2\2]2m22222223*323\3f33344444555677b8r88879l999,:r:::;&;0;F;W;j;v;;;;;;;;
<<(<:<N<]<m<|<<<<<<<==#=/=:=N=\=i=v===========>>?T?h??@X@n@@@@@@AA/ACAXAnAAAAA1B>BBBBBBBDD]DhDD
EnEyEEEEE/F;FFF(G>GGH=HOHaHuHHHHHI+IBIYI}I~IIII"JJKxKK@L]L#M@MNMrNoOkP&QCQQQ4R=RORYRoR~RRRRRRRRRRSS'S(SSSSTTU&U9UCUVU`UlU{UUUUVV?WUWhWrWWWWWWWX;XX Y6YIYSYfYpY~YYYYYY-ZrZsZZZZ[\\\^]]]]]]]^^)^@^T^h^^^^^^_&_N_Y_____#`-`a`o`````'a8aaabkcccccdd1dDdEddddddddef6fRfoffffff%hdhhj&jAj\jvjjjjjjekmkkkkklmnnnooooopp3pHp^puppppppq'qAq\qyqqqqqqrr rhrprrrsspvvvvvvww"wwwxx7x@xSy]yyyzz/z8zz{{2{E{N{}{{{{||}}1<;GYdqz؃݃34HtuńƄۄ89ImnFG^TUm	
׌->TK֔Un9&50
<ImΦܧ0Cƨ֨hج٬a~t¯֯-ARdwİװ6:OcuyDZޱYkuJسf;ɵWnַ
>?_~v͹߹/ASTgKӼ4Tfzɾ!Y%"u^	If"*^,.UVl.]g.CDg{'[\l)=Pay>\{	3Zx%Ov>Z/vK.8L_p1On&Mk3EO$k@\"$'c./Rf./?]},-Sv#<=bw "3@J`qu 1BTXJ"jBb:Zd<7Ws(:L]v2Edu+B\s*:T9Xt,EXw+<LM(pHL$ly
	R-d
8
X
^
}






)*Ne}8Xhx$(:K\nr!A`|.GZy8Kcy!BVo 8Xx"ARVp&FY]x 5Vjn/@R\t#<On&7Nct2E^o~   9 = ] x    
!!/!O!n!r!!!!!!!!""'"?"^"~""""""##*#:#`#x#######$$H%Y%&&F)))))*"*5*L*M*l****+,5,N,b,v,~,,,,,,M-6..//0+0000000
111)131G1Z1k111111112233334/4P4l444444	5515D5c5t55555556(6?6R6q666667707:7M7`7y7777(9?9Q9[9t9999999
:!:?:X:\:}::::::;;;8;Q;c;r;;;;;;<$<E<b<<<<<======>T>U>>>>>>>>
?@??;@M@W@@@A"AB+CCDDDEEEEEEEFF*F;FOFbFsFwFFFFFFFFGG#G1G@GPGGGHHNHHHH,I-ILJdJvJJJJJJJJJKK0KDKWKiK~KKKKKKKKLL^LuLLLLLLLL;M<MSMeMoMMMMMMNNN+N5NHNaNzNNNNOOOOOP P$P%P<PNPXPqPPPPP`QyQ<RYRiRRRRRRRSSS+S<SNSRSmSSSSTLTTT!UhUUUUVWWWWXX)X=XNXhXlX|XXXXXXX
Y"Y,YBYVYZP[[]^_ abacaxaJb}bbbbbbcc+c>cVcbczc{cccddUeeeeeeeeeff$fRftffffffgg"g4gMgQgkggggggh0hNhhhhhhiLi^ihiii=jjjkYkkk.lvllmLmmmznnnnnnnn*ooooooo
pp(p?p]p{pppppppqq3q7qQqhqqqqqqr:rTrprrrrrrrsss8sOsmssssst!t;tWtytttttu,uTuguquuuuuuuv v:vVv{vvvvvw.wKwjwwwwwx$x>xZx{xxxyyayyy6z}zz{R{{{'|n|||C}}~$~~؀(6MNq́ف7HZgsɂ؂	4FXgvԃE]pKȉ)9pˋ݋3CDU_qьߌVr؍H؎<̏`&7I\nőՑ 12CM_q͒Fcɓ*C^wĔ6,tP(8HeuΛ*<W[Ҝ9K^q͝+=1<ҟܟ'<Q_٠0MQnˡ;Sjâڢ3Jk4Vwʤ4|ĦT,`0GQUhy˫ϫCDZoyŬ-BL_iwѭխ֭(:R`n
CѴ5NgzƵٵ2G\kͶܶBLշ',Rbº]mڼ&/gphqhqzͿݿt-87H'-.0134679:Z[jkl

"#9Vwx345M7KLM[\]^_`st1234Qcdvw{|}~49VW[\()?vw
'TUr	
#$()*+EFGguvJKcp;Ky01:K\]txy1267gh.DEFTUVWXYlm

);PQRdersMNOP4BC[\~56789:;<=>?GHPQVW\]ghxy
%&./STrs!Lawxy
(9[\bgh&>?WX\]^_`aw-.GHLMNOr$CDEFG"#<UVZ[\]56789\himnop$<=ABCDgstxyz{'PQdefgz{+DEIJKLMNOPQRSTxy#L_!"UZstxyz{ !"#$%&':;_
.CV	
2GZ !Eklpqrs$%=d239Oklm1CDEN_pq !"#EF{'()*+,?@de0Rrs $%&'>Zp
&1Gi	
-EF^_cdefz	28EZ`almxy	
.IJKLijy~)./0>?@Ahiw~/089GSdexyz{|}~1Lb !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYlr()-./0CNd )*./01GRh$%&+78=IJklm-0-0-0,0,0,0,0,0,0,0000000200000000000000000000000000000000000000000000000Q0Q0Q00!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0! 0!0!000 0 0 00000000~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~(0~ (0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~  0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~(0~ (0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ *0~ )0~ 0~ 0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~0~ 0~  0~  0~  0~80~0b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b80b800>0>(0>0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?0T? 0T?(0>0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G0(G 0(G 0(G 0(G 0(G 0(G0(G0(G0(G0(G(0>0@M0@M0@M0@M0@M0@M80@M0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0Q0(0sZ0Z0Z0Z0Z(0sZ0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\0\ 0\(0sZ0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a80a0of00f00f0f	 0f 0f0f0f0f0f0f0f0f0f0f 0f0f0f0f0f0f0f0f0f0f0f0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n0n 0n0n 0n0n 0n0n 0n0n0n0n0n0n0n0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n0n0n0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n0n 0n(0n (0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n *0n )0n 0n 0n 0n0f00000f0׌0׌(0׌0 0 00(0׌0> 0> 0> 0>0>(0׌0U 0U 0U0U(0׌00f0&0&0& 0& 0& 0&0&(0&0000000<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0<0< 0< 0< 0<0<0<0<0٬0٬0٬0٬80٬0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0t0<0T0T0T0T0T0T0T0T0T0T0T0T0T0T 0	T 0
T0T0T0T0T0T0T0T0T0T0T 0T 0T 0
T0T 0T 0T0T0T0T0T80T000 0 0 0 0* 0* 0* 0 0 0 00000 0V 0V 0V 0V 0V 0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V0V 0V0V0V0V0V0V0V0V80V000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0 0 000000000000000000000000000000000000000000000000 0 0 0 0 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0  0! 0"0000 000000000000000000 00000000 0 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000H% 0#H% 0$H% 0%H% 0&H%0H%0H%0H%0H%0H%0H%0H%0H%0H%0H%0H% 0'H%0H%0H%0H%0H%0H%0H%0H%0H%0H%0H%0H% 0(H% 0)H% 0*H% 0+H%0H%0H%80H%000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A0A0A 0,A 0-A80A0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D00P0P0`Q0`Q80`Q0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0YR0P0U0U80U0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W0W00BY0BY0BY0BY0BY0BY0BY0BY0BY0BY0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca0ca 0ca 0ca 0ca(0ca (0ca 0ca *0ca )0ca 0ca *0ca )0ca 0ca 80ca0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0BY0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~0~80~0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0)0BY0(0(0(80(0e0e0e0e0e0e0e0e0e0e0e0e0e00e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e00e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0BY00800000000000000000000000000000000000000000000000000000 0 0 0 0000000000000000000000000000000 00 00 00000 00 00 00 00 00 00 00 00 0000 00 00 00 00 00
07(0700000(07@00000@0y00@0y00@0y00@0y00@$0@0@%0@0y00
000000000000000000000000 0 0 0 0000000000000000 0 000000000000000000 0 0 0 0 0 0000000000000000 0 0000 0 0 0 0 0 00000000000 0 0 0 0 0 000000000000000000000000000000 0 0 0 0 0 000000 0 0 0 0 0 0000000 0 0 0 0 0 00000000000000000000000000000 0 0 0 0 0 000000000000000000000000000 0 0 0 0 0 0 0 0 0 0 0 00000000000000000000 0 0 0 0 0 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0 0 0 0 00000000000000000000000 0 0 0 0 0 0000000000000000000000000 0 0 0 0 0 00000000000000 0 0 0 0 0 0000 0 0 0 0 0 0000000000000000000000000 0 0 0 000000000000 0 0 0 0000 0 0 0 00000000000000 0 0 0 00000000000000 0 0 0 0000 0 0 0 0000 0 0 0 00000000000000000000000000000 0 0 0 00000000000000000000000000000000000000000000 0 0 0 000000000000000000000 0 0 0 000000000000000000000000000 0 0 0 000000000000000000000 0 0 0 000000 0 0 0 0000000000 0 0 0 00000000000000000000000000000000000 0 0 0 0 0 00000000000000000000000 0 0 0 0000000 0 0 0 000000000000000000000000000000000000000000000000000000000000000000000000 0 0 0 0 0 0000 0 0 0 0 0 000000000000 0 0 0 0 0 0000000000000000 0 0 0 0 0 0000 0 0 0 0 0 0000000000000000000000000000000000 0 0 0 0 0 0 0 0 0 0 0 0000 0 00000000000000000000000000000000000000000000000000(00(0000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000 0 0 0 0 0 000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000000000000000 0 0 0 0 0 0000000000000 0 0 0 0 0 0000 0 0 0 0 0 00000000000000000000000000000000 0 0 0 0 0 0000 0 0 0 0 0 0000$000Pw)4567wxyz{_!20<Xg=Ju"ly	6C(V{8~]#?[m
'Da},E^w(AYo	&@[gsH S   ,!8!c!k!!!"" #*#N#Y#}####W$b$$$$$$$;&@&L&M&d&&&&&&&U'V'n'''''''(((@(A(Z(y(z((((()),)q)r)s))*)***+%+k+w+++++,,6,B,,,,,5-A---......h/t/F0R00000111:1;1K1e1f1v111111122,2\2]2m22222223*323\3f33344444555677b8r88879l999,:r:::;&;0;F;W;j;v;;;;;;;;
<<(<:<N<]<m<|<<<<<<<==#=/=:=N=\=i=v===========>>?T?h??@X@n@@@@@@AA/ACAXAnAAAAA1B>BBBBBBBDD]DhDD
EnEyEEEEE/F;FFF(G>GGH=HOHaHuHHHHHI+IBIYI}I~IIII"JJKxKK@L]L#M@MNMrNoOkP&QCQQQ4R=RORYRoR~RRRRRRRRRRSS'S(SSSSTTU&U9UCUVU`UlU{UUUUVV?WUWhWrWWWWWWWX;XX Y6YIYSYfYpY~YYYYYY-ZrZsZZZZ[\\\^]]]]]]]^^)^@^T^h^^^^^^_&_N_Y_____#`-`a`o`````'a8aaabkcccccdd1dDdEddddddddef6fRfoffffff%hdhhj&jAj\jvjjjjjjekmkkkkklmnnnooooopp3pHp^puppppppq'qAq\qyqqqqqqrr rhrprrrsspvvvvvvww"wwwxx7x@xSy]yyyzz/z8zz{{2{E{N{}{{{{||}}1<;GYdqz؃݃34HtuńƄۄ89ImnFG^TUm	
׌->TK֔Un9&50
<ImΦܧ0Cƨ֨hج٬a~t¯֯-ARdwİװ6:OcuyDZޱYkuJسf;ɵWnַ
>?_~v͹߹/ASTgKӼ4Tfzɾ!Y%"u^	If"*^,.UVl.]g.CDg{'[\l)=Pay>\{	3Zx%Ov>Z/vK.8L_p1On&Mk3EO$k@\"$'c./Rf./?]},-Sv#<=bw "3@J`qu 1BTXJ"jBb:Zd<7Ws(:L]v2Edu+B\s*:T9Xt,EXw+<LM(pHL$ly
	R-d
8
X
^
}






)*Ne}8Xhx$(:K\nr!A`|.GZy8Kcy!BVo 8Xx"ARVp&FY]x 5Vjn/@R\t#<On&7Nct2E^o~   9 = ] x    
!!/!O!n!r!!!!!!!!""'"?"^"~""""""##*#:#`#x#######$$H%Y%&&F)))))*"*5*L*M*l****+,5,N,b,v,~,,,,,,M-6..//0+0000000
111)131G1Z1k111111112233334/4P4l444444	5515D5c5t55555556(6?6R6q666667707:7M7`7y7777(9?9Q9[9t9999999
:!:?:X:\:}::::::;;;8;Q;c;r;;;;;;<$<E<b<<<<<======>T>U>>>>>>>>
?@??;@M@W@@@A"AB+CCDDDEEEEEEEFF*F;FOFbFsFwFFFFFFFFGG#G1G@GPGGGHHNHHHH,I-ILJdJvJJJJJJJJJKK0KDKWKiK~KKKKKKKKLL^LuLLLLLLLL;M<MSMeMoMMMMMMNNN+N5NHNaNzNNNNOOOOOP P$P%P<PNPXPqPPPPP`QyQ<RYRiRRRRRRRSSS+S<SNSRSmSSSSTLTTT!UhUUUUVWWWWXX)X=XNXhXlX|XXXXXXX
Y"Y,YBYVYZP[[]^_ abacaxaJb}bbbbbbcc+c>cVcbczc{cccddUeeeeeeeeeff$fRftffffffgg"g4gMgQgkggggggh0hNhhhhhhiLi^ihiii=jjjkYkkk.lvllmLmmmznnnnnnnn*ooooooo
pp(p?p]p{pppppppqq3q7qQqhqqqqqqr:rTrprrrrrrrsss8sOsmssssst!t;tWtytttttu,uTuguquuuuuuuv v:vVv{vvvvvw.wKwjwwwwwx$x>xZx{xxxyyayyy6z}zz{R{{{'|n|||C}}~$~~؀(6MNq́ف7HZgsɂ؂	4FXgvԃE]pKȉ)9pˋ݋3CDU_qьߌVr؍H؎<̏`&7I\nőՑ 12CM_q͒Fcɓ*C^wĔ6,tP(8HeuΛ*<W[Ҝ9K^q͝+=1<ҟܟ'<Q_٠0MQnˡ;Sjâڢ3Jk4Vwʤ4|ĦT,`0GQUhy˫ϫCDZoyŬ-BL_iwѭխ֭(:R`n
CѴ5NgzƵٵ2G\kͶܶBLշ',Rbº]mڼ&/gphqhqzͿݿt-87H'-lVW1267gh>?WXUVZ[<=DEIJ
klpqIJ-0-0-0,0,0,0,0,0,0@,000000020
000
000 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000 0 0 0000000
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,p 0,p0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,(0, (0, 0, *0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0,*0, )0, 0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,(0, (0, 0, *0, )0, 0, *0, )0, 0, *0, )0, 0, *0, )0, 0, *0, )0, 0, *0, )0, 0, *0, )0, 0, 0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,  0,  0,  0,:0,0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;00@0@*0@0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B0B 0B*0@0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I0I 0I 0I 0I 0I 0I0I0I0I0I*0@0O0O0O0O0O0O:0O0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0T0*0!]05]05]05]05]*0!]0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_0{_ 0{_*0!]0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d:0d0i00/i
00GiP0GiP	 0GiP 0GiP0GiP0Gih0Gih0Gih0Gih0Gih0Gih0Gih0Gih 0Gih0Gih0Gi0Gi0Gi0Gi0Gi0Gi0Gi0Gi0Gi0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq 0Tq0Tq0TqP0TqP0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP0TqP 0TqP(0TqP (0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT *0TqP )0TqP 0TqT 0TqP 0TqP0GiR0P0P0P0P0GiR00*00 0 00(00 0 0 00(00 0 00(000j000 0 0 00(0000000000000000000000000 0 0 00000000800000000000000000000000000000000000H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H0H000000000000000000000000000 0 00000000000 0 0 00 0 0000080000 0 0 0 0 0 0 0 0 0 00000 0 0 0 0 0 0000000000000000000 0000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0 0 000000000000000000000000000000000000000000000000 0 0 0 0 080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(0(0(0(0000000000000 0 0 0 00000 000000000000000000 00000000 0 080(0(0(0(00000000000000000000000000000000000000000000000000000000000000000000p0p0p0p0p0p0p0p0p0p0p0p0p0p0p000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0 0 000000000000 000p0p0p0p0p0p0p0p0p0p 0p 0p 0p 0p0p0p80p0p0p0000000 0 0000000000000000P00000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000 0 0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 0 000000000000000000 00000000000800000000000000000000000000000080000000000000000000000h0h0h0h0h0h0000000000000000000000P 0P 0P 0P(0P (0P 0T *0P )0P 0T *0P )0P 0T 80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000X0X00000000000000000000000000000000000000000P0P0P0P000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000P0P0P0P0P0P000000000000 0 0 0 0000000000000000000000000000000 00 00 0(0(000 00 00 00 00 00 00 00 00 0000 00 00 00 00 000(00000(0000000{00A3`f>@` {00A3`f>@` {00A3`f>@` {00-X${00T {00-	${00T {0
0-${00T {00-
%{00T {00-8%{00T {00{00T {00 {00T {00{00 {00@0ꤠ{00@0{00@0ꤠ{00@0{00{00{00@0ꤠ{00@0ꤠ{00@0{00{00{0$0%`0{0$0%`0 {0(0)3`f>@` {0*0+H(0{0*0+H(0{0*0+H(0{0*0+H(0 {00{00T {00 {00T {00{00 {0(0)3`f>@` {00W{00
{0a0b0 {0c0dP0 03Pw2P	--===@	

n1

P'Ux W'O!!(,.1P48:=H&OZTX,[lc^eimo]ru{Uj--*d3ش¿f(6&).37;DHJLRQY]a$finx1)-EX#Muv(#Gu#C%k}F&Qmx^	
 "$'(-79:CEHKMNPSTWYZ\]_acdnuwxyz{}~	 "%).09>CJLPRVX[abgjlt|o
=}$@'W,L...U///0@0y001q138:9e999:\::;CEHhLPkX[;`e#hl\rx{qtŌ8mFT	~z1bBl$!@$')+54
9<M?BFLOSoUNXR[l`Jjmmn"os(xz}(Xؖ1Ĝ*=wyi;/kMKQv|W	$ut17U
V&>W\GM<Z9mAsxPDIx$plD!)%
^dl	Ie5O(.*m
!#%&)*+,./01234568;<=>?@ABDFGIJLOQRUVX[^`befghijklmopqrstv|

!#$&'(*+,-/12345678:;<=?@ABDEFGHIKMNOQSTUWYZ\]^_`cdefhikmnopqrsuvwxyz{}~>Plnoq3Milmo?Milmo7Jfijl2A]`ac%0LOPRr&@\_`b(Eadeg				&	:	V	Y	Z	\	|									


$
7
S
V
W
Y
y










!5QTUWw%<X[\^~





-
>
Z
]
^
`








(9UXY[{/KNOQw")h36 !!$.$C$0!0.0@LXL[L#M;M>MPPP&Q>QAQM[m[z[{\\\\\\aaa2c\chcf1f4fRfjfmf,gLgWgrgggGh_hbhNj ҌՌ*5Af;cw7:ɦ̦ay|IadTt2
5I	Y	z		
%
&&/00I?u??bBBBBBB<RTRWRWWWcccY~~~JvpÙH`c)M]ܰس۳.;
X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%X%̕XXXXXXX_XXX__X_XX_XX__XX_XX_XXXX_____XXXX_X_XXX_X_XXX___XX_X_XXX_XX079@! ,b$.^%rBɮc$0e0e
   A@ AԔ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||s
"
0e@        @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab `&@J 2(	
z	.&/
C  3"t

s*X99?  "`.&/ZB
	
s*DDp  	.

C  S"t

s*X99?  "`.

s*@~D  "`.<
T:(	
A	+&
3 s"*?`

c$X99?+&

6?"6@ NNN?N}w#	


6
?"6@ NNN?NYq
:m 


6?"6@ NNN?N
%


6?"6@ NNN?Ne


0e0e
  BCDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||,XHi@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abi	uq


6?"6@ NNN?N



6
?"6@ NNN?N
q
*


6
?"6@ NNN?N%)


6?"6@ NNN?Ny)


6
?"6@ NNN?N	*


6
?"6@ NNN?N	!*&


s0e0e
  BUCTDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||'R~a0UT@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abo
#B

BDjJ?"0@NNN?N:;

0e0e
  BUCDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||}"O`"	U@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab[


s0e0e
  BACDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||,AWA@ "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab !$

s0e0e
  BCDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||:@ "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab d#"

0e0e
  BCDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||@ "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abo 1!

0e0e
  B:CpDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||:-sp@ "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab!#lB

<D?"0@NNN?N		!B

<D?"0@NNN?N**!:	$	%*
3 s"*?`

c$X99?$	%*`

C$%
`

C;&#"
`

C;#
`

C%$'
`

C'$,*


BvCDEFjJ6>RwIAjv@  #"&(

B:CDEFjJ>w:h@  #"%'

BCDEFjJi;v2Ko@  #"')`

Co	s%
`

C	 $
`

C	, 
`

C}


`B

c$DjJY!`B

c$DjJY"%'`B

c$DjJf#)

HԔԔXX?d 


HԔԔXX?i &
n

C"`? 
n

C"`%

n
	
C	"`%
8
`


C
%



6?"6@ NNN?N;##/$


6?"6@ NNN?N;/$#E%


B"CDEFjJ=FK$
#"mA
@  #"$&r


HZGHT
jJ?"6@ NNN?No	$M

0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||$p@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab0+!

6jJ?"6@ NNN?Nx_j	a"&%G
3 s"*?n

c$X99?"`a"&%G`

C(
. B
`

C
0B 4
`

C
5B 8
`

C(
C F
n

C"`(
a" -
n

C"`
z#B 6&
n

C"`
L'B (
`

C
{)B N-
Z

3
:B >
Z

3
>B B


BnCDEFjJnvnn%@  $7,!'=

BCDEFjJ%q"
_!@  $71"n@

Zpp99?S"`?@!A


Zpp99?S"`?2=!I>
B

BDjJ?"0@NNN?N+.

0e0e
  BC"DEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||Hz"	"@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab+#YE

6jJ?"6@ NNN?N C!F

0e0e
  B]CDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||]@"0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abn@vCR	a"	%2
3 s"*?`

c$X99?a"	%2n

C"`(
" 2
n

C"`
#B &
n

C"`
'B <)
`

C
)B 32
Z

37*t-


B+CMDEFjJ+$9)j`M@  %
)Z

37-1
	a""3
3 s"*?`

c$X99?a""3n

C"`"	/
n

C"`#2'
n

C"`(2f,
`

C,2.
n

C"`0A3


BLC
DEFjJL2<zKt	
@  
*1z

3C"?(
	/0
	a"	%-
3 s"*?`

c$X99?a"	%-n

C"`(
" t-
n

C"`
#B '
n

C"`
(B *
`

C
X+B ,
1	`,<
63 s"*?
`
7
c$X99?`,<n
9
C9"`J`M&
n
:
C:"`%

n
;
C;"`L%\
n
<
C<"`

$
`
=
C=
$
`
?
C?
p$
`
@
C@
x8X-
n
A
CA"`,"
`
C
C~CUx*X-
~`
D
C}D	,)"
}
F
BC$	DEFjJ vhZ+2$	@  )
x
G
B}CDEFjJwQQ}[@  P!(x
H
B
CDDE(FjJ

,|&D
	9
	:


	@   !
I
BCCDEFjJC1sv};3Sh@  e "
8
s*8"`Y85+<
H
[
#
:
h;H
\
#
:
h;H
c
#:ih;H
d
#:h;H
e
#U:%h;H
f
#:Uh;H
g
#":$h;H
h
#A:"h;`

C#'
`

C|l(,
|

J
sB-	CDEFjJ-	G3	@  "`Y}%`

C	#)'
`

Cxl(),
x

K
sB
CDEFjJ;
	^F
	
s	'@  "`!+%

tBCVDEFjJdV@ S*
0

tBCtDEFjJZ%&t@ 	+
0

zB_C[DEFjJ_iC[@ *0

zBCDEFjJi@ ]+#0lB

0DjJt/U0n

C"`)
.5
t

S"`u	t/9|6
n

C"`(007
n

C"`
07
Hr

#jJ5t	}7lb
0GwHI	jJ
I6:n

C"`q.5+5
t

Sy"`t/*|6
yn

Cz"`	(0)07
zn

C{"`U0)7
{Hr

#jJ	5}7lR
0GHIjJI6:

cBC1DEFjJ&1@  "`%
5

cBC,DEFjJ+a,@  "`&%+5

0e0e
  BHCDEF33 1 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||GvHWHL@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abZp%*

0e0e
  BHCDEF33 1 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||GvHWHL@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab$`%'x*

0e0e
  BHCDEF33 1 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||GvHWHL@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abd`| 	a"#%gI
3 s"*?`

c$X99?a"#%gI"
,
s*s,"`	!Dn#KG
sn

Ck"`(
" y7
kn

Cj"`
#B &
jn

Ci"`
'B 4
in

Ch"`7(*
h`

Cg7X+/
g`

Cf
]5B 6
f`

Cl40O4
l`

Cm	8-B
m`

Cn
9F=
n`

Co
=B
o`
 
Cr 8#B
r`
!
Cq!M9q#F=
q`
"
Cp"M=q#B
p
#
BC$	DEFjJ vhZ+2$	@  j1W8
$
BpCDEFjJtygDUpN@  2{"8
%
B
CDDE(FjJ

,|&D
	9
	:


	@   77<
&
BCCDEFjJC1sv};3Sh@  {7;
(
CB9	CDEFjJ9	
\0@  a	,Wb?
)
CBm
CpDEFjJ;}		m
_
Tp@  -$X?n
*
Cu*"`}
/E4F
un
+
Ct+"`4/EF
tn
.
Cw."`)/EF
wn
/
Cv/"`/EF
v
2
BT
C}DEFjJ*
T

}@  X?%E
3
BCDDEFjJtD@  9@E
4
B@CsDEFjJ@/s@  mb?E
5
BMCDEFjJ0ZhvM@  9p@xE

0e0e
  B)C5DEF33 1 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||)<:F"5@  "0e@`     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab,1

0e0e
  B
CbDEF33 1 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||V
eD[b@  "0e@`     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abW-d2x	a""3
3 s"*?`

c$X99?a""3n

Cd"`"	/
dn

Cc"`#2&
cn

Cb"`'2f,
b`

C_,2.
_n
	
C`	"`0vA3
`n


Ca
"`0A3
a

BLC
DEFjJL2<zKt	
@  
)1

B
CDEFjJ.A[J
u@  
J*o0f"


Se
0A3
e

BCDEFjJR2{}Z@  X+ 0
		%'
t# s"*?`
s
c$X99?	%'`
y
C;y(
/ u
;`
u
C7u
B 
7`
v
C8v
B 
8`
w
C9w
B 
9`
x
C:x
B 
:`
z
C<z(
 
<`
{
C={(
 
=`
|
C>|(
u 
>`
}
C?}(
 
?`

C@(
 "
@

BoCDEFjJo<@  K


BNCpDEFjJNH&`p@  K


BC	DEFjJH		@  B Y!H

#jJ R!

BC[DEFjJHJ
C[qL@  "`B g"Hr

#jJ(
"

BCDEFjJOV<X@  "`

 T"

#B(
" c'
B	a"+%L
:3 s"*?n
;
c$X99?"`a"+%L`
o
C5oX+$,
5`
p
C6p,$.
6`
L
C$L	A3*;
$`
<
C-<8<$F
-n
=
C,="`	"32
,n
>
C+>"`
#&
+n
?
C*?"`
'/
*`
@
C)@
01
)`
A
C(A($X+
(`
G
C#G>B#=F
#`
H
C"H
O48
"`
J
C!J>F=#~A
!`
K
C K
8:
 H
N
#jJl<)|*H
O
#jJl+|t-f
Qs*GnSHInSjJ**fR
Ws*GnSHInSjJ,8<`
X
C%XF$gI
%
Y
B"CDEFjJ=FK$
#"mA
@  7>$G`
Z
C'ZgI$
L
'
\
BvCDEFjJ6>RwIAjv@  GI
]
B:CDEFjJ>w:h@  =FtH
^
BCDEFjJi;v2Ko@  HK`
_
C&_q	T>I
&`
d
C.d	/EgI
.`
e
C/e	b?D
/`
f
C0f
p@C
0`B
`
c$DjJv@=F`B
a
c$DjJvKGG`B
b
c$DjJvYHuJ
g
H1gԔԔXX?7$8
1
i
H2iԔԔXX?SDgaE
2
j
H3jԔԔXX?xA  B
3
k
H4kԔԔXX?, *$+
4
q
BC	DEFjJ3^h/Q	@  4	-4
r
BCPDEFjJ_jKg,~P@  X+T>	a"	%3
# s"*?`

c$X99?a"	%3n

C"`(
" 32
n

C"`
#B &
n

C"`
'B /
n

C"`7(*
`

C7X+	/
`
	
C	
0B 1
	a"	%=F
3 s"*?`


c$X99?a"	%=Fn

C"`(
" ,
n

C"`
#B &
n

C
"`
'B J*

`

C
*B f,
`

C(
- E
`

C	
	/B ]5
	`

C
704

`B

c$DjJ=)>-`
 
C 
5C =
`
#
C#769
`
$
C$
T>B B
`
'
C'
CB /E


6
?"6@ NNN?N7:8<
	a"	%J*
3 s"*?`

c$X99?a"	%J*n

CG"`(
" )
Gn

CF"`
#B G%
Fn

CE"`
&B '
E`

CA
.(B <)
A6	!#x)
#@ s"*?	n

c$X99?"`!#x)f

SQ"@%
Qf

SR&x)
Rf

SS"\@%
Sf

ST\"!@%
TN

3$#$N

3\$#$f

SU&!x)
UN

3\'(N"

3\'!(

SVC"?!W"
V

SWC"?%W&
W

fXG$'Hpp99?F!{T"
XZB

SDW"X@%ZB

SDW&Xx)`B

c$D&x)

fYGj%HXpp99?% &
Yz	a"	%L
3 s"*?n

c$X99?"`a"	%L`

C(
/ =
`

C
0B 6
`

C752m6
`

C
{7C H=
`

C78<
`

C(
>> sL
`

C
BB F
`

C
+JB K
`

C
V?C B
`

C
GB I
n

C"`(
a" .
n

C"`
z#B 6&
n

C"`
L'B ,
`

C
,B f.


BCMDEFjJT
r
b%uM@  #3+#m@

B7C&
DEFjJ7+ZI-
B	&
@  ?)"1	#v
# s"*?
`

c$X99?#v

6ZPF0*PF0*"` 
L
Zt

S["`L
[t

S\"`L
\

s*]PFPF"`LR!
]

C^C"?	!
^ 	(+;
g# s"*?`
f
c$X99?(+;
h
<h?"6@ NNN?N{)",

i
<i?"6@ NNN?Ng.?;

k
<k?"6@ NNN?Nz	/4

l
<l?"6@ NNN?Nz	4[:

m
<m?"6@ NNN?Ng.*;

n
<n?"6@ NNN?N/)4

o
<o?"6@ NNN?N4)[:

p
0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||,XHi@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab*g.
q
0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||@ "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab*Gg.B

<D?"0@NNN?N
6
9

B
?"6@ NNN?N]	6L9
B

<D?"0@NNN?N69

B
?"6@ NNN?N59
@	+&
s# s"*?`
r
c$X99?+&
t
6?"6@ NNN?N}w#	

u
6
?"6@ NNN?NYq
:m 

v
6?"6@ NNN?N
%

w
6?"6@ NNN?Ne

x
0e0e
  BCDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||,XHi@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abi	uq

z
6?"6@ NNN?N


{
6
?"6@ NNN?N
q
*

|
6
?"6@ NNN?N%)

}
6?"6@ NNN?Ny)

~
6
?"6@ NNN?N	*


6
?"6@ NNN?N	!*&


c0e0e
  BUCTDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||'R~a0UT@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abo
#B

BDjJ?"0@NNN?N:;

0e0e
  BUCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||}"O`"	U@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab[


c0e0e
  BACDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||,AWA@ "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab !$

c0e0e
  BCDEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||:@ "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab d#"

0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||@ "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abo 1!

0e0e
  B:CpDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||:-sp@ "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab!#lB

<D?"0@NNN?N		!B

<D?"0@NNN?N**!	+$
# s"*?n

c$X99?"`+$

6
?"6@ NNN?N"


6
?"6@ NNN?Ng"?$


0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||g6@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abS5j

0e0e
  BCP
DEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||4$WUvS6'P
@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abf!

0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||k$?-/
U@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abSr$}

0jJ?"6@ NNN?N 
N!!	'$$
# s"*?`

c$X99?'$$n

C"`
_<!:
n

C"`!m 
n

C"`! 
`

C! 
n

C"`
H<!#$
n

C"`!V 
n

C"`!  "
`

C!" #


6
?"6@ NNN?N
<!Q


0e0e
  BCGDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||G@"0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abq

0e0e
  BCCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||C@"0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abg]	O+
# s"*?`

c$X99?O+

6
?"6@ NNN?NkA;


6
?"6@ NNN?NAk&;


6
?"6@ NNN?NWA'


6
?"6@ NNN?NAW&'


6
?"6@ NNN?N
W'


B
33Ԕ?"6@ NNN?NYq


B
33Ԕ?"6@ NNN?Nh


CC"?w''n
&	,$w
# s"*?

s*X99g?C"?,$w

<
?"6@ NNN?N


<?"6@ NNN?N	[


<
?"6@ NNN?Ni
d



<	?"6@ NNN?Ni

	

6
?"6@ NNN?N#F


0e0e
  BLCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||vVhL@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abr	


0e0e
  B.CKDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||KS/vL).@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab#


0e0e
  B=C+DEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||<V+=)@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab]

0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||
u@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab~

6

?"6@ NNN?N#



6
?"6@ NNN?N#/
*&		%!
# s"*?`

c$X99?	%!

<
?"6@ NNN?Nn


<
?"6@ NNN?N


<
?"6@ NNN?N;


<
?"6@ NNN?Nc"


<
?"6@ NNN?NM!;


<
?"6@ NNN?NI 


<
?"6@ NNN?NIc" 


0e0e
  BCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||-@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abH

0e0e
  BLCDEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||.D$	Z;L@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab#

0e0e
  BGC%DEF AjJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||X,XG%@  "0e@     @ABC DEEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN E5%  N E5%  N F	
5%
   !"?N@ABC DEFFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `ab`WI

0e0e
  BGC%DEF jJ 8c8c	

?1 d0u0@Ty2 NP'p<'pA)BCD|E||X,XG%@  "0e@     @ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abN 5%  N 5%  N 	
5%
   !"?N@ABC DEFGHIJK5%LMNOPQRSTUWYZ[ \]^_ `abP6



sGnHiIaJ*K`TL*MNfN`cpp99?ACDE
?
B
S	?NAQ
O<W
\f4YL<M?Q\2fkf`hӌ8ʦzb0URWc.llaٳtD%X tgD%t	sD%tD%tD%@tD%dtD%tD%
tD%t#@t	#tt"4tk%4t6k%4tD%4tD%/tD%6t:%@8tD%xtt"4tD%tVttj%/tE%(tD%,t-.@
.k@	/wH*xu/\K*u@N
_Toc147739793_Common_XFS_Types
_Toc147739794_Allocation_Groups
_Toc147739795_Superblocks
_Toc147739796_AG_Free_Space_Management
_Toc147739797_AG_Free_Space_Block
_Toc147739798_AG_Free_Space_B+trees
_Toc147739799
_Toc147739800
_Toc140399426_AG_Inode_Management
_Toc147739801_Inode_Numbers
_Toc147739802
_Toc147739803
_Toc147739804_Realtime_Devices_Real-time_Devices
_Toc147739805_On-disk_Inode
_Toc147739806
_Toc147739807
_Data_Extents_Extended_Attribute_Versions_Unlinked_Pointer
_Toc147739808
_Toc147739809
_Toc147739810
_Toc147739811
_Toc147739812
_Toc147739813
_Toc147739814
_Toc147739815_Data_Extents_1
_Toc147739816_In-core_Extent_List
_Toc147739817_B*Tree_Extent_List
_Toc147739818_Directories
_Toc147739819_Shortform_Directories
_Toc147739820_Single_Block_Directories_Block_Directories
_Toc147739821_Single-Leaf_Directories_Leaf_Directories
_Toc147739822_Multi-Leaf_Directories!_Multi-Leaf_(or_Node)_Directories_Node_Directories
_Toc147739823
_Hlt141163171
_Toc147739824_Extended_Attributes_Symbolic_Links
_Toc147739825
_Toc147739826
_Toc147739827_Extended_Attributes_1
_Toc147739828_Shortform_Attributes
_Toc147739829
_Toc147739830_Node_Attributes
_Toc147739831
_Toc147739832
_Toc147739833
_Quota_Inodes
_Toc147739834
_Toc147739835
_Toc147739836R!!~~>>T?T?(G(GAMsZsZsZZZ\afffffn׌>U&<<٬٬TTVVH%H%H%{?APPP`QUBYBYcaca~((7	

 !"#$%&'()*+,-./0123456789:@;<=>?@ABCDEFGHIJKLM^!1'~>>T?g?(G=GMMsZZZZZ\afffffn,Sm4<H٬TfVk!H%H%X%|?!APPPxQVBYUYcawa#~(7	G&^i',71;eo~!+=Gak  !!!!)"+"""##2$;$E$O$w$$$%%#%V%`%%%&&	''I'S'u''''''''a(l(Q)[)**2+<+-"-W-a---
..B.L.s.}.....+/5/\/f/t//223'333$4/444Y6c66666U7_7b8h8t8~8::;;$>.>C%CeCqCrC}CCC&J.JJJK#KCKRKKKNNPPPPPPPPQQSSSSSSTUUU*W/W0W7W]ZbZn[z[|[[[[y__bbbbee?eKeeeofufMgWghhIiXiiijj k2kWlhlmlwlm)mSn]nnnrrrr	uuMuRuuuSvWvzzzzq|y|||}
}}}
~~"~-~frɆц".pΊފM]8By)2 lvא̒Ւ&09G”ҔԕݕÖږ'5#!+ęΙ?I-nxڝ`jٟ*4QSfkKUt:CKTVeNVptJX>HgqNY̮֮tz59RWs}JZz;KP`:H\l2:ueqz!Yhn|V_	+4PZ{&.
;C&`fT\'47=

!    $$>$J$h$q$%%d(m(O)X)))m+r+++,,p-r-----....R/[/]/f/////0!0\0g0h8p8z<<d>m>????@$@AAAA;BDB&D/DDDDDYEcEIIJJQ$QQQXQ`QiQQQRRYR_RVVVVWWOWYWeWlWWWYYYYf[j[}\\^$^\^d^n^r^^^^^h_r_````aacalaaa:bDbJbSbddddbdjdddddddffff&n0n|oo~~~~ 0€րBIId)/|КךekfkHM).ί.8ݰR][^`cgmȸҸ޹HP@Hdlɼؼ%6EGO	&7FHPW`-2<uYcm|!,IU..001134679:klBNSdfrt{g7wPoMmMmJjAa0P@`Ee	:	Z				
7
W




5U<\
>
^



9Y/O wh0/0M[{[{\\2cicff!+BfsT3	%&Y~~JÙlm)^<G-..001134679:SY^hl#$%&*+,-22XYZ[klmn66778899::;;<<==>>??GGHHPPQQVVWW\\]]gghhxxyy$3lmDEpq"#EFLij~/0Tgh08R_!g	(;&d&&&&&V'n'''''((A(Z(z((((),)/F001;1v111112,2]2m256P&QW\\ffjj:kmk؃4HuƄۄ9InG^Um^Vl-**,, eUeeeee'..001134679:;Ykl!#=3K`r2Q|9\')C+Sr)+Ege1=]wy7DYkm	
Rceqs8ACZ\}4?FHOQUW[]fhwy$&-%Lw
9Z\fh&]azMr<[\np$Bgy
+Qi+J'P^Zy{'9
C2KEqs#d3;Ok1CEQ!,>Tq%'@
&Ik
-dg|	78DE_akmw.hj}ivw}~.079cexWZ~.1ENf/1j&68Hm|}1 ~Jdv(gH[^N<[1=2N8>BaL*V!J3b9{J	:H:A=m3n>vs8HEDHGa^FjE6zZb8N4ewibgqL@lNP\rhX<_{x^`.^`.^`.^`.^`OJQJo(^`OJQJo(^`OJQJo(^`OJQJo(hh^h`.hh^h`OJQJo(h^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJhHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@@^@`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohpp^p`OJQJo(hHh@@^@`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHohPP^P`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh>>^>`OJQJo(hHh

^
`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh~~^~`OJQJ^Jo(hHohNN^N`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh

^
`OJQJo(hHhw
w
^w
`OJQJo(hHhGG^G`OJQJ^Jo(hHoh^`OJQJo(hHh^`OJQJo(hHh^`OJQJ^Jo(hHoh^`OJQJo(hHbN8HED^FjE=\r_{N4eibg[~}|	:*V!A=b9@l3n>:>Ba																																																																																																																																																										@ts0Jd8'%AFyYzZ&''_,00KzczH:*C15?4WW^{$1)x2;"|6:&DG"i~"5
DqOU]Ncnu{<$cT`a(}i(/4F#^Gnt	="	I-	P	]	e	h	
)	
Q
Q 
3
5
G
b
;p
w
KGFNiuz`
DZBh-
'
(
:0
A
c
u
9I:<qr.Y>lIU>dhwk&*:ipIS E7>Zghr6{D
\">&}==ZYs
S/0Q^oZsWxI.L84"$/3ODJjL6&t#[ns.eDHya?lId37AQ|}d~y+(,s-86;`>].DuoU_#v=> 	 0 E5 )9 = S e i du w "!8!}K!$]!~!"""Z'""X"s"y"z" #0#B#c#th#zx#	$%$X$Fj$% %'%(%)%4%J%P%]%a%r%T&'&;&n&co&jy&'_G'M'^'(=(FA(F(u^(B|(~()")8)B)&m)Yu)z)
*!*&*eC*d*f*-i*'x*Z{*+ +0+;+D+H+K+(|+,1,b,4h,j,s,w,"-3;-W-_-|-k-1.A.d./H.\].$_.7c.m./&/y;/D/L/R/Qf/h/w/:0O@0
I0Tb01:1Y1f1mp1p1262k263)3^3\c3M94RV4'p4|4J?5N5PS50Y5Y5g51l5
y5.(6163:6l;6=6?=6B6E6X6]`6Xb6p6p6z67z7"7
8187898a89c9#929hQ9b97s9t9t9:':.:31:G:w:~: ;6$;[;a;e;l; <!<yb<==k=;*=5=p=={>>>:>=>[>d>j>#k>`v>ez>
A?A?.B?7i?	@x5@I@[@b@`m@w@ZAAAFAoAtA0BB9B`(B8B?BAB]eBTiB2zBBC2CUCYCdZClC"D2D*DC+D8/DAaDDaDdDeD|D((E}SEwrE
F@FFF"F7F?FdFlF#Go$G*GBmGFmG H#H'H0HYH~fHE|H8,I
9I?ILIrIY{I"JJ`2J<JzSJ[JwJK
KK6K8K*KK/LKgKmK3LXLhL1nL|LN(M8MtHMLMcMiMe>NO&Oa8O:^OFrOXPPPP_1P6PCPXP/`Pq`P0Q6QQHQyOQ`Q]xQ}R(RG0R>3RZ>Rr@R6MRmRS+S1SLSRST	TJT**T1T7T;T"hTnTUzUUkU}!U"(U@)U=UDUEUJUNU<RUfUVx!V9VAVGVMVcVW1W|AWMWOWxWX0X%5X>XQX^`XqYYNY!YT'Yn)YkVYYYfYjoYGZZB%Zq8Z=ZTlZ	[[5[\V\l\Q\_\O]
]#]3]B]^i7^/:^1Z^;[^d^~i^__q_?_X_
``=`jq`
aT-a>Eacaeb=wb{b;cdd.dEdJtdKedEefhffg!g72g3gDgEgsNg]hgukgng@zghhd#hR8h=h?hChDhxPhiiMiViwioj.&j=.j(1jKj,k~.k9kMkVk]k%eksk%l{9l
5mPfmnG)nfoooCoRop]o`oHpk2p@pOp7ipvpq
qxqq6q9qFDq?nqrr r4r(;r{r`szss'st0t|t;uj1u.@uhuJyuvvrv>vcvWdvPvvIw.wJZw9hw#nwvwNyw
xMxx?x5IxJxUx\xAzx%y(y(9y?yTy\ywyz9)z$fzjzzz{{:{R{T{n{=s{s{|.|9|N|q|O}:}?}(?}KM}Op}w~}~_E~NF~M~;T~q~?x~x~	?D)EEHjx<9'5*@@dBw1
:Q^#G>U=Srx$<6DDXXI~#w:aU]u[A/
kq39MNOPP'ddk+uz&mHs!Dnsr,@5@tEOCu;~
U+2RWYYcM$M%W%-3FM&Vtkz&bC|`$'EGT\hnynn(IX_"+13A4T[sM$) 8iA%(&"+c10)"#1_4'Wf{{U~
& j'CCPPJRXRo=%J<~J3SS`l}!_ X(pUVBh3$5O$~9 PqShkp-s*^n95DCHUW?Zg9z"2V:LW+p	QY)
9>L,kl}tuz=}m7DSnX
L
.IKTem
T
|P P":d[[v
$'&F=Fma|u	i#*.:AF<LcLo1?58:I-Ti!4Sp#Tkpw>9VX\_fh)1E\O1KSt{kvu#),,"B R5AVwWly:2JxT]iy}'|GM2u}GaB
"W6I`r7yUX#%U6:?_H'bb7$ &)AOrvk$CNoZ\`v}/<X[U#5HI]bw>!0S)sL0n3:R=t
FlHx/<#AkEn	EnYuY\r"A[jyl>m=uKxy>&78@sFP` s+0@3Fit/jd xxE&5HKLt'_r}
zJ3D6CRXe{{@38<>I3js\"Irs-;+Des~1oy@nx",.8Ol4"16td2?#0E;U?PrXau)
&$%J>THHcI2Y:Zze*^
zG!2)/I^e`t5
3/:<`CLKT^x
.
.?uM
O6WOX:\'r_,fsmut&17<SXDd)#J7>BQZC[`9g-Mp&5G nu.u5$D_~bhitw!'Sip3w;|.%uKj^;DTJq|
F%)2*VJOZa9?Ky
&*#+dFqT`lq37o9JN*%s;+?iy/Uk8$AaC4Z44}pp3
\-<DLP<[7gl=0&28Q:keo`P
Dc/Y25Fp$55cVv;B]d=\]7 ?u^Hcv]#bm'tr
#8=wz
(;>\]`ab/f],
2>lBEU:lv+%3$?$CNU_wr*sL	h$=Dwz'Ka>pA!QUzS+'RySX>K`Czh
>NQZ``:fpIt*&* BU]Z`x&g-wy|	!abqwg#AG<9MfzBUI+sD^mm+;&@&L&M&d&&&&&&&U'V'n'''''''(((@(A(Z(y(z((((()),)q)r)00111:1;1K1e1f1v111111122,2\2]2m222؃݃34HtuńƄۄ89ImnFG^TUm	
eeeeeeeeffl12Qcdvw{|9VW[\r	
#$()guv1267gh
&>?WX\]-.GHLMr<UVZ[\himn$<=ABgstxy+DEIJZstxy_	
Eklpq ! $%
	
-EF^_cd	
.IJxyz{|}~ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW()-. )*./@7p@UnknownGz Times New Roman5Symbol3&z Arial/&SGI?5	z Courier NewA&Arial Narrow5&zaTahoma;Wingdings"1hL4*êFXCe8Ce8!4dFF3QXZ0> XFS Filesystem Structure (Rev 2)Barry NaujokBarry Naujok|	

Oh+'0	4D
dp|
$XFS Filesystem Structure (Rev 2)Barry NaujokNormal.dotBarry Naujok1112Microsoft Office Word@@_#{@n@Dyˠ@Ce՜.+,D՜.+,Lhp|
SGI8F!XFS Filesystem Structure (Rev 2)Title8 8@_PID_HLINKSA
)
a
_SuperblocksSya_Data_Extents_1)
a
_Superblocks+Za_B*Tree_Extent_List96a_Node_Attributes&:a_Node_Directories	_a_Single-Leaf_Directoriesa_Shortform_Attributes+Za_B*Tree_Extent_ListUa_Multi-Leaf_Directories	_a_Single-Leaf_Directories/=a_Leaf_Directoriesqa_Extended_Attributes_1 &a_Data_Extents`fa_Block_Directories	sa_In-core_Extent_List!a_Single_Block_Directoriess#a_On-disk_Inodeov}a_Inode_Numbers)
za
_Superblocks.&ha_Extended_AttributesIEea_Symbolic_Links0ba
_DirectoriesSy_a_Data_Extents_1<Ya_AG_Inode_Management-Va_Extended_Attribute_Versions<Pa_AG_Inode_Management)
Ma
_Superblocks^Da_AG_Free_Space_B+trees:)Aa_Unlinked_Pointer0;a
_Directories)
8a
_Superblocks'82a_AG_Free_Space_Block)a_Quota_Inodes(9&a_AG_Free_Space_Management+<#a_Realtime_Devicesy0a_Real-time_DevicesB^a_Allocation_Groupsqa_Extended_Attributes_10a
_DirectoriesSya_Data_Extents_1B^a_Allocation_Groupsova_Inode_Numbers=a_Toc147739836=a_Toc147739835=a_Toc147739834=a_Toc147739833=a_Toc147739832=a_Toc147739831=a_Toc147739830=a_Toc147739829=a_Toc147739828=a_Toc147739827=a_Toc147739826=a_Toc147739825=a_Toc147739824=a_Toc147739823=a_Toc147739822=a_Toc147739821=a_Toc147739820=a_Toc147739819=a_Toc147739818=a_Toc147739817=a_Toc147739816=a_Toc147739815=a_Toc147739814=za_Toc147739813=ta_Toc147739812=na_Toc147739811=ha_Toc147739810=ba_Toc147739809=\a_Toc147739808=Va_Toc147739807=Pa_Toc147739806=Ja_Toc147739805=Da_Toc147739804=>a_Toc147739803=8a_Toc147739802=2a_Toc147739801=,a_Toc1477398002&a_Toc1477397992 a_Toc1477397982a_Toc1477397972a_Toc1477397962a_Toc1477397952a_Toc1477397942a_Toc147739793	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~	

!"#$%&'()*+,-./>Root Entry	F@Data
1Table!)WordDocumentEFSummaryInformation(DocumentSummaryInformation8 CompObjq
	FMicrosoft Office Word Document
MSWordDocWord.Document.89qRoot Entry	F@~s*@Data
1Table!)WordDocumentEF	

SDEFGHIJKLMNOPQR՜.+,D՜.+,Lhp|
SGI8F!XFS Filesystem Structure (Rev 2)Title8 8@_PID_HLINKSA
)
a
_SuperblocksSya_Data_Extents_1)
a
_Superblocks+Za_B*Tree_Extent_List96a_Node_Attributes&:a_Node_Directories	_a_Single-Leaf_Directoriesa_Shortform_Attributes+Za_B*Tree_Extent_ListUa_Multi-Leaf_Directories	_a_Single-Leaf_Directories/=a_Leaf_Directoriesqa_Extended_Attributes_1 &a_Data_Extents`fa_Block_Directories	sa_In-core_Extent_List!a_Single_Block_Directoriess#a_On-disk_Inodeov}a_Inode_Numbers)
za
_Superblocks.&ha_Extended_AttributesIEea_Symbolic_Links0ba
_DirectoriesSy_a_Data_Extents_1<Ya_AG_Inode_Management-Va_Extended_Attribute_Versions<Pa_AG_Inode_Management)
Ma
_Superblocks^Da_AG_Free_Space_B+trees:)Aa_Unlinked_Pointer0;a
_Directories)
8a
_Superblocks'82a_AG_Free_Space_Block)a_Quota_Inodes(9&a_AG_Free_Space_Management+<#a_Realtime_Devicesy0a_Real-time_DevicesB^a_Allocation_Groupsqa_Extended_Attributes_10a
_DirectoriesSya_Data_Extents_1B^a_Allocation_Groupsova_Inode_Numbers=a_Toc147739836=a_Toc147739835=a_Toc147739834=a_Toc147739833=a_Toc147739832=a_Toc147739831=a_Toc147739830=a_Toc147739829=a_Toc147739828=a_Toc147739827=a_Toc147739826=a_Toc147739825=a_Toc147739824=a_Toc147739823=a_Toc147739822=a_Toc147739821=a_Toc147739820=a_Toc147739819=a_Toc147739818=a_Toc147739817=a_Toc147739816=a_Toc147739815=a_Toc147739814=za_Toc147739813=ta_Toc147739812=na_Toc147739811=ha_Toc147739810=ba_Toc147739809=\a_Toc147739808=Va_Toc147739807=Pa_Toc147739806=Ja_Toc147739805=Da_Toc147739804=>a_Toc147739803=8a_Toc147739802=2a_Toc147739801=,a_Toc1477398002&a_Toc1477397992 a_Toc1477397982a_Toc1477397972a_Toc1477397962a_Toc1477397952a_Toc1477397942a_Toc147739793SummaryInformation(DocumentSummaryInformation8CCompObjq