OpenZFS Capacity Calculator



+
1
-
+
10
-
+
100
-
+
12
-
+
24
-
+
60
-
+
102
-
Shelf Count12-Bay Head24-Bay Head48-Bay Head
24-Bay Shelf1 (12 free)0 (0 free)0 (24 free)
60-Bay Shelf1 (48 free)0 (0 free)0 (24 free)
102-Bay Shelf1 (90 free)0 (0 free)0 (24 free)

Common Layouts

2-Way Mirror3-Wide Z14-Wide Z15-Wide Z15-Wide Z26-Wide Z210-Wide Z211-Wide Z2
12 vdev + 0 spare8 vdev + 0 spare6 vdev + 0 spare4 vdev + 4 spare4 vdev + 4 spare4 vdev + 0 spare2 vdev + 4 spare2 vdev + 2 spare
4TB43.375 TiB57.985 TiB63.29 TiB57.99 TiB42.928 TiB57.985 TiB55.29 TiB60.836 TiB
8TB87.063 TiB116.095 TiB126.706 TiB116.104 TiB85.981 TiB116.136 TiB110.705 TiB121.798 TiB
12TB130.75 TiB174.288 TiB190.121 TiB174.219 TiB129.035 TiB174.288 TiB166.12 TiB182.759 TiB
18TB196.188 TiB261.536 TiB285.278 TiB261.391 TiB193.615 TiB261.536 TiB249.266 TiB274.213 TiB
22TB239.875 TiB319.646 TiB348.761 TiB319.506 TiB236.668 TiB319.687 TiB304.682 TiB335.174 TiB
24TB261.625 TiB348.701 TiB380.435 TiB348.563 TiB258.194 TiB348.742 TiB332.389 TiB365.643 TiB
26TB283.563 TiB377.839 TiB412.177 TiB377.621 TiB279.721 TiB377.839 TiB360.097 TiB396.135 TiB
1.92TB20.688 TiB27.764 TiB30.323 TiB27.734 TiB20.514 TiB27.764 TiB26.464 TiB29.13 TiB
3.84TB41.688 TiB55.654 TiB60.77 TiB55.643 TiB41.19 TiB55.695 TiB53.076 TiB58.385 TiB
7.68TB83.688 TiB111.516 TiB121.665 TiB111.461 TiB82.542 TiB111.516 TiB106.278 TiB116.918 TiB
15.36TB167.5 TiB223.157 TiB243.455 TiB223.048 TiB165.208 TiB223.157 TiB212.68 TiB233.961 TiB
30.72TB335.125 TiB446.438 TiB487.035 TiB446.22 TiB330.542 TiB446.438 TiB425.509 TiB468.07 TiB
61.44TB670.375 TiB893.002 TiB974.263 TiB892.615 TiB661.245 TiB893.044 TiB851.143 TiB936.289 TiB
122.88TB1.309 PiB1.744 PiB1.903 PiB1.744 PiB1.292 PiB1.744 PiB1.663 PiB1.829 PiB

Raw, Stripes, & Mirrors

RawStripe2-Way Mirror3-Way Mirror
24 disks24 vdev + 0 spare12 vdev + 0 spare8 vdev + 0 spare
4TB96 TB86.875 TiB43.375 TiB28.875 TiB
8TB192 TB174.25 TiB87.063 TiB58 TiB
12TB288 TB261.625 TiB130.75 TiB87.125 TiB
18TB432 TB392.5 TiB196.188 TiB130.75 TiB
22TB528 TB479.875 TiB239.875 TiB159.875 TiB
24TB576 TB523.375 TiB261.625 TiB174.375 TiB
26TB624 TB567.25 TiB283.563 TiB189 TiB
1.92TB46.08 TB41.5 TiB20.688 TiB13.75 TiB
3.84TB92.16 TB83.5 TiB41.688 TiB27.75 TiB
7.68TB184.32 TB167.5 TiB83.688 TiB55.75 TiB
15.36TB368.64 TB335.125 TiB167.5 TiB111.625 TiB
30.72TB737.28 TB670.375 TiB335.125 TiB223.375 TiB
61.44TB1.475 PB1.309 PiB670.375 TiB446.875 TiB
122.88TB2.949 PB2.619 PiB1.309 PiB893.875 TiB

RAIDZ1

3-Wide Z14-Wide Z15-Wide Z16-Wide Z17-Wide Z18-Wide Z19-Wide Z110-Wide Z1
8 vdev + 0 spare6 vdev + 0 spare4 vdev + 4 spare4 vdev + 0 spare3 vdev + 3 spare3 vdev + 0 spare2 vdev + 6 spare2 vdev + 4 spare
4TB57.985 TiB63.29 TiB57.99 TiB69.573 TiB64.154 TiB73.348 TiB58.055 TiB64.526 TiB
8TB116.095 TiB126.706 TiB116.104 TiB139.32 TiB128.473 TiB146.861 TiB116.235 TiB129.177 TiB
12TB174.288 TiB190.121 TiB174.219 TiB209.068 TiB192.791 TiB220.334 TiB174.443 TiB193.828 TiB
18TB261.536 TiB285.278 TiB261.391 TiB313.715 TiB289.269 TiB330.583 TiB261.728 TiB290.832 TiB
22TB319.646 TiB348.761 TiB319.506 TiB383.462 TiB353.548 TiB404.095 TiB319.936 TiB355.483 TiB
24TB348.701 TiB380.435 TiB348.563 TiB418.311 TiB385.707 TiB440.832 TiB349.012 TiB387.808 TiB
26TB377.839 TiB412.177 TiB377.621 TiB453.21 TiB417.867 TiB477.608 TiB378.116 TiB420.133 TiB
1.92TB27.764 TiB30.323 TiB27.734 TiB33.326 TiB30.732 TiB35.152 TiB27.785 TiB30.895 TiB
3.84TB55.654 TiB60.77 TiB55.643 TiB66.827 TiB61.589 TiB70.428 TiB55.722 TiB61.943 TiB
7.68TB111.516 TiB121.665 TiB111.461 TiB133.779 TiB123.343 TiB140.981 TiB111.598 TiB124.011 TiB
15.36TB223.157 TiB243.455 TiB223.048 TiB267.682 TiB246.811 TiB282.087 TiB223.32 TiB248.148 TiB
30.72TB446.438 TiB487.035 TiB446.22 TiB535.489 TiB493.747 TiB564.339 TiB446.794 TiB496.448 TiB
61.44TB893.002 TiB974.263 TiB892.615 TiB1.046 PiB987.658 TiB1.102 PiB893.712 TiB993.021 TiB
122.88TB1.744 PiB1.903 PiB1.744 PiB2.092 PiB1.929 PiB2.205 PiB1.746 PiB1.94 PiB

RAIDZ2

5-Wide Z26-Wide Z27-Wide Z28-Wide Z29-Wide Z210-Wide Z211-Wide Z212-Wide Z2
4 vdev + 4 spare4 vdev + 0 spare3 vdev + 3 spare3 vdev + 0 spare2 vdev + 6 spare2 vdev + 4 spare2 vdev + 2 spare2 vdev + 0 spare
4TB42.928 TiB57.985 TiB50.732 TiB61.927 TiB49.744 TiB55.29 TiB60.836 TiB66.359 TiB
8TB85.981 TiB116.136 TiB101.619 TiB124.011 TiB99.613 TiB110.705 TiB121.798 TiB132.866 TiB
12TB129.035 TiB174.288 TiB152.507 TiB186.063 TiB149.505 TiB166.12 TiB182.759 TiB199.374 TiB
18TB193.615 TiB261.536 TiB228.839 TiB279.173 TiB224.32 TiB249.266 TiB274.213 TiB299.135 TiB
22TB236.668 TiB319.687 TiB279.695 TiB341.258 TiB274.213 TiB304.682 TiB335.174 TiB365.643 TiB
24TB258.194 TiB348.742 TiB305.139 TiB372.284 TiB299.135 TiB332.389 TiB365.643 TiB398.897 TiB
26TB279.721 TiB377.839 TiB330.583 TiB403.343 TiB324.082 TiB360.097 TiB396.135 TiB432.15 TiB
1.92TB20.514 TiB27.764 TiB24.289 TiB29.668 TiB23.798 TiB26.464 TiB29.13 TiB31.796 TiB
3.84TB41.19 TiB55.695 TiB48.702 TiB59.46 TiB47.744 TiB53.076 TiB58.385 TiB63.717 TiB
7.68TB82.542 TiB111.516 TiB97.561 TiB119.046 TiB95.637 TiB106.278 TiB116.918 TiB127.558 TiB
15.36TB165.208 TiB223.157 TiB195.247 TiB238.217 TiB191.4 TiB212.68 TiB233.961 TiB255.241 TiB
30.72TB330.542 TiB446.438 TiB390.618 TiB476.592 TiB382.948 TiB425.509 TiB468.07 TiB510.631 TiB
61.44TB661.245 TiB893.044 TiB781.392 TiB953.309 TiB766.021 TiB851.143 TiB936.289 TiB1021.411 TiB
122.88TB1.292 PiB1.744 PiB1.526 PiB1.862 PiB1.496 PiB1.663 PiB1.829 PiB1.995 PiB

RAIDZ3

7-Wide Z38-Wide Z39-Wide Z310-Wide Z311-Wide Z312-Wide Z313-Wide Z314-Wide Z3
3 vdev + 3 spare3 vdev + 0 spare2 vdev + 6 spare2 vdev + 4 spare2 vdev + 2 spare2 vdev + 0 spare1 vdev + 11 spare1 vdev + 10 spare
4TB43.424 TiB49.653 TiB40.154 TiB48.328 TiB58.023 TiB63.29 TiB34.228 TiB36.873 TiB
8TB86.999 TiB99.457 TiB80.432 TiB96.78 TiB116.17 TiB126.728 TiB68.592 TiB73.882 TiB
12TB130.575 TiB149.234 TiB120.73 TiB145.233 TiB174.318 TiB190.166 TiB102.956 TiB110.88 TiB
18TB195.938 TiB223.928 TiB181.158 TiB217.933 TiB261.551 TiB285.323 TiB154.497 TiB166.394 TiB
22TB239.486 TiB273.732 TiB221.456 TiB266.385 TiB319.699 TiB348.761 TiB188.861 TiB203.392 TiB
24TB261.274 TiB298.621 TiB241.585 TiB290.612 TiB348.761 TiB380.48 TiB206.037 TiB221.897 TiB
26TB283.062 TiB323.536 TiB261.734 TiB314.838 TiB377.846 TiB412.199 TiB223.225 TiB240.401 TiB
1.92TB20.781 TiB23.775 TiB19.197 TiB23.123 TiB27.78 TiB30.323 TiB16.359 TiB17.63 TiB
3.84TB41.686 TiB47.674 TiB38.539 TiB46.392 TiB55.684 TiB60.77 TiB32.854 TiB35.397 TiB
7.68TB83.524 TiB95.474 TiB77.221 TiB92.909 TiB111.516 TiB121.665 TiB65.845 TiB70.919 TiB
15.36TB167.173 TiB191.072 TiB154.568 TiB185.943 TiB223.157 TiB243.455 TiB131.814 TiB141.963 TiB
30.72TB334.47 TiB382.296 TiB309.28 TiB372.032 TiB446.461 TiB487.058 TiB263.765 TiB284.063 TiB
61.44TB669.092 TiB764.718 TiB618.685 TiB744.189 TiB893.07 TiB974.263 TiB527.666 TiB568.263 TiB
122.88TB1.307 PiB1.494 PiB1.209 PiB1.454 PiB1.744 PiB1.903 PiB1.031 PiB1.11 PiB

dRAID

draid1:4d:24c:0sdraid1:8d:24c:0sdraid2:8d:24c:0sdraid2:16d:24c:0sdraid3:8d:24c:0sdraid3:16d:24c:0s
1 vdev + 0 spare1 vdev + 0 spare1 vdev + 0 spare1 vdev + 0 spare1 vdev + 0 spare1 vdev + 0 spare
4TB69.61 TiB77.453 TiB69.61 TiB77.453 TiB63.302 TiB73.361 TiB
8TB139.358 TiB155.045 TiB139.358 TiB155.045 TiB126.74 TiB146.86 TiB
12TB209.105 TiB232.637 TiB209.105 TiB232.637 TiB190.177 TiB220.359 TiB
18TB313.727 TiB349.025 TiB313.727 TiB349.025 TiB285.334 TiB330.608 TiB
22TB383.474 TiB426.617 TiB383.474 TiB426.616 TiB348.772 TiB404.107 TiB
24TB418.348 TiB465.413 TiB418.348 TiB465.412 TiB380.491 TiB440.857 TiB
26TB453.222 TiB504.209 TiB453.222 TiB504.208 TiB412.21 TiB477.606 TiB
1.92TB33.351 TiB37.116 TiB33.351 TiB37.116 TiB30.322 TiB35.151 TiB
3.84TB66.827 TiB74.357 TiB66.827 TiB74.357 TiB60.77 TiB70.428 TiB
7.68TB133.778 TiB148.838 TiB133.778 TiB148.838 TiB121.665 TiB140.981 TiB
15.36TB267.694 TiB297.816 TiB267.694 TiB297.815 TiB243.466 TiB282.099 TiB
30.72TB535.526 TiB595.77 TiB535.526 TiB595.769 TiB487.069 TiB564.337 TiB
61.44TB1.046 PiB1.164 PiB1.046 PiB1.164 PiB974.262 TiB1.102 PiB
122.88TB2.092 PiB2.328 PiB2.092 PiB2.328 PiB1.903 PiB2.205 PiB

Calculation Walkthrough

ZFS RAID is not like traditional RAID. Its on-disk structure is far more complex than that of a traditional RAID implementation. This complexity is driven by the wide array of data protection features ZFS offers. Because its on-disk structure is so complex, predicting how much usable capacity you'll get from a set of hard disks given a vdev layout is surprisingly difficult. There are layers of overhead that need to be understood and accounted for to get a reasonably accurate estimate. I've found that the best way to get my head wrapped around ZFS allocation overhead is to step through an example.

We'll start by picking a less-than-ideal RAIDZ vdev layout so we can see the impact of all the various forms of ZFS overhead. Once we understand RAIDZ, understanding mirrored and striped vdevs will be simple. The process for calculating dRAID capacity adds a bit of complexity, but we'll cover that below.

This example will use 14x 18TB drives in two 7-wide RAIDZ2 (7wZ2) vdevs. It will generally be easier for us to work in bytes so we don't have to worry about conversion between TB and TiB.

Starting with the capacity of the individual drives, we'll subtract the size of the swap partition. The swap partition acts as an extension of the system's physical memory pool. If a running process needs more memory than is currently available, the system can unload some of its in-memory data onto the swap space. By default, TrueNAS CORE creates a 2GiB swap partition on every disk in the data pool. Other distributions may create a large or smaller swap partition or might not create one at all.

18 * 1000^4 - 2 * 1024^3 = 17997852516352 bytes

Next, we want to account for reserved sectors at the start of the disk. The layout and size of these reserved sectors will depend on your operating system and partition scheme, but we'll use FreeBSD and GPT for this example because that is what's used by TrueNAS CORE and Enterprise. We can check sector alignment by running gpart list on one of the disks in the pool:

root@truenas[~]# gpart list da1

Geom name: da1

modified: false

state: OK

fwheads: 255

fwsectors: 63

last: 35156249959

first: 40

entries: 128

scheme: GPT

Providers:

1. Name: da1p1

Mediasize: 2147483648 (2.0G)

Sectorsize: 512

Stripesize: 0

Stripeoffset: 65536

Mode: r0w0e0

efimedia: HD(1,GPT,b1c0188e-b098-11ec-89c7-0800275344ce,0x80,0x400000)

rawuuid: b1c0188e-b098-11ec-89c7-0800275344ce

rawtype: 516e7cb5-6ecf-11d6-8ff8-00022d09712b

label: (null)

length: 2147483648

offset: 65536

type: freebsd-swap

index: 1

end: 4194431

start: 128

2. Name: da1p2

Mediasize: 17997852430336 (16T)

Sectorsize: 512

Stripesize: 0

Stripeoffset: 2147549184

Mode: r1w1e2

efimedia: HD(2,GPT,b215c5ef-b098-11ec-89c7-0800275344ce,0x400080,0x82f39cce8)

rawuuid: b215c5ef-b098-11ec-89c7-0800275344ce

rawtype: 516e7cba-6ecf-11d6-8ff8-00022d09712b

label: (null)

length: 17997852430336

offset: 2147549184

type: freebsd-zfs

index: 2

end: 35156249959

start: 4194432

Consumers:

1. Name: da1

Mediasize: 18000000000000 (16T)

Sectorsize: 512

Mode: r1w1e3

We'll first note that the sector size used on this drive is 512 bytes. Also note that the first logical block on this disk is actually sector 40; that means we're losing 40 * 512 = 20480 bytes right there.

The Name: da1p1 section describes the swap partition on this drive. We can see it's 2GiB in size (as expected) and it starts at logical block address 128 (i.e., an offset of 512 * 128 = 65536 bytes). If we subtract this lost space from the expected partition size calculated above, we see it lines up with the actual on-disk partition size:

17997852516352 - 20480 - 65536 = 17997852430336 bytes

Before ZFS does anything with this partition, it rounds its size down to align with a 256KiB block. This rounded-down size is referred to as the osize or physical volume size of the disk in the ZFS code.

floor(17997852430336 / (256 * 1024)) * 256 * 1024 = 17997852311552 bytes

Inside the physical ZFS volume, we need to account for the special labels added to each disk. ZFS creates 4 copies of a 256KiB vdev label on each disk (2 at the start of the ZFS partition and 2 at the end) plus a 3.5MiB embedded boot loader region. Details on the function of the vdev labels can be found here and details on how the labels are sized and arranged can be found here and in the sections just below this (lines 541 and 548). We subtract this 4.5MiB (4x 256KiB + 3.5MiB) of space from the ZFS partition to get its "usable" size:

17997852311552 - 4 * 262144 - 3670016 = 17997847592960 bytes

Next up, we need to calculate the allocation size or "asize" of the whole vdev. We simply multiply the usable ZFS partition size by the vdev width here. We're not accounting for parity space just yet:

17997847592960 * 7 = 125984933150720 bytes

That's about 114.58 TiB. ZFS takes this chunk of storage represented by the allocation size and breaks it until smaller, uniformly-sized buckets called "metaslabs". ZFS creates these metaslabs because they're much more manageable than the full vdev size when tracking used and available space via spacemaps. The size of the metaslabs are primarily controlled by the metaslab shift or "ms_shift" variable with the target size being 2^ms_shift bytes. You can read more about metaslab sizing here.

ZFS sets ms_shift so that the quantity of metaslabs is under 200. ms_shift starts at 29 and grows as high as 34. Once ms_shift is 34, it doesn't grow any larger but instead the metaslab count grows beyond 200. 2^17 or 131,072 is the cap on the metaslab count (or ms_count); after that cap is hit, ZFS allows metaslabs to grow larger than 16 GiB. You won't hit this cap until your vdev allocation size is at least 2^17 * 16 GiB = 2 PiB. Again, that's the size of an individual vdev, not the whole pool; you aren't going to run into this unless you put more than 125 18TB disks in a single vdev (which is actually possible with dRAID). If you do exceed 131,072 metaslabs, ZFS will increase the ms_shift value until you're back under it again. OpenZFS can handle metaslab shift values up to 64.

On the other hand, the "cutoff" for going from ms_shift = 34 down to ms_shift = 33 is really pretty small, 1,600GiB or 1.5625TiB. In other words, unless your vdevs are smaller than 1.5625TiB, your pool's ms_shift value will be 34. For our example, asize is well over 1.5625TiB so we have ms_shift = 34.

Once we have the value of ms_shift we can easily calculate the metaslab size by doing 2^ms_shift.

2 ^ 34 = 17179869184 bytes

With ms_shift = 34, the metaslab size will be 16GiB. We can note that if ms_shift was 33, the metaslab size would be 8GiB; the metaslab size gets cut in half each time ms_shift decreases by 1. We now need to figure out how many full 16GiB metaslabs will fit in each vdev, so we calculate asize / metaslab_size and round down using the floor() function (the 16GiB metaslab size is represented in bytes below):

floor(125984933150720 / 17179869184) = 7333

This gives us 7,333 metaslabs per vdevs. We can check our progress so far on an actual ZFS system by using the zdb command provided by ZFS. We can check vdev asize and the metaslab shift value by running zdb -C $pool_name and we can check metaslab count by running zdb -m $pool_name. Note on TrueNAS, you'll need to add the -U /data/zfs/zpool.cache option (i.e., zdb -U /data/zfs/zpool.cache -C $pool_name and zdb -U /data/zfs/zpool.cache -m $pool_name).

root@truenas[~]# zdb -U /data/zfs/zpool.cache -C tank

MOS Configuration:

version: 5000

name: 'tank'

state: 0

txg: 11

pool_guid: 7584042259335681111

errata: 0

hostid: 3601001416

hostname: ''

com.delphix:has_per_vdev_zaps

vdev_children: 2

vdev_tree:

type: 'root'

id: 0

guid: 7584042259335681111

create_txg: 4

children[0]:

type: 'raidz'

id: 0

guid: 2993118147866813004

nparity: 2

metaslab_array: 268

metaslab_shift: 34

ashift: 12

asize: 125984933150720

is_log: 0

create_txg: 4

com.delphix:vdev_zap_top: 129

children[0]:

type: 'disk'

... (output truncated) ...

root@truenas[~]# zdb -U /data/zfs/zpool.cache -m tank

Metaslabs:

vdev 0 ms_unflushed_phys object 270

metaslabs 7333 offset spacemap free

--------------- ------------------- --------------- ------------

metaslab 0 offset 0 spacemap 274 free 16.0G

space map object 274:

smp_length = 0x18

smp_alloc = 0x12000

Flush data:

unflushed txg=5

metaslab 1 offset 400000000 spacemap 273 free 16.0G

space map object 273:

smp_length = 0x18

smp_alloc = 0x21000

Flush data:

unflushed txg=6

... (output truncated) ...

To calculate useful space in our vdev, we multiply the metaslab size by the metaslab count. This means that space within the ZFS partition but not covered by one of the metaslabs isn't useful to us and is effectively lost. In theory, by using a smaller ms_shift value, we could recover a bit of this space, but we would end up using a lot more system memory so it's not really worth it. With 7,333 metaslabs at 16GiB per metaslab, we have:

17179869184 * 7333 = 125979980726272 bytes

That's about 114.58 TiB of useful space per vdev. If we multiply that by the quantity of vdevs, we get the ZFS pool size:

125979980726272 * 2 = 251959961452544 bytes

We can confirm this by running zpool list:

root@truenas[~]# zpool list -p -o name,size,alloc,free tank

NAME SIZE ALLOC FREE

tank 251959961452544 1437696 251959960014848

The -p flag shows exact (parsable) byte values and the -o flag determines what properties will be displayed.

Note that the zpool SIZE value matches what we calculated above. We're going to set this number aside for now and calculate RAIDZ parity and padding. Before we proceed, it will be helpful to review a few ZFS basics including ashift, minimum block size, how partial-stripe writes work, and the ZFS recordsize value.

Hard disks and SSDs divide their space into tiny logical storage buckets called "sectors". A sector is usually 4KiB but could be 512 bytes on older hard drives or 8KiB on some SSDs. A sector represents the smallest read or write a disk can do in a single operation. ZFS tracks disks' sector size as the "ashift" where 2^ashift = sector size (so ashift = 9 for 512 byte sectors, 12 for 4KiB sectors, 13 for 8KiB sectors).

In RAIDZ, the smallest useful write we can make is p+1 sectors wide where p is the parity level (1 for RAIDZ1, 2 for Z2, 3 for Z3). This gives us a single sector of user data and however many parity sectors we need to protect that user data. With this in mind, ZFS allocates space on RAIDZ vdevs in even multiples of this p+1 value. It does this so we don't end up with unusable-small gaps on the disk. For example, imagine we made a 5-sector write to a RAIDZ2 vdev (3 user data sectors and 2 parity sectors). We later delete that data and are left with a 5-sector gap on the disk. We now make a 3-sector write to the Z2 vdev, it lands in that 5-sector gap and we're left with a 2-sector gap that we can't do anything with. That space can't be recovered without totally rewriting every other sector on the disk after it.

To avoid this, ZFS will pad out all writes to RAIDZ vdevs so they're an even multiple of this p+1 value. By "pad out" we mean it just logically includes these extra few sectors in the block to be written but doesn't actually write anything to them. The ZFS source code refers to them as "skip" sectors.

Unlike traditional RAID5 and RAID6 implementations, ZFS supports partial-stripe writes. This has a number of important advantages but also presents some implications for space calculation that we'll need to consider. Supporting partial stripe writes means that in our 7wZ2 vdev example, we can support a write of 12 total sectors even though 12 is not an even multiple of our stripe width (7). 12 is evenly divisible by p+1 (3 in this case), so we don't even need any padding. We would have a single full stripe of 7 sectors (2 parity sectors plus 5 data sectors) followed by a partial stripe with 2 parity sectors and 3 data sectors. This will be important because even though we can support partial stripe writes, every stripe (including those partial stripes) need a full set of p parity sectors.

The last ZFS concept we need to understand here is the recordsize value. The ZFS recordsize value is used to determine the largest block of data ZFS can write out. It can be set per-dataset and can be any even power of 2 from 512 bytes up to 16MiB (values above 1MiB require changing the zfs_max_recordsize kernel module parameter). The default recordsize value is 128KiB. For capacity estimation purposes, ZFS always assumes a 128KiB record. It's important to note that this recordsize value only considers user data, not parity or padding. It's also worth mentioning that block sizes in ZFS will vary based on how much data needs to be written out and the recordsize value enforces the upper limit of that block size, but again, ZFS assumes all 128KiB records for space calculation purposes, so we're going to use that value going forward.

You can read more about ZFS' handling of partial stripe writes and block padding in this article by Matt Ahrens.

Getting back to our capacity example, we have the minimum sector count already calculated above at p+1 = 3. Next, we need to figure out how many sectors will get filled up by a recordsize write (128KiB here).

128 * 1024 / 4096 = 32 sectors

Our stripe width is 7 disks, so we can figure out how many stripes this 128KiB write will take. Remember, we need 2 parity sectors per stripe, so we divide the 32 sectors by 5 because that's the number of data sectors per stripe:

32 / (7-2) = 6.4

We can visualize how this might look on the disks (P represents a parity sectors, D represents a data sectors):

As mentioned above, that partial 0.4 stripe also gets 2 parity sectors, so we have 7 stripes of parity data at 2 parity sectors per stripe, or 14 total parity sectors. We now have 32 data sectors, 14 parity sectors, adding those, we get 46 total sectors for this data block. 46 is not an even multiple of our minimum sector count (3), so we need to add 2 padding sectors. This brings our total sector count to 48: 32 data sectors, 14 parity sectors, and 2 padding sectors.

With the padding sectors included, this is what the full 128KiB block might look like on disk. I've drawn two blocks so you can see how alignment of the second block gets shifted a bit to accommodate the partial stripe we've written. The X's represent the padding sectors.

This probably looks kind of weird because we have one parity sector at the start of the second block just hanging out by itself, but even though it's not on the same exact row as the data it's protecting, it's still providing that protection. ZFS knows where that parity data is written so it doesn't really matter what LBA it gets written to, as long as it's on the correct disk.

We can calculate a data storage efficiency ratio by dividing our 32 data sectors by the 48 total sectors it takes to store them on disk with this particular vdev layout.

32 / 48 = 0.66667

ZFS uses something similar to this ratio when allocating space but in order to simplify calculations and avoid multiplication overflows and other weird stuff it tracks this ratio as a fraction of 512. In other words, to more accurately represent how ZFS "sees" the on-disk space, we need to convert the 32/48 fraction to the nearest fraction of 512. We'll need to round down to get a whole number in the numerator (the top part of the fraction). To do this, we calculate:

floor(0.66667 * 512) / 512 = 0.666015625 = 341/512

This 341/512 fraction is called the vdev_deflate_ratio and it's what we'll multiply the pool size calculated above by to get usable space per vdev after parity and padding. You can read a bit more on the vdev_deflat_ratio here.

251959961452544 * 0.666015625 = 167809271201792 bytes

The last thing we need to account for is SPA slop space. ZFS reserves the last little bit of pool capacity "to ensure the pool doesn't run completely out of space due to unaccounted changes (e.g. to the MOS)". Normally this is 1/32 of the usable pool capacity with a minimum value of 128MiB. OpenZFS 2.0.7 also introduced a maximum limit to slop space of 128GiB (this is good; slop space used to be HUGE on large pools). You can read about SPA slop space reservation here.

For our example pool, slop space would be...

167809271201792 * 1/32 = 5244039725056 bytes

That's 4.77 TiB reserved... again, a TON of space. If we're running OpenZFS 2.0.7 or later, we'll use 128 GiB instead:

167809271201792 - 128 * 1024^3 = 167671832248320 bytes = 156156.5625 GiB = 152.4966 TiB

And there we have it! This is the total usable capacity of a pool of 14x 18TB disks configured in 2x 7wZ2. We can confirm the calculations using zfs list:

root@truenas[~]# zfs list -p tank

NAME USED AVAIL REFER MOUNTPOINT

tank 1080288 167671831168032 196416 /mnt/tank

As with the zpool list command, the -p flag shows exact byte values.

167671831168032 + 1080288 = 167671832248320 bytes = 156156.5625 GiB = 152.4966 TiB

By adding the USED and AVAIL values, we can confirm that our calculation is accurate.

Mirrored vdevs work in a similar way but the vdev asize is just a single drive's capacity (minus ZFS labels and whatnot) and then the vdev_deflate_ratio is just 512/512 or 1.0. We skip all the parity and padding sector stuff but we do still need to account for metaslab allocation and SPA slop space.

dRAID Capacity Calculation

Capacity calculation for dRAID vdevs is similar to that of RAIDZ but includes a few extra steps. We'll run through an abbreviated example calculation with 2x dRAID2:5d:20c:1s with 8TB disks (no swap space reserved this time).

dRAID still aligns the space on each drive to a 256KiB block size, so we go from 8000000000000 bytes to 7999999967232 bytes per 8TB disk:

floor(8000000000000 / (256 * 1024)) * 256 * 1024 = 7999999967232 bytes

From there, we reserve space for the on-disk ZFS labels (just like in RAIDZ) but we also reserve an extra 32MiB for dRAID reflow space which is used when expanding a dRAID vdev. Details on the reflow reserve space can be found here.

7999999967232 - (256 * 1024 * 4) - (7 * 2^19) - 2^25 = 7999961694208 bytes

dRAID does not support partial stripe writes so we go through several extra alignment operations to make sure our capacity is an even multiple of the group width. Group width in dRAID is defined as the number of data disks in the configuration plus the number of parity disks. For our configuration, that's 5 + 2 = 7 disks. dRAID allocates 16MiB of space from each disk in the group to form a row (details here), so we can multiply the row height (which is always 16 MiB) by the group width (7) to get the group size:

7 * 16 * 1024^2 = 117440512 bytes

First we align the individual disk's allocatable size to the row height (again, always 16 MiB):

floor(7999961694208 / (16 * 1024^2)) * 16 * 1024^2 = 7999947014144 bytes

To get the total allocatable capacity, we multiply this by the number of child disks minus the number of spare disks in the vdev:

7999947014144 * (20 - 1) = 151998993268736 bytes

And then this number is aligned to the group size which we calculated above:

floor(151998993268736 / 117440512) * 117440512 = 151998909382656 bytes

This is the allocatable size (or asize) of each of our two dRAID vdevs. We go through the same logic as RAIDZ used to determine the metaslab count but each metaslab gets its size adjusted so its starting offset and its overall size lines up with the minimum allocation size. The minimum allocation size is the group width times the sector size (or 2^ashift). For our layout that is:

7 * 2^12 = 28672 bytes

This represents the smallest write operation we can make do our layout. To align the metaslabs, ZFS iterates over each one, rounds the starting offset up to align with the minimum allocation size, then rounds the total size of the metaslab down so its evenly divisible by the minimum allocation size. Detail on dRAID's metaslab initialization process can be found here and the code for the process is simplified and mocked up below:

group_alloc_size = group_width * 2^ashift

vdev_raw_size = 0

ms_base_size = 2^ms_shift

ms_count = floor(vdev_asize / ms_base_size)

new_ms_size = []

for (i = 0; i < ms_count; i++)

{

ms_start = i * ms_base_size

new_ms_start = ceil(ms_start / group_alloc_size) * group_alloc_size

alignment_loss = new_ms_start - ms_start

new_ms_size[i] =

floor((ms_base_size - alignment_loss) / group_alloc_size) * group_alloc_size

overall_loss = ms_base_size - new_ms_size[i]

vdev_raw_size += new_ms_size[i]

}

Each metaslab will get a bit of space trimmed off its head and/or its tail. The table below shows the results from the first 20 iterations of the above loop:

As you can see, we'll end up with some lost space in between many of the metaslabs but it's not very much (at worst, a few gigabytes for multi-PB sized pool). You'll also notice that the metaslab size isn't uniform across the pool; that makes it very hard (maybe impossible) to write a simple, closed-form equation for vdev_raw_size without a loop or summation. Note that for some dRAID topologies, the metaslabs just happen to line up without any shifting and every metaslab is exactly 2^ms_shift and we don't lose any extra space, but that's not very common. The Fast dRAID Calculation option in the calculator above assumes a uniform metaslab size and thus skips the loop resulting in a much faster (but slightly inaccurate) calculation.

If you're inclined, you can validate this non-uniform metaslab sizing using zdb -m tank. If you pull the offset listed with each metaslab and convert it from hex to decimal, you can calculate its size. You'll see the size for each metaslab varies slightly as the above table shows. zdb -m also lists the metaslab size, but it rounds it to the nearest tenth of a GiB which is not a fine enough resolution to see the tiny sizing variations.

As a side note, we could theoretically shift the first metaslab's offset to align with the minimum allocation size and then size it down so its overall size was an even multiple of the minimum allocation size and all subsequent metaslabs (each sized down uniformly to be an even multiple of the min alloc size) would naturally line up where they needed to with no gaps in between. In order to do this, however, the OpenZFS developers would need to add dRAID specific logic to higher-level functions in the code; they opted to keep it simple. The amount of usable space lost to those gaps between the shifted metaslabs really is negligible though, like on the order of 0.00004% of overall pool space.

Once we have the vdev_raw_size, we need to calculate the deflate ratio for our dRAID vdevs. This follows a very similar process to RAIDZ deflate ratio calculation but it's a bit simpler because we don't need to account for partial stripe parity sectors (because we don't have any partial stripes!)

We start with the recordsize (which we'll assume is the default 128KiB) and figure out how many sectors (each sized at 2^ashift) it takes to store a block of this size:

128 * 1024 / 2^12 = 32 sectors

Then we figure out how many redundancy groups this will fill by dividing it by the number of data disks per redundancy group (not the total group width, just the data disks; parity disks don't store data!):

32 / 5 = 6.4

We can't fill a partial redundancy group so we round up to 7. We then multiply this by the redundancy group width (including parity) to get the total number of sectors it takes to store the 128KiB block:

7 * 7 = 49

This configuration consumes 49 total sectors to store 32 sectors worth of data, giving us a ratio of

32 / 49 = 0.6531...

Just like with RAIDZ, we round this down to be a whole fraction of 512 to get the deflate ratio:

floor( (32 / 49) * 512 ) / 512 = 0.6523...

We end up with 334/512 (or 0.6523...) as the deflate ratio for this configuration. We multiply the vdev_raw_size by the vdev count and the deflate ratio to get our pool usable size before slop:

151990085230592 * 2 * 334/512 = 198299564324288 bytes

We compute slop space the same as we did above (we exceed the max here so we use 128 GiB) and remove that from our usable space to get final, total usable for this pool:

198299564324288 - (128 * 1024^3) = 198162125370816 bytes

We can validate this with zfs list:

jfr@zfsdev:~$ sudo zfs list -p tank

NAME USED AVAIL REFER MOUNTPOINT

tank 4545072 198162120825744 448896 /tank

By adding the values in USED and AVAIL, we can confirm our calculations are accurate:

4545072 + 198162120825744 = 198162125370816 bytes = 184552.86 GiB = 180.23 TiB

Closing Thoughts

The RAIDZ example used VirtualBox with virtual 18TB disks that hold exactly 18,000,000,000,000 bytes. Real disks won't have such an exact physical capacity; the 8TB disks in my TrueNAS system hold 8,001,563,222,016 bytes. If you run through these calculations on a real system with physical disks, I recommend checking the exact disk and partition capacity using gpart or something similar.

We took a shortcut with the dRAID example because we didn't need to include swap space. We used truncate to create sparse files to mimic 8TB disks and then losetup to mount those files with 4KiB apparent sector size. The syntax for the dRAID example is below:

sudo truncate -s 8TB /var/tmp/disk{0..39}

/sbin/losetup -b 4096 -f /var/tmp/disk{0..39}

zpool create tank -o ashift=12 draid2:5d:20c:1s /dev/loop{0..19} draid2:5d:20c:1s /dev/loop{20..39}

It's worth noting that none of these calculations factor in any data compression. The effect of compression on storage capacity is almost impossible to predict without running your data through the compression algorithm you intend to use. At iX, we typically see between 1.2:1 and 1.6:1 reduction assuming the data is compressible in the first place. Compression in ZFS is done per-block and will either shrink the block size a bit (if the block is smaller than the recordsize) or increase the amount of data in the block (if the block is equal to the recordsize).

We're also ignoring the effect that variable block sizes will have on functional pool capacity. We used a 128 KiB block because that's the ZFS default and what it uses for available capacity calculations, but (as discussed above) ZFS may use a different block size for different data. A different block size will change the ratio of data sectors to parity+padding sectors so overall storage efficiency might change. The calculator above includes the ability to set a recordsize value and calculate capacity based on a pool full of blocks that size. You can experiment with different recordsize values to see its effects on efficiency. Changing a dataset's recordsize value will have effects on performance as well, so read up on it before tinkering. You can find a good high-level discussion of recordsize tuning here, a more detailed technical discussion here, and a great generalized workload tuning guide here on the OpenZFS docs page.

Please feel free to get in touch with questions or if you spot any errors! jason@jro.io

If you're interested in how the pool annual failure rate values are derived, I have a write-up on that here.

Calculation Values -

(Click table cells above to freeze/unfreeze)

7-wide RAIDZ2 (18 TB disks)
3 vdevs (24 disks, 3 spares)
disk_size18
vdev_width7
parity_level2
raid_typez
vdev_count3
disks_in_pool21
spares_count3
pool_raw_capacity378000000000000
zfs_partition_size18000000000000
vdev_label_size262144
boot_block_size4194304
zfs_usable_partition_size17999994757120
zfs_osize17999994552320
vdev_asize125999961866240
metaslab_shift34
ms_count_max131072
highbit30
metaslab_size17179869184
ms_count7334
vdev_raw_size125997160595456
zfs_pool_size377991481786368
sector_size4096
recordsize_bytes131072
min_sector_count3
num_data_sectors32
data_stripes6.4
data_stripes_rounded7
num_parity_sectors14
data_plus_parity_sectors46
total_sector_count48
reduction_ratio0.6666666666666666
vdev_deflate_ratio0.666015625
vdev_usable_capacity83916077662208
pool_usable_pre_slop251748232986624
slop_max137438953472
slop_min134217728
slop_computed7867132280832
slop_actual137438953472
pool_usable_bytes251610794033152
pool_usable_gib234330.8125
pool_usable_tib228.83868408203125
pool_usable_pib0.22347527742385864
pool_usable_eib0.00021823757560923696
pool_usable_gb251610.794033152
pool_usable_tb251.610794033152
pool_usable_pb0.251610794033152
pool_usable_eb0.000251610794033152
storage_efficiency66.56370212517248
simple_capacity245.56356947869062
zfs_overhead6.81081702475852

< back to main

------MultipartBoundary--DwdtyI9AO66QoDvx27EmnIMwQTN7Hrazyjsby40kC6---- Content-Type: image/png Content-Transfer-Encoding: binary Content-Location: https://jro.io/capacity/table1.png PNG  IHDRFzEsRGBgAMA a pHYsodaiTXtSnipMetadata{"clipPoints":[{"x":0,"y":0},{"x":838,"y":0},{"x":838,"y":446},{"x":0,"y":446}]}^?8IDATx^sɕDȶJKq!n.Ve-^( 5ߊŞEsɫkVLT,Z]IE 3ڬ4.S9#?#"2ʲ/p?/G5F@AAaY0   -VEAAAكB\^ixwuuxήa0q#wWu*kph8]?OKuSLR[Ug[rQX_<̹m9l:ic:S/}<ZfeO^{= ݋ؖ)#~վIcYKv[ܦ]Lcb%#y_߯_aflϓaw,s\NَMѯA+ڣ-o2*eroߧh|%ޫsY~q,h}'+:r)H/02]'mn;ec?2zSOMQO&[=5ѡOSD >l@q}["H1Y0=0cʁQ6T,6#y[?wӕ:Vw`KU7ruRׇ5x@U yo_V}%'<;ߑy]>%`??eJxjwm7!DpU9*fu> Vݮ_v?EY=0UMGEQ.4 9pFIǡitZ<3ϕ6R;WLŗ4? */#Ec^.N#tpHu\)mf.0@c/my/sVI vuoڏ|1lф:R'˅1f#mDȿp#zɜ~g izΛ?311`cX-|#mh~Տ<1D?yD>ҁ<1R6l#XD͆   с=(4Oţt OF3ۈ~/  0HAAGF   =20AAa9CiE[3.8^K50x3f~zvߙㆣ2l?G.ߒ#ؽ=WN73cp_6{&xſ [ iEڰjL;LXK)QO`;evt7ta)o+dA5>MoG36(-LJPḿ ή{` aZqǴ{4te Z]Vޥo| TUft]m}&8~ǸN/fpm$5E(k?jFwmi}˶?yS9M7*fKU/7=ا6Sԋ_۽Vק{ftW':>t7s?Es ej1w]+H>a镱iG[T[xp['Q2ޖk(>!Y޸ LaQJa6o}Gi"XARH*l>GOW?6}}:w_M4xחotbet~Qu:nc/'c#=r*䟓6k\?[Jws9ݫf?C\2G+C}~f?맰w.A/H{ aF1W{څjoy)**ڿT6ܿiٵGpr:8n{]?tCi2&F_t^f$;L(]ǜv>e\\?4=e4ӃayOw|>ZtYNjbw}pqU۫zQfNP?LLH{T[0r:hƒJsl sX´f3>ބ]r иמKh[GycLJ~3.~ʝ| kҕo܇6<|ato {§y`J>tNN9XG;0_߹AOR"Gw> H nDI.O{r>{珿c'WIȾw}G8 e|m)8er22I.s_?=Ż{сOݔK ˦qp_6z9LL8|s` o(,?q<|;C seFǤ,A8-ҹ#l &}I~1g+{_呹EؼЙFw ΩO{5}ԲxR.G6}gѩKhiG=7sgY{uP o`}woV4EdF8#'ގn.Mw`6k .B_nCc޸Ɠ5fH[?ݟkn9>oWzPt=X;,f|vQ6'&$:l>z'}=]ӗGkt͗ eKc/s[isv.A3s=| ]2^Db:nS6级a$}%tU2?mѲTge5tV w\˷ `po?蕡./_E'VN$~_N~)N4k+PC_Du.tU^ ҒRPTV{)[E?R]mMը|1|=? ඳ=ށ*, ~o]t-< M@Gg&0 ObiT6켙DOj>[pF'>tF2m'cytЉW5P4 xM8q2i괣MBR'Q:+>F3ۈ~/9/   4  0HAAGF   =AAA *ݔ #xtB f#mDȿpR:AAA  0HAAGF   =g30zۻpdvjLoϸ [}^bi8nE.3 GϻeZZ(|K`Wi%4"/UW^M:v\/sULjLg| %T\zֿ΁3hcמ1HZژ[ |?{iz$YmL 1&ϴ,rtz \8v~YŸf9\ *S|AZ^&GNSU k*nۘh(,6'cأC!*;-qǴ{4tezϿVzw[l>_E婠|1]W/Gߣ N/c[;Ԑҿ+k)2=D!GbْDM >%U{F|qΣ,os:zm't?Q7mL2=޴1k6VvZ^"Fa3myrÉOόd6emi֪?OvJ ~uf-@Ť|oVӠ 7+:y_O_1kxeEiAejp['QU+ q…޸OiF J6o}!*юeį_X_s7MS7cPN#u~q;Dmz%C8TĽ1~a}ΝUUL}J>310 p;ә'Ǒ$1n e\~O'o٩(rt,_}D7QPk Ǵ1OPqY+q*i~UT[TvR/< "y123zik-ne4ֿ>VYjR&k`"'tKn0={Gӵ}[KbeBGy_`%e#/:<;jWrY !6/E6_E׀7>R:^COkZ:o*mxv`9z6Wp9ho$_r:waIf0Py܌6ԩ>aU} \e׾>M ]eCCuVEOic7o39֟X;"mnS>ُ3^@sJF\k;Mђ)Yq|SZ6d+@'yG8j?ϻ/X_q ޲u7DLg4xvTU?\%g?v2ozKоh)W3:QB^߸:*w6P+Iu߸mxD.c'ӿvy5h 0xҝ=aX#}`C*]I-nʥ_݄e#(Iz`2恧}X DCa |+ͮ`ʗGb!:=/Qށeyeް8?b'HYAU\Ęq{:OfVƐk6ä_ۘ|зPcla>EC1s8J/LۜiL:utY[LD(H Gawjrd؂[˟6{__I][L3M7D`1v'z:E}}|문6&L:r6>^0(߽=E|{kc41{GژJHfa/)cU^|IڹY,'7%YM¾1!s}:vB$Ҳ=(7},ߥiRPkj?Qvt}8qk&U$72=vTn_O  Kaf7IF0B!)gc~E޵~ы#iJgL'yrVKgɸf'1F\DQLob9EzQmc_祍gl駑U.߹۟OoSlI̤jqik~9 m.ϲ_YgĖ_8f䌖&%5Gdz3*ѿ>)O?{t7tű =L<1 uV03k1\tZ>ӱg'[|)1O<՞wV3 [ˡ&C$R:(&O¾`#+p`86u~^ٲZ6gM5$Q*Y91 ]AFgH<.4WOӀI96Ƶӵ1=|P6sƤ,bz6UX۳ZUZMM,.rxV#-o?S1`\4|`Rxl DGs(`G|و~f"cq_AAAh>20AAa   s AAA{/    U)AGs(WwF3ۈ~/i YJ'  ##AAA  0HAAlFwu{.vZ-zv ˔W,\ǷBHׅwyL딹"_ #o;e82ȷٸvCDO]ח'i~U`wn0)g/Z0øre띿GirRzIgOƑ!o O~>q}:e]_?oa$Bq~_b m~TՆ9YC N]O\M4qO>[.uvo+bn-2;r ~]*qV5}m cۜaj|h0W Ȇotny=Z]Vޥo| TUft]m}&8~*?s Z> ]Z[z6h&򼋶I7̰[嵎]{-3'ܶ2 n^)̎O~uVv\eV^>31,km5ݤl}Vy)D-۷s[E'iz6 mDP=]HύmJzj[6}9k 0O%V`\2P1=xmŃH/mq2hLh\3_lvJqآe:A:O[' Ti\o .B V{c>J6op+lo6p!"q WyTe g6&}=#q~OPOW?6i_P}l/ O?C$/FV_|Z3P>m m> 1ާ&dӺ7PĘEtKn0={Gӵ}[KbeBGy_`%~Fm02玾ڃ.\V{C8xpKQW5MϸԾή=xũp#}yw{/:kJ=v~;ooFf'ۿ g& ,o6?m::m=W;_#p/J׶Qʸ(֢'/$ͦ<_&o f6-Gj0kcZ s+nWmnho$ľߔN;?`}2X9gtM9j?E,ՇY=`})dzݴgW$,4x=&{fTk6!En$UI+hF}>T}Q9U!1kG:iV7is^j̔'e!'qcay<{[?Бͩ|C{vͬ;k)Hyf )]-䎿  3'MEDT?7mLӄm]uN?c)'յdyksUtSGB%"CfoΑD0 L_bQ>vaɗ;Ul3S}=f|LjKk| |PhTmô,{C]gi_Z8Ҡ}lzEr$[Ty-US̪$fBu]WJKa0GKa|/c'uX4/f^62 w +_bŋG{o:OU?vg%X@O\}.>Y*_p>`*ЎK*Ͱke{-J`~Eq_:_/,C]=Ю?Q/Bz/Q.=0e_|N,|m^E9,I?>(l./VE2=xR5:DA,'6> w#3!gqMvŹJ TI1c ?Ck c_k"y|tn?,O?l>yݦ}AA*&ŬN7`عk>p(UcPt;}l_Й9b 913L 3GθeToV 7۔:ԁFb#S ND4zTfW@,*?7oN'L=1z3yŠbߔqV򘶙 lb2&c$WQ8ngs4MRZgL.%6,"21~MO*Sꉑet꿗gmL|H\_ehI5pc"sbMJ꽮|Aɷ74}bTn:'OКZ;Cx 4/pLLL5[\@MꉞTI ')vHںut|} ҥ7 z!B=}Ik>mObhy֯Y/Ju9XmA:|_(8OԲ>_hڰ{}/]Iߦg_u@&;#}ԥQ>~hs|:u53@rFKXixjƋHqwVI#YvOrTӽw6_[(-;F3T}9~ OMZ>F\޵lƄpKwgb\;om֬vg2OF`& ͚ED1Lò]i*^RDmuto~-c'9-'mhc&%R׬y bzw9IKuźORDˬl-fc1Ubmw\n_njgCavE^>|;OcGY$biB]<՞wV3 [P3|/EmWEٓѓcW~] MN,l=?QٴY.Qȕy\Yl2LJ9A\MA6>:\yJ;uzOZT݆yv[wiv2ׅ$ViڴŵmW}M9mE1FZ9P6}ĺ\.γ0cϧl[fSh <"G?+>F3ۈ~/i s*   B󑁑   s AAA{d`$  ||AAAa_M <"G@#m6F{HlR:AAA  0HAAGF   =g30zۻpdvjLoϸ [}^bi8nE.3 GϻeZZ(|K`W)égD&˨.{F䶥Z;ML~Ixrqʋ/0`9a̳2m*.yqdl Y6oSz{b!{Z[ bm,x$-;NcbWL ?4?O=Nh?y7]E9PX)E,B YxrpJ46(-LJPḿ ή{`ڷqǴ{4te Z]Vޥo| TUft]m}&8~F~Y?jɇ'aϤN܎ 6Yel~O}|}q}(O%c{)Ƴs_GyPgžKTV߲m+g/D1|,Tִq>SLV-»'=[m~Di$ V?J}}nZOަe[|4J~ʶUJAweK3~fom'mm2ߜ]9&)L>jY22VrzeMGUiJ({[PR` <V{^ĹJJ3.:R7~oQCE6t-Oو_ U晫o %U@/%9{NNc߈y,'Mɠt0H;_!w'ǑD1|6/C҃82m̞tJPm]ץmDXw]j1m;rRGvZv&-gէq3: }Ubh%0u^I]xn ;ilߓ1QPuDT-9UeOwo .#!> mSXу; #/:<R:^COkgᗛ[+d =뺶w3/7#X&ߍКCmvI#uIɝSEIخ_fM o{BJJLq5o5G>~C*a.zgn/61>BۯgS~ض9byb7AeCk{g%>1(9̀N50ZQ|?>ܽaKl&9Ǜٽ:ޗSt w66-!lr w6+ɦ}m#wFư_n>3OSY3e{G=\2[k.A^y}Wl''xTu(_cۖ W”w;ZaЃS߹O%Aq;˼q>{hΕ\uxjF94YH;I2{N(. Cs?6J[SNPGR-Tfӽttt %#>@jK$vs:@b@[92N}srRvvWOOj^tS7҃Cn² TWegk&co5هO9t>`Ѽ,ͷz6(1|y/a0Gw&ASQCUuXxQqdRЬ#ԌJtxaty = :pn&[^, ?%6^jGymT>` :u,w`Q͎?Kؑ?id\}*.ugI#|w\{b``c]Tm m1o-|?'4VN?1HM;* `75鵗| XQm[l}+8~Ώ9|:NsIvFׅˬ&ʫl+͚ UP:wHޞ~b6dA%)Lb.xd@ݔob~dEg}ަh{ǔnmL T} yx3e۱P&MbZ 1.6xCɶN\c:p$JtVgFvadQ麕C"rvyp8'F`ktr-Q~>Cxl>gHK2h f/\eU9{veVas^y&e}ԧY!L٣.ϰN򴌖aEp|$Փ"r},=}ڟKRBty轊=3+O]t`ul0M)|Ǐ}V˜Dz9^8(yL pb?Uنc &\J2i~m4U6KKch)4Oţtf#mD͆9NAAHAAGF   =20AAaq>   0O؏/WOţt _R6l#X}l6?d)   s AAA{d`$  ##AAA枳ށ]82Cie&g\->/SR^[sNSr| "]vߙㆣ2S|-X\%G{۫2u)e;)p{!IM}Jr~eZ~u=^RuO_; +'7iSqgtCdoI\[t{yZhIO7cf*, Ӗoqt̠VC vd~Nn!zȶn6PQOVtkّӔu/cXo 켢?㶍6856(-LJPḿ ή{`l88?@g1v0Mo<=G~0a~eż]>@eQefy*(_{Lo8M]΃Zv8&M>_+η8FicT8vf_)@SWI Oξ<[L>'lEclN:L+ǰ,n=O#ͭWf@a?Ҫ|e}6|;2PYV|K!sATgڏMg5:}q{Em<ΰn&ù'CԶ}>]Us͵:>k)'jscIW-󸝈 %Fy\l<_xaZf^?E;V>@UNjos Ч4Pb@)mnbEv4WvJ"y?rbQ6YA#7 Y ,28].6qԷҿtv ,Q-gm;#O+|Ik5 mg|m> 1e)}Y;xtKn0={Gӵ}[KbeBGy_`%~Fm02玾ڃ.\V{C8xpKQW5MϸԾή=xũp#ifܽa>M,q/_>ބ]X2G|N'sF(]˲kDQ%#TCmo3< ozсiF_t%^7Nฺ CASxJUMۿcqӮ{9Ow\OWFS˶ϴOPݟLv}Kt>jm-[wӞ<,__CrҍTW$Kl&u.ASfuT%?>cq tT> Àl}d*_T0~ۆG"aw_y2R.9-Ejg $+^: t W66$O  ׂHZ>aCmb͖7Myrr/w8z)LKM᜿JzR ;r!W7aj4JRy)c'*h^[lveV<5Dץ8@NZն$l25=9x0;tz:6ċuxOtys_nlfҾY uR ?~ྠpnsciU\D?L'<%}pqOE>Jr-g{ >Ye;П=!T{a诏Zet+doclݤQZ6dtn?,O?l>^#\<ŬNݓvq1(>ֿ3rĊlsbk7պ:riC^Iי5a9z:d6 u.8_ߑisfhN^Z>yl@]ILy!Յ競`K*旕BÝ꬧FL' zLj/bk8bߔ1i ;}&k4<{MM>1D]kWz޸55fH[?q{Cz˦$Ik^'FuG;>RG(dY~7~9S 9I g4t<┣}<6I#Yvht͗FJˎCt"UjNu9'*۱Gm fm љ ]xRB!v/{s?ɡt0Orf͚E$.fmc%Y9ug?Wߟy2ֶχE22eLNN2ڿ%|}VZ|B&m /iӨ4@,O7}]4pUVPe` m9r/|}yq˦\#&FZ؛2GC]ۘ^0o0gY}xZxoM~|. 6l#X}l6?t   GF   =20AAa   sAAAy~|AJ7%~|.ꎐB|و~f"c!KAAA{d`$  ##AAA  0n‘NE/3<2nAy t]麰7=i2Wkz-9^} edr:͵6=4}"Jo˗k'k>yJ>=OJ*.yqdwԏ]8WU`OTXu8nCD{=v=w8}C OWL*vPNӧ['&i?J[Le:X˶~|fcXEV<ˀvԯg'v[|Ʀt:7Ner\0$!wuҙcz߳_7%i̢QlaڬYe}V盋ZZ}s Bw|5^ܲ O}''Ͽ>կWWH>8Qf1 )LAg,ADn'= dw(gnS@6RuXm.=j}P"y1&7' ,(e4}ĔadQ+5n)w(Cx{kpQ qP]h(lܹ/H{ aFW{څjoy)**ڿT7ܿiٵGpr:8n{]?`_tM>W;_̣]mK[ګoF؄лQD(;C#sOaItgF;uA{s9ʸ("N6 g-?^k87~ :Iu>C߸3J{#׋_)\6ۈ6B1WϦjkγrUkf h fՈWyN3u=Ϸ3C~ꜝmhqJ[fUf+mZkQZ|\Th$V4%Isk˓WKVS>gvX#6%D3 Th6~"(9G爒;ɖMe{b;GzPmSv a/fma^ke{-s}_? l}J`y?u,'Ŭpp%#UqQ@ }xrgsdf}΋籘m^Fbɔ87^+\6UBE~T'81l.` u O}j#XX ηO5OʶO߾^dip,fu>pJ_Й9b 91O3L 3GθeToV H Gg,FF?sTgBEYR7<Mix#V&:ϔcL=1%{.⢾V2&ax311L í<<u DIu߃p׫qF 0_ɼ-o㧄I~*] gꉑedIMA}}Z*M5Y|.?}KO"i1㋁>1w1ZX?ΡuDi盇ph6d_ZTYo*'[vF0BH{4sj״k2q.λR}l2fYQCDp䗌jv|meD(fWd]kmL>_Я-ʷN'fxB q}Xm%Tue9sOWBz+x[I{>A.9`b#}ԥs9޸cHhiRROx1LɓF,ۧj9*u;/- E՜F?g+IzѺ:Mτz샮Mڎ;+Cixm Z52[{ xbT!iЩ7kV7tܘ &ak_g'] uğ(?Kd}b>oN<>lթ+VZnc&&c_';g?^ Rռ$v?1r|#Yh.c1Ub s*ib@_ܟeUy>Z۵OP@ }8Ds[ 0JFI o8:*iIQ|(x*="_g4ͷҡygP6G~^طlL@]ۜ&}Ѷ^?P'er^c6kga`wYi#A cʹ31x̓N^'ղ1XVNjw֟UOF_Hw E|kq^O T20AAa   s AAA{/    U)AGs(WwF3ۈ~/i YJ'  ##AAA  0HAAlFwu{.vZ-zv ˔W,\ǷBHׅwyL딹"_ #o;uym7^_n=&=ҤwN &BeO 3|ym􌞼=<5l Eak+϶)yMljx[TZŁ##C¦lZmk abW{է+}'*t|h2HEvڱ7sk8~qь ls2=J 9r8¸^1آwxw3vw;7ОΣL?0?>_ˊyջt-}6ʢTP͗QQ'ϙ"'eg\|ֳڕ{>n%a'9i\}:ߚFN]esm:w|tqGynSG|{>j\\=6 ŷc8y6EBsS3LzߖKk]j٭ΫD^Vfm4Qu@`/8n+#'vo_͠a %;Xe}:׶ytL^tW]'/Thva')>VNn\]ZI2ޖ6+XC*kc޸4,>ea\k0o޾4|m,[~a}3W4'ϙCA\>9;Dn}v@ok v1[woTfLԪ_\=g|R'Qkt/ 'P79 l>g֦鲔yM/ rعjsv =?KƀX1hV[_eQ6Sï/'c?aLO?`M`N{pُ2kлe߅ُ)ƝKԿpad}]Xpzk@efq}]{/SG'5ӈg;w#xhmX^tSQLRh8i<݀6lŴV>F}{?kJ#m,ʟ(io$}kmǗ{MX#} UW+oF#\@XSǘkj3 ?g>bljk:x>q>Dt?he|N}X^ kC2vQTLΩ`t 74Kl&9Ǜٽk7%hcl)futۡ]Ch?@GR8[KY&a (E:~]/*۩͈m*;c >f XŴ m8zRԇzZmG71-/O>!N<w|,N6"߾:>mI1MD&kD2S6TY㙥]hr}ߛ =moOuUrdC‡럓_Oi¸oN9&\fsi:t#TZ#AY5zA@"m|P=.bB=z\C3w+"LVS.K۪csԴ(E#\K7P,f%<x8jH6L[."(bKҨ^&|?i+t쨪S=(Y)uMo}A:u~xy/}?i&֧3;iyI7Z9Ow潁T.՞wVUSWoLַo3кu8Ot]b%{s~ΔmZ5x})$|>O00rbqy̓WG2fZQM"r쿔[L۶k!OӦ2u#}tqJu˜gvjhMX2iKhՋӁ*{]vnQ.kPсdN-8+߾*t Ƌ}0(yLv7k>pB)K.5U6KK2)4Oţtf#mD͆9|AAAHAAGF   =20AAaq>   0O؏/WOţt _R6l#X}l6?d)   s AAA{d`$  ##AAA枳ށ]82Cie&g\->/SR^[sNSr| "]vߙㆣ2S|-X\%G{۫ԑ>!~}v^ns3 M7n}|Y"U!%T\={qB>܆#n-,iY{cw7ܴa,;cL|.ԋsJN&]a5^pV.uoaw\K[`i}ߜ:*dA5bf!S"mNưGia?>4BUwv+[?(=Ob^o.Kk2<=j{T7s8Xrڙ_v6޵GfRegVa;> ؙv?u-绾OOA}=.uƯJ~˶ JwZâqJ>Moy<D+͊7еW{b 2}9UyfmL5q;UIm͠}} ^asG-n1>mV鞙[h;^ }YOQˢqוbԶs镩G8~̀GuŃt5iV{Ӏ5R7~oQCE6t-Oو_ U晫o|qEO];S!:]ɺvBEaXvv//Q:Q[P쾧6T#N :+YG⬏#߆>SڿQӑGgU;S__u*eNym9*u쨅}\lj1lSƃ̾2(ټ}}yb&uc~i<}3EcGI*n1%޿i?NsڃW~!<]ۇ޽5d(V8(.~OaE6\_`܆#=_e7ۼ|_*4K#8xW?=ٟv?>ܽa4ZvpqMfTo ,vލ1^-o {>7;Mګ`zp'PAeFrqqQEI{#g;wE<Fk y “{hSоzd鶭wsqBv2`fnWwmZC;>],oQzQfNP?LL9̀N50Zqxz Ӛ$Gx:wj%h_C^{.nvڏzo6Q ?/rsqo]ѽ1`_5~Q`yԱ3 ٩i)>R@BᲶ Z6(0G#Fv}>ou]1Hg>9lGl}z콒cwY|}q?vߠ_لGMM?@K;z8JqV1ժ;. qBEl4t/6;FI$? &_N;]2>sdLNF99)yS1z_j@nʥ_݄e -8/@4i86g W~mN|s@Z^)OOi~b>~ϘvtտMǺPۜ-gZw[{YiX#^րk ## R-kF?g əooyTؙozmv]{vfց{M}LcT6, rqQ__+MŰhV񯏦/?o1Y9N ~w)fcL-|}SLi%a'Yf8c]Y5#MTξ;onyN.MmJY80&I|ѓo=oM_nzO稵_Hoe9EX=.5̌T>#fY[؇f׮`ku컎]Vk}}Oex{S1gs$m#y1Փ"ݵ\DДuW>sϡ/|T#o]PsijF=g*cPMYK5utt|u}%?|{?'lG/3@rFKΒjxrHLɓfu>T[N|9љLˎDtf$UjNjb'"\Ͼ=rg~];}vy^Yq˟L<1PBS">gbXDnyp_կltso}gosA49Ov2QIk}·T*AFiYl_ٲyt/ V wU|p/+S uil<{ʉjo8?Ek+P@r"Hq΅Nʫ~AZR=*j;eBơ|#Ф[ʷݱpr[tt~5~sO{FvfT.>7^TSfa`4ma+6Uq|rۮa=9ꃧ 1n^pQ);q&/4c2:0k>ݭȵM*kecx}*S8ƶ2&p)Sˤrrcj mYZxM~|. 6l#X}l6?t   GF   =20AAa   sAAAy~|AJ7%~|.ꎐB|و~f"c!KAAA{d`$  ##AAA  0n‘NE/3<2nAy t]麰7=i2Wkz-9^} 6Է߸N}WV|XY TSF3MU]=w_MU;#s@4z~qaM7OMݠso>Nw`7R~wo~TQnzPz@9,ڛ팒#jo"i>]Z61R~+o`iJpbKo 8t\t|3{H~a06(-LJPḿ ή{`l88?@g1v0Mo<=G~0a~$ Z]Vޥo| TUft]m}&8~Δ ^ 9Dڕ|]u]kl,o+(VKˤ_Js'zetʋ~ JǦLU-COX[mv#J<^[;$vyλR/dj<[ ?0mqah1;h|*ٴq9;2wF+6%j6i4iLX1j|oRgC$/?l^Z{XPʗ qIȢOPB"qt7ܽj >%sD2Awm~ /zqdb#6\}sG_jV.!<楨hPpg\j_g}|w tTo3egH.qU u^tSFXve]/7V`vᓗ]xrːڇ7! Jj;ҮZ7qEM‰6쿕;U탪 =ٍLݰ`[ԖEaq"37ٸ1dTn_|7m7w>q>8mru}:C?+گߗQ0ˬ_D|~J ޲u7D HuCAwxݎ*Ghe:L8AчJzKiɑdًDr_7#śi,=8&,at^_ۇOԹ1h^[lveVE*k;z`Yl"`@wKRЌjfUګrZ7~zasO^؆5Ǣz1>e"uu?~tpns؈iU\T//S'' s҃1`3kQG}G!|azؼ\dqrƲ`~d^ ݲSG0R+6LZ֖Žp꾹t+^?C`0>J/Lۜ;G3L 3Gθц(?x,m@\p{a{l&ѯcbezbdY'1:oױ"֔p O4JMmKiRPOÍ$J?9Oh:O 󮱆ZZӯ׊$72,l"1z" u&fr=*9-`y}XgZKX~ٲM=>yCθ'3a2.Ik{)f)G3 x?I'c^eeq--ҖviGhcP輱PF-ecS6<]q['f2~ɮц'FUeVڵE:3gR޳-#9tV|xJasH[W݇oiLhmyˢNMJo?EW%nC#%8?stU^ ҒPTV{)[Eh,TWoC%Πm(IݩKho#k+N|;smOK L˞&f~48~1Vga`TήJ\vL cʹShaU1 :0{ލnBȵe83qXNj_j^nXҔ S!o%m&uz6U&jMi}@;^;HK{S戜bk>R ,? Dpq6GQK-)4Oţtf#mD͆9NAAHAAGF   =20AAaq>   0O؏/WOţt _R6l#X}l6?d)   s AAA{d`$  ##AAA枳ށ]82Cie&g\->/SR^[sNSr| "]vߙㆣ2S|-X\%G{۫'CS LZh/]յ氃ַ.o+|=Bq~2wяWÞj/5u=#~hu~8]Y[L A[o ^Z'$"c‚M{d 9f;X;qdS's:n/YC,aఐk*vv7y.-|-)W> -ւ)#)-]*qV5}46(-LJPḿ ή{`l88?@g1v0Mo<=G~0a~eż]>@eQefy*(_{Lo,1zg'eg\M:tlmؕ\ ntU_[MKuA]|d"WX{7BϮqT]c9LOvQg+mbu-ێwRql/%g kDZ WnR/g= l}p"cliEcm,>Y<6kLQ[?MɫBѺ1?R8Y5qҦWQ-?'t=/۞r֨i6&>]Uگ2X}qk)'gsO_Y߬H[q[mQ2mDX!B\'"(2|DˬU3./[' Ti\o 6>`&=}J5*, mVV޾ThAQ/Bչy$9kz)5øYJT;XGGdW 8yf "o+X^l 3CmWhGm+(CC v66T#)N :+Y8[vxZjM?yIe}3` m!3'-*cl>mJ[@)M3 DbdKLzEɿ#'$)}0Siqt7ܽj >%sD2Awm~ /zqdb#6\}sG_jV.!<楨hPpg\j_g}|w tPʻF_Wû]eC2]3ۆx+f$o+*y6+7ɩ},ϋO< @(uXm2..ʟ(io$,Uv?z-+}R'vC+N}#C"bm6v^}:{-SоoIopuLfnWw۶L@;>ǻv5*a>jdzݴgWQ6,u\<Ƹ5T:`8z6Wp-aZvoBg.^mk<=Ej[G51ZCh?@G2[Y&}>߶{cC/ӿ ZsN}3 lA{O9_Nځj8zr@mTż~7!ӓ%q<ǥGiYK'SiOl{<b?2/xcJb;HOv8T|Y8i;v{ZyXԸ2}g}? t =H~2|}!OSY0ñ>;w,1Ga\?c#V`^{MhbMά׳k6 u.8_/~f[is~DdzASOU3t3/j[q^D2Yt)>7rF ˤQ:w}u\\w(˽;R:!E%_w)-.QCa>z/يpT`ډMkYK9KN&uӘDwrKr|Pט=;o)0ۆܷMK"os=4},ߥiRPuI3|{CS̓S0rT-FoǚIZDz<\6Q^gk1DO]L)fҲ%!ZyzC\";CfІ " .|o0lBkkgҥ7-0B6 q1_!,.Чy}2{U1F\?fISݟOoeNOodZ&:ᤸ4u%hHusg}H%XǥF>1$g4),GfKѿ>j7Y0#Ia3!J嗣J|_,Jg֙5>Z+}pnÿ4N|Q+2i;60~OxOXLUyl3O?Zژ³s>lM?F?b4AF#()FW({><՞wV3 [P3|#d=?y$Jސε)qVL \N}\P7RrRfa`ʢqqu/F<.; Ss)Y\/35idk&ϧ1,Vodu##3.sפv|mG 9Nn8u~\N-Ը2LJ|[&MF0 -)4OţtH mD͆9NAAHAAGF   =20AAaq>   0O؏/WOţt _RW隍F{HlR:AAA  0HAAGF   =g30zۻpdvjLoϸ [}^bi8nE.3 GϻeZZ(|K`WiF\v]lE]_㜼ֲ5Қ,_ڍeT\zqdxW LfGNI◊ _ˊyջt-}6ʢTP͗QQ'YՍ'߾rΜ]bZkSQ(W`9j ^1yv)=?otOOzنۨB&N~~˶Cۘva4[x*cNQ[LؿY!ks?G=URQ-<3푟63{fW>;0"e"'mk*M;b~Tډo36Z;S?jrxڨ_Ci|Ƞ´qOOjv[OgD'yB_KlhneQXrrȔtJb$AQ AeoKJ!統jos:>^ l޾{*El)WNYěotQ9ȈYCߟ;P X(-SiXZ1U ƜJ7įRn| mpGnRoCrjkv/NFŊO/v/'cȟXqt7ܽj >%sD2Awm~ /zqdb#6\}ǀG_jV.!<楨hPpg\j_g}|w tH{>So 5I o1#\@G'k+Zp&FؾI 裯Xcj a^t!6#>=x'Pk'XfxC`/ڣFtul'}>om$܇e&ۣ;,+Z?>| ;rsF˅2nyLe*1\8k,^%4ETb1Ոb x69:xkO`Q1JOYrܭN9:Pߖ2{19? 9)ye;`t'pfJBu&ă}4pwt68w`Q ~Cl./VE]/- ۟U]ܹ@pz~~fawJ~|^Nf/[o.\^/qXbݢ$S.l(gS[sAXce&Sb^W1c.LTLE~6q?;.|= 1YUm|PƷWӓqD$zo's`tN绑86wי!޸KJSM(g1{a}x` o(,?q<|;Cjܹ2=Nhf@UCKaV"f- uV/m:s3bF )s}ZL\1h3͹EؼЙ4z@-G)`Z}3Q,!܇_nC/ڂzhXv=m|M#X2X}Қ#2i? ñё/Hڇ*~6Z?өe]}:=g7YAM {>=}=XoMLՄIX;&QRB5_S֚~) ~y à .R)%tnֶ׵AQZ(x?$uQ9m4td>=UP0CauV@K"8d\4koP`f7P=γ^J $$uթ4.s$ X?2#sAiz;o95/- \^tٮ5>domzR`A腃2d\/Y9Q|9 Guhw?XCRzGQU -)՞Ke睲Uk]PP]mYhRF{$yzy,k@i\y[qM[FMeLV> XY91L\>dH<.6S6b`dm$#$ѹ4| xu#o:ʦjsAieJ~0~\eΫtiq3V4IZ}H .?ʸgV8>~eE~)뛮ޓlC]B^,NLe6*Z*<@ͦ@D?yD>~W|>f"1t^,>6AAA##AAA  0HAA   ҁ|uGH!_k6Cg"c!KAAA{d`$  ##AAA  0n‘NE/3<2nAy t]麰7=i2Wkz-9^}@WLD쮝6 Y{p׽ؿg2d ]QD^Svѣw>GSwų{P㡮k0^ℎ<=T=O9u&3_6d-ށ%agӆb!p{M3?OW9?Nd-W?\5o:r ~]*>~:xmQ[L&Nmim|˶ -1`Ci*`17'_|ߦW1 S)0-_}^(+c L{/'ct=#~F^]JؠS^\\r1QM#s$ڶGg2Lm|ѷn&ù'$ӵZ>[<\NrFH/mqm1cvvJR+hôZ5Gu;qo+ \*pa79SQa_h "_D;Ė~a}d$9ҺN&.C*;ymnBADQ?^#BQo J310 pm#!O 6TÿϴSg`DuV619>O*SoG&jv A^Y}Xd^ )|g_NZSY\\sZ|9ԀI,'U>ootoCrڶjk_ڣg e6_Gh^ '^dkY"_FcGO0HLyJF6dtKn0={Gӵ}[KbeBGy_`%~Fm02玾ڃ.\V{C8xpKQW5MϸԾή=xũp#i"FR&M!mgmh`zrCﶯvvz7h/Niw%mFI٨jc~ Aڢ58z }6sL?:1m(mcQEI&\j8;]rlᮉw}:w$QyO|K!-_ظ4}Loٺ,e8[r2k˩FK7rEM(0Lr7{\6vמx5߭E-!lD`#UXפo܇6<|ato {vӿ¼?xۭ IS^0y_I'Cp0V}AnK},0}{>F{/cZj U:oVonʥ_ĆI j4JRn0c<1ul̋|+ͮ`ʗG.:=`4ʹc~^ n0O`٦dM'S8a^V I '11-cSR.Tڲ=*?ʎyjϭWV'O^vwc|CY*T%,v{wm>iT={釟MЧS 򡯗m Xd<{*_lk`{g8Gg0}3}8HUCg:'ĤnuuzӀkά׳z,m@\pi?Q/au)/mJy=d\|3!Q/%bdIN&v7Iڟ%&S:q\觥R>}C?Ie~j}?9q6?~ӥoohy:i?]7dfr52ZӯS$72=vT?ԒETC3u맰},&=iZ`dq:ˏBZ33sKoh&.-d]Lm'QvVo۱cG~V??Fu~1K[C!{80)KxX:KN;0R_(_=vb $q/S6xNҤYmn{gADneEjߦ\ۆ\נ?DFcmMcj6U~]M;^X dB3:ۈ~/i s*   B󑁑   s AAA{d`$  ||AAAa_M <"G@#5bpt   =20AAa   s AAA{f`zZw aբqnLIyn :Mq|.tt]}gw˴N+Pa=rmBޞ(ϟP+B:g+;Sx_+aE|VyvBп=|6f_8?:v}hu:_me].s }K;Qّmo 87>ɞg ]O=];,䚊]qMާi|R-Mr bx[[iJ ^2G>?cۜaj|h0W Ȇotny懍)_ˊyջt-}6ʢTP͗QQ'Yt|<[qm"c+)'yy6bi+Eމٺ_l۞s"p|=pTyN5Sg&}줖:D;+UW)ۘμ|fl(V[-&;.@ [kxOz-ؼx4yۜumеEۉ' td3ǝ~[ugcVtQ׶ bD B ~IF\B|;(y0mܗ őxtZZ|<)k,vjy~iLX!hiQ_"h??E4V V q1@@ DUWEv4-7*U:w0\}ӜD?g6x}~?ԑ[>Kۊ&k*8$PV=j[ Jt{ hZ7NZON~L LMgZ<} v߳VG6ʁQӔ03h|c\c6o`}}QAܟ1Ɩ)fTOĊ*;\TsNJ]#LtPrcNZ[:A^Y]7:v-x 6t>NY}6Pl&!#Oziue#'$'#|L34n)w(Cx{kpQ qP]h(lܹ/H{ aFW{څjoy)**ڿT7ܿiٵGpr:8n{]?57jލ tMaycldlhZѿ=>~́(Kz볏e)~s,mhdF؄л ?:1eFrqqQE-F~B._Rڿj9Wv ѽg7M>Ƙ2}Q|,l?^@MX2i_f: D^Sk5tۿ hgڧxw{3ݟ|*W|}bmmL$[Hupj`t8Gj:%Lk6Mū-(^w&ۡ]Ch?@G2lh,?VW`]qo]ѽ1ۅO̓t~'9𜔭hrO:VשH߅[w >A{|UdK6Yuy}擳0F_;Wyc=49MGl;p`S'elsR$ه+_f*9cl|WHkO0;jpGdRڥ{G$|ƾCZ*h,RG3zOt//')0_\>A?IS^0y_I[m2EaG97vO9.>#^ ;r!W7a҂?/;1nxJņ1uۇuX4/f^62 w +_bK5x[wԟd:Iʗݤ={釟MЧS?^ L<{*߷}xĚX_}=?LL·2&L/LۜM4\o@mufmyX5.;.=u.8_߲/f[is&$eTKWHZ>~}[ɮ[i+l˼zZyK~y:ؚy~-ߏ*LcDuС&!,QfyUAT=o`|Gȁ,a=]Ӊ!zg^tq>$PenIտsmIdՋ}'āI6&ѯ#%\3vdY'1i Ɠ2DZ{irXƦ-?V6bqOh=BMho= QkM^~H[?hi–1)(˽/򜝱'qlUŽƜ=q.Y])䶫 ]7I۟'Y~X}|lr/Q3=}8O>Lb/ok=s4}˿"" c˿p(N]a894%E੬S|-X6JJA{:*\BټB`yu˝{ֳs]FlL9̊t&/OKY9zg?*i˕? i?UYפ }>k{o/mMץ{`p9R;ɵLx<An0RP7YVx% ~juQ j#w>9DO*.wx;^XZ?okS5k>b]WVH~U^ TxoM~|. ,,,}Dbl#X}l6?t   GF   =20AAa   sAAAy~|AJ7%~|.ꎐBJl$6ߋEfC  0HAAGF   =20AAa9hޅ# 0V^fr;xe݂2%K504m/w-ua9n8z-:eB[rN zTӋ36'737/ eUß[ EYX'+wnڼf:;zݕuֳ3'˽7/S 9L[m*V .oʪL?O9nvphDۭ-*,OwX#m<NЧ+}'*tSfׯ6"ߜ96ioL!5Bpܸ36(-LJPḿ ή{`bPpm܁θc=`x@{:2`P.+V|**3SAc6_GE}X?gA\~V'Yp؆g֮$'I ;?29h?u+M1ezftp|:Phgx:%ٖ:tzm0Z''gߒʸ v&gʊ-m*J!}ߦ 2b!9.9XݮO?nc+#tGd=֕e_'ڶ|SkEmac"q9+?)qlmm'qXLq:_kkYO>s#Sҍ27I2ޖ6+XC*kc޸g8~cQ(ټ}9ThcA Pu`9~mz=\PG|z%b?8iي)o6!SקPLLvP:Q[g%C vbNO,\1}TPm]о#ǟgl#u#~v\TsjP]"9$[o^e,9:UvB>].6het~; ?K_){-At:mmƶ~=[ qIIH&_4?NsڃW~!<]ۇ޽5d(V8(.~OaE6\_`܆#=_e7ۼ|_*4K#8xW?=ٟzhn.@q~ њ{iDp (}>DZA ?:1kDZ9Od\x3:^6?؋FgXD*F}ov=W;_RXtZvGL5-SgmNOVFԧ5fZ)7y~cV>`N '3@rFKvEGs43Fzu:UwMhuC56ل|e|,TyN3!UoDʕZ>zF+%{=+/eK:\ڜ02emԔe/}2kDjlb3*,>1֙鰐9Bעl _LS(y{F&}bd^O]YnɤU>ARgS~yy2?ngD*O%c'&R[˵'SR $&/|&ѯ9Ci֑N˼\EKN$-OOγr|6=N篒[(ˤvA_}oU涏',9(WN1#^zpMX6/s\^ [=Z"x Yl 9`?]=9l?>Q/'{/[<&w#l:Dž=VaGb6O˱ed3nJ/l?v??1/齃qLh6b`:qetn?,ڵ?t%>|1؆Ea-sTm|"j8c񼁠 91v!1gJ3݉frSY RA\pK7Vp 9YY&(swa3G xM0MoD6O۩c>Y纍=`O}XX,zPob&$9cĈc_X׃y{CcZӯ׊$7"=K{J0,}>w?ށUK>@zDtVeB]NRL3 LEpl⃨T<{)>_W|bc >aY~+X}X2Eʽ@(.bv1/{|tFGj*p{?xN Y%WL3ZpTCǓ#tEbdjFN4ƮiZrˉ`Zvf&3#Vs z30ny}1Z=险bߓ|ڬ`{dm1_uQQvY9(:+=3μYDhE$7f'Frs'wkꈿ_W(+[FOU 2}mq|ADZvƞlƱ9n+} H1z _Tr6wʙDYRZ}bm4&Km/snrz~Ni͵|P1cSDb"GcG_Y9Q|9 Guhwшa 9Hv.L#/HKJCRYylZ(8TWoDT}Q^(z2K ;?EيcWF`qγc7og)[QyZeۨ>ЅW&K>^KYթ35\:AJR,O?/5J()wsOƟnO9Ӛޞwۥ ETe*jg PL->iZ&5+eWϏӂ*{]ЖQ>]t` ٧4|FA|}tuok>p)]?.{kYl DGs(`gaaCh&Cg"cq_AAAh>20AAa   s AAA{/    U)AGs(WwUf#1t^,>6NAAGF   =20AAa   s ^@.]!Z23.t))Xڭ@)o{9ۅn qn)sE?G.ߒ#ؽwZHԻ·X<;L97bΦM)%o?‚9"IkGo97!CWeT\=ַYŗ{oXc)١l пh2EJ.A[Fɵ9J |N81dD W koWOWSf7Yo7չv[ Yxͭ,"1!i ls2=J 9r8¸^1آUpm܁θc=`x@{:2`P.+V|**3SAc6_GE}X?gALP>X-&^ Nj`eR#QVR6F\ ':_ 'ᨺǧ_ߴ?31Hc'՜vV)=lN)0Z1;r+ kD=t %s[Wxy` ~Lla9}e1FFH6NQ}*d_iA9FlqYgt[hۉA|1e}/k}˟BɴE)+c)q+WZ\NZ7p(NQ\Ry^;=5 0o޾4|m,[~a}3W4'Y ?^X7'_'{ %:6p6xPWTJ:mґ_nCd^Ugb``d-_gvT÷ir`rg vj`xB&-t[~-SOc}ce&$!8ژJ0ul \*`;NvL(ټ}}ye^._k :,c/7}ɘe$.(FyCqt7ܽj >%sD2Awm~ /zqdb#6\}ǀG_jV.!<楨hPpg\j_g}|w tH[3%㩫q l\3#}ݤuGh]h[+f$n+?+m%igZLYkm&c=6Wp961t]L(]˽kDZL7>ͻZg,~W-C]jW-Fd[>NjZBOK31o_=ļSa'sq>8dL@;>],7t1fNP?LN߁s-9j`t[ ?r;Z5I`&tvՖKSt w6oRڏzo6Q /&a (E:~]/<Lz#Jo5:vtr7hWy2w3EsZ#֛5|@|ۧFIc=胷V;x xguxR\x֧I 1{/60x%%|@=;S۲K6YTm$܇m٭w,#h·Ƙ(߽E\rv2Lҧg Oק{~9yξ?c'h"Bz?b?ȡs:@b@[92NIsrr_?=Ż{сOݔK V>6^ ӝ1p7FO9t>âyY,oٕlPcX(^B`po:ٕ.e \aJdfWy_:tSiD\e/B߱ezZLOIc (Ѿ& fs&3}g}?y=pٙ s^~ -ivE cV{ͥ"hQ^FmrB9'3=y@E@y3W~ˑtME{zi|yEzf_t׀Al gid|{G߄x9}"oNIA#_ NKk/k9=noJ=k `}#KϬGźd}8~΅<5X<%R˗zj[}=\A,m.#>y;Ie2'ytބޫ L1QUw_A\k{7e@~5;[.㍴Sw7G$/m } =ȷG2CfTʼncocRE7nO<)ԁnטDg9>q7."dRGj32`͒=I}ct o6۵-Cx>gh֟賆Ӈ]߻dg :]^gAwke, u6R,s4O˭u>e}ۙ[Wc[j"5{K`(A`ٽ'y{rxBIiS>^$;gĠd qgg,q;QjI-utm`#{/߆ )p׬M'7;nF%%ɌL3ȓf}F>,gbehf"93o3gϹ wLJ>rDIgRY}1%oqΗ格eѽ^p>GfϨxcTugJdN'b>nonokN'Kr[oU^*RsQP6g_?c/m{vTƼJv2ی_iUN6ٶ|dLƄ]to ߳1bW)d>J W\ ZI9 G,At ˋQZR+ekCƁP]} YXrm+zWDv~*T:lTb`GzXJ\ɛ۷3elYK>\k00 u[sԐk: K+ܔ40=/S5Ĕ."Hw$2/ڥ% erk)Nd{炢.l6GM'Fbx{qග@xyLu_QrW&wh8pХt((=:0REQEQeс(((sEQEQE{g`1Иyf\ luuJ+v`TDovJnqǟi27z96;wD}dm}z6JDb_6;Mrr6ț:ȓg>2&R<Юd*g"pǛu H/F('b oJm^[`llJ@\, PczPȬ˵m*hr+nP~l"pA./r.,Wˆxot{9jç‚_":>Cs4}JkVGTp{ {;dÞ zBG;=HБͣN0C~$ y-+7r* PϗcP y7O>>ބP310p2pG o ·iq`1?o}=yo7d^-𴲍 ;y!=y#<625yژI_{sUMtt!/OUt7}>]H"/Fb"OeLl,.d'?1$qlKn@N棫8|gwEw1A;NSo}x/uug?횽s Ccwy)"P3.v{W{wFPfO {z7 nY˱9C_Ո^)l֭l ?[KyUsͥǟ?6܉[|곗%ʄqd>!~tumEg-2bd3l}d)_U{u<|ݡǯ쓿22$3FBFd:-s-M1bNVOCCsEs=隣}܇w"c]1CWǦzhgڣ۽g<_C R?ǏMd:J.lC֧*{}:\ټg>qg/m3i Si U̦^=V\67]A:?~#!vL}ḽ>%AR%66=ϐ?݌6$԰Ȩsgy ~\Wnچ'|y}?VV&kiXb?tvz.vB1n8}Co4A-Ԙəg>u@> ;vRƶ+Oҝ`œ+N:.{ mH>ݳ;}:=~xzi:|Obp,fu/uX77DeA}lL_CPqM70Cm}n}u\խ gyڈܵ||&_/Է\(#ןC2ocKr}y~vSߟj}/4_kl}5>QfjټlĚx'vzH$ٿ|c\1"q?OKR{Tmd7#EaDK3ˌik7v2'QXe]4Qe&1ڦ=C#%i'|]?c3 [Nc\!Ԟq1; glDySrVkLz<\vKibit~;lA{[|mm~iM~$gMAZg&ׁOT 'aNNҥWQf[AR1ܹlvd.Kwz,եI-h`kxYh}Ϭ_vo^v=Mck'̅\x'}?E>(9YHz4bBں_4ݟٳ!mt⬄tim,O_^7CRKǎ QgI-;N=S3A4ec֣Ұ᳋rCi9yHPYs.Due}=RYYg+gx꿒7AqogYUF>g0 N-S@T?eT>u(e2:ۨ~Nj U:EQEQEQGF((=:0REQEQeс(((sOEQEQEQy|AJ7%~ʨ|@ЯM6CgxqKEQEQE{t`(((ܣ#EQEQEQ)((2#ӹcݡ1ӡL#2ꘕ디W*恻o옕*݊y;?_enC([slvN zJ\+^ZY+ꖵ[X7#xBuKwsK6J>1[xdolvE6PF$g"xKum_#܆Xzҟ=_^Q9w ~&0ّoTihPJ([P^61 (W9(-+s )꾰'c ȦmGH~=! h ֬nܩv;6Ɇ=nvz?<#G`؇1%佶k{HߴW:,Xf'Bs>_}FC}3Z?A| =btz!X .l%ME=hgh2SXh7aS%Wغd}d(൓ԕ)#gōg63emW"=qm|~)J+CBNNvΦq[#T/L"l9( lyF> {W*?9n+.e^g1t©*Wkuϧ'9$:i~6H9[=|@‡jop/lql|aoƍ_\_܃])6t[[b C^?-d^f˘ O^sؗ({p8RӮ;N205sѝAn `PG뎓Ԭ?{^4/??4K]sCzOfouܸGИ]^|Hmtnjc՞ݺw>YqSC^ޮWrvf|Պyzˉl'mcdv>2K C2=cusVG5W%[sF?zj]s'/]CWԶň;l8gW{`ڂAwLvlns'8Gk7:m>M(7{f#mN]:%;iO=Ч;i٧͇A}'%C?>/FH OJt\jPkr>> Yc#p'qHfrFYLWH̛=#OzLG:+WsL%ml#J-s Qm]7SD噻I|l9cC=KeR~_0rʓfnXYM9;rRn~3 nUYl'P(;{/{9oHҶot^6~H=ouzRA%w 8X#- 2Oԇs]{n72'|I:bg^O.Fv1:\ͷ;(HNߧdrEǤ\kdkʇ:l) |3dҧHy1Qc nV04>6ɑdcy_;ìJfl^0nsmJЦEsx}o3Oy׆Y7nl1hCs@&csw+Ҿ}a~k}M4C̲֗90S3߄!e|apҚ`- v鮵?2 Y}l%X]y~{agGs"ف/;٠/_BpFO)` q᤿ \ Sӹw!؁yo6LH|:N݈}܂H='nr __$Oоrfqd'v~^`ڨU=?tT~paK|O|_oWKGviVBPwٯ[Q`TV>6{!G8~A#CAfGWB܌[rPYĬKOԁFx5QogϹвǖ3kKPx}0au/ۙdP4fh1>3 J7F-"2+u0SoHRO^>bMukh/):=WI{|agw7 FHw̿6RaV9a<{ZV[>q~ym+~K7R0ZxR#=1 ,Oh ]̗FJCr"Wf΢s!QoyͿ.IɇfAzx;kőuo3hx\ᛄȎ:M΄n*k mJI u0oJn ahgbL@4Ww< (6Uo:ItP ljQ 9,}2!8J9Ҍ9 οb%;iO&ޓX!w!>[Lm~Q?qYĴ$S+^$ a㔷8ŐTCaM\4X^ҒXTV=([Ca4Ϸѡ2y|Jށ#تl3t"E vVA&,O?RQ_TjwFA`EEuӶO >74 rg}gԁNW~0w u)No76y{'{Tg^op[95a'Al;?`ے3X%&x~Od,Qlkc?E?AߪXZػ2>R<ll_ʄzT&OA@+daaCL46d-NQEQEQeс(((sEQEQE{t`(((||AQEQEQe_ЯM 2*:Я(9tF;^}lR:EQEQEQ)((2HQEQEQGF((=30ztcwh OwT #Roէ}'J4[ACtאoS4 ?x> h ֬nܩv;6)E^o{7  Mx@G6: y-+7r* PϗcP ye|-|@w:LR/V:YG{-ܞs;,Q}go3LU^ɴNP-[Qhg%x]CϜ?r0ߓ3 0ue=X*L+0_rtjّip~&((Pr nݬ3 ; ΅D@@i XA7Yֹy49ꈼc'ЋtZ?HWl=żq6ɑ2qNt> 8u0hG끮|80W v#pmZ}ɤʢˏĔ2@}V 0/ mUƜ(_Ɔ23OoSvdtc39z)"IDATKq= ׁ8QO/vRI6N&}2&9E}dDdlKn@N棫8|gwEw1A;NSo}x/uugk?횽s Ccwy)"P3.v{W{wFPfO {z'YO:lT!Xu%r0[9>|e̵n1ۏaick7q[rl߿du^ŸFqqq~Eyvxrl5P+C{?(GO|{x`K [30 /> ]˴}Ux}=q~ց>I>o>L~)ԧKu^}WEkkWL{LT[1 rr`4*gbd^F3cljhݦ3hv6i{aw]&uDe|1iT2gϹ7RhѪdUvx>]6Mץe`'g`/p{nzfʡƈ/\)VΘ7{^/\hm |1F 0#\b>ov,a H,(s;Ϙ}!UH:AzOʎkiIS ֓INV7R |cBAV0)`R't'5+zsn6 קBY?y|l&.V Mh'6L.ʟMorG&TAHeUۓV7{faʥGf{u,\W 6-ûD o=|؞YbS6|̺YtŊ6@.{oB;6;wwMq82K 0f)4@wy\Z3[[G恹O3Mؙ`y2ؾ'?B6FtX~3O^#/Ǹ9s7#ov!6SǵMZZ[N/߷Ѩoí`ߨt>ֈ> |c}gdpՅ%6՟~_~gVmGŅylZ6ڋyL֧ո }gwV~ǟ~6r8붭xC h<آف}sJ*q$͉x>р sd BtH=A6IQ#uǥ?)={T^La~%LmJ:>{U506洠+7Ƀ묠idmdOBg9߬s?qm;3W)f̤gd|pxohM \> ~VkzLz<\v3\4ύo7 4qd~ h}\7%Α>sH 2+~&-{IvO|-]7]6|'f^[vo -%=Tٽ 2e6|06|t&:>ye$,/&G?Oŧ1KvopV}*wD|K6ai$'!l*/lx'}?{=>_j\4#k9DSc Ҩij:_]ɌL3ȓf}F>,gbehf"93o3gϹ @||hrl̗י!zj3D29eefNM%C̗('L1*?gB;O'l+7f7Fr_ p=& lq3g|2!i7BV=ݬۘsAcW +|k@v*TM5,'Q}B1}20*qOu_gjϨ s}EC߬e_!g i3qoVRNxQ:KP)]AoQʰs``y/JKJcRYl z(87H"6Ls򱝒J'՟|$;''xiJ'|,H[9?ͮO(쯷]/ dVRDa3_sJ(+*^ct0?ϖ:}Sr{'ݛ!6u̹oI6q1roEަ첩O9JϦ2qhѧtuIwp6Ș{tx˜ZŶ1`(((2O/WOAWwUFcl/>N6?t)(((sEQEQE{t`(((ܣ#EQEQEQ|d:wv̱;4f`u:){WB[yJ3hG?LÓ<-쀒3gR33h[1Zmayt5%4Ӡ\|79M Pǖ2~ƠOiȝ9nao'`l8:z{3_Ohi:y}$!e^Cz{w䠲`Yٺb5 pj#Ի5)lv*zG=W6mHs|Z >ˌ\s1fHfL|AB_t 8z:89OMu&91}vt}bzzA |fh(ݯ BVg~]ʕ'9?:{؇T}_mAk3 B_S>uGgP ͒'%Z۴BA‡mC! {)'l؆˴uSnĴ /yZ/|vjR0+quH7",bkV~`@ T+ [b:ߕ;uAl 0`{PR}F?5z~wO褡[[5>rpmy\_|n`U9A`t^Ѩy_UMɬA("s ])5ҿƁc0yx &H8i"p~_}JS|}La0.0RNMvWsvPΙltPnt=m#t֞OUHl`~'y1$KVWz$;˘ٜdcrdep8RӮ;N205sѝAn `PG뎓Ԭ?{^4/??4K]sCzOfouܸGИ]^|Hmtnjc՞ݺa.Bއ<5+xj޷n}yr\o+3] + _ xov/TΓ ,y;yoe #iIxNoa ([a/ MkxD1[kDUIH} nϘk }WE 0fq&j\v+`j˘,W{,bcO2qQ'?~󡳷] ղ>O:C;>jJrՠj0,g}|@hfIGnj6!Gi$^Y?{F3cl6M G8 p뮳rM&Fሜ>[,9NSwHI>Vmy}}̇~oSrO)y'Si+Ot37y/+Kl]|gQL[ lR~$gkJ7FنKljYOL=sKIq}'Z:d?p|+>B=#*ɰm\{`)P'$QMߘ4z EqkJHN%v+Cy*YR{ش KM~Bdi+?ix)4>cGV:ZY5Bc#If8;>U:6[δ&3Ӿlnek%XhSآ9KK>7'_&,fz_OlAl,͍L/Yķ'ܬ3|ǵBY>\67ܬ\6.esi:/{ t@6~wB<̣f{:n/ ޲:6 g І۲BݖчtmpԘ hpXd~'Cfkoي iЧ{vaO?O/+{A ŚW;X3ñgvCJ%Hit*N#gXp#0=@QyJ͚m\:*`i#"4:HojP΢se5 J>^/X>:Kq:iR".5c-md_Q0c[ ڷ>Jqʷ yfc5QS2՚~g%6z<\6 4h֟Øzmqz층dVV`r5X\nfry,Q7s)cvn5#~yGφ@doL[{|~;^Ѭj4>δ(ꡲq o cson_ >C807vRv܇̶GWN.531ybLp O;cL[t=/>m 췍O!|}uW<΂̞ isA/~hՊw QgI-t>;ԣ{^!A4ec֣Ұ᳓6PZvf9lK͜E?BzwV9[R g="9[ǕERv%9O 5l&B\m.ML^4#$}`&5eg*Ytz|܈241 >̯{8ڟq:qͧO~QqRb{Y$dJ]_:Beb!ۘxٴIR>NzI~ ,zE^Nf|+CYCWO:'>ӵn_a#z7Ŵs9wiO7"<j&Z?RYb(\\Mſ(-)_Oe׃&MXmtXiYmOX/uY7~-Š{´rb ˜7fCDi2B//Mi0E\q B;B?_sJtA?p8k̫k{B}'9Q2G~]P瑯Cܟ%"Ӯ= {Lӥ3\Pden 's>]r`|(ٞ4^QĄv f"Xm?: 9{'} bKgv^ԇ𯜭LZ*8AOeQQ~H>Dcl/>N6?WEQEQEQ&)((2HQEQEQGF((=EQEQEQ *ݔ)?ꎒCJ7h mTEɆ.SEQEQeс(((sEQEQE{t`(((s>LΎ9v ̣N63J`cV>SR^:%r|cVt+f;8|N97MQʷ2n%a t^ :BFu<cF" h3x‚e\ܘom; !N괹w׳67vb_sKkON{<ߠ㌨e?B̽P e-Ŷlo%};9~G=7gG\s+-}A$kN<,W65ċo6iJ/,ű?e}r&s4}JkVGTp{ {;dÞ zBG;=HБͣN0C~=:Y e^Cz{w䠲`Yٺb5 pjz;"%N_o69;+ eЩxog;fPYx]e;r0foUN;gz^u|@ZI|~ha0qAwO(EK]3@C~e9/q:Hؿ JmY//ܻIGX[Y( {,} i TAuC]/`e=#c]H\`quRBk2?rh 2cxd}:nnp]Vz{)'w%ylH[]q31cscGd;\ɿ6ʬ3auh;ha .&,bkV~`@ T+ [cyJr.u0MـaP:9~kz7]F>i'8wp2:%g}c~!q4oFAov쭢Nk]m~ckP310meXwHa|ȑ5zJHHu^$|Z=eHLGlU`B2c>5yژ@GtTlUӀ })mVc ڦlۄHl`5<H(b"&C(4>B}AbrpȄ-y9횏$ڞ]3e_|d8OESCs5͞9tgVW̍Kx40htk@Mw̸ؽ=6_ޭ"+`}S⎧lpMVKD;[l-;J{p)Γ ,Uɏ_m򛢝1b޽n:EB7U]!!OsFqqQ eZɽdmڲT{氥=_bWÔR- eѽ3C cw{\wOM]r(c͆17l\'یyO%oI>o>L~Rj\ܧC?Ą7fyϬn}y(ՕKU{0}2dѦhL;ǟ?6wXg8qtgKb ȯ} e)jq d=hjc&ߡf}3|5)Esxwhvs|g:Oz7lRks: ;5}{^k9[qN~ )&ύـV i3u1A\u@e4:~FYۜ_k_{tJK{G?)#h:~5W-B7E&!4e"YtLM֝Ok\[_|g~`mw{c} fKcC׻lHB'nÞ?r=ar?rXJ,1Rj+}:?x*G]O~ ṡedi7kid  q6?>>ɽr =?)-M ot'[f嗡.=82۫f ~vmh;0oM(uϬ?1)^nhܦTZ6]>4(ߡ Q}=5Yd.Yz`rp $>ŝ+؊ʓ\ mtěCg_g𹯷Y[o"h39 7]Ы@yDgm/_:|epM[;\¥5l߿'!my6d#z;܃M2ưkϾ-A7澹>A=OO;Y}sC$ x}pݬ_J%ν \A'q}l}:z=Gt@Y–`F!6 BMy A[~{!G8~L~fziDu^ѭ׳}|K$ȕ)mgxݨ'Vn^o\A#ԓX< {:N7q> 䓗 1Rl[i$cޟOc,/GWqg{s\=F\N"ɕX&+y'Q۟eTwBeb2OiC߶yn'g [Nq C}ct 4~J<-ehLZv%#.%J{kUg[í S,2牘I.ۊ)]A~1tՈ9km팞g/D|ӗ\&e jjq{ (.&X!.>HE];H,G잻kz +n'hYrmW$Y;9%smblr:II._~IvDVm8vog3½o)ܲOAFr_!kk~O#<ΖR7yq1gw8HhiTrl_G!|5dг|48F4,gd|FJ<'mշ\ջ)3VYl%e<< i9$ ,${LWL1ja\~dg>3~ө[FN4Wo[NPΒ*3BX#gw>(Ir߈AO\VVr2-0648z koF\!ױ1\'Q@a|JVfqcm4SxH>ө~eic@o۾/Sz_oCm]fbGot)>?eZ?RYb(J?&'8%;6 (=<_4aa42oC|J-eH',K`U$o+xƈ_5\gȎaPרle:Q۠毉e]^z-Ei_kƁ"j@>_\>eW$ߓM-ڣ(m?v#+*-BkϘy%2qf,Wﳾ"-u]rJNLg)CWV&|`D-[2~ʨ|?_Q$ dd1tQm'ot(((EQEQE{t`(((ܣ#EQEQEQ (((B50REQEQEWt)(((s1?wJ}^'J/Li7gIȊI9Vͼ9'7wɩCKJݷb$/: dPꤿ-;)%[CXcrr(u_fz|?bqBBHG !PQ(uB(:!tJB: N!R'BBHG !PQ(uB(:!ty7@>:@MIׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-]_~;gOuRlhzY=asGcE;+E>7>-Jh_{o|pG?^}+-iyw1z%k_ Z߇R-k_P-k1J-CW}(Jׂٔ:C4ٔztjk_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ ZߧR~vΐqؼX ׳{Ɗ6w4V}^ox=| [кχ׿, .tW[NM@bx#2:h##K/>GNMsāE=bx-[ ϥWSqRo?%f4F߁z\ӊ?9\ZGӃ~Qsb>z~Ǯ5/t?^ Eӗq>ݕz:9YcsGc%%ϥJ;+RO/9)."lhastW Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ ZlJlJ=:h-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_tWp<7+uzVvOX/Ɗ6+ cK9Zwx_ϥJ}Kکih_ uDfQ'~}xĂs灕Hکwc8G>^] /cK?J}s 4Zu;Uv;ru<1]sߧRpkZX9=G9#kxlhW~?CWbsGc%4_E z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-s6ePs6ZZׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}+o yiWк^O}=+'lhasGcE%؜X o;~|xk͂ҋOw%4/G?"> Vz%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ9R2|(u9RN-Z-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_,_.oV抄[-k_-onp>×7_#n-ﳻpy,/w{l$k_ Z-3~7lc[-k_LJ k_K/>[S_ Zzԯ?3:x\)6o4VB}{=잰"_"lnR߾qT$\Rz<3+u-OݿY\zY\/扄I;5ͻr,įOãX.(×cZ*S\iq`Q|^|ǖs'SNJ|e'\lHSӼݜcz3E.15{1# ޫa2؜p9iyv厜h?7OLW?ⱅ\z/]) 'Ӄ?s?OX(p 7+y}.Rص?慮G?q5ġEcx#=GܿmO=xGZ<;+u-E=.蕟.dJXRJ.6w4VDz9OYwA'lhasGcEgFO'J-ﳸ}_-SUkZҋRߥkJ:拄[-k_Loқ^fqRw%抄[-k_nH]ynD-}no}W>}PPQ$?n-ss+.ieS1}j$R߂}z~J_ Zb>z%k_ Z߇R-k_)P_ ZlJgzKN-Z-k_P-k1J-S\꼥q Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}nn^-k1J-CW}eFc-39RF S_ Zz/ÿ\=N\;qؼX ׳{Ɗ6w4V}v}.@×c#%؜X o;~|xk͂ҋV糼-6G$\Nکih_ uDfQ'~}xĂsn>`S} ~ vj7رi߹Ҏ?xu1-ҋRny9Z-f:]bjLcGܿ*u;9EѺ~Qo~c ?yg85h}\ukؼX9=5;.ywZqxQB#PqhQ^4}]SsNy<6w4VB[rz\+?Q\z+/"sNX/Ɗ6R|uӦ""_ Zb>Rwh뵟*y"_ Zb>RfÉTٯ lu'n-)Qݛֽ=?-k1#nݥۯׁ#w}}{.gؼp -k1LG(=r۹}2>&g7GM.ܑp -k1|eW =揄[-k_,H/;5k௥J-s-k1|5_ Zb>R 2|2~_e)u&k_K/&1Gꛫ+|M@௥0[}2-k?*0Lkff O5_ Zz `GL*-f ^ ZҋT-`>K[6nK-k?*0fyk_K/QadK='c!k?*0Lt+훣_kk_K/QadJ}k]{~3::ҋT-`>Gn _Zz 'Skwvx -G-xʣ+-f ρR SvbE;'wxiWк^O}=+'lhv<^ڍ}G*ƪg0K-gRl^~TK8Z^ǖ`sFc%q5|3w_J/Qap7-ɖuh.&rew_gA$ȔbקъGb^^|ޟ{f9߇wҼw/'1LIF bR//LwāRIGYzٝm~Bz \y;"rsDb&ڃ?>OᎿcO/Qav;`lNWk/ 7+|)w.Y^)0ɗZGy8Z #"/8(vygK?*r\S_ɔŤ^>#/{qqz:] )ыTP^f}־tZߒ+Gw z?)),Ї־}nn-ܲy]~ԗasGcE?:(&zIE;ׂ^lɖ ܿۏ}%oMM*-f O(}Fs!k?*0#8t%3 &_ Zz 'Sve\~_Zz '[ӣ R௥0[}6\>s_ Zz h:&_ Zz ߇R-k?*0[|௥0[}(Jׂ^l9R2|&?᣺BO`>>R~N-Z-k_dJݎ_"_ Zb>GJ=qKf|AL*n-)u2./-k1lO3/p -k1}}K$k_ Zh:hׂ^}(Jׂ^ Zׂ*v҈}ݷ:R_ ZgF\nC-k1L+-+n-n5bsF-}nn }W໣wJ}Zׂ K=h9C~+Ɗ~9잰"_"lhU=R}aW'5xl 6g4Vݳû?{o|pG?zZi`_ O>|ws:vx=޺ͼw^6W$\NnE~J tE=pu-DOpɔϱ?ةSqROx͞iӼ6|f4m|4SYrEY>c ?Ӽ{pY\>/S34qM?9\N翝7SUkĤ"r;ugH99}ށs9v}6l^K=0tyw^ځs97 ka>z%Ϲ|ӼmXө͹ڧ> ;+'B??E?>z%6w4VDz9OYwA'lhasGcE;+RcRp -k1J-)=0x?-k1;py3R_Zb>GK=V;enP_ Z'S)GkhcE-}zb_ocF-}6of2Vzy#_ Zb>7ףpMk_P-k1J-3%H/;5k௥J-sԷoi|67jV~:/u R_O]OObl߾7=<"wJ=Zϰ—{\p -k1~kSVz|p -k1~S_ Zz+_ Zb>3J=OZlHׂR?w\p -k1|g^ ݧS'n-)uv-k_ Z'S|M\ׂ^ Zׂɔz_~~x|;gȳqؼX/6w4V"_Liң;uklhûgw, .OQOR+抄I"ͻɇrNYOV|?Ӽ`?>K}Gy؜p9:E+-gWu<# ?lÉgF6S7phË:5{1#zOpyXnϒ#-/x9[ۆͭ\-S34qM?9\N翝7J}gH99}ށs9v}6l^K=0tyw^ځs97 ka>[Sr-Uӗу7 a>ݕz:59Y'asGcW^(G?LJRƊH/9)."lhasGc%U_§ISlHׂMq.E+n-ﳻ_e|QynD-}no~[ G _ ZV\?ލ-s'WS%,-sԳSZׂ+_ Zb>z%k_ ZN/R_Zb>z%k_ Z߇R-k_Lo NZ-klJlJ=:h-CW}(Jׂ^ Zׂ+_ Zb>7Q)k_ Z߇R-k_P-k1-Az٩X -T%G_ Z`~}a(uu--6:}2.l _Ɵ Zׂɔ0Mzsە_~u[-k_):{{}}whhZҋRƾ=tOw 9k??<3gRlhS_ ;+EX/JPO|NqfGGwꆗ%؜X9߇wݿY\l~m/5(Ҽ |/tdg{# ?ͻ v/ypfۣ\p9:E+-gWu<# ?lÉpC}nNߩX9u:kLcG DJݞ%GZ^ԛs<# ?ͻ '#2n~Θ.vfhs?;o '_.'{;cIEwZϐsxQsr:mؼ>RI G& c;50tyw^ځs97 ka>R;}9~hCp#=GmzϑR9ROf6>k$lhܢ UdJݿ=(m]O6QE RgρRJoS/n-sO^vj4k_K/>z%k_ Z߇R-k_ڽ/}n㇏-CW}(Jׂ hׂ^}(JׂOԗ\~ӥHׂzWfb[-k_\# ? f)+_ ?%- /ɖg#+X_GN-Z-k_dJݎ;;JIׂ^}z?^L*n-)>JsHׂOg;Gy=.n-soR/n-sO^vj4k_K/>z%k_ ZgFG.]C9#_ Zb>Kݮ(+n-/ ,}~lHׂOO~Ť"_ Zb>R]G~t?& Zׂ+_ Zb>R\ׂO4B'~wxv<7+׳{Ɗ6w4VT/1Ҹ˻\p Gwꆗ%؜X9߇wݿY\M43.'-4/'9fy;c ?Ӽ{p34qM?9\N翝7J}gH99}ށs9v}6l^K=0tyw^ځs97 ka>z%Ϲ|ӼmXө͹ڧ> ;+'B??E?>z%6w4VDz9OYwA'lhasGcE;+J=\}(Jׂ^ ZׂZҋ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ9R2|(u9RN-Z-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>ݕo yv<7+׳{Ɗ6w4VTJ}klhûgw, .OQOw%-4/'9fy;?;>ky6O神_kq:;/t??͛߆0J?WM_>߃Di6tWgS[^y\J;+"䜧6w4V"_@1Hׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_M@>:@MG-}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1J-CW}(Jׂ^ Zׂ+_ Zb>z%k_ Z߇R-k_P-k1JǷs<{; WqrY=asGcE;+EX yx5xl 6g4Vݳû?{o|pG?ǧRߒEwÓ?xls?"y_|XE~J tE=pu-DOpyx9[Fc^3wу7؆*u{iyQoƫB.G$46|:/ M\rG?o 9Az%k_ Z߇R-k_P-k1J-CW}Φ Jq|ΦԣS_ Z̿OWџR-k1Vӣ?^ ZbGJ[Mz%k_)Jׂo5=S-jz+_ Z̿OWџR-k1Vӣ?^ ZbGJ[Mz%k_)Jׂo5=wW??<3gRlhS_ ;+ucwvc__#dDcUܳ%؜X9߇wϦ6)TO>|sRzo5=wW[Ry _gA'N)?o'+zޟ{jz`>J%Εt#tZ GجݙL?WH/GWvR?#إ 1ыa\'8񟁭 1ыѿR5~ilp߱ցVӣ+sE;v,>W+kſy8Z\yti$OF+Ȼ?[J/GJ#/{qqz:] )ыѿR̹ڗ^6w4VNOT%.go5=SX9OY6w4VDvnroV*F/[ο]7k_)Jׂo5=S-jz+_ Z̿OWџR-k1Vӣ?^ ZbGJ[Mz%k_)Jׂo5=S-jz+_ Z̿OWlJlJ M/ߚwjK__5=Ԗ6kӣ|kzܩ-mצGS[ Mq_[Nm)k6=˷ǝRmzoM; /ߚwjK__5=Ԗ6kӣ|kzܩ-mצGS[ Mq_[Nm)k6=˷ǝRmzoM; /ߚwjK__5=Ԗ6kӣ|kzܩ-mצGS[ Mq_[Nm)k6=˷ǝRmzoM; /ߚwjK__5=Ԗ6kӣ|kzܩ-mצGS[ Mq_[Nm)k6=˷ǝRmzoM; /ߚwjK__5=Ԗ6kӣ|kzܩ-mצGS[ Mq_[Nm)k6=˷ǝRmzoI@>:@KBz !PMQQCn8IENDB` ------MultipartBoundary--DwdtyI9AO66QoDvx27EmnIMwQTN7Hrazyjsby40kC6---- Content-Type: image/png Content-Transfer-Encoding: binary Content-Location: https://jro.io/capacity/diag1.png PNG  IHDRvIrsRGBgAMA a pHYsodIDATx^1r۾ETi3G,ˬ MxSd2-t#$?~@sgN!B95@!PY(vg^}O3!t 亡I(=ʛb'b'}&O^T);b'}{PܯϻS?솪Kq(vg{/S,, x7B}r.bf]YGL'(urP{Xqه[(~ KȆPT-yus_OOnƕ?!W NL#釭|iن%rPl]c?S)?cGvrPdb, }gfO3$b(vg|>(;:+vrPb?Ǥibw>3wT NLn+م^X~98>fyB*b'}&%#k~]I/?mSBBHg !PY(vB,;!tB: N!b'BBHg !PY(vB,;!t(vCt]&_ Zb>{ׂ^-CW-k_P_ Zb>{ׂ^-CW-k_P_ Zb>gyw|a߷ 6W$k_ Z'.Og7<~clHׂ{r6n-~H:ߧc[-k_+8{K-LˆZ-kߧbqΐ?_JyZq잰"߄&lnp:䶥yL,.l1y~-JhN<GK/>E~釥}/; ҋOfϻËcZ*aӿYic0|}ǶR$+.'m4oqoƱV;-75cGgV (tI6lwqhwwwo㱍.G˥~*Q|;žָrz?fG,{|R^Hװyrz_ޱy+}s1#ӭZ,[ #wl>:GXcGؿM/%?>b;+ǞxGO?;+uK;SWcR>J+O)X!{a_ ZzVB/n-{Vއ%˖aRlHׂҗYv_r}ᑻIZׂ}y_ Zb>{ׂ^-v(vu-sWeP3}$Eo3Z-k_P_ Zb>{ׂEׂ^-CW-k_P_ Zb>{ׂ^-CW-k_G-CW-k_P_ Zb>Ga_ Zzyw>4#ێ{ٰX -+v=mt9n:)ׂ^}^5^IZׂ>S?Bt q^וbFc%S=asGcE ;+M>q.BxM~Ip<?ז`sFc%g~#ϥ~\oæyў>}/; ҋ,aӿYic0|}Ƕ1}vhk؛_ޱrS8F?}>^/?N~c?\zžָrz?fG|bukؼX9=/ؼ>([ #wl>:^#vצq{ž̀trUjզ>6_$]BzsrRJhҎ=ԕX.+=/扤KطasGcE;uƊ6w4V}VI(.lv'n-R짣~ߞ#zA k_deO6;:ׂ:b߯[Bؼt -k1b)q8בּ-k1b}˖aRlHׂz s*zIZׂ9[H/6k௥k_ Z|7xK[}֋[ -Z췾R췿QRk_ Z'}-_ Zb>+-r_ Zb>+>[ d}֋} 8Zׂ9[H/6k௥k_ Z'؏5VZׂ9S1/_IZׂY-[bq#BׂY)vwnv~ʷ[-k_Yb_Zb>qn)}V}y};46O$k_ Zg'GK\xbsE-}[N9_/./w|9 ^Wк/S_Oe&lh7ascbt gq#xm 6g4VB fw ?\zY-ӭy\am4|#çc'>U+>QaӼkG#cc8}msgݗW^tYa_ ZzY-MWc^6l4k_K/>+nGR Bׂ(RX$k_ Zgm)&bjO;Oϙb?yw|^-k1bvzٰX -P_ Zb>W}( -k1*v(g].PS"IgعWLk_ Zgh{Ŝ-k_d{bm)fa|CL,n-RK1 _ ZgاG p-s^1-k1bvzٰX -P_ Zb>{ׂ~XtGu-STOׁOfϻËc(vu-Rn~"_ Zb>bϿuoB؜t -k1hO%~:O-k1b*m}r3WRlh{yz*'lh7asGcE 'tN}#xm 6g4VB fw ?\z>j=m4|#çc'>U{ׂ(lhׂ^}( -k1b?@阷e@>4%>/Y-ᑹp#wfZׂY)v;Kf&u-Q+-k1b ۯ_x[-k_{EkLϘ'n-Zӣ*护[-k_)ҧT:8_$k_ Z'د^6l4k_K/>{ׂOfGw~SIZׂ9[Ό+n-^ ιCT'n-RT\t-k_;-k_P_ Zb>+R̯_s|9 ^Wк/S_Oe&lh7asF?<=[{kK9Z?oxex3{~_ҋz9{# "r҆M7=0|=_ ;vS##ϥ~HtplI6l7ظiæ?beams'دm4oqoƱV;-75cGѺw<#ϥ(ZnOwLvW4VNs1Y쵎t 7+'?žqk͇_'?>z6ͻqkڎ{R#ne96Zo<6w4VBvq s߇b|;uƊ6w4V}:M"_ Zb>+V˷+n-3}4/uc7.G??:wG J _ Z=/̿4v-de-W\(k_ Z|/>Ok_ Z߇bZׂ+}bŎ}( -k1k_ ZgH^6l4k_K/>wUP>wUی_ Zb>{ׂ^-CW-k_P_ Zb>(}( -k1k_ ZgH^6l4k_K/>uxqĎ}ߧËׁ֡j!;:ׂY)rx*'/IZׂY)Y2:}{܎wϗUE-}2}7XoOGa_ ZzT5!|zb}r3WRlh{yz*'lh7asGcE g}]ϸ#Ÿq3+u_?;}.=@>ӆM7=0|=_ ;vS##ϥbOo/I6l7ظiæ?beams| ۰i`c{3;vZnj'+v;u{xl#GK/>~Xz1Sa&z0oָrz?fG? ƗNuL1HaqJ#]y #}V鎓Q/+Ş;~%k_}ǎ}[=cwQBb'BBHWGbIENDB` ------MultipartBoundary--DwdtyI9AO66QoDvx27EmnIMwQTN7Hrazyjsby40kC6---- Content-Type: text/css Content-Transfer-Encoding: binary Content-Location: https://jro.io/capacity/style.css @charset "utf-8"; :root { --green-dark: #93c47d; --green-med: #b6d7a8; --green-light: #d9ead3; --red-dark: #c27ba0; --red-med: #d5a6bd; --red-light: #ead1dc; --purple-dark: #8e7cc3; --purple-med: #b4a7d6; --purple-light: #d9d2e9; --blue-dark: #6fa8dc; --blue-med: #9fc5e8; --blue-light: #cfe2f3; --orange-dark: #f6b26b; --orange-med: #f9cb9c; --orange-light: #fce5cd; --yellow-dark: #ffd966; --yellow-med: #ffe599; --yellow-light: #fff2cc; --grey-dark: #b7b7b7; --grey-med: #d9d9d9; --grey-light: #f3f3f3; } body { font-family: Helvetica, sans-serif; margin: 20px auto; gap: 8px; } div#title { text-align: center; width: 1200px; font-size: 17px; margin-right: auto; margin-left: auto; } table { margin-right: auto; margin-left: auto; text-align: center; border-collapse: collapse; } img { display: block; margin-left: auto; margin-right: auto; } p.sect_labels { width: 400px; margin: 25px auto 5px; text-align: center; font-size: 25px; } p.subsect_label { width: 800px; font-style: italic; margin: 5px auto; text-align: center; font-size: 17px; } div#walkthrough { width: 1000px; margin-left: auto; margin-right: auto; padding: 20px; margin-top: -35px; } p.walkthrough { font-size: 17px; margin-bottom: 25px; margin-top: 25px; } p.code { font-family: "Courier New", monospace; white-space: pre-wrap; margin: 0px; font-size: 17px; } p.code-c { font-family: "Courier New", monospace; text-align: center; white-space: pre-wrap; margin: 0px; font-size: 17px; } div.code-block { border-radius: 20px; width: 900px; padding-left: 100px; padding-top: 20px; padding-bottom: 20px; background-color: var(--grey-light); } c { font-family: "Courier New", monospace; } h3 { margin-top: 40px; text-align: center; } table#debug_vals tr:nth-child(1) td { padding-top: 20px; } table#debug_vals tr:nth-last-child(1) td { padding-bottom: 20px; } table.debug#debug_vals { font-family: "Courier New", monospace; background-color: var(--grey-light); } table.debug#debug_vals tr:nth-child(n+3) td:nth-child(1) { text-align: right; width: 275px; } table.debug#debug_vals tr:nth-child(n+3) td:nth-child(2) { text-align: left; width: 275px; } table.debug#debug_vals tr td { padding-left: 5px; padding-right: 5px; } button { width: 150px; } button.change_disk_qty { width: 50px; } button#plus_1 { margin-left: 10px; } button#add_vdev { width: 220px; } td#vdev_button { text-align: center; } td#add_disk { margin-top: 30px; } td#add_disk_button { vertical-align: top; padding-top: 5px; width: 200px; text-align: right; } td#tb_gb_button { vertical-align: top; padding-top: 5px; width: 250px; text-align: left; padding-left: 10px; } td#reset_button { text-align: center; } button#reset_button { width: 220px; } td#res_label { text-align: right; } td#res_input { text-align: left; padding-left: 10px; } td#status { font-size: 14px; padding-top: 10px; height: 100px; text-align: center; white-space: pre-wrap; font-family: "Courier New", Courier, monospace; } td#add_disk_buttons { text-align: center; } .rocker-button { width: 30px; height: 50px; background: rgb(239, 239, 239); border-radius: 4px; color: black; position: relative; border: 1px solid black; overflow: hidden; font-size: 8px; display: inline-block; margin: 0px 3px; vertical-align: middle; } .add_disk_vrule { width: 1px; height: 52px; background: black; border-radius: 4px; position: relative; overflow: hidden; display: inline-block; margin: 0px 3px; vertical-align: middle; } .half { width: 100%; height: 50%; position: absolute; left: 0px; text-align: center; cursor: pointer; transition: background 0.12s, transform 0.08s; user-select: none; z-index: 0; } .half.up { top: -3px; } .half.down { bottom: -2px; } .half.up:hover { background: rgb(229, 229, 229); } .half.down:hover { background: rgb(229, 229, 229); } .half.up:active, .half.down:active { background: rgb(246, 246, 246); } .arrow { display: inline-block; font-size: 12px; line-height: 1; position: relative; top: 50%; transform: translateY(-50%); pointer-events: none; } .center-text { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 12px; pointer-events: none; z-index: 1; } th#first_ssd { border-style: solid; border-width: 3px 2px 2px; border-color: rgb(64, 64, 64) white white; } td#first_ssd { border-style: solid; border-width: 3px 0px 0px; border-color: rgb(64, 64, 64) white white; } th#lowest_custom_size { border-style: solid; border-width: 2px 2px 3px; border-color: white white rgb(64, 64, 64); } td#lowest_custom_size { border-style: solid; border-width: 0px 0px 3px; border-color: white white rgb(64, 64, 64); } table.debug#details { font-family: "Courier New", monospace; } table.debug#details tr:nth-child(1) { background-color: var(--grey-dark); } table.debug#details tr:nth-child(2n+2) { background-color: var(--grey-light); } table.debug#details tr:nth-child(2n+3) { background-color: var(--grey-med); } table.debug#details tr td { padding-left: 25px; padding-right: 25px; } table.debug#details tr:nth-child(n+1) td { font-size: 15px; } table.debug#details tr td:nth-child(6) { width: 250px; } table.inputs tr td:nth-child(1) { padding-top: 5px; width: 275px; text-align: right; } table.inputs tr td:nth-child(2) { padding-top: 5px; width: 100px; text-align: left; padding-left: 10px; } table.inputs tr td:nth-child(3) { padding-top: 5px; width: 200px; text-align: right; } table.inputs tr td:nth-child(4) { padding-top: 5px; width: 275px; text-align: left; padding-left: 10px; } table.inputs tr td table.shelf_count tr td { text-align: center; width: 150px; font-size: 14px; } table.inputs tr td table.shelf_count tr td:nth-child(1) { text-align: right; font-weight: bold; } table.inputs tr td table.shelf_count tr:nth-child(1) { font-weight: bold; } label { font-size: 20px; vertical-align: middle; } label.tooltip { font-size: 12px; margin: 0px 15px; color: rgb(121, 184, 206); border: 1px solid rgb(121, 184, 206); border-radius: 25px; padding: 0px 3px; } input[type="text"] { width: 75px; } select { width: 75px; } input.draid_settings { width: 35px; font-size: 15px; font-family: "Courier New", monospace; } label.draid_settings { font-size: 20px; font-family: "Courier New", monospace; } td#draid_settings { text-align: center; } th { padding-top: 5px; padding-bottom: 5px; border-style: solid; border-color: white; border-width: 2px; } td.results tr td { padding-top: 3px; padding-bottom: 3px; border-style: solid; border-color: white; border-width: 2px; } td.white { background-color: rgb(255, 255, 255); width: 100px; } table.results tr:nth-child(1) th { width: 150px; } table.results tr:nth-child(2) td { font-style: italic; font-size: 14px; } table.results { margin-bottom: 50px; } table#common tr:nth-child(2n+1) td:nth-child(2) { background-color: var(--red-light); } table#common tr:nth-child(2n) td:nth-child(2) { background-color: var(--red-med); } table#common tr:nth-child(1) th:nth-child(2) { background-color: var(--red-dark); } table#common tr:nth-child(2n+1) td:nth-child(n+3):nth-child(-n+5) { background-color: var(--purple-light); } table#common tr:nth-child(2n) td:nth-child(n+3):nth-child(-n+5) { background-color: var(--purple-med); } table#common tr:nth-child(1) th:nth-child(n+3):nth-child(-n+5) { background-color: var(--purple-dark); } table#common tr:nth-child(2n+1) td:nth-child(n+6) { background-color: var(--blue-light); } table#common tr:nth-child(2n) td:nth-child(n+6) { background-color: var(--blue-med); } table#common tr:nth-child(1) th:nth-child(n+6) { background-color: var(--blue-dark); } table#common-ssd tr:nth-child(2n+1) td:nth-child(2) { background-color: var(--green-light); } table#common-ssd tr:nth-child(2n) td:nth-child(2) { background-color: var(--green-med); } table#common-ssd tr:nth-child(1) th:nth-child(2) { background-color: var(--green-dark); } table#common-ssd tr:nth-child(2n+1) td:nth-child(3) { background-color: var(--red-light); } table#common-ssd tr:nth-child(2n) td:nth-child(3) { background-color: var(--red-med); } table#common-ssd tr:nth-child(1) th:nth-child(3) { background-color: var(--red-dark); } table#common-ssd tr:nth-child(2n+1) td:nth-child(n+4):nth-child(-n+5) { background-color: var(--purple-light); } table#common-ssd tr:nth-child(2n) td:nth-child(n+4):nth-child(-n+5) { background-color: var(--purple-med); } table#common-ssd tr:nth-child(1) th:nth-child(n+4):nth-child(-n+5) { background-color: var(--purple-dark); } table#common-ssd tr:nth-child(2n+1) td:nth-child(n+6) { background-color: var(--blue-light); } table#common-ssd tr:nth-child(2n) td:nth-child(n+6) { background-color: var(--blue-med); } table#common-ssd tr:nth-child(1) th:nth-child(n+6) { background-color: var(--blue-dark); } table#stripes tr:nth-child(2n+1) td:nth-child(2) { background-color: var(--green-light); } table#stripes tr:nth-child(2n) td:nth-child(2) { background-color: var(--green-med); } table#stripes tr:nth-child(1) th:nth-child(2) { background-color: var(--green-dark); } table#stripes tr:nth-child(2n+1) td:nth-child(n+3) { background-color: var(--red-light); } table#stripes tr:nth-child(2n) td:nth-child(n+3) { background-color: var(--red-med); } table#stripes tr:nth-child(1) th:nth-child(n+3) { background-color: var(--red-dark); } table#raidz1 tr:nth-child(2n+1) { background-color: var(--purple-light); } table#raidz1 tr:nth-child(2n) { background-color: var(--purple-med); } table#raidz1 tr:nth-child(1) { background-color: var(--purple-dark); } table#raidz2 tr:nth-child(2n+1) { background-color: var(--blue-light); } table#raidz2 tr:nth-child(2n) { background-color: var(--blue-med); } table#raidz2 tr:nth-child(1) { background-color: var(--blue-dark); } table#raidz3 tr:nth-child(2n+1) { background-color: var(--orange-light); } table#raidz3 tr:nth-child(2n) { background-color: var(--orange-med); } table#raidz3 tr:nth-child(1) { background-color: var(--orange-dark); } table#draid tr:nth-child(2n+1) { background-color: var(--yellow-light); } table#draid tr:nth-child(2n) { background-color: var(--yellow-med); } table#draid tr:nth-child(1) { background-color: var(--yellow-dark); } table.results tr:nth-child(2n+2) th { background-color: var(--grey-dark); } table.results tr:nth-child(2n+3) th { background-color: var(--grey-med); } .back { font-family: Helvetica; color: rgb(49, 132, 155); font-size: 20px; font-weight: 400; letter-spacing: -1px; text-align: center; margin: 100px auto 50px; } .footer { font-family: Helvetica; font-size: 10px; letter-spacing: -1px; color: rgb(116, 190, 210); text-align: center; margin: 50px auto; } ------MultipartBoundary--DwdtyI9AO66QoDvx27EmnIMwQTN7Hrazyjsby40kC6------