From stockproductooo@gmail.com Sun Nov 2 00:20:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=DEAR_SOMETHING,FREEMAIL_FROM, FREEMAIL_REPLYTO,HK_RANDOM_REPLYTO,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F3B5C7F54 for ; Sun, 2 Nov 2014 00:20:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E14BE8F8033 for ; Sat, 1 Nov 2014 22:20:37 -0700 (PDT) X-ASG-Debug-ID: 1414905636-04cbb070c550f360001-NocioJ Received: from mail-ie0-f193.google.com (mail-ie0-f193.google.com [209.85.223.193]) by cuda.sgi.com with ESMTP id YTM0AMqBiJ0K8EM7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 01 Nov 2014 22:20:36 -0700 (PDT) X-Barracuda-Envelope-From: stockproductooo@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.193 Received: by mail-ie0-f193.google.com with SMTP id rd18so921226iec.0 for ; Sat, 01 Nov 2014 22:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=KiXnrccpOO6QsbE6moKMho86HC8MqUt2zhq+4IQO++I=; b=0834wOh54vrsY0Z7iIdXVKuGePOtxCM9quWMBYhKGrNQeDaRAHPmOYPuRtnHgpEyIh 3lQIYvxBY+MmpTs08avqg9YUqE936LW/jCNfE3kv0fw3MnxRPU0GYygBSa4qGjmotKTc pPalSsuuXorjItdlg8akwoTlV1ACXlgsWZ4p2TIIshcaDOu020X4EZ3ibPR7PXtlOxOO lcXXF1Y2TFhEx7UyPg8IVq9FnIs8aCrmSa+NNGsRRAKtsc46f58DNJ30apX7XfH1D5Fn eetmMiGj7IyE8gQNyT6ct88Kxc01VoMNBNCR74ICl1PmY73+XECHtnIQCq1ZX2/r2tKH svZQ== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.107.6.7 with SMTP id 7mr40023910iog.38.1414905636024; Sat, 01 Nov 2014 22:20:36 -0700 (PDT) Received: by 10.107.10.141 with HTTP; Sat, 1 Nov 2014 22:20:35 -0700 (PDT) Reply-To: stockinverstmentltd@gmail.com Date: Sun, 2 Nov 2014 05:20:35 +0000 Message-ID: Subject: Dear Sir/Madam From: Stock product X-ASG-Orig-Subj: Dear Sir/Madam To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a113fc3eed387710506d963b7 X-Barracuda-Connect: mail-ie0-f193.google.com[209.85.223.193] X-Barracuda-Start-Time: 1414905636 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.00 X-Barracuda-Spam-Status: No, SCORE=2.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC3_MV0579, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC3_MV0579 Custom rule MV0579 --001a113fc3eed387710506d963b7 Content-Type: text/plain; charset=UTF-8 -- Dear Sir/Madam We have gone through your website and are interested in your products. We want to make a large order for long term import. Please provide us with the following information: Please contact us via our EMAIL stockinverstmentltd@gmail.com 1. Prices FOB 2. Payment Terms 3. Handling Time 4. Minimum Order Quantity (MOQ) 5. Specified delivery date from the Date of Order We would appreciate a quick reply. Thank You ! Best Regards Philip Mark (Sales/Purchasing Manager) STOCK INVERSTMENT LTD George Washington University Dept. of Information Systems & Technology Management Washington, DC 20052 Phone: (+1) 703-684-5885 Fax: (+1) 703-684-0644 Email stockinverstmentltd@gmail.com --001a113fc3eed387710506d963b7 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


--
Dear Sir/Madam
We = have gone through your website and are interested in your products.
We want to make a large order for long term import.
Please provide us with the following information:=C2=A0
= Please contact us via our EMAIL stockinverstmentltd@gmail.com
<= br clear=3D"none">
1. Prices FOB
2. Payment= Terms
3. Handling Time
4. Minimum Order Qu= antity (MOQ)
5. Specified delivery date from the Date of Or= der

We would appreciate= a quick reply.
Thank You !
Best Regards
Philip Mark
(Sales/Purchasing Manager)
STOCK INVERSTMENT LTD
George Washington U= niversity
Dept. of Information Systems & Technology Man= agement
Washington, DC 20052
Phone: (+1) 70= 3-684-5885
Fax: (+1) 703-684-0644
--001a113fc3eed387710506d963b7-- From root@krios.tbi.univie.ac.at Sun Nov 2 00:25:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 192607F54 for ; Sun, 2 Nov 2014 00:25:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9DE48F8035 for ; Sat, 1 Nov 2014 22:25:07 -0700 (PDT) X-ASG-Debug-ID: 1414905905-04bdf038cf5b4810001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id pLRDQB8o5S39vsVh for ; Sat, 01 Nov 2014 22:25:05 -0700 (PDT) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id EA1875EC79; Sun, 2 Nov 2014 06:25:02 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id BCEDE5F463; Sun, 2 Nov 2014 06:25:02 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20141102052502.BCEDE5F463@krios.tbi.univie.ac.at> Date: Sun, 2 Nov 2014 06:25:02 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1414905905 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From sales@galicbinamada.com Sun Nov 2 11:13:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID,T_FRT_CONTACT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9ACB67F56 for ; Sun, 2 Nov 2014 11:13:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8908C304048 for ; Sun, 2 Nov 2014 09:13:21 -0800 (PST) X-ASG-Debug-ID: 1414948397-04cbb070c8523200001-NocioJ Received: from mcs-mbid.mcs.co.id (mcs-mbid.mcs.co.id [175.103.51.47]) by cuda.sgi.com with ESMTP id 0HVcLolemy0FCINJ for ; Sun, 02 Nov 2014 09:13:17 -0800 (PST) X-Barracuda-Envelope-From: sales@galicbinamada.com X-Barracuda-Apparent-Source-IP: 175.103.51.47 X-Nimhost-Watermark: 1415553160.3959@Payn0M492cqd8yuAZILq2g X-Nimhost-From: sales@galicbinamada.com X-Nimhost-SpamCheck: not spam, SpamAssassin (cached, score=-0.599, required 4, autolearn=not spam, BAYES_05 -0.50, DKIM_SIGNED 0.10, DKIM_VALID -0.10, DKIM_VALID_AU -0.10, URIBL_BLOCKED 0.00) X-Nimhost-IP-Protocol: IPv4 X-Nimhost: Found to be clean X-Nimhost-ID: A42EA191943.A97C8 X-Nimhost-Information: Please contact your admin for more information Received: from bellatrix.mcs.co.id (bellatrix.mcs.co.id [175.103.48.100]) by mcs-mbid.mcs.co.id (Postfix) with ESMTP id A42EA191943; Mon, 3 Nov 2014 00:12:38 +0700 (WIT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=galicbinamada.com; s=border; t=1414948425; bh=+HSeOM5O8g8ewuWcoITYYPjKrWk5WHy2vPcA0GcHvGI=; h=Date:From:To:Subject:Reply-To; b=FhmIwVIBcVzRmluRHB3Orv8aFeBL0jBLtO8parssNoXsIT1cbdlAuXd9Z/TlmU3zm RZwwSKn1wqMVfv4ySPooUX9ySBGRkUFyTfOre2oOzwPpGnMjMHPSFmRtttMwuuRjZV b2rxoCS4X1IG12RSsZGdP//ehNMHi8ml/aAS144w= DomainKey-Signature: a=rsa-sha1; s=border; d=galicbinamada.com; c=simple; q=dns; b=vSk+V/vynI+3Ccax1AoJ10wdu97VMniIl54wdGPB5B7GbD7e7e0Vzijy9LsmkyyJj hM3Kzrd5u5OgxJPunRUsBDvodOVAbbVa5kTdYXh73N4axFG/sLRpX8WGWnCCeJ9sXGO Yl6XbLZj5cgP9QiZqN2fzenr1cAj1TFrR/fu44o= Received: from localhost ([127.0.0.1]:60888 helo=webmail.galicbinamada.com) by bellatrix.mcs.co.id with esmtpa (Exim 4.82) (envelope-from ) id 1Xkyhi-00013J-Rc; Mon, 03 Nov 2014 00:12:38 +0700 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Mon, 03 Nov 2014 00:12:38 +0700 From: KRAUSE Arno To: undisclosed-recipients:; Subject: Darlehen angebot Reply-To: krause.arno@att.net X-ASG-Orig-Subj: Darlehen angebot Mail-Reply-To: krause.arno@att.net Message-ID: <2380b3c124d2404272e40016363cc918@galicbinamada.com> X-Sender: sales@galicbinamada.com User-Agent: Roundcube Webmail/1.0.1 X-Barracuda-Connect: mcs-mbid.mcs.co.id[175.103.51.47] X-Barracuda-Start-Time: 1414948397 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11157 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature -- Hallo, Haben Sie Interesse an einer finanziellen Darlehen zu 3%? kontaktieren Sie mich für Details und Bedingungen. meine mail: krause.arno@att.net danke From bfoster@redhat.com Mon Nov 3 10:12:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F2CEA7F47 for ; Mon, 3 Nov 2014 10:12:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3EB9304039 for ; Mon, 3 Nov 2014 08:12:30 -0800 (PST) X-ASG-Debug-ID: 1415031149-04bdf038cf5faee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cs2ASH4HfeJnqDD4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:29 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCTOh003983 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSst023879 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AF4D7122FC1; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 14/17] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Date: Mon, 3 Nov 2014 11:12:23 -0500 X-ASG-Orig-Subj: [PATCH v2 14/17] xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() Message-Id: <1415031146-9107-15-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ifree_cluster() is called to mark all in-memory inodes and inode buffers as stale. This occurs after we've removed the inobt records and dropped any references of inobt data. xfs_ifree_cluster() uses the starting inode number to walk the namespace of inodes expected for a single chunk a cluster buffer at a time. The cluster buffer disk addresses are calculated by decoding the sequential inode numbers expected from the chunk. The problem with this approach is that if the inode chunk being removed is a sparse chunk, not all of the buffer addresses that are calculated as part of this sequence may be inode clusters. Attempting to acquire the buffer based on expected inode characterstics (i.e., cluster length) can lead to errors and is generally incorrect. We already use a couple variables to carry requisite state from xfs_difree() to xfs_ifree_cluster(). Rather than add a third, define a new internal structure to carry the existing parameters through these functions. Add an alloc field that represents the physical allocation bitmap of inodes in the chunk being removed. Modify xfs_ifree_cluster() to check each inode against the bitmap and skip the clusters that were never allocated as real inodes on disk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 18 +++++++++--------- fs/xfs/libxfs/xfs_ialloc.h | 10 ++++++++-- fs/xfs/xfs_inode.c | 28 ++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index af16d5e..1fbd0a8 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1793,8 +1793,7 @@ xfs_difree_inobt( struct xfs_buf *agbp, xfs_agino_t agino, struct xfs_bmap_free *flist, - int *deleted, - xfs_ino_t *first_ino, + struct xfs_icluster *xic, struct xfs_inobt_rec_incore *orec) { struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); @@ -1852,9 +1851,12 @@ xfs_difree_inobt( */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && (rec.ir_free == XFS_INOBT_ALL_FREE)) { + DECLARE_BITMAP(alloc, 64); - *deleted = 1; - *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xic->deleted = 1; + xic->first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + xfs_inobt_ialloc_bitmap(alloc, &rec); + xic->alloc = bitmap_to_u64(alloc, 64); /* * Remove the inode cluster from the AGI B+Tree, adjust the @@ -1879,7 +1881,7 @@ xfs_difree_inobt( xfs_difree_inode_chunk(mp, agno, &rec, flist); } else { - *deleted = 0; + xic->deleted = 0; error = xfs_inobt_update(cur, &rec); if (error) { @@ -2018,8 +2020,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted,/* set if inode cluster was deleted */ - xfs_ino_t *first_ino)/* first inode in deleted cluster */ + struct xfs_icluster *xic) /* cluster info if deleted */ { /* REFERENCED */ xfs_agblock_t agbno; /* block number containing inode */ @@ -2070,8 +2071,7 @@ xfs_difree( /* * Fix up the inode allocation btree. */ - error = xfs_difree_inobt(mp, tp, agbp, agino, flist, deleted, first_ino, - &rec); + error = xfs_difree_inobt(mp, tp, agbp, agino, flist, xic, &rec); if (error) goto error0; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 62c1381..5aa8d6f 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -28,6 +28,13 @@ struct xfs_btree_cur; /* Move inodes in clusters of this size */ #define XFS_INODE_BIG_CLUSTER_SIZE 8192 +struct xfs_icluster { + bool deleted; /* record is deleted */ + xfs_ino_t first_ino; /* first inode number */ + xfs_inoalloc_t alloc; /* inode phys. allocation bitmap for + * sparse chunks */ +}; + /* Calculate and return the number of filesystem blocks per inode cluster */ static inline int xfs_icluster_size_fsb( @@ -90,8 +97,7 @@ xfs_difree( struct xfs_trans *tp, /* transaction pointer */ xfs_ino_t inode, /* inode to be freed */ struct xfs_bmap_free *flist, /* extents to free */ - int *deleted, /* set if inode cluster was deleted */ - xfs_ino_t *first_ino); /* first inode in deleted cluster */ + struct xfs_icluster *ifree); /* cluster info if deleted */ /* * Return the location of the inode in imap, for mapping it into a buffer. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..91a1739 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2185,9 +2185,9 @@ xfs_iunlink_remove( */ STATIC int xfs_ifree_cluster( - xfs_inode_t *free_ip, - xfs_trans_t *tp, - xfs_ino_t inum) + xfs_inode_t *free_ip, + xfs_trans_t *tp, + struct xfs_icluster *xic) { xfs_mount_t *mp = free_ip->i_mount; int blks_per_cluster; @@ -2200,13 +2200,26 @@ xfs_ifree_cluster( xfs_inode_log_item_t *iip; xfs_log_item_t *lip; struct xfs_perag *pag; + xfs_ino_t inum; + inum = xic->first_ino; pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum)); blks_per_cluster = xfs_icluster_size_fsb(mp); inodes_per_cluster = blks_per_cluster << mp->m_sb.sb_inopblog; nbufs = mp->m_ialloc_blks / blks_per_cluster; for (j = 0; j < nbufs; j++, inum += inodes_per_cluster) { + /* + * The allocation bitmap tells us which inodes of the chunk were + * physically allocated. Skip the cluster if an inode falls into + * a sparse region. + */ + if ((xic->alloc & XFS_INOBT_MASK(inum - xic->first_ino)) == 0) { + ASSERT(((inum - xic->first_ino) % + inodes_per_cluster) == 0); + continue; + } + blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), XFS_INO_TO_AGBNO(mp, inum)); @@ -2364,8 +2377,7 @@ xfs_ifree( xfs_bmap_free_t *flist) { int error; - int delete; - xfs_ino_t first_ino; + struct xfs_icluster xic = { 0 }; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ASSERT(ip->i_d.di_nlink == 0); @@ -2381,7 +2393,7 @@ xfs_ifree( if (error) return error; - error = xfs_difree(tp, ip->i_ino, flist, &delete, &first_ino); + error = xfs_difree(tp, ip->i_ino, flist, &xic); if (error) return error; @@ -2398,8 +2410,8 @@ xfs_ifree( ip->i_d.di_gen++; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - if (delete) - error = xfs_ifree_cluster(ip, tp, first_ino); + if (xic.deleted) + error = xfs_ifree_cluster(ip, tp, &xic); return error; } -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3C7057F4E for ; Mon, 3 Nov 2014 10:12:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B0753AC003 for ; Mon, 3 Nov 2014 08:12:31 -0800 (PST) X-ASG-Debug-ID: 1415031150-04cbb070c65526e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gw2G0O3Wa6fZhU1X (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:30 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSYY030032 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSJB017055 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1A43A12342D; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 06/17] xfs: pass inode count through ordered icreate log item Date: Mon, 3 Nov 2014 11:12:15 -0500 X-ASG-Orig-Subj: [PATCH v2 06/17] xfs: pass inode count through ordered icreate log item Message-Id: <1415031146-9107-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031150 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 v5 superblocks use an ordered log item for logging the initialization of inode chunks. The icreate log item is currently hardcoded to an inode count of 64 inodes. The agbno and extent length are used to initialize the inode chunk from log recovery. While an incorrect inode count does not lead to bad inode chunk initialization, we should pass the correct inode count such that log recovery has enough data to perform meaningful validity checks on the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 7 ++++--- fs/xfs/libxfs/xfs_ialloc.h | 2 +- fs/xfs/xfs_log_recover.c | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index fcc8baa..b53fb5d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -231,6 +231,7 @@ xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, struct list_head *buffer_list, + int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, @@ -286,7 +287,7 @@ xfs_ialloc_inode_init( * they track in the AIL as if they were physically logged. */ if (tp) - xfs_icreate_log(tp, agno, agbno, mp->m_ialloc_inos, + xfs_icreate_log(tp, agno, agbno, icount, mp->m_sb.sb_inodesize, length, gen); } else version = 2; @@ -505,8 +506,8 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - error = xfs_ialloc_inode_init(args.mp, tp, NULL, agno, args.agbno, - args.len, prandom_u32()); + error = xfs_ialloc_inode_init(args.mp, tp, NULL, newlen, agno, + args.agbno, args.len, prandom_u32()); if (error) return error; diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 95ad1c0..62c1381 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -156,7 +156,7 @@ int xfs_inobt_get_rec(struct xfs_btree_cur *cur, * Inode chunk initialisation routine */ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, - struct list_head *buffer_list, + struct list_head *buffer_list, int icount, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 00cd7f3..e47fdf9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3093,8 +3093,8 @@ xlog_recover_do_icreate_pass2( XFS_AGB_TO_DADDR(mp, agno, agbno), length, 0)) return 0; - xfs_ialloc_inode_init(mp, NULL, buffer_list, agno, agbno, length, - be32_to_cpu(icl->icl_gen)); + xfs_ialloc_inode_init(mp, NULL, buffer_list, count, agno, agbno, length, + be32_to_cpu(icl->icl_gen)); return 0; } -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8023C7F55 for ; Mon, 3 Nov 2014 10:12:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6ED5D304048 for ; Mon, 3 Nov 2014 08:12:30 -0800 (PST) X-ASG-Debug-ID: 1415031148-04cbb070c75526d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9GddC0RU6MdBkcDg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:29 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSss003963 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCRVH024122 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id DDE2812310A; Mon, 3 Nov 2014 11:12:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 04/17] xfs: introduce inode record hole mask for sparse inode chunks Date: Mon, 3 Nov 2014 11:12:13 -0500 X-ASG-Orig-Subj: [PATCH v2 04/17] xfs: introduce inode record hole mask for sparse inode chunks Message-Id: <1415031146-9107-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inode btrees track 64 inodes per record, regardless of inode size. Thus, inode chunks on disk vary in size depending on the size of the inodes. This creates a contiguous allocation requirement for new inode chunks that can be difficult to satisfy on an aged and fragmented (free space) filesystem. The inode record freecount currently uses 4 bytes on disk to track the free inode count. With a maximum freecount value of 64, only one byte is required. Convert the freecount field to a single byte and reserve two of the remaining 3 higher order bytes left to the hole mask field. The left over byte to the total count field. The hole mask field tracks holes in the chunks of physical space that the inode record refers to. This facilitates the sparse allocation of inode chunks when contiguous chunks are not available and allows the inode btrees to identify what portions of the chunk contain valid inodes. The total count field contains the total number of valid inodes referred to by the record. This can also be deduced from the hole mask. The count field provides clarity and redundancy for internal record verification. Note that both fields are initialized to zero to maintain backwards compatibility with existing filesystems (e.g., the higher order bytes of freecount are always 0). Tracking holes means that the hole mask is initialized to zero and thus remains "valid" in accordance with a non-sparse inode fs when no sparse chunks are physically allocated. Update the inode record management functions to handle the new fields and initialize to zero. [XXX: The count field breaks this notion of easy backwards compatibility with !sparseinode fs. Should we reconsider the addition of total count or the idea of converting back and forth between sparse inode fs with a simple feature bit? I lean towards the latter at the moment as we could implement conversion in xfs_repair if there is ever user demand.] Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 8 ++++++-- fs/xfs/libxfs/xfs_ialloc.c | 12 ++++++++++-- fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 7e42bba..873c4d1 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -217,13 +217,17 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) */ typedef struct xfs_inobt_rec { __be32 ir_startino; /* starting inode number */ - __be32 ir_freecount; /* count of free inodes (set bits) */ + __be16 ir_holemask; /* hole mask for sparse chunks */ + __u8 ir_count; /* total inode count */ + __u8 ir_freecount; /* count of free inodes (set bits) */ __be64 ir_free; /* free inode mask */ } xfs_inobt_rec_t; typedef struct xfs_inobt_rec_incore { xfs_agino_t ir_startino; /* starting inode number */ - __int32_t ir_freecount; /* count of free inodes (set bits) */ + __uint16_t ir_holemask; /* hole mask for sparse chunks */ + __uint8_t ir_count; /* total inode count */ + __uint8_t ir_freecount; /* count of free inodes (set bits) */ xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 89949a3..fcc8baa 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -68,6 +68,8 @@ xfs_inobt_lookup( int *stat) /* success/failure */ { cur->bc_rec.i.ir_startino = ino; + cur->bc_rec.i.ir_holemask = 0; + cur->bc_rec.i.ir_count = 0; cur->bc_rec.i.ir_freecount = 0; cur->bc_rec.i.ir_free = 0; return xfs_btree_lookup(cur, dir, stat); @@ -85,7 +87,9 @@ xfs_inobt_update( union xfs_btree_rec rec; rec.inobt.ir_startino = cpu_to_be32(irec->ir_startino); - rec.inobt.ir_freecount = cpu_to_be32(irec->ir_freecount); + rec.inobt.ir_holemask = cpu_to_be16(irec->ir_holemask); + rec.inobt.ir_count = irec->ir_count; + rec.inobt.ir_freecount = irec->ir_freecount; rec.inobt.ir_free = cpu_to_be64(irec->ir_free); return xfs_btree_update(cur, &rec); } @@ -105,7 +109,9 @@ xfs_inobt_get_rec( error = xfs_btree_get_rec(cur, &rec, stat); if (!error && *stat == 1) { irec->ir_startino = be32_to_cpu(rec->inobt.ir_startino); - irec->ir_freecount = be32_to_cpu(rec->inobt.ir_freecount); + irec->ir_holemask = be16_to_cpu(rec->inobt.ir_holemask); + irec->ir_count = rec->inobt.ir_count; + irec->ir_freecount = rec->inobt.ir_freecount; irec->ir_free = be64_to_cpu(rec->inobt.ir_free); } return error; @@ -121,6 +127,8 @@ xfs_inobt_insert_rec( xfs_inofree_t free, int *stat) { + cur->bc_rec.i.ir_holemask = 0; + cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ cur->bc_rec.i.ir_freecount = freecount; cur->bc_rec.i.ir_free = free; return xfs_btree_insert(cur, stat); diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index c9b06f3..b2a9117 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -169,7 +169,9 @@ xfs_inobt_init_rec_from_cur( union xfs_btree_rec *rec) { rec->inobt.ir_startino = cpu_to_be32(cur->bc_rec.i.ir_startino); - rec->inobt.ir_freecount = cpu_to_be32(cur->bc_rec.i.ir_freecount); + rec->inobt.ir_holemask = cpu_to_be16(cur->bc_rec.i.ir_holemask); + rec->inobt.ir_count = cur->bc_rec.i.ir_count; + rec->inobt.ir_freecount = cur->bc_rec.i.ir_freecount; rec->inobt.ir_free = cpu_to_be64(cur->bc_rec.i.ir_free); } -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8F8C47F56 for ; Mon, 3 Nov 2014 10:12:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E36E304051 for ; Mon, 3 Nov 2014 08:12:30 -0800 (PST) X-ASG-Debug-ID: 1415031149-04cbb070c85526e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HDoGHV5xdcpYfrUN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:29 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSdL003970 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSg5023877 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7734F122F87; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 12/17] xfs: update free inode record logic to support sparse inode records Date: Mon, 3 Nov 2014 11:12:21 -0500 X-ASG-Orig-Subj: [PATCH v2 12/17] xfs: update free inode record logic to support sparse inode records Message-Id: <1415031146-9107-13-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_difree_inobt() uses logic in a couple places that assume inobt records refer to fully allocated chunks. Specifically, the use of mp->m_ialloc_inos can cause problems for inode chunks that are sparsely allocated. Sparse inode chunks can, by definition, define a smaller number of inodes than a full inode chunk. Fix the logic that determines whether an inode record should be removed from the inobt to use the ir_free mask rather than ir_freecount. Fix the agi counters modification to use ir_freecount to add the actual number of inodes freed rather than assuming a full inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 2bc998d..c9c7289 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1774,7 +1774,7 @@ xfs_difree_inobt( * When an inode cluster is free, it becomes eligible for removal */ if (!(mp->m_flags & XFS_MOUNT_IKEEP) && - (rec.ir_freecount == mp->m_ialloc_inos)) { + (rec.ir_free == XFS_INOBT_ALL_FREE)) { *deleted = 1; *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); @@ -1784,7 +1784,7 @@ xfs_difree_inobt( * AGI and Superblock inode counts, and mark the disk space * to be freed when the transaction is committed. */ - ilen = mp->m_ialloc_inos; + ilen = rec.ir_freecount; be32_add_cpu(&agi->agi_count, -ilen); be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); @@ -1907,7 +1907,7 @@ xfs_difree_finobt( * keeping inode chunks permanently on disk, remove the record. * Otherwise, update the record with the new information. */ - if (rec.ir_freecount == mp->m_ialloc_inos && + if (rec.ir_free == XFS_INOBT_ALL_FREE && !(mp->m_flags & XFS_MOUNT_IKEEP)) { error = xfs_btree_delete(cur, &i); if (error) -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AE41A7F57 for ; Mon, 3 Nov 2014 10:12:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7761B30404E for ; Mon, 3 Nov 2014 08:12:30 -0800 (PST) X-ASG-Debug-ID: 1415031148-04bdf038d15faee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xckFTLW6IFuCD9h9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:29 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSff027586 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCRHA017036 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AF5951204CA; Mon, 3 Nov 2014 11:12:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 00/17] xfs: sparse inode chunks Date: Mon, 3 Nov 2014 11:12:09 -0500 X-ASG-Orig-Subj: [PATCH v2 00/17] xfs: sparse inode chunks Message-Id: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Here's another pass of sparse inode chunk support. There are still some outstanding things to resolve, but I think this hits on some of the larger comments of v1 and serves as a decent checkpoint. My biggest open question at this point is how to handle backwards compatibility in relation to the behavior of the new ir_count field introduced in v2. The current behavior is to use ir_count whenever sparse inode chunk support is enabled (from a feature bit perspective, see xfs_inobt_insert()). The side effect of this is that backwards compatibility is no longer solely tied to the existence of sparse inode chunks. In other words, we cannot simply toggle off a feature bit for fs' without sparse inode allocations, as the existing allocations have an ir_count == 64 value in the upper bytes of the old ir_free field. We can follow a couple alternate directions that I can think of: - Only use ir_count for actual sparse chunks. E.g., ir_count == 0 for chunks with XFS_INODES_PER_CHUNK inodes. - Always use ir_count when feature bit enabled, consider inverting ir_holemask to ir_allocmask or some such to simplify. The further I progress on this work, the more I think the backwards compatibility has limited utility, poor cost-benefit and I lean towards the second approach. That said, I don't necessarily see a problem with retaining the backwards compatible nature of the on-disk structures with the understanding that the ability for such conversions probably will not be provided in the near term. E.g., backwards compat. simply becomes a design characteristic to leave the window open for future work. But I'm also not a huge fan of letting some unknown conversion mechanism from the future put too many constraints on simplification of an existing design. E.g., what's the point if the end result ends up being some kind of userspace conversion via xfs_repair (for example) that can track sparse chunks and fix up the records appropriately? Thoughts? Brian v2: - Use a manually set feature bit instead of dynamic based on the existence of sparse inode chunks. - Add sb/mp fields for sparse alloc. granularity (use instead of cluster size). - Undo xfs_inobt_insert() loop removal to avoid breakage of larger page size arches. - Rename sparse record overlap helper and do XFS_LOOKUP_LE search. - Use byte of pad space in inobt record for inode count field. - Convert bitmap mgmt to use generic bitmap code. - Rename XFS_INODES_PER_SPCHUNK to XFS_INODES_PER_HOLEMASK_BIT. - Add fs geometry bit for sparse inodes. - Rebase to latest for-next (bulkstat refactor). v1: http://oss.sgi.com/archives/xfs/2014-07/msg00355.html Brian Foster (17): xfs: add sparse inode chunk alignment superblock field xfs: use sparse chunk alignment for min. inode allocation requirement xfs: define sparse inode chunks v5 sb feature bit and helper function xfs: introduce inode record hole mask for sparse inode chunks xfs: create macros/helpers for dealing with sparse inode chunks xfs: pass inode count through ordered icreate log item xfs: handle sparse inode chunks in icreate log recovery xfs: create helper to manage record overlap for sparse inode chunks xfs: allocate sparse inode chunks on full chunk allocation failure xfs: helpers to convert holemask to/from generic bitmap xfs: filter out sparse regions from individual inode allocation xfs: update free inode record logic to support sparse inode records xfs: only free allocated regions of inode chunks xfs: skip unallocated regions of inode chunks in xfs_ifree_cluster() xfs: use actual inode count for sparse records in bulkstat/inumbers xfs: add fs geometry bit for sparse inode chunks xfs: enable sparse inode chunks for v5 superblocks fs/xfs/libxfs/xfs_format.h | 17 +- fs/xfs/libxfs/xfs_ialloc.c | 456 ++++++++++++++++++++++++++++++++++++--- fs/xfs/libxfs/xfs_ialloc.h | 17 +- fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +- fs/xfs/libxfs/xfs_sb.c | 9 +- fs/xfs/libxfs/xfs_sb.h | 16 +- fs/xfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 4 +- fs/xfs/xfs_inode.c | 28 ++- fs/xfs/xfs_itable.c | 16 +- fs/xfs/xfs_log_recover.c | 23 +- fs/xfs/xfs_mount.h | 2 + 12 files changed, 525 insertions(+), 68 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF3057F58 for ; Mon, 3 Nov 2014 10:12:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B957AC005 for ; Mon, 3 Nov 2014 08:12:30 -0800 (PST) X-ASG-Debug-ID: 1415031149-04bdf038d05faee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YByH2yuhYQxoCK8f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:29 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSlj003972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSfY017059 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 543E9124AB7; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 09/17] xfs: allocate sparse inode chunks on full chunk allocation failure Date: Mon, 3 Nov 2014 11:12:18 -0500 X-ASG-Orig-Subj: [PATCH v2 09/17] xfs: allocate sparse inode chunks on full chunk allocation failure Message-Id: <1415031146-9107-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_alloc() makes several attempts to allocate a full inode chunk. If all else fails, reduce the allocation to the minimum sparse granularity and attempt to allocate a sparse inode chunk. If sparse chunk allocation succeeds, check whether an inobt record already exists that can track the chunk. If so, inherit and update the existing record. Otherwise, insert a new record for the sparse chunk. Update xfs_inobt_insert_rec() to take the holemask as a parameter and set the associated field on disk. Create the xfs_inobt_update_insert() helper to handle the sparse chunk allocation case - insert or update an existing record depending on whether it already exists. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 149 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 136 insertions(+), 13 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 6879213..d22dd8a 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -123,12 +123,16 @@ xfs_inobt_get_rec( STATIC int xfs_inobt_insert_rec( struct xfs_btree_cur *cur, + __uint16_t holemask, + __uint8_t count, __int32_t freecount, xfs_inofree_t free, int *stat) { - cur->bc_rec.i.ir_holemask = 0; - cur->bc_rec.i.ir_count = 0; /* zero for backwards compatibility */ + ASSERT(count == 0 || xfs_sb_version_hassparseinodes(&cur->bc_mp->m_sb)); + + cur->bc_rec.i.ir_holemask = holemask; + cur->bc_rec.i.ir_count = count; cur->bc_rec.i.ir_freecount = freecount; cur->bc_rec.i.ir_free = free; return xfs_btree_insert(cur, stat); @@ -152,6 +156,19 @@ xfs_inobt_insert( xfs_agino_t thisino; int i; int error; + uint8_t count; + + /* + * Only set ir_count in the inobt record if the sparse inodes feature is + * enabled. If disabled, we must maintain backwards compatibility with + * the older inobt record format where the current count and holemask + * fields map to the higher order bytes of freecount and thus must be + * zeroed. + */ + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) + count = XFS_INODES_PER_CHUNK; + else + count = 0; cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); @@ -165,7 +182,7 @@ xfs_inobt_insert( } ASSERT(i == 0); - error = xfs_inobt_insert_rec(cur, XFS_INODES_PER_CHUNK, + error = xfs_inobt_insert_rec(cur, 0, count, XFS_INODES_PER_CHUNK, XFS_INOBT_ALL_FREE, &i); if (error) { xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); @@ -175,8 +192,45 @@ xfs_inobt_insert( } xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; +} + +STATIC int +xfs_inobt_update_insert( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + struct xfs_inobt_rec_incore *rec, /* record to update/insert */ + xfs_btnum_t btnum) +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + int i; + int error; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + error = xfs_inobt_lookup(cur, rec->ir_startino, XFS_LOOKUP_EQ, &i); + if (i == 1) { + error = xfs_inobt_update(cur, rec); + if (error) + goto error; + } else { + error = xfs_inobt_insert_rec(cur, rec->ir_holemask, + rec->ir_count, rec->ir_freecount, rec->ir_free, + &i); + if (error) + goto error; + ASSERT(i == 1); + } + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; + +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; } /* @@ -437,6 +491,10 @@ xfs_ialloc_ag_alloc( xfs_agino_t newlen; /* new number of inodes */ int isaligned = 0; /* inode allocation at stripe unit */ /* boundary */ + uint16_t allocmask = (uint16_t) -1; /* init. to full chunk */ + struct xfs_inobt_rec_incore rec; + int offset; + struct xfs_perag *pag; memset(&args, 0, sizeof(args)); @@ -552,6 +610,27 @@ xfs_ialloc_ag_alloc( return error; } + /* + * Finally, try a sparse allocation if the filesystem supports it. + */ + if (xfs_sb_version_hassparseinodes(&args.mp->m_sb) && + args.fsbno == NULLFSBLOCK) { + args.type = XFS_ALLOCTYPE_NEAR_BNO; + args.agbno = be32_to_cpu(agi->agi_root); + args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); + args.alignment = args.mp->m_sb.sb_inoalignmt; + + args.minlen = args.mp->m_ialloc_min_blks; + args.maxlen = args.minlen; + + error = xfs_alloc_vextent(&args); + if (error) + return error; + + newlen = args.len << args.mp->m_sb.sb_inopblog; + allocmask = (1 << (newlen / XFS_INODES_PER_HOLEMASK_BIT)) - 1; + } + if (args.fsbno == NULLFSBLOCK) { *alloc = 0; return 0; @@ -583,20 +662,62 @@ xfs_ialloc_ag_alloc( xfs_perag_put(pag); agi->agi_newino = cpu_to_be32(newino); - /* - * Insert records describing the new inode chunk into the btrees. - */ - error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_INO); - if (error) - return error; + if (xfs_inobt_issparse(~allocmask)) { + /* + * We've allocated a sparse chunk... + */ + error = xfs_inobt_rec_exists(args.mp, tp, agbp, newino, + newlen, XFS_BTNUM_INO, &rec); + if (error) + return error; + if (rec.ir_startino == NULLAGINO) { + /* no existing record, set all fields */ + rec.ir_startino = newino; + rec.ir_holemask = ~allocmask; + rec.ir_count = newlen; + rec.ir_freecount = newlen; + rec.ir_free = XFS_INOBT_ALL_FREE; + } else { + /* we already have a record, update it */ + offset = newino - rec.ir_startino; + allocmask <<= offset / XFS_INODES_PER_HOLEMASK_BIT; + + ASSERT(offset % XFS_INODES_PER_HOLEMASK_BIT == 0); + ASSERT(rec.ir_count + newlen <= XFS_INODES_PER_CHUNK); + ASSERT(rec.ir_freecount + newlen <= + XFS_INODES_PER_CHUNK); + + rec.ir_count += newlen; + rec.ir_freecount += newlen; + rec.ir_holemask &= ~allocmask; + } - if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, + XFS_BTNUM_INO); + if (error) + return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_update_insert(args.mp, tp, agbp, &rec, + XFS_BTNUM_FINO); + if (error) + return error; + } + } else { + /* full chunk - insert new records to both btrees */ error = xfs_inobt_insert(args.mp, tp, agbp, newino, newlen, - XFS_BTNUM_FINO); + XFS_BTNUM_INO); if (error) return error; + + if (xfs_sb_version_hasfinobt(&args.mp->m_sb)) { + error = xfs_inobt_insert(args.mp, tp, agbp, newino, + newlen, XFS_BTNUM_FINO); + if (error) + return error; + } } + /* * Log allocation group header fields */ @@ -1657,7 +1778,9 @@ xfs_difree_finobt( */ XFS_WANT_CORRUPTED_GOTO(ibtrec->ir_freecount == 1, error); - error = xfs_inobt_insert_rec(cur, ibtrec->ir_freecount, + error = xfs_inobt_insert_rec(cur, ibtrec->ir_holemask, + ibtrec->ir_count, + ibtrec->ir_freecount, ibtrec->ir_free, &i); if (error) goto error; -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8899F7F5D for ; Mon, 3 Nov 2014 10:12:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 770B9304048 for ; Mon, 3 Nov 2014 08:12:34 -0800 (PST) X-ASG-Debug-ID: 1415031149-04cb6c2efc4fcb90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pU4psoqAkbV5PQXx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:29 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCShv003973 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCS0j017061 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5E2FC1258D2; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 10/17] xfs: helpers to convert holemask to/from generic bitmap Date: Mon, 3 Nov 2014 11:12:19 -0500 X-ASG-Orig-Subj: [PATCH v2 10/17] xfs: helpers to convert holemask to/from generic bitmap Message-Id: <1415031146-9107-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inobt record holemask field is a condensed data type designed to fit into the existing on-disk record and is zero based (allocated regions are set to 0, sparse regions are set to 1) to provide backwards compatibility. This makes the type somewhat complex for use in higher level inode manipulations such as individual inode allocation, etc. Rather than foist the complexity of dealing with this field to every bit of logic that requires inode granular information, create the xfs_inobt_ialloc_bitmap() helper to convert the holemask to an inode allocation bitmap. The inode allocation bitmap is inode granularity similar to the inobt record free mask and indicates which inodes of the chunk are physically allocated on disk, irrespective of whether the inode is considered allocated or free by the filesystem. The generic bitmap type requires the use of generic kernel bitmap APIs. The bitmap_to_u64() helper is provided to convert the bitmap back to a native 64-bit type (for native bitwise operations). This is required because the generic bitmap code represents a bitmap as an array of unsigned long in a little endian style (though each array value is cpu order). To ensure compatibility with various word sizes and endianness', bitmap_to_u64() exports the bitmap to little endian and swaps back to cpu byte order. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 1 + fs/xfs/libxfs/xfs_ialloc.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index c81c1a7..f2ff6d5 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -202,6 +202,7 @@ typedef __be32 xfs_alloc_ptr_t; #define XFS_FIBT_CRC_MAGIC 0x46494233 /* 'FIB3' */ typedef __uint64_t xfs_inofree_t; +typedef __uint64_t xfs_inoalloc_t; #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) #define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index d22dd8a..88ca72f 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -910,6 +910,73 @@ xfs_ialloc_get_rec( return 0; } +static inline uint64_t +bitmap_to_u64( + const unsigned long *bitmap, + int nbits) +{ + __le64 lebitmap; + + ASSERT(nbits <= 64); + + /* + * The bitmap format depends on the native word size. E.g., bit 0 could + * land in the middle of the 64 bits on a big endian 32-bit arch (see + * arch/powerpc/include/asm/bitops.h). To handle this, export the bitmap + * as 64-bit little endian and convert back to native byte order. + */ + bitmap_copy_le(&lebitmap, bitmap, nbits); + return le64_to_cpu(lebitmap); +} + +/* + * Convert the inode record holemask to an inode allocation bitmap. The inode + * allocation bitmap is inode granularity and specifies whether an inode is + * physically allocated on disk (not whether the inode is considered allocated + * or free by the fs). + * + * We have to be careful with regard to byte order and word size since the + * generic bitmap code uses primitive types. + */ +STATIC void +xfs_inobt_ialloc_bitmap( + unsigned long *allocbmap, + struct xfs_inobt_rec_incore *rec) +{ + int nextbit; + DECLARE_BITMAP(holemask, 16); + + bitmap_zero(allocbmap, 64); + + /* + * bitmaps are represented as an array of unsigned long (each in cpu + * byte order). ir_holemask is only 16 bits, so direct assignment is + * safe. + */ + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * holemask is a 16-bit bitmap and inode records span 64 inodes. Thus + * each holemask bit represents multiple (XFS_INODES_PER_HOLEMASK_BIT) + * inodes. Since holemask bits represent holes, each set bit represents + * a region of the physical chunk that is not tracked by the record. + * + * We want an inode granularity allocation bitmap. We have to invert the + * holemask and set XFS_INODES_PER_HOLEMASK_BIT bits for each set bit. + * We invert and expand simultaneously by walking the unset (zeroed) + * holemask bits. For each zero bit in holemask, set the corresponding + * XFS_INODES_PER_HOLEMASK_BIT bits in the allocation bitmap. + */ + nextbit = find_first_zero_bit(holemask, 16); + while (nextbit < 16) { + bitmap_set(allocbmap, nextbit * XFS_INODES_PER_HOLEMASK_BIT, + XFS_INODES_PER_HOLEMASK_BIT); + + nextbit = find_next_zero_bit(holemask, 16, nextbit + 1); + } +} + /* * Allocate an inode using the inobt-only algorithm. */ -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7249B7F58 for ; Mon, 3 Nov 2014 10:12:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E505BAC005 for ; Mon, 3 Nov 2014 08:12:34 -0800 (PST) X-ASG-Debug-ID: 1415031149-04cb6c2efa4fcb90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id G7WA0wiqVznDj1X0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:30 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCTup027598 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSJD017055 for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B39C11204CA; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 15/17] xfs: use actual inode count for sparse records in bulkstat/inumbers Date: Mon, 3 Nov 2014 11:12:24 -0500 X-ASG-Orig-Subj: [PATCH v2 15/17] xfs: use actual inode count for sparse records in bulkstat/inumbers Message-Id: <1415031146-9107-16-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031149 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The bulkstat and inumbers mechanisms make the assumption that inode records consist of a full 64 inode chunk in several places. E.g., this is used to track how many inodes have been processed overall as well as to determine when all in-use inodes of a record have been processed. The record processing, in particular, increments the record freecount for each in-use inode until it hits the expected max of 64. This is invalid for sparse inode records. While all inodes might be marked free in the free mask regardless of whether they are allocated on disk, ir_freecount is based on the total number of physically allocated inodes and thus may be less than 64 inodes on a completely free inode chunk. Create the xfs_inobt_count() helper to calculate the total number of physically allocated inodes based on the holemask. Use the helper in xfs_bulkstat() and xfs_inumbers() instead of the fixed XFS_INODE_PER_CHUNK value to ensure correct accounting in the event of sparse inode records. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 29 +++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.h | 5 +++++ fs/xfs/xfs_itable.c | 16 +++++++++++----- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 1fbd0a8..5e92422 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1002,6 +1002,35 @@ xfs_inobt_first_free_inode( } /* + * Calculate the real count of inodes in a chunk. + */ +int +xfs_inobt_count( + struct xfs_mount *mp, + struct xfs_inobt_rec_incore *rec) +{ + int inocount; + DECLARE_BITMAP(allocbmap, XFS_INODES_PER_CHUNK); + + if (xfs_sb_version_hassparseinodes(&mp->m_sb)) { + /* + * allocated inode bit count should match ir_count + * + * TODO: it might be preferable to tie this validation to an + * fs operation rather than a simple utility function call + */ + xfs_inobt_ialloc_bitmap(allocbmap, rec); + inocount = bitmap_weight(allocbmap, XFS_INODES_PER_CHUNK); + WARN_ON(inocount != rec->ir_count); + } + + if (!xfs_inobt_issparse(rec->ir_holemask)) + return XFS_INODES_PER_CHUNK; + + return rec->ir_count; +} + +/* * Allocate an inode using the inobt-only algorithm. */ STATIC int diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 5aa8d6f..527d889 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -166,4 +166,9 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); +/* + * Calculate the real count of inodes in a chunk. + */ +int xfs_inobt_count(struct xfs_mount *mp, struct xfs_inobt_rec_incore *rec); + #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 7765ff7..b44a9f0 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -254,7 +254,8 @@ xfs_bulkstat_grab_ichunk( } irec->ir_free |= xfs_inobt_maskn(0, idx); - *icount = XFS_INODES_PER_CHUNK - irec->ir_freecount; + *icount = xfs_inobt_count(cur->bc_mp, irec) - + irec->ir_freecount; } return 0; @@ -285,7 +286,7 @@ xfs_bulkstat_ag_ichunk( for (agino = irbp->ir_startino, chunkidx = clustidx = 0; XFS_BULKSTAT_UBLEFT(ubleft) && - irbp->ir_freecount < XFS_INODES_PER_CHUNK; + irbp->ir_freecount < xfs_inobt_count(mp, irbp); chunkidx++, clustidx++, agino++) { int fmterror; /* bulkstat formatter result */ int ubused; @@ -430,6 +431,8 @@ xfs_bulkstat( goto del_cursor; if (icount) { irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; @@ -461,13 +464,16 @@ xfs_bulkstat( * If this chunk has any allocated inodes, save it. * Also start read-ahead now for this chunk. */ - if (r.ir_freecount < XFS_INODES_PER_CHUNK) { + if (r.ir_freecount < xfs_inobt_count(mp, &r)) { xfs_bulkstat_ichunk_ra(mp, agno, &r); irbp->ir_startino = r.ir_startino; + irbp->ir_holemask = r.ir_holemask; + irbp->ir_count = r.ir_count; irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - icount += XFS_INODES_PER_CHUNK - r.ir_freecount; + icount += xfs_inobt_count(mp, &r) - + r.ir_freecount; } /* * Set agino to after this chunk and bump the cursor. @@ -620,7 +626,7 @@ xfs_inumbers( buffer[bufidx].xi_startino = XFS_AGINO_TO_INO(mp, agno, r.ir_startino); buffer[bufidx].xi_alloccount = - XFS_INODES_PER_CHUNK - r.ir_freecount; + xfs_inobt_count(mp, &r) - r.ir_freecount; buffer[bufidx].xi_allocmask = ~r.ir_free; if (++bufidx == bcount) { long written; -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:12:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 80D6D7F56 for ; Mon, 3 Nov 2014 10:12:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 497768F8039 for ; Mon, 3 Nov 2014 08:12:31 -0800 (PST) X-ASG-Debug-ID: 1415031150-04bdf038d05faef0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NFb6TzlFqwezxStQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:12:30 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSP0030033 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSNE024129 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0CFF51235D1; Mon, 3 Nov 2014 11:12:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Date: Mon, 3 Nov 2014 11:12:14 -0500 X-ASG-Orig-Subj: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Message-Id: <1415031146-9107-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415031150 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Sparse inode chunks allow the traditional inode btree record format to describe an inode chunk that is not fully allocated and/or contiguous. The granularity of a sparse chunk is defined by the the 16-bit holemask field in the inode record. Assuming 64 inodes per full chunk, a single holemask bit accounts for 4 inodes. Define a constant for the number of inodes per holemask bit and a helper function to easily detect sparse inode chunks. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_format.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 873c4d1..c81c1a7 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -207,6 +207,10 @@ typedef __uint64_t xfs_inofree_t; #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) #define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) +#define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(__uint16_t)) +#define XFS_INODES_PER_HOLEMASK_BIT \ + (XFS_INODES_PER_CHUNK / (NBBY * sizeof(__uint16_t))) + static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) { return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; @@ -231,6 +235,10 @@ typedef struct xfs_inobt_rec_incore { xfs_inofree_t ir_free; /* free inode mask */ } xfs_inobt_rec_incore_t; +static inline bool xfs_inobt_issparse(uint16_t holemask) +{ + return holemask == 0 ? false : true; +} /* * Key structure -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:35:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 415597F47 for ; Mon, 3 Nov 2014 10:35:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F435304039 for ; Mon, 3 Nov 2014 08:35:49 -0800 (PST) X-ASG-Debug-ID: 1415032547-04bdf038d15fec70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sMUWLEiXjWAkaYxP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:35:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GZkaa014509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:35:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSYH028189 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 669351258D3; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 11/17] xfs: filter out sparse regions from individual inode allocation Date: Mon, 3 Nov 2014 11:12:20 -0500 X-ASG-Orig-Subj: [PATCH v2 11/17] xfs: filter out sparse regions from individual inode allocation Message-Id: <1415031146-9107-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Inode allocation from an existing record with free inodes traditionally selects the first inode available according to the ir_free mask. With sparse inode chunks, the ir_free mask could refer to an unallocated region. We must mask the unallocated regions out of ir_free before using it to select a free inode in the chunk. Create the xfs_inobt_first_free_inode() helper to find the first free inode available of the allocated regions of the inode chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 88ca72f..2bc998d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -978,6 +978,30 @@ xfs_inobt_ialloc_bitmap( } /* + * Return the offset of the first free inode in the record. If the inode chunk + * is sparsely allocated, we convert the record holemask to inode granularity + * and mask off the unallocated regions from the inode free mask. + */ +STATIC int +xfs_inobt_first_free_inode( + struct xfs_inobt_rec_incore *rec) +{ + xfs_inofree_t realfree; + DECLARE_BITMAP(alloc, 64); + + /* if there are no holes, return the first available offset */ + if (!xfs_inobt_issparse(rec->ir_holemask)) + return xfs_lowbit64(rec->ir_free); + + xfs_inobt_ialloc_bitmap(alloc, rec); + realfree = bitmap_to_u64(alloc, 64); + + realfree &= rec->ir_free; + + return xfs_lowbit64(realfree); +} + +/* * Allocate an inode using the inobt-only algorithm. */ STATIC int @@ -1207,7 +1231,7 @@ newino: } alloc_inode: - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % @@ -1460,7 +1484,7 @@ xfs_dialloc_ag( if (error) goto error_cur; - offset = xfs_lowbit64(rec.ir_free); + offset = xfs_inobt_first_free_inode(&rec); ASSERT(offset >= 0); ASSERT(offset < XFS_INODES_PER_CHUNK); ASSERT((XFS_AGINO_TO_OFFSET(mp, rec.ir_startino) % -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:35:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6D72D7F50 for ; Mon, 3 Nov 2014 10:35:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A5428F804C for ; Mon, 3 Nov 2014 08:35:49 -0800 (PST) X-ASG-Debug-ID: 1415032547-04cbb070c85559b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id u2gBIlotUoH67Wjy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:35:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GZkaY014509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:35:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCRLQ028168 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id CD7AD122FC1; Mon, 3 Nov 2014 11:12:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 03/17] xfs: define sparse inode chunks v5 sb feature bit and helper function Date: Mon, 3 Nov 2014 11:12:12 -0500 X-ASG-Orig-Subj: [PATCH v2 03/17] xfs: define sparse inode chunks v5 sb feature bit and helper function Message-Id: <1415031146-9107-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The sparse inode chunks feature uses the helper function to enable the allocation of sparse inode chunks. The incompatible feature bit is set on disk at mkfs time. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_sb.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h index 4e5aaa8..eeb4058 100644 --- a/fs/xfs/libxfs/xfs_sb.h +++ b/fs/xfs/libxfs/xfs_sb.h @@ -509,6 +509,7 @@ xfs_sb_has_ro_compat_feature( } #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ (XFS_SB_FEAT_INCOMPAT_FTYPE) @@ -558,6 +559,12 @@ static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); } +static inline bool xfs_sb_version_hassparseinodes(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_SPINODES); +} + /* * end of superblock version macros */ -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:35:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 517957F4E for ; Mon, 3 Nov 2014 10:35:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E437BAC006 for ; Mon, 3 Nov 2014 08:35:48 -0800 (PST) X-ASG-Debug-ID: 1415032548-04bdf038d25fec80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LveS8scFpaKKrAjn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:35:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GZkae014509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:35:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCRlp028166 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C1059122F87; Mon, 3 Nov 2014 11:12:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 02/17] xfs: use sparse chunk alignment for min. inode allocation requirement Date: Mon, 3 Nov 2014 11:12:11 -0500 X-ASG-Orig-Subj: [PATCH v2 02/17] xfs: use sparse chunk alignment for min. inode allocation requirement Message-Id: <1415031146-9107-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_ialloc_ag_select() iterates through the allocation groups looking for free inodes or free space to determine whether to allow an inode allocation to proceed. If no free inodes are available, it assumes that an AG must have an extent longer than mp->m_ialloc_blks. Sparse inode chunk support currently allows for allocations smaller than the traditional inode chunk size specified in m_ialloc_blks. The current minimum sparse allocation is set in the superblock sb_spinoalignmt field at mkfs time. Create a new m_ialloc_min_blks field in xfs_mount and use this to represent the minimum supported allocation size for inode chunks. Initialize m_ialloc_min_blks at mount time based on whether sparse inodes are supported. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 5 +++++ fs/xfs/xfs_mount.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 23dcb72..89949a3 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -635,7 +635,7 @@ xfs_ialloc_ag_select( * Is there enough free space for the file plus a block of * inodes? (if we need to allocate some)? */ - ineed = mp->m_ialloc_blks; + ineed = mp->m_ialloc_min_blks; longest = pag->pagf_longest; if (!longest) longest = pag->pagf_flcount > 0; diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 6677180..0416ae9 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -756,6 +756,11 @@ xfs_sb_mount_common( mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, sbp->sb_inopblock); mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; + + if (sbp->sb_spinoalignmt) + mp->m_ialloc_min_blks = sbp->sb_spinoalignmt; + else + mp->m_ialloc_min_blks = mp->m_ialloc_blks; } /* diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b0447c8..42023a6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -136,6 +136,8 @@ typedef struct xfs_mount { __uint64_t m_flags; /* global mount flags */ int m_ialloc_inos; /* inodes in inode allocation */ int m_ialloc_blks; /* blocks in inode allocation */ + int m_ialloc_min_blks;/* min blocks in sparse inode + * allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ struct xfs_trans_resv m_resv; /* precomputed res values */ -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:35:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 735CF7F51 for ; Mon, 3 Nov 2014 10:35:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 34B938F8035 for ; Mon, 3 Nov 2014 08:35:49 -0800 (PST) X-ASG-Debug-ID: 1415032547-04bdf038d05fec70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LPMCxIovVqiEHvJ8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:35:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GZkac014509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:35:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCRZm028164 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B80EC120296; Mon, 3 Nov 2014 11:12:26 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 01/17] xfs: add sparse inode chunk alignment superblock field Date: Mon, 3 Nov 2014 11:12:10 -0500 X-ASG-Orig-Subj: [PATCH v2 01/17] xfs: add sparse inode chunk alignment superblock field Message-Id: <1415031146-9107-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add sb_spinoalignmt to the superblock to specify sparse inode chunk alignment. This also currently represents the minimum allowable sparse chunk allocation size. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_sb.c | 4 ++-- fs/xfs/libxfs/xfs_sb.h | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 5f902fa..6677180 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -99,7 +99,7 @@ static const struct { { offsetof(xfs_sb_t, sb_features_incompat), 0 }, { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, { offsetof(xfs_sb_t, sb_crc), 0 }, - { offsetof(xfs_sb_t, sb_pad), 0 }, + { offsetof(xfs_sb_t, sb_spinoalignmt), 0 }, { offsetof(xfs_sb_t, sb_pquotino), 0 }, { offsetof(xfs_sb_t, sb_lsn), 0 }, { sizeof(xfs_sb_t), 0 } @@ -447,7 +447,7 @@ __xfs_sb_from_disk( be32_to_cpu(from->sb_features_log_incompat); /* crc is only used on disk, not in memory; just init to 0 here. */ to->sb_crc = 0; - to->sb_pad = 0; + to->sb_spinoalignmt = be32_to_cpu(from->sb_spinoalignmt); to->sb_pquotino = be64_to_cpu(from->sb_pquotino); to->sb_lsn = be64_to_cpu(from->sb_lsn); /* Convert on-disk flags to in-memory flags? */ diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h index 2e73970..4e5aaa8 100644 --- a/fs/xfs/libxfs/xfs_sb.h +++ b/fs/xfs/libxfs/xfs_sb.h @@ -157,7 +157,7 @@ typedef struct xfs_sb { __uint32_t sb_features_log_incompat; __uint32_t sb_crc; /* superblock crc */ - __uint32_t sb_pad; + xfs_extlen_t sb_spinoalignmt;/* sparse inode chunk alignment */ xfs_ino_t sb_pquotino; /* project quota inode */ xfs_lsn_t sb_lsn; /* last write sequence */ @@ -243,7 +243,7 @@ typedef struct xfs_dsb { __be32 sb_features_log_incompat; __le32 sb_crc; /* superblock crc */ - __be32 sb_pad; + __be32 sb_spinoalignmt;/* sparse inode chunk alignment */ __be64 sb_pquotino; /* project quota inode */ __be64 sb_lsn; /* last write sequence */ @@ -269,7 +269,7 @@ typedef enum { XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_SPINOALIGNMT, XFS_SBS_PQUOTINO, XFS_SBS_LSN, XFS_SBS_FIELDCOUNT } xfs_sb_field_t; -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:35:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 600BF7F47 for ; Mon, 3 Nov 2014 10:35:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E099DAC001 for ; Mon, 3 Nov 2014 08:35:49 -0800 (PST) X-ASG-Debug-ID: 1415032548-04cbb070c65559b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0T9AZwoUMqrWrisF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:35:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GZkag014509 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:35:48 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSDN028193 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 960E0120296; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 13/17] xfs: only free allocated regions of inode chunks Date: Mon, 3 Nov 2014 11:12:22 -0500 X-ASG-Orig-Subj: [PATCH v2 13/17] xfs: only free allocated regions of inode chunks Message-Id: <1415031146-9107-14-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An inode chunk is currently added to the transaction free list based on a simple fsb conversion and hardcoded chunk length. The nature of sparse chunks is such that the physical chunk of inodes on disk may consist of one or more discontiguous parts. Blocks that reside in the holes of the inode chunk are not inodes and could be allocated to any other use or not allocated at all. Refactor the existing xfs_bmap_add_free() call into the xfs_difree_inode_chunk() helper. The new helper uses the existing calculation if a chunk is not sparse. Otherwise, use the inobt record holemask to free the contiguous regions of the chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 81 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 78 insertions(+), 3 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index c9c7289..af16d5e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -1709,6 +1709,83 @@ out_error: return error; } +/* + * Free the blocks of an inode chunk. We must consider that the inode chunk + * might be sparse and only free the regions that are allocated as part of the + * chunk. + */ +STATIC void +xfs_difree_inode_chunk( + struct xfs_mount *mp, + xfs_agnumber_t agno, + struct xfs_inobt_rec_incore *rec, + struct xfs_bmap_free *flist) +{ + xfs_agblock_t sagbno = XFS_AGINO_TO_AGBNO(mp, rec->ir_startino); + int startidx, endidx; + int nextbit; + xfs_agblock_t agbno; + int contigblk; + DECLARE_BITMAP(holemask, XFS_INOBT_HOLEMASK_BITS); + + if (!xfs_inobt_issparse(rec->ir_holemask)) { + /* not sparse, calculate extent info directly */ + xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, + XFS_AGINO_TO_AGBNO(mp, rec->ir_startino)), + mp->m_ialloc_blks, flist, mp); + return; + } + + /* holemask is only 16-bits (fits in an unsigned long) */ + ASSERT(sizeof(rec->ir_holemask) <= sizeof(holemask[0])); + holemask[0] = rec->ir_holemask; + + /* + * Find contiguous ranges of zeroes (i.e., allocated regions) in the + * holemask and convert the start/end index of each range to an extent. + * We start with the start and end index both pointing at the first 0 in + * the mask. + */ + startidx = endidx = find_first_zero_bit(holemask, + XFS_INOBT_HOLEMASK_BITS); + nextbit = startidx + 1; + while (startidx < XFS_INOBT_HOLEMASK_BITS) { + nextbit = find_next_zero_bit(holemask, XFS_INOBT_HOLEMASK_BITS, + nextbit); + /* + * If the next zero bit is contiguous, update the end index of + * the current range and continue. + */ + if (nextbit != XFS_INOBT_HOLEMASK_BITS && + nextbit == endidx + 1) { + endidx = nextbit; + goto next; + } + + /* + * nextbit is not contiguous with the current end index. Convert + * the current start/end to an extent and add it to the free + * list. + */ + agbno = sagbno + (startidx * XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + contigblk = ((endidx - startidx + 1) * + XFS_INODES_PER_HOLEMASK_BIT) / + mp->m_sb.sb_inopblock; + + ASSERT(agbno % mp->m_sb.sb_spinoalignmt == 0); + ASSERT(contigblk % mp->m_sb.sb_spinoalignmt == 0); + xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, agbno), contigblk, + flist, mp); + + /* reset range to current bit and carry on... */ + startidx = endidx = nextbit; + +next: + nextbit++; + } +} + STATIC int xfs_difree_inobt( struct xfs_mount *mp, @@ -1800,9 +1877,7 @@ xfs_difree_inobt( goto error0; } - xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, agno, - XFS_AGINO_TO_AGBNO(mp, rec.ir_startino)), - mp->m_ialloc_blks, flist, mp); + xfs_difree_inode_chunk(mp, agno, &rec, flist); } else { *deleted = 0; -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:38:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B12857F51 for ; Mon, 3 Nov 2014 10:38:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9C3FE304032 for ; Mon, 3 Nov 2014 08:38:16 -0800 (PST) X-ASG-Debug-ID: 1415032695-04cbb070c8555c50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tqXiB4iFwPJxsmZR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:38:15 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GcEcE015780 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:38:14 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCS1v023875 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4B400123FAC; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 08/17] xfs: create helper to manage record overlap for sparse inode chunks Date: Mon, 3 Nov 2014 11:12:17 -0500 X-ASG-Orig-Subj: [PATCH v2 08/17] xfs: create helper to manage record overlap for sparse inode chunks Message-Id: <1415031146-9107-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032695 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Create xfs_inobt_rec_exists() to receive the parameters of a new sparse inode chunk allocation and identify whether a record exists that is capable of tracking this sparse chunk. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_ialloc.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index b53fb5d..6879213 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -359,6 +359,67 @@ xfs_ialloc_inode_init( } /* + * Determine whether part of a sparse inode chunk that has just been allocated + * is covered by an existing inobt record. + */ +STATIC int +xfs_inobt_rec_exists( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + xfs_agino_t newino, + xfs_agino_t count, + xfs_btnum_t btnum, + struct xfs_inobt_rec_incore *orec) +{ + struct xfs_btree_cur *cur; + struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); + xfs_agnumber_t agno = be32_to_cpu(agi->agi_seqno); + int error; + int i; + struct xfs_inobt_rec_incore rec; + + orec->ir_startino = NULLAGINO; + + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno, btnum); + + /* + * Find the first record prior to the inode that has just been + * allocated. + */ + error = xfs_inobt_lookup(cur, newino, XFS_LOOKUP_LE, &i); + if (error) + goto error; + if (i == 0) + goto out; + + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + /* + * Check whether the record covers a range that includes the new inodes. + * We can't allocate a sparse chunk that spans multiple records, so we + * only need to check the ino range. + */ + if (rec.ir_startino + XFS_INODES_PER_CHUNK <= newino) + goto out; + + ASSERT(rec.ir_startino <= newino && + rec.ir_startino + XFS_INODES_PER_CHUNK > newino); + + *orec = rec; /* struct copy */ + +out: + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; +error: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + +/* * Allocate new inodes in the allocation group specified by agbp. * Return 0 for success, else error code. */ -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:38:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F5147F51 for ; Mon, 3 Nov 2014 10:38:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C2D02AC004 for ; Mon, 3 Nov 2014 08:38:16 -0800 (PST) X-ASG-Debug-ID: 1415032695-04cbb070c5555c40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7vCF2lavOMKr9yEQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:38:15 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GcEcC015780 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:38:14 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCS1x023875 for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id CCB0D12310A; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 17/17] xfs: enable sparse inode chunks for v5 superblocks Date: Mon, 3 Nov 2014 11:12:26 -0500 X-ASG-Orig-Subj: [PATCH v2 17/17] xfs: enable sparse inode chunks for v5 superblocks Message-Id: <1415031146-9107-18-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415032695 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Enable mounting of filesystems with sparse inode support enabled. Add the incompat. feature bit to the *_ALL mask. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_sb.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h index eeb4058..b4c0d38 100644 --- a/fs/xfs/libxfs/xfs_sb.h +++ b/fs/xfs/libxfs/xfs_sb.h @@ -511,7 +511,8 @@ xfs_sb_has_ro_compat_feature( #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ #define XFS_SB_FEAT_INCOMPAT_ALL \ - (XFS_SB_FEAT_INCOMPAT_FTYPE) + (XFS_SB_FEAT_INCOMPAT_FTYPE| \ + XFS_SB_FEAT_INCOMPAT_SPINODES) #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool -- 1.8.3.1 From JBeulich@suse.com Mon Nov 3 10:41:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 486BD7F59 for ; Mon, 3 Nov 2014 10:41:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6EAFAC005 for ; Mon, 3 Nov 2014 08:41:19 -0800 (PST) X-ASG-Debug-ID: 1415032877-04cb6c2efb500490001-NocioJ Received: from mail.emea.novell.com (mail.emea.novell.com [130.57.118.101]) by cuda.sgi.com with ESMTP id 1vAOll21VmBOUXdH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:41:18 -0800 (PST) X-Barracuda-Envelope-From: JBeulich@suse.com X-Barracuda-Apparent-Source-IP: 130.57.118.101 Received: from EMEA1-MTA by mail.emea.novell.com with Novell_GroupWise; Mon, 03 Nov 2014 16:41:17 +0000 Message-Id: <5457BE390200007800044838@mail.emea.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.0.1 Date: Mon, 03 Nov 2014 16:41:13 +0000 From: "Jan Beulich" To: "Jan Kara" Cc: ,, Subject: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" Mime-Version: 1.0 X-ASG-Orig-Subj: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-Barracuda-Connect: mail.emea.novell.com[130.57.118.101] X-Barracuda-Start-Time: 1415032877 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11193 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Jan, having run into that warning too, I looked into it a little, and now having found that patch am pretty uncertain: Both truncate_setsize() and pagecache_isize_extended() document that they want to be called with i_mutex held, so removing the WARN_ON() alone seems either incomplete or wrong. What I found to work without violating this documented requirement is the patch below. Jan --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -797,7 +797,7 @@ xfs_file_fallocate( FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) return -EOPNOTSUPP; =20 - xfs_ilock(ip, XFS_IOLOCK_EXCL); + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); if (mode & FALLOC_FL_PUNCH_HOLE) { error =3D xfs_free_file_space(ip, offset, len); if (error) @@ -877,7 +877,7 @@ xfs_file_fallocate( } =20 out_unlock: - xfs_iunlock(ip, XFS_IOLOCK_EXCL); + xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return error; } =20 From bfoster@redhat.com Mon Nov 3 10:58:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8DCA37F47 for ; Mon, 3 Nov 2014 10:58:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C95D8F804C for ; Mon, 3 Nov 2014 08:58:27 -0800 (PST) X-ASG-Debug-ID: 1415033906-04bdf038d2601ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qk7hCF3AVz0jzRcP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:58:26 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GwPSU018263 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:58:25 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSvu017056 for ; Mon, 3 Nov 2014 11:12:28 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3A31112383C; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 07/17] xfs: handle sparse inode chunks in icreate log recovery Date: Mon, 3 Nov 2014 11:12:16 -0500 X-ASG-Orig-Subj: [PATCH v2 07/17] xfs: handle sparse inode chunks in icreate log recovery Message-Id: <1415031146-9107-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415033906 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Recovery of icreate transactions assumes hardcoded values for the inode count and chunk length. Sparse inode chunks are allocated in units of m_ialloc_min_blks. Update the icreate validity checks to allow for appropriately sized inode chunks and verify the inode count matches what is expected based on the extent length rather than assuming a hardcoded count. Signed-off-by: Brian Foster --- fs/xfs/xfs_log_recover.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e47fdf9..d665b44 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3070,12 +3070,19 @@ xlog_recover_do_icreate_pass2( return -EINVAL; } - /* existing allocation is fixed value */ - ASSERT(count == mp->m_ialloc_inos); - ASSERT(length == mp->m_ialloc_blks); - if (count != mp->m_ialloc_inos || - length != mp->m_ialloc_blks) { - xfs_warn(log->l_mp, "xlog_recover_do_icreate_trans: bad count 2"); + /* inode chunk is either full or sparse */ + if (length != mp->m_ialloc_blks && + length != mp->m_ialloc_min_blks) { + xfs_warn(log->l_mp, + "%s: unsupported chunk length", __FUNCTION__); + return -EINVAL; + } + + /* verify inode count is consistent with extent length */ + if ((count >> mp->m_sb.sb_inopblog) != length) { + xfs_warn(log->l_mp, + "%s: inconsistent inode count and chunk length", + __FUNCTION__); return -EINVAL; } -- 1.8.3.1 From bfoster@redhat.com Mon Nov 3 10:58:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5D5FF7F47 for ; Mon, 3 Nov 2014 10:58:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4BBD8304032 for ; Mon, 3 Nov 2014 08:58:28 -0800 (PST) X-ASG-Debug-ID: 1415033906-04cbb070c7558490001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IK9M8osoGcT24D6f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 08:58:26 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GwPSS018263 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 3 Nov 2014 11:58:25 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3GCSvw017056 for ; Mon, 3 Nov 2014 11:12:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C45681258D4; Mon, 3 Nov 2014 11:12:27 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 16/17] xfs: add fs geometry bit for sparse inode chunks Date: Mon, 3 Nov 2014 11:12:25 -0500 X-ASG-Orig-Subj: [PATCH v2 16/17] xfs: add fs geometry bit for sparse inode chunks Message-Id: <1415031146-9107-17-git-send-email-bfoster@redhat.com> In-Reply-To: <1415031146-9107-1-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415033906 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Define an fs geometry bit for sparse inode chunks such that the characteristic of the fs can be identified by userspace. Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 1 + fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 18dc721..89689c6 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -239,6 +239,7 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ #define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ #define XFS_FSOP_GEOM_FLAGS_FINOBT 0x20000 /* free inode btree */ +#define XFS_FSOP_GEOM_FLAGS_SPINODES 0x40000 /* sparse inode chunks */ /* * Minimum and maximum sizes need for growth checks. diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index c05ac8b..8d925e8 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -103,7 +103,9 @@ xfs_fs_geometry( (xfs_sb_version_hasftype(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_FTYPE : 0) | (xfs_sb_version_hasfinobt(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_FINOBT : 0); + XFS_FSOP_GEOM_FLAGS_FINOBT : 0) | + (xfs_sb_version_hassparseinodes(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_SPINODES : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; -- 1.8.3.1 From hmeij@wesleyan.edu Mon Nov 3 14:35:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E76097F4E for ; Mon, 3 Nov 2014 14:35:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D397B304048 for ; Mon, 3 Nov 2014 12:35:58 -0800 (PST) X-ASG-Debug-ID: 1415046956-04cbb070c756e6e0001-NocioJ Received: from internal-smtp4.wesleyan.edu (internal-smtp4.wesleyan.edu [129.133.6.200]) by cuda.sgi.com with ESMTP id 1ukRBAfdUMDBXkgi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 12:35:57 -0800 (PST) X-Barracuda-Envelope-From: hmeij@wesleyan.edu X-Barracuda-Apparent-Source-IP: 129.133.6.200 Received: from EXCHCAS1.wesad.wesleyan.edu (exchcas1.wesleyan.edu [129.133.1.104]) by msa.wesleyan.edu (8.14.4/8.14.4) with ESMTP id sA3KZthH027224 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=FAIL) for ; Mon, 3 Nov 2014 15:35:56 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wesleyan.edu; s=feb2013.wesmsa; t=1415046956; bh=8fvmtW34+B7sBmU0JyIek453+FYHQXaIfu0N71fgkBY=; h=From:To:Subject:Date; b=MDOouQxLKjC5V4seqkPBc9F+PQ+s3uE0siBnVFHjcs9Nlh5HVutMEod4IYOl4DU7j zaIsspuAI5HfEDq8HzTStxX0caLWW8F/BfYWrPx3xwRhY30waeDfhOWDH/FygovuB8 ZWiiX8z/eNAbMudTN9xqHCev8YeuORJNGbr+kRI4= Received: from EXCHANGEWES8.wesad.wesleyan.edu ([fe80::a8a6:1fde:f6ae:1fa8]) by EXCHCAS1.wesad.wesleyan.edu ([fe80::4450:d380:2492:ef12%13]) with mapi id 14.03.0210.002; Mon, 3 Nov 2014 15:35:55 -0500 From: "Meij, Henk" To: "xfs@oss.sgi.com" Subject: clone of filesystem across network preserving ionodes Thread-Topic: clone of filesystem across network preserving ionodes X-ASG-Orig-Subj: clone of filesystem across network preserving ionodes Thread-Index: Ac/3pUOyyQOPe9XjTQ+jW6h6Iz9yCw== Date: Mon, 3 Nov 2014 20:35:54 +0000 Message-ID: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [129.133.6.204] Content-Type: multipart/alternative; boundary="_000_8688BD11DAC0574AA90295127E9E9F4AC047F1CAexchangewes8wes_" MIME-Version: 1.0 X-Wesleyan-MailScanner-ID: sA3KZthH027224 X-Wesleyan-MailScanner: Found to be clean X-Wesleyan-MailScanner-From: hmeij@wesleyan.edu X-Barracuda-Connect: internal-smtp4.wesleyan.edu[129.133.6.200] X-Barracuda-Start-Time: 1415046957 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --_000_8688BD11DAC0574AA90295127E9E9F4AC047F1CAexchangewes8wes_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable What is the best practice way to get the contents from server1 to server2 i= dentical disk array partitions and preserve the ionode information using xf= s tools or non-xfs tools? xfsdump/xfsrestore appear to not preserve this or I can not find the obviou= s setting. xfs_copy would, per documentation, but can I get from server1 to server2? -Henk --_000_8688BD11DAC0574AA90295127E9E9F4AC047F1CAexchangewes8wes_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

What is the best practice way to get the contents from server1 to server= 2 identical disk array partitions and preserve the ionode information using= xfs tools or non-xfs tools?  

 

xfsdump/xfsrestore appear to not preserve this or I can not find the obv= ious setting.

 

xfs_copy would, per documentation, but can I get from server1 to server2= ?

 

-Henk

 

--_000_8688BD11DAC0574AA90295127E9E9F4AC047F1CAexchangewes8wes_-- From sandeen@sandeen.net Mon Nov 3 14:39:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C9B47F51 for ; Mon, 3 Nov 2014 14:39:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 288D18F8033 for ; Mon, 3 Nov 2014 12:39:50 -0800 (PST) X-ASG-Debug-ID: 1415047188-04cbb070c856fac0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id xnV1bnYQ0OePuHUG for ; Mon, 03 Nov 2014 12:39:49 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8EE7F656E1DC; Mon, 3 Nov 2014 14:39:48 -0600 (CST) Message-ID: <5457E813.6030606@sandeen.net> Date: Mon, 03 Nov 2014 14:39:47 -0600 From: Eric Sandeen MIME-Version: 1.0 To: "Meij, Henk" , "xfs@oss.sgi.com" Subject: Re: clone of filesystem across network preserving ionodes References: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu> X-ASG-Orig-Subj: Re: clone of filesystem across network preserving ionodes In-Reply-To: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415047188 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/3/14 2:35 PM, Meij, Henk wrote: > What is the best practice way to get the contents from server1 to > server2 identical disk array partitions and preserve the ionode > information using xfs tools or non-xfs tools? Just FWIW: inode, not ionode. :) > xfsdump/xfsrestore appear to not preserve this or I can not find the > obvious setting. > xfs_copy would, per documentation, but can I get from server1 to > server2? xfs_copy makes an identical image, yes. You could xfs_copy from disk to a file on server1, transfer the file, then xfs_copy from file to disk on server2. -Eric From hmeij@wesleyan.edu Mon Nov 3 15:10:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AB0917F56 for ; Mon, 3 Nov 2014 15:10:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 34F788F8033 for ; Mon, 3 Nov 2014 13:10:14 -0800 (PST) X-ASG-Debug-ID: 1415049011-04bdf038d261fcc0001-NocioJ Received: from internal-smtp3.wesleyan.edu (internal-smtp3.wesleyan.edu [129.133.6.182]) by cuda.sgi.com with ESMTP id fVBoiSOJtHHVDXoC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 13:10:12 -0800 (PST) X-Barracuda-Envelope-From: hmeij@wesleyan.edu X-Barracuda-Apparent-Source-IP: 129.133.6.182 Received: from exchcas4.wesad.wesleyan.edu (exchcas4.wesleyan.edu [129.133.6.94]) by msa.wesleyan.edu (8.14.4/8.14.4) with ESMTP id sA3LAAvH027853 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Mon, 3 Nov 2014 16:10:10 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wesleyan.edu; s=feb2013.wesmsa; t=1415049010; bh=WyAXQwaJR+MYJiY1LhmXOKnMs1Vp0Bk6VXZQnl0d194=; h=From:To:Subject:Date:References:In-Reply-To; b=LlPLxeG99Ai56ZmDQDBonaOLsfHvKVpgn7u4kBB/nYcH7pDXkmxymstd6GL0xEMwO kFj/P2cbM+FalruROUqHQARG3kDq+kOnhz/7UE6GuHm35OOftCDqXgzF8ChuJQCHtJ M/SjZuiW0Qjq97OY56kFY/hE+vhQNCKIDCGmrU6I= Received: from EXCHANGEWES8.wesad.wesleyan.edu ([fe80::a8a6:1fde:f6ae:1fa8]) by exchcas4.wesad.wesleyan.edu ([2002:8185:65e::8185:65e]) with mapi id 14.03.0210.002; Mon, 3 Nov 2014 16:10:10 -0500 From: "Meij, Henk" To: Eric Sandeen , "xfs@oss.sgi.com" Subject: RE: clone of filesystem across network preserving ionodes Thread-Topic: clone of filesystem across network preserving ionodes X-ASG-Orig-Subj: RE: clone of filesystem across network preserving ionodes Thread-Index: Ac/3pUOyyQOPe9XjTQ+jW6h6Iz9yCwAKvOaA//+ywn0= Date: Mon, 3 Nov 2014 21:10:10 +0000 Message-ID: <8688BD11DAC0574AA90295127E9E9F4AC047F22D@exchangewes8.wesad.wesleyan.edu> References: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu>,<5457E813.6030606@sandeen.net> In-Reply-To: <5457E813.6030606@sandeen.net> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [129.133.6.204] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Wesleyan-MailScanner-ID: sA3LAAvH027853 X-Wesleyan-MailScanner: Found to be clean X-Wesleyan-MailScanner-From: hmeij@wesleyan.edu X-Barracuda-Connect: internal-smtp3.wesleyan.edu[129.133.6.182] X-Barracuda-Start-Time: 1415049012 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature inodes, yes, yes. I tried xfs_copy but ran into a problem. server1 and ser= ver2 each have 4x28T partitions and on server1 writing the file to one empt= y partition mounted never finishes, hangs at 90%...presumably because it ru= ns out of space (file size =3D=3D sdbx). there is no "skip empty inodes" op= tion and perhaps there can't be...and I have nothing larger. I guess I coul= d attempt making sdb4 slightly larger by reducing sdb1-3. Thanks, -Henk ________________________________________ From: Eric Sandeen [sandeen@sandeen.net] Sent: Monday, November 03, 2014 3:39 PM To: Meij, Henk; xfs@oss.sgi.com Subject: Re: clone of filesystem across network preserving ionodes On 11/3/14 2:35 PM, Meij, Henk wrote: > What is the best practice way to get the contents from server1 to > server2 identical disk array partitions and preserve the ionode > information using xfs tools or non-xfs tools? Just FWIW: inode, not ionode. :) > xfsdump/xfsrestore appear to not preserve this or I can not find the > obvious setting. > xfs_copy would, per documentation, but can I get from server1 to > server2? xfs_copy makes an identical image, yes. You could xfs_copy from disk to a file on server1, transfer the file, then xfs_copy from file to disk on server2. -Eric= From david@fromorbit.com Mon Nov 3 15:56:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 957007F57 for ; Mon, 3 Nov 2014 15:56:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7482F304039 for ; Mon, 3 Nov 2014 13:56:21 -0800 (PST) X-ASG-Debug-ID: 1415051778-04cb6c2efc51bfd0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id yrSWrexKyPTU56DP for ; Mon, 03 Nov 2014 13:56:18 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApcuAEP5V1R5LbBU/2dsb2JhbABcDoMAgSyCNrgYBpUohWoEAgKBJRcBAQEBAX2EAgEBAQMBOhwjBQsIAxgJJQ8FJQMhE4g4CMoTAQEBAQYCAR8Yhh+KWQeDLYEeAQSeAIEykRaECYM4VCkvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Nov 2014 08:26:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XlPbY-0006DW-Kv; Tue, 04 Nov 2014 08:56:04 +1100 Date: Tue, 4 Nov 2014 08:56:04 +1100 From: Dave Chinner To: "Meij, Henk" Cc: Eric Sandeen , "xfs@oss.sgi.com" Subject: Re: clone of filesystem across network preserving ionodes Message-ID: <20141103215604.GA23575@dastard> X-ASG-Orig-Subj: Re: clone of filesystem across network preserving ionodes References: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu> <5457E813.6030606@sandeen.net> <8688BD11DAC0574AA90295127E9E9F4AC047F22D@exchangewes8.wesad.wesleyan.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8688BD11DAC0574AA90295127E9E9F4AC047F22D@exchangewes8.wesad.wesleyan.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415051778 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Nov 03, 2014 at 09:10:10PM +0000, Meij, Henk wrote: > inodes, yes, yes. I tried xfs_copy but ran into a problem. > server1 and server2 each have 4x28T partitions and on server1 > writing the file to one empty partition mounted never finishes, > hangs at 90%...presumably because it runs out of space (file size > == sdbx). Sure, but it's a sparse copy. It only copies the allocated blocks in the filesystem, so the actual space required is the used space int eh filesystem (i.e. what df reports as used). > there is no "skip empty inodes" option and perhaps there > can't be... Of course not - you're wanting identical inode numbers on either end, so your only option is and identical copy. Otherwise you'd use xfsdump/xfsrestore to skip empty inodes... > and I have nothing larger. I guess I could attempt > making sdb4 slightly larger by reducing sdb1-3. Exactly why do you need an *identical* copy of 28TB filesystems? What is the problem with inode numbers being different? And that begs the question: if you need the filesystems to be completely identical yet exist on separate systems, then why aren't you using a block layer construct designed for such operation (e.g. drdb)? Cheers, Dave. -- Dave Chinner david@fromorbit.com From fanael4@gmail.com Mon Nov 3 16:12:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,MISSING_HEADERS,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 466EA7F5A for ; Mon, 3 Nov 2014 16:12:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C875DAC005 for ; Mon, 3 Nov 2014 14:12:17 -0800 (PST) X-ASG-Debug-ID: 1415052733-04cb6c2efa51d3d0001-NocioJ Received: from mail-ob0-f175.google.com (mail-ob0-f175.google.com [209.85.214.175]) by cuda.sgi.com with ESMTP id imJcaNxho3acJu30 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 03 Nov 2014 14:12:13 -0800 (PST) X-Barracuda-Envelope-From: fanael4@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.175] Received: by mail-ob0-f175.google.com with SMTP id gq1so4904937obb.34 for ; Mon, 03 Nov 2014 14:12:13 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:cc :content-type; bh=L+XSv6+SbSI0sJSb+ou0N3F5ynXIjNz8N2OkgoCHfWc=; b=1KOeG34KiFPp5DOYK8loRhcNs+/J6P+RoUh9WCIJZGfhNkEtfFbVhOnBPTNOaW+xFw Laawlqehe3GPRHyoctoRvqVY7KyQvgr088iAW37IguYJExd5Ld4cnK3QkXhSu/3iTZQ4 SoelvF5tFR+9YLsCXyRhGEIV183/fs8xtm3Kw8oCrkqrrV2Zsh/evYtoGz2sg505RQrt 01yyTVHmjh2uGtA94yYkO0KgHCWfS+lIOoYP1zwLt14LFjjdSYyToKjUsigrf0QfyGsz 4wFW8jbcfVoveulb8BhYB3OeyY/CoNOsmF5p9QHuBHVIyKJ6U882EZQJztDJJXVg2AaK IBbA== MIME-Version: 1.0 X-Received: by 10.60.48.4 with SMTP id h4mr4110865oen.42.1415052732334; Mon, 03 Nov 2014 14:12:12 -0800 (PST) Received: by 10.202.102.81 with HTTP; Mon, 3 Nov 2014 14:12:12 -0800 (PST) In-Reply-To: <1415031146-9107-6-git-send-email-bfoster@redhat.com> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> <1415031146-9107-6-git-send-email-bfoster@redhat.com> Date: Mon, 3 Nov 2014 23:12:12 +0100 Message-ID: Subject: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks From: Fanael Linithien X-ASG-Orig-Subj: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f175.google.com[209.85.214.175] X-Barracuda-Start-Time: 1415052733 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 2014-11-03 17:12 GMT+01:00 Brian Foster : > > +static inline bool xfs_inobt_issparse(uint16_t holemask) > +{ > + return holemask == 0 ? false : true; > +} Surely that should be "return holemask != 0;"? From david@fromorbit.com Mon Nov 3 16:19:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF9F17F5E for ; Mon, 3 Nov 2014 16:19:42 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDA52304048 for ; Mon, 3 Nov 2014 14:19:39 -0800 (PST) X-ASG-Debug-ID: 1415053176-04cb6c2efc51e310001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id NASPP9FlRcHXEG77 for ; Mon, 03 Nov 2014 14:19:37 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApQuACP/V1R5LbBU/2dsb2JhbABcgw6BLII2uBoGlSiFagQCAoEnFwEBAQEBfYQDAQEEOhwjEAgDDgoJJQ8FJQMhE4hAyw0BAQEHAgEfGIYfilkHgy2BHgWeAIEyi0iFToQJhAwpL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Nov 2014 08:49:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XlPxZ-0006Gx-Lm; Tue, 04 Nov 2014 09:18:49 +1100 Date: Tue, 4 Nov 2014 09:18:49 +1100 From: Dave Chinner To: Jan Beulich Cc: Jan Kara , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" Message-ID: <20141103221849.GB23575@dastard> X-ASG-Orig-Subj: Re: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" References: <5457BE390200007800044838@mail.emea.novell.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5457BE390200007800044838@mail.emea.novell.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415053176 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 03, 2014 at 04:41:13PM +0000, Jan Beulich wrote: > Jan, > > having run into that warning too, I looked into it a little, and now > having found that patch am pretty uncertain: Both truncate_setsize() > and pagecache_isize_extended() document that they want to be > called with i_mutex held, so removing the WARN_ON() alone seems > either incomplete or wrong. What I found to work without violating > this documented requirement is the patch below. Or, just perhaps, the comments are wrong.... Some filesystems have stronger, more robust internal serialisation than the VFS provides with i_mutex.... > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -797,7 +797,7 @@ xfs_file_fallocate( > FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) > return -EOPNOTSUPP; > > - xfs_ilock(ip, XFS_IOLOCK_EXCL); > + xfs_rw_ilock(ip, XFS_IOLOCK_EXCL); > if (mode & FALLOC_FL_PUNCH_HOLE) { > error = xfs_free_file_space(ip, offset, len); > if (error) The i_mutex is completely redundant here. Not to mention there are multiple callers of these xfs_*_file_space() functions used to implement fallocate(), and we're not about to change the locking model for them.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Nov 3 16:34:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E8C9B7F60 for ; Mon, 3 Nov 2014 16:34:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D67098F8037 for ; Mon, 3 Nov 2014 14:34:13 -0800 (PST) X-ASG-Debug-ID: 1415054052-04cbb070c657c330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nvUjeNl8Sc9atetV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 14:34:13 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA3MYA39020226 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 3 Nov 2014 17:34:10 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA3MY93P015591; Mon, 3 Nov 2014 17:34:09 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 396AC122F87; Mon, 3 Nov 2014 17:34:08 -0500 (EST) Date: Mon, 3 Nov 2014 17:34:08 -0500 From: Brian Foster To: Fanael Linithien Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Message-ID: <20141103223407.GA14732@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> <1415031146-9107-6-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415054052 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Nov 03, 2014 at 11:12:12PM +0100, Fanael Linithien wrote: > 2014-11-03 17:12 GMT+01:00 Brian Foster : > > > > +static inline bool xfs_inobt_issparse(uint16_t holemask) > > +{ > > + return holemask == 0 ? false : true; > > +} > > Surely that should be "return holemask != 0;"? > ir_holemask bits are set for holes in the inode chunk and unset for allocated regions. This means that ir_holemask == 0 for a normal, fully-allocated chunk and != 0 otherwise (some bits are set to indicate the chunk has a hole). Check out the commit log for patch 4 for reasoning. Brian > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From fanael4@gmail.com Mon Nov 3 17:56:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8B90D7F4E for ; Mon, 3 Nov 2014 17:56:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 358DAAC002 for ; Mon, 3 Nov 2014 15:56:19 -0800 (PST) X-ASG-Debug-ID: 1415058977-04bdf038cf6299b0001-NocioJ Received: from mail-ob0-f179.google.com (mail-ob0-f179.google.com [209.85.214.179]) by cuda.sgi.com with ESMTP id 50rgauXHW7cs8Snl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 03 Nov 2014 15:56:18 -0800 (PST) X-Barracuda-Envelope-From: fanael4@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.179] Received: by mail-ob0-f179.google.com with SMTP id m8so9948870obr.38 for ; Mon, 03 Nov 2014 15:56:17 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=CV4WihXUIXNbGDSBQuqOzdd772ya1DHNFkTbDjSQxlU=; b=mTt/YWPjvAI6DRM5LSo76vHLIVbWObmhRYAijXPBR3VsWSPYwBXBr78MjfNuT/JDzD q95B6rgIRAfGYNZ3Mxb67yr/XOmSW+1+CSeAt7/pb2uBV3RIxw+CXpaIAABq2mwy0WOz 3RfOsPxDy+easkDz3rWrzSExriRoRGDA9qfl6R8w6g+LiqGJRYQEeMo1A5yQ3LK5iiIm Dz8Vcndsun2WCiPluupqYP6K3EndwJ79iIxNa13TYpGXH+ti+j0QlFyhNy6qndB7TL7z asnseZ6mQP511fjzNbBLuIITsTftOut7CrQweV7ahNXyr+lUcqUgxHWJEqmahDIxACOJ wvDA== MIME-Version: 1.0 X-Received: by 10.60.54.6 with SMTP id f6mr10628123oep.26.1415058977610; Mon, 03 Nov 2014 15:56:17 -0800 (PST) Received: by 10.202.102.81 with HTTP; Mon, 3 Nov 2014 15:56:17 -0800 (PST) In-Reply-To: <20141103223407.GA14732@bfoster.bfoster> References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> <1415031146-9107-6-git-send-email-bfoster@redhat.com> <20141103223407.GA14732@bfoster.bfoster> Date: Tue, 4 Nov 2014 00:56:17 +0100 Message-ID: Subject: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks From: Fanael Linithien X-ASG-Orig-Subj: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f179.google.com[209.85.214.179] X-Barracuda-Start-Time: 1415058978 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 2014-11-03 23:34 GMT+01:00 Brian Foster : > On Mon, Nov 03, 2014 at 11:12:12PM +0100, Fanael Linithien wrote: >> 2014-11-03 17:12 GMT+01:00 Brian Foster : >> > >> > +static inline bool xfs_inobt_issparse(uint16_t holemask) >> > +{ >> > + return holemask == 0 ? false : true; >> > +} >> >> Surely that should be "return holemask != 0;"? >> > > ir_holemask bits are set for holes in the inode chunk and unset for > allocated regions. This means that ir_holemask == 0 for a normal, > fully-allocated chunk and != 0 otherwise (some bits are set to indicate > the chunk has a hole). Check out the commit log for patch 4 for > reasoning. Oh, I don't comment on the logic, as I don't really know much about XFS code. It's purely a stylistic suggestion: "holemask == 0 ? false : true" looks entirely equivalent to "holemask != 0". From pg_mh@mh.to.sabi.co.uk Mon Nov 3 18:06:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.3 required=5.0 tests=FB_GET_MEDS autolearn=no version=3.3.1 X-Original-To: xfs@OSS.SGI.com Delivered-To: xfs@OSS.SGI.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0B8347F4E for ; Mon, 3 Nov 2014 18:06:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D126E8F8035 for ; Mon, 3 Nov 2014 16:06:23 -0800 (PST) X-ASG-Debug-ID: 1415059580-04bdf038cf629f50001-ps1ADW Received: from honeysuckle.london.02.net (honeysuckle.london.02.net [87.194.255.144]) by cuda.sgi.com with ESMTP id z9Gc0FuVgYGDDisM for ; Mon, 03 Nov 2014 16:06:21 -0800 (PST) X-Barracuda-Envelope-From: pg_mh@mh.to.sabi.co.UK X-Barracuda-Apparent-Source-IP: 87.194.255.144 Received: from ty.sabi.co.UK (94.192.123.208) by honeysuckle.london.02.net (8.5.140) id 53BD70B603E0D55B for xfs@OSS.SGI.com; Tue, 4 Nov 2014 00:32:49 +0000 Received: from from [127.0.0.1] (helo=tree.ty.sabi.co.uk) by ty.sabi.co.UK with esmtp(Exim 4.76 #1) id 1XlRdB-0007jL-KN for ; Tue, 04 Nov 2014 00:05:53 +0000 MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Message-ID: <21592.6241.228215.412783@tree.ty.sabi.co.uk> Date: Tue, 4 Nov 2014 00:05:53 +0000 Precedence: air-mail To: Linux fs XFS Subject: Re: clone of filesystem across network preserving ionodes In-Reply-To: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu> X-ASG-Orig-Subj: Re: clone of filesystem across network preserving ionodes References: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu> X-Mailer: VM 8.1.0 under 23.3.1 (x86_64-pc-linux-gnu) From: pg@xfs.list.sabi.co.UK (Peter Grandi) X-Disclaimer: This message contains only personal opinions X-Barracuda-Connect: honeysuckle.london.02.net[87.194.255.144] X-Barracuda-Start-Time: 1415059580 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FB_GET_MEDS, FB_GET_MEDS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11210 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FB_GET_MEDS BODY: Looks like trying to sell meds 1.10 FB_GET_MEDS_2 Looks like trying to sell meds > What is the best practice way to get the contents from > server1 to server2 identical disk array partitions Here you do not say that =ABget the contents=BB has to be over the network, but the 'Subject:' line seems to indicate that. > and preserve the ionode information using xfs tools or non-xfs > tools? xfsdump/xfsrestore appear to not preserve this or I can > not find the obvious setting. If =ABpreserve the ionode information=BB means "keep the same inumbers for each inode" that seems to me fairly pointless in almost every situation (except perhaps for forensic purposes, and that opens a whole series of other issues), so there is no =ABbest practice way=BB as there is little or no practice, and management speak won't change that. More clarity in explaining what you mean and/or what you want to achieve would be better. If you want for whatever reason to make a byte-by-byte copy from block device X (potentially mounted on M) on host S1 to the corresponding one of =ABidentical disk array partitions=BB Y on host S2, which also preserves the inumbers, something fairly common is to use 'ssh' as a network pipe (run on host S1): M=3D"`grep \"^$X\" /proc/mounts | cut -d' ' -f2`" case "$M" in ?*) xfs_freeze -f `"$M";; esac sudo sh -c "lzop < '$X'" | dd bs=3D64k iflag=3Dfullblock \ | ssh -oCipher=3Darcfour -oCompression=3Dno "$S2" \ "dd bs=3D64k iflag=3Dfullblock | sudo sh -c "\'"lzop -d > '$Y'"= \'"" case "$M" in ?*) xfs_freeze -u `"$M";; esac If 'xfs_freeze' is suitable, and if no interruptions happen; if they happen put reasonable "seek" and "skip" parameters on 'dd' and rerun. If the target block device is bigger than the source block device, one can use 'xfs_growfs' after the byte-by-byte copy (growing filetrees has downsides though). Unless by =ABpreserve the ionode information=BB or =ABidentical disk array partitions=BB you mean something different from what they appear to mean to me. The above just copied for me a 88GiB block device in 1624s between two ordinary home PCs. One could replace 'ssh' with 'nc' or similar network piping commands for higher speed (at some cost). I also tried to interpolate 'xfs_copy -d -b "$X" /dev/stdout | lzop ...' but 'xfs_copy' won't do that, not entirely unexpectedly. If by =ABpreserve the ionode information=BB you simply mean copy all file attributes but without keeping the inumber (except for 'atime', but is usually disabled anyhow, and there is a patch to restore it), if the source filetree is mounted at M on S1 and the target is mounted at N (you may opt to mount with 'nobarrier') on S2, a fairly common way is to use RSYNC with various preserving options (run on host S1): sudo rsync -i -axAHX --del -z \ -e 'ssh -oCipher=3Darcfour -oCompression=3Dno -l root' \ "$M"/ "$S2":"$N"/ The following is another common way that has slightly different effects on 'atime' and 'ctime' (requires a patched GNU 'tar' or be replaced with 'star') by using 'ssh' combines with 'tar': sudo sh -c "cd '$M' && tar -c --one --selinux --acls --xattrs -f - ."= \ | lzop | dd bs=3D64k iflag=3Dfullblock \ | ssh -oCipher=3Darcfour -oCompression=3Dno "$S2" \ "dd bs=3D64k iflag=3Dfullblock | lzop -d \ | sudo sh -c 'cd \"$N\" && tar -xv --preserve-p --atime-p -f -'= " > xfs_copy would, per documentation, Probably 'xfs_copy' is only necessary in the case where you really want to preserve inums, and the source block device is larger than the target block device (and obviously the size of the content is smaller than the size of the target block device). > but can I get from server1 to server2? That probably requires finding a target medium (file or block device) big enough and that can be shared (or transported) between S1 and S2. This could involve a filetree on S2 that is exported (for example by NFSv4) to S1 and large enough to hold the target file(s) of 'xfs_copy'. PS Whichever way is chosen to the copy, a second run with RSYNC options '-n -c' might help verify that corruption did not happens during the copy. From david@fromorbit.com Mon Nov 3 19:33:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 47A677F4E for ; Mon, 3 Nov 2014 19:33:28 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2711D304048 for ; Mon, 3 Nov 2014 17:33:24 -0800 (PST) X-ASG-Debug-ID: 1415064802-04bdf038cf62d5e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8QCc1GPmhcaOnaGc for ; Mon, 03 Nov 2014 17:33:22 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvJLAOgrWFR5LbBU/2dsb2JhbABcgw6BLII2uDIGlSiFagICAQECgSIXAQEBAQF9hAMBAQQ6HCMQCAMYCSUPBSUDIROIQMtSAQEBAQEFAQEBAR4Yhh+KWQeDLYEeBZ4AllGCNIFYKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Nov 2014 12:03:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XlSzc-0006j0-CP; Tue, 04 Nov 2014 12:33:08 +1100 Date: Tue, 4 Nov 2014 12:33:08 +1100 From: Dave Chinner To: Fanael Linithien Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Message-ID: <20141104013308.GC23575@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> <1415031146-9107-6-git-send-email-bfoster@redhat.com> <20141103223407.GA14732@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415064802 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 04, 2014 at 12:56:17AM +0100, Fanael Linithien wrote: > 2014-11-03 23:34 GMT+01:00 Brian Foster : > > On Mon, Nov 03, 2014 at 11:12:12PM +0100, Fanael Linithien wrote: > >> 2014-11-03 17:12 GMT+01:00 Brian Foster : > >> > > >> > +static inline bool xfs_inobt_issparse(uint16_t holemask) > >> > +{ > >> > + return holemask == 0 ? false : true; > >> > +} > >> > >> Surely that should be "return holemask != 0;"? > >> > > > > ir_holemask bits are set for holes in the inode chunk and unset for > > allocated regions. This means that ir_holemask == 0 for a normal, > > fully-allocated chunk and != 0 otherwise (some bits are set to indicate > > the chunk has a hole). Check out the commit log for patch 4 for > > reasoning. > > Oh, I don't comment on the logic, as I don't really know much about > XFS code. It's purely a stylistic suggestion: "holemask == 0 ? false : > true" looks entirely equivalent to "holemask != 0". Even that is unnecessary. booleans are handled by the compiler quite nicely - just casting a bool type will give the same result. i.e. (bool)holemask results in a value of "false" if holemask is zero, "true" if holemask has any value other than zero. static inline bool xfs_inobt_issparse(uint16_t holemask) { return holemask; } Will give the desired result as there is an implicit typecast to bool in that return statement..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From fengguang.wu@intel.com Mon Nov 3 22:25:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA0A97F51 for ; Mon, 3 Nov 2014 22:25:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D72DC304039 for ; Mon, 3 Nov 2014 20:25:44 -0800 (PST) X-ASG-Debug-ID: 1415075130-04cbb070c55889a0001-NocioJ Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by cuda.sgi.com with ESMTP id TwTAG5NIT0VTl18A for ; Mon, 03 Nov 2014 20:25:31 -0800 (PST) X-Barracuda-Envelope-From: fengguang.wu@intel.com X-Barracuda-Apparent-Source-IP: 134.134.136.20 X-Barracuda-IPDD: Level2 [intel.com/134.134.136.20] Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 03 Nov 2014 20:25:30 -0800 X-Barracuda-IPDD: Level2 [intel.com/134.134.136.20] X-Barracuda-IPDD: Level2 [intel.com/134.134.136.20] X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,311,1413270000"; d="yaml'?scan'208";a="601722220" Received: from wfg-t540p.sh.intel.com ([10.239.193.196]) by orsmga001.jf.intel.com with ESMTP; 03 Nov 2014 20:25:23 -0800 Received: from wfg by wfg-t540p.sh.intel.com with local (Exim 4.84) (envelope-from ) id 1XlVgI-0003vM-Ci; Tue, 04 Nov 2014 12:25:22 +0800 Date: Tue, 4 Nov 2014 12:25:22 +0800 From: Fengguang Wu To: Tejun Heo Cc: LKML , lkp@01.org, "xfs@oss.sgi.com" , linux-fsdevel@vger.kernel.org Subject: [AHCI] XFS (sda3): metadata I/O error: block 0x941ce20 ("xlog_iodone") error 5 numblks 64 Message-ID: <20141104042522.GA14917@wfg-t540p.sh.intel.com> X-ASG-Orig-Subj: [AHCI] XFS (sda3): metadata I/O error: block 0x941ce20 ("xlog_iodone") error 5 numblks 64 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="C7zPtVaVf+AK4Oqc" Content-Disposition: inline User-Agent: Heirloom mailx 12.5 6/20/10 X-Barracuda-Connect: mga02.intel.com[134.134.136.20] X-Barracuda-Start-Time: 1415075130 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --C7zPtVaVf+AK4Oqc Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Tejun, FYI, we noticed the below changes on git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata for-3.18-fixes commit 61e268068c92ed000f078dc1ab71d1228439fecd ("Revert "AHCI: Optimize single IRQ interrupt processing"") +-----------------------------------------------------------+------------+------------+ | | aa1cf25887 | 61e268068c | +-----------------------------------------------------------+------------+------------+ | boot_successes | 35 | 4 | | early-boot-hang | 1 | | | boot_failures | 0 | 8 | | metadata_I/O_error:block#("xlog_iodone")error#numblks | 0 | 8 | | XFS(sda3):Log_I/O_Error_Detected.Shutting_down_filesystem | 0 | 8 | | Please_umount_the_filesystem_and_rectify_the_problem(s) | 0 | 8 | +-----------------------------------------------------------+------------+------------+ [ 24.322655] sd 2:0:0:0: [sda] CDB: [ 24.322657] Write(10): 2a 00 27 b5 22 10 00 00 10 00 [ 24.322659] ata2: EH complete [ 24.322672] XFS (sda3): metadata I/O error: block 0x941ce20 ("xlog_iodone") error 5 numblks 64 [ 24.322674] XFS (sda3): xfs_do_force_shutdown(0x2) called from line 1181 of file fs/xfs/xfs_log.c. Return address = 0xffffffff81356796 [ 24.322710] XFS (sda3): Log I/O Error Detected. Shutting down filesystem [ 24.322710] XFS (sda3): Please umount the filesystem and rectify the problem(s) [ 24.322716] Buffer I/O error on device sda3, logical block 19432150 [ 24.322716] lost page write due to I/O error on sda3 [ 24.322720] Buffer I/O error on device sda3, logical block 19432151 To reproduce: apt-get install ruby ruby-oj git clone git://git.kernel.org/pub/scm/linux/kernel/git/wfg/lkp-tests.git cd lkp-tests bin/setup-local job.yaml # the job file attached in this email bin/run-local job.yaml testbox/testcase/testparams: lkp-ne04/fsmark/performance-1x-32t-1HDD-xfs-5K-400M-fsyncBeforeClose-16d-256fpd aa1cf25887099bba 61e268068c92ed000f078dc1ab ---------------- -------------------------- :15 20% 1:5 last_state.is_incomplete_run :15 20% 1:5 last_state.booting :15 80% 4:5 dmesg.Please_umount_the_filesystem_and_rectify_the_problem(s) :15 80% 4:5 dmesg.XFS(sda3):Log_I/O_Error_Detected.Shutting_down_filesystem :15 80% 4:5 dmesg.metadata_I/O_error:block#("xlog_iodone")error#numblks testbox/testcase/testparams: lkp-ne04/fsmark/performance-1x-32t-1HDD-xfs-8K-400M-fsyncBeforeClose-16d-256fpd aa1cf25887099bba 61e268068c92ed000f078dc1ab ---------------- -------------------------- fail:runs %reproduction fail:runs | | | :10 80% 4:5 dmesg.Please_umount_the_filesystem_and_rectify_the_problem(s) :10 80% 4:5 dmesg.XFS(sda3):Log_I/O_Error_Detected.Shutting_down_filesystem :10 80% 4:5 dmesg.metadata_I/O_error:block#("xlog_iodone")error#numblks :10 80% 4:5 stderr.fopen_failed_to_open:fs_log.txt :10 80% 4:5 stderr.fs_mark:fsync_failed_Input/output_error Thanks, Fengguang --C7zPtVaVf+AK4Oqc Content-Type: application/octet-stream Content-Disposition: attachment; filename=".dmesg" Content-Transfer-Encoding: base64 RGVjb21wcmVzc2luZyBMaW51eC4uLiBQYXJzaW5nIEVMRi4uLiBkb25lLgpCb290aW5nIHRo ZSBrZXJuZWwuClsgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNw dXNldApbICAgIDAuMDAwMDAwXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHUKWyAg ICAwLjAwMDAwMF0gTGludXggdmVyc2lvbiAzLjE4LjAtcmMyLWc3ZDMzZmU5IChrYnVpbGRA eGlhbikgKGdjYyB2ZXJzaW9uIDQuOS4xIChEZWJpYW4gNC45LjEtMTEpICkgIzEgU01QIE1v biBPY3QgMjcgMjM6MjA6MTggQ1NUIDIwMTQKWyAgICAwLjAwMDAwMF0gQ29tbWFuZCBsaW5l OiB1c2VyPWxrcCBqb2I9L2xrcC9zY2hlZHVsZWQvbGtwLW5lMDQvY3ljbGljX2ZzbWFyay1w ZXJmb3JtYW5jZS0xeC0zMnQtMUhERC14ZnMtNUstNDAwTS1mc3luY0JlZm9yZUNsb3NlLTE2 ZC0yNTZmcGQteDg2XzY0LXJoZWwtSEVBRC03ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZk YzJjOTJhMGE1MTg1LTAueWFtbCBBUkNIPXg4Nl82NCBCT09UX0lNQUdFPS9rZXJuZWwveDg2 XzY0LXJoZWwvN2QzM2ZlOWFiOWVhY2UyNDAzYWRlZmVhM2M2ZGMyYzkyYTBhNTE4NS92bWxp bnV6LTMuMTguMC1yYzItZzdkMzNmZTkga2NvbmZpZz14ODZfNjQtcmhlbCBjb21taXQ9N2Qz M2ZlOWFiOWVhY2UyNDAzYWRlZmVhM2M2ZGMyYzkyYTBhNTE4NSBicmFuY2g9bGludXgtZGV2 ZWwvZGV2ZWwtaG91cmx5LTIwMTQxMDI3MjMgcm9vdD0vZGV2L3JhbTAgbWF4X3VwdGltZT03 MzQgUkVTVUxUX1JPT1Q9L3Jlc3VsdC9sa3AtbmUwNC9mc21hcmsvcGVyZm9ybWFuY2UtMXgt MzJ0LTFIREQteGZzLTVLLTQwME0tZnN5bmNCZWZvcmVDbG9zZS0xNmQtMjU2ZnBkL2RlYmlh bi14ODZfNjQuY2d6L3g4Nl82NC1yaGVsLzdkMzNmZTlhYjllYWNlMjQwM2FkZWZlYTNjNmRj MmM5MmEwYTUxODUvMCBpcD06Ojo6bGtwLW5lMDQ6OmRoY3AgZWFybHlwcmludGs9dHR5UzAs MTE1MjAwIGRlYnVnIGFwaWM9ZGVidWcgc3lzcnFfYWx3YXlzX2VuYWJsZWQgcmN1cGRhdGUu cmN1X2NwdV9zdGFsbF90aW1lb3V0PTEwMCBwYW5pYz0tMSBzb2Z0bG9ja3VwX3BhbmljPTEg bm1pX3dhdGNoZG9nPXBhbmljIG9vcHM9cGFuaWMgbG9hZF9yYW1kaXNrPTIgcHJvbXB0X3Jh bWRpc2s9MCBjb25zb2xlPXR0eVMwLDExNTIwMCBjb25zb2xlPXR0eTAgdmdhPW5vcm1hbCBy dwpbICAgIDAuMDAwMDAwXSBlODIwOiBCSU9TLXByb3ZpZGVkIHBoeXNpY2FsIFJBTSBtYXA6 ClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwMDAxMDAtMHgw MDAwMDAwMDAwMDlhM2ZmXSB1c2FibGUKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVt IDB4MDAwMDAwMDAwMDA5YTQwMC0weDAwMDAwMDAwMDAwOWZmZmZdIHJlc2VydmVkClsgICAg MC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwZTAwMDAtMHgwMDAwMDAw MDAwMGZmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgw MDAwMDAwMDAwMTAwMDAwLTB4MDAwMDAwMDA4YzU1NWZmZl0gdXNhYmxlClsgICAgMC4wMDAw MDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwOGM1NTYwMDAtMHgwMDAwMDAwMDhjNjI4 ZmZmXSBBQ1BJIE5WUwpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAw MDhjNjI5MDAwLTB4MDAwMDAwMDA4YzcwMWZmZl0gQUNQSSBkYXRhClsgICAgMC4wMDAwMDBd IEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwOGM3MDIwMDAtMHgwMDAwMDAwMDhkYjAxZmZm XSBBQ1BJIE5WUwpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDhk YjAyMDAwLTB4MDAwMDAwMDA4ZjYwMWZmZl0gQUNQSSBkYXRhClsgICAgMC4wMDAwMDBdIEJJ T1MtZTgyMDogW21lbSAweDAwMDAwMDAwOGY2MDIwMDAtMHgwMDAwMDAwMDhmNjRlZmZmXSBy ZXNlcnZlZApbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDhmNjRm MDAwLTB4MDAwMDAwMDA4ZjZlNWZmZl0gQUNQSSBkYXRhClsgICAgMC4wMDAwMDBdIEJJT1Mt ZTgyMDogW21lbSAweDAwMDAwMDAwOGY2ZTYwMDAtMHgwMDAwMDAwMDhmNmVmZmZmXSBBQ1BJ IE5WUwpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDhmNmYwMDAw LTB4MDAwMDAwMDA4ZjZmMWZmZl0gQUNQSSBkYXRhClsgICAgMC4wMDAwMDBdIEJJT1MtZTgy MDogW21lbSAweDAwMDAwMDAwOGY2ZjIwMDAtMHgwMDAwMDAwMDhmN2NlZmZmXSBBQ1BJIE5W UwpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDhmN2NmMDAwLTB4 MDAwMDAwMDA4ZjdmZmZmZl0gQUNQSSBkYXRhClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDog W21lbSAweDAwMDAwMDAwOGY4MDAwMDAtMHgwMDAwMDAwMDhmZmZmZmZmXSByZXNlcnZlZApb ICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMGEwMDAwMDAwLTB4MDAw MDAwMDBhZmZmZmZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVt IDB4MDAwMDAwMDBmYzAwMDAwMC0weDAwMDAwMDAwZmNmZmZmZmZdIHJlc2VydmVkClsgICAg MC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwZmVkMWMwMDAtMHgwMDAwMDAw MGZlZDFmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgw MDAwMDAwMGZmODAwMDAwLTB4MDAwMDAwMDBmZmZmZmZmZl0gcmVzZXJ2ZWQKWyAgICAwLjAw MDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDEwMDAwMDAwMC0weDAwMDAwMDAzNmZm ZmZmZmZdIHVzYWJsZQpbICAgIDAuMDAwMDAwXSBib290Y29uc29sZSBbZWFybHlzZXIwXSBl bmFibGVkClsgICAgMC4wMDAwMDBdIE5YIChFeGVjdXRlIERpc2FibGUpIHByb3RlY3Rpb246 IGFjdGl2ZQpbICAgIDAuMDAwMDAwXSBTTUJJT1MgMi41IHByZXNlbnQuClsgICAgMC4wMDAw MDBdIERNSTogSW50ZWwgQ29ycG9yYXRpb24gUzU1MjBVUi9TNTUyMFVSLCBCSU9TIFM1NTAw Ljg2Qi4wMS4wMC4wMDUwLjA1MDYyMDEwMTYwNSAwNS8wNi8yMDEwClsgICAgMC4wMDAwMDBd IGU4MjA6IHVwZGF0ZSBbbWVtIDB4MDAwMDAwMDAtMHgwMDAwMGZmZl0gdXNhYmxlID09PiBy ZXNlcnZlZApbICAgIDAuMDAwMDAwXSBlODIwOiByZW1vdmUgW21lbSAweDAwMGEwMDAwLTB4 MDAwZmZmZmZdIHVzYWJsZQpbICAgIDAuMDAwMDAwXSBBR1A6IE5vIEFHUCBicmlkZ2UgZm91 bmQKWyAgICAwLjAwMDAwMF0gZTgyMDogbGFzdF9wZm4gPSAweDM3MDAwMCBtYXhfYXJjaF9w Zm4gPSAweDQwMDAwMDAwMApbICAgIDAuMDAwMDAwXSBNVFJSIGRlZmF1bHQgdHlwZTogdW5j YWNoYWJsZQpbICAgIDAuMDAwMDAwXSBNVFJSIGZpeGVkIHJhbmdlcyBlbmFibGVkOgpbICAg IDAuMDAwMDAwXSAgIDAwMDAwLTlGRkZGIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICBB MDAwMC1ERkZGRiB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdICAgRTAwMDAtRkZGRkYgd3Jp dGUtcHJvdGVjdApbICAgIDAuMDAwMDAwXSBNVFJSIHZhcmlhYmxlIHJhbmdlcyBlbmFibGVk OgpbICAgIDAuMDAwMDAwXSAgIDAgYmFzZSAwMDAwMDAwMDAwIG1hc2sgRkY4MDAwMDAwMCB3 cml0ZS1iYWNrClsgICAgMC4wMDAwMDBdICAgMSBiYXNlIDAwODAwMDAwMDAgbWFzayBGRkYw MDAwMDAwIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICAyIGJhc2UgMDEwMDAwMDAwMCBt YXNrIEZGMDAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDMgYmFzZSAwMjAw MDAwMDAwIG1hc2sgRkYwMDAwMDAwMCB3cml0ZS1iYWNrClsgICAgMC4wMDAwMDBdICAgNCBi YXNlIDAzMDAwMDAwMDAgbWFzayBGRkMwMDAwMDAwIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAw MF0gICA1IGJhc2UgMDM0MDAwMDAwMCBtYXNrIEZGRTAwMDAwMDAgd3JpdGUtYmFjawpbICAg IDAuMDAwMDAwXSAgIDYgYmFzZSAwMzYwMDAwMDAwIG1hc2sgRkZGMDAwMDAwMCB3cml0ZS1i YWNrClsgICAgMC4wMDAwMDBdICAgNyBiYXNlIDAwQjAwMDAwMDAgbWFzayBGRkZGMDAwMDAw IHdyaXRlLWNvbWJpbmluZwpbICAgIDAuMDAwMDAwXSB4ODYgUEFUIGVuYWJsZWQ6IGNwdSAw LCBvbGQgMHg3MDEwNjAwMDcwMTA2LCBuZXcgMHg3MDEwNjAwMDcwMTA2ClsgICAgMC4wMDAw MDBdIGU4MjA6IGxhc3RfcGZuID0gMHg4YzU1NiBtYXhfYXJjaF9wZm4gPSAweDQwMDAwMDAw MApbICAgIDAuMDAwMDAwXSBTY2FuIGZvciBTTVAgaW4gW21lbSAweDAwMDAwMDAwLTB4MDAw MDAzZmZdClsgICAgMC4wMDAwMDBdIFNjYW4gZm9yIFNNUCBpbiBbbWVtIDB4MDAwOWZjMDAt MHgwMDA5ZmZmZl0KWyAgICAwLjAwMDAwMF0gU2NhbiBmb3IgU01QIGluIFttZW0gMHgwMDBm MDAwMC0weDAwMGZmZmZmXQpbICAgIDAuMDAwMDAwXSBmb3VuZCBTTVAgTVAtdGFibGUgYXQg W21lbSAweDAwMGZkYWIwLTB4MDAwZmRhYmZdIG1hcHBlZCBhdCBbZmZmZjg4MDAwMDBmZGFi MF0KWyAgICAwLjAwMDAwMF0gICBtcGM6IGVmMjYwLWVmNDI0ClsgICAgMC4wMDAwMDBdIEJh c2UgbWVtb3J5IHRyYW1wb2xpbmUgYXQgW2ZmZmY4ODAwMDAwOTQwMDBdIDk0MDAwIHNpemUg MjQ1NzYKWyAgICAwLjAwMDAwMF0gaW5pdF9tZW1vcnlfbWFwcGluZzogW21lbSAweDAwMDAw MDAwLTB4MDAwZmZmZmZdClsgICAgMC4wMDAwMDBdICBbbWVtIDB4MDAwMDAwMDAtMHgwMDBm ZmZmZl0gcGFnZSA0awpbICAgIDAuMDAwMDAwXSBCUksgWzB4MzZmMTk4MDAwLCAweDM2ZjE5 OGZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBCUksgWzB4MzZmMTk5MDAwLCAweDM2ZjE5 OWZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBCUksgWzB4MzZmMTlhMDAwLCAweDM2ZjE5 YWZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBpbml0X21lbW9yeV9tYXBwaW5nOiBbbWVt IDB4MzZmZTAwMDAwLTB4MzZmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSAgW21lbSAweDM2ZmUw MDAwMC0weDM2ZmZmZmZmZl0gcGFnZSAyTQpbICAgIDAuMDAwMDAwXSBCUksgWzB4MzZmMTli MDAwLCAweDM2ZjE5YmZmZl0gUEdUQUJMRQpbICAgIDAuMDAwMDAwXSBpbml0X21lbW9yeV9t YXBwaW5nOiBbbWVtIDB4MzZjMDAwMDAwLTB4MzZmZGZmZmZmXQpbICAgIDAuMDAwMDAwXSAg W21lbSAweDM2YzAwMDAwMC0weDM2ZmRmZmZmZl0gcGFnZSAyTQpbICAgIDAuMDAwMDAwXSBp bml0X21lbW9yeV9tYXBwaW5nOiBbbWVtIDB4MzAwMDAwMDAwLTB4MzZiZmZmZmZmXQpbICAg IDAuMDAwMDAwXSAgW21lbSAweDMwMDAwMDAwMC0weDM2YmZmZmZmZl0gcGFnZSAyTQpbICAg IDAuMDAwMDAwXSBCUksgWzB4MzZmMTljMDAwLCAweDM2ZjE5Y2ZmZl0gUEdUQUJMRQpbICAg IDAuMDAwMDAwXSBpbml0X21lbW9yeV9tYXBwaW5nOiBbbWVtIDB4MDAxMDAwMDAtMHg4YzU1 NWZmZl0KWyAgICAwLjAwMDAwMF0gIFttZW0gMHgwMDEwMDAwMC0weDAwMWZmZmZmXSBwYWdl IDRrClsgICAgMC4wMDAwMDBdICBbbWVtIDB4MDAyMDAwMDAtMHg4YzNmZmZmZl0gcGFnZSAy TQpbICAgIDAuMDAwMDAwXSAgW21lbSAweDhjNDAwMDAwLTB4OGM1NTVmZmZdIHBhZ2UgNGsK WyAgICAwLjAwMDAwMF0gQlJLIFsweDM2ZjE5ZDAwMCwgMHgzNmYxOWRmZmZdIFBHVEFCTEUK WyAgICAwLjAwMDAwMF0gaW5pdF9tZW1vcnlfbWFwcGluZzogW21lbSAweDEwMDAwMDAwMC0w eDJmZmZmZmZmZl0KWyAgICAwLjAwMDAwMF0gIFttZW0gMHgxMDAwMDAwMDAtMHgyZmZmZmZm ZmZdIHBhZ2UgMk0KWyAgICAwLjAwMDAwMF0gUkFNRElTSzogW21lbSAweDM2NjJlOTAwMC0w eDM2ZGZmZmZmZl0KWyAgICAwLjAwMDAwMF0gQUNQSTogRWFybHkgdGFibGUgY2hlY2tzdW0g dmVyaWZpY2F0aW9uIGRpc2FibGVkClsgICAgMC4wMDAwMDBdIEFDUEk6IFJTRFAgMHgwMDAw MDAwMDAwMEYwNDEwIDAwMDAyNCAodjAyIElOVEVMICkKWyAgICAwLjAwMDAwMF0gQUNQSTog WFNEVCAweDAwMDAwMDAwOEY3RkQxMjAgMDAwMDk0ICh2MDEgSU5URUwgIFM1NTIwVVIgIDAw MDAwMDAwICAgICAgMDEwMDAwMTMpClsgICAgMC4wMDAwMDBdIEFDUEk6IEZBQ1AgMHgwMDAw MDAwMDhGN0ZCMDAwIDAwMDBGNCAodjA0IElOVEVMICBTNTUyMFVSICAwMDAwMDAwMCBNU0ZU IDAxMDAwMDBEKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBEU0RUIDB4MDAwMDAwMDA4RjdGNDAw MCAwMDY1N0UgKHYwMiBJTlRFTCAgUzU1MjBVUiAgMDAwMDAwMDMgTVNGVCAwMTAwMDAwRCkK WyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUyAweDAwMDAwMDAwOEY2RjIwMDAgMDAwMDQwClsg ICAgMC4wMDAwMDBdIEFDUEk6IEFQSUMgMHgwMDAwMDAwMDhGN0YzMDAwIDAwMDFBOCAodjAy IElOVEVMICBTNTUyMFVSICAwMDAwMDAwMCBNU0ZUIDAxMDAwMDBEKQpbICAgIDAuMDAwMDAw XSBBQ1BJOiBNQ0ZHIDB4MDAwMDAwMDA4RjdGMjAwMCAwMDAwM0MgKHYwMSBJTlRFTCAgUzU1 MjBVUiAgMDAwMDAwMDEgTVNGVCAwMTAwMDAwRCkKWyAgICAwLjAwMDAwMF0gQUNQSTogSFBF VCAweDAwMDAwMDAwOEY3RjEwMDAgMDAwMDM4ICh2MDEgSU5URUwgIFM1NTIwVVIgIDAwMDAw MDAxIE1TRlQgMDEwMDAwMEQpClsgICAgMC4wMDAwMDBdIEFDUEk6IFNMSVQgMHgwMDAwMDAw MDhGN0YwMDAwIDAwMDAzMCAodjAxIElOVEVMICBTNTUyMFVSICAwMDAwMDAwMSBNU0ZUIDAx MDAwMDBEKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBTUkFUIDB4MDAwMDAwMDA4RjdFRjAwMCAw MDA0MzAgKHYwMiBJTlRFTCAgUzU1MjBVUiAgMDAwMDAwMDEgTVNGVCAwMTAwMDAwRCkKWyAg ICAwLjAwMDAwMF0gQUNQSTogU1BDUiAweDAwMDAwMDAwOEY3RUUwMDAgMDAwMDUwICh2MDEg SU5URUwgIFM1NTIwVVIgIDAwMDAwMDAwIE1TRlQgMDEwMDAwMEQpClsgICAgMC4wMDAwMDBd IEFDUEk6IFdERFQgMHgwMDAwMDAwMDhGN0VEMDAwIDAwMDA0MCAodjAxIElOVEVMICBTNTUy MFVSICAwMDAwMDAwMCBNU0ZUIDAxMDAwMDBEKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBTU0RU IDB4MDAwMDAwMDA4RjdEMjAwMCAwMUFGQzQgKHYwMiBJTlRFTCAgU1NEVCAgUE0gMDAwMDQw MDAgSU5UTCAyMDA2MTEwOSkKWyAgICAwLjAwMDAwMF0gQUNQSTogU1NEVCAweDAwMDAwMDAw OEY3RDEwMDAgMDAwMUQ4ICh2MDIgSU5URUwgIElQTUkgICAgIDAwMDA0MDAwIElOVEwgMjAw NjExMDkpClsgICAgMC4wMDAwMDBdIEFDUEk6IEhFU1QgMHgwMDAwMDAwMDhGN0QwMDAwIDAw MDBBOCAodjAxIElOVEVMICBTNTUyMFVSICAwMDAwMDAwMSBJTlRMIDAwMDAwMDAxKQpbICAg IDAuMDAwMDAwXSBBQ1BJOiBCRVJUIDB4MDAwMDAwMDA4RjdDRjAwMCAwMDAwMzAgKHYwMSBJ TlRFTCAgUzU1MjBVUiAgMDAwMDAwMDEgSU5UTCAwMDAwMDAwMSkKWyAgICAwLjAwMDAwMF0g QUNQSTogRVJTVCAweDAwMDAwMDAwOEY2RjEwMDAgMDAwMjMwICh2MDEgSU5URUwgIFM1NTIw VVIgIDAwMDAwMDAxIElOVEwgMDAwMDAwMDEpClsgICAgMC4wMDAwMDBdIEFDUEk6IEVJTkog MHgwMDAwMDAwMDhGNkYwMDAwIDAwMDEzMCAodjAxIElOVEVMICBTNTUyMFVSICAwMDAwMDAw MSBJTlRMIDAwMDAwMDAxKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMb2NhbCBBUElDIGFkZHJl c3MgMHhmZWUwMDAwMApbICAgIDAuMDAwMDAwXSBtYXBwZWQgQVBJQyB0byBmZmZmZmZmZmZm NTdjMDAwICggICAgICAgIGZlZTAwMDAwKQpbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMCAt PiBBUElDIDB4MDAgLT4gTm9kZSAwClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAxIC0+IEFQ SUMgMHgxMCAtPiBOb2RlIDEKWyAgICAwLjAwMDAwMF0gU1JBVDogUFhNIDAgLT4gQVBJQyAw eDAyIC0+IE5vZGUgMApbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMSAtPiBBUElDIDB4MTIg LT4gTm9kZSAxClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAwIC0+IEFQSUMgMHgwNCAtPiBO b2RlIDAKWyAgICAwLjAwMDAwMF0gU1JBVDogUFhNIDEgLT4gQVBJQyAweDE0IC0+IE5vZGUg MQpbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMCAtPiBBUElDIDB4MDYgLT4gTm9kZSAwClsg ICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAxIC0+IEFQSUMgMHgxNiAtPiBOb2RlIDEKWyAgICAw LjAwMDAwMF0gU1JBVDogUFhNIDAgLT4gQVBJQyAweDAxIC0+IE5vZGUgMApbICAgIDAuMDAw MDAwXSBTUkFUOiBQWE0gMSAtPiBBUElDIDB4MTEgLT4gTm9kZSAxClsgICAgMC4wMDAwMDBd IFNSQVQ6IFBYTSAwIC0+IEFQSUMgMHgwMyAtPiBOb2RlIDAKWyAgICAwLjAwMDAwMF0gU1JB VDogUFhNIDEgLT4gQVBJQyAweDEzIC0+IE5vZGUgMQpbICAgIDAuMDAwMDAwXSBTUkFUOiBQ WE0gMCAtPiBBUElDIDB4MDUgLT4gTm9kZSAwClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAx IC0+IEFQSUMgMHgxNSAtPiBOb2RlIDEKWyAgICAwLjAwMDAwMF0gU1JBVDogUFhNIDAgLT4g QVBJQyAweDA3IC0+IE5vZGUgMApbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMSAtPiBBUElD IDB4MTcgLT4gTm9kZSAxClsgICAgMC4wMDAwMDBdIFNSQVQ6IE5vZGUgMCBQWE0gMCBbbWVt IDB4MDAwMDAwMDAtMHg4ZmZmZmZmZl0KWyAgICAwLjAwMDAwMF0gU1JBVDogTm9kZSAwIFBY TSAwIFttZW0gMHgxMDAwMDAwMDAtMHgxZWZmZmZmZmZdClsgICAgMC4wMDAwMDBdIFNSQVQ6 IE5vZGUgMSBQWE0gMSBbbWVtIDB4MWYwMDAwMDAwLTB4MzZmZmZmZmZmXQpbICAgIDAuMDAw MDAwXSBOVU1BOiBJbml0aWFsaXplZCBkaXN0YW5jZSB0YWJsZSwgY250PTIKWyAgICAwLjAw MDAwMF0gTlVNQTogTm9kZSAwIFttZW0gMHgwMDAwMDAwMC0weDhmZmZmZmZmXSArIFttZW0g MHgxMDAwMDAwMDAtMHgxZWZmZmZmZmZdIC0+IFttZW0gMHgwMDAwMDAwMC0weDFlZmZmZmZm Zl0KWyAgICAwLjAwMDAwMF0gTk9ERV9EQVRBKDApIGFsbG9jYXRlZCBbbWVtIDB4MWVmZmRh MDAwLTB4MWVmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBOT0RFX0RBVEEoMSkgYWxsb2NhdGVk IFttZW0gMHgzNmZmY2YwMDAtMHgzNmZmZjRmZmZdClsgICAgMC4wMDAwMDBdICBbZmZmZmVh MDAwMDAwMDAwMC1mZmZmZWEwMDA3YmZmZmZmXSBQTUQgLT4gW2ZmZmY4ODAxZTllMDAwMDAt ZmZmZjg4MDFlZmRmZmZmZl0gb24gbm9kZSAwClsgICAgMC4wMDAwMDBdICBbZmZmZmVhMDAw N2MwMDAwMC1mZmZmZWEwMDBkYmZmZmZmXSBQTUQgLT4gW2ZmZmY4ODAzNjAyMDAwMDAtZmZm Zjg4MDM2NjFmZmZmZl0gb24gbm9kZSAxClsgICAgMC4wMDAwMDBdIFpvbmUgcmFuZ2VzOgpb ICAgIDAuMDAwMDAwXSAgIERNQSAgICAgIFttZW0gMHgwMDAwMTAwMC0weDAwZmZmZmZmXQpb ICAgIDAuMDAwMDAwXSAgIERNQTMyICAgIFttZW0gMHgwMTAwMDAwMC0weGZmZmZmZmZmXQpb ICAgIDAuMDAwMDAwXSAgIE5vcm1hbCAgIFttZW0gMHgxMDAwMDAwMDAtMHgzNmZmZmZmZmZd ClsgICAgMC4wMDAwMDBdIE1vdmFibGUgem9uZSBzdGFydCBmb3IgZWFjaCBub2RlClsgICAg MC4wMDAwMDBdIEVhcmx5IG1lbW9yeSBub2RlIHJhbmdlcwpbICAgIDAuMDAwMDAwXSAgIG5v ZGUgICAwOiBbbWVtIDB4MDAwMDEwMDAtMHgwMDA5OWZmZl0KWyAgICAwLjAwMDAwMF0gICBu b2RlICAgMDogW21lbSAweDAwMTAwMDAwLTB4OGM1NTVmZmZdClsgICAgMC4wMDAwMDBdICAg bm9kZSAgIDA6IFttZW0gMHgxMDAwMDAwMDAtMHgxZWZmZmZmZmZdClsgICAgMC4wMDAwMDBd ICAgbm9kZSAgIDE6IFttZW0gMHgxZjAwMDAwMDAtMHgzNmZmZmZmZmZdClsgICAgMC4wMDAw MDBdIEluaXRtZW0gc2V0dXAgbm9kZSAwIFttZW0gMHgwMDAwMTAwMC0weDFlZmZmZmZmZl0K WyAgICAwLjAwMDAwMF0gT24gbm9kZSAwIHRvdGFscGFnZXM6IDE1NTc3NDMKWyAgICAwLjAw MDAwMF0gICBETUEgem9uZTogNjQgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsgICAgMC4wMDAw MDBdICAgRE1BIHpvbmU6IDIxIHBhZ2VzIHJlc2VydmVkClsgICAgMC4wMDAwMDBdICAgRE1B IHpvbmU6IDM5OTMgcGFnZXMsIExJRk8gYmF0Y2g6MApbICAgIDAuMDAwMDAwXSAgIERNQTMy IHpvbmU6IDg5MTggcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsgICAgMC4wMDAwMDBdICAgRE1B MzIgem9uZTogNTcwNzEwIHBhZ2VzLCBMSUZPIGJhdGNoOjMxClsgICAgMC4wMDAwMDBdICAg Tm9ybWFsIHpvbmU6IDE1MzYwIHBhZ2VzIHVzZWQgZm9yIG1lbW1hcApbICAgIDAuMDAwMDAw XSAgIE5vcm1hbCB6b25lOiA5ODMwNDAgcGFnZXMsIExJRk8gYmF0Y2g6MzEKWyAgICAwLjAw MDAwMF0gSW5pdG1lbSBzZXR1cCBub2RlIDEgW21lbSAweDFmMDAwMDAwMC0weDM2ZmZmZmZm Zl0KWyAgICAwLjAwMDAwMF0gT24gbm9kZSAxIHRvdGFscGFnZXM6IDE1NzI4NjQKWyAgICAw LjAwMDAwMF0gICBOb3JtYWwgem9uZTogMjQ1NzYgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsg ICAgMC4wMDAwMDBdICAgTm9ybWFsIHpvbmU6IDE1NzI4NjQgcGFnZXMsIExJRk8gYmF0Y2g6 MzEKWyAgICAwLjAwMDAwMF0gQUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHg0MDgKWyAgICAw LjAwMDAwMF0gQUNQSTogTG9jYWwgQVBJQyBhZGRyZXNzIDB4ZmVlMDAwMDAKWyAgICAwLjAw MDAwMF0gbWFwcGVkIEFQSUMgdG8gZmZmZmZmZmZmZjU3YzAwMCAoICAgICAgICBmZWUwMDAw MCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMF0gbGFwaWNfaWRb MHgwMF0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgw MV0gbGFwaWNfaWRbMHgxMF0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMg KGFjcGlfaWRbMHgwMl0gbGFwaWNfaWRbMHgwMl0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0g QUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwM10gbGFwaWNfaWRbMHgxMl0gZW5hYmxlZCkKWyAg ICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNF0gbGFwaWNfaWRbMHgwNF0g ZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNV0gbGFw aWNfaWRbMHgxNF0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlf aWRbMHgwNl0gbGFwaWNfaWRbMHgwNl0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTog TEFQSUMgKGFjcGlfaWRbMHgwN10gbGFwaWNfaWRbMHgxNl0gZW5hYmxlZCkKWyAgICAwLjAw MDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwOF0gbGFwaWNfaWRbMHgwMV0gZW5hYmxl ZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwOV0gbGFwaWNfaWRb MHgxMV0gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgw YV0gbGFwaWNfaWRbMHgwM10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMg KGFjcGlfaWRbMHgwYl0gbGFwaWNfaWRbMHgxM10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0g QUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwY10gbGFwaWNfaWRbMHgwNV0gZW5hYmxlZCkKWyAg ICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwZF0gbGFwaWNfaWRbMHgxNV0g ZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwZV0gbGFw aWNfaWRbMHgwN10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlf aWRbMHgwZl0gbGFwaWNfaWRbMHgxN10gZW5hYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTog TEFQSUMgKGFjcGlfaWRbMHgxMF0gbGFwaWNfaWRbMHhmZl0gZGlzYWJsZWQpClsgICAgMC4w MDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MTFdIGxhcGljX2lkWzB4ZmZdIGRpc2Fi bGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDEyXSBsYXBpY19p ZFsweGZmXSBkaXNhYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRb MHgxM10gbGFwaWNfaWRbMHhmZl0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExB UElDIChhY3BpX2lkWzB4MTRdIGxhcGljX2lkWzB4ZmZdIGRpc2FibGVkKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDE1XSBsYXBpY19pZFsweGZmXSBkaXNhYmxl ZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgxNl0gbGFwaWNfaWRb MHhmZl0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4 MTddIGxhcGljX2lkWzB4ZmZdIGRpc2FibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJ Q19OTUkgKGFjcGlfaWRbMHgwMF0gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAw MDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDAxXSBoaWdoIGxldmVsIGxpbnRbMHgx XSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MDJdIGhpZ2gg bGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlf aWRbMHgwM10gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExB UElDX05NSSAoYWNwaV9pZFsweDA0XSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAw MDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MDVdIGhpZ2ggbGV2ZWwgbGludFsw eDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwNl0gaGln aCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNw aV9pZFsweDA3XSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTog TEFQSUNfTk1JIChhY3BpX2lkWzB4MDhdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAu MDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwOV0gaGlnaCBsZXZlbCBsaW50 WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDBhXSBo aWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChh Y3BpX2lkWzB4MGJdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJ OiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwY10gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAg MC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDBkXSBoaWdoIGxldmVsIGxp bnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MGVd IGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkg KGFjcGlfaWRbMHgwZl0gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFD UEk6IExBUElDX05NSSAoYWNwaV9pZFsweDEwXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAg ICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MTFdIGhpZ2ggbGV2ZWwg bGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgx Ml0gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05N SSAoYWNwaV9pZFsweDEzXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0g QUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MTRdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpb ICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgxNV0gaGlnaCBsZXZl bCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsw eDE2XSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNf Tk1JIChhY3BpX2lkWzB4MTddIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAw XSBBQ1BJOiBJT0FQSUMgKGlkWzB4MDhdIGFkZHJlc3NbMHhmZWMwMDAwMF0gZ3NpX2Jhc2Vb MF0pClsgICAgMC4wMDAwMDBdIElPQVBJQ1swXTogYXBpY19pZCA4LCB2ZXJzaW9uIDMyLCBh ZGRyZXNzIDB4ZmVjMDAwMDAsIEdTSSAwLTIzClsgICAgMC4wMDAwMDBdIEFDUEk6IElPQVBJ QyAoaWRbMHgwOV0gYWRkcmVzc1sweGZlYzkwMDAwXSBnc2lfYmFzZVsyNF0pClsgICAgMC4w MDAwMDBdIElPQVBJQ1sxXTogYXBpY19pZCA5LCB2ZXJzaW9uIDMyLCBhZGRyZXNzIDB4ZmVj OTAwMDAsIEdTSSAyNC00NwpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVz IDAgYnVzX2lycSAwIGdsb2JhbF9pcnEgMiBkZmwgZGZsKQpbICAgIDAuMDAwMDAwXSBJbnQ6 IHR5cGUgMCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEgMDAsIEFQSUMgSUQgOCwgQVBJ QyBJTlQgMDIKWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19p cnEgOSBnbG9iYWxfaXJxIDkgaGlnaCBsZXZlbCkKWyAgICAwLjAwMDAwMF0gSW50OiB0eXBl IDAsIHBvbCAxLCB0cmlnIDMsIGJ1cyAwMCwgSVJRIDA5LCBBUElDIElEIDgsIEFQSUMgSU5U IDA5ClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTAgdXNlZCBieSBvdmVycmlkZS4KWyAgICAw LjAwMDAwMF0gSW50OiB0eXBlIDAsIHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJRIDAxLCBB UElDIElEIDgsIEFQSUMgSU5UIDAxClsgICAgMC4wMDAwMDBdIEludDogdHlwZSAwLCBwb2wg MCwgdHJpZyAwLCBidXMgMDAsIElSUSAwMywgQVBJQyBJRCA4LCBBUElDIElOVCAwMwpbICAg IDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEgMDQs IEFQSUMgSUQgOCwgQVBJQyBJTlQgMDQKWyAgICAwLjAwMDAwMF0gSW50OiB0eXBlIDAsIHBv bCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJRIDA1LCBBUElDIElEIDgsIEFQSUMgSU5UIDA1Clsg ICAgMC4wMDAwMDBdIEludDogdHlwZSAwLCBwb2wgMCwgdHJpZyAwLCBidXMgMDAsIElSUSAw NiwgQVBJQyBJRCA4LCBBUElDIElOVCAwNgpbICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwg cG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEgMDcsIEFQSUMgSUQgOCwgQVBJQyBJTlQgMDcK WyAgICAwLjAwMDAwMF0gSW50OiB0eXBlIDAsIHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJR IDA4LCBBUElDIElEIDgsIEFQSUMgSU5UIDA4ClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTkg dXNlZCBieSBvdmVycmlkZS4KWyAgICAwLjAwMDAwMF0gSW50OiB0eXBlIDAsIHBvbCAwLCB0 cmlnIDAsIGJ1cyAwMCwgSVJRIDBhLCBBUElDIElEIDgsIEFQSUMgSU5UIDBhClsgICAgMC4w MDAwMDBdIEludDogdHlwZSAwLCBwb2wgMCwgdHJpZyAwLCBidXMgMDAsIElSUSAwYiwgQVBJ QyBJRCA4LCBBUElDIElOVCAwYgpbICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9sIDAs IHRyaWcgMCwgYnVzIDAwLCBJUlEgMGMsIEFQSUMgSUQgOCwgQVBJQyBJTlQgMGMKWyAgICAw LjAwMDAwMF0gSW50OiB0eXBlIDAsIHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJRIDBkLCBB UElDIElEIDgsIEFQSUMgSU5UIDBkClsgICAgMC4wMDAwMDBdIEludDogdHlwZSAwLCBwb2wg MCwgdHJpZyAwLCBidXMgMDAsIElSUSAwZSwgQVBJQyBJRCA4LCBBUElDIElOVCAwZQpbICAg IDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEgMGYs IEFQSUMgSUQgOCwgQVBJQyBJTlQgMGYKWyAgICAwLjAwMDAwMF0gVXNpbmcgQUNQSSAoTUFE VCkgZm9yIFNNUCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uClsgICAgMC4wMDAwMDBdIEFD UEk6IEhQRVQgaWQ6IDB4ODA4NmE0MDEgYmFzZTogMHhmZWQwMDAwMApbICAgIDAuMDAwMDAw XSBzbXBib290OiBBbGxvd2luZyAyNCBDUFVzLCA4IGhvdHBsdWcgQ1BVcwpbICAgIDAuMDAw MDAwXSBtYXBwZWQgSU9BUElDIHRvIGZmZmZmZmZmZmY1N2IwMDAgKGZlYzAwMDAwKQpbICAg IDAuMDAwMDAwXSBtYXBwZWQgSU9BUElDIHRvIGZmZmZmZmZmZmY1N2EwMDAgKGZlYzkwMDAw KQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4 MDAwMDAwMDAtMHgwMDAwMGZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9z YXZlIG1lbW9yeTogW21lbSAweDAwMDlhMDAwLTB4MDAwOWFmZmZdClsgICAgMC4wMDAwMDBd IFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHgwMDA5YjAwMC0weDAwMDlm ZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVt IDB4MDAwYTAwMDAtMHgwMDBkZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQg bm9zYXZlIG1lbW9yeTogW21lbSAweDAwMGUwMDAwLTB4MDAwZmZmZmZdClsgICAgMC4wMDAw MDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg4YzU1NjAwMC0weDhj NjI4ZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBb bWVtIDB4OGM2MjkwMDAtMHg4YzcwMWZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVy ZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDhjNzAyMDAwLTB4OGRiMDFmZmZdClsgICAgMC4w MDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg4ZGIwMjAwMC0w eDhmNjAxZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5 OiBbbWVtIDB4OGY2MDIwMDAtMHg4ZjY0ZWZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lz dGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDhmNjRmMDAwLTB4OGY2ZTVmZmZdClsgICAg MC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg4ZjZlNjAw MC0weDhmNmVmZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVt b3J5OiBbbWVtIDB4OGY2ZjAwMDAtMHg4ZjZmMWZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJl Z2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDhmNmYyMDAwLTB4OGY3Y2VmZmZdClsg ICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHg4Zjdj ZjAwMC0weDhmN2ZmZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUg bWVtb3J5OiBbbWVtIDB4OGY4MDAwMDAtMHg4ZmZmZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06 IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDkwMDAwMDAwLTB4OWZmZmZmZmZd ClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHhh MDAwMDAwMC0weGFmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3Nh dmUgbWVtb3J5OiBbbWVtIDB4YjAwMDAwMDAtMHhmYmZmZmZmZl0KWyAgICAwLjAwMDAwMF0g UE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweGZjMDAwMDAwLTB4ZmNmZmZm ZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0g MHhmZDAwMDAwMC0weGZlZDFiZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBu b3NhdmUgbWVtb3J5OiBbbWVtIDB4ZmVkMWMwMDAtMHhmZWQxZmZmZl0KWyAgICAwLjAwMDAw MF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweGZlZDIwMDAwLTB4ZmY3 ZmZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFtt ZW0gMHhmZjgwMDAwMC0weGZmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBlODIwOiBbbWVtIDB4 YjAwMDAwMDAtMHhmYmZmZmZmZl0gYXZhaWxhYmxlIGZvciBQQ0kgZGV2aWNlcwpbICAgIDAu MDAwMDAwXSBCb290aW5nIHBhcmF2aXJ0dWFsaXplZCBrZXJuZWwgb24gYmFyZSBoYXJkd2Fy ZQpbICAgIDAuMDAwMDAwXSBzZXR1cF9wZXJjcHU6IE5SX0NQVVM6ODE5MiBucl9jcHVtYXNr X2JpdHM6MjQgbnJfY3B1X2lkczoyNCBucl9ub2RlX2lkczoyClsgICAgMC4wMDAwMDBdIFBF UkNQVTogRW1iZWRkZWQgMzEgcGFnZXMvY3B1IEBmZmZmODgwMWU5YzAwMDAwIHM4OTE1MiBy ODE5MiBkMjk2MzIgdTEzMTA3MgpbICAgIDAuMDAwMDAwXSBwY3B1LWFsbG9jOiBzODkxNTIg cjgxOTIgZDI5NjMyIHUxMzEwNzIgYWxsb2M9MSoyMDk3MTUyClsgICAgMC4wMDAwMDBdIHBj cHUtYWxsb2M6IFswXSAwMCAwMiAwNCAwNiAwOCAxMCAxMiAxNCAxNiAxOCAyMCAyMiAtLSAt LSAtLSAtLSAKWyAgICAwLjAwMDAwMF0gcGNwdS1hbGxvYzogWzFdIDAxIDAzIDA1IDA3IDA5 IDExIDEzIDE1IDE3IDE5IDIxIDIzIC0tIC0tIC0tIC0tIApbICAgIDAuMDAwMDAwXSBCdWls dCAyIHpvbmVsaXN0cyBpbiBOb2RlIG9yZGVyLCBtb2JpbGl0eSBncm91cGluZyBvbi4gIFRv dGFsIHBhZ2VzOiAzMDgxNjY4ClsgICAgMC4wMDAwMDBdIFBvbGljeSB6b25lOiBOb3JtYWwK WyAgICAwLjAwMDAwMF0gS2VybmVsIGNvbW1hbmQgbGluZTogdXNlcj1sa3Agam9iPS9sa3Av c2NoZWR1bGVkL2xrcC1uZTA0L2N5Y2xpY19mc21hcmstcGVyZm9ybWFuY2UtMXgtMzJ0LTFI REQteGZzLTVLLTQwME0tZnN5bmNCZWZvcmVDbG9zZS0xNmQtMjU2ZnBkLXg4Nl82NC1yaGVs LUhFQUQtN2QzM2ZlOWFiOWVhY2UyNDAzYWRlZmVhM2M2ZGMyYzkyYTBhNTE4NS0wLnlhbWwg QVJDSD14ODZfNjQgQk9PVF9JTUFHRT0va2VybmVsL3g4Nl82NC1yaGVsLzdkMzNmZTlhYjll YWNlMjQwM2FkZWZlYTNjNmRjMmM5MmEwYTUxODUvdm1saW51ei0zLjE4LjAtcmMyLWc3ZDMz ZmU5IGtjb25maWc9eDg2XzY0LXJoZWwgY29tbWl0PTdkMzNmZTlhYjllYWNlMjQwM2FkZWZl YTNjNmRjMmM5MmEwYTUxODUgYnJhbmNoPWxpbnV4LWRldmVsL2RldmVsLWhvdXJseS0yMDE0 MTAyNzIzIHJvb3Q9L2Rldi9yYW0wIG1heF91cHRpbWU9NzM0IFJFU1VMVF9ST09UPS9yZXN1 bHQvbGtwLW5lMDQvZnNtYXJrL3BlcmZvcm1hbmNlLTF4LTMydC0xSERELXhmcy01Sy00MDBN LWZzeW5jQmVmb3JlQ2xvc2UtMTZkLTI1NmZwZC9kZWJpYW4teDg2XzY0LmNnei94ODZfNjQt cmhlbC83ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZkYzJjOTJhMGE1MTg1LzAgaXA9Ojo6 OmxrcC1uZTA0OjpkaGNwIGVhcmx5cHJpbnRrPXR0eVMwLDExNTIwMCBkZWJ1ZyBhcGljPWRl YnVnIHN5c3JxX2Fsd2F5c19lbmFibGVkIHJjdXBkYXRlLnJjdV9jcHVfc3RhbGxfdGltZW91 dD0xMDAgcGFuaWM9LTEgc29mdGxvY2t1cF9wYW5pYz0xIG5taV93YXRjaGRvZz1wYW5pYyBv b3BzPXBhbmljIGxvYWRfcmFtZGlzaz0yIHByb21wdF9yYW1kaXNrPTAgY29uc29sZT10dHlT MCwxMTUyMDAgY29uc29sZT10dHkwIHZnYT1ub3JtYWwgcncKWyAgICAwLjAwMDAwMF0gc3lz cnE6IHN5c3JxIGFsd2F5cyBlbmFibGVkLgpbICAgIDAuMDAwMDAwXSBQSUQgaGFzaCB0YWJs ZSBlbnRyaWVzOiA0MDk2IChvcmRlcjogMywgMzI3NjggYnl0ZXMpClsgICAgMC4wMDAwMDBd IEFHUDogQ2hlY2tpbmcgYXBlcnR1cmUuLi4KWyAgICAwLjAwMDAwMF0gQUdQOiBObyBBR1Ag YnJpZGdlIGZvdW5kClsgICAgMC4wMDAwMDBdIE1lbW9yeTogMTIxMDk4NzZLLzEyNTIyNDI4 SyBhdmFpbGFibGUgKDg3MThLIGtlcm5lbCBjb2RlLCAxNjc4SyByd2RhdGEsIDM4NDRLIHJv ZGF0YSwgMTgyNEsgaW5pdCwgMTg4OEsgYnNzLCA0MTI1NTJLIHJlc2VydmVkKQpbICAgIDAu MDAwMDAwXSBTTFVCOiBIV2FsaWduPTY0LCBPcmRlcj0wLTMsIE1pbk9iamVjdHM9MCwgQ1BV cz0yNCwgTm9kZXM9MgpbICAgIDAuMDAwMDAwXSBIaWVyYXJjaGljYWwgUkNVIGltcGxlbWVu dGF0aW9uLgpbICAgIDAuMDAwMDAwXSAJUkNVIHJlc3RyaWN0aW5nIENQVXMgZnJvbSBOUl9D UFVTPTgxOTIgdG8gbnJfY3B1X2lkcz0yNC4KWyAgICAwLjAwMDAwMF0gUkNVOiBBZGp1c3Rp bmcgZ2VvbWV0cnkgZm9yIHJjdV9mYW5vdXRfbGVhZj0xNiwgbnJfY3B1X2lkcz0yNApbICAg IDAuMDAwMDAwXSBOUl9JUlFTOjUyNDU0NCBucl9pcnFzOjEwMjQgMApbICAgIDAuMDAwMDAw XSAJT2ZmbG9hZCBSQ1UgY2FsbGJhY2tzIGZyb20gYWxsIENQVXMKWyAgICAwLjAwMDAwMF0g CU9mZmxvYWQgUkNVIGNhbGxiYWNrcyBmcm9tIENQVXM6IDAtMjMuClsgICAgMC4wMDAwMDBd IFNwdXJpb3VzIExBUElDIHRpbWVyIGludGVycnVwdCBvbiBjcHUgMApbICAgIDAuMDAwMDAw XSBDb25zb2xlOiBjb2xvdXIgZHVtbXkgZGV2aWNlIDgweDI1ClsgICAgMC4wMDAwMDBdIGNv bnNvbGUgW3R0eTBdIGVuYWJsZWQKWyAgICAwLjAwMDAwMF0gYm9vdGNvbnNvbGUgW2Vhcmx5 c2VyMF0gZGlzYWJsZWQKWyAgICAwLjAwMDAwMF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJz eXMgY3B1c2V0ClsgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNw dQpbICAgIDAuMDAwMDAwXSBMaW51eCB2ZXJzaW9uIDMuMTguMC1yYzItZzdkMzNmZTkgKGti dWlsZEB4aWFuKSAoZ2NjIHZlcnNpb24gNC45LjEgKERlYmlhbiA0LjkuMS0xMSkgKSAjMSBT TVAgTW9uIE9jdCAyNyAyMzoyMDoxOCBDU1QgMjAxNApbICAgIDAuMDAwMDAwXSBDb21tYW5k IGxpbmU6IHVzZXI9bGtwIGpvYj0vbGtwL3NjaGVkdWxlZC9sa3AtbmUwNC9jeWNsaWNfZnNt YXJrLXBlcmZvcm1hbmNlLTF4LTMydC0xSERELXhmcy01Sy00MDBNLWZzeW5jQmVmb3JlQ2xv c2UtMTZkLTI1NmZwZC14ODZfNjQtcmhlbC1IRUFELTdkMzNmZTlhYjllYWNlMjQwM2FkZWZl YTNjNmRjMmM5MmEwYTUxODUtMC55YW1sIEFSQ0g9eDg2XzY0IEJPT1RfSU1BR0U9L2tlcm5l bC94ODZfNjQtcmhlbC83ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZkYzJjOTJhMGE1MTg1 L3ZtbGludXotMy4xOC4wLXJjMi1nN2QzM2ZlOSBrY29uZmlnPXg4Nl82NC1yaGVsIGNvbW1p dD03ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZkYzJjOTJhMGE1MTg1IGJyYW5jaD1saW51 eC1kZXZlbC9kZXZlbC1ob3VybHktMjAxNDEwMjcyMyByb290PS9kZXYvcmFtMCBtYXhfdXB0 aW1lPTczNCBSRVNVTFRfUk9PVD0vcmVzdWx0L2xrcC1uZTA0L2ZzbWFyay9wZXJmb3JtYW5j ZS0xeC0zMnQtMUhERC14ZnMtNUstNDAwTS1mc3luY0JlZm9yZUNsb3NlLTE2ZC0yNTZmcGQv ZGViaWFuLXg4Nl82NC5jZ3oveDg2XzY0LXJoZWwvN2QzM2ZlOWFiOWVhY2UyNDAzYWRlZmVh M2M2ZGMyYzkyYTBhNTE4NS8wIGlwPTo6Ojpsa3AtbmUwNDo6ZGhjcCBlYXJseXByaW50az10 dHlTMCwxMTUyMDAgZGVidWcgYXBpYz1kZWJ1ZyBzeXNycV9hbHdheXNfZW5hYmxlZCByY3Vw ZGF0ZS5yY3VfY3B1X3N0YWxsX3RpbWVvdXQ9MTAwIHBhbmljPS0xIHNvZnRsb2NrdXBfcGFu aWM9MSBubWlfd2F0Y2hkb2c9cGFuaWMgb29wcz1wYW5pYyBsb2FkX3JhbWRpc2s9MiBwcm9t cHRfcmFtZGlzaz0wIGNvbnNvbGU9dHR5UzAsMTE1MjAwIGNvbnNvbGU9dHR5MCB2Z2E9bm9y bWFsIHJ3ClsgICAgMC4wMDAwMDBdIGU4MjA6IEJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFN IG1hcDoKWyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDAwMDEw MC0weDAwMDAwMDAwMDAwOWEzZmZdIHVzYWJsZQpbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6 IFttZW0gMHgwMDAwMDAwMDAwMDlhNDAwLTB4MDAwMDAwMDAwMDA5ZmZmZl0gcmVzZXJ2ZWQK WyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDAwMDBlMDAwMC0weDAw MDAwMDAwMDAwZmZmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21l bSAweDAwMDAwMDAwMDAxMDAwMDAtMHgwMDAwMDAwMDhjNTU1ZmZmXSB1c2FibGUKWyAgICAw LjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4YzU1NjAwMC0weDAwMDAwMDAw OGM2MjhmZmZdIEFDUEkgTlZTClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAw MDAwMDAwOGM2MjkwMDAtMHgwMDAwMDAwMDhjNzAxZmZmXSBBQ1BJIGRhdGEKWyAgICAwLjAw MDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4YzcwMjAwMC0weDAwMDAwMDAwOGRi MDFmZmZdIEFDUEkgTlZTClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAw MDAwOGRiMDIwMDAtMHgwMDAwMDAwMDhmNjAxZmZmXSBBQ1BJIGRhdGEKWyAgICAwLjAwMDAw MF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4ZjYwMjAwMC0weDAwMDAwMDAwOGY2NGVm ZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAw OGY2NGYwMDAtMHgwMDAwMDAwMDhmNmU1ZmZmXSBBQ1BJIGRhdGEKWyAgICAwLjAwMDAwMF0g QklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4ZjZlNjAwMC0weDAwMDAwMDAwOGY2ZWZmZmZd IEFDUEkgTlZTClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwOGY2 ZjAwMDAtMHgwMDAwMDAwMDhmNmYxZmZmXSBBQ1BJIGRhdGEKWyAgICAwLjAwMDAwMF0gQklP Uy1lODIwOiBbbWVtIDB4MDAwMDAwMDA4ZjZmMjAwMC0weDAwMDAwMDAwOGY3Y2VmZmZdIEFD UEkgTlZTClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwOGY3Y2Yw MDAtMHgwMDAwMDAwMDhmN2ZmZmZmXSBBQ1BJIGRhdGEKWyAgICAwLjAwMDAwMF0gQklPUy1l ODIwOiBbbWVtIDB4MDAwMDAwMDA4ZjgwMDAwMC0weDAwMDAwMDAwOGZmZmZmZmZdIHJlc2Vy dmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwYTAwMDAwMDAt MHgwMDAwMDAwMGFmZmZmZmZmXSByZXNlcnZlZApbICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6 IFttZW0gMHgwMDAwMDAwMGZjMDAwMDAwLTB4MDAwMDAwMDBmY2ZmZmZmZl0gcmVzZXJ2ZWQK WyAgICAwLjAwMDAwMF0gQklPUy1lODIwOiBbbWVtIDB4MDAwMDAwMDBmZWQxYzAwMC0weDAw MDAwMDAwZmVkMWZmZmZdIHJlc2VydmVkClsgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21l bSAweDAwMDAwMDAwZmY4MDAwMDAtMHgwMDAwMDAwMGZmZmZmZmZmXSByZXNlcnZlZApbICAg IDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMTAwMDAwMDAwLTB4MDAwMDAw MDM2ZmZmZmZmZl0gdXNhYmxlClsgICAgMC4wMDAwMDBdIGJvb3Rjb25zb2xlIFtlYXJseXNl cjBdIGVuYWJsZWQKWyAgICAwLjAwMDAwMF0gTlggKEV4ZWN1dGUgRGlzYWJsZSkgcHJvdGVj dGlvbjogYWN0aXZlClsgICAgMC4wMDAwMDBdIFNNQklPUyAyLjUgcHJlc2VudC4KWyAgICAw LjAwMDAwMF0gRE1JOiBJbnRlbCBDb3Jwb3JhdGlvbiBTNTUyMFVSL1M1NTIwVVIsIEJJT1Mg UzU1MDAuODZCLjAxLjAwLjAwNTAuMDUwNjIwMTAxNjA1IDA1LzA2LzIwMTAKWyAgICAwLjAw MDAwMF0gZTgyMDogdXBkYXRlIFttZW0gMHgwMDAwMDAwMC0weDAwMDAwZmZmXSB1c2FibGUg PT0+IHJlc2VydmVkClsgICAgMC4wMDAwMDBdIGU4MjA6IHJlbW92ZSBbbWVtIDB4MDAwYTAw MDAtMHgwMDBmZmZmZl0gdXNhYmxlClsgICAgMC4wMDAwMDBdIEFHUDogTm8gQUdQIGJyaWRn ZSBmb3VuZApbICAgIDAuMDAwMDAwXSBlODIwOiBsYXN0X3BmbiA9IDB4MzcwMDAwIG1heF9h cmNoX3BmbiA9IDB4NDAwMDAwMDAwClsgICAgMC4wMDAwMDBdIE1UUlIgZGVmYXVsdCB0eXBl OiB1bmNhY2hhYmxlClsgICAgMC4wMDAwMDBdIE1UUlIgZml4ZWQgcmFuZ2VzIGVuYWJsZWQ6 ClsgICAgMC4wMDAwMDBdICAgMDAwMDAtOUZGRkYgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAw XSAgIEEwMDAwLURGRkZGIHVuY2FjaGFibGUKWyAgICAwLjAwMDAwMF0gICBFMDAwMC1GRkZG RiB3cml0ZS1wcm90ZWN0ClsgICAgMC4wMDAwMDBdIE1UUlIgdmFyaWFibGUgcmFuZ2VzIGVu YWJsZWQ6ClsgICAgMC4wMDAwMDBdICAgMCBiYXNlIDAwMDAwMDAwMDAgbWFzayBGRjgwMDAw MDAwIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICAxIGJhc2UgMDA4MDAwMDAwMCBtYXNr IEZGRjAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAuMDAwMDAwXSAgIDIgYmFzZSAwMTAwMDAw MDAwIG1hc2sgRkYwMDAwMDAwMCB3cml0ZS1iYWNrClsgICAgMC4wMDAwMDBdICAgMyBiYXNl IDAyMDAwMDAwMDAgbWFzayBGRjAwMDAwMDAwIHdyaXRlLWJhY2sKWyAgICAwLjAwMDAwMF0g ICA0IGJhc2UgMDMwMDAwMDAwMCBtYXNrIEZGQzAwMDAwMDAgd3JpdGUtYmFjawpbICAgIDAu MDAwMDAwXSAgIDUgYmFzZSAwMzQwMDAwMDAwIG1hc2sgRkZFMDAwMDAwMCB3cml0ZS1iYWNr ClsgICAgMC4wMDAwMDBdICAgNiBiYXNlIDAzNjAwMDAwMDAgbWFzayBGRkYwMDAwMDAwIHdy aXRlLWJhY2sKWyAgICAwLjAwMDAwMF0gICA3IGJhc2UgMDBCMDAwMDAwMCBtYXNrIEZGRkYw MDAwMDAgd3JpdGUtY29tYmluaW5nClsgICAgMC4wMDAwMDBdIHg4NiBQQVQgZW5hYmxlZDog Y3B1IDAsIG9sZCAweDcwMTA2MDAwNzAxMDYsIG5ldyAweDcwMTA2MDAwNzAxMDYKWyAgICAw LjAwMDAwMF0gZTgyMDogbGFzdF9wZm4gPSAweDhjNTU2IG1heF9hcmNoX3BmbiA9IDB4NDAw MDAwMDAwClsgICAgMC4wMDAwMDBdIFNjYW4gZm9yIFNNUCBpbiBbbWVtIDB4MDAwMDAwMDAt MHgwMDAwMDNmZl0KWyAgICAwLjAwMDAwMF0gU2NhbiBmb3IgU01QIGluIFttZW0gMHgwMDA5 ZmMwMC0weDAwMDlmZmZmXQpbICAgIDAuMDAwMDAwXSBTY2FuIGZvciBTTVAgaW4gW21lbSAw eDAwMGYwMDAwLTB4MDAwZmZmZmZdClsgICAgMC4wMDAwMDBdIGZvdW5kIFNNUCBNUC10YWJs ZSBhdCBbbWVtIDB4MDAwZmRhYjAtMHgwMDBmZGFiZl0gbWFwcGVkIGF0IFtmZmZmODgwMDAw MGZkYWIwXQpbICAgIDAuMDAwMDAwXSAgIG1wYzogZWYyNjAtZWY0MjQKWyAgICAwLjAwMDAw MF0gQmFzZSBtZW1vcnkgdHJhbXBvbGluZSBhdCBbZmZmZjg4MDAwMDA5NDAwMF0gOTQwMDAg c2l6ZSAyNDU3NgpbICAgIDAuMDAwMDAwXSBpbml0X21lbW9yeV9tYXBwaW5nOiBbbWVtIDB4 MDAwMDAwMDAtMHgwMDBmZmZmZl0KWyAgICAwLjAwMDAwMF0gIFttZW0gMHgwMDAwMDAwMC0w eDAwMGZmZmZmXSBwYWdlIDRrClsgICAgMC4wMDAwMDBdIEJSSyBbMHgzNmYxOTgwMDAsIDB4 MzZmMTk4ZmZmXSBQR1RBQkxFClsgICAgMC4wMDAwMDBdIEJSSyBbMHgzNmYxOTkwMDAsIDB4 MzZmMTk5ZmZmXSBQR1RBQkxFClsgICAgMC4wMDAwMDBdIEJSSyBbMHgzNmYxOWEwMDAsIDB4 MzZmMTlhZmZmXSBQR1RBQkxFClsgICAgMC4wMDAwMDBdIGluaXRfbWVtb3J5X21hcHBpbmc6 IFttZW0gMHgzNmZlMDAwMDAtMHgzNmZmZmZmZmZdClsgICAgMC4wMDAwMDBdICBbbWVtIDB4 MzZmZTAwMDAwLTB4MzZmZmZmZmZmXSBwYWdlIDJNClsgICAgMC4wMDAwMDBdIEJSSyBbMHgz NmYxOWIwMDAsIDB4MzZmMTliZmZmXSBQR1RBQkxFClsgICAgMC4wMDAwMDBdIGluaXRfbWVt b3J5X21hcHBpbmc6IFttZW0gMHgzNmMwMDAwMDAtMHgzNmZkZmZmZmZdClsgICAgMC4wMDAw MDBdICBbbWVtIDB4MzZjMDAwMDAwLTB4MzZmZGZmZmZmXSBwYWdlIDJNClsgICAgMC4wMDAw MDBdIGluaXRfbWVtb3J5X21hcHBpbmc6IFttZW0gMHgzMDAwMDAwMDAtMHgzNmJmZmZmZmZd ClsgICAgMC4wMDAwMDBdICBbbWVtIDB4MzAwMDAwMDAwLTB4MzZiZmZmZmZmXSBwYWdlIDJN ClsgICAgMC4wMDAwMDBdIEJSSyBbMHgzNmYxOWMwMDAsIDB4MzZmMTljZmZmXSBQR1RBQkxF ClsgICAgMC4wMDAwMDBdIGluaXRfbWVtb3J5X21hcHBpbmc6IFttZW0gMHgwMDEwMDAwMC0w eDhjNTU1ZmZmXQpbICAgIDAuMDAwMDAwXSAgW21lbSAweDAwMTAwMDAwLTB4MDAxZmZmZmZd IHBhZ2UgNGsKWyAgICAwLjAwMDAwMF0gIFttZW0gMHgwMDIwMDAwMC0weDhjM2ZmZmZmXSBw YWdlIDJNClsgICAgMC4wMDAwMDBdICBbbWVtIDB4OGM0MDAwMDAtMHg4YzU1NWZmZl0gcGFn ZSA0awpbICAgIDAuMDAwMDAwXSBCUksgWzB4MzZmMTlkMDAwLCAweDM2ZjE5ZGZmZl0gUEdU QUJMRQpbICAgIDAuMDAwMDAwXSBpbml0X21lbW9yeV9tYXBwaW5nOiBbbWVtIDB4MTAwMDAw MDAwLTB4MmZmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSAgW21lbSAweDEwMDAwMDAwMC0weDJm ZmZmZmZmZl0gcGFnZSAyTQpbICAgIDAuMDAwMDAwXSBSQU1ESVNLOiBbbWVtIDB4MzY2MmU5 MDAwLTB4MzZkZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBFYXJseSB0YWJsZSBjaGVj a3N1bSB2ZXJpZmljYXRpb24gZGlzYWJsZWQKWyAgICAwLjAwMDAwMF0gQUNQSTogUlNEUCAw eDAwMDAwMDAwMDAwRjA0MTAgMDAwMDI0ICh2MDIgSU5URUwgKQpbICAgIDAuMDAwMDAwXSBB Q1BJOiBYU0RUIDB4MDAwMDAwMDA4RjdGRDEyMCAwMDAwOTQgKHYwMSBJTlRFTCAgUzU1MjBV UiAgMDAwMDAwMDAgICAgICAwMTAwMDAxMykKWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUCAw eDAwMDAwMDAwOEY3RkIwMDAgMDAwMEY0ICh2MDQgSU5URUwgIFM1NTIwVVIgIDAwMDAwMDAw IE1TRlQgMDEwMDAwMEQpClsgICAgMC4wMDAwMDBdIEFDUEk6IERTRFQgMHgwMDAwMDAwMDhG N0Y0MDAwIDAwNjU3RSAodjAyIElOVEVMICBTNTUyMFVSICAwMDAwMDAwMyBNU0ZUIDAxMDAw MDBEKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBGQUNTIDB4MDAwMDAwMDA4RjZGMjAwMCAwMDAw NDAKWyAgICAwLjAwMDAwMF0gQUNQSTogQVBJQyAweDAwMDAwMDAwOEY3RjMwMDAgMDAwMUE4 ICh2MDIgSU5URUwgIFM1NTIwVVIgIDAwMDAwMDAwIE1TRlQgMDEwMDAwMEQpClsgICAgMC4w MDAwMDBdIEFDUEk6IE1DRkcgMHgwMDAwMDAwMDhGN0YyMDAwIDAwMDAzQyAodjAxIElOVEVM ICBTNTUyMFVSICAwMDAwMDAwMSBNU0ZUIDAxMDAwMDBEKQpbICAgIDAuMDAwMDAwXSBBQ1BJ OiBIUEVUIDB4MDAwMDAwMDA4RjdGMTAwMCAwMDAwMzggKHYwMSBJTlRFTCAgUzU1MjBVUiAg MDAwMDAwMDEgTVNGVCAwMTAwMDAwRCkKWyAgICAwLjAwMDAwMF0gQUNQSTogU0xJVCAweDAw MDAwMDAwOEY3RjAwMDAgMDAwMDMwICh2MDEgSU5URUwgIFM1NTIwVVIgIDAwMDAwMDAxIE1T RlQgMDEwMDAwMEQpClsgICAgMC4wMDAwMDBdIEFDUEk6IFNSQVQgMHgwMDAwMDAwMDhGN0VG MDAwIDAwMDQzMCAodjAyIElOVEVMICBTNTUyMFVSICAwMDAwMDAwMSBNU0ZUIDAxMDAwMDBE KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBTUENSIDB4MDAwMDAwMDA4RjdFRTAwMCAwMDAwNTAg KHYwMSBJTlRFTCAgUzU1MjBVUiAgMDAwMDAwMDAgTVNGVCAwMTAwMDAwRCkKWyAgICAwLjAw MDAwMF0gQUNQSTogV0REVCAweDAwMDAwMDAwOEY3RUQwMDAgMDAwMDQwICh2MDEgSU5URUwg IFM1NTIwVVIgIDAwMDAwMDAwIE1TRlQgMDEwMDAwMEQpClsgICAgMC4wMDAwMDBdIEFDUEk6 IFNTRFQgMHgwMDAwMDAwMDhGN0QyMDAwIDAxQUZDNCAodjAyIElOVEVMICBTU0RUICBQTSAw MDAwNDAwMCBJTlRMIDIwMDYxMTA5KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBTU0RUIDB4MDAw MDAwMDA4RjdEMTAwMCAwMDAxRDggKHYwMiBJTlRFTCAgSVBNSSAgICAgMDAwMDQwMDAgSU5U TCAyMDA2MTEwOSkKWyAgICAwLjAwMDAwMF0gQUNQSTogSEVTVCAweDAwMDAwMDAwOEY3RDAw MDAgMDAwMEE4ICh2MDEgSU5URUwgIFM1NTIwVVIgIDAwMDAwMDAxIElOVEwgMDAwMDAwMDEp ClsgICAgMC4wMDAwMDBdIEFDUEk6IEJFUlQgMHgwMDAwMDAwMDhGN0NGMDAwIDAwMDAzMCAo djAxIElOVEVMICBTNTUyMFVSICAwMDAwMDAwMSBJTlRMIDAwMDAwMDAxKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBFUlNUIDB4MDAwMDAwMDA4RjZGMTAwMCAwMDAyMzAgKHYwMSBJTlRFTCAg UzU1MjBVUiAgMDAwMDAwMDEgSU5UTCAwMDAwMDAwMSkKWyAgICAwLjAwMDAwMF0gQUNQSTog RUlOSiAweDAwMDAwMDAwOEY2RjAwMDAgMDAwMTMwICh2MDEgSU5URUwgIFM1NTIwVVIgIDAw MDAwMDAxIElOVEwgMDAwMDAwMDEpClsgICAgMC4wMDAwMDBdIEFDUEk6IExvY2FsIEFQSUMg YWRkcmVzcyAweGZlZTAwMDAwClsgICAgMC4wMDAwMDBdIG1hcHBlZCBBUElDIHRvIGZmZmZm ZmZmZmY1N2MwMDAgKCAgICAgICAgZmVlMDAwMDApClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBY TSAwIC0+IEFQSUMgMHgwMCAtPiBOb2RlIDAKWyAgICAwLjAwMDAwMF0gU1JBVDogUFhNIDEg LT4gQVBJQyAweDEwIC0+IE5vZGUgMQpbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMCAtPiBB UElDIDB4MDIgLT4gTm9kZSAwClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAxIC0+IEFQSUMg MHgxMiAtPiBOb2RlIDEKWyAgICAwLjAwMDAwMF0gU1JBVDogUFhNIDAgLT4gQVBJQyAweDA0 IC0+IE5vZGUgMApbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMSAtPiBBUElDIDB4MTQgLT4g Tm9kZSAxClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAwIC0+IEFQSUMgMHgwNiAtPiBOb2Rl IDAKWyAgICAwLjAwMDAwMF0gU1JBVDogUFhNIDEgLT4gQVBJQyAweDE2IC0+IE5vZGUgMQpb ICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0gMCAtPiBBUElDIDB4MDEgLT4gTm9kZSAwClsgICAg MC4wMDAwMDBdIFNSQVQ6IFBYTSAxIC0+IEFQSUMgMHgxMSAtPiBOb2RlIDEKWyAgICAwLjAw MDAwMF0gU1JBVDogUFhNIDAgLT4gQVBJQyAweDAzIC0+IE5vZGUgMApbICAgIDAuMDAwMDAw XSBTUkFUOiBQWE0gMSAtPiBBUElDIDB4MTMgLT4gTm9kZSAxClsgICAgMC4wMDAwMDBdIFNS QVQ6IFBYTSAwIC0+IEFQSUMgMHgwNSAtPiBOb2RlIDAKWyAgICAwLjAwMDAwMF0gU1JBVDog UFhNIDEgLT4gQVBJQyAweDE1IC0+IE5vZGUgMQpbICAgIDAuMDAwMDAwXSBTUkFUOiBQWE0g MCAtPiBBUElDIDB4MDcgLT4gTm9kZSAwClsgICAgMC4wMDAwMDBdIFNSQVQ6IFBYTSAxIC0+ IEFQSUMgMHgxNyAtPiBOb2RlIDEKWyAgICAwLjAwMDAwMF0gU1JBVDogTm9kZSAwIFBYTSAw IFttZW0gMHgwMDAwMDAwMC0weDhmZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBTUkFUOiBOb2Rl IDAgUFhNIDAgW21lbSAweDEwMDAwMDAwMC0weDFlZmZmZmZmZl0KWyAgICAwLjAwMDAwMF0g U1JBVDogTm9kZSAxIFBYTSAxIFttZW0gMHgxZjAwMDAwMDAtMHgzNmZmZmZmZmZdClsgICAg MC4wMDAwMDBdIE5VTUE6IEluaXRpYWxpemVkIGRpc3RhbmNlIHRhYmxlLCBjbnQ9MgpbICAg IDAuMDAwMDAwXSBOVU1BOiBOb2RlIDAgW21lbSAweDAwMDAwMDAwLTB4OGZmZmZmZmZdICsg W21lbSAweDEwMDAwMDAwMC0weDFlZmZmZmZmZl0gLT4gW21lbSAweDAwMDAwMDAwLTB4MWVm ZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBOT0RFX0RBVEEoMCkgYWxsb2NhdGVkIFttZW0gMHgx ZWZmZGEwMDAtMHgxZWZmZmZmZmZdClsgICAgMC4wMDAwMDBdIE5PREVfREFUQSgxKSBhbGxv Y2F0ZWQgW21lbSAweDM2ZmZjZjAwMC0weDM2ZmZmNGZmZl0KWyAgICAwLjAwMDAwMF0gIFtm ZmZmZWEwMDAwMDAwMDAwLWZmZmZlYTAwMDdiZmZmZmZdIFBNRCAtPiBbZmZmZjg4MDFlOWUw MDAwMC1mZmZmODgwMWVmZGZmZmZmXSBvbiBub2RlIDAKWyAgICAwLjAwMDAwMF0gIFtmZmZm ZWEwMDA3YzAwMDAwLWZmZmZlYTAwMGRiZmZmZmZdIFBNRCAtPiBbZmZmZjg4MDM2MDIwMDAw MC1mZmZmODgwMzY2MWZmZmZmXSBvbiBub2RlIDEKWyAgICAwLjAwMDAwMF0gWm9uZSByYW5n ZXM6ClsgICAgMC4wMDAwMDBdICAgRE1BICAgICAgW21lbSAweDAwMDAxMDAwLTB4MDBmZmZm ZmZdClsgICAgMC4wMDAwMDBdICAgRE1BMzIgICAgW21lbSAweDAxMDAwMDAwLTB4ZmZmZmZm ZmZdClsgICAgMC4wMDAwMDBdICAgTm9ybWFsICAgW21lbSAweDEwMDAwMDAwMC0weDM2ZmZm ZmZmZl0KWyAgICAwLjAwMDAwMF0gTW92YWJsZSB6b25lIHN0YXJ0IGZvciBlYWNoIG5vZGUK WyAgICAwLjAwMDAwMF0gRWFybHkgbWVtb3J5IG5vZGUgcmFuZ2VzClsgICAgMC4wMDAwMDBd ICAgbm9kZSAgIDA6IFttZW0gMHgwMDAwMTAwMC0weDAwMDk5ZmZmXQpbICAgIDAuMDAwMDAw XSAgIG5vZGUgICAwOiBbbWVtIDB4MDAxMDAwMDAtMHg4YzU1NWZmZl0KWyAgICAwLjAwMDAw MF0gICBub2RlICAgMDogW21lbSAweDEwMDAwMDAwMC0weDFlZmZmZmZmZl0KWyAgICAwLjAw MDAwMF0gICBub2RlICAgMTogW21lbSAweDFmMDAwMDAwMC0weDM2ZmZmZmZmZl0KWyAgICAw LjAwMDAwMF0gSW5pdG1lbSBzZXR1cCBub2RlIDAgW21lbSAweDAwMDAxMDAwLTB4MWVmZmZm ZmZmXQpbICAgIDAuMDAwMDAwXSBPbiBub2RlIDAgdG90YWxwYWdlczogMTU1Nzc0MwpbICAg IDAuMDAwMDAwXSAgIERNQSB6b25lOiA2NCBwYWdlcyB1c2VkIGZvciBtZW1tYXAKWyAgICAw LjAwMDAwMF0gICBETUEgem9uZTogMjEgcGFnZXMgcmVzZXJ2ZWQKWyAgICAwLjAwMDAwMF0g ICBETUEgem9uZTogMzk5MyBwYWdlcywgTElGTyBiYXRjaDowClsgICAgMC4wMDAwMDBdICAg RE1BMzIgem9uZTogODkxOCBwYWdlcyB1c2VkIGZvciBtZW1tYXAKWyAgICAwLjAwMDAwMF0g ICBETUEzMiB6b25lOiA1NzA3MTAgcGFnZXMsIExJRk8gYmF0Y2g6MzEKWyAgICAwLjAwMDAw MF0gICBOb3JtYWwgem9uZTogMTUzNjAgcGFnZXMgdXNlZCBmb3IgbWVtbWFwClsgICAgMC4w MDAwMDBdICAgTm9ybWFsIHpvbmU6IDk4MzA0MCBwYWdlcywgTElGTyBiYXRjaDozMQpbICAg IDAuMDAwMDAwXSBJbml0bWVtIHNldHVwIG5vZGUgMSBbbWVtIDB4MWYwMDAwMDAwLTB4MzZm ZmZmZmZmXQpbICAgIDAuMDAwMDAwXSBPbiBub2RlIDEgdG90YWxwYWdlczogMTU3Mjg2NApb ICAgIDAuMDAwMDAwXSAgIE5vcm1hbCB6b25lOiAyNDU3NiBwYWdlcyB1c2VkIGZvciBtZW1t YXAKWyAgICAwLjAwMDAwMF0gICBOb3JtYWwgem9uZTogMTU3Mjg2NCBwYWdlcywgTElGTyBi YXRjaDozMQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBQTS1UaW1lciBJTyBQb3J0OiAweDQwOApb ICAgIDAuMDAwMDAwXSBBQ1BJOiBMb2NhbCBBUElDIGFkZHJlc3MgMHhmZWUwMDAwMApbICAg IDAuMDAwMDAwXSBtYXBwZWQgQVBJQyB0byBmZmZmZmZmZmZmNTdjMDAwICggICAgICAgIGZl ZTAwMDAwKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDAwXSBsYXBp Y19pZFsweDAwXSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9p ZFsweDAxXSBsYXBpY19pZFsweDEwXSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBM QVBJQyAoYWNwaV9pZFsweDAyXSBsYXBpY19pZFsweDAyXSBlbmFibGVkKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDAzXSBsYXBpY19pZFsweDEyXSBlbmFibGVk KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA0XSBsYXBpY19pZFsw eDA0XSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA1 XSBsYXBpY19pZFsweDE0XSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAo YWNwaV9pZFsweDA2XSBsYXBpY19pZFsweDA2XSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBB Q1BJOiBMQVBJQyAoYWNwaV9pZFsweDA3XSBsYXBpY19pZFsweDE2XSBlbmFibGVkKQpbICAg IDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA4XSBsYXBpY19pZFsweDAxXSBl bmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA5XSBsYXBp Y19pZFsweDExXSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9p ZFsweDBhXSBsYXBpY19pZFsweDAzXSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBM QVBJQyAoYWNwaV9pZFsweDBiXSBsYXBpY19pZFsweDEzXSBlbmFibGVkKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDBjXSBsYXBpY19pZFsweDA1XSBlbmFibGVk KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDBkXSBsYXBpY19pZFsw eDE1XSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDBl XSBsYXBpY19pZFsweDA3XSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAo YWNwaV9pZFsweDBmXSBsYXBpY19pZFsweDE3XSBlbmFibGVkKQpbICAgIDAuMDAwMDAwXSBB Q1BJOiBMQVBJQyAoYWNwaV9pZFsweDEwXSBsYXBpY19pZFsweGZmXSBkaXNhYmxlZCkKWyAg ICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgxMV0gbGFwaWNfaWRbMHhmZl0g ZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MTJdIGxh cGljX2lkWzB4ZmZdIGRpc2FibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNw aV9pZFsweDEzXSBsYXBpY19pZFsweGZmXSBkaXNhYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQ STogTEFQSUMgKGFjcGlfaWRbMHgxNF0gbGFwaWNfaWRbMHhmZl0gZGlzYWJsZWQpClsgICAg MC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MTVdIGxhcGljX2lkWzB4ZmZdIGRp c2FibGVkKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDE2XSBsYXBp Y19pZFsweGZmXSBkaXNhYmxlZCkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlf aWRbMHgxN10gbGFwaWNfaWRbMHhmZl0gZGlzYWJsZWQpClsgICAgMC4wMDAwMDBdIEFDUEk6 IExBUElDX05NSSAoYWNwaV9pZFsweDAwXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAw LjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MDFdIGhpZ2ggbGV2ZWwgbGlu dFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwMl0g aGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAo YWNwaV9pZFsweDAzXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQ STogTEFQSUNfTk1JIChhY3BpX2lkWzB4MDRdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAg IDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwNV0gaGlnaCBsZXZlbCBs aW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDA2 XSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1J IChhY3BpX2lkWzB4MDddIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBB Q1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwOF0gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsg ICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDA5XSBoaWdoIGxldmVs IGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4 MGFdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19O TUkgKGFjcGlfaWRbMHgwYl0gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBd IEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDBjXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkK WyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MGRdIGhpZ2ggbGV2 ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRb MHgwZV0gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElD X05NSSAoYWNwaV9pZFsweDBmXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAw MF0gQUNQSTogTEFQSUNfTk1JIChhY3BpX2lkWzB4MTBdIGhpZ2ggbGV2ZWwgbGludFsweDFd KQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgxMV0gaGlnaCBs ZXZlbCBsaW50WzB4MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9p ZFsweDEyXSBoaWdoIGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQ SUNfTk1JIChhY3BpX2lkWzB4MTNdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAw MDAwXSBBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgxNF0gaGlnaCBsZXZlbCBsaW50WzB4 MV0pClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDX05NSSAoYWNwaV9pZFsweDE1XSBoaWdo IGxldmVsIGxpbnRbMHgxXSkKWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUNfTk1JIChhY3Bp X2lkWzB4MTZdIGhpZ2ggbGV2ZWwgbGludFsweDFdKQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBM QVBJQ19OTUkgKGFjcGlfaWRbMHgxN10gaGlnaCBsZXZlbCBsaW50WzB4MV0pClsgICAgMC4w MDAwMDBdIEFDUEk6IElPQVBJQyAoaWRbMHgwOF0gYWRkcmVzc1sweGZlYzAwMDAwXSBnc2lf YmFzZVswXSkKWyAgICAwLjAwMDAwMF0gSU9BUElDWzBdOiBhcGljX2lkIDgsIHZlcnNpb24g MzIsIGFkZHJlc3MgMHhmZWMwMDAwMCwgR1NJIDAtMjMKWyAgICAwLjAwMDAwMF0gQUNQSTog SU9BUElDIChpZFsweDA5XSBhZGRyZXNzWzB4ZmVjOTAwMDBdIGdzaV9iYXNlWzI0XSkKWyAg ICAwLjAwMDAwMF0gSU9BUElDWzFdOiBhcGljX2lkIDksIHZlcnNpb24gMzIsIGFkZHJlc3Mg MHhmZWM5MDAwMCwgR1NJIDI0LTQ3ClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZS IChidXMgMCBidXNfaXJxIDAgZ2xvYmFsX2lycSAyIGRmbCBkZmwpClsgICAgMC4wMDAwMDBd IEludDogdHlwZSAwLCBwb2wgMCwgdHJpZyAwLCBidXMgMDAsIElSUSAwMCwgQVBJQyBJRCA4 LCBBUElDIElOVCAwMgpbICAgIDAuMDAwMDAwXSBBQ1BJOiBJTlRfU1JDX09WUiAoYnVzIDAg YnVzX2lycSA5IGdsb2JhbF9pcnEgOSBoaWdoIGxldmVsKQpbICAgIDAuMDAwMDAwXSBJbnQ6 IHR5cGUgMCwgcG9sIDEsIHRyaWcgMywgYnVzIDAwLCBJUlEgMDksIEFQSUMgSUQgOCwgQVBJ QyBJTlQgMDkKWyAgICAwLjAwMDAwMF0gQUNQSTogSVJRMCB1c2VkIGJ5IG92ZXJyaWRlLgpb ICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEg MDEsIEFQSUMgSUQgOCwgQVBJQyBJTlQgMDEKWyAgICAwLjAwMDAwMF0gSW50OiB0eXBlIDAs IHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJRIDAzLCBBUElDIElEIDgsIEFQSUMgSU5UIDAz ClsgICAgMC4wMDAwMDBdIEludDogdHlwZSAwLCBwb2wgMCwgdHJpZyAwLCBidXMgMDAsIElS USAwNCwgQVBJQyBJRCA4LCBBUElDIElOVCAwNApbICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUg MCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEgMDUsIEFQSUMgSUQgOCwgQVBJQyBJTlQg MDUKWyAgICAwLjAwMDAwMF0gSW50OiB0eXBlIDAsIHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwg SVJRIDA2LCBBUElDIElEIDgsIEFQSUMgSU5UIDA2ClsgICAgMC4wMDAwMDBdIEludDogdHlw ZSAwLCBwb2wgMCwgdHJpZyAwLCBidXMgMDAsIElSUSAwNywgQVBJQyBJRCA4LCBBUElDIElO VCAwNwpbICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAw LCBJUlEgMDgsIEFQSUMgSUQgOCwgQVBJQyBJTlQgMDgKWyAgICAwLjAwMDAwMF0gQUNQSTog SVJROSB1c2VkIGJ5IG92ZXJyaWRlLgpbICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9s IDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEgMGEsIEFQSUMgSUQgOCwgQVBJQyBJTlQgMGEKWyAg ICAwLjAwMDAwMF0gSW50OiB0eXBlIDAsIHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJRIDBi LCBBUElDIElEIDgsIEFQSUMgSU5UIDBiClsgICAgMC4wMDAwMDBdIEludDogdHlwZSAwLCBw b2wgMCwgdHJpZyAwLCBidXMgMDAsIElSUSAwYywgQVBJQyBJRCA4LCBBUElDIElOVCAwYwpb ICAgIDAuMDAwMDAwXSBJbnQ6IHR5cGUgMCwgcG9sIDAsIHRyaWcgMCwgYnVzIDAwLCBJUlEg MGQsIEFQSUMgSUQgOCwgQVBJQyBJTlQgMGQKWyAgICAwLjAwMDAwMF0gSW50OiB0eXBlIDAs IHBvbCAwLCB0cmlnIDAsIGJ1cyAwMCwgSVJRIDBlLCBBUElDIElEIDgsIEFQSUMgSU5UIDBl ClsgICAgMC4wMDAwMDBdIEludDogdHlwZSAwLCBwb2wgMCwgdHJpZyAwLCBidXMgMDAsIElS USAwZiwgQVBJQyBJRCA4LCBBUElDIElOVCAwZgpbICAgIDAuMDAwMDAwXSBVc2luZyBBQ1BJ IChNQURUKSBmb3IgU01QIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KWyAgICAwLjAwMDAw MF0gQUNQSTogSFBFVCBpZDogMHg4MDg2YTQwMSBiYXNlOiAweGZlZDAwMDAwClsgICAgMC4w MDAwMDBdIHNtcGJvb3Q6IEFsbG93aW5nIDI0IENQVXMsIDggaG90cGx1ZyBDUFVzClsgICAg MC4wMDAwMDBdIG1hcHBlZCBJT0FQSUMgdG8gZmZmZmZmZmZmZjU3YjAwMCAoZmVjMDAwMDAp ClsgICAgMC4wMDAwMDBdIG1hcHBlZCBJT0FQSUMgdG8gZmZmZmZmZmZmZjU3YTAwMCAoZmVj OTAwMDApClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6IFtt ZW0gMHgwMDAwMDAwMC0weDAwMDAwZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0ZXJl ZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4MDAwOWEwMDAtMHgwMDA5YWZmZl0KWyAgICAwLjAw MDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDAwMDliMDAwLTB4 MDAwOWZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1vcnk6 IFttZW0gMHgwMDBhMDAwMC0weDAwMGRmZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVnaXN0 ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4MDAwZTAwMDAtMHgwMDBmZmZmZl0KWyAgICAw LjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDhjNTU2MDAw LTB4OGM2MjhmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBtZW1v cnk6IFttZW0gMHg4YzYyOTAwMC0weDhjNzAxZmZmXQpbICAgIDAuMDAwMDAwXSBQTTogUmVn aXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4OGM3MDIwMDAtMHg4ZGIwMWZmZl0KWyAg ICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDhkYjAy MDAwLTB4OGY2MDFmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2ZSBt ZW1vcnk6IFttZW0gMHg4ZjYwMjAwMC0weDhmNjRlZmZmXQpbICAgIDAuMDAwMDAwXSBQTTog UmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4OGY2NGYwMDAtMHg4ZjZlNWZmZl0K WyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAweDhm NmU2MDAwLTB4OGY2ZWZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5vc2F2 ZSBtZW1vcnk6IFttZW0gMHg4ZjZmMDAwMC0weDhmNmYxZmZmXQpbICAgIDAuMDAwMDAwXSBQ TTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4OGY2ZjIwMDAtMHg4ZjdjZWZm Zl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21lbSAw eDhmN2NmMDAwLTB4OGY3ZmZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVkIG5v c2F2ZSBtZW1vcnk6IFttZW0gMHg4ZjgwMDAwMC0weDhmZmZmZmZmXQpbICAgIDAuMDAwMDAw XSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4OTAwMDAwMDAtMHg5ZmZm ZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTogW21l bSAweGEwMDAwMDAwLTB4YWZmZmZmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3RlcmVk IG5vc2F2ZSBtZW1vcnk6IFttZW0gMHhiMDAwMDAwMC0weGZiZmZmZmZmXQpbICAgIDAuMDAw MDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4ZmMwMDAwMDAtMHhm Y2ZmZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9yeTog W21lbSAweGZkMDAwMDAwLTB4ZmVkMWJmZmZdClsgICAgMC4wMDAwMDBdIFBNOiBSZWdpc3Rl cmVkIG5vc2F2ZSBtZW1vcnk6IFttZW0gMHhmZWQxYzAwMC0weGZlZDFmZmZmXQpbICAgIDAu MDAwMDAwXSBQTTogUmVnaXN0ZXJlZCBub3NhdmUgbWVtb3J5OiBbbWVtIDB4ZmVkMjAwMDAt MHhmZjdmZmZmZl0KWyAgICAwLjAwMDAwMF0gUE06IFJlZ2lzdGVyZWQgbm9zYXZlIG1lbW9y eTogW21lbSAweGZmODAwMDAwLTB4ZmZmZmZmZmZdClsgICAgMC4wMDAwMDBdIGU4MjA6IFtt ZW0gMHhiMDAwMDAwMC0weGZiZmZmZmZmXSBhdmFpbGFibGUgZm9yIFBDSSBkZXZpY2VzClsg ICAgMC4wMDAwMDBdIEJvb3RpbmcgcGFyYXZpcnR1YWxpemVkIGtlcm5lbCBvbiBiYXJlIGhh cmR3YXJlClsgICAgMC4wMDAwMDBdIHNldHVwX3BlcmNwdTogTlJfQ1BVUzo4MTkyIG5yX2Nw dW1hc2tfYml0czoyNCBucl9jcHVfaWRzOjI0IG5yX25vZGVfaWRzOjIKWyAgICAwLjAwMDAw MF0gUEVSQ1BVOiBFbWJlZGRlZCAzMSBwYWdlcy9jcHUgQGZmZmY4ODAxZTljMDAwMDAgczg5 MTUyIHI4MTkyIGQyOTYzMiB1MTMxMDcyClsgICAgMC4wMDAwMDBdIHBjcHUtYWxsb2M6IHM4 OTE1MiByODE5MiBkMjk2MzIgdTEzMTA3MiBhbGxvYz0xKjIwOTcxNTIKWyAgICAwLjAwMDAw MF0gcGNwdS1hbGxvYzogWzBdIDAwIDAyIDA0IDA2IDA4IDEwIDEyIDE0IDE2IDE4IDIwIDIy IC0tIC0tIC0tIC0tIApbICAgIDAuMDAwMDAwXSBwY3B1LWFsbG9jOiBbMV0gMDEgMDMgMDUg MDcgMDkgMTEgMTMgMTUgMTcgMTkgMjEgMjMgLS0gLS0gLS0gLS0gClsgICAgMC4wMDAwMDBd IEJ1aWx0IDIgem9uZWxpc3RzIGluIE5vZGUgb3JkZXIsIG1vYmlsaXR5IGdyb3VwaW5nIG9u LiAgVG90YWwgcGFnZXM6IDMwODE2NjgKWyAgICAwLjAwMDAwMF0gUG9saWN5IHpvbmU6IE5v cm1hbApbICAgIDAuMDAwMDAwXSBLZXJuZWwgY29tbWFuZCBsaW5lOiB1c2VyPWxrcCBqb2I9 L2xrcC9zY2hlZHVsZWQvbGtwLW5lMDQvY3ljbGljX2ZzbWFyay1wZXJmb3JtYW5jZS0xeC0z MnQtMUhERC14ZnMtNUstNDAwTS1mc3luY0JlZm9yZUNsb3NlLTE2ZC0yNTZmcGQteDg2XzY0 LXJoZWwtSEVBRC03ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZkYzJjOTJhMGE1MTg1LTAu eWFtbCBBUkNIPXg4Nl82NCBCT09UX0lNQUdFPS9rZXJuZWwveDg2XzY0LXJoZWwvN2QzM2Zl OWFiOWVhY2UyNDAzYWRlZmVhM2M2ZGMyYzkyYTBhNTE4NS92bWxpbnV6LTMuMTguMC1yYzIt ZzdkMzNmZTkga2NvbmZpZz14ODZfNjQtcmhlbCBjb21taXQ9N2QzM2ZlOWFiOWVhY2UyNDAz YWRlZmVhM2M2ZGMyYzkyYTBhNTE4NSBicmFuY2g9bGludXgtZGV2ZWwvZGV2ZWwtaG91cmx5 LTIwMTQxMDI3MjMgcm9vdD0vZGV2L3JhbTAgbWF4X3VwdGltZT03MzQgUkVTVUxUX1JPT1Q9 L3Jlc3VsdC9sa3AtbmUwNC9mc21hcmsvcGVyZm9ybWFuY2UtMXgtMzJ0LTFIREQteGZzLTVL LTQwME0tZnN5bmNCZWZvcmVDbG9zZS0xNmQtMjU2ZnBkL2RlYmlhbi14ODZfNjQuY2d6L3g4 Nl82NC1yaGVsLzdkMzNmZTlhYjllYWNlMjQwM2FkZWZlYTNjNmRjMmM5MmEwYTUxODUvMCBp cD06Ojo6bGtwLW5lMDQ6OmRoY3AgZWFybHlwcmludGs9dHR5UzAsMTE1MjAwIGRlYnVnIGFw aWM9ZGVidWcgc3lzcnFfYWx3YXlzX2VuYWJsZWQgcmN1cGRhdGUucmN1X2NwdV9zdGFsbF90 aW1lb3V0PTEwMCBwYW5pYz0tMSBzb2Z0bG9ja3VwX3BhbmljPTEgbm1pX3dhdGNoZG9nPXBh bmljIG9vcHM9cGFuaWMgbG9hZF9yYW1kaXNrPTIgcHJvbXB0X3JhbWRpc2s9MCBjb25zb2xl PXR0eVMwLDExNTIwMCBjb25zb2xlPXR0eTAgdmdhPW5vcm1hbCBydwpbICAgIDAuMDAwMDAw XSBzeXNycTogc3lzcnEgYWx3YXlzIGVuYWJsZWQuClsgICAgMC4wMDAwMDBdIFBJRCBoYXNo IHRhYmxlIGVudHJpZXM6IDQwOTYgKG9yZGVyOiAzLCAzMjc2OCBieXRlcykKWyAgICAwLjAw MDAwMF0gQUdQOiBDaGVja2luZyBhcGVydHVyZS4uLgpbICAgIDAuMDAwMDAwXSBBR1A6IE5v IEFHUCBicmlkZ2UgZm91bmQKWyAgICAwLjAwMDAwMF0gTWVtb3J5OiAxMjEwOTg3NksvMTI1 MjI0MjhLIGF2YWlsYWJsZSAoODcxOEsga2VybmVsIGNvZGUsIDE2NzhLIHJ3ZGF0YSwgMzg0 NEsgcm9kYXRhLCAxODI0SyBpbml0LCAxODg4SyBic3MsIDQxMjU1MksgcmVzZXJ2ZWQpClsg ICAgMC4wMDAwMDBdIFNMVUI6IEhXYWxpZ249NjQsIE9yZGVyPTAtMywgTWluT2JqZWN0cz0w LCBDUFVzPTI0LCBOb2Rlcz0yClsgICAgMC4wMDAwMDBdIEhpZXJhcmNoaWNhbCBSQ1UgaW1w bGVtZW50YXRpb24uClsgICAgMC4wMDAwMDBdIAlSQ1UgcmVzdHJpY3RpbmcgQ1BVcyBmcm9t IE5SX0NQVVM9ODE5MiB0byBucl9jcHVfaWRzPTI0LgpbICAgIDAuMDAwMDAwXSBSQ1U6IEFk anVzdGluZyBnZW9tZXRyeSBmb3IgcmN1X2Zhbm91dF9sZWFmPTE2LCBucl9jcHVfaWRzPTI0 ClsgICAgMC4wMDAwMDBdIE5SX0lSUVM6NTI0NTQ0IG5yX2lycXM6MTAyNCAwClsgICAgMC4w MDAwMDBdIAlPZmZsb2FkIFJDVSBjYWxsYmFja3MgZnJvbSBhbGwgQ1BVcwpbICAgIDAuMDAw MDAwXSAJT2ZmbG9hZCBSQ1UgY2FsbGJhY2tzIGZyb20gQ1BVczogMC0yMy4KWyAgICAwLjAw MDAwMF0gU3B1cmlvdXMgTEFQSUMgdGltZXIgaW50ZXJydXB0IG9uIGNwdSAwClsgICAgMC4w MDAwMDBdIENvbnNvbGU6IGNvbG91ciBkdW1teSBkZXZpY2UgODB4MjUKWyAgICAwLjAwMDAw MF0gY29uc29sZSBbdHR5MF0gZW5hYmxlZApbICAgIDAuMDAwMDAwXSBib290Y29uc29sZSBb ZWFybHlzZXIwXSBkaXNhYmxlZApbICAgIDAuMDAwMDAwXSBjb25zb2xlIFt0dHlTMF0gZW5h YmxlZApbICAgIDAuMDAwMDAwXSBhbGxvY2F0ZWQgNTAzMzE2NDggYnl0ZXMgb2YgcGFnZV9j Z3JvdXAKWyAgICAwLjAwMDAwMF0gcGxlYXNlIHRyeSAnY2dyb3VwX2Rpc2FibGU9bWVtb3J5 JyBvcHRpb24gaWYgeW91IGRvbid0IHdhbnQgbWVtb3J5IGNncm91cHMKWyAgICAwLjAwMDAw MF0gbWVtcG9saWN5OiBFbmFibGluZyBhdXRvbWF0aWMgTlVNQSBiYWxhbmNpbmcuIENvbmZp Z3VyZSB3aXRoIG51bWFfYmFsYW5jaW5nPSBvciB0aGUga2VybmVsLm51bWFfYmFsYW5jaW5n IHN5c2N0bApbICAgIDAuMDAwMDAwXSBocGV0IGNsb2NrZXZlbnQgcmVnaXN0ZXJlZApbICAg IDAuMDAwMDAwXSB0c2M6IEZhc3QgVFNDIGNhbGlicmF0aW9uIHVzaW5nIFBJVApbICAgIDAu MDAwMDAwXSB0c2M6IERldGVjdGVkIDI5MjYuMTk3IE1IeiBwcm9jZXNzb3IKWyAgICAwLjAw MDAyOV0gQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCksIHZhbHVlIGNhbGN1bGF0 ZWQgdXNpbmcgdGltZXIgZnJlcXVlbmN5Li4gNTg1Mi4zOSBCb2dvTUlQUyAobHBqPTI5MjYx OTcpClsgICAgMC4wMTE4ODFdIHBpZF9tYXg6IGRlZmF1bHQ6IDMyNzY4IG1pbmltdW06IDMw MQpbICAgIDAuMDE3MDM5XSBBQ1BJOiBDb3JlIHJldmlzaW9uIDIwMTQwOTI2ClsgICAgMC4w MzA4NzVdIEFDUEk6IEFsbCBBQ1BJIFRhYmxlcyBzdWNjZXNzZnVsbHkgYWNxdWlyZWQKWyAg ICAwLjAzNjc3Ml0gU2VjdXJpdHkgRnJhbWV3b3JrIGluaXRpYWxpemVkClsgICAgMC4wNDEz NDBdIFNFTGludXg6ICBJbml0aWFsaXppbmcuClsgICAgMC4wNDUyMzhdIFNFTGludXg6ICBT dGFydGluZyBpbiBwZXJtaXNzaXZlIG1vZGUKWyAgICAwLjA1MTQ1NV0gRGVudHJ5IGNhY2hl IGhhc2ggdGFibGUgZW50cmllczogMjA5NzE1MiAob3JkZXI6IDEyLCAxNjc3NzIxNiBieXRl cykKWyAgICAwLjA2MzAyMl0gSW5vZGUtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAxMDQ4 NTc2IChvcmRlcjogMTEsIDgzODg2MDggYnl0ZXMpClsgICAgMC4wNzI0OTRdIE1vdW50LWNh Y2hlIGhhc2ggdGFibGUgZW50cmllczogMzI3NjggKG9yZGVyOiA2LCAyNjIxNDQgYnl0ZXMp ClsgICAgMC4wODAxODZdIE1vdW50cG9pbnQtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAz Mjc2OCAob3JkZXI6IDYsIDI2MjE0NCBieXRlcykKWyAgICAwLjA4ODYyM10gSW5pdGlhbGl6 aW5nIGNncm91cCBzdWJzeXMgbWVtb3J5ClsgICAgMC4wOTM0OTJdIEluaXRpYWxpemluZyBj Z3JvdXAgc3Vic3lzIGRldmljZXMKWyAgICAwLjA5ODQ1MV0gSW5pdGlhbGl6aW5nIGNncm91 cCBzdWJzeXMgZnJlZXplcgpbICAgIDAuMTAzNDA5XSBJbml0aWFsaXppbmcgY2dyb3VwIHN1 YnN5cyBuZXRfY2xzClsgICAgMC4xMDgzNjddIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lz IGJsa2lvClsgICAgMC4xMTMxMzFdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIHBlcmZf ZXZlbnQKWyAgICAwLjExODM4MF0gSW5pdGlhbGl6aW5nIGNncm91cCBzdWJzeXMgaHVnZXRs YgpbICAgIDAuMTIzMzYxXSBDUFU6IFBoeXNpY2FsIFByb2Nlc3NvciBJRDogMApbICAgIDAu MTI3ODMzXSBDUFU6IFByb2Nlc3NvciBDb3JlIElEOiAwClsgICAgMC4xMzE5MjFdIG1jZTog Q1BVIHN1cHBvcnRzIDkgTUNFIGJhbmtzClsgICAgMC4xMzYzOTldIENQVTA6IFRoZXJtYWwg TFZUIHZlY3RvciAoMHhmYSkgYWxyZWFkeSBpbnN0YWxsZWQKWyAgICAwLjE0MjgxOF0gTGFz dCBsZXZlbCBpVExCIGVudHJpZXM6IDRLQiA1MTIsIDJNQiA3LCA0TUIgNwpbICAgIDAuMTQy ODE4XSBMYXN0IGxldmVsIGRUTEIgZW50cmllczogNEtCIDUxMiwgMk1CIDMyLCA0TUIgMzIs IDFHQiAwClsgICAgMC4xNTYwMDVdIEZyZWVpbmcgU01QIGFsdGVybmF0aXZlcyBtZW1vcnk6 IDM2SyAoZmZmZmZmZmY4MWZiNTAwMCAtIGZmZmZmZmZmODFmYmUwMDApClsgICAgMC4xNjU4 MzFdIGZ0cmFjZTogYWxsb2NhdGluZyAzMTE4MSBlbnRyaWVzIGluIDEyMiBwYWdlcwpbICAg IDAuMTg0OTk5XSBHZXR0aW5nIFZFUlNJT046IDYwMDE1ClsgICAgMC4xODg3OTRdIEdldHRp bmcgVkVSU0lPTjogNjAwMTUKWyAgICAwLjE5MjU4NV0gR2V0dGluZyBJRDogMApbICAgIDAu MTk1NTA0XSBHZXR0aW5nIElEOiAwClsgICAgMC4xOTg0MjZdIFN3aXRjaGVkIEFQSUMgcm91 dGluZyB0byBwaHlzaWNhbCBmbGF0LgpbICAgIDAuMjAzODcwXSBtYXNrZWQgRXh0SU5UIG9u IENQVSMwClsgICAgMC4yMDgwMTFdIEVOQUJMSU5HIElPLUFQSUMgSVJRcwpbICAgIDAuMjEx NzA5XSBpbml0IElPX0FQSUMgSVJRcwpbICAgIDAuMjE1MDE3XSAgYXBpYyA4IHBpbiAwIG5v dCBjb25uZWN0ZWQKWyAgICAwLjIxOTI5Nl0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRy eSAoOC0xIC0+IDB4MzEgLT4gSVJRIDEgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAw LjIyODEzNV0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC0yIC0+IDB4MzAgLT4g SVJRIDAgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAwLjIzNjk3Ml0gSU9BUElDWzBd OiBTZXQgcm91dGluZyBlbnRyeSAoOC0yIC0+IDB4MzAgLT4gSVJRIDAgTW9kZTowIEFjdGl2 ZTowIERlc3Q6MCkKWyAgICAwLjI0NTgyMV0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRy eSAoOC0zIC0+IDB4MzMgLT4gSVJRIDMgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAw LjI1NDY2Ml0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC00IC0+IDB4MzQgLT4g SVJRIDQgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAwLjI2MzQ5NF0gSU9BUElDWzBd OiBTZXQgcm91dGluZyBlbnRyeSAoOC01IC0+IDB4MzUgLT4gSVJRIDUgTW9kZTowIEFjdGl2 ZTowIERlc3Q6MCkKWyAgICAwLjI3MjMyNV0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRy eSAoOC02IC0+IDB4MzYgLT4gSVJRIDYgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAw LjI4MTE2NV0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC03IC0+IDB4MzcgLT4g SVJRIDcgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAwLjI5MDAwNl0gSU9BUElDWzBd OiBTZXQgcm91dGluZyBlbnRyeSAoOC04IC0+IDB4MzggLT4gSVJRIDggTW9kZTowIEFjdGl2 ZTowIERlc3Q6MCkKWyAgICAwLjI5ODgzOF0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRy eSAoOC05IC0+IDB4MzkgLT4gSVJRIDkgTW9kZToxIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAw LjMwNzY3OF0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC0xMCAtPiAweDNhIC0+ IElSUSAxMCBNb2RlOjAgQWN0aXZlOjAgRGVzdDowKQpbICAgIDAuMzE2NzEyXSBJT0FQSUNb MF06IFNldCByb3V0aW5nIGVudHJ5ICg4LTExIC0+IDB4M2IgLT4gSVJRIDExIE1vZGU6MCBB Y3RpdmU6MCBEZXN0OjApClsgICAgMC4zMjU3MzhdIElPQVBJQ1swXTogU2V0IHJvdXRpbmcg ZW50cnkgKDgtMTIgLT4gMHgzYyAtPiBJUlEgMTIgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkK WyAgICAwLjMzNDc2NV0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC0xMyAtPiAw eDNkIC0+IElSUSAxMyBNb2RlOjAgQWN0aXZlOjAgRGVzdDowKQpbICAgIDAuMzQzNzk5XSBJ T0FQSUNbMF06IFNldCByb3V0aW5nIGVudHJ5ICg4LTE0IC0+IDB4M2UgLT4gSVJRIDE0IE1v ZGU6MCBBY3RpdmU6MCBEZXN0OjApClsgICAgMC4zNTI4MzJdIElPQVBJQ1swXTogU2V0IHJv dXRpbmcgZW50cnkgKDgtMTUgLT4gMHgzZiAtPiBJUlEgMTUgTW9kZTowIEFjdGl2ZTowIERl c3Q6MCkKWyAgICAwLjM2MTg2Nl0gIGFwaWMgOCBwaW4gMTYgbm90IGNvbm5lY3RlZApbICAg IDAuMzY2MjQxXSAgYXBpYyA4IHBpbiAxNyBub3QgY29ubmVjdGVkClsgICAgMC4zNzA2MTdd ICBhcGljIDggcGluIDE4IG5vdCBjb25uZWN0ZWQKWyAgICAwLjM3NDk5Ml0gIGFwaWMgOCBw aW4gMTkgbm90IGNvbm5lY3RlZApbICAgIDAuMzc5MzY3XSAgYXBpYyA4IHBpbiAyMCBub3Qg Y29ubmVjdGVkClsgICAgMC4zODM3NDNdICBhcGljIDggcGluIDIxIG5vdCBjb25uZWN0ZWQK WyAgICAwLjM4ODEyMF0gIGFwaWMgOCBwaW4gMjIgbm90IGNvbm5lY3RlZApbICAgIDAuMzky NDk1XSAgYXBpYyA4IHBpbiAyMyBub3QgY29ubmVjdGVkClsgICAgMC4zOTY4NzFdICBhcGlj IDkgcGluIDAgbm90IGNvbm5lY3RlZApbICAgIDAuNDAxMTUwXSAgYXBpYyA5IHBpbiAxIG5v dCBjb25uZWN0ZWQKWyAgICAwLjQwNTQyOF0gIGFwaWMgOSBwaW4gMiBub3QgY29ubmVjdGVk ClsgICAgMC40MDk3MDZdICBhcGljIDkgcGluIDMgbm90IGNvbm5lY3RlZApbICAgIDAuNDEz OTgzXSAgYXBpYyA5IHBpbiA0IG5vdCBjb25uZWN0ZWQKWyAgICAwLjQxODI2MV0gIGFwaWMg OSBwaW4gNSBub3QgY29ubmVjdGVkClsgICAgMC40MjI1NDBdICBhcGljIDkgcGluIDYgbm90 IGNvbm5lY3RlZApbICAgIDAuNDI2ODE4XSAgYXBpYyA5IHBpbiA3IG5vdCBjb25uZWN0ZWQK WyAgICAwLjQzMTA5Nl0gIGFwaWMgOSBwaW4gOCBub3QgY29ubmVjdGVkClsgICAgMC40MzUz NzNdICBhcGljIDkgcGluIDkgbm90IGNvbm5lY3RlZApbICAgIDAuNDM5NjUyXSAgYXBpYyA5 IHBpbiAxMCBub3QgY29ubmVjdGVkClsgICAgMC40NDQwMjldICBhcGljIDkgcGluIDExIG5v dCBjb25uZWN0ZWQKWyAgICAwLjQ0ODQwNF0gIGFwaWMgOSBwaW4gMTIgbm90IGNvbm5lY3Rl ZApbICAgIDAuNDUyNzc4XSAgYXBpYyA5IHBpbiAxMyBub3QgY29ubmVjdGVkClsgICAgMC40 NTcxNTRdICBhcGljIDkgcGluIDE0IG5vdCBjb25uZWN0ZWQKWyAgICAwLjQ2MTUyOV0gIGFw aWMgOSBwaW4gMTUgbm90IGNvbm5lY3RlZApbICAgIDAuNDY1OTA0XSAgYXBpYyA5IHBpbiAx NiBub3QgY29ubmVjdGVkClsgICAgMC40NzAyNzldICBhcGljIDkgcGluIDE3IG5vdCBjb25u ZWN0ZWQKWyAgICAwLjQ3NDY1Nl0gIGFwaWMgOSBwaW4gMTggbm90IGNvbm5lY3RlZApbICAg IDAuNDc5MDMyXSAgYXBpYyA5IHBpbiAxOSBub3QgY29ubmVjdGVkClsgICAgMC40ODM0MDdd ICBhcGljIDkgcGluIDIwIG5vdCBjb25uZWN0ZWQKWyAgICAwLjQ4Nzc4M10gIGFwaWMgOSBw aW4gMjEgbm90IGNvbm5lY3RlZApbICAgIDAuNDkyMTYwXSAgYXBpYyA5IHBpbiAyMiBub3Qg Y29ubmVjdGVkClsgICAgMC40OTY1MzVdICBhcGljIDkgcGluIDIzIG5vdCBjb25uZWN0ZWQK WyAgICAwLjUwMTA0M10gLi5USU1FUjogdmVjdG9yPTB4MzAgYXBpYzE9MCBwaW4xPTIgYXBp YzI9LTEgcGluMj0tMQpbICAgIDAuNTE3NzQ4XSBzbXBib290OiBDUFUwOiBJbnRlbChSKSBY ZW9uKFIpIENQVSAgICAgICAgICAgWDU1NzAgIEAgMi45M0dIeiAoZmFtOiAwNiwgbW9kZWw6 IDFhLCBzdGVwcGluZzogMDUpClsgICAgMC41Mjg4NDddIFVzaW5nIGxvY2FsIEFQSUMgdGlt ZXIgaW50ZXJydXB0cy4KWyAgICAwLjUyODg0N10gY2FsaWJyYXRpbmcgQVBJQyB0aW1lciAu Li4KWyAgICAwLjYzOTUwMl0gLi4uIGxhcGljIGRlbHRhID0gODMxMzMxClsgICAgMC42NDM0 ODhdIC4uLiBQTS1UaW1lciBkZWx0YSA9IDM1Nzk0OQpbICAgIDAuNjQ3NzY0XSAuLi4gUE0t VGltZXIgcmVzdWx0IG9rClsgICAgMC42NTE1NTZdIC4uLi4uIGRlbHRhIDgzMTMzMQpbICAg IDAuNjU0OTU5XSAuLi4uLiBtdWx0OiAzNTcwNTM5NApbICAgIDAuNjU4NTU2XSAuLi4uLiBj YWxpYnJhdGlvbiByZXN1bHQ6IDEzMzAxMgpbICAgIDAuNjYzMzE3XSAuLi4uLiBDUFUgY2xv Y2sgc3BlZWQgaXMgMjkyNi4wMjg1IE1Iei4KWyAgICAwLjY2ODc1OV0gLi4uLi4gaG9zdCBi dXMgY2xvY2sgc3BlZWQgaXMgMTMzLjAwMTIgTUh6LgpbICAgIDAuNjc0NjEzXSBQZXJmb3Jt YW5jZSBFdmVudHM6IFBFQlMgZm10MSssIDE2LWRlZXAgTEJSLCBOZWhhbGVtIGV2ZW50cywg SW50ZWwgUE1VIGRyaXZlci4KWyAgICAwLjY4Mzg4OV0gcGVyZl9ldmVudF9pbnRlbDogQ1BV IGVycmF0dW0gQUFKODAgd29ya2VkIGFyb3VuZApbICAgIDAuNjkwMzAxXSBwZXJmX2V2ZW50 X2ludGVsOiBDUFVJRCBtYXJrZWQgZXZlbnQ6ICdidXMgY3ljbGVzJyB1bmF2YWlsYWJsZQpb ICAgIDAuNjk3OTc1XSAuLi4gdmVyc2lvbjogICAgICAgICAgICAgICAgMwpbICAgIDAuNzAy NDQ3XSAuLi4gYml0IHdpZHRoOiAgICAgICAgICAgICAgNDgKWyAgICAwLjcwNzAxNl0gLi4u IGdlbmVyaWMgcmVnaXN0ZXJzOiAgICAgIDQKWyAgICAwLjcxMTQ4N10gLi4uIHZhbHVlIG1h c2s6ICAgICAgICAgICAgIDAwMDBmZmZmZmZmZmZmZmYKWyAgICAwLjcxNzQxNF0gLi4uIG1h eCBwZXJpb2Q6ICAgICAgICAgICAgIDAwMDAwMDAwN2ZmZmZmZmYKWyAgICAwLjcyMzM0Ml0g Li4uIGZpeGVkLXB1cnBvc2UgZXZlbnRzOiAgIDMKWyAgICAwLjcyNzgxM10gLi4uIGV2ZW50 IG1hc2s6ICAgICAgICAgICAgIDAwMDAwMDA3MDAwMDAwMGYKWyAgICAwLjczNTMwN10geDg2 OiBCb290aW5nIFNNUCBjb25maWd1cmF0aW9uOgpbICAgIDAuNzM5OTc3XSAuLi4uIG5vZGUg ICMxLCBDUFVzOiAgICAgICAgIzEKWyAgICAwLjc1NTQ4NF0gbWFza2VkIEV4dElOVCBvbiBD UFUjMQpbICAgIDAuNzU5NTAxXSBDUFUxOiBUaGVybWFsIExWVCB2ZWN0b3IgKDB4ZmEpIGFs cmVhZHkgaW5zdGFsbGVkClsgICAgMC44NDYwMzZdIE5NSSB3YXRjaGRvZzogZW5hYmxlZCBv biBhbGwgQ1BVcywgcGVybWFuZW50bHkgY29uc3VtZXMgb25lIGh3LVBNVSBjb3VudGVyLgpb ICAgIDAuODU1MDY0XSAKWyAgICAwLjg1NjcyOF0gLi4uLiBub2RlICAjMCwgQ1BVczogICAg IzIKWyAgICAwLjg3MTg0Ml0gbWFza2VkIEV4dElOVCBvbiBDUFUjMgpbICAgIDAuODc1ODU2 XSBDUFUyOiBUaGVybWFsIExWVCB2ZWN0b3IgKDB4ZmEpIGFscmVhZHkgaW5zdGFsbGVkClsg ICAgMC44ODQ1MDNdIApbICAgIDAuODg2MTY4XSAuLi4uIG5vZGUgICMxLCBDUFVzOiAgICAj MwpbICAgIDAuOTAxMjc3XSBtYXNrZWQgRXh0SU5UIG9uIENQVSMzClsgICAgMC45MDUyOTFd IENQVTM6IFRoZXJtYWwgTFZUIHZlY3RvciAoMHhmYSkgYWxyZWFkeSBpbnN0YWxsZWQKWyAg ICAwLjkxMzg5Nl0gClsgICAgMC45MTU1NThdIC4uLi4gbm9kZSAgIzAsIENQVXM6ICAgICM0 ClsgICAgMC45MzA2NzBdIG1hc2tlZCBFeHRJTlQgb24gQ1BVIzQKWyAgICAwLjkzNDY4M10g Q1BVNDogVGhlcm1hbCBMVlQgdmVjdG9yICgweGZhKSBhbHJlYWR5IGluc3RhbGxlZApbICAg IDAuOTQzMzMyXSAKWyAgICAwLjk0NDk4N10gLi4uLiBub2RlICAjMSwgQ1BVczogICAgIzUK WyAgICAwLjk2MDA5N10gbWFza2VkIEV4dElOVCBvbiBDUFUjNQpbICAgIDAuOTY0MTExXSBD UFU1OiBUaGVybWFsIExWVCB2ZWN0b3IgKDB4ZmEpIGFscmVhZHkgaW5zdGFsbGVkClsgICAg MC45NzI3MTJdIApbICAgIDAuOTc0Mzc2XSAuLi4uIG5vZGUgICMwLCBDUFVzOiAgICAjNgpb ICAgIDAuOTg5NDg1XSBtYXNrZWQgRXh0SU5UIG9uIENQVSM2ClsgICAgMC45OTM0OThdIENQ VTY6IFRoZXJtYWwgTFZUIHZlY3RvciAoMHhmYSkgYWxyZWFkeSBpbnN0YWxsZWQKWyAgICAx LjAwMjE0OF0gClsgICAgMS4wMDM4MDNdIC4uLi4gbm9kZSAgIzEsIENQVXM6ICAgICM3Clsg ICAgMS4wMTg5MTNdIG1hc2tlZCBFeHRJTlQgb24gQ1BVIzcKWyAgICAxLjAyMjkyOF0gQ1BV NzogVGhlcm1hbCBMVlQgdmVjdG9yICgweGZhKSBhbHJlYWR5IGluc3RhbGxlZApbICAgIDEu MDMxNTI4XSAKWyAgICAxLjAzMzE4Ml0gLi4uLiBub2RlICAjMCwgQ1BVczogICAgIzgKWyAg ICAxLjA0ODI5NV0gbWFza2VkIEV4dElOVCBvbiBDUFUjOApbICAgIDEuMDUyMzEwXSBDUFU4 OiBUaGVybWFsIExWVCB2ZWN0b3IgKDB4ZmEpIGFscmVhZHkgaW5zdGFsbGVkClsgICAgMS4w NjA5NzVdIApbICAgIDEuMDYyNjM4XSAuLi4uIG5vZGUgICMxLCBDUFVzOiAgICAjOQpbICAg IDEuMDc3NzUwXSBtYXNrZWQgRXh0SU5UIG9uIENQVSM5ClsgICAgMS4wODE3NjNdIENQVTk6 IFRoZXJtYWwgTFZUIHZlY3RvciAoMHhmYSkgYWxyZWFkeSBpbnN0YWxsZWQKWyAgICAxLjA5 MDM3MF0gClsgICAgMS4wOTIwMzJdIC4uLi4gbm9kZSAgIzAsIENQVXM6ICAgIzEwClsgICAg MS4xMDcxNDJdIG1hc2tlZCBFeHRJTlQgb24gQ1BVIzEwClsgICAgMS4xMTEyNTFdIENQVTEw OiBUaGVybWFsIExWVCB2ZWN0b3IgKDB4ZmEpIGFscmVhZHkgaW5zdGFsbGVkClsgICAgMS4x MjAwMDddIApbICAgIDEuMTIxNjYxXSAuLi4uIG5vZGUgICMxLCBDUFVzOiAgICMxMQpbICAg IDEuMTM2NzczXSBtYXNrZWQgRXh0SU5UIG9uIENQVSMxMQpbICAgIDEuMTQwODgzXSBDUFUx MTogVGhlcm1hbCBMVlQgdmVjdG9yICgweGZhKSBhbHJlYWR5IGluc3RhbGxlZApbICAgIDEu MTQ5NTkxXSAKWyAgICAxLjE1MTI1NV0gLi4uLiBub2RlICAjMCwgQ1BVczogICAjMTIKWyAg ICAxLjE2NjM2NF0gbWFza2VkIEV4dElOVCBvbiBDUFUjMTIKWyAgICAxLjE3MDQ3Ml0gQ1BV MTI6IFRoZXJtYWwgTFZUIHZlY3RvciAoMHhmYSkgYWxyZWFkeSBpbnN0YWxsZWQKWyAgICAx LjE3OTIyOF0gClsgICAgMS4xODA4OTNdIC4uLi4gbm9kZSAgIzEsIENQVXM6ICAgIzEzClsg ICAgMS4xOTYwMDZdIG1hc2tlZCBFeHRJTlQgb24gQ1BVIzEzClsgICAgMS4yMDAxMTRdIENQ VTEzOiBUaGVybWFsIExWVCB2ZWN0b3IgKDB4ZmEpIGFscmVhZHkgaW5zdGFsbGVkClsgICAg MS4yMDg4MjFdIApbICAgIDEuMjEwNDg1XSAuLi4uIG5vZGUgICMwLCBDUFVzOiAgICMxNApb ICAgIDEuMjI1NTk2XSBtYXNrZWQgRXh0SU5UIG9uIENQVSMxNApbICAgIDEuMjI5NzA1XSBD UFUxNDogVGhlcm1hbCBMVlQgdmVjdG9yICgweGZhKSBhbHJlYWR5IGluc3RhbGxlZApbICAg IDEuMjM4NDYzXSAKWyAgICAxLjI0MDEyNl0gLi4uLiBub2RlICAjMSwgQ1BVczogICAjMTUK WyAgICAxLjI1NTIzNl0gbWFza2VkIEV4dElOVCBvbiBDUFUjMTUKWyAgICAxLjI1OTM0Nl0g Q1BVMTU6IFRoZXJtYWwgTFZUIHZlY3RvciAoMHhmYSkgYWxyZWFkeSBpbnN0YWxsZWQKWyAg ICAxLjI2Nzk2N10geDg2OiBCb290ZWQgdXAgMiBub2RlcywgMTYgQ1BVcwpbICAgIDEuMjcy NjM3XSBzbXBib290OiBUb3RhbCBvZiAxNiBwcm9jZXNzb3JzIGFjdGl2YXRlZCAoOTM2MzMu MjggQm9nb01JUFMpClsgICAgMS4yOTEzMDddIGRldnRtcGZzOiBpbml0aWFsaXplZApbICAg IDEuMjk4NjMxXSBldm06IHNlY3VyaXR5LnNlbGludXgKWyAgICAxLjMwMjMyOF0gZXZtOiBz ZWN1cml0eS5pbWEKWyAgICAxLjMwNTYzOF0gZXZtOiBzZWN1cml0eS5jYXBhYmlsaXR5Clsg ICAgMS4zMDk3NjhdIFBNOiBSZWdpc3RlcmluZyBBQ1BJIE5WUyByZWdpb24gW21lbSAweDhj NTU2MDAwLTB4OGM2MjhmZmZdICg4NjQyNTYgYnl0ZXMpClsgICAgMS4zMTg2MjJdIFBNOiBS ZWdpc3RlcmluZyBBQ1BJIE5WUyByZWdpb24gW21lbSAweDhjNzAyMDAwLTB4OGRiMDFmZmZd ICgyMDk3MTUyMCBieXRlcykKWyAgICAxLjMyNzkxNl0gUE06IFJlZ2lzdGVyaW5nIEFDUEkg TlZTIHJlZ2lvbiBbbWVtIDB4OGY2ZTYwMDAtMHg4ZjZlZmZmZl0gKDQwOTYwIGJ5dGVzKQpb ICAgIDEuMzM2NjU4XSBQTTogUmVnaXN0ZXJpbmcgQUNQSSBOVlMgcmVnaW9uIFttZW0gMHg4 ZjZmMjAwMC0weDhmN2NlZmZmXSAoOTA1MjE2IGJ5dGVzKQpbICAgIDEuMzQ2NTQ1XSBhdG9t aWM2NF90ZXN0OiBwYXNzZWQgZm9yIHg4Ni02NCBwbGF0Zm9ybSB3aXRoIENYOCBhbmQgd2l0 aCBTU0UKWyAgICAxLjM1NDQ0NV0gTkVUOiBSZWdpc3RlcmVkIHByb3RvY29sIGZhbWlseSAx NgpbICAgIDEuMzYyMzg2XSBjcHVpZGxlOiB1c2luZyBnb3Zlcm5vciBtZW51ClsgICAgMS4z NjY4ODddIEFDUEkgRkFEVCBkZWNsYXJlcyB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBQ Q0llIEFTUE0sIHNvIGRpc2FibGUgaXQKWyAgICAxLjM3NTMzOV0gQUNQSTogYnVzIHR5cGUg UENJIHJlZ2lzdGVyZWQKWyAgICAxLjM3OTgxNF0gYWNwaXBocDogQUNQSSBIb3QgUGx1ZyBQ Q0kgQ29udHJvbGxlciBEcml2ZXIgdmVyc2lvbjogMC41ClsgICAgMS4zODcwNzNdIFBDSTog TU1DT05GSUcgZm9yIGRvbWFpbiAwMDAwIFtidXMgMDAtZmZdIGF0IFttZW0gMHhhMDAwMDAw MC0weGFmZmZmZmZmXSAoYmFzZSAweGEwMDAwMDAwKQpbICAgIDEuMzk3NDY0XSBQQ0k6IE1N Q09ORklHIGF0IFttZW0gMHhhMDAwMDAwMC0weGFmZmZmZmZmXSByZXNlcnZlZCBpbiBFODIw ClsgICAgMS40MDU0NzNdIFBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDEgZm9yIGJh c2UgYWNjZXNzClsgICAgMS40MTY4NTBdIEFDUEk6IEFkZGVkIF9PU0koTW9kdWxlIERldmlj ZSkKWyAgICAxLjQyMTUyMF0gQUNQSTogQWRkZWQgX09TSShQcm9jZXNzb3IgRGV2aWNlKQpb ICAgIDEuNDI2NDc5XSBBQ1BJOiBBZGRlZCBfT1NJKDMuMCBfU0NQIEV4dGVuc2lvbnMpClsg ICAgMS40MzE3MjldIEFDUEk6IEFkZGVkIF9PU0koUHJvY2Vzc29yIEFnZ3JlZ2F0b3IgRGV2 aWNlKQpbICAgIDEuNDM4ODY0XSBJT0FQSUNbMF06IFNldCByb3V0aW5nIGVudHJ5ICg4LTkg LT4gMHgzOSAtPiBJUlEgOSBNb2RlOjEgQWN0aXZlOjAgRGVzdDowKQpbICAgIDEuNDYyMzg2 XSBBQ1BJIEVycm9yOiBGaWVsZCBbQ1BCM10gYXQgOTYgZXhjZWVkcyBCdWZmZXIgW05VTExd IHNpemUgNjQgKGJpdHMpICgyMDE0MDkyNi9kc29wY29kZS0yMzYpClsgICAgMS40NzI5MDJd IEFDUEkgRXJyb3I6IE1ldGhvZCBwYXJzZS9leGVjdXRpb24gZmFpbGVkIFtcX1NCXy5fT1ND XSAoTm9kZSBmZmZmODgwMWU5ODYyMWI4KSwgQUVfQU1MX0JVRkZFUl9MSU1JVCAoMjAxNDA5 MjYvcHNwYXJzZS01MzYpClsgICAgMS40ODc4NzZdIEFDUEk6IEludGVycHJldGVyIGVuYWJs ZWQKWyAgICAxLjQ5MTk3MF0gQUNQSSBFeGNlcHRpb246IEFFX05PVF9GT1VORCwgV2hpbGUg ZXZhbHVhdGluZyBTbGVlcCBTdGF0ZSBbXF9TMl9dICgyMDE0MDkyNi9od3hmYWNlLTU4MCkK WyAgICAxLjUwMjI4OF0gQUNQSSBFeGNlcHRpb246IEFFX05PVF9GT1VORCwgV2hpbGUgZXZh bHVhdGluZyBTbGVlcCBTdGF0ZSBbXF9TM19dICgyMDE0MDkyNi9od3hmYWNlLTU4MCkKWyAg ICAxLjUxMjYwMV0gQUNQSSBFeGNlcHRpb246IEFFX05PVF9GT1VORCwgV2hpbGUgZXZhbHVh dGluZyBTbGVlcCBTdGF0ZSBbXF9TNF9dICgyMDE0MDkyNi9od3hmYWNlLTU4MCkKWyAgICAx LjUyMjkxOF0gQUNQSTogKHN1cHBvcnRzIFMwIFMxIFM1KQpbICAgIDEuNTI3MDA0XSBBQ1BJ OiBVc2luZyBJT0FQSUMgZm9yIGludGVycnVwdCByb3V0aW5nClsgICAgMS41MzI1ODNdIEhF U1Q6IFRhYmxlIHBhcnNpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuClsgICAgMS41MzgyMjRd IFBDSTogVXNpbmcgaG9zdCBicmlkZ2Ugd2luZG93cyBmcm9tIEFDUEk7IGlmIG5lY2Vzc2Fy eSwgdXNlICJwY2k9bm9jcnMiIGFuZCByZXBvcnQgYSBidWcKWyAgICAxLjU1MjM3MV0gQUNQ STogUENJIFJvb3QgQnJpZGdlIFtQQ0kwXSAoZG9tYWluIDAwMDAgW2J1cyAwMC1mZF0pClsg ICAgMS41NTkyNzZdIGFjcGkgUE5QMEEwODowMDogX09TQzogT1Mgc3VwcG9ydHMgW0V4dGVu ZGVkQ29uZmlnIEFTUE0gQ2xvY2tQTSBTZWdtZW50cyBNU0ldClsgICAgMS41Njg1MTNdIGFj cGkgUE5QMEEwODowMDogX09TQzogT1Mgbm93IGNvbnRyb2xzIFtQQ0llSG90cGx1ZyBQTUUg QUVSIFBDSWVDYXBhYmlsaXR5XQpbICAgIDEuNTc3NzQxXSBhY3BpIFBOUDBBMDg6MDA6IGhv c3QgYnJpZGdlIHdpbmRvdyBbMHgwLTB4MF0gKGlnbm9yZWQsIG5vdCBDUFUgYWRkcmVzc2Fi bGUpClsgICAgMS41ODY3NzddIGFjcGkgUE5QMEEwODowMDogaWdub3JpbmcgaG9zdCBicmlk Z2Ugd2luZG93IFttZW0gMHgwMDBjNDAwMC0weDAwMGNiZmZmXSAoY29uZmxpY3RzIHdpdGgg VmlkZW8gUk9NIFttZW0gMHgwMDBjMDAwMC0weDAwMGM3ZmZmXSkKWyAgICAxLjYwMDk0OV0g UENJIGhvc3QgYnJpZGdlIHRvIGJ1cyAwMDAwOjAwClsgICAgMS42MDU1MTNdIHBjaV9idXMg MDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW2J1cyAwMC1mZF0KWyAgICAxLjYxMTYzNV0g cGNpX2J1cyAwMDAwOjAwOiByb290IGJ1cyByZXNvdXJjZSBbaW8gIDB4MDAwMC0weDBjZjdd ClsgICAgMS42MTg1MzRdIHBjaV9idXMgMDAwMDowMDogcm9vdCBidXMgcmVzb3VyY2UgW2lv ICAweDBkMDAtMHhmZmZmXQpbICAgIDEuNjI1NDM0XSBwY2lfYnVzIDAwMDA6MDA6IHJvb3Qg YnVzIHJlc291cmNlIFttZW0gMHgwMDBhMDAwMC0weDAwMGJmZmZmXQpbICAgIDEuNjMzMTEw XSBwY2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJlc291cmNlIFttZW0gMHhmZWQ0MDAwMC0w eGZlZGZmZmZmXQpbICAgIDEuNjQwNzg0XSBwY2lfYnVzIDAwMDA6MDA6IHJvb3QgYnVzIHJl c291cmNlIFttZW0gMHhiMDAwMDAwMC0weGZkZmZmZmZmXQpbICAgIDEuNjQ4NDY3XSBwY2kg MDAwMDowMDowMC4wOiBbODA4NjozNDA2XSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAg MS42NTUyMjNdIHBjaSAwMDAwOjAwOjAwLjA6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNo b3QgRDNjb2xkClsgICAgMS42NjIxMDVdIHBjaSAwMDAwOjAwOjAxLjA6IFs4MDg2OjM0MDhd IHR5cGUgMDEgY2xhc3MgMHgwNjA0MDAKWyAgICAxLjY2ODg1Ml0gcGNpIDAwMDA6MDA6MDEu MDogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAxLjY3NTcwMF0g cGNpIDAwMDA6MDA6MDEuMDogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAg MS42ODIwNDJdIHBjaSAwMDAwOjAwOjAzLjA6IFs4MDg2OjM0MGFdIHR5cGUgMDEgY2xhc3Mg MHgwNjA0MDAKWyAgICAxLjY4ODc5Nl0gcGNpIDAwMDA6MDA6MDMuMDogUE1FIyBzdXBwb3J0 ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAxLjY5NTY0NV0gcGNpIDAwMDA6MDA6MDMu MDogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMS43MDE5OTVdIHBjaSAw MDAwOjAwOjA1LjA6IFs4MDg2OjM0MGNdIHR5cGUgMDEgY2xhc3MgMHgwNjA0MDAKWyAgICAx LjcwODc0OF0gcGNpIDAwMDA6MDA6MDUuMDogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBEM2hv dCBEM2NvbGQKWyAgICAxLjcxNTU5NV0gcGNpIDAwMDA6MDA6MDUuMDogU3lzdGVtIHdha2V1 cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMS43MjE5MzZdIHBjaSAwMDAwOjAwOjA3LjA6IFs4 MDg2OjM0MGVdIHR5cGUgMDEgY2xhc3MgMHgwNjA0MDAKWyAgICAxLjcyODY5MV0gcGNpIDAw MDA6MDA6MDcuMDogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAx LjczNTUzOV0gcGNpIDAwMDA6MDA6MDcuMDogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBB Q1BJClsgICAgMS43NDE4ODldIHBjaSAwMDAwOjAwOjA5LjA6IFs4MDg2OjM0MTBdIHR5cGUg MDEgY2xhc3MgMHgwNjA0MDAKWyAgICAxLjc0ODY0NF0gcGNpIDAwMDA6MDA6MDkuMDogUE1F IyBzdXBwb3J0ZWQgZnJvbSBEMCBEM2hvdCBEM2NvbGQKWyAgICAxLjc1NTQ4OV0gcGNpIDAw MDA6MDA6MDkuMDogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMS43NjE4 MzhdIHBjaSAwMDAwOjAwOjBhLjA6IFs4MDg2OjM0MTFdIHR5cGUgMDEgY2xhc3MgMHgwNjA0 MDAKWyAgICAxLjc2ODU5MV0gcGNpIDAwMDA6MDA6MGEuMDogUE1FIyBzdXBwb3J0ZWQgZnJv bSBEMCBEM2hvdCBEM2NvbGQKWyAgICAxLjc3NTQzNl0gcGNpIDAwMDA6MDA6MGEuMDogU3lz dGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMS43ODE3ODddIHBjaSAwMDAwOjAw OjEwLjA6IFs4MDg2OjM0MjVdIHR5cGUgMDAgY2xhc3MgMHgwODAwMDAKWyAgICAxLjc4ODU5 MF0gcGNpIDAwMDA6MDA6MTAuMTogWzgwODY6MzQyNl0gdHlwZSAwMCBjbGFzcyAweDA4MDAw MApbICAgIDEuNzk1Mzg2XSBwY2kgMDAwMDowMDoxMS4wOiBbODA4NjozNDI3XSB0eXBlIDAw IGNsYXNzIDB4MDgwMDAwClsgICAgMS44MDIxODddIHBjaSAwMDAwOjAwOjExLjE6IFs4MDg2 OjM0MjhdIHR5cGUgMDAgY2xhc3MgMHgwODAwMDAKWyAgICAxLjgwODk4M10gcGNpIDAwMDA6 MDA6MTMuMDogWzgwODY6MzQyZF0gdHlwZSAwMCBjbGFzcyAweDA4MDAyMApbICAgIDEuODE1 Njk1XSBwY2kgMDAwMDowMDoxMy4wOiByZWcgMHgxMDogW21lbSAweGIxYTI0MDAwLTB4YjFh MjRmZmZdClsgICAgMS44MjI3MzBdIHBjaSAwMDAwOjAwOjEzLjA6IFBNRSMgc3VwcG9ydGVk IGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAgMS44Mjk2MDBdIHBjaSAwMDAwOjAwOjE0LjA6 IFs4MDg2OjM0MmVdIHR5cGUgMDAgY2xhc3MgMHgwODAwMDAKWyAgICAxLjgzNjQwNF0gcGNp IDAwMDA6MDA6MTQuMTogWzgwODY6MzQyMl0gdHlwZSAwMCBjbGFzcyAweDA4MDAwMApbICAg IDEuODQzMjExXSBwY2kgMDAwMDowMDoxNC4yOiBbODA4NjozNDIzXSB0eXBlIDAwIGNsYXNz IDB4MDgwMDAwClsgICAgMS44NTAwMTRdIHBjaSAwMDAwOjAwOjE0LjM6IFs4MDg2OjM0Mzhd IHR5cGUgMDAgY2xhc3MgMHgwODAwMDAKWyAgICAxLjg1Njc5OF0gcGNpIDAwMDA6MDA6MTUu MDogWzgwODY6MzQyZl0gdHlwZSAwMCBjbGFzcyAweDA4MDAyMApbICAgIDEuODYzNTk0XSBw Y2kgMDAwMDowMDoxNi4wOiBbODA4NjozNDMwXSB0eXBlIDAwIGNsYXNzIDB4MDg4MDAwClsg ICAgMS44NzAzMDldIHBjaSAwMDAwOjAwOjE2LjA6IHJlZyAweDEwOiBbbWVtIDB4YjFhMDAw MDAtMHhiMWEwM2ZmZiA2NGJpdF0KWyAgICAxLjg3Nzk5OF0gcGNpIDAwMDA6MDA6MTYuMTog WzgwODY6MzQzMV0gdHlwZSAwMCBjbGFzcyAweDA4ODAwMApbICAgIDEuODg0NzEzXSBwY2kg MDAwMDowMDoxNi4xOiByZWcgMHgxMDogW21lbSAweGIxYTA0MDAwLTB4YjFhMDdmZmYgNjRi aXRdClsgICAgMS44OTI0MDBdIHBjaSAwMDAwOjAwOjE2LjI6IFs4MDg2OjM0MzJdIHR5cGUg MDAgY2xhc3MgMHgwODgwMDAKWyAgICAxLjg5OTExNV0gcGNpIDAwMDA6MDA6MTYuMjogcmVn IDB4MTA6IFttZW0gMHhiMWEwODAwMC0weGIxYTBiZmZmIDY0Yml0XQpbICAgIDEuOTA2ODAw XSBwY2kgMDAwMDowMDoxNi4zOiBbODA4NjozNDMzXSB0eXBlIDAwIGNsYXNzIDB4MDg4MDAw ClsgICAgMS45MTM1MTVdIHBjaSAwMDAwOjAwOjE2LjM6IHJlZyAweDEwOiBbbWVtIDB4YjFh MGMwMDAtMHhiMWEwZmZmZiA2NGJpdF0KWyAgICAxLjkyMTIwMV0gcGNpIDAwMDA6MDA6MTYu NDogWzgwODY6MzQyOV0gdHlwZSAwMCBjbGFzcyAweDA4ODAwMApbICAgIDEuOTI3OTE2XSBw Y2kgMDAwMDowMDoxNi40OiByZWcgMHgxMDogW21lbSAweGIxYTEwMDAwLTB4YjFhMTNmZmYg NjRiaXRdClsgICAgMS45MzU2MDBdIHBjaSAwMDAwOjAwOjE2LjU6IFs4MDg2OjM0MmFdIHR5 cGUgMDAgY2xhc3MgMHgwODgwMDAKWyAgICAxLjk0MjMxNV0gcGNpIDAwMDA6MDA6MTYuNTog cmVnIDB4MTA6IFttZW0gMHhiMWExNDAwMC0weGIxYTE3ZmZmIDY0Yml0XQpbICAgIDEuOTUw MDAxXSBwY2kgMDAwMDowMDoxNi42OiBbODA4NjozNDJiXSB0eXBlIDAwIGNsYXNzIDB4MDg4 MDAwClsgICAgMS45NTY3MTZdIHBjaSAwMDAwOjAwOjE2LjY6IHJlZyAweDEwOiBbbWVtIDB4 YjFhMTgwMDAtMHhiMWExYmZmZiA2NGJpdF0KWyAgICAxLjk2NDQwMV0gcGNpIDAwMDA6MDA6 MTYuNzogWzgwODY6MzQyY10gdHlwZSAwMCBjbGFzcyAweDA4ODAwMApbICAgIDEuOTcxMTE2 XSBwY2kgMDAwMDowMDoxNi43OiByZWcgMHgxMDogW21lbSAweGIxYTFjMDAwLTB4YjFhMWZm ZmYgNjRiaXRdClsgICAgMS45Nzg4MDVdIHBjaSAwMDAwOjAwOjFhLjA6IFs4MDg2OjNhMzdd IHR5cGUgMDAgY2xhc3MgMHgwYzAzMDAKWyAgICAxLjk4NTU0Nl0gcGNpIDAwMDA6MDA6MWEu MDogcmVnIDB4MjA6IFtpbyAgMHgyMGUwLTB4MjBmZl0KWyAgICAxLjk5MTg1Ml0gcGNpIDAw MDA6MDA6MWEuMDogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMS45OTgy MDFdIHBjaSAwMDAwOjAwOjFhLjE6IFs4MDg2OjNhMzhdIHR5cGUgMDAgY2xhc3MgMHgwYzAz MDAKWyAgICAyLjAwNDk0MV0gcGNpIDAwMDA6MDA6MWEuMTogcmVnIDB4MjA6IFtpbyAgMHgy MGMwLTB4MjBkZl0KWyAgICAyLjAxMTI0N10gcGNpIDAwMDA6MDA6MWEuMTogU3lzdGVtIHdh a2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMi4wMTc1OThdIHBjaSAwMDAwOjAwOjFhLjI6 IFs4MDg2OjNhMzldIHR5cGUgMDAgY2xhc3MgMHgwYzAzMDAKWyAgICAyLjAyNDMzOV0gcGNp IDAwMDA6MDA6MWEuMjogcmVnIDB4MjA6IFtpbyAgMHgyMGEwLTB4MjBiZl0KWyAgICAyLjAz MDY0OF0gcGNpIDAwMDA6MDA6MWEuMjogU3lzdGVtIHdha2V1cCBkaXNhYmxlZCBieSBBQ1BJ ClsgICAgMi4wMzcwMDRdIHBjaSAwMDAwOjAwOjFhLjc6IFs4MDg2OjNhM2NdIHR5cGUgMDAg Y2xhc3MgMHgwYzAzMjAKWyAgICAyLjA0MzcyNl0gcGNpIDAwMDA6MDA6MWEuNzogcmVnIDB4 MTA6IFttZW0gMHhiMWEyMjAwMC0weGIxYTIyM2ZmXQpbICAgIDIuMDUwODAyXSBwY2kgMDAw MDowMDoxYS43OiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90IEQzY29sZApbICAgIDIu MDU3NjY3XSBwY2kgMDAwMDowMDoxYS43OiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFD UEkKWyAgICAyLjA2NDAxOF0gcGNpIDAwMDA6MDA6MWMuMDogWzgwODY6M2E0MF0gdHlwZSAw MSBjbGFzcyAweDA2MDQwMApbICAgIDIuMDcwNzg4XSBwY2kgMDAwMDowMDoxYy4wOiBQTUUj IHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90IEQzY29sZApbICAgIDIuMDc3NjQwXSBwY2kgMDAw MDowMDoxYy4wOiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAyLjA4Mzk5 NF0gcGNpIDAwMDA6MDA6MWMuNDogWzgwODY6M2E0OF0gdHlwZSAwMSBjbGFzcyAweDA2MDQw MApbICAgIDIuMDkwNzY0XSBwY2kgMDAwMDowMDoxYy40OiBQTUUjIHN1cHBvcnRlZCBmcm9t IEQwIEQzaG90IEQzY29sZApbICAgIDIuMDk3NjE0XSBwY2kgMDAwMDowMDoxYy40OiBTeXN0 ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAyLjEwMzk2NV0gcGNpIDAwMDA6MDA6 MWMuNTogWzgwODY6M2E0YV0gdHlwZSAwMSBjbGFzcyAweDA2MDQwMApbICAgIDIuMTEwNzM1 XSBwY2kgMDAwMDowMDoxYy41OiBQTUUjIHN1cHBvcnRlZCBmcm9tIEQwIEQzaG90IEQzY29s ZApbICAgIDIuMTE3NTg2XSBwY2kgMDAwMDowMDoxYy41OiBTeXN0ZW0gd2FrZXVwIGRpc2Fi bGVkIGJ5IEFDUEkKWyAgICAyLjEyMzkzOF0gcGNpIDAwMDA6MDA6MWQuMDogWzgwODY6M2Ez NF0gdHlwZSAwMCBjbGFzcyAweDBjMDMwMApbICAgIDIuMTMwNjgwXSBwY2kgMDAwMDowMDox ZC4wOiByZWcgMHgyMDogW2lvICAweDIwODAtMHgyMDlmXQpbICAgIDIuMTM2OTc3XSBwY2kg MDAwMDowMDoxZC4wOiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAyLjE0 MzMyNl0gcGNpIDAwMDA6MDA6MWQuMTogWzgwODY6M2EzNV0gdHlwZSAwMCBjbGFzcyAweDBj MDMwMApbICAgIDIuMTUwMDY1XSBwY2kgMDAwMDowMDoxZC4xOiByZWcgMHgyMDogW2lvICAw eDIwNjAtMHgyMDdmXQpbICAgIDIuMTU2MzcwXSBwY2kgMDAwMDowMDoxZC4xOiBTeXN0ZW0g d2FrZXVwIGRpc2FibGVkIGJ5IEFDUEkKWyAgICAyLjE2MjcyMV0gcGNpIDAwMDA6MDA6MWQu MjogWzgwODY6M2EzNl0gdHlwZSAwMCBjbGFzcyAweDBjMDMwMApbICAgIDIuMTY5NDYyXSBw Y2kgMDAwMDowMDoxZC4yOiByZWcgMHgyMDogW2lvICAweDIwNDAtMHgyMDVmXQpbICAgIDIu MTc1NzY4XSBwY2kgMDAwMDowMDoxZC4yOiBTeXN0ZW0gd2FrZXVwIGRpc2FibGVkIGJ5IEFD UEkKWyAgICAyLjE4MjEyNF0gcGNpIDAwMDA6MDA6MWQuNzogWzgwODY6M2EzYV0gdHlwZSAw MCBjbGFzcyAweDBjMDMyMApbICAgIDIuMTg4ODQ3XSBwY2kgMDAwMDowMDoxZC43OiByZWcg MHgxMDogW21lbSAweGIxYTIxMDAwLTB4YjFhMjEzZmZdClsgICAgMi4xOTU5MjRdIHBjaSAw MDAwOjAwOjFkLjc6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAg Mi4yMDI3ODddIHBjaSAwMDAwOjAwOjFkLjc6IFN5c3RlbSB3YWtldXAgZGlzYWJsZWQgYnkg QUNQSQpbICAgIDIuMjA5MTM2XSBwY2kgMDAwMDowMDoxZS4wOiBbODA4NjoyNDRlXSB0eXBl IDAxIGNsYXNzIDB4MDYwNDAxClsgICAgMi4yMTU5MjNdIHBjaSAwMDAwOjAwOjFlLjA6IFN5 c3RlbSB3YWtldXAgZGlzYWJsZWQgYnkgQUNQSQpbICAgIDIuMjIyMjc2XSBwY2kgMDAwMDow MDoxZi4wOiBbODA4NjozYTE2XSB0eXBlIDAwIGNsYXNzIDB4MDYwMTAwClsgICAgMi4yMjkw NTJdIHBjaSAwMDAwOjAwOjFmLjA6IGNhbid0IGNsYWltIEJBUiAxMyBbaW8gIDB4MDQwMC0w eDA0N2ZdOiBhZGRyZXNzIGNvbmZsaWN0IHdpdGggQUNQSSBDUFUgdGhyb3R0bGUgW2lvICAw eDA0MTAtMHgwNDE1XQpbICAgIDIuMjQyMDYzXSBwY2kgMDAwMDowMDoxZi4wOiBxdWlyazog W2lvICAweDA1MDAtMHgwNTNmXSBjbGFpbWVkIGJ5IElDSDYgR1BJTwpbICAgIDIuMjUwMDMw XSBwY2kgMDAwMDowMDoxZi4wOiBJQ0g3IExQQyBHZW5lcmljIElPIGRlY29kZSAxIFBJTyBh dCAwNjgwIChtYXNrIDAwMGYpClsgICAgMi4yNTg0ODFdIHBjaSAwMDAwOjAwOjFmLjA6IElD SDcgTFBDIEdlbmVyaWMgSU8gZGVjb2RlIDIgUElPIGF0IDBjYTAgKG1hc2sgMDAwZikKWyAg ICAyLjI2NjkzM10gcGNpIDAwMDA6MDA6MWYuMDogSUNINyBMUEMgR2VuZXJpYyBJTyBkZWNv ZGUgMyBQSU8gYXQgMDYwMCAobWFzayAwMDFmKQpbICAgIDIuMjc1NDc5XSBwY2kgMDAwMDow MDoxZi4yOiBbODA4NjozYTIyXSB0eXBlIDAwIGNsYXNzIDB4MDEwNjAxClsgICAgMi4yODIx OTldIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAweDEwOiBbaW8gIDB4MjEwOC0weDIxMGZdClsg ICAgMi4yODg0MjRdIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAweDE0OiBbaW8gIDB4MjExNC0w eDIxMTddClsgICAgMi4yOTQ2NDhdIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAweDE4OiBbaW8g IDB4MjEwMC0weDIxMDddClsgICAgMi4zMDA4NzNdIHBjaSAwMDAwOjAwOjFmLjI6IHJlZyAw eDFjOiBbaW8gIDB4MjExMC0weDIxMTNdClsgICAgMi4zMDcwOTldIHBjaSAwMDAwOjAwOjFm LjI6IHJlZyAweDIwOiBbaW8gIDB4MjAyMC0weDIwM2ZdClsgICAgMi4zMTMzMjRdIHBjaSAw MDAwOjAwOjFmLjI6IHJlZyAweDI0OiBbbWVtIDB4YjFhMjAwMDAtMHhiMWEyMDdmZl0KWyAg ICAyLjMyMDM2MF0gcGNpIDAwMDA6MDA6MWYuMjogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEM2hv dApbICAgIDIuMzI2MjY3XSBwY2kgMDAwMDowMDoxZi4zOiBbODA4NjozYTMwXSB0eXBlIDAw IGNsYXNzIDB4MGMwNTAwClsgICAgMi4zMzI5ODRdIHBjaSAwMDAwOjAwOjFmLjM6IHJlZyAw eDEwOiBbbWVtIDB4YjFhMjMwMDAtMHhiMWEyMzBmZiA2NGJpdF0KWyAgICAyLjM0MDU3OF0g cGNpIDAwMDA6MDA6MWYuMzogcmVnIDB4MjA6IFtpbyAgMHgyMDAwLTB4MjAxZl0KWyAgICAy LjM0NjkzN10gcGNpIDAwMDA6MDE6MDAuMDogWzgwODY6MTBhN10gdHlwZSAwMCBjbGFzcyAw eDAyMDAwMApbICAgIDIuMzUzNjU1XSBwY2kgMDAwMDowMTowMC4wOiByZWcgMHgxMDogW21l bSAweGIxOTIwMDAwLTB4YjE5M2ZmZmZdClsgICAgMi4zNjA2NjVdIHBjaSAwMDAwOjAxOjAw LjA6IHJlZyAweDE4OiBbaW8gIDB4MTAyMC0weDEwM2ZdClsgICAgMi4zNjY4OTJdIHBjaSAw MDAwOjAxOjAwLjA6IHJlZyAweDFjOiBbbWVtIDB4YjE5NDQwMDAtMHhiMTk0N2ZmZl0KWyAg ICAyLjM3Mzk1NF0gcGNpIDAwMDA6MDE6MDAuMDogUE1FIyBzdXBwb3J0ZWQgZnJvbSBEMCBE M2hvdCBEM2NvbGQKWyAgICAyLjM4MDc3OV0gcGNpIDAwMDA6MDE6MDAuMDogU3lzdGVtIHdh a2V1cCBkaXNhYmxlZCBieSBBQ1BJClsgICAgMi4zODcxMzRdIHBjaSAwMDAwOjAxOjAwLjE6 IFs4MDg2OjEwYTddIHR5cGUgMDAgY2xhc3MgMHgwMjAwMDAKWyAgICAyLjM5Mzg1MV0gcGNp IDAwMDA6MDE6MDAuMTogcmVnIDB4MTA6IFttZW0gMHhiMTkwMDAwMC0weGIxOTFmZmZmXQpb ICAgIDIuNDAwODU4XSBwY2kgMDAwMDowMTowMC4xOiByZWcgMHgxODogW2lvICAweDEwMDAt MHgxMDFmXQpbICAgIDIuNDA3MDc0XSBwY2kgMDAwMDowMTowMC4xOiByZWcgMHgxYzogW21l bSAweGIxOTQwMDAwLTB4YjE5NDNmZmZdClsgICAgMi40MTQxMzVdIHBjaSAwMDAwOjAxOjAw LjE6IFBNRSMgc3VwcG9ydGVkIGZyb20gRDAgRDNob3QgRDNjb2xkClsgICAgMi40MjA5NTld IHBjaSAwMDAwOjAxOjAwLjE6IFN5c3RlbSB3YWtldXAgZGlzYWJsZWQgYnkgQUNQSQpbICAg IDIuNDI3NzU3XSBwY2kgMDAwMDowMDowMS4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDFdClsg ICAgMi40MzMzMDBdIHBjaSAwMDAwOjAwOjAxLjA6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4 MTAwMC0weDFmZmZdClsgICAgMi40NDAxMDRdIHBjaSAwMDAwOjAwOjAxLjA6ICAgYnJpZGdl IHdpbmRvdyBbbWVtIDB4YjE5MDAwMDAtMHhiMTlmZmZmZl0KWyAgICAyLjQ0NzcyNF0gcGNp IDAwMDA6MDA6MDMuMDogUENJIGJyaWRnZSB0byBbYnVzIDAyXQpbICAgIDIuNDUzMzA1XSBw Y2kgMDAwMDowMDowNS4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDNdClsgICAgMi40NTg4ODdd IHBjaSAwMDAwOjAwOjA3LjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwNF0KWyAgICAyLjQ2NDQ4 OV0gcGNpIDAwMDA6MDA6MDkuMDogUENJIGJyaWRnZSB0byBbYnVzIDA1XQpbICAgIDIuNDcw MDczXSBwY2kgMDAwMDowMDowYS4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDZdClsgICAgMi40 NzU2NjddIHBjaSAwMDAwOjAwOjFjLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwN10KWyAgICAy LjQ4MTIxMF0gcGNpIDAwMDA6MDA6MWMuMDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHgzMDAw LTB4M2ZmZl0KWyAgICAyLjQ4ODAxNV0gcGNpIDAwMDA6MDA6MWMuMDogICBicmlkZ2Ugd2lu ZG93IFttZW0gMHhiMWIwMDAwMC0weGIxY2ZmZmZmXQpbICAgIDIuNDk1NTk3XSBwY2kgMDAw MDowMDoxYy4wOiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGIxZDAwMDAwLTB4YjFlZmZmZmYg NjRiaXQgcHJlZl0KWyAgICAyLjUwNDMwOF0gcGNpIDAwMDA6MDg6MDAuMDogWzEwMmI6MDUy Ml0gdHlwZSAwMCBjbGFzcyAweDAzMDAwMApbICAgIDIuNTExMDMzXSBwY2kgMDAwMDowODow MC4wOiByZWcgMHgxMDogW21lbSAweGIwMDAwMDAwLTB4YjBmZmZmZmYgcHJlZl0KWyAgICAy LjUxODUyNV0gcGNpIDAwMDA6MDg6MDAuMDogcmVnIDB4MTQ6IFttZW0gMHhiMTgwMDAwMC0w eGIxODAzZmZmXQpbICAgIDIuNTI1NTMyXSBwY2kgMDAwMDowODowMC4wOiByZWcgMHgxODog W21lbSAweGIxMDAwMDAwLTB4YjE3ZmZmZmZdClsgICAgMi41MzI1NjZdIHBjaSAwMDAwOjA4 OjAwLjA6IHJlZyAweDMwOiBbbWVtIDB4ZmZmZjAwMDAtMHhmZmZmZmZmZiBwcmVmXQpbICAg IDIuNTQxNjc1XSBwY2kgMDAwMDowMDoxYy40OiBQQ0kgYnJpZGdlIHRvIFtidXMgMDhdClsg ICAgMi41NDcyMTldIHBjaSAwMDAwOjAwOjFjLjQ6ICAgYnJpZGdlIHdpbmRvdyBbaW8gIDB4 NDAwMC0weDRmZmZdClsgICAgMi41NTQwMTRdIHBjaSAwMDAwOjAwOjFjLjQ6ICAgYnJpZGdl IHdpbmRvdyBbbWVtIDB4YjEwMDAwMDAtMHhiMThmZmZmZl0KWyAgICAyLjU2MTU5Nl0gcGNp IDAwMDA6MDA6MWMuNDogICBicmlkZ2Ugd2luZG93IFttZW0gMHhiMDAwMDAwMC0weGIwZmZm ZmZmIDY0Yml0IHByZWZdClsgICAgMi41NzAyODRdIHBjaSAwMDAwOjAwOjFjLjU6IFBDSSBi cmlkZ2UgdG8gW2J1cyAwOV0KWyAgICAyLjU3NTgyNl0gcGNpIDAwMDA6MDA6MWMuNTogICBi cmlkZ2Ugd2luZG93IFtpbyAgMHg1MDAwLTB4NWZmZl0KWyAgICAyLjU4MjYzMF0gcGNpIDAw MDA6MDA6MWMuNTogICBicmlkZ2Ugd2luZG93IFttZW0gMHhiMWYwMDAwMC0weGIyMGZmZmZm XQpbICAgIDIuNTkwMjEyXSBwY2kgMDAwMDowMDoxYy41OiAgIGJyaWRnZSB3aW5kb3cgW21l bSAweGIyMTAwMDAwLTB4YjIyZmZmZmYgNjRiaXQgcHJlZl0KWyAgICAyLjU5ODkxNV0gcGNp IDAwMDA6MDA6MWUuMDogUENJIGJyaWRnZSB0byBbYnVzIDBhXSAoc3VidHJhY3RpdmUgZGVj b2RlKQpbICAgIDIuNjA2NTAwXSBwY2kgMDAwMDowMDoxZS4wOiAgIGJyaWRnZSB3aW5kb3cg W2lvICAweDAwMDAtMHgwY2Y3XSAoc3VidHJhY3RpdmUgZGVjb2RlKQpbICAgIDIuNjE1MzM4 XSBwY2kgMDAwMDowMDoxZS4wOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweDBkMDAtMHhmZmZm XSAoc3VidHJhY3RpdmUgZGVjb2RlKQpbICAgIDIuNjI0MTc3XSBwY2kgMDAwMDowMDoxZS4w OiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweDAwMGEwMDAwLTB4MDAwYmZmZmZdIChzdWJ0cmFj dGl2ZSBkZWNvZGUpClsgICAgMi42MzM3OTFdIHBjaSAwMDAwOjAwOjFlLjA6ICAgYnJpZGdl IHdpbmRvdyBbbWVtIDB4ZmVkNDAwMDAtMHhmZWRmZmZmZl0gKHN1YnRyYWN0aXZlIGRlY29k ZSkKWyAgICAyLjY0MzQwNF0gcGNpIDAwMDA6MDA6MWUuMDogICBicmlkZ2Ugd2luZG93IFtt ZW0gMHhiMDAwMDAwMC0weGZkZmZmZmZmXSAoc3VidHJhY3RpdmUgZGVjb2RlKQpbICAgIDIu NjUzMDYzXSBhY3BpIFBOUDBBMDg6MDA6IERpc2FibGluZyBBU1BNIChGQURUIGluZGljYXRl cyBpdCBpcyB1bnN1cHBvcnRlZCkKWyAgICAyLjY2MTIyNl0gQUNQSTogUENJIEludGVycnVw dCBMaW5rIFtMTktBXSAoSVJRcyAzIDQgNSA2IDcgOSAxMCAxMSAxMiAxNCAxNSkgKjAsIGRp c2FibGVkLgpbICAgIDIuNjcwNzQxXSBBQ1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0Jd IChJUlFzIDMgNCA1IDYgNyA5IDEwIDExIDEyIDE0IDE1KSAqMCwgZGlzYWJsZWQuClsgICAg Mi42ODAyNTNdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5LQ10gKElSUXMgMyA0IDUg NiA3IDkgMTAgMTEgMTIgMTQgMTUpICowLCBkaXNhYmxlZC4KWyAgICAyLjY4OTc2NF0gQUNQ STogUENJIEludGVycnVwdCBMaW5rIFtMTktEXSAoSVJRcyAzIDQgNSA2IDcgOSAxMCAxMSAx MiAxNCAxNSkgKjAsIGRpc2FibGVkLgpbICAgIDIuNjk5MjczXSBBQ1BJOiBQQ0kgSW50ZXJy dXB0IExpbmsgW0xOS0VdIChJUlFzIDMgNCA1IDYgNyA5IDEwIDExIDEyIDE0IDE1KSAqMCwg ZGlzYWJsZWQuClsgICAgMi43MDg3ODBdIEFDUEk6IFBDSSBJbnRlcnJ1cHQgTGluayBbTE5L Rl0gKElSUXMgMyA0IDUgNiA3IDkgMTAgMTEgMTIgMTQgMTUpICowLCBkaXNhYmxlZC4KWyAg ICAyLjcxODI4OF0gQUNQSTogUENJIEludGVycnVwdCBMaW5rIFtMTktHXSAoSVJRcyAzIDQg NSA2IDcgOSAxMCAxMSAxMiAxNCAxNSkgKjAsIGRpc2FibGVkLgpbICAgIDIuNzI3Nzk0XSBB Q1BJOiBQQ0kgSW50ZXJydXB0IExpbmsgW0xOS0hdIChJUlFzIDMgNCA1IDYgNyA5IDEwIDEx IDEyIDE0IDE1KSAqMCwgZGlzYWJsZWQuClsgICAgMi43MzcyOTVdIElPQVBJQ1swXTogU2V0 IHJvdXRpbmcgZW50cnkgKDgtMTMgLT4gMHgzZCAtPiBJUlEgMTMgTW9kZTowIEFjdGl2ZTow IERlc3Q6MCkKWyAgICAyLjc0NjU1Nl0gQUNQSTogRW5hYmxlZCAxIEdQRXMgaW4gYmxvY2sg MDAgdG8gM0YKWyAgICAyLjc1MjAzNl0gdmdhYXJiOiBzZXR0aW5nIGFzIGJvb3QgZGV2aWNl OiBQQ0k6MDAwMDowODowMC4wClsgICAgMi43NTgzNTZdIHZnYWFyYjogZGV2aWNlIGFkZGVk OiBQQ0k6MDAwMDowODowMC4wLGRlY29kZXM9aW8rbWVtLG93bnM9aW8rbWVtLGxvY2tzPW5v bmUKWyAgICAyLjc2NzM5MF0gdmdhYXJiOiBsb2FkZWQKWyAgICAyLjc3MDQwOV0gdmdhYXJi OiBicmlkZ2UgY29udHJvbCBwb3NzaWJsZSAwMDAwOjA4OjAwLjAKWyAgICAyLjc3NjQyM10g U0NTSSBzdWJzeXN0ZW0gaW5pdGlhbGl6ZWQKWyAgICAyLjc4MDYzM10gQUNQSTogYnVzIHR5 cGUgVVNCIHJlZ2lzdGVyZWQKWyAgICAyLjc4NTEyNl0gdXNiY29yZTogcmVnaXN0ZXJlZCBu ZXcgaW50ZXJmYWNlIGRyaXZlciB1c2JmcwpbICAgIDIuNzkxMjU2XSB1c2Jjb3JlOiByZWdp c3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGh1YgpbICAgIDIuNzk3MjM0XSB1c2Jjb3Jl OiByZWdpc3RlcmVkIG5ldyBkZXZpY2UgZHJpdmVyIHVzYgpbICAgIDIuODAyODkyXSBwcHNf Y29yZTogTGludXhQUFMgQVBJIHZlci4gMSByZWdpc3RlcmVkClsgICAgMi44MDg0MzNdIHBw c19jb3JlOiBTb2Z0d2FyZSB2ZXIuIDUuMy42IC0gQ29weXJpZ2h0IDIwMDUtMjAwNyBSb2Rv bGZvIEdpb21ldHRpIDxnaW9tZXR0aUBsaW51eC5pdD4KWyAgICAyLjgxODYzM10gUFRQIGNs b2NrIHN1cHBvcnQgcmVnaXN0ZXJlZApbICAgIDIuODIzMTQwXSBQQ0k6IFVzaW5nIEFDUEkg Zm9yIElSUSByb3V0aW5nClsgICAgMi44MzI5MDFdIFBDSTogRGlzY292ZXJlZCBwZWVyIGJ1 cyBmZQpbICAgIDIuODM3MTgwXSBQQ0k6IHJvb3QgYnVzIGZlOiB1c2luZyBkZWZhdWx0IHJl c291cmNlcwpbICAgIDIuODQyODE3XSBQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMg ZmUpClsgICAgMi44NDc3OTddIFBDSSBob3N0IGJyaWRnZSB0byBidXMgMDAwMDpmZQpbICAg IDIuODUyMzY4XSBwY2lfYnVzIDAwMDA6ZmU6IHJvb3QgYnVzIHJlc291cmNlIFtpbyAgMHgw MDAwLTB4ZmZmZl0KWyAgICAyLjg1OTI2N10gcGNpX2J1cyAwMDAwOmZlOiByb290IGJ1cyBy ZXNvdXJjZSBbbWVtIDB4MDAwMDAwMDAtMHhmZmZmZmZmZmZmXQpbICAgIDIuODY3MTM1XSBw Y2lfYnVzIDAwMDA6ZmU6IE5vIGJ1c24gcmVzb3VyY2UgZm91bmQgZm9yIHJvb3QgYnVzLCB3 aWxsIHVzZSBbYnVzIGZlLWZmXQpbICAgIDIuODc1OTc3XSBwY2kgMDAwMDpmZTowMC4wOiBb ODA4NjoyYzQwXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMi44ODI3MjJdIHBjaSAw MDAwOmZlOjAwLjE6IFs4MDg2OjJjMDFdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAy Ljg4OTQ2MV0gcGNpIDAwMDA6ZmU6MDIuMDogWzgwODY6MmMxMF0gdHlwZSAwMCBjbGFzcyAw eDA2MDAwMApbICAgIDIuODk2MTk3XSBwY2kgMDAwMDpmZTowMi4xOiBbODA4NjoyYzExXSB0 eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMi45MDI5MzRdIHBjaSAwMDAwOmZlOjAyLjQ6 IFs4MDg2OjJjMTRdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAyLjkwOTY3MF0gcGNp IDAwMDA6ZmU6MDIuNTogWzgwODY6MmMxNV0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAg IDIuOTE2NDA3XSBwY2kgMDAwMDpmZTowMy4wOiBbODA4NjoyYzE4XSB0eXBlIDAwIGNsYXNz IDB4MDYwMDAwClsgICAgMi45MjMxNDRdIHBjaSAwMDAwOmZlOjAzLjE6IFs4MDg2OjJjMTld IHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAyLjkyOTg3OV0gcGNpIDAwMDA6ZmU6MDMu MjogWzgwODY6MmMxYV0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDIuOTM2NjE2XSBw Y2kgMDAwMDpmZTowMy40OiBbODA4NjoyYzFjXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsg ICAgMi45NDMzNTNdIHBjaSAwMDAwOmZlOjA0LjA6IFs4MDg2OjJjMjBdIHR5cGUgMDAgY2xh c3MgMHgwNjAwMDAKWyAgICAyLjk1MDA4OV0gcGNpIDAwMDA6ZmU6MDQuMTogWzgwODY6MmMy MV0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDIuOTU2ODI0XSBwY2kgMDAwMDpmZTow NC4yOiBbODA4NjoyYzIyXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMi45NjM1NjFd IHBjaSAwMDAwOmZlOjA0LjM6IFs4MDg2OjJjMjNdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAK WyAgICAyLjk3MDI5OV0gcGNpIDAwMDA6ZmU6MDUuMDogWzgwODY6MmMyOF0gdHlwZSAwMCBj bGFzcyAweDA2MDAwMApbICAgIDIuOTc3MDM1XSBwY2kgMDAwMDpmZTowNS4xOiBbODA4Njoy YzI5XSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMi45ODM3NjhdIHBjaSAwMDAwOmZl OjA1LjI6IFs4MDg2OjJjMmFdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAyLjk5MDQ5 NV0gcGNpIDAwMDA6ZmU6MDUuMzogWzgwODY6MmMyYl0gdHlwZSAwMCBjbGFzcyAweDA2MDAw MApbICAgIDIuOTk3MjMzXSBwY2kgMDAwMDpmZTowNi4wOiBbODA4NjoyYzMwXSB0eXBlIDAw IGNsYXNzIDB4MDYwMDAwClsgICAgMy4wMDM5NjldIHBjaSAwMDAwOmZlOjA2LjE6IFs4MDg2 OjJjMzFdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAzLjAxMDcwOF0gcGNpIDAwMDA6 ZmU6MDYuMjogWzgwODY6MmMzMl0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDMuMDE3 NDQ2XSBwY2kgMDAwMDpmZTowNi4zOiBbODA4NjoyYzMzXSB0eXBlIDAwIGNsYXNzIDB4MDYw MDAwClsgICAgMy4wMjQxOTJdIHBjaV9idXMgMDAwMDpmZTogYnVzbl9yZXM6IFtidXMgZmUt ZmZdIGVuZCBpcyB1cGRhdGVkIHRvIGZlClsgICAgMy4wMzE1NzldIFBDSTogRGlzY292ZXJl ZCBwZWVyIGJ1cyBmZgpbICAgIDMuMDM1ODU3XSBQQ0k6IHJvb3QgYnVzIGZmOiB1c2luZyBk ZWZhdWx0IHJlc291cmNlcwpbICAgIDMuMDQxNDk1XSBQQ0k6IFByb2JpbmcgUENJIGhhcmR3 YXJlIChidXMgZmYpClsgICAgMy4wNDY0NjldIFBDSSBob3N0IGJyaWRnZSB0byBidXMgMDAw MDpmZgpbICAgIDMuMDUxMDQxXSBwY2lfYnVzIDAwMDA6ZmY6IHJvb3QgYnVzIHJlc291cmNl IFtpbyAgMHgwMDAwLTB4ZmZmZl0KWyAgICAzLjA1NzkzOF0gcGNpX2J1cyAwMDAwOmZmOiBy b290IGJ1cyByZXNvdXJjZSBbbWVtIDB4MDAwMDAwMDAtMHhmZmZmZmZmZmZmXQpbICAgIDMu MDY1ODA1XSBwY2lfYnVzIDAwMDA6ZmY6IE5vIGJ1c24gcmVzb3VyY2UgZm91bmQgZm9yIHJv b3QgYnVzLCB3aWxsIHVzZSBbYnVzIGZmLWZmXQpbICAgIDMuMDc0NjQ1XSBwY2kgMDAwMDpm ZjowMC4wOiBbODA4NjoyYzQwXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMy4wODEz ODRdIHBjaSAwMDAwOmZmOjAwLjE6IFs4MDg2OjJjMDFdIHR5cGUgMDAgY2xhc3MgMHgwNjAw MDAKWyAgICAzLjA4ODEyNF0gcGNpIDAwMDA6ZmY6MDIuMDogWzgwODY6MmMxMF0gdHlwZSAw MCBjbGFzcyAweDA2MDAwMApbICAgIDMuMDk0ODYyXSBwY2kgMDAwMDpmZjowMi4xOiBbODA4 NjoyYzExXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMy4xMDE2MDBdIHBjaSAwMDAw OmZmOjAyLjQ6IFs4MDg2OjJjMTRdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAzLjEw ODMzOF0gcGNpIDAwMDA6ZmY6MDIuNTogWzgwODY6MmMxNV0gdHlwZSAwMCBjbGFzcyAweDA2 MDAwMApbICAgIDMuMTE1MDc2XSBwY2kgMDAwMDpmZjowMy4wOiBbODA4NjoyYzE4XSB0eXBl IDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMy4xMjE4MTRdIHBjaSAwMDAwOmZmOjAzLjE6IFs4 MDg2OjJjMTldIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAzLjEyODU1M10gcGNpIDAw MDA6ZmY6MDMuMjogWzgwODY6MmMxYV0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDMu MTM1MjkxXSBwY2kgMDAwMDpmZjowMy40OiBbODA4NjoyYzFjXSB0eXBlIDAwIGNsYXNzIDB4 MDYwMDAwClsgICAgMy4xNDIwMzBdIHBjaSAwMDAwOmZmOjA0LjA6IFs4MDg2OjJjMjBdIHR5 cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAzLjE0ODc2OF0gcGNpIDAwMDA6ZmY6MDQuMTog WzgwODY6MmMyMV0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDMuMTU1NTA1XSBwY2kg MDAwMDpmZjowNC4yOiBbODA4NjoyYzIyXSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAg My4xNjIyNDNdIHBjaSAwMDAwOmZmOjA0LjM6IFs4MDg2OjJjMjNdIHR5cGUgMDAgY2xhc3Mg MHgwNjAwMDAKWyAgICAzLjE2ODk4NF0gcGNpIDAwMDA6ZmY6MDUuMDogWzgwODY6MmMyOF0g dHlwZSAwMCBjbGFzcyAweDA2MDAwMApbICAgIDMuMTc1NzIzXSBwY2kgMDAwMDpmZjowNS4x OiBbODA4NjoyYzI5XSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMy4xODI0NjJdIHBj aSAwMDAwOmZmOjA1LjI6IFs4MDg2OjJjMmFdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAg ICAzLjE4OTE5OV0gcGNpIDAwMDA6ZmY6MDUuMzogWzgwODY6MmMyYl0gdHlwZSAwMCBjbGFz cyAweDA2MDAwMApbICAgIDMuMTk1OTM5XSBwY2kgMDAwMDpmZjowNi4wOiBbODA4NjoyYzMw XSB0eXBlIDAwIGNsYXNzIDB4MDYwMDAwClsgICAgMy4yMDI2ODNdIHBjaSAwMDAwOmZmOjA2 LjE6IFs4MDg2OjJjMzFdIHR5cGUgMDAgY2xhc3MgMHgwNjAwMDAKWyAgICAzLjIwOTQyMV0g cGNpIDAwMDA6ZmY6MDYuMjogWzgwODY6MmMzMl0gdHlwZSAwMCBjbGFzcyAweDA2MDAwMApb ICAgIDMuMjE2MTU4XSBwY2kgMDAwMDpmZjowNi4zOiBbODA4NjoyYzMzXSB0eXBlIDAwIGNs YXNzIDB4MDYwMDAwClsgICAgMy4yMjI5MDddIHBjaV9idXMgMDAwMDpmZjogYnVzbl9yZXM6 IFtidXMgZmZdIGVuZCBpcyB1cGRhdGVkIHRvIGZmClsgICAgMy4yMzAwMDJdIFBDSTogcGNp X2NhY2hlX2xpbmVfc2l6ZSBzZXQgdG8gNjQgYnl0ZXMKWyAgICAzLjIzNTYzOF0gZTgyMDog cmVzZXJ2ZSBSQU0gYnVmZmVyIFttZW0gMHgwMDA5YTQwMC0weDAwMDlmZmZmXQpbICAgIDMu MjQyMzQ0XSBlODIwOiByZXNlcnZlIFJBTSBidWZmZXIgW21lbSAweDhjNTU2MDAwLTB4OGZm ZmZmZmZdClsgICAgMy4yNDkxNDRdIE5ldExhYmVsOiBJbml0aWFsaXppbmcKWyAgICAzLjI1 MjkzOV0gTmV0TGFiZWw6ICBkb21haW4gaGFzaCBzaXplID0gMTI4ClsgICAgMy4yNTc3OTld IE5ldExhYmVsOiAgcHJvdG9jb2xzID0gVU5MQUJFTEVEIENJUFNPdjQKWyAgICAzLjI2MzM1 MF0gTmV0TGFiZWw6ICB1bmxhYmVsZWQgdHJhZmZpYyBhbGxvd2VkIGJ5IGRlZmF1bHQKWyAg ICAzLjI2OTY4MV0gSFBFVDogNCB0aW1lcnMgaW4gdG90YWwsIDAgdGltZXJzIHdpbGwgYmUg dXNlZCBmb3IgcGVyLWNwdSB0aW1lcgpbICAgIDMuMjc3NTUyXSBocGV0MDogYXQgTU1JTyAw eGZlZDAwMDAwLCBJUlFzIDIsIDgsIDAsIDAKWyAgICAzLjI4MzMzNF0gaHBldDA6IDQgY29t cGFyYXRvcnMsIDY0LWJpdCAxNC4zMTgxODAgTUh6IGNvdW50ZXIKWyAgICAzLjI5MjQzNV0g U3dpdGNoZWQgdG8gY2xvY2tzb3VyY2UgaHBldApbICAgIDMuMzA1MTAwXSBwbnA6IFBuUCBB Q1BJIGluaXQKWyAgICAzLjMwODY5NV0gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAo OC04IC0+IDB4MzggLT4gSVJRIDggTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAzLjMx NzU1Nl0gcG5wIDAwOjAwOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMGIw MCAoYWN0aXZlKQpbICAgIDMuMzI0OTQ5XSBzeXN0ZW0gMDA6MDE6IFtpbyAgMHgwNTAwLTB4 MDU3Zl0gY291bGQgbm90IGJlIHJlc2VydmVkClsgICAgMy4zMzE5NTBdIHN5c3RlbSAwMDow MTogW2lvICAweDA0MDAtMHgwNDdmXSBjb3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAzLjMz ODk0OF0gc3lzdGVtIDAwOjAxOiBbaW8gIDB4MDgwMC0weDA4MWZdIGhhcyBiZWVuIHJlc2Vy dmVkClsgICAgMy4zNDU1NTBdIHN5c3RlbSAwMDowMTogW2lvICAweDBjYTItMHgwY2EzXSBo YXMgYmVlbiByZXNlcnZlZApbICAgIDMuMzUyMTUwXSBzeXN0ZW0gMDA6MDE6IFtpbyAgMHgw NjAwLTB4MDYxZl0gaGFzIGJlZW4gcmVzZXJ2ZWQKWyAgICAzLjM1ODc2MF0gc3lzdGVtIDAw OjAxOiBbaW8gIDB4MDg4MC0weDA4ODNdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy4zNjUz NzBdIHN5c3RlbSAwMDowMTogW2lvICAweDBjYTQtMHgwY2E1XSBoYXMgYmVlbiByZXNlcnZl ZApbICAgIDMuMzcxOTcyXSBzeXN0ZW0gMDA6MDE6IFttZW0gMHhmZWQxYzAwMC0weGZlZDNm ZmZlXSBjb3VsZCBub3QgYmUgcmVzZXJ2ZWQKWyAgICAzLjM3OTczOF0gc3lzdGVtIDAwOjAx OiBbbWVtIDB4ZmYwMDAwMDAtMHhmZmZmZmZmZl0gY291bGQgbm90IGJlIHJlc2VydmVkClsg ICAgMy4zODc1MTJdIHN5c3RlbSAwMDowMTogW21lbSAweGZlZTAwMDAwLTB4ZmVlZmZmZmZd IGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy4zOTQ4OTZdIHN5c3RlbSAwMDowMTogW21lbSAw eGZlOTAwMDAwLTB4ZmU5MDAwMWZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy40MDIyODJd IHN5c3RlbSAwMDowMTogW21lbSAweGZlYTAwMDAwLTB4ZmVhMDAwMWZdIGhhcyBiZWVuIHJl c2VydmVkClsgICAgMy40MDk2NjldIHN5c3RlbSAwMDowMTogW21lbSAweGZlZDFiMDAwLTB4 ZmVkMWJmZmZdIGhhcyBiZWVuIHJlc2VydmVkClsgICAgMy40MTcwNTBdIHN5c3RlbSAwMDow MTogUGx1ZyBhbmQgUGxheSBBQ1BJIGRldmljZSwgSURzIFBOUDBjMDIgKGFjdGl2ZSkKWyAg ICAzLjQyNDczM10gSU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC0zIC0+IDB4MzMg LT4gSVJRIDMgTW9kZTowIEFjdGl2ZTowIERlc3Q6MCkKWyAgICAzLjQzMzYxMV0gcG5wIDAw OjAyOiBQbHVnIGFuZCBQbGF5IEFDUEkgZGV2aWNlLCBJRHMgUE5QMDUwMSAoYWN0aXZlKQpb ICAgIDMuNDQwOTQ4XSBwbnAgMDA6MDM6IFBsdWcgYW5kIFBsYXkgQUNQSSBkZXZpY2UsIElE cyBJUEkwMDAxIChhY3RpdmUpClsgICAgMy40NDgyNzNdIHBucDogUG5QIEFDUEk6IGZvdW5k IDQgZGV2aWNlcwpbICAgIDMuNDU4OTM1XSBwY2kgMDAwMDowODowMC4wOiBjYW4ndCBjbGFp bSBCQVIgNiBbbWVtIDB4ZmZmZjAwMDAtMHhmZmZmZmZmZiBwcmVmXTogbm8gY29tcGF0aWJs ZSBicmlkZ2Ugd2luZG93ClsgICAgMy40NzAwNThdIHBjaSAwMDAwOjAwOjFmLjA6IEJBUiAx MzogW2lvICAweDA0MDAtMHgwNDdmXSBoYXMgYm9ndXMgYWxpZ25tZW50ClsgICAgMy40Nzgw MjhdIHBjaSAwMDAwOjAwOjAxLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwMV0KWyAgICAzLjQ4 MzU3Ml0gcGNpIDAwMDA6MDA6MDEuMDogICBicmlkZ2Ugd2luZG93IFtpbyAgMHgxMDAwLTB4 MWZmZl0KWyAgICAzLjQ5MDM3N10gcGNpIDAwMDA6MDA6MDEuMDogICBicmlkZ2Ugd2luZG93 IFttZW0gMHhiMTkwMDAwMC0weGIxOWZmZmZmXQpbICAgIDMuNDk3OTYwXSBwY2kgMDAwMDow MDowMy4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDJdClsgICAgMy41MDM1MDldIHBjaSAwMDAw OjAwOjA1LjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwM10KWyAgICAzLjUwOTA1OF0gcGNpIDAw MDA6MDA6MDcuMDogUENJIGJyaWRnZSB0byBbYnVzIDA0XQpbICAgIDMuNTE0NjA2XSBwY2kg MDAwMDowMDowOS4wOiBQQ0kgYnJpZGdlIHRvIFtidXMgMDVdClsgICAgMy41MjAxNTJdIHBj aSAwMDAwOjAwOjBhLjA6IFBDSSBicmlkZ2UgdG8gW2J1cyAwNl0KWyAgICAzLjUyNTY5OV0g cGNpIDAwMDA6MDA6MWMuMDogUENJIGJyaWRnZSB0byBbYnVzIDA3XQpbICAgIDMuNTMxMjQw XSBwY2kgMDAwMDowMDoxYy4wOiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweDMwMDAtMHgzZmZm XQpbICAgIDMuNTM4MDQ2XSBwY2kgMDAwMDowMDoxYy4wOiAgIGJyaWRnZSB3aW5kb3cgW21l bSAweGIxYjAwMDAwLTB4YjFjZmZmZmZdClsgICAgMy41NDU2MjldIHBjaSAwMDAwOjAwOjFj LjA6ICAgYnJpZGdlIHdpbmRvdyBbbWVtIDB4YjFkMDAwMDAtMHhiMWVmZmZmZiA2NGJpdCBw cmVmXQpbICAgIDMuNTU0MjgyXSBwY2kgMDAwMDowODowMC4wOiBCQVIgNjogYXNzaWduZWQg W21lbSAweGIxODEwMDAwLTB4YjE4MWZmZmYgcHJlZl0KWyAgICAzLjU2MjM0Nl0gcGNpIDAw MDA6MDA6MWMuNDogUENJIGJyaWRnZSB0byBbYnVzIDA4XQpbICAgIDMuNTY3ODg5XSBwY2kg MDAwMDowMDoxYy40OiAgIGJyaWRnZSB3aW5kb3cgW2lvICAweDQwMDAtMHg0ZmZmXQpbICAg IDMuNTc0Njk0XSBwY2kgMDAwMDowMDoxYy40OiAgIGJyaWRnZSB3aW5kb3cgW21lbSAweGIx MDAwMDAwLTB4YjE4ZmZmZmZdClsgICAgMy41ODIyNjVdIHBjaSAwMDAwOjAwOjFjLjQ6ICAg YnJpZGdlIHdpbmRvdyBbbWVtIDB4YjAwMDAwMDAtMHhiMGZmZmZmZiA2NGJpdCBwcmVmXQpb ICAgIDMuNTkwOTA1XSBwY2kgMDAwMDowMDoxYy41OiBQQ0kgYnJpZGdlIHRvIFtidXMgMDld ClsgICAgMy41OTY0NDddIHBjaSAwMDAwOjAwOjFjLjU6ICAgYnJpZGdlIHdpbmRvdyBbaW8g IDB4NTAwMC0weDVmZmZdClsgICAgMy42MDMyNTNdIHBjaSAwMDAwOjAwOjFjLjU6ICAgYnJp ZGdlIHdpbmRvdyBbbWVtIDB4YjFmMDAwMDAtMHhiMjBmZmZmZl0KWyAgICAzLjYxMDgzNF0g cGNpIDAwMDA6MDA6MWMuNTogICBicmlkZ2Ugd2luZG93IFttZW0gMHhiMjEwMDAwMC0weGIy MmZmZmZmIDY0Yml0IHByZWZdClsgICAgMy42MTk0ODRdIHBjaSAwMDAwOjAwOjFlLjA6IFBD SSBicmlkZ2UgdG8gW2J1cyAwYV0KWyAgICAzLjYyNTAzNV0gcGNpX2J1cyAwMDAwOjAwOiBy ZXNvdXJjZSA0IFtpbyAgMHgwMDAwLTB4MGNmN10KWyAgICAzLjYzMTI1Nl0gcGNpX2J1cyAw MDAwOjAwOiByZXNvdXJjZSA1IFtpbyAgMHgwZDAwLTB4ZmZmZl0KWyAgICAzLjYzNzQ3Nl0g cGNpX2J1cyAwMDAwOjAwOiByZXNvdXJjZSA2IFttZW0gMHgwMDBhMDAwMC0weDAwMGJmZmZm XQpbICAgIDMuNjQ0NDcyXSBwY2lfYnVzIDAwMDA6MDA6IHJlc291cmNlIDcgW21lbSAweGZl ZDQwMDAwLTB4ZmVkZmZmZmZdClsgICAgMy42NTE0NjldIHBjaV9idXMgMDAwMDowMDogcmVz b3VyY2UgOCBbbWVtIDB4YjAwMDAwMDAtMHhmZGZmZmZmZl0KWyAgICAzLjY1ODQ2N10gcGNp X2J1cyAwMDAwOjAxOiByZXNvdXJjZSAwIFtpbyAgMHgxMDAwLTB4MWZmZl0KWyAgICAzLjY2 NDY4OV0gcGNpX2J1cyAwMDAwOjAxOiByZXNvdXJjZSAxIFttZW0gMHhiMTkwMDAwMC0weGIx OWZmZmZmXQpbICAgIDMuNjcxNjg2XSBwY2lfYnVzIDAwMDA6MDc6IHJlc291cmNlIDAgW2lv ICAweDMwMDAtMHgzZmZmXQpbICAgIDMuNjc3OTA5XSBwY2lfYnVzIDAwMDA6MDc6IHJlc291 cmNlIDEgW21lbSAweGIxYjAwMDAwLTB4YjFjZmZmZmZdClsgICAgMy42ODQ5MDVdIHBjaV9i dXMgMDAwMDowNzogcmVzb3VyY2UgMiBbbWVtIDB4YjFkMDAwMDAtMHhiMWVmZmZmZiA2NGJp dCBwcmVmXQpbICAgIDMuNjkyOTcwXSBwY2lfYnVzIDAwMDA6MDg6IHJlc291cmNlIDAgW2lv ICAweDQwMDAtMHg0ZmZmXQpbICAgIDMuNjk5MTgyXSBwY2lfYnVzIDAwMDA6MDg6IHJlc291 cmNlIDEgW21lbSAweGIxMDAwMDAwLTB4YjE4ZmZmZmZdClsgICAgMy43MDYxNzldIHBjaV9i dXMgMDAwMDowODogcmVzb3VyY2UgMiBbbWVtIDB4YjAwMDAwMDAtMHhiMGZmZmZmZiA2NGJp dCBwcmVmXQpbICAgIDMuNzE0MjQ0XSBwY2lfYnVzIDAwMDA6MDk6IHJlc291cmNlIDAgW2lv ICAweDUwMDAtMHg1ZmZmXQpbICAgIDMuNzIwNDU2XSBwY2lfYnVzIDAwMDA6MDk6IHJlc291 cmNlIDEgW21lbSAweGIxZjAwMDAwLTB4YjIwZmZmZmZdClsgICAgMy43Mjc0NTNdIHBjaV9i dXMgMDAwMDowOTogcmVzb3VyY2UgMiBbbWVtIDB4YjIxMDAwMDAtMHhiMjJmZmZmZiA2NGJp dCBwcmVmXQpbICAgIDMuNzM1NTE2XSBwY2lfYnVzIDAwMDA6MGE6IHJlc291cmNlIDQgW2lv ICAweDAwMDAtMHgwY2Y3XQpbICAgIDMuNzQxNzM2XSBwY2lfYnVzIDAwMDA6MGE6IHJlc291 cmNlIDUgW2lvICAweDBkMDAtMHhmZmZmXQpbICAgIDMuNzQ3OTU2XSBwY2lfYnVzIDAwMDA6 MGE6IHJlc291cmNlIDYgW21lbSAweDAwMGEwMDAwLTB4MDAwYmZmZmZdClsgICAgMy43NTQ5 NTNdIHBjaV9idXMgMDAwMDowYTogcmVzb3VyY2UgNyBbbWVtIDB4ZmVkNDAwMDAtMHhmZWRm ZmZmZl0KWyAgICAzLjc2MTk0OV0gcGNpX2J1cyAwMDAwOjBhOiByZXNvdXJjZSA4IFttZW0g MHhiMDAwMDAwMC0weGZkZmZmZmZmXQpbICAgIDMuNzY4OTQ5XSBwY2lfYnVzIDAwMDA6ZmU6 IHJlc291cmNlIDQgW2lvICAweDAwMDAtMHhmZmZmXQpbICAgIDMuNzc1MTcwXSBwY2lfYnVz IDAwMDA6ZmU6IHJlc291cmNlIDUgW21lbSAweDAwMDAwMDAwLTB4ZmZmZmZmZmZmZl0KWyAg ICAzLjc4MjM2Ml0gcGNpX2J1cyAwMDAwOmZmOiByZXNvdXJjZSA0IFtpbyAgMHgwMDAwLTB4 ZmZmZl0KWyAgICAzLjc4ODU4Ml0gcGNpX2J1cyAwMDAwOmZmOiByZXNvdXJjZSA1IFttZW0g MHgwMDAwMDAwMC0weGZmZmZmZmZmZmZdClsgICAgMy43OTU4MDhdIE5FVDogUmVnaXN0ZXJl ZCBwcm90b2NvbCBmYW1pbHkgMgpbICAgIDMuODAwODk5XSBUQ1AgZXN0YWJsaXNoZWQgaGFz aCB0YWJsZSBlbnRyaWVzOiAxMzEwNzIgKG9yZGVyOiA4LCAxMDQ4NTc2IGJ5dGVzKQpbICAg IDMuODA5Mzk5XSBUQ1AgYmluZCBoYXNoIHRhYmxlIGVudHJpZXM6IDY1NTM2IChvcmRlcjog OCwgMTA0ODU3NiBieXRlcykKWyAgICAzLjgxNzAzOF0gVENQOiBIYXNoIHRhYmxlcyBjb25m aWd1cmVkIChlc3RhYmxpc2hlZCAxMzEwNzIgYmluZCA2NTUzNikKWyAgICAzLjgyNDQ0Ml0g VENQOiByZW5vIHJlZ2lzdGVyZWQKWyAgICAzLjgyODA2NF0gVURQIGhhc2ggdGFibGUgZW50 cmllczogODE5MiAob3JkZXI6IDYsIDI2MjE0NCBieXRlcykKWyAgICAzLjgzNDkyM10gVURQ LUxpdGUgaGFzaCB0YWJsZSBlbnRyaWVzOiA4MTkyIChvcmRlcjogNiwgMjYyMTQ0IGJ5dGVz KQpbICAgIDMuODQyMzI3XSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDEKWyAg ICAzLjg0NzMwMF0gUlBDOiBSZWdpc3RlcmVkIG5hbWVkIFVOSVggc29ja2V0IHRyYW5zcG9y dCBtb2R1bGUuClsgICAgMy44NTM5MTNdIFJQQzogUmVnaXN0ZXJlZCB1ZHAgdHJhbnNwb3J0 IG1vZHVsZS4KWyAgICAzLjg1OTE2NV0gUlBDOiBSZWdpc3RlcmVkIHRjcCB0cmFuc3BvcnQg bW9kdWxlLgpbICAgIDMuODY0NDE2XSBSUEM6IFJlZ2lzdGVyZWQgdGNwIE5GU3Y0LjEgYmFj a2NoYW5uZWwgdHJhbnNwb3J0IG1vZHVsZS4KWyAgICAzLjg3NDcwNF0gSU9BUElDWzBdOiBT ZXQgcm91dGluZyBlbnRyeSAoOC0xOSAtPiAweDQxIC0+IElSUSAxOSBNb2RlOjEgQWN0aXZl OjEgRGVzdDowKQpbICAgIDMuODgzOTQyXSBJT0FQSUNbMF06IFNldCByb3V0aW5nIGVudHJ5 ICg4LTE5IC0+IDB4NTEgLT4gSVJRIDE5IE1vZGU6MSBBY3RpdmU6MSBEZXN0OjApClsgICAg My44OTMxNzBdIElPQVBJQ1swXTogU2V0IHJvdXRpbmcgZW50cnkgKDgtMTkgLT4gMHg2MSAt PiBJUlEgMTkgTW9kZToxIEFjdGl2ZToxIERlc3Q6MCkKWyAgICAzLjkwMjM5N10gSU9BUElD WzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC0xOSAtPiAweDcxIC0+IElSUSAxOSBNb2RlOjEg QWN0aXZlOjEgRGVzdDowKQpbICAgIDMuOTExNjM0XSBJT0FQSUNbMF06IFNldCByb3V0aW5n IGVudHJ5ICg4LTE2IC0+IDB4ODEgLT4gSVJRIDE2IE1vZGU6MSBBY3RpdmU6MSBEZXN0OjAp ClsgICAgMy45MjA4NjJdIElPQVBJQ1swXTogU2V0IHJvdXRpbmcgZW50cnkgKDgtMTYgLT4g MHg5MSAtPiBJUlEgMTYgTW9kZToxIEFjdGl2ZToxIERlc3Q6MCkKWyAgICAzLjkzMDA4OV0g SU9BUElDWzBdOiBTZXQgcm91dGluZyBlbnRyeSAoOC0xNiAtPiAweGExIC0+IElSUSAxNiBN b2RlOjEgQWN0aXZlOjEgRGVzdDowKQpbICAgIDMuOTM5MzE3XSBJT0FQSUNbMF06IFNldCBy b3V0aW5nIGVudHJ5ICg4LTE2IC0+IDB4YjEgLT4gSVJRIDE2IE1vZGU6MSBBY3RpdmU6MSBE ZXN0OjApClsgICAgMy45NDg0NjJdIHBjaSAwMDAwOjAxOjAwLjA6IERpc2FibGluZyBMMHMK WyAgICAzLjk1MzEzNV0gcGNpIDAwMDA6MDE6MDAuMDogY2FuJ3QgZGlzYWJsZSBBU1BNOyBP UyBkb2Vzbid0IGhhdmUgQVNQTSBjb250cm9sClsgICAgMy45NjEyMDFdIHBjaSAwMDAwOjAx OjAwLjE6IERpc2FibGluZyBMMHMKWyAgICAzLjk2NTg2OV0gcGNpIDAwMDA6MDE6MDAuMTog Y2FuJ3QgZGlzYWJsZSBBU1BNOyBPUyBkb2Vzbid0IGhhdmUgQVNQTSBjb250cm9sClsgICAg My45NzM5MzhdIHBjaSAwMDAwOjA4OjAwLjA6IFZpZGVvIGRldmljZSB3aXRoIHNoYWRvd2Vk IFJPTQpbICAgIDMuOTgwMzA1XSBQQ0k6IENMUyA2NCBieXRlcywgZGVmYXVsdCA2NApbICAg IDMuOTg0ODM1XSBVbnBhY2tpbmcgaW5pdHJhbWZzLi4uClsgICAgNS45Nzg4MjVdIEZyZWVp bmcgaW5pdHJkIG1lbW9yeTogMTI4MDkySyAoZmZmZjg4MDM2NjJlOTAwMCAtIGZmZmY4ODAz NmUwMDAwMDApClsgICAgNS45ODcwOTZdIFBDSS1ETUE6IFVzaW5nIHNvZnR3YXJlIGJvdW5j ZSBidWZmZXJpbmcgZm9yIElPIChTV0lPVExCKQpbICAgIDUuOTk0Mjg4XSBzb2Z0d2FyZSBJ TyBUTEIgW21lbSAweDg4NTU2MDAwLTB4OGM1NTYwMDBdICg2NE1CKSBtYXBwZWQgYXQgW2Zm ZmY4ODAwODg1NTYwMDAtZmZmZjg4MDA4YzU1NWZmZl0KWyAgICA2LjAwNzAzMV0gZnV0ZXgg aGFzaCB0YWJsZSBlbnRyaWVzOiA4MTkyIChvcmRlcjogNywgNTI0Mjg4IGJ5dGVzKQpbICAg IDYuMDE0MTE2XSBJbml0aWFsaXNlIHN5c3RlbSB0cnVzdGVkIGtleXJpbmcKWyAgICA2LjAx OTAwM10gYXVkaXQ6IGluaXRpYWxpemluZyBuZXRsaW5rIHN1YnN5cyAoZGlzYWJsZWQpClsg ICAgNi4wMjUwMzldIGF1ZGl0OiB0eXBlPTIwMDAgYXVkaXQoMTQxNDQ1NzQyMi4wODY6MSk6 IGluaXRpYWxpemVkClsgICAgNi4wMzIxMzldIEh1Z2VUTEIgcmVnaXN0ZXJlZCAyIE1CIHBh Z2Ugc2l6ZSwgcHJlLWFsbG9jYXRlZCAwIHBhZ2VzClsgICAgNi4wNDA1MjVdIHpwb29sOiBs b2FkZWQKWyAgICA2LjA0MzQ1MF0gemJ1ZDogbG9hZGVkClsgICAgNi4wNDY0MzddIFZGUzog RGlzayBxdW90YXMgZHF1b3RfNi41LjIKWyAgICA2LjA1MDg1N10gRHF1b3QtY2FjaGUgaGFz aCB0YWJsZSBlbnRyaWVzOiA1MTIgKG9yZGVyIDAsIDQwOTYgYnl0ZXMpClsgICAgNi4wNTg1 MzBdIFNHSSBYRlMgd2l0aCBBQ0xzLCBzZWN1cml0eSBhdHRyaWJ1dGVzLCBubyBkZWJ1ZyBl bmFibGVkClsgICAgNi4wNjYxMDFdIDlwOiBJbnN0YWxsaW5nIHY5ZnMgOXAyMDAwIGZpbGUg c3lzdGVtIHN1cHBvcnQKWyAgICA2LjA3MjI1OV0gbXNnbW5pIGhhcyBiZWVuIHNldCB0byAy MzkwMgpbICAgIDYuMDc2NzAxXSBLZXkgdHlwZSBiaWdfa2V5IHJlZ2lzdGVyZWQKWyAgICA2 LjA4MDk4NV0gU0VMaW51eDogIFJlZ2lzdGVyaW5nIG5ldGZpbHRlciBob29rcwpbICAgIDYu MDg3MTkzXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDM4ClsgICAgNi4wOTIx NjFdIEtleSB0eXBlIGFzeW1tZXRyaWMgcmVnaXN0ZXJlZApbICAgIDYuMDk2NzM3XSBBc3lt bWV0cmljIGtleSBwYXJzZXIgJ3g1MDknIHJlZ2lzdGVyZWQKWyAgICA2LjEwMjIxNl0gQmxv Y2sgbGF5ZXIgU0NTSSBnZW5lcmljIChic2cpIGRyaXZlciB2ZXJzaW9uIDAuNCBsb2FkZWQg KG1ham9yIDI1MCkKWyAgICA2LjExMDUzMl0gaW8gc2NoZWR1bGVyIG5vb3AgcmVnaXN0ZXJl ZApbICAgIDYuMTE0OTE0XSBpbyBzY2hlZHVsZXIgZGVhZGxpbmUgcmVnaXN0ZXJlZCAoZGVm YXVsdCkKWyAgICA2LjEyMDY1OF0gaW8gc2NoZWR1bGVyIGNmcSByZWdpc3RlcmVkClsgICAg Ni4xMjUxODldIElPQVBJQ1sxXTogU2V0IHJvdXRpbmcgZW50cnkgKDktNCAtPiAweGMxIC0+ IElSUSAyNCBNb2RlOjEgQWN0aXZlOjEgRGVzdDowKQpbICAgIDYuMTM0MTU3XSBwY2llcG9y dCAwMDAwOjAwOjAxLjA6IGlycSAyNSBmb3IgTVNJL01TSS1YClsgICAgNi4xNDAxNDJdIElP QVBJQ1sxXTogU2V0IHJvdXRpbmcgZW50cnkgKDktMCAtPiAweGUxIC0+IElSUSAyNiBNb2Rl OjEgQWN0aXZlOjEgRGVzdDowKQpbICAgIDYuMTQ5MTAyXSBwY2llcG9ydCAwMDAwOjAwOjAz LjA6IGlycSAyNyBmb3IgTVNJL01TSS1YClsgICAgNi4xNTUwODRdIElPQVBJQ1sxXTogU2V0 IHJvdXRpbmcgZW50cnkgKDktMiAtPiAweDQyIC0+IElSUSAyOCBNb2RlOjEgQWN0aXZlOjEg RGVzdDowKQpbICAgIDYuMTY0MDQ1XSBwY2llcG9ydCAwMDAwOjAwOjA1LjA6IGlycSAyOSBm b3IgTVNJL01TSS1YClsgICAgNi4xNzAwMjBdIElPQVBJQ1sxXTogU2V0IHJvdXRpbmcgZW50 cnkgKDktNiAtPiAweDYyIC0+IElSUSAzMCBNb2RlOjEgQWN0aXZlOjEgRGVzdDowKQpbICAg IDYuMTc4OTgxXSBwY2llcG9ydCAwMDAwOjAwOjA3LjA6IGlycSAzMSBmb3IgTVNJL01TSS1Y ClsgICAgNi4xODQ5NTddIElPQVBJQ1sxXTogU2V0IHJvdXRpbmcgZW50cnkgKDktOCAtPiAw eDgyIC0+IElSUSAzMiBNb2RlOjEgQWN0aXZlOjEgRGVzdDowKQpbICAgIDYuMTkzOTE1XSBw Y2llcG9ydCAwMDAwOjAwOjA5LjA6IGlycSAzMyBmb3IgTVNJL01TSS1YClsgICAgNi4xOTk4 ODhdIElPQVBJQ1sxXTogU2V0IHJvdXRpbmcgZW50cnkgKDktOSAtPiAweGEyIC0+IElSUSAz NCBNb2RlOjEgQWN0aXZlOjEgRGVzdDowKQpbICAgIDYuMjA4ODUyXSBwY2llcG9ydCAwMDAw OjAwOjBhLjA6IGlycSAzNSBmb3IgTVNJL01TSS1YClsgICAgNi4yMTQ4MjldIElPQVBJQ1sw XTogU2V0IHJvdXRpbmcgZW50cnkgKDgtMTYgLT4gMHhjMiAtPiBJUlEgMTYgTW9kZToxIEFj dGl2ZToxIERlc3Q6MCkKWyAgICA2LjIyMzg4N10gcGNpZXBvcnQgMDAwMDowMDoxYy4wOiBp cnEgMzYgZm9yIE1TSS9NU0ktWApbICAgIDYuMjI5OTAxXSBwY2llcG9ydCAwMDAwOjAwOjFj LjQ6IGlycSAzNyBmb3IgTVNJL01TSS1YClsgICAgNi4yMzU4OTNdIElPQVBJQ1swXTogU2V0 IHJvdXRpbmcgZW50cnkgKDgtMTcgLT4gMHgyMyAtPiBJUlEgMTcgTW9kZToxIEFjdGl2ZTox IERlc3Q6MCkKWyAgICA2LjI0NDk1Ml0gcGNpZXBvcnQgMDAwMDowMDoxYy41OiBpcnEgMzgg Zm9yIE1TSS9NU0ktWApbICAgIDYuMjUwODg3XSBhZXIgMDAwMDowMDowMS4wOnBjaWUwMjog c2VydmljZSBkcml2ZXIgYWVyIGxvYWRlZApbICAgIDYuMjU3NDIwXSBhZXIgMDAwMDowMDow My4wOnBjaWUwMjogc2VydmljZSBkcml2ZXIgYWVyIGxvYWRlZApbICAgIDYuMjYzOTUyXSBh ZXIgMDAwMDowMDowNS4wOnBjaWUwMjogc2VydmljZSBkcml2ZXIgYWVyIGxvYWRlZApbICAg IDYuMjcwNDgzXSBhZXIgMDAwMDowMDowNy4wOnBjaWUwMjogc2VydmljZSBkcml2ZXIgYWVy IGxvYWRlZApbICAgIDYuMjc3MDA1XSBhZXIgMDAwMDowMDowOS4wOnBjaWUwMjogc2Vydmlj ZSBkcml2ZXIgYWVyIGxvYWRlZApbICAgIDYuMjgzNTI2XSBhZXIgMDAwMDowMDowYS4wOnBj aWUwMjogc2VydmljZSBkcml2ZXIgYWVyIGxvYWRlZApbICAgIDYuMjkwMDUyXSBwY2llcG9y dCAwMDAwOjAwOjAxLjA6IFNpZ25hbGluZyBQTUUgdGhyb3VnaCBQQ0llIFBNRSBpbnRlcnJ1 cHQKWyAgICA2LjI5NzgyN10gcGNpIDAwMDA6MDE6MDAuMDogU2lnbmFsaW5nIFBNRSB0aHJv dWdoIFBDSWUgUE1FIGludGVycnVwdApbICAgIDYuMzA1MTE1XSBwY2kgMDAwMDowMTowMC4x OiBTaWduYWxpbmcgUE1FIHRocm91Z2ggUENJZSBQTUUgaW50ZXJydXB0ClsgICAgNi4zMTI0 MDVdIHBjaWVfcG1lIDAwMDA6MDA6MDEuMDpwY2llMDE6IHNlcnZpY2UgZHJpdmVyIHBjaWVf cG1lIGxvYWRlZApbICAgIDYuMzE5ODk0XSBwY2llcG9ydCAwMDAwOjAwOjAzLjA6IFNpZ25h bGluZyBQTUUgdGhyb3VnaCBQQ0llIFBNRSBpbnRlcnJ1cHQKWyAgICA2LjMyNzY3MF0gcGNp ZV9wbWUgMDAwMDowMDowMy4wOnBjaWUwMTogc2VydmljZSBkcml2ZXIgcGNpZV9wbWUgbG9h ZGVkClsgICAgNi4zMzUxNTldIHBjaWVwb3J0IDAwMDA6MDA6MDUuMDogU2lnbmFsaW5nIFBN RSB0aHJvdWdoIFBDSWUgUE1FIGludGVycnVwdApbICAgIDYuMzQyOTMzXSBwY2llX3BtZSAw MDAwOjAwOjA1LjA6cGNpZTAxOiBzZXJ2aWNlIGRyaXZlciBwY2llX3BtZSBsb2FkZWQKWyAg ICA2LjM1MDQxM10gcGNpZXBvcnQgMDAwMDowMDowNy4wOiBTaWduYWxpbmcgUE1FIHRocm91 Z2ggUENJZSBQTUUgaW50ZXJydXB0ClsgICAgNi4zNTgxODhdIHBjaWVfcG1lIDAwMDA6MDA6 MDcuMDpwY2llMDE6IHNlcnZpY2UgZHJpdmVyIHBjaWVfcG1lIGxvYWRlZApbICAgIDYuMzY1 NjY1XSBwY2llcG9ydCAwMDAwOjAwOjA5LjA6IFNpZ25hbGluZyBQTUUgdGhyb3VnaCBQQ0ll IFBNRSBpbnRlcnJ1cHQKWyAgICA2LjM3MzQzOV0gcGNpZV9wbWUgMDAwMDowMDowOS4wOnBj aWUwMTogc2VydmljZSBkcml2ZXIgcGNpZV9wbWUgbG9hZGVkClsgICAgNi4zODA5MjddIHBj aWVwb3J0IDAwMDA6MDA6MGEuMDogU2lnbmFsaW5nIFBNRSB0aHJvdWdoIFBDSWUgUE1FIGlu dGVycnVwdApbICAgIDYuMzg4NzAyXSBwY2llX3BtZSAwMDAwOjAwOjBhLjA6cGNpZTAxOiBz ZXJ2aWNlIGRyaXZlciBwY2llX3BtZSBsb2FkZWQKWyAgICA2LjM5NjE5N10gcGNpZXBvcnQg MDAwMDowMDoxYy4wOiBTaWduYWxpbmcgUE1FIHRocm91Z2ggUENJZSBQTUUgaW50ZXJydXB0 ClsgICAgNi40MDM5NzNdIHBjaWVfcG1lIDAwMDA6MDA6MWMuMDpwY2llMDE6IHNlcnZpY2Ug ZHJpdmVyIHBjaWVfcG1lIGxvYWRlZApbICAgIDYuNDExNDY3XSBwY2llcG9ydCAwMDAwOjAw OjFjLjQ6IFNpZ25hbGluZyBQTUUgdGhyb3VnaCBQQ0llIFBNRSBpbnRlcnJ1cHQKWyAgICA2 LjQxOTI0Ml0gcGNpIDAwMDA6MDg6MDAuMDogU2lnbmFsaW5nIFBNRSB0aHJvdWdoIFBDSWUg UE1FIGludGVycnVwdApbICAgIDYuNDI2NTIzXSBwY2llX3BtZSAwMDAwOjAwOjFjLjQ6cGNp ZTAxOiBzZXJ2aWNlIGRyaXZlciBwY2llX3BtZSBsb2FkZWQKWyAgICA2LjQzNDAxOV0gcGNp ZXBvcnQgMDAwMDowMDoxYy41OiBTaWduYWxpbmcgUE1FIHRocm91Z2ggUENJZSBQTUUgaW50 ZXJydXB0ClsgICAgNi40NDE3OTVdIHBjaWVfcG1lIDAwMDA6MDA6MWMuNTpwY2llMDE6IHNl cnZpY2UgZHJpdmVyIHBjaWVfcG1lIGxvYWRlZApbICAgIDYuNDQ5MjgxXSBwY2lfaG90cGx1 ZzogUENJIEhvdCBQbHVnIFBDSSBDb3JlIHZlcnNpb246IDAuNQpbICAgIDYuNDU1NTMwXSBw Y2llaHAgMDAwMDowMDoxYy4wOnBjaWUwNDogU2xvdCAjMSBBdHRuQnRuLSBBdHRuSW5kLSBQ d3JJbmQtIFB3ckN0cmwtIE1STC0gSW50ZXJsb2NrLSBOb0NvbXBsLSBMTEFjdFJlcCsKWyAg ICA2LjQ2NzQyMF0gcGNpZWhwIDAwMDA6MDA6MWMuMDpwY2llMDQ6IHNlcnZpY2UgZHJpdmVy IHBjaWVocCBsb2FkZWQKWyAgICA2LjQ3NDUyMV0gcGNpZWhwIDAwMDA6MDA6MWMuNDpwY2ll MDQ6IFNsb3QgIzUgQXR0bkJ0bi0gQXR0bkluZC0gUHdySW5kLSBQd3JDdHJsLSBNUkwtIElu dGVybG9jay0gTm9Db21wbC0gTExBY3RSZXArClsgICAgNi40ODY0MDZdIHBjaWVocCAwMDAw OjAwOjFjLjQ6cGNpZTA0OiBzZXJ2aWNlIGRyaXZlciBwY2llaHAgbG9hZGVkClsgICAgNi40 OTM1MDddIHBjaWVocCAwMDAwOjAwOjFjLjU6cGNpZTA0OiBTbG90ICM2IEF0dG5CdG4tIEF0 dG5JbmQtIFB3ckluZC0gUHdyQ3RybC0gTVJMLSBJbnRlcmxvY2stIE5vQ29tcGwtIExMQWN0 UmVwKwpbICAgIDYuNTA1MzkwXSBwY2llaHAgMDAwMDowMDoxYy41OnBjaWUwNDogc2Vydmlj ZSBkcml2ZXIgcGNpZWhwIGxvYWRlZApbICAgIDYuNTEyNDgwXSBwY2llaHA6IFBDSSBFeHBy ZXNzIEhvdCBQbHVnIENvbnRyb2xsZXIgRHJpdmVyIHZlcnNpb246IDAuNApbICAgIDYuNTE5 OTAzXSBpbnRlbF9pZGxlOiBNV0FJVCBzdWJzdGF0ZXM6IDB4MTEyMApbICAgIDYuNTI0OTc4 XSBpbnRlbF9pZGxlOiB2MC40IG1vZGVsIDB4MUEKWyAgICA2LjUyOTI2MF0gaW50ZWxfaWRs ZTogbGFwaWNfdGltZXJfcmVsaWFibGVfc3RhdGVzIDB4MgpbICAgIDYuNTM1NjMwXSBpbnB1 dDogU2xlZXAgQnV0dG9uIGFzIC9kZXZpY2VzL0xOWFNZU1RNOjAwL0xOWFNZQlVTOjAwL1BO UDBDMEU6MDAvaW5wdXQvaW5wdXQwClsgICAgNi41NDQ5NjBdIEFDUEk6IFNsZWVwIEJ1dHRv biBbU0xQQl0KWyAgICA2LjU0OTA3OF0gaW5wdXQ6IFBvd2VyIEJ1dHRvbiBhcyAvZGV2aWNl cy9MTlhTWVNUTTowMC9MTlhQV1JCTjowMC9pbnB1dC9pbnB1dDEKWyAgICA2LjU1NzMzOF0g QUNQSTogUG93ZXIgQnV0dG9uIFtQV1JGXQpbICAgIDYuNTYzMDU3XSBFUlNUOiBFcnJvciBS ZWNvcmQgU2VyaWFsaXphdGlvbiBUYWJsZSAoRVJTVCkgc3VwcG9ydCBpcyBpbml0aWFsaXpl ZC4KWyAgICA2LjU3MTQzOV0gcHN0b3JlOiBSZWdpc3RlcmVkIGVyc3QgYXMgcGVyc2lzdGVu dCBzdG9yZSBiYWNrZW5kClsgICAgNi41Nzg0NzJdIEdIRVM6IEFQRUkgZmlybXdhcmUgZmly c3QgbW9kZSBpcyBlbmFibGVkIGJ5IFdIRUEgX09TQy4KWyAgICA2LjU4NTYwN10gU2VyaWFs OiA4MjUwLzE2NTUwIGRyaXZlciwgNCBwb3J0cywgSVJRIHNoYXJpbmcgZW5hYmxlZApbICAg IDYuNjEzMTc3XSBzZXJpYWwgMDA6MDI6IHR0eVMxIGF0IEkvTyAweDJmOCAoaXJxID0gMywg YmFzZV9iYXVkID0gMTE1MjAwKSBpcyBhIDE2NTUwQQpbICAgIDYuNjQyNjcxXSBwbGF0Zm9y bSBzZXJpYWw4MjUwOiB0dHlTMCBhdCBJL08gMHgzZjggKGlycSA9IDQsIGJhc2VfYmF1ZCA9 IDExNTIwMCkgaXMgYSAxNjU1MEEKWyAgICA2LjY1MzQ3NV0gTm9uLXZvbGF0aWxlIG1lbW9y eSBkcml2ZXIgdjEuMwpbICAgIDYuNjU4MTk3XSBMaW51eCBhZ3BnYXJ0IGludGVyZmFjZSB2 MC4xMDMKWyAgICA2LjY2MzAyMl0gQUNQSSBXYXJuaW5nOiBTeXN0ZW1JTyByYW5nZSAweDAw MDAwMDAwMDAwMDA0MjgtMHgwMDAwMDAwMDAwMDAwNDJmIGNvbmZsaWN0cyB3aXRoIE9wUmVn aW9uIDB4MDAwMDAwMDAwMDAwMDQyOC0weDAwMDAwMDAwMDAwMDA0MmYgKFxHUEUwKSAoMjAx NDA5MjYvdXRhZGRyZXNzLTI1OCkKWyAgICA2LjY4MDMyMl0gQUNQSTogSWYgYW4gQUNQSSBk cml2ZXIgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZSwgeW91IHNob3VsZCB1c2UgaXQg aW5zdGVhZCBvZiB0aGUgbmF0aXZlIGRyaXZlcgpbICAgIDYuNjkxNjg1XSBBQ1BJIFdhcm5p bmc6IFN5c3RlbUlPIHJhbmdlIDB4MDAwMDAwMDAwMDAwMDUwMC0weDAwMDAwMDAwMDAwMDA1 MmYgY29uZmxpY3RzIHdpdGggT3BSZWdpb24gMHgwMDAwMDAwMDAwMDAwNTAwLTB4MDAwMDAw MDAwMDAwMDUyZiAoXF9TSV8uU0lPUikgKDIwMTQwOTI2L3V0YWRkcmVzcy0yNTgpClsgICAg Ni43MDk0NzNdIEFDUEk6IElmIGFuIEFDUEkgZHJpdmVyIGlzIGF2YWlsYWJsZSBmb3IgdGhp cyBkZXZpY2UsIHlvdSBzaG91bGQgdXNlIGl0IGluc3RlYWQgb2YgdGhlIG5hdGl2ZSBkcml2 ZXIKWyAgICA2LjcyMDg1MV0gbHBjX2ljaDogUmVzb3VyY2UgY29uZmxpY3QocykgZm91bmQg YWZmZWN0aW5nIGdwaW9faWNoClsgICAgNi43Mjc3ODRdIHJkYWM6IGRldmljZSBoYW5kbGVy IHJlZ2lzdGVyZWQKWyAgICA2LjczMjY3N10gaHBfc3c6IGRldmljZSBoYW5kbGVyIHJlZ2lz dGVyZWQKWyAgICA2LjczNzQ1M10gZW1jOiBkZXZpY2UgaGFuZGxlciByZWdpc3RlcmVkClsg ICAgNi43NDIwMjZdIGFsdWE6IGRldmljZSBoYW5kbGVyIHJlZ2lzdGVyZWQKWyAgICA2Ljc0 NjcyNl0gbGlicGh5OiBGaXhlZCBNRElPIEJ1czogcHJvYmVkClsgICAgNi43NTEzNDVdIGUx MDAwOiBJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIERyaXZlciAtIHZlcnNpb24gNy4zLjIx LWs4LU5BUEkKWyAgICA2Ljc1OTIxNl0gZTEwMDA6IENvcHlyaWdodCAoYykgMTk5OS0yMDA2 IEludGVsIENvcnBvcmF0aW9uLgpbICAgIDYuNzY1NjM5XSBlMTAwMGU6IEludGVsKFIpIFBS Ty8xMDAwIE5ldHdvcmsgRHJpdmVyIC0gMi4zLjItawpbICAgIDYuNzcyMTUyXSBlMTAwMGU6 IENvcHlyaWdodChjKSAxOTk5IC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KWyAgICA2Ljc3 ODc4NF0gaWdiOiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IE5ldHdvcmsgRHJpdmVyIC0g dmVyc2lvbiA1LjIuMTUtawpbICAgIDYuNzg2NjU0XSBpZ2I6IENvcHlyaWdodCAoYykgMjAw Ny0yMDE0IEludGVsIENvcnBvcmF0aW9uLgpbICAgIDYuNzkyOTE2XSBJT0FQSUNbMV06IFNl dCByb3V0aW5nIGVudHJ5ICg5LTE2IC0+IDB4NTMgLT4gSVJRIDM5IE1vZGU6MSBBY3RpdmU6 MSBEZXN0OjApClsgICAgNi44MDIxNjBdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MCBmb3Ig TVNJL01TSS1YClsgICAgNi44MDc1MTNdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MSBmb3Ig TVNJL01TSS1YClsgICAgNi44MTI4NjZdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MiBmb3Ig TVNJL01TSS1YClsgICAgNi44MTgyMTldIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MyBmb3Ig TVNJL01TSS1YClsgICAgNi44MjM1NzFdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NCBmb3Ig TVNJL01TSS1YClsgICAgNi44Mjg5MjRdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NSBmb3Ig TVNJL01TSS1YClsgICAgNi44MzQyNzZdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NiBmb3Ig TVNJL01TSS1YClsgICAgNi44Mzk2MjldIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NyBmb3Ig TVNJL01TSS1YClsgICAgNi44NDQ5ODFdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0OCBmb3Ig TVNJL01TSS1YClsgICAgNi44NzM5OTJdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MCBmb3Ig TVNJL01TSS1YClsgICAgNi44NzkzNDZdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MSBmb3Ig TVNJL01TSS1YClsgICAgNi44ODQ2OTldIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MiBmb3Ig TVNJL01TSS1YClsgICAgNi44OTAwNTFdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0MyBmb3Ig TVNJL01TSS1YClsgICAgNi44OTU0MDJdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NCBmb3Ig TVNJL01TSS1YClsgICAgNi45MDA3NTNdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NSBmb3Ig TVNJL01TSS1YClsgICAgNi45MDYxMDVdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NiBmb3Ig TVNJL01TSS1YClsgICAgNi45MTE0NThdIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0NyBmb3Ig TVNJL01TSS1YClsgICAgNi45MTY4MDldIGlnYiAwMDAwOjAxOjAwLjA6IGlycSA0OCBmb3Ig TVNJL01TSS1YClsgICAgNi45MjIxOTBdIGlnYiAwMDAwOjAxOjAwLjA6IFBIWSByZXNldCBp cyBibG9ja2VkIGR1ZSB0byBTT0wvSURFUiBzZXNzaW9uLgpbICAgIDYuOTc4NzYxXSBpZ2Ig MDAwMDowMTowMC4wOiBJbnRlbChSKSBHaWdhYml0IEV0aGVybmV0IE5ldHdvcmsgQ29ubmVj dGlvbgpbICAgIDYuOTg2NDc3XSBpZ2IgMDAwMDowMTowMC4wOiBldGgwOiAoUENJZToyLjVH Yi9zOldpZHRoIHg0KSAwMDoxNToxNzplNjo5ZDpjYwpbICAgIDYuOTk0NDg3XSBpZ2IgMDAw MDowMTowMC4wOiBldGgwOiBQQkEgTm86IFVua25vd24KWyAgICA2Ljk5OTk3NV0gaWdiIDAw MDA6MDE6MDAuMDogVXNpbmcgTVNJLVggaW50ZXJydXB0cy4gNCByeCBxdWV1ZShzKSwgNCB0 eCBxdWV1ZShzKQpbICAgIDcuMDA3MzY3XSB0c2M6IFJlZmluZWQgVFNDIGNsb2Nrc291cmNl IGNhbGlicmF0aW9uOiAyOTI2LjMyOSBNSHoKWyAgICA3LjAxNTY4OF0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDQ5IGZvciBNU0kvTVNJLVgKWyAgICA3LjAyMTA1N10gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUwIGZvciBNU0kvTVNJLVgKWyAgICA3LjAyNjQxMF0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUxIGZvciBNU0kvTVNJLVgKWyAgICA3LjAzMTc2Ml0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUyIGZvciBNU0kvTVNJLVgKWyAgICA3LjAzNzExNV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUzIGZvciBNU0kvTVNJLVgKWyAgICA3LjA0MjQ2OF0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU0IGZvciBNU0kvTVNJLVgKWyAgICA3LjA0NzgyMV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU1IGZvciBNU0kvTVNJLVgKWyAgICA3LjA1MzE3NV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU2IGZvciBNU0kvTVNJLVgKWyAgICA3LjA1ODUyOF0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU3IGZvciBNU0kvTVNJLVgKWyAgICA3LjIyMTk2OV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDQ5IGZvciBNU0kvTVNJLVgKWyAgICA3LjIyNzMyNl0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUwIGZvciBNU0kvTVNJLVgKWyAgICA3LjIzMjY3OV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUxIGZvciBNU0kvTVNJLVgKWyAgICA3LjIzODAzMV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUyIGZvciBNU0kvTVNJLVgKWyAgICA3LjI0MzM4NV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDUzIGZvciBNU0kvTVNJLVgKWyAgICA3LjI0ODczN10gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU0IGZvciBNU0kvTVNJLVgKWyAgICA3LjI1NDA4OV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU1IGZvciBNU0kvTVNJLVgKWyAgICA3LjI1OTQ0M10gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU2IGZvciBNU0kvTVNJLVgKWyAgICA3LjI2NDc5NV0gaWdiIDAwMDA6MDE6 MDAuMTogaXJxIDU3IGZvciBNU0kvTVNJLVgKWyAgICA3LjQ1MzI0MV0gaWdiIDAwMDA6MDE6 MDAuMTogSW50ZWwoUikgR2lnYWJpdCBFdGhlcm5ldCBOZXR3b3JrIENvbm5lY3Rpb24KWyAg ICA3LjQ2MDkyM10gaWdiIDAwMDA6MDE6MDAuMTogZXRoMTogKFBDSWU6Mi41R2IvczpXaWR0 aCB4NCkgMDA6MTU6MTc6ZTY6OWQ6Y2QKWyAgICA3LjQ2ODg5MV0gaWdiIDAwMDA6MDE6MDAu MTogZXRoMTogUEJBIE5vOiBVbmtub3duClsgICAgNy40NzQzMzZdIGlnYiAwMDAwOjAxOjAw LjE6IFVzaW5nIE1TSS1YIGludGVycnVwdHMuIDQgcnggcXVldWUocyksIDQgdHggcXVldWUo cykKWyAgICA3LjQ4MjgwMl0gaXhnYmU6IEludGVsKFIpIDEwIEdpZ2FiaXQgUENJIEV4cHJl c3MgTmV0d29yayBEcml2ZXIgLSB2ZXJzaW9uIDMuMTkuMS1rClsgICAgNy40OTE0NDhdIGl4 Z2JlOiBDb3B5cmlnaHQgKGMpIDE5OTktMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KWyAgICA3 LjQ5NzkzM10gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBjYXRj ClsgICAgNy41MDM5NjldIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2 ZXIga2F3ZXRoClsgICAgNy41MTAxOTFdIHBlZ2FzdXM6IHYwLjkuMyAoMjAxMy8wNC8yNSks IFBlZ2FzdXMvUGVnYXN1cyBJSSBVU0IgRXRoZXJuZXQgZHJpdmVyClsgICAgNy41MTg0NTVd IHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgcGVnYXN1cwpbICAg IDcuNTI0Nzc4XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHJ0 bDgxNTAKWyAgICA3LjUzMTEwM10gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNl IGRyaXZlciBhc2l4ClsgICAgNy41MzcxMzZdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGlu dGVyZmFjZSBkcml2ZXIgY2RjX2V0aGVyClsgICAgNy41NDM2NTVdIHVzYmNvcmU6IHJlZ2lz dGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgY2RjX2VlbQpbICAgIDcuNTQ5OTgwXSB1c2Jj b3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGRtOTYwMQpbICAgIDcuNTU2 MjA4XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHNtc2M3NXh4 ClsgICAgNy41NjI2MzJdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2 ZXIgc21zYzk1eHgKWyAgICA3LjU2OTA1NF0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50 ZXJmYWNlIGRyaXZlciBnbDYyMGEKWyAgICA3LjU3NTI4M10gdXNiY29yZTogcmVnaXN0ZXJl ZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBuZXQxMDgwClsgICAgNy41ODE2MDldIHVzYmNvcmU6 IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgcGx1c2IKWyAgICA3LjU4NzczOV0g dXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBybmRpc19ob3N0Clsg ICAgNy41OTQzNTRdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIg Y2RjX3N1YnNldApbICAgIDcuNjAwOTY4XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRl cmZhY2UgZHJpdmVyIHphdXJ1cwpbICAgIDcuNjA3MTk0XSB1c2Jjb3JlOiByZWdpc3RlcmVk IG5ldyBpbnRlcmZhY2UgZHJpdmVyIE1PU0NISVAgdXNiLWV0aGVybmV0IGRyaXZlcgpbICAg IDcuNjE1NDYyXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGlu dDUxeDEKWyAgICA3LjYyMTc3N10gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNl IGRyaXZlciBpcGhldGgKWyAgICA3LjYyODAwNl0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcg aW50ZXJmYWNlIGRyaXZlciBzaWVycmFfbmV0ClsgICAgNy42MzQ4MzddIGVoY2lfaGNkOiBV U0IgMi4wICdFbmhhbmNlZCcgSG9zdCBDb250cm9sbGVyIChFSENJKSBEcml2ZXIKWyAgICA3 LjY0MjEzNl0gZWhjaS1wY2k6IEVIQ0kgUENJIHBsYXRmb3JtIGRyaXZlcgpbICAgIDcuNjQ3 MjAyXSBJT0FQSUNbMF06IFNldCByb3V0aW5nIGVudHJ5ICg4LTE5IC0+IDB4NjYgLT4gSVJR IDE5IE1vZGU6MSBBY3RpdmU6MSBEZXN0OjApClsgICAgNy42NTYyNjZdIGVoY2ktcGNpIDAw MDA6MDA6MWEuNzogRUhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICA3LjY2MjI5M10gZWhjaS1w Y2kgMDAwMDowMDoxYS43OiBuZXcgVVNCIGJ1cyByZWdpc3RlcmVkLCBhc3NpZ25lZCBidXMg bnVtYmVyIDEKWyAgICA3LjY3MDU3MF0gZWhjaS1wY2kgMDAwMDowMDoxYS43OiBkZWJ1ZyBw b3J0IDEKWyAgICA3LjY3OTUzMF0gZWhjaS1wY2kgMDAwMDowMDoxYS43OiBjYWNoZSBsaW5l IHNpemUgb2YgNjQgaXMgbm90IHN1cHBvcnRlZApbICAgIDcuNjg3MTIwXSBlaGNpLXBjaSAw MDAwOjAwOjFhLjc6IGlycSAxOSwgaW8gbWVtIDB4YjFhMjIwMDAKWyAgICA3LjY5OTUwMl0g ZWhjaS1wY2kgMDAwMDowMDoxYS43OiBVU0IgMi4wIHN0YXJ0ZWQsIEVIQ0kgMS4wMApbICAg IDcuNzA1OTU1XSB1c2IgdXNiMTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFk NmIsIGlkUHJvZHVjdD0wMDAyClsgICAgNy43MTM1MzldIHVzYiB1c2IxOiBOZXcgVVNCIGRl dmljZSBzdHJpbmdzOiBNZnI9MywgUHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9MQpbICAgIDcu NzIxNjAzXSB1c2IgdXNiMTogUHJvZHVjdDogRUhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICA3 LjcyNzA0N10gdXNiIHVzYjE6IE1hbnVmYWN0dXJlcjogTGludXggMy4xOC4wLXJjMi1nN2Qz M2ZlOSBlaGNpX2hjZApbICAgIDcuNzM0MzM2XSB1c2IgdXNiMTogU2VyaWFsTnVtYmVyOiAw MDAwOjAwOjFhLjcKWyAgICA3LjczOTc5OF0gaHViIDEtMDoxLjA6IFVTQiBodWIgZm91bmQK WyAgICA3Ljc0Mzk5Ml0gaHViIDEtMDoxLjA6IDYgcG9ydHMgZGV0ZWN0ZWQKWyAgICA3Ljc0 ODY4NV0gZWhjaS1wY2kgMDAwMDowMDoxZC43OiBFSENJIEhvc3QgQ29udHJvbGxlcgpbICAg IDcuNzU0Njk3XSBlaGNpLXBjaSAwMDAwOjAwOjFkLjc6IG5ldyBVU0IgYnVzIHJlZ2lzdGVy ZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIgMgpbICAgIDcuNzYyOTc0XSBlaGNpLXBjaSAwMDAw OjAwOjFkLjc6IGRlYnVnIHBvcnQgMQpbICAgIDcuNzcxOTI1XSBlaGNpLXBjaSAwMDAwOjAw OjFkLjc6IGNhY2hlIGxpbmUgc2l6ZSBvZiA2NCBpcyBub3Qgc3VwcG9ydGVkClsgICAgNy43 Nzk1MTVdIGVoY2ktcGNpIDAwMDA6MDA6MWQuNzogaXJxIDE2LCBpbyBtZW0gMHhiMWEyMTAw MApbICAgIDcuNzkxNTIxXSBlaGNpLXBjaSAwMDAwOjAwOjFkLjc6IFVTQiAyLjAgc3RhcnRl ZCwgRUhDSSAxLjAwClsgICAgNy43OTc5NjldIHVzYiB1c2IyOiBOZXcgVVNCIGRldmljZSBm b3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0PTAwMDIKWyAgICA3LjgwNTU1OF0gdXNi IHVzYjI6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0zLCBQcm9kdWN0PTIsIFNlcmlh bE51bWJlcj0xClsgICAgNy44MTM2MjFdIHVzYiB1c2IyOiBQcm9kdWN0OiBFSENJIEhvc3Qg Q29udHJvbGxlcgpbICAgIDcuODE5MDY2XSB1c2IgdXNiMjogTWFudWZhY3R1cmVyOiBMaW51 eCAzLjE4LjAtcmMyLWc3ZDMzZmU5IGVoY2lfaGNkClsgICAgNy44MjYzNTNdIHVzYiB1c2Iy OiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MWQuNwpbICAgIDcuODMxNzg0XSBodWIgMi0wOjEu MDogVVNCIGh1YiBmb3VuZApbICAgIDcuODM1OTgxXSBodWIgMi0wOjEuMDogNiBwb3J0cyBk ZXRlY3RlZApbICAgIDcuODQwNTYyXSBvaGNpX2hjZDogVVNCIDEuMSAnT3BlbicgSG9zdCBD b250cm9sbGVyIChPSENJKSBEcml2ZXIKWyAgICA3Ljg0NzQ2OF0gb2hjaS1wY2k6IE9IQ0kg UENJIHBsYXRmb3JtIGRyaXZlcgpbICAgIDcuODUyNDczXSB1aGNpX2hjZDogVVNCIFVuaXZl cnNhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIGRyaXZlcgpbICAgIDcuODU5Njc0XSB1 aGNpX2hjZCAwMDAwOjAwOjFhLjA6IFVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNy44NjU2 OTRdIHVoY2lfaGNkIDAwMDA6MDA6MWEuMDogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNz aWduZWQgYnVzIG51bWJlciAzClsgICAgNy44NzM5NTddIHVoY2lfaGNkIDAwMDA6MDA6MWEu MDogZGV0ZWN0ZWQgMiBwb3J0cwpbICAgIDcuODc5NDE5XSB1aGNpX2hjZCAwMDAwOjAwOjFh LjA6IGlycSAxOSwgaW8gYmFzZSAweDAwMDAyMGUwClsgICAgNy44ODU4NjldIHVzYiB1c2Iz OiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0PTAwMDEK WyAgICA3Ljg5MzQ0OF0gdXNiIHVzYjM6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0z LCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0xClsgICAgNy45MDE1MTFdIHVzYiB1c2IzOiBQ cm9kdWN0OiBVSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDcuOTA2OTU2XSB1c2IgdXNiMzog TWFudWZhY3R1cmVyOiBMaW51eCAzLjE4LjAtcmMyLWc3ZDMzZmU5IHVoY2lfaGNkClsgICAg Ny45MTQyNDRdIHVzYiB1c2IzOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MWEuMApbICAgIDcu OTE5NTQwXSBodWIgMy0wOjEuMDogVVNCIGh1YiBmb3VuZApbICAgIDcuOTIzNzMyXSBodWIg My0wOjEuMDogMiBwb3J0cyBkZXRlY3RlZApbICAgIDcuOTI4MzcyXSB1aGNpX2hjZCAwMDAw OjAwOjFhLjE6IFVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgNy45MzQ0MDBdIHVoY2lfaGNk IDAwMDA6MDA6MWEuMTogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQgYnVzIG51 bWJlciA0ClsgICAgNy45NDI3MDRdIHVoY2lfaGNkIDAwMDA6MDA6MWEuMTogZGV0ZWN0ZWQg MiBwb3J0cwpbICAgIDcuOTQ4MTY2XSB1aGNpX2hjZCAwMDAwOjAwOjFhLjE6IGlycSAxOSwg aW8gYmFzZSAweDAwMDAyMGMwClsgICAgNy45NTQ2MjldIHVzYiB1c2I0OiBOZXcgVVNCIGRl dmljZSBmb3VuZCwgaWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0PTAwMDEKWyAgICA3Ljk2MjI0 OF0gdXNiIHVzYjQ6IE5ldyBVU0IgZGV2aWNlIHN0cmluZ3M6IE1mcj0zLCBQcm9kdWN0PTIs IFNlcmlhbE51bWJlcj0xClsgICAgNy45NzAzNTJdIHVzYiB1c2I0OiBQcm9kdWN0OiBVSENJ IEhvc3QgQ29udHJvbGxlcgpbICAgIDcuOTc1ODM1XSB1c2IgdXNiNDogTWFudWZhY3R1cmVy OiBMaW51eCAzLjE4LjAtcmMyLWc3ZDMzZmU5IHVoY2lfaGNkClsgICAgNy45ODMxNjJdIHVz YiB1c2I0OiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MWEuMQpbICAgIDcuOTg4NjMzXSBodWIg NC0wOjEuMDogVVNCIGh1YiBmb3VuZApbICAgIDcuOTkyODI3XSBodWIgNC0wOjEuMDogMiBw b3J0cyBkZXRlY3RlZApbICAgIDcuOTk3NTA4XSB1aGNpX2hjZCAwMDAwOjAwOjFhLjI6IFVI Q0kgSG9zdCBDb250cm9sbGVyClsgICAgOC4wMDM0MTBdIHVoY2lfAGhjZCAwMDAwOjAwOjFh LmR1Y3Q9MDAwMQpbICAgIDguMDExNzQ5XSB1c2IgdXNiNTogTmV3IFVTQiBkZXZpY2Ugc3Ry aW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTEKWyAgICA4LjAxMTc1MF0g dXNiIHVzYjU6IFByb2R1Y3Q6IFVIQ0kgSG9zdCBDb250cm9sbGVyClsgICAgOC4wMTE3NTFd IHVzYiB1c2I1OiBNYW51ZmFjdHVyZXI6IExpbnV4IDMuMTguMC1yYzItZzdkMzNmZTkgdWhj aV9oY2QKWyAgICA4LjAxMTc1Ml0gdXNiIHVzYjU6IFNlcmlhbE51bWJlAHI6IDAwMDA6MDA6 MWEuMl9oY2QgMDAwMDowMDoxZC4wOiBVSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDguMDEy MDQ1XSB1aGNpX2hjZCAwMDAwOjAwOjFkLjA6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFz c2lnbmVkIGJ1cyBudW1iZXIgNgpbICAgIDguMDEyMDUxXSB1aGNpX2hjZCAwMDAwOjAwOjFk LjA6IGRldGVjdGVkIDIgcG9ydHMKWyAgICA4LjAxMjA3NF0gdWhjaV9oY2QgMDAwMDowMDox ZC4wOiBpcnEgMTYsIGlvIGJhc2UgMHgwMDAwMjA4MApbICAgIDguMDEyMTEwXSB1c2IgdXNi NjogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAx ClsgICAgOC4wMTIxMTFdIHVzYiB1c2I2OiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9 MywgUHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9MQpbICAgIDguMDEyMTEyXSB1c2IgdXNiNjog UHJvZHVjdDogVUhDSSBIb3N0IENvbnRyb2xsZXIKWyAgICA4LjAxMjExM10gdXNiIHVzYjY6 IE1hbnVmYWN0dXJlcjogTGludXggMy4xOC4wLXJjMi1nN2QzM2ZlOSB1aGNpX2hjZApbICAg IDguMDEyMTEzXSB1c2IgdXNiNjogU2VyaWFsTnVtYmVyOiAwMDAwOjAwOjFkLjAKWyAgICA4 LjAxMjE4N10gaHViIDYtMDoxLjA6IFVTQiBodWIgZm91bmQKWyAgICA4LjAxMjE5MV0gaHVi IDYtMDoxLjA6IDIgcG9ydHMgZGV0ZWN0ZWQKWyAgICA4LjAxMjM1MV0gdWhjaV9oY2QgMDAw MDowMDoxZC4xOiBVSENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDguMDEyMzg5XSB1aGNpX2hj ZCAwMDAwOjAwOjFkLjE6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBu dW1iZXIgNwpbICAgIDguMDEyMzk1XSB1aGNpX2hjZCAwMDAwOjAwOjFkLjE6IGRldGVjdGVk IDIgcG9ydHMKWyAgICA4LjAxMjQxN10gdWhjaV9oY2QgMDAwMDowMDoxZC4xOiBpcnEgMTYs IGlvIGJhc2UgMHgwMDAwMjA2MApbICAgIDguMDEyNDk2XSB1c2IgdXNiNzogTmV3IFVTQiBk ZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAxClsgICAgOC4wMTI0 OTddIHVzYiB1c2I3OiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MywgUHJvZHVjdD0y LCBTZXJpYWxOdW1iZXI9MQpbICAgIDguMDEyNDk4XSB1c2IgdXNiNzogUHJvZHVjdDogVUhD SSBIb3N0IENvbnRyb2xsZXIKWyAgICA4LjAxMjQ5OV0gdXNiIHVzYjc6IE1hbnVmYWN0dXJl cjogTGludXggMy4xOC4wLXJjMi1nN2QzM2ZlOSB1aGNpX2hjZApbICAgIDguMDEyNTAwXSB1 c2IgdXNiNzogU2VyaWFsTnVtYmVyOiAwMDAwOjAwOjFkLjEKWyAgICA4LjAxMjU3NF0gaHVi IDctMDoxLjA6IFVTQiBodWIgZm91bmQKWyAgICA4LjAxMjU3OF0gaHViIDctMDoxLjA6IDIg cG9ydHMgZGV0ZWN0ZWQKWyAgICA4LjAxMjczOV0gdWhjaV9oY2QgMDAwMDowMDoxZC4yOiBV SENJIEhvc3QgQ29udHJvbGxlcgpbICAgIDguMDEyNzc0XSB1aGNpX2hjZCAwMDAwOjAwOjFk LjI6IG5ldyBVU0IgYnVzIHJlZ2lzdGVyZWQsIGFzc2lnbmVkIGJ1cyBudW1iZXIgOApbICAg IDguMDEyNzgwXSB1aGNpX2hjZCAwMDAwOjAwOjFkLjI6IGRldGVjdGVkIDIgcG9ydHMKWyAg ICA4LjAxMjgwM10gdWhjaV9oY2QgMDAwMDowMDoxZC4yOiBpcnEgMTYsIGlvIGJhc2UgMHgw MDAwMjA0MApbICAgIDguMDEyODM4XSB1c2IgdXNiODogTmV3IFVTQiBkZXZpY2UgZm91bmQs IGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAxClsgICAgOC4wMTI4MzldIHVzYiB1c2I4 OiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MywgUHJvZHVjdD0yLCBTZXJpYWxOdW1i ZXI9MQpbICAgIDguMDEyODQwXSB1c2IgdXNiODogUHJvZHVjdDogVUhDSSBIb3N0IENvbnRy b2xsZXIKWyAgICA4LjAxMjg0MV0gdXNiIHVzYjg6IE1hbnVmYWN0dXJlcjogTGludXggMy4x OC4wLXJjMi1nN2QzM2ZlOSB1aGNpX2hjZApbICAgIDguMDEyODQxXSB1c2IgdXNiODogU2Vy aWFsTnVtYmVyOiAwMDAwOjAwOjFkLjIKWyAgICA4LjAxMjkxM10gaHViIDgtMDoxLjA6IFVT QiBodWIgZm91bmQKWyAgICA4LjAxMjkxN10gaHViIDgtMDoxLjA6IDIgcG9ydHMgZGV0ZWN0 ZWQKWyAgICA4LjAxMzAxNV0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRy aXZlciB1c2JzZXJpYWwKWyAgICA4LjAxMzAyMF0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcg aW50ZXJmYWNlIGRyaXZlciB1c2JzZXJpYWxfZ2VuZXJpYwpbICAgIDguMDEzMDI1XSB1c2Jz ZXJpYWw6IFVTQiBTZXJpYWwgc3VwcG9ydCByZWdpc3RlcmVkIGZvciBnZW5lcmljClsgICAg OC4wMTMwNDJdIGk4MDQyOiBQTlA6IE5vIFBTLzIgY29udHJvbGxlciBmb3VuZC4gUHJvYmlu ZyBwb3J0cyBkaXJlY3RseS4KWyAgICA4LjE0NDU1OV0gdXNiIDItMTogbmV3IGhpZ2gtc3Bl ZWQgVVNCIGRldmljZSBudW1iZXIgMiB1c2luZyBlaGNpLXBjaQpbICAgIDguMjYxMDY3XSB1 c2IgMi0xOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MDVlMywgaWRQcm9kdWN0 PTA3MTkKWyAgICA4LjI2MTA2OV0gdXNiIDItMTogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczog TWZyPTAsIFByb2R1Y3Q9MSwgU2VyaWFsTnVtYmVyPTIKWyAgICA4LjI2MTA3MF0gdXNiIDIt MTogUHJvZHVjdDogVVNCIFN0b3JhZ2UKWyAgICA4LjI2MTA3MV0gdXNiIDItMTogU2VyaWFs TnVtYmVyOiAwMDAwMDAwMDAwMzMKWyAgICA4LjM2MzU4Nl0gdXNiIDItMjogbmV3IGhpZ2gt c3BlZWQgVVNCIGRldmljZSBudW1iZXIgMyB1c2luZyBlaGNpLXBjaQpbICAgIDguNDg1MDk0 XSB1c2IgMi0yOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MDQyNCwgaWRQcm9k dWN0PTI1MTQKWyAgICA4LjQ5MjU3OF0gdXNiIDItMjogTmV3IFVTQiBkZXZpY2Ugc3RyaW5n czogTWZyPTAsIFByb2R1Y3Q9MCwgU2VyaWFsTnVtYmVyPTAKWyAgICA4LjUwMDg2OV0gaHVi IDItMjoxLjA6IFVTQiBodWIgZm91bmQKWyAgICA4LjUwNTIyNV0gaHViIDItMjoxLjA6IDQg cG9ydHMgZGV0ZWN0ZWQKWyAgICA5LjA1MjExOV0gaTgwNDI6IE5vIGNvbnRyb2xsZXIgZm91 bmQKWyAgICA5LjA1NjQyMF0gbW91c2VkZXY6IFBTLzIgbW91c2UgZGV2aWNlIGNvbW1vbiBm b3IgYWxsIG1pY2UKWyAgICA5LjA2MzAwMl0gcnRjX2Ntb3MgMDA6MDA6IFJUQyBjYW4gd2Fr ZSBmcm9tIFM0ClsgICAgOS4wNjgzMTBdIHJ0Y19jbW9zIDAwOjAwOiBydGMgY29yZTogcmVn aXN0ZXJlZCBydGNfY21vcyBhcyBydGMwClsgICAgOS4wNzUxNDNdIHJ0Y19jbW9zIDAwOjAw OiBhbGFybXMgdXAgdG8gb25lIG1vbnRoLCB5M2ssIDExNCBieXRlcyBudnJhbSwgaHBldCBp cnFzClsgICAgOS4wODM3MTRdIGlUQ09fd2R0OiBJbnRlbCBUQ08gV2F0Y2hEb2cgVGltZXIg RHJpdmVyIHYxLjExClsgICAgOS4wODk5NDldIGlUQ09fd2R0OiB1bmFibGUgdG8gcmVzZXQg Tk9fUkVCT09UIGZsYWcsIGRldmljZSBkaXNhYmxlZCBieSBoYXJkd2FyZS9CSU9TClsgICAg OS4xMDc4NjNdIGlUQ09fdmVuZG9yX3N1cHBvcnQ6IHZlbmRvci1zdXBwb3J0PTAKWyAgICA5 LjExMzYxMl0gaGlkcmF3OiByYXcgSElEIGV2ZW50cyBkcml2ZXIgKEMpIEppcmkgS29zaW5h ClsgICAgOS4xMTk3MzVdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2 ZXIgdXNiaGlkClsgICAgOS4xMjU5NTZdIHVzYmhpZDogVVNCIEhJRCBjb3JlIGRyaXZlcgpb ICAgIDkuMTMwMjUxXSBkcm9wX21vbml0b3I6IEluaXRpYWxpemluZyBuZXR3b3JrIGRyb3Ag bW9uaXRvciBzZXJ2aWNlClsgICAgOS4xMzczMTZdIFRDUDogY3ViaWMgcmVnaXN0ZXJlZApb ICAgIDkuMTQxMDE5XSBJbml0aWFsaXppbmcgWEZSTSBuZXRsaW5rIHNvY2tldApbICAgIDku MTQ1OTAxXSBORVQ6IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDEwClsgICAgOS4xNTEz NTRdIE5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbAB5IDE3ClsgICAgOS4xNXRzIG9u IENQVSMwLzA6ClsgICAgOS4xODYyNTJdIC4uLiBBUElDIElEOiAgICAgIDAwMDAwMDAwICgw KQpbICAgIDkuMTkwODIwXSAuLi4gQVBJQyBWRVJTSU9OOiAwMDA2MDAxNQpbICAgIDkuMTk1 MDAxXSAuLi4gQVBJQyBUQVNLUFJJOiAwMDAwMDAwMCAoMDApClsgICAgOS4xOTk2NjddIC4u LiBBUElDIFBST0NQUkk6IDAwMDAwMDAwClsgICAgOS4yMDM4NDhdIC4uLiBBUElDIExEUjog MDEwMDAwMDAKWyAgICA5LjIwNzY0MF0gLi4uIEFQSUMgREZSOiBmZmZmZmZmZgpbICAgIDku MjExNDMyXSAuLi4gQVBJQyBTUElWOiAwMDAwMDFmZgpbICAgIDkuMjE1MzIwXSAuLi4gQVBJ QyBJU1IgZmllbGQ6ClsgICAgOS4yMTg4MjNdIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKWyAgICA5LjIyNjc2NF0g Li4uIEFQSUMgVE1SIGZpZWxkOgpbICAgIDkuMjMwMjY1XSAwMDAwMDAwMDAyMDAwMDAwMDAw MjAwMDIwMDAyMDA0MjAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwClsgICAgOS4y MzgyMDRdIC4uLiBBUElDIElSUiBmaWVsZDoKWyAgICA5LjI0MTcwNF0gMDAwMDAwMDAwMDAx MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMApb ICAgIDkuMjQ5NjQzXSAuLi4gQVBJQyBFU1I6IDAwMDAwMDAwClsgICAgOS4yNTM0MzVdIC4u LiBBUElDIElDUjogMDAwMDAwZWYKWyAgICA5LjI1NzIyOF0gLi4uIEFQSUMgSUNSMjogMTIw MDAwMDAKWyAgICA5LjI2MTExOV0gLi4uIEFQSUMgTFZUVDogMDAwMDAwZWYKWyAgICA5LjI2 NTAwOV0gLi4uIEFQSUMgTFZUUEM6IDAwMDAwNDAwClsgICAgOS4yNjg5OTZdIC4uLiBBUElD IExWVDA6IDAwMDEwNzAwClsgICAgOS4yNzI4ODVdIC4uLiBBUElDIExWVDE6IDAwMDAwNDAw ClsgICAgOS4yNzY3NzRdIC4uLiBBUElDIExWVEVSUjogMDAwMDAwZmUKWyAgICA5LjI4MDg1 N10gLi4uIEFQSUMgVE1JQ1Q6IDAwNzUxM2Y5ClsgICAgOS4yODQ4NDRdIC4uLiBBUElDIFRN Q0NUOiAwMDY3ZGYxNwpbICAgIDkuMjg4ODMyXSAuLi4gQVBJQyBURENSOiAwMDAwMDAwMwpb ICAgIDkuMjkyNzIwXSAKWyAgICA5LjI5NDM3OF0gbnVtYmVyIG9mIE1QIElSUSBzb3VyY2Vz OiAxNS4KWyAgICA5LjI5ODg1MV0gbnVtYmVyIG9mIElPLUFQSUMgIzggcmVnaXN0ZXJzOiAy NC4KWyAgICA5LjMwMzkwN10gbnVtYmVyIG9mIElPLUFQSUMgIzkgcmVnaXN0ZXJzOiAyNC4K WyAgICA5LjMwODk2MV0gdGVzdGluZyB0aGUgSU8gQVBJQy4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uClsgICAgOS4zMTQ3MDBdIElPIEFQSUMgIzguLi4uLi4KWyAgICA5LjMxNzkxMl0gLi4u LiByZWdpc3RlciAjMDA6IDA4MDAwMDAwClsgICAgOS4zMjIxOTBdIC4uLi4uLi4gICAgOiBw aHlzaWNhbCBBUElDIGlkOiAwOApbICAgIDkuMzI3MDUyXSAuLi4uLi4uICAgIDogRGVsaXZl cnkgVHlwZTogMApbICAgIDkuMzMxNTI2XSAuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDog MApbICAgIDkuMzM1OTk4XSAuLi4uIHJlZ2lzdGVyICMwMTogMDAxNzAwMjAKWyAgICA5LjM0 MDI3N10gLi4uLi4uLiAgICAgOiBtYXggcmVkaXJlY3Rpb24gZW50cmllczogMTcKWyAgICA5 LjM0NDgyMV0gdXNiIDUtMQA6ACBuZXcgZnVsbC1zcGVlICAgIDkuMzY1MTQ4XSAuLi4uLi4u ICAgICA6IElPIEFQSUMgdmVyc2lvbjogMjAKWyAgICA5LjM3MDAwOV0gLi4uLiBJUlEgcmVk aXJlY3Rpb24gdGFibGU6ClsgICAgOS4zNzQyOTJdIDEgICAgMCAgICAwICAgMCAgIDAgICAg MCAgICAwICAgIDAwClsgICAgOS4zNzkzNDBdIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAg ICAwICAgIDMxClsgICAgOS4zODQzOTldIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAw ICAgIDMwClsgICAgOS4zODk0NDddIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAg IDMzClsgICAgOS4zOTQ1MDNdIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDM0 ClsgICAgOS4zOTk1NTldIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDM1Clsg ICAgOS40MDQ2MTZdIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDM2ClsgICAg OS40MDk2NzRdIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDM3ClsgICAgOS40 MTQ3MzJdIDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDM4ClsgICAgOS40MTk3 OTBdIDAgICAgMSAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDM5ClsgICAgOS40MjQ4NDhd IDAgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDNBClsgICAgOS40Mjk4OTddIDAg ICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDNCClsgICAgOS40MzQ5NTRdIDAgICAg MCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDNDClsgICAgOS40NDAwMTJdIDAgICAgMCAg ICAwICAgMCAgIDAgICAgMCAgICAwICAgIDNEClsgICAgOS40NDUwNzBdIDAgICAgMCAgICAw ICAgMCAgIDAgICAgMCAgICAwICAgIDNFCgAKWyAgICA5LjQ1MDEyN10gIDAgICAgMCAgICBD MgpbICAgIDkuNDYwMjQyXSAxICAgIDEgICAgMCAgIDEgICAwICAgIDAgICAgMCAgICAyMwpb ICAgIDkuNDY1Mjk5XSAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMApbICAg IDkuNDcwMzU1XSAwICAgIDEgICAgMCAgIDEgICAwICAgIDAgICAgMCAgICA2NgpbICAgIDku NDc1NDExXSAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMApbICAgIDkuNDgw NDY3XSAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMApbICAgIDkuNDg1NTI0 XSAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMApbICAgIDkuNDkwNTgyXSAx ICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMApbICAgIDkuNDkxMTI4XSB1c2Ig NS0xOiBOZXcgVVNCIGRldmljZSBmb3VuZCwgaWRWZW5kb3I9MDQ2YiwgaWRQcm9kdWN0PWZm MTAKWyAgICA5LjQ5MTEyOV0gdXNiIDUtMTogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZy PTEsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTMKWyAgICA5LjQ5MTEzMF0gdXNiIDUtMTog UHJvZHVjdDogVmlydHVhbCBLZXlib2FyZCBhbmQgTW91c2UKWyAgICA5LjQ5MTEzMV0gdXNi IDUtMTogTWFudWZhY3R1cmVyOiBBbWVyaWNhbiBNZWdhdHJlbmRzIEluYy4KWyAgICA5LjQ5 MTEzMl0gdXNiIDUtMTogU2VyaWFsTnVtYmVyOiBzZXJpYWwKWyAgICA5LjUwMDMwNl0gaW5w dXQ6IEFtZXJpY2FuIE1lZ2F0cmVuZHMgSW5jLiBWaXJ0dWFsIEtleWJvYXJkIGFuZCBNb3Vz ZSBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWEuMi91c2I1LzUtMS81LTE6MS4w LzAwMDM6MDQ2QjpGRjEwLjAwMDEvaW5wdXQvaW5wdXQyClsgICAgOS41MDAzNzFdIGhpZC1n ZW5lcmljIDAwMDM6MDQ2QjpGRjEwLjAwMDE6IGlucHV0LGhpZHJhdzA6IFVTQiBISUQgdjEu MTAgS2V5Ym9hcmQgW0FtZXJpY2FuIE1lZ2F0cmVuZHMgSW5jLiBWaXJ0dWFsIEtleWJvYXJk IGFuZCBNb3VzZV0gb24gdXNiLTAwMDA6MDA6MWEuMi0xL2lucHV0MApbICAgIDkuNTA2Mjg3 XSBpbnB1dDogQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIFZpcnR1YWwgS2V5Ym9hcmQgYW5k IE1vdXNlIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxYS4yL3VzYjUvNS0xLzUt MToxLjEvMDAwMzowNDZCOkZGMTAuMDAwMi9pbnB1dC9pbnB1dDMKWyAgICA5LjUwNjM3MV0g aGlkLWdlbmVyaWMgMDAwMzowNDZCOkZGMTAuMDAwMjogaW5wdXQsaGlkcmF3MTogVVNCIEhJ RCB2MS4xMCBNb3VzZSBbQW1lcmljYW4gTWVnYXRyZW5kcyBJbmMuIFZpcnR1YWwgS2V5Ym9h cmQgYW5kIE1vdXNlXSBvbiB1c2ItMDAwMDowMDoxYS4yLTEvaW5wdXQxClsgICAgOS41ODEw NDhdIHVzYiA0LTI6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0wNGQ5LCBpZFBy b2R1Y3Q9MTcwMgpbICAgIDkuNTgxMDQ5XSB1c2IgNC0yOiBOZXcgVVNCIGRldmljZSBzdHJp bmdzOiBNZnI9MSwgUHJvZHVjdD0yLCBTZXJpYWxOdW1iZXI9MApbICAgIDkuNTgxMDUwXSB1 c2IgNC0yOiBQcm9kdWN0OiBVU0IgS2V5Ym9hcmQKWyAgICA5LjU4MTA1MV0gdXNiIDQtMjog TWFudWZhY3R1cmVyOiAgClsgICAgOS42MTIyMTRdIGlucHV0OiAgIFVTQiBLZXlib2FyZCBh cyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWEuMS91c2I0LzQtMi80LTI6MS4wLzAw MDM6MDREOToxNzAyLjAwMDMvaW5wdXQvaW5wdXQ0ClsgICAgOS42MTIyNzZdIGhpZC1nZW5l cmljIDAwMDM6MDREOToxNzAyLjAwMDM6IGlucHV0LGhpZHJhdzI6IFVTQiBISUQgdjEuMTAg S2V5Ym9hcmQgWyAgVVNCIEtleWJvYXJkXSBvbiB1c2ItMDAwMDowMDoxYS4xLTIvaW5wdXQw ClsgICAgOS42NDA2MDldIElPIEFQSUMgIzkuLi4uLi4KWyAgICA5LjY0MzgzNF0gLi4uLiBy ZWdpc3RlciAjMDA6IDA5MDAwMDAwClsgICAgOS42NDgxMjNdIC4uLi4uLi4gICAgOiBwaHlz aWNhbCBBUElDIGlkOiAwOQpbICAgIDkuNjUyOTk0XSAuLi4uLi4uICAgIDogRGVsaXZlcnkg VHlwZTogMApbICAgIDkuNjU3NDc4XSAuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDogMApb ICAgIDkuNjYxOTYxXSAuLi4uIHJlZ2lzdGVyICMwMTogMDAxNzAwMjAKWyAgICA5LjY2NjI1 MV0gLi4uLi4uLiAgICAgOiBtYXggcmVkaXJlY3Rpb24gZW50cmllczogMTcKWyAgICA5LjY3 MTkwMF0gLi4uLi4uLiAgICAgOiBQUlEgaW1wbGVtZW50ZWQ6IDAKWyAgICA5LjY3MzA5N10g aW5wdXQ6ICAgVVNCIEtleWJvYXJkIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDox YS4xL3VzYjQvNC0yLzQtMjoxLjEvMDAwMzowNEQ5OjE3MDIuMDAwNC9pbnB1dC9pbnB1dDUK WyAgICA5LjY3MzE2OF0gaGlkLWdlbmVyaWMgMDAwMzowNEQ5OjE3MDIuMDAwNDogaW5wdXQs aGlkcmF3MzogVVNCIEhJRCB2MS4xMCBEZXZpY2UgWyAgVVNCIEtleWJvYXJkXSBvbiB1c2It MDAwMDowMDoxYS4xLTIvaW5wdXQxClsgICAgOS43MDEyMTVdIGlucHV0OiAgIFVTQiBLZXli b2FyZCBhcyAvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWEuMS91c2I0LzQtMi80LTI6 MS4yLzAwMDM6MDREOToxNzAyLjAwMDUvaW5wdXQvaW5wdXQ2ClsgICAgOS43MDEzMDVdIGhp ZC1nZW5lcmljIDAwMDM6MDREOToxNzAyLjAwMDU6IGlucHV0LGhpZHJhdzQ6IFVTQiBISUQg djEuMTAgTW91c2UgWyAgVVNCIEtleWJvYXJkXSBvbiB1c2ItMDAwMDowMDoxYS4xLTIvaW5w dXQyClsgICAgOS43MjYxMzBdIC4uLi4uLi4gICAgIDogSU8gQVBJQyB2ZXJzaW9uOiAyMApb ICAgIDkuNzMxMDA4XSAuLi4uIHJlZ2lzdGVyICMwMjogMDAwMDAwMDAKWyAgICA5LjczNTMw MF0gLi4uLi4uLiAgICAgOiBhcmJpdHJhdGlvbjogMDAKWyAgICA5LjczOTc4NF0gLi4uLiBy ZWdpc3RlciAjMDM6IDAwMDAwMDAxClsgICAgOS43NDQwNzNdIC4uLi4uLi4gICAgIDogQm9v dCBEVCAgICA6IDEKWyAgICA5Ljc0ODQ2M10gLi4uLiBJUlEgcmVkaXJlY3Rpb24gdGFibGU6 ClsgICAgOS43NTI3NjBdIDEgICAgMSAgICAwICAgMSAgIDAgICAgMCAgICAwICAgIEUxClsg ICAgOS43NTc4MjZdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAg OS43NjI4OThdIDEgICAgMSAgICAwICAgMSAgIDAgICAgMCAgICAwICAgIDQyClsgICAgOS43 Njc5NjRdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS43NzMw MzZdIDEgICAgMSAgICAwICAgMSAgIDAgICAgMCAgICAwICAgIEMxClsgICAgOS43NzgxMDhd IDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS43ODMxODBdIDEg ICAgMSAgICAwICAgMSAgIDAgICAgMCAgICAwICAgIDYyClsgICAgOS43ODgyNDZdIDEgICAg MCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS43OTMzMTddIDEgICAgMSAg ICAwICAgMSAgIDAgICAgMCAgICAwICAgIDgyClsgICAgOS43OTgzODRdIDEgICAgMSAgICAw ICAgMSAgIDAgICAgMCAgICAwICAgIEEyClsgICAgOS44MDM0NTBdIDEgICAgMCAgICAwICAg MCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS44MDg1MjJdIDEgICAgMCAgICAwICAgMCAg IDAgICAgMCAgICAwICAgIDAwClsgICAgOS44MTM1OTRdIDEgICAgMCAgICAwICAgMCAgIDAg ICAgMCAgICAwICAgIDAwClsgICAgOS44MTg2NjVdIDEgICAgMCAgICAwICAgMCAgIDAgICAg MCAgICAwICAgIDAwClsgICAgOS44MjM3MzhdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAg ICAwICAgIDAwClsgICAgOS44Mjg4MTNdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAw ICAgIDAwClsgICAgOS44MzM4NzNdIDEgICAgMSAgICAwICAgMSAgIDAgICAgMCAgICAwICAg IDUzClsgICAgOS44Mzg5MzRdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAw ClsgICAgOS44NDM5OTldIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsg ICAgOS44NDkwNzFdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAg OS44NTQxNDNdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS44 NTkyMTVdIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS44NjQy ODddIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS44NjkzNTRd IDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwClsgICAgOS44NzQ0MjNdIElS USB0byBwaW4gbWFwcGluZ3M6ClsgICAgOS44NzgwMzRdIElSUTAgLT4gMDoyClsgICAgOS44 ODA3OTFdIElSUTEgLT4gMDoxClsgICAgOS44ODM1NTJdIElSUTMgLT4gMDozClsgICAgOS44 ODYzMzFdIElSUTQgLT4gMDo0ClsgICAgOS44ODkwOTNdIElSUTUgLT4gMDo1ClsgICAgOS44 OTE4NTNdIElSUTYgLT4gMDo2ClsgICAgOS44OTQ2MTFdIElSUTcgLT4gMDo3ClsgICAgOS44 OTczNjFdIElSUTggLT4gMDo4ClsgICAgOS45MDAxMjZdIElSUTkgLT4gMDo5ClsgICAgOS45 MDI4ODddIElSUTEwIC0+IDA6MTAKWyAgICA5LjkwNTg0Ml0gSVJRMTEgLT4gMDoxMQpbICAg IDkuOTA4NzkyXSBJUlExMiAtPiAwOjEyClsgICAgOS45MTE3NDNdIElSUTEzIC0+IDA6MTMK WyAgICA5LjkxNDY5NV0gSVJRMTQgLT4gMDoxNApbICAgIDkuOTE3NjUxXSBJUlExNSAtPiAw OjE1ClsgICAgOS45MjA2MTZdIElSUTE2IC0+IDA6MTYKWyAgICA5LjkyMzU3MV0gSVJRMTcg LT4gMDoxNwpbICAgIDkuOTI2NTIyXSBJUlExOSAtPiAwOjE5ClsgICAgOS45Mjk0ODNdIElS UTI0IC0+IDE6NApbICAgIDkuOTMyMzM5XSBJUlEyNiAtPiAxOjAKWyAgICA5LjkzNTE5N10g SVJRMjggLT4gMToyClsgICAgOS45MzgwNThdIElSUTMwIC0+IDE6NgpbICAgIDkuOTQwOTE2 XSBJUlEzMiAtPiAxOjgKWyAgICA5Ljk0Mzc3NF0gSVJRMzQgLT4gMTo5ClsgICAgOS45NDY2 MzFdIElSUTM5IC0+IDE6MTYKWyAgICA5Ljk0OTU4NF0gLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uIGRvbmUuClsgICAgOS45NTYxMjFdIExvYWRpbmcgY29tcGlsZWQt aW4gWC41MDkgY2VydGlmaWNhdGVzClsgICAgOS45NjIyNjVdIExvYWRlZCBYLjUwOSBjZXJ0 ICdNYWdyYXRoZWE6IEdsYWNpZXIgc2lnbmluZyBrZXk6IGM4MDVkYzc5MTMzZDhlN2NmMDU4 ZDlhM2QxOThkMWM0ZTgwMDhhNjcnClsgICAgOS45NzI4NjBdIHJlZ2lzdGVyZWQgdGFza3N0 YXRzIHZlcnNpb24gMQpbICAgIDkuOTgwMTExXSBLZXkgdHlwZSB0cnVzdGVkIHJlZ2lzdGVy ZWQKWyAgICA5Ljk4Njg5MV0gS2V5IHR5cGUgZW5jcnlwdGVkIHJlZ2lzdGVyZWQKWyAgICA5 Ljk5MzU5MV0gaW1hOiBObyBUUE0gY2hpcCBmb3VuZCwgYWN0aXZhdGluZyBUUE0tYnlwYXNz IQpbICAgIDkuOTk5NzQ5XSBldm06IEhNQUMgYXR0cnM6IDB4MQpbICAgMTAuMDA0ODI0XSBy dGNfY21vcyAwMDowMDogc2V0dGluZyBzeXN0ZW0gY2xvY2sgdG8gMjAxNC0xMC0yOCAwMDo1 MDozMCBVVEMgKDE0MTQ0NTc0MzApClsgICAxMC4wNjAwNTJdIGlnYiAwMDAwOjAxOjAwLjAg ZXRoMDogaWdiOiBldGgwIE5JQyBMaW5rIGlzIFVwIDEwMDAgTWJwcyBGdWxsIER1cGxleCwg RmxvdyBDb250cm9sOiBOb25lClsgICAxMC4wNzA1NTNdIElQdjY6IEFERFJDT05GKE5FVERF Vl9VUCk6IGV0aDA6IGxpbmsgaXMgbm90IHJlYWR5ClsgICAxMC4yODM3OTZdIElQdjY6IEFE RFJDT05GKE5FVERFVl9VUCk6IGV0aDE6IGxpbmsgaXMgbm90IHJlYWR5ClsgICAxMC4yOTAz ODBdIElQdjY6IEFERFJDT05GKE5FVERFVl9DSEFOR0UpOiBldGgwOiBsaW5rIGJlY29tZXMg cmVhZHkKWyAgIDEwLjMwMTAwOV0gU2VuZGluZyBESENQIHJlcXVlc3RzIC4sIE9LClsgICAx MC4zNTAxNDZdIElQLUNvbmZpZzogR290IERIQ1AgYW5zd2VyIGZyb20gMTkyLjE2OC4xLjEs IG15IGFkZHJlc3MgaXMgMTkyLjE2OC4xLjE0NgpbICAgMTAuNTI5ODkyXSBJUC1Db25maWc6 IENvbXBsZXRlOgpbICAgMTAuNTMzNTAyXSAgICAgIGRldmljZT1ldGgwLCBod2FkZHI9MDA6 MTU6MTc6ZTY6OWQ6Y2MsIGlwYWRkcj0xOTIuMTY4LjEuMTQ2LCBtYXNrPTI1NS4yNTUuMjU1 LjAsIGd3PTE5Mi4xNjguMS4xClsgICAxMC41NDQ4NjJdICAgICAgaG9zdD1sa3AtbmUwNCwg ZG9tYWluPWxrcC5pbnRlbC5jb20sIG5pcy1kb21haW49KG5vbmUpClsgICAxMC41NTIyNDRd ICAgICAgYm9vdHNlcnZlcj0xOTIuMTY4LjEuMSwgcm9vdHNlcnZlcj0xOTIuMTY4LjEuMSwg cm9vdHBhdGg9ClsgICAxMC41NTk3MjNdICAgICAgbmFtZXNlcnZlcjA9MTkyLjE2OC4xLjEK WyAgIDEwLjU2NDMxOF0gUE06IEhpYmVybmF0aW9uIGltYWdlIG5vdCBwcmVzZW50IG9yIGNv dWxkIG5vdCBiZSBsb2FkZWQuClsgICAxMC41NzQ4OTRdIEZyZWVpbmcgdW51c2VkIGtlcm5l bCBtZW1vcnk6IDE4MjRLIChmZmZmZmZmZjgxZGVkMDAwIC0gZmZmZmZmZmY4MWZiNTAwMCkK WyAgIDEwLjY5NjYwNl0gRURBQyBNQzogVmVyOiAzLjAuMApbICAgMTAuNzA1OTc1XSBFREFD IE1DMTogR2l2aW5nIG91dCBkZXZpY2UgdG8gbW9kdWxlIGk3Y29yZV9lZGFjLmMgY29udHJv bGxlciBpNyBjb3JlICMxOiBERVYgMDAwMDpmZTowMy4wIChQT0xMRUQpClsgICAxMC43MTcz NzhdIEVEQUMgUENJMDogR2l2aW5nIG91dCBkZXZpY2UgdG8gbW9kdWxlIGk3Y29yZV9lZGFj IGNvbnRyb2xsZXIgRURBQyBQQ0kgY29udHJvbGxlcjogREVWIDAwMDA6ZmU6MDMuMCAoUE9M TEVEKQpbICAgMTAuNzI5Nzc0XSBFREFDIE1DMDogR2l2aW5nIG91dCBkZXZpY2UgdG8gbW9k dWxlIGk3Y29yZV9lZGFjLmMgY29udHJvbGxlciBpNyBjb3JlICMwOiBERVYgMDAwMDpmZjow My4wIChQT0xMRUQpClsgICAxMC43NDExNzZdIEVEQUMgUENJMTogR2l2aW5nIG91dCBkZXZp Y2UgdG8gbW9kdWxlIGk3Y29yZV9lZGFjIGNvbnRyb2xsZXIgRURBQyBQQ0kgY29udHJvbGxl cjogREVWIDAwMDA6ZmY6MDMuMCAoUE9MTEVEKQpbICAgMTAuNzUzNTAxXSBFREFDIGk3Y29y ZTogRHJpdmVyIGxvYWRlZCwgMiBtZW1vcnkgY29udHJvbGxlcihzKSBmb3VuZC4KWyAgIDEw LjgwNjczNF0gaXBtaSBtZXNzYWdlIGhhbmRsZXIgdmVyc2lvbiAzOS4yClsgICAxMC44MTc0 NThdIElQTUkgU3lzdGVtIEludGVyZmFjZSBkcml2ZXIuClsgICAxMC44MjE5NjddIGlwbWlf c2k6IHByb2JpbmcgdmlhIEFDUEkKWyAgIDEwLjgyNjA4NV0gaXBtaV9zaSAwMDowMzogW2lv ICAweDBjYTJdIHJlZ3NpemUgMSBzcGFjaW5nIDEgaXJxIDAKWyAgIDEwLjgzMjg5MF0gaXBt aV9zaTogQWRkaW5nIEFDUEktc3BlY2lmaWVkIGtjcyBzdGF0ZSBtYWNoaW5lClsgICAxMC44 MzkyODJdIGlwbWlfc2k6IHByb2JpbmcgdmlhIFNNQklPUwpbICAgMTAuODQzNTY2XSBpcG1p X3NpOiBTTUJJT1M6IGlvIDB4Y2EyIHJlZ3NpemUgMSBzcGFjaW5nIDEgaXJxIDAKWyAgIDEw Ljg1MDIxOV0gaXBtaV9zaTogQWRkaW5nIFNNQklPUy1zcGVjaWZpZWQga2NzIHN0YXRlIG1h Y2hpbmUgZHVwbGljYXRlIGludGVyZmFjZQpbICAgMTAuODU4NzI2XSBpcG1pX3NpOiBUcnlp bmcgQUNQSS1zcGVjaWZpZWQga2NzIHN0YXRlIG1hY2hpbmUgYXQgaS9vIGFkZHJlc3MgMHhj YTIsIHNsYXZlIGFkZHJlc3MgMHgwLCBpcnEgMApbICAgMTAuOTMxNjUxXSBJT0FQSUNbMF06 IFNldCByb3V0aW5nIGVudHJ5ICg4LTE4IC0+IDB4NzYgLT4gSVJRIDE4IE1vZGU6MSBBY3Rp dmU6MSBEZXN0OjApClsgICAxMC45MzMzMDldIGlwbWlfc2kgMDA6MDM6IEZvdW5kIG5ldyBC TUMgKG1hbl9pZDogMHgwMDAxNTcsIHByb2RfaWQ6IDB4MDAzZSwgZGV2X2lkOiAweDIxKQpb ICAgMTAuOTMzMzE2XSBpcG1pX3NpIDAwOjAzOiBJUE1JIGtjcyBpbnRlcmZhY2UgaW5pdGlh bGl6ZWQKWyAgIDEwLjk1NjAxMV0gaTgwMV9zbWJ1cyAwMDAwOjAwOjFmLjM6IFNNQnVzIHVz aW5nIFBDSSBJbnRlcnJ1cHQKWyAgIDEwLjk2NTkxMF0gW2RybV0gSW5pdGlhbGl6ZWQgZHJt IDEuMS4wIDIwMDYwODEwClsgICAxMC45NzQ1MzRdIHVzYi1zdG9yYWdlIDItMToxLjA6IFVT QiBNYXNzIFN0b3JhZ2UgZGV2aWNlIGRldGVjdGVkClsgICAxMC45ODE3MjFdIHNjc2kgaG9z dDA6IHVzYi1zdG9yYWdlIDItMToxLjAKWyAgIDEwLjk4NjQ2NV0gdXNiY29yZTogcmVnaXN0 ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciB1c2Itc3RvcmFnZQpbICAgMTAuOTk3MTUwXSBs aWJhdGEgdmVyc2lvbiAzLjAwIGxvYWRlZC4KWyAgIDExLjAxNTE4Ml0gYWhjaSAwMDAwOjAw OjFmLjI6IHZlcnNpb24gMy4wClsgICAxMS4wMTk5MzldIGFoY2kgMDAwMDowMDoxZi4yOiBp cnEgNTggZm9yIE1TSS9NU0ktWApbICAgMTEuMDI1NDQxXSBhaGNpIDAwMDA6MDA6MWYuMjog QUhDSSAwMDAxLjAyMDAgMzIgc2xvdHMgNiBwb3J0cyAzIEdicHMgMHhhIGltcGwgU0FUQSBt b2RlClsgICAxMS4wMzQ0NzhdIGFoY2kgMDAwMDowMDoxZi4yOiBmbGFnczogNjRiaXQgbmNx IHNudGYgcG0gbGVkIGNsbyBwaW8gc2x1bSBwYXJ0IGNjYyAKWyAgIDExLjA0Mzc5MV0gc2Nz aSBob3N0MTogYWhjaQpbICAgMTEuMDQ4MzUyXSBzY3NpIGhvc3QyOiBhaGNpClsgICAxMS4w NTE2OTddIHNjc2kgaG9zdDM6IGFoY2kKWyAgIDExLjA1NTExMl0gc2NzaSBob3N0NDogYWhj aQpbICAgMTEuMDU4NDg5XSBzY3NpIGhvc3Q1OiBhaGNpClsgICAxMS4wNTg1NzFdIGlucHV0 OiBQQyBTcGVha2VyIGFzIC9kZXZpY2VzL3BsYXRmb3JtL3Bjc3Brci9pbnB1dC9pbnB1dDcK WyAgIDExLjA2OTExOV0gc2NzaSBob3N0NjogYWhjaQpbICAgMTEuMDcyMzY5XSBhdGExOiBE VU1NWQpbICAgMTEuMDc1MTE4XSBhdGEyOiBTQVRBIG1heCBVRE1BLzEzMyBhYmFyIG0yMDQ4 QDB4YjFhMjAwMDAgcG9ydCAweGIxYTIwMTgwIGlycSA1OApbICAgMTEuMDgzMzY3XSBhdGEz OiBEVU1NWQpbICAgMTEuMDg2MDk5XSBhdGE0OiBTQVRBIG1heCBVRE1BLzEzMyBhYmFyIG0y MDQ4QDB4YjFhMjAwMDAgcG9ydCAweGIxYTIwMjgwIGlycSA1OApbICAgMTEuMDk0Mzk1XSBh dGE1OiBEVU1NWQpbICAgMTEuMDk3MTI2XSBhdGE2OiBEVU1NWQpbICAgMTEuMTAwNDc0XSBb VFRNXSBab25lICBrZXJuZWw6IEF2YWlsYWJsZSBncmFwaGljcyBtZW1vcnk6IDYxMTk5MTQg a2lCClsgICAxMS4xMDc3OTNdIFtUVE1dIFpvbmUgICBkbWEzMjogQXZhaWxhYmxlIGdyYXBo aWNzIG1lbW9yeTogMjA5NzE1MiBraUIKWyAgIDExLjExNTEzMF0gW1RUTV0gSW5pdGlhbGl6 aW5nIHBvb2wgYWxsb2NhdG9yClsgICAxMS4xMjAwMDVdIFtUVE1dIEluaXRpYWxpemluZyBE TUEgcG9vbCBhbGxvY2F0b3IKWyAgIDExLjE0MjI4Ml0gRXJyb3I6IERyaXZlciAncGNzcGty JyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQsIGFib3J0aW5nLi4uClsgICAxMS4xNTM5MDRdIGZi Y29uOiBtZ2Fkcm1mYiAoZmIwKSBpcyBwcmltYXJ5IGRldmljZQpbICAgMTEuMzY4MzA3XSBD b25zb2xlOiBzd2l0Y2hpbmcgdG8gY29sb3VyIGZyYW1lIGJ1ZmZlciBkZXZpY2UgMTI4eDQ4 ClsgICAxMS40MDUzOTldIGF0YTQ6IFNBVEEgbGluayB1cCAxLjUgR2JwcyAoU1N0YXR1cyAx MTMgU0NvbnRyb2wgMzAwKQpbICAgMTEuNDA1NDg5XSBhdGEyOiBTQVRBIGxpbmsgdXAgMy4w IEdicHMgKFNTdGF0dXMgMTIzIFNDb250cm9sIDMwMCkKWyAgIDExLjQwNjk1N10gYXRhNC4w MDogQVRBLTY6IFNUMzEyMDAyNkFTLCAzLjAwLCBtYXggVURNQS8xMzMKWyAgIDExLjQwNjk1 OV0gYXRhNC4wMDogMjM0NDQxNjQ4IHNlY3RvcnMsIG11bHRpIDA6IExCQTQ4IE5DUSAoZGVw dGggMzEvMzIpClsgICAxMS40MDcwMDJdIGF0YTIuMDA6IEFUQS04OiBTVDM1MDA1MTROUywg U04xMSwgbWF4IFVETUEvMTMzClsgICAxMS40MDcwMDRdIGF0YTIuMDA6IDk3Njc3MzE2OCBz ZWN0b3JzLCBtdWx0aSAwOiBMQkE0OCBOQ1EgKGRlcHRoIDMxLzMyKQpbICAgMTEuNDA4NzQx XSBhdGEyLjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEzMwpbICAgMTEuNDA4ODI1XSBhdGE0 LjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEzMwpbICAgMTEuNDA5MDUwXSBzY3NpIDI6MDow OjA6IERpcmVjdC1BY2Nlc3MgICAgIEFUQSAgICAgIFNUMzUwMDUxNE5TICAgICAgU04xMSBQ UTogMCBBTlNJOiA1ClsgICAxMS40MDk4MjZdIHNjc2kgNDowOjA6MDogRGlyZWN0LUFjY2Vz cyAgICAgQVRBICAgICAgU1QzMTIwMDI2QVMgICAgICAzLjAwIFBROiAwIEFOU0k6IDUKWyAg IDExLjQ2NDA0NV0gc2QgMjowOjA6MDogW3NkYV0gOTc2NzczMTY4IDUxMi1ieXRlIGxvZ2lj YWwgYmxvY2tzOiAoNTAwIEdCLzQ2NSBHaUIpClsgICAxMS40NjQxODVdIHNkIDQ6MDowOjA6 IFtzZGJdIDIzNDQ0MTY0OCA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDEyMCBHQi8xMTEg R2lCKQpbICAgMTEuNDY0MzAxXSBzZCAyOjA6MDowOiBbc2RhXSBXcml0ZSBQcm90ZWN0IGlz IG9mZgpbICAgMTEuNDY0MzA0XSBzZCAyOjA6MDowOiBbc2RhXSBNb2RlIFNlbnNlOiAwMCAz YSAwMCAwMApbICAgMTEuNDY0Mzc2XSBzZCAyOjA6MDowOiBbc2RhXSBXcml0ZSBjYWNoZTog ZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBG VUEKWyAgIDExLjQ2NDQwMF0gc2QgNDowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVjdCBpcyBv ZmYKWyAgIDExLjQ2NDQwNF0gc2QgNDowOjA6MDogW3NkYl0gTW9kZSBTZW5zZTogMDAgM2Eg MDAgMDAKWyAgIDExLjQ2NDQ1N10gc2QgNDowOjA6MDogW3NkYl0gV3JpdGUgY2FjaGU6IGVu YWJsZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVB ClsgICAxMS40NzI4NTddICBzZGE6IHNkYTEgc2RhMiBzZGEzClsgICAxMS40NzQxMjhdIHNk IDI6MDowOjA6IFtzZGFdIEF0dGFjaGVkIFNDU0kgZGlzawpbICAgMTEuNDk2NDA3XSAgc2Ri OiBzZGIxIHNkYjIgc2RiMwpbICAgMTEuNDk3ODQ3XSBzZCA0OjA6MDowOiBbc2RiXSBBdHRh Y2hlZCBTQ1NJIGRpc2sKWyAgIDExLjUyOTk2N10gc2QgMjowOjA6MDogQXR0YWNoZWQgc2Nz aSBnZW5lcmljIHNnMCB0eXBlIDAKWyAgIDExLjUzMDE4OF0gc2QgNDowOjA6MDogQXR0YWNo ZWQgc2NzaSBnZW5lcmljIHNnMSB0eXBlIDAKWyAgIDExLjU4MzM1N10gbWdhZzIwMCAwMDAw OjA4OjAwLjA6IGZiMDogbWdhZHJtZmIgZnJhbWUgYnVmZmVyIGRldmljZQpbICAgMTEuNTkx MzAxXSBtZ2FnMjAwIDAwMDA6MDg6MDAuMDogcmVnaXN0ZXJlZCBwYW5pYyBub3RpZmllcgpb ICAgMTEuNjE5NjQzXSBbZHJtXSBJbml0aWFsaXplZCBtZ2FnMjAwIDEuMC4wIDIwMTEwNDE4 IGZvciAwMDAwOjA4OjAwLjAgb24gbWlub3IgMApbICAgMTEuNzMwMzQ4XSByYW5kb206IG5v bmJsb2NraW5nIHBvb2wgaXMgaW5pdGlhbGl6ZWQKWyAgIDExLjk4NzI2OF0gcmFpZDY6IHNz ZTJ4MSAgICA2NjI1IE1CL3MKWyAgIDExLjk5MDU1OV0gc2NzaSAwOjA6MDowOiBDRC1ST00g ICAgICAgICAgICBURUFDICAgICBEVi1XMjhTLVYgICAgICAgIDEuMEEgUFE6IDAgQU5TSTog MApbICAgMTEuOTkwNzY2XSBzY3NpIDA6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2VuZXJpYyBz ZzIgdHlwZSA1ClsgICAxMi4wMjAxODNdIHNyIDA6MDowOjA6IFtzcjBdIHNjc2kzLW1tYyBk cml2ZTogMjR4LzI0eCB3cml0ZXIgZHZkLXJhbSBjZC9ydyB4YS9mb3JtMiBjZGRhIHRyYXkK WyAgIDEyLjAyNTI5N10gcmFpZDY6IHNzZTJ4MiAgICA4MTEzIE1CL3MKWyAgIDEyLjAzNTE0 NV0gY2Ryb206IFVuaWZvcm0gQ0QtUk9NIGRyaXZlciBSZXZpc2lvbjogMy4yMApbICAgMTIu MDQxODg0XSBzciAwOjA6MDowOiBBdHRhY2hlZCBzY3NpIENELVJPTSBzcjAKWyAgIDEyLjA0 MjI4MF0gcmFpZDY6IHNzZTJ4NCAgICA4ODM5IE1CL3MKWyAgIDEyLjA0MjI4MV0gcmFpZDY6 IHVzaW5nIGFsZ29yaXRobSBzc2UyeDQgKDg4MzkgTUIvcykKWyAgIDEyLjA0MjI4MV0gcmFp ZDY6IHVzaW5nIHNzc2UzeDIgcmVjb3ZlcnkgYWxnb3JpdGhtClsgICAxMi4wNjcxMzJdIHhv cjogbWVhc3VyaW5nIHNvZnR3YXJlIGNoZWNrc3VtIHNwZWVkClsgICAxMi4wODIyOTddICAg IHByZWZldGNoNjQtc3NlOiAxMzQwNC4wMDAgTUIvc2VjClsgICAxMi4wOTcyOTZdICAgIGdl bmVyaWNfc3NlOiAxMTkyOC4wMDAgTUIvc2VjClsgICAxMi4xMDI1ODRdIHhvcjogdXNpbmcg ZnVuY3Rpb246IHByZWZldGNoNjQtc3NlICgxMzQwNC4wMDAgTUIvc2VjKQpbICAgMTIuMTM4 NjMxXSBCdHJmcyBsb2FkZWQKWyAgIDEyLjE0ODc5OF0gQlRSRlM6IGRldmljZSBmc2lkIDNj ZTY3Nzc2LTY2YTYtNGY5ZS1hMjk3LWVhYjM3ZDAzMmUxYyBkZXZpZCAxIHRyYW5zaWQgNiAv ZGV2L3NkYjIKWyAgIDEyLjE2MTI1NF0gQlRSRlM6IGRldmljZSBmc2lkIDViMjFjNTAyLTcw NjUtNDA1ZC1hM2YyLTBkNGUzNThhOWI4NCBkZXZpZCAxIHRyYW5zaWQgNSAvZGV2L3NkYjEK Cj09PiAvbGtwL2xrcC9zcmMvdG1wL3N0ZG91dCA8PT0KCj09PiAvbGtwL2xrcC9zcmMvdG1w L3N0ZGVyciA8PT0KCj09PiAvbGtwL2xrcC9zcmMvdG1wL3N0ZG91dCA8PT0KMjggT2N0IDAw OjUwOjQwIG50cGRhdGVbMTY3MF06IHN0ZXAgdGltZSBzZXJ2ZXIgMTkyLjE2OC4xLjEgb2Zm c2V0IC0wLjMyNjcyMiBzZWMKS2VybmVsIHRlc3RzOiBCb290IE9LIQpMS1A6IEhPU1ROQU1F IGxrcC1uZTA0LCBNQUMgMDA6MTU6MTc6ZTY6OWQ6Y2MsIGtlcm5lbCAzLjE4LjAtcmMyLWc3 ZDMzZmU5IDEsIHNlcmlhbCBjb25zb2xlIC9kZXYvdHR5UzAKL2xrcC9sa3Avc3JjL2Jpbi9y dW4tbGtwClJFU1VMVF9ST09UPS9yZXN1bHQvbGtwLW5lMDQvZnNtYXJrL3BlcmZvcm1hbmNl LTF4LTMydC0xSERELXhmcy01Sy00MDBNLWZzeW5jQmVmb3JlQ2xvc2UtMTZkLTI1NmZwZC9k ZWJpYW4teDg2XzY0LmNnei94ODZfNjQtcmhlbC83ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEz YzZkYzJjOTJhMGE1MTg1LzAKam9iPS9sa3Avc2NoZWR1bGVkL2xrcC1uZTA0L2N5Y2xpY19m c21hcmstcGVyZm9ybWFuY2UtMXgtMzJ0LTFIREQteGZzLTVLLTQwME0tZnN5bmNCZWZvcmVD bG9zZS0xNmQtMjU2ZnBkLXg4Nl82NC1yaGVsLUhFQUQtN2QzM2ZlOWFiOWVhY2UyNDAzYWRl ZmVhM2M2ZGMyYzkyYTBhNTE4NS0wLnlhbWwKcnVuLWpvYiAvbGtwL3NjaGVkdWxlZC9sa3At bmUwNC9jeWNsaWNfZnNtYXJrLXBlcmZvcm1hbmNlLTF4LTMydC0xSERELXhmcy01Sy00MDBN LWZzeW5jQmVmb3JlQ2xvc2UtMTZkLTI1NmZwZC14ODZfNjQtcmhlbC1IRUFELTdkMzNmZTlh YjllYWNlMjQwM2FkZWZlYTNjNmRjMmM5MmEwYTUxODUtMC55YW1sCnJ1bjogL2xrcC9sa3Av c3JjL3NldHVwL2NwdWZyZXFfZ292ZXJub3IgcGVyZm9ybWFuY2UJe30KMjAxNC0xMC0yOCAw MDo1MDo0MCBlY2hvIHBlcmZvcm1hbmNlID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1 MC9jcHVmcmVxL3NjYWxpbmdfZ292ZXJub3IKMjAxNC0xMC0yOCAwMDo1MDo0MCBlY2hvIHBl cmZvcm1hbmNlID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MS9jcHVmcmVxL3NjYWxp bmdfZ292ZXJub3IKcnVuOiAvbGtwL2xrcC9zcmMvbW9uaXRvcnMvZXZlbnQvd2FpdCBwcmUt dGVzdAl7fQoyMDE0LTEwLTI4IDAwOjUwOjQwIGVjaG8gcGVyZm9ybWFuY2UgPiAvc3lzL2Rl dmljZXMvc3lzdGVtL2NwdS9jcHUxMC9jcHVmcmVxL3NjYWxpbmdfZ292ZXJub3IKcnVuOiAv bGtwL2xrcC9zcmMvbW9uaXRvcnMvd3JhcHBlciB3YXRjaC1vb20Je30KMjAxNC0xMC0yOCAw MDo1MDo0MCBlY2hvIHBlcmZvcm1hbmNlID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1 MTEvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3Jz L3dyYXBwZXIgd2F0Y2hkb2cJe30KMjAxNC0xMC0yOCAwMDo1MDo0MCBlY2hvIHBlcmZvcm1h bmNlID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MTIvY3B1ZnJlcS9zY2FsaW5nX2dv dmVybm9yCjIwMTQtMTAtMjggMDA6NTA6NDAgZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMvZGV2 aWNlcy9zeXN0ZW0vY3B1L2NwdTEzL2NwdWZyZXEvc2NhbGluZ19nb3Zlcm5vcgpbICAgMjAu NTM3MjU1XSBJUE1JIFdhdGNoZG9nOiBkcml2ZXIgaW5pdGlhbGl6ZWQKMjAxNC0xMC0yOCAw MDo1MDo0MCBlY2hvIHBlcmZvcm1hbmNlID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1 MTQvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yClsgICAyMC41NjI3MjddIElQTUkgbWVzc2Fn ZSBoYW5kbGVyOiBCTUMgcmV0dXJuZWQgaW5jb3JyZWN0IHJlc3BvbnNlLCBleHBlY3RlZCBu ZXRmbiA3IGNtZCAyMiwgZ290IG5ldGZuIDcgY21kIDI0ClsgICAyMC41NjI3MjddIElQTUkg V2F0Y2hkb2c6IHJlc3BvbnNlOiBFcnJvciBmZiBvbiBjbWQgMjIKMjAxNC0xMC0yOCAwMDo1 MDo0MCBlY2hvIHBlcmZvcm1hbmNlID4gL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MTUv Y3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCjIwMTQtMTAtMjggMDA6NTA6NDAgZWNobyBwZXJm b3JtYW5jZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTIvY3B1ZnJlcS9zY2FsaW5n X2dvdmVybm9yCjIwMTQtMTAtMjggMDA6NTA6NDAgZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMv ZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTMvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCjIwMTQt MTAtMjggMDA6NTA6NDAgZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0v Y3B1L2NwdTQvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCjIwMTQtMTAtMjggMDA6NTA6NDAg ZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTUvY3B1ZnJl cS9zY2FsaW5nX2dvdmVybm9yCjIwMTQtMTAtMjggMDA6NTA6NDAgZWNobyBwZXJmb3JtYW5j ZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTYvY3B1ZnJlcS9zY2FsaW5nX2dvdmVy bm9yCjIwMTQtMTAtMjggMDA6NTA6NDAgZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMvZGV2aWNl cy9zeXN0ZW0vY3B1L2NwdTcvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCjIwMTQtMTAtMjgg MDA6NTA6NDAgZWNobyBwZXJmb3JtYW5jZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2Nw dTgvY3B1ZnJlcS9zY2FsaW5nX2dvdmVybm9yCjIwMTQtMTAtMjggMDA6NTA6NDAgZWNobyBw ZXJmb3JtYW5jZSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTkvY3B1ZnJlcS9zY2Fs aW5nX2dvdmVybm9yCnJ1bjogL2xrcC9sa3Avc3JjL3NldHVwL2l0ZXJhdGlvbnMgMXgJe30K cnVuOiAvbGtwL2xrcC9zcmMvc2V0dXAvbnJfdGhyZWFkcyAzMnQJe30KcnVuOiAvbGtwL2xr cC9zcmMvc2V0dXAvZGlzawl7Im5yX2hkZCI9PiIxIn0KcnVuOiAvbGtwL2xrcC9zcmMvc2V0 dXAvZnMJeyJmcyI9PiJ4ZnMifQoyMDE0LTEwLTI4IDAwOjUwOjQxIG1rZnMgLXQgeGZzIC9k ZXYvc2RhMwptZXRhLWRhdGE9L2Rldi9zZGEzICAgICAgICAgICAgICBpc2l6ZT0yNTYgICAg YWdjb3VudD00LCBhZ3NpemU9OTcwNjE3OCBibGtzCiAgICAgICAgID0gICAgICAgICAgICAg ICAgICAgICAgIHNlY3Rzej01MTIgICBhdHRyPTIsIHByb2ppZDMyYml0PTEKICAgICAgICAg PSAgICAgICAgICAgICAgICAgICAgICAgY3JjPTAgICAgICAgIGZpbm9idD0wCmRhdGEgICAg ID0gICAgICAgICAgICAgICAgICAgICAgIGJzaXplPTQwOTYgICBibG9ja3M9Mzg4MjQ3MTAs IGltYXhwY3Q9MjUKICAgICAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgc3VuaXQ9MCAg ICAgIHN3aWR0aD0wIGJsa3MKbmFtaW5nICAgPXZlcnNpb24gMiAgICAgICAgICAgICAgYnNp emU9NDA5NiAgIGFzY2lpLWNpPTAgZnR5cGU9MApsb2cgICAgICA9aQpbICAgMjIuMDEwMDQw XSBYRlMgKHNkYTMpOiBNb3VudGluZyBWNCBGaWxlc3lzdGVtCm50ZXJuYWwgbG9nICAgICAg ICAgICBic2l6ZT00MDk2ICAgYmxvY2tzPTE4OTU3LCB2ZXJzaW9uPTIKICAgICAgICAgPSAg ICAgICAgICAgICAgICAgICAgICAgc2VjdHN6PTUxMiAgIHN1bml0PTAgYmxrcywgbGF6eS1j b3VudD0xCnJlYWx0aW1lID1ub25lICAgICAgICAgICAgICAgICAgIGV4dHN6PTQwOTYgICBi bG9ja3M9MCwgcnRleHRlbnRzPTAKMjAxNC0xMC0yOCAwMDo1MDo0MiBtb3VudCAtdCB4ZnMg LW8gbm9iYXJyaWVyLGlub2RlNjQgL2Rldi9zZGEzIC9mcy9zZGEzClsgICAyMi4wODQ0ODZd IFhGUyAoc2RhMyk6IEVuZGluZyBjbGVhbiBtb3VudApydW46IHByZS10ZXN0CnJ1bjogL2xr cC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIgdXB0aW1lCXt9CnJ1bjogL2xrcC9sa3Avc3Jj L21vbml0b3JzL3dyYXBwZXIgaW9zdGF0CXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3Jz L3dyYXBwZXIgdm1zdGF0CXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIg bnVtYS1udW1hc3RhdAl7fQpydW46IC9sa3AvbGtwL3NyYy9tb25pdG9ycy93cmFwcGVyIG51 bWEtdm1zdGF0CXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIgbnVtYS1t ZW1pbmZvCXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIgcHJvYy12bXN0 YXQJe30KcnVuOiAvbGtwL2xrcC9zcmMvbW9uaXRvcnMvd3JhcHBlciBwcm9jLXN0YXQJe30K cnVuOiAvbGtwL2xrcC9zcmMvbW9uaXRvcnMvd3JhcHBlciBtZW1pbmZvCXt9CnJ1bjogL2xr cC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIgc2xhYmluZm8Je30KcnVuOiAvbGtwL2xrcC9z cmMvbW9uaXRvcnMvd3JhcHBlciBpbnRlcnJ1cHRzCXt9CnJ1bjogL2xrcC9sa3Avc3JjL21v bml0b3JzL3dyYXBwZXIgbG9ja19zdGF0CXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3Jz L3dyYXBwZXIgbGF0ZW5jeV9zdGF0cwl7fQpydW46IC9sa3AvbGtwL3NyYy9tb25pdG9ycy93 cmFwcGVyIHNvZnRpcnFzCXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIg YmRpX2Rldl9tYXBwaW5nCXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIg ZGlza3N0YXRzCXt9CnJ1bjogL2xrcC9sa3Avc3JjL21vbml0b3JzL3dyYXBwZXIgY3B1aWRs ZQl7fQpydW46IC9sa3AvbGtwL3NyYy9tb25pdG9ycy93cmFwcGVyIGNwdWZyZXEJe30KcnVu OiAvbGtwL2xrcC9zcmMvbW9uaXRvcnMvd3JhcHBlciB0dXJib3N0YXQJe30KcnVuOiAvbGtw L2xrcC9zcmMvbW9uaXRvcnMvd3JhcHBlciBzY2hlZF9kZWJ1Zwl7ImludGVydmFsIj0+IjEw In0KcnVuOiAvbGtwL2xrcC9zcmMvbW9uaXRvcnMvd3JhcHBlciBwbWV0ZXIJe30KcnVuOiAv dXNyL2Jpbi90aW1lIC12IC1vIC9sa3AvbGtwL3NyYy90bXAvdGltZSAvbGtwL2xrcC9zcmMv dGVzdHMvd3JhcHBlciBmc21hcmsJeyJmaWxlc2l6ZSI9PiI1SyIsICJ0ZXN0X3NpemUiPT4i NDAwTSIsICJzeW5jX21ldGhvZCI9PiJmc3luY0JlZm9yZUNsb3NlIiwgIm5yX2RpcmVjdG9y aWVzIj0+IjE2ZCIsICJucl9maWxlc19wZXJfZGlyZWN0b3J5Ij0+IjI1NmZwZCJ9CjIwMTQt MTAtMjggMDA6NTA6NDMgLi9mc19tYXJrIC1kIC9mcy9zZGEzLzEgLWQgL2ZzL3NkYTMvMiAt ZCAvZnMvc2RhMy8zIC1kIC9mcy9zZGEzLzQgLWQgL2ZzL3NkYTMvNSAtZCAvZnMvc2RhMy82 IC1kIC9mcy9zZGEzLzcgLWQgL2ZzL3NkYTMvOCAtZCAvZnMvc2RhMy85IC1kIC9mcy9zZGEz LzEwIC1kIC9mcy9zZGEzLzExIC1kIC9mcy9zZGEzLzEyIC1kIC9mcy9zZGEzLzEzIC1kIC9m cy9zZGEzLzE0IC1kIC9mcy9zZGEzLzE1IC1kIC9mcy9zZGEzLzE2IC1kIC9mcy9zZGEzLzE3 IC1kIC9mcy9zZGEzLzE4IC1kIC9mcy9zZGEzLzE5IC1kIC9mcy9zZGEzLzIwIC1kIC9mcy9z ZGEzLzIxIC1kIC9mcy9zZGEzLzIyIC1kIC9mcy9zZGEzLzIzIC1kIC9mcy9zZGEzLzI0IC1k IC9mcy9zZGEzLzI1IC1kIC9mcy9zZGEzLzI2IC1kIC9mcy9zZGEzLzI3IC1kIC9mcy9zZGEz LzI4IC1kIC9mcy9zZGEzLzI5IC1kIC9mcy9zZGEzLzMwIC1kIC9mcy9zZGEzLzMxIC1kIC9m cy9zZGEzLzMyIC1EIDE2IC1OIDI1NiAtbiAyNTYwIC1MIDEgLVMgMSAtcyA1MTIwCgojICAu L2ZzX21hcmsgIC1kICAvZnMvc2RhMy8xICAtZCAgL2ZzL3NkYTMvMiAgLWQgClsgICAyMy4y Nzg0MDFdIGF0YTI6IGlsbGVnYWwgcWNfYWN0aXZlIHRyYW5zaXRpb24gKDc3YzA3ZmZmLT43 ZjgwN2ZmZikKIC9mcy9zZGEzLzMgIC1kICAvZnMvc2RhMy80ICAtZCAgL2ZzL3NkYTMvNSAg LWQgIC9mcy9zZGEzLzYgIC1kICAvZnMvc2RhMy83ICAtZCAgL2ZzL3NkYTMvOCAgLWQgIC9m cy9zZGEzLzkgIC1kICAvZnMvc2RhMy8xMCAgLWQgIC9mcy9zZGEzLzExICAtZCAgL2ZzL3Nk YTMvMTIgIC1kICAvZnMvc2RhMy8xMyAgLWQgIC9mcy9zZGEzLzE0ICAtZCAgL2ZzL3NkYTMv MTUgIC1kICAvZnMvc2RhMy8xNiAgLWQgIC9mcy9zZGEzLzE3ICAtZCAgL2ZzL3NkYTMvMTgg IC1kICAvZnMvc2RhMy8xOSAgLWQgIC9mcy9zZGEzLzIwICAtZCAgL2ZzL3NkYTMvMjEgIC1k ICAvZnMvc2RhMy8yMiAgLWQgIC9mcy9zZGEzLzIzICAtZCAgL2ZzL3NkYTMvMjQgIC1kICAv ZnMvc2RhMy8yNSAgLWQgIC9mcy9zZGEzLzI2ICAtZCAgL2ZzL3NkYTMvMjcgIC1kICAvZnMv c2RhMy8yOCAgLWQgIC9mcy9zZGEzLzI5ICAtZCAgL2ZzL3NkYTMvMzAKWyAgIDIzLjI5MTY2 OV0gYXRhMi4wMDogZXhjZXB0aW9uIEVtYXNrIDB4MiBTQWN0IDB4NzdjMDdmZmYgU0VyciAw eDAgYWN0aW9uIDB4NiBmcm96ZW4KICAtZCAgL2ZzL3NkYTMvMwpbICAgMjMuMjkxNjcxXSBh dGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVECjEgIC1kICAvZnMv c2RhMy8KWyAgIDIzLjI5MTY3NF0gYXRhMi4wMDogY21kIDYxLzEwOjAwOmE4OjA2OmY5LzAw OjAwOjMwOjAwOjAwLzQwIHRhZyAwIG5jcSA4MTkyIG91dApbICAgMjMuMjkxNjc0XSAgICAg ICAgICByZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgy IChIU00gdmlvbGF0aW9uKQozMiAgLUQgIDE2ICAtTiAgClsgICAyMy4yOTE2NzVdIGF0YTIu MDA6IHN0YXR1czogeyBEUkRZIH0KMjU2ICAtbiAgMjU2MCAgLQpbICAgMjMuMjkxNjc2XSBh dGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVECkwgIDEgIC1TICAx ICAtcyAKWyAgIDIzLjI5MTY3OF0gYXRhMi4wMDogY21kIDYxLzEwOjA4OmYwOjA5OmI1LzAw OjAwOjI3OjAwOjAwLzQwIHRhZyAxIG5jcSA4MTkyIG91dApbICAgMjMuMjkxNjc4XSAgICAg ICAgICByZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgy IChIU00gdmlvbGF0aW9uKQogNTEyMCAKIwlWZXJzaW8KWyAgIDIzLjI5MTY3OV0gYXRhMi4w MDogc3RhdHVzOiB7IERSRFkgfQpuIDMuMywgMzIgdGhyZWFkClsgICAyMy4yOTE2NzldIGF0 YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKKHMpIHN0YXJ0aW5n IGF0IApbICAgMjMuMjkxNjgyXSBhdGEyLjAwOiBjbWQgNjEvMTA6MTA6MjA6ZTA6NTUvMDA6 MDA6MmM6MDA6MDAvNDAgdGFnIDIgbmNxIDgxOTIgb3V0ClsgICAyMy4yOTE2ODJdICAgICAg ICAgIHJlcyA0MC8wMDo3MDpmMDowNjpmOS8wMDowMDozMDowMDowMC80MCBFbWFzayAweDIg KEhTTSB2aW9sYXRpb24pClR1ZSBPY3QgMjggMDA6NTAKWyAgIDIzLjI5MTY4Ml0gYXRhMi4w MDogc3RhdHVzOiB7IERSRFkgfQo6NDMgMjAxNAojCVN5bmMKWyAgIDIzLjI5MTY4M10gYXRh Mi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAogbWV0aG9kOiBJTkJB TkQgClsgICAyMy4yOTE2ODVdIGF0YTIuMDA6IGNtZCA2MS8xMDoxODowMDowYTpiNS8wMDow MDoyNzowMDowMC80MCB0YWcgMyBuY3EgODE5MiBvdXQKWyAgIDIzLjI5MTY4NV0gICAgICAg ICAgcmVzIDQwLzAwOjcwOmYwOjA2OmY5LzAwOjAwOjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAo SFNNIHZpb2xhdGlvbikKRlNZTkM6IGZzeW5jKCkgcApbICAgMjMuMjkxNjg2XSBhdGEyLjAw OiBzdGF0dXM6IHsgRFJEWSB9CmVyIGZpbGUgaW4gd3JpdGUKWyAgIDIzLjI5MTY4N10gYXRh Mi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAogbG9vcC4KIwlEaXJl Y3QKWyAgIDIzLjI5MTY5Ml0gYXRhMi4wMDogY21kIDYxLzEwOjIwOjEwOjBhOmI1LzAwOjAw OjI3OjAwOjAwLzQwIHRhZyA0IG5jcSA4MTkyIG91dApbICAgMjMuMjkxNjkyXSAgICAgICAg ICByZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgyIChI U00gdmlvbGF0aW9uKQpvcmllczogIFJvdW5kIFJvClsgICAyMy4yOTE2OTJdIGF0YTIuMDA6 IHN0YXR1czogeyBEUkRZIH0KYmluIGJldHdlZW4gZGlyZQpbICAgMjMuMjkxNjkzXSBhdGEy LjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVECmN0b3JpZXMgYWNyb3Nz IDEKWyAgIDIzLjI5MTY5NV0gYXRhMi4wMDogY21kIDYxLzEwOjI4OjcwOjhjOjk3LzAwOjAw OjM1OjAwOjAwLzQwIHRhZyA1IG5jcSA4MTkyIG91dApbICAgMjMuMjkxNjk1XSAgICAgICAg ICByZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgyIChI U00gdmlvbGF0aW9uKQo2IHN1YmRpcmVjdG9yaWVzClsgICAyMy4yOTE2OTZdIGF0YTIuMDA6 IHN0YXR1czogeyBEUkRZIH0KIHdpdGggMjU2IGZpbGVzIApbICAgMjMuMjkxNjk2XSBhdGEy LjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVECnBlciBzdWJkaXJlY3Rv cnkKWyAgIDIzLjI5MTY5OV0gYXRhMi4wMDogY21kIDYxLzEwOjMwOjM4OmUwOjU1LzAwOjAw OjJjOjAwOjAwLzQwIHRhZyA2IG5jcSA4MTkyIG91dApbICAgMjMuMjkxNjk5XSAgICAgICAg ICByZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgyIChI U00gdmlvbGF0aW9uKQouCiMJRmlsZSBuYW1lczoKWyAgIDIzLjI5MTY5OV0gYXRhMi4wMDog c3RhdHVzOiB7IERSRFkgfQogNDAgYnl0ZXMgbG9uZywgClsgICAyMy4yOTE3MDBdIGF0YTIu MDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKKDE2IGluaXRpYWwgYnl0 ZQpbICAgMjMuMjkxNzAyXSBhdGEyLjAwOiBjbWQgNjEvMTA6Mzg6MjA6MGE6YjUvMDA6MDA6 Mjc6MDA6MDAvNDAgdGFnIDcgbmNxIDgxOTIgb3V0ClsgICAyMy4yOTE3MDJdICAgICAgICAg IHJlcyA0MC8wMDo3MDpmMDowNjpmOS8wMDowMDozMDowMDowMC80MCBFbWFzayAweDIgKEhT TSB2aW9sYXRpb24pCnMgb2YgdGltZSBzdGFtcCAKWyAgIDIzLjI5MTcwM10gYXRhMi4wMDog c3RhdHVzOiB7IERSRFkgfQp3aXRoIDI0IHJhbmRvbSBiClsgICAyMy4yOTE3MDNdIGF0YTIu MDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKeXRlcyBhdCBlbmQgb2Yg bgpbICAgMjMuMjkxNzA2XSBhdGEyLjAwOiBjbWQgNjEvMTA6NDA6MzA6MGE6YjUvMDA6MDA6 Mjc6MDA6MDAvNDAgdGFnIDggbmNxIDgxOTIgb3V0ClsgICAyMy4yOTE3MDZdICAgICAgICAg IHJlcyA0MC8wMDo3MDpmMDowNjpmOS8wMDowMDozMDowMDowMC80MCBFbWFzayAweDIgKEhT TSB2aW9sYXRpb24pCmFtZSkKIwlGaWxlcyBpbgpbICAgMjMuMjkxNzA2XSBhdGEyLjAwOiBz dGF0dXM6IHsgRFJEWSB9CmZvOiBzaXplIDUxMjAgYnkKWyAgIDIzLjI5MTcwN10gYXRhMi4w MDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAp0ZXMsIHdyaXR0ZW4gd2l0 ClsgICAyMy4yOTE3MDldIGF0YTIuMDA6IGNtZCA2MS8xMDo0ODpkMDowNjpmOS8wMDowMDoz MDowMDowMC80MCB0YWcgOSBuY3EgODE5MiBvdXQKWyAgIDIzLjI5MTcwOV0gICAgICAgICAg cmVzIDQwLzAwOjcwOmYwOjA2OmY5LzAwOjAwOjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAoSFNN IHZpb2xhdGlvbikKaCBhbiBJTyBzaXplIG9mIApbICAgMjMuMjkxNzEwXSBhdGEyLjAwOiBz dGF0dXM6IHsgRFJEWSB9CjE2Mzg0IGJ5dGVzIHBlciAKWyAgIDIzLjI5MTcxMF0gYXRhMi4w MDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAp3cml0ZQojCUFwcCBvdmUK WyAgIDIzLjI5MTcxM10gYXRhMi4wMDogY21kIDYxLzEwOjUwOjkwOjhjOjk3LzAwOjAwOjM1 OjAwOjAwLzQwIHRhZyAxMCBuY3EgODE5MiBvdXQKWyAgIDIzLjI5MTcxM10gICAgICAgICAg cmVzIDQwLzAwOjcwOmYwOjA2OmY5LzAwOjAwOjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAoSFNN IHZpb2xhdGlvbikKcmhlYWQgaXMgdGltZSBpbgpbICAgMjMuMjkxNzEzXSBhdGEyLjAwOiBz dGF0dXM6IHsgRFJEWSB9CiBtaWNyb3NlY29uZHMgc3AKWyAgIDIzLjI5MTcxNF0gYXRhMi4w MDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAplbnQgaW4gdGhlIHRlc3Qg ClsgICAyMy4yOTE3MTZdIGF0YTIuMDA6IGNtZCA2MS8xMDo1ODo1MDplMDo1NS8wMDowMDoy YzowMDowMC80MCB0YWcgMTEgbmNxIDgxOTIgb3V0ClsgICAyMy4yOTE3MTZdICAgICAgICAg IHJlcyA0MC8wMDo3MDpmMDowNjpmOS8wMDowMDozMDowMDowMC80MCBFbWFzayAweDIgKEhT TSB2aW9sYXRpb24pCm5vdCBkb2luZyBmaWxlIHcKWyAgIDIzLjI5MTcxN10gYXRhMi4wMDog c3RhdHVzOiB7IERSRFkgfQpyaXRpbmcgcmVsYXRlZCBzClsgICAyMy4yOTE3MTddIGF0YTIu MDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKeXN0ZW0gY2FsbHMuCgpb ICAgMjMuMjkxNzIwXSBhdGEyLjAwOiBjbWQgNjEvMTA6NjA6ZTA6MDY6ZjkvMDA6MDA6MzA6 MDA6MDAvNDAgdGFnIDEyIG5jcSA4MTkyIG91dApbICAgMjMuMjkxNzIwXSAgICAgICAgICBy ZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgyIChIU00g dmlvbGF0aW9uKQpGU1VzZSUgICAgICAgIENvClsgICAyMy4yOTE3MjFdIGF0YTIuMDA6IHN0 YXR1czogeyBEUkRZIH0KdW50ICAgICAgICAgU2l6ZQpbICAgMjMuMjkxNzI1XSBhdGEyLjAw OiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVECiAgICBGaWxlcy9zZWMgICAK WyAgIDIzLjI5MTcyOV0gYXRhMi4wMDogY21kIDYxLzEwOjY4OjcwOmUwOjU1LzAwOjAwOjJj OjAwOjAwLzQwIHRhZyAxMyBuY3EgODE5MiBvdXQKWyAgIDIzLjI5MTcyOV0gICAgICAgICAg cmVzIDQwLzAwOjcwOmYwOjA2OmY5LzAwOjAwOjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAoSFNN IHZpb2xhdGlvbikKICBBcHAgT3ZlcmhlYWQKWyAgIDIzLjI5MTczMV0gYXRhMi4wMDogc3Rh dHVzOiB7IERSRFkgfQpbICAgMjMuMjkxNzM0XSBhdGEyLjAwOiBmYWlsZWQgY29tbWFuZDog V1JJVEUgRlBETUEgUVVFVUVEClsgICAyMy4yOTE3MzhdIGF0YTIuMDA6IGNtZCA2MS8xMDo3 MDpmMDowNjpmOS8wMDowMDozMDowMDowMC80MCB0YWcgMTQgbmNxIDgxOTIgb3V0ClsgICAy My4yOTE3MzhdICAgICAgICAgIHJlcyA0MC8wMDo3MDpmMDowNjpmOS8wMDowMDozMDowMDow MC80MCBFbWFzayAweDIgKEhTTSB2aW9sYXRpb24pClsgICAyMy4yOTE3NDBdIGF0YTIuMDA6 IHN0YXR1czogeyBEUkRZIH0KWyAgIDIzLjI5MTc0M10gYXRhMi4wMDogZmFpbGVkIGNvbW1h bmQ6IFdSSVRFIEZQRE1BIFFVRVVFRApbICAgMjMuMjkxNzQ2XSBhdGEyLjAwOiBjbWQgNjEv MDk6YjA6Mjg6YjU6ZjYvMDA6MDA6MzA6MDA6MDAvNDAgdGFnIDIyIG5jcSA0NjA4IG91dApb ICAgMjMuMjkxNzQ2XSAgICAgICAgICByZXMgNDAvMDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6 MDA6MDAvNDAgRW1hc2sgMHgyIChIU00gdmlvbGF0aW9uKQpbICAgMjMuMjkxNzQ4XSBhdGEy LjAwOiBzdGF0dXM6IHsgRFJEWSB9ClsgICAyMy4yOTE3NTFdIGF0YTIuMDA6IGZhaWxlZCBj b21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKWyAgIDIzLjI5MTc1NV0gYXRhMi4wMDogY21k IDYxLzEwOmI4OmU4OmRmOjU1LzAwOjAwOjJjOjAwOjAwLzQwIHRhZyAyMyBuY3EgODE5MiBv dXQKWyAgIDIzLjI5MTc1NV0gICAgICAgICAgcmVzIDQwLzAwOjcwOmYwOjA2OmY5LzAwOjAw OjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAoSFNNIHZpb2xhdGlvbikKWyAgIDIzLjI5MTc1N10g YXRhMi4wMDogc3RhdHVzOiB7IERSRFkgfQpbICAgMjMuMjkxNzYwXSBhdGEyLjAwOiBmYWls ZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVEClsgICAyMy4yOTE3NjRdIGF0YTIuMDA6 IGNtZCA2MS8xMDpjMDoxODo4Yzo5Ny8wMDowMDozNTowMDowMC80MCB0YWcgMjQgbmNxIDgx OTIgb3V0ClsgICAyMy4yOTE3NjRdICAgICAgICAgIHJlcyA0MC8wMDo3MDpmMDowNjpmOS8w MDowMDozMDowMDowMC80MCBFbWFzayAweDIgKEhTTSB2aW9sYXRpb24pClsgICAyMy4yOTE3 NjZdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIH0KWyAgIDIzLjI5MTc2OV0gYXRhMi4wMDog ZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRApbICAgMjMuMjkxNzczXSBhdGEy LjAwOiBjbWQgNjEvMTA6Yzg6Nzg6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgdGFnIDI1IG5j cSA4MTkyIG91dApbICAgMjMuMjkxNzczXSAgICAgICAgICByZXMgNDAvMDA6NzA6ZjA6MDY6 ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgyIChIU00gdmlvbGF0aW9uKQpbICAgMjMu MjkxNzc1XSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSB9ClsgICAyMy4yOTE3NzhdIGF0YTIu MDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKWyAgIDIzLjI5MTc4MV0g YXRhMi4wMDogY21kIDYxLzEwOmQwOjMwOjhjOjk3LzAwOjAwOjM1OjAwOjAwLzQwIHRhZyAy NiBuY3EgODE5MiBvdXQKWyAgIDIzLjI5MTc4MV0gICAgICAgICAgcmVzIDQwLzAwOjcwOmYw OjA2OmY5LzAwOjAwOjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAoSFNNIHZpb2xhdGlvbikKWyAg IDIzLjI5MTc4M10gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgfQpbICAgMjMuMjkxNzg2XSBh dGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVEClsgICAyMy4yOTE3 OTNdIGF0YTIuMDA6IGNtZCA2MS8xMDplMDowODplMDo1NS8wMDowMDoyYzowMDowMC80MCB0 YWcgMjggbmNxIDgxOTIgb3V0ClsgICAyMy4yOTE3OTNdICAgICAgICAgIHJlcyA0MC8wMDo3 MDpmMDowNjpmOS8wMDowMDozMDowMDowMC80MCBFbWFzayAweDIgKEhTTSB2aW9sYXRpb24p ClsgICAyMy4yOTE3OTRdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIH0KWyAgIDIzLjI5MTc5 Nl0gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRApbICAgMjMu MjkxNzk5XSBhdGEyLjAwOiBjbWQgNjEvMTA6ZTg6OTA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAv NDAgdGFnIDI5IG5jcSA4MTkyIG91dApbICAgMjMuMjkxNzk5XSAgICAgICAgICByZXMgNDAv MDA6NzA6ZjA6MDY6ZjkvMDA6MDA6MzA6MDA6MDAvNDAgRW1hc2sgMHgyIChIU00gdmlvbGF0 aW9uKQpbICAgMjMuMjkxODAwXSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSB9ClsgICAyMy4y OTE4MDJdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKWyAg IDIzLjI5MTgwNV0gYXRhMi4wMDogY21kIDYxLzEwOmYwOjQ4OjhjOjk3LzAwOjAwOjM1OjAw OjAwLzQwIHRhZyAzMCBuY3EgODE5MiBvdXQKWyAgIDIzLjI5MTgwNV0gICAgICAgICAgcmVz IDQwLzAwOjcwOmYwOjA2OmY5LzAwOjAwOjMwOjAwOjAwLzQwIEVtYXNrIDB4MiAoSFNNIHZp b2xhdGlvbikKWyAgIDIzLjI5MTgwN10gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgfQpbICAg MjMuMjkxODE2XSBhdGEyOiBoYXJkIHJlc2V0dGluZyBsaW5rClsgICAyMy41OTY4MDJdIGF0 YTI6IFNBVEEgbGluayB1cCAzLjAgR2JwcyAoU1N0YXR1cyAxMjMgU0NvbnRyb2wgMzAwKQpb ICAgMjMuNTk5OTY0XSBhdGEyLjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEzMwpbICAgMjMu NTk5OTk2XSBhdGEyOiBFSCBjb21wbGV0ZQoKPT0+IC9sa3AvbGtwL3NyYy90bXAvc3RkZXJy IDw9PQpmc19tYXJrOiBmc3luYyBmYWlsZWQgSW5wdXQvb3V0cHV0IGVycm9yCmZzX21hcms6 IGZzeW5jIGZhaWxlZCBJbnB1dC9vdXRwdXQgZXJyb3IKCmZzX21hcms6IGZzeW5jIApbICAg MjQuMzE4NzQ3XSBhdGEyLjAwOiBpcnFfc3RhdCAweDQwMDAwMDAxCmZhaWxlZCBJbnB1dC9v dXQKWyAgIDI0LjMxODc0OV0gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1B IFFVRVVFRApwdXQgZXJyb3IKZnNfbWEKWyAgIDI0LjMxODc1NV0gYXRhMi4wMDogY21kIDYx LzEwOjAwOmIwOjFlOmY5LzAwOjAwOjMwOjAwOjAwLzQwIHRhZyAwIG5jcSA4MTkyIG91dApb ICAgMjQuMzE4NzU1XSAgICAgICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6 MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVkaWEgZXJyb3IpCnJrOiBmc3luYyBmYWlsZWQKWyAg IDI0LjMxODc1Nl0gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJSIH0KIElucHV0L291dHB1 dCBlcgpbICAgMjQuMzE4NzU4XSBhdGEyLjAwOiBlcnJvcjogeyBVTkMgSURORiBBQlJUIH0K cm9yCmZzX21hcms6IGZzClsgICAyNC4zMTg3NTldIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5k OiBXUklURSBGUERNQSBRVUVVRUQKeW5jIGZhaWxlZCBJbnB1dApbICAgMjQuMzE4NzY0XSBh dGEyLjAwOiBjbWQgNjEvMTA6MDg6YTA6Zjc6NTUvMDA6MDA6MmM6MDA6MDAvNDAgdGFnIDEg bmNxIDgxOTIgb3V0ClsgICAyNC4zMTg3NjRdICAgICAgICAgIHJlcyA0MS81NDoxMDoxMDph NDo5Ny8wMDowMDozNTowMDowMC80MCBFbWFzayAweDg5IChtZWRpYSBlcnJvcikKL291dHB1 dCBlcnJvcgpmClsgICAyNC4zMTg3NjZdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIEVSUiB9 CnNfbWFyazogZnN5bmMgZmEKWyAgIDI0LjMxODc2N10gYXRhMi4wMDogZXJyb3I6IHsgVU5D IElETkYgQUJSVCB9CmlsZWQgSW5wdXQvb3V0cHUKWyAgIDI0LjMxODc2OF0gYXRhMi4wMDog ZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAp0IGVycm9yCmZzX21hcmsKWyAg IDI0LjMxODc3M10gYXRhMi4wMDogY21kIDYxLzEwOjEwOmIwOmY3OjU1LzAwOjAwOjJjOjAw OjAwLzQwIHRhZyAyIG5jcSA4MTkyIG91dApbICAgMjQuMzE4NzczXSAgICAgICAgICByZXMg NDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVkaWEg ZXJyb3IpCjogZnN5bmMgZmFpbGVkIEkKWyAgIDI0LjMxODc3NF0gYXRhMi4wMDogc3RhdHVz OiB7IERSRFkgRVJSIH0KbnB1dC9vdXRwdXQgZXJybwpbICAgMjQuMzE4Nzc1XSBhdGEyLjAw OiBlcnJvcjogeyBVTkMgSURORiBBQlJUIH0Kcgpmc19tYXJrOiBmc3luClsgICAyNC4zMTg3 NzddIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKYyBmYWls ZWQgSW5wdXQvbwpbICAgMjQuMzE4NzgyXSBhdGEyLjAwOiBjbWQgNjEvMTA6MTg6YjA6YTM6 OTcvMDA6MDA6MzU6MDA6MDAvNDAgdGFnIDMgbmNxIDgxOTIgb3V0ClsgICAyNC4zMTg3ODJd ICAgICAgICAgIHJlcyA0MS81NDoxMDoxMDphNDo5Ny8wMDowMDozNTowMDowMC80MCBFbWFz ayAweDg5IChtZWRpYSBlcnJvcikKdXRwdXQgZXJyb3IKZnNfClsgICAyNC4zMTg3ODNdIGF0 YTIuMDA6IHN0YXR1czogeyBEUkRZIEVSUiB9Cm1hcms6IGZzeW5jIGZhaWwKWyAgIDI0LjMx ODc4NF0gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElETkYgQUJSVCB9CmVkIElucHV0L291dHB1 dCAKWyAgIDI0LjMxODc4Nl0gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1B IFFVRVVFRAplcnJvcgpmc19tYXJrOiAKWyAgIDI0LjMxODc5MF0gYXRhMi4wMDogY21kIDYx LzEwOjIwOmEwOjIxOmI1LzAwOjAwOjI3OjAwOjAwLzQwIHRhZyA0IG5jcSA4MTkyIG91dApb ICAgMjQuMzE4NzkwXSAgICAgICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6 MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVkaWEgZXJyb3IpCmZzeW5jIGZhaWxlZCBJbnAKWyAg IDI0LjMxODc5Ml0gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJSIH0KCmZzX21hcms6IGZz eW5jIApbICAgMjQuMzE4Nzk0XSBhdGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBE TUEgUVVFVUVECmZhaWxlZCBJbnB1dC9vdXQKWyAgIDI0LjMxODc5OV0gYXRhMi4wMDogY21k IDYxLzEwOjI4OmMwOmEzOjk3LzAwOjAwOjM1OjAwOjAwLzQwIHRhZyA1IG5jcSA4MTkyIG91 dApbICAgMjQuMzE4Nzk5XSAgICAgICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6 MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVkaWEgZXJyb3IpCnB1dCBlcnJvcgpmc19tYQpb ICAgMjQuMzE4ODAwXSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBFUlIgfQpyazogZnN5bmMg ZmFpbGVkClsgICAyNC4zMTg4MDFdIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQg fQogSW5wdXQvb3V0cHV0IGVyClsgICAyNC4zMTg4MDNdIGF0YTIuMDA6IGZhaWxlZCBjb21t YW5kOiBXUklURSBGUERNQSBRVUVVRUQKcm9yCmZzX21hcms6IGZzClsgICAyNC4zMTg4MDhd IGF0YTIuMDA6IGNtZCA2MS8xMDozMDpjMDpmNzo1NS8wMDowMDoyYzowMDowMC80MCB0YWcg NiBuY3EgODE5MiBvdXQKWyAgIDI0LjMxODgwOF0gICAgICAgICAgcmVzIDQxLzU0OjEwOjEw OmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzQwIEVtYXNrIDB4ODkgKG1lZGlhIGVycm9yKQp5bmMg ZmFpbGVkIElucHV0ClsgICAyNC4zMTg4MDldIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIEVS UiB9Ci9vdXRwdXQgZXJyb3IKZgpbICAgMjQuMzE4ODEwXSBhdGEyLjAwOiBlcnJvcjogeyBV TkMgSURORiBBQlJUIH0Kc19tYXJrOiBmc3luYyBmYQpbICAgMjQuMzE4ODExXSBhdGEyLjAw OiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVECmlsZWQgSW5wdXQvb3V0cHUK WyAgIDI0LjMxODgxNl0gYXRhMi4wMDogY21kIDYxLzEwOjM4OmIwOjIxOmI1LzAwOjAwOjI3 OjAwOjAwLzQwIHRhZyA3IG5jcSA4MTkyIG91dApbICAgMjQuMzE4ODE2XSAgICAgICAgICBy ZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVk aWEgZXJyb3IpCnQgZXJyb3IKZnNfbWFyawpbICAgMjQuMzE4ODE3XSBhdGEyLjAwOiBzdGF0 dXM6IHsgRFJEWSBFUlIgfQo6IGZzeW5jIGZhaWxlZCBJClsgICAyNC4zMTg4MThdIGF0YTIu MDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQpucHV0L291dHB1dCBlcnJvClsgICAyNC4z MTg4MjBdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKcgpm c19tYXJrOiBmc3luClsgICAyNC4zMTg4MjVdIGF0YTIuMDA6IGNtZCA2MS8xMDo0MDoxMDph NDo5Ny8wMDowMDozNTowMDowMC80MCB0YWcgOCBuY3EgODE5MiBvdXQKWyAgIDI0LjMxODgy NV0gICAgICAgICAgcmVzIDQxLzU0OjEwOjEwOmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzAwIEVt YXNrIDB4NDg5IChtZWRpYSBlcnJvcikgPEY+CmMgZmFpbGVkIElucHV0L28KWyAgIDI0LjMx ODgyNl0gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJSIH0KdXRwdXQgZXJyb3IKZnNfClsg ICAyNC4zMTg4MjddIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQptYXJrOiBm c3luYyBmYWlsClsgICAyNC4zMTg4MjldIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklU RSBGUERNQSBRVUVVRUQKZWQgSW5wdXQvb3V0cHV0IApbICAgMjQuMzE4ODM0XSBhdGEyLjAw OiBjbWQgNjEvMTA6NDg6YzA6MjE6YjUvMDA6MDA6Mjc6MDA6MDAvNDAgdGFnIDkgbmNxIDgx OTIgb3V0ClsgICAyNC4zMTg4MzRdICAgICAgICAgIHJlcyA0MS81NDoxMDoxMDphNDo5Ny8w MDowMDozNTowMDowMC80MCBFbWFzayAweDg5IChtZWRpYSBlcnJvcikKZXJyb3IKZnNfbWFy azogClsgICAyNC4zMTg4MzVdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIEVSUiB9CmZzeW5j IGZhaWxlZCBJbnAKWyAgIDI0LjMxODgzNl0gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElETkYg QUJSVCB9Cgpmc19tYXJrOiBmc3luYyAKWyAgIDI0LjMxODg0Ml0gYXRhMi4wMDogY21kIDYx LzEwOjUwOmQwOjFlOmY5LzAwOjAwOjMwOjAwOjAwLzQwIHRhZyAxMCBuY3EgODE5MiBvdXQK WyAgIDI0LjMxODg0Ml0gICAgICAgICAgcmVzIDQxLzU0OjEwOjEwOmE0Ojk3LzAwOjAwOjM1 OjAwOjAwLzQwIEVtYXNrIDB4ODkgKG1lZGlhIGVycm9yKQpmYWlsZWQgSW5wdXQvb3V0Clsg ICAyNC4zMTg4NDRdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIEVSUiB9CnB1dCBlcnJvcgpm c19tYQpbICAgMjQuMzE4ODQ1XSBhdGEyLjAwOiBlcnJvcjogeyBVTkMgSURORiBBQlJUIH0K cms6IGZzeW5jIGZhaWxlZApbICAgMjQuMzE4ODQ2XSBhdGEyLjAwOiBmYWlsZWQgY29tbWFu ZDogV1JJVEUgRlBETUEgUVVFVUVECiBJbnB1dC9vdXRwdXQgZXIKWyAgIDI0LjMxODg1MV0g YXRhMi4wMDogY21kIDYxLzEwOjU4OmQwOjIxOmI1LzAwOjAwOjI3OjAwOjAwLzQwIHRhZyAx MSBuY3EgODE5MiBvdXQKWyAgIDI0LjMxODg1MV0gICAgICAgICAgcmVzIDQxLzU0OjEwOjEw OmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzQwIEVtYXNrIDB4ODkgKG1lZGlhIGVycm9yKQpyb3IK ZnNfbWFyazogZnMKWyAgIDI0LjMxODg2MF0gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJS IH0KeW5jIGZhaWxlZCBJbnB1dApbICAgMjQuMzE4ODYxXSBhdGEyLjAwOiBlcnJvcjogeyBV TkMgSURORiBBQlJUIH0KL291dHB1dCBlcnJvcgpmClsgICAyNC4zMTg4NjNdIGF0YTIuMDA6 IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKc19tYXJrOiBmc3luYyBmYQpb ICAgMjQuMzE4ODY5XSBhdGEyLjAwOiBjbWQgNjEvMTA6NjA6ZTA6MWU6ZjkvMDA6MDA6MzA6 MDA6MDAvNDAgdGFnIDEyIG5jcSA4MTkyIG91dApbICAgMjQuMzE4ODY5XSAgICAgICAgICBy ZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVk aWEgZXJyb3IpCmlsZWQgSW5wdXQvb3V0cHUKWyAgIDI0LjMxODg3MF0gYXRhMi4wMDogc3Rh dHVzOiB7IERSRFkgRVJSIH0KdCBlcnJvcgpmc19tYXJrClsgICAyNC4zMTg4NzBdIGF0YTIu MDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQo6IGZzeW5jIGZhaWxlZCBJClsgICAyNC4z MTg4NzFdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKbnB1 dC9vdXRwdXQgZXJybwpbICAgMjQuMzE4ODczXSBhdGEyLjAwOiBjbWQgNjEvMTA6Njg6ZTA6 MjE6YjUvMDA6MDA6Mjc6MDA6MDAvNDAgdGFnIDEzIG5jcSA4MTkyIG91dApbICAgMjQuMzE4 ODczXSAgICAgICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAg RW1hc2sgMHg4OSAobWVkaWEgZXJyb3IpCnIKZnNfbWFyazogZnN5bgpbICAgMjQuMzE4ODc0 XSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBFUlIgfQpjIGZhaWxlZCBJbnB1dC9vClsgICAy NC4zMTg4NzRdIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQp1dHB1dCBlcnJv cgpmc18KWyAgIDI0LjMxODg3NV0gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQ RE1BIFFVRVVFRAptYXJrOiBmc3luYyBmYWlsClsgICAyNC4zMTg4NzhdIGF0YTIuMDA6IGNt ZCA2MS8xMDo3MDpkMDpmNzo1NS8wMDowMDoyYzowMDowMC80MCB0YWcgMTQgbmNxIDgxOTIg b3V0ClsgICAyNC4zMTg4NzhdICAgICAgICAgIHJlcyA0MS81NDoxMDoxMDphNDo5Ny8wMDow MDozNTowMDowMC80MCBFbWFzayAweDg5IChtZWRpYSBlcnJvcikKZWQgSW5wdXQvb3V0cHV0 IApbICAgMjQuMzE4ODc4XSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBFUlIgfQplcnJvcgpm c19tYXJrOiAKWyAgIDI0LjMxODg3OV0gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElETkYgQUJS VCB9CmZzeW5jIGZhaWxlZCBJbnAKWyAgIDI0LjMxODg3OV0gYXRhMi4wMDogZmFpbGVkIGNv bW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRApbICAgMjQuMzE4ODgyXSAgICAgICAgICByZXMg NDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVkaWEg ZXJyb3IpCgpmc19tYXJrOiBmc3luYyAKWyAgIDI0LjMxODg4Ml0gYXRhMi4wMDogc3RhdHVz OiB7IERSRFkgRVJSIH0KZmFpbGVkIElucHV0L291dApbICAgMjQuMzE4ODgzXSBhdGEyLjAw OiBlcnJvcjogeyBVTkMgSURORiBBQlJUIH0KcHV0IGVycm9yCmZzX21hClsgICAyNC4zMTg4 ODRdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKcms6IGZz eW5jIGZhaWxlZApbICAgMjQuMzE4ODg2XSBhdGEyLjAwOiBjbWQgNjEvMTA6ODA6ZjA6MjE6 YjUvMDA6MDA6Mjc6MDA6MDAvNDAgdGFnIDE2IG5jcSA4MTkyIG91dApbICAgMjQuMzE4ODg2 XSAgICAgICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1h c2sgMHg4OSAobWVkaWEgZXJyb3IpCiBJbnB1dC9vdXRwdXQgZXIKWyAgIDI0LjMxODg4N10g YXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJSIH0Kcm9yCmZzX21hcms6IGZzClsgICAyNC4z MTg4ODddIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQp5bmMgZmFpbGVkIElu cHV0ClsgICAyNC4zMTg4ODhdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERN QSBRVUVVRUQKL291dHB1dCBlcnJvcgpmClsgICAyNC4zMTg4OTBdIGF0YTIuMDA6IGNtZCA2 MS8xMDo4ODowMDoyMjpiNS8wMDowMDoyNzowMDowMC80MCB0YWcgMTcgbmNxIDgxOTIgb3V0 ClsgICAyNC4zMTg4OTBdICAgICAgICAgIHJlcyA0MS81NDoxMDoxMDphNDo5Ny8wMDowMDoz NTowMDowMC80MCBFbWFzayAweDg5IChtZWRpYSBlcnJvcikKc19tYXJrOiBmc3luYyBmYQpb ICAgMjQuMzE4ODkxXSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBFUlIgfQppbGVkIElucHV0 L291dHB1ClsgICAyNC4zMTg4OTFdIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQg fQp0IGVycm9yCmZzX21hcmsKWyAgIDI0LjMxODg5Ml0gYXRhMi4wMDogZmFpbGVkIGNvbW1h bmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAo6IGZzeW5jIGZhaWxlZCBJClsgICAyNC4zMTg4OTRd IGF0YTIuMDA6IGNtZCA2MS8xMDo5MDpkMDphMzo5Ny8wMDowMDozNTowMDowMC80MCB0YWcg MTggbmNxIDgxOTIgb3V0ClsgICAyNC4zMTg4OTRdICAgICAgICAgIHJlcyA0MS81NDoxMDox MDphNDo5Ny8wMDowMDozNTowMDowMC80MCBFbWFzayAweDg5IChtZWRpYSBlcnJvcikKbnB1 dC9vdXRwdXQgZXJybwpbICAgMjQuMzE4ODk1XSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBF UlIgfQpyCmZvcGVuIGZhaWxlZCAKWyAgIDI0LjMxODg5NV0gYXRhMi4wMDogZXJyb3I6IHsg VU5DIElETkYgQUJSVCB9CnRvIG9wZW46IGZzX2xvZy4KWyAgIDI0LjMxODg5Nl0gYXRhMi4w MDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRAp0eHQuMjgzMQpbICAgMjQu MzE4ODk4XSBhdGEyLjAwOiBjbWQgNjEvMTA6OTg6ZjA6MWU6ZjkvMDA6MDA6MzA6MDA6MDAv NDAgdGFnIDE5IG5jcSA4MTkyIG91dApbICAgMjQuMzE4ODk4XSAgICAgICAgICByZXMgNDEv NTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVkaWEgZXJy b3IpClsgICAyNC4zMTg4OTldIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIEVSUiB9ClsgICAy NC4zMTg4OTldIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQpbICAgMjQuMzE4 OTAwXSBhdGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVEClsgICAy NC4zMTg5MDJdIGF0YTIuMDA6IGNtZCA2MS8xMDphMDplMDpmNzo1NS8wMDowMDoyYzowMDow MC80MCB0YWcgMjAgbmNxIDgxOTIgb3V0ClsgICAyNC4zMTg5MDJdICAgICAgICAgIHJlcyA0 MS81NDoxMDoxMDphNDo5Ny8wMDowMDozNTowMDowMC80MCBFbWFzayAweDg5IChtZWRpYSBl cnJvcikKWyAgIDI0LjMxODkwM10gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJSIH0KWyAg IDI0LjMxODkwM10gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElETkYgQUJSVCB9ClsgICAyNC4z MTg5MDRdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVVRUQKWyAg IDI0LjMxODkwNl0gYXRhMi4wMDogY21kIDYxLzEwOmE4OjAwOjFmOmY5LzAwOjAwOjMwOjAw OjAwLzQwIHRhZyAyMSBuY3EgODE5MiBvdXQKWyAgIDI0LjMxODkwNl0gICAgICAgICAgcmVz IDQxLzU0OjEwOjEwOmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzQwIEVtYXNrIDB4ODkgKG1lZGlh IGVycm9yKQpbICAgMjQuMzE4OTA3XSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBFUlIgfQpb ICAgMjQuMzE4OTA3XSBhdGEyLjAwOiBlcnJvcjogeyBVTkMgSURORiBBQlJUIH0KWyAgIDI0 LjMxODkwOF0gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFVRVVFRApb ICAgMjQuMzE4OTEwXSBhdGEyLjAwOiBjbWQgNjEvMTA6YjA6ZTA6YTM6OTcvMDA6MDA6MzU6 MDA6MDAvNDAgdGFnIDIyIG5jcSA4MTkyIG91dApbICAgMjQuMzE4OTEwXSAgICAgICAgICBy ZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4OSAobWVk aWEgZXJyb3IpClsgICAyNC4zMTg5MTFdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZIEVSUiB9 ClsgICAyNC4zMTg5MTJdIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQgfQpbICAg MjQuMzE4OTEyXSBhdGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEgUVVFVUVE ClsgICAyNC4zMTg5MTVdIGF0YTIuMDA6IGNtZCA2MS8xMDpiODpmMDpmNzo1NS8wMDowMDoy YzowMDowMC80MCB0YWcgMjMgbmNxIDgxOTIgb3V0ClsgICAyNC4zMTg5MTVdICAgICAgICAg IHJlcyA0MS81NDoxMDoxMDphNDo5Ny8wMDowMDozNTowMDowMC80MCBFbWFzayAweDg5ICht ZWRpYSBlcnJvcikKWyAgIDI0LjMxODkxNV0gYXRhMi4wMDogc3RhdHVzOiB7IERSRFkgRVJS IH0KWyAgIDI0LjMxODkxNl0gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElETkYgQUJSVCB9Clsg ICAyNC4zMTg5MTZdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERNQSBRVUVV RUQKWyAgIDI0LjMxODkxOV0gYXRhMi4wMDogY21kIDYxLzEwOmMwOjEwOjFmOmY5LzAwOjAw OjMwOjAwOjAwLzQwIHRhZyAyNCBuY3EgODE5MiBvdXQKWyAgIDI0LjMxODkxOV0gICAgICAg ICAgcmVzIDQxLzU0OjEwOjEwOmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzQwIEVtYXNrIDB4ODkg KG1lZGlhIGVycm9yKQpbICAgMjQuMzE4OTE5XSBhdGEyLjAwOiBzdGF0dXM6IHsgRFJEWSBF UlIgfQpbICAgMjQuMzE4OTIwXSBhdGEyLjAwOiBlcnJvcjogeyBVTkMgSURORiBBQlJUIH0K WyAgIDI0LjMxODkyMF0gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQRE1BIFFV RVVFRApbICAgMjQuMzE4OTIzXSBhdGEyLjAwOiBjbWQgNjEvMTA6Yzg6MDA6Zjg6NTUvMDA6 MDA6MmM6MDA6MDAvNDAgdGFnIDI1IG5jcSA4MTkyIG91dApbICAgMjQuMzE4OTIzXSAgICAg ICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1hc2sgMHg4 OSAobWVkaWEgZXJyb3IpClsgICAyNC4zMTg5MjNdIGF0YTIuMDA6IHN0YXR1czogeyBEUkRZ IEVSUiB9ClsgICAyNC4zMTg5MjRdIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5GIEFCUlQg fQpbICAgMjQuMzE4OTI0XSBhdGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUgRlBETUEg UVVFVUVEClsgICAyNC4zMTg5MjddIGF0YTIuMDA6IGNtZCA2MS8xMDpkMDpmMDphMzo5Ny8w MDowMDozNTowMDowMC80MCB0YWcgMjYgbmNxIDgxOTIgb3V0ClsgICAyNC4zMTg5MjddICAg ICAgICAgIHJlcyA0MS81NDoxMDoxMDphNDo5Ny8wMDowMDozNTowMDowMC80MCBFbWFzayAw eDg5IChtZWRpYSBlcnJvcikKWyAgIDI0LjMxODkyN10gYXRhMi4wMDogc3RhdHVzOiB7IERS RFkgRVJSIH0KWyAgIDI0LjMxODkyOF0gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElETkYgQUJS VCB9ClsgICAyNC4zMTg5MjldIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklURSBGUERN QSBRVUVVRUQKWyAgIDI0LjMxODkzMV0gYXRhMi4wMDogY21kIDYxLzEwOmQ4OjIwOjFmOmY5 LzAwOjAwOjMwOjAwOjAwLzQwIHRhZyAyNyBuY3EgODE5MiBvdXQKWyAgIDI0LjMxODkzMV0g ICAgICAgICAgcmVzIDQxLzU0OjEwOjEwOmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzQwIEVtYXNr IDB4ODkgKG1lZGlhIGVycm9yKQpbICAgMjQuMzE4OTMxXSBhdGEyLjAwOiBzdGF0dXM6IHsg RFJEWSBFUlIgfQpbICAgMjQuMzE4OTMyXSBhdGEyLjAwOiBlcnJvcjogeyBVTkMgSURORiBB QlJUIH0KWyAgIDI0LjMxODkzM10gYXRhMi4wMDogZmFpbGVkIGNvbW1hbmQ6IFdSSVRFIEZQ RE1BIFFVRVVFRApbICAgMjQuMzE4OTM1XSBhdGEyLjAwOiBjbWQgNjEvMTA6ZTA6MDA6YTQ6 OTcvMDA6MDA6MzU6MDA6MDAvNDAgdGFnIDI4IG5jcSA4MTkyIG91dApbICAgMjQuMzE4OTM1 XSAgICAgICAgICByZXMgNDEvNTQ6MTA6MTA6YTQ6OTcvMDA6MDA6MzU6MDA6MDAvNDAgRW1h c2sgMHg4OSAobWVkaWEgZXJyb3IpClsgICAyNC4zMTg5MzZdIGF0YTIuMDA6IHN0YXR1czog eyBEUkRZIEVSUiB9ClsgICAyNC4zMTg5MzZdIGF0YTIuMDA6IGVycm9yOiB7IFVOQyBJRE5G IEFCUlQgfQpbICAgMjQuMzE4OTM3XSBhdGEyLjAwOiBmYWlsZWQgY29tbWFuZDogV1JJVEUg RlBETUEgUVVFVUVEClsgICAyNC4zMTg5MzldIGF0YTIuMDA6IGNtZCA2MS8xMDplODoxMDpm ODo1NS8wMDowMDoyYzowMDowMC80MCB0YWcgMjkgbmNxIDgxOTIgb3V0ClsgICAyNC4zMTg5 MzldICAgICAgICAgIHJlcyA0MS81NDoxMDoxMDphNDo5Ny8wMDowMDozNTowMDowMC80MCBF bWFzayAweDg5IChtZWRpYSBlcnJvcikKWyAgIDI0LjMxODk0MF0gYXRhMi4wMDogc3RhdHVz OiB7IERSRFkgRVJSIH0KWyAgIDI0LjMxODk0MF0gYXRhMi4wMDogZXJyb3I6IHsgVU5DIElE TkYgQUJSVCB9ClsgICAyNC4zMTg5NDFdIGF0YTIuMDA6IGZhaWxlZCBjb21tYW5kOiBXUklU RSBGUERNQSBRVUVVRUQKWyAgIDI0LjMxODk0M10gYXRhMi4wMDogY21kIDYxLzEwOmYwOjEw OjIyOmI1LzAwOjAwOjI3OjAwOjAwLzQwIHRhZyAzMCBuY3EgODE5MiBvdXQKWyAgIDI0LjMx ODk0M10gICAgICAgICAgcmVzIDQxLzU0OjEwOjEwOmE0Ojk3LzAwOjAwOjM1OjAwOjAwLzQw IEVtYXNrIDB4ODkgKG1lZGlhIGVycm9yKQpbICAgMjQuMzE4OTQ0XSBhdGEyLjAwOiBzdGF0 dXM6IHsgRFJEWSBFUlIgfQpbICAgMjQuMzE4OTQ0XSBhdGEyLjAwOiBlcnJvcjogeyBVTkMg SURORiBBQlJUIH0KWyAgIDI0LjMyMjIwOV0gYXRhMi4wMDogY29uZmlndXJlZCBmb3IgVURN QS8xMzMKWyAgIDI0LjMyMjIzNF0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyMjM1 XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAg MjQuMzIyMjM3XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjIyNDBdIFNlbnNlIEtl eSA6IElsbGVnYWwgUmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjIy NDFdIERlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBo ZXgpOgpbICAgMjQuMzIyMjQ3XSAgICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAw IDBhIDgwIDAwIDAwIDAwIDAwIDAwIApbICAgMjQuMzIyMjQ5XSAgICAgICAgIDM1IDk3IGE0 IDEwIApbICAgMjQuMzIyMjUwXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjIyNTNd IEFkZC4gU2Vuc2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0 LjMyMjI1NF0gc2QgMjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjI1OV0gV3JpdGUo MTApOiAyYSAwMCAzMCBmOSAxZSBiMCAwMCAwMCAxMCAwMApbICAgMjQuMzIyMjYxXSBibGtf dXBkYXRlX3JlcXVlc3Q6IEkvTyBlcnJvciwgZGV2IHNkYSwgc2VjdG9yIDgyMTYzMjY4OApb ICAgMjQuMzIyMjcyXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjIyNzNdIFJlc3Vs dDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAyNC4zMjIy NzRdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjI3Nl0gU2Vuc2UgS2V5IDogSWxs ZWdhbCBSZXF1ZXN0IFtjdXJyZW50XSBbZGVzY3JpcHRvcl0KWyAgIDI0LjMyMjI3N10gRGVz Y3JpcHRvciBzZW5zZSBkYXRhIHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMgKGluIGhleCk6Clsg ICAyNC4zMjIyODJdICAgICAgICAgNzIgMDUgMjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEgODAg MDAgMDAgMDAgMDAgMDAgClsgICAyNC4zMjIyODRdICAgICAgICAgMzUgOTcgYTQgMTAgClsg ICAyNC4zMjIyODVdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjI4N10gQWRkLiBT ZW5zZTogTG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZQpbICAgMjQuMzIyMjg4 XSBzZCAyOjA6MDowOiBbc2RhXSBDREI6IApbICAgMjQuMzIyMjkyXSBXcml0ZSgxMCk6IDJh IDAwIDJjIDU1IGY3IGEwIDAwIDAwIDEwIDAwClsgICAyNC4zMjIyOTNdIGJsa191cGRhdGVf cmVxdWVzdDogSS9PIGVycm9yLCBkZXYgc2RhLCBzZWN0b3IgNzQzODMxNDU2ClsgICAyNC4z MjIyOTldIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjI5OV0gUmVzdWx0OiBob3N0 Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgIDI0LjMyMjMwMV0gc2Qg MjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyMzAyXSBTZW5zZSBLZXkgOiBJbGxlZ2FsIFJl cXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9yXQpbICAgMjQuMzIyMzAzXSBEZXNjcmlwdG9y IHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNjcmlwdG9ycyAoaW4gaGV4KToKWyAgIDI0LjMy MjMwOF0gICAgICAgICA3MiAwNSAyMSAwMCAwMCAwMCAwMCAwYyAwMCAwYSA4MCAwMCAwMCAw MCAwMCAwMCAKWyAgIDI0LjMyMjMxMF0gICAgICAgICAzNSA5NyBhNCAxMCAKWyAgIDI0LjMy MjMxMV0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyMzEzXSBBZGQuIFNlbnNlOiBM b2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlClsgICAyNC4zMjIzMTRdIHNkIDI6 MDowOjA6IFtzZGFdIENEQjogClsgICAyNC4zMjIzMThdIFdyaXRlKDEwKTogMmEgMDAgMmMg NTUgZjcgYjAgMDAgMDAgMTAgMDAKWyAgIDI0LjMyMjMyMF0gYmxrX3VwZGF0ZV9yZXF1ZXN0 OiBJL08gZXJyb3IsIGRldiBzZGEsIHNlY3RvciA3NDM4MzE0NzIKWyAgIDI0LjMyMjMyNF0g c2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyMzI1XSBSZXN1bHQ6IGhvc3RieXRlPURJ RF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyMzI2XSBzZCAyOjA6MDow OiBbc2RhXSAgClsgICAyNC4zMjIzMjhdIFNlbnNlIEtleSA6IElsbGVnYWwgUmVxdWVzdCBb Y3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjIzMjhdIERlc2NyaXB0b3Igc2Vuc2Ug ZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAgMjQuMzIyMzM2XSAg ICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAwIDAwIDAwIDAw IApbICAgMjQuMzIyMzM3XSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAgMjQuMzIyMzM4XSBz ZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjIzMzhdIEFkZC4gU2Vuc2U6IExvZ2ljYWwg YmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjMzOV0gc2QgMjowOjA6MDog W3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjM0MV0gV3JpdGUoMTApOiAyYSAwMCAzNSA5NyBhMyBi MCAwMCAwMCAxMCAwMApbICAgMjQuMzIyMzQyXSBibGtfdXBkYXRlX3JlcXVlc3Q6IEkvTyBl cnJvciwgZGV2IHNkYSwgc2VjdG9yIDg5OTEzMDI4OApbICAgMjQuMzIyMzQzXSBzZCAyOjA6 MDowOiBbc2RhXSAgClsgICAyNC4zMjIzNDRdIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRy aXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAyNC4zMjIzNDRdIHNkIDI6MDowOjA6IFtzZGFd ICAKWyAgIDI0LjMyMjM0NV0gU2Vuc2UgS2V5IDogSWxsZWdhbCBSZXF1ZXN0IFtjdXJyZW50 XSBbZGVzY3JpcHRvcl0KWyAgIDI0LjMyMjM0Nl0gRGVzY3JpcHRvciBzZW5zZSBkYXRhIHdp dGggc2Vuc2UgZGVzY3JpcHRvcnMgKGluIGhleCk6ClsgICAyNC4zMjIzNDhdICAgICAgICAg NzIgMDUgMjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEgODAgMDAgMDAgMDAgMDAgMDAgClsgICAy NC4zMjIzNDldICAgICAgICAgMzUgOTcgYTQgMTAgClsgICAyNC4zMjIzNTBdIHNkIDI6MDow OjA6IFtzZGFdICAKWyAgIDI0LjMyMjM1MF0gQWRkLiBTZW5zZTogTG9naWNhbCBibG9jayBh ZGRyZXNzIG91dCBvZiByYW5nZQpbICAgMjQuMzIyMzUxXSBzZCAyOjA6MDowOiBbc2RhXSBD REI6IApbICAgMjQuMzIyMzUzXSBXcml0ZSgxMCk6IDJhIDAwIDI3IGI1IDIxIGEwIDAwIDAw IDEwIDAwClsgICAyNC4zMjIzNTNdIGJsa191cGRhdGVfcmVxdWVzdDogSS9PIGVycm9yLCBk ZXYgc2RhLCBzZWN0b3IgNjY2MTgyMDQ4ClsgICAyNC4zMjIzNTVdIHNkIDI6MDowOjA6IFtz ZGFdICAKWyAgIDI0LjMyMjM1Nl0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0 ZT1EUklWRVJfU0VOU0UKWyAgIDI0LjMyMjM1Nl0gc2QgMjowOjA6MDogW3NkYV0gIApbICAg MjQuMzIyMzU3XSBTZW5zZSBLZXkgOiBJbGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNj cmlwdG9yXQpbICAgMjQuMzIyMzU3XSBEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5z ZSBkZXNjcmlwdG9ycyAoaW4gaGV4KToKWyAgIDI0LjMyMjM2MF0gICAgICAgICA3MiAwNSAy MSAwMCAwMCAwMCAwMCAwYyAwMCAwYSA4MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjM2 MV0gICAgICAgICAzNSA5NyBhNCAxMCAKWyAgIDI0LjMyMjM2MV0gc2QgMjowOjA6MDogW3Nk YV0gIApbICAgMjQuMzIyMzYyXSBBZGQuIFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mg b3V0IG9mIHJhbmdlClsgICAyNC4zMjIzNjNdIHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsg ICAyNC4zMjIzNjVdIFdyaXRlKDEwKTogMmEgMDAgMzUgOTcgYTMgYzAgMDAgMDAgMTAgMDAK WyAgIDI0LjMyMjM2NV0gYmxrX3VwZGF0ZV9yZXF1ZXN0OiBJL08gZXJyb3IsIGRldiBzZGEs IHNlY3RvciA4OTkxMzAzMDQKWyAgIDI0LjMyMjM2OF0gc2QgMjowOjA6MDogW3NkYV0gIApb ICAgMjQuMzIyMzY4XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZF Ul9TRU5TRQpbICAgMjQuMzIyMzY5XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjIz NjldIFNlbnNlIEtleSA6IElsbGVnYWwgUmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3Jd ClsgICAyNC4zMjIzNzBdIERlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2Ny aXB0b3JzIChpbiBoZXgpOgpbICAgMjQuMzIyMzcyXSAgICAgICAgIDcyIDA1IDIxIDAwIDAw IDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAwIDAwIDAwIDAwIApbICAgMjQuMzIyMzczXSAgICAg ICAgIDM1IDk3IGE0IDEwIApbICAgMjQuMzIyMzc0XSBzZCAyOjA6MDowOiBbc2RhXSAgClsg ICAyNC4zMjIzNzVdIEFkZC4gU2Vuc2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2Yg cmFuZ2UKWyAgIDI0LjMyMjM3NV0gc2QgMjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMy MjM3N10gV3JpdGUoMTApOiAyYSAwMCAyYyA1NSBmNyBjMCAwMCAwMCAxMCAwMApbICAgMjQu MzIyMzc4XSBibGtfdXBkYXRlX3JlcXVlc3Q6IEkvTyBlcnJvciwgZGV2IHNkYSwgc2VjdG9y IDc0MzgzMTQ4OApbICAgMjQuMzIyMzgxXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4z MjIzODFdIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNF ClsgICAyNC4zMjIzODJdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjM4M10gU2Vu c2UgS2V5IDogSWxsZWdhbCBSZXF1ZXN0IFtjdXJyZW50XSBbZGVzY3JpcHRvcl0KWyAgIDI0 LjMyMjM4M10gRGVzY3JpcHRvciBzZW5zZSBkYXRhIHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMg KGluIGhleCk6ClsgICAyNC4zMjIzODZdICAgICAgICAgNzIgMDUgMjEgMDAgMDAgMDAgMDAg MGMgMDAgMGEgODAgMDAgMDAgMDAgMDAgMDAgClsgICAyNC4zMjIzODddICAgICAgICAgMzUg OTcgYTQgMTAgClsgICAyNC4zMjIzODddIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMy MjM4OF0gQWRkLiBTZW5zZTogTG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZQpb ICAgMjQuMzIyMzg5XSBzZCAyOjA6MDowOiBbc2RhXSBDREI6IApbICAgMjQuMzIyMzkxXSBX cml0ZSgxMCk6IDJhIDAwIDI3IGI1IDIxIGIwIDAwIDAwIDEwIDAwClsgICAyNC4zMjIzOTFd IGJsa191cGRhdGVfcmVxdWVzdDogSS9PIGVycm9yLCBkZXYgc2RhLCBzZWN0b3IgNjY2MTgy MDY0ClsgICAyNC4zMjIzOTNdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjM5M10g UmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgIDI0 LjMyMjM5NF0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyMzk1XSBTZW5zZSBLZXkg OiBJbGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9yXQpbICAgMjQuMzIyMzk1 XSBEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNjcmlwdG9ycyAoaW4gaGV4 KToKWyAgIDI0LjMyMjM5OF0gICAgICAgICA3MiAwNSAyMSAwMCAwMCAwMCAwMCAwYyAwMCAw YSA4MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjM5OV0gICAgICAgICAzNSA5NyBhNCAx MCAKWyAgIDI0LjMyMjQwMF0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNDAwXSBB ZGQuIFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlClsgICAyNC4z MjI0MDFdIHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsgICAyNC4zMjI0MDNdIFdyaXRlKDEw KTogMmEgMDAgMzUgOTcgYTQgMTAgMDAgMDAgMTAgMDAKWyAgIDI0LjMyMjQwNF0gYmxrX3Vw ZGF0ZV9yZXF1ZXN0OiBJL08gZXJyb3IsIGRldiBzZGEsIHNlY3RvciA4OTkxMzAzODQKWyAg IDI0LjMyMjQwNl0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNDA3XSBSZXN1bHQ6 IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyNDA4 XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI0MDhdIFNlbnNlIEtleSA6IElsbGVn YWwgUmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjI0MDldIERlc2Ny aXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAg MjQuMzIyNDEyXSAgICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAw IDAwIDAwIDAwIDAwIApbICAgMjQuMzIyNDEyXSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAg MjQuMzIyNDEzXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI0MTRdIEFkZC4gU2Vu c2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjQxNF0g c2QgMjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjQxNl0gV3JpdGUoMTApOiAyYSAw MCAyNyBiNSAyMSBjMCAwMCAwMCAxMCAwMApbICAgMjQuMzIyNDE3XSBibGtfdXBkYXRlX3Jl cXVlc3Q6IEkvTyBlcnJvciwgZGV2IHNkYSwgc2VjdG9yIDY2NjE4MjA4MApbICAgMjQuMzIy NDE5XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI0MjBdIFJlc3VsdDogaG9zdGJ5 dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAyNC4zMjI0MjBdIHNkIDI6 MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjQyMV0gU2Vuc2UgS2V5IDogSWxsZWdhbCBSZXF1 ZXN0IFtjdXJyZW50XSBbZGVzY3JpcHRvcl0KWyAgIDI0LjMyMjQyMl0gRGVzY3JpcHRvciBz ZW5zZSBkYXRhIHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMgKGluIGhleCk6ClsgICAyNC4zMjI0 MjRdICAgICAgICAgNzIgMDUgMjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEgODAgMDAgMDAgMDAg MDAgMDAgClsgICAyNC4zMjI0MjVdICAgICAgICAgMzUgOTcgYTQgMTAgClsgICAyNC4zMjI0 MjVdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjQyNl0gQWRkLiBTZW5zZTogTG9n aWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZQpbICAgMjQuMzIyNDI3XSBzZCAyOjA6 MDowOiBbc2RhXSBDREI6IApbICAgMjQuMzIyNDI5XSBXcml0ZSgxMCk6IDJhIDAwIDMwIGY5 IDFlIGQwIDAwIDAwIDEwIDAwClsgICAyNC4zMjI0MzBdIHNkIDI6MDowOjA6IFtzZGFdICAK WyAgIDI0LjMyMjQzMV0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklW RVJfU0VOU0UKWyAgIDI0LjMyMjQzMl0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIy NDMyXSBTZW5zZSBLZXkgOiBJbGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9y XQpbICAgMjQuMzIyNDMzXSBEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNj cmlwdG9ycyAoaW4gaGV4KToKWyAgIDI0LjMyMjQzNl0gICAgICAgICA3MiAwNSAyMSAwMCAw MCAwMCAwMCAwYyAwMCAwYSA4MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjQzN10gICAg ICAgICAzNSA5NyBhNCAxMCAKWyAgIDI0LjMyMjQzN10gc2QgMjowOjA6MDogW3NkYV0gIApb ICAgMjQuMzIyNDM4XSBBZGQuIFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9m IHJhbmdlClsgICAyNC4zMjI0MzldIHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsgICAyNC4z MjI0NDFdIFdyaXRlKDEwKTogMmEgMDAgMjcgYjUgMjEgZDAgMDAgMDAgMTAgMDAKWyAgIDI0 LjMyMjQ0M10gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNDQ0XSBSZXN1bHQ6IGhv c3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyNDQ0XSBz ZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI0NDVdIFNlbnNlIEtleSA6IElsbGVnYWwg UmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjI0NDVdIERlc2NyaXB0 b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAgMjQu MzIyNDQ4XSAgICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAw IDAwIDAwIDAwIApbICAgMjQuMzIyNDQ5XSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAgMjQu MzIyNDQ5XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI0NTBdIEFkZC4gU2Vuc2U6 IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjQ1MV0gc2Qg MjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjQ1Ml0gV3JpdGUoMTApOiAyYSAwMCAz MCBmOSAxZSBlMCAwMCAwMCAxMCAwMApbICAgMjQuMzIyNDU1XSBzZCAyOjA6MDowOiBbc2Rh XSAgClsgICAyNC4zMjI0NTVdIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9 RFJJVkVSX1NFTlNFClsgICAyNC4zMjI0NTZdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0 LjMyMjQ1N10gU2Vuc2UgS2V5IDogSWxsZWdhbCBSZXF1ZXN0IFtjdXJyZW50XSBbZGVzY3Jp cHRvcl0KWyAgIDI0LjMyMjQ1N10gRGVzY3JpcHRvciBzZW5zZSBkYXRhIHdpdGggc2Vuc2Ug ZGVzY3JpcHRvcnMgKGluIGhleCk6ClsgICAyNC4zMjI0NjBdICAgICAgICAgNzIgMDUgMjEg MDAgMDAgMDAgMDAgMGMgMDAgMGEgODAgMDAgMDAgMDAgMDAgMDAgClsgICAyNC4zMjI0NjFd ICAgICAgICAgMzUgOTcgYTQgMTAgClsgICAyNC4zMjI0NjFdIHNkIDI6MDowOjA6IFtzZGFd ICAKWyAgIDI0LjMyMjQ2Ml0gQWRkLiBTZW5zZTogTG9naWNhbCBibG9jayBhZGRyZXNzIG91 dCBvZiByYW5nZQpbICAgMjQuMzIyNDYzXSBzZCAyOjA6MDowOiBbc2RhXSBDREI6IApbICAg MjQuMzIyNDY0XSBXcml0ZSgxMCk6IDJhIDAwIDI3IGI1IDIxIGUwIDAwIDAwIDEwIDAwClsg ICAyNC4zMjI0NjZdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjQ2N10gUmVzdWx0 OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgIDI0LjMyMjQ2 N10gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNDY4XSBTZW5zZSBLZXkgOiBJbGxl Z2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9yXQpbICAgMjQuMzIyNDY5XSBEZXNj cmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNjcmlwdG9ycyAoaW4gaGV4KToKWyAg IDI0LjMyMjQ3MV0gICAgICAgICA3MiAwNSAyMSAwMCAwMCAwMCAwMCAwYyAwMCAwYSA4MCAw MCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjQ3Ml0gICAgICAgICAzNSA5NyBhNCAxMCAKWyAg IDI0LjMyMjQ3M10gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNDczXSBBZGQuIFNl bnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlClsgICAyNC4zMjI0NzRd IHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsgICAyNC4zMjI0NzZdIFdyaXRlKDEwKTogMmEg MDAgMmMgNTUgZjcgZDAgMDAgMDAgMTAgMDAKWyAgIDI0LjMyMjQ3OF0gc2QgMjowOjA6MDog W3NkYV0gIApbICAgMjQuMzIyNDc4XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJi eXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyNDc5XSBzZCAyOjA6MDowOiBbc2RhXSAgClsg ICAyNC4zMjI0ODBdIFNlbnNlIEtleSA6IElsbGVnYWwgUmVxdWVzdCBbY3VycmVudF0gW2Rl c2NyaXB0b3JdClsgICAyNC4zMjI0ODBdIERlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNl bnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAgMjQuMzIyNDgzXSAgICAgICAgIDcyIDA1 IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAwIDAwIDAwIDAwIApbICAgMjQuMzIy NDg0XSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAgMjQuMzIyNDg0XSBzZCAyOjA6MDowOiBb c2RhXSAgClsgICAyNC4zMjI0ODVdIEFkZC4gU2Vuc2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVz cyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjQ4Nl0gc2QgMjowOjA6MDogW3NkYV0gQ0RCOiAK WyAgIDI0LjMyMjQ4N10gV3JpdGUoMTApOiAyYSAwMCAzMCBmNiBkNiAyMCAwMCAwMCA0MCAw MApbICAgMjQuMzIyNDkxXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI0OTFdIFJl c3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAyNC4z MjI0OTJdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjQ5M10gU2Vuc2UgS2V5IDog SWxsZWdhbCBSZXF1ZXN0IFtjdXJyZW50XSBbZGVzY3JpcHRvcl0KWyAgIDI0LjMyMjQ5M10g RGVzY3JpcHRvciBzZW5zZSBkYXRhIHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMgKGluIGhleCk6 ClsgICAyNC4zMjI0OTVdICAgICAgICAgNzIgMDUgMjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEg ODAgMDAgMDAgMDAgMDAgMDAgClsgICAyNC4zMjI0OTZdICAgICAgICAgMzUgOTcgYTQgMTAg ClsgICAyNC4zMjI0OTddIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjQ5OF0gQWRk LiBTZW5zZTogTG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZQpbICAgMjQuMzIy NDk4XSBzZCAyOjA6MDowOiBbc2RhXSBDREI6IApbICAgMjQuMzIyNTAwXSBXcml0ZSgxMCk6 IDJhIDAwIDI3IGI1IDIxIGYwIDAwIDAwIDEwIDAwClsgICAyNC4zMjI1MDJdIHNkIDI6MDow OjA6IFtzZGFdICAKWyAgIDI0LjMyMjUwM10gUmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJp dmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgIDI0LjMyMjUwM10gc2QgMjowOjA6MDogW3NkYV0g IApbICAgMjQuMzIyNTA0XSBTZW5zZSBLZXkgOiBJbGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRd IFtkZXNjcmlwdG9yXQpbICAgMjQuMzIyNTA1XSBEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0 aCBzZW5zZSBkZXNjcmlwdG9ycyAoaW4gaGV4KToKWyAgIDI0LjMyMjUwN10gICAgICAgICA3 MiAwNSAyMSAwMCAwMCAwMCAwMCAwYyAwMCAwYSA4MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0 LjMyMjUwOF0gICAgICAgICAzNSA5NyBhNCAxMCAKWyAgIDI0LjMyMjUwOV0gc2QgMjowOjA6 MDogW3NkYV0gIApbICAgMjQuMzIyNTA5XSBBZGQuIFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFk ZHJlc3Mgb3V0IG9mIHJhbmdlClsgICAyNC4zMjI1MTBdIHNkIDI6MDowOjA6IFtzZGFdIENE QjogClsgICAyNC4zMjI1MTJdIFdyaXRlKDEwKTogMmEgMDAgMjcgYjUgMjIgMDAgMDAgMDAg MTAgMDAKWyAgIDI0LjMyMjUxNF0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNTE0 XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAg MjQuMzIyNTE1XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI1MTVdIFNlbnNlIEtl eSA6IElsbGVnYWwgUmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjI1 MTZdIERlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBo ZXgpOgpbICAgMjQuMzIyNTE4XSAgICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAw IDBhIDgwIDAwIDAwIDAwIDAwIDAwIApbICAgMjQuMzIyNTE5XSAgICAgICAgIDM1IDk3IGE0 IDEwIApbICAgMjQuMzIyNTE5XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI1MjBd IEFkZC4gU2Vuc2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0 LjMyMjUyMV0gc2QgMjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjUyM10gV3JpdGUo MTApOiAyYSAwMCAzNSA5NyBhMyBkMCAwMCAwMCAxMCAwMApbICAgMjQuMzIyNTI0XSBzZCAy OjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI1MjVdIFJlc3VsdDogaG9zdGJ5dGU9RElEX09L IGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAyNC4zMjI1MjVdIHNkIDI6MDowOjA6IFtz ZGFdICAKWyAgIDI0LjMyMjUyNl0gU2Vuc2UgS2V5IDogSWxsZWdhbCBSZXF1ZXN0IFtjdXJy ZW50XSBbZGVzY3JpcHRvcl0KWyAgIDI0LjMyMjUyNl0gRGVzY3JpcHRvciBzZW5zZSBkYXRh IHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMgKGluIGhleCk6ClsgICAyNC4zMjI1MjldICAgICAg ICAgNzIgMDUgMjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEgODAgMDAgMDAgMDAgMDAgMDAgClsg ICAyNC4zMjI1MzBdICAgICAgICAgMzUgOTcgYTQgMTAgClsgICAyNC4zMjI1MzBdIHNkIDI6 MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjUzMV0gQWRkLiBTZW5zZTogTG9naWNhbCBibG9j ayBhZGRyZXNzIG91dCBvZiByYW5nZQpbICAgMjQuMzIyNTMyXSBzZCAyOjA6MDowOiBbc2Rh XSBDREI6IApbICAgMjQuMzIyNTMzXSBXcml0ZSgxMCk6IDJhIDAwIDMwIGY5IDFlIGYwIDAw IDAwIDEwIDAwClsgICAyNC4zMjI1MzVdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMy MjUzNl0gUmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UK WyAgIDI0LjMyMjUzN10gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNTM3XSBTZW5z ZSBLZXkgOiBJbGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9yXQpbICAgMjQu MzIyNTM4XSBEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNjcmlwdG9ycyAo aW4gaGV4KToKWyAgIDI0LjMyMjU0MF0gICAgICAgICA3MiAwNSAyMSAwMCAwMCAwMCAwMCAw YyAwMCAwYSA4MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjU0MV0gICAgICAgICAzNSA5 NyBhNCAxMCAKWyAgIDI0LjMyMjU0Ml0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIy NTQyXSBBZGQuIFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlClsg ICAyNC4zMjI1NDNdIHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsgICAyNC4zMjI1NDVdIFdy aXRlKDEwKTogMmEgMDAgMmMgNTUgZjcgZTAgMDAgMDAgMTAgMDAKWyAgIDI0LjMyMjU0N10g c2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNTQ3XSBSZXN1bHQ6IGhvc3RieXRlPURJ RF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyNTQ4XSBzZCAyOjA6MDow OiBbc2RhXSAgClsgICAyNC4zMjI1NDhdIFNlbnNlIEtleSA6IElsbGVnYWwgUmVxdWVzdCBb Y3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjI1NDldIERlc2NyaXB0b3Igc2Vuc2Ug ZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAgMjQuMzIyNTUxXSAg ICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAwIDAwIDAwIDAw IApbICAgMjQuMzIyNTUyXSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAgMjQuMzIyNTUzXSBz ZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI1NTNdIEFkZC4gU2Vuc2U6IExvZ2ljYWwg YmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjU1NF0gc2QgMjowOjA6MDog W3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjU1Nl0gV3JpdGUoMTApOiAyYSAwMCAzMCBmOSAxZiAw MCAwMCAwMCAxMCAwMApbICAgMjQuMzIyNTU3XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAy NC4zMjI1NThdIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NF TlNFClsgICAyNC4zMjI1NThdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjU1OV0g U2Vuc2UgS2V5IDogSWxsZWdhbCBSZXF1ZXN0IFtjdXJyZW50XSBbZGVzY3JpcHRvcl0KWyAg IDI0LjMyMjU1OV0gRGVzY3JpcHRvciBzZW5zZSBkYXRhIHdpdGggc2Vuc2UgZGVzY3JpcHRv cnMgKGluIGhleCk6ClsgICAyNC4zMjI1NjJdICAgICAgICAgNzIgMDUgMjEgMDAgMDAgMDAg MDAgMGMgMDAgMGEgODAgMDAgMDAgMDAgMDAgMDAgClsgICAyNC4zMjI1NjNdICAgICAgICAg MzUgOTcgYTQgMTAgClsgICAyNC4zMjI1NjNdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0 LjMyMjU2NF0gQWRkLiBTZW5zZTogTG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5n ZQpbICAgMjQuMzIyNTY0XSBzZCAyOjA6MDowOiBbc2RhXSBDREI6IApbICAgMjQuMzIyNTY2 XSBXcml0ZSgxMCk6IDJhIDAwIDM1IDk3IGEzIGUwIDAwIDAwIDEwIDAwClsgICAyNC4zMjI1 NjhdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjU2OF0gUmVzdWx0OiBob3N0Ynl0 ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgIDI0LjMyMjU2OV0gc2QgMjow OjA6MDogW3NkYV0gIApbICAgMjQuMzIyNTcwXSBTZW5zZSBLZXkgOiBJbGxlZ2FsIFJlcXVl c3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9yXQpbICAgMjQuMzIyNTcwXSBEZXNjcmlwdG9yIHNl bnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNjcmlwdG9ycyAoaW4gaGV4KToKWyAgIDI0LjMyMjU3 M10gICAgICAgICA3MiAwNSAyMSAwMCAwMCAwMCAwMCAwYyAwMCAwYSA4MCAwMCAwMCAwMCAw MCAwMCAKWyAgIDI0LjMyMjU3M10gICAgICAgICAzNSA5NyBhNCAxMCAKWyAgIDI0LjMyMjU3 NF0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNTc1XSBBZGQuIFNlbnNlOiBMb2dp Y2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlClsgICAyNC4zMjI1NzVdIHNkIDI6MDow OjA6IFtzZGFdIENEQjogClsgICAyNC4zMjI1NzddIFdyaXRlKDEwKTogMmEgMDAgMmMgNTUg ZjcgZjAgMDAgMDAgMTAgMDAKWyAgIDI0LjMyMjU3OV0gc2QgMjowOjA6MDogW3NkYV0gIApb ICAgMjQuMzIyNTgwXSBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZF Ul9TRU5TRQpbICAgMjQuMzIyNTgwXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI1 ODFdIFNlbnNlIEtleSA6IElsbGVnYWwgUmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3Jd ClsgICAyNC4zMjI1ODFdIERlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2Ny aXB0b3JzIChpbiBoZXgpOgpbICAgMjQuMzIyNTg0XSAgICAgICAgIDcyIDA1IDIxIDAwIDAw IDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAwIDAwIDAwIDAwIApbICAgMjQuMzIyNTg1XSAgICAg ICAgIDM1IDk3IGE0IDEwIApbICAgMjQuMzIyNTg2XSBzZCAyOjA6MDowOiBbc2RhXSAgClsg ICAyNC4zMjI1ODZdIEFkZC4gU2Vuc2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2Yg cmFuZ2UKWyAgIDI0LjMyMjU4N10gc2QgMjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMy MjU4OV0gV3JpdGUoMTApOiAyYSAwMCAzMCBmOSAxZiAxMCAwMCAwMCAxMCAwMApbICAgMjQu MzIyNTkxXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI1OTJdIFJlc3VsdDogaG9z dGJ5dGU9RElEX09LIGRyaXZlcmJ5dGU9RFJJVkVSX1NFTlNFClsgICAyNC4zMjI1OTJdIHNk IDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjU5M10gU2Vuc2UgS2V5IDogSWxsZWdhbCBS ZXF1ZXN0IFtjdXJyZW50XSBbZGVzY3JpcHRvcl0KWyAgIDI0LjMyMjU5NF0gRGVzY3JpcHRv ciBzZW5zZSBkYXRhIHdpdGggc2Vuc2UgZGVzY3JpcHRvcnMgKGluIGhleCk6ClsgICAyNC4z MjI1OTZdICAgICAgICAgNzIgMDUgMjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEgODAgMDAgMDAg MDAgMDAgMDAgClsgICAyNC4zMjI1OTddICAgICAgICAgMzUgOTcgYTQgMTAgClsgICAyNC4z MjI1OThdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjU5OF0gQWRkLiBTZW5zZTog TG9naWNhbCBibG9jayBhZGRyZXNzIG91dCBvZiByYW5nZQpbICAgMjQuMzIyNTk5XSBzZCAy OjA6MDowOiBbc2RhXSBDREI6IApbICAgMjQuMzIyNjAxXSBXcml0ZSgxMCk6IDJhIDAwIDJj IDU1IGY4IDAwIDAwIDAwIDEwIDAwClsgICAyNC4zMjI2MDNdIHNkIDI6MDowOjA6IFtzZGFd ICAKWyAgIDI0LjMyMjYwM10gUmVzdWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1E UklWRVJfU0VOU0UKWyAgIDI0LjMyMjYwNF0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQu MzIyNjA1XSBTZW5zZSBLZXkgOiBJbGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlw dG9yXQpbICAgMjQuMzIyNjA1XSBEZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBk ZXNjcmlwdG9ycyAoaW4gaGV4KToKWyAgIDI0LjMyMjYwOF0gICAgICAgICA3MiAwNSAyMSAw MCAwMCAwMCAwMCAwYyAwMCAwYSA4MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjYwOV0g ICAgICAgICAzNSA5NyBhNCAxMCAKWyAgIDI0LjMyMjYwOV0gc2QgMjowOjA6MDogW3NkYV0g IApbICAgMjQuMzIyNjEwXSBBZGQuIFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0 IG9mIHJhbmdlClsgICAyNC4zMjI2MTFdIHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsgICAy NC4zMjI2MTJdIFdyaXRlKDEwKTogMmEgMDAgMzUgOTcgYTMgZjAgMDAgMDAgMTAgMDAKWyAg IDI0LjMyMjYxNV0gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNjE1XSBSZXN1bHQ6 IGhvc3RieXRlPURJRF9PSyBkcml2ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyNjE1 XSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI2MTZdIFNlbnNlIEtleSA6IElsbGVn YWwgUmVxdWVzdCBbY3VycmVudF0gW2Rlc2NyaXB0b3JdClsgICAyNC4zMjI2MTddIERlc2Ny aXB0b3Igc2Vuc2UgZGF0YSB3aXRoIHNlbnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAg MjQuMzIyNjE5XSAgICAgICAgIDcyIDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAw IDAwIDAwIDAwIDAwIApbICAgMjQuMzIyNjIwXSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAg MjQuMzIyNjIwXSBzZCAyOjA6MDowOiBbc2RhXSAgClsgICAyNC4zMjI2MjFdIEFkZC4gU2Vu c2U6IExvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjYyMl0g c2QgMjowOjA6MDogW3NkYV0gQ0RCOiAKWyAgIDI0LjMyMjYyM10gV3JpdGUoMTApOiAyYSAw MCAzMCBmOSAxZiAyMCAwMCAwMCAxMCAwMApbICAgMjQuMzIyNjI1XSBzZCAyOjA6MDowOiBb c2RhXSAgClsgICAyNC4zMjI2MjZdIFJlc3VsdDogaG9zdGJ5dGU9RElEX09LIGRyaXZlcmJ5 dGU9RFJJVkVSX1NFTlNFClsgICAyNC4zMjI2MjZdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAg IDI0LjMyMjYyN10gU2Vuc2UgS2V5IDogSWxsZWdhbCBSZXF1ZXN0IFtjdXJyZW50XSBbZGVz Y3JpcHRvcl0KWyAgIDI0LjMyMjYyN10gRGVzY3JpcHRvciBzZW5zZSBkYXRhIHdpdGggc2Vu c2UgZGVzY3JpcHRvcnMgKGluIGhleCk6ClsgICAyNC4zMjI2MzBdICAgICAgICAgNzIgMDUg MjEgMDAgMDAgMDAgMDAgMGMgMDAgMGEgODAgMDAgMDAgMDAgMDAgMDAgClsgICAyNC4zMjI2 MzFdICAgICAgICAgMzUgOTcgYTQgMTAgClsgICAyNC4zMjI2MzFdIHNkIDI6MDowOjA6IFtz ZGFdICAKWyAgIDI0LjMyMjYzMl0gQWRkLiBTZW5zZTogTG9naWNhbCBibG9jayBhZGRyZXNz IG91dCBvZiByYW5nZQpbICAgMjQuMzIyNjMyXSBzZCAyOjA6MDowOiBbc2RhXSBDREI6IApb ICAgMjQuMzIyNjM0XSBXcml0ZSgxMCk6IDJhIDAwIDM1IDk3IGE0IDAwIDAwIDAwIDEwIDAw ClsgICAyNC4zMjI2MzZdIHNkIDI6MDowOjA6IFtzZGFdICAKWyAgIDI0LjMyMjYzNl0gUmVz dWx0OiBob3N0Ynl0ZT1ESURfT0sgZHJpdmVyYnl0ZT1EUklWRVJfU0VOU0UKWyAgIDI0LjMy MjYzN10gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNjM4XSBTZW5zZSBLZXkgOiBJ bGxlZ2FsIFJlcXVlc3QgW2N1cnJlbnRdIFtkZXNjcmlwdG9yXQpbICAgMjQuMzIyNjM4XSBE ZXNjcmlwdG9yIHNlbnNlIGRhdGEgd2l0aCBzZW5zZSBkZXNjcmlwdG9ycyAoaW4gaGV4KToK WyAgIDI0LjMyMjY0MV0gICAgICAgICA3MiAwNSAyMSAwMCAwMCAwMCAwMCAwYyAwMCAwYSA4 MCAwMCAwMCAwMCAwMCAwMCAKWyAgIDI0LjMyMjY0Ml0gICAgICAgICAzNSA5NyBhNCAxMCAK WyAgIDI0LjMyMjY0M10gc2QgMjowOjA6MDogW3NkYV0gIApbICAgMjQuMzIyNjQzXSBBZGQu IFNlbnNlOiBMb2dpY2FsIGJsb2NrIGFkZHJlc3Mgb3V0IG9mIHJhbmdlClsgICAyNC4zMjI2 NDRdIHNkIDI6MDowOjA6IFtzZGFdIENEQjogClsgICAyNC4zMjI2NDZdIFdyaXRlKDEwKTog MmEgMDAgMmMgNTUgZjggMTAgMDAgMDAgMTAgMDAKWyAgIDI0LjMyMjY0N10gc2QgMjowOjA6 MDogW3NkYV0gIApbICAgMjQuMzIyNjQ4XSBSZXN1bHQ6IGhvc3RieXRlPURJRF9PSyBkcml2 ZXJieXRlPURSSVZFUl9TRU5TRQpbICAgMjQuMzIyNjQ4XSBzZCAyOjA6MDowOiBbc2RhXSAg ClsgICAyNC4zMjI2NDldIFNlbnNlIEtleSA6IElsbGVnYWwgUmVxdWVzdCBbY3VycmVudF0g W2Rlc2NyaXB0b3JdClsgICAyNC4zMjI2NDldIERlc2NyaXB0b3Igc2Vuc2UgZGF0YSB3aXRo IHNlbnNlIGRlc2NyaXB0b3JzIChpbiBoZXgpOgpbICAgMjQuMzIyNjUyXSAgICAgICAgIDcy IDA1IDIxIDAwIDAwIDAwIDAwIDBjIDAwIDBhIDgwIDAwIDAwIDAwIDAwIDAwIApbICAgMjQu MzIyNjUzXSAgICAgICAgIDM1IDk3IGE0IDEwIApbICAgMjQuMzIyNjUzXSBzZCAyOjA6MDow OiBbc2RhXSAgClsgICAyNC4zMjI2NTRdIEFkZC4gU2Vuc2U6IExvZ2ljYWwgYmxvY2sgYWRk cmVzcyBvdXQgb2YgcmFuZ2UKWyAgIDI0LjMyMjY1NV0gc2QgMjowOjA6MDogW3NkYV0gQ0RC OiAKWyAgIDI0LjMyMjY1N10gV3JpdGUoMTApOiAyYSAwMCAyNyBiNSAyMiAxMCAwMCAwMCAx MCAwMApbICAgMjQuMzIyNjU5XSBhdGEyOiBFSCBjb21wbGV0ZQpbICAgMjQuMzIyNjcyXSBY RlMgKHNkYTMpOiBtZXRhZGF0YSBJL08gZXJyb3I6IGJsb2NrIDB4OTQxY2UyMCAoInhsb2df aW9kb25lIikgZXJyb3IgNSBudW1ibGtzIDY0ClsgICAyNC4zMjI2NzRdIFhGUyAoc2RhMyk6 IHhmc19kb19mb3JjZV9zaHV0ZG93bigweDIpIGNhbGxlZCBmcm9tIGxpbmUgMTE4MSBvZiBm aWxlIGZzL3hmcy94ZnNfbG9nLmMuICBSZXR1cm4gYWRkcmVzcyA9IDB4ZmZmZmZmZmY4MTM1 Njc5NgpbICAgMjQuMzIyNzEwXSBYRlMgKHNkYTMpOiBMb2cgSS9PIEVycm9yIERldGVjdGVk LiAgU2h1dHRpbmcgZG93biBmaWxlc3lzdGVtClsgICAyNC4zMjI3MTBdIFhGUyAoc2RhMyk6 IFBsZWFzZSB1bW91bnQgdGhlIGZpbGVzeXN0ZW0gYW5kIHJlY3RpZnkgdGhlIHByb2JsZW0o cykKWyAgIDI0LjMyMjcxNl0gQnVmZmVyIEkvTyBlcnJvciBvbiBkZXZpY2Ugc2RhMywgbG9n aWNhbCBibG9jayAxOTQzMjE1MApbICAgMjQuMzIyNzE2XSBsb3N0IHBhZ2Ugd3JpdGUgZHVl IHRvIEkvTyBlcnJvciBvbiBzZGEzClsgICAyNC4zMjI3MjBdIEJ1ZmZlciBJL08gZXJyb3Ig b24gZGV2aWNlIHNkYTMsIGxvZ2ljYWwgYmxvY2sgMTk0MzIxNTEKWyAgIDI0LjMyMjcyMF0g bG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RhMwpbICAgMjQuMzIyNzIx XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGEzLCBsb2dpY2FsIGJsb2NrIDk3MDY5 OTYKWyAgIDI0LjMyMjcyMl0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24g c2RhMwpbICAgMjQuMzIyNzI1XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGEzLCBs b2dpY2FsIGJsb2NrIDk3MDY5OTcKWyAgIDI0LjMyMjcyNV0gbG9zdCBwYWdlIHdyaXRlIGR1 ZSB0byBJL08gZXJyb3Igb24gc2RhMwpbICAgMjQuMzIyNzI2XSBCdWZmZXIgSS9PIGVycm9y IG9uIGRldmljZSBzZGEzLCBsb2dpY2FsIGJsb2NrIDk3MDY5OTgKWyAgIDI0LjMyMjcyNl0g bG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24gc2RhMwpbICAgMjQuMzIyNzI5 XSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGEzLCBsb2dpY2FsIGJsb2NrIDk3MDY5 OTkKWyAgIDI0LjMyMjczMF0gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJL08gZXJyb3Igb24g c2RhMwpbICAgMjQuMzIyNzMxXSBCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSBzZGEzLCBs b2dpY2FsIGJsb2NrIDI5MTE5MzUwClsgICAyNC4zMjI3MzFdIGxvc3QgcGFnZSB3cml0ZSBk dWUgdG8gSS9PIGVycm9yIG9uIHNkYTMKWyAgIDI0LjMyMjczM10gQnVmZmVyIEkvTyBlcnJv ciBvbiBkZXZpY2Ugc2RhMywgbG9naWNhbCBibG9jayAyOTExOTM1MQpbICAgMjQuMzIyNzMz XSBsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvIEkvTyBlcnJvciBvbiBzZGEzClsgICAyNC4zMjI3 MzRdIEJ1ZmZlciBJL08gZXJyb3Igb24gZGV2aWNlIHNkYTMsIGxvZ2ljYWwgYmxvY2sgODIw ClsgICAyNC4zMjI3MzRdIGxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gSS9PIGVycm9yIG9uIHNk YTMKWyAgIDI0LjMyMjczNl0gQnVmZmVyIEkvTyBlcnJvciBvbiBkZXZpY2Ugc2RhMywgbG9n aWNhbCBibG9jayA4MjEKWyAgIDI0LjMyMjczN10gbG9zdCBwYWdlIHdyaXRlIGR1ZSB0byBJ L08gZXJyb3Igb24gc2RhMwpbICAgNTIuMTU1MjEzXSBYRlMgKHNkYTMpOiB4ZnNfbG9nX2Zv cmNlOiBlcnJvciAtNSByZXR1cm5lZC4KWyAgIDgyLjE3NzA3Nl0gWEZTIChzZGEzKTogeGZz X2xvZ19mb3JjZTogZXJyb3IgLTUgcmV0dXJuZWQuClsgIDExMi4yNjM0MDFdIFhGUyAoc2Rh Myk6IHhmc19sb2dfZm9yY2U6IGVycm9yIC01IHJldHVybmVkLgpbICAxNDIuMzQ5NzI0XSBY RlMgKHNkYTMpOiB4ZnNfbG9nX2ZvcmNlOiBlcnJvciAtNSByZXR1cm5lZC4KWyAgMTUyLjIx NzIxNV0gRVhUNC1mcyAoc2RhMSk6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVyZWQg ZGF0YSBtb2RlLiBPcHRzOiAobnVsbCkKCj09PiAvbGtwL2xrcC9zcmMvdG1wL3N0ZG91dCA8 PT0KZ2V0aW5nIG5ldyBqb2IuLi4KCj09PiAvbGtwL2xrcC9zcmMvdG1wL3N0ZGVyciA8PT0K MjAxNC0xMC0yOCAwMDo1Mjo1MyBVUkw6aHR0cDovL2lubi9+bGtwL2NnaS1iaW4vZ3B4ZWxp bnV4LmNnaT9ob3N0bmFtZT1sa3AtbmUwNCZsa3Bfd3RtcCBbMTI4Nl0gLT4gIi9vcHQvcm9v dGZzL3RtcC9uZXh0LWpvYi1sa3AiIFsxXQoKPT0+IC9sa3AvbGtwL3NyYy90bXAvc3Rkb3V0 IDw9PQpkb3dubG9hZGluZyBrZXJuZWwgaW1hZ2UgLi4uCmRvd25sb2FkaW5nIGluaXRyZHMg Li4uCmtleGVjaW5nLi4uCmtleGVjIC1sIC9vcHQvcm9vdGZzL3RtcC8va2VybmVsL3g4Nl82 NC1yaGVsLzdkMzNmZTlhYjllYWNlMjQwM2FkZWZlYTNjNmRjMmM5MmEwYTUxODUvdm1saW51 ei0zLjE4LjAtcmMyLWc3ZDMzZmU5IC0taW5pdHJkPS90bXAvaW5pdHJkLTMyNjUgLS1hcHBl bmQ9InVzZXI9bGtwIGpvYj0vbGtwL3NjaGVkdWxlZC9sa3AtbmUwNC9jeWNsaWNfZnNtYXJr LXBlcmZvcm1hbmNlLTF4LTMydC0xSERELXhmcy05Qi00MDBNLWZzeW5jQmVmb3JlQ2xvc2Ut MTZkLTI1NmZwZC14ODZfNjQtcmhlbC1IRUFELTdkMzNmZTlhYjllYWNlMjQwM2FkZWZlYTNj NmRjMmM5MmEwYTUxODUtMC55YW1sIEFSQ0g9eDg2XzY0IEJPT1RfSU1BR0U9L2tlcm5lbC94 ODZfNjQtcmhlbC83ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZkYzJjOTJhMGE1MTg1L3Zt bGludXotMy4xOC4wLXJjMi1nN2QzM2ZlOSBrY29uZmlnPXg4Nl82NC1yaGVsIGNvbW1pdD03 ZDMzZmU5YWI5ZWFjZTI0MDNhZGVmZWEzYzZkYzJjOTJhMGE1MTg1IGJyYW5jaD1saW51eC1k ZXZlbC9kZXZlbC1ob3VybHktMjAxNDEwMjcyMyByb290PS9kZXYvcmFtMCBtYXhfdXB0aW1l PTc1MiBSRVNVTFRfUk9PVD0vcmVzdWx0L2xrcC1uZTA0L2ZzbWFyay9wZXJmb3JtYW5jZS0x eC0zMnQtMUhERC14ZnMtOUItNDAwTS1mc3luY0JlZm9yZUNsb3NlLTE2ZC0yNTZmcGQvZGVi aWFuLXg4Nl82NC5jZ3oveDg2XzY0LXJoZWwvN2QzM2ZlOWFiOWVhY2UyNDAzYWRlZmVhM2M2 ZGMyYzkyYTBhNTE4NS8wIGlwPTo6Ojpsa3AtbmUwNDo6ZGhjcCBlYXJseXByaW50az10dHlT MCwxMTUyMDAgZGVidWcgYXBpYz1kZWJ1ZyBzeXNycV9hbHdheXNfZW5hYmxlZCByY3VwZGF0 ZS5yY3VfY3B1X3N0YWxsX3RpbWVvdXQ9MTAwIHBhbmljPS0xIHNvZnRsb2NrdXBfcGFuaWM9 MSBubWlfd2F0Y2hkb2c9cGFuaWMgb29wcz1wYW5pYyBsb2FkX3JhbWRpc2s9MiBwcm9tcHRf cmFtZGlzaz0wIGNvbnNvbGU9dHR5UzAsMTE1MjAwIGNvbnNvbGU9dHR5MCB2Z2E9bm9ybWFs IHJ3Igo= --C7zPtVaVf+AK4Oqc Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="job.yaml" --- testcase: fsmark default_monitors: wait: pre-test uptime: iostat: vmstat: numa-numastat: numa-vmstat: numa-meminfo: proc-vmstat: proc-stat: meminfo: slabinfo: interrupts: lock_stat: latency_stats: softirqs: bdi_dev_mapping: diskstats: cpuidle: cpufreq: turbostat: sched_debug: interval: 10 pmeter: default_watchdogs: watch-oom: watchdog: cpufreq_governor: - performance model: Nehalem-EP memory: 12G hdd_partitions: "/dev/disk/by-id/ata-ST3500514NS_9WJ03EBA-part3" swap_partitions: "/dev/disk/by-id/ata-ST3120026AS_5MS07HA2-part2" rootfs_partition: "/dev/disk/by-id/ata-ST3500514NS_9WJ03EBA-part1" commit: 61e268068c92ed000f078dc1ab71d1228439fecd iterations: 1x nr_threads: 32t disk: 1HDD fs: - xfs fs2: - fsmark: filesize: - 5K test_size: 400M sync_method: fsyncBeforeClose nr_directories: 16d nr_files_per_directory: 256fpd enqueue_time: 2014-10-31 18:16:31.406733520 +08:00 testbox: lkp-ne04 tbox_group: lkp-ne04 kconfig: x86_64-rhel head_commit: 7d33fe9ab9eace2403adefea3c6dc2c92a0a5185 base_commit: cac7f2429872d3733dc3f9915857b1691da2eb2f branch: linux-devel/devel-hourly-2014102723 user: lkp queue: validate rootfs: debian-x86_64.cgz result_root: "/result/lkp-ne04/fsmark/performance-1x-32t-1HDD-xfs-5K-400M-fsyncBeforeClose-16d-256fpd/debian-x86_64.cgz/x86_64-rhel/61e268068c92ed000f078dc1ab71d1228439fecd/3" job_file: "/lkp/scheduled/lkp-ne04/validate_fsmark-performance-1x-32t-1HDD-xfs-5K-400M-fsyncBeforeClose-16d-256fpd-debian-x86_64.cgz-x86_64-rhel-61e268068c92ed000f078dc1ab71d1228439fecd-2.yaml" repeat_to: 5 kernel: "/kernel/x86_64-rhel/61e268068c92ed000f078dc1ab71d1228439fecd/vmlinuz-3.18.0-rc2-g61e2680" dequeue_time: 2014-10-31 18:25:36.586355107 +08:00 job_state: failed loadavg: 2.80 0.63 0.21 1/209 3265 start_time: '1414751176' end_time: '1414751180' version: "/lkp/lkp/.src-20141030-221304" --C7zPtVaVf+AK4Oqc-- From JBeulich@suse.com Tue Nov 4 01:40:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FCA67F4E for ; Tue, 4 Nov 2014 01:40:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CFCE8F8039 for ; Mon, 3 Nov 2014 23:40:27 -0800 (PST) X-ASG-Debug-ID: 1415086824-04bdf038cf638d10001-NocioJ Received: from mail.emea.novell.com (mail.emea.novell.com [130.57.118.101]) by cuda.sgi.com with ESMTP id IBSeGZgaQOBzWzcA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Nov 2014 23:40:25 -0800 (PST) X-Barracuda-Envelope-From: JBeulich@suse.com X-Barracuda-Apparent-Source-IP: 130.57.118.101 Received: from EMEA1-MTA by mail.emea.novell.com with Novell_GroupWise; Tue, 04 Nov 2014 07:40:24 +0000 Message-Id: <545890F40200007800044A31@mail.emea.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.0.1 Date: Tue, 04 Nov 2014 07:40:20 +0000 From: "Jan Beulich" To: "Dave Chinner" Cc: ,"Jan Kara" , Subject: Re: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" References: <5457BE390200007800044838@mail.emea.novell.com> <20141103221849.GB23575@dastard> X-ASG-Orig-Subj: Re: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" In-Reply-To: <20141103221849.GB23575@dastard> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline X-Barracuda-Connect: mail.emea.novell.com[130.57.118.101] X-Barracuda-Start-Time: 1415086825 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header >>> On 03.11.14 at 23:18, wrote: > On Mon, Nov 03, 2014 at 04:41:13PM +0000, Jan Beulich wrote: >> having run into that warning too, I looked into it a little, and now >> having found that patch am pretty uncertain: Both truncate_setsize() >> and pagecache_isize_extended() document that they want to be >> called with i_mutex held, so removing the WARN_ON() alone seems >> either incomplete or wrong. What I found to work without violating >> this documented requirement is the patch below. >=20 > Or, just perhaps, the comments are wrong.... Right - that's what I was suggesting with the option of the patch being incomplete (rather than just removing the WARN_ON() it should also remove the respective comments then). Jan From jack@suse.cz Tue Nov 4 03:08:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 38F8F7F47 for ; Tue, 4 Nov 2014 03:08:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27176304051 for ; Tue, 4 Nov 2014 01:08:21 -0800 (PST) X-ASG-Debug-ID: 1415092098-04cbb070c85ae350001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id IS3Fbw8apE9rLfKn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 01:08:20 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 60CAEACEA; Tue, 4 Nov 2014 09:08:18 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id D07DD81ED8; Tue, 4 Nov 2014 10:08:14 +0100 (CET) Date: Tue, 4 Nov 2014 10:08:14 +0100 From: Jan Kara To: Jan Beulich Cc: Dave Chinner , xfs@oss.sgi.com, Jan Kara , linux-kernel@vger.kernel.org Subject: Re: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" Message-ID: <20141104090814.GA2953@quack.suse.cz> X-ASG-Orig-Subj: Re: your patch "mm: Remove false WARN_ON from pagecache_isize_extended()" References: <5457BE390200007800044838@mail.emea.novell.com> <20141103221849.GB23575@dastard> <545890F40200007800044A31@mail.emea.novell.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <545890F40200007800044A31@mail.emea.novell.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415092099 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11219 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue 04-11-14 07:40:20, Jan Beulich wrote: > >>> On 03.11.14 at 23:18, wrote: > > On Mon, Nov 03, 2014 at 04:41:13PM +0000, Jan Beulich wrote: > >> having run into that warning too, I looked into it a little, and now > >> having found that patch am pretty uncertain: Both truncate_setsize() > >> and pagecache_isize_extended() document that they want to be > >> called with i_mutex held, so removing the WARN_ON() alone seems > >> either incomplete or wrong. What I found to work without violating > >> this documented requirement is the patch below. > > > > Or, just perhaps, the comments are wrong.... > > Right - that's what I was suggesting with the option of the patch > being incomplete (rather than just removing the WARN_ON() it > should also remove the respective comments then). Yeah, I'll update the comments to mention there are filesystem which use serialization different from i_mutex. Thanks for catching this. Honza -- Jan Kara SUSE Labs, CR From info@oplus.co Tue Nov 4 05:46:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B10B7F3F for ; Tue, 4 Nov 2014 05:46:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CCA3DAC005 for ; Tue, 4 Nov 2014 03:46:36 -0800 (PST) X-ASG-Debug-ID: 1415101591-04cbb070c65f5230001-NocioJ Received: from mx05s02.atomsmtp.com (mx05s02.atomsmtp.com [77.95.225.47]) by cuda.sgi.com with ESMTP id ebPUu1eRQDUJrDHs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:46:31 -0800 (PST) X-Barracuda-Envelope-From: info@oplus.co X-Barracuda-Apparent-Source-IP: 77.95.225.47 Received: from localhost ([127.0.0.1] helo=atomsmtp.com) by atomsmtp.com with esmtp (Exim 4.76) (envelope-from ) id 1XlcZC-0001H6-CB for xfs@oss.sgi.com; Tue, 04 Nov 2014 11:46:30 +0000 From: "info@oplus.co" Subject: E-liquid Dealer Wanted To: "xfs" X-ASG-Orig-Subj: E-liquid Dealer Wanted Content-Type: multipart/alternative; boundary="BPTmPDAsCXhuiLHAtepgDvrmyzI=_KFXso" MIME-Version: 1.0 Organization: oplus.co Date: Tue, 4 Nov 2014 13:46:28 +0200 Errors-To: postmaster@s02.atomsmtp.com X-Complaints-To: abuse@s02.atomsmtp.com Received: from username [93.170.30.167] (Authenticated sender: info@oplus.co) by s02.atomsmtp.com (Exim); Tue,04 Nov 2014 11:11:30 List-Unsubscribe: , DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=oplus.co; i=@oplus.co; q=dns/txt; s=asmtp; t=1415101590; h=Subject : From : To; bh=fbzGcea9mDAeawnhSwzWnI/97q1KYotnmT3W6nqG8MU=; b=N5OxL4Hu2FPAeenm73NelsnFWF5zOD5vfDdUgsGUpmP0DMzFSK+WHyn4zukFEy3gu8Ox13 gxAKy716YQVDNNL7bQRDaAON8qpy05ZvEyIA/P5QN7/nFAmLT14GIEU+jzsRRR9v9X2nL2RC tw8+0fr4CHkHKfCYACv3Lj0ZFUJVs= Message-Id: <1XlcZC-0001H6-CB@mx05s02.atomsmtp.com> X-Barracuda-Connect: mx05s02.atomsmtp.com[77.95.225.47] X-Barracuda-Start-Time: 1415101591 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.80 X-Barracuda-Spam-Status: No, SCORE=0.80 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_WWW_MISMATCH, DKIM_SIGNED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_WWW_MISMATCH BODY: Custom Phishing Mismatch 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format --BPTmPDAsCXhuiLHAtepgDvrmyzI=_KFXso Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =20 E-liquid Solution Provider =20 =20 Exciting updates from Oplus Tech!=20 =20 Ingredient Traceability: First and only e-liquid supplier allow end users to track test report = of every ingredient and finished products.=20 =20 Class 10000 Clean Workshop: Compliant with national GMP standard GB50457-2008. The highest standar= d in e-liquid industry.=20 =20 Live Video: Broadcast the the whole production to the public. See how your e-liqui= d is made in real time.=20 =20 German Flavor: PG: USP, Dow Chemicals; VG: USP, P&G Chemicals; Pharmaceutical Grade N= icotine, EP, USP.=20 =20 - Full Marketing Support - One Country One Distributor Sales Policy - Flexible Pricing and Global Delivery - Exclusive Access to Oplus New Products - Exceptional Design=20 =20 - Flavor Co-Development Service - Packaging Design Solution - Flexible Pricing and Global Delivery - Supply Chain Solution Sincerely Yours, Oplus Team=20 Address: Guangming New District, Guangming Street, Guanguang Road, No.3009, Block B4, Shenzhen, Guangdong China=20 Phone: +8613826510204 Email: sales@oplus.co www.oplus.co=20 Unsubscribe email --BPTmPDAsCXhuiLHAtepgDvrmyzI=_KFXso Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline
<= /tbody>
<= /TR> <= /TBODY>
3DLogo
=
E-liquid Solution Provider
3Dfacebook 3Dtwitter 3Dskype
3Dimage
Exciting updates from Oplus Tech!
3Dtracebility
Ingredient Traceability:
First and only e= -liquid supplier allow end users to track test report of every ingredient a= nd finished products.
3Dclass
Class 10000
Clean Workshop:

Compliant = with national GMP standard GB50457-2008. The highest standard in e-liquid i= ndustry.
3Dvideo =
Live Video:
Broadcast the the whole produ= ction to the public. See how your e-liquid is made in real time.
3Dgerman
German Flavor:
PG: USP, Dow Chemicals; VG= : USP, P&G Chemicals; Pharmaceutical Grade Nicotine, EP, USP.
<= /TBODY>
3D"Oplus
- Full Marketing Support
- One Country One Distrib= utor Sales Policy
- Flexible Pricing and Global Delivery
- Exclusive = Access to Oplus New Products
- Exceptional Design
3D"Oplus
- Flavor Co-Development Service
- Pac= kaging Design Solution
- Flexible Pricing and Global Delivery
- Suppl= y Chain Solution
S= incerely Yours,
Oplus Team
Address: Guangming New District, Guangming Street,
G= uanguang Road, No.3009, Block B4,
Shenzhen, Guangdong China
Phone: +8613826510204
Email: sales@o= plus.co
www.oplus.co

Unsubscribe email


--BPTmPDAsCXhuiLHAtepgDvrmyzI=_KFXso-- From jack@suse.cz Tue Nov 4 05:58:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8F6EB7F47 for ; Tue, 4 Nov 2014 05:58:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B1B0AC007 for ; Tue, 4 Nov 2014 03:58:24 -0800 (PST) X-ASG-Debug-ID: 1415102302-04bdf038cf66f3c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id MJA7bAgthslP40Ow (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:23 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CDFC1AD53; Tue, 4 Nov 2014 11:58:21 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 61E5F81F97; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 10/12] reiserfs: Convert to private i_dquot field Date: Tue, 4 Nov 2014 12:19:51 +0100 X-ASG-Orig-Subj: [PATCH 10/12] reiserfs: Convert to private i_dquot field Message-Id: <1415099993-18034-11-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102303 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header CC: reiserfs-devel@vger.kernel.org CC: Jeff Mahoney Signed-off-by: Jan Kara --- fs/reiserfs/reiserfs.h | 4 ++++ fs/reiserfs/super.c | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/fs/reiserfs/reiserfs.h b/fs/reiserfs/reiserfs.h index 1894d96ccb7c..bb79cddf0a1f 100644 --- a/fs/reiserfs/reiserfs.h +++ b/fs/reiserfs/reiserfs.h @@ -97,6 +97,10 @@ struct reiserfs_inode_info { #ifdef CONFIG_REISERFS_FS_XATTR struct rw_semaphore i_xattr_sem; #endif +#ifdef CONFIG_QUOTA + struct dquot *i_dquot[MAXQUOTAS]; +#endif + struct inode vfs_inode; }; diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index f1376c92cf74..ea63ab13ef92 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -594,6 +594,10 @@ static struct inode *reiserfs_alloc_inode(struct super_block *sb) return NULL; atomic_set(&ei->openers, 0); mutex_init(&ei->tailpack); +#ifdef CONFIG_QUOTA + memset(&ei->i_dquot, 0, sizeof(ei->i_dquot)); +#endif + return &ei->vfs_inode; } @@ -750,6 +754,11 @@ static ssize_t reiserfs_quota_write(struct super_block *, int, const char *, size_t, loff_t); static ssize_t reiserfs_quota_read(struct super_block *, int, char *, size_t, loff_t); + +static struct dquot **reiserfs_get_dquots(struct inode *inode) +{ + return REISERFS_I(inode)->i_dquot; +} #endif static const struct super_operations reiserfs_sops = { @@ -768,6 +777,7 @@ static const struct super_operations reiserfs_sops = { #ifdef CONFIG_QUOTA .quota_read = reiserfs_quota_read, .quota_write = reiserfs_quota_write, + .get_dquots = reiserfs_get_dquots, #endif }; @@ -1633,6 +1643,7 @@ static int read_super_block(struct super_block *s, int offset) #ifdef CONFIG_QUOTA s->s_qcop = &reiserfs_qctl_operations; s->dq_op = &reiserfs_quota_operations; + s->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; #endif /* -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DBE007F51 for ; Tue, 4 Nov 2014 05:58:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 69722AC00B for ; Tue, 4 Nov 2014 03:58:25 -0800 (PST) X-ASG-Debug-ID: 1415102302-04cb6c2efc565270001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id qjW6lVXR1Vbtk2sM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:23 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 23983AD6F; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3652C81ED5; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 01/12] quota: Remove const from function declarations Date: Tue, 4 Nov 2014 12:19:42 +0100 X-ASG-Orig-Subj: [PATCH 01/12] quota: Remove const from function declarations Message-Id: <1415099993-18034-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102303 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header We don't use const through VFS too much so just remove it from quota function declarations. Signed-off-by: Jan Kara --- fs/quota/dquot.c | 4 ++-- include/linux/quotaops.h | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 8b663b2d9562..8a6b95e9bf3d 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -1643,7 +1643,7 @@ EXPORT_SYMBOL(__dquot_alloc_space); /* * This operation can block, but only after everything is updated */ -int dquot_alloc_inode(const struct inode *inode) +int dquot_alloc_inode(struct inode *inode) { int cnt, ret = 0, index; struct dquot_warn warn[MAXQUOTAS]; @@ -1784,7 +1784,7 @@ EXPORT_SYMBOL(__dquot_free_space); /* * This operation can block, but only after everything is updated */ -void dquot_free_inode(const struct inode *inode) +void dquot_free_inode(struct inode *inode) { unsigned int cnt; struct dquot_warn warn[MAXQUOTAS]; diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 1d3eee594cd6..f23538a6e411 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -64,10 +64,10 @@ void dquot_destroy(struct dquot *dquot); int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags); void __dquot_free_space(struct inode *inode, qsize_t number, int flags); -int dquot_alloc_inode(const struct inode *inode); +int dquot_alloc_inode(struct inode *inode); int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); -void dquot_free_inode(const struct inode *inode); +void dquot_free_inode(struct inode *inode); void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number); int dquot_disable(struct super_block *sb, int type, unsigned int flags); @@ -213,12 +213,12 @@ static inline void dquot_drop(struct inode *inode) { } -static inline int dquot_alloc_inode(const struct inode *inode) +static inline int dquot_alloc_inode(struct inode *inode) { return 0; } -static inline void dquot_free_inode(const struct inode *inode) +static inline void dquot_free_inode(struct inode *inode) { } -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E254C7F54 for ; Tue, 4 Nov 2014 05:58:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63253AC00A for ; Tue, 4 Nov 2014 03:58:25 -0800 (PST) X-ASG-Debug-ID: 1415102302-04cbb070c85f55b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id c5jyOknbwtwawUUh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:23 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CC5A0AC93; Tue, 4 Nov 2014 11:58:21 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 6BBDE81FC0; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 12/12] vfs: Remove i_dquot field from inode Date: Tue, 4 Nov 2014 12:19:53 +0100 X-ASG-Orig-Subj: [PATCH 12/12] vfs: Remove i_dquot field from inode Message-Id: <1415099993-18034-13-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102303 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header All filesystems using VFS quotas are now converted to use their private i_dquot fields. Remove the i_dquot field from generic inode structure. Signed-off-by: Jan Kara --- fs/inode.c | 3 --- fs/quota/dquot.c | 3 --- fs/super.c | 6 ------ include/linux/fs.h | 3 --- 4 files changed, 15 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 26753ba7b6d6..2ed95f7caa4f 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -143,9 +143,6 @@ int inode_init_always(struct super_block *sb, struct inode *inode) inode->i_blocks = 0; inode->i_bytes = 0; inode->i_generation = 0; -#ifdef CONFIG_QUOTA - memset(&inode->i_dquot, 0, sizeof(inode->i_dquot)); -#endif inode->i_pipe = NULL; inode->i_bdev = NULL; inode->i_cdev = NULL; diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 8144ff2b561d..5bc5f254ac1f 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -895,9 +895,6 @@ EXPORT_SYMBOL(dqget); static inline struct dquot **i_dquot(struct inode *inode) { - /* Temporary workaround until all filesystems are converted. */ - if (!inode->i_sb->s_op->get_dquots) - return inode->i_dquot; return inode->i_sb->s_op->get_dquots(inode); } diff --git a/fs/super.c b/fs/super.c index 4512281df8ff..eae088f6aaae 100644 --- a/fs/super.c +++ b/fs/super.c @@ -218,12 +218,6 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) atomic_set(&s->s_active, 1); mutex_init(&s->s_vfs_rename_mutex); lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); - /* - * For now MAXQUOTAS check in do_quotactl() will limit quota type - * appropriately. When each fs sets allowed_types, we can remove the - * line below - */ - s->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ; mutex_init(&s->s_dquot.dqio_mutex); mutex_init(&s->s_dquot.dqonoff_mutex); s->s_maxbytes = MAX_NON_LFS; diff --git a/include/linux/fs.h b/include/linux/fs.h index 97b0fec13168..402425688e4a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -593,9 +593,6 @@ struct inode { const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ struct file_lock *i_flock; struct address_space i_data; -#ifdef CONFIG_QUOTA - struct dquot *i_dquot[MAXQUOTAS]; -#endif struct list_head i_devices; union { struct pipe_inode_info *i_pipe; -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D16CF7F55 for ; Tue, 4 Nov 2014 05:58:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D42BAC006 for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04cbb070c85f55c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 46F9Nw2n8orNLqMP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2AD0CAD85; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 4021A81EDC; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 03/12] gfs2: Set allowed quota types Date: Tue, 4 Nov 2014 12:19:44 +0100 X-ASG-Orig-Subj: [PATCH 03/12] gfs2: Set allowed quota types Message-Id: <1415099993-18034-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header We support user and group quotas. Tell vfs about it. Acked-by: Steven Whitehouse CC: cluster-devel@redhat.com Signed-off-by: Jan Kara --- fs/gfs2/ops_fstype.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c index d3eae244076e..455bac77feb5 100644 --- a/fs/gfs2/ops_fstype.c +++ b/fs/gfs2/ops_fstype.c @@ -1082,6 +1082,7 @@ static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent sb->s_export_op = &gfs2_export_ops; sb->s_xattr = gfs2_xattr_handlers; sb->s_qcop = &gfs2_quotactl_ops; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE; sb->s_time_gran = 1; sb->s_maxbytes = MAX_LFS_FILESIZE; -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AFC0F7F4E for ; Tue, 4 Nov 2014 05:58:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3C935AC008 for ; Tue, 4 Nov 2014 03:58:25 -0800 (PST) X-ASG-Debug-ID: 1415102302-04cbb070c75f55b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id R5x1hHzni2hI7xcW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:23 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CC4BAAC66; Tue, 4 Nov 2014 11:58:21 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 6552A81FBC; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara , Dave Kleikamp Subject: [PATCH 11/12] jfs: Convert to private i_dquot field Date: Tue, 4 Nov 2014 12:19:52 +0100 X-ASG-Orig-Subj: [PATCH 11/12] jfs: Convert to private i_dquot field Message-Id: <1415099993-18034-12-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102303 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header CC: Dave Kleikamp CC: jfs-discussion@lists.sourceforge.net Signed-off-by: Jan Kara --- fs/jfs/jfs_incore.h | 3 +++ fs/jfs/super.c | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/fs/jfs/jfs_incore.h b/fs/jfs/jfs_incore.h index cf47f09e8ac8..fa7e795bd8ae 100644 --- a/fs/jfs/jfs_incore.h +++ b/fs/jfs/jfs_incore.h @@ -94,6 +94,9 @@ struct jfs_inode_info { unchar _inline_ea[128]; /* 128: inline extended attr */ } link; } u; +#ifdef CONFIG_QUOTA + struct dquot *i_dquot[MAXQUOTAS]; +#endif u32 dev; /* will die when we get wide dev_t */ struct inode vfs_inode; }; diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 93e897e588a8..16c3a9556634 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c @@ -117,6 +117,9 @@ static struct inode *jfs_alloc_inode(struct super_block *sb) jfs_inode = kmem_cache_alloc(jfs_inode_cachep, GFP_NOFS); if (!jfs_inode) return NULL; +#ifdef CONFIG_QUOTA + memset(&jfs_inode->i_dquot, 0, sizeof(jfs_inode->i_dquot)); +#endif return &jfs_inode->vfs_inode; } @@ -537,6 +540,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) #ifdef CONFIG_QUOTA sb->dq_op = &dquot_operations; sb->s_qcop = &dquot_quotactl_ops; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; #endif /* @@ -836,6 +840,10 @@ out: return len - towrite; } +static struct dquot **jfs_get_dquots(struct inode *inode) +{ + return JFS_IP(inode)->i_dquot; +} #endif static const struct super_operations jfs_super_operations = { @@ -854,6 +862,7 @@ static const struct super_operations jfs_super_operations = { #ifdef CONFIG_QUOTA .quota_read = jfs_quota_read, .quota_write = jfs_quota_write, + .get_dquots = jfs_get_dquots, #endif }; -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3674B7F58 for ; Tue, 4 Nov 2014 05:58:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FD148F8035 for ; Tue, 4 Nov 2014 03:58:27 -0800 (PST) X-ASG-Debug-ID: 1415102304-04bdf038d166f3e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id LMX1EhC7Jc4sErAA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 58C7BAD98; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 4449B81EDD; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 04/12] xfs: Set allowed quota types Date: Tue, 4 Nov 2014 12:19:45 +0100 X-ASG-Orig-Subj: [PATCH 04/12] xfs: Set allowed quota types Message-Id: <1415099993-18034-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header We support user, group, and project quotas. Tell VFS about it. CC: xfs@oss.sgi.com CC: Dave Chinner Signed-off-by: Jan Kara --- fs/xfs/xfs_super.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 9f622feda6a4..206b97fd1d8a 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1425,6 +1425,7 @@ xfs_fs_fill_super( sb->s_export_op = &xfs_export_operations; #ifdef CONFIG_XFS_QUOTA sb->s_qcop = &xfs_quotactl_operations; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ; #endif sb->s_op = &xfs_super_operations; -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2B5EF7F55 for ; Tue, 4 Nov 2014 05:58:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A01A2AC008 for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04cb6c2efc565280001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 43ICwXkL9FEsijD0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 53834AD97; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 53C9581F94; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 07/12] ext3: Convert to private i_dquot field Date: Tue, 4 Nov 2014 12:19:48 +0100 X-ASG-Orig-Subj: [PATCH 07/12] ext3: Convert to private i_dquot field Message-Id: <1415099993-18034-8-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header CC: linux-ext4@vger.kernel.org Signed-off-by: Jan Kara --- fs/ext3/ext3.h | 4 ++++ fs/ext3/super.c | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/fs/ext3/ext3.h b/fs/ext3/ext3.h index fc3cdcf24aed..f483a80b3fe7 100644 --- a/fs/ext3/ext3.h +++ b/fs/ext3/ext3.h @@ -615,6 +615,10 @@ struct ext3_inode_info { atomic_t i_sync_tid; atomic_t i_datasync_tid; +#ifdef CONFIG_QUOTA + struct dquot *i_dquot[MAXQUOTAS]; +#endif + struct inode vfs_inode; }; diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 7015db0bafd1..964e2842889d 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -485,6 +485,10 @@ static struct inode *ext3_alloc_inode(struct super_block *sb) ei->vfs_inode.i_version = 1; atomic_set(&ei->i_datasync_tid, 0); atomic_set(&ei->i_sync_tid, 0); +#ifdef CONFIG_QUOTA + memset(&ei->i_dquot, 0, sizeof(ei->i_dquot)); +#endif + return &ei->vfs_inode; } @@ -764,6 +768,10 @@ static ssize_t ext3_quota_read(struct super_block *sb, int type, char *data, size_t len, loff_t off); static ssize_t ext3_quota_write(struct super_block *sb, int type, const char *data, size_t len, loff_t off); +static struct dquot **ext3_get_dquots(struct inode *inode) +{ + return EXT3_I(inode)->i_dquot; +} static const struct dquot_operations ext3_quota_operations = { .write_dquot = ext3_write_dquot, @@ -803,6 +811,7 @@ static const struct super_operations ext3_sops = { #ifdef CONFIG_QUOTA .quota_read = ext3_quota_read, .quota_write = ext3_quota_write, + .get_dquots = ext3_get_dquots, #endif .bdev_try_to_free_page = bdev_try_to_free_page, }; @@ -2008,6 +2017,7 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent) #ifdef CONFIG_QUOTA sb->s_qcop = &ext3_qctl_operations; sb->dq_op = &ext3_quota_operations; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; #endif memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid)); INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */ -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3A01F7F59 for ; Tue, 4 Nov 2014 05:58:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD90CAC00A for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04cb6c2efb565280001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id K60utnpnhDTaMpxW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 5A565AD9E; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 5725681ED9; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 08/12] ext4: Convert to private i_dquot field Date: Tue, 4 Nov 2014 12:19:49 +0100 X-ASG-Orig-Subj: [PATCH 08/12] ext4: Convert to private i_dquot field Message-Id: <1415099993-18034-9-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header CC: linux-ext4@vger.kernel.org CC: "Theodore Ts'o" Signed-off-by: Jan Kara --- fs/ext4/ext4.h | 4 ++++ fs/ext4/super.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index c55a1faaed58..db3f772e57ae 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -941,6 +941,10 @@ struct ext4_inode_info { tid_t i_sync_tid; tid_t i_datasync_tid; +#ifdef CONFIG_QUOTA + struct dquot *i_dquot[MAXQUOTAS]; +#endif + /* Precomputed uuid+inum+igen checksum for seeding inode checksums */ __u32 i_csum_seed; }; diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 1eda6ab0ef9d..07ca5711cbce 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -892,6 +892,7 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) spin_lock_init(&(ei->i_block_reservation_lock)); #ifdef CONFIG_QUOTA ei->i_reserved_quota = 0; + memset(&ei->i_dquot, 0, sizeof(ei->i_dquot)); #endif ei->jinode = NULL; INIT_LIST_HEAD(&ei->i_rsv_conversion_list); @@ -1068,6 +1069,11 @@ static int ext4_quota_enable(struct super_block *sb, int type, int format_id, unsigned int flags); static int ext4_enable_quotas(struct super_block *sb); +static struct dquot **ext4_get_dquots(struct inode *inode) +{ + return EXT4_I(inode)->i_dquot; +} + static const struct dquot_operations ext4_quota_operations = { .get_reserved_space = ext4_get_reserved_space, .write_dquot = ext4_write_dquot, @@ -1117,6 +1123,7 @@ static const struct super_operations ext4_sops = { #ifdef CONFIG_QUOTA .quota_read = ext4_quota_read, .quota_write = ext4_quota_write, + .get_dquots = ext4_get_dquots, #endif .bdev_try_to_free_page = bdev_try_to_free_page, }; @@ -3928,6 +3935,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) sb->s_qcop = &ext4_qctl_sysfile_operations; else sb->s_qcop = &ext4_qctl_operations; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; #endif memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid)); -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 488CA7F5A for ; Tue, 4 Nov 2014 05:58:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B70BDAC00B for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04cbb070c75f55c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id FH0C28VCs8LltLFi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2A035AD7F; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3B50181EDB; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 02/12] quota: Allow each filesystem to specify which quota types it supports Date: Tue, 4 Nov 2014 12:19:43 +0100 X-ASG-Orig-Subj: [PATCH 02/12] quota: Allow each filesystem to specify which quota types it supports Message-Id: <1415099993-18034-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Currently all filesystems supporting VFS quota support user and group quotas. With introduction of project quotas this is going to change so make sure filesystem isn't called for quota type it doesn't support by introduction of a bitmask determining which quota types each filesystem supports. Signed-off-by: Jan Kara --- fs/quota/quota.c | 13 +++++++++++-- fs/super.c | 6 ++++++ include/linux/fs.h | 1 + include/linux/quota.h | 5 +++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 75621649dbd7..2aa4151f99d2 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -47,8 +47,11 @@ static int check_quotactl_permission(struct super_block *sb, int type, int cmd, static void quota_sync_one(struct super_block *sb, void *arg) { - if (sb->s_qcop && sb->s_qcop->quota_sync) - sb->s_qcop->quota_sync(sb, *(int *)arg); + int type = *(int *)arg; + + if (sb->s_qcop && sb->s_qcop->quota_sync && + (sb->s_quota_types & (1 << type))) + sb->s_qcop->quota_sync(sb, type); } static int quota_sync_all(int type) @@ -297,8 +300,14 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS)) return -EINVAL; + /* + * Quota not supported on this fs? Check this before s_quota_types + * since they needn't be set if quota is not supported at all. + */ if (!sb->s_qcop) return -ENOSYS; + if (!(sb->s_quota_types & (1 << type))) + return -EINVAL; ret = check_quotactl_permission(sb, type, cmd, id); if (ret < 0) diff --git a/fs/super.c b/fs/super.c index eae088f6aaae..4512281df8ff 100644 --- a/fs/super.c +++ b/fs/super.c @@ -218,6 +218,12 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) atomic_set(&s->s_active, 1); mutex_init(&s->s_vfs_rename_mutex); lockdep_set_class(&s->s_vfs_rename_mutex, &type->s_vfs_rename_key); + /* + * For now MAXQUOTAS check in do_quotactl() will limit quota type + * appropriately. When each fs sets allowed_types, we can remove the + * line below + */ + s->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP | QTYPE_MASK_PRJ; mutex_init(&s->s_dquot.dqio_mutex); mutex_init(&s->s_dquot.dqonoff_mutex); s->s_maxbytes = MAX_NON_LFS; diff --git a/include/linux/fs.h b/include/linux/fs.h index a957d4366c24..770b466f2b44 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1208,6 +1208,7 @@ struct super_block { struct backing_dev_info *s_bdi; struct mtd_info *s_mtd; struct hlist_node s_instances; + unsigned int s_quota_types; /* Bitmask of supported quota types */ struct quota_info s_dquot; /* Diskquota specific options */ struct sb_writers s_writers; diff --git a/include/linux/quota.h b/include/linux/quota.h index 80d345a3524c..50978b781a19 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -56,6 +56,11 @@ enum quota_type { PRJQUOTA = 2, /* element used for project quotas */ }; +/* Masks for quota types when used as a bitmask */ +#define QTYPE_MASK_USR (1 << USRQUOTA) +#define QTYPE_MASK_GRP (1 << GRPQUOTA) +#define QTYPE_MASK_PRJ (1 << PRJQUOTA) + typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */ typedef long long qsize_t; /* Type in which we store sizes */ -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 453857F69 for ; Tue, 4 Nov 2014 05:58:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2329F8F8035 for ; Tue, 4 Nov 2014 03:58:25 -0800 (PST) X-ASG-Debug-ID: 1415102302-04cbb070c65f55b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id EgkmP06kqLWRnxcH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:23 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1D3CCAD55; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3266781ED8; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 0/12 v4] Moving i_dquot out of struct inode Date: Tue, 4 Nov 2014 12:19:41 +0100 X-ASG-Orig-Subj: [PATCH 0/12 v4] Moving i_dquot out of struct inode Message-Id: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102303 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello, here is a new version of my patch series which moves i_dquot array from struct inode into filesystem private part of the inode. Thus filesystems which don't need it save 2 pointers in their inodes (would be 3 after we add project quota support into generic quota). The patch series also contains a change to quotactl so that each filesystem can set quota types it supports. This is in the end unrelated change (originally it was necessary for i_dquot moving but in the end I changed things so that it's not anymore). I can move that into a separate series but I was somewhat reluctant to do that since that would mean another 6 one-line patches to the same files we are changing here... If people like the patches, I will queue this series into my tree for the next merge window. For that I'd prefer to get acks from affected fs maintainers (the changes are pretty trivial and I don't feel it's a must but still I'd prefer fs maintainers to ack they are aware of the changes). Honza Changes since v1: * Inode field names are now named enum * Quota type masks now have names like QTYPE_MASK_{USR|GRP|PRJ} instead of opencoding shifts. Changes since v2: * Use ->get_dquots callback instead of inode fields framework * rebased on Linus' tree as of 3.18-rc1 + something. Changes since v3: * Moved bitmask of allowed quota types out of s_dquot into sb itself * Removed pointless #ifdef CONFIG_QUOTA from OCFS2 From jack@suse.cz Tue Nov 4 05:58:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 09F417F57 for ; Tue, 4 Nov 2014 05:58:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4D01304051 for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04bdf038d266f3e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id sQN2Xe9NNYszSUnt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4D46BAD94; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 4E7C081EE2; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 06/12] ext2: Convert to private i_dquot field Date: Tue, 4 Nov 2014 12:19:47 +0100 X-ASG-Orig-Subj: [PATCH 06/12] ext2: Convert to private i_dquot field Message-Id: <1415099993-18034-7-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header CC: linux-ext4@vger.kernel.org Signed-off-by: Jan Kara --- fs/ext2/ext2.h | 3 +++ fs/ext2/super.c | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h index d9a17d0b124d..e4279ead4a05 100644 --- a/fs/ext2/ext2.h +++ b/fs/ext2/ext2.h @@ -689,6 +689,9 @@ struct ext2_inode_info { struct mutex truncate_mutex; struct inode vfs_inode; struct list_head i_orphan; /* unlinked but open inodes */ +#ifdef CONFIG_QUOTA + struct dquot *i_dquot[MAXQUOTAS]; +#endif }; /* diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 170dc41e8bf4..ae55fddc26a9 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -166,6 +166,10 @@ static struct inode *ext2_alloc_inode(struct super_block *sb) return NULL; ei->i_block_alloc_info = NULL; ei->vfs_inode.i_version = 1; +#ifdef CONFIG_QUOTA + memset(&ei->i_dquot, 0, sizeof(ei->i_dquot)); +#endif + return &ei->vfs_inode; } @@ -303,6 +307,10 @@ static int ext2_show_options(struct seq_file *seq, struct dentry *root) #ifdef CONFIG_QUOTA static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, size_t len, loff_t off); static ssize_t ext2_quota_write(struct super_block *sb, int type, const char *data, size_t len, loff_t off); +static struct dquot **ext2_get_dquots(struct inode *inode) +{ + return EXT2_I(inode)->i_dquot; +} #endif static const struct super_operations ext2_sops = { @@ -320,6 +328,7 @@ static const struct super_operations ext2_sops = { #ifdef CONFIG_QUOTA .quota_read = ext2_quota_read, .quota_write = ext2_quota_write, + .get_dquots = ext2_get_dquots, #endif }; @@ -1090,6 +1099,7 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent) #ifdef CONFIG_QUOTA sb->dq_op = &dquot_operations; sb->s_qcop = &dquot_quotactl_ops; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; #endif root = ext2_iget(sb, EXT2_ROOT_INO); -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8AFCA7F4E for ; Tue, 4 Nov 2014 05:58:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78278304059 for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04cb6c2ef9565270001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id MM1LPbVpBg6l4Kwe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 59197AD9C; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 5B4AC81FA9; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 09/12] ocfs2: Convert to private i_dquot field Date: Tue, 4 Nov 2014 12:19:50 +0100 X-ASG-Orig-Subj: [PATCH 09/12] ocfs2: Convert to private i_dquot field Message-Id: <1415099993-18034-10-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11221 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header CC: Mark Fasheh CC: Joel Becker CC: ocfs2-devel@oss.oracle.com Signed-off-by: Jan Kara --- fs/ocfs2/inode.h | 2 ++ fs/ocfs2/super.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/fs/ocfs2/inode.h b/fs/ocfs2/inode.h index a9b76de46047..ca3431ee7f24 100644 --- a/fs/ocfs2/inode.h +++ b/fs/ocfs2/inode.h @@ -80,6 +80,8 @@ struct ocfs2_inode_info */ tid_t i_sync_tid; tid_t i_datasync_tid; + + struct dquot *i_dquot[MAXQUOTAS]; }; /* diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 93c85bc745e1..0945814ddb7b 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -143,6 +143,11 @@ static int ocfs2_susp_quotas(struct ocfs2_super *osb, int unsuspend); static int ocfs2_enable_quotas(struct ocfs2_super *osb); static void ocfs2_disable_quotas(struct ocfs2_super *osb); +static struct dquot **ocfs2_get_dquots(struct inode *inode) +{ + return OCFS2_I(inode)->i_dquot; +} + static const struct super_operations ocfs2_sops = { .statfs = ocfs2_statfs, .alloc_inode = ocfs2_alloc_inode, @@ -155,6 +160,7 @@ static const struct super_operations ocfs2_sops = { .show_options = ocfs2_show_options, .quota_read = ocfs2_quota_read, .quota_write = ocfs2_quota_write, + .get_dquots = ocfs2_get_dquots, }; enum { @@ -563,6 +569,7 @@ static struct inode *ocfs2_alloc_inode(struct super_block *sb) oi->i_sync_tid = 0; oi->i_datasync_tid = 0; + memset(&oi->i_dquot, 0, sizeof(oi->i_dquot)); jbd2_journal_init_jbd_inode(&oi->ip_jinode, &oi->vfs_inode); return &oi->vfs_inode; @@ -2073,6 +2080,7 @@ static int ocfs2_initialize_super(struct super_block *sb, sb->s_export_op = &ocfs2_export_ops; sb->s_qcop = &ocfs2_quotactl_ops; sb->dq_op = &ocfs2_quota_operations; + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; sb->s_xattr = ocfs2_xattr_handlers; sb->s_time_gran = 1; sb->s_flags |= MS_NOATIME; -- 1.8.1.4 From jack@suse.cz Tue Nov 4 05:58:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 978847F57 for ; Tue, 4 Nov 2014 05:58:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84D76304064 for ; Tue, 4 Nov 2014 03:58:26 -0800 (PST) X-ASG-Debug-ID: 1415102304-04cbb070c55f55b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id uhicvmlzMASecogE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 03:58:25 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 30657AD91; Tue, 4 Nov 2014 11:58:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 48F0081EDF; Tue, 4 Nov 2014 12:20:15 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de, Jan Kara Subject: [PATCH 05/12] quota: Use function to provide i_dquot pointers Date: Tue, 4 Nov 2014 12:19:46 +0100 X-ASG-Orig-Subj: [PATCH 05/12] quota: Use function to provide i_dquot pointers Message-Id: <1415099993-18034-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> References: <1415099993-18034-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415102304 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11222 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header i_dquot array is used by relatively few filesystems (ext?, ocfs2, jfs, reiserfs) so it is beneficial to move this array to fs-private part of the inode. We cannot just pass quota pointers from filesystems to quota functions because during quotaon and quotaoff we have to traverse list of all inodes and manipulate i_dquot pointers for each inode. So we provide a function which generic quota code can use to get pointer to the i_dquot array from the filesystem. Signed-off-by: Jan Kara --- fs/quota/dquot.c | 54 +++++++++++++++++++++++++++++++----------------------- include/linux/fs.h | 1 + 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 8a6b95e9bf3d..8144ff2b561d 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -893,6 +893,14 @@ out: } EXPORT_SYMBOL(dqget); +static inline struct dquot **i_dquot(struct inode *inode) +{ + /* Temporary workaround until all filesystems are converted. */ + if (!inode->i_sb->s_op->get_dquots) + return inode->i_dquot; + return inode->i_sb->s_op->get_dquots(inode); +} + static int dqinit_needed(struct inode *inode, int type) { int cnt; @@ -900,9 +908,9 @@ static int dqinit_needed(struct inode *inode, int type) if (IS_NOQUOTA(inode)) return 0; if (type != -1) - return !inode->i_dquot[type]; + return !i_dquot(inode)[type]; for (cnt = 0; cnt < MAXQUOTAS; cnt++) - if (!inode->i_dquot[cnt]) + if (!i_dquot(inode)[cnt]) return 1; return 0; } @@ -965,9 +973,9 @@ static void add_dquot_ref(struct super_block *sb, int type) static void remove_inode_dquot_ref(struct inode *inode, int type, struct list_head *tofree_head) { - struct dquot *dquot = inode->i_dquot[type]; + struct dquot *dquot = i_dquot(inode)[type]; - inode->i_dquot[type] = NULL; + i_dquot(inode)[type] = NULL; if (!dquot) return; @@ -1402,7 +1410,7 @@ static void __dquot_initialize(struct inode *inode, int type) * we check it without locking here to avoid unnecessary * dqget()/dqput() calls. */ - if (inode->i_dquot[cnt]) + if (i_dquot(inode)[cnt]) continue; init_needed = 1; @@ -1433,8 +1441,8 @@ static void __dquot_initialize(struct inode *inode, int type) /* We could race with quotaon or dqget() could have failed */ if (!got[cnt]) continue; - if (!inode->i_dquot[cnt]) { - inode->i_dquot[cnt] = got[cnt]; + if (!i_dquot(inode)[cnt]) { + i_dquot(inode)[cnt] = got[cnt]; got[cnt] = NULL; /* * Make quota reservation system happy if someone @@ -1442,7 +1450,7 @@ static void __dquot_initialize(struct inode *inode, int type) */ rsv = inode_get_rsv_space(inode); if (unlikely(rsv)) - dquot_resv_space(inode->i_dquot[cnt], rsv); + dquot_resv_space(i_dquot(inode)[cnt], rsv); } } out_err: @@ -1472,8 +1480,8 @@ static void __dquot_drop(struct inode *inode) spin_lock(&dq_data_lock); for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - put[cnt] = inode->i_dquot[cnt]; - inode->i_dquot[cnt] = NULL; + put[cnt] = i_dquot(inode)[cnt]; + i_dquot(inode)[cnt] = NULL; } spin_unlock(&dq_data_lock); dqput_all(put); @@ -1494,7 +1502,7 @@ void dquot_drop(struct inode *inode) * add quota pointers back anyway. */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - if (inode->i_dquot[cnt]) + if (i_dquot(inode)[cnt]) break; } @@ -1595,7 +1603,7 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) { int cnt, ret = 0, index; struct dquot_warn warn[MAXQUOTAS]; - struct dquot **dquots = inode->i_dquot; + struct dquot **dquots = i_dquot(inode); int reserve = flags & DQUOT_SPACE_RESERVE; if (!dquot_active(inode)) { @@ -1647,7 +1655,7 @@ int dquot_alloc_inode(struct inode *inode) { int cnt, ret = 0, index; struct dquot_warn warn[MAXQUOTAS]; - struct dquot * const *dquots = inode->i_dquot; + struct dquot * const *dquots = i_dquot(inode); if (!dquot_active(inode)) return 0; @@ -1696,14 +1704,14 @@ int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) spin_lock(&dq_data_lock); /* Claim reserved quotas to allocated quotas */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - if (inode->i_dquot[cnt]) - dquot_claim_reserved_space(inode->i_dquot[cnt], + if (i_dquot(inode)[cnt]) + dquot_claim_reserved_space(i_dquot(inode)[cnt], number); } /* Update inode bytes */ inode_claim_rsv_space(inode, number); spin_unlock(&dq_data_lock); - mark_all_dquot_dirty(inode->i_dquot); + mark_all_dquot_dirty(i_dquot(inode)); srcu_read_unlock(&dquot_srcu, index); return 0; } @@ -1725,14 +1733,14 @@ void dquot_reclaim_space_nodirty(struct inode *inode, qsize_t number) spin_lock(&dq_data_lock); /* Claim reserved quotas to allocated quotas */ for (cnt = 0; cnt < MAXQUOTAS; cnt++) { - if (inode->i_dquot[cnt]) - dquot_reclaim_reserved_space(inode->i_dquot[cnt], + if (i_dquot(inode)[cnt]) + dquot_reclaim_reserved_space(i_dquot(inode)[cnt], number); } /* Update inode bytes */ inode_reclaim_rsv_space(inode, number); spin_unlock(&dq_data_lock); - mark_all_dquot_dirty(inode->i_dquot); + mark_all_dquot_dirty(i_dquot(inode)); srcu_read_unlock(&dquot_srcu, index); return; } @@ -1745,7 +1753,7 @@ void __dquot_free_space(struct inode *inode, qsize_t number, int flags) { unsigned int cnt; struct dquot_warn warn[MAXQUOTAS]; - struct dquot **dquots = inode->i_dquot; + struct dquot **dquots = i_dquot(inode); int reserve = flags & DQUOT_SPACE_RESERVE, index; if (!dquot_active(inode)) { @@ -1788,7 +1796,7 @@ void dquot_free_inode(struct inode *inode) { unsigned int cnt; struct dquot_warn warn[MAXQUOTAS]; - struct dquot * const *dquots = inode->i_dquot; + struct dquot * const *dquots = i_dquot(inode); int index; if (!dquot_active(inode)) @@ -1865,7 +1873,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) if (!sb_has_quota_active(inode->i_sb, cnt)) continue; is_valid[cnt] = 1; - transfer_from[cnt] = inode->i_dquot[cnt]; + transfer_from[cnt] = i_dquot(inode)[cnt]; ret = check_idq(transfer_to[cnt], 1, &warn_to[cnt]); if (ret) goto over_quota; @@ -1901,7 +1909,7 @@ int __dquot_transfer(struct inode *inode, struct dquot **transfer_to) dquot_incr_space(transfer_to[cnt], cur_space); dquot_resv_space(transfer_to[cnt], rsv_space); - inode->i_dquot[cnt] = transfer_to[cnt]; + i_dquot(inode)[cnt] = transfer_to[cnt]; } spin_unlock(&dq_data_lock); diff --git a/include/linux/fs.h b/include/linux/fs.h index 770b466f2b44..97b0fec13168 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1566,6 +1566,7 @@ struct super_operations { #ifdef CONFIG_QUOTA ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); + struct dquot **(*get_dquots)(struct inode *); #endif int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); long (*nr_cached_objects)(struct super_block *, int); -- 1.8.1.4 From bfoster@redhat.com Tue Nov 4 06:14:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C05977F6B for ; Tue, 4 Nov 2014 06:14:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FDCA8F8035 for ; Tue, 4 Nov 2014 04:14:37 -0800 (PST) X-ASG-Debug-ID: 1415103272-04bdf038d166fc50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QUQbcdnHN3B4Dfdb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 04:14:33 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4CETaO018955 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 07:14:30 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4CESVk022061; Tue, 4 Nov 2014 07:14:29 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 25087122F87; Tue, 4 Nov 2014 07:14:28 -0500 (EST) Date: Tue, 4 Nov 2014 07:14:28 -0500 From: Brian Foster To: Fanael Linithien Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Message-ID: <20141104121427.GA55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> <1415031146-9107-6-git-send-email-bfoster@redhat.com> <20141103223407.GA14732@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415103273 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 12:56:17AM +0100, Fanael Linithien wrote: > 2014-11-03 23:34 GMT+01:00 Brian Foster : > > On Mon, Nov 03, 2014 at 11:12:12PM +0100, Fanael Linithien wrote: > >> 2014-11-03 17:12 GMT+01:00 Brian Foster : > >> > > >> > +static inline bool xfs_inobt_issparse(uint16_t holemask) > >> > +{ > >> > + return holemask == 0 ? false : true; > >> > +} > >> > >> Surely that should be "return holemask != 0;"? > >> > > > > ir_holemask bits are set for holes in the inode chunk and unset for > > allocated regions. This means that ir_holemask == 0 for a normal, > > fully-allocated chunk and != 0 otherwise (some bits are set to indicate > > the chunk has a hole). Check out the commit log for patch 4 for > > reasoning. > > Oh, I don't comment on the logic, as I don't really know much about > XFS code. It's purely a stylistic suggestion: "holemask == 0 ? false : > true" looks entirely equivalent to "holemask != 0". Ah right, sorry. Yes, that makes sense. I'll fix this up in the next version. Thanks! Brian From bfoster@redhat.com Tue Nov 4 06:15:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D345F7F6B for ; Tue, 4 Nov 2014 06:15:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C02708F8037 for ; Tue, 4 Nov 2014 04:15:20 -0800 (PST) X-ASG-Debug-ID: 1415103319-04cb6c2efc5658d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 28kCVG7XAlFVeUkH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 04:15:19 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4CF8TC014453 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 07:15:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4CF806022356; Tue, 4 Nov 2014 07:15:08 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6B650122F87; Tue, 4 Nov 2014 07:15:07 -0500 (EST) Date: Tue, 4 Nov 2014 07:15:07 -0500 From: Brian Foster To: Dave Chinner Cc: Fanael Linithien , xfs@oss.sgi.com Subject: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks Message-ID: <20141104121507.GB55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2 05/17] xfs: create macros/helpers for dealing with sparse inode chunks References: <1415031146-9107-1-git-send-email-bfoster@redhat.com> <1415031146-9107-6-git-send-email-bfoster@redhat.com> <20141103223407.GA14732@bfoster.bfoster> <20141104013308.GC23575@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141104013308.GC23575@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415103319 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 12:33:08PM +1100, Dave Chinner wrote: > On Tue, Nov 04, 2014 at 12:56:17AM +0100, Fanael Linithien wrote: > > 2014-11-03 23:34 GMT+01:00 Brian Foster : > > > On Mon, Nov 03, 2014 at 11:12:12PM +0100, Fanael Linithien wrote: > > >> 2014-11-03 17:12 GMT+01:00 Brian Foster : > > >> > > > >> > +static inline bool xfs_inobt_issparse(uint16_t holemask) > > >> > +{ > > >> > + return holemask == 0 ? false : true; > > >> > +} > > >> > > >> Surely that should be "return holemask != 0;"? > > >> > > > > > > ir_holemask bits are set for holes in the inode chunk and unset for > > > allocated regions. This means that ir_holemask == 0 for a normal, > > > fully-allocated chunk and != 0 otherwise (some bits are set to indicate > > > the chunk has a hole). Check out the commit log for patch 4 for > > > reasoning. > > > > Oh, I don't comment on the logic, as I don't really know much about > > XFS code. It's purely a stylistic suggestion: "holemask == 0 ? false : > > true" looks entirely equivalent to "holemask != 0". > > Even that is unnecessary. booleans are handled by the > compiler quite nicely - just casting a bool > type will give the same result. i.e. (bool)holemask results in a > value of "false" if holemask is zero, "true" if holemask has any > value other than zero. > > static inline bool xfs_inobt_issparse(uint16_t holemask) > { > return holemask; > } > > Will give the desired result as there is an implicit typecast to > bool in that return statement..... > Indeed, thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From dave@fromorbit.com Tue Nov 4 06:53:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C53B87F66 for ; Tue, 4 Nov 2014 06:53:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5184DAC003 for ; Tue, 4 Nov 2014 04:53:28 -0800 (PST) X-ASG-Debug-ID: 1415105606-04cbb070c75f6be0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 35wn9EjhX661B2sx for ; Tue, 04 Nov 2014 04:53:27 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiEPABPLWFR5LbBUPGdsb2JhbABcgw6BLIc9s0gBAQEBAQacPRcBAQEBAQYBAQEBODuEAwEFVjMIGDE5AwcUGYhAzFqGN4p2hDUFth0BCysggW4pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Ph-Qy for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jD-Q4 for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Date: Tue, 4 Nov 2014 23:53:16 +1100 X-ASG-Orig-Subj: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Message-Id: <1415105601-6455-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415105601-6455-1-git-send-email-david@fromorbit.com> References: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105606 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The bulkstat code has several different ways of detecting the end of an AG when doing a walk. They are not consistently detected, and the code that checks for the end of AG conditions is not consistently coded. Hence the are conditions where the walk code can get stuck in an endless loop making no progress and not triggering any termination conditions. Convert all the "tmp/i" status return codes from btree operations to a common name (stat) and apply end-of-ag detection to these operations consistently. cc: stable@vger.kernel.org Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 7765ff7..16737cb 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -356,7 +356,6 @@ xfs_bulkstat( int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ int fmterror;/* bulkstat formatter result */ - int i; /* loop index */ int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ xfs_ino_t ino; /* inode number (filesystem) */ @@ -366,11 +365,11 @@ xfs_bulkstat( xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ - int tmp; /* result value from btree calls */ int ubcount; /* size of user's buffer */ int ubleft; /* bytes left in user's buffer */ char __user *ubufp; /* pointer into user's buffer */ int ubelem; /* spaces used in user's buffer */ + int stat; /* * Get the last inode value, see if there's nothing to do. @@ -436,13 +435,15 @@ xfs_bulkstat( agino = r.ir_startino + XFS_INODES_PER_CHUNK; } /* Increment to the next record */ - error = xfs_btree_increment(cur, 0, &tmp); + error = xfs_btree_increment(cur, 0, &stat); } else { /* Start of ag. Lookup the first inode chunk */ - error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); } - if (error) + if (error || stat == 0) { + end_of_ag = 1; goto del_cursor; + } /* * Loop through inode btree records in this ag, @@ -451,8 +452,8 @@ xfs_bulkstat( while (irbp < irbufend && icount < ubcount) { struct xfs_inobt_rec_incore r; - error = xfs_inobt_get_rec(cur, &r, &i); - if (error || i == 0) { + error = xfs_inobt_get_rec(cur, &r, &stat); + if (error || stat == 0) { end_of_ag = 1; goto del_cursor; } @@ -473,8 +474,8 @@ xfs_bulkstat( * Set agino to after this chunk and bump the cursor. */ agino = r.ir_startino + XFS_INODES_PER_CHUNK; - error = xfs_btree_increment(cur, 0, &tmp); - if (error) { + error = xfs_btree_increment(cur, 0, &stat); + if (error || stat == 0) { end_of_ag = 1; goto del_cursor; } -- 2.0.0 From dave@fromorbit.com Tue Nov 4 06:53:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C2157F66 for ; Tue, 4 Nov 2014 06:53:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B0118F8039 for ; Tue, 4 Nov 2014 04:53:30 -0800 (PST) X-ASG-Debug-ID: 1415105606-04cbb070c75f6be0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OGPnqQqdlsO32rq4 for ; Tue, 04 Nov 2014 04:53:28 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiEPABPLWFR5LbBUPGdsb2JhbABcgw6BLIc9s0gBAQEBAQacPRcBAQEBAQYBAQEBODuEAwEFJy8zCBgxOQMHFBmIQMxahjePKwWGNq9nAQsrIIFuKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Pm-TU for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jc-Sc for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: track bulkstat progress by agino Date: Tue, 4 Nov 2014 23:53:21 +1100 X-ASG-Orig-Subj: [PATCH 6/6] xfs: track bulkstat progress by agino Message-Id: <1415105601-6455-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415105601-6455-1-git-send-email-david@fromorbit.com> References: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105608 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The bulkstat main loop progress is tracked by the "lastino" variable, which is a full 64 bit inode. However, the loop actually works on agno/agino pairs, and so there's a significant disconnect between the rest of the loop and the main cursor. Convert this to use the agino, and pass the agino into the chunk formatting function and convert it too. This gets rid of the inconsistency in the loop processing, and finally makes it simple for us to skip inodes at any point in the loop simply by incrementing the agino cursor. Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 50 +++++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 6a4ef8e..2a6f2e8 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -282,45 +282,39 @@ xfs_bulkstat_ag_ichunk( bulkstat_one_pf formatter, size_t statstruct_size, struct xfs_bulkstat_agichunk *acp, - xfs_ino_t *lastino) + xfs_agino_t *last_agino) { char __user **ubufp = acp->ac_ubuffer; int chunkidx; int error = 0; - xfs_agino_t agino; - agino = irbp->ir_startino; + *last_agino = irbp->ir_startino; for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; - chunkidx++, agino++) { + chunkidx++, (*last_agino)++) { int fmterror; int ubused; - xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); /* Skip if this inode is free */ - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - *lastino = ino; + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) continue; - } /* Get the inode and fill in a single buffer */ ubused = statstruct_size; - error = formatter(mp, ino, *ubufp, acp->ac_ubleft, - &ubused, &fmterror); + error = formatter(mp, XFS_AGINO_TO_INO(mp, agno, *last_agino), + *ubufp, acp->ac_ubleft, &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_GIVEUP || (error && error != -ENOENT && error != -EINVAL)) { acp->ac_ubleft = 0; ASSERT(error); break; } - if (fmterror == BULKSTAT_RV_NOTHING || error) { - *lastino = ino; + if (fmterror == BULKSTAT_RV_NOTHING || error) continue; - } *ubufp += ubused; acp->ac_ubleft -= ubused; acp->ac_ubelem++; - *lastino = ino; if (acp->ac_ubleft < statstruct_size) break; @@ -349,7 +343,6 @@ xfs_bulkstat( xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ size_t irbsize; /* size of irec buffer in bytes */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int ubcount; /* size of user's buffer */ struct xfs_bulkstat_agichunk ac; @@ -358,11 +351,10 @@ xfs_bulkstat( /* * Get the last inode value, see if there's nothing to do. */ - lastino = *lastinop; - agno = XFS_INO_TO_AGNO(mp, lastino); - agino = XFS_INO_TO_AGINO(mp, lastino); + agno = XFS_INO_TO_AGNO(mp, *lastinop); + agino = XFS_INO_TO_AGINO(mp, *lastinop); if (agno >= mp->m_sb.sb_agcount || - lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) { *done = 1; *ubcountp = 0; return 0; @@ -486,7 +478,7 @@ del_cursor: irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac, - &lastino); + &agino); if (error) break; @@ -499,8 +491,7 @@ del_cursor: if (end_of_ag) { agno++; agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); + } } /* * Done, we're either out of filesystem or space to put the data. @@ -518,16 +509,13 @@ del_cursor: if (ac.ac_ubelem) error = 0; - if (agno >= mp->m_sb.sb_agcount) { - /* - * If we ran out of filesystem, mark lastino as off - * the end of the filesystem, so the next call - * will return immediately. - */ - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); + /* + * If we ran out of filesystem, lastino will point off the end of + * the filesystem so the next call will return immediately. + */ + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); + if (agno >= mp->m_sb.sb_agcount) *done = 1; - } else - *lastinop = (xfs_ino_t)lastino; return error; } -- 2.0.0 From dave@fromorbit.com Tue Nov 4 06:53:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 972B67F74 for ; Tue, 4 Nov 2014 06:53:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16A20AC003 for ; Tue, 4 Nov 2014 04:53:30 -0800 (PST) X-ASG-Debug-ID: 1415105608-04cbb070c55f6be0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id UWEO6eunm2FLyH0X for ; Tue, 04 Nov 2014 04:53:29 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiEPABPLWFR5LbBUPGdsb2JhbABcgw6BLIc9s0gBAQEBAQacPRcBAQEBAQYBAQEBODuEAwEFJy8zCBgxOQMHFBmIQMxahjePKwW2HQELgjkpL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Pl-Sw for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jX-S2 for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: bulkstat error handling is broken Date: Tue, 4 Nov 2014 23:53:20 +1100 X-ASG-Orig-Subj: [PATCH 5/6] xfs: bulkstat error handling is broken Message-Id: <1415105601-6455-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415105601-6455-1-git-send-email-david@fromorbit.com> References: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105608 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The error propagation is a horror - xfs_bulkstat() returns a rval variable which is only set if there are formatter errors. Any sort of btree walk error or corruption will cause the bulkstat walk to terminate but will not pass an error back to userspace. Worse is the fact that formatter errors will also be ignored if any inodes were correctly formatted into the user buffer. Hence bulkstat can fail badly yet still report success to userspace. This causes significant issues with xfsdump not dumping everything in the filesystem yet reporting success. It's not until a restore fails that there is any indication that the dump was bad and tha bulkstat failed. This patch now triggers xfsdump to fail with bulkstat errors rather than silently missing files in the dump. This now causes bulkstat to fail when the lastino cookie does not fall inside an existing inode chunk. The pre-3.17 code tolerated that error by allowing the code to move to the next inode chunk as the agino target is guaranteed to fall into the next btree record. With the fixes up to this point in the series, xfsdump now passes on the troublesome filesystem image that exposes all these bugs. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index fc4cf5d..6a4ef8e 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -236,8 +236,10 @@ xfs_bulkstat_grab_ichunk( XFS_WANT_CORRUPTED_RETURN(stat == 1); /* Check if the record contains the inode in request */ - if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) - return -EINVAL; + if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { + *icount = 0; + return 0; + } idx = agino - irec->ir_startino + 1; if (idx < XFS_INODES_PER_CHUNK && @@ -349,7 +351,6 @@ xfs_bulkstat( xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ - int rval; /* return value error code */ int ubcount; /* size of user's buffer */ struct xfs_bulkstat_agichunk ac; int error = 0; @@ -385,7 +386,6 @@ xfs_bulkstat( * Loop over the allocation groups, starting from the last * inode returned; 0 means start of the allocation group. */ - rval = 0; while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { struct xfs_inobt_rec_incore *irbp = irbuf; struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; @@ -488,7 +488,7 @@ del_cursor: formatter, statstruct_size, &ac, &lastino); if (error) - rval = error; + break; cond_resched(); } @@ -507,11 +507,17 @@ del_cursor: */ kmem_free(irbuf); *ubcountp = ac.ac_ubelem; + /* - * Found some inodes, return them now and return the error next time. + * We found some inodes, so clear the error status and return them. + * The lastino pointer will point directly at the inode that triggered + * any error that occurred, so on the next call the error will be + * triggered again and propagated to userspace as there will be no + * formatted inodes in the buffer. */ if (ac.ac_ubelem) - rval = 0; + error = 0; + if (agno >= mp->m_sb.sb_agcount) { /* * If we ran out of filesystem, mark lastino as off @@ -523,7 +529,7 @@ del_cursor: } else *lastinop = (xfs_ino_t)lastino; - return rval; + return error; } int -- 2.0.0 From dave@fromorbit.com Tue Nov 4 06:53:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 39E8E7F74 for ; Tue, 4 Nov 2014 06:53:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 277D3304039 for ; Tue, 4 Nov 2014 04:53:32 -0800 (PST) X-ASG-Debug-ID: 1415105610-04cbb070c85f6bf0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HTssgkRF2HlPp24X for ; Tue, 04 Nov 2014 04:53:30 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiEPABPLWFR5LbBUPGdsb2JhbABcgw6BLIc9s0gBAQEBAQacPRcBAQEBAQYBAQEBODuEAwEFJy8zCBgxOQMHFBmIQMxahjeKdoQ1BYY2mQKNbIh5AQuCOSkvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Pj-Rs for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jN-R6 for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Date: Tue, 4 Nov 2014 23:53:18 +1100 X-ASG-Orig-Subj: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-Id: <1415105601-6455-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415105601-6455-1-git-send-email-david@fromorbit.com> References: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105610 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The loop construct has issues: - clustidx is completely unused, so remove it. - the loop tries to be smart by terminating when the "freecount" tells it that all inodes are free. Just drop it as in most cases we have to scan all inodes in the chunk anyway. - move the "user buffer left" condition check to the only point where we consume space int eh user buffer. - move the initialisation of agino out of the loop, leaving just a simple loop control logic using the clusteridx. Also, double handling of the user buffer variables leads to problems tracking the current state - use the cursor variables directly rather than keeping local copies and then having to update the cursor before returning. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 55 ++++++++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 50a3e59..ff31965 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -283,59 +283,46 @@ xfs_bulkstat_ag_ichunk( xfs_ino_t *lastino) { char __user **ubufp = acp->ac_ubuffer; - int ubleft = acp->ac_ubleft; - int ubelem = acp->ac_ubelem; - int chunkidx, clustidx; + int chunkidx; int error = 0; xfs_agino_t agino; - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; - XFS_BULKSTAT_UBLEFT(ubleft) && - irbp->ir_freecount < XFS_INODES_PER_CHUNK; - chunkidx++, clustidx++, agino++) { - int fmterror; /* bulkstat formatter result */ + agino = irbp->ir_startino; + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; + chunkidx++, agino++) { + int fmterror; int ubused; xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); - /* Skip if this inode is free */ if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { *lastino = ino; continue; } - /* - * Count used inodes as free so we can tell when the - * chunk is used up. - */ - irbp->ir_freecount++; - /* Get the inode and fill in a single buffer */ ubused = statstruct_size; - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); - if (fmterror == BULKSTAT_RV_NOTHING) { - if (error && error != -ENOENT && error != -EINVAL) { - ubleft = 0; - break; - } - *lastino = ino; - continue; - } - if (fmterror == BULKSTAT_RV_GIVEUP) { - ubleft = 0; + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, + &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_GIVEUP || + (error && error != -ENOENT && error != -EINVAL)) { + acp->ac_ubleft = 0; ASSERT(error); break; } - if (*ubufp) - *ubufp += ubused; - ubleft -= ubused; - ubelem++; + if (fmterror == BULKSTAT_RV_NOTHING || error) { + *lastino = ino; + continue; + } + + *ubufp += ubused; + acp->ac_ubleft -= ubused; + acp->ac_ubelem++; *lastino = ino; - } - acp->ac_ubleft = ubleft; - acp->ac_ubelem = ubelem; + if (acp->ac_ubleft < statstruct_size) + break; + } return error; } -- 2.0.0 From dave@fromorbit.com Tue Nov 4 06:53:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4BCE77F75 for ; Tue, 4 Nov 2014 06:53:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38E618F804C for ; Tue, 4 Nov 2014 04:53:32 -0800 (PST) X-ASG-Debug-ID: 1415105608-04cbb070c55f6be0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 5yj5xRa8CHxeeNQi for ; Tue, 04 Nov 2014 04:53:30 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiEPABPLWFR5LbBUPGdsb2JhbABcgw6BLIc9s0gBAQEBAQacPRcBAQEBAQYBAQEBODuEAwEFJy8zCBgxOQMHFBmIQMxahjePKwWGNq9nAQsrIIFuKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Pk-SP for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jS-RX for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Date: Tue, 4 Nov 2014 23:53:19 +1100 X-ASG-Orig-Subj: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Message-Id: <1415105601-6455-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415105601-6455-1-git-send-email-david@fromorbit.com> References: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105610 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are a bunch of variables tha tare more wildy scoped than they need to be, obfuscated user buffer checks and tortured "next inode" tracking. This all needs cleaning up to expose the real issues that need fixing. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 55 ++++++++++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index ff31965..fc4cf5d 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -345,30 +345,23 @@ xfs_bulkstat( xfs_agino_t agino; /* inode # in allocation group */ xfs_agnumber_t agno; /* allocation group number */ xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ - int end_of_ag; /* set if we've seen the ag end */ - int error; /* error code */ - int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ - xfs_ino_t ino; /* inode number (filesystem) */ - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int ubcount; /* size of user's buffer */ - int stat; struct xfs_bulkstat_agichunk ac; + int error = 0; /* * Get the last inode value, see if there's nothing to do. */ - ino = (xfs_ino_t)*lastinop; - lastino = ino; - agno = XFS_INO_TO_AGNO(mp, ino); - agino = XFS_INO_TO_AGINO(mp, ino); + lastino = *lastinop; + agno = XFS_INO_TO_AGNO(mp, lastino); + agino = XFS_INO_TO_AGINO(mp, lastino); if (agno >= mp->m_sb.sb_agcount || - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { *done = 1; *ubcountp = 0; return 0; @@ -393,8 +386,13 @@ xfs_bulkstat( * inode returned; 0 means start of the allocation group. */ rval = 0; - while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { - cond_resched(); + while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { + struct xfs_inobt_rec_incore *irbp = irbuf; + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; + bool end_of_ag = false; + int icount = 0; + int stat; + error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) break; @@ -404,10 +402,6 @@ xfs_bulkstat( */ cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_INO); - irbp = irbuf; - irbufend = irbuf + nirbuf; - end_of_ag = 0; - icount = 0; if (agino > 0) { /* * In the middle of an allocation group, we need to get @@ -432,7 +426,7 @@ xfs_bulkstat( error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); } if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } @@ -445,7 +439,7 @@ xfs_bulkstat( error = xfs_inobt_get_rec(cur, &r, &stat); if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } @@ -467,7 +461,7 @@ xfs_bulkstat( agino = r.ir_startino + XFS_INODES_PER_CHUNK; error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } cond_resched(); @@ -488,7 +482,7 @@ del_cursor: */ irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); + irbp < irbufend && ac.ac_ubleft >= statstruct_size; irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac, @@ -499,17 +493,14 @@ del_cursor: cond_resched(); } - /* - * Set up for the next loop iteration. - */ - if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { - if (end_of_ag) { - agno++; - agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); - } else + if (error) break; + + if (end_of_ag) { + agno++; + agino = 0; + } else + agino = XFS_INO_TO_AGINO(mp, lastino); } /* * Done, we're either out of filesystem or space to put the data. -- 2.0.0 From dave@fromorbit.com Tue Nov 4 06:53:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3A9C57F7C for ; Tue, 4 Nov 2014 06:53:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 27D8C8F804C for ; Tue, 4 Nov 2014 04:53:33 -0800 (PST) X-ASG-Debug-ID: 1415105606-04cbb070c75f6be0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id jETrEURokfyRlhiF for ; Tue, 04 Nov 2014 04:53:31 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiEPABPLWFR5LbBUPGdsb2JhbABcgw6BLIc9s0gBAQEBAQacPRcBAQEBAQYBAQEBODuEAwEFJy8zCBgxOQMHFBmIQMxahjePKwWGNq9nAQsrIIFuKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Pi-RS for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jI-Qb for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Date: Tue, 4 Nov 2014 23:53:17 +1100 X-ASG-Orig-Subj: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Message-Id: <1415105601-6455-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415105601-6455-1-git-send-email-david@fromorbit.com> References: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105610 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The xfs_bulkstat_agichunk formatting cursor takes buffer values from the main loop and passes them via the structure to the chunk formatter, and the writes the chnged values back into the main loop local variables. UNfortunately, this complex dance is full of corner cases that aren't handled correctly. The biggest problem is that it is double handling the information in both the main loop and the chunk formatting function, leading to inconsistent updates and endless loops where progress is not made. To fix this, push the struct xfs_bulkstat_agichunk outwards to be the primary holder of user buffer information. this removes the double handling in the main loop. Also, pass the last inode processed by the chunk formatter as a separate parameter as it purely an output variable and is not related to the user buffer consumption cursor. Finally, the chunk formatting code is not shared by anyone, so make it local to xfs_itable.c. Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 59 +++++++++++++++++++++++++---------------------------- fs/xfs/xfs_itable.h | 16 --------------- 2 files changed, 28 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 16737cb..50a3e59 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -262,20 +262,26 @@ xfs_bulkstat_grab_ichunk( #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) +struct xfs_bulkstat_agichunk { + char __user **ac_ubuffer;/* pointer into user's buffer */ + int ac_ubleft; /* bytes left in user's buffer */ + int ac_ubelem; /* spaces used in user's buffer */ +}; + /* * Process inodes in chunk with a pointer to a formatter function * that will iget the inode and fill in the appropriate structure. */ -int +static int xfs_bulkstat_ag_ichunk( struct xfs_mount *mp, xfs_agnumber_t agno, struct xfs_inobt_rec_incore *irbp, bulkstat_one_pf formatter, size_t statstruct_size, - struct xfs_bulkstat_agichunk *acp) + struct xfs_bulkstat_agichunk *acp, + xfs_ino_t *lastino) { - xfs_ino_t lastino = acp->ac_lastino; char __user **ubufp = acp->ac_ubuffer; int ubleft = acp->ac_ubleft; int ubelem = acp->ac_ubelem; @@ -295,7 +301,7 @@ xfs_bulkstat_ag_ichunk( /* Skip if this inode is free */ if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - lastino = ino; + *lastino = ino; continue; } @@ -313,7 +319,7 @@ xfs_bulkstat_ag_ichunk( ubleft = 0; break; } - lastino = ino; + *lastino = ino; continue; } if (fmterror == BULKSTAT_RV_GIVEUP) { @@ -325,10 +331,9 @@ xfs_bulkstat_ag_ichunk( *ubufp += ubused; ubleft -= ubused; ubelem++; - lastino = ino; + *lastino = ino; } - acp->ac_lastino = lastino; acp->ac_ubleft = ubleft; acp->ac_ubelem = ubelem; @@ -355,7 +360,6 @@ xfs_bulkstat( xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ - int fmterror;/* bulkstat formatter result */ int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ xfs_ino_t ino; /* inode number (filesystem) */ @@ -366,10 +370,8 @@ xfs_bulkstat( int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int ubcount; /* size of user's buffer */ - int ubleft; /* bytes left in user's buffer */ - char __user *ubufp; /* pointer into user's buffer */ - int ubelem; /* spaces used in user's buffer */ int stat; + struct xfs_bulkstat_agichunk ac; /* * Get the last inode value, see if there's nothing to do. @@ -386,11 +388,13 @@ xfs_bulkstat( } ubcount = *ubcountp; /* statstruct's */ - ubleft = ubcount * statstruct_size; /* bytes */ - *ubcountp = ubelem = 0; + ac.ac_ubuffer = &ubuffer; + ac.ac_ubleft = ubcount * statstruct_size; /* bytes */; + ac.ac_ubelem = 0; + + *ubcountp = 0; *done = 0; - fmterror = 0; - ubufp = ubuffer; + irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); if (!irbuf) return -ENOMEM; @@ -402,7 +406,7 @@ xfs_bulkstat( * inode returned; 0 means start of the allocation group. */ rval = 0; - while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { + while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { cond_resched(); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) @@ -497,28 +501,21 @@ del_cursor: */ irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { - struct xfs_bulkstat_agichunk ac; - - ac.ac_lastino = lastino; - ac.ac_ubuffer = &ubuffer; - ac.ac_ubleft = ubleft; - ac.ac_ubelem = ubelem; + irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); + irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, - formatter, statstruct_size, &ac); + formatter, statstruct_size, &ac, + &lastino); if (error) rval = error; - lastino = ac.ac_lastino; - ubleft = ac.ac_ubleft; - ubelem = ac.ac_ubelem; - cond_resched(); } + /* * Set up for the next loop iteration. */ - if (XFS_BULKSTAT_UBLEFT(ubleft)) { + if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { if (end_of_ag) { agno++; agino = 0; @@ -531,11 +528,11 @@ del_cursor: * Done, we're either out of filesystem or space to put the data. */ kmem_free(irbuf); - *ubcountp = ubelem; + *ubcountp = ac.ac_ubelem; /* * Found some inodes, return them now and return the error next time. */ - if (ubelem) + if (ac.ac_ubelem) rval = 0; if (agno >= mp->m_sb.sb_agcount) { /* diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index aaed080..6ea8b39 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -30,22 +30,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, int *ubused, int *stat); -struct xfs_bulkstat_agichunk { - xfs_ino_t ac_lastino; /* last inode returned */ - char __user **ac_ubuffer;/* pointer into user's buffer */ - int ac_ubleft; /* bytes left in user's buffer */ - int ac_ubelem; /* spaces used in user's buffer */ -}; - -int -xfs_bulkstat_ag_ichunk( - struct xfs_mount *mp, - xfs_agnumber_t agno, - struct xfs_inobt_rec_incore *irbp, - bulkstat_one_pf formatter, - size_t statstruct_size, - struct xfs_bulkstat_agichunk *acp); - /* * Values for stat return value. */ -- 2.0.0 From dave@fromorbit.com Tue Nov 4 06:53:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8C1BE7F7C for ; Tue, 4 Nov 2014 06:53:34 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7A552304039 for ; Tue, 4 Nov 2014 04:53:31 -0800 (PST) X-ASG-Debug-ID: 1415105606-04cbb070c75f6be0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TovFZjOkAasVhCgB for ; Tue, 04 Nov 2014 04:53:29 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgEPABPLWFR5LbBUPGdsb2JhbABcgw6IabNIAQEBAQEGnD0XAQEBAQEGAQEBATg7hF87gQIDB4htpzalJIY3jysFnziRFYVQAQsBgjgpgnoBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Nov 2014 23:23:25 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xldbv-0008Pg-QN for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xldbv-0001jA-PA for xfs@oss.sgi.com; Tue, 04 Nov 2014 23:53:23 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6] xfs: fix the bulkstat mess Date: Tue, 4 Nov 2014 23:53:15 +1100 X-ASG-Orig-Subj: [PATCH 0/6] xfs: fix the bulkstat mess Message-Id: <1415105601-6455-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415105609 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This series of patches applies on top of the xfs-fixes-for-3.18-rc3 branch in the upstream repository. The bulkstat refactoring in 3.17 broke bulkstat in a couple of subtle ways and exposed an API wart that was undocumented and completely non-obvious and these lead to xfsdump failing badly on some filesystems. The first 5 patches in this series are necessary to fix the regressions, the 6th patch cleans up a remaining loose end. Essentially, the old bulkstat code was pretty much unchanged in algorithm since 1995 when a commit was made to fix a deadlock. See the commit in the XFS archive tree 314ccac26af ("Fix a locking bug in bulkstat by rewriting it"). Unfortunately, this commit introduced the unexpected behviour that the inode pointed to by the lastino cookie is not included in the bulkstat output. THe result of this is some tricky code in xfsdump - again undocumented - where a specific bulkstat scan during the dump process does not use the bulkstat lastino cookie, but uses it's own internal inode map to determine where to start the next bulkstat call. In this case, the bulkstat cookie has a magic "target - 1" calculation. In all other bulkstat cases, the cookie from the previous call is passed into the next call. This magic code in cfsdump was introduced in 2006 as an optimisation to avoid making too many bulkstat calls. Essentially, the xfsdump code is working around the undocumented lastino cookie behaviour. Seeing as userspace has already coded for this bug, we can't change that behaviour now, and that's exactly what the refactoring in 3.17 did - it rejected "lastino - 1" in certain circumstances with EINVAL instead of doing the right thing and returning the correct inodes. But, this was the last problem I found, because the EINVAL was dropped on the floor and ignored, because bulkstat only returned errors from the formatting function of inodes it did find. Hence the fact it didn't scan an inode it should have was silently lost. I found this problem after I realised that errors from the formatting function are only returned if no other inodes were successfully formatted at all. Which means, in reality, errors encountered during bulkstat are universally ignored and the result is "successful" scans that are silently missing inodes. Which means xfsdump succeeds, but xfsrestore tells us that it was a corrupted dump. Of course, in getting to this point, I first had to add the missing checks in the btree walk termination detection, fix the user buffer space tracking, the inode tracking, the slightly broken chunk formattting loop conditions, remove a bunch of unused variables, and so on. There was a *lot* that didn't work correctly and I'm still slightly stunned at the fact it worked well enough to pass all the xfsdump/restore QA in xfstests. As such, the first 5 patches are -stable kernel material, and the last patch should go with them into the 3.18 tree to complete the cleanup of code. This needs eyeballs and testing - create some metadumps of your production filesystems and use them to test xfsdump on a kernel with these changes...... Comments, thoughts, testing all welcome as this needs to go upstream sooner rather than later.... -Dave. From htejun@gmail.com Tue Nov 4 07:38:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DA2DC7F7C for ; Tue, 4 Nov 2014 07:38:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C7F438F8037 for ; Tue, 4 Nov 2014 05:38:24 -0800 (PST) X-ASG-Debug-ID: 1415108303-04cb6c2efc568240001-NocioJ Received: from mail-qg0-f46.google.com (mail-qg0-f46.google.com [209.85.192.46]) by cuda.sgi.com with ESMTP id DUOk3fQDBVBoXrcG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 04 Nov 2014 05:38:23 -0800 (PST) X-Barracuda-Envelope-From: htejun@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.46] Received: by mail-qg0-f46.google.com with SMTP id i50so9431610qgf.33 for ; Tue, 04 Nov 2014 05:38:23 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=e2fHOb1yrSdzkLkbTKmeoSyzw7yscS6pV7zKKD7EyGM=; b=iRMtJLWE7FiKqff88VIPVzytYWWjUs+I1eaEx+TLViA34VV5TkXxvMMiRxHqPgzpZA Gm7Oudpp44DaASkiuMrv7StHknreBZYNPgkor3YOlJcvnNV7gxX0dasSJNFPHMrzgifF O2LOuPtFm6TfOqG3gtYpu6ALpCLGV3wP6SZa5AUn87UqaZIHBW9+NM29A3MlhaIacy3R yr7fDOD+VXx7ibgZEXG+kZ8ZKyjXzSJbJoZg/ouh3DpyXTOQD6YXDer0hN91BfTftzwc cGAAqTyeKHBfIz7dhfJ2oF+x+NSCFCgqql6C7r2xzyVYu0o6fLqezmV0tRoAYYLM4wta ywVQ== X-Received: by 10.224.66.70 with SMTP id m6mr77420595qai.45.1415108303501; Tue, 04 Nov 2014 05:38:23 -0800 (PST) Received: from htj.dyndns.org (207-38-238-8.c3-0.wsd-ubr1.qens-wsd.ny.cable.rcn.com. [207.38.238.8]) by mx.google.com with ESMTPSA id h79sm372055qgd.27.2014.11.04.05.38.22 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 04 Nov 2014 05:38:22 -0800 (PST) Sender: Tejun Heo Date: Tue, 4 Nov 2014 08:38:20 -0500 From: Tejun Heo To: Fengguang Wu Cc: LKML , lkp@01.org, "xfs@oss.sgi.com" , linux-fsdevel@vger.kernel.org Subject: Re: [AHCI] XFS (sda3): metadata I/O error: block 0x941ce20 ("xlog_iodone") error 5 numblks 64 Message-ID: <20141104133820.GA13567@htj.dyndns.org> X-ASG-Orig-Subj: Re: [AHCI] XFS (sda3): metadata I/O error: block 0x941ce20 ("xlog_iodone") error 5 numblks 64 References: <20141104042522.GA14917@wfg-t540p.sh.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141104042522.GA14917@wfg-t540p.sh.intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-qg0-f46.google.com[209.85.192.46] X-Barracuda-Start-Time: 1415108303 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11223 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 04, 2014 at 12:25:22PM +0800, Fengguang Wu wrote: > Hi Tejun, > > FYI, we noticed the below changes on > > git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata for-3.18-fixes > commit 61e268068c92ed000f078dc1ab71d1228439fecd ("Revert "AHCI: Optimize single IRQ interrupt processing"") Yeah, there's a dependent revert that I missed. libata/for-3.18-fixes has been rebased, so this shouldn't happen anymore. Thanks. -- tejun From hmeij@wesleyan.edu Tue Nov 4 08:17:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.3 required=5.0 tests=FB_GET_MEDS,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DE0157F58 for ; Tue, 4 Nov 2014 08:17:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB964304048 for ; Tue, 4 Nov 2014 06:17:02 -0800 (PST) X-ASG-Debug-ID: 1415110620-04cbb070c65fa1d0001-NocioJ Received: from internal-smtp4.wesleyan.edu (internal-smtp4.wesleyan.edu [129.133.6.200]) by cuda.sgi.com with ESMTP id 4ShGlsAs0XRauQHF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 06:17:01 -0800 (PST) X-Barracuda-Envelope-From: hmeij@wesleyan.edu X-Barracuda-Apparent-Source-IP: 129.133.6.200 Received: from exchcas4.wesad.wesleyan.edu (exchcas4.wesleyan.edu [129.133.6.94]) by msa.wesleyan.edu (8.14.4/8.14.4) with ESMTP id sA4EH0wq019479 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Tue, 4 Nov 2014 09:17:00 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=wesleyan.edu; s=feb2013.wesmsa; t=1415110620; bh=oeXNStoM7+77JdhB3QULuJKdvNJo2SZ9se/9nFHGzlY=; h=From:To:Subject:Date:References:In-Reply-To; b=JXLxy9fwQ6Fe/fv2PqXaVpyzwem95SGacmYDDb0IqNVbwgTscU3/jVlrWUuIsk9qC gh81PeeKPfAwRFcvs5GKeTHczdqKo8zDyWm3NRq2pepmdLStqX//sw71F0rBCLhmsn w9x+h47AstZLHoVt+RVrjTHikwaEH7sRxbx1TXFo= Received: from EXCHANGEWES8.wesad.wesleyan.edu ([fe80::a8a6:1fde:f6ae:1fa8]) by exchcas4.wesad.wesleyan.edu ([2002:8185:65e::8185:65e]) with mapi id 14.03.0210.002; Tue, 4 Nov 2014 09:16:59 -0500 From: "Meij, Henk" To: Peter Grandi , Linux fs XFS Subject: RE: clone of filesystem across network preserving ionodes Thread-Topic: clone of filesystem across network preserving ionodes X-ASG-Orig-Subj: RE: clone of filesystem across network preserving ionodes Thread-Index: Ac/3pUOyyQOPe9XjTQ+jW6h6Iz9yCwAR75OAABJta30= Date: Tue, 4 Nov 2014 14:16:59 +0000 Message-ID: <8688BD11DAC0574AA90295127E9E9F4AC047FECB@exchangewes8.wesad.wesleyan.edu> References: <8688BD11DAC0574AA90295127E9E9F4AC047F1CA@exchangewes8.wesad.wesleyan.edu>,<21592.6241.228215.412783@tree.ty.sabi.co.uk> In-Reply-To: <21592.6241.228215.412783@tree.ty.sabi.co.uk> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [129.133.6.204] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Wesleyan-MailScanner-ID: sA4EH0wq019479 X-Wesleyan-MailScanner: Found to be clean X-Wesleyan-MailScanner-From: hmeij@wesleyan.edu X-Barracuda-Connect: internal-smtp4.wesleyan.edu[129.133.6.200] X-Barracuda-Start-Time: 1415110621 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.12 X-Barracuda-Spam-Status: No, SCORE=1.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, FB_GET_MEDS, FB_GET_MEDS_2, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FB_GET_MEDS BODY: Looks like trying to sell meds 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.10 FB_GET_MEDS_2 Looks like trying to sell meds Thank you list, I think the problem is in my work flow, and in my head. I = will be testing some suggestions and will report back. To answer some of th= e questions: S1 and S2 are identical research storage units (112TB each) partitioned in = 4 28TB partitions, with duplicate data for fail over purposes (exceeds out = enterprise backup capacity, cheaper this way). DRBD is where we started. v8.4.5 was tested but could not deliver rates lar= ger than 40MB/s, despite the lists excellent suggestions. We're unsure why;= we ran w/wo BBU, changed RW policies, configured 2 global hot spares into = raid 0, even made ram disks, multiple drbd devices, but the storage unit (x= fs on raid 60) never obtained the "want" speeds of 100MB/s. rsync tests had= no problems reaching 112MB/s and slightly better nic-to-nic. First initial= ization/re-sync times for DRBD would be 30 days unless fixed. So we're building our own. Pulling data from multiple locations to seed S1,= then use rsync or xfsdump to seed S2. Manual fail over of service IP with = scripts. Nightly incrementals. We'd like to run daily, weekly, monthly snap= shots on S2. We do that with the --link-dest=3D/path/to/d.1 /path/to/source= /path/to/d.0 ... now the first daily snapshot (d.0) will be as large as = the source. And that's what I like to avoid (having 3 copies) so I need to= change my thinking and present the S2 copy to --link-dest as the latest ba= ckup. -Henk ________________________________________ From: xfs-bounces@oss.sgi.com [xfs-bounces@oss.sgi.com] on behalf of Peter = Grandi [pg@xfs.list.sabi.co.UK] Sent: Monday, November 03, 2014 7:05 PM To: Linux fs XFS Subject: Re: clone of filesystem across network preserving ionodes > What is the best practice way to get the contents from > server1 to server2 identical disk array partitions Here you do not say that =ABget the contents=BB has to be over the network, but the 'Subject:' line seems to indicate that. > and preserve the ionode information using xfs tools or non-xfs > tools? xfsdump/xfsrestore appear to not preserve this or I can > not find the obvious setting. If =ABpreserve the ionode information=BB means "keep the same inumbers for each inode" that seems to me fairly pointless in almost every situation (except perhaps for forensic purposes, and that opens a whole series of other issues), so there is no =ABbest practice way=BB as there is little or no practice, and management speak won't change that. More clarity in explaining what you mean and/or what you want to achieve would be better. If you want for whatever reason to make a byte-by-byte copy from block device X (potentially mounted on M) on host S1 to the corresponding one of =ABidentical disk array partitions=BB Y on host S2, which also preserves the inumbers, something fairly common is to use 'ssh' as a network pipe (run on host S1): M=3D"`grep \"^$X\" /proc/mounts | cut -d' ' -f2`" case "$M" in ?*) xfs_freeze -f `"$M";; esac sudo sh -c "lzop < '$X'" | dd bs=3D64k iflag=3Dfullblock \ | ssh -oCipher=3Darcfour -oCompression=3Dno "$S2" \ "dd bs=3D64k iflag=3Dfullblock | sudo sh -c "\'"lzop -d > '$Y'"\'"" case "$M" in ?*) xfs_freeze -u `"$M";; esac If 'xfs_freeze' is suitable, and if no interruptions happen; if they happen put reasonable "seek" and "skip" parameters on 'dd' and rerun. If the target block device is bigger than the source block device, one can use 'xfs_growfs' after the byte-by-byte copy (growing filetrees has downsides though). Unless by =ABpreserve the ionode information=BB or =ABidentical disk array partitions=BB you mean something different from what they appear to mean to me. The above just copied for me a 88GiB block device in 1624s between two ordinary home PCs. One could replace 'ssh' with 'nc' or similar network piping commands for higher speed (at some cost). I also tried to interpolate 'xfs_copy -d -b "$X" /dev/stdout | lzop ...' but 'xfs_copy' won't do that, not entirely unexpectedly. If by =ABpreserve the ionode information=BB you simply mean copy all file attributes but without keeping the inumber (except for 'atime', but is usually disabled anyhow, and there is a patch to restore it), if the source filetree is mounted at M on S1 and the target is mounted at N (you may opt to mount with 'nobarrier') on S2, a fairly common way is to use RSYNC with various preserving options (run on host S1): sudo rsync -i -axAHX --del -z \ -e 'ssh -oCipher=3Darcfour -oCompression=3Dno -l root' \ "$M"/ "$S2":"$N"/ The following is another common way that has slightly different effects on 'atime' and 'ctime' (requires a patched GNU 'tar' or be replaced with 'star') by using 'ssh' combines with 'tar': sudo sh -c "cd '$M' && tar -c --one --selinux --acls --xattrs -f - ." \ | lzop | dd bs=3D64k iflag=3Dfullblock \ | ssh -oCipher=3Darcfour -oCompression=3Dno "$S2" \ "dd bs=3D64k iflag=3Dfullblock | lzop -d \ | sudo sh -c 'cd \"$N\" && tar -xv --preserve-p --atime-p -f -'" > xfs_copy would, per documentation, Probably 'xfs_copy' is only necessary in the case where you really want to preserve inums, and the source block device is larger than the target block device (and obviously the size of the content is smaller than the size of the target block device). > but can I get from server1 to server2? That probably requires finding a target medium (file or block device) big enough and that can be shared (or transported) between S1 and S2. This could involve a filetree on S2 that is exported (for example by NFSv4) to S1 and large enough to hold the target file(s) of 'xfs_copy'. PS Whichever way is chosen to the copy, a second run with RSYNC options '-n -c' might help verify that corruption did not happens during the copy. _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs= From dave.kleikamp@oracle.com Tue Nov 4 08:18:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF2767F58 for ; Tue, 4 Nov 2014 08:18:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CC0F930404E for ; Tue, 4 Nov 2014 06:18:16 -0800 (PST) X-ASG-Debug-ID: 1415110695-04cbb070c65fa430001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id CvC0S3nsjsNe9b3D (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 06:18:15 -0800 (PST) X-Barracuda-Envelope-From: dave.kleikamp@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id sA4EHLrQ027804 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Nov 2014 14:17:22 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id sA4DT8Mm003723 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Tue, 4 Nov 2014 13:29:08 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id sA4EHHDd026978; Tue, 4 Nov 2014 14:17:17 GMT Received: from [192.168.1.103] (/99.156.91.244) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 04 Nov 2014 06:17:17 -0800 Message-ID: <5458DFEB.50300@oracle.com> Date: Tue, 04 Nov 2014 08:17:15 -0600 From: Dave Kleikamp User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Jan Kara , linux-fsdevel@vger.kernel.org CC: linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de Subject: Re: [PATCH 11/12] jfs: Convert to private i_dquot field References: <1415099993-18034-1-git-send-email-jack@suse.cz> <1415099993-18034-12-git-send-email-jack@suse.cz> X-ASG-Orig-Subj: Re: [PATCH 11/12] jfs: Convert to private i_dquot field In-Reply-To: <1415099993-18034-12-git-send-email-jack@suse.cz> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1415110695 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/04/2014 05:19 AM, Jan Kara wrote: > CC: jfs-discussion@lists.sourceforge.net > Signed-off-by: Jan Kara Acked-by: Dave Kleikamp > --- > fs/jfs/jfs_incore.h | 3 +++ > fs/jfs/super.c | 9 +++++++++ > 2 files changed, 12 insertions(+) > > diff --git a/fs/jfs/jfs_incore.h b/fs/jfs/jfs_incore.h > index cf47f09e8ac8..fa7e795bd8ae 100644 > --- a/fs/jfs/jfs_incore.h > +++ b/fs/jfs/jfs_incore.h > @@ -94,6 +94,9 @@ struct jfs_inode_info { > unchar _inline_ea[128]; /* 128: inline extended attr */ > } link; > } u; > +#ifdef CONFIG_QUOTA > + struct dquot *i_dquot[MAXQUOTAS]; > +#endif > u32 dev; /* will die when we get wide dev_t */ > struct inode vfs_inode; > }; > diff --git a/fs/jfs/super.c b/fs/jfs/super.c > index 93e897e588a8..16c3a9556634 100644 > --- a/fs/jfs/super.c > +++ b/fs/jfs/super.c > @@ -117,6 +117,9 @@ static struct inode *jfs_alloc_inode(struct super_block *sb) > jfs_inode = kmem_cache_alloc(jfs_inode_cachep, GFP_NOFS); > if (!jfs_inode) > return NULL; > +#ifdef CONFIG_QUOTA > + memset(&jfs_inode->i_dquot, 0, sizeof(jfs_inode->i_dquot)); > +#endif > return &jfs_inode->vfs_inode; > } > > @@ -537,6 +540,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) > #ifdef CONFIG_QUOTA > sb->dq_op = &dquot_operations; > sb->s_qcop = &dquot_quotactl_ops; > + sb->s_quota_types = QTYPE_MASK_USR | QTYPE_MASK_GRP; > #endif > > /* > @@ -836,6 +840,10 @@ out: > return len - towrite; > } > > +static struct dquot **jfs_get_dquots(struct inode *inode) > +{ > + return JFS_IP(inode)->i_dquot; > +} > #endif > > static const struct super_operations jfs_super_operations = { > @@ -854,6 +862,7 @@ static const struct super_operations jfs_super_operations = { > #ifdef CONFIG_QUOTA > .quota_read = jfs_quota_read, > .quota_write = jfs_quota_write, > + .get_dquots = jfs_get_dquots, > #endif > }; > > From tytso@thunk.org Tue Nov 4 08:27:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AB77E7F58 for ; Tue, 4 Nov 2014 08:27:50 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 868AD30404E for ; Tue, 4 Nov 2014 06:27:50 -0800 (PST) X-ASG-Debug-ID: 1415111268-04bdf038d1675550001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id T5AbiQAMKmwMCH2E (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 04 Nov 2014 06:27:48 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=AQGKrSHs+iHCfxCd8C0azGgG0o+6ANdsDQggeKJ2Z0g=; b=GIB9AEFQWzGvxcm4OqKFf3Ld7BJQ/Cn8v+5bKlMQ+EmTc3Clco5OIjV64YgcgwPHHX9tHf2/kdOSsqgz7RqLTklLPhmt+DzSRdw7LvLXOT5DgiT30F9qrLb9ORu2CkUtcd+RL3t+kAYwQKGCAo4dmkPsQjMWbjoLopV9/w9cTBU=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xlf4c-0007zl-87; Tue, 04 Nov 2014 14:27:06 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 0F608580184; Tue, 4 Nov 2014 09:24:57 -0500 (EST) Date: Tue, 4 Nov 2014 09:24:57 -0500 From: Theodore Ts'o To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, viro@zeniv.linux.org.uk, hch@lst.de Subject: Re: [PATCH 08/12] ext4: Convert to private i_dquot field Message-ID: <20141104142457.GA31295@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 08/12] ext4: Convert to private i_dquot field References: <1415099993-18034-1-git-send-email-jack@suse.cz> <1415099993-18034-9-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415099993-18034-9-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1415111268 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 04, 2014 at 12:19:49PM +0100, Jan Kara wrote: > CC: linux-ext4@vger.kernel.org > CC: "Theodore Ts'o" > Signed-off-by: Jan Kara Acked-by: Theodore Ts'o - Ted From bfoster@redhat.com Tue Nov 4 12:58:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D545B7F8C for ; Tue, 4 Nov 2014 12:58:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3F63304067 for ; Tue, 4 Nov 2014 10:58:29 -0800 (PST) X-ASG-Debug-ID: 1415127505-04bdf038d0682e00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GLwU1yJoGrapEJlP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 10:58:25 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IwNoi026730 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 13:58:23 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IwNKV016111; Tue, 4 Nov 2014 13:58:23 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id DCC5A122F87; Tue, 4 Nov 2014 13:58:21 -0500 (EST) Date: Tue, 4 Nov 2014 13:58:21 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Message-ID: <20141104185821.GC55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415105601-6455-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415127505 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 11:53:16PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The bulkstat code has several different ways of detecting the end of > an AG when doing a walk. They are not consistently detected, and the > code that checks for the end of AG conditions is not consistently > coded. Hence the are conditions where the walk code can get stuck in > an endless loop making no progress and not triggering any > termination conditions. > > Convert all the "tmp/i" status return codes from btree operations > to a common name (stat) and apply end-of-ag detection to these > operations consistently. > > cc: stable@vger.kernel.org > Signed-off-by: Dave Chinner > --- Looks Ok... Reviewed-by: Brian Foster > fs/xfs/xfs_itable.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 7765ff7..16737cb 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -356,7 +356,6 @@ xfs_bulkstat( > int end_of_ag; /* set if we've seen the ag end */ > int error; /* error code */ > int fmterror;/* bulkstat formatter result */ > - int i; /* loop index */ > int icount; /* count of inodes good in irbuf */ > size_t irbsize; /* size of irec buffer in bytes */ > xfs_ino_t ino; /* inode number (filesystem) */ > @@ -366,11 +365,11 @@ xfs_bulkstat( > xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > int rval; /* return value error code */ > - int tmp; /* result value from btree calls */ > int ubcount; /* size of user's buffer */ > int ubleft; /* bytes left in user's buffer */ > char __user *ubufp; /* pointer into user's buffer */ > int ubelem; /* spaces used in user's buffer */ > + int stat; > > /* > * Get the last inode value, see if there's nothing to do. > @@ -436,13 +435,15 @@ xfs_bulkstat( > agino = r.ir_startino + XFS_INODES_PER_CHUNK; > } > /* Increment to the next record */ > - error = xfs_btree_increment(cur, 0, &tmp); > + error = xfs_btree_increment(cur, 0, &stat); > } else { > /* Start of ag. Lookup the first inode chunk */ > - error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); > + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); > } > - if (error) > + if (error || stat == 0) { > + end_of_ag = 1; > goto del_cursor; > + } > > /* > * Loop through inode btree records in this ag, > @@ -451,8 +452,8 @@ xfs_bulkstat( > while (irbp < irbufend && icount < ubcount) { > struct xfs_inobt_rec_incore r; > > - error = xfs_inobt_get_rec(cur, &r, &i); > - if (error || i == 0) { > + error = xfs_inobt_get_rec(cur, &r, &stat); > + if (error || stat == 0) { > end_of_ag = 1; > goto del_cursor; > } > @@ -473,8 +474,8 @@ xfs_bulkstat( > * Set agino to after this chunk and bump the cursor. > */ > agino = r.ir_startino + XFS_INODES_PER_CHUNK; > - error = xfs_btree_increment(cur, 0, &tmp); > - if (error) { > + error = xfs_btree_increment(cur, 0, &stat); > + if (error || stat == 0) { > end_of_ag = 1; > goto del_cursor; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 4 12:58:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 56A947F8C for ; Tue, 4 Nov 2014 12:58:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1638C8F8033 for ; Tue, 4 Nov 2014 10:58:53 -0800 (PST) X-ASG-Debug-ID: 1415127532-04bdf038d0682e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JqMc9BQvKOYmzBFP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 10:58:52 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4Iwp0l006251 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 13:58:51 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4Iwo6L029093; Tue, 4 Nov 2014 13:58:51 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id A8EF4122F87; Tue, 4 Nov 2014 13:58:49 -0500 (EST) Date: Tue, 4 Nov 2014 13:58:49 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-ID: <20141104185849.GE55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415105601-6455-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415127532 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 11:53:18PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The loop construct has issues: > - clustidx is completely unused, so remove it. > - the loop tries to be smart by terminating when the > "freecount" tells it that all inodes are free. Just drop > it as in most cases we have to scan all inodes in the > chunk anyway. > - move the "user buffer left" condition check to the only > point where we consume space int eh user buffer. > - move the initialisation of agino out of the loop, leaving > just a simple loop control logic using the clusteridx. > > Also, double handling of the user buffer variables leads to problems > tracking the current state - use the cursor variables directly > rather than keeping local copies and then having to update the > cursor before returning. > > cc: > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_itable.c | 55 ++++++++++++++++++++--------------------------------- > 1 file changed, 21 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 50a3e59..ff31965 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -283,59 +283,46 @@ xfs_bulkstat_ag_ichunk( > xfs_ino_t *lastino) > { > char __user **ubufp = acp->ac_ubuffer; > - int ubleft = acp->ac_ubleft; > - int ubelem = acp->ac_ubelem; > - int chunkidx, clustidx; > + int chunkidx; > int error = 0; > xfs_agino_t agino; > > - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; > - XFS_BULKSTAT_UBLEFT(ubleft) && > - irbp->ir_freecount < XFS_INODES_PER_CHUNK; > - chunkidx++, clustidx++, agino++) { > - int fmterror; /* bulkstat formatter result */ > + agino = irbp->ir_startino; > + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > + chunkidx++, agino++) { > + int fmterror; > int ubused; > xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > > - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); > - > /* Skip if this inode is free */ > if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > *lastino = ino; > continue; > } > > - /* > - * Count used inodes as free so we can tell when the > - * chunk is used up. > - */ > - irbp->ir_freecount++; > - > /* Get the inode and fill in a single buffer */ > ubused = statstruct_size; > - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); > - if (fmterror == BULKSTAT_RV_NOTHING) { > - if (error && error != -ENOENT && error != -EINVAL) { > - ubleft = 0; > - break; > - } > - *lastino = ino; > - continue; > - } > - if (fmterror == BULKSTAT_RV_GIVEUP) { > - ubleft = 0; > + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > + &ubused, &fmterror); > + if (fmterror == BULKSTAT_RV_GIVEUP || > + (error && error != -ENOENT && error != -EINVAL)) { > + acp->ac_ubleft = 0; > ASSERT(error); > break; > } > - if (*ubufp) > - *ubufp += ubused; > - ubleft -= ubused; > - ubelem++; > + if (fmterror == BULKSTAT_RV_NOTHING || error) { > + *lastino = ino; > + continue; > + } Not introduced by this patch, but this looks like inconsistent error handling. The structure of the code suggests we intend to carry on in the event of ENOENT or EINVAL, but said errors can leak out of this function if we never get back to the formatter call (e.g., we're at the last inode or all subsequent inodes are free). Brian > + > + *ubufp += ubused; > + acp->ac_ubleft -= ubused; > + acp->ac_ubelem++; > *lastino = ino; > - } > > - acp->ac_ubleft = ubleft; > - acp->ac_ubelem = ubelem; > + if (acp->ac_ubleft < statstruct_size) > + break; > + } > > return error; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 4 12:59:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0BF3F7F8C for ; Tue, 4 Nov 2014 12:59:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE657304062 for ; Tue, 4 Nov 2014 10:59:14 -0800 (PST) X-ASG-Debug-ID: 1415127553-04cb6c2efa577500001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cB8MaihSlrjtlcHK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 10:59:13 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IxAWH028338 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 13:59:11 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IxAlb020906; Tue, 4 Nov 2014 13:59:10 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C5F6E122F87; Tue, 4 Nov 2014 13:59:08 -0500 (EST) Date: Tue, 4 Nov 2014 13:59:08 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Message-ID: <20141104185908.GF55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: bulkstat main loop logic is a mess References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415105601-6455-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415127553 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 11:53:19PM +1100, Dave Chinner wrote: > From: Dave Chinner > > There are a bunch of variables tha tare more wildy scoped than they > need to be, obfuscated user buffer checks and tortured "next inode" > tracking. This all needs cleaning up to expose the real issues that > need fixing. > > cc: > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_itable.c | 55 ++++++++++++++++++++++------------------------------- > 1 file changed, 23 insertions(+), 32 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index ff31965..fc4cf5d 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -345,30 +345,23 @@ xfs_bulkstat( > xfs_agino_t agino; /* inode # in allocation group */ > xfs_agnumber_t agno; /* allocation group number */ > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > - int end_of_ag; /* set if we've seen the ag end */ > - int error; /* error code */ > - int icount; /* count of inodes good in irbuf */ > size_t irbsize; /* size of irec buffer in bytes */ > - xfs_ino_t ino; /* inode number (filesystem) */ > - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ > xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > int rval; /* return value error code */ > int ubcount; /* size of user's buffer */ > - int stat; > struct xfs_bulkstat_agichunk ac; > + int error = 0; > > /* > * Get the last inode value, see if there's nothing to do. > */ > - ino = (xfs_ino_t)*lastinop; > - lastino = ino; > - agno = XFS_INO_TO_AGNO(mp, ino); > - agino = XFS_INO_TO_AGINO(mp, ino); > + lastino = *lastinop; > + agno = XFS_INO_TO_AGNO(mp, lastino); > + agino = XFS_INO_TO_AGINO(mp, lastino); > if (agno >= mp->m_sb.sb_agcount || > - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { > + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { > *done = 1; > *ubcountp = 0; > return 0; > @@ -393,8 +386,13 @@ xfs_bulkstat( > * inode returned; 0 means start of the allocation group. > */ > rval = 0; > - while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { > - cond_resched(); > + while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { > + struct xfs_inobt_rec_incore *irbp = irbuf; > + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; > + bool end_of_ag = false; > + int icount = 0; > + int stat; > + > error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); > if (error) > break; > @@ -404,10 +402,6 @@ xfs_bulkstat( > */ > cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, > XFS_BTNUM_INO); > - irbp = irbuf; > - irbufend = irbuf + nirbuf; > - end_of_ag = 0; > - icount = 0; > if (agino > 0) { > /* > * In the middle of an allocation group, we need to get > @@ -432,7 +426,7 @@ xfs_bulkstat( > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); > } > if (error || stat == 0) { > - end_of_ag = 1; > + end_of_ag = true; > goto del_cursor; > } > > @@ -445,7 +439,7 @@ xfs_bulkstat( > > error = xfs_inobt_get_rec(cur, &r, &stat); > if (error || stat == 0) { > - end_of_ag = 1; > + end_of_ag = true; > goto del_cursor; > } > > @@ -467,7 +461,7 @@ xfs_bulkstat( > agino = r.ir_startino + XFS_INODES_PER_CHUNK; > error = xfs_btree_increment(cur, 0, &stat); > if (error || stat == 0) { > - end_of_ag = 1; > + end_of_ag = true; > goto del_cursor; > } > cond_resched(); > @@ -488,7 +482,7 @@ del_cursor: > */ > irbufend = irbp; > for (irbp = irbuf; > - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); > + irbp < irbufend && ac.ac_ubleft >= statstruct_size; > irbp++) { > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > formatter, statstruct_size, &ac, > @@ -499,17 +493,14 @@ del_cursor: > cond_resched(); > } > > - /* > - * Set up for the next loop iteration. > - */ > - if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { > - if (end_of_ag) { > - agno++; > - agino = 0; > - } else > - agino = XFS_INO_TO_AGINO(mp, lastino); > - } else > + if (error) > break; This stood out to me as potentially broken as it introduces a non-deterministic error path. The preceding loop can overwrite error since it iterates until either all records are handled or the buffer is consumed. That said, this is all fixed up by the next patch and the rest looks fine: Reviewed-by: Brian Foster ... though I think the error check should technically be introduced by the next patch. Brian > + > + if (end_of_ag) { > + agno++; > + agino = 0; > + } else > + agino = XFS_INO_TO_AGINO(mp, lastino); > } > /* > * Done, we're either out of filesystem or space to put the data. > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 4 13:00:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4042B7F8D for ; Tue, 4 Nov 2014 13:00:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9F82BAC006 for ; Tue, 4 Nov 2014 11:00:09 -0800 (PST) X-ASG-Debug-ID: 1415127607-04cbb070c76083c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GEQov6n8rudfjs9G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 11:00:08 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4J05gG006773 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 14:00:06 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IxMYD016855; Tue, 4 Nov 2014 13:59:22 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5A7B7122F87; Tue, 4 Nov 2014 13:59:21 -0500 (EST) Date: Tue, 4 Nov 2014 13:59:21 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: bulkstat error handling is broken Message-ID: <20141104185920.GG55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: bulkstat error handling is broken References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415105601-6455-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415127608 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 11:53:20PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The error propagation is a horror - xfs_bulkstat() returns > a rval variable which is only set if there are formatter errors. Any > sort of btree walk error or corruption will cause the bulkstat walk > to terminate but will not pass an error back to userspace. Worse > is the fact that formatter errors will also be ignored if any inodes > were correctly formatted into the user buffer. > > Hence bulkstat can fail badly yet still report success to userspace. > This causes significant issues with xfsdump not dumping everything > in the filesystem yet reporting success. It's not until a restore > fails that there is any indication that the dump was bad and tha > bulkstat failed. This patch now triggers xfsdump to fail with > bulkstat errors rather than silently missing files in the dump. > > This now causes bulkstat to fail when the lastino cookie does not > fall inside an existing inode chunk. The pre-3.17 code tolerated > that error by allowing the code to move to the next inode chunk > as the agino target is guaranteed to fall into the next btree > record. > > With the fixes up to this point in the series, xfsdump now passes on > the troublesome filesystem image that exposes all these bugs. > > cc: > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_itable.c | 22 ++++++++++++++-------- > 1 file changed, 14 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index fc4cf5d..6a4ef8e 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -236,8 +236,10 @@ xfs_bulkstat_grab_ichunk( > XFS_WANT_CORRUPTED_RETURN(stat == 1); > > /* Check if the record contains the inode in request */ > - if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) > - return -EINVAL; > + if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { > + *icount = 0; > + return 0; > + } > > idx = agino - irec->ir_startino + 1; > if (idx < XFS_INODES_PER_CHUNK && > @@ -349,7 +351,6 @@ xfs_bulkstat( > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > - int rval; /* return value error code */ > int ubcount; /* size of user's buffer */ > struct xfs_bulkstat_agichunk ac; > int error = 0; > @@ -385,7 +386,6 @@ xfs_bulkstat( > * Loop over the allocation groups, starting from the last > * inode returned; 0 means start of the allocation group. > */ > - rval = 0; > while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { > struct xfs_inobt_rec_incore *irbp = irbuf; > struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; > @@ -488,7 +488,7 @@ del_cursor: > formatter, statstruct_size, &ac, > &lastino); > if (error) > - rval = error; > + break; > > cond_resched(); > } > @@ -507,11 +507,17 @@ del_cursor: > */ > kmem_free(irbuf); > *ubcountp = ac.ac_ubelem; > + > /* > - * Found some inodes, return them now and return the error next time. > + * We found some inodes, so clear the error status and return them. > + * The lastino pointer will point directly at the inode that triggered > + * any error that occurred, so on the next call the error will be > + * triggered again and propagated to userspace as there will be no > + * formatted inodes in the buffer. > */ > if (ac.ac_ubelem) > - rval = 0; > + error = 0; > + > if (agno >= mp->m_sb.sb_agcount) { > /* > * If we ran out of filesystem, mark lastino as off > @@ -523,7 +529,7 @@ del_cursor: > } else > *lastinop = (xfs_ino_t)lastino; > > - return rval; > + return error; > } > > int > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 4 13:00:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A0FD17F98 for ; Tue, 4 Nov 2014 13:00:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8EE7D8F8035 for ; Tue, 4 Nov 2014 11:00:17 -0800 (PST) X-ASG-Debug-ID: 1415127616-04cb6c2ef95775b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cXuSeUThuSlHIYxB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 11:00:16 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4J08dF028596 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 14:00:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4J07c5021338; Tue, 4 Nov 2014 14:00:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 813C2122F87; Tue, 4 Nov 2014 14:00:06 -0500 (EST) Date: Tue, 4 Nov 2014 14:00:06 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: track bulkstat progress by agino Message-ID: <20141104190006.GH55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: track bulkstat progress by agino References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415105601-6455-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415127616 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 11:53:21PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The bulkstat main loop progress is tracked by the "lastino" > variable, which is a full 64 bit inode. However, the loop actually > works on agno/agino pairs, and so there's a significant disconnect > between the rest of the loop and the main cursor. Convert this to > use the agino, and pass the agino into the chunk formatting function > and convert it too. > > This gets rid of the inconsistency in the loop processing, and > finally makes it simple for us to skip inodes at any point in the > loop simply by incrementing the agino cursor. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_itable.c | 50 +++++++++++++++++++------------------------------- > 1 file changed, 19 insertions(+), 31 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 6a4ef8e..2a6f2e8 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -282,45 +282,39 @@ xfs_bulkstat_ag_ichunk( > bulkstat_one_pf formatter, > size_t statstruct_size, > struct xfs_bulkstat_agichunk *acp, > - xfs_ino_t *lastino) > + xfs_agino_t *last_agino) > { > char __user **ubufp = acp->ac_ubuffer; > int chunkidx; > int error = 0; > - xfs_agino_t agino; > > - agino = irbp->ir_startino; > + *last_agino = irbp->ir_startino; Shouldn't last_agino refer to the last inode written out to the userspace buffer? I'm not familiar with the semantics that xfsdump expects or works around here as you've discussed in the commit logs and whatnot. What happens if we set last_agino here and error out in the first iteration of the loop? > for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > - chunkidx++, agino++) { > + chunkidx++, (*last_agino)++) { Similar question here when we handle a full record and increment *last_agino beyond the last agino in the record. Unless I'm missing something, it looks to me that if the next record is adjacent, xfs_bulkstat_grab_ichunk() would skip the first inode in that record. > int fmterror; > int ubused; > - xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > > /* Skip if this inode is free */ > - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > - *lastino = ino; > + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) > continue; > - } > > /* Get the inode and fill in a single buffer */ > ubused = statstruct_size; > - error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > - &ubused, &fmterror); > + error = formatter(mp, XFS_AGINO_TO_INO(mp, agno, *last_agino), > + *ubufp, acp->ac_ubleft, &ubused, &fmterror); > + > if (fmterror == BULKSTAT_RV_GIVEUP || > (error && error != -ENOENT && error != -EINVAL)) { > acp->ac_ubleft = 0; > ASSERT(error); > break; > } > - if (fmterror == BULKSTAT_RV_NOTHING || error) { > - *lastino = ino; > + if (fmterror == BULKSTAT_RV_NOTHING || error) > continue; > - } > > *ubufp += ubused; > acp->ac_ubleft -= ubused; > acp->ac_ubelem++; > - *lastino = ino; > > if (acp->ac_ubleft < statstruct_size) > break; > @@ -349,7 +343,6 @@ xfs_bulkstat( > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > size_t irbsize; /* size of irec buffer in bytes */ > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > - xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > int ubcount; /* size of user's buffer */ > struct xfs_bulkstat_agichunk ac; > @@ -358,11 +351,10 @@ xfs_bulkstat( > /* > * Get the last inode value, see if there's nothing to do. > */ > - lastino = *lastinop; > - agno = XFS_INO_TO_AGNO(mp, lastino); > - agino = XFS_INO_TO_AGINO(mp, lastino); > + agno = XFS_INO_TO_AGNO(mp, *lastinop); > + agino = XFS_INO_TO_AGINO(mp, *lastinop); > if (agno >= mp->m_sb.sb_agcount || > - lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { > + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) { > *done = 1; > *ubcountp = 0; > return 0; > @@ -486,7 +478,7 @@ del_cursor: > irbp++) { > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > formatter, statstruct_size, &ac, > - &lastino); > + &agino); > if (error) > break; > > @@ -499,8 +491,7 @@ del_cursor: > if (end_of_ag) { > agno++; > agino = 0; > - } else > - agino = XFS_INO_TO_AGINO(mp, lastino); > + } > } > /* > * Done, we're either out of filesystem or space to put the data. > @@ -518,16 +509,13 @@ del_cursor: > if (ac.ac_ubelem) > error = 0; > > - if (agno >= mp->m_sb.sb_agcount) { > - /* > - * If we ran out of filesystem, mark lastino as off > - * the end of the filesystem, so the next call > - * will return immediately. > - */ > - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); > + /* > + * If we ran out of filesystem, lastino will point off the end of > + * the filesystem so the next call will return immediately. > + */ > + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); This means that the main loop should never move agino forward unless the inodes up through agino are guaranteed to be copied out to the user buffer. There are two places in the main loop where we do this: agino = r.ir_startino + XFS_INODES_PER_CHUNK; ... and both of those lines execute before a potential error path that breaks out of the main loop before that current record is formatted out. Those lines appear to be spurious at this point, however, so I suspect we can just kill them. Brian > + if (agno >= mp->m_sb.sb_agcount) > *done = 1; > - } else > - *lastinop = (xfs_ino_t)lastino; > > return error; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 4 14:02:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F228F7F9B for ; Tue, 4 Nov 2014 14:02:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0BA6AC003 for ; Tue, 4 Nov 2014 12:01:58 -0800 (PST) X-ASG-Debug-ID: 1415131316-04cb6c2efc57aea0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BbYZMzR12TTTv3LO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Nov 2014 12:01:57 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IwYnT028119 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 4 Nov 2014 13:58:35 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA4IwXW1026124; Tue, 4 Nov 2014 13:58:34 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9A67E122F87; Tue, 4 Nov 2014 13:58:32 -0500 (EST) Date: Tue, 4 Nov 2014 13:58:32 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Message-ID: <20141104185832.GD55611@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415105601-6455-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415131317 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 04, 2014 at 11:53:17PM +1100, Dave Chinner wrote: > From: Dave Chinner > > The xfs_bulkstat_agichunk formatting cursor takes buffer values from > the main loop and passes them via the structure to the chunk > formatter, and the writes the chnged values back into the main loop > local variables. UNfortunately, this complex dance is full of corner > cases that aren't handled correctly. > > The biggest problem is that it is double handling the information in > both the main loop and the chunk formatting function, leading to > inconsistent updates and endless loops where progress is not made. > > To fix this, push the struct xfs_bulkstat_agichunk outwards to be > the primary holder of user buffer information. this removes the > double handling in the main loop. > > Also, pass the last inode processed by the chunk formatter as a > separate parameter as it purely an output variable and is not > related to the user buffer consumption cursor. > > Finally, the chunk formatting code is not shared by anyone, so make > it local to xfs_itable.c. > > Signed-off-by: Dave Chinner > --- The commit log suggests this patch is fixing some problem(s), but I see mostly a refactor to pull up the ac structure and eliminate the variable swapping between xfs_bulkstat() and xfs_bulkstat_ag_ichunk(). The lastino separation doesn't appear to change semantics that I can tell either. The refactor looks good to me: Reviewed-by: Brian Foster ... but is there something subtle in here I'm missing about the problem being fixed? If not, could we update the commit title to suggest this is a clean up? Brian > fs/xfs/xfs_itable.c | 59 +++++++++++++++++++++++++---------------------------- > fs/xfs/xfs_itable.h | 16 --------------- > 2 files changed, 28 insertions(+), 47 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 16737cb..50a3e59 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -262,20 +262,26 @@ xfs_bulkstat_grab_ichunk( > > #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) > > +struct xfs_bulkstat_agichunk { > + char __user **ac_ubuffer;/* pointer into user's buffer */ > + int ac_ubleft; /* bytes left in user's buffer */ > + int ac_ubelem; /* spaces used in user's buffer */ > +}; > + > /* > * Process inodes in chunk with a pointer to a formatter function > * that will iget the inode and fill in the appropriate structure. > */ > -int > +static int > xfs_bulkstat_ag_ichunk( > struct xfs_mount *mp, > xfs_agnumber_t agno, > struct xfs_inobt_rec_incore *irbp, > bulkstat_one_pf formatter, > size_t statstruct_size, > - struct xfs_bulkstat_agichunk *acp) > + struct xfs_bulkstat_agichunk *acp, > + xfs_ino_t *lastino) > { > - xfs_ino_t lastino = acp->ac_lastino; > char __user **ubufp = acp->ac_ubuffer; > int ubleft = acp->ac_ubleft; > int ubelem = acp->ac_ubelem; > @@ -295,7 +301,7 @@ xfs_bulkstat_ag_ichunk( > > /* Skip if this inode is free */ > if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > - lastino = ino; > + *lastino = ino; > continue; > } > > @@ -313,7 +319,7 @@ xfs_bulkstat_ag_ichunk( > ubleft = 0; > break; > } > - lastino = ino; > + *lastino = ino; > continue; > } > if (fmterror == BULKSTAT_RV_GIVEUP) { > @@ -325,10 +331,9 @@ xfs_bulkstat_ag_ichunk( > *ubufp += ubused; > ubleft -= ubused; > ubelem++; > - lastino = ino; > + *lastino = ino; > } > > - acp->ac_lastino = lastino; > acp->ac_ubleft = ubleft; > acp->ac_ubelem = ubelem; > > @@ -355,7 +360,6 @@ xfs_bulkstat( > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > int end_of_ag; /* set if we've seen the ag end */ > int error; /* error code */ > - int fmterror;/* bulkstat formatter result */ > int icount; /* count of inodes good in irbuf */ > size_t irbsize; /* size of irec buffer in bytes */ > xfs_ino_t ino; /* inode number (filesystem) */ > @@ -366,10 +370,8 @@ xfs_bulkstat( > int nirbuf; /* size of irbuf */ > int rval; /* return value error code */ > int ubcount; /* size of user's buffer */ > - int ubleft; /* bytes left in user's buffer */ > - char __user *ubufp; /* pointer into user's buffer */ > - int ubelem; /* spaces used in user's buffer */ > int stat; > + struct xfs_bulkstat_agichunk ac; > > /* > * Get the last inode value, see if there's nothing to do. > @@ -386,11 +388,13 @@ xfs_bulkstat( > } > > ubcount = *ubcountp; /* statstruct's */ > - ubleft = ubcount * statstruct_size; /* bytes */ > - *ubcountp = ubelem = 0; > + ac.ac_ubuffer = &ubuffer; > + ac.ac_ubleft = ubcount * statstruct_size; /* bytes */; > + ac.ac_ubelem = 0; > + > + *ubcountp = 0; > *done = 0; > - fmterror = 0; > - ubufp = ubuffer; > + > irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); > if (!irbuf) > return -ENOMEM; > @@ -402,7 +406,7 @@ xfs_bulkstat( > * inode returned; 0 means start of the allocation group. > */ > rval = 0; > - while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { > + while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { > cond_resched(); > error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); > if (error) > @@ -497,28 +501,21 @@ del_cursor: > */ > irbufend = irbp; > for (irbp = irbuf; > - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { > - struct xfs_bulkstat_agichunk ac; > - > - ac.ac_lastino = lastino; > - ac.ac_ubuffer = &ubuffer; > - ac.ac_ubleft = ubleft; > - ac.ac_ubelem = ubelem; > + irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); > + irbp++) { > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > - formatter, statstruct_size, &ac); > + formatter, statstruct_size, &ac, > + &lastino); > if (error) > rval = error; > > - lastino = ac.ac_lastino; > - ubleft = ac.ac_ubleft; > - ubelem = ac.ac_ubelem; > - > cond_resched(); > } > + > /* > * Set up for the next loop iteration. > */ > - if (XFS_BULKSTAT_UBLEFT(ubleft)) { > + if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { > if (end_of_ag) { > agno++; > agino = 0; > @@ -531,11 +528,11 @@ del_cursor: > * Done, we're either out of filesystem or space to put the data. > */ > kmem_free(irbuf); > - *ubcountp = ubelem; > + *ubcountp = ac.ac_ubelem; > /* > * Found some inodes, return them now and return the error next time. > */ > - if (ubelem) > + if (ac.ac_ubelem) > rval = 0; > if (agno >= mp->m_sb.sb_agcount) { > /* > diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h > index aaed080..6ea8b39 100644 > --- a/fs/xfs/xfs_itable.h > +++ b/fs/xfs/xfs_itable.h > @@ -30,22 +30,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, > int *ubused, > int *stat); > > -struct xfs_bulkstat_agichunk { > - xfs_ino_t ac_lastino; /* last inode returned */ > - char __user **ac_ubuffer;/* pointer into user's buffer */ > - int ac_ubleft; /* bytes left in user's buffer */ > - int ac_ubelem; /* spaces used in user's buffer */ > -}; > - > -int > -xfs_bulkstat_ag_ichunk( > - struct xfs_mount *mp, > - xfs_agnumber_t agno, > - struct xfs_inobt_rec_incore *irbp, > - bulkstat_one_pf formatter, > - size_t statstruct_size, > - struct xfs_bulkstat_agichunk *acp); > - > /* > * Values for stat return value. > */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Nov 4 15:11:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7F8387F8C for ; Tue, 4 Nov 2014 15:11:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6DF198F8033 for ; Tue, 4 Nov 2014 13:11:37 -0800 (PST) X-ASG-Debug-ID: 1415135493-04cbb070c760eb30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 4RzjPaq4CfiAJEF4 for ; Tue, 04 Nov 2014 13:11:34 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhFoAHNAWVR5LbBUPGdsb2JhbABbgw5UWLsFAQEBAQEGk0UKgV2FagICAQECgSIXAQEBAQEGAQEBATg7hAIBAQEDAQEBASQTHBgLEAgDDgcDCSUPBRMSAwcaE4g4CA7KWQEBAQEGAQEBAR4Yhh+EPYN/gh0Hgy2BHgWGNolJhnCHF4EyjWyJMCCBbikvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 07:41:06 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XllNY-0001TQ-VZ; Wed, 05 Nov 2014 08:11:05 +1100 Date: Wed, 5 Nov 2014 08:11:04 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Message-ID: <20141104211104.GA28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-3-git-send-email-david@fromorbit.com> <20141104185832.GD55611@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141104185832.GD55611@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415135493 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 04, 2014 at 01:58:32PM -0500, Brian Foster wrote: > On Tue, Nov 04, 2014 at 11:53:17PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The xfs_bulkstat_agichunk formatting cursor takes buffer values from > > the main loop and passes them via the structure to the chunk > > formatter, and the writes the chnged values back into the main loop > > local variables. UNfortunately, this complex dance is full of corner > > cases that aren't handled correctly. > > > > The biggest problem is that it is double handling the information in > > both the main loop and the chunk formatting function, leading to > > inconsistent updates and endless loops where progress is not made. > > > > To fix this, push the struct xfs_bulkstat_agichunk outwards to be > > the primary holder of user buffer information. this removes the > > double handling in the main loop. > > > > Also, pass the last inode processed by the chunk formatter as a > > separate parameter as it purely an output variable and is not > > related to the user buffer consumption cursor. > > > > Finally, the chunk formatting code is not shared by anyone, so make > > it local to xfs_itable.c. > > > > Signed-off-by: Dave Chinner > > --- > > The commit log suggests this patch is fixing some problem(s), but I see > mostly a refactor to pull up the ac structure and eliminate the variable > swapping between xfs_bulkstat() and xfs_bulkstat_ag_ichunk(). The > lastino separation doesn't appear to change semantics that I can tell > either. The refactor looks good to me: > > Reviewed-by: Brian Foster > > ... but is there something subtle in here I'm missing about the problem > being fixed? If not, could we update the commit title to suggest this is > a clean up? There is something subtle in this, but I didn't dig into it a great deal. Essentially, I had one big patch that changed everythign related to the user buffer handling, but I felt it was too large to easily review so I split it into two - one for the mainloop and one for the chunk formatter. If I drop either of the two patches then bulkstat hangs up in an endless loop. Neither of the two patches look to fix obvious problems, but they do change behaviour. So yes, there are subtle interactions with the rest of the main loop state here, but yesterday afternoon I really didn't care much about exactly what bugs the split patches were fixing, just that after them it all worked correctly. Cheers, Dave. > > Brian > > > fs/xfs/xfs_itable.c | 59 +++++++++++++++++++++++++---------------------------- > > fs/xfs/xfs_itable.h | 16 --------------- > > 2 files changed, 28 insertions(+), 47 deletions(-) > > > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > > index 16737cb..50a3e59 100644 > > --- a/fs/xfs/xfs_itable.c > > +++ b/fs/xfs/xfs_itable.c > > @@ -262,20 +262,26 @@ xfs_bulkstat_grab_ichunk( > > > > #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) > > > > +struct xfs_bulkstat_agichunk { > > + char __user **ac_ubuffer;/* pointer into user's buffer */ > > + int ac_ubleft; /* bytes left in user's buffer */ > > + int ac_ubelem; /* spaces used in user's buffer */ > > +}; > > + > > /* > > * Process inodes in chunk with a pointer to a formatter function > > * that will iget the inode and fill in the appropriate structure. > > */ > > -int > > +static int > > xfs_bulkstat_ag_ichunk( > > struct xfs_mount *mp, > > xfs_agnumber_t agno, > > struct xfs_inobt_rec_incore *irbp, > > bulkstat_one_pf formatter, > > size_t statstruct_size, > > - struct xfs_bulkstat_agichunk *acp) > > + struct xfs_bulkstat_agichunk *acp, > > + xfs_ino_t *lastino) > > { > > - xfs_ino_t lastino = acp->ac_lastino; > > char __user **ubufp = acp->ac_ubuffer; > > int ubleft = acp->ac_ubleft; > > int ubelem = acp->ac_ubelem; > > @@ -295,7 +301,7 @@ xfs_bulkstat_ag_ichunk( > > > > /* Skip if this inode is free */ > > if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > > - lastino = ino; > > + *lastino = ino; > > continue; > > } > > > > @@ -313,7 +319,7 @@ xfs_bulkstat_ag_ichunk( > > ubleft = 0; > > break; > > } > > - lastino = ino; > > + *lastino = ino; > > continue; > > } > > if (fmterror == BULKSTAT_RV_GIVEUP) { > > @@ -325,10 +331,9 @@ xfs_bulkstat_ag_ichunk( > > *ubufp += ubused; > > ubleft -= ubused; > > ubelem++; > > - lastino = ino; > > + *lastino = ino; > > } > > > > - acp->ac_lastino = lastino; > > acp->ac_ubleft = ubleft; > > acp->ac_ubelem = ubelem; > > > > @@ -355,7 +360,6 @@ xfs_bulkstat( > > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > > int end_of_ag; /* set if we've seen the ag end */ > > int error; /* error code */ > > - int fmterror;/* bulkstat formatter result */ > > int icount; /* count of inodes good in irbuf */ > > size_t irbsize; /* size of irec buffer in bytes */ > > xfs_ino_t ino; /* inode number (filesystem) */ > > @@ -366,10 +370,8 @@ xfs_bulkstat( > > int nirbuf; /* size of irbuf */ > > int rval; /* return value error code */ > > int ubcount; /* size of user's buffer */ > > - int ubleft; /* bytes left in user's buffer */ > > - char __user *ubufp; /* pointer into user's buffer */ > > - int ubelem; /* spaces used in user's buffer */ > > int stat; > > + struct xfs_bulkstat_agichunk ac; > > > > /* > > * Get the last inode value, see if there's nothing to do. > > @@ -386,11 +388,13 @@ xfs_bulkstat( > > } > > > > ubcount = *ubcountp; /* statstruct's */ > > - ubleft = ubcount * statstruct_size; /* bytes */ > > - *ubcountp = ubelem = 0; > > + ac.ac_ubuffer = &ubuffer; > > + ac.ac_ubleft = ubcount * statstruct_size; /* bytes */; > > + ac.ac_ubelem = 0; > > + > > + *ubcountp = 0; > > *done = 0; > > - fmterror = 0; > > - ubufp = ubuffer; > > + > > irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); > > if (!irbuf) > > return -ENOMEM; > > @@ -402,7 +406,7 @@ xfs_bulkstat( > > * inode returned; 0 means start of the allocation group. > > */ > > rval = 0; > > - while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { > > + while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { > > cond_resched(); > > error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); > > if (error) > > @@ -497,28 +501,21 @@ del_cursor: > > */ > > irbufend = irbp; > > for (irbp = irbuf; > > - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { > > - struct xfs_bulkstat_agichunk ac; > > - > > - ac.ac_lastino = lastino; > > - ac.ac_ubuffer = &ubuffer; > > - ac.ac_ubleft = ubleft; > > - ac.ac_ubelem = ubelem; > > + irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); > > + irbp++) { > > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > > - formatter, statstruct_size, &ac); > > + formatter, statstruct_size, &ac, > > + &lastino); > > if (error) > > rval = error; > > > > - lastino = ac.ac_lastino; > > - ubleft = ac.ac_ubleft; > > - ubelem = ac.ac_ubelem; > > - > > cond_resched(); > > } > > + > > /* > > * Set up for the next loop iteration. > > */ > > - if (XFS_BULKSTAT_UBLEFT(ubleft)) { > > + if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { > > if (end_of_ag) { > > agno++; > > agino = 0; > > @@ -531,11 +528,11 @@ del_cursor: > > * Done, we're either out of filesystem or space to put the data. > > */ > > kmem_free(irbuf); > > - *ubcountp = ubelem; > > + *ubcountp = ac.ac_ubelem; > > /* > > * Found some inodes, return them now and return the error next time. > > */ > > - if (ubelem) > > + if (ac.ac_ubelem) > > rval = 0; > > if (agno >= mp->m_sb.sb_agcount) { > > /* > > diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h > > index aaed080..6ea8b39 100644 > > --- a/fs/xfs/xfs_itable.h > > +++ b/fs/xfs/xfs_itable.h > > @@ -30,22 +30,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, > > int *ubused, > > int *stat); > > > > -struct xfs_bulkstat_agichunk { > > - xfs_ino_t ac_lastino; /* last inode returned */ > > - char __user **ac_ubuffer;/* pointer into user's buffer */ > > - int ac_ubleft; /* bytes left in user's buffer */ > > - int ac_ubelem; /* spaces used in user's buffer */ > > -}; > > - > > -int > > -xfs_bulkstat_ag_ichunk( > > - struct xfs_mount *mp, > > - xfs_agnumber_t agno, > > - struct xfs_inobt_rec_incore *irbp, > > - bulkstat_one_pf formatter, > > - size_t statstruct_size, > > - struct xfs_bulkstat_agichunk *acp); > > - > > /* > > * Values for stat return value. > > */ > > -- > > 2.0.0 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 4 15:18:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 88E2D7F9B for ; Tue, 4 Nov 2014 15:18:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4AA2F8F8035 for ; Tue, 4 Nov 2014 13:18:59 -0800 (PST) X-ASG-Debug-ID: 1415135921-04bdf038d268a040001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uIJHxBFfIYXbY1CS for ; Tue, 04 Nov 2014 13:18:53 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av1nAL5BWVR5LbBUPGdsb2JhbABbgw6BLIc9s0gBAQEBAQaVLIVqAgIBAQKBIhcBAQEBAQYBAQEBODuEAgEBAQQnExwjEAgDDgcDCSUPBSUDBxoTiEDKegEBAQEBBQEBAQEeGIYfilkHgy2BHgWGNpdQgTKNbIs+KS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 07:48:40 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XllUs-0001Ua-K0; Wed, 05 Nov 2014 08:18:38 +1100 Date: Wed, 5 Nov 2014 08:18:38 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-ID: <20141104211838.GB28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-4-git-send-email-david@fromorbit.com> <20141104185849.GE55611@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141104185849.GE55611@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415135921 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 04, 2014 at 01:58:49PM -0500, Brian Foster wrote: > On Tue, Nov 04, 2014 at 11:53:18PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The loop construct has issues: > > - clustidx is completely unused, so remove it. > > - the loop tries to be smart by terminating when the > > "freecount" tells it that all inodes are free. Just drop > > it as in most cases we have to scan all inodes in the > > chunk anyway. > > - move the "user buffer left" condition check to the only > > point where we consume space int eh user buffer. > > - move the initialisation of agino out of the loop, leaving > > just a simple loop control logic using the clusteridx. > > > > Also, double handling of the user buffer variables leads to problems > > tracking the current state - use the cursor variables directly > > rather than keeping local copies and then having to update the > > cursor before returning. > > > > cc: > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_itable.c | 55 ++++++++++++++++++++--------------------------------- > > 1 file changed, 21 insertions(+), 34 deletions(-) > > > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > > index 50a3e59..ff31965 100644 > > --- a/fs/xfs/xfs_itable.c > > +++ b/fs/xfs/xfs_itable.c > > @@ -283,59 +283,46 @@ xfs_bulkstat_ag_ichunk( > > xfs_ino_t *lastino) > > { > > char __user **ubufp = acp->ac_ubuffer; > > - int ubleft = acp->ac_ubleft; > > - int ubelem = acp->ac_ubelem; > > - int chunkidx, clustidx; > > + int chunkidx; > > int error = 0; > > xfs_agino_t agino; > > > > - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; > > - XFS_BULKSTAT_UBLEFT(ubleft) && > > - irbp->ir_freecount < XFS_INODES_PER_CHUNK; > > - chunkidx++, clustidx++, agino++) { > > - int fmterror; /* bulkstat formatter result */ > > + agino = irbp->ir_startino; > > + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > > + chunkidx++, agino++) { > > + int fmterror; > > int ubused; > > xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > > > > - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); > > - > > /* Skip if this inode is free */ > > if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > > *lastino = ino; > > continue; > > } > > > > - /* > > - * Count used inodes as free so we can tell when the > > - * chunk is used up. > > - */ > > - irbp->ir_freecount++; > > - > > /* Get the inode and fill in a single buffer */ > > ubused = statstruct_size; > > - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); > > - if (fmterror == BULKSTAT_RV_NOTHING) { > > - if (error && error != -ENOENT && error != -EINVAL) { > > - ubleft = 0; > > - break; > > - } > > - *lastino = ino; > > - continue; > > - } > > - if (fmterror == BULKSTAT_RV_GIVEUP) { > > - ubleft = 0; > > + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > > + &ubused, &fmterror); > > + if (fmterror == BULKSTAT_RV_GIVEUP || > > + (error && error != -ENOENT && error != -EINVAL)) { > > + acp->ac_ubleft = 0; > > ASSERT(error); > > break; > > } > > - if (*ubufp) > > - *ubufp += ubused; > > - ubleft -= ubused; > > - ubelem++; > > + if (fmterror == BULKSTAT_RV_NOTHING || error) { > > + *lastino = ino; > > + continue; > > + } > > Not introduced by this patch, but this looks like inconsistent error > handling. The structure of the code suggests we intend to carry on in > the event of ENOENT or EINVAL, but said errors can leak out of this > function if we never get back to the formatter call (e.g., we're at the > last inode or all subsequent inodes are free). Good catch - I'll fix it. I'll just zero the error in that branch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 4 15:21:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1446D7FA4 for ; Tue, 4 Nov 2014 15:21:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A344EAC003 for ; Tue, 4 Nov 2014 13:21:33 -0800 (PST) X-ASG-Debug-ID: 1415136068-04bdf038d168a260001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Jzpy1vRDAcgEf1MO for ; Tue, 04 Nov 2014 13:21:28 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av1nAL5BWVR5LbBUPGdsb2JhbABbgw6BLIc9s0gBAQEBAQaVLIVqAgIBAQKBIhcBAQEBAQYBAQEBODuEAgEBAQQnExwjEAgDDgcDCSUPBSUDBxoTiEDKegEBAQEBBQEBAQEeGIYfilkHgy2BHgWGNolJjgeYTiCBbikvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 07:50:43 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XllWs-0001Un-Qr; Wed, 05 Nov 2014 08:20:42 +1100 Date: Wed, 5 Nov 2014 08:20:42 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Message-ID: <20141104212042.GC28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: bulkstat main loop logic is a mess References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-5-git-send-email-david@fromorbit.com> <20141104185908.GF55611@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141104185908.GF55611@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415136068 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 04, 2014 at 01:59:08PM -0500, Brian Foster wrote: > On Tue, Nov 04, 2014 at 11:53:19PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > There are a bunch of variables tha tare more wildy scoped than they > > need to be, obfuscated user buffer checks and tortured "next inode" > > tracking. This all needs cleaning up to expose the real issues that > > need fixing. > > > > cc: > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_itable.c | 55 ++++++++++++++++++++++------------------------------- > > 1 file changed, 23 insertions(+), 32 deletions(-) > > > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > > index ff31965..fc4cf5d 100644 > > --- a/fs/xfs/xfs_itable.c > > +++ b/fs/xfs/xfs_itable.c > > @@ -345,30 +345,23 @@ xfs_bulkstat( > > xfs_agino_t agino; /* inode # in allocation group */ > > xfs_agnumber_t agno; /* allocation group number */ > > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > > - int end_of_ag; /* set if we've seen the ag end */ > > - int error; /* error code */ > > - int icount; /* count of inodes good in irbuf */ > > size_t irbsize; /* size of irec buffer in bytes */ > > - xfs_ino_t ino; /* inode number (filesystem) */ > > - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ > > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > > - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ > > xfs_ino_t lastino; /* last inode number returned */ > > int nirbuf; /* size of irbuf */ > > int rval; /* return value error code */ > > int ubcount; /* size of user's buffer */ > > - int stat; > > struct xfs_bulkstat_agichunk ac; > > + int error = 0; > > > > /* > > * Get the last inode value, see if there's nothing to do. > > */ > > - ino = (xfs_ino_t)*lastinop; > > - lastino = ino; > > - agno = XFS_INO_TO_AGNO(mp, ino); > > - agino = XFS_INO_TO_AGINO(mp, ino); > > + lastino = *lastinop; > > + agno = XFS_INO_TO_AGNO(mp, lastino); > > + agino = XFS_INO_TO_AGINO(mp, lastino); > > if (agno >= mp->m_sb.sb_agcount || > > - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { > > + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { > > *done = 1; > > *ubcountp = 0; > > return 0; > > @@ -393,8 +386,13 @@ xfs_bulkstat( > > * inode returned; 0 means start of the allocation group. > > */ > > rval = 0; > > - while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { > > - cond_resched(); > > + while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { > > + struct xfs_inobt_rec_incore *irbp = irbuf; > > + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; > > + bool end_of_ag = false; > > + int icount = 0; > > + int stat; > > + > > error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); > > if (error) > > break; > > @@ -404,10 +402,6 @@ xfs_bulkstat( > > */ > > cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, > > XFS_BTNUM_INO); > > - irbp = irbuf; > > - irbufend = irbuf + nirbuf; > > - end_of_ag = 0; > > - icount = 0; > > if (agino > 0) { > > /* > > * In the middle of an allocation group, we need to get > > @@ -432,7 +426,7 @@ xfs_bulkstat( > > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); > > } > > if (error || stat == 0) { > > - end_of_ag = 1; > > + end_of_ag = true; > > goto del_cursor; > > } > > > > @@ -445,7 +439,7 @@ xfs_bulkstat( > > > > error = xfs_inobt_get_rec(cur, &r, &stat); > > if (error || stat == 0) { > > - end_of_ag = 1; > > + end_of_ag = true; > > goto del_cursor; > > } > > > > @@ -467,7 +461,7 @@ xfs_bulkstat( > > agino = r.ir_startino + XFS_INODES_PER_CHUNK; > > error = xfs_btree_increment(cur, 0, &stat); > > if (error || stat == 0) { > > - end_of_ag = 1; > > + end_of_ag = true; > > goto del_cursor; > > } > > cond_resched(); > > @@ -488,7 +482,7 @@ del_cursor: > > */ > > irbufend = irbp; > > for (irbp = irbuf; > > - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); > > + irbp < irbufend && ac.ac_ubleft >= statstruct_size; > > irbp++) { > > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > > formatter, statstruct_size, &ac, > > @@ -499,17 +493,14 @@ del_cursor: > > cond_resched(); > > } > > > > - /* > > - * Set up for the next loop iteration. > > - */ > > - if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { > > - if (end_of_ag) { > > - agno++; > > - agino = 0; > > - } else > > - agino = XFS_INO_TO_AGINO(mp, lastino); > > - } else > > + if (error) > > break; > > This stood out to me as potentially broken as it introduces a > non-deterministic error path. The preceding loop can overwrite error > since it iterates until either all records are handled or the buffer is > consumed. That's true. Again an issue from splitting the larger patch up and putting a chunk in the wrong patch. I'll move it to the next patch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 4 15:39:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 526377FA3 for ; Tue, 4 Nov 2014 15:39:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E7418F8035 for ; Tue, 4 Nov 2014 13:39:07 -0800 (PST) X-ASG-Debug-ID: 1415137145-04cb6c2efb57f4f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tzuUMj63uDg9C3Va for ; Tue, 04 Nov 2014 13:39:06 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqBgAIxGWVR5LbBUPGdsb2JhbABagw6BLYI2uFQGlTWFagICAQECgSIXAQEBAQEGAQEBATg7hAIBAQEEJxMcIxAIAw4HAwklDwUlAwcaE4hAyw0BAQEBAQUBAQEBHhiGH4pZB4MtgR4FhjeXVoEyjW+LPikvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 08:09:04 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xllod-0001XG-QV; Wed, 05 Nov 2014 08:39:03 +1100 Date: Wed, 5 Nov 2014 08:39:03 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: track bulkstat progress by agino Message-ID: <20141104213903.GD28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: track bulkstat progress by agino References: <1415105601-6455-1-git-send-email-david@fromorbit.com> <1415105601-6455-7-git-send-email-david@fromorbit.com> <20141104190006.GH55611@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141104190006.GH55611@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415137145 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 04, 2014 at 02:00:06PM -0500, Brian Foster wrote: > On Tue, Nov 04, 2014 at 11:53:21PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > The bulkstat main loop progress is tracked by the "lastino" > > variable, which is a full 64 bit inode. However, the loop actually > > works on agno/agino pairs, and so there's a significant disconnect > > between the rest of the loop and the main cursor. Convert this to > > use the agino, and pass the agino into the chunk formatting function > > and convert it too. > > > > This gets rid of the inconsistency in the loop processing, and > > finally makes it simple for us to skip inodes at any point in the > > loop simply by incrementing the agino cursor. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_itable.c | 50 +++++++++++++++++++------------------------------- > > 1 file changed, 19 insertions(+), 31 deletions(-) > > > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > > index 6a4ef8e..2a6f2e8 100644 > > --- a/fs/xfs/xfs_itable.c > > +++ b/fs/xfs/xfs_itable.c > > @@ -282,45 +282,39 @@ xfs_bulkstat_ag_ichunk( > > bulkstat_one_pf formatter, > > size_t statstruct_size, > > struct xfs_bulkstat_agichunk *acp, > > - xfs_ino_t *lastino) > > + xfs_agino_t *last_agino) > > { > > char __user **ubufp = acp->ac_ubuffer; > > int chunkidx; > > int error = 0; > > - xfs_agino_t agino; > > > > - agino = irbp->ir_startino; > > + *last_agino = irbp->ir_startino; > > Shouldn't last_agino refer to the last inode written out to the > userspace buffer? I'm not familiar with the semantics that xfsdump > expects or works around here as you've discussed in the commit logs and > whatnot. What happens if we set last_agino here and error out in the > first iteration of the loop? lastino is supposed to represent the last inode scanned, not necessarily the last inode formatted into the buffer. This can be seen that we update lastino even if the inode if free - it hasn't been written into the user buffer, but we have processed it. > > > for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > > - chunkidx++, agino++) { > > + chunkidx++, (*last_agino)++) { > > Similar question here when we handle a full record and increment > *last_agino beyond the last agino in the record. Unless I'm missing > something, it looks to me that if the next record is adjacent, > xfs_bulkstat_grab_ichunk() would skip the first inode in that record. Hmmm - yes, that could occur. I have another patch that I didn't post that changes the xfs_bulkstat_grab_ichunk() to not skip the incoming lastino value, but I reasoned that it was a change of behaviour and hence could cause xfsdump to break. I'll rework *last_agino to do post-update rather than pre-update. > > * Done, we're either out of filesystem or space to put the data. > > @@ -518,16 +509,13 @@ del_cursor: > > if (ac.ac_ubelem) > > error = 0; > > > > - if (agno >= mp->m_sb.sb_agcount) { > > - /* > > - * If we ran out of filesystem, mark lastino as off > > - * the end of the filesystem, so the next call > > - * will return immediately. > > - */ > > - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); > > + /* > > + * If we ran out of filesystem, lastino will point off the end of > > + * the filesystem so the next call will return immediately. > > + */ > > + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); > > This means that the main loop should never move agino forward unless the > inodes up through agino are guaranteed to be copied out to the user > buffer. There are two places in the main loop where we do this: > > agino = r.ir_startino + XFS_INODES_PER_CHUNK; > > ... and both of those lines execute before a potential error path that > breaks out of the main loop before that current record is formatted out. > Those lines appear to be spurious at this point, however, so I suspect > we can just kill them. *nod* I was in two minds about that, but then figured agino would be overwritten by the formatting callout if there was no error. I didn't consider the error breakout case, so yes, those updates need to die... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Tue Nov 4 18:05:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 819F07F98 for ; Tue, 4 Nov 2014 18:05:50 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F8EFAC003 for ; Tue, 4 Nov 2014 16:05:46 -0800 (PST) X-ASG-Debug-ID: 1415145942-04bdf038d169b650001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id MCwxp7gyN5t3enaw for ; Tue, 04 Nov 2014 16:05:43 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAIpoWVR5LbBUPGdsb2JhbABbgw6BLbsKBpxHFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAx0qGN48rBYY3mQiNb4h5AQsrIIFuKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001sg-Bg for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008DV-Ax for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: track bulkstat progress by agino Date: Wed, 5 Nov 2014 11:05:21 +1100 X-ASG-Orig-Subj: [PATCH 6/6] xfs: track bulkstat progress by agino Message-Id: <1415145921-31507-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> References: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145942 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The bulkstat main loop progress is tracked by the "lastino" variable, which is a full 64 bit inode. However, the loop actually works on agno/agino pairs, and so there's a significant disconnect between the rest of the loop and the main cursor. Convert this to use the agino, and pass the agino into the chunk formatting function and convert it too. This gets rid of the inconsistency in the loop processing, and finally makes it simple for us to skip inodes at any point in the loop simply by incrementing the agino cursor. Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 68 ++++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index be96754..a082bb7 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -282,30 +282,31 @@ xfs_bulkstat_ag_ichunk( bulkstat_one_pf formatter, size_t statstruct_size, struct xfs_bulkstat_agichunk *acp, - xfs_ino_t *lastino) + xfs_agino_t *last_agino) { char __user **ubufp = acp->ac_ubuffer; int chunkidx; int error = 0; - xfs_agino_t agino; + xfs_agino_t agino = irbp->ir_startino; - agino = irbp->ir_startino; for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; chunkidx++, agino++) { int fmterror; int ubused; - xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); + + /* inode won't fit in buffer, we are done */ + if (acp->ac_ubleft < statstruct_size) + break; /* Skip if this inode is free */ - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - *lastino = ino; + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) continue; - } /* Get the inode and fill in a single buffer */ ubused = statstruct_size; - error = formatter(mp, ino, *ubufp, acp->ac_ubleft, - &ubused, &fmterror); + error = formatter(mp, XFS_AGINO_TO_INO(mp, agno, agino), + *ubufp, acp->ac_ubleft, &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_GIVEUP || (error && error != -ENOENT && error != -EINVAL)) { acp->ac_ubleft = 0; @@ -315,7 +316,6 @@ xfs_bulkstat_ag_ichunk( /* be careful not to leak error if at end of chunk */ if (fmterror == BULKSTAT_RV_NOTHING || error) { - *lastino = ino; error = 0; continue; } @@ -323,12 +323,18 @@ xfs_bulkstat_ag_ichunk( *ubufp += ubused; acp->ac_ubleft -= ubused; acp->ac_ubelem++; - *lastino = ino; - - if (acp->ac_ubleft < statstruct_size) - break; } + /* + * Post-update *last_agino. At this point, agino will always point one + * inode past the last inode we processed successfully. Hence we + * substract that inode when setting the *last_agino cursor so that we + * return the correct cookie to userspace. On the next bulkstat call, + * the inode under the lastino cookie will be skipped as we have already + * processed it here. + */ + *last_agino = agino - 1; + return error; } @@ -352,7 +358,6 @@ xfs_bulkstat( xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ size_t irbsize; /* size of irec buffer in bytes */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int ubcount; /* size of user's buffer */ struct xfs_bulkstat_agichunk ac; @@ -361,11 +366,10 @@ xfs_bulkstat( /* * Get the last inode value, see if there's nothing to do. */ - lastino = *lastinop; - agno = XFS_INO_TO_AGNO(mp, lastino); - agino = XFS_INO_TO_AGINO(mp, lastino); + agno = XFS_INO_TO_AGNO(mp, *lastinop); + agino = XFS_INO_TO_AGINO(mp, *lastinop); if (agno >= mp->m_sb.sb_agcount || - lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) { *done = 1; *ubcountp = 0; return 0; @@ -420,7 +424,6 @@ xfs_bulkstat( irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - agino = r.ir_startino + XFS_INODES_PER_CHUNK; } /* Increment to the next record */ error = xfs_btree_increment(cur, 0, &stat); @@ -461,7 +464,6 @@ xfs_bulkstat( /* * Set agino to after this chunk and bump the cursor. */ - agino = r.ir_startino + XFS_INODES_PER_CHUNK; error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { end_of_ag = true; @@ -481,7 +483,9 @@ del_cursor: if (error) break; /* - * Now format all the good inodes into the user's buffer. + * Now format all the good inodes into the user's buffer. The + * call to xfs_bulkstat_ag_ichunk() sets up the agino pointer + * for the next loop iteration. */ irbufend = irbp; for (irbp = irbuf; @@ -489,7 +493,7 @@ del_cursor: irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac, - &lastino); + &agino); if (error) break; @@ -502,8 +506,7 @@ del_cursor: if (end_of_ag) { agno++; agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); + } } /* * Done, we're either out of filesystem or space to put the data. @@ -521,16 +524,13 @@ del_cursor: if (ac.ac_ubelem) error = 0; - if (agno >= mp->m_sb.sb_agcount) { - /* - * If we ran out of filesystem, mark lastino as off - * the end of the filesystem, so the next call - * will return immediately. - */ - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); + /* + * If we ran out of filesystem, lastino will point off the end of + * the filesystem so the next call will return immediately. + */ + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); + if (agno >= mp->m_sb.sb_agcount) *done = 1; - } else - *lastinop = (xfs_ino_t)lastino; return error; } -- 2.0.0 From dave@fromorbit.com Tue Nov 4 18:05:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D5A2D7F9B for ; Tue, 4 Nov 2014 18:05:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 57082AC005 for ; Tue, 4 Nov 2014 16:05:50 -0800 (PST) X-ASG-Debug-ID: 1415145946-04cbb070c7629590002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6yyZlMB342tiN3Fw for ; Tue, 04 Nov 2014 16:05:48 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAIpoWVR5LbBUPGdsb2JhbABbgw6BLbsKBpxHFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAx0qGN48rBYY3r3ABCysggW4pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001se-Aj for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008DL-A0 for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Date: Wed, 5 Nov 2014 11:05:19 +1100 X-ASG-Orig-Subj: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Message-Id: <1415145921-31507-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> References: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145948 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are a bunch of variables tha tare more wildy scoped than they need to be, obfuscated user buffer checks and tortured "next inode" tracking. This all needs cleaning up to expose the real issues that need fixing. cc: Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 52 ++++++++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 7ea2b11..a9c28d1 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -348,30 +348,23 @@ xfs_bulkstat( xfs_agino_t agino; /* inode # in allocation group */ xfs_agnumber_t agno; /* allocation group number */ xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ - int end_of_ag; /* set if we've seen the ag end */ - int error; /* error code */ - int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ - xfs_ino_t ino; /* inode number (filesystem) */ - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int ubcount; /* size of user's buffer */ - int stat; struct xfs_bulkstat_agichunk ac; + int error = 0; /* * Get the last inode value, see if there's nothing to do. */ - ino = (xfs_ino_t)*lastinop; - lastino = ino; - agno = XFS_INO_TO_AGNO(mp, ino); - agino = XFS_INO_TO_AGINO(mp, ino); + lastino = *lastinop; + agno = XFS_INO_TO_AGNO(mp, lastino); + agino = XFS_INO_TO_AGINO(mp, lastino); if (agno >= mp->m_sb.sb_agcount || - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { *done = 1; *ubcountp = 0; return 0; @@ -396,8 +389,13 @@ xfs_bulkstat( * inode returned; 0 means start of the allocation group. */ rval = 0; - while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { - cond_resched(); + while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { + struct xfs_inobt_rec_incore *irbp = irbuf; + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; + bool end_of_ag = false; + int icount = 0; + int stat; + error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) break; @@ -407,10 +405,6 @@ xfs_bulkstat( */ cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_INO); - irbp = irbuf; - irbufend = irbuf + nirbuf; - end_of_ag = 0; - icount = 0; if (agino > 0) { /* * In the middle of an allocation group, we need to get @@ -435,7 +429,7 @@ xfs_bulkstat( error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); } if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } @@ -448,7 +442,7 @@ xfs_bulkstat( error = xfs_inobt_get_rec(cur, &r, &stat); if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } @@ -470,7 +464,7 @@ xfs_bulkstat( agino = r.ir_startino + XFS_INODES_PER_CHUNK; error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } cond_resched(); @@ -491,7 +485,7 @@ del_cursor: */ irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); + irbp < irbufend && ac.ac_ubleft >= statstruct_size; irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac, @@ -502,17 +496,11 @@ del_cursor: cond_resched(); } - /* - * Set up for the next loop iteration. - */ - if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { - if (end_of_ag) { - agno++; - agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); + if (end_of_ag) { + agno++; + agino = 0; } else - break; + agino = XFS_INO_TO_AGINO(mp, lastino); } /* * Done, we're either out of filesystem or space to put the data. -- 2.0.0 From dave@fromorbit.com Tue Nov 4 18:05:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 69F3F7F98 for ; Tue, 4 Nov 2014 18:05:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58B618F8039 for ; Tue, 4 Nov 2014 16:05:51 -0800 (PST) X-ASG-Debug-ID: 1415145946-04cbb070c7629590003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 13EQuxid4rNQKKOH for ; Tue, 04 Nov 2014 16:05:49 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAIpoWVR5LbBUPGdsb2JhbABbgw6BLbsKBpxHFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAx0qGN48rBYY3mQiNb4h5AQuCOSkvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001sd-A9 for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008DG-9G for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Date: Wed, 5 Nov 2014 11:05:18 +1100 X-ASG-Orig-Subj: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-Id: <1415145921-31507-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> References: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145949 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The loop construct has issues: - clustidx is completely unused, so remove it. - the loop tries to be smart by terminating when the "freecount" tells it that all inodes are free. Just drop it as in most cases we have to scan all inodes in the chunk anyway. - move the "user buffer left" condition check to the only point where we consume space int eh user buffer. - move the initialisation of agino out of the loop, leaving just a simple loop control logic using the clusteridx. Also, double handling of the user buffer variables leads to problems tracking the current state - use the cursor variables directly rather than keeping local copies and then having to update the cursor before returning. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 58 ++++++++++++++++++++++------------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 50a3e59..7ea2b11 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -283,59 +283,49 @@ xfs_bulkstat_ag_ichunk( xfs_ino_t *lastino) { char __user **ubufp = acp->ac_ubuffer; - int ubleft = acp->ac_ubleft; - int ubelem = acp->ac_ubelem; - int chunkidx, clustidx; + int chunkidx; int error = 0; xfs_agino_t agino; - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; - XFS_BULKSTAT_UBLEFT(ubleft) && - irbp->ir_freecount < XFS_INODES_PER_CHUNK; - chunkidx++, clustidx++, agino++) { - int fmterror; /* bulkstat formatter result */ + agino = irbp->ir_startino; + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; + chunkidx++, agino++) { + int fmterror; int ubused; xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); - /* Skip if this inode is free */ if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { *lastino = ino; continue; } - /* - * Count used inodes as free so we can tell when the - * chunk is used up. - */ - irbp->ir_freecount++; - /* Get the inode and fill in a single buffer */ ubused = statstruct_size; - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); - if (fmterror == BULKSTAT_RV_NOTHING) { - if (error && error != -ENOENT && error != -EINVAL) { - ubleft = 0; - break; - } - *lastino = ino; - continue; - } - if (fmterror == BULKSTAT_RV_GIVEUP) { - ubleft = 0; + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, + &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_GIVEUP || + (error && error != -ENOENT && error != -EINVAL)) { + acp->ac_ubleft = 0; ASSERT(error); break; } - if (*ubufp) - *ubufp += ubused; - ubleft -= ubused; - ubelem++; + + /* be careful not to leak error if at end of chunk */ + if (fmterror == BULKSTAT_RV_NOTHING || error) { + *lastino = ino; + error = 0; + continue; + } + + *ubufp += ubused; + acp->ac_ubleft -= ubused; + acp->ac_ubelem++; *lastino = ino; - } - acp->ac_ubleft = ubleft; - acp->ac_ubelem = ubelem; + if (acp->ac_ubleft < statstruct_size) + break; + } return error; } -- 2.0.0 From dave@fromorbit.com Tue Nov 4 18:05:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9DE97FAB for ; Tue, 4 Nov 2014 18:05:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B55538F8039 for ; Tue, 4 Nov 2014 16:05:48 -0800 (PST) X-ASG-Debug-ID: 1415145946-04cbb070c7629590001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id WQUUVO7zT6zIbN2Q for ; Tue, 04 Nov 2014 16:05:47 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAIpoWVR5LbBUPGdsb2JhbABbgw6BLbsKBpxHFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAx0qGN48rBbYnAQuCOSkvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001sf-BF for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008DQ-AV for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: bulkstat error handling is broken Date: Wed, 5 Nov 2014 11:05:20 +1100 X-ASG-Orig-Subj: [PATCH 5/6] xfs: bulkstat error handling is broken Message-Id: <1415145921-31507-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> References: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145946 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The error propagation is a horror - xfs_bulkstat() returns a rval variable which is only set if there are formatter errors. Any sort of btree walk error or corruption will cause the bulkstat walk to terminate but will not pass an error back to userspace. Worse is the fact that formatter errors will also be ignored if any inodes were correctly formatted into the user buffer. Hence bulkstat can fail badly yet still report success to userspace. This causes significant issues with xfsdump not dumping everything in the filesystem yet reporting success. It's not until a restore fails that there is any indication that the dump was bad and tha bulkstat failed. This patch now triggers xfsdump to fail with bulkstat errors rather than silently missing files in the dump. This now causes bulkstat to fail when the lastino cookie does not fall inside an existing inode chunk. The pre-3.17 code tolerated that error by allowing the code to move to the next inode chunk as the agino target is guaranteed to fall into the next btree record. With the fixes up to this point in the series, xfsdump now passes on the troublesome filesystem image that exposes all these bugs. cc: Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index a9c28d1..be96754 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -236,8 +236,10 @@ xfs_bulkstat_grab_ichunk( XFS_WANT_CORRUPTED_RETURN(stat == 1); /* Check if the record contains the inode in request */ - if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) - return -EINVAL; + if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { + *icount = 0; + return 0; + } idx = agino - irec->ir_startino + 1; if (idx < XFS_INODES_PER_CHUNK && @@ -352,7 +354,6 @@ xfs_bulkstat( xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ - int rval; /* return value error code */ int ubcount; /* size of user's buffer */ struct xfs_bulkstat_agichunk ac; int error = 0; @@ -388,7 +389,6 @@ xfs_bulkstat( * Loop over the allocation groups, starting from the last * inode returned; 0 means start of the allocation group. */ - rval = 0; while (ac.ac_ubleft >= statstruct_size && agno < mp->m_sb.sb_agcount) { struct xfs_inobt_rec_incore *irbp = irbuf; struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; @@ -491,11 +491,14 @@ del_cursor: formatter, statstruct_size, &ac, &lastino); if (error) - rval = error; + break; cond_resched(); } + if (error) + break; + if (end_of_ag) { agno++; agino = 0; @@ -507,11 +510,17 @@ del_cursor: */ kmem_free(irbuf); *ubcountp = ac.ac_ubelem; + /* - * Found some inodes, return them now and return the error next time. + * We found some inodes, so clear the error status and return them. + * The lastino pointer will point directly at the inode that triggered + * any error that occurred, so on the next call the error will be + * triggered again and propagated to userspace as there will be no + * formatted inodes in the buffer. */ if (ac.ac_ubelem) - rval = 0; + error = 0; + if (agno >= mp->m_sb.sb_agcount) { /* * If we ran out of filesystem, mark lastino as off @@ -523,7 +532,7 @@ del_cursor: } else *lastinop = (xfs_ino_t)lastino; - return rval; + return error; } int -- 2.0.0 From dave@fromorbit.com Tue Nov 4 18:05:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AE57C7FBC for ; Tue, 4 Nov 2014 18:05:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E9CBAC005 for ; Tue, 4 Nov 2014 16:05:53 -0800 (PST) X-ASG-Debug-ID: 1415145946-04cbb070c7629590004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id F0tKi7nSzJqKYIdX for ; Tue, 04 Nov 2014 16:05:51 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAIpoWVR5LbBUPGdsb2JhbABbgw6BLbsKBpxHFwEBAQEBBgEBAQE4O4QDAQVWMwgYMTkDBxQZiEDHSoY3inaENQW2JwELKyCBbikvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001sb-8i for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008D6-7z for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Date: Wed, 5 Nov 2014 11:05:16 +1100 X-ASG-Orig-Subj: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Message-Id: <1415145921-31507-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> References: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145950 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The bulkstat code has several different ways of detecting the end of an AG when doing a walk. They are not consistently detected, and the code that checks for the end of AG conditions is not consistently coded. Hence the are conditions where the walk code can get stuck in an endless loop making no progress and not triggering any termination conditions. Convert all the "tmp/i" status return codes from btree operations to a common name (stat) and apply end-of-ag detection to these operations consistently. cc: stable@vger.kernel.org Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 7765ff7..16737cb 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -356,7 +356,6 @@ xfs_bulkstat( int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ int fmterror;/* bulkstat formatter result */ - int i; /* loop index */ int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ xfs_ino_t ino; /* inode number (filesystem) */ @@ -366,11 +365,11 @@ xfs_bulkstat( xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ - int tmp; /* result value from btree calls */ int ubcount; /* size of user's buffer */ int ubleft; /* bytes left in user's buffer */ char __user *ubufp; /* pointer into user's buffer */ int ubelem; /* spaces used in user's buffer */ + int stat; /* * Get the last inode value, see if there's nothing to do. @@ -436,13 +435,15 @@ xfs_bulkstat( agino = r.ir_startino + XFS_INODES_PER_CHUNK; } /* Increment to the next record */ - error = xfs_btree_increment(cur, 0, &tmp); + error = xfs_btree_increment(cur, 0, &stat); } else { /* Start of ag. Lookup the first inode chunk */ - error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); } - if (error) + if (error || stat == 0) { + end_of_ag = 1; goto del_cursor; + } /* * Loop through inode btree records in this ag, @@ -451,8 +452,8 @@ xfs_bulkstat( while (irbp < irbufend && icount < ubcount) { struct xfs_inobt_rec_incore r; - error = xfs_inobt_get_rec(cur, &r, &i); - if (error || i == 0) { + error = xfs_inobt_get_rec(cur, &r, &stat); + if (error || stat == 0) { end_of_ag = 1; goto del_cursor; } @@ -473,8 +474,8 @@ xfs_bulkstat( * Set agino to after this chunk and bump the cursor. */ agino = r.ir_startino + XFS_INODES_PER_CHUNK; - error = xfs_btree_increment(cur, 0, &tmp); - if (error) { + error = xfs_btree_increment(cur, 0, &stat); + if (error || stat == 0) { end_of_ag = 1; goto del_cursor; } -- 2.0.0 From dave@fromorbit.com Tue Nov 4 18:05:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5AF807FBC for ; Tue, 4 Nov 2014 18:05:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07419AC005 for ; Tue, 4 Nov 2014 16:05:54 -0800 (PST) X-ASG-Debug-ID: 1415145942-04bdf038d169b650003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OPi37ZRonRmJu22A for ; Tue, 04 Nov 2014 16:05:50 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsPAIpoWVR5LbBUPGdsb2JhbABbgw6BLbsKBpxHFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAx0qGN48rBYY3r3ABCysggW4pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001sc-9P for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008DB-8U for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Date: Wed, 5 Nov 2014 11:05:17 +1100 X-ASG-Orig-Subj: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Message-Id: <1415145921-31507-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> References: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145950 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The xfs_bulkstat_agichunk formatting cursor takes buffer values from the main loop and passes them via the structure to the chunk formatter, and the writes the changed values back into the main loop local variables. Unfortunately, this complex dance is full of corner cases that aren't handled correctly. The biggest problem is that it is double handling the information in both the main loop and the chunk formatting function, leading to inconsistent updates and endless loops where progress is not made. To fix this, push the struct xfs_bulkstat_agichunk outwards to be the primary holder of user buffer information. this removes the double handling in the main loop. Also, pass the last inode processed by the chunk formatter as a separate parameter as it purely an output variable and is not related to the user buffer consumption cursor. Finally, the chunk formatting code is not shared by anyone, so make it local to xfs_itable.c. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 59 +++++++++++++++++++++++++---------------------------- fs/xfs/xfs_itable.h | 16 --------------- 2 files changed, 28 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 16737cb..50a3e59 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -262,20 +262,26 @@ xfs_bulkstat_grab_ichunk( #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) +struct xfs_bulkstat_agichunk { + char __user **ac_ubuffer;/* pointer into user's buffer */ + int ac_ubleft; /* bytes left in user's buffer */ + int ac_ubelem; /* spaces used in user's buffer */ +}; + /* * Process inodes in chunk with a pointer to a formatter function * that will iget the inode and fill in the appropriate structure. */ -int +static int xfs_bulkstat_ag_ichunk( struct xfs_mount *mp, xfs_agnumber_t agno, struct xfs_inobt_rec_incore *irbp, bulkstat_one_pf formatter, size_t statstruct_size, - struct xfs_bulkstat_agichunk *acp) + struct xfs_bulkstat_agichunk *acp, + xfs_ino_t *lastino) { - xfs_ino_t lastino = acp->ac_lastino; char __user **ubufp = acp->ac_ubuffer; int ubleft = acp->ac_ubleft; int ubelem = acp->ac_ubelem; @@ -295,7 +301,7 @@ xfs_bulkstat_ag_ichunk( /* Skip if this inode is free */ if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - lastino = ino; + *lastino = ino; continue; } @@ -313,7 +319,7 @@ xfs_bulkstat_ag_ichunk( ubleft = 0; break; } - lastino = ino; + *lastino = ino; continue; } if (fmterror == BULKSTAT_RV_GIVEUP) { @@ -325,10 +331,9 @@ xfs_bulkstat_ag_ichunk( *ubufp += ubused; ubleft -= ubused; ubelem++; - lastino = ino; + *lastino = ino; } - acp->ac_lastino = lastino; acp->ac_ubleft = ubleft; acp->ac_ubelem = ubelem; @@ -355,7 +360,6 @@ xfs_bulkstat( xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ - int fmterror;/* bulkstat formatter result */ int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ xfs_ino_t ino; /* inode number (filesystem) */ @@ -366,10 +370,8 @@ xfs_bulkstat( int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int ubcount; /* size of user's buffer */ - int ubleft; /* bytes left in user's buffer */ - char __user *ubufp; /* pointer into user's buffer */ - int ubelem; /* spaces used in user's buffer */ int stat; + struct xfs_bulkstat_agichunk ac; /* * Get the last inode value, see if there's nothing to do. @@ -386,11 +388,13 @@ xfs_bulkstat( } ubcount = *ubcountp; /* statstruct's */ - ubleft = ubcount * statstruct_size; /* bytes */ - *ubcountp = ubelem = 0; + ac.ac_ubuffer = &ubuffer; + ac.ac_ubleft = ubcount * statstruct_size; /* bytes */; + ac.ac_ubelem = 0; + + *ubcountp = 0; *done = 0; - fmterror = 0; - ubufp = ubuffer; + irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); if (!irbuf) return -ENOMEM; @@ -402,7 +406,7 @@ xfs_bulkstat( * inode returned; 0 means start of the allocation group. */ rval = 0; - while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { + while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { cond_resched(); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) @@ -497,28 +501,21 @@ del_cursor: */ irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { - struct xfs_bulkstat_agichunk ac; - - ac.ac_lastino = lastino; - ac.ac_ubuffer = &ubuffer; - ac.ac_ubleft = ubleft; - ac.ac_ubelem = ubelem; + irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); + irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, - formatter, statstruct_size, &ac); + formatter, statstruct_size, &ac, + &lastino); if (error) rval = error; - lastino = ac.ac_lastino; - ubleft = ac.ac_ubleft; - ubelem = ac.ac_ubelem; - cond_resched(); } + /* * Set up for the next loop iteration. */ - if (XFS_BULKSTAT_UBLEFT(ubleft)) { + if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { if (end_of_ag) { agno++; agino = 0; @@ -531,11 +528,11 @@ del_cursor: * Done, we're either out of filesystem or space to put the data. */ kmem_free(irbuf); - *ubcountp = ubelem; + *ubcountp = ac.ac_ubelem; /* * Found some inodes, return them now and return the error next time. */ - if (ubelem) + if (ac.ac_ubelem) rval = 0; if (agno >= mp->m_sb.sb_agcount) { /* diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index aaed080..6ea8b39 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -30,22 +30,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, int *ubused, int *stat); -struct xfs_bulkstat_agichunk { - xfs_ino_t ac_lastino; /* last inode returned */ - char __user **ac_ubuffer;/* pointer into user's buffer */ - int ac_ubleft; /* bytes left in user's buffer */ - int ac_ubelem; /* spaces used in user's buffer */ -}; - -int -xfs_bulkstat_ag_ichunk( - struct xfs_mount *mp, - xfs_agnumber_t agno, - struct xfs_inobt_rec_incore *irbp, - bulkstat_one_pf formatter, - size_t statstruct_size, - struct xfs_bulkstat_agichunk *acp); - /* * Values for stat return value. */ -- 2.0.0 From dave@fromorbit.com Tue Nov 4 18:05:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 992A47FB4 for ; Tue, 4 Nov 2014 18:05:56 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46366AC005 for ; Tue, 4 Nov 2014 16:05:56 -0800 (PST) X-ASG-Debug-ID: 1415145942-04bdf038d169b650002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 9eozotykxFJmrFvB for ; Tue, 04 Nov 2014 16:05:46 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag5/AIpoWVR5LbBUPGdsb2JhbABbgw5UWY18rHACChIGdIR4jWyIbxcBAQEBAQYBAQEBODuEXzuBAgMHiG0OokOkeYY3iDyCOoQ1BZAAhnKfNQEBAQcBAQEBAYI2KS8BgkoBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 10:35:41 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1Xlo6G-0001sa-8B for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1Xlo6G-0008D3-5S for xfs@oss.sgi.com; Wed, 05 Nov 2014 11:05:24 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6 v2] xfs: fix the bulkstat mess Date: Wed, 5 Nov 2014 11:05:15 +1100 X-ASG-Orig-Subj: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-Id: <1415145921-31507-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415145945 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA717 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 Hi folks, this is version 2 of the bulkstat fixup series first posted here: http://oss.sgi.com/archives/xfs/2014-11/msg00057.html Version 2 fixes the issues Brian found during review: - chunk formatter error leakage (patch 3) - moved main loop chunk formatter error handling from patch 4 to patch 5 - reworks last_agino updating in patch 6 to do post-formatting updates and added comments. Comeents and testing welcome. -Dave. From a.m.abdulla13@g.pl Tue Nov 4 21:20:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=URG_BIZ autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 062A67FB1 for ; Tue, 4 Nov 2014 21:20:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7E73304039 for ; Tue, 4 Nov 2014 19:20:39 -0800 (PST) X-ASG-Debug-ID: 1415157633-04cb6c2efc5acb00001-NocioJ Received: from mail.vps.com ([23.98.76.10]) by cuda.sgi.com with ESMTP id iAxE2HG0x6qjo1iO for ; Tue, 04 Nov 2014 19:20:34 -0800 (PST) X-Barracuda-Envelope-From: a.m.abdulla13@g.pl X-Barracuda-Apparent-Source-IP: 23.98.76.10 Received: from [23.98.76.10] (localhost [IPv6:::1]) by mail.vps.com (Postfix) with ESMTP id DCB8D20B51; Tue, 4 Nov 2014 08:12:45 +0000 (UTC) Received: from 181.41.197.222 (SquirrelMail authenticated user admin) by 23.98.76.10 with HTTP; Tue, 4 Nov 2014 12:12:46 +0400 Message-ID: Date: Tue, 4 Nov 2014 12:12:46 +0400 Subject: Interesting Business From: "A.M.Abdulla" X-ASG-Orig-Subj: Interesting Business Reply-To: a.m.abdulla11@g.pl User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20141104121246_48332" X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[23.98.76.10] X-Barracuda-Start-Time: 1415157633 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.27 X-Barracuda-Spam-Status: No, SCORE=2.27 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC2_MV0291, RDNS_NONE, URG_BIZ X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.67 URG_BIZ BODY: Contains urgent matter 1.50 BSF_SC2_MV0291 Custom rule MV0291 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS ------=_20141104121246_48332 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Greeting, I live and work in a reputable bank in Abu Dhabi. I have an urgent business which I believe will interest you. Find the enclose for details. For any reason you cannot open that attachment, please let me know so that I can re-send it in the body of the mail, thank you. Looking forward in hearing from you soon I wait for your response, Thank you. Regards A.M.Abdulla ------=_20141104121246_48332 Content-Type: application/pdf; name="Interesting Business.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Interesting Business.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDggMCBSL01hcmtJbmZvPDwvTWFya2VkIHRydWU+Pj4+ DQplbmRvYmoNCjIgMCBvYmoNCjw8L1R5cGUvUGFnZXMvQ291bnQgMS9LaWRzWyAzIDAgUl0gPj4N CmVuZG9iag0KMyAwIG9iag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9SZXNvdXJjZXM8PC9G b250PDwvRjEgNSAwIFI+Pi9Qcm9jU2V0Wy9QREYvVGV4dC9JbWFnZUIvSW1hZ2VDL0ltYWdlSV0g Pj4vTWVkaWFCb3hbIDAgMCA2MTIgNzkyXSAvQ29udGVudHMgNCAwIFIvR3JvdXA8PC9UeXBlL0dy b3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJlbnRzIDA+ Pg0KZW5kb2JqDQo0IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDM1ODM+Pg0K c3RyZWFtDQp4nK1aWY/bRhJ+N+D/0A+7WBHQtHkf2CCAj4kTx94Eay8Wi2QfKJEzHIzMpodDj/Pv t46+KImSAiyCyBqKrK6u46uvqile/Cq+++7Fh9c/vRHhi/d1fytWbR98/7149ea1ePXp+bMXP0Qi imSYik83z59FIoT/IlHEMoxTUUQh/fL5+bNQ3OLH2+fPflu9DbLVQ3CVrNo2uIpXj0G+uguu0lV/ G0TRalwH/xWf3j1/dg3icQkjNIoKmfkyf1sJ71Zx/eG1EJ7C0VGF91TMq0Km8SXi4ovElakstLSf gqhciTq4iuLV5yAq4Lt4Vff3Afwt4Gq4+gUMcYOGoA+ywbYNSjaOQGOwXcRLuHEz4QXxBr529QZ+ yFZr0eG19gH/aINqJfT9/4Kbevs8GrhtxMuHGmRvSMo1KFTxr7RY/UgiRvwuhdYc7slW4sl4S8uC D89bZkX8/hAUq/YW1KhJoWYUj0G6UqLuxYJLjdXg30hbTQ2DQkG00ORvAj7+8Jckm/IVdWjFq5gt SM+RmXiPtJ87sMgOf6APum+zoGIcFzJJZiq26NSYDczKfAZ5pE7bkwlbsWntLegYrVrO6gj6VLyu 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 lo6rWOZuG/Y8EDrlu9mxETVno31BaKSmeP6GBV1zO9Ets2luNV/cKueMQYMGMTYTOjQkM4nU9v5W Gi+cSAB01kjE3Lse98CIEK5SS3kcWQfwUv2R+fJp+xSVLA0/RvwbCLZJBa7ZjZt1O+x73Ev7+Tzb 1OwzJ0JscnsGgSfWv4qPQbK6fh3wGfP1Jz65RyH/5prPoYhKstv4GEn45zw+NiCRpbmtvp8gQJnx MaePwQrsNI32uv/8g4YCD0tHHEgp47kNz9mbX7TRR+G0MmeqrmPudGPQ4wSKE7lIqtNSZuVc7Mki UF1SBOIslVlxibjo+Bu4+/KAZ1RGHjZ/fk8o+v3XI5va9gRvVYP0Q5+Qj/rY6mWP0/r5CJMPprn+ zKftsxbhT9h8sYxnOLOe7em0jS566TeOK5lcJu+it37jKJd55s0T/HftXKvivxq7+JIzqJbNBZ5W 8KK3w+IwhX8vknfR62FRFcnEzvwANj7Il5tm2gX2gHxhd0Cgynj2+JLroyTBF9r8Ww8U/x9JHY1j DQplbmRzdHJlYW0NCmVuZG9iag0KNSAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5 cGUvTmFtZS9GMS9CYXNlRm9udC9UaW1lcyMyME5ldyMyMFJvbWFuL0VuY29kaW5nL1dpbkFuc2lF bmNvZGluZy9Gb250RGVzY3JpcHRvciA2IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMTIxL1dp ZHRocyAyOSAwIFI+Pg0KZW5kb2JqDQo2IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0Zv bnROYW1lL1RpbWVzIzIwTmV3IzIwUm9tYW4vRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQg ODkxL0Rlc2NlbnQgLTIxNi9DYXBIZWlnaHQgNjkzL0F2Z1dpZHRoIDQwMS9NYXhXaWR0aCAyNjE0 L0ZvbnRXZWlnaHQgNDAwL1hIZWlnaHQgMjUwL0xlYWRpbmcgNDIvU3RlbVYgNDAvRm9udEJCb3hb IC01NjggLTIxNiAyMDQ2IDY5M10gPj4NCmVuZG9iag0KNyAwIG9iag0KPDwvQXV0aG9yKHVzZXIp IC9DcmVhdG9yKP7/AE0AaQBjAHIAbwBzAG8AZgB0AK4AIABXAG8AcgBkACAAMgAwADEAMCkgL0Ny ZWF0aW9uRGF0ZShEOjIwMTQxMDA4MjMyMTQ5KzA0JzAwJykgL01vZERhdGUoRDoyMDE0MTAwODIz MjE0OSswNCcwMCcpIC9Qcm9kdWNlcij+/wBNAGkAYwByAG8AcwBvAGYAdACuACAAVwBvAHIAZAAg ADIAMAAxADApID4+DQplbmRvYmoNCjE0IDAgb2JqDQo8PC9UeXBlL09ialN0bS9OIDIwL0ZpcnN0 IDEzOC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQyNj4+DQpzdHJlYW0NCnicvVTbSsQwEH0X /If5g2TSNm1BFsQLirgs2wUfxIe4O+4Wu43ELOjfO0lW7IMPtg9C6ZnbOTPNpahAAhZQIKAGlAqw ZD8DrEDJHLAGVRRsQiY1KISsKEEpyCXnM8gLzufMllwGhVagNGjMQZWgNRMqKFkJEcpSQgU1q9fc RnIT7qtybsSP4tKzM7EIhRKWohELsfp8I9F4d1j7q4724u4R5BOIxRayUDObnZ78gYLjKWo8JRtP ycdTivEUPZ5SjqdU4yn1hK2csv0T9h8nHACccALw1yNQfVOM879PFwrClY2gE5QJqgR1BL6zETBB 4qksQZ4gqaikopKKiipPcBxpMMPKES2t9WJpO7o3bxAbhVGpj8lwqUMkrnxSGWTn9OHv6BPwqHzN Ur31JObhddVvfpwVlz7bD9HQ2osbMhtyyQ6cb/u279qemp0JA4bAec8Kxre2P/rOty+Gjeg9WPf6 bO2ruLTrw55nipH3HZFPq31v1s4O/Isdvwf+ZWs6ux0Emq7d0KA29eGyrTN7cd1uD46O3zo/7N8f w682+1nc/9zM05Mvl4WOyg0KZW5kc3RyZWFtDQplbmRvYmoNCjI5IDAgb2JqDQpbIDI1MCAwIDAg MCA1MDAgODMzIDAgMTgwIDMzMyAzMzMgMCAwIDI1MCAzMzMgMjUwIDI3OCA1MDAgNTAwIDUwMCAw IDAgNTAwIDUwMCA1MDAgMCAwIDAgMjc4IDAgMCAwIDAgMCA3MjIgNjY3IDY2NyA3MjIgNjExIDU1 NiA3MjIgNzIyIDMzMyAzODkgNzIyIDYxMSA4ODkgNzIyIDcyMiA1NTYgMCA2NjcgNTU2IDYxMSA3 MjIgMCA5NDQgMCA3MjIgMCAwIDAgMCAwIDAgMCA0NDQgNTAwIDQ0NCA1MDAgNDQ0IDMzMyA1MDAg NTAwIDI3OCAwIDUwMCAyNzggNzc4IDUwMCA1MDAgNTAwIDUwMCAzMzMgMzg5IDI3OCA1MDAgNTAw IDcyMiA1MDAgNTAwXSANCmVuZG9iag0KMzAgMCBvYmoNCjw8L1R5cGUvWFJlZi9TaXplIDMwL1db IDEgNCAyXSAvUm9vdCAxIDAgUi9JbmZvIDcgMCBSL0lEWzwxRTcxOTk4OTExNDYyRjQ0QTBENDMz Q0U1MzkxOTNFMz48MUU3MTk5ODkxMTQ2MkY0NEEwRDQzM0NFNTM5MTkzRTM+XSAvRmlsdGVyL0Zs YXRlRGVjb2RlL0xlbmd0aCAxMDA+Pg0Kc3RyZWFtDQp4nDXNwQ2DQAxE0VkgAUJYWKA4SkgRSNSQ a+pISeljY/zBBz+NNJYlm5yD7SQdbPB1wscZfs74dtIuFVaJGiHBBAOcldkOpvVKAQoooYIb3KGG Blp4QAdP6CHao+Ul/QEkxAjsDQplbmRzdHJlYW0NCmVuZG9iag0KeHJlZg0KMCAzMQ0KMDAwMDAw MDAwOCA2NTUzNSBmDQowMDAwMDAwMDE3IDAwMDAwIG4NCjAwMDAwMDAxMjQgMDAwMDAgbg0KMDAw MDAwMDE4MCAwMDAwMCBuDQowMDAwMDAwNDEwIDAwMDAwIG4NCjAwMDAwMDQwNjggMDAwMDAgbg0K MDAwMDAwNDI0MSAwMDAwMCBuDQowMDAwMDA0NDc5IDAwMDAwIG4NCjAwMDAwMDAwMDkgNjU1MzUg Zg0KMDAwMDAwMDAxMCA2NTUzNSBmDQowMDAwMDAwMDExIDY1NTM1IGYNCjAwMDAwMDAwMTIgNjU1 MzUgZg0KMDAwMDAwMDAxMyA2NTUzNSBmDQowMDAwMDAwMDE0IDY1NTM1IGYNCjAwMDAwMDAwMTUg NjU1MzUgZg0KMDAwMDAwMDAxNiA2NTUzNSBmDQowMDAwMDAwMDE3IDY1NTM1IGYNCjAwMDAwMDAw MTggNjU1MzUgZg0KMDAwMDAwMDAxOSA2NTUzNSBmDQowMDAwMDAwMDIwIDY1NTM1IGYNCjAwMDAw MDAwMjEgNjU1MzUgZg0KMDAwMDAwMDAyMiA2NTUzNSBmDQowMDAwMDAwMDIzIDY1NTM1IGYNCjAw MDAwMDAwMjQgNjU1MzUgZg0KMDAwMDAwMDAyNSA2NTUzNSBmDQowMDAwMDAwMDI2IDY1NTM1IGYN CjAwMDAwMDAwMjcgNjU1MzUgZg0KMDAwMDAwMDAyOCA2NTUzNSBmDQowMDAwMDAwMDAwIDY1NTM1 IGYNCjAwMDAwMDUyMjQgMDAwMDAgbg0KMDAwMDAwNTU1MyAwMDAwMCBuDQp0cmFpbGVyDQo8PC9T aXplIDMxL1Jvb3QgMSAwIFIvSW5mbyA3IDAgUi9JRFs8MUU3MTk5ODkxMTQ2MkY0NEEwRDQzM0NF NTM5MTkzRTM+PDFFNzE5OTg5MTE0NjJGNDRBMEQ0MzNDRTUzOTE5M0UzPl0gPj4NCnN0YXJ0eHJl Zg0KNTg1Mw0KJSVFT0YNCnhyZWYNCjAgMA0KdHJhaWxlcg0KPDwvU2l6ZSAzMS9Sb290IDEgMCBS L0luZm8gNyAwIFIvSURbPDFFNzE5OTg5MTE0NjJGNDRBMEQ0MzNDRTUzOTE5M0UzPjwxRTcxOTk4 OTExNDYyRjQ0QTBENDMzQ0U1MzkxOTNFMz5dIC9QcmV2IDU4NTMvWFJlZlN0bSA1NTUzPj4NCnN0 YXJ0eHJlZg0KNjYyOA0KJSVFT0Y= ------=_20141104121246_48332-- From david@fromorbit.com Wed Nov 5 00:07:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0FA0A7F3F for ; Wed, 5 Nov 2014 00:07:42 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2D16304048 for ; Tue, 4 Nov 2014 22:07:38 -0800 (PST) X-ASG-Debug-ID: 1415167654-04cb6c2efc5b1910001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2Nah4W9vuVaCQAop for ; Tue, 04 Nov 2014 22:07:35 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiBFAHm9WVR5LbBUPGdsb2JhbABbgw5Ugw+4WQEBAQEBAQaTVYFdhWoEAgKBFBcBAQEBAQYBAQEBODuEAwEBBDocMwgDGAklDwUlAwctiEAOxzEMIBiGH4g8giQWgxeBHgWWcocbml8pLwGCSgEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 16:37:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xltke-0002co-ED for xfs@oss.sgi.com; Wed, 05 Nov 2014 17:07:28 +1100 Date: Wed, 5 Nov 2014 17:07:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141105060728.GE28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415145921-31507-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415167654 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11248 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 05, 2014 at 11:05:15AM +1100, Dave Chinner wrote: > Hi folks, this is version 2 of the bulkstat fixup series first > posted here: > > http://oss.sgi.com/archives/xfs/2014-11/msg00057.html > > Version 2 fixes the issues Brian found during review: > - chunk formatter error leakage (patch 3) > - moved main loop chunk formatter error handling from patch 4 to > patch 5 > - reworks last_agino updating in patch 6 to do post-formatting > updates and added comments. > > Comeents and testing welcome. I'm not 100% convinced that this fixes all the problems. I just created, dumped and restored a 10 million inode filesystem (about 50GB of dump file) and I found 102 missing files in the dump with no errors from xfsdump or xfsrestore. The files are missing from just 4 directories out of about 1000 directories containing equal numbers of files, so its not a common trigger whatever the issue is. I'll keep digging... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Nov 5 00:32:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0311C7F3F for ; Wed, 5 Nov 2014 00:32:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E53FF304051 for ; Tue, 4 Nov 2014 22:32:34 -0800 (PST) X-ASG-Debug-ID: 1415169148-04cbb070c764b690001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Fu0EPZTV7rw76QKi for ; Tue, 04 Nov 2014 22:32:29 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiBFAHjDWVR5LbBUPGdsb2JhbABbgw5Ugw+4WQEBAQEBAQaTVYFdhWoEAgKBEhcBAQEBAQYBAQEBODuEAwEBBDocMwgDGAklDwUlAwctiEAOxzMBCyAYhh+IPIIkgy2BHgWQAIZyhxuBMoNMlWEpLwGCSgEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Nov 2014 17:02:27 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xlu8o-0002fV-SA for xfs@oss.sgi.com; Wed, 05 Nov 2014 17:32:26 +1100 Date: Wed, 5 Nov 2014 17:32:26 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141105063226.GF28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <20141105060728.GE28565@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141105060728.GE28565@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415169148 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11249 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 05, 2014 at 05:07:28PM +1100, Dave Chinner wrote: > On Wed, Nov 05, 2014 at 11:05:15AM +1100, Dave Chinner wrote: > > Hi folks, this is version 2 of the bulkstat fixup series first > > posted here: > > > > http://oss.sgi.com/archives/xfs/2014-11/msg00057.html > > > > Version 2 fixes the issues Brian found during review: > > - chunk formatter error leakage (patch 3) > > - moved main loop chunk formatter error handling from patch 4 to > > patch 5 > > - reworks last_agino updating in patch 6 to do post-formatting > > updates and added comments. > > > > Comeents and testing welcome. > > I'm not 100% convinced that this fixes all the problems. I just > created, dumped and restored a 10 million inode filesystem (about > 50GB of dump file) and I found 102 missing files in the dump with no > errors from xfsdump or xfsrestore. > > The files are missing from just 4 directories out of about 1000 > directories containing equal numbers of files, so its not a common > trigger whatever the issue is. I'll keep digging... OK, this looks like a problem with handling the last record in the AGI btree: $ for i in `cat s.diff | grep "^+/" | sed -e 's/^+//'` ; do ls -i $i; done |sort -n 163209114099 /mnt/scratch/2/dbc/5459605f~~~~~~~~RDJX8QBHPPMCGMD7YJQGYPD2 .... 163209114129 /mnt/scratch/2/dbc/5459605f~~~~~~~~U820IYQFKS8A6QYCC8HU3ZBX 292057960758 /mnt/scratch/0/dcc/54596070~~~~~~~~9BUH5D5PZTGAC8BT1YL77OZ0 ... 292057960769 /mnt/scratch/0/dcc/54596070~~~~~~~~DAO78GAAFNUZU8PH7Q0UZNRH 1395864555809 /mnt/scratch/1/e60/54596103~~~~~~~~GEMXGHYNREW409N7W9INBMVA ..... 1395864555841 /mnt/scratch/1/e60/54596103~~~~~~~~9XPK9FWHCE21AJ3EN023DU47 1653562593576 /mnt/scratch/5/e79/5459611c~~~~~~~~BSBZ6EUCT9HOIRQPMFZDVPQ5 ..... 1653562593601 /mnt/scratch/5/e79/5459611c~~~~~~~~6QY1SO8ZGGNQESAGXSB3G3DH $ xfs_db> convert inode 163209114099 agno 0x26 (38) xfs_db> convert inode 163209114099 agino 0x571f3 (356851) xfs_db> convert inode 163209114129 agino 0x57211 (356881) xfs_db> agi 38 xfs_db> a root xfs_db> a ptrs[2] xfs_db> p .... recs[1-234] = [startino,freecount,free] ...... 228:[356352,0,0] 229:[356416,0,0] 230:[356512,0,0] 231:[356576,0,0] 232:[356672,0,0] 233:[356736,0,0] 234:[356832,14,0xfffc000000000000] So the first contiguous inode range they all fall into the partial final record in the AG. xfs_db> convert inode 292057960758 agino 0x2d136 (184630) ..... 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] Same. xfs_db> convert inode 1395864555809 agino 0x2d121 (184609) ..... 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] Same. xfs_db> convert inode 1653562593576 agino 0x2d128 (184616) .... 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] Same. So they are all falling into the last btree record in the AG, and so appear to have been skipped as a result of the same issue. At least that gives me something to look at. Still, please review the patches I've already posted - I'll push them to linus if they are fine ASAP, and then add whatever I find from this test later. Cheers, Dave. PS: every AG I looked at had an identical inode allocation pattern. Given that the directory entries and the file contents created are all deterministic, it's reassuring to see that the allocator has created identical metadata structure layouts on disk for a repeating workload that creates identical user-visible hierarchies... -- Dave Chinner david@fromorbit.com From bounces@absolu-wood.com Wed Nov 5 06:59:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5C3D57F3F for ; Wed, 5 Nov 2014 06:59:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38E6A8F8033 for ; Wed, 5 Nov 2014 04:59:19 -0800 (PST) X-ASG-Debug-ID: 1415192356-04cbb070c8655270001-NocioJ Received: from fr8.absolu-wood.com (fr8.absolu-wood.com [37.187.230.213]) by cuda.sgi.com with ESMTP id lDGh8VERC9rwIhBk for ; Wed, 05 Nov 2014 04:59:16 -0800 (PST) X-Barracuda-Envelope-From: bounces@absolu-wood.com X-Barracuda-Apparent-Source-IP: 37.187.230.213 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=k3; d=absolu-wood.com; h=To:Subject:Message-ID:Date:From:Reply-To:MIME-Version:List-Unsubscribe:Content-Type:Content-Transfer-Encoding; i=lucie@absolu-wood.com; bh=9qf+PdywjJ8WbsDDQQpCWGYaxpE=; b=VVOC9YZ8JQqpCftFnLj0v6445zbzxZF0GV+ZCxFzD8DSb0QsMhmQOFDY5M+wM3u4jktJ8ChFf1QT DzWgvx0BoldAwi5b7Ie5rl5KXsrom2+D0aWSr4TEimWsu53zCn7BFZsGjidiNKo5sshoFavyVyh1 ttYqRoMNKukEz8wSYtI= Received: by fr8.absolu-wood.com for ; Wed, 5 Nov 2014 13:59:13 +0100 (envelope-from ) To: xfs@oss.sgi.com Subject: Communiquez avec le bois ! Message-ID: <81b627efe0166728c44183c233a4cfd1@app.absolu-wood.com> X-ASG-Orig-Subj: Communiquez avec le bois ! Date: Wed, 05 Nov 2014 12:59:32 +0000 From: "Absolu WooD" Reply-To: lucie@absolu-wood.com MIME-Version: 1.0 X-Mailer-LID: 3 List-Unsubscribe: X-Mailer-RecptId: 3960673 X-Mailer-SID: 571 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_e7e9dfe560357a3ebd0310c47fa5f39e" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: fr8.absolu-wood.com[37.187.230.213] X-Barracuda-Start-Time: 1415192356 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.31 X-Barracuda-Spam-Status: No, SCORE=0.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different --b1_e7e9dfe560357a3ebd0310c47fa5f39e Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Your email client cannot read this email. To view it online, please go here: http://app.absolu-wood.com/display.php?M=3960673&C=50e8450ffa8ed6817a0f2fd6bc54433a&S=571&L=3&N=109 To stop receiving these emails:http://app.absolu-wood.com/unsubscribe.php?M=3960673&C=50e8450ffa8ed6817a0f2fd6bc54433a&L=3&N=571 --b1_e7e9dfe560357a3ebd0310c47fa5f39e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Absolu Wood - Communiquez avec le bois !
  logo.png   Communication par l'objet
&
papeterie bois
 
Absolu Wood - Le Bruel - 48230 ESCLANEDES - 09.72.44.69.41
 
 
patchwork.png

Communiquez avec le bois !

Une mise en oeuvre innovante du bois, pour des objets originaux et une communication durable.

  • Une matière esthétique et hautement symbolique.
  • Gamme de produits de papeterie réalisée en bois et papier recyclé.
  • Différentes techniques de marquage.
  • Produits fabriqués en France par une entreprise adaptée.
 
 
  encart-pro2.png   catalogue.png   fabrique-en-france-200.png  
Notre site web dédié aux pros Téléchargez notre catalogue Fabrication Française
--b1_e7e9dfe560357a3ebd0310c47fa5f39e-- From bfoster@redhat.com Wed Nov 5 07:17:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 478277F3F for ; Wed, 5 Nov 2014 07:17:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15FEF304048 for ; Wed, 5 Nov 2014 05:17:16 -0800 (PST) X-ASG-Debug-ID: 1415193435-04bdf038d06c1410001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NmVfRXdp6ORfitTJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Nov 2014 05:17:15 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA5DH8S3009563 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 5 Nov 2014 08:17:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA5DH72W001301; Wed, 5 Nov 2014 08:17:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id A7C52122F87; Wed, 5 Nov 2014 08:17:06 -0500 (EST) Date: Wed, 5 Nov 2014 08:17:06 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141105131706.GB26724@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <20141105060728.GE28565@dastard> <20141105063226.GF28565@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141105063226.GF28565@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415193435 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Nov 05, 2014 at 05:32:26PM +1100, Dave Chinner wrote: > On Wed, Nov 05, 2014 at 05:07:28PM +1100, Dave Chinner wrote: > > On Wed, Nov 05, 2014 at 11:05:15AM +1100, Dave Chinner wrote: > > > Hi folks, this is version 2 of the bulkstat fixup series first > > > posted here: > > > > > > http://oss.sgi.com/archives/xfs/2014-11/msg00057.html > > > > > > Version 2 fixes the issues Brian found during review: > > > - chunk formatter error leakage (patch 3) > > > - moved main loop chunk formatter error handling from patch 4 to > > > patch 5 > > > - reworks last_agino updating in patch 6 to do post-formatting > > > updates and added comments. > > > > > > Comeents and testing welcome. > > > > I'm not 100% convinced that this fixes all the problems. I just > > created, dumped and restored a 10 million inode filesystem (about > > 50GB of dump file) and I found 102 missing files in the dump with no > > errors from xfsdump or xfsrestore. > > > > The files are missing from just 4 directories out of about 1000 > > directories containing equal numbers of files, so its not a common > > trigger whatever the issue is. I'll keep digging... > > OK, this looks like a problem with handling the last record in the > AGI btree: > > $ for i in `cat s.diff | grep "^+/" | sed -e 's/^+//'` ; do ls -i $i; done |sort -n > 163209114099 /mnt/scratch/2/dbc/5459605f~~~~~~~~RDJX8QBHPPMCGMD7YJQGYPD2 > .... > 163209114129 /mnt/scratch/2/dbc/5459605f~~~~~~~~U820IYQFKS8A6QYCC8HU3ZBX > 292057960758 /mnt/scratch/0/dcc/54596070~~~~~~~~9BUH5D5PZTGAC8BT1YL77OZ0 > ... > 292057960769 /mnt/scratch/0/dcc/54596070~~~~~~~~DAO78GAAFNUZU8PH7Q0UZNRH > 1395864555809 /mnt/scratch/1/e60/54596103~~~~~~~~GEMXGHYNREW409N7W9INBMVA > ..... > 1395864555841 /mnt/scratch/1/e60/54596103~~~~~~~~9XPK9FWHCE21AJ3EN023DU47 > 1653562593576 /mnt/scratch/5/e79/5459611c~~~~~~~~BSBZ6EUCT9HOIRQPMFZDVPQ5 > ..... > 1653562593601 /mnt/scratch/5/e79/5459611c~~~~~~~~6QY1SO8ZGGNQESAGXSB3G3DH > $ > > xfs_db> convert inode 163209114099 agno > 0x26 (38) > xfs_db> convert inode 163209114099 agino > 0x571f3 (356851) > xfs_db> convert inode 163209114129 agino > 0x57211 (356881) > xfs_db> agi 38 > xfs_db> a root > xfs_db> a ptrs[2] > xfs_db> p > .... > recs[1-234] = [startino,freecount,free] > ...... > 228:[356352,0,0] 229:[356416,0,0] 230:[356512,0,0] 231:[356576,0,0] > 232:[356672,0,0] 233:[356736,0,0] 234:[356832,14,0xfffc000000000000] > > So the first contiguous inode range they all fall into the partial final record > in the AG. > > xfs_db> convert inode 292057960758 agino > 0x2d136 (184630) > ..... > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > Same. > > xfs_db> convert inode 1395864555809 agino > 0x2d121 (184609) > ..... > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > Same. > > xfs_db> convert inode 1653562593576 agino > 0x2d128 (184616) > .... > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > Same. > > So they are all falling into the last btree record in the AG, and so > appear to have been skipped as a result of the same issue. At least > that gives me something to look at. > Interesting, though just to note... is it possible this is related to records with free inodes? If this is a prepopulated fs for the purpose of this test, it's conceivable that there's only a small set of such records in the fs. The other records in your snippets here are fully allocated, but of course this is only a small snippet of a larger set of data. It also might be interesting to know whether this repeats without the last patch in the series. IIRC that one seemed to have the most potential impact on the overall algorithm (by changing loop iteration logic, etc.). Just a thought. Brian > Still, please review the patches I've already posted - I'll push > them to linus if they are fine ASAP, and then add whatever I find > from this test later. > > Cheers, > > Dave. > > PS: every AG I looked at had an identical inode allocation pattern. > Given that the directory entries and the file contents created are > all deterministic, it's reassuring to see that the allocator has > created identical metadata structure layouts on disk for a > repeating workload that creates identical user-visible > hierarchies... > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Nov 5 08:59:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6396B7F3F for ; Wed, 5 Nov 2014 08:59:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4A01AC006 for ; Wed, 5 Nov 2014 06:59:20 -0800 (PST) X-ASG-Debug-ID: 1415199558-04cbb070c565b720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VSbc56Vo1W1NqnXh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Nov 2014 06:59:19 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA5ExH8J025879 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 5 Nov 2014 09:59:17 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA5ExG1w009247; Wed, 5 Nov 2014 09:59:16 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9868E122F87; Wed, 5 Nov 2014 09:59:15 -0500 (EST) Date: Wed, 5 Nov 2014 09:59:15 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-ID: <20141105145914.GA35056@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <1415145921-31507-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415145921-31507-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415199559 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Nov 05, 2014 at 11:05:18AM +1100, Dave Chinner wrote: > From: Dave Chinner > > The loop construct has issues: > - clustidx is completely unused, so remove it. > - the loop tries to be smart by terminating when the > "freecount" tells it that all inodes are free. Just drop > it as in most cases we have to scan all inodes in the > chunk anyway. > - move the "user buffer left" condition check to the only > point where we consume space int eh user buffer. > - move the initialisation of agino out of the loop, leaving > just a simple loop control logic using the clusteridx. > > Also, double handling of the user buffer variables leads to problems > tracking the current state - use the cursor variables directly > rather than keeping local copies and then having to update the > cursor before returning. > > cc: > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_itable.c | 58 ++++++++++++++++++++++------------------------------- > 1 file changed, 24 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 50a3e59..7ea2b11 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -283,59 +283,49 @@ xfs_bulkstat_ag_ichunk( > xfs_ino_t *lastino) > { > char __user **ubufp = acp->ac_ubuffer; > - int ubleft = acp->ac_ubleft; > - int ubelem = acp->ac_ubelem; > - int chunkidx, clustidx; > + int chunkidx; > int error = 0; > xfs_agino_t agino; > > - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; > - XFS_BULKSTAT_UBLEFT(ubleft) && > - irbp->ir_freecount < XFS_INODES_PER_CHUNK; > - chunkidx++, clustidx++, agino++) { > - int fmterror; /* bulkstat formatter result */ > + agino = irbp->ir_startino; > + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > + chunkidx++, agino++) { > + int fmterror; > int ubused; > xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > > - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); > - > /* Skip if this inode is free */ > if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > *lastino = ino; > continue; > } > > - /* > - * Count used inodes as free so we can tell when the > - * chunk is used up. > - */ > - irbp->ir_freecount++; > - > /* Get the inode and fill in a single buffer */ > ubused = statstruct_size; > - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); > - if (fmterror == BULKSTAT_RV_NOTHING) { > - if (error && error != -ENOENT && error != -EINVAL) { > - ubleft = 0; > - break; > - } > - *lastino = ino; > - continue; > - } > - if (fmterror == BULKSTAT_RV_GIVEUP) { > - ubleft = 0; > + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > + &ubused, &fmterror); > + if (fmterror == BULKSTAT_RV_GIVEUP || > + (error && error != -ENOENT && error != -EINVAL)) { > + acp->ac_ubleft = 0; > ASSERT(error); > break; > } > - if (*ubufp) > - *ubufp += ubused; > - ubleft -= ubused; > - ubelem++; > + > + /* be careful not to leak error if at end of chunk */ > + if (fmterror == BULKSTAT_RV_NOTHING || error) { > + *lastino = ino; > + error = 0; > + continue; > + } > + > + *ubufp += ubused; > + acp->ac_ubleft -= ubused; > + acp->ac_ubelem++; > *lastino = ino; > - } > > - acp->ac_ubleft = ubleft; > - acp->ac_ubelem = ubelem; > + if (acp->ac_ubleft < statstruct_size) > + break; > + } > > return error; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Nov 5 09:14:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA9FF7F3F for ; Wed, 5 Nov 2014 09:14:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B7A3A304039 for ; Wed, 5 Nov 2014 07:14:29 -0800 (PST) X-ASG-Debug-ID: 1415200467-04cb6c2efa5c2e20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nUNHn3fzENA3alvy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Nov 2014 07:14:28 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA5FEQ91021040 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 5 Nov 2014 10:14:26 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA5FEPZI015981; Wed, 5 Nov 2014 10:14:26 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E6826122F87; Wed, 5 Nov 2014 10:14:24 -0500 (EST) Date: Wed, 5 Nov 2014 10:14:24 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: track bulkstat progress by agino Message-ID: <20141105151424.GB35056@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: track bulkstat progress by agino References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <1415145921-31507-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415145921-31507-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415200468 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Nov 05, 2014 at 11:05:21AM +1100, Dave Chinner wrote: > From: Dave Chinner > > The bulkstat main loop progress is tracked by the "lastino" > variable, which is a full 64 bit inode. However, the loop actually > works on agno/agino pairs, and so there's a significant disconnect > between the rest of the loop and the main cursor. Convert this to > use the agino, and pass the agino into the chunk formatting function > and convert it too. > > This gets rid of the inconsistency in the loop processing, and > finally makes it simple for us to skip inodes at any point in the > loop simply by incrementing the agino cursor. > > Signed-off-by: Dave Chinner > --- The deltas in this version look Ok, but when I step back from the patch and make another pass at the overall algorithm, I think that this approach still has some problems. Particularly, consider the end_of_ag agino update in the main xfs_bulkstat() loop. In that block, we update agno and set agino = 0, but there's no guarantee we've processed that inode and thus can push the cookie forward in a manner that can skip inodes. Consider the case where we run out of buffer space on the last record of the AG. We've set end_of_ag in either of the preceding record scanning blocks, called xfs_bulkstat_ag_ichunk() and then simply run out of space in the buffer. It looks like we'd exit th ag_ichunk() loop, move agino forward to the next ag and exit out of the main loop on the next iteration. The lastinop cookie is now set to the first inode of the subsequent AG. It's not clear what possibilities that introduces for xfsdump, but it seems broken and I can reproduce some badness with xfstests/src/bstat on a quick test: # for i in $(seq 0 999); do touch /mnt/$i; done # ./bstat /mnt/ | grep ino | wc -l 1001 # ./bstat /mnt/ 4 | grep ino | wc -l 960 So using a small batch size (default is 4096) definitely causes inode skipping one way or another. This problem doesn't occur if I drop this patch. Either way, I'm thinking we could use an xfstests that uses bstat to create some of these different inode layout, batch size, AG count, etc. conditions and validates the expected bulkstat count. We could probably do a lot more (and more quickly) in a single test than via xfsdump. ;) Brian > fs/xfs/xfs_itable.c | 68 ++++++++++++++++++++++++++--------------------------- > 1 file changed, 34 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index be96754..a082bb7 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -282,30 +282,31 @@ xfs_bulkstat_ag_ichunk( > bulkstat_one_pf formatter, > size_t statstruct_size, > struct xfs_bulkstat_agichunk *acp, > - xfs_ino_t *lastino) > + xfs_agino_t *last_agino) > { > char __user **ubufp = acp->ac_ubuffer; > int chunkidx; > int error = 0; > - xfs_agino_t agino; > + xfs_agino_t agino = irbp->ir_startino; > > - agino = irbp->ir_startino; > for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > chunkidx++, agino++) { > int fmterror; > int ubused; > - xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > + > + /* inode won't fit in buffer, we are done */ > + if (acp->ac_ubleft < statstruct_size) > + break; > > /* Skip if this inode is free */ > - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > - *lastino = ino; > + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) > continue; > - } > > /* Get the inode and fill in a single buffer */ > ubused = statstruct_size; > - error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > - &ubused, &fmterror); > + error = formatter(mp, XFS_AGINO_TO_INO(mp, agno, agino), > + *ubufp, acp->ac_ubleft, &ubused, &fmterror); > + > if (fmterror == BULKSTAT_RV_GIVEUP || > (error && error != -ENOENT && error != -EINVAL)) { > acp->ac_ubleft = 0; > @@ -315,7 +316,6 @@ xfs_bulkstat_ag_ichunk( > > /* be careful not to leak error if at end of chunk */ > if (fmterror == BULKSTAT_RV_NOTHING || error) { > - *lastino = ino; > error = 0; > continue; > } > @@ -323,12 +323,18 @@ xfs_bulkstat_ag_ichunk( > *ubufp += ubused; > acp->ac_ubleft -= ubused; > acp->ac_ubelem++; > - *lastino = ino; > - > - if (acp->ac_ubleft < statstruct_size) > - break; > } > > + /* > + * Post-update *last_agino. At this point, agino will always point one > + * inode past the last inode we processed successfully. Hence we > + * substract that inode when setting the *last_agino cursor so that we > + * return the correct cookie to userspace. On the next bulkstat call, > + * the inode under the lastino cookie will be skipped as we have already > + * processed it here. > + */ > + *last_agino = agino - 1; > + > return error; > } > > @@ -352,7 +358,6 @@ xfs_bulkstat( > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > size_t irbsize; /* size of irec buffer in bytes */ > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > - xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > int ubcount; /* size of user's buffer */ > struct xfs_bulkstat_agichunk ac; > @@ -361,11 +366,10 @@ xfs_bulkstat( > /* > * Get the last inode value, see if there's nothing to do. > */ > - lastino = *lastinop; > - agno = XFS_INO_TO_AGNO(mp, lastino); > - agino = XFS_INO_TO_AGINO(mp, lastino); > + agno = XFS_INO_TO_AGNO(mp, *lastinop); > + agino = XFS_INO_TO_AGINO(mp, *lastinop); > if (agno >= mp->m_sb.sb_agcount || > - lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { > + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) { > *done = 1; > *ubcountp = 0; > return 0; > @@ -420,7 +424,6 @@ xfs_bulkstat( > irbp->ir_freecount = r.ir_freecount; > irbp->ir_free = r.ir_free; > irbp++; > - agino = r.ir_startino + XFS_INODES_PER_CHUNK; > } > /* Increment to the next record */ > error = xfs_btree_increment(cur, 0, &stat); > @@ -461,7 +464,6 @@ xfs_bulkstat( > /* > * Set agino to after this chunk and bump the cursor. > */ > - agino = r.ir_startino + XFS_INODES_PER_CHUNK; > error = xfs_btree_increment(cur, 0, &stat); > if (error || stat == 0) { > end_of_ag = true; > @@ -481,7 +483,9 @@ del_cursor: > if (error) > break; > /* > - * Now format all the good inodes into the user's buffer. > + * Now format all the good inodes into the user's buffer. The > + * call to xfs_bulkstat_ag_ichunk() sets up the agino pointer > + * for the next loop iteration. > */ > irbufend = irbp; > for (irbp = irbuf; > @@ -489,7 +493,7 @@ del_cursor: > irbp++) { > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > formatter, statstruct_size, &ac, > - &lastino); > + &agino); > if (error) > break; > > @@ -502,8 +506,7 @@ del_cursor: > if (end_of_ag) { > agno++; > agino = 0; > - } else > - agino = XFS_INO_TO_AGINO(mp, lastino); > + } > } > /* > * Done, we're either out of filesystem or space to put the data. > @@ -521,16 +524,13 @@ del_cursor: > if (ac.ac_ubelem) > error = 0; > > - if (agno >= mp->m_sb.sb_agcount) { > - /* > - * If we ran out of filesystem, mark lastino as off > - * the end of the filesystem, so the next call > - * will return immediately. > - */ > - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); > + /* > + * If we ran out of filesystem, lastino will point off the end of > + * the filesystem so the next call will return immediately. > + */ > + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); > + if (agno >= mp->m_sb.sb_agcount) > *done = 1; > - } else > - *lastinop = (xfs_ino_t)lastino; > > return error; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From SecuritySystem@childhoo.us Wed Nov 5 11:59:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8B51F7F3F for ; Wed, 5 Nov 2014 11:59:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 686A830405F for ; Wed, 5 Nov 2014 09:59:24 -0800 (PST) X-ASG-Debug-ID: 1415210362-04bdf038d16d18e0001-NocioJ Received: from childhoo.us ([192.3.185.135]) by cuda.sgi.com with ESMTP id KWZ1NMWGh1QCqY3n for ; Wed, 05 Nov 2014 09:59:22 -0800 (PST) X-Barracuda-Envelope-From: SecuritySystem@childhoo.us X-Barracuda-Apparent-Source-IP: 192.3.185.135 Received: by childhoo.us id hb9is60001ga for ; Wed, 5 Nov 2014 09:28:03 -0800 (envelope-from ) MIME-Version: 1.0 From: "SecuritySystem" To: Subject: FWD: I just tried to reach you today - November 5, 2014 (Security Offer Confirmation) Content-Type: text/plain; charset="UTF-8" X-ASG-Orig-Subj: FWD: I just tried to reach you today - November 5, 2014 (Security Offer Confirmation) Content-Transfer-Encoding: 8bit Message-ID: <0.0.0.23.1CFF91DDA9F3504.2C975F@childhoo.us> Date: Wed, 5 Nov 2014 10:00:35 -0800 X-Barracuda-Connect: UNKNOWN[192.3.185.135] X-Barracuda-Start-Time: 1415210362 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.10 X-Barracuda-Spam-Status: No, SCORE=1.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 November 5, 2014 xfs@oss.sgi.com We have been trying to contact you. You could be chosen to receive a free Home Security System. Your security system is ready to once we receive your details, please click here: http://childhoo.us/Z14oaaSmMYhMMOXfNfniVChnSwAGOyWV0pesCpsR6/19og+pM1UWwbjDPVDPH2jY96xfGWj1iNzkd6CU/xNguPsozDquoDGfICrXhPcbz0coBdGttZdn4fK8ancXP5e79M4MAg== Price: FREE for you (value $850) REF ID: #947-HSEC35848 FREE Home Security System - $850 Value With $99.00 installation fee and purchase of alarm monitoring services. Thank you, Home Security Team had prepared these articles for removal, when a sudden revolutioncomplete." He also speaks of the practice of burying articles used by running the risk of losing one's life. of the nations that are soon to gather at Philadelphia? No! I doinhabited, and parts of it are heavily wooded. It is there that thethe art in public. This people also used certain characters or letters, and obliged us to hasten back to Tixkokob. We brought with us the In the first days of March we arrived at the gate of theand the accounts of early Spanish voyagers contain meagre but still Sr. President, the cart has been made, the road has been opened _Histoire des nations civilizées du Mexique_, by M. L'Abbé precious monuments which occupy the expanse of our rich soil, an villas, yielded luxuriant crops to the inhabitants, and the figureHIS ACCOUNT OF DISCOVERIES.this race. The control exercised by the clergy is very powerful, and scientific attainments, and their very fe w and rude artistic - SIMPLE|INF0 POST-OFFICE-BOX4120 NUMBER49824 Portland-OR 97208 The displayed afore has been an ad_mail_ representation - Stop receiving these messages: http://childhoo.us/Z1woeabSdJEfcbaBeOa0T3A1RgADOCWHkYz6BehCtrV7pg+5K1ZknOSfZk6ZE2bN/qpARWP3htXwMv6Y+xV17P8rlX/55yWeInWcxOhQhRg/VIjwpNJv4OLtbn8WKcG08MUIBVLlvH8xcw== -- From medicarenotification@teamdirectunited54d2.link Wed Nov 5 12:23:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED3DF7F3F for ; Wed, 5 Nov 2014 12:23:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB27D304062 for ; Wed, 5 Nov 2014 10:23:33 -0800 (PST) X-ASG-Debug-ID: 1415211811-04bdf038d06d3220002-NocioJ Received: from teamdirectunited54d2.link (hosting1.teamdirectunited54d2.link [173.44.174.199]) by cuda.sgi.com with ESMTP id IV2eCVezCAbs3jTg for ; Wed, 05 Nov 2014 10:23:32 -0800 (PST) X-Barracuda-Envelope-From: medicarenotification@teamdirectunited54d2.link X-Barracuda-Apparent-Source-IP: 173.44.174.199 Date: Wed, 05 Nov 2014 11:22:11 -0700 Control-Unit: 1158423620921450J-filter1158423620921450system1158423620921450overlap Message-ID: <11584236men@teamdirectunited54d2.link-368722a09baf57a27b39c0ba1f12b19420921450> From: "Medicare Notification" To: Ext: 1158423620921450 Content-Type: text/plain Subject: Re: 2014 Open-Enrollment Has Started (Expires 12/07/14)* Mime-Version: 1.0 X-ASG-Orig-Subj: Re: 2014 Open-Enrollment Has Started (Expires 12/07/14)* X-Barracuda-Connect: hosting1.teamdirectunited54d2.link[173.44.174.199] X-Barracuda-Start-Time: 1415211812 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: teamdirectunited54d2.link X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 Medicare Open-Enrollment Status: Eligible ------------------------------------------- > Notice: #20921450 > Expiration: 12/07/14 > Date: 11/05/14 ------------------------------------------- To: xfs@oss.sgi.com You may now enroll in Medicare Open-Enrollment (Expires 12/07/14)* Please enter your zip code at the link below to see a list of plans we've gathered for you: * AARP > Humana > Aetna > Blue-Cross > Cigna Enter My Zip Code Here: http://myplan.teamdirectunited54d2.link We look forward to serving you and are confident you will be happy with your options. --------------- ID#20921450 11/04/14 Th-e above- is an a-dver-tisemen-t: To remove go here: http://remove.teamdirectunited54d2.link 9450 SW Gemini Dr: #56835 Beaverton 0R ##97OO8 1158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57 a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b1941158423620921450368722a09baf57a27b39c0ba1f12b194 From david@fromorbit.com Wed Nov 5 15:21:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 202237F3F for ; Wed, 5 Nov 2014 15:21:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BEBCFAC004 for ; Wed, 5 Nov 2014 13:21:09 -0800 (PST) X-ASG-Debug-ID: 1415222463-04bdf0650c098c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id K8RZ91UePzut3LQO for ; Wed, 05 Nov 2014 13:21:04 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsxFAJ6TWlR5LbBUPGdsb2JhbABcgw6BLYI2hQeyCAaVMoVrBAICgRwXAQEBAQEGAQEBATg7hAIBAQEDATocIwULCAMOCgklDwUlAwcaE4g4CMxaAQEBBwIgGIYgilkHhEsFj2uOJIEyh1OJSogVKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Nov 2014 07:51:02 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xm80i-00055o-2r; Thu, 06 Nov 2014 08:21:00 +1100 Date: Thu, 6 Nov 2014 08:21:00 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141105212100.GG28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <20141105060728.GE28565@dastard> <20141105063226.GF28565@dastard> <20141105131706.GB26724@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141105131706.GB26724@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1415222464 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11266 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 05, 2014 at 08:17:06AM -0500, Brian Foster wrote: > On Wed, Nov 05, 2014 at 05:32:26PM +1100, Dave Chinner wrote: > > OK, this looks like a problem with handling the last record in the > > AGI btree: > > > > $ for i in `cat s.diff | grep "^+/" | sed -e 's/^+//'` ; do ls -i $i; done |sort -n > > 163209114099 /mnt/scratch/2/dbc/5459605f~~~~~~~~RDJX8QBHPPMCGMD7YJQGYPD2 > > .... > > 163209114129 /mnt/scratch/2/dbc/5459605f~~~~~~~~U820IYQFKS8A6QYCC8HU3ZBX > > 292057960758 /mnt/scratch/0/dcc/54596070~~~~~~~~9BUH5D5PZTGAC8BT1YL77OZ0 > > ... > > 292057960769 /mnt/scratch/0/dcc/54596070~~~~~~~~DAO78GAAFNUZU8PH7Q0UZNRH > > 1395864555809 /mnt/scratch/1/e60/54596103~~~~~~~~GEMXGHYNREW409N7W9INBMVA > > ..... > > 1395864555841 /mnt/scratch/1/e60/54596103~~~~~~~~9XPK9FWHCE21AJ3EN023DU47 > > 1653562593576 /mnt/scratch/5/e79/5459611c~~~~~~~~BSBZ6EUCT9HOIRQPMFZDVPQ5 > > ..... > > 1653562593601 /mnt/scratch/5/e79/5459611c~~~~~~~~6QY1SO8ZGGNQESAGXSB3G3DH > > $ > > > > xfs_db> convert inode 163209114099 agno > > 0x26 (38) > > xfs_db> convert inode 163209114099 agino > > 0x571f3 (356851) > > xfs_db> convert inode 163209114129 agino > > 0x57211 (356881) > > xfs_db> agi 38 > > xfs_db> a root > > xfs_db> a ptrs[2] > > xfs_db> p > > .... > > recs[1-234] = [startino,freecount,free] > > ...... > > 228:[356352,0,0] 229:[356416,0,0] 230:[356512,0,0] 231:[356576,0,0] > > 232:[356672,0,0] 233:[356736,0,0] 234:[356832,14,0xfffc000000000000] > > > > So the first contiguous inode range they all fall into the partial final record > > in the AG. > > > > xfs_db> convert inode 292057960758 agino > > 0x2d136 (184630) > > ..... > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > Same. > > > > xfs_db> convert inode 1395864555809 agino > > 0x2d121 (184609) > > ..... > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > Same. > > > > xfs_db> convert inode 1653562593576 agino > > 0x2d128 (184616) > > .... > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > Same. > > > > So they are all falling into the last btree record in the AG, and so > > appear to have been skipped as a result of the same issue. At least > > that gives me something to look at. > > > > Interesting, though just to note... is it possible this is related to > records with free inodes? Oh, definitely possible - I haven't ruled that out yet. However, I would have expected such an issue ot manifest itself during xfstests (e.g. xfs/068) where random files are removed from the filesystem and so leaving fre inodes in the inobt.... > If this is a prepopulated fs for the purpose > of this test, it's conceivable that there's only a small set of such > records in the fs. The other records in your snippets here are fully > allocated, but of course this is only a small snippet of a larger set of > data. Right, they are the only partially allocated chunks in the AGs in question, but the other 496 AGs all have partial inode chunks as their last records, too, and they have dumped correctly. > It also might be interesting to know whether this repeats without the > last patch in the series. IIRC that one seemed to have the most > potential impact on the overall algorithm (by changing loop iteration > logic, etc.). Just a thought. I'll try that, but the missing files don't seem aligned to the record itself, nor is it consistent with the free inodes in the record, so it's not an obvious loop start/end issue. I'll just have to dig in and look at it more closely. Thanks for the musings and thoughts - I'll have to narrow down the failure first to see if I can trigger it easily... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 6 00:54:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 157E07F3F for ; Thu, 6 Nov 2014 00:54:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5851AC004 for ; Wed, 5 Nov 2014 22:54:36 -0800 (PST) X-ASG-Debug-ID: 1415256873-04bdf0650c1de50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id P49jiKBQJGm6GOjb for ; Wed, 05 Nov 2014 22:54:33 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApJlANYaW1R5LbBUPGdsb2JhbABbgw6BLYI2hQewAQEFBpUyhWsEAgKBFxcBAQEBAQYBAQEBODuEAgEBAQMBOhwjEAgDDgoJJQ8FJQMHGhOIOAjNBQEBAQEBBQEBAQEeGIYgilkHgy2BHgWPa44kiQWRXykvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Nov 2014 17:24:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmGxD-0006Jt-TS; Thu, 06 Nov 2014 17:53:59 +1100 Date: Thu, 6 Nov 2014 17:53:59 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141106065359.GD23575@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <20141105060728.GE28565@dastard> <20141105063226.GF28565@dastard> <20141105131706.GB26724@bfoster.bfoster> <20141105212100.GG28565@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141105212100.GG28565@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1415256873 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11285 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 06, 2014 at 08:21:00AM +1100, Dave Chinner wrote: > On Wed, Nov 05, 2014 at 08:17:06AM -0500, Brian Foster wrote: > > On Wed, Nov 05, 2014 at 05:32:26PM +1100, Dave Chinner wrote: > > > OK, this looks like a problem with handling the last record in the > > > AGI btree: > > > > > > $ for i in `cat s.diff | grep "^+/" | sed -e 's/^+//'` ; do ls -i $i; done |sort -n > > > 163209114099 /mnt/scratch/2/dbc/5459605f~~~~~~~~RDJX8QBHPPMCGMD7YJQGYPD2 > > > .... > > > 163209114129 /mnt/scratch/2/dbc/5459605f~~~~~~~~U820IYQFKS8A6QYCC8HU3ZBX > > > 292057960758 /mnt/scratch/0/dcc/54596070~~~~~~~~9BUH5D5PZTGAC8BT1YL77OZ0 > > > ... > > > 292057960769 /mnt/scratch/0/dcc/54596070~~~~~~~~DAO78GAAFNUZU8PH7Q0UZNRH > > > 1395864555809 /mnt/scratch/1/e60/54596103~~~~~~~~GEMXGHYNREW409N7W9INBMVA > > > ..... > > > 1395864555841 /mnt/scratch/1/e60/54596103~~~~~~~~9XPK9FWHCE21AJ3EN023DU47 > > > 1653562593576 /mnt/scratch/5/e79/5459611c~~~~~~~~BSBZ6EUCT9HOIRQPMFZDVPQ5 > > > ..... > > > 1653562593601 /mnt/scratch/5/e79/5459611c~~~~~~~~6QY1SO8ZGGNQESAGXSB3G3DH > > > $ > > > > > > xfs_db> convert inode 163209114099 agno > > > 0x26 (38) > > > xfs_db> convert inode 163209114099 agino > > > 0x571f3 (356851) > > > xfs_db> convert inode 163209114129 agino > > > 0x57211 (356881) > > > xfs_db> agi 38 > > > xfs_db> a root > > > xfs_db> a ptrs[2] > > > xfs_db> p > > > .... > > > recs[1-234] = [startino,freecount,free] > > > ...... > > > 228:[356352,0,0] 229:[356416,0,0] 230:[356512,0,0] 231:[356576,0,0] > > > 232:[356672,0,0] 233:[356736,0,0] 234:[356832,14,0xfffc000000000000] > > > > > > So the first contiguous inode range they all fall into the partial final record > > > in the AG. > > > > > > xfs_db> convert inode 292057960758 agino > > > 0x2d136 (184630) > > > ..... > > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > > > Same. > > > > > > xfs_db> convert inode 1395864555809 agino > > > 0x2d121 (184609) > > > ..... > > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > > > Same. > > > > > > xfs_db> convert inode 1653562593576 agino > > > 0x2d128 (184616) > > > .... > > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > > > Same. > > > > > > So they are all falling into the last btree record in the AG, and so > > > appear to have been skipped as a result of the same issue. At least > > > that gives me something to look at. > > > > > > > Interesting, though just to note... is it possible this is related to > > records with free inodes? > > Oh, definitely possible - I haven't ruled that out yet. However, I > would have expected such an issue ot manifest itself during xfstests > (e.g. xfs/068) where random files are removed from the filesystem > and so leaving fre inodes in the inobt.... It's not. > > It also might be interesting to know whether this repeats without the > > last patch in the series. IIRC that one seemed to have the most > > potential impact on the overall algorithm (by changing loop iteration > > logic, etc.). Just a thought. > > I'll try that, but the missing files don't seem aligned to the And it's not that. THe issue, as I suspected was to do with end of AG handling, in a special corner case: the user buffer ran out of space part way through processing the last records in the AG. That is, we've scanned all the way to the end of the ag and records the inobt records into the temp buffer. As this runs off the end of the AG, it sets the end_of_ag flag. We then walk the temp buffer to format the inodes, and while doing so we run out of space before all the inodes are formatted. We then hit the loop termination, which does agno++; agino = 0; and then we hit the "user buffer full check". And so the cookie we pass back to userspace doesn't match the last inode we actually formatted, and so it skips a bunch of files in the dump. So, we have missing inodes in the dump. THe scary part about this is that the inodes are actually in the directory tree that xfsdump builds but it does not give any warnings that inodes weren't found during scan. And xfsrestore doesn't warn that entries in the directory tree didn't have any corresponding inode in the dump.... Hence I could look at the dump and find the path and inode number corresponding to one of the missing files, mark it for extraction and then extract it *successfully* but the file was not restored - it is actually missing from the dump.... Anyway, the bug was in patch 3 - we have to check whether the user buffer has space left before processing the end_of_ag state. I removed the buffer space check from the for() loop logic because it's just plain misleading and with the check in the formatter and the end of the main loop is entires redundant. I'll post the series again once I've confirmed a good dump and restore. Cheers, Dave. -- Dave Chinner david@fromorbit.com From alexander.tsvetkov@oracle.com Thu Nov 6 04:54:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 238167F3F for ; Thu, 6 Nov 2014 04:54:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1298A8F8033 for ; Thu, 6 Nov 2014 02:54:43 -0800 (PST) X-ASG-Debug-ID: 1415271279-04cbb00e673b980001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id DBY3543EuOUuLP48 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 02:54:39 -0800 (PST) X-Barracuda-Envelope-From: alexander.tsvetkov@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id sA6Ascqc006999 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 6 Nov 2014 10:54:39 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id sA6AsbtC018521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Thu, 6 Nov 2014 10:54:38 GMT Received: from abhmp0007.oracle.com (abhmp0007.oracle.com [141.146.116.13]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id sA6AsbeH019313 for ; Thu, 6 Nov 2014 10:54:37 GMT Received: from [10.162.81.248] (/10.162.81.248) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 06 Nov 2014 02:54:36 -0800 Message-ID: <545B541A.60800@oracle.com> Date: Thu, 06 Nov 2014 13:57:30 +0300 From: alexander.tsvetkov@oracle.com Organization: Oracle Corporation User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.8.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: scratch filesystem corruptions Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: scratch filesystem corruptions Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1415271279 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11290 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name Hello, I've noted that the enabling of scratch device post checks after xfstests commit "common: Check the file system consistency on SCRATCH_DEV" has started to show the scratch filesystem corruptions for the following tests runs: xfs/050,134,187,244,287. I have these corruptions reproduced with upstream linux kernel of version 3.15 and the latest xfsprogs/xfstests. Are these known issues? Thanks, Alexander Tsvetkov From info.3C77A8.CE9A8F5@pmta333.dedicated.bmsend.com Thu Nov 6 06:30:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 69ACE7F4E for ; Thu, 6 Nov 2014 06:30:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2B846304048 for ; Thu, 6 Nov 2014 04:30:50 -0800 (PST) X-ASG-Debug-ID: 1415277038-04bdf0650f4db00001-NocioJ Received: from pmta333.dedicated.bmsend.com (pmta333.dedicated.bmsend.com [216.4.238.164]) by cuda.sgi.com with ESMTP id jV3zSMOfcKyTmfLc for ; Thu, 06 Nov 2014 04:30:38 -0800 (PST) X-Barracuda-Envelope-From: info.3C77A8.CE9A8F5@pmta333.dedicated.bmsend.com X-Barracuda-Apparent-Source-IP: 216.4.238.164 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=bmdeda; d=pmta333.dedicated.bmsend.com; h=Reply-To:List-Unsubscribe:From:Sender:To:Subject:Date:MIME-Version:Content-Type; i=info@pmta333.dedicated.bmsend.com; bh=EXXrA9uiMF0YgnMQ43uHy7DCv0c=; b=E7mZ19Wfqank2X5pylN1DutpR3nHdqP8TpFv/vb7a+a3muuEhjwOJu+cS6zVotziOQCw2PxsAEhb QgEfWShtkz7giFVEuT6opFyB5E9dNT8ZyFtd7P3wySGvkA44rZ+Z7cBCFr+iDp0cR2mEti3Plzo5 sHJP0PsfEeLs6CoziEs= DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=bmdeda; d=pmta333.dedicated.bmsend.com; b=NjpXlxZZ87kivklmLsqaUdkz+RWfb+vFHwhZo+WpWA86o6xjpRaj6UzF8i0f42FvovDv+CT4bAZc Tk40PPqmvgbaXLzZSUgcC/4MzDYZrHl6VK7FH38E6aiGZ2iEmmBUYNR3DCnTxxVE+fWi1mzC6LXF RkirjNh7LzeyQHLDhgA=; Precedence: Bulk Reply-To: info@clarkbio.com X-Identify: <3962792_216639733@benchmarkemail.com> Feedback-ID: <453170:3962792:us:benchmarkemail> X-senderinfo: "Clark Bioscience" X-campaignid: 3962792 RemoveEmail: |unsub|g=0&c=3962792&l=216639733&e=xfs@oss.sgi.com&ver=2&SentFromServer=216.4.238.164 SentFromServer: 216.4.238.164 List-Unsubscribe: , From: "Clark Bioscience" Sender: "Clark Bioscience" To: "xfs@oss.sgi.com" Subject: The world No.1 mouse continuous ear tag applicator Date: Thu, 6 Nov 2014 07:30:23 -0500 X-ASG-Orig-Subj: The world No.1 mouse continuous ear tag applicator MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_415814885630919123023215" X-Barracuda-Connect: pmta333.dedicated.bmsend.com[216.4.238.164] X-Barracuda-Start-Time: 1415277038 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.34 X-Barracuda-Spam-Status: No, SCORE=0.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA038b Custom Rule SA038b Message-Id: <20141106123049.BB66BA42185@cuda.sgi.com> ------=_NextPart_415814885630919123023215 Content-type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable The world No=2E1 mouse continuous ear tag applicator=0A=0ACustomers:=0A=0A= Clark Bioscience is excited to introduce our SMART Tager! SMART Tager is = the world No=2E1 continuous ear tag applicator, which allows for continuo= us and fast application of ear tags to lab animals for the purpose of lab= eling, category and managementUnlike any other ear applicators, SMART Tag= er is specifically designed, built for continuous ear tagging=2E 1 single= load of ear tag strip is able to label 10 animals=2E Easy, Fast and Effi= cient!=0AOther marvelous products: One-step Quickcolor Mycoplasma, Exposu= re Marker=0A=0AFor more information, please click our website: www=2Eclar= kbio=2Ecom=0A=0ABest Regards,=0AClark Bioscience View this email in your browser:=20 http://clarkbio=2Ebmetrack=2Ecom/c/v=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5&e= mail=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 You are receiving this email because of your relationship with Clark Bios= cience=2E Please reconfirm Confirm URL : http://clarkbio=2Ebmetrack=2Ecom/c/opt=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5= &email=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 If you do not wish to receive any more emails, you can unsubscribe here= or report abuse http://clarkbio=2Ebmetrack=2Ecom/c/u=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5&e= mail=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 This message was sent to xfs@oss=2Esgi=2Ecom by info@clarkbio=2Ecom You can modify/update your subscription via the link below Unsubscribe from all mailings http://clarkbio=2Ebmetrack=2Ecom/c/su=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5&= email=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 Manage Subscription http://clarkbio=2Ebmetrack=2Ecom/c/s=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5&e= mail=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 Forward Email http://clarkbio=2Ebmetrack=2Ecom/c/f=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5&e= mail=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 Report Abuse http://clarkbio=2Ebmetrack=2Ecom/Abuse=3Fe=3D59F2E2&c=3D6EA32&l=3DCE9A8F5= &email=3DrbKU7zvvsXCRJ5WwqyPEyw%3D%3D&relid=3DA0B0EA4 Address: 800 E Leigh street, unit58, va biotech center Richmond, va, 23219, Richmond, va, 23219 ------=_NextPart_415814885630919123023215 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A=0A =0A The world No=2E1 mouse= continuous ear tag applicator=0A=0A =0A
=0A =20 =0A =0A Unable to read=EF= =BC=9F view web version=0A =0A =0A = =0A =0A =0A = =0A =0A =0A =0A =0A= =0A =0A =0A=09=09=0A =0A = =0A=09=09=0A=09=09=0A=09=09=0A=09=09= =0A =0A =0A= =09=09=0A=09=09=0A=09=09=0A= =09=09=0A=09=09=0A=09=09=0A=09=09=0A=09=09=0A 3D==0A =0A=09=09=0A=09= =09=0A=09=09=0A= =0A =0A= =0A
3D"Clar=

The world No=2E1 mouse continuous ear tag app= licator

3D"smart
=0A =

Customers:

=0A

Clark Bioscience is excited t= o introduce our SMART Tager! SMART Tager is the world No=2E1 continuous ear tag= applicator, which allows for continuous and fast application of ear tags= to lab animals for the purpose of labeling, category and management=2E <= /p>=0A

Unlike any other ear applicators, SMART Tager is= specifically designed, built for continuous ear tagging=2E 1 single load of ear tag strip is able to label 10 animals=2E Ea= sy, Fast and Efficient!

=0A

For more informat= ion, please click here or below pic to watch our guide video=2E

=0A =

Best Regards,
=0A Clark Bioscience

=0A

3D"SMART

=0A

=C2=A0

Other marvelous products

One-step Quickcolor Mycoplasma
3D=
=0A=09=09

One-step , one hour, judg by the naked eye, eas= y and fast! Designed to detect the presence of mycoplasmas in cell cultur= ed media or other liquid sample=2E =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0View More>>

=0A=09=09
Exposure Marker=
=0A=09=09

Design for facility western blot, which can con= veniently monitors the electrophoresis progress and directly visualize pr= otein standard bands=2E =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0View More>>

=0A=09=09
=0A Em= ail : info@clarkbio=2Ecom=C2=A0=C2=A0=C2= =A0=C2=A0Tel/Fax : =0A
=0A
=0A=0A
View this e= mail in your browser
You are receiving this email because of your relationship with Clar= k Bioscience=2E Please reconfirm your= interest in receiving email from us=2E If you do not wish to receive an= y more emails, you can unsubscribe here=

------=_NextPart_415814885630919123023215-- From bfoster@redhat.com Thu Nov 6 06:49:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C2187F51 for ; Thu, 6 Nov 2014 06:49:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD220AC008 for ; Thu, 6 Nov 2014 04:49:12 -0800 (PST) X-ASG-Debug-ID: 1415278151-04bdf0650e4e400001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id R6u6ovcygiJ8o5XB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 04:49:11 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA6Cn9fD004265 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 6 Nov 2014 07:49:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA6Cn9fW006430; Thu, 6 Nov 2014 07:49:09 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 47FC4122F87; Thu, 6 Nov 2014 07:49:08 -0500 (EST) Date: Thu, 6 Nov 2014 07:49:08 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141106124907.GA31429@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <20141105060728.GE28565@dastard> <20141105063226.GF28565@dastard> <20141105131706.GB26724@bfoster.bfoster> <20141105212100.GG28565@dastard> <20141106065359.GD23575@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141106065359.GD23575@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415278151 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Nov 06, 2014 at 05:53:59PM +1100, Dave Chinner wrote: > On Thu, Nov 06, 2014 at 08:21:00AM +1100, Dave Chinner wrote: > > On Wed, Nov 05, 2014 at 08:17:06AM -0500, Brian Foster wrote: > > > On Wed, Nov 05, 2014 at 05:32:26PM +1100, Dave Chinner wrote: > > > > OK, this looks like a problem with handling the last record in the > > > > AGI btree: > > > > > > > > $ for i in `cat s.diff | grep "^+/" | sed -e 's/^+//'` ; do ls -i $i; done |sort -n > > > > 163209114099 /mnt/scratch/2/dbc/5459605f~~~~~~~~RDJX8QBHPPMCGMD7YJQGYPD2 > > > > .... > > > > 163209114129 /mnt/scratch/2/dbc/5459605f~~~~~~~~U820IYQFKS8A6QYCC8HU3ZBX > > > > 292057960758 /mnt/scratch/0/dcc/54596070~~~~~~~~9BUH5D5PZTGAC8BT1YL77OZ0 > > > > ... > > > > 292057960769 /mnt/scratch/0/dcc/54596070~~~~~~~~DAO78GAAFNUZU8PH7Q0UZNRH > > > > 1395864555809 /mnt/scratch/1/e60/54596103~~~~~~~~GEMXGHYNREW409N7W9INBMVA > > > > ..... > > > > 1395864555841 /mnt/scratch/1/e60/54596103~~~~~~~~9XPK9FWHCE21AJ3EN023DU47 > > > > 1653562593576 /mnt/scratch/5/e79/5459611c~~~~~~~~BSBZ6EUCT9HOIRQPMFZDVPQ5 > > > > ..... > > > > 1653562593601 /mnt/scratch/5/e79/5459611c~~~~~~~~6QY1SO8ZGGNQESAGXSB3G3DH > > > > $ > > > > > > > > xfs_db> convert inode 163209114099 agno > > > > 0x26 (38) > > > > xfs_db> convert inode 163209114099 agino > > > > 0x571f3 (356851) > > > > xfs_db> convert inode 163209114129 agino > > > > 0x57211 (356881) > > > > xfs_db> agi 38 > > > > xfs_db> a root > > > > xfs_db> a ptrs[2] > > > > xfs_db> p > > > > .... > > > > recs[1-234] = [startino,freecount,free] > > > > ...... > > > > 228:[356352,0,0] 229:[356416,0,0] 230:[356512,0,0] 231:[356576,0,0] > > > > 232:[356672,0,0] 233:[356736,0,0] 234:[356832,14,0xfffc000000000000] > > > > > > > > So the first contiguous inode range they all fall into the partial final record > > > > in the AG. > > > > > > > > xfs_db> convert inode 292057960758 agino > > > > 0x2d136 (184630) > > > > ..... > > > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > > > > > Same. > > > > > > > > xfs_db> convert inode 1395864555809 agino > > > > 0x2d121 (184609) > > > > ..... > > > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > > > > > Same. > > > > > > > > xfs_db> convert inode 1653562593576 agino > > > > 0x2d128 (184616) > > > > .... > > > > 155:[184544,0,0] 156:[184608,30,0xfffffffc00000000] > > > > > > > > Same. > > > > > > > > So they are all falling into the last btree record in the AG, and so > > > > appear to have been skipped as a result of the same issue. At least > > > > that gives me something to look at. > > > > > > > > > > Interesting, though just to note... is it possible this is related to > > > records with free inodes? > > > > Oh, definitely possible - I haven't ruled that out yet. However, I > > would have expected such an issue ot manifest itself during xfstests > > (e.g. xfs/068) where random files are removed from the filesystem > > and so leaving fre inodes in the inobt.... > > It's not. > > > > It also might be interesting to know whether this repeats without the > > > last patch in the series. IIRC that one seemed to have the most > > > potential impact on the overall algorithm (by changing loop iteration > > > logic, etc.). Just a thought. > > > > I'll try that, but the missing files don't seem aligned to the > > And it's not that. > > THe issue, as I suspected was to do with end of AG handling, in a > special corner case: the user buffer ran out of space part way > through processing the last records in the AG. > > That is, we've scanned all the way to the end of the ag and records > the inobt records into the temp buffer. As this runs off the end of > the AG, it sets the end_of_ag flag. We then walk the temp > buffer to format the inodes, and while doing so we run out of space > before all the inodes are formatted. We then hit the loop > termination, which does agno++; agino = 0; and then we hit the > "user buffer full check". > Ok, so this is pretty much what I noted in the comments to the v2 6/6 (though not directly related to the changes in 6/6 I suppose). ;) > And so the cookie we pass back to userspace doesn't match the last > inode we actually formatted, and so it skips a bunch of files in the > dump. So, we have missing inodes in the dump. THe scary part about > this is that the inodes are actually in the directory tree that > xfsdump builds but it does not give any warnings that > inodes weren't found during scan. And xfsrestore doesn't warn that > entries in the directory tree didn't have any corresponding inode in > the dump.... > Yeah, that sounds scary. :/ > Hence I could look at the dump and find the path and inode number > corresponding to one of the missing files, mark it for extraction > and then extract it *successfully* but the file was not restored - > it is actually missing from the dump.... > > Anyway, the bug was in patch 3 - we have to check whether the user > buffer has space left before processing the end_of_ag state. I > removed the buffer space check from the for() loop logic because > it's just plain misleading and with the check in the formatter and > the end of the main loop is entires redundant. I'll post the series > again once I've confirmed a good dump and restore. > There's a simple test for that condition, as noted in my previous mail as well in case you missed it. Again, that probably calls out that we could be doing better unit testing of bulkstat in xfstests. At the very least we probably need some bulkstat inode count validation against a known data set. xfsdump testing is obviously important, but if bulkstat is broken then we clearly can't expect xfsdump to work (and debugging the former via the latter appears to be quite painful). Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Thu Nov 6 07:02:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 756A87F4E for ; Thu, 6 Nov 2014 07:02:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 54A428F8035 for ; Thu, 6 Nov 2014 05:02:22 -0800 (PST) X-ASG-Debug-ID: 1415278939-04bdf0650e4e9b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0MHqHcf9KgNvoYn6 for ; Thu, 06 Nov 2014 05:02:19 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgdLAO5vW1R5LbBUPGdsb2JhbABbgw6BLYI2tSoGlRaFawQCAoEeFwEBAQEBBgEBAQE4O4QCAQEBAwE6HCMFCwgDDgoJJQ8FJQMHGhOIOAjNVQEBAQEGAgEfGIYgiggBAU8Hgy2BHgWeE5pmKS+BCAcXBoEfAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:32:18 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmMhc-0007CY-H4; Fri, 07 Nov 2014 00:02:16 +1100 Date: Fri, 7 Nov 2014 00:02:16 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess Message-ID: <20141106130216.GE23575@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] xfs: fix the bulkstat mess References: <1415145921-31507-1-git-send-email-david@fromorbit.com> <20141105060728.GE28565@dastard> <20141105063226.GF28565@dastard> <20141105131706.GB26724@bfoster.bfoster> <20141105212100.GG28565@dastard> <20141106065359.GD23575@dastard> <20141106124907.GA31429@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141106124907.GA31429@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415278939 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11293 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 06, 2014 at 07:49:08AM -0500, Brian Foster wrote: > There's a simple test for that condition, as noted in my previous mail > as well in case you missed it. Again, that probably calls out that we > could be doing better unit testing of bulkstat in xfstests. At the very > least we probably need some bulkstat inode count validation against a > known data set. That's exactly what I've been running to find this latest problem. But a 500TB filesystem with 10 million inodes in it is a bit beyond xfstests. ANd that only showed up the problem in 4 AGs out of 500, so with smaller filesystems there's a good chance that this would have also been missed.... > xfsdump testing is obviously important, but if bulkstat > is broken then we clearly can't expect xfsdump to work (and debugging > the former via the latter appears to be quite painful). We have a bulkstat command in xfstests. And it can be used to comapre the output against a stat of the file. But it can't detect missing inodes and I don't think we can start at arbitrary inodes, either. So it needs work to be able to be used in unit tests. Cheers, Dave. -- Dave Chinner david@fromorbit.com From yguang11@outlook.com Thu Nov 6 07:03:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4D9E47F4E for ; Thu, 6 Nov 2014 07:03:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0DA8AC006 for ; Thu, 6 Nov 2014 05:03:47 -0800 (PST) X-ASG-Debug-ID: 1415279025-04cb6c1e6d42900001-NocioJ Received: from BLU004-OMC4S18.hotmail.com (blu004-omc4s18.hotmail.com [65.55.111.157]) by cuda.sgi.com with ESMTP id 7MKEHEJbZtatV0cy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 05:03:45 -0800 (PST) X-Barracuda-Envelope-From: yguang11@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.111.157 Received: from BLU175-W37 ([65.55.111.137]) by BLU004-OMC4S18.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Thu, 6 Nov 2014 05:03:45 -0800 X-TMN: [P/dKimUGg8hNmbv2cW9gEJ+BvEXere+s] X-Originating-Email: [yguang11@outlook.com] Message-ID: Content-Type: multipart/alternative; boundary="_defba118-9c79-4dd2-8eca-ac980294f36b_" From: GuangYang To: "xfs@oss.sgi.com" Subject: EIO and data corruption on XFS file system Date: Thu, 6 Nov 2014 13:03:45 +0000 X-ASG-Orig-Subj: EIO and data corruption on XFS file system Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 06 Nov 2014 13:03:45.0460 (UTC) FILETIME=[18F33F40:01CFF9C2] X-Barracuda-Connect: blu004-omc4s18.hotmail.com[65.55.111.157] X-Barracuda-Start-Time: 1415279025 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_defba118-9c79-4dd2-8eca-ac980294f36b_ Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 SGVsbG8sV2hpbGUgd29ya2luZyBvbiB0aGUgc3RvcmFnZSBzeXN0ZW0sIEkgZ290IG9uZSBxdWVz dGlvbiBpbiB0ZXJtcyBvZiB0aGUgWEZTIHV0aWxpdGllcyB0byBmaXggZmlsZSBzeXN0ZW0gY29y cnVwdGlvbi4gQmFzaWNhbGx5LCBvdXIgc3RvcmFnZSBzeXN0ZW0gcHV0IDMgY29waWVzIG9mIGRh dGEgYW5kIHRoZSBzeXN0ZW0gd291bGQgZGV0ZWN0IGRhdGEgaW5jb25zaXN0ZW5jeSBvbiByZWd1 bGFyIGJhc2lzLCB0aGVyZSBhcmUgdHdvIHBhdHRlcm5zIHdlIG9ic2VydmVkIHNvIGZhcjogMSkg dGhlIGRhdGEgaXMgY29ycnVwdGVkIHdoaWNoIHJlc3VsdCBpbiBhbiBFSU8sIDIpIGRhdGEgaXMg c3RpbGwgYWNjZXNzaWJsZSBidXQgdGhlIGNvbnRlbnQgaXMgY2hhbmdlZC4NCkkgYW0gd29uZGVy aW5nIHRoZSB3YXkgdG8gZml4IHN1Y2ggaXNzdWVzIGZyb20gZmlsZSBzeXN0ZW0ncyBwZXJzcGVj dGl2ZSwgZG8gd2UgZXhwZWN0IGhhcmR3YXJlIGZhaWx1cmUgZm9yIGJvdGggY2FzZXMgb3Igc29t ZSB4ZnMgcmVwYWlyaW5nIHRvb2xzIGNvdWxkIGhlbHAgZm9yIHN1Y2ggY2FzZT8NClRoYW5rcyxH dWFuZyAJCSAJICAgCQkgIA== --_defba118-9c79-4dd2-8eca-ac980294f36b_ Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: base64 PGh0bWw+DQo8aGVhZD4NCjxzdHlsZT48IS0tDQouaG1tZXNzYWdlIFANCnsNCm1hcmdpbjowcHg7 DQpwYWRkaW5nOjBweA0KfQ0KYm9keS5obW1lc3NhZ2UNCnsNCmZvbnQtc2l6ZTogMTJwdDsNCmZv bnQtZmFtaWx5Os6iyO3RxbraDQp9DQotLT48L3N0eWxlPjwvaGVhZD4NCjxib2R5IGNsYXNzPSdo bW1lc3NhZ2UnPjxkaXYgZGlyPSdsdHInPkhlbGxvLDxkaXY+V2hpbGUgd29ya2luZyBvbiB0aGUg c3RvcmFnZSBzeXN0ZW0sIEkgZ290IG9uZSBxdWVzdGlvbiBpbiB0ZXJtcyBvZiB0aGUgWEZTIHV0 aWxpdGllcyB0byBmaXggZmlsZSBzeXN0ZW0gY29ycnVwdGlvbi4gQmFzaWNhbGx5LCBvdXIgc3Rv cmFnZSBzeXN0ZW0gcHV0IDMgY29waWVzIG9mIGRhdGEgYW5kIHRoZSBzeXN0ZW0gd291bGQgZGV0 ZWN0IGRhdGEgaW5jb25zaXN0ZW5jeSBvbiByZWd1bGFyIGJhc2lzLCB0aGVyZSBhcmUgdHdvIHBh dHRlcm5zIHdlIG9ic2VydmVkIHNvIGZhcjogMSkgdGhlIGRhdGEgaXMgY29ycnVwdGVkIHdoaWNo IHJlc3VsdCBpbiBhbiBFSU8sIDIpIGRhdGEgaXMgc3RpbGwgYWNjZXNzaWJsZSBidXQgdGhlIGNv bnRlbnQgaXMgY2hhbmdlZC48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkkgYW0gd29uZGVyaW5n IHRoZSB3YXkgdG8gZml4IHN1Y2ggaXNzdWVzIGZyb20gZmlsZSBzeXN0ZW0ncyBwZXJzcGVjdGl2 ZSwgZG8gd2UgZXhwZWN0IGhhcmR3YXJlIGZhaWx1cmUgZm9yIGJvdGggY2FzZXMgb3Igc29tZSB4 ZnMgcmVwYWlyaW5nIHRvb2xzIGNvdWxkIGhlbHAgZm9yIHN1Y2ggY2FzZT88L2Rpdj48ZGl2Pjxi cj48L2Rpdj48ZGl2PlRoYW5rcyw8L2Rpdj48ZGl2Pkd1YW5nPC9kaXY+IAkJIAkgICAJCSAgPC9k aXY+PC9ib2R5Pg0KPC9odG1sPg== --_defba118-9c79-4dd2-8eca-ac980294f36b_-- From dave@fromorbit.com Thu Nov 6 07:15:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 21FE07F57 for ; Thu, 6 Nov 2014 07:15:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F25328F8033 for ; Thu, 6 Nov 2014 05:15:06 -0800 (PST) X-ASG-Debug-ID: 1415279704-04cb6c1e6a42fb0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id sYr6sD7LH0Bx1gNy for ; Thu, 06 Nov 2014 05:15:04 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AscQAHRzW1R5LbBUPGdsb2JhbABbgw65DwacJxcBAQEBAQYBAQEBODuEXzuBAgMHiG2oRKVDhjiKdoQ1BZ9Gg02TIQEBCAEBAQGCNymCegEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Es-Au for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002ZI-9Z for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/6 v3] xfs: fix the bulkstat mess Date: Fri, 7 Nov 2014 00:14:53 +1100 X-ASG-Orig-Subj: [PATCH 0/6 v3] xfs: fix the bulkstat mess Message-Id: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279704 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- HI folks, This is the third version of the bulkstat fixup series. This version fixes the end-of-ag, end-of-user-buffer bug that was causing inodes to be skipped. This passes all my ad hoc tests and xfstests, so please review and test so I can push this up to Linus ASAP. -Dave. From dave@fromorbit.com Thu Nov 6 07:15:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 44EF67F5E for ; Thu, 6 Nov 2014 07:15:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2506B304032 for ; Thu, 6 Nov 2014 05:15:09 -0800 (PST) X-ASG-Debug-ID: 1415279704-04cb6c1e6a42fb0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oOhQCytAHTOlS5Om for ; Thu, 06 Nov 2014 05:15:06 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuMQAHRzW1R5LbBUPGdsb2JhbABbgw6BLbdiBpwnFwEBAQEBBgEBAQE4O4QDAQVWMwgYMTkDBxQZiEDOB4Y4inaENQW2NAELKyCBbikvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Et-BP for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002ZL-AR for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Date: Fri, 7 Nov 2014 00:14:54 +1100 X-ASG-Orig-Subj: [PATCH 1/6] xfs: bulkstat btree walk doesn't terminate Message-Id: <1415279699-8739-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415279699-8739-1-git-send-email-david@fromorbit.com> References: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279706 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The bulkstat code has several different ways of detecting the end of an AG when doing a walk. They are not consistently detected, and the code that checks for the end of AG conditions is not consistently coded. Hence the are conditions where the walk code can get stuck in an endless loop making no progress and not triggering any termination conditions. Convert all the "tmp/i" status return codes from btree operations to a common name (stat) and apply end-of-ag detection to these operations consistently. cc: stable@vger.kernel.org Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 7765ff7..16737cb 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -356,7 +356,6 @@ xfs_bulkstat( int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ int fmterror;/* bulkstat formatter result */ - int i; /* loop index */ int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ xfs_ino_t ino; /* inode number (filesystem) */ @@ -366,11 +365,11 @@ xfs_bulkstat( xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ - int tmp; /* result value from btree calls */ int ubcount; /* size of user's buffer */ int ubleft; /* bytes left in user's buffer */ char __user *ubufp; /* pointer into user's buffer */ int ubelem; /* spaces used in user's buffer */ + int stat; /* * Get the last inode value, see if there's nothing to do. @@ -436,13 +435,15 @@ xfs_bulkstat( agino = r.ir_startino + XFS_INODES_PER_CHUNK; } /* Increment to the next record */ - error = xfs_btree_increment(cur, 0, &tmp); + error = xfs_btree_increment(cur, 0, &stat); } else { /* Start of ag. Lookup the first inode chunk */ - error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &tmp); + error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); } - if (error) + if (error || stat == 0) { + end_of_ag = 1; goto del_cursor; + } /* * Loop through inode btree records in this ag, @@ -451,8 +452,8 @@ xfs_bulkstat( while (irbp < irbufend && icount < ubcount) { struct xfs_inobt_rec_incore r; - error = xfs_inobt_get_rec(cur, &r, &i); - if (error || i == 0) { + error = xfs_inobt_get_rec(cur, &r, &stat); + if (error || stat == 0) { end_of_ag = 1; goto del_cursor; } @@ -473,8 +474,8 @@ xfs_bulkstat( * Set agino to after this chunk and bump the cursor. */ agino = r.ir_startino + XFS_INODES_PER_CHUNK; - error = xfs_btree_increment(cur, 0, &tmp); - if (error) { + error = xfs_btree_increment(cur, 0, &stat); + if (error || stat == 0) { end_of_ag = 1; goto del_cursor; } -- 2.0.0 From dave@fromorbit.com Thu Nov 6 07:15:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B587C7F62 for ; Thu, 6 Nov 2014 07:15:10 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95B9F8F8035 for ; Thu, 6 Nov 2014 05:15:10 -0800 (PST) X-ASG-Debug-ID: 1415279704-04cb6c1e6a42fb0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id I7YIEq2P4NFzQfc2 for ; Thu, 06 Nov 2014 05:15:08 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuQQAHRzW1R5LbBUPGdsb2JhbABbgw6BLbdiBpwnFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAzgeGOI8rBYY3r30BC4I5KS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Ex-DK for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002Zf-CQ for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: bulkstat error handling is broken Date: Fri, 7 Nov 2014 00:14:58 +1100 X-ASG-Orig-Subj: [PATCH 5/6] xfs: bulkstat error handling is broken Message-Id: <1415279699-8739-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415279699-8739-1-git-send-email-david@fromorbit.com> References: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279708 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The error propagation is a horror - xfs_bulkstat() returns a rval variable which is only set if there are formatter errors. Any sort of btree walk error or corruption will cause the bulkstat walk to terminate but will not pass an error back to userspace. Worse is the fact that formatter errors will also be ignored if any inodes were correctly formatted into the user buffer. Hence bulkstat can fail badly yet still report success to userspace. This causes significant issues with xfsdump not dumping everything in the filesystem yet reporting success. It's not until a restore fails that there is any indication that the dump was bad and tha bulkstat failed. This patch now triggers xfsdump to fail with bulkstat errors rather than silently missing files in the dump. This now causes bulkstat to fail when the lastino cookie does not fall inside an existing inode chunk. The pre-3.17 code tolerated that error by allowing the code to move to the next inode chunk as the agino target is guaranteed to fall into the next btree record. With the fixes up to this point in the series, xfsdump now passes on the troublesome filesystem image that exposes all these bugs. cc: Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index acae335..ff3f431 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -236,8 +236,10 @@ xfs_bulkstat_grab_ichunk( XFS_WANT_CORRUPTED_RETURN(stat == 1); /* Check if the record contains the inode in request */ - if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) - return -EINVAL; + if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino) { + *icount = 0; + return 0; + } idx = agino - irec->ir_startino + 1; if (idx < XFS_INODES_PER_CHUNK && @@ -352,7 +354,6 @@ xfs_bulkstat( xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ - int rval; /* return value error code */ int ubcount; /* size of user's buffer */ struct xfs_bulkstat_agichunk ac; int error = 0; @@ -388,7 +389,6 @@ xfs_bulkstat( * Loop over the allocation groups, starting from the last * inode returned; 0 means start of the allocation group. */ - rval = 0; while (agno < mp->m_sb.sb_agcount) { struct xfs_inobt_rec_incore *irbp = irbuf; struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; @@ -491,13 +491,16 @@ del_cursor: formatter, statstruct_size, &ac, &lastino); if (error) - rval = error; + break; cond_resched(); } - /* If we've run out of space, we are done */ - if (ac.ac_ubleft < statstruct_size) + /* + * If we've run out of space or had a formatting error, we + * are now done + */ + if (ac.ac_ubleft < statstruct_size || error) break; if (end_of_ag) { @@ -511,11 +514,17 @@ del_cursor: */ kmem_free(irbuf); *ubcountp = ac.ac_ubelem; + /* - * Found some inodes, return them now and return the error next time. + * We found some inodes, so clear the error status and return them. + * The lastino pointer will point directly at the inode that triggered + * any error that occurred, so on the next call the error will be + * triggered again and propagated to userspace as there will be no + * formatted inodes in the buffer. */ if (ac.ac_ubelem) - rval = 0; + error = 0; + if (agno >= mp->m_sb.sb_agcount) { /* * If we ran out of filesystem, mark lastino as off @@ -527,7 +536,7 @@ del_cursor: } else *lastinop = (xfs_ino_t)lastino; - return rval; + return error; } int -- 2.0.0 From dave@fromorbit.com Thu Nov 6 07:15:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A1ACB7F6A for ; Thu, 6 Nov 2014 07:15:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 906AD8F8035 for ; Thu, 6 Nov 2014 05:15:12 -0800 (PST) X-ASG-Debug-ID: 1415279709-04cbb00e673f170001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uW5QkrLvTOdGfpNu for ; Thu, 06 Nov 2014 05:15:09 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuQQAHRzW1R5LbBUPGdsb2JhbABbgw6BLbdiBpwnFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAzgeGOI8rBYY3r30BCysggW4pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Eu-Bx for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002ZQ-Av for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Date: Fri, 7 Nov 2014 00:14:55 +1100 X-ASG-Orig-Subj: [PATCH 2/6] xfs: bulkstat chunk formatting cursor is broken Message-Id: <1415279699-8739-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415279699-8739-1-git-send-email-david@fromorbit.com> References: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279709 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11293 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The xfs_bulkstat_agichunk formatting cursor takes buffer values from the main loop and passes them via the structure to the chunk formatter, and the writes the changed values back into the main loop local variables. Unfortunately, this complex dance is full of corner cases that aren't handled correctly. The biggest problem is that it is double handling the information in both the main loop and the chunk formatting function, leading to inconsistent updates and endless loops where progress is not made. To fix this, push the struct xfs_bulkstat_agichunk outwards to be the primary holder of user buffer information. this removes the double handling in the main loop. Also, pass the last inode processed by the chunk formatter as a separate parameter as it purely an output variable and is not related to the user buffer consumption cursor. Finally, the chunk formatting code is not shared by anyone, so make it local to xfs_itable.c. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 59 +++++++++++++++++++++++++---------------------------- fs/xfs/xfs_itable.h | 16 --------------- 2 files changed, 28 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 16737cb..50a3e59 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -262,20 +262,26 @@ xfs_bulkstat_grab_ichunk( #define XFS_BULKSTAT_UBLEFT(ubleft) ((ubleft) >= statstruct_size) +struct xfs_bulkstat_agichunk { + char __user **ac_ubuffer;/* pointer into user's buffer */ + int ac_ubleft; /* bytes left in user's buffer */ + int ac_ubelem; /* spaces used in user's buffer */ +}; + /* * Process inodes in chunk with a pointer to a formatter function * that will iget the inode and fill in the appropriate structure. */ -int +static int xfs_bulkstat_ag_ichunk( struct xfs_mount *mp, xfs_agnumber_t agno, struct xfs_inobt_rec_incore *irbp, bulkstat_one_pf formatter, size_t statstruct_size, - struct xfs_bulkstat_agichunk *acp) + struct xfs_bulkstat_agichunk *acp, + xfs_ino_t *lastino) { - xfs_ino_t lastino = acp->ac_lastino; char __user **ubufp = acp->ac_ubuffer; int ubleft = acp->ac_ubleft; int ubelem = acp->ac_ubelem; @@ -295,7 +301,7 @@ xfs_bulkstat_ag_ichunk( /* Skip if this inode is free */ if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - lastino = ino; + *lastino = ino; continue; } @@ -313,7 +319,7 @@ xfs_bulkstat_ag_ichunk( ubleft = 0; break; } - lastino = ino; + *lastino = ino; continue; } if (fmterror == BULKSTAT_RV_GIVEUP) { @@ -325,10 +331,9 @@ xfs_bulkstat_ag_ichunk( *ubufp += ubused; ubleft -= ubused; ubelem++; - lastino = ino; + *lastino = ino; } - acp->ac_lastino = lastino; acp->ac_ubleft = ubleft; acp->ac_ubelem = ubelem; @@ -355,7 +360,6 @@ xfs_bulkstat( xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ int end_of_ag; /* set if we've seen the ag end */ int error; /* error code */ - int fmterror;/* bulkstat formatter result */ int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ xfs_ino_t ino; /* inode number (filesystem) */ @@ -366,10 +370,8 @@ xfs_bulkstat( int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int ubcount; /* size of user's buffer */ - int ubleft; /* bytes left in user's buffer */ - char __user *ubufp; /* pointer into user's buffer */ - int ubelem; /* spaces used in user's buffer */ int stat; + struct xfs_bulkstat_agichunk ac; /* * Get the last inode value, see if there's nothing to do. @@ -386,11 +388,13 @@ xfs_bulkstat( } ubcount = *ubcountp; /* statstruct's */ - ubleft = ubcount * statstruct_size; /* bytes */ - *ubcountp = ubelem = 0; + ac.ac_ubuffer = &ubuffer; + ac.ac_ubleft = ubcount * statstruct_size; /* bytes */; + ac.ac_ubelem = 0; + + *ubcountp = 0; *done = 0; - fmterror = 0; - ubufp = ubuffer; + irbuf = kmem_zalloc_greedy(&irbsize, PAGE_SIZE, PAGE_SIZE * 4); if (!irbuf) return -ENOMEM; @@ -402,7 +406,7 @@ xfs_bulkstat( * inode returned; 0 means start of the allocation group. */ rval = 0; - while (XFS_BULKSTAT_UBLEFT(ubleft) && agno < mp->m_sb.sb_agcount) { + while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { cond_resched(); error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) @@ -497,28 +501,21 @@ del_cursor: */ irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ubleft); irbp++) { - struct xfs_bulkstat_agichunk ac; - - ac.ac_lastino = lastino; - ac.ac_ubuffer = &ubuffer; - ac.ac_ubleft = ubleft; - ac.ac_ubelem = ubelem; + irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); + irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, - formatter, statstruct_size, &ac); + formatter, statstruct_size, &ac, + &lastino); if (error) rval = error; - lastino = ac.ac_lastino; - ubleft = ac.ac_ubleft; - ubelem = ac.ac_ubelem; - cond_resched(); } + /* * Set up for the next loop iteration. */ - if (XFS_BULKSTAT_UBLEFT(ubleft)) { + if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { if (end_of_ag) { agno++; agino = 0; @@ -531,11 +528,11 @@ del_cursor: * Done, we're either out of filesystem or space to put the data. */ kmem_free(irbuf); - *ubcountp = ubelem; + *ubcountp = ac.ac_ubelem; /* * Found some inodes, return them now and return the error next time. */ - if (ubelem) + if (ac.ac_ubelem) rval = 0; if (agno >= mp->m_sb.sb_agcount) { /* diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index aaed080..6ea8b39 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h @@ -30,22 +30,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp, int *ubused, int *stat); -struct xfs_bulkstat_agichunk { - xfs_ino_t ac_lastino; /* last inode returned */ - char __user **ac_ubuffer;/* pointer into user's buffer */ - int ac_ubleft; /* bytes left in user's buffer */ - int ac_ubelem; /* spaces used in user's buffer */ -}; - -int -xfs_bulkstat_ag_ichunk( - struct xfs_mount *mp, - xfs_agnumber_t agno, - struct xfs_inobt_rec_incore *irbp, - bulkstat_one_pf formatter, - size_t statstruct_size, - struct xfs_bulkstat_agichunk *acp); - /* * Values for stat return value. */ -- 2.0.0 From dave@fromorbit.com Thu Nov 6 07:15:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1D4547F6A for ; Thu, 6 Nov 2014 07:15:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C4758F8035 for ; Thu, 6 Nov 2014 05:15:13 -0800 (PST) X-ASG-Debug-ID: 1415279706-04cbb00e683f170001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qHhWclrp8nlhJC5G for ; Thu, 06 Nov 2014 05:15:07 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuQQAHRzW1R5LbBUPGdsb2JhbABbgw6BLbdiBpwnFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAzgeGOI8rBYY3mQ+NdIh6AQsrIIFuKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Ey-EA for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002Zk-Cq for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: track bulkstat progress by agino Date: Fri, 7 Nov 2014 00:14:59 +1100 X-ASG-Orig-Subj: [PATCH 6/6] xfs: track bulkstat progress by agino Message-Id: <1415279699-8739-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415279699-8739-1-git-send-email-david@fromorbit.com> References: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279706 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11293 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The bulkstat main loop progress is tracked by the "lastino" variable, which is a full 64 bit inode. However, the loop actually works on agno/agino pairs, and so there's a significant disconnect between the rest of the loop and the main cursor. Convert this to use the agino, and pass the agino into the chunk formatting function and convert it too. This gets rid of the inconsistency in the loop processing, and finally makes it simple for us to skip inodes at any point in the loop simply by incrementing the agino cursor. Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 68 ++++++++++++++++++++++++++--------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index ff3f431..05e83a6 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -282,30 +282,31 @@ xfs_bulkstat_ag_ichunk( bulkstat_one_pf formatter, size_t statstruct_size, struct xfs_bulkstat_agichunk *acp, - xfs_ino_t *lastino) + xfs_agino_t *last_agino) { char __user **ubufp = acp->ac_ubuffer; int chunkidx; int error = 0; - xfs_agino_t agino; + xfs_agino_t agino = irbp->ir_startino; - agino = irbp->ir_startino; for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; chunkidx++, agino++) { int fmterror; int ubused; - xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); + + /* inode won't fit in buffer, we are done */ + if (acp->ac_ubleft < statstruct_size) + break; /* Skip if this inode is free */ - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { - *lastino = ino; + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) continue; - } /* Get the inode and fill in a single buffer */ ubused = statstruct_size; - error = formatter(mp, ino, *ubufp, acp->ac_ubleft, - &ubused, &fmterror); + error = formatter(mp, XFS_AGINO_TO_INO(mp, agno, agino), + *ubufp, acp->ac_ubleft, &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_GIVEUP || (error && error != -ENOENT && error != -EINVAL)) { acp->ac_ubleft = 0; @@ -315,7 +316,6 @@ xfs_bulkstat_ag_ichunk( /* be careful not to leak error if at end of chunk */ if (fmterror == BULKSTAT_RV_NOTHING || error) { - *lastino = ino; error = 0; continue; } @@ -323,12 +323,18 @@ xfs_bulkstat_ag_ichunk( *ubufp += ubused; acp->ac_ubleft -= ubused; acp->ac_ubelem++; - *lastino = ino; - - if (acp->ac_ubleft < statstruct_size) - break; } + /* + * Post-update *last_agino. At this point, agino will always point one + * inode past the last inode we processed successfully. Hence we + * substract that inode when setting the *last_agino cursor so that we + * return the correct cookie to userspace. On the next bulkstat call, + * the inode under the lastino cookie will be skipped as we have already + * processed it here. + */ + *last_agino = agino - 1; + return error; } @@ -352,7 +358,6 @@ xfs_bulkstat( xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ size_t irbsize; /* size of irec buffer in bytes */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int ubcount; /* size of user's buffer */ struct xfs_bulkstat_agichunk ac; @@ -361,11 +366,10 @@ xfs_bulkstat( /* * Get the last inode value, see if there's nothing to do. */ - lastino = *lastinop; - agno = XFS_INO_TO_AGNO(mp, lastino); - agino = XFS_INO_TO_AGINO(mp, lastino); + agno = XFS_INO_TO_AGNO(mp, *lastinop); + agino = XFS_INO_TO_AGINO(mp, *lastinop); if (agno >= mp->m_sb.sb_agcount || - lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) { *done = 1; *ubcountp = 0; return 0; @@ -420,7 +424,6 @@ xfs_bulkstat( irbp->ir_freecount = r.ir_freecount; irbp->ir_free = r.ir_free; irbp++; - agino = r.ir_startino + XFS_INODES_PER_CHUNK; } /* Increment to the next record */ error = xfs_btree_increment(cur, 0, &stat); @@ -461,7 +464,6 @@ xfs_bulkstat( /* * Set agino to after this chunk and bump the cursor. */ - agino = r.ir_startino + XFS_INODES_PER_CHUNK; error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { end_of_ag = true; @@ -481,7 +483,9 @@ del_cursor: if (error) break; /* - * Now format all the good inodes into the user's buffer. + * Now format all the good inodes into the user's buffer. The + * call to xfs_bulkstat_ag_ichunk() sets up the agino pointer + * for the next loop iteration. */ irbufend = irbp; for (irbp = irbuf; @@ -489,7 +493,7 @@ del_cursor: irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac, - &lastino); + &agino); if (error) break; @@ -506,8 +510,7 @@ del_cursor: if (end_of_ag) { agno++; agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); + } } /* * Done, we're either out of filesystem or space to put the data. @@ -525,16 +528,13 @@ del_cursor: if (ac.ac_ubelem) error = 0; - if (agno >= mp->m_sb.sb_agcount) { - /* - * If we ran out of filesystem, mark lastino as off - * the end of the filesystem, so the next call - * will return immediately. - */ - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); + /* + * If we ran out of filesystem, lastino will point off the end of + * the filesystem so the next call will return immediately. + */ + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); + if (agno >= mp->m_sb.sb_agcount) *done = 1; - } else - *lastinop = (xfs_ino_t)lastino; return error; } -- 2.0.0 From dave@fromorbit.com Thu Nov 6 07:15:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 725EE7F6A for ; Thu, 6 Nov 2014 07:15:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 618CC8F8037 for ; Thu, 6 Nov 2014 05:15:13 -0800 (PST) X-ASG-Debug-ID: 1415279704-04cb6c1e6a42fb0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 1A9WCucc2q4V7J71 for ; Thu, 06 Nov 2014 05:15:10 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuQQAHRzW1R5LbBUPGdsb2JhbABbgw6BLbdiBpwnFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAzgeGOI8rBYY3mQ+NdIh6AQuCOSkvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Ev-CS for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002ZV-BU for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Date: Fri, 7 Nov 2014 00:14:56 +1100 X-ASG-Orig-Subj: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-Id: <1415279699-8739-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415279699-8739-1-git-send-email-david@fromorbit.com> References: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279709 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The loop construct has issues: - clustidx is completely unused, so remove it. - the loop tries to be smart by terminating when the "freecount" tells it that all inodes are free. Just drop it as in most cases we have to scan all inodes in the chunk anyway. - move the "user buffer left" condition check to the only point where we consume space int eh user buffer. - move the initialisation of agino out of the loop, leaving just a simple loop control logic using the clusteridx. Also, double handling of the user buffer variables leads to problems tracking the current state - use the cursor variables directly rather than keeping local copies and then having to update the cursor before returning. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_itable.c | 58 ++++++++++++++++++++++------------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 50a3e59..7ea2b11 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -283,59 +283,49 @@ xfs_bulkstat_ag_ichunk( xfs_ino_t *lastino) { char __user **ubufp = acp->ac_ubuffer; - int ubleft = acp->ac_ubleft; - int ubelem = acp->ac_ubelem; - int chunkidx, clustidx; + int chunkidx; int error = 0; xfs_agino_t agino; - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; - XFS_BULKSTAT_UBLEFT(ubleft) && - irbp->ir_freecount < XFS_INODES_PER_CHUNK; - chunkidx++, clustidx++, agino++) { - int fmterror; /* bulkstat formatter result */ + agino = irbp->ir_startino; + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; + chunkidx++, agino++) { + int fmterror; int ubused; xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); - /* Skip if this inode is free */ if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { *lastino = ino; continue; } - /* - * Count used inodes as free so we can tell when the - * chunk is used up. - */ - irbp->ir_freecount++; - /* Get the inode and fill in a single buffer */ ubused = statstruct_size; - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); - if (fmterror == BULKSTAT_RV_NOTHING) { - if (error && error != -ENOENT && error != -EINVAL) { - ubleft = 0; - break; - } - *lastino = ino; - continue; - } - if (fmterror == BULKSTAT_RV_GIVEUP) { - ubleft = 0; + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, + &ubused, &fmterror); + if (fmterror == BULKSTAT_RV_GIVEUP || + (error && error != -ENOENT && error != -EINVAL)) { + acp->ac_ubleft = 0; ASSERT(error); break; } - if (*ubufp) - *ubufp += ubused; - ubleft -= ubused; - ubelem++; + + /* be careful not to leak error if at end of chunk */ + if (fmterror == BULKSTAT_RV_NOTHING || error) { + *lastino = ino; + error = 0; + continue; + } + + *ubufp += ubused; + acp->ac_ubleft -= ubused; + acp->ac_ubelem++; *lastino = ino; - } - acp->ac_ubleft = ubleft; - acp->ac_ubelem = ubelem; + if (acp->ac_ubleft < statstruct_size) + break; + } return error; } -- 2.0.0 From dave@fromorbit.com Thu Nov 6 07:15:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C0CC77F6A for ; Thu, 6 Nov 2014 07:15:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A17EC304048 for ; Thu, 6 Nov 2014 05:15:13 -0800 (PST) X-ASG-Debug-ID: 1415279709-04cbb00e673f170002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0tgH0cFfLTdDtbOF for ; Thu, 06 Nov 2014 05:15:11 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuQQAHRzW1R5LbBUPGdsb2JhbABbgw6BLbdiBpwnFwEBAQEBBgEBAQE4O4QDAQUnLzMIGDE5AwcUGYhAzgeGOI8rBYY3r30BCysggW4pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Nov 2014 23:45:03 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XmMty-0007Ew-Cs for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XmMty-0002Za-By for xfs@oss.sgi.com; Fri, 07 Nov 2014 00:15:02 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Date: Fri, 7 Nov 2014 00:14:57 +1100 X-ASG-Orig-Subj: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Message-Id: <1415279699-8739-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1415279699-8739-1-git-send-email-david@fromorbit.com> References: <1415279699-8739-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415279711 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11293 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are a bunch of variables tha tare more wildy scoped than they need to be, obfuscated user buffer checks and tortured "next inode" tracking. This all needs cleaning up to expose the real issues that need fixing. cc: Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_itable.c | 56 +++++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 7ea2b11..acae335 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -348,30 +348,23 @@ xfs_bulkstat( xfs_agino_t agino; /* inode # in allocation group */ xfs_agnumber_t agno; /* allocation group number */ xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ - int end_of_ag; /* set if we've seen the ag end */ - int error; /* error code */ - int icount; /* count of inodes good in irbuf */ size_t irbsize; /* size of irec buffer in bytes */ - xfs_ino_t ino; /* inode number (filesystem) */ - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ xfs_ino_t lastino; /* last inode number returned */ int nirbuf; /* size of irbuf */ int rval; /* return value error code */ int ubcount; /* size of user's buffer */ - int stat; struct xfs_bulkstat_agichunk ac; + int error = 0; /* * Get the last inode value, see if there's nothing to do. */ - ino = (xfs_ino_t)*lastinop; - lastino = ino; - agno = XFS_INO_TO_AGNO(mp, ino); - agino = XFS_INO_TO_AGINO(mp, ino); + lastino = *lastinop; + agno = XFS_INO_TO_AGNO(mp, lastino); + agino = XFS_INO_TO_AGINO(mp, lastino); if (agno >= mp->m_sb.sb_agcount || - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { *done = 1; *ubcountp = 0; return 0; @@ -396,8 +389,13 @@ xfs_bulkstat( * inode returned; 0 means start of the allocation group. */ rval = 0; - while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { - cond_resched(); + while (agno < mp->m_sb.sb_agcount) { + struct xfs_inobt_rec_incore *irbp = irbuf; + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; + bool end_of_ag = false; + int icount = 0; + int stat; + error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); if (error) break; @@ -407,10 +405,6 @@ xfs_bulkstat( */ cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, XFS_BTNUM_INO); - irbp = irbuf; - irbufend = irbuf + nirbuf; - end_of_ag = 0; - icount = 0; if (agino > 0) { /* * In the middle of an allocation group, we need to get @@ -435,7 +429,7 @@ xfs_bulkstat( error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); } if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } @@ -448,7 +442,7 @@ xfs_bulkstat( error = xfs_inobt_get_rec(cur, &r, &stat); if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } @@ -470,7 +464,7 @@ xfs_bulkstat( agino = r.ir_startino + XFS_INODES_PER_CHUNK; error = xfs_btree_increment(cur, 0, &stat); if (error || stat == 0) { - end_of_ag = 1; + end_of_ag = true; goto del_cursor; } cond_resched(); @@ -491,7 +485,7 @@ del_cursor: */ irbufend = irbp; for (irbp = irbuf; - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); + irbp < irbufend && ac.ac_ubleft >= statstruct_size; irbp++) { error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, formatter, statstruct_size, &ac, @@ -502,17 +496,15 @@ del_cursor: cond_resched(); } - /* - * Set up for the next loop iteration. - */ - if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { - if (end_of_ag) { - agno++; - agino = 0; - } else - agino = XFS_INO_TO_AGINO(mp, lastino); - } else + /* If we've run out of space, we are done */ + if (ac.ac_ubleft < statstruct_size) break; + + if (end_of_ag) { + agno++; + agino = 0; + } else + agino = XFS_INO_TO_AGINO(mp, lastino); } /* * Done, we're either out of filesystem or space to put the data. -- 2.0.0 From eflorac@intellique.com Thu Nov 6 08:27:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B7F17F55 for ; Thu, 6 Nov 2014 08:27:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39A73304043 for ; Thu, 6 Nov 2014 06:27:56 -0800 (PST) X-ASG-Debug-ID: 1415284059-04cb6c1e6a464a0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id 9ili2qyfv2EzmDAN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 06:27:39 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 55BF93153C; Thu, 6 Nov 2014 09:27:39 -0500 (EST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 73806314EC; Thu, 6 Nov 2014 09:27:38 -0500 (EST) Date: Thu, 6 Nov 2014 15:27:41 +0100 From: Emmanuel Florac To: GuangYang Cc: "xfs@oss.sgi.com" Subject: Re: EIO and data corruption on XFS file system Message-ID: <20141106152741.2655245d@harpe.intellique.com> X-ASG-Orig-Subj: Re: EIO and data corruption on XFS file system In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.10.1 (GTK+ 2.24.20; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1415284059 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11294 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b Le Thu, 6 Nov 2014 13:03:45 +0000 GuangYang =C3=A9crivait: > Hello,While working on the storage system, I got one question in > terms of the XFS utilities to fix file system corruption. Basically, > our storage system put 3 copies of data and the system would detect > data inconsistency on regular basis, there are two patterns we > observed so far: 1) the data is corrupted which result in an EIO, 2) > data is still accessible but the content is changed. I am wondering > the way to fix such issues from file system's perspective, do we > expect hardware failure for both cases or some xfs repairing tools > could help for such case? XFS relies on the underlying hardware to maintain data integrity. The latest XFS version comes with metadata checksums, which allows correcting invalid data in filesystem structures, but not data. Generally speaking, if the data is corrupted because of faulty hardware, xfs_repair can't help. regards, --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From bfoster@redhat.com Thu Nov 6 10:32:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E49A57F3F for ; Thu, 6 Nov 2014 10:32:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 723DDAC006 for ; Thu, 6 Nov 2014 08:32:06 -0800 (PST) X-ASG-Debug-ID: 1415291524-04cb6c1e6b4caf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xP889X1TwDWdNSP0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 08:32:05 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA6GVu4o017905 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 6 Nov 2014 11:31:56 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA6GVtrZ024124; Thu, 6 Nov 2014 11:31:55 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9890A122F87; Thu, 6 Nov 2014 11:31:54 -0500 (EST) Date: Thu, 6 Nov 2014 11:31:54 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues Message-ID: <20141106163152.GB31429@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: bulkstat chunk-formatter has issues References: <1415279699-8739-1-git-send-email-david@fromorbit.com> <1415279699-8739-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415279699-8739-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415291524 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 07, 2014 at 12:14:56AM +1100, Dave Chinner wrote: > From: Dave Chinner > > The loop construct has issues: > - clustidx is completely unused, so remove it. > - the loop tries to be smart by terminating when the > "freecount" tells it that all inodes are free. Just drop > it as in most cases we have to scan all inodes in the > chunk anyway. > - move the "user buffer left" condition check to the only > point where we consume space int eh user buffer. > - move the initialisation of agino out of the loop, leaving > just a simple loop control logic using the clusteridx. > > Also, double handling of the user buffer variables leads to problems > tracking the current state - use the cursor variables directly > rather than keeping local copies and then having to update the > cursor before returning. > > cc: > Signed-off-by: Dave Chinner > --- FYI, this looks exactly like the previous version. That seems fine because we still handle lastino separately from agino at this point. Reviewed-by: Brian Foster > fs/xfs/xfs_itable.c | 58 ++++++++++++++++++++++------------------------------- > 1 file changed, 24 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 50a3e59..7ea2b11 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -283,59 +283,49 @@ xfs_bulkstat_ag_ichunk( > xfs_ino_t *lastino) > { > char __user **ubufp = acp->ac_ubuffer; > - int ubleft = acp->ac_ubleft; > - int ubelem = acp->ac_ubelem; > - int chunkidx, clustidx; > + int chunkidx; > int error = 0; > xfs_agino_t agino; > > - for (agino = irbp->ir_startino, chunkidx = clustidx = 0; > - XFS_BULKSTAT_UBLEFT(ubleft) && > - irbp->ir_freecount < XFS_INODES_PER_CHUNK; > - chunkidx++, clustidx++, agino++) { > - int fmterror; /* bulkstat formatter result */ > + agino = irbp->ir_startino; > + for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > + chunkidx++, agino++) { > + int fmterror; > int ubused; > xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > > - ASSERT(chunkidx < XFS_INODES_PER_CHUNK); > - > /* Skip if this inode is free */ > if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > *lastino = ino; > continue; > } > > - /* > - * Count used inodes as free so we can tell when the > - * chunk is used up. > - */ > - irbp->ir_freecount++; > - > /* Get the inode and fill in a single buffer */ > ubused = statstruct_size; > - error = formatter(mp, ino, *ubufp, ubleft, &ubused, &fmterror); > - if (fmterror == BULKSTAT_RV_NOTHING) { > - if (error && error != -ENOENT && error != -EINVAL) { > - ubleft = 0; > - break; > - } > - *lastino = ino; > - continue; > - } > - if (fmterror == BULKSTAT_RV_GIVEUP) { > - ubleft = 0; > + error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > + &ubused, &fmterror); > + if (fmterror == BULKSTAT_RV_GIVEUP || > + (error && error != -ENOENT && error != -EINVAL)) { > + acp->ac_ubleft = 0; > ASSERT(error); > break; > } > - if (*ubufp) > - *ubufp += ubused; > - ubleft -= ubused; > - ubelem++; > + > + /* be careful not to leak error if at end of chunk */ > + if (fmterror == BULKSTAT_RV_NOTHING || error) { > + *lastino = ino; > + error = 0; > + continue; > + } > + > + *ubufp += ubused; > + acp->ac_ubleft -= ubused; > + acp->ac_ubelem++; > *lastino = ino; > - } > > - acp->ac_ubleft = ubleft; > - acp->ac_ubelem = ubelem; > + if (acp->ac_ubleft < statstruct_size) > + break; > + } > > return error; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Nov 6 10:32:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7AEF27F51 for ; Thu, 6 Nov 2014 10:32:14 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 68F978F8033 for ; Thu, 6 Nov 2014 08:32:11 -0800 (PST) X-ASG-Debug-ID: 1415291530-04cb6c1e6a4cb00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id h5CDzDYqGBHHFWox (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 08:32:10 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA6GW8bB023659 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 6 Nov 2014 11:32:08 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA6GW8bU014076; Thu, 6 Nov 2014 11:32:08 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2F95B122F87; Thu, 6 Nov 2014 11:32:07 -0500 (EST) Date: Thu, 6 Nov 2014 11:32:07 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: bulkstat main loop logic is a mess Message-ID: <20141106163206.GC31429@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: bulkstat main loop logic is a mess References: <1415279699-8739-1-git-send-email-david@fromorbit.com> <1415279699-8739-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415279699-8739-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415291530 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 07, 2014 at 12:14:57AM +1100, Dave Chinner wrote: > From: Dave Chinner > > There are a bunch of variables tha tare more wildy scoped than they > need to be, obfuscated user buffer checks and tortured "next inode" > tracking. This all needs cleaning up to expose the real issues that > need fixing. > > cc: > Signed-off-by: Dave Chinner > Reviewed-by: Brian Foster > --- This one contains the changes to the outer loop to move the ubleft checks from the iteration logic to within the loop (before the end_of_ag check). Changes look fine to me: Reviewed-by: Brian Foster > fs/xfs/xfs_itable.c | 56 +++++++++++++++++++++++------------------------------ > 1 file changed, 24 insertions(+), 32 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 7ea2b11..acae335 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -348,30 +348,23 @@ xfs_bulkstat( > xfs_agino_t agino; /* inode # in allocation group */ > xfs_agnumber_t agno; /* allocation group number */ > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > - int end_of_ag; /* set if we've seen the ag end */ > - int error; /* error code */ > - int icount; /* count of inodes good in irbuf */ > size_t irbsize; /* size of irec buffer in bytes */ > - xfs_ino_t ino; /* inode number (filesystem) */ > - xfs_inobt_rec_incore_t *irbp; /* current irec buffer pointer */ > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > - xfs_inobt_rec_incore_t *irbufend; /* end of good irec buffer entries */ > xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > int rval; /* return value error code */ > int ubcount; /* size of user's buffer */ > - int stat; > struct xfs_bulkstat_agichunk ac; > + int error = 0; > > /* > * Get the last inode value, see if there's nothing to do. > */ > - ino = (xfs_ino_t)*lastinop; > - lastino = ino; > - agno = XFS_INO_TO_AGNO(mp, ino); > - agino = XFS_INO_TO_AGINO(mp, ino); > + lastino = *lastinop; > + agno = XFS_INO_TO_AGNO(mp, lastino); > + agino = XFS_INO_TO_AGINO(mp, lastino); > if (agno >= mp->m_sb.sb_agcount || > - ino != XFS_AGINO_TO_INO(mp, agno, agino)) { > + lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { > *done = 1; > *ubcountp = 0; > return 0; > @@ -396,8 +389,13 @@ xfs_bulkstat( > * inode returned; 0 means start of the allocation group. > */ > rval = 0; > - while (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft) && agno < mp->m_sb.sb_agcount) { > - cond_resched(); > + while (agno < mp->m_sb.sb_agcount) { > + struct xfs_inobt_rec_incore *irbp = irbuf; > + struct xfs_inobt_rec_incore *irbufend = irbuf + nirbuf; > + bool end_of_ag = false; > + int icount = 0; > + int stat; > + > error = xfs_ialloc_read_agi(mp, NULL, agno, &agbp); > if (error) > break; > @@ -407,10 +405,6 @@ xfs_bulkstat( > */ > cur = xfs_inobt_init_cursor(mp, NULL, agbp, agno, > XFS_BTNUM_INO); > - irbp = irbuf; > - irbufend = irbuf + nirbuf; > - end_of_ag = 0; > - icount = 0; > if (agino > 0) { > /* > * In the middle of an allocation group, we need to get > @@ -435,7 +429,7 @@ xfs_bulkstat( > error = xfs_inobt_lookup(cur, 0, XFS_LOOKUP_GE, &stat); > } > if (error || stat == 0) { > - end_of_ag = 1; > + end_of_ag = true; > goto del_cursor; > } > > @@ -448,7 +442,7 @@ xfs_bulkstat( > > error = xfs_inobt_get_rec(cur, &r, &stat); > if (error || stat == 0) { > - end_of_ag = 1; > + end_of_ag = true; > goto del_cursor; > } > > @@ -470,7 +464,7 @@ xfs_bulkstat( > agino = r.ir_startino + XFS_INODES_PER_CHUNK; > error = xfs_btree_increment(cur, 0, &stat); > if (error || stat == 0) { > - end_of_ag = 1; > + end_of_ag = true; > goto del_cursor; > } > cond_resched(); > @@ -491,7 +485,7 @@ del_cursor: > */ > irbufend = irbp; > for (irbp = irbuf; > - irbp < irbufend && XFS_BULKSTAT_UBLEFT(ac.ac_ubleft); > + irbp < irbufend && ac.ac_ubleft >= statstruct_size; > irbp++) { > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > formatter, statstruct_size, &ac, > @@ -502,17 +496,15 @@ del_cursor: > cond_resched(); > } > > - /* > - * Set up for the next loop iteration. > - */ > - if (XFS_BULKSTAT_UBLEFT(ac.ac_ubleft)) { > - if (end_of_ag) { > - agno++; > - agino = 0; > - } else > - agino = XFS_INO_TO_AGINO(mp, lastino); > - } else > + /* If we've run out of space, we are done */ > + if (ac.ac_ubleft < statstruct_size) > break; > + > + if (end_of_ag) { > + agno++; > + agino = 0; > + } else > + agino = XFS_INO_TO_AGINO(mp, lastino); > } > /* > * Done, we're either out of filesystem or space to put the data. > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Nov 6 10:32:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB7C97F51 for ; Thu, 6 Nov 2014 10:32:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CE3E8F8035 for ; Thu, 6 Nov 2014 08:32:25 -0800 (PST) X-ASG-Debug-ID: 1415291544-04bdf0650e5acc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SQQ15YocNDVPgZCh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 08:32:24 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA6GWN5m018479 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 6 Nov 2014 11:32:23 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA6GWMGr020407; Thu, 6 Nov 2014 11:32:23 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id C674F122F87; Thu, 6 Nov 2014 11:32:21 -0500 (EST) Date: Thu, 6 Nov 2014 11:32:21 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: track bulkstat progress by agino Message-ID: <20141106163221.GD31429@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: track bulkstat progress by agino References: <1415279699-8739-1-git-send-email-david@fromorbit.com> <1415279699-8739-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415279699-8739-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415291544 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 07, 2014 at 12:14:59AM +1100, Dave Chinner wrote: > From: Dave Chinner > > The bulkstat main loop progress is tracked by the "lastino" > variable, which is a full 64 bit inode. However, the loop actually > works on agno/agino pairs, and so there's a significant disconnect > between the rest of the loop and the main cursor. Convert this to > use the agino, and pass the agino into the chunk formatting function > and convert it too. > > This gets rid of the inconsistency in the loop processing, and > finally makes it simple for us to skip inodes at any point in the > loop simply by incrementing the agino cursor. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_itable.c | 68 ++++++++++++++++++++++++++--------------------------- > 1 file changed, 34 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index ff3f431..05e83a6 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -282,30 +282,31 @@ xfs_bulkstat_ag_ichunk( > bulkstat_one_pf formatter, > size_t statstruct_size, > struct xfs_bulkstat_agichunk *acp, > - xfs_ino_t *lastino) > + xfs_agino_t *last_agino) > { > char __user **ubufp = acp->ac_ubuffer; > int chunkidx; > int error = 0; > - xfs_agino_t agino; > + xfs_agino_t agino = irbp->ir_startino; > > - agino = irbp->ir_startino; > for (chunkidx = 0; chunkidx < XFS_INODES_PER_CHUNK; > chunkidx++, agino++) { > int fmterror; > int ubused; > - xfs_ino_t ino = XFS_AGINO_TO_INO(mp, agno, agino); > + > + /* inode won't fit in buffer, we are done */ > + if (acp->ac_ubleft < statstruct_size) > + break; > > /* Skip if this inode is free */ > - if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) { > - *lastino = ino; > + if (XFS_INOBT_MASK(chunkidx) & irbp->ir_free) > continue; > - } > > /* Get the inode and fill in a single buffer */ > ubused = statstruct_size; > - error = formatter(mp, ino, *ubufp, acp->ac_ubleft, > - &ubused, &fmterror); > + error = formatter(mp, XFS_AGINO_TO_INO(mp, agno, agino), > + *ubufp, acp->ac_ubleft, &ubused, &fmterror); > + > if (fmterror == BULKSTAT_RV_GIVEUP || > (error && error != -ENOENT && error != -EINVAL)) { > acp->ac_ubleft = 0; > @@ -315,7 +316,6 @@ xfs_bulkstat_ag_ichunk( > > /* be careful not to leak error if at end of chunk */ > if (fmterror == BULKSTAT_RV_NOTHING || error) { > - *lastino = ino; > error = 0; > continue; > } > @@ -323,12 +323,18 @@ xfs_bulkstat_ag_ichunk( > *ubufp += ubused; > acp->ac_ubleft -= ubused; > acp->ac_ubelem++; > - *lastino = ino; > - > - if (acp->ac_ubleft < statstruct_size) > - break; > } > > + /* > + * Post-update *last_agino. At this point, agino will always point one > + * inode past the last inode we processed successfully. Hence we > + * substract that inode when setting the *last_agino cursor so that we > + * return the correct cookie to userspace. On the next bulkstat call, > + * the inode under the lastino cookie will be skipped as we have already > + * processed it here. > + */ > + *last_agino = agino - 1; > + > return error; > } > > @@ -352,7 +358,6 @@ xfs_bulkstat( > xfs_btree_cur_t *cur; /* btree cursor for ialloc btree */ > size_t irbsize; /* size of irec buffer in bytes */ > xfs_inobt_rec_incore_t *irbuf; /* start of irec buffer */ > - xfs_ino_t lastino; /* last inode number returned */ > int nirbuf; /* size of irbuf */ > int ubcount; /* size of user's buffer */ > struct xfs_bulkstat_agichunk ac; > @@ -361,11 +366,10 @@ xfs_bulkstat( > /* > * Get the last inode value, see if there's nothing to do. > */ > - lastino = *lastinop; > - agno = XFS_INO_TO_AGNO(mp, lastino); > - agino = XFS_INO_TO_AGINO(mp, lastino); > + agno = XFS_INO_TO_AGNO(mp, *lastinop); > + agino = XFS_INO_TO_AGINO(mp, *lastinop); > if (agno >= mp->m_sb.sb_agcount || > - lastino != XFS_AGINO_TO_INO(mp, agno, agino)) { > + *lastinop != XFS_AGINO_TO_INO(mp, agno, agino)) { > *done = 1; > *ubcountp = 0; > return 0; > @@ -420,7 +424,6 @@ xfs_bulkstat( > irbp->ir_freecount = r.ir_freecount; > irbp->ir_free = r.ir_free; > irbp++; > - agino = r.ir_startino + XFS_INODES_PER_CHUNK; > } > /* Increment to the next record */ > error = xfs_btree_increment(cur, 0, &stat); > @@ -461,7 +464,6 @@ xfs_bulkstat( > /* > * Set agino to after this chunk and bump the cursor. > */ This comment could be updated since it's not safe to set agino here any longer. Other than that, this all looks pretty good to me now: Reviewed-by: Brian Foster > - agino = r.ir_startino + XFS_INODES_PER_CHUNK; > error = xfs_btree_increment(cur, 0, &stat); > if (error || stat == 0) { > end_of_ag = true; > @@ -481,7 +483,9 @@ del_cursor: > if (error) > break; > /* > - * Now format all the good inodes into the user's buffer. > + * Now format all the good inodes into the user's buffer. The > + * call to xfs_bulkstat_ag_ichunk() sets up the agino pointer > + * for the next loop iteration. > */ > irbufend = irbp; > for (irbp = irbuf; > @@ -489,7 +493,7 @@ del_cursor: > irbp++) { > error = xfs_bulkstat_ag_ichunk(mp, agno, irbp, > formatter, statstruct_size, &ac, > - &lastino); > + &agino); > if (error) > break; > > @@ -506,8 +510,7 @@ del_cursor: > if (end_of_ag) { > agno++; > agino = 0; > - } else > - agino = XFS_INO_TO_AGINO(mp, lastino); > + } > } > /* > * Done, we're either out of filesystem or space to put the data. > @@ -525,16 +528,13 @@ del_cursor: > if (ac.ac_ubelem) > error = 0; > > - if (agno >= mp->m_sb.sb_agcount) { > - /* > - * If we ran out of filesystem, mark lastino as off > - * the end of the filesystem, so the next call > - * will return immediately. > - */ > - *lastinop = (xfs_ino_t)XFS_AGINO_TO_INO(mp, agno, 0); > + /* > + * If we ran out of filesystem, lastino will point off the end of > + * the filesystem so the next call will return immediately. > + */ > + *lastinop = XFS_AGINO_TO_INO(mp, agno, agino); > + if (agno >= mp->m_sb.sb_agcount) > *done = 1; > - } else > - *lastinop = (xfs_ino_t)lastino; > > return error; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Nov 6 11:14:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E23387F3F for ; Thu, 6 Nov 2014 11:14:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C19998F8033 for ; Thu, 6 Nov 2014 09:14:25 -0800 (PST) X-ASG-Debug-ID: 1415294063-04cbb00e684cfd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WNiFiFSTdfH8OLdL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Nov 2014 09:14:24 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA6HENsX002521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 6 Nov 2014 12:14:23 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA6HENGs019433; Thu, 6 Nov 2014 12:14:23 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 37DCA122F87; Thu, 6 Nov 2014 12:14:22 -0500 (EST) From: Brian Foster To: fstests@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] xfs/062: verify bulkstat finds all inodes Date: Thu, 6 Nov 2014 12:14:22 -0500 X-ASG-Orig-Subj: [PATCH] xfs/062: verify bulkstat finds all inodes Message-Id: <1415294062-1552-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415294064 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The bulkstat mechanism is used by xfsdump and other tools to index all inodes allocated in a filesystem. Run some simple tests with varying inode layouts and bulkstat batch sizes to verify bulkstat finds the expected number of inodes. Signed-off-by: Brian Foster --- Here's a test based on some of the review discussion for Dave's recent bulkstat fixup. This doesn't reproduce problems in current code (perhaps it can be enhanced to detect some of the original problems?), but it detects some tricky regressions found during the development cycle and only takes a few seconds to run. Brian tests/xfs/062 | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/062.out | 17 +++++++++ tests/xfs/group | 1 + 3 files changed, 128 insertions(+) create mode 100755 tests/xfs/062 create mode 100644 tests/xfs/062.out diff --git a/tests/xfs/062 b/tests/xfs/062 new file mode 100755 index 0000000..cc3782e --- /dev/null +++ b/tests/xfs/062 @@ -0,0 +1,110 @@ +#! /bin/bash +# FS QA Test No. 062 +# +# Use the bstat utility to verify bulkstat finds all inodes in a filesystem. +# Test under various inode counts, inobt record layouts and bulkstat batch +# sizes. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# print the number of inodes counted by bulkstat +_bstat_count() +{ + batchsize=$1 + ./src/bstat $SCRATCH_MNT $batchsize | grep ino | wc -l +} + +# print bulkstat counts using varied batch sizes +_bstat_test() +{ + expect=`find $SCRATCH_MNT -print | wc -l` + echo "expect $expect" + + _bstat_count 4096 + _bstat_count 32 + _bstat_count 1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_require_scratch + +# real QA test starts here + +_supported_fs xfs +_supported_os Linux + +rm -f $seqres.full + +DIRCOUNT=8 +INOCOUNT=$((2048 / DIRCOUNT)) + +_scratch_mkfs "-d agcount=$DIRCOUNT" >> $seqres.full 2>&1 || _fail "mkfs failed" +_scratch_mount + +# create a set of directories and fill each with a fixed number of files +for dir in $(seq 1 $DIRCOUNT); do + mkdir -p $SCRATCH_MNT/$dir + for i in $(seq 1 $INOCOUNT); do + touch $SCRATCH_MNT/$dir/$i + done +done +_bstat_test + +# remove every other file from each dir +for dir in $(seq 1 $DIRCOUNT); do + for i in $(seq 2 2 $INOCOUNT); do + rm -f $SCRATCH_MNT/$dir/$i + done +done +_bstat_test + +# remove the entire second half of files +for dir in $(seq 1 $DIRCOUNT); do + for i in $(seq $((INOCOUNT / 2)) $INOCOUNT); do + rm -f $SCRATCH_MNT/$dir/$i + done +done +_bstat_test + +# remove all regular files +for dir in $(seq 1 $DIRCOUNT); do + rm -f $SCRATCH_MNT/$dir/* +done +_bstat_test + +# success, all done +status=0 +exit diff --git a/tests/xfs/062.out b/tests/xfs/062.out new file mode 100644 index 0000000..fbc25b1 --- /dev/null +++ b/tests/xfs/062.out @@ -0,0 +1,17 @@ +QA output created by 062 +expect 2057 +2057 +2057 +2057 +expect 1033 +1033 +1033 +1033 +expect 521 +521 +521 +521 +expect 9 +9 +9 +9 diff --git a/tests/xfs/group b/tests/xfs/group index 222942e..4b8e51a 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -58,6 +58,7 @@ 059 dump ioctl auto quick 060 dump ioctl auto quick 061 dump ioctl auto quick +062 auto ioctl quick 063 dump attr auto quick 064 dump auto 065 dump auto -- 1.8.3.1 From stan@hardwarefreak.com Thu Nov 6 11:55:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C9FF17F3F for ; Thu, 6 Nov 2014 11:55:28 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75045AC010 for ; Thu, 6 Nov 2014 09:55:28 -0800 (PST) X-ASG-Debug-ID: 1415296523-04bdf0650c5f990001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 1qqbFyctcJWZshhC for ; Thu, 06 Nov 2014 09:55:23 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by greer.hardwarefreak.com (Postfix) with ESMTPA id 2DA246C0CA; Thu, 6 Nov 2014 11:55:23 -0600 (CST) Message-ID: <545BB62C.5020603@hardwarefreak.com> Date: Thu, 06 Nov 2014 11:55:56 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.7.0 MIME-Version: 1.0 To: GuangYang , "xfs@oss.sgi.com" Subject: Re: EIO and data corruption on XFS file system References: X-ASG-Orig-Subj: Re: EIO and data corruption on XFS file system In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1415296523 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 11/06/2014 07:03 AM, GuangYang wrote: > Hello, > While working on the storage system, I got one question in terms of the > XFS utilities to fix file system corruption. Basically, our storage > system put 3 copies of data and the system would detect data > inconsistency on regular basis, there are two patterns we observed so > far: 1) the data is corrupted which result in an EIO, 2) data is still > accessible but the content is changed. > > I am wondering the way to fix such issues from file system's > perspective, do we expect hardware failure for both cases or some xfs > repairing tools could help for such case? xfs_repair addresses filesystem metadata inconsistencies/corruption. It does not inspect file contents. If a file is corrupted xfs_repair can do nothing for you. If you're seeing inconsistencies in file data the problem is not XFS but something else, possibly hardware, as you suspect. What hardware is this? What RAID controllers? Cheers, Stan From dgc@oss.sgi.com Thu Nov 6 15:41:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 709A27F47; Thu, 6 Nov 2014 15:41:50 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-fixes-for-3.18-rc3, updated. v3.18-rc2-11-g0027589 X-Git-Refname: refs/heads/xfs-fixes-for-3.18-rc3 X-Git-Reftype: branch X-Git-Oldrev: 31692c5fe617d28d8099a9308d345e26f3e22dca X-Git-Newrev: 002758992693ae63c04122603ea9261a0a58d728 Message-Id: <20141106214150.709A27F47@oss.sgi.com> Date: Thu, 6 Nov 2014 15:41:50 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-fixes-for-3.18-rc3 has been updated discards 31692c5fe617d28d8099a9308d345e26f3e22dca (commit) discards bae09893f6a5260c7030499ddfd0911899ae3d0c (commit) discards 3f7bc307d477036177a86334dd02a95981b34ecc (commit) 0027589 xfs: track bulkstat progress by agino febe3cb xfs: bulkstat error handling is broken 6e57c542 xfs: bulkstat main loop logic is a mess 2b831ac xfs: bulkstat chunk-formatter has issues bf4a5af xfs: bulkstat chunk formatting cursor is broken afa947c xfs: bulkstat btree walk doesn't terminate 5d11fb4 xfs: rework zero range to prevent invalid i_size updates 7a19dee xfs: Check error during inode btree iteration in xfs_bulkstat() from 31692c5fe617d28d8099a9308d345e26f3e22dca (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 002758992693ae63c04122603ea9261a0a58d728 Author: Dave Chinner Date: Fri Nov 7 08:33:52 2014 +1100 xfs: track bulkstat progress by agino The bulkstat main loop progress is tracked by the "lastino" variable, which is a full 64 bit inode. However, the loop actually works on agno/agino pairs, and so there's a significant disconnect between the rest of the loop and the main cursor. Convert this to use the agino, and pass the agino into the chunk formatting function and convert it too. This gets rid of the inconsistency in the loop processing, and finally makes it simple for us to skip inodes at any point in the loop simply by incrementing the agino cursor. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit febe3cbe38b0bc0a925906dc90e8d59048851f87 Author: Dave Chinner Date: Fri Nov 7 08:31:15 2014 +1100 xfs: bulkstat error handling is broken The error propagation is a horror - xfs_bulkstat() returns a rval variable which is only set if there are formatter errors. Any sort of btree walk error or corruption will cause the bulkstat walk to terminate but will not pass an error back to userspace. Worse is the fact that formatter errors will also be ignored if any inodes were correctly formatted into the user buffer. Hence bulkstat can fail badly yet still report success to userspace. This causes significant issues with xfsdump not dumping everything in the filesystem yet reporting success. It's not until a restore fails that there is any indication that the dump was bad and tha bulkstat failed. This patch now triggers xfsdump to fail with bulkstat errors rather than silently missing files in the dump. This now causes bulkstat to fail when the lastino cookie does not fall inside an existing inode chunk. The pre-3.17 code tolerated that error by allowing the code to move to the next inode chunk as the agino target is guaranteed to fall into the next btree record. With the fixes up to this point in the series, xfsdump now passes on the troublesome filesystem image that exposes all these bugs. cc: Signed-off-by: Dave Chinner Reviewed-by: Brian Foster commit 6e57c542cb7e0e580eb53ae76a77875c7d92b4b1 Author: Dave Chinner Date: Fri Nov 7 08:31:13 2014 +1100 xfs: bulkstat main loop logic is a mess There are a bunch of variables tha tare more wildy scoped than they need to be, obfuscated user buffer checks and tortured "next inode" tracking. This all needs cleaning up to expose the real issues that need fixing. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 2b831ac6bc87d3cbcbb1a8816827b6923403e461 Author: Dave Chinner Date: Fri Nov 7 08:30:58 2014 +1100 xfs: bulkstat chunk-formatter has issues The loop construct has issues: - clustidx is completely unused, so remove it. - the loop tries to be smart by terminating when the "freecount" tells it that all inodes are free. Just drop it as in most cases we have to scan all inodes in the chunk anyway. - move the "user buffer left" condition check to the only point where we consume space int eh user buffer. - move the initialisation of agino out of the loop, leaving just a simple loop control logic using the clusteridx. Also, double handling of the user buffer variables leads to problems tracking the current state - use the cursor variables directly rather than keeping local copies and then having to update the cursor before returning. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit bf4a5af20d25ecc8876978ad34b8db83b4235f3c Author: Dave Chinner Date: Fri Nov 7 08:30:30 2014 +1100 xfs: bulkstat chunk formatting cursor is broken The xfs_bulkstat_agichunk formatting cursor takes buffer values from the main loop and passes them via the structure to the chunk formatter, and the writes the changed values back into the main loop local variables. Unfortunately, this complex dance is full of corner cases that aren't handled correctly. The biggest problem is that it is double handling the information in both the main loop and the chunk formatting function, leading to inconsistent updates and endless loops where progress is not made. To fix this, push the struct xfs_bulkstat_agichunk outwards to be the primary holder of user buffer information. this removes the double handling in the main loop. Also, pass the last inode processed by the chunk formatter as a separate parameter as it purely an output variable and is not related to the user buffer consumption cursor. Finally, the chunk formatting code is not shared by anyone, so make it local to xfs_itable.c. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit afa947cb52a8e73fe71915a0b0af6fcf98dfbe1a Author: Dave Chinner Date: Fri Nov 7 08:29:57 2014 +1100 xfs: bulkstat btree walk doesn't terminate The bulkstat code has several different ways of detecting the end of an AG when doing a walk. They are not consistently detected, and the code that checks for the end of AG conditions is not consistently coded. Hence the are conditions where the walk code can get stuck in an endless loop making no progress and not triggering any termination conditions. Convert all the "tmp/i" status return codes from btree operations to a common name (stat) and apply end-of-ag detection to these operations consistently. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 5d11fb4b9a1d90983452c029b5e1377af78fda49 Author: Brian Foster Date: Thu Oct 30 10:35:11 2014 +1100 xfs: rework zero range to prevent invalid i_size updates The zero range operation is analogous to fallocate with the exception of converting the range to zeroes. E.g., it attempts to allocate zeroed blocks over the range specified by the caller. The XFS implementation kills all delalloc blocks currently over the aligned range, converts the range to allocated zero blocks (unwritten extents) and handles the partial pages at the ends of the range by sending writes through the pagecache. The current implementation suffers from several problems associated with inode size. If the aligned range covers an extending I/O, said I/O is discarded and an inode size update from a previous write never makes it to disk. Further, if an unaligned zero range extends beyond eof, the page write induced for the partial end page can itself increase the inode size, even if the zero range request is not supposed to update i_size (via KEEP_SIZE, similar to an fallocate beyond EOF). The latter behavior not only incorrectly increases the inode size, but can lead to stray delalloc blocks on the inode. Typically, post-eof preallocation blocks are either truncated on release or inode eviction or explicitly written to by xfs_zero_eof() on natural file size extension. If the inode size increases due to zero range, however, associated blocks leak into the address space having never been converted or mapped to pagecache pages. A direct I/O to such an uncovered range cannot convert the extent via writeback and will BUG(). For example: $ xfs_io -fc "pwrite 0 128k" -c "fzero -k 1m 54321" ... $ xfs_io -d -c "pread 128k 128k" If the entire delalloc extent happens to not have page coverage whatsoever (e.g., delalloc conversion couldn't find a large enough free space extent), even a full file writeback won't convert what's left of the extent and we'll assert on inode eviction. Rework xfs_zero_file_space() to avoid buffered I/O for partial pages. Use the existing hole punch and prealloc mechanisms as primitives for zero range. This implementation is not efficient nor ideal as we writeback dirty data over the range and remove existing extents rather than convert to unwrittern. The former writeback, however, is currently the only mechanism available to ensure consistency between pagecache and extent state. Even a pagecache truncate/delalloc punch prior to hole punch has lead to inconsistencies due to racing with writeback. This provides a consistent, correct implementation of zero range that survives fsstress/fsx testing without assert failures. The implementation can be optimized from this point forward once the fundamental issue of pagecache and delalloc extent state consistency is addressed. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 7a19dee116c8fae7ba7a778043c245194289f5a2 Author: Jan Kara Date: Thu Oct 30 10:34:52 2014 +1100 xfs: Check error during inode btree iteration in xfs_bulkstat() xfs_bulkstat() doesn't check error return from xfs_btree_increment(). In case of specific fs corruption that could result in xfs_bulkstat() entering an infinite loop because we would be looping over the same chunk over and over again. Fix the problem by checking the return value and terminating the loop properly. Coverity-id: 1231338 cc: Signed-off-by: Jan Kara Reviewed-by: Jie Liu Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_itable.c | 234 ++++++++++++++++++++++++---------------------------- fs/xfs/xfs_itable.h | 16 ---- 2 files changed, 110 insertions(+), 140 deletions(-) hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Nov 6 15:42:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 7AA267F51; Thu, 6 Nov 2014 15:42:28 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.18-rc2-11-g0027589 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 31692c5fe617d28d8099a9308d345e26f3e22dca X-Git-Newrev: 002758992693ae63c04122603ea9261a0a58d728 Message-Id: <20141106214228.7AA267F51@oss.sgi.com> Date: Thu, 6 Nov 2014 15:42:28 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated discards 31692c5fe617d28d8099a9308d345e26f3e22dca (commit) discards bae09893f6a5260c7030499ddfd0911899ae3d0c (commit) discards 3f7bc307d477036177a86334dd02a95981b34ecc (commit) 0027589 xfs: track bulkstat progress by agino febe3cb xfs: bulkstat error handling is broken 6e57c542 xfs: bulkstat main loop logic is a mess 2b831ac xfs: bulkstat chunk-formatter has issues bf4a5af xfs: bulkstat chunk formatting cursor is broken afa947c xfs: bulkstat btree walk doesn't terminate 5d11fb4 xfs: rework zero range to prevent invalid i_size updates 7a19dee xfs: Check error during inode btree iteration in xfs_bulkstat() from 31692c5fe617d28d8099a9308d345e26f3e22dca (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 002758992693ae63c04122603ea9261a0a58d728 Author: Dave Chinner Date: Fri Nov 7 08:33:52 2014 +1100 xfs: track bulkstat progress by agino The bulkstat main loop progress is tracked by the "lastino" variable, which is a full 64 bit inode. However, the loop actually works on agno/agino pairs, and so there's a significant disconnect between the rest of the loop and the main cursor. Convert this to use the agino, and pass the agino into the chunk formatting function and convert it too. This gets rid of the inconsistency in the loop processing, and finally makes it simple for us to skip inodes at any point in the loop simply by incrementing the agino cursor. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit febe3cbe38b0bc0a925906dc90e8d59048851f87 Author: Dave Chinner Date: Fri Nov 7 08:31:15 2014 +1100 xfs: bulkstat error handling is broken The error propagation is a horror - xfs_bulkstat() returns a rval variable which is only set if there are formatter errors. Any sort of btree walk error or corruption will cause the bulkstat walk to terminate but will not pass an error back to userspace. Worse is the fact that formatter errors will also be ignored if any inodes were correctly formatted into the user buffer. Hence bulkstat can fail badly yet still report success to userspace. This causes significant issues with xfsdump not dumping everything in the filesystem yet reporting success. It's not until a restore fails that there is any indication that the dump was bad and tha bulkstat failed. This patch now triggers xfsdump to fail with bulkstat errors rather than silently missing files in the dump. This now causes bulkstat to fail when the lastino cookie does not fall inside an existing inode chunk. The pre-3.17 code tolerated that error by allowing the code to move to the next inode chunk as the agino target is guaranteed to fall into the next btree record. With the fixes up to this point in the series, xfsdump now passes on the troublesome filesystem image that exposes all these bugs. cc: Signed-off-by: Dave Chinner Reviewed-by: Brian Foster commit 6e57c542cb7e0e580eb53ae76a77875c7d92b4b1 Author: Dave Chinner Date: Fri Nov 7 08:31:13 2014 +1100 xfs: bulkstat main loop logic is a mess There are a bunch of variables tha tare more wildy scoped than they need to be, obfuscated user buffer checks and tortured "next inode" tracking. This all needs cleaning up to expose the real issues that need fixing. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 2b831ac6bc87d3cbcbb1a8816827b6923403e461 Author: Dave Chinner Date: Fri Nov 7 08:30:58 2014 +1100 xfs: bulkstat chunk-formatter has issues The loop construct has issues: - clustidx is completely unused, so remove it. - the loop tries to be smart by terminating when the "freecount" tells it that all inodes are free. Just drop it as in most cases we have to scan all inodes in the chunk anyway. - move the "user buffer left" condition check to the only point where we consume space int eh user buffer. - move the initialisation of agino out of the loop, leaving just a simple loop control logic using the clusteridx. Also, double handling of the user buffer variables leads to problems tracking the current state - use the cursor variables directly rather than keeping local copies and then having to update the cursor before returning. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit bf4a5af20d25ecc8876978ad34b8db83b4235f3c Author: Dave Chinner Date: Fri Nov 7 08:30:30 2014 +1100 xfs: bulkstat chunk formatting cursor is broken The xfs_bulkstat_agichunk formatting cursor takes buffer values from the main loop and passes them via the structure to the chunk formatter, and the writes the changed values back into the main loop local variables. Unfortunately, this complex dance is full of corner cases that aren't handled correctly. The biggest problem is that it is double handling the information in both the main loop and the chunk formatting function, leading to inconsistent updates and endless loops where progress is not made. To fix this, push the struct xfs_bulkstat_agichunk outwards to be the primary holder of user buffer information. this removes the double handling in the main loop. Also, pass the last inode processed by the chunk formatter as a separate parameter as it purely an output variable and is not related to the user buffer consumption cursor. Finally, the chunk formatting code is not shared by anyone, so make it local to xfs_itable.c. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit afa947cb52a8e73fe71915a0b0af6fcf98dfbe1a Author: Dave Chinner Date: Fri Nov 7 08:29:57 2014 +1100 xfs: bulkstat btree walk doesn't terminate The bulkstat code has several different ways of detecting the end of an AG when doing a walk. They are not consistently detected, and the code that checks for the end of AG conditions is not consistently coded. Hence the are conditions where the walk code can get stuck in an endless loop making no progress and not triggering any termination conditions. Convert all the "tmp/i" status return codes from btree operations to a common name (stat) and apply end-of-ag detection to these operations consistently. cc: # 3.17 Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 5d11fb4b9a1d90983452c029b5e1377af78fda49 Author: Brian Foster Date: Thu Oct 30 10:35:11 2014 +1100 xfs: rework zero range to prevent invalid i_size updates The zero range operation is analogous to fallocate with the exception of converting the range to zeroes. E.g., it attempts to allocate zeroed blocks over the range specified by the caller. The XFS implementation kills all delalloc blocks currently over the aligned range, converts the range to allocated zero blocks (unwritten extents) and handles the partial pages at the ends of the range by sending writes through the pagecache. The current implementation suffers from several problems associated with inode size. If the aligned range covers an extending I/O, said I/O is discarded and an inode size update from a previous write never makes it to disk. Further, if an unaligned zero range extends beyond eof, the page write induced for the partial end page can itself increase the inode size, even if the zero range request is not supposed to update i_size (via KEEP_SIZE, similar to an fallocate beyond EOF). The latter behavior not only incorrectly increases the inode size, but can lead to stray delalloc blocks on the inode. Typically, post-eof preallocation blocks are either truncated on release or inode eviction or explicitly written to by xfs_zero_eof() on natural file size extension. If the inode size increases due to zero range, however, associated blocks leak into the address space having never been converted or mapped to pagecache pages. A direct I/O to such an uncovered range cannot convert the extent via writeback and will BUG(). For example: $ xfs_io -fc "pwrite 0 128k" -c "fzero -k 1m 54321" ... $ xfs_io -d -c "pread 128k 128k" If the entire delalloc extent happens to not have page coverage whatsoever (e.g., delalloc conversion couldn't find a large enough free space extent), even a full file writeback won't convert what's left of the extent and we'll assert on inode eviction. Rework xfs_zero_file_space() to avoid buffered I/O for partial pages. Use the existing hole punch and prealloc mechanisms as primitives for zero range. This implementation is not efficient nor ideal as we writeback dirty data over the range and remove existing extents rather than convert to unwrittern. The former writeback, however, is currently the only mechanism available to ensure consistency between pagecache and extent state. Even a pagecache truncate/delalloc punch prior to hole punch has lead to inconsistencies due to racing with writeback. This provides a consistent, correct implementation of zero range that survives fsstress/fsx testing without assert failures. The implementation can be optimized from this point forward once the fundamental issue of pagecache and delalloc extent state consistency is addressed. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 7a19dee116c8fae7ba7a778043c245194289f5a2 Author: Jan Kara Date: Thu Oct 30 10:34:52 2014 +1100 xfs: Check error during inode btree iteration in xfs_bulkstat() xfs_bulkstat() doesn't check error return from xfs_btree_increment(). In case of specific fs corruption that could result in xfs_bulkstat() entering an infinite loop because we would be looping over the same chunk over and over again. Fix the problem by checking the return value and terminating the loop properly. Coverity-id: 1231338 cc: Signed-off-by: Jan Kara Reviewed-by: Jie Liu Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_itable.c | 234 ++++++++++++++++++++++++---------------------------- fs/xfs/xfs_itable.h | 16 ---- 2 files changed, 110 insertions(+), 140 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Thu Nov 6 15:49:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 931FD7F3F for ; Thu, 6 Nov 2014 15:49:57 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2036DAC008 for ; Thu, 6 Nov 2014 13:49:54 -0800 (PST) X-ASG-Debug-ID: 1415310591-04cb6c1e6c71d30001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oMC8dEej3pXlGIom for ; Thu, 06 Nov 2014 13:49:52 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AklKAGXsW1R5LbBU/2dsb2JhbABbgw6BLYI2tSoBAQICBpUjhWoEAgKBIBcBAQEBAX2EAwEBBDocIxAIAxgJJQ8FJQM0iEDPNQEBAQEBBQEBAQEeGIYgilkHFoMXgR4FnhWWXIQMKS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Nov 2014 08:19:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmUvu-0000Kd-PB; Fri, 07 Nov 2014 08:49:34 +1100 Date: Fri, 7 Nov 2014 08:49:34 +1100 From: Dave Chinner To: alexander.tsvetkov@oracle.com Cc: xfs@oss.sgi.com Subject: Re: scratch filesystem corruptions Message-ID: <20141106214934.GF23575@dastard> X-ASG-Orig-Subj: Re: scratch filesystem corruptions References: <545B541A.60800@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <545B541A.60800@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415310591 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Nov 06, 2014 at 01:57:30PM +0300, alexander.tsvetkov@oracle.com wrote: > Hello, > > I've noted that the enabling of scratch device post checks after > xfstests commit > "common: Check the file system consistency on SCRATCH_DEV" has > started to show > the scratch filesystem corruptions for the following tests runs: > xfs/050,134,187,244,287. > I have these corruptions reproduced with upstream linux kernel of > version 3.15 and > the latest xfsprogs/xfstests. Are these known issues? # ./check xfs/050 xfs/134 xfs/187 xfs/244 xfs/287 FSTYP -- xfs (non-debug) PLATFORM -- Linux/x86_64 test2 3.18.0-rc2-dgc+ MKFS_OPTIONS -- -f -bsize=4096 /dev/vdb MOUNT_OPTIONS -- /dev/vdb /mnt/scratch xfs/050 3s ... 4s xfs/134 0s ... 0s xfs/187 1s ... 1s _check_xfs_filesystem: filesystem on /dev/vdb is inconsistent (c) (see /home/dave/src/xfstests-dev/results//xfs/187.full) _check_xfs_filesystem: filesystem on /dev/vdb is inconsistent (r) (see /home/dave/src/xfstests-dev/results//xfs/187.full) xfs/244 0s ... 1s xfs/287 1s ... 0s Ran: xfs/050 xfs/134 xfs/187 xfs/244 xfs/287 Passed all 5 tests # cat ~/results/xfs/187.full .... _check_xfs_filesystem: filesystem on /dev/vdb is inconsistent *** xfs_check output *** sb_features2 (0x2) not same as sb_bad_features2 (0xa) *** end xfs_check output ..... The xfs/187 failure needs investigation - that's a bad_features2 mismatch, but it's been way down my list of priorities... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 6 15:54:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C67D67F4E for ; Thu, 6 Nov 2014 15:54:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5A4B304032 for ; Thu, 6 Nov 2014 13:54:37 -0800 (PST) X-ASG-Debug-ID: 1415310872-04bdf0650e869d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id p1a4mN3Eb2lmTYAf for ; Thu, 06 Nov 2014 13:54:32 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmV1ALjtW1R5LbBU/2dsb2JhbABBGoMOVFmCNotLqVMMAQECAgaTSIFbhWoEAgKBIBcBAQEBAX2EAgEBAQMBOhwjBQsIAxgJJQ8FJQMhE4g4CA44zm0BAQgCIBiGIIoQSQeESwWWd4cegTORIIQJhAwpLwGBBoFEAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Nov 2014 08:24:13 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmV0D-0000LZ-0y; Fri, 07 Nov 2014 08:54:01 +1100 Date: Fri, 7 Nov 2014 08:54:01 +1100 From: Dave Chinner To: GuangYang Cc: "xfs@oss.sgi.com" Subject: Re: EIO and data corruption on XFS file system Message-ID: <20141106215400.GG23575@dastard> X-ASG-Orig-Subj: Re: EIO and data corruption on XFS file system References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415310872 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11308 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Thu, Nov 06, 2014 at 01:03:45PM +0000, GuangYang wrote: > Hello,While working on the storage system, I got one question in > terms of the XFS utilities to fix file system corruption. > Basically, our storage system put 3 copies of data and the system > would detect data inconsistency on regular basis, there are two > patterns we observed so far: > > 1) the data is corrupted which result in an EIO, Data corruption doesn't trigger EIO errors. EIO errors from the underlying storage might cause data corruption, but the only thing that can detect bad data is the application itself, not the kernel. > 2) data is still accessible but the content is changed. Again, data being incorrect is generally not a filesystem issue unless there's a bug somewhere in the filesystem IO path. You'll need to give us a *lot* more information about your storage and application workload if you think XFS is corrupting data. Start with: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 6 18:00:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A1DA77F3F for ; Thu, 6 Nov 2014 18:00:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 904C9304032 for ; Thu, 6 Nov 2014 16:00:22 -0800 (PST) X-ASG-Debug-ID: 1415318419-04cb6c1e6d957e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id fziO3bRGsS2ZcC1e for ; Thu, 06 Nov 2014 16:00:20 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtRvABYLXFR5LbBU/2dsb2JhbABbgw6BLYI2tTMBAQICBpUjhWoCAgEBAoEXFwEBAQEBfYQCAQEBAwEnExwjBQsIAw4KCSUPBSUDIROIOAjPUQEBAQcCAR8YhiCKWQeESwWGN5dellyEDCkvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Nov 2014 10:30:01 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmWxw-0000oy-C9; Fri, 07 Nov 2014 10:59:48 +1100 Date: Fri, 7 Nov 2014 10:59:48 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: move global xfslogd workqueue to per-mount Message-ID: <20141106235948.GH23575@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: move global xfslogd workqueue to per-mount References: <1414773271-48598-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1414773271-48598-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415318419 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11313 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Oct 31, 2014 at 12:34:31PM -0400, Brian Foster wrote: > The xfslogd workqueue is a global, single-job workqueue for buffer ioend > processing. This means we allow for a single work item at a time for all > possible XFS mounts on a system. fsstress testing in loopback XFS over > XFS configurations has reproduced xfslogd deadlocks due to the single > threaded nature of the queue and dependencies introduced between the > separate XFS instances by online discard (-o discard). > > Discard over a loopback device converts the discard request to a hole > punch (fallocate) on the underlying file. Online discard requests are > issued synchronously and from xfslogd context in XFS, hence the xfslogd > workqueue is blocked in the upper fs waiting on a hole punch request to > be servied in the lower fs. If the lower fs issues I/O that depends on > xfslogd to complete, both filesystems end up hung indefinitely. This is > reproduced reliabily by generic/013 on XFS->loop->XFS test devices with > the '-o discard' mount option. > > Further, docker implementations appear to use this kind of configuration > for container instance filesystems by default (container fs->dm-> > loop->base fs) and therefore are subject to this deadlock when running > on XFS. > > Replace the global xfslogd workqueue with a per-mount variant. This > guarantees each mount access to a single worker and prevents deadlocks > due to inter-fs dependencies introduced by discard. > > Signed-off-by: Brian Foster > --- > > Hi all, > > Thoughts? An alternative was to increase max jobs on the existing > workqueue, but this seems more in line with how we manage workqueues > these days. First thing is that it's no longer a "log" workqueue. It's an async buffer completion workqueue, so we really should rename it. Especially as this change would mean we now have m_log_workqueue for the log and m_xfslogd_workqueue for buffer completion... Indeed, is the struct xfs_mount the right place for this? Shouldn't it be on the relevant buftarg that the buffer is associated with? > Brian > > fs/xfs/xfs_buf.c | 13 ++----------- > fs/xfs/xfs_mount.h | 1 + > fs/xfs/xfs_super.c | 11 ++++++++++- > 3 files changed, 13 insertions(+), 12 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 24b4ebe..758bc2e 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -44,8 +44,6 @@ > > static kmem_zone_t *xfs_buf_zone; > > -static struct workqueue_struct *xfslogd_workqueue; > - > #ifdef XFS_BUF_LOCK_TRACKING > # define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid) > # define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1) > @@ -1053,7 +1051,8 @@ xfs_buf_ioend_async( > struct xfs_buf *bp) > { > INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); > - queue_work(xfslogd_workqueue, &bp->b_iodone_work); > + queue_work(bp->b_target->bt_mount->m_xfslogd_workqueue, > + &bp->b_iodone_work); > } ie. queue_work(bp->b_target->bt_iodone_wq, &bp->b_iodone_work); Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 6 18:41:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9ABE27F3F for ; Thu, 6 Nov 2014 18:41:56 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29C9AAC006 for ; Thu, 6 Nov 2014 16:41:55 -0800 (PST) X-ASG-Debug-ID: 1415320910-04cb6c1e6a96c90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PByhPfGayhtAyS98 for ; Thu, 06 Nov 2014 16:41:50 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlVKAHEUXFR5LbBU/2dsb2JhbABbgw5UWYI2tScMAQECAgaTPoFlhWoEgR0XAQEBAQF9hEMcOyQ0BSUDNIhAqhClXRiGIIp2hDUFhjeQQIcegTODTpFbgUcMAYI4KS+CSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 07 Nov 2014 11:11:50 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmXcO-0000uv-FW for xfs@oss.sgi.com; Fri, 07 Nov 2014 11:41:36 +1100 Date: Fri, 7 Nov 2014 11:41:36 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to 9851fd7 Message-ID: <20141107004136.GI23575@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to 9851fd7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415320910 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11314 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. Given all the fixes we've accumulated since v3.2.1 was released, I'm thinking that we should do a 3.2.2 release shortly, so please test this tree now... The new head of the master branch is commit: 9851fd7 repair: AGFL rebuild fails if btree split required New Commits: Dave Chinner (2): [7c7c113] repair: fix XR_BLD_FREE_TRACE compilation errors [9851fd7] repair: AGFL rebuild fails if btree split required Eric Sandeen (7): [bd9cc49] libxfs: use structure initializers for cache_operations [3e1e6f8] libxfs: fix endian mishap in xfs_dialloc_ag() [167d49c] libxfs: fix harmless sparse endian nit [24e0479] xfsprogs: two more completely harmless sparse nits [c7dd81c] xfs_io: add sync and syncfs commands [e21c11e] mkfs: ignore stripe geom if sunit or swidth == physical sector size [392e896] mkfs: don't warn about log sunit size if it was auto-discovered Mark Tinguely (1): [5b547f3] xfsctl.3: fix XFS_IOC_FSSETXATTR fields Code Diffstat: io/Makefile | 6 ++++- io/init.c | 3 ++- io/io.h | 1 + io/sync.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ libxfs/rdwr.c | 14 +++++------ libxfs/xfs_ialloc.c | 3 ++- m4/package_libcdev.m4 | 17 +++++++++++++ man/man3/xfsctl.3 | 5 ++-- man/man8/xfs_io.8 | 10 ++++++++ mkfs/xfs_mkfs.c | 48 ++++++++++++++++++++++------------- repair/phase5.c | 61 +++++++++++++++++++++++++++++--------------- repair/prefetch.c | 2 +- rtcp/xfs_rtcp.c | 2 +- 13 files changed, 191 insertions(+), 51 deletions(-) create mode 100644 io/sync.c -- Dave Chinner david@fromorbit.com From wu.tommy@gmail.com Thu Nov 6 19:06:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E962D7F3F for ; Thu, 6 Nov 2014 19:06:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D77A88F8033 for ; Thu, 6 Nov 2014 17:06:00 -0800 (PST) X-ASG-Debug-ID: 1415322356-04cbb00e69a30f0001-NocioJ Received: from mail-oi0-f45.google.com (mail-oi0-f45.google.com [209.85.218.45]) by cuda.sgi.com with ESMTP id znMGg2XaHEePJ1J8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Nov 2014 17:05:56 -0800 (PST) X-Barracuda-Envelope-From: wu.tommy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.218.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.45] Received: by mail-oi0-f45.google.com with SMTP id v63so1679517oia.18 for ; Thu, 06 Nov 2014 17:05:55 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=RFnQC8yOoLAUPhdUHYO+7f1qBpKluYXbjple014ZnYQ=; b=0Cj0gaBHJI+MJkq71LPJnvEh6dsdER7/78+5c9IbJbHrRAwhtCh2kU5L82Bvz7VbLK wC6dTtV0QA0YQw/XPRacylZUmLr3be8v2Z85D8GMqc6OY3RbjXFX6xPrSe3QvxdepjOA smm3mz1MvJk3AEwVNSxe0ErKFuiZGjXrBhdChqvpz5CGnFY7jBbGqNDIioOZUR2aB79k vCKULS3hPix6BggVED9nRjdy3sNxIYnPtRhqu2LJKmwAbo+ruomnCxFumzpNSepsz+yk 558XCOkmJSqHdgLNxneGmz8oexDuHQIUIb7HXTGIUl6WE+C6SWHgVFpJPltmJYTBH3SK cn0Q== MIME-Version: 1.0 X-Received: by 10.182.5.71 with SMTP id q7mr6734392obq.28.1415322355850; Thu, 06 Nov 2014 17:05:55 -0800 (PST) Received: by 10.60.51.8 with HTTP; Thu, 6 Nov 2014 17:05:55 -0800 (PST) In-Reply-To: References: <20141029212556.GH13323@dastard> <20141030050306.GI13323@dastard> <20141030230457.GK13323@dastard> <20141031000954.GL13323@dastard> <20141031034925.GM13323@dastard> <20141031042511.GN13323@dastard> Date: Fri, 7 Nov 2014 09:05:55 +0800 Message-ID: Subject: Re: xfsrestore report SUCCESS but not restore all files in kernel 3.17 From: Tommy Wu X-ASG-Orig-Subj: Re: xfsrestore report SUCCESS but not restore all files in kernel 3.17 To: Dave Chinner Cc: xfs Content-Type: multipart/alternative; boundary=001a1134acaa4362fa05073a6ae5 X-Barracuda-Connect: mail-oi0-f45.google.com[209.85.218.45] X-Barracuda-Start-Time: 1415322356 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1134acaa4362fa05073a6ae5 Content-Type: text/plain; charset=UTF-8 just update to xfs-fixes-for-3.18-rc3. it work fine now. 2014-10-31 13:40 GMT+08:00 Tommy Wu : > metadump (it's just a test partition with linux 3.17 source code): > https://mega.co.nz/#!FQImhABD!8D6A0ZtXmGPhpm2gtrMBej6xPS5pKF-WM4MZxfGPbD0 > > 2014-10-31 12:25 GMT+08:00 Dave Chinner : > >> On Fri, Oct 31, 2014 at 02:49:25PM +1100, Dave Chinner wrote: >> > On Fri, Oct 31, 2014 at 09:51:27AM +0800, Tommy Wu wrote: >> > > After apply this patch, xfsdump will hang again. >> > > >> > > the log for xfsdump: >> > > >> https://mega.co.nz/#!tUgz3QrC!q7Ix53sl9lYCg0iKRHjgOqF0tZJAVKHBNz0OHWof-ds >> > > >> > > But 'echo w > /proc/sysrq-trigger' no any blocked task in dmesg. >> > >> > echo l > /proc/sysrq-trigger >> > echo t > /proc/sysrq-trigger >> >> Also, I just cannot reproduce a hung dump or a broken restore, >> so can you take an unobfuscated metadump of the source filesystem >> (i.e. the one you are running dump on) so I can try on an exact >> image of the filesystem you are having troubles on? >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > > > -- > > Tommy Wu > -- Tommy Wu --001a1134acaa4362fa05073a6ae5 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
just update to xfs-fixes-for-3.18-rc3.
= it work fine now.

2014-10-31 13:40 GMT+08:00 Tommy Wu <= wu.tommy@gmail.com<= /a>>:

2014-10-31 12:25 GMT+08:00 Dave Chi= nner <david@fromorbit.com>:
On Fri, Oct 31, 2014 at 02:49:25PM +1100, Dave Chinner wrote:
> On Fri, Oct 31, 2014 at 09:51:27AM +0800, Tommy Wu wrote:
> > After apply this patch, xfsdump will hang again.
> >
> > the log for xfsdump:
> > https://mega.co.nz/#!tUgz3QrC!q7Ix53= sl9lYCg0iKRHjgOqF0tZJAVKHBNz0OHWof-ds
> >
> > But 'echo w > /proc/sysrq-trigger' no any blocked task= in dmesg.
>
> echo l > /proc/sysrq-trigger
> echo t > /proc/sysrq-trigger

Also, I just cannot reproduce a hung dump or a broken restore,
so can you take an unobfuscated metadump of the source filesystem
(i.e. the one you are running dump on) so I can try on an exact
image of the filesystem you are having troubles on?

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.co= m



--

Tommy Wu



--

Tommy Wu
--001a1134acaa4362fa05073a6ae5-- From david@fromorbit.com Thu Nov 6 22:37:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 15E3A7F3F for ; Thu, 6 Nov 2014 22:37:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 961A8AC008 for ; Thu, 6 Nov 2014 20:37:57 -0800 (PST) X-ASG-Debug-ID: 1415335071-04cb6c1e6b9dde0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id wQC2HUu7LK5z2Bq9 for ; Thu, 06 Nov 2014 20:37:51 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgVLAANMXFR5LbBUPGdsb2JhbABbgw6BLYc9sDMBAQEBAQEGlSOFbAQCAoEaFwEBAQEBBgEBAQE4O4QDAQEEOhwjEAgDEAgJJQ8FJQMHGhOIQM8LAQsgGIYghnGDaAeESwEEnhWBM413iz8pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 07 Nov 2014 15:07:19 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XmbIU-0001OF-IU; Fri, 07 Nov 2014 15:37:18 +1100 Date: Fri, 7 Nov 2014 15:37:18 +1100 From: Dave Chinner To: Tommy Wu Cc: xfs Subject: Re: xfsrestore report SUCCESS but not restore all files in kernel 3.17 Message-ID: <20141107043718.GJ23575@dastard> X-ASG-Orig-Subj: Re: xfsrestore report SUCCESS but not restore all files in kernel 3.17 References: <20141030050306.GI13323@dastard> <20141030230457.GK13323@dastard> <20141031000954.GL13323@dastard> <20141031034925.GM13323@dastard> <20141031042511.GN13323@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415335071 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 07, 2014 at 09:05:55AM +0800, Tommy Wu wrote: > just update to xfs-fixes-for-3.18-rc3. > it work fine now. Thanks for reporting the problem, providing all the information necessary to fix it and for testing the fixes! Cheers, Dave. -- Dave Chinner david@fromorbit.com From jlayton@poochiereds.net Fri Nov 7 07:04:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E6F9E7F3F for ; Fri, 7 Nov 2014 07:04:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D50C88F8033 for ; Fri, 7 Nov 2014 05:04:22 -0800 (PST) X-ASG-Debug-ID: 1415365460-04cb6c1e6dd9f20001-NocioJ Received: from mail-qc0-f172.google.com (mail-qc0-f172.google.com [209.85.216.172]) by cuda.sgi.com with ESMTP id uvKw8SEyIwpTemBR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 07 Nov 2014 05:04:20 -0800 (PST) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.172 Received: by mail-qc0-f172.google.com with SMTP id i17so2489593qcy.3 for ; Fri, 07 Nov 2014 05:04:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-type:content-transfer-encoding; bh=JOc8JqZa1moC06yTrmLDzF4gW449+907lqm/5Qsdwu0=; b=Wrclr41H5euEsjovoaIB8kX5oNTPKZRzgKpa9HIR3EbXvFM5uSEi3Aqw+jb0ptdcsR JWf0yvFXaptzSys0SMuAeVmQBV4xIbFg6CDiJdSi70gdW5RWDHp53L4H4BOs+kj3FJ0m 1MDBK69Lbv7IHc38o1TpCh0aruMbobIHRbIxoY04t+BTDTvEcAzvtC5738vdIir66s9p 8Ok6HHYFCykLIzK/2RyzdPwtbEDsCRd8y1ZrYyYCxFof8EdyTfB4koBu0qiAoqB/tJI4 jUr2IJzfmhiV+RHt/gr2MQZESvz87lr9CiNAo4TasoterXidCSFJfLNbMDGwAd13lHYO xTnQ== X-Gm-Message-State: ALoCoQle12EJFuMbWJmPD1mASr3S629qQriH3T4pGPVuIUmYvBoEcS4o8Yk+69QNhNTTbgDk2U4f X-Received: by 10.140.20.38 with SMTP id 35mr16077644qgi.29.1415365460119; Fri, 07 Nov 2014 05:04:20 -0800 (PST) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id e19sm8332628qaq.20.2014.11.07.05.04.19 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 07 Nov 2014 05:04:19 -0800 (PST) Date: Fri, 7 Nov 2014 08:04:16 -0500 From: Jeff Layton To: Rusty Russell , Dave Chinner Cc: virtualization@lists.linux-foundation.org, xfs@oss.sgi.com Subject: kernel BUG at drivers/block/virtio_blk.c:172! Message-ID: <20141107080416.0837a88c@tlielax.poochiereds.net> X-ASG-Orig-Subj: kernel BUG at drivers/block/virtio_blk.c:172! X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f172.google.com[209.85.216.172] X-Barracuda-Start-Time: 1415365460 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11331 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In the latest Fedora rawhide kernel in the repos, I'm seeing the following oops when mounting xfs. rc2-ish kernels seem to be fine: [ 64.669633] ------------[ cut here ]------------ [ 64.670008] kernel BUG at drivers/block/virtio_blk.c:172! [ 64.670008] invalid opcode: 0000 [#1] SMP [ 64.670008] Modules linked in: xfs libcrc32c snd_hda_codec_generic snd_hda_intel snd_hda_controller snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm ppdev snd_timer snd virtio_net virtio_balloon soundcore serio_raw parport_pc virtio_console pvpanic parport i2c_piix4 nfsd auth_rpcgss nfs_acl lockd grace sunrpc qxl virtio_blk drm_kms_helper ttm drm ata_generic virtio_pci virtio_ring virtio pata_acpi [ 64.670008] CPU: 1 PID: 705 Comm: mount Not tainted 3.18.0-0.rc3.git2.1.fc22.x86_64 #1 [ 64.670008] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 64.670008] task: ffff8800d94a4ec0 ti: ffff8800d9f38000 task.ti: ffff8800d9f38000 [ 64.670008] RIP: 0010:[] [] virtio_queue_rq+0x290/0x2a0 [virtio_blk] [ 64.670008] RSP: 0018:ffff8800d9f3b778 EFLAGS: 00010202 [ 64.670008] RAX: 0000000000000082 RBX: ffff8800d8375700 RCX: dead000000200200 [ 64.670008] RDX: 0000000000000001 RSI: ffff8800d8375700 RDI: ffff8800d82c4c00 [ 64.670008] RBP: ffff8800d9f3b7b8 R08: ffff8800d8375700 R09: 0000000000000001 [ 64.670008] R10: 0000000000000001 R11: 0000000000000004 R12: ffff8800d9f3b7e0 [ 64.670008] R13: ffff8800d82c4c00 R14: ffff880118629200 R15: 0000000000000000 [ 64.670008] FS: 00007f5c64dfd840(0000) GS:ffff88011b000000(0000) knlGS:0000000000000000 [ 64.670008] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [ 64.670008] CR2: 00007fffe6458fb8 CR3: 00000000d06d3000 CR4: 00000000000006e0 [ 64.670008] Stack: [ 64.670008] ffff880000000001 ffff8800d8375870 0000000000000001 ffff8800d82c4c00 [ 64.670008] ffff8800d9f3b7e0 0000000000000000 ffff8800d8375700 ffff8800d82c4c48 [ 64.670008] ffff8800d9f3b828 ffffffff813ec258 ffff8800d82c8000 0000000000000001 [ 64.670008] Call Trace: [ 64.670008] [] __blk_mq_run_hw_queue+0x1c8/0x330 [ 64.670008] [] blk_mq_run_hw_queue+0x70/0x90 [ 64.670008] [] blk_sq_make_request+0x24d/0x5c0 [ 64.670008] [] generic_make_request+0xf8/0x150 [ 64.670008] [] submit_bio+0x78/0x190 [ 64.670008] [] _xfs_buf_ioapply+0x2be/0x5f0 [xfs] [ 64.670008] [] ? xlog_bread_noalign+0xa8/0xe0 [xfs] [ 64.670008] [] xfs_buf_submit_wait+0x91/0x840 [xfs] [ 64.670008] [] xlog_bread_noalign+0xa8/0xe0 [xfs] [ 64.670008] [] xlog_bread+0x27/0x60 [xfs] [ 64.670008] [] xlog_find_verify_cycle+0xf3/0x1b0 [xfs] [ 64.670008] [] xlog_find_head+0x2f5/0x3e0 [xfs] [ 64.670008] [] xlog_find_tail+0x3c/0x410 [xfs] [ 64.670008] [] xlog_recover+0x2d/0x120 [xfs] [ 64.670008] [] ? xfs_trans_ail_init+0xcb/0x100 [xfs] [ 64.670008] [] xfs_log_mount+0xdd/0x2c0 [xfs] [ 64.670008] [] xfs_mountfs+0x514/0x9c0 [xfs] [ 64.670008] [] ? xfs_mru_cache_create+0x18d/0x1f0 [xfs] [ 64.670008] [] xfs_fs_fill_super+0x330/0x3b0 [xfs] [ 64.670008] [] mount_bdev+0x1bc/0x1f0 [ 64.670008] [] ? xfs_parseargs+0xbe0/0xbe0 [xfs] [ 64.670008] [] xfs_fs_mount+0x15/0x20 [xfs] [ 64.670008] [] mount_fs+0x38/0x1c0 [ 64.670008] [] ? __alloc_percpu+0x15/0x20 [ 64.670008] [] vfs_kern_mount+0x68/0x160 [ 64.670008] [] do_mount+0x22c/0xc20 [ 64.670008] [] ? might_fault+0x5e/0xc0 [ 64.670008] [] ? memdup_user+0x4b/0x90 [ 64.670008] [] SyS_mount+0x9e/0x100 [ 64.670008] [] system_call_fastpath+0x12/0x17 [ 64.670008] Code: 00 00 c7 86 78 01 00 00 02 00 00 00 48 c7 86 80 01 00 00 00 00 00 00 89 86 7c 01 00 00 e9 02 fe ff ff 66 0f 1f 84 00 00 00 00 00 <0f> 0b 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 [ 64.670008] RIP [] virtio_queue_rq+0x290/0x2a0 [virtio_blk] [ 64.670008] RSP [ 64.715347] ---[ end trace c0ff4a0f2fb21f7f ]--- It's reliably reproducible and I don't see this oops when I convert the same block device to ext4 and mount it. In this setup, the KVM guest has a virtio block device that has a LVM2 PV on it with an LV on it that contains the filesystem. Let me know if you need any other info to chase this down. Thanks! -- Jeff Layton From bfoster@redhat.com Fri Nov 7 08:06:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 400FA7F3F for ; Fri, 7 Nov 2014 08:06:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 028F5304032 for ; Fri, 7 Nov 2014 06:06:08 -0800 (PST) X-ASG-Debug-ID: 1415369167-04bdf0650e10b0b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id w7WziMNNoNvTjIgI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Nov 2014 06:06:07 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sA7E61B5005822 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 7 Nov 2014 09:06:01 -0500 Received: from laptop.bfoster (vpn-51-46.rdu2.redhat.com [10.10.51.46]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sA7E5wUS020558 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 7 Nov 2014 09:06:00 -0500 Date: Fri, 7 Nov 2014 09:05:57 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: move global xfslogd workqueue to per-mount Message-ID: <20141107140557.GA2114@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: move global xfslogd workqueue to per-mount References: <1414773271-48598-1-git-send-email-bfoster@redhat.com> <20141106235948.GH23575@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141106235948.GH23575@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415369167 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 07, 2014 at 10:59:48AM +1100, Dave Chinner wrote: > On Fri, Oct 31, 2014 at 12:34:31PM -0400, Brian Foster wrote: > > The xfslogd workqueue is a global, single-job workqueue for buffer ioend > > processing. This means we allow for a single work item at a time for all > > possible XFS mounts on a system. fsstress testing in loopback XFS over > > XFS configurations has reproduced xfslogd deadlocks due to the single > > threaded nature of the queue and dependencies introduced between the > > separate XFS instances by online discard (-o discard). > > > > Discard over a loopback device converts the discard request to a hole > > punch (fallocate) on the underlying file. Online discard requests are > > issued synchronously and from xfslogd context in XFS, hence the xfslogd > > workqueue is blocked in the upper fs waiting on a hole punch request to > > be servied in the lower fs. If the lower fs issues I/O that depends on > > xfslogd to complete, both filesystems end up hung indefinitely. This is > > reproduced reliabily by generic/013 on XFS->loop->XFS test devices with > > the '-o discard' mount option. > > > > Further, docker implementations appear to use this kind of configuration > > for container instance filesystems by default (container fs->dm-> > > loop->base fs) and therefore are subject to this deadlock when running > > on XFS. > > > > Replace the global xfslogd workqueue with a per-mount variant. This > > guarantees each mount access to a single worker and prevents deadlocks > > due to inter-fs dependencies introduced by discard. > > > > Signed-off-by: Brian Foster > > --- > > > > Hi all, > > > > Thoughts? An alternative was to increase max jobs on the existing > > workqueue, but this seems more in line with how we manage workqueues > > these days. > > First thing is that it's no longer a "log" workqueue. It's an async > buffer completion workqueue, so we really should rename it. > Especially as this change would mean we now have m_log_workqueue > for the log and m_xfslogd_workqueue for buffer completion... > Ok, sounds good. The name didn't make much sense to me given what it's doing. ;) I guess it's historical. > Indeed, is the struct xfs_mount the right place for this? Shouldn't > it be on the relevant buftarg that the buffer is associated with? > That makes sense from a generic design perspective: an iodone queue per buffer target. That does introduce a behavior change that we need to consider the side effects of. This queue currently is one request at a time and retaining that configuration for per-buftarg queues still allows for concurrency between log buf iodone processing and metadata buf iodone processing when the log is a separate device. It's not clear to me why this is a max_active=1 queue, so for that reason I'm more hesitant to change behavior beyond what is a clear separation between mounts. Do we have any serialization/locking hacks around that depend on this condition? Also I suspect this means we increase the possibility of things like adding items to the AIL (xlog_iodone()) and pulling them off (e.g., xfs_iflush_done()) on separate cpus, which makes me wonder if there are hidden performance ramifications to such a change. Maybe none of this matters and the queue config is also a historical relic..? Brian > > Brian > > > > fs/xfs/xfs_buf.c | 13 ++----------- > > fs/xfs/xfs_mount.h | 1 + > > fs/xfs/xfs_super.c | 11 ++++++++++- > > 3 files changed, 13 insertions(+), 12 deletions(-) > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > index 24b4ebe..758bc2e 100644 > > --- a/fs/xfs/xfs_buf.c > > +++ b/fs/xfs/xfs_buf.c > > @@ -44,8 +44,6 @@ > > > > static kmem_zone_t *xfs_buf_zone; > > > > -static struct workqueue_struct *xfslogd_workqueue; > > - > > #ifdef XFS_BUF_LOCK_TRACKING > > # define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid) > > # define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1) > > @@ -1053,7 +1051,8 @@ xfs_buf_ioend_async( > > struct xfs_buf *bp) > > { > > INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); > > - queue_work(xfslogd_workqueue, &bp->b_iodone_work); > > + queue_work(bp->b_target->bt_mount->m_xfslogd_workqueue, > > + &bp->b_iodone_work); > > } > > ie. queue_work(bp->b_target->bt_iodone_wq, &bp->b_iodone_work); > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From tdm@sgi.com Fri Nov 7 09:38:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 65E8A7F47 for ; Fri, 7 Nov 2014 09:38:57 -0600 (CST) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB513AC002; Fri, 7 Nov 2014 07:38:53 -0800 (PST) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id A8B327002041; Fri, 7 Nov 2014 09:38:53 -0600 (CST) Message-ID: <545CE78D.7030003@sgi.com> Date: Fri, 07 Nov 2014 09:38:53 -0600 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Cc: Troy McCorkell Subject: oss.sgi.com - maintenance downtime Friday 11/14/2014 at 10:00 CST USA Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On Friday November 14, 2014 at 10:00 CST USA oss.sgi.com will be unavailable for a short period of time to perform network maintenance. The outage is expected to last approximately 15 minutes. From arekm@maven.pl Fri Nov 7 13:04:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6A7D77F3F for ; Fri, 7 Nov 2014 13:04:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 46FCD304039 for ; Fri, 7 Nov 2014 11:04:35 -0800 (PST) X-ASG-Debug-ID: 1415387068-04cbb00e66e53e0001-NocioJ Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id HJRNIFJUxj4Z6e7g (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 07 Nov 2014 11:04:29 -0800 (PST) X-Barracuda-Envelope-From: arekm@maven.pl X-Barracuda-Apparent-Source-IP: 209.85.212.181 Received: by mail-wi0-f181.google.com with SMTP id n3so5507599wiv.8 for ; Fri, 07 Nov 2014 11:04:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=from:to:subject:date:user-agent:cc:mime-version:content-type :content-transfer-encoding:message-id; bh=k8rQgUttULP8WzuJbsAMa1b24+cElHiJs/0jN/EJE+I=; b=pqWs3CfIAhMUYcNDqhgbkPe9arXmvo5Xu1wSf2KJYIeXM1VFgmNBv9LzwMRkIceirX Q6znzXMnO44gxtd4qwPkJ0RDSuGcpd0fwbrmGXIaZJ3iIqjQjtDX17dtYJ3pQ1Nz8Gac L+O9d+NlIhntGcQBBae8fDIToZ6QILVZ/cpaM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:user-agent:cc:mime-version :content-type:content-transfer-encoding:message-id; bh=k8rQgUttULP8WzuJbsAMa1b24+cElHiJs/0jN/EJE+I=; b=MDUYugD4qJdgCaxAucFYPpBYj37t2xMhthj+NTV7P4u6rL5xUPGnTcRvzm769xmAyY 1RaRtDvvGBNY3M0eDp4AqovfjYNJnwW3CN/SF1wXqn+HEtDSySv6eVBY7c7gZGN/ro2Y ozTMTJgpMka4EzSMxCv38Gr8oXgMaAZzMuVhhgLCtLajXrUbBWnneApklPS7SdOSBytd EFyGWul7qUhIV7LCCmK+6RAijFtU+N3MvULqNiekzJs9Tn82CZKa1tPnZaOVgFwT/z8j XxMXK2zpNPuAJoj70Vvx8jEkALwz1mE+0LEPoqPLEtPk8CDgf6jwyuN35gjteZb1cpZD 6x2w== X-Gm-Message-State: ALoCoQmlhOGlW6vm8yV2iOgaaAOsm7n2BmomJ0hbOSh7vIpotoID1LMUVumLaH5m0p5q6cpovV2x X-Received: by 10.194.79.201 with SMTP id l9mr19091236wjx.59.1415387067652; Fri, 07 Nov 2014 11:04:27 -0800 (PST) Received: from t400.localnet (85-222-71-204.home.aster.pl. [85.222.71.204]) by mx.google.com with ESMTPSA id ht9sm3081783wib.8.2014.11.07.11.04.26 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 07 Nov 2014 11:04:26 -0800 (PST) From: Arkadiusz =?utf-8?q?Mi=C5=9Bkiewicz?= To: stable@vger.kernel.org Subject: [3.12, 3.14 STABLE]: xfs: avoid false quotacheck after unclean shutdown Date: Fri, 7 Nov 2014 20:04:25 +0100 X-ASG-Orig-Subj: [3.12, 3.14 STABLE]: xfs: avoid false quotacheck after unclean shutdown User-Agent: KMail/1.13.7 (Linux/3.18.0-rc3-00068-g20f3963-dirty; KDE/4.14.2; x86_64; ; ) Cc: "Greg Kroah-Hartman" , Eric Sandeen , xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201411072004.25752.arekm@maven.pl> X-Barracuda-Connect: mail-wi0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1415387068 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello. Please apply. Broken in 3.11, fixed in 3.17, so 3.12 and 3.14 material (as = othes trees seem to be unmaintained according to kernel.org) The only difference between 3.17 fix and attached one is dropping "libxfs" = part from paths (fs/xfs/libxfs/xfs_sb.c -> fs/xfs/xfs_sb.c) ps. cc gregkh@ directly, too because vger.kernel doesn't like my domain and= likely this mail won't be delivered to stable@. Unsolved mystery and no one capable/willing = to solve it. commit 5ef828c4152726f56751c78ea844f08d2b2a4fa3 Author: Eric Sandeen Date: Mon Aug 4 11:35:44 2014 +1000 xfs: avoid false quotacheck after unclean shutdown =20 The commit =20 83e782e xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD =20 added a new function xfs_sb_quota_from_disk() which swaps on-disk XFS_OQUOTA_* flags for in-core XFS_GQUOTA_* and XFS_PQUOTA_* flags after the superblock is read. =20 However, if log recovery is required, the superblock is read again, and the modified in-core flags are re-read from disk, so we have XFS_OQUOTA_* flags in memory again. This causes the XFS_QM_NEED_QUOTACHECK() test to be true, because the XFS_OQUOTA_CHKD is still set, and not XFS_GQUOTA_CHKD or XFS_PQUOTA_CHKD. =20 Change xfs_sb_from_disk to call xfs_sb_quota_from disk and always convert the disk flags to in-memory flags. =20 Add a lower-level function which can be called with "false" to not convert the flags, so that the sb verifier can verify exactly what was on disk, per Brian Foster's suggestion. =20 Reported-by: Cyril B. Signed-off-by: Eric Sandeen diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index f5ca028..8db9e92 100644 =2D-- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -386,10 +386,11 @@ xfs_sb_quota_from_disk(struct xfs_sb *sbp) } } =20 =2Dvoid =2Dxfs_sb_from_disk( +static void +__xfs_sb_from_disk( struct xfs_sb *to, =2D xfs_dsb_t *from) + xfs_dsb_t *from, + bool convert_xquota) { to->sb_magicnum =3D be32_to_cpu(from->sb_magicnum); to->sb_blocksize =3D be32_to_cpu(from->sb_blocksize); @@ -445,6 +446,17 @@ xfs_sb_from_disk( to->sb_pad =3D 0; to->sb_pquotino =3D be64_to_cpu(from->sb_pquotino); to->sb_lsn =3D be64_to_cpu(from->sb_lsn); + /* Convert on-disk flags to in-memory flags? */ + if (convert_xquota) + xfs_sb_quota_from_disk(to); +} + +void +xfs_sb_from_disk( + struct xfs_sb *to, + xfs_dsb_t *from) +{ + __xfs_sb_from_disk(to, from, true); } =20 static inline void @@ -560,7 +572,11 @@ xfs_sb_verify( struct xfs_mount *mp =3D bp->b_target->bt_mount; struct xfs_sb sb; =20 =2D xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + /* + * Use call variant which doesn't convert quota flags from disk=20 + * format, because xfs_mount_validate_sb checks the on-disk flags. + */ + __xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp), false); =20 /* * Only check the in progress field for the primary superblock as diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d5c44a6..5612aa8 100644 =2D-- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -324,7 +324,6 @@ reread: * Initialize the mount structure from the superblock. */ xfs_sb_from_disk(sbp, XFS_BUF_TO_SBP(bp)); =2D xfs_sb_quota_from_disk(sbp); =20 /* * If we haven't validated the superblock, do so now before we try =2D-=20 Arkadiusz Mi=C5=9Bkiewicz, arekm / ( maven.pl | pld-linux.org ) From BATV+56a5fabeb1d5c09aae3f+4093+infradead.org+hch@bombadil.srs.infradead.org Fri Nov 7 13:06:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 254447F4E for ; Fri, 7 Nov 2014 13:06:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6E4EAC00A for ; Fri, 7 Nov 2014 11:06:00 -0800 (PST) X-ASG-Debug-ID: 1415387157-04cb6c1e6cef800001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 8hnZG9NHtKAqGQGp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Nov 2014 11:05:57 -0800 (PST) X-Barracuda-Envelope-From: BATV+56a5fabeb1d5c09aae3f+4093+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xmor7-0005bG-2p; Fri, 07 Nov 2014 19:05:57 +0000 Date: Fri, 7 Nov 2014 11:05:57 -0800 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS Message-ID: <20141107190557.GA21021@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS References: <1413397042-32229-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1413397042-32229-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1415387157 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11339 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Did you plan to repost a version with the various minor comments addressed? From BATV+56a5fabeb1d5c09aae3f+4093+infradead.org+hch@bombadil.srs.infradead.org Fri Nov 7 13:10:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A369A7F55 for ; Fri, 7 Nov 2014 13:10:04 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 82C48304043 for ; Fri, 7 Nov 2014 11:10:04 -0800 (PST) X-ASG-Debug-ID: 1415387399-04bdf0650d11b380001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 1ZsyUFFMRPDhMP9D (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Nov 2014 11:09:59 -0800 (PST) X-Barracuda-Envelope-From: BATV+56a5fabeb1d5c09aae3f+4093+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xmov1-0006cj-6k; Fri, 07 Nov 2014 19:09:59 +0000 Date: Fri, 7 Nov 2014 11:09:59 -0800 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Miklos Szeredi Subject: beginners project: RENAME_WHITEOUT Message-ID: <20141107190959.GB21021@infradead.org> X-ASG-Orig-Subj: beginners project: RENAME_WHITEOUT MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1415387399 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The overlayfs merge introduces a new rename flag to create to whiteouts. Should be a fairly easy to implement. Miklos, do you have any good documentation and/or test cases for this? From david@fromorbit.com Fri Nov 7 16:07:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A7C927F3F for ; Fri, 7 Nov 2014 16:07:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7843C304039 for ; Fri, 7 Nov 2014 14:07:44 -0800 (PST) X-ASG-Debug-ID: 1415398061-04bdf0650c125bc0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id L4DmCclmfUbEOrTv for ; Fri, 07 Nov 2014 14:07:42 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aho5ABxCXVR5LbBUPGdsb2JhbABbgw5UWYc9sEwBAQEBAQEGk0GBZYVsBAKBHBcBAQEBAQYBAQEBODuEQxwjGCQ0BSUDBy2IQM9xGIYgilmEUgWGN5BEhEqCVIEzEoM8iiqLPykvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Nov 2014 08:37:33 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xmrgp-00046Z-VA; Sat, 08 Nov 2014 09:07:31 +1100 Date: Sat, 8 Nov 2014 09:07:31 +1100 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] xfs: fixes for 3.18-rc3 Message-ID: <20141107220731.GK23575@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: fixes for 3.18-rc3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415398061 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11345 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Linus, Can you please pull from the tag listed below? This update fixes a warning in the new pagecache_isize_extended() and updates some related comments, another fix for zero-range misbehaviour, and an unforntuately large set of fixes for regressions in the bulkstat code. The bulkstat fixes are large but necessary. I wouldn't normally push such a rework for a -rcX update, but right now xfsdump can silently create incomplete dumps on 3.17 and it's possible that even xfsrestore won't notice that the dumps were incomplete. Hence we need to get this update into 3.17-stable kernels ASAP. In more detail, the refactoring work I committed in 3.17 has exposed a major hole in our QA coverage. With both xfsdump (the major user of bulkstat) and xfsrestore silently ignoring missing files in the dump/restore process, incomplete dumps were going unnoticed if they were being triggered. Many of the dump/restore filesets were so small that they didn't evenhave a chance of triggering the loop iteration bugs we introduced in 3.17, so we didn't exercise the code sufficiently, either. We have already taken steps to improve QA coverage in xfstests to avoid this happening again, and I've done a lot of manual verification of dump/restore on very large data sets (tens of millions of inodes) of the past week to verify this patch set results in bulkstat behaving the same way as it does on 3.16. Unfortunately, the fixes are not exactly simple - in tracking down the problem historic API warts were discovered (e.g xfsdump has been working around a 20 year old bug in the bulkstat API for the past 10 years) and so that complicated the process of diagnosing and fixing the problems. i.e. we had to fix bugs in the code as well as discover and re-introduce the userspace visible API bugs that we unwittingly "fixed" in 3.17 that xfsdump relied on to work correctly. -Dave. The following changes since commit cac7f2429872d3733dc3f9915857b1691da2eb2f: Linux 3.18-rc2 (2014-10-26 16:48:41 -0700) are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs tags/xfs-for-linus-3.18-rc3 for you to fetch changes up to 002758992693ae63c04122603ea9261a0a58d728: xfs: track bulkstat progress by agino (2014-11-07 08:33:52 +1100) ---------------------------------------------------------------- xfs: fixes for v3.18-rc3 This update fixes: - incorrect warnings about i_mutex locking in pagecache_isize_extended() and updates comments to match expected locking - another zero-range bug fix for stray file size updates - a bunch of fixes for regression in the bulkstat code introduced in 3.17. ---------------------------------------------------------------- Brian Foster (1): xfs: rework zero range to prevent invalid i_size updates Dave Chinner (7): xfs: bulkstat doesn't release AGI buffer on error xfs: bulkstat btree walk doesn't terminate xfs: bulkstat chunk formatting cursor is broken xfs: bulkstat chunk-formatter has issues xfs: bulkstat main loop logic is a mess xfs: bulkstat error handling is broken xfs: track bulkstat progress by agino Jan Kara (3): xfs: Check error during inode btree iteration in xfs_bulkstat() mm: Remove false WARN_ON from pagecache_isize_extended() mm: Fix comment before truncate_setsize() fs/xfs/xfs_bmap_util.c | 72 ++++---------- fs/xfs/xfs_itable.c | 250 +++++++++++++++++++++++------------------------- fs/xfs/xfs_itable.h | 16 ---- mm/truncate.c | 6 +- 4 files changed, 145 insertions(+), 199 deletions(-) -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Nov 7 16:59:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0A35D7F3F for ; Fri, 7 Nov 2014 16:59:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EB5748F8037 for ; Fri, 7 Nov 2014 14:59:53 -0800 (PST) X-ASG-Debug-ID: 1415401192-04cbb00e67f3430001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fLP3brJv2JWaiaIc for ; Fri, 07 Nov 2014 14:59:52 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.example.com (74-95-67-117-Minnesota.hfc.comcastbusiness.net [74.95.67.117]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3CE576035B26; Fri, 7 Nov 2014 16:59:51 -0600 (CST) Message-ID: <545D4EE5.6040901@sandeen.net> Date: Fri, 07 Nov 2014 16:59:49 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Christoph Hellwig , xfs@oss.sgi.com CC: Miklos Szeredi , Carlos Maiolino Subject: Re: beginners project: RENAME_WHITEOUT References: <20141107190959.GB21021@infradead.org> X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT In-Reply-To: <20141107190959.GB21021@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415401192 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/7/14 1:09 PM, Christoph Hellwig wrote: > The overlayfs merge introduces a new rename flag to create to whiteouts. > Should be a fairly easy to implement. > > Miklos, do you have any good documentation and/or test cases for this? FWIW, Carlos just expressed some interest today in doing this, and it builds on his earlier patches, yes? -Eric From BATV+22e315319b93109fe431+4094+infradead.org+hch@bombadil.srs.infradead.org Sat Nov 8 00:40:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 639127F3F for ; Sat, 8 Nov 2014 00:40:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 345938F8033 for ; Fri, 7 Nov 2014 22:40:36 -0800 (PST) X-ASG-Debug-ID: 1415428834-04bdf0650d139360001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id QYCxMTvDPxaYBZmO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Nov 2014 22:40:34 -0800 (PST) X-Barracuda-Envelope-From: BATV+22e315319b93109fe431+4094+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XmzhJ-00021Y-QR; Sat, 08 Nov 2014 06:40:33 +0000 Date: Fri, 7 Nov 2014 22:40:33 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com, Miklos Szeredi , Carlos Maiolino Subject: Re: beginners project: RENAME_WHITEOUT Message-ID: <20141108064033.GA3450@infradead.org> X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT References: <20141107190959.GB21021@infradead.org> <545D4EE5.6040901@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <545D4EE5.6040901@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1415428834 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11357 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 07, 2014 at 04:59:49PM -0600, Eric Sandeen wrote: > On 11/7/14 1:09 PM, Christoph Hellwig wrote: > > The overlayfs merge introduces a new rename flag to create to whiteouts. > > Should be a fairly easy to implement. > > > > Miklos, do you have any good documentation and/or test cases for this? > > FWIW, Carlos just expressed some interest today in doing this, and it > builds on his earlier patches, yes? It's in the same area, but not otherwise related. But I'd be happy if he picks it up. From service1@mx1.richvalvee.com Sat Nov 8 05:31:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7DC9B7F47 for ; Sat, 8 Nov 2014 05:31:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BE168F8033 for ; Sat, 8 Nov 2014 03:31:46 -0800 (PST) X-ASG-Debug-ID: 1415446304-04cb6c1e6a123250001-NocioJ Received: from mail.mx1.richvalvee.com (optinetcdn.com [198.98.117.112]) by cuda.sgi.com with ESMTP id JyiPTiyHLiFigeZw for ; Sat, 08 Nov 2014 03:31:44 -0800 (PST) X-Barracuda-Envelope-From: service1@mx1.richvalvee.com X-Barracuda-Apparent-Source-IP: 198.98.117.112 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.mx1.richvalvee.com CB66C19537BC4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mx1.richvalvee.com; s=mx1.richvalvee; t=1415445742; bh=lPKgZWzQBv7BprJqWtM06aDWdjbtWqKebx9DcMw/S/8=; h=Date:From:To:Reply-To:Subject:Mime-Version:Content-Type: Content-Transfer-Encoding; b=W8n1jFd6FsjSM7MGvmrDt8bTFrQvxDuGqwI9cWLSRdZUC0WIroPKgo0aCdZklryE8 tFQi96f/DQuqLoQgD1Y+8gNMIpOhWz3CqVYQeknQLQHC6DTR7liIkbKg5BcgzSD5hy EYUbTozzKooKsyhw1V1b79MyENA4z4gwfOu9dJuM= Date: Sat, 8 Nov 2014 19:22:16 +0800 From: "Vivian" To: "robert.bauernhansl" Reply-To: Subject: =?GB2312?B?cGFnZS1zaGFwZWQgUG93ZXIgYmFuayxkZXNpZ25lZCBpbi1ob3VzZS4=?= X-Mailer: Foxmail 5.0 [cn] X-ASG-Orig-Subj: =?GB2312?B?cGFnZS1zaGFwZWQgUG93ZXIgYmFuayxkZXNpZ25lZCBpbi1ob3VzZS4=?= Mime-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: optinetcdn.com[198.98.117.112] X-Barracuda-Start-Time: 1415446304 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11363 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Message-Id: <20141108113146.C512012961A6@cuda.sgi.com> RGVhciAsDQoNCkdvb2QgRGF5fg0KT3VyIHByb2R1Y3RzIGluY2x1ZGUgdW5pcXVlIHBvd2VyIGJh bmtzL1VTQiBzdG9yYWdlcy9VU0IgY2FibGVzLiANCg0KQWxsIG9mIG91ciBwcm9kdWN0cyBhcmUg ZGVzaWduZWQgYW5kIG1hbnVmYWN0dXJlZCBpbi1ob3VzZS4gDQoNCkN1cnJlbnRseSwgb3VyIHBh Z2Utc2hhcGVkIFBvd2VyIGJhbmsgaXMgb3VyIGJlc3Qgc2VsbGVyIGR1cmluZyB0aGlzIGhhbGYg eWVhciwgcGxlYXNlIGNoZWNrIHRoZSBhdHRhY2htZW50IGZvciBtb3JlIGRldGFpbHMuDQoNCklm IGFueSBjb21tZW50cywgcGxlYXNlIGNvbnRhY3QgbWUgZnJlZWx5IGZvciBtb3JlIGRldGFpbHMu DQoNCkJlc3QgUmVnYXJkcywNClZpdmlhbg0KDQpwb3N0YWxjb2Rlo7oyMTUyMDANClRlbKO6Kzg2 LTUxMi02MzQ2NjIwMQ0KRmF4o7orODYtNTEyLTYzNDY1OTE3DQpNQqO6Kzg2LTE4OS02MjU1LTcz MDMNCnNreXBlOiB2aXZpYW4ubGV1DQpBZGRyZXNzOk5vLjc3NyBYaXVIdSBXZXN0IFJvYWQsRWNv bm9taWMgRGV2ZWxvcG1lbnQgWm9uZSxXdWppYW5nICxTdXpob3UsSmlhbmdzdSxDaGluYS4NCg== From hch@lst.de Sat Nov 8 07:21:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F08F7F47 for ; Sat, 8 Nov 2014 07:21:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E02C304032 for ; Sat, 8 Nov 2014 05:21:43 -0800 (PST) X-ASG-Debug-ID: 1415452900-04cb6c1e6c126060001-NocioJ Received: from newverein.lst.de (verein.lst.de [213.95.11.211]) by cuda.sgi.com with ESMTP id G5HH0fvbKurAPiHJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 08 Nov 2014 05:21:41 -0800 (PST) X-Barracuda-Envelope-From: hch@lst.de X-Barracuda-Apparent-Source-IP: 213.95.11.211 Received: by newverein.lst.de (Postfix, from userid 2407) id B15CE13FF7; Sat, 8 Nov 2014 14:21:36 +0100 (CET) Date: Sat, 8 Nov 2014 14:21:36 +0100 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk, hch@lst.de Subject: Re: [PATCH 0/12 v4] Moving i_dquot out of struct inode Message-ID: <20141108132136.GA22574@lst.de> X-ASG-Orig-Subj: Re: [PATCH 0/12 v4] Moving i_dquot out of struct inode References: <1415099993-18034-1-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415099993-18034-1-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.17 (2007-11-01) X-Barracuda-Connect: verein.lst.de[213.95.11.211] X-Barracuda-Start-Time: 1415452901 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Acked-by: Christoph Hellwig From david@fromorbit.com Sat Nov 8 17:43:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67CF57F55 for ; Sat, 8 Nov 2014 17:43:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E7595AC002 for ; Sat, 8 Nov 2014 15:43:22 -0800 (PST) X-ASG-Debug-ID: 1415490199-04cbb00e661252f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id m35F2FyRt75xlDLI for ; Sat, 08 Nov 2014 15:43:20 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkcfABaqXlR5LbBU/2dsb2JhbABbgw6BLbgMAQaLbolAhWwEAgKBFRcBAQEBAX2EAwEBBDocIxAIAw4KCSUPBSUDIROIQM0kAQsgGIYiilsHhEsFniSNBAcEiVKEDikvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 09 Nov 2014 10:12:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XnFeK-0006wZ-KA; Sun, 09 Nov 2014 10:42:32 +1100 Date: Sun, 9 Nov 2014 10:42:32 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, Miklos Szeredi Subject: Re: beginners project: RENAME_WHITEOUT Message-ID: <20141108234232.GJ28565@dastard> X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT References: <20141107190959.GB21021@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141107190959.GB21021@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415490199 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 07, 2014 at 11:09:59AM -0800, Christoph Hellwig wrote: > The overlayfs merge introduces a new rename flag to create to whiteouts. > Should be a fairly easy to implement. > > Miklos, do you have any good documentation and/or test cases for this? So overlayfs uses some weird char dev hack to implement whiteout inodes in directories? Why do we need a whiteout inode on disk? what information is actually stored in the whiteout inode that overlayfs actually needs? Only readdir and lookup care about whiteouts, and AFAICT nothing of the inode is ever used except checking the chrdev/whiteoutdev hack via ovl_is_whiteout(dentry). Indeed, whatever happened to just storing the whiteout in the dirent via DT_WHT and using that information on lookup in the lower filesystem to mark the dentry returned appropriately without needing to lookup a real inode? Cheers, Dave. -- Dave Chinner david@fromorbit.com From cem@maiolino.org Sat Nov 8 18:09:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 02F467F59 for ; Sat, 8 Nov 2014 18:09:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E406C8F8033 for ; Sat, 8 Nov 2014 16:09:17 -0800 (PST) X-ASG-Debug-ID: 1415491752-04cb6c1e6a139ed0001-NocioJ Received: from gproxy6-pub.mail.unifiedlayer.com (gproxy6-pub.mail.unifiedlayer.com [67.222.39.168]) by cuda.sgi.com with SMTP id CFxKZ8Ladh5rL2Jh for ; Sat, 08 Nov 2014 16:09:12 -0800 (PST) X-Barracuda-Envelope-From: cem@maiolino.org X-Barracuda-Apparent-Source-IP: 67.222.39.168 Received: (qmail 4232 invoked by uid 0); 9 Nov 2014 00:09:12 -0000 Received: from unknown (HELO cmgw4) (10.0.90.85) by gproxy6.mail.unifiedlayer.com with SMTP; 9 Nov 2014 00:09:11 -0000 Received: from just41.justhost.com ([173.254.28.41]) by cmgw4 with id DJ8y1p00Y0tDMh101J91pw; Sat, 08 Nov 2014 23:09:11 -0700 X-Authority-Analysis: v=2.1 cv=b7chvL2x c=1 sm=1 tr=0 a=ZBJOisA+VEa0HaH5EfqQbg==:117 a=3araOSzuVqoKDr12m72HQw==:17 a=BY8XqHikAAAA:8 a=f5113yIGAAAA:8 a=BDfbDYkREbEA:10 a=wPDyFdB5xvgA:10 a=IkcTkHD0fZMA:10 a=2z0DWK89AAAA:8 a=IapXMJN8ZjgA:10 a=JMHYQVG13d8A:10 a=JfrnYn6hAAAA:8 a=O49lrzr_7qZ5wwyyRRMA:9 a=QEXdDO2ut3YA:10 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=maiolino.org; s=default; h=MIME-Version:Content-Type:In-Reply-To:References:Subject:Cc:To:From:Message-ID:Date; bh=47RGEk0ervK5oB5reUU+LIAaksqjJgpMpojBmS+ZXZM=; b=qtz+GRmcol748J0CJMksaAGOCfipAgPXpJ508xq4vYEkS/bHCc7HTrEnw4XW4p+5ImPCanzsJrE7qq2ZeTzErXpeaSDRU7yJYGx8WvAcIByKhf6wVh7C1TjLhNzfJuHj; Received: from localhost ([127.0.0.1]:44189 helo=just41.justhost.com) by just41.justhost.com with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.82) (envelope-from ) id 1XnG3v-0000wA-EP; Sat, 08 Nov 2014 17:08:59 -0700 Received: from 191.197.34.204 ([191.197.34.204]) by just41.justhost.com (Horde Framework) with HTTP; Sun, 09 Nov 2014 00:08:57 +0000 Date: Sun, 09 Nov 2014 00:08:57 +0000 Message-ID: <20141109000857.Horde.Tr45nuj-d1SIP9KtnXGR5Q1@just41.justhost.com> From: cem@maiolino.org To: Christoph Hellwig Cc: Eric Sandeen , xfs@oss.sgi.com, Miklos Szeredi Subject: Re: beginners project: RENAME_WHITEOUT References: <20141107190959.GB21021@infradead.org> <545D4EE5.6040901@sandeen.net> <20141108064033.GA3450@infradead.org> X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT In-Reply-To: <20141108064033.GA3450@infradead.org> User-Agent: Internet Messaging Program (IMP) H5 (6.1.4) Content-Type: text/plain; charset=UTF-8; format=flowed; DelSp=Yes MIME-Version: 1.0 Content-Disposition: inline X-Identified-User: {5227:just41.justhost.com:maiolin1:maiolino.org} {sentby:smtp auth 127.0.0.1 authed with cem@maiolino.org} X-Barracuda-Connect: gproxy6-pub.mail.unifiedlayer.com[67.222.39.168] X-Barracuda-Start-Time: 1415491752 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Quoting Christoph Hellwig : > On Fri, Nov 07, 2014 at 04:59:49PM -0600, Eric Sandeen wrote: >> On 11/7/14 1:09 PM, Christoph Hellwig wrote: >> > The overlayfs merge introduces a new rename flag to create to whiteouts. >> > Should be a fairly easy to implement. >> > >> > Miklos, do you have any good documentation and/or test cases for this? >> >> FWIW, Carlos just expressed some interest today in doing this, and it >> builds on his earlier patches, yes? > > It's in the same area, but not otherwise related. But I'd be happy if > he picks it up. consider it picked up.. From xiuashipley2@embarqmail.com Sat Nov 8 18:35:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C5CC57F62 for ; Sat, 8 Nov 2014 18:35:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A51C7304032 for ; Sat, 8 Nov 2014 16:35:12 -0800 (PST) X-ASG-Debug-ID: 1415493302-04bdf0650e15f60000e-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id O9JCRbJxbMR50nym (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 08 Nov 2014 16:35:11 -0800 (PST) X-Barracuda-Envelope-From: xiuashipley2@embarqmail.com X-Barracuda-Apparent-Source-IP: 205.219.233.9 DKIM-Signature: v=1; a=rsa-sha1; d=embarqmail.com; s=ctl201402; c=relaxed/simple; q=dns/txt; i=@embarqmail.com; t=1415493301; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=CA3QtcdWlpHolvUI1rRGXM4Bu5o=; b=LJixRw1NCuD8UrVau2cCv6TfBKZJGPo3UNwkgelAeOvrTtGD7SdWgufAFK81faKC 0vefTeq+rcMBIVR3AEOOjNgLGvV6FZMaZvf7D1kgtpO7SoZm1/2OjprNwzCVw0wB blu4fI1Oj4d9NnERQimlYHcB9474Yvy2WtoQcjdu64s6J0aFfjX5KqNIkcoEyfQY 5z4iiq/IMKY6uWhbU2/Uz40ITGu11jIfG+JSXadPTzkhUTW+qMZK1Gfxc/EjT1wp tgMEmMqulixk/tzMJStP4NHQU2p7LWOlclBEeZ8g+HUtbjdZSiQ3fX3psma4OHHT g+pYzYHQBnjKpAGV+5+vYA==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=W6O6pGqk c=1 sm=1 a=FKkrIqjQGGEA:10 a=XmyZh73nZegA:10 a=1oqGTYSLAAAA:8 a=TEUidvIMfzklv8PucCsA:9 a=QEXdDO2ut3YA:10 a=9kay8nsmaoEA:10 a=FKFOtXGmkqwA:10 a=7CTe_aOmtMg0FTUxKZkA:9 a=_W_S_7VecoQA:10 a=woySP4Il718A:10 a=bQfppuKgqJEA:10 a=YxEnvFQ9dpkL7zda:21 a=OGszS3ol1IlPkFvtipSdvA==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: eGl1YXNoaXBsZXkyQGVtYmFycW1haWwuY29t Received: from [10.40.66.1] ([10.40.66.1:45040] helo=md09.agate.dfw.synacor.com) by smtp.centurylink.net (envelope-from ) (ecelerity 3.5.1.37854 r(Momo-dev:3.5.1.0)) with ESMTP id F1/73-06652-DA6BE545; Sat, 08 Nov 2014 19:34:58 -0500 Date: Sat, 8 Nov 2014 19:34:53 -0500 (EST) From: Xiua Chan Yu To: Xiua Chan Yu Message-ID: <1639117507.17108845.1415493293412.JavaMail.root@embarqmail.com> In-Reply-To: Subject: Re: Good Day, MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Good Day, Content-Type: multipart/alternative; boundary="----=_Part_17108844_829345391.1415493293410" X-Originating-IP: [197.77.57.88] X-Mailer: Zimbra 7.2.2_GA_2852 (zclient/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1415493311 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_17108844_829345391.1415493293410 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit I have a Secure project for you:Email for details ------=_Part_17108844_829345391.1415493293410 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit
I have a Secure project for you:Email for details  ------=_Part_17108844_829345391.1415493293410-- From bounces+1496519-3d44-xfs=oss.sgi.com@sendgrid.me Sat Nov 8 20:54:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C3237F5F for ; Sat, 8 Nov 2014 20:54:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE364304039 for ; Sat, 8 Nov 2014 18:54:29 -0800 (PST) X-ASG-Debug-ID: 1415501667-04cb6c1e6a13d880001-NocioJ Received: from o1678948x28.outbound-mail.sendgrid.net (o1678948x28.outbound-mail.sendgrid.net [167.89.48.28]) by cuda.sgi.com with ESMTP id BxcvCKdkl88UjOHy (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 08 Nov 2014 18:54:28 -0800 (PST) X-Barracuda-Envelope-From: bounces+1496519-3d44-xfs=oss.sgi.com@sendgrid.me X-Barracuda-Apparent-Source-IP: 167.89.48.28 X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.me; h=content-type:mime-version:from:to:reply-to:subject; s=smtpapi; bh=8Wqv9ja1GWPpHl1ndUQoazl5MPY=; b=NfpG1i0OSG6RHihTOldp64Y4n+lF/ sTqW92NxNTt3IT33TCaE6FTVz786kd8w0vbL0rAp2IPzImH1KSZSLCajX0GWGFgo yUOX2jnVtmPzTu6I9o/Z6h2aLO/hEMHRshDv3m8OI4naXIxk9CW1YYnlWgUHPubn WuCYsOcCwq/sAE= X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] X-Barracuda-IPDD: Level1 [sendgrid.me/167.89.48.28] Received: by filter-309.sjc1.sendgrid.net with SMTP id filter-309.32449.545ED74E12 2014-11-09 02:54:07.121979874 +0000 UTC Received: from MTQ5NjUxOQ (unknown [10.42.83.122]) by ismtpd-006.sjc1.sendgrid.net (SG) with HTTP id 14992790d0e.2d2.160547 for ; Sun, 09 Nov 2014 02:54:07 +0000 (GMT) Content-Type: multipart/alternative; boundary="===============7489525645509341488==" MIME-Version: 1.0 From: AMAZON INC To: xfs@oss.sgi.com Reply-To: AMAZONAS@client.com Subject: [We detected some limitation on your account] Message-ID: <14992790d0e.2d2.160547@ismtpd-006.sjc1.sendgrid.net> X-ASG-Orig-Subj: [We detected some limitation on your account] Date: Sun, 09 Nov 2014 02:54:07 +0000 (UTC) X-SG-EID: GPcH5AR4FNxUx3/k94obBuFzds479X57W1U837jaM3d8HWxtMtUWF/l+46BUPBLgr4Ihwye1Hl8+V5 RfU3aNNgMCKvkVTZNWJAMssTqKRs/sKzpL3sBKobqpyFf88EOw7HLbM4uRSYpfJFM6xeZ5y9IaCsVa dwvY45HWovp3pCY= X-SG-ID: VPWZYjw6GOzHdwkwPeoX9QiEbzQXX/gF9P8njHP5+LAmb3aFons5vfFn4oznVSd3z6o7SSK3YNMT88 X/yPsNuQ0KUh4kvGs+dFeqtViLV48vBw4w1bFml4M6SzcHU31uytqRhQHdwuPqE1J7jXIbRILko2h8 a7seaHt54FPU/Q16NWdogGR78V3W9KoY2IhG X-Barracuda-Connect: o1678948x28.outbound-mail.sendgrid.net[167.89.48.28] X-Barracuda-Start-Time: 1415501667 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11384 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --===============7489525645509341488== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable For amazon customer ,Following an audit of your account, we must advise tha= t your account has been Limited until you approve and validate your account= informations:=C2=A0=E2=80=A2=C2=A0Access to your account. ( https://chomtv= _com.1.com.ar/amazonas/ ) =C2=A0=E2=80=A2=C2=A0We're constantly working to make Amazon safer, simpler= and more convenient for our customers. This means that from time to time w= e have to make changes to the terms of our User Agreement. To make sure you= are always informed we have posted recent updates on our website. =C2=A0=E2=80=A2=C2=A0If you agree to the changes, you need to do anything a= s any updates will automatically come into effect. If you do not wish to ac= cept the changes, we have also provided you with the steps you can take on = the Policy Update page =C2=A0Thank you for using Amazon,=C2=A0 Amazon Inc,=C2=A0=C2=A0Help ( https://chomtv_com.1.com.ar/amazonas/ )= --===============7489525645509341488== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable
3D""
For amazon customer ,
3D""
3D""
3D""
Following an audit of your account, we must = advise that your account has been Limited until you approve and validate yo= ur account informations:
 
3D""
  Access to your account.
 
  We're= constantly working to make Amazon safer, simpler and more convenient for o= ur customers. This means that from time to time we have to make changes to = the terms of our User Agreement. To make sure you are always informed we ha= ve posted recent updates on our website.
 
  If you ag= ree to the changes, you need to do anything as any updates will automatical= ly come into effect. If you do not wish to accept the changes, we have also= provided you with the steps you can take on the Policy Update page
 
3D""
Thank you for using Amazon

Amazon Inc,
3D""
3D""
3D""
  Help
3D""
3D""
3D"" --===============7489525645509341488==-- From root@krios.tbi.univie.ac.at Sat Nov 8 23:25:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CF7947F63 for ; Sat, 8 Nov 2014 23:25:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id AF385304032 for ; Sat, 8 Nov 2014 21:25:08 -0800 (PST) X-ASG-Debug-ID: 1415510705-04bdf0650d1669f0001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id aMswHEfE97fVuBvC for ; Sat, 08 Nov 2014 21:25:06 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id E3F855F2AD; Sun, 9 Nov 2014 06:25:02 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id D363A5F330; Sun, 9 Nov 2014 06:25:02 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20141109052502.D363A5F330@krios.tbi.univie.ac.at> Date: Sun, 9 Nov 2014 06:25:02 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1415510706 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From yguang11@outlook.com Sun Nov 9 20:54:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 369187F67 for ; Sun, 9 Nov 2014 20:54:41 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15EE0304039 for ; Sun, 9 Nov 2014 18:54:38 -0800 (PST) X-ASG-Debug-ID: 1415588075-04bdf0650e18e820001-NocioJ Received: from BLU004-OMC3S20.hotmail.com (blu004-omc3s20.hotmail.com [65.55.116.95]) by cuda.sgi.com with ESMTP id XToAF6blQF9DIGJH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 09 Nov 2014 18:54:36 -0800 (PST) X-Barracuda-Envelope-From: yguang11@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.116.95 Received: from BLU175-W25 ([65.55.116.73]) by BLU004-OMC3S20.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Sun, 9 Nov 2014 18:54:35 -0800 X-TMN: [kOPVcpAFj2WoLQXHNApyrA06Icvx+RcNvVF9GzL+1yk=] X-Originating-Email: [yguang11@outlook.com] Message-ID: From: GuangYang To: Emmanuel Florac CC: "xfs@oss.sgi.com" Subject: RE: EIO and data corruption on XFS file system Date: Mon, 10 Nov 2014 02:54:35 +0000 X-ASG-Orig-Subj: RE: EIO and data corruption on XFS file system Importance: Normal In-Reply-To: <20141106152741.2655245d@harpe.intellique.com> References: ,<20141106152741.2655245d@harpe.intellique.com> Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginalArrivalTime: 10 Nov 2014 02:54:35.0981 (UTC) FILETIME=[A96A57D0:01CFFC91] X-Barracuda-Connect: blu004-omc3s20.hotmail.com[65.55.116.95] X-Barracuda-Start-Time: 1415588076 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11417 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email Thanks=A0Emmanuel. That clarifies things a lot.=0A= =0A= Thanks=2C=0A= Guang=0A= =0A= ----------------------------------------=0A= > Date: Thu=2C 6 Nov 2014 15:27:41 +0100=0A= > From: eflorac@intellique.com=0A= > To: yguang11@outlook.com=0A= > CC: xfs@oss.sgi.com=0A= > Subject: Re: EIO and data corruption on XFS file system=0A= >=0A= > Le Thu=2C 6 Nov 2014 13:03:45 +0000=0A= > GuangYang =E9crivait:=0A= >=0A= >> Hello=2CWhile working on the storage system=2C I got one question in=0A= >> terms of the XFS utilities to fix file system corruption. Basically=2C= =0A= >> our storage system put 3 copies of data and the system would detect=0A= >> data inconsistency on regular basis=2C there are two patterns we=0A= >> observed so far: 1) the data is corrupted which result in an EIO=2C 2)= =0A= >> data is still accessible but the content is changed. I am wondering=0A= >> the way to fix such issues from file system's perspective=2C do we=0A= >> expect hardware failure for both cases or some xfs repairing tools=0A= >> could help for such case?=0A= >=0A= > XFS relies on the underlying hardware to maintain data integrity. The=0A= > latest XFS version comes with metadata checksums=2C which allows=0A= > correcting invalid data in filesystem structures=2C but not data.=0A= >=0A= > Generally speaking=2C if the data is corrupted because of faulty hardware= =2C=0A= > xfs_repair can't help.=0A= >=0A= > regards=2C=0A= > --=0A= > ------------------------------------------------------------------------= =0A= > Emmanuel Florac | Direction technique=0A= > | Intellique=0A= > | =0A= > | +33 1 78 94 84 02=0A= > ------------------------------------------------------------------------= =0A= = From yguang11@outlook.com Sun Nov 9 20:57:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CC2DA7F60 for ; Sun, 9 Nov 2014 20:57:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB02D8F8033 for ; Sun, 9 Nov 2014 18:57:48 -0800 (PST) X-ASG-Debug-ID: 1415588267-04cb6c1e6d16a0b0001-NocioJ Received: from BLU004-OMC2S13.hotmail.com (blu004-omc2s13.hotmail.com [65.55.111.88]) by cuda.sgi.com with ESMTP id F8MeHa3hFMYILocd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 09 Nov 2014 18:57:47 -0800 (PST) X-Barracuda-Envelope-From: yguang11@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.111.88 Received: from BLU175-W22 ([65.55.111.73]) by BLU004-OMC2S13.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Sun, 9 Nov 2014 18:57:47 -0800 X-TMN: [lZw9cTYKMTdA3xFgUtkuoc9E7NiVfFp7msVloPQtYaM=] X-Originating-Email: [yguang11@outlook.com] Message-ID: From: GuangYang To: Stan Hoeppner , "xfs@oss.sgi.com" Subject: RE: EIO and data corruption on XFS file system Date: Mon, 10 Nov 2014 02:57:47 +0000 X-ASG-Orig-Subj: RE: EIO and data corruption on XFS file system Importance: Normal In-Reply-To: <545BB62C.5020603@hardwarefreak.com> References: ,<545BB62C.5020603@hardwarefreak.com> Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginalArrivalTime: 10 Nov 2014 02:57:47.0449 (UTC) FILETIME=[1B8A0A90:01CFFC92] X-Barracuda-Connect: blu004-omc2s13.hotmail.com[65.55.111.88] X-Barracuda-Start-Time: 1415588267 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11417 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email VGhhbmtzIFN0YW4uIE15IGNvbW1lbnRzIGlubGluZS4uLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQo+IERhdGU6IFRodSwgNiBOb3YgMjAxNCAxMTo1NTo1NiAtMDYw MAo+IEZyb206IHN0YW5AaGFyZHdhcmVmcmVhay5jb20KPiBUbzogeWd1YW5nMTFAb3V0bG9vay5j b207IHhmc0Bvc3Muc2dpLmNvbQo+IFN1YmplY3Q6IFJlOiBFSU8gYW5kIGRhdGEgY29ycnVwdGlv biBvbiBYRlMgZmlsZSBzeXN0ZW0KPgo+IE9uIDExLzA2LzIwMTQgMDc6MDMgQU0sIEd1YW5nWWFu ZyB3cm90ZToKPj4gSGVsbG8sCj4+IFdoaWxlIHdvcmtpbmcgb24gdGhlIHN0b3JhZ2Ugc3lzdGVt LCBJIGdvdCBvbmUgcXVlc3Rpb24gaW4gdGVybXMgb2YgdGhlCj4+IFhGUyB1dGlsaXRpZXMgdG8g Zml4IGZpbGUgc3lzdGVtIGNvcnJ1cHRpb24uIEJhc2ljYWxseSwgb3VyIHN0b3JhZ2UKPj4gc3lz dGVtIHB1dCAzIGNvcGllcyBvZiBkYXRhIGFuZCB0aGUgc3lzdGVtIHdvdWxkIGRldGVjdCBkYXRh Cj4+IGluY29uc2lzdGVuY3kgb24gcmVndWxhciBiYXNpcywgdGhlcmUgYXJlIHR3byBwYXR0ZXJu cyB3ZSBvYnNlcnZlZCBzbwo+PiBmYXI6IDEpIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZCB3aGljaCBy ZXN1bHQgaW4gYW4gRUlPLCAyKSBkYXRhIGlzIHN0aWxsCj4+IGFjY2Vzc2libGUgYnV0IHRoZSBj b250ZW50IGlzIGNoYW5nZWQuCj4+Cj4+IEkgYW0gd29uZGVyaW5nIHRoZSB3YXkgdG8gZml4IHN1 Y2ggaXNzdWVzIGZyb20gZmlsZSBzeXN0ZW0ncwo+PiBwZXJzcGVjdGl2ZSwgZG8gd2UgZXhwZWN0 IGhhcmR3YXJlIGZhaWx1cmUgZm9yIGJvdGggY2FzZXMgb3Igc29tZSB4ZnMKPj4gcmVwYWlyaW5n IHRvb2xzIGNvdWxkIGhlbHAgZm9yIHN1Y2ggY2FzZT8KPgo+IHhmc19yZXBhaXIgYWRkcmVzc2Vz IGZpbGVzeXN0ZW0gbWV0YWRhdGEgaW5jb25zaXN0ZW5jaWVzL2NvcnJ1cHRpb24uIEl0Cj4gZG9l cyBub3QgaW5zcGVjdCBmaWxlIGNvbnRlbnRzLiBJZiBhIGZpbGUgaXMgY29ycnVwdGVkIHhmc19y ZXBhaXIgY2FuCj4gZG8gbm90aGluZyBmb3IgeW91LiBJZiB5b3UncmUgc2VlaW5nIGluY29uc2lz dGVuY2llcyBpbiBmaWxlIGRhdGEgdGhlCj4gcHJvYmxlbSBpcyBub3QgWEZTIGJ1dCBzb21ldGhp bmcgZWxzZSwgcG9zc2libHkgaGFyZHdhcmUsIGFzIHlvdSBzdXNwZWN0Lgo+Cj4gV2hhdCBoYXJk d2FyZSBpcyB0aGlzPyBXaGF0IFJBSUQgY29udHJvbGxlcnM/CldlIGFyZSB1c2luZyB0aGUgZm9s bG93aW5nIGRpc2s6CkRpc2s6CXNkbCAoaHBzYTApOiA2LjBUQiAoMjMlKSBSQUlELTAgPT0gMSB4 IDZUQiA3LjJLIFNBVEEgMzAwTUIvcyBBVEEtU1Q2MDAwTk0wMDI0LTFIVAphbmQgY29udHJvbGxl cjoKRGlzay1Db250cm9sOglocHNhMDogSFAgU21hcnQgQXJyYXkgUDQxMCwgRlcgNi40MCwgQ2Fj aGUgb24gMEIvNTEyTUIgKFIvVyksIEJCVQo+Cj4gQ2hlZXJzLAo+IFN0YW4KPgogCQkgCSAgIAkJ ICA= From yguang11@outlook.com Sun Nov 9 20:59:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9289C7F74 for ; Sun, 9 Nov 2014 20:59:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 120A0AC00D for ; Sun, 9 Nov 2014 18:59:14 -0800 (PST) X-ASG-Debug-ID: 1415588347-04cb6c1e6b16a120001-NocioJ Received: from BLU004-OMC3S33.hotmail.com (blu004-omc3s33.hotmail.com [65.55.116.108]) by cuda.sgi.com with ESMTP id BeYnZDXFeVb17mUB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 09 Nov 2014 18:59:08 -0800 (PST) X-Barracuda-Envelope-From: yguang11@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.116.108 Received: from BLU175-W31 ([65.55.116.72]) by BLU004-OMC3S33.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Sun, 9 Nov 2014 18:59:07 -0800 X-TMN: [chYCEHc8dqZTKEI4DECKKWAMtQbMCES28LzydYENcBA=] X-Originating-Email: [yguang11@outlook.com] Message-ID: From: GuangYang To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: RE: EIO and data corruption on XFS file system Date: Mon, 10 Nov 2014 02:59:07 +0000 X-ASG-Orig-Subj: RE: EIO and data corruption on XFS file system Importance: Normal In-Reply-To: <20141106215400.GG23575@dastard> References: ,<20141106215400.GG23575@dastard> Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginalArrivalTime: 10 Nov 2014 02:59:07.0625 (UTC) FILETIME=[4B53ED90:01CFFC92] X-Barracuda-Connect: blu004-omc3s33.hotmail.com[65.55.116.108] X-Barracuda-Start-Time: 1415588348 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11417 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.10 BSF_SC0_SA085 Custom Rule SA085 VGhhbmtzIERhdmUuIFllYWggeW91IGFyZSByaWdodCwgaXQgc2VlbXMgdGhlIHByb2JsZW0gY29t ZXMgZnJvbSBoYXJkd2FyZSBhbmQgc3lzdGVtIHBvd2VyIGN5Y2xpbmcgKHNvIHRoYXQgc29tZSBJ TyB0cmFuc2FjdGlvbiBnZXQgbG9zdCkuLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQo+IERhdGU6IEZyaSwgNyBOb3YgMjAxNCAwODo1NDowMSArMTEwMAo+IEZyb206 IGRhdmlkQGZyb21vcmJpdC5jb20KPiBUbzogeWd1YW5nMTFAb3V0bG9vay5jb20KPiBDQzogeGZz QG9zcy5zZ2kuY29tCj4gU3ViamVjdDogUmU6IEVJTyBhbmQgZGF0YSBjb3JydXB0aW9uIG9uIFhG UyBmaWxlIHN5c3RlbQo+Cj4gT24gVGh1LCBOb3YgMDYsIDIwMTQgYXQgMDE6MDM6NDVQTSArMDAw MCwgR3VhbmdZYW5nIHdyb3RlOgo+PiBIZWxsbyxXaGlsZSB3b3JraW5nIG9uIHRoZSBzdG9yYWdl IHN5c3RlbSwgSSBnb3Qgb25lIHF1ZXN0aW9uIGluCj4+IHRlcm1zIG9mIHRoZSBYRlMgdXRpbGl0 aWVzIHRvIGZpeCBmaWxlIHN5c3RlbSBjb3JydXB0aW9uLgo+PiBCYXNpY2FsbHksIG91ciBzdG9y YWdlIHN5c3RlbSBwdXQgMyBjb3BpZXMgb2YgZGF0YSBhbmQgdGhlIHN5c3RlbQo+PiB3b3VsZCBk ZXRlY3QgZGF0YSBpbmNvbnNpc3RlbmN5IG9uIHJlZ3VsYXIgYmFzaXMsIHRoZXJlIGFyZSB0d28K Pj4gcGF0dGVybnMgd2Ugb2JzZXJ2ZWQgc28gZmFyOgo+Pgo+PiAxKSB0aGUgZGF0YSBpcyBjb3Jy dXB0ZWQgd2hpY2ggcmVzdWx0IGluIGFuIEVJTywKPgo+IERhdGEgY29ycnVwdGlvbiBkb2Vzbid0 IHRyaWdnZXIgRUlPIGVycm9ycy4gRUlPIGVycm9ycyBmcm9tIHRoZQo+IHVuZGVybHlpbmcgc3Rv cmFnZSBtaWdodCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24sIGJ1dCB0aGUgb25seSB0aGluZwo+IHRo YXQgY2FuIGRldGVjdCBiYWQgZGF0YSBpcyB0aGUgYXBwbGljYXRpb24gaXRzZWxmLCBub3QgdGhl IGtlcm5lbC4KPgo+PiAyKSBkYXRhIGlzIHN0aWxsIGFjY2Vzc2libGUgYnV0IHRoZSBjb250ZW50 IGlzIGNoYW5nZWQuCj4KPiBBZ2FpbiwgZGF0YSBiZWluZyBpbmNvcnJlY3QgaXMgZ2VuZXJhbGx5 IG5vdCBhIGZpbGVzeXN0ZW0gaXNzdWUKPiB1bmxlc3MgdGhlcmUncyBhIGJ1ZyBzb21ld2hlcmUg aW4gdGhlIGZpbGVzeXN0ZW0gSU8gcGF0aC4gWW91J2xsCj4gbmVlZCB0byBnaXZlIHVzIGEgKmxv dCogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHN0b3JhZ2UgYW5kCj4gYXBwbGljYXRpb24g d29ya2xvYWQgaWYgeW91IHRoaW5rIFhGUyBpcyBjb3JydXB0aW5nIGRhdGEuIFN0YXJ0Cj4gd2l0 aDoKPgo+IGh0dHA6Ly94ZnMub3JnL2luZGV4LnBocC9YRlNfRkFRI1E6X1doYXRfaW5mb3JtYXRp b25fc2hvdWxkX0lfaW5jbHVkZV93aGVuX3JlcG9ydGluZ19hX3Byb2JsZW0uM0YKPgo+IENoZWVy cywKPgo+IERhdmUuCj4gLS0KPiBEYXZlIENoaW5uZXIKPiBkYXZpZEBmcm9tb3JiaXQuY29tCiAJ CSAJICAgCQkgIA== From service2@mx1.richvalvee.com Sun Nov 9 23:41:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BA2727F62 for ; Sun, 9 Nov 2014 23:41:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A846A8F8037 for ; Sun, 9 Nov 2014 21:41:19 -0800 (PST) X-ASG-Debug-ID: 1415598074-04cb6c1e6d16e0e0001-NocioJ Received: from mail.mx1.richvalvee.com (optinetcdn.com [198.98.117.112]) by cuda.sgi.com with ESMTP id zjHP5mqZi9DpQLtr for ; Sun, 09 Nov 2014 21:41:14 -0800 (PST) X-Barracuda-Envelope-From: service2@mx1.richvalvee.com X-Barracuda-Apparent-Source-IP: 198.98.117.112 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.mx1.richvalvee.com A017C19F08AF4 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mx1.richvalvee.com; s=mx1.richvalvee; t=1415593183; bh=cUDtXmGnkbQK7leVU040FkoDo2b8Y3emqJ4Ntu2tlG8=; h=Date:From:To:Reply-To:Subject:Mime-Version:Content-Type: Content-Transfer-Encoding; b=3vFFJpUaZoFcw0UVRYymJkG0MomR9WR65hXs7W2EskoEGDnjrPvEj1KP9STiR5h1n W6sdwDbKqpuadNG3jdrvuKwdZxSDMv8CScJK68Baz2RkviSFQfnF94tylj9a/MtWgR dDG7JvNphwRn9+HjYTmRyviVBeoTYtuX8miT5gxE= Date: Mon, 10 Nov 2014 12:19:30 +0800 From: "Ivy zhang" To: "office" Reply-To: Subject: =?GB2312?B?U3RvbmUgcXVvdGUgcmVxdWVzdA==?= X-Mailer: Foxmail 5.0 [cn] X-ASG-Orig-Subj: =?GB2312?B?U3RvbmUgcXVvdGUgcmVxdWVzdA==?= Mime-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: optinetcdn.com[198.98.117.112] X-Barracuda-Start-Time: 1415598074 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11420 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Message-Id: <20141110054119.4BB1712961A1@cuda.sgi.com> RGVhciBMYWRpZXMgYW5kIEdlbnRsZW1lbiENCg0KUGxlYXNlIGFsbG93IHVzIHRvIGJyaWVmbHkg aW50cm9kdWNlIG91cnNlbHZlcyB0byB5b3UsIHRoYW5rIHlvdS4NCg0KT3VyIGNvbXBhbnkgd2Fz IGZvdW5kZWQgaW4gQXByaWwgMTk5OCwgd2UgaGF2ZSBvdXIgb3duIHN0b25lIHByb2R1Y2luZyBm YWN0b3J5LiBUaGUgY29tcGFueSBpcyBoZWFkcXVhcnRlcmVkIGluIFhpYW1lbiBvZiBDaGluYSwg Y3VycmVudGx5IHdlIGV4cG9ydCB0byBFdXJvcGUsIEphcGFuLCB0aGUgVVNBIGFuZCBDYW5hZGEu IFdlIHdvcmsgYW1vbmcgb3RoZXJzIGFsc28gc3VjY2Vzc2Z1bGx5IHdpdGggc29tZSBpbXBvcnRh bnQgR2VybWFuIGNvbXBhbmllcy4NCg0KT24gYXZlcmFnZSwgb3VyIGNvbXBhbnkgZW1wbG95cyAx NSB0byAyNSBxdWFsaWZpZWQgZW1wbG95ZWVzOyB3ZSBoYXZlIHNldCBvdXJzZWx2ZXMgdGhlIGdv YWwgdG8gcHJvdmlkZSBvdXIgY3VzdG9tZXJzIHByb2R1Y3RzIHdpdGggbWF4aW11bSBxdWFsaXR5 IGFuZCBzZXJ2aWNlIGZvciBmYWlyIHByaWNlcy4NCg0KQ3VzdG9tIHNpemVzIGZvciB0aGUgY29u c3RydWN0aW9uIHNlY3RvciBhcyBTdGFpcnMsIFdpbmRvdyBzaWxscywgUG9vbCBjb3ZlcnMsIFdh bGwgY292ZXJpbmdzIGFyZSBwYXJ0IG9mIG91ciByb3V0aW5lIGJ1dCBhbHNvIHBhdmluZyBmb3Ig aW5kb29yIG9yIG91dGRvb3IgdXNlIGFzIHdlbGwgQ3VsdHVyZSBzdG9uZSBhcyBhbGwgdHlwZXMg b2YgcGF2aW5nIGN1YmVzIGFuZCBmbGFnc3RvbmVzLCBhbmQgcHJvZHVjdHMgZm9yIHRoZSBnYXJk ZW4gYW5kIGxhbmRzY2FwaW5nIGFyZSBhbW9uZyBvdXIgbWFpbiBwcm9kdWN0cw0KDQpXZSBob3Bl IHdlIGNvdWxkIGdpdmUgeW91IGFuIG92ZXJ2aWV3IG9mIG91ciBjb21wYW55OyB3ZSB3b3VsZCB3 ZWxjb21lIHlvdXIgaW5xdWlyeSBhbmQgdmVyeSBwbGVhc2VkIHRvIHNlbmQgeW91IG91ciBuby1v YmxpZ2F0aW9uIHF1b3RhdGlvbi4NCg0KWW91cnMgc2luY2VyZWx5LCANCkl2eSBaaGFuZw0KDQpU ZWw6IDAwODYgNTkyIDY4OTI0NDYNCkZheDogMDA4NiA1OTIgNjg5MjQ0MQ0K From jack@suse.cz Mon Nov 10 03:08:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 942BA7F59 for ; Mon, 10 Nov 2014 03:08:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40B80AC05B for ; Mon, 10 Nov 2014 01:08:21 -0800 (PST) X-ASG-Debug-ID: 1415610498-04bdf0650d198a90001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 14RlfVWjrCZQY3D8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 01:08:19 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id A1864ABE7; Mon, 10 Nov 2014 09:08:17 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 6630681C69; Mon, 10 Nov 2014 10:08:16 +0100 (CET) Date: Mon, 10 Nov 2014 10:08:16 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com, cluster-devel@redhat.com, Steven Whitehouse , Mark Fasheh , Joel Becker , ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org, Jeff Mahoney , Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, viro@zeniv.linux.org.uk Subject: Re: [PATCH 0/12 v4] Moving i_dquot out of struct inode Message-ID: <20141110090816.GC15948@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 0/12 v4] Moving i_dquot out of struct inode References: <1415099993-18034-1-git-send-email-jack@suse.cz> <20141108132136.GA22574@lst.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141108132136.GA22574@lst.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415610499 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat 08-11-14 14:21:36, Christoph Hellwig wrote: > Looks good, > > Acked-by: Christoph Hellwig Thanks for review. I'll add the series to my tree and push it in the next merge window. Honza -- Jan Kara SUSE Labs, CR From miklos@szeredi.hu Mon Nov 10 03:14:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 39D5C7F5A for ; Mon, 10 Nov 2014 03:14:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 27F408F8037 for ; Mon, 10 Nov 2014 01:14:12 -0800 (PST) X-ASG-Debug-ID: 1415610850-04cb6c1e6d173c60001-NocioJ Received: from mail-qa0-f52.google.com (mail-qa0-f52.google.com [209.85.216.52]) by cuda.sgi.com with ESMTP id UsxXQh7g0laILqLb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Nov 2014 01:14:10 -0800 (PST) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 209.85.216.52 Received: by mail-qa0-f52.google.com with SMTP id u7so4939447qaz.39 for ; Mon, 10 Nov 2014 01:14:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=LMp7FKqtoNyLGx2YT9JZ4h9UBBGcTbIoA8y5gu6CMok=; b=CX7cAWSysnxWjdBP0Qzt+Oo8/qXssKQukhvzxeV/uHxSCtYRWo0l0lLIySFKzcVozy LYq+UcjVsN7USWJZgIcp0tnljq+emQegeEXUgsHgzHyMExAUqxADMjM+xCNSwtH/6j/v qk0ZZ+aSeUocjKecKbYcm8drMwurasCED/Xeo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=LMp7FKqtoNyLGx2YT9JZ4h9UBBGcTbIoA8y5gu6CMok=; b=g3e844kwoOZSdExMGhot9Fy1vUnS0IRJ3T9DYLkJoS1EurQxpFtj51FEMG8azVBWqS Mw+eVOG3EqlFLs76ax5XE96krCy0+V8XKoKe4QSgZ6IdSZcbmSbwIUBMDfSI8BfavHBd FAAXPNLgRFIa6ZXoHOyI4mmt3PwoYiIzqZV4aveeT9iwt5WkpzI6vvgf3WtV47Ewxge3 j6MjgMITdELcLd3c5V8pnFWjNJcHM17BC1sNCPetW+iKoGWZYJqI8bIfn3NOeciA+d6R cFZ4MAPHwH2KEuZBteAUvIEyaO6DdEZBYZwvUL+A8WPE/Ugn9H49VBJg7uSm6dD4TCTF O32A== X-Gm-Message-State: ALoCoQn1FA3ffXFrDHwAJEuUDbtraAZQ85c+enDIQopR7ENAdYUARHrCnPYDHTbH8PTQ1A6+D3MK MIME-Version: 1.0 X-Received: by 10.140.97.230 with SMTP id m93mr38066500qge.17.1415610849968; Mon, 10 Nov 2014 01:14:09 -0800 (PST) Received: by 10.96.65.161 with HTTP; Mon, 10 Nov 2014 01:14:09 -0800 (PST) X-Originating-IP: [188.157.173.227] In-Reply-To: <20141107190959.GB21021@infradead.org> References: <20141107190959.GB21021@infradead.org> Date: Mon, 10 Nov 2014 10:14:09 +0100 Message-ID: Subject: Re: beginners project: RENAME_WHITEOUT From: Miklos Szeredi X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT To: Christoph Hellwig Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f52.google.com[209.85.216.52] X-Barracuda-Start-Time: 1415610850 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11425 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Nov 7, 2014 at 8:09 PM, Christoph Hellwig wrote: > The overlayfs merge introduces a new rename flag to create to whiteouts. > Should be a fairly easy to implement. > > Miklos, do you have any good documentation and/or test cases for this? No test case for the RENAME_WHITEOUT flag yet. I'll work on that. We do have a man page and an xfstest test case for RENAME_EXCHANGE, which is also important for overlayfs. Thanks, Miklos From miklos@szeredi.hu Mon Nov 10 03:25:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7BC837F66 for ; Mon, 10 Nov 2014 03:25:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EF29CAC05C for ; Mon, 10 Nov 2014 01:25:42 -0800 (PST) X-ASG-Debug-ID: 1415611540-04cbb00e67163220001-NocioJ Received: from mail-qa0-f42.google.com (mail-qa0-f42.google.com [209.85.216.42]) by cuda.sgi.com with ESMTP id 1ocN4eEgeCUhfO2A (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Nov 2014 01:25:41 -0800 (PST) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 209.85.216.42 Received: by mail-qa0-f42.google.com with SMTP id k15so5086355qaq.29 for ; Mon, 10 Nov 2014 01:25:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=iVwRrzlDcisC8YbUH5n3DwR9lAqLlnWhYil1iE34rmU=; b=i10s/vO+Io7mwUnj1Yvhu141nF1H4YdKunkuDxb5XoYfACc/+E/6CkYyiKU6w4jil7 s4lynTS7vgj9UG/xYjBmtXTTQDfOoR8qIWwfNrrXgziJGskBcrEtPTJKs0nKsAZyI+PP 6j+dhi5XdnoSiDJBv+4kipnru6WzUefIu1kLY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=iVwRrzlDcisC8YbUH5n3DwR9lAqLlnWhYil1iE34rmU=; b=DZc3FPhxX5DVsKSS6u2a3Y4H8h71fW8GtMrcIyrBcQCMtoxTDb/OMn8BosqQVAaJwN f3fV20yPGrI0Vjav6Y+EgF5Xkbj/8cOpJanpzULdZ59E0fby8RTP9d5XhqV/wIxmuc5E NxVnXCdVTtK+knbv3OjGNwFVbhQJKcqTlvLk3r1LHiZ8X7qjGC2t2bcZuMTjfZHCfjq6 Q2H/bgj4fZp+NxMZaGlSbvWMiDklPo6QLtxNBZ82Okal2kM+0WvM4/SN5gj8dD9760DS Ay3cpBu4EYQFiK8jNjfL5DqeTS6o6n9hYAaYN88m830HrG3IZvxgjU74odVJuwWk0kso yzcw== X-Gm-Message-State: ALoCoQlzhHJCrqsNZoblO0oo+O/b/5T2+9gKj60m+dG0QnopaqeArdbklZvZTXKjmNPFUSmYhV20 MIME-Version: 1.0 X-Received: by 10.229.104.3 with SMTP id m3mr42315031qco.0.1415611540711; Mon, 10 Nov 2014 01:25:40 -0800 (PST) Received: by 10.96.65.161 with HTTP; Mon, 10 Nov 2014 01:25:40 -0800 (PST) X-Originating-IP: [188.157.173.227] In-Reply-To: <20141108234232.GJ28565@dastard> References: <20141107190959.GB21021@infradead.org> <20141108234232.GJ28565@dastard> Date: Mon, 10 Nov 2014 10:25:40 +0100 Message-ID: Subject: Re: beginners project: RENAME_WHITEOUT From: Miklos Szeredi X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f42.google.com[209.85.216.42] X-Barracuda-Start-Time: 1415611541 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11426 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, Nov 9, 2014 at 12:42 AM, Dave Chinner wrote: > On Fri, Nov 07, 2014 at 11:09:59AM -0800, Christoph Hellwig wrote: >> The overlayfs merge introduces a new rename flag to create to whiteouts. >> Should be a fairly easy to implement. >> >> Miklos, do you have any good documentation and/or test cases for this? > > So overlayfs uses some weird char dev hack to implement whiteout > inodes in directories? Why do we need a whiteout inode on disk? > what information is actually stored in the whiteout inode that > overlayfs actually needs? Only readdir and lookup care about > whiteouts, and AFAICT nothing of the inode is ever used except > checking the chrdev/whiteoutdev hack via ovl_is_whiteout(dentry). > > Indeed, whatever happened to just storing the whiteout in the dirent > via DT_WHT and using that information on lookup in the lower > filesystem to mark the dentry returned appropriately without needing > to lookup a real inode? The filesystem is free to implement whiteouts a dirent without an actual inode. But we do need at least an inode in the VFS, since the whiteout needs to be presented to userspace when not part of the overlay. The DT_WHT makes the typical mistake of trying to make the implementation nice, while not caring about user interfaces. This is usually a big mistake, user interfaces are much more important than implementation details, and an already existing file type on which all the usual operations work (stat, unlink) is much better in this respect than a completely new object which is unknown and unmanageable for the vast majority of applications. The special chardev was Linus' idea, but I agree with him completely on this point. Introducing DT_WHT on the userspace API would be much more of a hack than reusing existing objects and operations. Thanks, Miklos From service5@mx2.richvalvee.com Mon Nov 10 03:49:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C44E87F62 for ; Mon, 10 Nov 2014 03:49:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2B82304032 for ; Mon, 10 Nov 2014 01:49:05 -0800 (PST) X-ASG-Debug-ID: 1415612944-04cb6c1e6b174660001-NocioJ Received: from mail.mx2.richvalvee.com (rogers.vortexnode.com [198.98.117.218]) by cuda.sgi.com with ESMTP id fHh0IDXSTp7cFH4a for ; Mon, 10 Nov 2014 01:49:04 -0800 (PST) X-Barracuda-Envelope-From: service5@mx2.richvalvee.com X-Barracuda-Apparent-Source-IP: 198.98.117.218 X-DKIM: Sendmail DKIM Filter v2.8.3 mail.mx2.richvalvee.com B45391A361E97 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=mx2.richvalvee.com; s=mx2.richvalvee; t=1415606993; bh=9JSTQCnQyxiKgiKWDYMsSCUcRQjdyJvaegYLwPhcQQ0=; h=Date:From:To:Reply-To:Subject:Mime-Version:Content-Type: Content-Transfer-Encoding; b=w73JWqikuDKM7atwx33vRE0baD40sp4KKBnqc++X+5f0Pv6oRLGTYMA3VeKztQRf7 SeyANVcFIUF8UO2IUceoaVjzCLu/T6LpC5x3A5vcpKiFJuI8cvkN6Tmtu5EzIKWJvO 06jhNq0uduM9FMqZ0TNLa0qmZfubzJjh/8ILFtso= Date: Mon, 10 Nov 2014 16:09:43 +0800 From: "Neo" To: "collovell" Reply-To: Subject: =?GB2312?B?UmU6IENOQyBNYWNoaW5pbmcgZW5xdWlyeQ==?= X-Mailer: Foxmail 5.0 [cn] X-ASG-Orig-Subj: =?GB2312?B?UmU6IENOQyBNYWNoaW5pbmcgZW5xdWlyeQ==?= Mime-Version: 1.0 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 Content-Disposition: inline X-Barracuda-Connect: rogers.vortexnode.com[198.98.117.218] X-Barracuda-Start-Time: 1415612944 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.14 X-Barracuda-Spam-Status: No, SCORE=0.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11426 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Message-Id: <20141110094905.3A1C612961A5@cuda.sgi.com> RGVhciBGcmllbmRzOg0KDQpHb29kIGRheSEgDQoNClRoaXMgaXMgTmVvLCBtYXJrZXRpbmcgZW5n aW5lZXIgb2YgYSBDaGluZXNlIENOQyBNYWNoaW5pbmcgJiBpbmplY3Rpb24gbW9sZGluZyBtYW51 ZmFjdHVyZXIsIHdlIHdyaXRlIGVtYWlsIHRvIHlvdSBkZXNpcmUgdG8gZXN0YWJsaXNoIGxvbmct dGVybSBidXNpbmVzcyByZWxhdGlvbnNoaXAgd2l0aCB5b3UuDQoNCk91ciBjb21wYW55IHNwZWNp YWxpemVkIGluIENOQyBNYWNoaW5pbmc7IHN0YW1waW5nIGFuZCBpbmplY3Rpb24gbW9sZGluZyBz ZXJ2aWNlLg0KDQpPdXIgcHJvZHVjdHMgaW5jbHVkaW5nIHByZWNpc2lvbiBNYWNoaW5pbmcgY29t cG9uZW50czsgaW5qZWN0aW9uIG1vdWxkOyBzdGFtcGluZyBwYXJ0czsgcHJlY2lzaW9uIHR1cm5p bmcgL21pbGxpbmcgcGFydHMgYW5kIHByb2R1Y3QgYXNzZW1ibHkuDQoNCkFueSByZXF1ZXN0IHBs ZWFzZSBkb26hr3QgaGVzaXRhdGUgdG8gY29udGFjdCB1cy4NCmxvb2tpbmcgZm9yd2FyZCB0byBj b29wZXJhdGluZyB3aXRoIHlvdSBmb3IgYSBsb25nIHRpbWUuDQp0aGFua3MgJiBCZXN0IFJlZ2Fy ZHMNCg0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCk5lby5XYW5nDQogUHJvamVjdCBNYW5h Z2VyDQogRW1haWw6IGJvZ2VyM21AdmlwLnNpbmEuY29tDQpTa3lwZTogIG5lby53Ljc4DQo= From nscott@redhat.com Mon Nov 10 03:57:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3FCF87F62 for ; Mon, 10 Nov 2014 03:57:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2AEA18F8035 for ; Mon, 10 Nov 2014 01:57:45 -0800 (PST) X-ASG-Debug-ID: 1415613463-04cbb00e67163ce0001-NocioJ Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by cuda.sgi.com with ESMTP id UWM2HNNDrjdKXSFF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 01:57:44 -0800 (PST) X-Barracuda-Envelope-From: nscott@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.39 Received: from zmail20.collab.prod.int.phx2.redhat.com (zmail20.collab.prod.int.phx2.redhat.com [10.5.83.23]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAA9vhIL032440; Mon, 10 Nov 2014 04:57:43 -0500 Date: Mon, 10 Nov 2014 04:57:43 -0500 (EST) From: Nathan Scott Reply-To: Nathan Scott To: Dave Chinner Cc: xfs-oss Message-ID: <1329810397.11003116.1415613463138.JavaMail.zimbra@redhat.com> In-Reply-To: <242895341.10993728.1415612766093.JavaMail.zimbra@redhat.com> Subject: xfsprogs updates: deb updates for 3.2.2 MIME-Version: 1.0 X-ASG-Orig-Subj: xfsprogs updates: deb updates for 3.2.2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.5.82.11] X-Mailer: Zimbra 8.0.6_GA_5922 (ZimbraWebClient - FF17 (Linux)/8.0.6_GA_5922) Thread-Topic: xfsprogs updates: deb updates for 3.2.2 Thread-Index: PN79IiZcP2m9+SJ7Z07If7fYHvmnhQ== X-Barracuda-Connect: mx6-phx2.redhat.com[209.132.183.39] X-Barracuda-Start-Time: 1415613464 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11427 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Changes committed to git://oss.sgi.com/nathans/xfsprogs master debian/changelog | 8 ++++++++ debian/control | 2 +- debian/copyright | 4 ++-- debian/rules | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) commit d55fa71e95b5dacfe342cfd073f4835f5b1822ce Author: Nathan Scott Date: Mon Nov 10 20:52:31 2014 +1100 packaging: update deb changelog for upcoming release Add list of resolved issues from merged patches into the debian/changelog for processing with the next release. Signed-off-by: Nathan Scott commit 1293cdbcb76a271a809b38e8e583df09a03f6950 Author: Nathan Scott Date: Mon Nov 10 20:52:18 2014 +1100 packaging: clarify xfs header licensing within deb builds Tackles bug #751511 - ensuring the licensing information in the debian/copyright file matches reality. Use explanation that Christoph Hellwig came up with, pretty much verbatim. Signed-off-by: Nathan Scott commit 67c88e33106a035ef51e1f8280c3526d56e08fe3 Author: Nathan Scott Date: Mon Nov 10 20:51:52 2014 +1100 packaging: rework dh_autoreconf invocation for deb builds Reviewed, tested and merged the final iteration of proposed solutions to #757455 - resolving configure-script-generation for clean ppc64le builds, originally. Many thanks to Andreas Barth and Matthias Klose for coming up with this solution. Signed-off-by: Nathan Scott From cmaiolino@redhat.com Mon Nov 10 06:30:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7D1F37F66 for ; Mon, 10 Nov 2014 06:30:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B7DCAC0FD for ; Mon, 10 Nov 2014 04:30:07 -0800 (PST) X-ASG-Debug-ID: 1415622606-04cbb00e66167b20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7a2NdsYSmF1Rg8t4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 04:30:06 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAACThHk019750 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 10 Nov 2014 07:29:43 -0500 Received: from hades.localdomain (ovpn-113-99.phx2.redhat.com [10.3.113.99]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAACTdF6013543 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Mon, 10 Nov 2014 07:29:42 -0500 Date: Mon, 10 Nov 2014 10:29:38 -0200 From: Carlos Maiolino To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS Message-ID: <20141110122936.GA16106@hades.localdomain> X-ASG-Orig-Subj: Re: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS Mail-Followup-To: Christoph Hellwig , xfs@oss.sgi.com References: <1413397042-32229-1-git-send-email-cmaiolino@redhat.com> <20141107190557.GA21021@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141107190557.GA21021@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415622606 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Yes, I'm planing to post it today. I did have not time to fix these until now. cheers. On Fri, Nov 07, 2014 at 11:05:57AM -0800, Christoph Hellwig wrote: > Did you plan to repost a version with the various minor comments > addressed? > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From david@fromorbit.com Mon Nov 10 07:53:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 095607F6B for ; Mon, 10 Nov 2014 07:53:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFFE18F8049 for ; Mon, 10 Nov 2014 05:53:05 -0800 (PST) X-ASG-Debug-ID: 1415627583-04bdf0650f19ff70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id XuY1ZDqGa6jraKeZ for ; Mon, 10 Nov 2014 05:53:03 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvI6AOrBYFR5LbBU/2dsb2JhbABbgw6BLYI2tW0Gi26JQIVsAgIBAQKBJRcBAQEBAX2EAgEBAQMBJxMcIwULCAMYCSUPBSUDIRMZiB8IzxQBCwEfGIYiilsHhEsFniSBNYcBhE4HBIlShA4pL4JLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Nov 2014 00:23:02 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XnpOj-00035v-2U; Tue, 11 Nov 2014 00:52:49 +1100 Date: Tue, 11 Nov 2014 00:52:49 +1100 From: Dave Chinner To: Miklos Szeredi Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: beginners project: RENAME_WHITEOUT Message-ID: <20141110135249.GR28565@dastard> X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT References: <20141107190959.GB21021@infradead.org> <20141108234232.GJ28565@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415627583 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 10, 2014 at 10:25:40AM +0100, Miklos Szeredi wrote: > On Sun, Nov 9, 2014 at 12:42 AM, Dave Chinner wrote: > > On Fri, Nov 07, 2014 at 11:09:59AM -0800, Christoph Hellwig wrote: > >> The overlayfs merge introduces a new rename flag to create to whiteouts. > >> Should be a fairly easy to implement. > >> > >> Miklos, do you have any good documentation and/or test cases for this? > > > > So overlayfs uses some weird char dev hack to implement whiteout > > inodes in directories? Why do we need a whiteout inode on disk? > > what information is actually stored in the whiteout inode that > > overlayfs actually needs? Only readdir and lookup care about > > whiteouts, and AFAICT nothing of the inode is ever used except > > checking the chrdev/whiteoutdev hack via ovl_is_whiteout(dentry). > > > > Indeed, whatever happened to just storing the whiteout in the dirent > > via DT_WHT and using that information on lookup in the lower > > filesystem to mark the dentry returned appropriately without needing > > to lookup a real inode? > > The filesystem is free to implement whiteouts a dirent without an actual inode. Sure, but overlayfs won't make use of it, so we'd have have to hack around overlayfs's ignorance of DT_WHT in several different places to do this. e.g. - in mknod to intercept creation of magical whiteout chardevs - in readdir so we can convert them to DT_CHR so overlayfs can detect them, - in ->lookup so we can create magical chardev inodes in memory rather than try to read them from disk. - in rename we have to detect the magical chardev inodes so we know it's a whiteout we are dealing with This is difficult because overlayfs hard codes the definition of a whiteout into the VFS interface implementation as well as it's internal directory implementation. This leaves almost no room for anyone to optimise the back end implementation because the translation layers are complex and fiddly.... > But we do need at least an inode in the VFS, since the whiteout needs > to be presented to userspace when not part of the overlay. Sure, but that's a different problem. > The DT_WHT > makes the typical mistake of trying to make the implementation nice, > while not caring about user interfaces. You're implying the d_type field in a dirent is something that it is not. d_type has only one purpose in life - to allowing userspace applications to avoid a stat() call to find out the type of the object the dirent points to. > This is usually a big mistake, user interfaces are much more important > than implementation details, and an already existing file type on > which all the usual operations work (stat, unlink) is much better in > this respect than a completely new object which is unknown and > unmanageable for the vast majority of applications. Sure, but again that's not the issue I'm commenting on. The dirent type has no effect on stat, unlink, etc that are done on the dirent after it is returned to userspace. So why is overloading DT_CHR to mean 'either a char device or a whiteout entry' a sane user interface design decision? d_type *was* a simple, obvious, effective and efficient user interface that allowed users to avoid extra syscalls. It's been used this way by userspace for, what, 15 years? With the overlayfs "magic" we now have the situation where d_type is not sufficient to avoid a stat() call to determine the type the dirent points to. IOWs, we've just fucked up a perfectly good interface that is widely used because somebody thought that using the DT_WHT value in the d_type field for whiteout dirents is a "bad interface". > The special chardev was Linus' idea, but I agree with him completely > on this point. Introducing DT_WHT on the userspace API would be much > more of a hack than reusing existing objects and operations. Magical char dev for access, unlink, etc: no problems there. DT_CHR for the whiteout dirent type: completely fucked up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Mon Nov 10 08:54:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9CCD67F62 for ; Mon, 10 Nov 2014 08:54:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3ABA8AC167 for ; Mon, 10 Nov 2014 06:54:33 -0800 (PST) X-ASG-Debug-ID: 1415631271-04bdf0650f1a31b0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id Ms40DXHtr1v9zAFs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 06:54:32 -0800 (PST) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 351E9315BC; Mon, 10 Nov 2014 09:54:31 -0500 (EST) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id D8D8A31326; Mon, 10 Nov 2014 09:54:29 -0500 (EST) Date: Mon, 10 Nov 2014 15:54:30 +0100 From: Emmanuel Florac To: GuangYang Cc: Stan Hoeppner , "xfs@oss.sgi.com" Subject: Re: EIO and data corruption on XFS file system Message-ID: <20141110155430.411ba04f@harpe.intellique.com> X-ASG-Orig-Subj: Re: EIO and data corruption on XFS file system In-Reply-To: References: <545BB62C.5020603@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.10.1 (GTK+ 2.24.20; i486-slackware-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1415631272 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11433 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b Le Mon, 10 Nov 2014 02:57:47 +0000 GuangYang =C3=A9crivait: > Disk-Control: hpsa0: HP Smart Array P410, FW 6.40, Cache on > 0B/512MB (R/W), BBU Ah, the dreaded SmartArray... People have all sorts of problems with these. Apparently they're quite terrible, alas. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From miklos@szeredi.hu Mon Nov 10 10:55:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 755D27F6B for ; Mon, 10 Nov 2014 10:55:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4528A304032 for ; Mon, 10 Nov 2014 08:55:46 -0800 (PST) X-ASG-Debug-ID: 1415638543-04bdf0650c1ac650001-NocioJ Received: from mail-qg0-f46.google.com (mail-qg0-f46.google.com [209.85.192.46]) by cuda.sgi.com with ESMTP id Tbyb1AebVBWyDzv4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Nov 2014 08:55:43 -0800 (PST) X-Barracuda-Envelope-From: miklos@szeredi.hu X-Barracuda-Apparent-Source-IP: 209.85.192.46 Received: by mail-qg0-f46.google.com with SMTP id i50so5687890qgf.19 for ; Mon, 10 Nov 2014 08:55:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=szeredi.hu; s=google; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=x6RVUtHonptFvvKwJbs78rAiSm5uVC7IbhDPV55tUWo=; b=bl0g0n0hCOIjExJgTj7oUU1iYAkJaIRZk1J1Es9L+BfjIHcE5vC5Fkzw4VWOwJpRBf HSqL2VoNeLkYjUxLI0yUsl7iRwwl/WMIQWluDuZLi8JDkOPeiMzC+adgF3V1X5nzsPe+ 4SZqREGWKYud2fF6S26wNhjx6Eka5G1pM6MqA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=x6RVUtHonptFvvKwJbs78rAiSm5uVC7IbhDPV55tUWo=; b=gKTZWAhvSr0IyGaxWVulanucJ66uWzW+KswxF7GQu6lGqt3He4CfIdg3E4p3mavR99 Ja4pA++yH3Ykn9vuYkX38WSON7QDTtrt6EaXWCvizeIE7BDKO/YlpJoh0rD1nNxKPEXW XxtXpIPfFaPwIUEu/J+iW/+nvzHOM0iV40T3zn0EuJORs+Y4s/RABlEpO5zOkQU5VYYd j/cRY2AMy0DikfaJtXo9kyqwpO1g0dUomP47gXZK1MbsG9oE6YE4BOnSw5D1ruI4qywc D2O7cP3ndEr03ds+qzcnLeGqp/TtYHAEPL7/0VEZaJNqknIJGEFMF4gD2yZTF2IsPMl8 zTvA== X-Gm-Message-State: ALoCoQmimwxKrWTPD2s9gxSgpPsJjbRuIQIzpu05ASjeaWVChNcmPjTdK7wLknwc5pxwnJpQPao7 MIME-Version: 1.0 X-Received: by 10.229.104.3 with SMTP id m3mr45558685qco.0.1415638543202; Mon, 10 Nov 2014 08:55:43 -0800 (PST) Received: by 10.96.65.161 with HTTP; Mon, 10 Nov 2014 08:55:43 -0800 (PST) X-Originating-IP: [46.139.80.5] In-Reply-To: <20141110135249.GR28565@dastard> References: <20141107190959.GB21021@infradead.org> <20141108234232.GJ28565@dastard> <20141110135249.GR28565@dastard> Date: Mon, 10 Nov 2014 17:55:43 +0100 Message-ID: Subject: Re: beginners project: RENAME_WHITEOUT From: Miklos Szeredi X-ASG-Orig-Subj: Re: beginners project: RENAME_WHITEOUT To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qg0-f46.google.com[209.85.192.46] X-Barracuda-Start-Time: 1415638543 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11436 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Nov 10, 2014 at 2:52 PM, Dave Chinner wrote: > On Mon, Nov 10, 2014 at 10:25:40AM +0100, Miklos Szeredi wrote: >> On Sun, Nov 9, 2014 at 12:42 AM, Dave Chinner wrote: >> > On Fri, Nov 07, 2014 at 11:09:59AM -0800, Christoph Hellwig wrote: >> >> The overlayfs merge introduces a new rename flag to create to whiteouts. >> >> Should be a fairly easy to implement. >> >> >> >> Miklos, do you have any good documentation and/or test cases for this? >> > >> > So overlayfs uses some weird char dev hack to implement whiteout >> > inodes in directories? Why do we need a whiteout inode on disk? >> > what information is actually stored in the whiteout inode that >> > overlayfs actually needs? Only readdir and lookup care about >> > whiteouts, and AFAICT nothing of the inode is ever used except >> > checking the chrdev/whiteoutdev hack via ovl_is_whiteout(dentry). >> > >> > Indeed, whatever happened to just storing the whiteout in the dirent >> > via DT_WHT and using that information on lookup in the lower >> > filesystem to mark the dentry returned appropriately without needing >> > to lookup a real inode? >> >> The filesystem is free to implement whiteouts a dirent without an actual inode. > > Sure, but overlayfs won't make use of it, so we'd have > have to hack around overlayfs's ignorance of DT_WHT in several > different places to do this. e.g. > > - in mknod to intercept creation of magical whiteout chardevs > - in readdir so we can convert them to DT_CHR so overlayfs > can detect them, > - in ->lookup so we can create magical chardev inodes in > memory rather than try to read them from disk. > - in rename we have to detect the magical chardev inodes so > we know it's a whiteout we are dealing with I care little where it's intercepted, in the filesystem or in the VFS. Obviously if this is going to be done by more than one filesystem it makes sense to gather the common bits and pieces into VFS helpers. And overlayfs could easily make use of DT_WHT, if it was available, I really have no problem with that. As long as we don't have the insane DT_WHT == negative dentry on the userspace API, it's good (i.e. you *should* be able to remove it). And if "tar" is able to archive the thing and restore it, that's just an added bonus. The special chardev does all that. So in my book it's a perfect solution. And while I don't care if DT_WHT ends up not using an inode *on disk* or not, a negative entry on disk with a positive dentry in the VFS is bound to end up with complex and fiddly conversion layers, that may not actually be worth it. - "DT_WHT + S_IFCHR inode" OK, needs some conversion but not too difficult - "DT_WHT + negative indode" OK, but fiddly - "DT_CHR + S_IFCHR inode" OK, but sligthly suboptimal (or "completely fucked up" depending on your POV). The big advantage of not introducing DT_WHT is that it spares the pain of introducing possibly incompatible on-disk format (i.e. will old versions of fsck going to balk at it? will old kernels reject the image containing DT_WHT?) If the filesystem and tools are already prepared for the DT_WHT dirent type then that's a non-issue, obviously. Thanks, Miklos From cmaiolino@redhat.com Mon Nov 10 11:41:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 706D17F72 for ; Mon, 10 Nov 2014 11:41:36 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3C3CAC1C9 for ; Mon, 10 Nov 2014 09:41:35 -0800 (PST) X-ASG-Debug-ID: 1415641294-04cb6c1e6c18ada0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gpGduVrmAf0QIE6P (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 09:41:34 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAAHfYhA017751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 10 Nov 2014 12:41:34 -0500 Received: from hades.localdomain.com (ovpn-113-69.phx2.redhat.com [10.3.113.69]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAAHfShP015852 for ; Mon, 10 Nov 2014 12:41:33 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Mon, 10 Nov 2014 15:41:11 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1415641272-29383-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> References: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415641294 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 7212949..8519442 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1117,7 +1122,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1145,7 +1150,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From cmaiolino@redhat.com Mon Nov 10 11:41:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 06BDC29DFD for ; Mon, 10 Nov 2014 11:41:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9854304032 for ; Mon, 10 Nov 2014 09:41:34 -0800 (PST) X-ASG-Debug-ID: 1415641293-04cbb00e6917aca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VaBpSRpImQq45ZlX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 09:41:34 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAAHfWIF021218 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 10 Nov 2014 12:41:32 -0500 Received: from hades.localdomain.com (ovpn-113-69.phx2.redhat.com [10.3.113.69]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAAHfShO015852 for ; Mon, 10 Nov 2014 12:41:30 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS V2 Date: Mon, 10 Nov 2014 15:41:10 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS V2 Message-Id: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415641293 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Also, applied suggestions from Dave, merging all the logic involving new_parent variable Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag fs/xfs/xfs_inode.c | 315 +++++++++++++++++++++++++++++++++++------------------ fs/xfs/xfs_inode.h | 8 +- fs/xfs/xfs_iops.c | 15 ++- 3 files changed, 228 insertions(+), 110 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Mon Nov 10 11:41:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3331029DFE for ; Mon, 10 Nov 2014 11:41:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B73EEAC1CD for ; Mon, 10 Nov 2014 09:41:37 -0800 (PST) X-ASG-Debug-ID: 1415641295-04cbb00e6717acb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tOlRbxto6DOKbQlS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 09:41:36 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAAHfZ9Z012041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 10 Nov 2014 12:41:35 -0500 Received: from hades.localdomain.com (ovpn-113-69.phx2.redhat.com [10.3.113.69]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAAHfShQ015852 for ; Mon, 10 Nov 2014 12:41:34 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag Date: Mon, 10 Nov 2014 15:41:12 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag Message-Id: <1415641272-29383-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> References: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415641296 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: refactor xfs_cross_rename() to not duplicate code from xfs_rename() Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 315 +++++++++++++++++++++++++++++++++++------------------ fs/xfs/xfs_inode.h | 8 +- fs/xfs/xfs_iops.c | 4 +- 3 files changed, 220 insertions(+), 107 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index fea3c92..bf09bfc 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2674,12 +2674,14 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; int new_parent; /* moving to a new dir */ int src_is_directory; /* src_name is a directory */ + int tgt_is_directory; int error; xfs_bmap_free_t free_list; xfs_fsblock_t first_block; @@ -2752,141 +2754,158 @@ xfs_rename( } /* - * Set up the target. - */ - if (target_ip == NULL) { + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { /* - * If there's no space reservation, check the entry will - * fit before actually inserting it. + * target_ip will always exist if RENAME_EXCHANGE flag is set */ - error = xfs_dir_canenter(tp, target_dp, target_name, spaceres); + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); + + error = xfs_cross_rename(src_dp, src_name, src_ip, target_dp, target_name, target_ip, + new_parent, src_is_directory, tgt_is_directory, + &free_list, &first_block, tp, spaceres); if (error) - goto error_return; + goto abort_return; + } else { /* - * If target does not exist and the rename crosses - * directories, adjust the target directory link count - * to account for the ".." reference from the new entry. + * Set up the target. */ - error = xfs_dir_createname(tp, target_dp, target_name, - src_ip->i_ino, &first_block, - &free_list, spaceres); - if (error == -ENOSPC) - goto error_return; - if (error) - goto abort_return; + if (target_ip == NULL) { + /* + * If there's no space reservation, check the entry will + * fit before actually inserting it. + */ + error = xfs_dir_canenter(tp, target_dp, target_name, spaceres); + if (error) + goto error_return; + /* + * If target does not exist and the rename crosses + * directories, adjust the target directory link count + * to account for the ".." reference from the new entry. + */ + error = xfs_dir_createname(tp, target_dp, target_name, + src_ip->i_ino, &first_block, + &free_list, spaceres); + if (error == -ENOSPC) + goto error_return; + if (error) + goto abort_return; - xfs_trans_ichgtime(tp, target_dp, - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_ichgtime(tp, target_dp, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - if (new_parent && src_is_directory) { - error = xfs_bumplink(tp, target_dp); + if (new_parent && src_is_directory) { + error = xfs_bumplink(tp, target_dp); + if (error) + goto abort_return; + } + } else { /* target_ip != NULL */ + /* + * If target exists and it's a directory, check that both + * target and source are directories and that target can be + * destroyed, or that neither is a directory. + */ + if (S_ISDIR(target_ip->i_d.di_mode)) { + /* + * Make sure target dir is empty. + */ + if (!(xfs_dir_isempty(target_ip)) || + (target_ip->i_d.di_nlink > 2)) { + error = -EEXIST; + goto error_return; + } + } + + /* + * Link the source inode under the target name. + * If the source inode is a directory and we are moving + * it across directories, its ".." entry will be + * inconsistent until we replace that down below. + * + * In case there is already an entry with the same + * name at the destination directory, remove it first. + */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + &first_block, &free_list, spaceres); if (error) goto abort_return; - } - } else { /* target_ip != NULL */ + + xfs_trans_ichgtime(tp, target_dp, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * Decrement the link count on the target since the target + * dir no longer points to it. + */ + error = xfs_droplink(tp, target_ip); + if (error) + goto abort_return; + + if (src_is_directory) { + /* + * Drop the link from the old "." entry. + */ + error = xfs_droplink(tp, target_ip); + if (error) + goto abort_return; + } + } /* target_ip != NULL */ + /* - * If target exists and it's a directory, check that both - * target and source are directories and that target can be - * destroyed, or that neither is a directory. + * Remove the source. */ - if (S_ISDIR(target_ip->i_d.di_mode)) { + if (new_parent && src_is_directory) { /* - * Make sure target dir is empty. + * Rewrite the ".." entry to point to the new + * directory. */ - if (!(xfs_dir_isempty(target_ip)) || - (target_ip->i_d.di_nlink > 2)) { - error = -EEXIST; - goto error_return; - } + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, + &first_block, &free_list, spaceres); + ASSERT(error != -EEXIST); + if (error) + goto abort_return; } /* - * Link the source inode under the target name. - * If the source inode is a directory and we are moving - * it across directories, its ".." entry will be - * inconsistent until we replace that down below. + * We always want to hit the ctime on the source inode. * - * In case there is already an entry with the same - * name at the destination directory, remove it first. + * This isn't strictly required by the standards since the source + * inode isn't really being changed, but old unix file systems did + * it and some incremental backup programs won't work without it. */ - error = xfs_dir_replace(tp, target_dp, target_name, - src_ip->i_ino, - &first_block, &free_list, spaceres); - if (error) - goto abort_return; - - xfs_trans_ichgtime(tp, target_dp, - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); /* - * Decrement the link count on the target since the target - * dir no longer points to it. + * Adjust the link count on src_dp. This is necessary when + * renaming a directory, either within one parent when + * the target existed, or across two parent directories. */ - error = xfs_droplink(tp, target_ip); - if (error) - goto abort_return; + if (src_is_directory && (new_parent || target_ip != NULL)) { - if (src_is_directory) { /* - * Drop the link from the old "." entry. + * Decrement link count on src_directory since the + * entry that's moved no longer points to it. */ - error = xfs_droplink(tp, target_ip); + error = xfs_droplink(tp, src_dp); if (error) goto abort_return; } - } /* target_ip != NULL */ - - /* - * Remove the source. - */ - if (new_parent && src_is_directory) { - /* - * Rewrite the ".." entry to point to the new - * directory. - */ - error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, - target_dp->i_ino, - &first_block, &free_list, spaceres); - ASSERT(error != -EEXIST); - if (error) - goto abort_return; - } - /* - * We always want to hit the ctime on the source inode. - * - * This isn't strictly required by the standards since the source - * inode isn't really being changed, but old unix file systems did - * it and some incremental backup programs won't work without it. - */ - xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); - - /* - * Adjust the link count on src_dp. This is necessary when - * renaming a directory, either within one parent when - * the target existed, or across two parent directories. - */ - if (src_is_directory && (new_parent || target_ip != NULL)) { - - /* - * Decrement link count on src_directory since the - * entry that's moved no longer points to it. - */ - error = xfs_droplink(tp, src_dp); + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, + &first_block, &free_list, spaceres); if (error) goto abort_return; - } - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, - &first_block, &free_list, spaceres); - if (error) - goto abort_return; + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + if (new_parent) + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); - xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); - if (new_parent) - xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + } /* RENAME_EXCHANGE */ /* * If this is a synchronous mount, make sure that the @@ -2920,6 +2939,94 @@ xfs_rename( return error; } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +int +xfs_cross_rename( + xfs_inode_t *src_dp, + struct xfs_name *src_name, + xfs_inode_t *src_ip, + xfs_inode_t *target_dp, + struct xfs_name *target_name, + xfs_inode_t *target_ip, + int new_parent, + int src_is_directory, + int tgt_is_directory, + xfs_bmap_free_t *free_list, + xfs_fsblock_t *first_block, + xfs_trans_t *tp, + int spaceres) +{ + int error = 0; + + /* Replace source inode */ + error = xfs_dir_replace(tp, src_dp, src_name, + target_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out_abort; + + /* Replace target inode */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out_abort; + + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * Update ".." entry to match the new parents + * + * In case we are crossing different file types between different + * parents, we must update parent's link count to match the ".." + * entry of the new child (or the removal of it). + */ + if (new_parent) { + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + if (tgt_is_directory) { + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, src_dp->i_ino, + first_block, free_list, spaceres); + if (error) + goto out_abort; + if (!src_is_directory) { + error = xfs_droplink(tp, target_dp); + if (error) + goto out_abort; + error = xfs_bumplink(tp, src_dp); + if (error) + goto out_abort; + } + } + + if (src_is_directory) { + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, target_dp->i_ino, + first_block, free_list, spaceres); + if (error) + goto out_abort; + if (!tgt_is_directory) { + error = xfs_droplink(tp, src_dp); + if (error) + goto out_abort; + error = xfs_bumplink(tp, target_dp); + if (error) + goto out_abort; + } + } + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + } + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); + +out_abort: + return error; +} + STATIC int xfs_iflush_cluster( xfs_inode_t *ip, diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index c10e3fa..c34dd41 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,13 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); +int xfs_cross_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, + struct xfs_inode *src_ip, struct xfs_inode *target_dp, + struct xfs_name *target_name, struct xfs_inode *target_ip, + int new_parent, int src_is_directory, int tgt_is_directory, + struct xfs_bmap_free *free_list, xfs_fsblock_t *first_block, + struct xfs_trans *tp, int spaceres); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 8519442..d5ba974 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -391,7 +391,7 @@ xfs_vn_rename( struct xfs_name nname; /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; xfs_dentry_to_name(&oname, odentry, 0); @@ -399,7 +399,7 @@ xfs_vn_rename( return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From sandeen@sandeen.net Mon Nov 10 12:13:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 264B17F75 for ; Mon, 10 Nov 2014 12:13:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DDBEB304043 for ; Mon, 10 Nov 2014 10:13:06 -0800 (PST) X-ASG-Debug-ID: 1415643184-04bdf0650e1b57e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id y4hyewSDlIEso5HW for ; Mon, 10 Nov 2014 10:13:04 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0B2C4651E56E; Mon, 10 Nov 2014 12:13:03 -0600 (CST) Message-ID: <5461002E.8090506@sandeen.net> Date: Mon, 10 Nov 2014 12:13:02 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Carlos Maiolino , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag References: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> <1415641272-29383-3-git-send-email-cmaiolino@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag In-Reply-To: <1415641272-29383-3-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415643184 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11438 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/10/14 11:41 AM, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. > > Changelog: > > V2: refactor xfs_cross_rename() to not duplicate code from xfs_rename() Which tree is this against? > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 315 +++++++++++++++++++++++++++++++++++------------------ > fs/xfs/xfs_inode.h | 8 +- > fs/xfs/xfs_iops.c | 4 +- > 3 files changed, 220 insertions(+), 107 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index fea3c92..bf09bfc 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2674,12 +2674,14 @@ xfs_rename( > xfs_inode_t *src_ip, > xfs_inode_t *target_dp, > struct xfs_name *target_name, > - xfs_inode_t *target_ip) > + xfs_inode_t *target_ip, > + unsigned int flags) > { > xfs_trans_t *tp = NULL; > xfs_mount_t *mp = src_dp->i_mount; > int new_parent; /* moving to a new dir */ > int src_is_directory; /* src_name is a directory */ > + int tgt_is_directory; > int error; > xfs_bmap_free_t free_list; > xfs_fsblock_t first_block; > @@ -2752,141 +2754,158 @@ xfs_rename( > } > > /* > - * Set up the target. > - */ > - if (target_ip == NULL) { > + * Handle RENAME_EXCHANGE flags > + */ > + if (flags & RENAME_EXCHANGE) { > /* > - * If there's no space reservation, check the entry will > - * fit before actually inserting it. > + * target_ip will always exist if RENAME_EXCHANGE flag is set > */ > - error = xfs_dir_canenter(tp, target_dp, target_name, spaceres); > + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); > + > + error = xfs_cross_rename(src_dp, src_name, src_ip, target_dp, target_name, target_ip, > + new_parent, src_is_directory, tgt_is_directory, > + &free_list, &first_block, tp, spaceres); Ok, just some style drive-by comments, first - EEK ;) 13 args and ~100 chars wide ;) You could at least move some of those back to local vars in the cross_rename function so you don't have to pass them on the stack. It's also customary to pass the transaction pointer as the first arg, i.e.: + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, + target_dp, target_name, target_ip, + &free_list, &first_block, spaceres); and: xfs_cross_rename() { ... new_parent = (src_dp != target_dp); src_is_directory = S_ISDIR(src_ip->i_d.di_mode); tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); ... } There are a few other places where you go well beyond 80 chars, would rather not do that if at all possible. -Eric From cmaiolino@redhat.com Mon Nov 10 12:56:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 539287F72 for ; Mon, 10 Nov 2014 12:56:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 001C7AC1EA for ; Mon, 10 Nov 2014 10:56:53 -0800 (PST) X-ASG-Debug-ID: 1415645812-04bdf0650f1bb100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wSrhSJbfKNweigzl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 10:56:53 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAAIuqpK010824 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 10 Nov 2014 13:56:52 -0500 Received: from hades.localdomain (ovpn-113-69.phx2.redhat.com [10.3.113.69]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAAIumxP001316 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 10 Nov 2014 13:56:51 -0500 Date: Mon, 10 Nov 2014 16:56:47 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag Message-ID: <20141110185644.GA692@hades.localdomain> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag Mail-Followup-To: xfs@oss.sgi.com References: <1415641272-29383-1-git-send-email-cmaiolino@redhat.com> <1415641272-29383-3-git-send-email-cmaiolino@redhat.com> <5461002E.8090506@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5461002E.8090506@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415645813 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Nov 10, 2014 at 12:13:02PM -0600, Eric Sandeen wrote: > On 11/10/14 11:41 AM, Carlos Maiolino wrote: > > Adds a new function named xfs_cross_rename(), responsible to handle requests > > from sys_renameat2() using RENAME_EXCHANGE flag. > > > > Changelog: > > > > V2: refactor xfs_cross_rename() to not duplicate code from xfs_rename() > > Which tree is this against? > It's based on an 'old' version of linux.git, which I was using when I started to work on this patch, I'll rebase it on top of the current tree. > Ok, just some style drive-by comments, first - > > EEK ;) 13 args and ~100 chars wide ;) > > You could at least move some of those back to local vars in the > cross_rename function so you don't have to pass them on the stack. > It's also customary to pass the transaction pointer as the first arg, > i.e.: > > > There are a few other places where you go well beyond 80 chars, would rather > not do that if at all possible. > Yes, after reading it on the list, although it works, it looks a mess :( sorry about it. I'll wait for some other comments and re-work on it, so, tomorrow I can send a new version of it. Thanks for the comments Eric -- Carlos From sandeen@redhat.com Mon Nov 10 16:15:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A75807F4E for ; Mon, 10 Nov 2014 16:15:41 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 44C1EAC005 for ; Mon, 10 Nov 2014 14:15:38 -0800 (PST) X-ASG-Debug-ID: 1415657737-04bdf0650e1d4ca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9pdtXlKHhpZ2hRVZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 14:15:37 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAAMFarm024912 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Mon, 10 Nov 2014 17:15:36 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAAMFZAK021693 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 10 Nov 2014 17:15:36 -0500 Message-ID: <54613907.2000007@redhat.com> Date: Mon, 10 Nov 2014 16:15:35 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss CC: Zorro Lang Subject: [PATCH] xfs_copy: simplify first_agbno calculation Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs_copy: simplify first_agbno calculation Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415657737 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 After ffe9a9a xfsprogs: xfs_copy: fix data corruption of target, xfs_copy started hitting an ASSERT for a 4k sector / 4k blocksize filesystem: # dd if=/dev/zero of=test.img bs=1M count=1024 # mkfs.xfs -s size=4096 test.img # xfs_copy test.img xfs.img xfs_copy: xfs_copy.c:720: main: Assertion `((((((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) + 1) * (1<<9)) + first_residue) % source_blocksize) == 0' failed. Aborted I started digging through all the calculations below, and realized that in the end, all it wants is the first filesystem block after the AG header. XFS_AGFL_BLOCK(mp) + 1 suffices for this purpose; rip out the rest which seems overly complex and apparently bug-prone. I tested this by creating a 4g filesystem with combinations of sector & block size between 512 and 4k, copying in /lib/modules, running an xfs_copy of that, and running repair against the copy; it all looks good. It took a long time, but I will create a simpler/shorter xfstest based on this. Reported-by: Zorro Lang Signed-off-by: Eric Sandeen --- diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 7ce5ec9..279527c 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -475,7 +475,7 @@ main(int argc, char **argv) int open_flags; xfs_off_t pos, end_pos; size_t length; - int c, first_residue, tmp_residue; + int c; __uint64_t size, sizeb; __uint64_t numblocks = 0; int wblocks = 0; @@ -697,27 +697,13 @@ main(int argc, char **argv) ASSERT(source_blocksize % source_sectorsize == 0); ASSERT(source_sectorsize % BBSIZE == 0); - if (source_blocksize > source_sectorsize) { - /* get number of leftover sectors in last block of ag header */ - - tmp_residue = ((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) - % source_blocksize; - first_residue = (tmp_residue == 0) ? 0 : - source_blocksize - tmp_residue; - ASSERT(first_residue % source_sectorsize == 0); - } else if (source_blocksize == source_sectorsize) { - first_residue = 0; - } else { + if (source_blocksize < source_sectorsize) { do_log(_("Error: filesystem block size is smaller than the" " disk sectorsize.\nAborting XFS copy now.\n")); exit(1); } - first_agbno = (((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) - + first_residue) / source_blocksize; - ASSERT(first_agbno != 0); - ASSERT(((((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) - + first_residue) % source_blocksize) == 0); + first_agbno = XFS_AGFL_BLOCK(mp) + 1; /* now open targets */ From cyril.scetbon@free.fr Mon Nov 10 16:46:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 987207F51 for ; Mon, 10 Nov 2014 16:46:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 349F9AC004 for ; Mon, 10 Nov 2014 14:46:39 -0800 (PST) X-ASG-Debug-ID: 1415659594-04cbb00e661a2f60001-NocioJ Received: from mo68.mail-out.ovh.net (2.mo68.mail-out.ovh.net [46.105.52.162]) by cuda.sgi.com with ESMTP id xPTiDVDt8DwKaXiB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 14:46:34 -0800 (PST) X-Barracuda-Envelope-From: cyril.scetbon@free.fr X-Barracuda-Apparent-Source-IP: 46.105.52.162 Received: from mail96.ha.ovh.net (b6.ovh.net [213.186.33.56]) by mo68.mail-out.ovh.net (Postfix) with SMTP id BF440FF998D for ; Mon, 10 Nov 2014 23:46:33 +0100 (CET) Received: from b0.ovh.net (HELO queueout) (213.186.33.50) by b0.ovh.net with SMTP; 11 Nov 2014 00:46:33 +0200 Received: from cag06-2-82-237-68-200.fbx.proxad.net (HELO ?192.168.0.42?) (cscetbon@atid.fr@82.237.68.200) by ns0.ovh.net with SMTP; 11 Nov 2014 00:46:32 +0200 From: Cyril Scetbon Content-Type: multipart/alternative; boundary="Apple-Mail=_2B32A249-4187-4D3F-9D87-F4A81F2EE138" Subject: Enforcing quota for root user Message-Id: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> X-ASG-Orig-Subj: Enforcing quota for root user Date: Mon, 10 Nov 2014 23:46:31 +0100 To: xfs@oss.sgi.com Mime-Version: 1.0 (Mac OS X Mail 8.0 \(1990.1\)) X-Mailer: Apple Mail (2.1990.1) X-Ovh-Tracer-Id: 4631952218005096293 X-Ovh-Remote: 82.237.68.200 (cag06-2-82-237-68-200.fbx.proxad.net) X-Ovh-Local: 213.186.33.20 (ns0.ovh.net) X-OVH-SPAMSTATE: OK X-OVH-SPAMSCORE: 0 X-OVH-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeejhedriedvucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecu X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: 0 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeejhedriedvucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecu X-Barracuda-Connect: 2.mo68.mail-out.ovh.net[46.105.52.162] X-Barracuda-Start-Time: 1415659594 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11449 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --Apple-Mail=_2B32A249-4187-4D3F-9D87-F4A81F2EE138 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Hi, I'm trying to enforce quotas for the superuser without success. Can you = tell me what I'm doing wrong ? see http://pastebin.com/tpF6kVig Thanks --=20 Cyril SCETBON --Apple-Mail=_2B32A249-4187-4D3F-9D87-F4A81F2EE138 Content-Transfer-Encoding: 7bit Content-Type: text/html; charset=us-ascii Hi,

I'm trying to enforce quotas for the superuser without success. Can you tell me what I'm doing wrong ?


Thanks
-- 
Cyril SCETBON

--Apple-Mail=_2B32A249-4187-4D3F-9D87-F4A81F2EE138-- From rusty@ozlabs.org Mon Nov 10 17:03:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1247B7F56 for ; Mon, 10 Nov 2014 17:03:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 86F47AC004 for ; Mon, 10 Nov 2014 15:03:43 -0800 (PST) X-ASG-Debug-ID: 1415660619-04cbb00e661a5120001-NocioJ Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by cuda.sgi.com with ESMTP id x1z249qbggHbs1DW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 15:03:40 -0800 (PST) X-Barracuda-Envelope-From: rusty@ozlabs.org X-Barracuda-Apparent-Source-IP: 103.22.144.67 Received: by ozlabs.org (Postfix, from userid 1011) id B369814012C; Tue, 11 Nov 2014 10:03:37 +1100 (AEDT) From: Rusty Russell To: Jeff Layton , "Michael S. Tsirkin" , Dave Chinner , "Jens Axboe" Cc: virtualization@lists.linux-foundation.org, xfs@oss.sgi.com Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! In-Reply-To: <20141107080416.0837a88c@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! References: <20141107080416.0837a88c@tlielax.poochiereds.net> User-Agent: Notmuch/0.17 (http://notmuchmail.org) Emacs/24.3.1 (x86_64-pc-linux-gnu) Date: Mon, 10 Nov 2014 20:29:50 +1030 Message-ID: <87bnofnzop.fsf@rustcorp.com.au> MIME-Version: 1.0 Content-Type: text/plain X-Barracuda-Connect: ozlabs.org[103.22.144.67] X-Barracuda-Start-Time: 1415660620 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.81 X-Barracuda-Spam-Status: No, SCORE=0.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Jeff Layton writes: > In the latest Fedora rawhide kernel in the repos, I'm seeing the > following oops when mounting xfs. rc2-ish kernels seem to be fine: > > [ 64.669633] ------------[ cut here ]------------ > [ 64.670008] kernel BUG at drivers/block/virtio_blk.c:172! Hmm, that's: BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); But during our probe routine we said: /* We can handle whatever the host told us to handle. */ blk_queue_max_segments(q, vblk->sg_elems-2); Jens? Thanks, Rusty. > [ 64.670008] invalid opcode: 0000 [#1] SMP > [ 64.670008] Modules linked in: xfs libcrc32c snd_hda_codec_generic snd_hda_intel snd_hda_controller snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm ppdev snd_timer snd virtio_net virtio_balloon soundcore serio_raw parport_pc virtio_console pvpanic parport i2c_piix4 nfsd auth_rpcgss nfs_acl lockd grace sunrpc qxl virtio_blk drm_kms_helper ttm drm ata_generic virtio_pci virtio_ring virtio pata_acpi > [ 64.670008] CPU: 1 PID: 705 Comm: mount Not tainted 3.18.0-0.rc3.git2.1.fc22.x86_64 #1 > [ 64.670008] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 > [ 64.670008] task: ffff8800d94a4ec0 ti: ffff8800d9f38000 task.ti: ffff8800d9f38000 > [ 64.670008] RIP: 0010:[] [] virtio_queue_rq+0x290/0x2a0 [virtio_blk] > [ 64.670008] RSP: 0018:ffff8800d9f3b778 EFLAGS: 00010202 > [ 64.670008] RAX: 0000000000000082 RBX: ffff8800d8375700 RCX: dead000000200200 > [ 64.670008] RDX: 0000000000000001 RSI: ffff8800d8375700 RDI: ffff8800d82c4c00 > [ 64.670008] RBP: ffff8800d9f3b7b8 R08: ffff8800d8375700 R09: 0000000000000001 > [ 64.670008] R10: 0000000000000001 R11: 0000000000000004 R12: ffff8800d9f3b7e0 > [ 64.670008] R13: ffff8800d82c4c00 R14: ffff880118629200 R15: 0000000000000000 > [ 64.670008] FS: 00007f5c64dfd840(0000) GS:ffff88011b000000(0000) knlGS:0000000000000000 > [ 64.670008] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b > [ 64.670008] CR2: 00007fffe6458fb8 CR3: 00000000d06d3000 CR4: 00000000000006e0 > [ 64.670008] Stack: > [ 64.670008] ffff880000000001 ffff8800d8375870 0000000000000001 ffff8800d82c4c00 > [ 64.670008] ffff8800d9f3b7e0 0000000000000000 ffff8800d8375700 ffff8800d82c4c48 > [ 64.670008] ffff8800d9f3b828 ffffffff813ec258 ffff8800d82c8000 0000000000000001 > [ 64.670008] Call Trace: > [ 64.670008] [] __blk_mq_run_hw_queue+0x1c8/0x330 > [ 64.670008] [] blk_mq_run_hw_queue+0x70/0x90 > [ 64.670008] [] blk_sq_make_request+0x24d/0x5c0 > [ 64.670008] [] generic_make_request+0xf8/0x150 > [ 64.670008] [] submit_bio+0x78/0x190 > [ 64.670008] [] _xfs_buf_ioapply+0x2be/0x5f0 [xfs] > [ 64.670008] [] ? xlog_bread_noalign+0xa8/0xe0 [xfs] > [ 64.670008] [] xfs_buf_submit_wait+0x91/0x840 [xfs] > [ 64.670008] [] xlog_bread_noalign+0xa8/0xe0 [xfs] > [ 64.670008] [] xlog_bread+0x27/0x60 [xfs] > [ 64.670008] [] xlog_find_verify_cycle+0xf3/0x1b0 [xfs] > [ 64.670008] [] xlog_find_head+0x2f5/0x3e0 [xfs] > [ 64.670008] [] xlog_find_tail+0x3c/0x410 [xfs] > [ 64.670008] [] xlog_recover+0x2d/0x120 [xfs] > [ 64.670008] [] ? xfs_trans_ail_init+0xcb/0x100 [xfs] > [ 64.670008] [] xfs_log_mount+0xdd/0x2c0 [xfs] > [ 64.670008] [] xfs_mountfs+0x514/0x9c0 [xfs] > [ 64.670008] [] ? xfs_mru_cache_create+0x18d/0x1f0 [xfs] > [ 64.670008] [] xfs_fs_fill_super+0x330/0x3b0 [xfs] > [ 64.670008] [] mount_bdev+0x1bc/0x1f0 > [ 64.670008] [] ? xfs_parseargs+0xbe0/0xbe0 [xfs] > [ 64.670008] [] xfs_fs_mount+0x15/0x20 [xfs] > [ 64.670008] [] mount_fs+0x38/0x1c0 > [ 64.670008] [] ? __alloc_percpu+0x15/0x20 > [ 64.670008] [] vfs_kern_mount+0x68/0x160 > [ 64.670008] [] do_mount+0x22c/0xc20 > [ 64.670008] [] ? might_fault+0x5e/0xc0 > [ 64.670008] [] ? memdup_user+0x4b/0x90 > [ 64.670008] [] SyS_mount+0x9e/0x100 > [ 64.670008] [] system_call_fastpath+0x12/0x17 > [ 64.670008] Code: 00 00 c7 86 78 01 00 00 02 00 00 00 48 c7 86 80 01 00 00 00 00 00 00 89 86 7c 01 00 00 e9 02 fe ff ff 66 0f 1f 84 00 00 00 00 00 <0f> 0b 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 > [ 64.670008] RIP [] virtio_queue_rq+0x290/0x2a0 [virtio_blk] > [ 64.670008] RSP > [ 64.715347] ---[ end trace c0ff4a0f2fb21f7f ]--- > > It's reliably reproducible and I don't see this oops when I convert the > same block device to ext4 and mount it. In this setup, the KVM guest > has a virtio block device that has a LVM2 PV on it with an LV on it > that contains the filesystem. > > Let me know if you need any other info to chase this down. > > Thanks! > -- > Jeff Layton From sandeen@redhat.com Mon Nov 10 17:03:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 93DE87F5A for ; Mon, 10 Nov 2014 17:03:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73F4D8F8037 for ; Mon, 10 Nov 2014 15:03:52 -0800 (PST) X-ASG-Debug-ID: 1415660630-04cbb00e691a5180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6wf8GYMtKJOgMb3H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Nov 2014 15:03:51 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAAN3nhe031623 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Mon, 10 Nov 2014 18:03:50 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAAN3mUV017952 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 10 Nov 2014 18:03:49 -0500 Message-ID: <54614454.9080009@redhat.com> Date: Mon, 10 Nov 2014 17:03:48 -0600 From: Eric Sandeen MIME-Version: 1.0 To: fstests@vger.kernel.org, xfs-oss Subject: [PATCH] xfstests: test xfs_copy for various sector and block sizes Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfstests: test xfs_copy for various sector and block sizes Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415660631 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This tests xfs_copy, copying all combinations of sector size and block size possible on the platform running the test. Signed-off-by: Eric Sandeen --- diff --git a/tests/xfs/032 b/tests/xfs/032 new file mode 100755 index 0000000..edd9069 --- /dev/null +++ b/tests/xfs/032 @@ -0,0 +1,80 @@ +#! /bin/bash +# FS QA Test No. 032 +# +# Test xfs_copy for all filesystem sector size / block size +# combinations possible on this platform. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=0 # success is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc + +# real QA test starts here +_supported_fs xfs +_supported_os IRIX Linux + +_require_scratch + +[ $here/src/feature ] || _notrun "src/feature not built, skipping this test" + +[ "$USE_EXTERNAL" = yes ] && _notrun "Cannot xfs_copy with external devices" +[ -n "$XFS_COPY_PROG" ] || _notrun "xfs_copy binary not yet installed" + +rm -f $seqres.full + +SECTORSIZE=`blockdev --getss $SCRATCH_DEV` +PAGESIZE=`src/feature -s` +IMGFILE=$TEST_DIR/${seq}_copy.img + +echo "Silence is golden." + +while [ $SECTORSIZE -le $PAGESIZE ]; do + BLOCKSIZE=$SECTORSIZE; + + while [ $BLOCKSIZE -le $PAGESIZE ]; do + + echo "=== Sector size $SECTORSIZE Block size $BLOCKSIZE ==" >> $seqres.full + _scratch_mkfs -s size=$SECTORSIZE -b size=$BLOCKSIZE -d size=1g >> $seqres.full 2>&1 + _scratch_mount + # light population of the fs + $FSSTRESS_PROG -n 100 -d $SCRATCH_MNT >> $seqres.full 2>&1 + _scratch_unmount + + $XFS_COPY_PROG $SCRATCH_DEV $IMGFILE >> $seqres.full 2>&1 || \ + _fail "Copy failed for Sector size $SECTORSIZE Block size $BLOCKSIZE" + $XFS_REPAIR_PROG $IMGFILE >> $seqres.full 2>&1 || \ + _fail "Copy corrupted for Sector size $SECTORSIZE Block size $BLOCKSIZE" + + BLOCKSIZE=$(($BLOCKSIZE * 2)); + done + SECTORSIZE=$(($SECTORSIZE * 2)); +done + +# success, all done +exit diff --git a/tests/xfs/032.out b/tests/xfs/032.out new file mode 100644 index 0000000..9265732 --- /dev/null +++ b/tests/xfs/032.out @@ -0,0 +1,2 @@ +QA output created by 032 +Silence is golden. diff --git a/tests/xfs/group b/tests/xfs/group index 4b8e51a..dd7f01f 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -29,6 +29,7 @@ 029 mkfs logprint log auto quick 030 repair auto quick 031 repair mkfs auto quick +032 copy auto quick 033 repair auto quick 034 other auto quick 035 dump ioctl tape auto From axboe@kernel.dk Mon Nov 10 17:31:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AAB357F3F for ; Mon, 10 Nov 2014 17:31:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8A555304032 for ; Mon, 10 Nov 2014 15:31:56 -0800 (PST) X-ASG-Debug-ID: 1415662314-04cb6c1e6b1b7960001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id MHj2dx75qZxtrt4m (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Nov 2014 15:31:55 -0800 (PST) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.43 Received: by mail-pa0-f43.google.com with SMTP id eu11so9300637pac.30 for ; Mon, 10 Nov 2014 15:31:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=Kit2T1Rdu2Pabsko2cJks5LzYsfUtfJ5UYbyqv88oCM=; b=DUQSfNBzsDSq3kJbrVD66TUEt7mWsUzRQjt8zbqLhn4NAL+S8458/PD1G5hEegonLn xbWtVmBz1F7pKQU4vzynISXOXoxmIACPKwlDnFELRDfuNaEHou9qr5qytKtdKxQvHJSA k0vbmt9srx47S7V3GVn0B8hftqYvwQ6GaMimfopN2sYmO2yMb2ILbeIZEc5EyrhByNmx LbFydVYca7QIJKe1x2MpbUEYtPLSp3gFpuUMNlmC5/8vw5ZpY/qt8IS054D6Qomyj0Rs vInXzgfEX0MX3KHZ7KU0O1svCdgLKrbaZ0EL0m3otk2u4QqnbXmE46A/hAka476NFDg4 izHw== X-Barracuda-BBL-IP: nil X-Gm-Message-State: ALoCoQnRnLIpHALEIldn3HdNPUadyBcmjS6rWRw2LreZGzYi78ZTrkeikyU93O43OizK26BA4OZH X-Received: by 10.70.38.134 with SMTP id g6mr36308086pdk.124.1415662314289; Mon, 10 Nov 2014 15:31:54 -0800 (PST) Received: from [192.168.3.11] (66.29.187.50.static.utbb.net. [66.29.187.50]) by mx.google.com with ESMTPSA id cc8sm8199303pad.43.2014.11.10.15.31.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 10 Nov 2014 15:31:53 -0800 (PST) Message-ID: <54614AE7.2080204@kernel.dk> Date: Mon, 10 Nov 2014 16:31:51 -0700 From: Jens Axboe User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Rusty Russell , Jeff Layton , "Michael S. Tsirkin" , Dave Chinner CC: virtualization@lists.linux-foundation.org, xfs@oss.sgi.com, Ming Lei Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! In-Reply-To: <87bnofnzop.fsf@rustcorp.com.au> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1415662315 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 2014-11-10 02:59, Rusty Russell wrote: > Jeff Layton writes: > >> In the latest Fedora rawhide kernel in the repos, I'm seeing the >> following oops when mounting xfs. rc2-ish kernels seem to be fine: >> >> [ 64.669633] ------------[ cut here ]------------ >> [ 64.670008] kernel BUG at drivers/block/virtio_blk.c:172! > > Hmm, that's: > > BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); > > But during our probe routine we said: > > /* We can handle whatever the host told us to handle. */ > blk_queue_max_segments(q, vblk->sg_elems-2); > > Jens? Known, I'm afraid, Ming is looking into it. -- Jens Axboe From sandeen@sandeen.net Mon Nov 10 18:37:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 291F67F37 for ; Mon, 10 Nov 2014 18:37:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9B97FAC003 for ; Mon, 10 Nov 2014 16:37:39 -0800 (PST) X-ASG-Debug-ID: 1415666256-04cb6c1e6a1bd7a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id SqactCg0zVNrATcT for ; Mon, 10 Nov 2014 16:37:36 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (184-100-108-101.mpls.qwest.net [184.100.108.101]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 16B7563C3A33; Mon, 10 Nov 2014 18:37:36 -0600 (CST) Message-ID: <54615A4D.2000703@sandeen.net> Date: Mon, 10 Nov 2014 18:37:33 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss CC: Zorro Lang Subject: Re: [PATCH] xfs_copy: fix ASSERT failure on 4k devices... References: <54613907.2000007@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_copy: fix ASSERT failure on 4k devices... In-Reply-To: <54613907.2000007@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415666256 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hm, realized that perhaps a more forceful $SUBJECT would have been better :) -Eric On 11/10/14 4:15 PM, Eric Sandeen wrote: > After ffe9a9a xfsprogs: xfs_copy: fix data corruption of target, > xfs_copy started hitting an ASSERT for a 4k sector / 4k blocksize > filesystem: > > # dd if=/dev/zero of=test.img bs=1M count=1024 > # mkfs.xfs -s size=4096 test.img > # xfs_copy test.img xfs.img > xfs_copy: xfs_copy.c:720: main: Assertion `((((((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) + 1) * (1<<9)) + first_residue) % source_blocksize) == 0' failed. > Aborted > > I started digging through all the calculations below, and realized > that in the end, all it wants is the first filesystem block after > the AG header. XFS_AGFL_BLOCK(mp) + 1 suffices for this purpose; > rip out the rest which seems overly complex and apparently bug-prone. > > I tested this by creating a 4g filesystem with combinations of > sector & block size between 512 and 4k, copying in /lib/modules, > running an xfs_copy of that, and running repair against the copy; > it all looks good. It took a long time, but I will create a > simpler/shorter xfstest based on this. > > Reported-by: Zorro Lang > Signed-off-by: Eric Sandeen > --- > > diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c > index 7ce5ec9..279527c 100644 > --- a/copy/xfs_copy.c > +++ b/copy/xfs_copy.c > @@ -475,7 +475,7 @@ main(int argc, char **argv) > int open_flags; > xfs_off_t pos, end_pos; > size_t length; > - int c, first_residue, tmp_residue; > + int c; > __uint64_t size, sizeb; > __uint64_t numblocks = 0; > int wblocks = 0; > @@ -697,27 +697,13 @@ main(int argc, char **argv) > ASSERT(source_blocksize % source_sectorsize == 0); > ASSERT(source_sectorsize % BBSIZE == 0); > > - if (source_blocksize > source_sectorsize) { > - /* get number of leftover sectors in last block of ag header */ > - > - tmp_residue = ((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) > - % source_blocksize; > - first_residue = (tmp_residue == 0) ? 0 : > - source_blocksize - tmp_residue; > - ASSERT(first_residue % source_sectorsize == 0); > - } else if (source_blocksize == source_sectorsize) { > - first_residue = 0; > - } else { > + if (source_blocksize < source_sectorsize) { > do_log(_("Error: filesystem block size is smaller than the" > " disk sectorsize.\nAborting XFS copy now.\n")); > exit(1); > } > > - first_agbno = (((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) > - + first_residue) / source_blocksize; > - ASSERT(first_agbno != 0); > - ASSERT(((((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) > - + first_residue) % source_blocksize) == 0); > + first_agbno = XFS_AGFL_BLOCK(mp) + 1; > > /* now open targets */ > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tom.leiming@gmail.com Mon Nov 10 18:56:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 49E7B7F3F for ; Mon, 10 Nov 2014 18:56:30 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8D8AAC003 for ; Mon, 10 Nov 2014 16:56:29 -0800 (PST) X-ASG-Debug-ID: 1415667388-04cb6c1e6d1bf570001-NocioJ Received: from mail-ob0-f170.google.com (mail-ob0-f170.google.com [209.85.214.170]) by cuda.sgi.com with ESMTP id JYULSA9pxR4wLhfJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Nov 2014 16:56:28 -0800 (PST) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.170] Received: by mail-ob0-f170.google.com with SMTP id nt9so7258802obb.29 for ; Mon, 10 Nov 2014 16:56:28 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=mUDGGyUm066zXqZbQM7Ec5Z46aEHZeusoUxKeUtK3Uk=; b=S/wuTmVzgO3RL1oQKhuEUiGTItgygSgLppP4LYOed4l4HSeqgllkizc73xgKrVVvLy HWk+phBCpc5PFFkYZx/TpF/+qcdXKroHgTzR8BUMM73Op/6qwXRZRhTrqVg55M3Igdg5 9HaiLfOw+huPlVzrRsszfTqIGOyzVMI816vn66DLCtepxjKlirfslYdmuNpZdFcaTsSu dyyGtKe2L+2mSHcdWtFY5mr5jdHW/SChXfqXzCKCvJIPI/r2P4TU5sZt9yE9Nlrq+H9a 8VWNSFEBaoNJP1xJ1CX+ub/d+4tmwar4rIbPi27euJKwNcjI4I/POZ7uSXVIRVuxMsW+ g2dg== MIME-Version: 1.0 X-Received: by 10.60.69.66 with SMTP id c2mr4608186oeu.60.1415667388009; Mon, 10 Nov 2014 16:56:28 -0800 (PST) Received: by 10.202.137.139 with HTTP; Mon, 10 Nov 2014 16:56:27 -0800 (PST) In-Reply-To: <54614AE7.2080204@kernel.dk> References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> <54614AE7.2080204@kernel.dk> Date: Tue, 11 Nov 2014 08:56:27 +0800 Message-ID: Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! From: Ming Lei X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! To: Jens Axboe Cc: Rusty Russell , Jeff Layton , "Michael S. Tsirkin" , Dave Chinner , Linux Virtualization , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ob0-f170.google.com[209.85.214.170] X-Barracuda-Start-Time: 1415667388 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 11, 2014 at 7:31 AM, Jens Axboe wrote: > On 2014-11-10 02:59, Rusty Russell wrote: >> >> Jeff Layton writes: >> >>> In the latest Fedora rawhide kernel in the repos, I'm seeing the >>> following oops when mounting xfs. rc2-ish kernels seem to be fine: >>> >>> [ 64.669633] ------------[ cut here ]------------ >>> [ 64.670008] kernel BUG at drivers/block/virtio_blk.c:172! >> >> >> Hmm, that's: >> >> BUG_ON(req->nr_phys_segments + 2 > vblk->sg_elems); >> >> But during our probe routine we said: >> >> /* We can handle whatever the host told us to handle. */ >> blk_queue_max_segments(q, vblk->sg_elems-2); >> >> Jens? > > > Known, I'm afraid, Ming is looking into it. There is one obvious bug which should have been fixed by below patch(0001-block-blk-merge-fix-blk_recount_segments.patch"): http://marc.info/?l=linux-virtualization&m=141562191719405&q=p3 And there might be another one, I appreciate someone can post log which is printed by patch("blk-seg.patch") in below link if the bug still can be triggered even with above fix: http://marc.info/?l=linux-virtualization&m=141473040618467&q=p3 Thanks, -- Ming Lei From stan@hardwarefreak.com Tue Nov 11 00:56:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E9737F37 for ; Tue, 11 Nov 2014 00:56:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DC36304043 for ; Mon, 10 Nov 2014 22:56:17 -0800 (PST) X-ASG-Debug-ID: 1415688976-04cb6c1e6a1d8440001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id yi9vJFlf2PICGZRb for ; Mon, 10 Nov 2014 22:56:16 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by greer.hardwarefreak.com (Postfix) with ESMTPA id 863516C105; Tue, 11 Nov 2014 00:56:15 -0600 (CST) Message-ID: <5461B333.8050609@hardwarefreak.com> Date: Tue, 11 Nov 2014 00:56:51 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.7.0 MIME-Version: 1.0 To: Cyril Scetbon , xfs@oss.sgi.com Subject: Re: Enforcing quota for root user References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1415688976 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 11/10/2014 04:46 PM, Cyril Scetbon wrote: > Hi, > > I'm trying to enforce quotas for the superuser without success. Can you > tell me what I'm doing wrong ? http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch08s04.html Look at the last line. Cheers, Stan From cyril.scetbon@free.fr Tue Nov 11 04:23:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6CEDB7F3F for ; Tue, 11 Nov 2014 04:23:03 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B348304032 for ; Tue, 11 Nov 2014 02:23:00 -0800 (PST) X-ASG-Debug-ID: 1415701372-04cbb00e691cff30001-NocioJ Received: from mo68.mail-out.ovh.net (4.mo68.mail-out.ovh.net [46.105.59.63]) by cuda.sgi.com with ESMTP id a62Dt3jgKqzKTV4B (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 02:22:58 -0800 (PST) X-Barracuda-Envelope-From: cyril.scetbon@free.fr X-Barracuda-Apparent-Source-IP: 46.105.59.63 Received: from mail189.ha.ovh.net (b6.ovh.net [213.186.33.56]) by mo68.mail-out.ovh.net (Postfix) with SMTP id 36C32FFB070 for ; Tue, 11 Nov 2014 11:22:52 +0100 (CET) Received: from b0.ovh.net (HELO queueout) (213.186.33.50) by b0.ovh.net with SMTP; 11 Nov 2014 12:22:52 +0200 Received: from unknown (HELO ?IPv6:::1?) (cscetbon@atid.fr@83.206.216.177) by ns0.ovh.net with SMTP; 11 Nov 2014 12:22:51 +0200 Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Mac OS X Mail 8.0 \(1990.1\)) Subject: Re: Enforcing quota for root user From: Cyril Scetbon X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: <5461B333.8050609@hardwarefreak.com> Date: Tue, 11 Nov 2014 11:22:49 +0100 Cc: xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> To: Stan Hoeppner X-Mailer: Apple Mail (2.1990.1) X-Ovh-Tracer-Id: 16391695269185112027 X-Ovh-Remote: 83.206.216.177 () X-Ovh-Local: 213.186.33.20 (ns0.ovh.net) X-OVH-SPAMSTATE: OK X-OVH-SPAMSCORE: -100 X-OVH-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeejhedriedvucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeejhedriedvucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-Barracuda-Connect: 4.mo68.mail-out.ovh.net[46.105.59.63] X-Barracuda-Start-Time: 1415701373 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- That's what I've read first, but someone showed me a sample where it = works. He just told me he was using project quota. However, does it make = sense ?=20 I've also read somewhere else that quota is never enforced for root user = (id,gid=3D0) that's why I was testing it .... --=20 Cyril SCETBON > On 11 Nov 2014, at 07:56, Stan Hoeppner = wrote: >=20 >=20 >=20 > On 11/10/2014 04:46 PM, Cyril Scetbon wrote: >> Hi, >>=20 >> I'm trying to enforce quotas for the superuser without success. Can = you >> tell me what I'm doing wrong ? >=20 > = http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch08s04.= html >=20 > Look at the last line. >=20 > Cheers, > Stan >=20 From annieford8@gmail.com Tue Nov 11 04:29:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E78CC7F3F for ; Tue, 11 Nov 2014 04:29:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D60F98F8033 for ; Tue, 11 Nov 2014 02:29:02 -0800 (PST) X-ASG-Debug-ID: 1415701741-04cb6c1e6c1dd500001-NocioJ Received: from mwork.nabble.com (static.162.253.133.43.macminivault.com [162.253.133.43]) by cuda.sgi.com with ESMTP id gv9A37CQnXnxQDDT for ; Tue, 11 Nov 2014 02:29:01 -0800 (PST) X-Barracuda-Envelope-From: annieford8@gmail.com X-Barracuda-Apparent-Source-IP: 162.253.133.43 Received: from mtom.nabble.com (unknown [162.253.133.81]) by mwork.nabble.com (Postfix) with ESMTP id 0D19B997BBD for ; Tue, 11 Nov 2014 02:29:02 -0800 (PST) Date: Tue, 11 Nov 2014 03:23:29 -0700 (MST) From: Victor23 To: xfs@oss.sgi.com Message-ID: <1415701409428-35027.post@n7.nabble.com> In-Reply-To: <51902.204.1225478698.listbaby@www.dejadirect.com> References: <51902.204.1225478698.listbaby@www.dejadirect.com> Subject: Re: D:V::E::: PRESENTS: DISTURBIA @ LOVE Nightclub (FREE+VIP+$1000 costume contest) MIME-Version: 1.0 X-ASG-Orig-Subj: Re: D:V::E::: PRESENTS: DISTURBIA @ LOVE Nightclub (FREE+VIP+$1000 costume contest) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: static.162.253.133.43.macminivault.com[162.253.133.43] X-Barracuda-Start-Time: 1415701741 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.60 X-Barracuda-Spam-Status: No, SCORE=1.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0613, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11467 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 1.00 BSF_SC0_MV0613 BSF_SC0_MV0613 I want to book best dance club nyc for my bachelor party. I am thinking to hire some talented event planners for all the arrangements of my party. -- View this message in context: http://xfs.9218.n7.nabble.com/D-V-E-PRESENTS-DISTURBIA-LOVE-Nightclub-FREE-VIP-1000-costume-contest-tp22117p35027.html Sent from the Xfs - General mailing list archive at Nabble.com. From bfoster@redhat.com Tue Nov 11 07:37:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 43AA67F3F for ; Tue, 11 Nov 2014 07:37:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06B54304039 for ; Tue, 11 Nov 2014 05:37:09 -0800 (PST) X-ASG-Debug-ID: 1415713028-04bdf0650c208950001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SRiMdKIqcpreV5uW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 05:37:08 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABDb7Ur011545 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 08:37:07 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABDb6gm031257; Tue, 11 Nov 2014 08:37:07 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id ECE31122F87; Tue, 11 Nov 2014 08:37:05 -0500 (EST) Date: Tue, 11 Nov 2014 08:37:05 -0500 From: Brian Foster To: Eric Sandeen Cc: xfs-oss , Zorro Lang Subject: Re: [PATCH] xfs_copy: simplify first_agbno calculation Message-ID: <20141111133705.GA38867@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs_copy: simplify first_agbno calculation References: <54613907.2000007@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54613907.2000007@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415713028 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Nov 10, 2014 at 04:15:35PM -0600, Eric Sandeen wrote: > After ffe9a9a xfsprogs: xfs_copy: fix data corruption of target, > xfs_copy started hitting an ASSERT for a 4k sector / 4k blocksize > filesystem: > > # dd if=/dev/zero of=test.img bs=1M count=1024 > # mkfs.xfs -s size=4096 test.img > # xfs_copy test.img xfs.img > xfs_copy: xfs_copy.c:720: main: Assertion `((((((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) + 1) * (1<<9)) + first_residue) % source_blocksize) == 0' failed. > Aborted > > I started digging through all the calculations below, and realized > that in the end, all it wants is the first filesystem block after > the AG header. XFS_AGFL_BLOCK(mp) + 1 suffices for this purpose; > rip out the rest which seems overly complex and apparently bug-prone. > > I tested this by creating a 4g filesystem with combinations of > sector & block size between 512 and 4k, copying in /lib/modules, > running an xfs_copy of that, and running repair against the copy; > it all looks good. It took a long time, but I will create a > simpler/shorter xfstest based on this. > > Reported-by: Zorro Lang > Signed-off-by: Eric Sandeen > --- Looks Ok to me: Reviewed-by: Brian Foster I just noticed the bug... so the problem was basically the assumption that sector size == BBSIZE? Brian > > diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c > index 7ce5ec9..279527c 100644 > --- a/copy/xfs_copy.c > +++ b/copy/xfs_copy.c > @@ -475,7 +475,7 @@ main(int argc, char **argv) > int open_flags; > xfs_off_t pos, end_pos; > size_t length; > - int c, first_residue, tmp_residue; > + int c; > __uint64_t size, sizeb; > __uint64_t numblocks = 0; > int wblocks = 0; > @@ -697,27 +697,13 @@ main(int argc, char **argv) > ASSERT(source_blocksize % source_sectorsize == 0); > ASSERT(source_sectorsize % BBSIZE == 0); > > - if (source_blocksize > source_sectorsize) { > - /* get number of leftover sectors in last block of ag header */ > - > - tmp_residue = ((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) > - % source_blocksize; > - first_residue = (tmp_residue == 0) ? 0 : > - source_blocksize - tmp_residue; > - ASSERT(first_residue % source_sectorsize == 0); > - } else if (source_blocksize == source_sectorsize) { > - first_residue = 0; > - } else { > + if (source_blocksize < source_sectorsize) { > do_log(_("Error: filesystem block size is smaller than the" > " disk sectorsize.\nAborting XFS copy now.\n")); > exit(1); > } > > - first_agbno = (((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) > - + first_residue) / source_blocksize; > - ASSERT(first_agbno != 0); > - ASSERT(((((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) > - + first_residue) % source_blocksize) == 0); > + first_agbno = XFS_AGFL_BLOCK(mp) + 1; > > /* now open targets */ > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From stan@hardwarefreak.com Tue Nov 11 09:35:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0E5597F3F for ; Tue, 11 Nov 2014 09:35:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFC608F8049 for ; Tue, 11 Nov 2014 07:35:33 -0800 (PST) X-ASG-Debug-ID: 1415720132-04cb6c1e6d202500001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id dxYidOFJiyLuHP4N for ; Tue, 11 Nov 2014 07:35:32 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by greer.hardwarefreak.com (Postfix) with ESMTPA id 40ABF6C181; Tue, 11 Nov 2014 09:35:32 -0600 (CST) Message-ID: <54622CE8.7050508@hardwarefreak.com> Date: Tue, 11 Nov 2014 09:36:08 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.7.0 MIME-Version: 1.0 To: Cyril Scetbon CC: xfs@oss.sgi.com Subject: Re: Enforcing quota for root user References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1415720132 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 11/11/2014 04:22 AM, Cyril Scetbon wrote: > That's what I've read first, but someone showed me a sample where it works. He just told me he was using project quota. However, does it make sense ? > I've also read somewhere else that quota is never enforced for root user (id,gid=0) that's why I was testing it .... No, it doesn't make sense. Why would you want to enforce quotas for root? Regards, Stan From dongsu.park@profitbricks.com Tue Nov 11 09:42:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D14537F47 for ; Tue, 11 Nov 2014 09:42:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A04438F804C for ; Tue, 11 Nov 2014 07:42:57 -0800 (PST) X-ASG-Debug-ID: 1415720574-04bdf0650c23b2a0001-NocioJ Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by cuda.sgi.com with ESMTP id 8ORDK74pjBkfCBld (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Nov 2014 07:42:55 -0800 (PST) X-Barracuda-Envelope-From: dongsu.park@profitbricks.com X-Barracuda-Apparent-Source-IP: 209.85.212.170 Received: by mail-wi0-f170.google.com with SMTP id r20so2179875wiv.1 for ; Tue, 11 Nov 2014 07:42:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=+xqMrLE+sbdFPtu/zg9vbbqtlBFdE8dAkbnj9hKb69w=; b=Ux1XKsZcjvR3dtJLvKnB1SIP6/6iyTZnbo5KBFUMk5to+8UN0YaZefT9A/Vh4FSTy7 wmTJPERgwhAVemZuM4h2+aBxTY83GOwGajHSAD/a+qh1eqmHP4kmf6CRWLCkRrwuNkiW yFrNjyWOfl8XvLgCs51TGDS/Kq26JymL6F5fZguIOVEHx0dWzBh4+94KqZdEbdg9GOg6 XKMC6t8Cp3L4N3psQhIxMgEde7L6tzHlHOF7eQWiJ7e8r8Y6BPmRgf7Jyad+4hRaqU+D GqsiY6qHrI9w5Arv7JixIwjP5HBdkZy+7GFSCOJSrr0Lz0OVKRUhil8t8k8lBmZ3urn7 YJww== X-Gm-Message-State: ALoCoQm/e+yxX8oW6RR6owWMYrFhohEgnVmT7kqgCvInmmGxkOhCXY/oAsY6eyaRqhwGm+GmA/BJ X-Received: by 10.194.109.226 with SMTP id hv2mr54711615wjb.45.1415720574281; Tue, 11 Nov 2014 07:42:54 -0800 (PST) Received: from gmail.com ([62.217.45.26]) by mx.google.com with ESMTPSA id gw6sm17957826wib.8.2014.11.11.07.42.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Nov 2014 07:42:53 -0800 (PST) Date: Tue, 11 Nov 2014 16:42:50 +0100 From: Dongsu Park To: Ming Lei Cc: Jens Axboe , "Michael S. Tsirkin" , Dave Chinner , xfs@oss.sgi.com, Jeff Layton , Rusty Russell , Lukas Czerner , Christoph Hellwig , Linux Virtualization Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! Message-ID: <20141111154250.GA16906@gmail.com> X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> <54614AE7.2080204@kernel.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-wi0-f170.google.com[209.85.212.170] X-Barracuda-Start-Time: 1415720575 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Ming, On 11.11.2014 08:56, Ming Lei wrote: > On Tue, Nov 11, 2014 at 7:31 AM, Jens Axboe wrote: > > Known, I'm afraid, Ming is looking into it. Actually I had also tried to reproduce this bug, without success. But today I happened to know how to trigger the bug, by coincidence, during testing other things. Try to run xfstests/generic/034. You'll see the crash immediately. Tested on a QEMU VM with kernel 3.18-rc4, virtio-blk, dm-flakey and xfs. > There is one obvious bug which should have been fixed by below > patch(0001-block-blk-merge-fix-blk_recount_segments.patch"): > > http://marc.info/?l=linux-virtualization&m=141562191719405&q=p3 This patch didn't bring anything to me, as Lukas said. > And there might be another one, I appreciate someone can post > log which is printed by patch("blk-seg.patch") in below link if the > bug still can be triggered even with above fix: > > http://marc.info/?l=linux-virtualization&m=141473040618467&q=p3 "blk_recount_segments: 1-1-1 vcnt-128 segs-128" As long as I understood so far, the reason is that bi_phys_segments gets sometimes bigger than queue_max_sectors() after blk_recount_segments(). That happens no matter whether segments are recalculated or not. I'm not completely sure about what to do, but how about the attached patch? It seems to work, according to several xfstests runs. Cheers, Dongsu ---- >From 1db98323931eb9ab430116c4d909d22222c16e22 Mon Sep 17 00:00:00 2001 From: Dongsu Park Date: Tue, 11 Nov 2014 13:10:59 +0100 Subject: [RFC PATCH] blk-merge: make bi_phys_segments consider also queue_max_segments() When recounting the number of physical segments, the number of max segments of request_queue must be also taken into account. Otherwise bio->bi_phys_segments could get bigger than queue_max_segments(). Then this results in virtio_queue_rq() seeing req->nr_phys_segments that is greater than expected. Although the initial queue_max_segments was set to (vblk->sg_elems - 2), a request comes in with a larger value of nr_phys_segments, which triggers the BUG_ON() condition. This commit should fix a kernel crash in virtio_blk, which occurs especially frequently when it runs with blk-mq, device mapper, and xfs. The simplest way to reproduce this bug is to run xfstests/generic/034. Note, test 034 requires dm-flakey to be turned on in the kernel config. See the kernel trace below: ------------[ cut here ]------------ kernel BUG at drivers/block/virtio_blk.c:172! invalid opcode: 0000 [#1] SMP CPU: 1 PID: 3343 Comm: mount Not tainted 3.18.0-rc4+ #55 RIP: 0010:[] [] virtio_queue_rq+0x277/0x280 Call Trace: [] __blk_mq_run_hw_queue+0x1a8/0x300 [] blk_mq_run_hw_queue+0x6d/0x90 [] blk_sq_make_request+0x23e/0x360 [] generic_make_request+0xc0/0x110 [] submit_bio+0x69/0x130 [] _xfs_buf_ioapply+0x2bd/0x410 [] ? xlog_bread_noalign+0xa8/0xe0 [] xfs_buf_submit_wait+0x61/0x1d0 [] xlog_bread_noalign+0xa8/0xe0 [] xlog_bread+0x27/0x60 [] xlog_find_verify_cycle+0xe1/0x190 [] xlog_find_head+0x2d1/0x3c0 [] xlog_find_tail+0x2d/0x3f0 [] xlog_recover+0x1e/0xf0 [] xfs_log_mount+0x24c/0x2c0 [] xfs_mountfs+0x44b/0x7a0 [] xfs_fs_fill_super+0x2ba/0x330 [] mount_bdev+0x194/0x1d0 [] ? xfs_parseargs+0xbe0/0xbe0 [] xfs_fs_mount+0x15/0x20 [] mount_fs+0x39/0x1b0 [] ? __alloc_percpu+0x15/0x20 [] vfs_kern_mount+0x67/0x110 [] do_mount+0x204/0xad0 [] SyS_mount+0x8b/0xe0 [] system_call_fastpath+0x12/0x17 RIP [] virtio_queue_rq+0x277/0x280 ---[ end trace ae3ec6426f011b5d ]--- Signed-off-by: Dongsu Park Tested-by: Dongsu Park Cc: Ming Lei Cc: Jens Axboe Cc: Rusty Russell Cc: Jeff Layton Cc: Dave Chinner Cc: "Michael S. Tsirkin" Cc: Lukas Czerner Cc: Christoph Hellwig Cc: virtualization@lists.linux-foundation.org --- block/blk-merge.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/block/blk-merge.c b/block/blk-merge.c index b3ac40a..d808601 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -103,13 +103,16 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio) if (no_sg_merge && !bio_flagged(bio, BIO_CLONED) && merge_not_need) - bio->bi_phys_segments = bio->bi_vcnt; + bio->bi_phys_segments = min_t(unsigned int, bio->bi_vcnt, + queue_max_segments(q)); else { struct bio *nxt = bio->bi_next; bio->bi_next = NULL; - bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio, - no_sg_merge && merge_not_need); + bio->bi_phys_segments = min_t(unsigned int, + __blk_recalc_rq_segments(q, bio, no_sg_merge + && merge_not_need), + queue_max_segments(q)); bio->bi_next = nxt; } -- 1.9.3 From sandeen@sandeen.net Tue Nov 11 10:02:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 406BE7F4E for ; Tue, 11 Nov 2014 10:02:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2E80A8F8049 for ; Tue, 11 Nov 2014 08:01:58 -0800 (PST) X-ASG-Debug-ID: 1415721717-04cbb00e6620b9b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id T3RFSiArcedcp1we for ; Tue, 11 Nov 2014 08:01:57 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CB80663C3A34; Tue, 11 Nov 2014 10:01:56 -0600 (CST) Message-ID: <546232F3.6030609@sandeen.net> Date: Tue, 11 Nov 2014 10:01:55 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , Eric Sandeen CC: Zorro Lang , xfs-oss Subject: Re: [PATCH] xfs_copy: simplify first_agbno calculation References: <54613907.2000007@redhat.com> <20141111133705.GA38867@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs_copy: simplify first_agbno calculation In-Reply-To: <20141111133705.GA38867@bfoster.bfoster> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415721717 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11476 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/11/14 7:37 AM, Brian Foster wrote: > On Mon, Nov 10, 2014 at 04:15:35PM -0600, Eric Sandeen wrote: >> After ffe9a9a xfsprogs: xfs_copy: fix data corruption of target, >> xfs_copy started hitting an ASSERT for a 4k sector / 4k blocksize >> filesystem: >> >> # dd if=/dev/zero of=test.img bs=1M count=1024 >> # mkfs.xfs -s size=4096 test.img >> # xfs_copy test.img xfs.img >> xfs_copy: xfs_copy.c:720: main: Assertion `((((((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) + 1) * (1<<9)) + first_residue) % source_blocksize) == 0' failed. >> Aborted >> >> I started digging through all the calculations below, and realized >> that in the end, all it wants is the first filesystem block after >> the AG header. XFS_AGFL_BLOCK(mp) + 1 suffices for this purpose; >> rip out the rest which seems overly complex and apparently bug-prone. >> >> I tested this by creating a 4g filesystem with combinations of >> sector & block size between 512 and 4k, copying in /lib/modules, >> running an xfs_copy of that, and running repair against the copy; >> it all looks good. It took a long time, but I will create a >> simpler/shorter xfstest based on this. >> >> Reported-by: Zorro Lang >> Signed-off-by: Eric Sandeen >> --- > > Looks Ok to me: > > Reviewed-by: Brian Foster > > I just noticed the bug... so the problem was basically the assumption > that sector size == BBSIZE? To be honest, I never quite figured out what the root cause bug was; bad me. The previous commit was supposed to *fix* the assumption that sector size == BBSIZE. But I got lost in all the gyrations. I guess maybe I should work that out, but I'm not sure it's worth it. ;) -Eric > Brian > >> >> diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c >> index 7ce5ec9..279527c 100644 >> --- a/copy/xfs_copy.c >> +++ b/copy/xfs_copy.c >> @@ -475,7 +475,7 @@ main(int argc, char **argv) >> int open_flags; >> xfs_off_t pos, end_pos; >> size_t length; >> - int c, first_residue, tmp_residue; >> + int c; >> __uint64_t size, sizeb; >> __uint64_t numblocks = 0; >> int wblocks = 0; >> @@ -697,27 +697,13 @@ main(int argc, char **argv) >> ASSERT(source_blocksize % source_sectorsize == 0); >> ASSERT(source_sectorsize % BBSIZE == 0); >> >> - if (source_blocksize > source_sectorsize) { >> - /* get number of leftover sectors in last block of ag header */ >> - >> - tmp_residue = ((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) >> - % source_blocksize; >> - first_residue = (tmp_residue == 0) ? 0 : >> - source_blocksize - tmp_residue; >> - ASSERT(first_residue % source_sectorsize == 0); >> - } else if (source_blocksize == source_sectorsize) { >> - first_residue = 0; >> - } else { >> + if (source_blocksize < source_sectorsize) { >> do_log(_("Error: filesystem block size is smaller than the" >> " disk sectorsize.\nAborting XFS copy now.\n")); >> exit(1); >> } >> >> - first_agbno = (((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) >> - + first_residue) / source_blocksize; >> - ASSERT(first_agbno != 0); >> - ASSERT(((((XFS_AGFL_DADDR(mp) + 1) * BBSIZE) >> - + first_residue) % source_blocksize) == 0); >> + first_agbno = XFS_AGFL_BLOCK(mp) + 1; >> >> /* now open targets */ >> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bfoster@redhat.com Tue Nov 11 10:13:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F32817F51 for ; Tue, 11 Nov 2014 10:13:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B41008F8049 for ; Tue, 11 Nov 2014 08:13:18 -0800 (PST) X-ASG-Debug-ID: 1415722397-04bdf0650e23cd80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7UpvLvKPxtRLOnlb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 08:13:17 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABGDFVk024772 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 11:13:16 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABGDFRA002732 for ; Tue, 11 Nov 2014 11:13:15 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45D19122F87; Tue, 11 Nov 2014 11:13:13 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq Date: Tue, 11 Nov 2014 11:13:13 -0500 X-ASG-Orig-Subj: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq Message-Id: <1415722393-32223-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415722397 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The xfslogd workqueue is a global, single-job workqueue for buffer ioend processing. This means we allow for a single work item at a time for all possible XFS mounts on a system. fsstress testing in loopback XFS over XFS configurations has reproduced xfslogd deadlocks due to the single threaded nature of the queue and dependencies introduced between the separate XFS instances by online discard (-o discard). Discard over a loopback device converts the discard request to a hole punch (fallocate) on the underlying file. Online discard requests are issued synchronously and from xfslogd context in XFS, hence the xfslogd workqueue is blocked in the upper fs waiting on a hole punch request to be servied in the lower fs. If the lower fs issues I/O that depends on xfslogd to complete, both filesystems end up hung indefinitely. This is reproduced reliabily by generic/013 on XFS->loop->XFS test devices with the '-o discard' mount option. Further, docker implementations appear to use this kind of configuration for container instance filesystems by default (container fs->dm-> loop->base fs) and therefore are subject to this deadlock when running on XFS. Replace the global xfslogd workqueue with a per-mount variant. This guarantees each mount access to a single worker and prevents deadlocks due to inter-fs dependencies introduced by discard. Since the queue is only responsible for iodone processing at this point in time, rename xfslogd to xfs-iodone. Signed-off-by: Brian Foster --- I've left the wq in xfs_mount rather than moved to the buftarg in this version due to the questions expressed here: http://oss.sgi.com/archives/xfs/2014-11/msg00117.html ... particularly around the potential creation of multiple (of what is now) max_active=1 queues per-fs. Brian v2: - Rename xfslogd workqueue to xfs-iodone. v1: http://oss.sgi.com/archives/xfs/2014-10/msg00539.html fs/xfs/xfs_buf.c | 13 ++----------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_super.c | 11 ++++++++++- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 24b4ebe..b7af140 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -44,8 +44,6 @@ static kmem_zone_t *xfs_buf_zone; -static struct workqueue_struct *xfslogd_workqueue; - #ifdef XFS_BUF_LOCK_TRACKING # define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid) # define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1) @@ -1053,7 +1051,8 @@ xfs_buf_ioend_async( struct xfs_buf *bp) { INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); - queue_work(xfslogd_workqueue, &bp->b_iodone_work); + queue_work(bp->b_target->bt_mount->m_iodone_workqueue, + &bp->b_iodone_work); } void @@ -1882,15 +1881,8 @@ xfs_buf_init(void) if (!xfs_buf_zone) goto out; - xfslogd_workqueue = alloc_workqueue("xfslogd", - WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 1); - if (!xfslogd_workqueue) - goto out_free_buf_zone; - return 0; - out_free_buf_zone: - kmem_zone_destroy(xfs_buf_zone); out: return -ENOMEM; } @@ -1898,6 +1890,5 @@ xfs_buf_init(void) void xfs_buf_terminate(void) { - destroy_workqueue(xfslogd_workqueue); kmem_zone_destroy(xfs_buf_zone); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b0447c8..6de1283 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -168,6 +168,7 @@ typedef struct xfs_mount { /* low free space thresholds */ struct xfs_kobj m_kobj; + struct workqueue_struct *m_iodone_workqueue; struct workqueue_struct *m_data_workqueue; struct workqueue_struct *m_unwritten_workqueue; struct workqueue_struct *m_cil_workqueue; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 9f622fe..ef55264 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -842,10 +842,16 @@ STATIC int xfs_init_mount_workqueues( struct xfs_mount *mp) { + mp->m_iodone_workqueue = alloc_workqueue("xfs-iodone/%s", + WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_FREEZABLE, 1, + mp->m_fsname); + if (!mp->m_iodone_workqueue) + goto out; + mp->m_data_workqueue = alloc_workqueue("xfs-data/%s", WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_data_workqueue) - goto out; + goto out_destroy_iodone; mp->m_unwritten_workqueue = alloc_workqueue("xfs-conv/%s", WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); @@ -884,6 +890,8 @@ out_destroy_unwritten: destroy_workqueue(mp->m_unwritten_workqueue); out_destroy_data_iodone_queue: destroy_workqueue(mp->m_data_workqueue); +out_destroy_iodone: + destroy_workqueue(mp->m_iodone_workqueue); out: return -ENOMEM; } @@ -898,6 +906,7 @@ xfs_destroy_mount_workqueues( destroy_workqueue(mp->m_cil_workqueue); destroy_workqueue(mp->m_data_workqueue); destroy_workqueue(mp->m_unwritten_workqueue); + destroy_workqueue(mp->m_iodone_workqueue); } /* -- 1.8.3.1 From tom.leiming@gmail.com Tue Nov 11 10:42:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 599E97F55 for ; Tue, 11 Nov 2014 10:42:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44AEB8F8049 for ; Tue, 11 Nov 2014 08:42:13 -0800 (PST) X-ASG-Debug-ID: 1415724131-04cb6c1e6a2090b0001-NocioJ Received: from mail-ob0-f171.google.com (mail-ob0-f171.google.com [209.85.214.171]) by cuda.sgi.com with ESMTP id q7Etj3CAcA5JNJ2K (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Nov 2014 08:42:12 -0800 (PST) X-Barracuda-Envelope-From: tom.leiming@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.171] Received: by mail-ob0-f171.google.com with SMTP id wp18so7749375obc.30 for ; Tue, 11 Nov 2014 08:42:11 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.171] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=/31xWOAs2JepTMmwgDK43b0iwOKUmWMdxythO/X0Who=; b=JZ+jTcZ2lzp/w6HEOtx+vjEa75cOFQXorWRLdxMpfT/IdYaBpeJHI4adWknhkZAC09 BLQKoq6rx/4XUjdBPH0s6xlm2+S11ToU9rzjZ0DQc79ygnh4BQ7ILQiM8/9DXa8P3jqe hxrC62kNYTc2Eg28eb6zWqrKM53jlz8koFxIHcUwL9/v7ayM5d/OeMsXyyf2POrfzeJt pXxJI0nGYfeEl7xdHHxObXF07f7Yfg6CH7QnZn1jU2ffR9LkKevxxpQO9eDKAonKAv/a P7blN8VU6k9sTrNhSehg2IfJ5LAGp0iprb+quLxHk1wV9UhbZesuH3Y99r3FLPHwQPTM vAiw== MIME-Version: 1.0 X-Received: by 10.182.241.133 with SMTP id wi5mr33420239obc.10.1415724131298; Tue, 11 Nov 2014 08:42:11 -0800 (PST) Received: by 10.202.137.139 with HTTP; Tue, 11 Nov 2014 08:42:11 -0800 (PST) In-Reply-To: <20141111154250.GA16906@gmail.com> References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> <54614AE7.2080204@kernel.dk> <20141111154250.GA16906@gmail.com> Date: Wed, 12 Nov 2014 00:42:11 +0800 Message-ID: Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! From: Ming Lei X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! To: Dongsu Park Cc: Jens Axboe , "Michael S. Tsirkin" , Dave Chinner , xfs@oss.sgi.com, Jeff Layton , Rusty Russell , Lukas Czerner , Christoph Hellwig , Linux Virtualization Content-Type: multipart/mixed; boundary=089e01634be8f258ff050797f529 X-Barracuda-Connect: mail-ob0-f171.google.com[209.85.214.171] X-Barracuda-Start-Time: 1415724131 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-ASG-Whitelist: Body =?UTF-8?B?aHR0cDovL21hcmNcLmluZm8vXD8=?= X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 --089e01634be8f258ff050797f529 Content-Type: text/plain; charset=UTF-8 On Tue, Nov 11, 2014 at 11:42 PM, Dongsu Park wrote: > Hi Ming, > > On 11.11.2014 08:56, Ming Lei wrote: >> On Tue, Nov 11, 2014 at 7:31 AM, Jens Axboe wrote: >> > Known, I'm afraid, Ming is looking into it. > > Actually I had also tried to reproduce this bug, without success. > But today I happened to know how to trigger the bug, by coincidence, > during testing other things. > > Try to run xfstests/generic/034. You'll see the crash immediately. > Tested on a QEMU VM with kernel 3.18-rc4, virtio-blk, dm-flakey and xfs. > >> There is one obvious bug which should have been fixed by below >> patch(0001-block-blk-merge-fix-blk_recount_segments.patch"): >> >> http://marc.info/?l=linux-virtualization&m=141562191719405&q=p3 > > This patch didn't bring anything to me, as Lukas said. > >> And there might be another one, I appreciate someone can post >> log which is printed by patch("blk-seg.patch") in below link if the >> bug still can be triggered even with above fix: >> >> http://marc.info/?l=linux-virtualization&m=141473040618467&q=p3 > > "blk_recount_segments: 1-1-1 vcnt-128 segs-128" > > As long as I understood so far, the reason is that bi_phys_segments gets > sometimes bigger than queue_max_sectors() after blk_recount_segments(). > That happens no matter whether segments are recalculated or not. I know the problem now, since bi_vcnt can't be used for cloned bio, and the patch I sent last time is wrong too. > I'm not completely sure about what to do, but how about the attached patch? > It seems to work, according to several xfstests runs. > > Cheers, > Dongsu > > ---- > > From 1db98323931eb9ab430116c4d909d22222c16e22 Mon Sep 17 00:00:00 2001 > From: Dongsu Park > Date: Tue, 11 Nov 2014 13:10:59 +0100 > Subject: [RFC PATCH] blk-merge: make bi_phys_segments consider also > queue_max_segments() > > When recounting the number of physical segments, the number of max > segments of request_queue must be also taken into account. > Otherwise bio->bi_phys_segments could get bigger than > queue_max_segments(). Then this results in virtio_queue_rq() seeing > req->nr_phys_segments that is greater than expected. Although the > initial queue_max_segments was set to (vblk->sg_elems - 2), a request > comes in with a larger value of nr_phys_segments, which triggers the > BUG_ON() condition. > > This commit should fix a kernel crash in virtio_blk, which occurs > especially frequently when it runs with blk-mq, device mapper, and xfs. > The simplest way to reproduce this bug is to run xfstests/generic/034. > Note, test 034 requires dm-flakey to be turned on in the kernel config. > > See the kernel trace below: > ------------[ cut here ]------------ > kernel BUG at drivers/block/virtio_blk.c:172! > invalid opcode: 0000 [#1] SMP > CPU: 1 PID: 3343 Comm: mount Not tainted 3.18.0-rc4+ #55 > RIP: 0010:[] > [] virtio_queue_rq+0x277/0x280 > Call Trace: > [] __blk_mq_run_hw_queue+0x1a8/0x300 > [] blk_mq_run_hw_queue+0x6d/0x90 > [] blk_sq_make_request+0x23e/0x360 > [] generic_make_request+0xc0/0x110 > [] submit_bio+0x69/0x130 > [] _xfs_buf_ioapply+0x2bd/0x410 > [] ? xlog_bread_noalign+0xa8/0xe0 > [] xfs_buf_submit_wait+0x61/0x1d0 > [] xlog_bread_noalign+0xa8/0xe0 > [] xlog_bread+0x27/0x60 > [] xlog_find_verify_cycle+0xe1/0x190 > [] xlog_find_head+0x2d1/0x3c0 > [] xlog_find_tail+0x2d/0x3f0 > [] xlog_recover+0x1e/0xf0 > [] xfs_log_mount+0x24c/0x2c0 > [] xfs_mountfs+0x44b/0x7a0 > [] xfs_fs_fill_super+0x2ba/0x330 > [] mount_bdev+0x194/0x1d0 > [] ? xfs_parseargs+0xbe0/0xbe0 > [] xfs_fs_mount+0x15/0x20 > [] mount_fs+0x39/0x1b0 > [] ? __alloc_percpu+0x15/0x20 > [] vfs_kern_mount+0x67/0x110 > [] do_mount+0x204/0xad0 > [] SyS_mount+0x8b/0xe0 > [] system_call_fastpath+0x12/0x17 > RIP [] virtio_queue_rq+0x277/0x280 > ---[ end trace ae3ec6426f011b5d ]--- > > Signed-off-by: Dongsu Park > Tested-by: Dongsu Park > Cc: Ming Lei > Cc: Jens Axboe > Cc: Rusty Russell > Cc: Jeff Layton > Cc: Dave Chinner > Cc: "Michael S. Tsirkin" > Cc: Lukas Czerner > Cc: Christoph Hellwig > Cc: virtualization@lists.linux-foundation.org > --- > block/blk-merge.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/block/blk-merge.c b/block/blk-merge.c > index b3ac40a..d808601 100644 > --- a/block/blk-merge.c > +++ b/block/blk-merge.c > @@ -103,13 +103,16 @@ void blk_recount_segments(struct request_queue *q, struct bio *bio) > > if (no_sg_merge && !bio_flagged(bio, BIO_CLONED) && > merge_not_need) > - bio->bi_phys_segments = bio->bi_vcnt; > + bio->bi_phys_segments = min_t(unsigned int, bio->bi_vcnt, > + queue_max_segments(q)); > else { > struct bio *nxt = bio->bi_next; > > bio->bi_next = NULL; > - bio->bi_phys_segments = __blk_recalc_rq_segments(q, bio, > - no_sg_merge && merge_not_need); > + bio->bi_phys_segments = min_t(unsigned int, > + __blk_recalc_rq_segments(q, bio, no_sg_merge > + && merge_not_need), > + queue_max_segments(q)); > bio->bi_next = nxt; > } The above change may cause some data not written to/read from device, and we have to merge if segments number will become bigger than the limit. The attached patch should fix the problem, and hope it is the last one, :-) Thanks, -- Ming Lei --089e01634be8f258ff050797f529 Content-Type: text/x-patch; charset=US-ASCII; name="0001-block-blk-merge-fix-blk_recount_segments.patch" Content-Disposition: attachment; filename="0001-block-blk-merge-fix-blk_recount_segments.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i2dhiak90 RnJvbSA5Y2VkZWI4Y2ZkNDIwZWNmY2QzZTJiMmUwYmNiNjk5ZDM1YWUyYTAzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNaW5nIExlaSA8dG9tLmxlaW1pbmdAZ21haWwuY29tPgpEYXRl OiBXZWQsIDEyIE5vdiAyMDE0IDAwOjE1OjQxICswODAwClN1YmplY3Q6IFtQQVRDSF0gYmxvY2s6 IGJsay1tZXJnZTogZml4IGJsa19yZWNvdW50X3NlZ21lbnRzKCkKCkZvciBjbG9uZWQgYmlvLCBi aW8tPmJpX3ZjbnQgY2FuJ3QgYmUgdXNlZCBhdCBhbGwsIGFuZCB3ZQpoYXZlIHJlc29ydCB0byBi aW9fc2VnbWVudHMoKSB0byBmaWd1cmUgb3V0IGhvdyBtYW55CnNlZ21lbnQgdGhlcmUgYXJlIGlu IHRoZSBiaW8uCgpTaWduZWQtb2ZmLWJ5OiBNaW5nIExlaSA8dG9tLmxlaW1pbmdAZ21haWwuY29t PgotLS0KIGJsb2NrL2Jsay1tZXJnZS5jIHwgICAxOSArKysrKysrKysrKy0tLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgMTEgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9ibG9jay9ibGstbWVyZ2UuYyBiL2Jsb2NrL2Jsay1tZXJnZS5jCmluZGV4IGIzYWM0MGEuLjg5 Yjk3YjUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tZXJnZS5jCisrKyBiL2Jsb2NrL2Jsay1tZXJn ZS5jCkBAIC05NywxOSArOTcsMjIgQEAgdm9pZCBibGtfcmVjYWxjX3JxX3NlZ21lbnRzKHN0cnVj dCByZXF1ZXN0ICpycSkKIAogdm9pZCBibGtfcmVjb3VudF9zZWdtZW50cyhzdHJ1Y3QgcmVxdWVz dF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewotCWJvb2wgbm9fc2dfbWVyZ2UgPSAhIXRl c3RfYml0KFFVRVVFX0ZMQUdfTk9fU0dfTUVSR0UsCi0JCQkmcS0+cXVldWVfZmxhZ3MpOwotCWJv b2wgbWVyZ2Vfbm90X25lZWQgPSBiaW8tPmJpX3ZjbnQgPCBxdWV1ZV9tYXhfc2VnbWVudHMocSk7 CisJdW5zaWduZWQgc2hvcnQgc2VnX2NudDsKKworCS8qIGVzdGltYXRlIHNlZ21lbnQgbnVtYmVy IGJ5IGJpX3ZjbnQgZm9yIG5vbi1jbG9uZWQgYmlvICovCisJaWYgKGJpb19mbGFnZ2VkKGJpbywg QklPX0NMT05FRCkpCisJCXNlZ19jbnQgPSBiaW9fc2VnbWVudHMoYmlvKTsKKwllbHNlCisJCXNl Z19jbnQgPSBiaW8tPmJpX3ZjbnQ7CiAKLQlpZiAobm9fc2dfbWVyZ2UgJiYgIWJpb19mbGFnZ2Vk KGJpbywgQklPX0NMT05FRCkgJiYKLQkJCW1lcmdlX25vdF9uZWVkKQotCQliaW8tPmJpX3BoeXNf c2VnbWVudHMgPSBiaW8tPmJpX3ZjbnQ7CisJaWYgKHRlc3RfYml0KFFVRVVFX0ZMQUdfTk9fU0df TUVSR0UsICZxLT5xdWV1ZV9mbGFncykgJiYKKwkJCShzZWdfY250IDwgcXVldWVfbWF4X3NlZ21l bnRzKHEpKSkKKwkJYmlvLT5iaV9waHlzX3NlZ21lbnRzID0gc2VnX2NudDsKIAllbHNlIHsKIAkJ c3RydWN0IGJpbyAqbnh0ID0gYmlvLT5iaV9uZXh0OwogCiAJCWJpby0+YmlfbmV4dCA9IE5VTEw7 Ci0JCWJpby0+YmlfcGh5c19zZWdtZW50cyA9IF9fYmxrX3JlY2FsY19ycV9zZWdtZW50cyhxLCBi aW8sCi0JCQkJbm9fc2dfbWVyZ2UgJiYgbWVyZ2Vfbm90X25lZWQpOworCQliaW8tPmJpX3BoeXNf c2VnbWVudHMgPSBfX2Jsa19yZWNhbGNfcnFfc2VnbWVudHMocSwgYmlvLCBmYWxzZSk7CiAJCWJp by0+YmlfbmV4dCA9IG54dDsKIAl9CiAKLS0gCjEuNy45LjUKCg== --089e01634be8f258ff050797f529-- From cmaiolino@redhat.com Tue Nov 11 11:01:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7CED57F57 for ; Tue, 11 Nov 2014 11:01:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 077C6AC002 for ; Tue, 11 Nov 2014 09:01:29 -0800 (PST) X-ASG-Debug-ID: 1415725288-04cbb00e6620e920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 75E0CoREvEtWanco (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 09:01:28 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABH1Ra7028859 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 12:01:27 -0500 Received: from hades.localdomain.com (ovpn-113-103.phx2.redhat.com [10.3.113.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABH1OgU025490 for ; Tue, 11 Nov 2014 12:01:26 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Tue, 11 Nov 2014 15:01:12 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1415725273-5083-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> References: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415725288 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0b8704c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From cmaiolino@redhat.com Tue Nov 11 11:01:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B67357F59 for ; Tue, 11 Nov 2014 11:01:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6266AAC005 for ; Tue, 11 Nov 2014 09:01:27 -0800 (PST) X-ASG-Debug-ID: 1415725286-04bdf0650e23f5c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CP4inqOM8vrqQdKE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 09:01:26 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABH1QKJ007720 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 12:01:26 -0500 Received: from hades.localdomain.com (ovpn-113-103.phx2.redhat.com [10.3.113.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABH1OgT025490 for ; Tue, 11 Nov 2014 12:01:25 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS V3 Date: Tue, 11 Nov 2014 15:01:11 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flat to XFS V3 Message-Id: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415725286 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag fs/xfs/xfs_inode.c | 325 +++++++++++++++++++++++++++++++++++------------------ fs/xfs/xfs_inode.h | 7 +- fs/xfs/xfs_iops.c | 15 ++- 3 files changed, 233 insertions(+), 114 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Tue Nov 11 11:01:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5DF347F63 for ; Tue, 11 Nov 2014 11:01:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C1698F8050 for ; Tue, 11 Nov 2014 09:01:31 -0800 (PST) X-ASG-Debug-ID: 1415725289-04cb6c1e6b209f70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qnma3nGHbssFgDag (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 09:01:30 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABH1TTZ007738 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 12:01:29 -0500 Received: from hades.localdomain.com (ovpn-113-103.phx2.redhat.com [10.3.113.103]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABH1OgV025490 for ; Tue, 11 Nov 2014 12:01:28 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Date: Tue, 11 Nov 2014 15:01:13 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Message-Id: <1415725273-5083-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> References: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415725290 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() V3: - fix indentation to avoid 80 column crossing, decrease the amount of arguments passed to xfs_cross_rename() - Rebase patches over the latest linux code Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 325 +++++++++++++++++++++++++++++++++++------------------ fs/xfs/xfs_inode.h | 7 +- fs/xfs/xfs_iops.c | 4 +- 3 files changed, 225 insertions(+), 111 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..30dc671 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2678,12 +2678,14 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; int new_parent; /* moving to a new dir */ int src_is_directory; /* src_name is a directory */ + int tgt_is_directory; int error; xfs_bmap_free_t free_list; xfs_fsblock_t first_block; @@ -2706,6 +2708,7 @@ xfs_rename( cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); + if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); @@ -2756,143 +2759,155 @@ xfs_rename( } /* - * Set up the target. - */ - if (target_ip == NULL) { + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, target_dp, + target_name, target_ip, &free_list, + &first_block, spaceres); + if (error) + goto abort_return; + } else { /* - * If there's no space reservation, check the entry will - * fit before actually inserting it. + * Set up the target. */ - if (!spaceres) { - error = xfs_dir_canenter(tp, target_dp, target_name); - if (error) + if (target_ip == NULL) { + /* + * If there's no space reservation, check the entry will + * fit before actually inserting it. + */ + if (!spaceres) { + error = xfs_dir_canenter(tp, target_dp, target_name); + if (error) + goto error_return; + } + /* + * If target does not exist and the rename crosses + * directories, adjust the target directory link count + * to account for the ".." reference from the new entry. + */ + error = xfs_dir_createname(tp, target_dp, target_name, + src_ip->i_ino, &first_block, + &free_list, spaceres); + if (error == -ENOSPC) goto error_return; - } - /* - * If target does not exist and the rename crosses - * directories, adjust the target directory link count - * to account for the ".." reference from the new entry. - */ - error = xfs_dir_createname(tp, target_dp, target_name, - src_ip->i_ino, &first_block, - &free_list, spaceres); - if (error == -ENOSPC) - goto error_return; - if (error) - goto abort_return; + if (error) + goto abort_return; - xfs_trans_ichgtime(tp, target_dp, - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_ichgtime(tp, target_dp, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - if (new_parent && src_is_directory) { - error = xfs_bumplink(tp, target_dp); + if (new_parent && src_is_directory) { + error = xfs_bumplink(tp, target_dp); + if (error) + goto abort_return; + } + } else { /* target_ip != NULL */ + /* + * If target exists and it's a directory, check that both + * target and source are directories and that target can be + * destroyed, or that neither is a directory. + */ + if (S_ISDIR(target_ip->i_d.di_mode)) { + /* + * Make sure target dir is empty. + */ + if (!(xfs_dir_isempty(target_ip)) || + (target_ip->i_d.di_nlink > 2)) { + error = -EEXIST; + goto error_return; + } + } + + /* + * Link the source inode under the target name. + * If the source inode is a directory and we are moving + * it across directories, its ".." entry will be + * inconsistent until we replace that down below. + * + * In case there is already an entry with the same + * name at the destination directory, remove it first. + */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + &first_block, &free_list, spaceres); if (error) goto abort_return; - } - } else { /* target_ip != NULL */ + + xfs_trans_ichgtime(tp, target_dp, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * Decrement the link count on the target since the target + * dir no longer points to it. + */ + error = xfs_droplink(tp, target_ip); + if (error) + goto abort_return; + + if (src_is_directory) { + /* + * Drop the link from the old "." entry. + */ + error = xfs_droplink(tp, target_ip); + if (error) + goto abort_return; + } + } /* target_ip != NULL */ + /* - * If target exists and it's a directory, check that both - * target and source are directories and that target can be - * destroyed, or that neither is a directory. + * Remove the source. */ - if (S_ISDIR(target_ip->i_d.di_mode)) { + if (new_parent && src_is_directory) { /* - * Make sure target dir is empty. + * Rewrite the ".." entry to point to the new + * directory. */ - if (!(xfs_dir_isempty(target_ip)) || - (target_ip->i_d.di_nlink > 2)) { - error = -EEXIST; - goto error_return; - } + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, + &first_block, &free_list, spaceres); + ASSERT(error != -EEXIST); + if (error) + goto abort_return; } /* - * Link the source inode under the target name. - * If the source inode is a directory and we are moving - * it across directories, its ".." entry will be - * inconsistent until we replace that down below. + * We always want to hit the ctime on the source inode. * - * In case there is already an entry with the same - * name at the destination directory, remove it first. + * This isn't strictly required by the standards since the source + * inode isn't really being changed, but old unix file systems did + * it and some incremental backup programs won't work without it. */ - error = xfs_dir_replace(tp, target_dp, target_name, - src_ip->i_ino, - &first_block, &free_list, spaceres); - if (error) - goto abort_return; - - xfs_trans_ichgtime(tp, target_dp, - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); /* - * Decrement the link count on the target since the target - * dir no longer points to it. + * Adjust the link count on src_dp. This is necessary when + * renaming a directory, either within one parent when + * the target existed, or across two parent directories. */ - error = xfs_droplink(tp, target_ip); - if (error) - goto abort_return; + if (src_is_directory && (new_parent || target_ip != NULL)) { - if (src_is_directory) { /* - * Drop the link from the old "." entry. + * Decrement link count on src_directory since the + * entry that's moved no longer points to it. */ - error = xfs_droplink(tp, target_ip); + error = xfs_droplink(tp, src_dp); if (error) goto abort_return; } - } /* target_ip != NULL */ - - /* - * Remove the source. - */ - if (new_parent && src_is_directory) { - /* - * Rewrite the ".." entry to point to the new - * directory. - */ - error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, - target_dp->i_ino, - &first_block, &free_list, spaceres); - ASSERT(error != -EEXIST); - if (error) - goto abort_return; - } - - /* - * We always want to hit the ctime on the source inode. - * - * This isn't strictly required by the standards since the source - * inode isn't really being changed, but old unix file systems did - * it and some incremental backup programs won't work without it. - */ - xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); - - /* - * Adjust the link count on src_dp. This is necessary when - * renaming a directory, either within one parent when - * the target existed, or across two parent directories. - */ - if (src_is_directory && (new_parent || target_ip != NULL)) { - /* - * Decrement link count on src_directory since the - * entry that's moved no longer points to it. - */ - error = xfs_droplink(tp, src_dp); + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, + &first_block, &free_list, spaceres); if (error) goto abort_return; - } - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, - &first_block, &free_list, spaceres); - if (error) - goto abort_return; + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + if (new_parent) + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); - xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); - if (new_parent) - xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + } /* RENAME_EXCHANGE */ /* * If this is a synchronous mount, make sure that the @@ -2926,6 +2941,100 @@ xfs_rename( return error; } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +int +xfs_cross_rename( + xfs_trans_t *tp, + xfs_inode_t *src_dp, + struct xfs_name *src_name, + xfs_inode_t *src_ip, + xfs_inode_t *target_dp, + struct xfs_name *target_name, + xfs_inode_t *target_ip, + xfs_bmap_free_t *free_list, + xfs_fsblock_t *first_block, + int spaceres) +{ + int error = 0; + int new_parent; + int src_is_directory; + int tgt_is_directory; + + new_parent = (src_dp != target_dp); + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); + + /* Replace source inode */ + error = xfs_dir_replace(tp, src_dp, src_name, + target_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out_abort; + + /* Replace target inode */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out_abort; + + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * Update ".." entry to match the new parents + * + * In case we are crossing different file types between different + * parents, we must update parent's link count to match the ".." + * entry of the new child (or the removal of it). + */ + if (new_parent) { + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + if (tgt_is_directory) { + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, + src_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out_abort; + if (!src_is_directory) { + error = xfs_droplink(tp, target_dp); + if (error) + goto out_abort; + error = xfs_bumplink(tp, src_dp); + if (error) + goto out_abort; + } + } + + if (src_is_directory) { + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out_abort; + if (!tgt_is_directory) { + error = xfs_droplink(tp, src_dp); + if (error) + goto out_abort; + error = xfs_bumplink(tp, target_dp); + if (error) + goto out_abort; + } + } + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + } + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); + +out_abort: + return error; +} + STATIC int xfs_iflush_cluster( xfs_inode_t *ip, diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..819f487 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,12 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); +int xfs_cross_rename(struct xfs_trans *tp, struct xfs_inode *src_dp, + struct xfs_name *src_name, struct xfs_inode *src_ip, + struct xfs_inode *target_dp, struct xfs_name *target_name, + struct xfs_inode *target_ip,struct xfs_bmap_free *free_list, + xfs_fsblock_t *first_block, int spaceres); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0b8704c..481ae10 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -391,7 +391,7 @@ xfs_vn_rename( struct xfs_name nname; /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; xfs_dentry_to_name(&oname, odentry, 0); @@ -399,7 +399,7 @@ xfs_vn_rename( return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From lists@colorremedies.com Tue Nov 11 12:00:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2D5A57F5E for ; Tue, 11 Nov 2014 12:00:33 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C01A304048 for ; Tue, 11 Nov 2014 10:00:29 -0800 (PST) X-ASG-Debug-ID: 1415728827-04cbb00e66211180001-NocioJ Received: from slmp-550-94.slc.westdc.net (slmp-550-94.slc.westdc.net [50.115.112.57]) by cuda.sgi.com with ESMTP id 5Ekh0a3vDauAjT6N (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 10:00:28 -0800 (PST) X-Barracuda-Envelope-From: lists@colorremedies.com X-Barracuda-Apparent-Source-IP: 50.115.112.57 Received: from c-75-70-18-61.hsd1.co.comcast.net ([75.70.18.61]:50958 helo=[192.168.1.126]) by slmp-550-94.slc.westdc.net with esmtpsa (TLSv1:RC4-SHA:128) (Exim 4.82) (envelope-from ) id 1XoFjv-003KwJ-BD; Tue, 11 Nov 2014 11:00:27 -0700 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: Enforcing quota for root user From: Chris Murphy X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: <54622CE8.7050508@hardwarefreak.com> Date: Tue, 11 Nov 2014 11:00:25 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> To: Stan Hoeppner , xfs@oss.sgi.com X-Mailer: Apple Mail (2.1878.6) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - slmp-550-94.slc.westdc.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - colorremedies.com X-Get-Message-Sender-Via: slmp-550-94.slc.westdc.net: authenticated_id: whatever@colorremedies.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: slmp-550-94.slc.westdc.net[50.115.112.57] X-Barracuda-Start-Time: 1415728828 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11479 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Nov 11, 2014, at 8:36 AM, Stan Hoeppner = wrote: > On 11/11/2014 04:22 AM, Cyril Scetbon wrote: >> That's what I've read first, but someone showed me a sample where it = works. He just told me he was using project quota. However, does it make = sense ?=20 >> I've also read somewhere else that quota is never enforced for root = user (id,gid=3D0) that's why I was testing it .... >=20 > No, it doesn't make sense. Why would you want to enforce quotas for = root? A week ago I tried this and project quotas appear to apply to root. [root@localhost project_quota_test1]# xfs_quota -c df Filesystem 1K-blocks Used Available Use% Pathname /dev/sdb 83845120 157980 83687140 0% /xfs_local /dev/sdb 102400 124928 9223372036854753280 122% = /xfs_local/project_quota_test1 [root@localhost project_quota_test1]# dd if=3D/dev/zero of=3Dtest100MB = bs=3D1M count=3D100 dd: error writing =91test100MB=92: No space left on device 79+0 records in 78+0 records out 81788928 bytes (82 MB) copied, 0.163849 s, 499 MB/s [root@localhost project_quota_test1]# xfs_quota -c df Filesystem 1K-blocks Used Available Use% Pathname /dev/sdb 83845120 237748 83607372 0% /xfs_local /dev/sdb 102400 204800 9223372036854673408 200% = /xfs_local/project_quota_test1 The available space value seems like a bug, at least it=92s not a = sane/helpful value. But I do get a no space left on device, and the file = being written is truncated at the hard limit for that project = (directory). Chris Murphy= From bfoster@redhat.com Tue Nov 11 13:28:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 31F947F60 for ; Tue, 11 Nov 2014 13:28:27 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 12CC18F8049 for ; Tue, 11 Nov 2014 11:28:23 -0800 (PST) X-ASG-Debug-ID: 1415734102-04cbb00e672155e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IAcFohK3IZKK4YOx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 11:28:23 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABJSL3o002597 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 14:28:22 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABJSLrg002560; Tue, 11 Nov 2014 14:28:21 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 35380122F87; Tue, 11 Nov 2014 14:28:20 -0500 (EST) Date: Tue, 11 Nov 2014 14:28:20 -0500 From: Brian Foster To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-ID: <20141111192819.GB38867@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall References: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> <1415725273-5083-2-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415725273-5083-2-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415734102 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 11, 2014 at 03:01:12PM -0200, Carlos Maiolino wrote: > To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS > must have its inode_operations updated, exporting .rename2 method, instead of > .rename. > > This patch just replaces the (now old) .rename method by .rename2, using the > same infra-structure, but checking rename flags. > > calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, > still returns -EINVAL. > > RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside > xfs_vn_rename. > > Changelog: > > V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 > > Signed-off-by: Carlos Maiolino > --- Thanks for rebasing these Carlos... > fs/xfs/xfs_iops.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index ec6dcdc..0b8704c 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -383,18 +383,23 @@ xfs_vn_rename( > struct inode *odir, > struct dentry *odentry, > struct inode *ndir, > - struct dentry *ndentry) > + struct dentry *ndentry, > + unsigned int flags) > { > struct inode *new_inode = ndentry->d_inode; > struct xfs_name oname; > struct xfs_name nname; > > + /* XFS does not support RENAME_EXCHANGE yet */ > + if (flags & ~RENAME_NOREPLACE) > + return -EINVAL; > + > xfs_dentry_to_name(&oname, odentry, 0); > xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); This still looks like a problem (as noted in v1). We can confirm with xfs_io on a v5 XFS (mkfs.xfs -m crc=1) as follows: - Original dir with a character device node and regular file: # xfs_io -c "readdir -v" /mnt/ 00000000: d_ino: 0x00000040 d_off: 0x0000000a d_reclen: 0x18 d_type: DT_DIR d_name: . 0000000a: d_ino: 0x00000040 d_off: 0x0000000c d_reclen: 0x18 d_type: DT_DIR d_name: .. 0000000c: d_ino: 0x00000043 d_off: 0x0000000e d_reclen: 0x18 d_type: DT_CHR d_name: zero 0000000e: d_ino: 0x00000044 d_off: 0x00000200 d_reclen: 0x18 d_type: DT_REG d_name: file ... - After rename exchange of zero and file: # xfs_io -c "readdir -v" /mnt/ 00000000: d_ino: 0x00000040 d_off: 0x0000000a d_reclen: 0x18 d_type: DT_DIR d_name: . 0000000a: d_ino: 0x00000040 d_off: 0x0000000c d_reclen: 0x18 d_type: DT_DIR d_name: .. 0000000c: d_ino: 0x00000044 d_off: 0x0000000e d_reclen: 0x18 d_type: DT_UNKNOWN d_name: zero 0000000e: d_ino: 0x00000043 d_off: 0x00000200 d_reclen: 0x18 d_type: DT_CHR d_name: file ... We can see that the file dentry inherited the d_type of zero, but the d_type of zero was reset. Brian > > return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), > - XFS_I(ndir), &nname, new_inode ? > - XFS_I(new_inode) : NULL); > + XFS_I(ndir), &nname, > + new_inode ? XFS_I(new_inode) : NULL); > } > > /* > @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { > */ > .rmdir = xfs_vn_unlink, > .mknod = xfs_vn_mknod, > - .rename = xfs_vn_rename, > + .rename2 = xfs_vn_rename, > .get_acl = xfs_get_acl, > .set_acl = xfs_set_acl, > .getattr = xfs_vn_getattr, > @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { > */ > .rmdir = xfs_vn_unlink, > .mknod = xfs_vn_mknod, > - .rename = xfs_vn_rename, > + .rename2 = xfs_vn_rename, > .get_acl = xfs_get_acl, > .set_acl = xfs_set_acl, > .getattr = xfs_vn_getattr, > -- > 2.1.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 11 13:29:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4F97F7F6B for ; Tue, 11 Nov 2014 13:29:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3DD0F304064 for ; Tue, 11 Nov 2014 11:29:27 -0800 (PST) X-ASG-Debug-ID: 1415734165-04cbb00e672156b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sfgGAlvTQ7JmKw0V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 11:29:25 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sABJTOFQ014111 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 11 Nov 2014 14:29:25 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sABJTOYo002859; Tue, 11 Nov 2014 14:29:24 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3536D122F87; Tue, 11 Nov 2014 14:29:23 -0500 (EST) Date: Tue, 11 Nov 2014 14:29:23 -0500 From: Brian Foster To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Message-ID: <20141111192922.GC38867@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 References: <1415725273-5083-1-git-send-email-cmaiolino@redhat.com> <1415725273-5083-3-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415725273-5083-3-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415734165 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 11, 2014 at 03:01:13PM -0200, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. > > Changelog: > > V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() > > V3: - fix indentation to avoid 80 column crossing, decrease the amount of > arguments passed to xfs_cross_rename() > - Rebase patches over the latest linux code > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 325 +++++++++++++++++++++++++++++++++++------------------ > fs/xfs/xfs_inode.h | 7 +- > fs/xfs/xfs_iops.c | 4 +- > 3 files changed, 225 insertions(+), 111 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8ed049d..30dc671 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2678,12 +2678,14 @@ xfs_rename( > xfs_inode_t *src_ip, > xfs_inode_t *target_dp, > struct xfs_name *target_name, > - xfs_inode_t *target_ip) > + xfs_inode_t *target_ip, > + unsigned int flags) > { > xfs_trans_t *tp = NULL; > xfs_mount_t *mp = src_dp->i_mount; > int new_parent; /* moving to a new dir */ > int src_is_directory; /* src_name is a directory */ > + int tgt_is_directory; There's an unused variable warning for this. > int error; > xfs_bmap_free_t free_list; > xfs_fsblock_t first_block; > @@ -2706,6 +2708,7 @@ xfs_rename( > cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > + > if (error == -ENOSPC) { > spaceres = 0; > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > @@ -2756,143 +2759,155 @@ xfs_rename( > } > > /* > - * Set up the target. > - */ > - if (target_ip == NULL) { > + * Handle RENAME_EXCHANGE flags > + */ > + if (flags & RENAME_EXCHANGE) { > + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, target_dp, > + target_name, target_ip, &free_list, > + &first_block, spaceres); > + if (error) > + goto abort_return; > + } else { The factoring of xfs_rename() looks much better, but we could probably avoid all the extra indentation in the else branch that follows by using a label. It does look like that indentation creates a bunch of 80+ char lines in xfs_rename(). E.g., something like: if (flags & RENAME_EXCHANGE) { ... goto complete_tp; } ... complete_tp: ... return xfs_trans_commit(...); ... and then kill the else above and leave the rest of xfs_rename() as is. > /* > - * If there's no space reservation, check the entry will > - * fit before actually inserting it. > + * Set up the target. > */ > - if (!spaceres) { > - error = xfs_dir_canenter(tp, target_dp, target_name); > - if (error) > + if (target_ip == NULL) { > + /* > + * If there's no space reservation, check the entry will > + * fit before actually inserting it. > + */ > + if (!spaceres) { > + error = xfs_dir_canenter(tp, target_dp, target_name); > + if (error) > + goto error_return; > + } > + /* > + * If target does not exist and the rename crosses > + * directories, adjust the target directory link count > + * to account for the ".." reference from the new entry. > + */ > + error = xfs_dir_createname(tp, target_dp, target_name, > + src_ip->i_ino, &first_block, > + &free_list, spaceres); > + if (error == -ENOSPC) > goto error_return; > - } > - /* > - * If target does not exist and the rename crosses > - * directories, adjust the target directory link count > - * to account for the ".." reference from the new entry. > - */ > - error = xfs_dir_createname(tp, target_dp, target_name, > - src_ip->i_ino, &first_block, > - &free_list, spaceres); > - if (error == -ENOSPC) > - goto error_return; > - if (error) > - goto abort_return; > + if (error) > + goto abort_return; > > - xfs_trans_ichgtime(tp, target_dp, > - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_ichgtime(tp, target_dp, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > - if (new_parent && src_is_directory) { > - error = xfs_bumplink(tp, target_dp); > + if (new_parent && src_is_directory) { > + error = xfs_bumplink(tp, target_dp); > + if (error) > + goto abort_return; > + } > + } else { /* target_ip != NULL */ > + /* > + * If target exists and it's a directory, check that both > + * target and source are directories and that target can be > + * destroyed, or that neither is a directory. > + */ > + if (S_ISDIR(target_ip->i_d.di_mode)) { > + /* > + * Make sure target dir is empty. > + */ > + if (!(xfs_dir_isempty(target_ip)) || > + (target_ip->i_d.di_nlink > 2)) { > + error = -EEXIST; > + goto error_return; > + } > + } > + > + /* > + * Link the source inode under the target name. > + * If the source inode is a directory and we are moving > + * it across directories, its ".." entry will be > + * inconsistent until we replace that down below. > + * > + * In case there is already an entry with the same > + * name at the destination directory, remove it first. > + */ > + error = xfs_dir_replace(tp, target_dp, target_name, > + src_ip->i_ino, > + &first_block, &free_list, spaceres); > if (error) > goto abort_return; > - } > - } else { /* target_ip != NULL */ > + > + xfs_trans_ichgtime(tp, target_dp, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + > + /* > + * Decrement the link count on the target since the target > + * dir no longer points to it. > + */ > + error = xfs_droplink(tp, target_ip); > + if (error) > + goto abort_return; > + > + if (src_is_directory) { > + /* > + * Drop the link from the old "." entry. > + */ > + error = xfs_droplink(tp, target_ip); > + if (error) > + goto abort_return; > + } > + } /* target_ip != NULL */ > + > /* > - * If target exists and it's a directory, check that both > - * target and source are directories and that target can be > - * destroyed, or that neither is a directory. > + * Remove the source. > */ > - if (S_ISDIR(target_ip->i_d.di_mode)) { > + if (new_parent && src_is_directory) { > /* > - * Make sure target dir is empty. > + * Rewrite the ".." entry to point to the new > + * directory. > */ > - if (!(xfs_dir_isempty(target_ip)) || > - (target_ip->i_d.di_nlink > 2)) { > - error = -EEXIST; > - goto error_return; > - } > + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, > + target_dp->i_ino, > + &first_block, &free_list, spaceres); > + ASSERT(error != -EEXIST); > + if (error) > + goto abort_return; > } > > /* > - * Link the source inode under the target name. > - * If the source inode is a directory and we are moving > - * it across directories, its ".." entry will be > - * inconsistent until we replace that down below. > + * We always want to hit the ctime on the source inode. > * > - * In case there is already an entry with the same > - * name at the destination directory, remove it first. > + * This isn't strictly required by the standards since the source > + * inode isn't really being changed, but old unix file systems did > + * it and some incremental backup programs won't work without it. > */ > - error = xfs_dir_replace(tp, target_dp, target_name, > - src_ip->i_ino, > - &first_block, &free_list, spaceres); > - if (error) > - goto abort_return; > - > - xfs_trans_ichgtime(tp, target_dp, > - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); > > /* > - * Decrement the link count on the target since the target > - * dir no longer points to it. > + * Adjust the link count on src_dp. This is necessary when > + * renaming a directory, either within one parent when > + * the target existed, or across two parent directories. > */ > - error = xfs_droplink(tp, target_ip); > - if (error) > - goto abort_return; > + if (src_is_directory && (new_parent || target_ip != NULL)) { > > - if (src_is_directory) { > /* > - * Drop the link from the old "." entry. > + * Decrement link count on src_directory since the > + * entry that's moved no longer points to it. > */ > - error = xfs_droplink(tp, target_ip); > + error = xfs_droplink(tp, src_dp); > if (error) > goto abort_return; > } > - } /* target_ip != NULL */ > - > - /* > - * Remove the source. > - */ > - if (new_parent && src_is_directory) { > - /* > - * Rewrite the ".." entry to point to the new > - * directory. > - */ > - error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, > - target_dp->i_ino, > - &first_block, &free_list, spaceres); > - ASSERT(error != -EEXIST); > - if (error) > - goto abort_return; > - } > - > - /* > - * We always want to hit the ctime on the source inode. > - * > - * This isn't strictly required by the standards since the source > - * inode isn't really being changed, but old unix file systems did > - * it and some incremental backup programs won't work without it. > - */ > - xfs_trans_ichgtime(tp, src_ip, XFS_ICHGTIME_CHG); > - xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); > - > - /* > - * Adjust the link count on src_dp. This is necessary when > - * renaming a directory, either within one parent when > - * the target existed, or across two parent directories. > - */ > - if (src_is_directory && (new_parent || target_ip != NULL)) { > > - /* > - * Decrement link count on src_directory since the > - * entry that's moved no longer points to it. > - */ > - error = xfs_droplink(tp, src_dp); > + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > + &first_block, &free_list, spaceres); > if (error) > goto abort_return; > - } > > - error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino, > - &first_block, &free_list, spaceres); > - if (error) > - goto abort_return; > + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > + if (new_parent) > + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > > - xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > - xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > - if (new_parent) > - xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > + } /* RENAME_EXCHANGE */ > > /* > * If this is a synchronous mount, make sure that the > @@ -2926,6 +2941,100 @@ xfs_rename( > return error; > } > > +/* xfs_cross_rename() > + * > + * responsible to handle RENAME_EXCHANGE flag > + * in renameat2() sytemcall > + */ > +int > +xfs_cross_rename( xfs_cross_rename() is only used by xfs_rename() so it can be defined static. Somewhat of a nit, but I'd also expect to see it implemented above xfs_rename() as it is a helper for the latter. That could be a matter of personal taste, however. Otherwise, just stick a declaration at the top of the file. > + xfs_trans_t *tp, > + xfs_inode_t *src_dp, > + struct xfs_name *src_name, > + xfs_inode_t *src_ip, > + xfs_inode_t *target_dp, > + struct xfs_name *target_name, > + xfs_inode_t *target_ip, > + xfs_bmap_free_t *free_list, > + xfs_fsblock_t *first_block, > + int spaceres) > +{ > + int error = 0; > + int new_parent; > + int src_is_directory; > + int tgt_is_directory; > + > + new_parent = (src_dp != target_dp); > + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); > + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); > + > + /* Replace source inode */ > + error = xfs_dir_replace(tp, src_dp, src_name, > + target_ip->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out_abort; > + > + /* Replace target inode */ > + error = xfs_dir_replace(tp, target_dp, target_name, > + src_ip->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out_abort; > + > + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + > + /* > + * Update ".." entry to match the new parents > + * > + * In case we are crossing different file types between different > + * parents, we must update parent's link count to match the ".." > + * entry of the new child (or the removal of it). > + */ The logic of the subsequent block looks Ok to me, but I would probably split up the comment to be more specific. Something like the following just as an example: /* * If we're renaming one or more directories across different parents, * update the respective ".." entries (and link counts) to match the new * parents. */ > + if (new_parent) { > + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); Long line. > + > + if (tgt_is_directory) { > + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, > + src_dp->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out_abort; /* transfer target ".." reference to src_dp */ > + if (!src_is_directory) { > + error = xfs_droplink(tp, target_dp); > + if (error) > + goto out_abort; > + error = xfs_bumplink(tp, src_dp); > + if (error) > + goto out_abort; > + } > + } > + > + if (src_is_directory) { > + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, > + target_dp->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out_abort; /* transfer src ".." reference to target_dp */ > + if (!tgt_is_directory) { > + error = xfs_droplink(tp, src_dp); > + if (error) > + goto out_abort; > + error = xfs_bumplink(tp, target_dp); > + if (error) > + goto out_abort; > + } > + } > + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > + } > + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); > + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); > + > +out_abort: The name out_abort doesn't really mean much here. We don't abort anything. Perhaps just 'out?' > + return error; > +} > + > STATIC int > xfs_iflush_cluster( > xfs_inode_t *ip, > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 9af2882..819f487 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -340,7 +340,12 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, > int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, > struct xfs_inode *src_ip, struct xfs_inode *target_dp, > struct xfs_name *target_name, > - struct xfs_inode *target_ip); > + struct xfs_inode *target_ip, unsigned int flags); > +int xfs_cross_rename(struct xfs_trans *tp, struct xfs_inode *src_dp, > + struct xfs_name *src_name, struct xfs_inode *src_ip, > + struct xfs_inode *target_dp, struct xfs_name *target_name, > + struct xfs_inode *target_ip,struct xfs_bmap_free *free_list, > + xfs_fsblock_t *first_block, int spaceres); There's no need for this once xfs_cross_rename() is static. Brian > > void xfs_ilock(xfs_inode_t *, uint); > int xfs_ilock_nowait(xfs_inode_t *, uint); > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 0b8704c..481ae10 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -391,7 +391,7 @@ xfs_vn_rename( > struct xfs_name nname; > > /* XFS does not support RENAME_EXCHANGE yet */ > - if (flags & ~RENAME_NOREPLACE) > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > return -EINVAL; > > xfs_dentry_to_name(&oname, odentry, 0); > @@ -399,7 +399,7 @@ xfs_vn_rename( > > return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), > XFS_I(ndir), &nname, > - new_inode ? XFS_I(new_inode) : NULL); > + new_inode ? XFS_I(new_inode) : NULL, flags); > } > > /* > -- > 2.1.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aspsbn@inbox.ru Tue Nov 11 14:01:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FM_FRM_RN_L_BRACK, FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1ECAF7F61 for ; Tue, 11 Nov 2014 14:01:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F30128F8033 for ; Tue, 11 Nov 2014 12:01:43 -0800 (PST) X-ASG-Debug-ID: 1415736101-04cb6c1e6b2127f0001-NocioJ Received: from [178.239.243.27] ([178.239.243.27]) by cuda.sgi.com with ESMTP id AWN3jBlSK4DD2CVh for ; Tue, 11 Nov 2014 12:01:42 -0800 (PST) X-Barracuda-Envelope-From: aspsbn@inbox.ru X-Barracuda-Apparent-Source-IP: 178.239.243.27 Received: from [144.97.111.135] (account aspsbn@inbox.ru HELO aronaczeoygn.neeaol.su) by (CommuniGate Pro SMTP 5.2.3) with ESMTPA id 337613641 for xfs@oss.sgi.com; Tue, 11 Nov 2014 21:01:58 +0100 From: ">*>*>*>*>*>*>*"> To: Subject: =?koi8-r?B?8sXLz83FzsTBw8nJLCDLz9TP0tnFIM3Px9XUIMnazcXOydTYIPfB2w==?= =?koi8-r?B?IMLJ2s7F0w==?= Date: Tue, 11 Nov 2014 21:01:58 +0100 X-ASG-Orig-Subj: =?koi8-r?B?8sXLz83FzsTBw8nJLCDLz9TP0tnFIM3Px9XUIMnazcXOydTYIPfB2w==?= =?koi8-r?B?IMLJ2s7F0w==?= MIME-Version: 1.0 Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: 8bit X-Mailer: huewqvxp.44 Message-ID: <2644909318.M8S6DKP3099753@lziwscvp.pbgiydt.tv> X-Barracuda-Connect: UNKNOWN[178.239.243.27] X-Barracuda-Start-Time: 1415736101 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 9 ïóîï÷îùè óïóôá÷ìñàýéè òåúõìøôáôé÷îïê òáóóùìëé 1. çòáíïôîï óïóôá÷ìåîîùê íáëåô: - MaËeÔ ÎÅ ÄÏÌÖÅÎ ÂÙÔØ ÓÌÉÛËÏÍ ÍÁÌÅÎØËÉÍ ÉÌÉ ÏÞÅÎØ ÂÏÌØÛÉÍ. - MaËeÔ ÎÅ ÄÏÌÖÅÎ ÓÏÄÅÒÖÁÔØ ËÁÒÔÉÎËÉ (ÏÎÉ ÐÌÏÈÏ ÐÒÏÈÏÄÑÔ ÆÉÌØÔÒÙ). 2. îéúëáñ óôïéíïóôø PAóCùìëé: - úaËaÚÁ× Ä×Å ÒÁÓÓÙÌËÉ - ÷Ù ÐÏÌÕÞÉÔÅ ÔÒÅÔØÀ × ÂÅÓÐÌÁÔÎÏ! 3. ïâÿåí òáúïóìáîîùè ïâÿñ÷ìåîéê: - ëÏÌÉÞÅÓÔ×Ï ÒÁÚÏÓÌÁÎÎÙÈ ÐÉÓÅÍ ÉÓÞÉÓÌÑÅÔÓÑ ÄÅÓÑÔËÁÍÉ ÔÙÓÑÞ É ÄÁÖÅ ÍÉÌÌÉÏÎÁÍÉ. 4. éíååôóñ ìé óóùìëá îá ÷áû óáêô: - åÓÌÉ ÕËÁÚÁÔØ ÁÄÒÅÓ ÓÁÊÔÁ × ÷ÁÛÅÊ ÒÁÓÓÙÌËÅ - ÜÆÆÅËÔ ÂÕÄÅÔ ×ÙÛÅ × 2-3 ÒÁÚÁ! 5. ó÷åöåóôø âáúù äáîîùè: - åÖÅÎÅÄÅÌØÎÏ ÍÙ ÄÏÂÁ×ÌÑÅÍ ×ÓÅ ÎÏ×ÙÅ É ÎÏ×ÙÅ ÜÌÅËÔÒÏÎÎÙÅ ÁÄÒÅÓÁ. - ÷Ù × ÄÁÎÎÙÊ ÍÏÍÅÎÔ ÞÉÔÁÅÔÅ ÜÔÏ ÐÉÓØÍÏ - Á ÚÎÁÞÉÔ ÎÁÛÉ 6ÁÚÙ ÁËÔÕÁÌØÎÙ! 6. ÷ïóôòåâï÷áîîïóôø ÷áûåçï ðòåäìïöåîéñ: - åÓÌÉ ÷Ù ÐÒÅÄÌÁÇÁÅÔÅ ÔÏ×ÁÒÙ ÉÌÉ ÕÓÌÕÇÉ, ÎÁ ÉÎÔÅÒÅÓÎÙÈ ÕÓÌÏ×ÉÑÈ, ËÏÔÏÒÙÅ ÐÏÌØÚÕÀÔÓÑ ÓÐÒÏÓÏÍ Õ ÌÀÄÅÊ - ÚÎÁÞÉÔ ÒÅÚÕÌØÔÁÔ ÎÅÚÁÓÔÁ×ÉÔ ÓÅÂÑ ÖÄÁÔØ! 7. ÷ ëáëïå ÷òåíñ ÷ùðïìîåîá òåëìáíá: - ÷ÓÅÈ Ó×ÏÉÈ ËÌÉÅÎÔÏ× ÍÙ ÒÅËÌÁÍÉÒÕÅÍ ÔÏÌØËÏ × ÄÎÅ×ÎÏÅ É ÕÔÒÅÎÎÅÅ ×ÒÅÍÑ É × ÂÕÄÎÉ - ÜÔÏ ×ÒÅÍÑ ÎÁÉÂÏÌØÛÅÊ ÁËÔÉ×ÎÏÓÔÉ! 8. ëáëïê ðòïãåîô òåëìáíîùè ðéóåí ðòïûåì þåòåú æéìøôòù: - îÁÛÉ ÍÅÔÏÄÙ ÏÔÐÒÁ×ËÉ ÐÉÓÅÍ, ÐÏÚ×ÏÌÑÀÔ ÎÁÍ ÐÒÏÈÏÄÉÔØ ÎÁ 60 - 85% ÏÔ ÏÂÝÅÇÏ ÏÂßÅÍÁ ÐÉÓÅÍ! 9. ëïîôáëôù: - õËÁÖÉÔÅ ÍÁËÓÉÍÕÍ ËÏÎÔÁËÔÏ× × ÐÉÓØÍÅ. - ðÏ ×ÓÅÍ ÕËÁÚÁÎÎÙÍ ËÏÎÔÁËÔÁÍ ÂÕÄÕÔ ÏÂÒÁÝÁÔØÓÑ ÂÕÄÕÝÉÅ ËÌÉÅÎÔÙ. öÄÅÍ ÷ÁÛÅÇÏ Ú×ÏÎËÁ: +7 \ 9 25\ 5þ 5- 14 -9 2 From jack@suse.cz Tue Nov 11 15:04:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BBF577F6A for ; Tue, 11 Nov 2014 15:04:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AAFF7304048 for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-ASG-Debug-ID: 1415739884-04cb6c1e6a215b40001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id tIaulbRDMVnHARiU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B939AACDE; Tue, 11 Nov 2014 21:04:43 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 27B7481C78; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 03/11] xfs: Remove some useless flags tests Date: Tue, 11 Nov 2014 22:04:17 +0100 X-ASG-Orig-Subj: [PATCH 03/11] xfs: Remove some useless flags tests Message-Id: <1415739865-2438-4-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739884 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 'flags' have XFS_ALL_QUOTA_ACCT cleared immediately on function entry. There's no point in checking these bits later in the function. Also because we check something is going to change, we know some enforcement bits are being added and thus there's no point in testing that later. Signed-off-by: Jan Kara --- fs/xfs/xfs_qm_syscalls.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 5e4944973587..60bca27d3d04 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -328,22 +328,16 @@ xfs_qm_scall_quotaon( return -EINVAL; } - /* No fs can turn on quotas with a delayed effect */ - ASSERT((flags & XFS_ALL_QUOTA_ACCT) == 0); - /* * Can't enforce without accounting. We check the superblock * qflags here instead of m_qflags because rootfs can have * quota acct on ondisk without m_qflags' knowing. */ - if (((flags & XFS_UQUOTA_ACCT) == 0 && - (mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && + if (((mp->m_sb.sb_qflags & XFS_UQUOTA_ACCT) == 0 && (flags & XFS_UQUOTA_ENFD)) || - ((flags & XFS_GQUOTA_ACCT) == 0 && - (mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && + ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) == 0 && (flags & XFS_GQUOTA_ENFD)) || - ((flags & XFS_PQUOTA_ACCT) == 0 && - (mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && + ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) == 0 && (flags & XFS_PQUOTA_ENFD))) { xfs_debug(mp, "%s: Can't enforce without acct, flags=%x sbflags=%x", @@ -381,8 +375,7 @@ xfs_qm_scall_quotaon( ((mp->m_sb.sb_qflags & XFS_PQUOTA_ACCT) != (mp->m_qflags & XFS_PQUOTA_ACCT)) || ((mp->m_sb.sb_qflags & XFS_GQUOTA_ACCT) != - (mp->m_qflags & XFS_GQUOTA_ACCT)) || - (flags & XFS_ALL_QUOTA_ENFD) == 0) + (mp->m_qflags & XFS_GQUOTA_ACCT))) return 0; if (! XFS_IS_QUOTA_RUNNING(mp)) -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DED847F6A for ; Tue, 11 Nov 2014 15:04:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDF15304039 for ; Tue, 11 Nov 2014 13:04:47 -0800 (PST) X-ASG-Debug-ID: 1415739885-04cbb00e69219f00001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 6c7cKeV43AAeAxp9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4D7B0ADA2; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 38E7E81EDC; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 08/11] ocfs2: Use generic helpers for quotaon and quotaoff Date: Tue, 11 Nov 2014 22:04:22 +0100 X-ASG-Orig-Subj: [PATCH 08/11] ocfs2: Use generic helpers for quotaon and quotaoff Message-Id: <1415739865-2438-9-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Ocfs2 can just use the generic helpers provided by quota code for turning quotas on and off when quota files are stored as system inodes. The only difference is the feature test in ocfs2_quota_on() and that is covered by dquot_sysquota_on() checking whether usage tracking is enabled (which can happen only if the filesystem has the quota feature set). Signed-off-by: Jan Kara --- fs/ocfs2/super.c | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 93c85bc745e1..1cfedaa24a9d 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -993,29 +993,9 @@ static void ocfs2_disable_quotas(struct ocfs2_super *osb) } } -/* Handle quota on quotactl */ -static int ocfs2_quota_on(struct super_block *sb, int type, int format_id) -{ - unsigned int feature[OCFS2_MAXQUOTAS] = { - OCFS2_FEATURE_RO_COMPAT_USRQUOTA, - OCFS2_FEATURE_RO_COMPAT_GRPQUOTA}; - - if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type])) - return -EINVAL; - - return dquot_enable(sb_dqopt(sb)->files[type], type, - format_id, DQUOT_LIMITS_ENABLED); -} - -/* Handle quota off quotactl */ -static int ocfs2_quota_off(struct super_block *sb, int type) -{ - return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); -} - static const struct quotactl_ops ocfs2_quotactl_ops = { - .quota_on_meta = ocfs2_quota_on, - .quota_off = ocfs2_quota_off, + .sysquota_on = dquot_sysquota_on, + .sysquota_off = dquot_sysquota_off, .quota_sync = dquot_quota_sync, .get_info = dquot_get_dqinfo, .set_info = dquot_set_dqinfo, -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0136A7F6B for ; Tue, 11 Nov 2014 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4854304039 for ; Tue, 11 Nov 2014 13:04:47 -0800 (PST) X-ASG-Debug-ID: 1415739885-04cb6c1e6d215b60001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 3CAlN077bpC6DB82 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 5C539ADAD; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3689281EDB; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 06/11] quota: Add ->sysquota_{on,off} callbacks for VFS quotas Date: Tue, 11 Nov 2014 22:04:20 +0100 X-ASG-Orig-Subj: [PATCH 06/11] quota: Add ->sysquota_{on,off} callbacks for VFS quotas Message-Id: <1415739865-2438-7-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Add functions which translate ->sysquota_on / ->sysquota_off calls into appropriate changes in VFS quota. This will enable filesystems supporting VFS quota files in system inodes to be controlled via Q_XQUOTA[ON|OFF] quotactls for better userspace compatibility. Signed-off-by: Jan Kara --- fs/quota/dquot.c | 82 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/quotaops.h | 2 ++ 2 files changed, 84 insertions(+) diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 6b4527216a7f..b7359c9da61e 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -2380,6 +2380,88 @@ out: } EXPORT_SYMBOL(dquot_quota_on_mount); +int dquot_sysquota_on(struct super_block *sb, unsigned int flags) +{ + int ret; + int type; + struct quota_info *dqopt = sb_dqopt(sb); + + if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) + return -ENOSYS; + /* Accounting cannot be turned on while fs is mounted */ + flags &= ~(FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT); + if (!flags) + return -EINVAL; + for (type = 0; type < MAXQUOTAS; type++) { + if (!(flags & qtype_limit_flag(type))) + continue; + /* Can't enforce without accounting */ + if (!sb_has_quota_usage_enabled(sb, type)) + return -EINVAL; + ret = dquot_enable(dqopt->files[type], type, + dqopt->info[type].dqi_fmt_id, + DQUOT_LIMITS_ENABLED); + if (ret < 0) + goto out_err; + } + return 0; +out_err: + /* Backout enforcement enablement we already did */ + for (type--; type >= 0; type--) { + if (flags & qtype_limit_flag(type)) + dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); + } + /* Error code translation for better compatibility with XFS */ + if (ret == -EBUSY) + ret = -EEXIST; + return ret; +} +EXPORT_SYMBOL(dquot_sysquota_on); + +int dquot_sysquota_off(struct super_block *sb, unsigned int flags) +{ + int ret; + int type; + struct quota_info *dqopt = sb_dqopt(sb); + + if (!(dqopt->flags & DQUOT_QUOTA_SYS_FILE)) + return -ENOSYS; + /* + * We don't support turning off accounting via quotactl. In principle + * quota infrastructure can do this but filesystems don't expect + * userspace to be able to do it. + */ + if (flags & + (FS_QUOTA_UDQ_ACCT | FS_QUOTA_GDQ_ACCT | FS_QUOTA_PDQ_ACCT)) + return -EOPNOTSUPP; + + /* Filter out limits not enabled */ + for (type = 0; type < MAXQUOTAS; type++) + if (!sb_has_quota_limits_enabled(sb, type)) + flags &= ~qtype_limit_flag(type); + /* Nothing left? */ + if (!flags) + return -EEXIST; + for (type = 0; type < MAXQUOTAS; type++) { + if (flags & qtype_limit_flag(type)) { + ret = dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); + if (ret < 0) + goto out_err; + } + } + return 0; +out_err: + /* Backout enforcement disabling we already did */ + for (type--; type >= 0; type--) { + if (flags & qtype_limit_flag(type)) + dquot_enable(dqopt->files[type], type, + dqopt->info[type].dqi_fmt_id, + DQUOT_LIMITS_ENABLED); + } + return ret; +} +EXPORT_SYMBOL(dquot_sysquota_off); + static inline qsize_t qbtos(qsize_t blocks) { return blocks << QIF_DQBLKSIZE_BITS; diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 5947a9e54862..6f5dc7e397a7 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -93,6 +93,8 @@ int dquot_quota_on(struct super_block *sb, int type, int format_id, int dquot_quota_on_mount(struct super_block *sb, char *qf_name, int format_id, int type); int dquot_quota_off(struct super_block *sb, int type); +int dquot_sysquota_on(struct super_block *sb, unsigned int flags); +int dquot_sysquota_off(struct super_block *sb, unsigned int flags); int dquot_writeback_dquots(struct super_block *sb, int type); int dquot_quota_sync(struct super_block *sb, int type); int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F4457F72 for ; Tue, 11 Nov 2014 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6FD508F8035 for ; Tue, 11 Nov 2014 13:04:48 -0800 (PST) X-ASG-Debug-ID: 1415739885-04bdf0650c24b630001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id uieA65aZ1b0cp9tQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 47C10ADA1; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3446181ED5; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 07/11] ext4: Use generic helpers for quotaon and quotaoff Date: Tue, 11 Nov 2014 22:04:21 +0100 X-ASG-Orig-Subj: [PATCH 07/11] ext4: Use generic helpers for quotaon and quotaoff Message-Id: <1415739865-2438-8-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Ext4 can just use the generic helpers provided by quota code for turning quotas on and off when quota files are stored as system inodes. The only difference is the feature test in ext4_quota_on_sysfile() but the same is achieved in dquot_sysquota_on() by checking whether usage tracking for the corresponding quota type is enabled (which can happen only if quota feature is set). Signed-off-by: Jan Kara --- fs/ext4/super.c | 34 ++-------------------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 2c9e6864abd9..45be29119e42 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1055,10 +1055,7 @@ static int ext4_mark_dquot_dirty(struct dquot *dquot); static int ext4_write_info(struct super_block *sb, int type); static int ext4_quota_on(struct super_block *sb, int type, int format_id, struct path *path); -static int ext4_quota_on_sysfile(struct super_block *sb, int type, - int format_id); static int ext4_quota_off(struct super_block *sb, int type); -static int ext4_quota_off_sysfile(struct super_block *sb, int type); static int ext4_quota_on_mount(struct super_block *sb, int type); static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, size_t len, loff_t off); @@ -1090,8 +1087,8 @@ static const struct quotactl_ops ext4_qctl_operations = { }; static const struct quotactl_ops ext4_qctl_sysfile_operations = { - .quota_on_meta = ext4_quota_on_sysfile, - .quota_off = ext4_quota_off_sysfile, + .sysquota_on = dquot_sysquota_on, + .sysquota_off = dquot_sysquota_off, .quota_sync = dquot_quota_sync, .get_info = dquot_get_dqinfo, .set_info = dquot_set_dqinfo, @@ -5273,21 +5270,6 @@ static int ext4_enable_quotas(struct super_block *sb) return 0; } -/* - * quota_on function that is used when QUOTA feature is set. - */ -static int ext4_quota_on_sysfile(struct super_block *sb, int type, - int format_id) -{ - if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) - return -EINVAL; - - /* - * USAGE was enabled at mount time. Only need to enable LIMITS now. - */ - return ext4_quota_enable(sb, type, format_id, DQUOT_LIMITS_ENABLED); -} - static int ext4_quota_off(struct super_block *sb, int type) { struct inode *inode = sb_dqopt(sb)->files[type]; @@ -5314,18 +5296,6 @@ out: return dquot_quota_off(sb, type); } -/* - * quota_off function that is used when QUOTA feature is set. - */ -static int ext4_quota_off_sysfile(struct super_block *sb, int type) -{ - if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) - return -EINVAL; - - /* Disable only the limits. */ - return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); -} - /* Read data from quotafile - avoid pagecache and such because we cannot afford * acquiring the locks... As quota files are never truncated and quota code * itself serializes the operations (and no one else should touch the files) -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 867037F6A for ; Tue, 11 Nov 2014 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14B2EAC007 for ; Tue, 11 Nov 2014 13:04:47 -0800 (PST) X-ASG-Debug-ID: 1415739885-04cbb00e67219f00001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id r7oIGLSYCQFBu2VJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 63255ADAE; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 464C581EE2; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 11/11] quota: Store maximum space limit in bytes Date: Tue, 11 Nov 2014 22:04:25 +0100 X-ASG-Orig-Subj: [PATCH 11/11] quota: Store maximum space limit in bytes Message-Id: <1415739865-2438-12-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Currently maximum space limit quota format supports is in blocks however since we store space limits in bytes, this is somewhat confusing. So store the maximum limit in bytes as well. Also rename the field to match the new unit and related inode field to match the new naming scheme. Signed-off-by: Jan Kara --- fs/ocfs2/quota_local.c | 4 ++-- fs/quota/dquot.c | 18 ++++-------------- fs/quota/quota_v1.c | 4 ++-- fs/quota/quota_v2.c | 10 +++++----- include/linux/quota.h | 4 ++-- 5 files changed, 15 insertions(+), 25 deletions(-) diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c index 10b653930ee2..465223b7592e 100644 --- a/fs/ocfs2/quota_local.c +++ b/fs/ocfs2/quota_local.c @@ -701,8 +701,8 @@ static int ocfs2_local_read_info(struct super_block *sb, int type) /* We don't need the lock and we have to acquire quota file locks * which will later depend on this lock */ mutex_unlock(&sb_dqopt(sb)->dqio_mutex); - info->dqi_maxblimit = 0x7fffffffffffffffLL; - info->dqi_maxilimit = 0x7fffffffffffffffLL; + info->dqi_max_spc_limit = 0x7fffffffffffffffLL; + info->dqi_max_ino_limit = 0x7fffffffffffffffLL; oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS); if (!oinfo) { mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota" diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 887ead8c88e2..2e28d47b8798 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -2462,16 +2462,6 @@ out_err: } EXPORT_SYMBOL(dquot_sysquota_off); -static inline qsize_t qbtos(qsize_t blocks) -{ - return blocks << QIF_DQBLKSIZE_BITS; -} - -static inline qsize_t stoqb(qsize_t space) -{ - return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS; -} - /* Generic routine for getting common part of quota structure */ static void do_get_dqblk(struct dquot *dquot, struct qc_dqblk *di) { @@ -2521,13 +2511,13 @@ static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) return -EINVAL; if (((di->d_fieldmask & QC_SPC_SOFT) && - stoqb(di->d_spc_softlimit) > dqi->dqi_maxblimit) || + di->d_spc_softlimit > dqi->dqi_max_spc_limit) || ((di->d_fieldmask & QC_SPC_HARD) && - stoqb(di->d_spc_hardlimit) > dqi->dqi_maxblimit) || + di->d_spc_hardlimit > dqi->dqi_max_spc_limit) || ((di->d_fieldmask & QC_INO_SOFT) && - (di->d_ino_softlimit > dqi->dqi_maxilimit)) || + (di->d_ino_softlimit > dqi->dqi_max_ino_limit)) || ((di->d_fieldmask & QC_INO_HARD) && - (di->d_ino_hardlimit > dqi->dqi_maxilimit))) + (di->d_ino_hardlimit > dqi->dqi_max_ino_limit))) return -ERANGE; spin_lock(&dq_data_lock); diff --git a/fs/quota/quota_v1.c b/fs/quota/quota_v1.c index 469c6848b322..8fe79beced5c 100644 --- a/fs/quota/quota_v1.c +++ b/fs/quota/quota_v1.c @@ -169,8 +169,8 @@ static int v1_read_file_info(struct super_block *sb, int type) } ret = 0; /* limits are stored as unsigned 32-bit data */ - dqopt->info[type].dqi_maxblimit = 0xffffffff; - dqopt->info[type].dqi_maxilimit = 0xffffffff; + dqopt->info[type].dqi_max_spc_limit = 0xffffffffULL << QUOTABLOCK_BITS; + dqopt->info[type].dqi_max_ino_limit = 0xffffffff; dqopt->info[type].dqi_igrace = dqblk.dqb_itime ? dqblk.dqb_itime : MAX_IQ_TIME; dqopt->info[type].dqi_bgrace = diff --git a/fs/quota/quota_v2.c b/fs/quota/quota_v2.c index 02751ec695c5..d1a8054bba9a 100644 --- a/fs/quota/quota_v2.c +++ b/fs/quota/quota_v2.c @@ -117,12 +117,12 @@ static int v2_read_file_info(struct super_block *sb, int type) qinfo = info->dqi_priv; if (version == 0) { /* limits are stored as unsigned 32-bit data */ - info->dqi_maxblimit = 0xffffffff; - info->dqi_maxilimit = 0xffffffff; + info->dqi_max_spc_limit = 0xffffffffULL << QUOTABLOCK_BITS; + info->dqi_max_ino_limit = 0xffffffff; } else { - /* used space is stored as unsigned 64-bit value */ - info->dqi_maxblimit = 0xffffffffffffffffULL; /* 2^64-1 */ - info->dqi_maxilimit = 0xffffffffffffffffULL; + /* used space is stored as unsigned 64-bit value in bytes */ + info->dqi_max_spc_limit = 0xffffffffffffffffULL; /* 2^64-1 */ + info->dqi_max_ino_limit = 0xffffffffffffffffULL; } info->dqi_bgrace = le32_to_cpu(dinfo.dqi_bgrace); info->dqi_igrace = le32_to_cpu(dinfo.dqi_igrace); diff --git a/include/linux/quota.h b/include/linux/quota.h index 903db093bbe9..36ce30130bea 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -211,8 +211,8 @@ struct mem_dqinfo { unsigned long dqi_flags; unsigned int dqi_bgrace; unsigned int dqi_igrace; - qsize_t dqi_maxblimit; - qsize_t dqi_maxilimit; + qsize_t dqi_max_spc_limit; + qsize_t dqi_max_ino_limit; void *dqi_priv; }; -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B5C807F74 for ; Tue, 11 Nov 2014 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 36867AC009 for ; Tue, 11 Nov 2014 13:04:48 -0800 (PST) X-ASG-Debug-ID: 1415739885-04cbb00e68219f00001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Rzi6FfEUm1RGshef (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 55A81ADAC; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3094D81ED8; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 04/11] quota: Split ->set_xstate callback into two Date: Tue, 11 Nov 2014 22:04:18 +0100 X-ASG-Orig-Subj: [PATCH 04/11] quota: Split ->set_xstate callback into two Message-Id: <1415739865-2438-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Split ->set_xstate callback into two callbacks - one for turning quotas on (->sysquota_on) and one for turning quotas off (->sysquota_off). That way we don't have to pass quotactl command into the callback which seems cleaner. Signed-off-by: Jan Kara --- fs/quota/quota.c | 20 ++++++++++++++---- fs/xfs/xfs_quotaops.c | 58 ++++++++++++++++++++++++++++++++------------------- include/linux/quota.h | 3 ++- 3 files changed, 54 insertions(+), 27 deletions(-) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 75621649dbd7..fb22cebff946 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -195,15 +195,26 @@ static int quota_setquota(struct super_block *sb, int type, qid_t id, return sb->s_qcop->set_dqblk(sb, qid, &fdq); } -static int quota_setxstate(struct super_block *sb, int cmd, void __user *addr) +static int quota_sysquota_on(struct super_block *sb, void __user *addr) { __u32 flags; if (copy_from_user(&flags, addr, sizeof(flags))) return -EFAULT; - if (!sb->s_qcop->set_xstate) + if (!sb->s_qcop->sysquota_on) return -ENOSYS; - return sb->s_qcop->set_xstate(sb, flags, cmd); + return sb->s_qcop->sysquota_on(sb, flags); +} + +static int quota_sysquota_off(struct super_block *sb, void __user *addr) +{ + __u32 flags; + + if (copy_from_user(&flags, addr, sizeof(flags))) + return -EFAULT; + if (!sb->s_qcop->sysquota_off) + return -ENOSYS; + return sb->s_qcop->sysquota_off(sb, flags); } static int quota_getxstate(struct super_block *sb, void __user *addr) @@ -326,8 +337,9 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, return -ENOSYS; return sb->s_qcop->quota_sync(sb, type); case Q_XQUOTAON: + return quota_sysquota_on(sb, addr); case Q_XQUOTAOFF: - return quota_setxstate(sb, cmd, addr); + return quota_sysquota_off(sb, addr); case Q_XQUOTARM: return quota_rmxquota(sb, addr); case Q_XGETQSTAT: diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 9ad73240ed54..a3836ac0f2f8 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -66,19 +66,9 @@ xfs_fs_get_xstatev( return xfs_qm_scall_getqstatv(mp, fqs); } -STATIC int -xfs_fs_set_xstate( - struct super_block *sb, - unsigned int uflags, - int op) +static unsigned int generic_to_xfs_flags(unsigned int uflags) { - struct xfs_mount *mp = XFS_M(sb); - unsigned int flags = 0; - - if (sb->s_flags & MS_RDONLY) - return -EROFS; - if (!XFS_IS_QUOTA_RUNNING(mp)) - return -ENOSYS; + unsigned int flags = 0; if (uflags & FS_QUOTA_UDQ_ACCT) flags |= XFS_UQUOTA_ACCT; @@ -93,16 +83,39 @@ xfs_fs_set_xstate( if (uflags & FS_QUOTA_PDQ_ENFD) flags |= XFS_PQUOTA_ENFD; - switch (op) { - case Q_XQUOTAON: - return xfs_qm_scall_quotaon(mp, flags); - case Q_XQUOTAOFF: - if (!XFS_IS_QUOTA_ON(mp)) - return -EINVAL; - return xfs_qm_scall_quotaoff(mp, flags); - } + return flags; +} + +STATIC int +xfs_sysquota_on( + struct super_block *sb, + unsigned int uflags) +{ + struct xfs_mount *mp = XFS_M(sb); + + if (sb->s_flags & MS_RDONLY) + return -EROFS; + if (!XFS_IS_QUOTA_RUNNING(mp)) + return -ENOSYS; + + return xfs_qm_scall_quotaon(mp, generic_to_xfs_flags(uflags)); +} + +STATIC int +xfs_sysquota_off( + struct super_block *sb, + unsigned int uflags) +{ + struct xfs_mount *mp = XFS_M(sb); + + if (sb->s_flags & MS_RDONLY) + return -EROFS; + if (!XFS_IS_QUOTA_RUNNING(mp)) + return -ENOSYS; + if (!XFS_IS_QUOTA_ON(mp)) + return -EINVAL; - return -EINVAL; + return xfs_qm_scall_quotaoff(mp, generic_to_xfs_flags(uflags)); } STATIC int @@ -168,7 +181,8 @@ xfs_fs_set_dqblk( const struct quotactl_ops xfs_quotactl_operations = { .get_xstatev = xfs_fs_get_xstatev, .get_xstate = xfs_fs_get_xstate, - .set_xstate = xfs_fs_set_xstate, + .sysquota_on = xfs_sysquota_on, + .sysquota_off = xfs_sysquota_off, .rm_xquota = xfs_fs_rm_xquota, .get_dqblk = xfs_fs_get_dqblk, .set_dqblk = xfs_fs_set_dqblk, diff --git a/include/linux/quota.h b/include/linux/quota.h index 80d345a3524c..3a046676e4aa 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -326,8 +326,9 @@ struct quotactl_ops { int (*set_info)(struct super_block *, int, struct if_dqinfo *); int (*get_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); int (*set_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); + int (*sysquota_on)(struct super_block *, unsigned int); + int (*sysquota_off)(struct super_block *, unsigned int); int (*get_xstate)(struct super_block *, struct fs_quota_stat *); - int (*set_xstate)(struct super_block *, unsigned int, int); int (*get_xstatev)(struct super_block *, struct fs_quota_statv *); int (*rm_xquota)(struct super_block *, unsigned int); }; -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6067A7F6D for ; Tue, 11 Nov 2014 15:04:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E38F7AC006 for ; Tue, 11 Nov 2014 13:04:47 -0800 (PST) X-ASG-Debug-ID: 1415739885-04cb6c1e6a215b50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id ysDiCFQvkX5FdSGq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4F85DADAB; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3D3CE81EDD; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 09/11] quota: Remove quota_on_meta callback Date: Tue, 11 Nov 2014 22:04:23 +0100 X-ASG-Orig-Subj: [PATCH 09/11] quota: Remove quota_on_meta callback Message-Id: <1415739865-2438-10-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header There are no more users for quota_on_meta callback. Just remove it. Signed-off-by: Jan Kara --- fs/quota/quota.c | 5 +---- include/linux/quota.h | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 162d533c4997..5650b7ce4714 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -79,11 +79,8 @@ unsigned int qtype_limit_flag(int type) static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, struct path *path) { - if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta && - !sb->s_qcop->sysquota_on) + if (!sb->s_qcop->quota_on && !sb->s_qcop->sysquota_on) return -ENOSYS; - if (sb->s_qcop->quota_on_meta) - return sb->s_qcop->quota_on_meta(sb, type, id); if (sb->s_qcop->sysquota_on) return sb->s_qcop->sysquota_on(sb, qtype_limit_flag(type)); if (IS_ERR(path)) diff --git a/include/linux/quota.h b/include/linux/quota.h index 3a046676e4aa..06a214a21778 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -319,7 +319,6 @@ struct path; /* Operations handling requests from userspace */ struct quotactl_ops { int (*quota_on)(struct super_block *, int, int, struct path *); - int (*quota_on_meta)(struct super_block *, int, int); int (*quota_off)(struct super_block *, int); int (*quota_sync)(struct super_block *, int); int (*get_info)(struct super_block *, int, struct if_dqinfo *); -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6CA297F6B for ; Tue, 11 Nov 2014 15:04:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4D233304039 for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-ASG-Debug-ID: 1415739884-04cbb00e67219ef0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id vQy2Ye092RPllwqN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B170AABC6; Tue, 11 Nov 2014 21:04:43 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 205D481EC6; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 0/11 RFC] quota: Unify VFS and XFS quota interfaces Date: Tue, 11 Nov 2014 22:04:14 +0100 X-ASG-Orig-Subj: [PATCH 0/11 RFC] quota: Unify VFS and XFS quota interfaces Message-Id: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739884 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello, this is a first (still partial) attempt to unify VFS and XFS quota interfaces so that XFS quotactls work for filesystems with VFS quotas and vice versa. This is useful so that userspace doesn't have to care that much about which filesystem it is using at least when using basic quota functionality. In particular we should be able to reuse project quota tests in xfstests for ext4. In this patch set I unify quotaon / quotaoff handling (Q_QUOTAON, Q_QUOTAOFF, Q_XQUOTAON, Q_XQUOTAOFF calls) and fix some bugs in the Q_XGETQUOTA, Q_XSETQLIM, Q_GETQUOTA, Q_SETQUOTA calls done by Christoph some time ago. I have actually verified that xfs_quota is able to work with ext4 filesystem (after tweaking it to not check fs type) when these patches are applied. What is still missing is unification of Q_XGETQSTATV, Q_GETINFO, Q_SETINFO. Comments are welcome. Honza From jack@suse.cz Tue Nov 11 15:04:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA0AE7F72 for ; Tue, 11 Nov 2014 15:04:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 991A08F8049 for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-ASG-Debug-ID: 1415739884-04cb6c1e6d215b50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id gFAZXczI0yKRCSrb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id BDC46ACF9; Tue, 11 Nov 2014 21:04:43 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 2495581C31; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 02/11] xfs: Remove unused variable in xfs_qm_scall_quotaon() Date: Tue, 11 Nov 2014 22:04:16 +0100 X-ASG-Orig-Subj: [PATCH 02/11] xfs: Remove unused variable in xfs_qm_scall_quotaon() Message-Id: <1415739865-2438-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739884 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header sbflags variable in xfs_qm_scall_quotaon() was practically unused (we only set it to constant at one place and used it elsewhere). Remove it. Signed-off-by: Jan Kara --- fs/xfs/xfs_qm_syscalls.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 80f2d77d929a..5e4944973587 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -315,7 +315,6 @@ xfs_qm_scall_quotaon( { int error; uint qf; - __int64_t sbflags; flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD); /* @@ -323,8 +322,6 @@ xfs_qm_scall_quotaon( */ flags &= ~(XFS_ALL_QUOTA_ACCT); - sbflags = 0; - if (flags == 0) { xfs_debug(mp, "%s: zero flags, m_qflags=%x", __func__, mp->m_qflags); @@ -371,11 +368,10 @@ xfs_qm_scall_quotaon( /* * There's nothing to change if it's the same. */ - if ((qf & flags) == flags && sbflags == 0) + if ((qf & flags) == flags) return -EEXIST; - sbflags |= XFS_SB_QFLAGS; - if ((error = xfs_qm_write_sb_changes(mp, sbflags))) + if ((error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS))) return error; /* * If we aren't trying to switch on quota enforcement, we are done. -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A7CEB7F6A for ; Tue, 11 Nov 2014 15:04:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96E748F8035 for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-ASG-Debug-ID: 1415739884-04cb6c1e6c215b50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id eOkHigQZ7pGFMSfQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:44 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id BB127ACEE; Tue, 11 Nov 2014 21:04:43 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 29E3281ED2; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 01/11] xfs: Remove useless test Date: Tue, 11 Nov 2014 22:04:15 +0100 X-ASG-Orig-Subj: [PATCH 01/11] xfs: Remove useless test Message-Id: <1415739865-2438-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739884 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Q_XQUOTARM is never passed to xfs_fs_set_xstate() so remove the test. Signed-off-by: Jan Kara --- fs/xfs/xfs_quotaops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index b238027df987..9ad73240ed54 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -77,7 +77,7 @@ xfs_fs_set_xstate( if (sb->s_flags & MS_RDONLY) return -EROFS; - if (op != Q_XQUOTARM && !XFS_IS_QUOTA_RUNNING(mp)) + if (!XFS_IS_QUOTA_RUNNING(mp)) return -ENOSYS; if (uflags & FS_QUOTA_UDQ_ACCT) -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0A6347F7E for ; Tue, 11 Nov 2014 15:04:50 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAE69AC007 for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-ASG-Debug-ID: 1415739884-04bdf0650e24b630001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id CL1HKlc1R0RTjqh8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:45 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C52E3AD35; Tue, 11 Nov 2014 21:04:43 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 2B7F681C69; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 05/11] quota: Wire up ->sysquota_{on,off} callbacks into Q_QUOTA{ON,OFF} Date: Tue, 11 Nov 2014 22:04:19 +0100 X-ASG-Orig-Subj: [PATCH 05/11] quota: Wire up ->sysquota_{on,off} callbacks into Q_QUOTA{ON,OFF} Message-Id: <1415739865-2438-6-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739884 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Make Q_QUOTAON / Q_QUOTAOFF quotactl call ->sysquota_on / ->sysquota_off callback when provided. To match current behavior of ocfs2 & ext4 we make these quotactls turn on / off quota enforcement for appropriate quota type. Signed-off-by: Jan Kara --- fs/quota/quota.c | 31 +++++++++++++++++++++++++++---- include/linux/quotaops.h | 2 ++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/fs/quota/quota.c b/fs/quota/quota.c index fb22cebff946..162d533c4997 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -63,18 +63,43 @@ static int quota_sync_all(int type) return ret; } +unsigned int qtype_limit_flag(int type) +{ + switch (type) { + case USRQUOTA: + return FS_QUOTA_UDQ_ENFD; + case GRPQUOTA: + return FS_QUOTA_GDQ_ENFD; + case PRJQUOTA: + return FS_QUOTA_PDQ_ENFD; + } + return 0; +} + static int quota_quotaon(struct super_block *sb, int type, int cmd, qid_t id, struct path *path) { - if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta) + if (!sb->s_qcop->quota_on && !sb->s_qcop->quota_on_meta && + !sb->s_qcop->sysquota_on) return -ENOSYS; if (sb->s_qcop->quota_on_meta) return sb->s_qcop->quota_on_meta(sb, type, id); + if (sb->s_qcop->sysquota_on) + return sb->s_qcop->sysquota_on(sb, qtype_limit_flag(type)); if (IS_ERR(path)) return PTR_ERR(path); return sb->s_qcop->quota_on(sb, type, id, path); } +static int quota_quotaoff(struct super_block *sb, int type) +{ + if (!sb->s_qcop->quota_off && !sb->s_qcop->sysquota_off) + return -ENOSYS; + if (sb->s_qcop->sysquota_off) + return sb->s_qcop->sysquota_off(sb, qtype_limit_flag(type)); + return sb->s_qcop->quota_off(sb, type); +} + static int quota_getfmt(struct super_block *sb, int type, void __user *addr) { __u32 fmt; @@ -319,9 +344,7 @@ static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, case Q_QUOTAON: return quota_quotaon(sb, type, cmd, id, path); case Q_QUOTAOFF: - if (!sb->s_qcop->quota_off) - return -ENOSYS; - return sb->s_qcop->quota_off(sb, type); + return quota_quotaoff(sb, type); case Q_GETFMT: return quota_getfmt(sb, type, addr); case Q_GETINFO: diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 1d3eee594cd6..5947a9e54862 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -386,4 +386,6 @@ static inline void dquot_release_reservation_block(struct inode *inode, __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); } +unsigned int qtype_limit_flag(int type); + #endif /* _LINUX_QUOTAOPS_ */ -- 1.8.1.4 From jack@suse.cz Tue Nov 11 15:04:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 226B37F6D for ; Tue, 11 Nov 2014 15:04:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01F63304039 for ; Tue, 11 Nov 2014 13:04:49 -0800 (PST) X-ASG-Debug-ID: 1415739886-04cb6c1e6c215b60001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id HzdVTnACkrw4gtoT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 13:04:46 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 72081ADAF; Tue, 11 Nov 2014 21:04:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 41AB881EDF; Tue, 11 Nov 2014 22:04:43 +0100 (CET) From: Jan Kara To: linux-fsdevel@vger.kernel.org Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Jan Kara Subject: [PATCH 10/11] quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units Date: Tue, 11 Nov 2014 22:04:24 +0100 X-ASG-Orig-Subj: [PATCH 10/11] quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units Message-Id: <1415739865-2438-11-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1415739865-2438-1-git-send-email-jack@suse.cz> References: <1415739865-2438-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1415739886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Currently ->get_dqblk() and ->set_dqblk() use struct fs_disk_quota which tracks space limits and usage in 512-byte blocks. However VFS quotas track usage in bytes (as some filesystems require that) and we need to somehow pass this information. Upto now it wasn't a problem because we didn't do any unit conversion (thus VFS quota routines happily stuck number of bytes into d_bcount field of struct fd_disk_quota). Only if you tried to use Q_XGETQUOTA or Q_XSETQLIM for VFS quotas (or Q_GETQUOTA / Q_SETQUOTA for XFS quotas), you got bogus results but noone really tried that. But when we want interfaces compatible we need to fix this. So we bite the bullet and define another quota structure used for passing information from/to ->get_dqblk()/->set_dqblk. It's somewhat sad we have to have more conversion routines in fs/quota/quota.c but it seems cleaner than overloading e.g. units of d_bcount to bytes. Signed-off-by: Jan Kara --- fs/gfs2/quota.c | 49 +++++++-------- fs/quota/dquot.c | 83 ++++++++++++------------- fs/quota/quota.c | 157 +++++++++++++++++++++++++++++++++++++++-------- fs/xfs/xfs_qm.h | 4 +- fs/xfs/xfs_qm_syscalls.c | 156 ++++++++++++++++++++-------------------------- fs/xfs/xfs_quotaops.c | 8 +-- include/linux/quota.h | 47 +++++++++++++- include/linux/quotaops.h | 4 +- 8 files changed, 313 insertions(+), 195 deletions(-) diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 64b29f7f6b4c..dc482ffff659 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -667,7 +667,7 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change) static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, s64 change, struct gfs2_quota_data *qd, - struct fs_disk_quota *fdq) + struct qc_dqblk *fdq) { struct inode *inode = &ip->i_inode; struct gfs2_sbd *sdp = GFS2_SB(inode); @@ -697,16 +697,16 @@ static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc, be64_add_cpu(&q.qu_value, change); qd->qd_qb.qb_value = q.qu_value; if (fdq) { - if (fdq->d_fieldmask & FS_DQ_BSOFT) { - q.qu_warn = cpu_to_be64(fdq->d_blk_softlimit >> sdp->sd_fsb2bb_shift); + if (fdq->d_fieldmask & QC_SPC_SOFT) { + q.qu_warn = cpu_to_be64(fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift); qd->qd_qb.qb_warn = q.qu_warn; } - if (fdq->d_fieldmask & FS_DQ_BHARD) { - q.qu_limit = cpu_to_be64(fdq->d_blk_hardlimit >> sdp->sd_fsb2bb_shift); + if (fdq->d_fieldmask & QC_SPC_HARD) { + q.qu_limit = cpu_to_be64(fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift); qd->qd_qb.qb_limit = q.qu_limit; } - if (fdq->d_fieldmask & FS_DQ_BCOUNT) { - q.qu_value = cpu_to_be64(fdq->d_bcount >> sdp->sd_fsb2bb_shift); + if (fdq->d_fieldmask & QC_SPACE) { + q.qu_value = cpu_to_be64(fdq->d_space >> sdp->sd_sb.sb_bsize_shift); qd->qd_qb.qb_value = q.qu_value; } } @@ -1502,7 +1502,7 @@ static int gfs2_quota_get_xstate(struct super_block *sb, } static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, - struct fs_disk_quota *fdq) + struct qc_dqblk *fdq) { struct gfs2_sbd *sdp = sb->s_fs_info; struct gfs2_quota_lvb *qlvb; @@ -1510,7 +1510,7 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, struct gfs2_holder q_gh; int error; - memset(fdq, 0, sizeof(struct fs_disk_quota)); + memset(fdq, 0, sizeof(*fdq)); if (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF) return -ESRCH; /* Crazy XFS error code */ @@ -1527,12 +1527,9 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, goto out; qlvb = (struct gfs2_quota_lvb *)qd->qd_gl->gl_lksb.sb_lvbptr; - fdq->d_version = FS_DQUOT_VERSION; - fdq->d_flags = (qid.type == USRQUOTA) ? FS_USER_QUOTA : FS_GROUP_QUOTA; - fdq->d_id = from_kqid_munged(current_user_ns(), qid); - fdq->d_blk_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_fsb2bb_shift; - fdq->d_blk_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_fsb2bb_shift; - fdq->d_bcount = be64_to_cpu(qlvb->qb_value) << sdp->sd_fsb2bb_shift; + fdq->d_spc_hardlimit = be64_to_cpu(qlvb->qb_limit) << sdp->sd_sb.sb_bsize_shift; + fdq->d_spc_softlimit = be64_to_cpu(qlvb->qb_warn) << sdp->sd_sb.sb_bsize_shift; + fdq->d_space = be64_to_cpu(qlvb->qb_value) << sdp->sd_sb.sb_bsize_shift; gfs2_glock_dq_uninit(&q_gh); out: @@ -1541,10 +1538,10 @@ out: } /* GFS2 only supports a subset of the XFS fields */ -#define GFS2_FIELDMASK (FS_DQ_BSOFT|FS_DQ_BHARD|FS_DQ_BCOUNT) +#define GFS2_FIELDMASK (QC_SPC_SOFT|QC_SPC_HARD|QC_SPACE) static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, - struct fs_disk_quota *fdq) + struct qc_dqblk *fdq) { struct gfs2_sbd *sdp = sb->s_fs_info; struct gfs2_inode *ip = GFS2_I(sdp->sd_quota_inode); @@ -1588,17 +1585,17 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, goto out_i; /* If nothing has changed, this is a no-op */ - if ((fdq->d_fieldmask & FS_DQ_BSOFT) && - ((fdq->d_blk_softlimit >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) - fdq->d_fieldmask ^= FS_DQ_BSOFT; + if ((fdq->d_fieldmask & QC_SPC_SOFT) && + ((fdq->d_spc_softlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_warn))) + fdq->d_fieldmask ^= QC_SPC_SOFT; - if ((fdq->d_fieldmask & FS_DQ_BHARD) && - ((fdq->d_blk_hardlimit >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) - fdq->d_fieldmask ^= FS_DQ_BHARD; + if ((fdq->d_fieldmask & QC_SPC_HARD) && + ((fdq->d_spc_hardlimit >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_limit))) + fdq->d_fieldmask ^= QC_SPC_HARD; - if ((fdq->d_fieldmask & FS_DQ_BCOUNT) && - ((fdq->d_bcount >> sdp->sd_fsb2bb_shift) == be64_to_cpu(qd->qd_qb.qb_value))) - fdq->d_fieldmask ^= FS_DQ_BCOUNT; + if ((fdq->d_fieldmask & QC_SPACE) && + ((fdq->d_space >> sdp->sd_sb.sb_bsize_shift) == be64_to_cpu(qd->qd_qb.qb_value))) + fdq->d_fieldmask ^= QC_SPACE; if (fdq->d_fieldmask == 0) goto out_i; diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index b7359c9da61e..887ead8c88e2 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -2473,30 +2473,25 @@ static inline qsize_t stoqb(qsize_t space) } /* Generic routine for getting common part of quota structure */ -static void do_get_dqblk(struct dquot *dquot, struct fs_disk_quota *di) +static void do_get_dqblk(struct dquot *dquot, struct qc_dqblk *di) { struct mem_dqblk *dm = &dquot->dq_dqb; memset(di, 0, sizeof(*di)); - di->d_version = FS_DQUOT_VERSION; - di->d_flags = dquot->dq_id.type == USRQUOTA ? - FS_USER_QUOTA : FS_GROUP_QUOTA; - di->d_id = from_kqid_munged(current_user_ns(), dquot->dq_id); - spin_lock(&dq_data_lock); - di->d_blk_hardlimit = stoqb(dm->dqb_bhardlimit); - di->d_blk_softlimit = stoqb(dm->dqb_bsoftlimit); + di->d_spc_hardlimit = dm->dqb_bhardlimit; + di->d_spc_softlimit = dm->dqb_bsoftlimit; di->d_ino_hardlimit = dm->dqb_ihardlimit; di->d_ino_softlimit = dm->dqb_isoftlimit; - di->d_bcount = dm->dqb_curspace + dm->dqb_rsvspace; - di->d_icount = dm->dqb_curinodes; - di->d_btimer = dm->dqb_btime; - di->d_itimer = dm->dqb_itime; + di->d_space = dm->dqb_curspace + dm->dqb_rsvspace; + di->d_ino_count = dm->dqb_curinodes; + di->d_spc_timer = dm->dqb_btime; + di->d_ino_timer = dm->dqb_itime; spin_unlock(&dq_data_lock); } int dquot_get_dqblk(struct super_block *sb, struct kqid qid, - struct fs_disk_quota *di) + struct qc_dqblk *di) { struct dquot *dquot; @@ -2510,70 +2505,70 @@ int dquot_get_dqblk(struct super_block *sb, struct kqid qid, } EXPORT_SYMBOL(dquot_get_dqblk); -#define VFS_FS_DQ_MASK \ - (FS_DQ_BCOUNT | FS_DQ_BSOFT | FS_DQ_BHARD | \ - FS_DQ_ICOUNT | FS_DQ_ISOFT | FS_DQ_IHARD | \ - FS_DQ_BTIMER | FS_DQ_ITIMER) +#define VFS_QC_MASK \ + (QC_SPACE | QC_SPC_SOFT | QC_SPC_HARD | \ + QC_INO_COUNT | QC_INO_SOFT | QC_INO_HARD | \ + QC_SPC_TIMER | QC_INO_TIMER) /* Generic routine for setting common part of quota structure */ -static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) +static int do_set_dqblk(struct dquot *dquot, struct qc_dqblk *di) { struct mem_dqblk *dm = &dquot->dq_dqb; int check_blim = 0, check_ilim = 0; struct mem_dqinfo *dqi = &sb_dqopt(dquot->dq_sb)->info[dquot->dq_id.type]; - if (di->d_fieldmask & ~VFS_FS_DQ_MASK) + if (di->d_fieldmask & ~VFS_QC_MASK) return -EINVAL; - if (((di->d_fieldmask & FS_DQ_BSOFT) && - (di->d_blk_softlimit > dqi->dqi_maxblimit)) || - ((di->d_fieldmask & FS_DQ_BHARD) && - (di->d_blk_hardlimit > dqi->dqi_maxblimit)) || - ((di->d_fieldmask & FS_DQ_ISOFT) && + if (((di->d_fieldmask & QC_SPC_SOFT) && + stoqb(di->d_spc_softlimit) > dqi->dqi_maxblimit) || + ((di->d_fieldmask & QC_SPC_HARD) && + stoqb(di->d_spc_hardlimit) > dqi->dqi_maxblimit) || + ((di->d_fieldmask & QC_INO_SOFT) && (di->d_ino_softlimit > dqi->dqi_maxilimit)) || - ((di->d_fieldmask & FS_DQ_IHARD) && + ((di->d_fieldmask & QC_INO_HARD) && (di->d_ino_hardlimit > dqi->dqi_maxilimit))) return -ERANGE; spin_lock(&dq_data_lock); - if (di->d_fieldmask & FS_DQ_BCOUNT) { - dm->dqb_curspace = di->d_bcount - dm->dqb_rsvspace; + if (di->d_fieldmask & QC_SPACE) { + dm->dqb_curspace = di->d_space - dm->dqb_rsvspace; check_blim = 1; set_bit(DQ_LASTSET_B + QIF_SPACE_B, &dquot->dq_flags); } - if (di->d_fieldmask & FS_DQ_BSOFT) - dm->dqb_bsoftlimit = qbtos(di->d_blk_softlimit); - if (di->d_fieldmask & FS_DQ_BHARD) - dm->dqb_bhardlimit = qbtos(di->d_blk_hardlimit); - if (di->d_fieldmask & (FS_DQ_BSOFT | FS_DQ_BHARD)) { + if (di->d_fieldmask & QC_SPC_SOFT) + dm->dqb_bsoftlimit = di->d_spc_softlimit; + if (di->d_fieldmask & QC_SPC_HARD) + dm->dqb_bhardlimit = di->d_spc_hardlimit; + if (di->d_fieldmask & (QC_SPC_SOFT | QC_SPC_HARD)) { check_blim = 1; set_bit(DQ_LASTSET_B + QIF_BLIMITS_B, &dquot->dq_flags); } - if (di->d_fieldmask & FS_DQ_ICOUNT) { - dm->dqb_curinodes = di->d_icount; + if (di->d_fieldmask & QC_INO_COUNT) { + dm->dqb_curinodes = di->d_ino_count; check_ilim = 1; set_bit(DQ_LASTSET_B + QIF_INODES_B, &dquot->dq_flags); } - if (di->d_fieldmask & FS_DQ_ISOFT) + if (di->d_fieldmask & QC_INO_SOFT) dm->dqb_isoftlimit = di->d_ino_softlimit; - if (di->d_fieldmask & FS_DQ_IHARD) + if (di->d_fieldmask & QC_INO_HARD) dm->dqb_ihardlimit = di->d_ino_hardlimit; - if (di->d_fieldmask & (FS_DQ_ISOFT | FS_DQ_IHARD)) { + if (di->d_fieldmask & (QC_INO_SOFT | QC_INO_HARD)) { check_ilim = 1; set_bit(DQ_LASTSET_B + QIF_ILIMITS_B, &dquot->dq_flags); } - if (di->d_fieldmask & FS_DQ_BTIMER) { - dm->dqb_btime = di->d_btimer; + if (di->d_fieldmask & QC_SPC_TIMER) { + dm->dqb_btime = di->d_spc_timer; check_blim = 1; set_bit(DQ_LASTSET_B + QIF_BTIME_B, &dquot->dq_flags); } - if (di->d_fieldmask & FS_DQ_ITIMER) { - dm->dqb_itime = di->d_itimer; + if (di->d_fieldmask & QC_INO_TIMER) { + dm->dqb_itime = di->d_ino_timer; check_ilim = 1; set_bit(DQ_LASTSET_B + QIF_ITIME_B, &dquot->dq_flags); } @@ -2583,7 +2578,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) dm->dqb_curspace < dm->dqb_bsoftlimit) { dm->dqb_btime = 0; clear_bit(DQ_BLKS_B, &dquot->dq_flags); - } else if (!(di->d_fieldmask & FS_DQ_BTIMER)) + } else if (!(di->d_fieldmask & QC_SPC_TIMER)) /* Set grace only if user hasn't provided his own... */ dm->dqb_btime = get_seconds() + dqi->dqi_bgrace; } @@ -2592,7 +2587,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) dm->dqb_curinodes < dm->dqb_isoftlimit) { dm->dqb_itime = 0; clear_bit(DQ_INODES_B, &dquot->dq_flags); - } else if (!(di->d_fieldmask & FS_DQ_ITIMER)) + } else if (!(di->d_fieldmask & QC_INO_TIMER)) /* Set grace only if user hasn't provided his own... */ dm->dqb_itime = get_seconds() + dqi->dqi_igrace; } @@ -2608,7 +2603,7 @@ static int do_set_dqblk(struct dquot *dquot, struct fs_disk_quota *di) } int dquot_set_dqblk(struct super_block *sb, struct kqid qid, - struct fs_disk_quota *di) + struct qc_dqblk *di) { struct dquot *dquot; int rc; diff --git a/fs/quota/quota.c b/fs/quota/quota.c index 5650b7ce4714..84275f74dc7f 100644 --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -137,17 +137,27 @@ static int quota_setinfo(struct super_block *sb, int type, void __user *addr) return sb->s_qcop->set_info(sb, type, &info); } -static void copy_to_if_dqblk(struct if_dqblk *dst, struct fs_disk_quota *src) +static inline qsize_t qbtos(qsize_t blocks) +{ + return blocks << QIF_DQBLKSIZE_BITS; +} + +static inline qsize_t stoqb(qsize_t space) +{ + return (space + QIF_DQBLKSIZE - 1) >> QIF_DQBLKSIZE_BITS; +} + +static void copy_to_if_dqblk(struct if_dqblk *dst, struct qc_dqblk *src) { memset(dst, 0, sizeof(*dst)); - dst->dqb_bhardlimit = src->d_blk_hardlimit; - dst->dqb_bsoftlimit = src->d_blk_softlimit; - dst->dqb_curspace = src->d_bcount; + dst->dqb_bhardlimit = stoqb(src->d_spc_hardlimit); + dst->dqb_bsoftlimit = stoqb(src->d_spc_softlimit); + dst->dqb_curspace = src->d_space; dst->dqb_ihardlimit = src->d_ino_hardlimit; dst->dqb_isoftlimit = src->d_ino_softlimit; - dst->dqb_curinodes = src->d_icount; - dst->dqb_btime = src->d_btimer; - dst->dqb_itime = src->d_itimer; + dst->dqb_curinodes = src->d_ino_count; + dst->dqb_btime = src->d_spc_timer; + dst->dqb_itime = src->d_ino_timer; dst->dqb_valid = QIF_ALL; } @@ -155,7 +165,7 @@ static int quota_getquota(struct super_block *sb, int type, qid_t id, void __user *addr) { struct kqid qid; - struct fs_disk_quota fdq; + struct qc_dqblk fdq; struct if_dqblk idq; int ret; @@ -173,36 +183,36 @@ static int quota_getquota(struct super_block *sb, int type, qid_t id, return 0; } -static void copy_from_if_dqblk(struct fs_disk_quota *dst, struct if_dqblk *src) +static void copy_from_if_dqblk(struct qc_dqblk *dst, struct if_dqblk *src) { - dst->d_blk_hardlimit = src->dqb_bhardlimit; - dst->d_blk_softlimit = src->dqb_bsoftlimit; - dst->d_bcount = src->dqb_curspace; + dst->d_spc_hardlimit = qbtos(src->dqb_bhardlimit); + dst->d_spc_softlimit = qbtos(src->dqb_bsoftlimit); + dst->d_space = src->dqb_curspace; dst->d_ino_hardlimit = src->dqb_ihardlimit; dst->d_ino_softlimit = src->dqb_isoftlimit; - dst->d_icount = src->dqb_curinodes; - dst->d_btimer = src->dqb_btime; - dst->d_itimer = src->dqb_itime; + dst->d_ino_count = src->dqb_curinodes; + dst->d_spc_timer = src->dqb_btime; + dst->d_ino_timer = src->dqb_itime; dst->d_fieldmask = 0; if (src->dqb_valid & QIF_BLIMITS) - dst->d_fieldmask |= FS_DQ_BSOFT | FS_DQ_BHARD; + dst->d_fieldmask |= QC_SPC_SOFT | QC_SPC_HARD; if (src->dqb_valid & QIF_SPACE) - dst->d_fieldmask |= FS_DQ_BCOUNT; + dst->d_fieldmask |= QC_SPACE; if (src->dqb_valid & QIF_ILIMITS) - dst->d_fieldmask |= FS_DQ_ISOFT | FS_DQ_IHARD; + dst->d_fieldmask |= QC_INO_SOFT | QC_INO_HARD; if (src->dqb_valid & QIF_INODES) - dst->d_fieldmask |= FS_DQ_ICOUNT; + dst->d_fieldmask |= QC_INO_COUNT; if (src->dqb_valid & QIF_BTIME) - dst->d_fieldmask |= FS_DQ_BTIMER; + dst->d_fieldmask |= QC_SPC_TIMER; if (src->dqb_valid & QIF_ITIME) - dst->d_fieldmask |= FS_DQ_ITIMER; + dst->d_fieldmask |= QC_INO_TIMER; } static int quota_setquota(struct super_block *sb, int type, qid_t id, void __user *addr) { - struct fs_disk_quota fdq; + struct qc_dqblk fdq; struct if_dqblk idq; struct kqid qid; @@ -277,10 +287,73 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) return ret; } +/* XFS blocks to space conversion */ +static u64 xfs_btos(u64 blocks) +{ + return blocks << 9; +} + +/* Space to XFS blocks conversion */ +static u64 xfs_stob(u64 space) +{ + return (space + 511) >> 9; +} + +static void copy_from_xfs_dqblk(struct qc_dqblk *dst, struct fs_disk_quota *src) +{ + dst->d_spc_hardlimit = xfs_btos(src->d_blk_hardlimit); + dst->d_spc_softlimit = xfs_btos(src->d_blk_softlimit); + dst->d_ino_hardlimit = src->d_ino_hardlimit; + dst->d_ino_softlimit = src->d_ino_softlimit; + dst->d_space = xfs_btos(src->d_bcount); + dst->d_ino_count = src->d_icount; + dst->d_ino_timer = src->d_itimer; + dst->d_spc_timer = src->d_btimer; + dst->d_ino_warns = src->d_iwarns; + dst->d_spc_warns = src->d_bwarns; + dst->d_rt_spc_hardlimit = xfs_btos(src->d_rtb_hardlimit); + dst->d_rt_spc_softlimit = xfs_btos(src->d_rtb_softlimit); + dst->d_rt_space = xfs_btos(src->d_rtbcount); + dst->d_rt_spc_timer = src->d_rtbtimer; + dst->d_rt_spc_warns = src->d_rtbwarns; + dst->d_fieldmask = 0; + if (src->d_fieldmask & FS_DQ_ISOFT) + dst->d_fieldmask |= QC_INO_SOFT; + if (src->d_fieldmask & FS_DQ_IHARD) + dst->d_fieldmask |= QC_INO_HARD; + if (src->d_fieldmask & FS_DQ_BSOFT) + dst->d_fieldmask |= QC_SPC_SOFT; + if (src->d_fieldmask & FS_DQ_BHARD) + dst->d_fieldmask |= QC_SPC_HARD; + if (src->d_fieldmask & FS_DQ_RTBSOFT) + dst->d_fieldmask |= QC_RT_SPC_SOFT; + if (src->d_fieldmask & FS_DQ_RTBHARD) + dst->d_fieldmask |= QC_RT_SPC_HARD; + if (src->d_fieldmask & FS_DQ_BTIMER) + dst->d_fieldmask |= QC_SPC_TIMER; + if (src->d_fieldmask & FS_DQ_ITIMER) + dst->d_fieldmask |= QC_INO_TIMER; + if (src->d_fieldmask & FS_DQ_RTBTIMER) + dst->d_fieldmask |= QC_RT_SPC_TIMER; + if (src->d_fieldmask & FS_DQ_BWARNS) + dst->d_fieldmask |= QC_SPC_WARNS; + if (src->d_fieldmask & FS_DQ_IWARNS) + dst->d_fieldmask |= QC_INO_WARNS; + if (src->d_fieldmask & FS_DQ_RTBWARNS) + dst->d_fieldmask |= QC_RT_SPC_WARNS; + if (src->d_fieldmask & FS_DQ_BCOUNT) + dst->d_fieldmask |= QC_SPACE; + if (src->d_fieldmask & FS_DQ_ICOUNT) + dst->d_fieldmask |= QC_INO_COUNT; + if (src->d_fieldmask & FS_DQ_RTBCOUNT) + dst->d_fieldmask |= QC_RT_SPACE; +} + static int quota_setxquota(struct super_block *sb, int type, qid_t id, void __user *addr) { struct fs_disk_quota fdq; + struct qc_dqblk qdq; struct kqid qid; if (copy_from_user(&fdq, addr, sizeof(fdq))) @@ -290,13 +363,44 @@ static int quota_setxquota(struct super_block *sb, int type, qid_t id, qid = make_kqid(current_user_ns(), type, id); if (!qid_valid(qid)) return -EINVAL; - return sb->s_qcop->set_dqblk(sb, qid, &fdq); + copy_from_xfs_dqblk(&qdq, &fdq); + return sb->s_qcop->set_dqblk(sb, qid, &qdq); +} + +static void copy_to_xfs_dqblk(struct fs_disk_quota *dst, struct qc_dqblk *src, + int type, qid_t id) +{ + memset(dst, 0, sizeof(*dst)); + dst->d_version = FS_DQUOT_VERSION; + dst->d_id = id; + if (type == USRQUOTA) + dst->d_flags = FS_USER_QUOTA; + else if (type == PRJQUOTA) + dst->d_flags = FS_PROJ_QUOTA; + else + dst->d_flags = FS_GROUP_QUOTA; + dst->d_blk_hardlimit = xfs_stob(src->d_spc_hardlimit); + dst->d_blk_softlimit = xfs_stob(src->d_spc_softlimit); + dst->d_ino_hardlimit = src->d_ino_hardlimit; + dst->d_ino_softlimit = src->d_ino_softlimit; + dst->d_bcount = xfs_stob(src->d_space); + dst->d_icount = src->d_ino_count; + dst->d_itimer = src->d_ino_timer; + dst->d_btimer = src->d_spc_timer; + dst->d_iwarns = src->d_ino_warns; + dst->d_bwarns = src->d_spc_warns; + dst->d_rtb_hardlimit = xfs_stob(src->d_rt_spc_hardlimit); + dst->d_rtb_softlimit = xfs_stob(src->d_rt_spc_softlimit); + dst->d_rtbcount = xfs_stob(src->d_rt_space); + dst->d_rtbtimer = src->d_rt_spc_timer; + dst->d_rtbwarns = src->d_rt_spc_warns; } static int quota_getxquota(struct super_block *sb, int type, qid_t id, void __user *addr) { struct fs_disk_quota fdq; + struct qc_dqblk qdq; struct kqid qid; int ret; @@ -305,8 +409,11 @@ static int quota_getxquota(struct super_block *sb, int type, qid_t id, qid = make_kqid(current_user_ns(), type, id); if (!qid_valid(qid)) return -EINVAL; - ret = sb->s_qcop->get_dqblk(sb, qid, &fdq); - if (!ret && copy_to_user(addr, &fdq, sizeof(fdq))) + ret = sb->s_qcop->get_dqblk(sb, qid, &qdq); + if (ret) + return ret; + copy_to_xfs_dqblk(&fdq, &qdq, type, id); + if (copy_to_user(addr, &fdq, sizeof(fdq))) return -EFAULT; return ret; } diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 3a07a937e232..41f6c0b9d51c 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -166,9 +166,9 @@ extern void xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint); /* quota ops */ extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint); extern int xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t, - uint, struct fs_disk_quota *); + uint, struct qc_dqblk *); extern int xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint, - struct fs_disk_quota *); + struct qc_dqblk *); extern int xfs_qm_scall_getqstat(struct xfs_mount *, struct fs_quota_stat *); extern int xfs_qm_scall_getqstatv(struct xfs_mount *, diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 60bca27d3d04..72a53ab93844 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -40,7 +40,6 @@ STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, uint); STATIC uint xfs_qm_export_flags(uint); -STATIC uint xfs_qm_export_qtype_flags(uint); /* * Turn off quota accounting and/or enforcement for all udquots and/or @@ -563,8 +562,8 @@ xfs_qm_scall_getqstatv( return 0; } -#define XFS_DQ_MASK \ - (FS_DQ_LIMIT_MASK | FS_DQ_TIMER_MASK | FS_DQ_WARNS_MASK) +#define XFS_QC_MASK \ + (QC_LIMIT_MASK | QC_TIMER_MASK | QC_WARNS_MASK) /* * Adjust quota limits, and start/stop timers accordingly. @@ -574,7 +573,7 @@ xfs_qm_scall_setqlim( struct xfs_mount *mp, xfs_dqid_t id, uint type, - fs_disk_quota_t *newlim) + struct qc_dqblk *newlim) { struct xfs_quotainfo *q = mp->m_quotainfo; struct xfs_disk_dquot *ddq; @@ -583,9 +582,9 @@ xfs_qm_scall_setqlim( int error; xfs_qcnt_t hard, soft; - if (newlim->d_fieldmask & ~XFS_DQ_MASK) + if (newlim->d_fieldmask & ~XFS_QC_MASK) return -EINVAL; - if ((newlim->d_fieldmask & XFS_DQ_MASK) == 0) + if ((newlim->d_fieldmask & XFS_QC_MASK) == 0) return 0; /* @@ -623,11 +622,11 @@ xfs_qm_scall_setqlim( /* * Make sure that hardlimits are >= soft limits before changing. */ - hard = (newlim->d_fieldmask & FS_DQ_BHARD) ? - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_blk_hardlimit) : + hard = (newlim->d_fieldmask & QC_SPC_HARD) ? + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_hardlimit) : be64_to_cpu(ddq->d_blk_hardlimit); - soft = (newlim->d_fieldmask & FS_DQ_BSOFT) ? - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_blk_softlimit) : + soft = (newlim->d_fieldmask & QC_SPC_SOFT) ? + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_spc_softlimit) : be64_to_cpu(ddq->d_blk_softlimit); if (hard == 0 || hard >= soft) { ddq->d_blk_hardlimit = cpu_to_be64(hard); @@ -640,11 +639,11 @@ xfs_qm_scall_setqlim( } else { xfs_debug(mp, "blkhard %Ld < blksoft %Ld", hard, soft); } - hard = (newlim->d_fieldmask & FS_DQ_RTBHARD) ? - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_hardlimit) : + hard = (newlim->d_fieldmask & QC_RT_SPC_HARD) ? + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_hardlimit) : be64_to_cpu(ddq->d_rtb_hardlimit); - soft = (newlim->d_fieldmask & FS_DQ_RTBSOFT) ? - (xfs_qcnt_t) XFS_BB_TO_FSB(mp, newlim->d_rtb_softlimit) : + soft = (newlim->d_fieldmask & QC_RT_SPC_SOFT) ? + (xfs_qcnt_t) XFS_B_TO_FSB(mp, newlim->d_rt_spc_softlimit) : be64_to_cpu(ddq->d_rtb_softlimit); if (hard == 0 || hard >= soft) { ddq->d_rtb_hardlimit = cpu_to_be64(hard); @@ -657,10 +656,10 @@ xfs_qm_scall_setqlim( xfs_debug(mp, "rtbhard %Ld < rtbsoft %Ld", hard, soft); } - hard = (newlim->d_fieldmask & FS_DQ_IHARD) ? + hard = (newlim->d_fieldmask & QC_INO_HARD) ? (xfs_qcnt_t) newlim->d_ino_hardlimit : be64_to_cpu(ddq->d_ino_hardlimit); - soft = (newlim->d_fieldmask & FS_DQ_ISOFT) ? + soft = (newlim->d_fieldmask & QC_INO_SOFT) ? (xfs_qcnt_t) newlim->d_ino_softlimit : be64_to_cpu(ddq->d_ino_softlimit); if (hard == 0 || hard >= soft) { @@ -677,12 +676,12 @@ xfs_qm_scall_setqlim( /* * Update warnings counter(s) if requested */ - if (newlim->d_fieldmask & FS_DQ_BWARNS) - ddq->d_bwarns = cpu_to_be16(newlim->d_bwarns); - if (newlim->d_fieldmask & FS_DQ_IWARNS) - ddq->d_iwarns = cpu_to_be16(newlim->d_iwarns); - if (newlim->d_fieldmask & FS_DQ_RTBWARNS) - ddq->d_rtbwarns = cpu_to_be16(newlim->d_rtbwarns); + if (newlim->d_fieldmask & QC_SPC_WARNS) + ddq->d_bwarns = cpu_to_be16(newlim->d_spc_warns); + if (newlim->d_fieldmask & QC_INO_WARNS) + ddq->d_iwarns = cpu_to_be16(newlim->d_ino_warns); + if (newlim->d_fieldmask & QC_RT_SPC_WARNS) + ddq->d_rtbwarns = cpu_to_be16(newlim->d_rt_spc_warns); if (id == 0) { /* @@ -692,24 +691,24 @@ xfs_qm_scall_setqlim( * soft and hard limit values (already done, above), and * for warnings. */ - if (newlim->d_fieldmask & FS_DQ_BTIMER) { - q->qi_btimelimit = newlim->d_btimer; - ddq->d_btimer = cpu_to_be32(newlim->d_btimer); + if (newlim->d_fieldmask & QC_SPC_TIMER) { + q->qi_btimelimit = newlim->d_spc_timer; + ddq->d_btimer = cpu_to_be32(newlim->d_spc_timer); } - if (newlim->d_fieldmask & FS_DQ_ITIMER) { - q->qi_itimelimit = newlim->d_itimer; - ddq->d_itimer = cpu_to_be32(newlim->d_itimer); + if (newlim->d_fieldmask & QC_INO_TIMER) { + q->qi_itimelimit = newlim->d_ino_timer; + ddq->d_itimer = cpu_to_be32(newlim->d_ino_timer); } - if (newlim->d_fieldmask & FS_DQ_RTBTIMER) { - q->qi_rtbtimelimit = newlim->d_rtbtimer; - ddq->d_rtbtimer = cpu_to_be32(newlim->d_rtbtimer); + if (newlim->d_fieldmask & QC_RT_SPC_TIMER) { + q->qi_rtbtimelimit = newlim->d_rt_spc_timer; + ddq->d_rtbtimer = cpu_to_be32(newlim->d_rt_spc_timer); } - if (newlim->d_fieldmask & FS_DQ_BWARNS) - q->qi_bwarnlimit = newlim->d_bwarns; - if (newlim->d_fieldmask & FS_DQ_IWARNS) - q->qi_iwarnlimit = newlim->d_iwarns; - if (newlim->d_fieldmask & FS_DQ_RTBWARNS) - q->qi_rtbwarnlimit = newlim->d_rtbwarns; + if (newlim->d_fieldmask & QC_SPC_WARNS) + q->qi_bwarnlimit = newlim->d_spc_warns; + if (newlim->d_fieldmask & QC_INO_WARNS) + q->qi_iwarnlimit = newlim->d_ino_warns; + if (newlim->d_fieldmask & QC_RT_SPC_WARNS) + q->qi_rtbwarnlimit = newlim->d_rt_spc_warns; } else { /* * If the user is now over quota, start the timelimit. @@ -820,7 +819,7 @@ xfs_qm_scall_getquota( struct xfs_mount *mp, xfs_dqid_t id, uint type, - struct fs_disk_quota *dst) + struct qc_dqblk *dst) { struct xfs_dquot *dqp; int error; @@ -844,28 +843,25 @@ xfs_qm_scall_getquota( } memset(dst, 0, sizeof(*dst)); - dst->d_version = FS_DQUOT_VERSION; - dst->d_flags = xfs_qm_export_qtype_flags(dqp->q_core.d_flags); - dst->d_id = be32_to_cpu(dqp->q_core.d_id); - dst->d_blk_hardlimit = - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); - dst->d_blk_softlimit = - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); + dst->d_spc_hardlimit = + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_hardlimit)); + dst->d_spc_softlimit = + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_blk_softlimit)); dst->d_ino_hardlimit = be64_to_cpu(dqp->q_core.d_ino_hardlimit); dst->d_ino_softlimit = be64_to_cpu(dqp->q_core.d_ino_softlimit); - dst->d_bcount = XFS_FSB_TO_BB(mp, dqp->q_res_bcount); - dst->d_icount = dqp->q_res_icount; - dst->d_btimer = be32_to_cpu(dqp->q_core.d_btimer); - dst->d_itimer = be32_to_cpu(dqp->q_core.d_itimer); - dst->d_iwarns = be16_to_cpu(dqp->q_core.d_iwarns); - dst->d_bwarns = be16_to_cpu(dqp->q_core.d_bwarns); - dst->d_rtb_hardlimit = - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); - dst->d_rtb_softlimit = - XFS_FSB_TO_BB(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); - dst->d_rtbcount = XFS_FSB_TO_BB(mp, dqp->q_res_rtbcount); - dst->d_rtbtimer = be32_to_cpu(dqp->q_core.d_rtbtimer); - dst->d_rtbwarns = be16_to_cpu(dqp->q_core.d_rtbwarns); + dst->d_space = XFS_FSB_TO_B(mp, dqp->q_res_bcount); + dst->d_ino_count = dqp->q_res_icount; + dst->d_spc_timer = be32_to_cpu(dqp->q_core.d_btimer); + dst->d_ino_timer = be32_to_cpu(dqp->q_core.d_itimer); + dst->d_ino_warns = be16_to_cpu(dqp->q_core.d_iwarns); + dst->d_spc_warns = be16_to_cpu(dqp->q_core.d_bwarns); + dst->d_rt_spc_hardlimit = + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_hardlimit)); + dst->d_rt_spc_softlimit = + XFS_FSB_TO_B(mp, be64_to_cpu(dqp->q_core.d_rtb_softlimit)); + dst->d_rt_space = XFS_FSB_TO_B(mp, dqp->q_res_rtbcount); + dst->d_rt_spc_timer = be32_to_cpu(dqp->q_core.d_rtbtimer); + dst->d_rt_spc_warns = be16_to_cpu(dqp->q_core.d_rtbwarns); /* * Internally, we don't reset all the timers when quota enforcement @@ -878,23 +874,23 @@ xfs_qm_scall_getquota( dqp->q_core.d_flags == XFS_DQ_GROUP) || (!XFS_IS_PQUOTA_ENFORCED(mp) && dqp->q_core.d_flags == XFS_DQ_PROJ)) { - dst->d_btimer = 0; - dst->d_itimer = 0; - dst->d_rtbtimer = 0; + dst->d_spc_timer = 0; + dst->d_ino_timer = 0; + dst->d_rt_spc_timer = 0; } #ifdef DEBUG - if (((XFS_IS_UQUOTA_ENFORCED(mp) && dst->d_flags == FS_USER_QUOTA) || - (XFS_IS_GQUOTA_ENFORCED(mp) && dst->d_flags == FS_GROUP_QUOTA) || - (XFS_IS_PQUOTA_ENFORCED(mp) && dst->d_flags == FS_PROJ_QUOTA)) && - dst->d_id != 0) { - if ((dst->d_bcount > dst->d_blk_softlimit) && - (dst->d_blk_softlimit > 0)) { - ASSERT(dst->d_btimer != 0); + if (((XFS_IS_UQUOTA_ENFORCED(mp) && type == XFS_DQ_USER) || + (XFS_IS_GQUOTA_ENFORCED(mp) && type == XFS_DQ_GROUP) || + (XFS_IS_PQUOTA_ENFORCED(mp) && type == XFS_DQ_PROJ)) && + id != 0) { + if ((dst->d_space > dst->d_spc_softlimit) && + (dst->d_spc_softlimit > 0)) { + ASSERT(dst->d_spc_timer != 0); } - if ((dst->d_icount > dst->d_ino_softlimit) && + if ((dst->d_ino_count > dst->d_ino_softlimit) && (dst->d_ino_softlimit > 0)) { - ASSERT(dst->d_itimer != 0); + ASSERT(dst->d_ino_timer != 0); } } #endif @@ -904,26 +900,6 @@ out_put: } STATIC uint -xfs_qm_export_qtype_flags( - uint flags) -{ - /* - * Can't be more than one, or none. - */ - ASSERT((flags & (FS_PROJ_QUOTA | FS_USER_QUOTA)) != - (FS_PROJ_QUOTA | FS_USER_QUOTA)); - ASSERT((flags & (FS_PROJ_QUOTA | FS_GROUP_QUOTA)) != - (FS_PROJ_QUOTA | FS_GROUP_QUOTA)); - ASSERT((flags & (FS_USER_QUOTA | FS_GROUP_QUOTA)) != - (FS_USER_QUOTA | FS_GROUP_QUOTA)); - ASSERT((flags & (FS_PROJ_QUOTA|FS_USER_QUOTA|FS_GROUP_QUOTA)) != 0); - - return (flags & XFS_DQ_USER) ? - FS_USER_QUOTA : (flags & XFS_DQ_PROJ) ? - FS_PROJ_QUOTA : FS_GROUP_QUOTA; -} - -STATIC uint xfs_qm_export_flags( uint flags) { diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index a3836ac0f2f8..e46b1f6abd78 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -146,7 +146,7 @@ STATIC int xfs_fs_get_dqblk( struct super_block *sb, struct kqid qid, - struct fs_disk_quota *fdq) + struct qc_dqblk *qdq) { struct xfs_mount *mp = XFS_M(sb); @@ -156,14 +156,14 @@ xfs_fs_get_dqblk( return -ESRCH; return xfs_qm_scall_getquota(mp, from_kqid(&init_user_ns, qid), - xfs_quota_type(qid.type), fdq); + xfs_quota_type(qid.type), qdq); } STATIC int xfs_fs_set_dqblk( struct super_block *sb, struct kqid qid, - struct fs_disk_quota *fdq) + struct qc_dqblk *qdq) { struct xfs_mount *mp = XFS_M(sb); @@ -175,7 +175,7 @@ xfs_fs_set_dqblk( return -ESRCH; return xfs_qm_scall_setqlim(mp, from_kqid(&init_user_ns, qid), - xfs_quota_type(qid.type), fdq); + xfs_quota_type(qid.type), qdq); } const struct quotactl_ops xfs_quotactl_operations = { diff --git a/include/linux/quota.h b/include/linux/quota.h index 06a214a21778..903db093bbe9 100644 --- a/include/linux/quota.h +++ b/include/linux/quota.h @@ -316,6 +316,49 @@ struct dquot_operations { struct path; +/* Structure for communicating via ->get_dqblk() & ->set_dqblk() */ +struct qc_dqblk { + int d_fieldmask; /* mask of fields to change in ->set_dqblk() */ + u64 d_spc_hardlimit; /* absolute limit on used space */ + u64 d_spc_softlimit; /* preferred limit on used space */ + u64 d_ino_hardlimit; /* maximum # allocated inodes */ + u64 d_ino_softlimit; /* preferred inode limit */ + u64 d_space; /* Space owned by the user */ + u64 d_ino_count; /* # inodes owned by the user */ + s64 d_ino_timer; /* zero if within inode limits */ + /* if not, we refuse service */ + s64 d_spc_timer; /* similar to above; for space */ + int d_ino_warns; /* # warnings issued wrt num inodes */ + int d_spc_warns; /* # warnings issued wrt used space */ + u64 d_rt_spc_hardlimit; /* absolute limit on realtime space */ + u64 d_rt_spc_softlimit; /* preferred limit on RT space */ + u64 d_rt_space; /* realtime space owned */ + s64 d_rt_spc_timer; /* similar to above; for RT space */ + int d_rt_spc_warns; /* # warnings issued wrt RT space */ +}; + +/* Field specifiers for ->set_dqblk() in struct qc_dqblk */ +#define QC_INO_SOFT (1<<0) +#define QC_INO_HARD (1<<1) +#define QC_SPC_SOFT (1<<2) +#define QC_SPC_HARD (1<<3) +#define QC_RT_SPC_SOFT (1<<4) +#define QC_RT_SPC_HARD (1<<5) +#define QC_LIMIT_MASK (QC_INO_SOFT | QC_INO_HARD | QC_SPC_SOFT | QC_SPC_HARD | \ + QC_RT_SPC_SOFT | QC_RT_SPC_HARD) +#define QC_SPC_TIMER (1<<6) +#define QC_INO_TIMER (1<<7) +#define QC_RT_SPC_TIMER (1<<8) +#define QC_TIMER_MASK (QC_SPC_TIMER | QC_INO_TIMER | QC_RT_SPC_TIMER) +#define QC_SPC_WARNS (1<<9) +#define QC_INO_WARNS (1<<10) +#define QC_RT_SPC_WARNS (1<<11) +#define QC_WARNS_MASK (QC_SPC_WARNS | QC_INO_WARNS | QC_RT_SPC_WARNS) +#define QC_SPACE (1<<12) +#define QC_INO_COUNT (1<<13) +#define QC_RT_SPACE (1<<14) +#define QC_ACCT_MASK (QC_SPACE | QC_INO_COUNT | QC_RT_SPACE) + /* Operations handling requests from userspace */ struct quotactl_ops { int (*quota_on)(struct super_block *, int, int, struct path *); @@ -323,8 +366,8 @@ struct quotactl_ops { int (*quota_sync)(struct super_block *, int); int (*get_info)(struct super_block *, int, struct if_dqinfo *); int (*set_info)(struct super_block *, int, struct if_dqinfo *); - int (*get_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); - int (*set_dqblk)(struct super_block *, struct kqid, struct fs_disk_quota *); + int (*get_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); + int (*set_dqblk)(struct super_block *, struct kqid, struct qc_dqblk *); int (*sysquota_on)(struct super_block *, unsigned int); int (*sysquota_off)(struct super_block *, unsigned int); int (*get_xstate)(struct super_block *, struct fs_quota_stat *); diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h index 6f5dc7e397a7..fd72408ae685 100644 --- a/include/linux/quotaops.h +++ b/include/linux/quotaops.h @@ -100,9 +100,9 @@ int dquot_quota_sync(struct super_block *sb, int type); int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); int dquot_get_dqblk(struct super_block *sb, struct kqid id, - struct fs_disk_quota *di); + struct qc_dqblk *di); int dquot_set_dqblk(struct super_block *sb, struct kqid id, - struct fs_disk_quota *di); + struct qc_dqblk *di); int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); int dquot_transfer(struct inode *inode, struct iattr *iattr); -- 1.8.1.4 From david@fromorbit.com Tue Nov 11 16:32:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E66DF7F78 for ; Tue, 11 Nov 2014 16:32:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B81248F8033 for ; Tue, 11 Nov 2014 14:32:08 -0800 (PST) X-ASG-Debug-ID: 1415745125-04cb6c1e6c220640001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BwU1dVHOTmVOsnBi for ; Tue, 11 Nov 2014 14:32:06 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AthhAMWMYlR5LbBUPGdsb2JhbABcgw6BLYI2UIQ3sQ8CAwaVL4VsAgIBAQKBGxcBAQEBAQYBAQEBODuEAwEBBCMPASMjEAgDDgoCAgUhAgIPBSUDBxoTiEC4SpZSAQEBBwIBHxiBFYUNig1NB4J3gVQFkA6OFoE1hwGQKyCBbikvgQeBRAEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 09:02:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoJyl-0008FX-H1; Wed, 12 Nov 2014 09:32:03 +1100 Date: Wed, 12 Nov 2014 09:32:03 +1100 From: Dave Chinner To: Chris Murphy Cc: Stan Hoeppner , xfs@oss.sgi.com Subject: Re: Enforcing quota for root user Message-ID: <20141111223203.GS28565@dastard> X-ASG-Orig-Subj: Re: Enforcing quota for root user References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415745126 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11488 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 11:00:25AM -0700, Chris Murphy wrote: > > On Nov 11, 2014, at 8:36 AM, Stan Hoeppner wrote: > > > On 11/11/2014 04:22 AM, Cyril Scetbon wrote: > >> That's what I've read first, but someone showed me a sample where it works. He just told me he was using project quota. However, does it make sense ? > >> I've also read somewhere else that quota is never enforced for root user (id,gid=0) that's why I was testing it .... > > > > No, it doesn't make sense. Why would you want to enforce quotas for root? > > A week ago I tried this and project quotas appear to apply to root. By intent and design. Project quotas are not a user/group based quota and so there is no exemption for any user. > [root@localhost project_quota_test1]# xfs_quota -c df > Filesystem 1K-blocks Used Available Use% Pathname > /dev/sdb 83845120 157980 83687140 0% /xfs_local > /dev/sdb 102400 124928 9223372036854753280 122% /xfs_local/project_quota_test1 > [root@localhost project_quota_test1]# dd if=/dev/zero of=test100MB bs=1M count=100 > dd: error writing ‘test100MB’: No space left on device > 79+0 records in > 78+0 records out > 81788928 bytes (82 MB) copied, 0.163849 s, 499 MB/s > [root@localhost project_quota_test1]# xfs_quota -c df > Filesystem 1K-blocks Used Available Use% Pathname > /dev/sdb 83845120 237748 83607372 0% /xfs_local > /dev/sdb 102400 204800 9223372036854673408 200% /xfs_local/project_quota_test1 It's gone negative. That number in hex: 0x7FFFFFFFFFFE7000 What kernel are you using, and can you outline all the way you set everything up to cause that to occur? Also, what is the output of a plain 'df -h' when it is in that state? Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Nov 11 16:36:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2D58B7F7B for ; Tue, 11 Nov 2014 16:36:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1C1A7304062 for ; Tue, 11 Nov 2014 14:36:47 -0800 (PST) X-ASG-Debug-ID: 1415745405-04cb6c1e6a2208d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id V98uv1j5ORPw1we9 for ; Tue, 11 Nov 2014 14:36:45 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id F072765D6DDC; Tue, 11 Nov 2014 16:36:44 -0600 (CST) Message-ID: <54628F7B.7080604@sandeen.net> Date: Tue, 11 Nov 2014 16:36:43 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , Chris Murphy CC: Stan Hoeppner , xfs@oss.sgi.com Subject: Re: Enforcing quota for root user References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> <20141111223203.GS28565@dastard> X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: <20141111223203.GS28565@dastard> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415745405 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11488 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/11/14 4:32 PM, Dave Chinner wrote: > On Tue, Nov 11, 2014 at 11:00:25AM -0700, Chris Murphy wrote: >> >> On Nov 11, 2014, at 8:36 AM, Stan Hoeppner wrote: >> >>> On 11/11/2014 04:22 AM, Cyril Scetbon wrote: >>>> That's what I've read first, but someone showed me a sample where it works. He just told me he was using project quota. However, does it make sense ? >>>> I've also read somewhere else that quota is never enforced for root user (id,gid=0) that's why I was testing it .... >>> >>> No, it doesn't make sense. Why would you want to enforce quotas for root? >> >> A week ago I tried this and project quotas appear to apply to root. > > By intent and design. Project quotas are not a user/group based > quota and so there is no exemption for any user. However, at least according to the manpage, "project ID 0" is not enforced. Granted, that is not a *user* exception. -Eric From david@fromorbit.com Tue Nov 11 17:13:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03B867F7B for ; Tue, 11 Nov 2014 17:13:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8E5C30405F for ; Tue, 11 Nov 2014 15:13:48 -0800 (PST) X-ASG-Debug-ID: 1415747625-04bdf0650f253470001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Bc16wDfjg3FUvtSs for ; Tue, 11 Nov 2014 15:13:46 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoVdAIuXYlR5LbBUPGdsb2JhbABcgw5UWYI2thcCAwaTUoFdhWwCAgEBAoEdFwEBAQEBBgEBAQE4O4QCAQEBAwEnExwjBQsIAw4KCSUPBSUDBxoTiDgIDs8LAQEIAgEfGIYiiD2BOwkIAVAHhEsFlwSHIJpvKS8BgQ6BPAEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 09:42:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoKcA-0008L0-W2; Wed, 12 Nov 2014 10:12:47 +1100 Date: Wed, 12 Nov 2014 10:12:46 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq Message-ID: <20141111231246.GT28565@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq References: <1415722393-32223-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415722393-32223-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415747625 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 11:13:13AM -0500, Brian Foster wrote: > The xfslogd workqueue is a global, single-job workqueue for buffer ioend > processing. This means we allow for a single work item at a time for all > possible XFS mounts on a system. fsstress testing in loopback XFS over > XFS configurations has reproduced xfslogd deadlocks due to the single > threaded nature of the queue and dependencies introduced between the > separate XFS instances by online discard (-o discard). > > Discard over a loopback device converts the discard request to a hole > punch (fallocate) on the underlying file. Online discard requests are > issued synchronously and from xfslogd context in XFS, hence the xfslogd > workqueue is blocked in the upper fs waiting on a hole punch request to > be servied in the lower fs. If the lower fs issues I/O that depends on > xfslogd to complete, both filesystems end up hung indefinitely. This is > reproduced reliabily by generic/013 on XFS->loop->XFS test devices with > the '-o discard' mount option. > > Further, docker implementations appear to use this kind of configuration > for container instance filesystems by default (container fs->dm-> > loop->base fs) and therefore are subject to this deadlock when running > on XFS. > > Replace the global xfslogd workqueue with a per-mount variant. This > guarantees each mount access to a single worker and prevents deadlocks > due to inter-fs dependencies introduced by discard. Since the queue is > only responsible for iodone processing at this point in time, rename > xfslogd to xfs-iodone. > > Signed-off-by: Brian Foster > --- > > I've left the wq in xfs_mount rather than moved to the buftarg in this > version due to the questions expressed here: > > http://oss.sgi.com/archives/xfs/2014-11/msg00117.html Another email from you that hasn't reached my inbox. That's two in a week now, I think. > ... particularly around the potential creation of multiple (of what is > now) max_active=1 queues per-fs. So concern #1 is that it splits log buffer versus metadata buffer processing to different work queues causing concurrent processing. I see no problem there - the io completions have different iodone processing functions that mostly don't intersect. As it is, the "max-active=1" means 1 work item being processed per CPU, not "only one queue" (you need to use alloc_ordered_workqueue() to only get one queue). So there is already concurrency in the processing of io completions and hence I don't see any problem with separating the log iodone completions from the metadata iodone completions. Further, it might be work considering pushing the log buffer completions to the m_log_workqueue rather than using a buftarg based workqueue so that they are always separated from the rest of the metadata completions regardless of whether we have an internal or external log device. The xfslogd workqueue is tagged with WQ_HIGHPRI only to expedite the log buffer io completions over XFS data io completions that may get stuck waiting on log forces. i.e. the xfslogd_workqueue needs higher priority than m_data_workqueue and m_unwritten_workqueue as they can require log forces to complete their work. Hence if we separate out the log buffer io completion processing from the metadata IO completion processing we don't need to process all the metadata buffer IO completion as high priority work anymore. Concern #2 is about the reason for max_active=1 and being unclear as to why we only want a single completion active at a time on a CPU. The reason for this is that most metadata and log buffer IO completion work does not sleep - they only ever take spinlocks and so there are no built in schedule points during work processing. Hence it is rare to need a second worker thread to process the queue because the first is blocked on a sleeping lock and so max-active=1 makes sense. In comparison, the data/unwritten io completion processing is very different due to needing to take sleeping inode locks, buffer locks, etc) and hence they use the wq default for max active (512). So, really, a log workqueue with WQ_HIGHPRI, max_active = 1 and a buffer IO completion workqueue with just max_active = 1 would probably be fine. .... > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 9f622fe..ef55264 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -842,10 +842,16 @@ STATIC int > xfs_init_mount_workqueues( > struct xfs_mount *mp) > { > + mp->m_iodone_workqueue = alloc_workqueue("xfs-iodone/%s", > + WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_FREEZABLE, 1, > + mp->m_fsname); > + if (!mp->m_iodone_workqueue) > + goto out; m_buf_workqueue would be better, because... > + > mp->m_data_workqueue = alloc_workqueue("xfs-data/%s", That's also an "iodone" workqueue for data IO, and ... > WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); > if (!mp->m_data_workqueue) > - goto out; > + goto out_destroy_iodone; > > mp->m_unwritten_workqueue = alloc_workqueue("xfs-conv/%s", That's another an "iodone" workqueue for data IO that needs unwritten extent conversion.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 11 17:24:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EE6AE7F86 for ; Tue, 11 Nov 2014 17:24:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D41DAC006 for ; Tue, 11 Nov 2014 15:23:59 -0800 (PST) X-ASG-Debug-ID: 1415748236-04cbb00e69221800001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id g3lIC8xSBLzrJIxu for ; Tue, 11 Nov 2014 15:23:57 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjxhADKaYlR5LbBUPGdsb2JhbABcgw6BLYI2hQexEAIDBpUvhWwCAgEBAoEdFwEBAQEBBgEBAQE4O4QDAQEEOhwjEAgDDgoJJQ8FJQMHGhOIQM8QAQsgGIYiiloHhEsBBJ4kjQSNaykvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 09:53:35 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoKmb-0008Mb-Qd; Wed, 12 Nov 2014 10:23:33 +1100 Date: Wed, 12 Nov 2014 10:23:33 +1100 From: Dave Chinner To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 02/11] xfs: Remove unused variable in xfs_qm_scall_quotaon() Message-ID: <20141111232333.GU28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 02/11] xfs: Remove unused variable in xfs_qm_scall_quotaon() References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-3-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415739865-2438-3-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415748236 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 10:04:16PM +0100, Jan Kara wrote: > sbflags variable in xfs_qm_scall_quotaon() was practically unused (we > only set it to constant at one place and used it elsewhere). Remove it. > > Signed-off-by: Jan Kara I have patches in my queue that change the superblock logging quite a bit and remove the functionality you're changing in this patch, so eventually you'll be able to drop this patch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 11 17:26:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 57D857F89 for ; Tue, 11 Nov 2014 17:26:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36CEA8F8033 for ; Tue, 11 Nov 2014 15:26:37 -0800 (PST) X-ASG-Debug-ID: 1415748395-04cbb00e692219c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uhZeijuATid84YEF for ; Tue, 11 Nov 2014 15:26:36 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjxhADKaYlR5LbBUPGdsb2JhbABcgw6BLYI2hQexEAIDBpUvhWwCAgEBAoEdFwEBAQEBBgEBAQE4O4QDAQEEOhwjEAgDDgoJJQ8FJQMHGhOIQM8QAQEIAiAYhiKKWgeESwEEniSabykvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 09:56:35 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoKpW-0008Mt-9G; Wed, 12 Nov 2014 10:26:34 +1100 Date: Wed, 12 Nov 2014 10:26:34 +1100 From: Dave Chinner To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 03/11] xfs: Remove some useless flags tests Message-ID: <20141111232634.GV28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/11] xfs: Remove some useless flags tests References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-4-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415739865-2438-4-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415748395 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 10:04:17PM +0100, Jan Kara wrote: > 'flags' have XFS_ALL_QUOTA_ACCT cleared immediately on function entry. > There's no point in checking these bits later in the function. Also > because we check something is going to change, we know some enforcement > bits are being added and thus there's no point in testing that later. > > Signed-off-by: Jan Kara Looks sane. I'll pick this up straight away. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 11 17:27:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED6DF7F57 for ; Tue, 11 Nov 2014 17:27:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA6A5304062 for ; Tue, 11 Nov 2014 15:27:17 -0800 (PST) X-ASG-Debug-ID: 1415748436-04cbb00e662219f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id pvLHTVIWcHH9DDKW for ; Tue, 11 Nov 2014 15:27:16 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjxhADKaYlR5LbBUPGdsb2JhbABcgw6BLYI2hQexEAIDBpUvhWwCAgEBAoEdFwEBAQEBBgEBAQE4O4QDAQEEOhwjEAgDDgoJJQ8FJQMHGhOIQM8QAQEIAiAYhiKKWgeESwEEniSabykvgksBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 09:57:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoKqA-0008NB-II; Wed, 12 Nov 2014 10:27:14 +1100 Date: Wed, 12 Nov 2014 10:27:14 +1100 From: Dave Chinner To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 01/11] xfs: Remove useless test Message-ID: <20141111232714.GW28565@dastard> X-ASG-Orig-Subj: Re: [PATCH 01/11] xfs: Remove useless test References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-2-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415739865-2438-2-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415748436 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 10:04:15PM +0100, Jan Kara wrote: > Q_XQUOTARM is never passed to xfs_fs_set_xstate() so remove the test. > > Signed-off-by: Jan Kara Looks fine - the higher layers ahave changed since this was added. I'll pick this one up straight away. -Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 11 17:34:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 27C127F8B for ; Tue, 11 Nov 2014 17:34:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B799FAC004 for ; Tue, 11 Nov 2014 15:34:23 -0800 (PST) X-ASG-Debug-ID: 1415748861-04bdf0650d254160001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YEONEVot9pWZo3PK for ; Tue, 11 Nov 2014 15:34:21 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjthAIOcYlR5LbBUPGdsb2JhbABcgw6BLYI2hQexEAIDBpUvhWwCAgEBAoEZFwEBAQEBBgEBAQE4O4QDAQEEOhwjEAgDGAklDwUlAwcaE4hAzwoBAQEHAgEfGIYiig1NB4RLBZ4kgTWHAZI5KS+BB4FEAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 10:04:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoKx1-0008OV-6l; Wed, 12 Nov 2014 10:34:19 +1100 Date: Wed, 12 Nov 2014 10:34:19 +1100 From: Dave Chinner To: Eric Sandeen Cc: Chris Murphy , Stan Hoeppner , xfs@oss.sgi.com Subject: Re: Enforcing quota for root user Message-ID: <20141111233419.GX28565@dastard> X-ASG-Orig-Subj: Re: Enforcing quota for root user References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> <20141111223203.GS28565@dastard> <54628F7B.7080604@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54628F7B.7080604@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415748861 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 04:36:43PM -0600, Eric Sandeen wrote: > On 11/11/14 4:32 PM, Dave Chinner wrote: > > On Tue, Nov 11, 2014 at 11:00:25AM -0700, Chris Murphy wrote: > >> > >> On Nov 11, 2014, at 8:36 AM, Stan Hoeppner wrote: > >> > >>> On 11/11/2014 04:22 AM, Cyril Scetbon wrote: > >>>> That's what I've read first, but someone showed me a sample where it works. He just told me he was using project quota. However, does it make sense ? > >>>> I've also read somewhere else that quota is never enforced for root user (id,gid=0) that's why I was testing it .... > >>> > >>> No, it doesn't make sense. Why would you want to enforce quotas for root? > >> > >> A week ago I tried this and project quotas appear to apply to root. > > > > By intent and design. Project quotas are not a user/group based > > quota and so there is no exemption for any user. > > However, at least according to the manpage, "project ID 0" is not > enforced. Granted, that is not a *user* exception. Correct, and again by intent and design as project quotas are optional. i.e. there has to be some way of ensuring non-project ID controlled files won't have quota enforcement applied to them. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From lists@colorremedies.com Tue Nov 11 17:35:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C43907F91 for ; Tue, 11 Nov 2014 17:35:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1C0130405F for ; Tue, 11 Nov 2014 15:35:40 -0800 (PST) X-ASG-Debug-ID: 1415748938-04cbb00e69221eb0001-NocioJ Received: from slmp-550-94.slc.westdc.net (slmp-550-94.slc.westdc.net [50.115.112.57]) by cuda.sgi.com with ESMTP id DZIuYRaEWZaSPYSS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Nov 2014 15:35:38 -0800 (PST) X-Barracuda-Envelope-From: lists@colorremedies.com X-Barracuda-Apparent-Source-IP: 50.115.112.57 Received: from c-75-70-18-61.hsd1.co.comcast.net ([75.70.18.61]:58207 helo=[192.168.1.126]) by slmp-550-94.slc.westdc.net with esmtpsa (TLSv1:RC4-SHA:128) (Exim 4.82) (envelope-from ) id 1XoKyG-001yCe-Qp; Tue, 11 Nov 2014 16:35:37 -0700 Content-Type: multipart/alternative; boundary="Apple-Mail=_1EF38950-0514-478B-A301-1D9C74871092" Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: Enforcing quota for root user From: Chris Murphy X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: <20141111223203.GS28565@dastard> Date: Tue, 11 Nov 2014 16:35:31 -0700 Cc: Stan Hoeppner , "xfs@oss.sgi.com" Message-Id: <256C65FE-C757-4457-9F68-1F35FE37968D@colorremedies.com> References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> <20141111223203.GS28565@dastard> To: Dave Chinner X-Mailer: Apple Mail (2.1878.6) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - slmp-550-94.slc.westdc.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - colorremedies.com X-Get-Message-Sender-Via: slmp-550-94.slc.westdc.net: authenticated_id: whatever@colorremedies.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: slmp-550-94.slc.westdc.net[50.115.112.57] X-Barracuda-Start-Time: 1415748938 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --Apple-Mail=_1EF38950-0514-478B-A301-1D9C74871092 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=windows-1252 On Nov 11, 2014, at 3:32 PM, Dave Chinner wrote: > On Tue, Nov 11, 2014 at 11:00:25AM -0700, Chris Murphy wrote: >>=20 >> On Nov 11, 2014, at 8:36 AM, Stan Hoeppner = wrote: >>=20 >>> On 11/11/2014 04:22 AM, Cyril Scetbon wrote: >>>> That's what I've read first, but someone showed me a sample where = it works. He just told me he was using project quota. However, does it = make sense ?=20 >>>> I've also read somewhere else that quota is never enforced for root = user (id,gid=3D0) that's why I was testing it .... >>>=20 >>> No, it doesn't make sense. Why would you want to enforce quotas for = root? >>=20 >> A week ago I tried this and project quotas appear to apply to root. >=20 > By intent and design. Project quotas are not a user/group based > quota and so there is no exemption for any user. It=92s what I=92d expect. I considered the documentation to be slightly = misleading where is says soft and hard limits are never applied to the = root user. The project quota does have a soft and hard limit. The soft = limit, seemed not to apply to the root user - at least there was no soft = limit warning anywhere when it was busted. But the hard limit definitely = applied. = http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch08s04.= html >=20 >> [root@localhost project_quota_test1]# xfs_quota -c df >> Filesystem 1K-blocks Used Available Use% Pathname >> /dev/sdb 83845120 157980 83687140 0% /xfs_local >> /dev/sdb 102400 124928 9223372036854753280 122% = /xfs_local/project_quota_test1 >> [root@localhost project_quota_test1]# dd if=3D/dev/zero of=3Dtest100MB = bs=3D1M count=3D100 >> dd: error writing =91test100MB=92: No space left on device >> 79+0 records in >> 78+0 records out >> 81788928 bytes (82 MB) copied, 0.163849 s, 499 MB/s >> [root@localhost project_quota_test1]# xfs_quota -c df >> Filesystem 1K-blocks Used Available Use% Pathname >> /dev/sdb 83845120 237748 83607372 0% /xfs_local >> /dev/sdb 102400 204800 9223372036854673408 200% = /xfs_local/project_quota_test1 >=20 > It's gone negative. That number in hex: 0x7FFFFFFFFFFE7000 >=20 > What kernel are you using, and can you outline all the way you set > everything up to cause that to occur? Also, what is the output of a > plain 'df -h' when it is in that state? No that VM is gone so I can=92t check it, I=92d have to redo the test. = Since at the time I was also testing Btrfs stuff I=92m going to say it = was at the oldest 3.17.1, and could have been 3.18rc1 or rc2. Chris Murphy= --Apple-Mail=_1EF38950-0514-478B-A301-1D9C74871092 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=windows-1252
On Nov 11, 2014, at 3:32 PM, Dave = Chinner <david@fromorbit.com> = wrote:

On Tue, Nov 11, 2014 at 11:00:25AM -0700, Chris Murphy = wrote:

On Nov 11, 2014, at 8:36 AM, = Stan Hoeppner <stan@hardwarefreak.com> = wrote:

On 11/11/2014 04:22 AM, Cyril = Scetbon wrote:
That's what I've read first, = but someone showed me a sample where it works. He just told me he was = using project quota. However, does it make sense ?
I've also read = somewhere else that quota is never enforced for root user (id,gid=3D0) = that's why I was testing it ....

No, it doesn't make = sense.  Why would you want to enforce quotas for = root?

A week ago I tried this and project quotas = appear to apply to root.

By intent and design. = Project quotas are not a user/group based
quota and so there is no = exemption for any user.

It=92s what I=92d = expect. I considered the documentation to be slightly misleading where = is says soft and hard limits are never applied to the root user. The = project quota does have a soft and hard limit. The soft limit, seemed = not to apply to the root user - at least there was no soft limit warning = anywhere when it was busted. But the hard limit definitely = applied.




[root@localhost = project_quota_test1]# xfs_quota -c df
Filesystem =           1K-blocks =       Used  Available  Use% = Pathname
/dev/sdb =             &n= bsp;83845120     157980   83687140 =    0% /xfs_local
/dev/sdb =             &n= bsp;  102400     124928 = 9223372036854753280  122% = /xfs_local/project_quota_test1
[root@localhost project_quota_test1]# = dd if=3D/dev/zero of=3Dtest100MB bs=3D1M count=3D100
dd: error = writing =91test100MB=92: No space left on device
79+0 records = in
78+0 records out
81788928 bytes (82 MB) copied, 0.163849 s, 499 = MB/s
[root@localhost project_quota_test1]# xfs_quota -c = df
Filesystem =           1K-blocks =       Used  Available  Use% = Pathname
/dev/sdb =             &n= bsp;83845120     237748   83607372 =    0% /xfs_local
/dev/sdb =             &n= bsp;  102400     204800 = 9223372036854673408  200% = /xfs_local/project_quota_test1

It's gone negative. = That number in hex: 0x7FFFFFFFFFFE7000

What kernel are you using, = and can you outline all the way you set
everything up to cause that = to occur? Also, what is the output of a
plain 'df -h' when it is in = that state?

No that VM is gone so I can=92t = check it, I=92d have to redo the test. Since at the time I was also = testing Btrfs stuff I=92m going to say it was at the oldest 3.17.1, and = could have been 3.18rc1 or = rc2.


Chris = Murphy
= --Apple-Mail=_1EF38950-0514-478B-A301-1D9C74871092-- From csp@gestionefectiva.info Tue Nov 11 17:45:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_08, HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 635367F96 for ; Tue, 11 Nov 2014 17:45:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DDD728F8049 for ; Tue, 11 Nov 2014 15:45:23 -0800 (PST) X-ASG-Debug-ID: 1415749520-04bdf0650d2546d0001-NocioJ Received: from gestionefectiva.info (mail3.gestionefectiva.info [74.120.220.109]) by cuda.sgi.com with ESMTP id OViwvRXlZpKmDWxI for ; Tue, 11 Nov 2014 15:45:21 -0800 (PST) X-Barracuda-Envelope-From: csp@gestionefectiva.info X-Barracuda-Apparent-Source-IP: 74.120.220.109 Received: from dserv534-mtl8 (74.120.220.106) by gestionefectiva.info id hcafpq0our06 for ; Tue, 11 Nov 2014 17:45:33 -0600 (envelope-from ) idur: 1474412 Message-ID: <89e977ab592918c0fda21f28001604b4@gestionefectiva.info> From: "Administracion de Personal" To: Subject: Como Supervisar a su Personal Date: Tue, 11 Nov 2014 17:45:32 -0600 X-ASG-Orig-Subj: Como Supervisar a su Personal MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=SPLITOR00A_001_112449576D"; type="multipart/alternative" X-Barracuda-Connect: mail3.gestionefectiva.info[74.120.220.109] X-Barracuda-Start-Time: 1415749520 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=EXTRA_MPART_TYPE, HTML_IMAGE_RATIO_08, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 0.00 HTML_IMAGE_RATIO_08 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=SPLITOR00A_001_112449576D Content-Type: multipart/alternative; boundary="----=SPLITOR00B_001_112449576D" ------=SPLITOR00B_001_112449576D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Si no puede visualizar correctamente este correo, le pedimos que lo = arrastre a su Bandeja de Entrada=2E Supervisar C=C3=93MO SUPERVISAR A LAS PERSONAS T=C3=A9cnicas Efectivas de Liderazgo para Maximizar el Rendimiento de su Personal 28 de noviembre, Monterrey =20 Al asistir a este evento, usted como Supervisor lograr=C3=A1 que sus = propias habilidades sean perfeccionadas y con esto todos en su = organizaci=C3=B3n se beneficiar=C3=A1n: su jefe, su equipo y todos los que = puedan observar las nuevas t=C3=A9cnicas que usted estar=C3=A1 usando y = que incrementar=C3=A1n su productividad y satisfacci=C3=B3n laboral=2E Usted se llevar=C3=A1 valiosa informaci=C3=B3n que le servir=C3=A1 de = referencia una y otra vez, obtendr=C3=A1 mayor confianza en s=C3=AD mismo = y en su rol de Supervisor y a la vez reducir=C3=A1 el estr=C3=A9s y los = aspectos negativos de su trabajo.=20 TEMARIO: 1. C=C3=B3mo dar elogios con significado=2E 2. La mejor manera de mejorar la productividad de un colaborador molesto = por haber recibido cr=C3=ADticas en el pasado=2E 3. C=C3=B3mo mejorar sus habilidades de comunicaci=C3=B3n y hacerlas = efectivas=2E 4. C=C3=B3mo los nuevos Supervisores deben hacer su transici=C3=B3n y = tomar control=E2=80=A6 suavemente=2E 5. C=C3=B3mo sentirse c=C3=B3modo al supervisar amigos y antiguos = compa=C3=B1eros de trabajo=2E 6. C=C3=B3mo mantener a sus colaboradores estrella a su m=C3=A1ximo nivel = de rendimiento sin que se agoten=2E 7. Lograr que los dem=C3=A1s crean en la organizaci=C3=B3n y no la vean = solamente como un lugar de trabajo=2E 8. C=C3=B3mo mejorar la planeaci=C3=B3n en su departamento=2E 9. La llave para resolver problemas dif=C3=ADciles entre el personal y al = mismo tiempo estimular a los dem=C3=A1s para que pongan de su parte=2E 10. C=C3=B3mo ser m=C3=A1s organizado, m=C3=A1s productivo y reducir el = estr=C3=A9s. =20 Si usted desea mayores detalles =C3=BAnicamente responda este correo con = la Palabra:"Supervisar" + Nombre + Tel=C3=A9fono, Empresa y se lo = enviaremos a la brevedad. O bien comun=C3=ADquese a nuestro centro de = atenci=C3=B3n Telef=C3=B3nica al 01 800 212 0660.=20 Quedamos a la espera de contar con la asistencia de su empresa, estamos a = su entera disposici=C3=B3n para cualquier duda o aclaraci=C3=B3n que = precisen. Reciba un cordial saludo,=20 Nombre L=C3=ADc. Patricia Sosa =20 xfs@oss.sgi.com Si no est=C3=A1 interesado en seguir recibiendo ofertas de = nosotros responda con la palabra (10nva). ------=SPLITOR00B_001_112449576D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Untitled Document Si no puede visualizar correctamente este correo, le = pedimos que lo=20 arrastre a su Bandeja de Entrada.

Al asistir a este evento, usted como Supervisor = lograr=C3=A1=20 que sus propias habilidades sean perfeccionadas y con esto todos en = su=20 organizaci=C3=B3n se beneficiar=C3=A1n: su jefe, su equipo y todos = los que puedan=20 observar las nuevas t=C3=A9cnicas que usted estar=C3=A1 usando y que = incrementar=C3=A1n=20 su productividad y satisfacci=C3=B3n laboral.

Usted se = llevar=C3=A1 valiosa=20 informaci=C3=B3n que le servir=C3=A1 de referencia una y otra vez, = obtendr=C3=A1 mayor=20 confianza en s=C3=AD mismo y en su rol de Supervisor y a la vez = reducir=C3=A1 el=20 estr=C3=A9s y los aspectos negativos de su trabajo.

    TEMARIO:
    1.=20 C=C3=B3mo dar elogios con significado.
    2. La mejor manera de = mejorar la=20 productividad de un colaborador molesto por haber recibido = cr=C3=ADticas en=20 el pasado.
    3. C=C3=B3mo mejorar sus habilidades de = comunicaci=C3=B3n y hacerlas=20 efectivas.
    4. C=C3=B3mo los nuevos Supervisores deben hacer su = transici=C3=B3n=20 y tomar control=E2=80=A6 suavemente.
    5. C=C3=B3mo sentirse = c=C3=B3modo al supervisar=20 amigos y antiguos compa=C3=B1eros de trabajo.
    6. C=C3=B3mo = mantener a sus=20 colaboradores estrella a su m=C3=A1ximo nivel de rendimiento sin = que se=20 agoten.
    7. Lograr que los dem=C3=A1s crean en la = organizaci=C3=B3n y no la vean=20 solamente como un lugar de trabajo.
    8. C=C3=B3mo mejorar la = planeaci=C3=B3n en=20 su departamento.
    9. La llave para resolver problemas = dif=C3=ADciles entre=20 el personal y al mismo tiempo estimular a los dem=C3=A1s para que = pongan de=20 su parte.
    10. C=C3=B3mo ser m=C3=A1s organizado, m=C3=A1s = productivo y reducir el=20 estr=C3=A9s.
Si usted = desea=20 mayores detalles =C3=BAnicamente responda este = correo con la=20 Palabra:"Supervisar" + Nombre + Tel=C3=A9fono, Empresa y se = lo=20 enviaremos a la brevedad. O bien comun=C3=ADquese a nuestro centro = de atenci=C3=B3n=20 Telef=C3=B3nica al 01 800 212 0660.=20

Quedamos a la espera = de contar=20 con la asistencia de su empresa, estamos a su entera = disposici=C3=B3n para=20 cualquier duda o aclaraci=C3=B3n que precisen. Reciba un cordial = saludo,=20

Nombre
L=C3=ADc. Patricia Sosa 
xfs@oss.sgi.com Si=20 no est=C3=A1 interesado en seguir recibiendo ofertas de = nosotros
responda=20 con la palabra (10nva).
3DSupervisar

C=C3=93MO=20 SUPERVISAR A LAS PERSONAS
T=C3=A9cnicas Efectivas de Liderazgo para Maximizar
el = Rendimiento=20 de su Personal

28 de=20 noviembre, Monterrey

------=SPLITOR00B_001_112449576D-- ------=SPLITOR00A_001_112449576D Content-Type: image/jpeg; name="supervisar.jpg" Content-Transfer-Encoding: base64 Content-ID: <23124an$IN508014157495320@dserv534-mtl8> /9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABPAAD/4QNvaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENl aGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4 OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6 NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5 OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHht bG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0i aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1w PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9 InhtcC5kaWQ6MjQwOEU5QjU2MDhDRTAxMThBQTA4MDZGQ0EzNEM1RjMiIHhtcE1NOkRvY3VtZW50 SUQ9InhtcC5kaWQ6RTA1QzlEQ0U2OUM3MTFFNDlENThFNTlCNTBEMzRCNjciIHhtcE1NOkluc3Rh bmNlSUQ9InhtcC5paWQ6RTA1QzlEQ0Q2OUM3MTFFNDlENThFNTlCNTBEMzRCNjciIHhtcDpDcmVh dG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiPiA8eG1wTU06RGVyaXZlZEZy b20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBMTFFQkM1OEI4NjlFNDExODJDMkExQjBCMkFC MEVGOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyNDA4RTlCNTYwOENFMDExOEFBMDgwNkZD QTM0QzVGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94 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 jKlIR+J1xxbywxph31wFfcLtzs2ZtC1vftFPqEygBoy5lJrhZXKYZQ6WHS2tlKRqZWk6knVmAVJW cgDr9N+59xHqD2G+jFTrRSjWjdKrP5lk8O1csnUPt2xLYre7KT0Uq4ypWmT8seKx7GKGyva1t5uf Z8m71XdLrC6eHGH4TcEUxuJOTHS90nXn1P60DWnNaUp4Z4wde+7d5stwrLsqNcU666xrSqSpR4ZO pn6J9r7Pd2XejdcqYNJaKSpWjbrXPNChtD299uW4sV+103lPufcGnsqkTXKcFQozaUrCCuEmVFId bSpQBVqJPtZIChjX639ydY2kledmMLLdFq95/wCLTL3X2eTGhl6R9v8ASd1F2o3XK6s9Pur/AA1W K7cfJUR6DsDsjam4Mmwd472W9ckqWItGplKQ42kMvryjKnyOg62266kpUG9Q0gpKlHUBjZ3P3H1O /tFudnY9xKspSpmvi0Rqm0vmpjjhgYNv9vdOs7p7fc3vfbooxqs/h1So0m+VV6RndzuxNP2PuSmN 0mZIqlt3Qy+7AM7SZDD0VaA8ytTaUJUAHUEHIHjkRwzPV+1PuGXUrMncSU4NVpk08n2ZM5f3P0GP T7sfCbcJp55qma9KHfavbFt3XtnLj3WjXZOutNApdYlxWGaeKW21Np8NbwbeDy31rSFAHNOnMY5e 8+695a6hb2crUYapRTblr92UqVVKJYd50tr9s7S5sbm6hdc9MZNUWlaop51q8+4jfYbaq0t3boZt S4rmetqtTlu/DoDFNVKMtthhUhwpkdVCGlBKFHzJOeXrx3vuHq+46fYd6FpTiqVblTTV0Xu0q+HE 4vQelbffXVbldcJPgo11UVfirReYlS49ge3Tbjcr6N7lXtKgUuWxDFLpyAtcouOoCVyahJaiqaYb LmrSnIZJ8ylBPPze2+4+r7zZ+LtrKck3WXDDhCLlWTpm/IlU9Ff+3+lbXdeHfutJpUjx75SpSKr3 c60Gx3S9uNE2WTSbhtmbLqdr3A67EU1UFNuOxJSU9VCUuNIbCkLRqyzTmNPEqzx0PtL7nudR12r6 SnFJ4cVk8HXFOnn4HO+5/tuGwUblhtwk6OvB5ryZ+YZe123u39YoM++d2Llctm0aPNYpaIVMZ69U mSZDanUhoFK0oSEoJ1FCuR4DHV6v1Ld27sdvtbSnclFyrJ0hFJ0x591Uc7pXTdrctSv7i44Qi9NI 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 B4/pPzXyMO8P+7mXpP8A0j5r5GD7SKfLmXA5/rHzPyMO8iny5lQf+kfM/IwJp8uZTV/r/mPkYd5N OWZTP/XfMfJxPeTTlmWk/wCt/V/k4ErszMSjx/K/q/ycSXS5ZmNRP9b+r/J/4MSZEuWZhUr/AFn6 v8n/AIMSi67MzCo/6z9X+TixddmZhUr8b9X+TgjIlyzMCjx836v4YsZF6TCtXp+Y8MSXXpMCj6fm PDFjIvSYlH0/MeGBdekxKPHj8xixZekxqP8AzOJLr0mM8/8AyOBdektP+xxJK9Jaf9lgW9ZafV81 iSfWUPq+a8cCfWU+58144D1h/N+a8cCfWH835rxwI9Yfzfm/HAesP5vzfjgPWH8z5vxwHfmH8z5v xwHeH8z5vxwHeH8z5vxwHeH8z5vxwHeH/J+x44DvD/k/Y8cB3m7Rf/jMDp+x70xn/wA4nAh5Ykbf o+GBg94ko9z3cqRkjdm+SvxH0trP9qxfXLmbH1N3jJ+dge57uVIyRuzfJc8R9Laz/asNcuY+pu8Z PzsvR3Odyy1JQ1uxfTj6iBoF2Vkk+oASsNcuYW4u/M/Oxz0zdXu+qMUT3d0b5pME8feJ121lpCv5 gMrMn7mK+I+Zv2NpvLmTkl2tm25ur3MNp/8ArXeqlJGaiLorWX8Gc0Z4nXLtOgukbimN31+0T3d5 O6pCFlG715qdbSXA2btr2tSM+YHWIzPozxOqXM1JdP3q/edP4hNXv73WpKEfWhfYdeBUgqu2sJSo DnkVSwMNUubNeW33qeOrzs05Pcn3PQ1BqTurfbD5GoBd2VkBQ9Kf0rIj1jEa5c2ak71+LpKUl5WY f8z3crlkN2b56viPpbWf7VhrlzK/U3fmdO9h/me7lcshuzfPV9H0trP9qw1y5j6m78zp3sr/AJnu 5TLL62b56vo+ltZ/tWGuXMfU3fmdO9lP8z3crll9bN89X0fS2s/2rDXLmPqbvzOnew/zPdyuWX1s 3z1fR9Laz/asNcuY+pu/M6d7D/M93K5ZfWzfPV9H0trP9qw1y5j6m78zp3sP8z3crll9bN89X0fS 2s/2rDXLmPqbvzOnew/zPdymWX1s3z1fR9Laz/asNcuY+pu/M6d7Kjue7lMsjuzfPV9H0trP9qw1 y5sj6m78zp3sqO57uUyyO7N89XwH0trH9qw1y5kfU3fmdO9lw7ne5TLJW7N89XwH0srH9qxGuXNk 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 cqLoLqg5DoUmal8rKRmouzmAVen1jTjJncNpOu7dHlHH8eUhzYu7XqBtB3O91dLSYF41yU1QLflt JQ3JgO3TUi5OebWkqKHAJjCwoZZKb4KOfCkXg5Gram1ane4t0XZ+PyG99ni44b23cZq5UqwKhthc 8q7UvH9CebZeiaXZJV5S4lt5/SonVpU74asLTzqT0+45RnrdVTj5TlAh9wdGO0uS6rgy00krW4s+ yhKUgkkngAMYEqnKtw1SS5s6v+0bmN29uTa+wFKkluy9hrXotIiQWnCppqoOxw+5MzJKus4wtjNa vMctXyiTmuyo6LgdPe3pQuKMHSiWB1K0wb/7ku3C390Fmr1LZ/aiNubdTslCV9WuOx48Vx1zNIOt uWw3I4J9oD1gZmqyXYdCcFK8q/uqvn/sIYtui7GUvuLpfchW+6ijVq7YVeZrtTQ3bdSjmZDU5lJp jbhlOdJlyOpTCBkoNpIySdOWKKiddRitR03NTuJ9n4ZyPvrWLfuDe7cKt2o63LtOt3VcM+jSI6VN su0+TUpDsdbaVBJCVNqSQCAQPDGGWbOLeadyTXNk77PXTsjvL2zsdru6F7DYu5rXuKVctDrlWaDt u1lEpJ0tznFKZbacb6q0DquICQlC0KXmpsZYUcaVxOtYpdsqEZaZIU7U2k3usruc2R7ad0qt9I7D s6vxbqsswnESaW/Sm5Jq0hcB/pIe6TnuS0qQs5oy8oCdCiWrUkyIK748Y3Maekb8Xqbz/aOtEKS9 CqO5plJKUFYcpVAqRkaSFk+1Eg5E8hz05eXFVjMwWvf3de1+gjLusulV59yW5Vd5xnrlqsOMrhmY tPfVCYJy8S0wnP8AjOKzdZM1N1LVdk+06K7Q6bthS+zTeOu7rV2VYVm7i3FR7JqFepcR2fNQmlsM VFthphuPJJ6nxBaVHQckqUc0kJOMkEtDqdLaQj9O9TomxMsi5+wPt5uOLulZNeu7fK97XJlW9R5d PVSKc1UMiG5ElyTDiq/Jnikp16TkemogZQtEcViUj9PZetPUyQNvm6Dc/aFdO4O4W48LY25+7G9a pNuC6ZFNkTRMp0N6ShdGjJjvIcbQX0OqGpZHSU40QQrMWXw1rSpmtwbs6tWmUnVv8iPqq3sHs72i bt7VWvvPS95Z99y7Yq9t0SHR5lOVTpsGqxzUH2eqt5BL0VKdRzRkGj7RXwiTWhqtSt7Cw4OWp1VP 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 3vRjKdWlIX0+OYWB0/PjL4ka0OdHYXXDUlnjSq1U50zoaVb2fvCg35SttJq6ZKu+vyo9LbiU2sQa imLUJEn3P3OY5EedSy8295VpWRlz4pyOJU01XgVntJxuK3hqeGDTo8qOmQ6I/b9cV0RKTTbGpsub cjNbmWTX3J82GiO7cjLUmYIlOYbBWGW40U5uuOK6izkEN5AKr4iWfeZ10+UqKCxq4ur/AHsXh2UW fHsCF283RTWJ0u5oSK1THbWr9y0ioWxX6VLhJfoXS96D77Jltue6lwB1hCkuHUkoXkcyd1ekR6fJ VcsVpbVGv3c+eXFCPWthL5tudTaPc0u37brdXeTHepdTuajxptL1x1SkrqjLkoKigtJz/KZKzKWy OotCFSrieRinsZwaUnFN8HJVXfjh+OJux+2vc9+dV4khNIpkC1W6RLnVqfXadGo/uNeS4uBOanOP hhxh8NZJUlftFKMtZ04jxYl1067V5JKmLapSWTryZWtdsG9VESlmVRGpdURVYttzKTTalAn1Kn1K oKUITU2NFkOLZErSotLUNCkjVqyUnUV2LEum348KutKJptN5V7wHbPum/NYg05ukVpmXT6nV2qjT LgpUumdKilkT21zWpKo7a43vDZcC1pCUqCydHmw8WI/TbtcKPBvBqmGePYLtL7TLwkUe7KjXq9QL c+hlHpNx011+sU9ynVqFV57UJqQxNTKDaGfMsBzJQLqQxkFq4Q7ywMselTpJylFUSaxVGm6Z8vzw GXdWx24lm2yq567FiNw4S4jdWhxqnClVKjKqCC5EFVhsPLeil9IOkOJGRGlWlWSTZXE3Q1ruyuW4 63TtVVWNcqrhUUYvbhulLp1EqYjU6LT7tgJrsF6ZWKfF0UjprddqUkPvoLEVrSErdcCUdRSWklTh 04eLEuunXWlLDFVzWXN9i4sxy+3jcqn/ABZ6pt0qlUa3mob4rc6u0yNSagKlHdlwkU2Y7ISzKXJZ YcWhLSicknVpIyw8VEPp91VbokuNVR1yo+NS+V25boxLeXcK41PcZaocW8009urwDVXLflQmp/xN uD1g+phtt0dRQR5SlY+Qoh4sa0JfT7qjrwy1Uqq6aVrTkbEjtj3dje7R3IMBdRcm0ulVKmMVinv1 Giya1IbjQU1eK0+t2KHnHUpBWnJCiEuaFkJMeLEl9NvLgq1SaqqxrgtS4VMNS7a93afMpNNYpkWu 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 uvdKnXPV7ikXrQKZZTNpyqW6zHiNMM09pc1UlchSFMs+7OOtIDYX1leyAC4uValRKmWJMt9ZV2V1 Sb1JR00yyx8mfeZbI7hdkou9V2bt3LNkLr8jcQ3FR6nUqM9WFv2iiS77vDgtrktohyG0KGbi21Lb byS15gUKiVqWlRXL0kWN/YV6VyTx11Tar7vBLk/yIMl1ywqjfVpzqndtxKtKK7JemmnxenKths1S W8zHoyXpJSUhJbfzQEBKnFZJKwRim8jddiatRjKdMFL4ZfxHOlctO7FuUtOOX7uLpp9DOqj3qbQW 1c21SXqtcG88nbGsVKoVK+63S40OpopdTpM6l+4MJK0uvaVSkOuFZBV0k5FZ4J+bL7O3t21uaRhZ V2MUrcZNx1RlGep8F8LSp8zy49x9YsRnbxlPS23JrGjTVPT6B0bJbv7HVy9tqdpNqKrVq9Kol+3F czj1ap/uZdjT6JWFqWgpJTpS5JCADko5FRSMaPWOk9Qt2Nzut1GMVKzCHuuuMZw/KNeRsbTd7eVy 3atNuk5PFc1L2jaHdhs7sFVKpQKK/cG7VTrO4Uq6riRWorUZFDbZecbdZglx5wPSEqGaVApQvmVI 9k7n/a+96jCNyahZUbKhDS668MHLDCPNYtdphfVbG2k4rVNubbr+73C1bvezsfb1/UGRGqzTdhsV WsXLLj02yXaRLiS6hT5EYGQ+ipS/eXXFvnqqQygKIC8+HHW3H2b1C7t5pxfi6YwTd1TTUZJ4LTHS lT3aydMjLDrO3jNY+7VvCLWa73V88CF+07umtWzHbtp3cDMqV0UutzqNelLlOpXUJRuSgSW3Wipa tawXUttp1KOlKWgPLnj0n3R9s3r6tS2CjGUVK218K8OadezCr/mOZ0vqcIaluG2m1JcfeX4XmHfY feHbBse0na9d0uydzadety3lWpzNCcrUVDdZj1FCWiyp1kOMqVLSlSUuJWlA8hSoJUOfvvtK99Rd ULSnZdqFuK16H7jjjWjo/deNKVzqbNjq8PDjqnpnqlJ4as6+jE22u4bsxh3vcFcpFumjVH4XQl0+ uItpEujyKxAmPSp7kCgSZhaireStIZW4s9NepfApKn8b6B1yW3hCc9S1SrHXSahJJR1XUqyS/eSW Kw7I2XUdirkmlTBY0wbTbdI8Ox8/Tr7993m3F2WRu9SduK5U6fXNzLnoFWpDkePJgKfpsOiUeDLD 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 n//Z ------=SPLITOR00A_001_112449576D-- From david@fromorbit.com Tue Nov 11 18:10:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5903F7F9A for ; Tue, 11 Nov 2014 18:10:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 47363304062 for ; Tue, 11 Nov 2014 16:10:05 -0800 (PST) X-ASG-Debug-ID: 1415751000-04cb6c1e6d223c10001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id VGNzkMYBmjJOqCLp for ; Tue, 11 Nov 2014 16:10:00 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhpeALWkYlR5LbBUPGdsb2JhbABcgw5UWYI2ULVLAgMGk1SBW4VsAgIBAQKBGBcBAQEBAQYBAQEBODuEAwEBBCMPASMjEAgDDgoCAgUhAgIPBSUDBxoTiEAOuBaWTQEBAQcCAR8YgRWFDYoDCk0HgneBVAWXBIcggTWHAZI5KS+BB4FEAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 12 Nov 2014 10:39:29 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XoLV1-0008Sz-9c; Wed, 12 Nov 2014 11:09:27 +1100 Date: Wed, 12 Nov 2014 11:09:27 +1100 From: Dave Chinner To: Chris Murphy Cc: Stan Hoeppner , "xfs@oss.sgi.com" Subject: Re: Enforcing quota for root user Message-ID: <20141112000927.GY28565@dastard> X-ASG-Orig-Subj: Re: Enforcing quota for root user References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> <631A9090-F9FE-4B8E-88CD-1B30CAFC65B7@colorremedies.com> <20141111223203.GS28565@dastard> <256C65FE-C757-4457-9F68-1F35FE37968D@colorremedies.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <256C65FE-C757-4457-9F68-1F35FE37968D@colorremedies.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1415751000 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 04:35:31PM -0700, Chris Murphy wrote: > > On Nov 11, 2014, at 3:32 PM, Dave Chinner > wrote: > > > On Tue, Nov 11, 2014 at 11:00:25AM -0700, Chris Murphy wrote: > >> > >> On Nov 11, 2014, at 8:36 AM, Stan Hoeppner > >> wrote: > >> > >>> On 11/11/2014 04:22 AM, Cyril Scetbon wrote: > >>>> That's what I've read first, but someone showed me a sample > >>>> where it works. He just told me he was using project quota. > >>>> However, does it make sense ? I've also read somewhere else > >>>> that quota is never enforced for root user (id,gid=0) that's > >>>> why I was testing it .... > >>> > >>> No, it doesn't make sense. Why would you want to enforce > >>> quotas for root? > >> > >> A week ago I tried this and project quotas appear to apply to > >> root. > > > > By intent and design. Project quotas are not a user/group based > > quota and so there is no exemption for any user. > > It’s what I’d expect. I considered the documentation to be > slightly misleading where is says soft and hard limits are never > applied to the root user. The project quota does have a soft and > hard limit. The soft limit, seemed not to apply to the root user - > at least there was no soft limit warning anywhere when it was > busted. But the hard limit definitely applied. > > http://xfs.org/docs/xfsdocs-xml-dev/XFS_User_Guide/tmp/en-US/html/ch08s04.html So write a patch to fix the documentation. Repo is here: git://git.kernel.org/pub/scm/fs/xfs/xfsdocs-xml-dev.git Cheers, Dave. -- Dave Chinner david@fromorbit.com From johnrwhite30@gmail.com Wed Nov 12 02:41:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_FONT_SIZE_LARGE,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3F6F47F9D for ; Wed, 12 Nov 2014 02:41:01 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1EAD38F8037 for ; Wed, 12 Nov 2014 00:40:58 -0800 (PST) X-ASG-Debug-ID: 1415781656-04cbb00e66235d50001-NocioJ Received: from mail-oi0-f71.google.com (mail-oi0-f71.google.com [209.85.218.71]) by cuda.sgi.com with ESMTP id UOQwE0PP0DBBanIS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 12 Nov 2014 00:40:56 -0800 (PST) X-Barracuda-Envelope-From: johnrwhite30@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.218.71 X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.71] Received: by mail-oi0-f71.google.com with SMTP id a3so5000057oib.2 for ; Wed, 12 Nov 2014 00:40:56 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.71] X-Barracuda-IPDD: Level1 [gmail.com/209.85.218.71] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:message-id:date:subject:from:to:content-type; bh=sspq3AQgV216HfTW1Z+N/Cls+fbhdkIMfTMffpx0MSo=; b=M8soAP+Yu5sOpD3MtV8RGsPSIi55nUuvsTqym/FV4NbDf0xiQQ4Nxfy9+SP+R5VJ5Y j313RVM4sdmO8RKTUs77bIusa7ManLlAZ0Adnt/ZEom3td071dOwj+3Y6RFnCkh3j9Br M7ne9OFGZw049TtHT0nHV+s1yXjfgcKHNYxVMh7oKzh5C8UL3Jhiy6fHc7+ysuJT0s5u d+nv3kjA5lUc2Vt6ggjlzKE7VpEL7vtwyTfP7N1bhEMlJEuzeUcFK5MyS0klGAkjwT03 sgjdJoFYixetjHaueOEqiGH+i7SSiicxiKTLQFdwUssu7ptuxJPd3PPHy8jO0H5bFZNQ htpA== MIME-Version: 1.0 X-Received: by 10.182.245.162 with SMTP id xp2mr32094729obc.8.1415781656038; Wed, 12 Nov 2014 00:40:56 -0800 (PST) Message-ID: <089e016341e8b01b810507a55a20@google.com> Date: Wed, 12 Nov 2014 08:40:56 +0000 Subject: www.oss.sgi.com From: "John | Cellsix Media Ltd" X-ASG-Orig-Subj: www.oss.sgi.com To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e016341e8b01b600507a55a1d X-Barracuda-Connect: mail-oi0-f71.google.com[209.85.218.71] X-Barracuda-Start-Time: 1415781656 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_FONT_SIZE_LARGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message --089e016341e8b01b600507a55a1d Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Hi, I came across-your contact over the-web and wanted to-share a brief note. I think a few-changes, aesthetically and/or SEO-wise, can make your site-convert more-visitors into leads-and also get it placed-higher in the organic search-results, for a few of the select terms.(Search-Engine-Optimization is the-process of affecting the visibility of a-website or a web-page in a search-engine's "natural" or un-paid "organic" search-results) This is NOT like one-of those foreign-emails you probably get in your-inbox every day. Just to be-upfront, I have a full-fledged team for Web-Development-&-SEO. I would just-need to know-which (if not both) services-you're open to checking out-information about, either web-design or-SEO. Would you be-open to seeing more-brief info / quote for what-I would like to accomplish? Thanks & regards, John | Director MKT CELLSix Headquarters: 25/F., One Kowloon, 1 Wang Yuen Street, Kowloon Bay, Hong Kong Other Offices: China | New Zealand | Australia | UAE | USA Disclaimer: This e-mail is private and confidential. If you are not the intended recipient, please advise us by return e-mail immediately, and delete the e-mail and any attachments without using or disclosing the contents in any way. The views expressed in this e-mail are those of the author, and do not represent those of this company unless this is clearly indicated. You should scan this e-mail and any attachments for viruses. This company accepts no liability for any direct or indirect damage or loss resulting from the use of any attachments to this e-mail. All quotes received from CellSix by email are informal and not binding until a formal quote is agreed upon by both the parties. --089e016341e8b01b600507a55a1d Content-Type: text/html; charset=ISO-8859-1
 
Hi,
 
I came across-your contact over the-web and wanted to-share a brief note. I think a few-changes, aesthetically and/or SEO-wise, can make your site-convert more-visitors into leads-and also get it placed-higher in the organic search-results, for a few of the select terms.(Search-Engine-Optimization is the-process of affecting the visibility of a-website or a web-page in a search-engine's "natural" or un-paid "organic" search-results)
 
This is NOT like one-of those foreign-emails you probably get in your-inbox every day. Just to be-upfront, I have a full-fledged team for Web-Development-&-SEO.
 
I would just-need to know-which (if not both) services-you're open to checking out-information about, either web-design or-SEO. Would you be-open to seeing more-brief info / quote for what-I would like to accomplish?
 
Thanks & regards,
 
John | Director MKT
 
CELLSix        Headquarters:  25/F., One Kowloon, 1 Wang Yuen Street, Kowloon Bay, Hong Kong
                                             Other Offices: China | New Zealand | Australia | UAE | USA

Disclaimer: This e-mail is private and confidential. If you are not the intended recipient, please advise us by return e-mail immediately, and delete the e-mail and any attachments without using or disclosing the contents in any way. The views expressed in this e-mail are those of the author, and do not represent those of this company unless this is clearly indicated. You should scan this e-mail and any attachments for viruses. This company accepts no liability for any direct or indirect damage or loss resulting from the use of any attachments to this e-mail. All quotes received from CellSix by email are informal and not binding until a formal quote is agreed upon by both the parties.

 
--089e016341e8b01b600507a55a1d-- From elcrowde@msn.com Wed Nov 12 04:13:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E67B7FA2 for ; Wed, 12 Nov 2014 04:13:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1CF07AC001 for ; Wed, 12 Nov 2014 02:13:18 -0800 (PST) X-ASG-Debug-ID: 1415787192-04cb6c1e6a234f20001-NocioJ Received: from SNT004-OMC3S50.hotmail.com (snt004-omc3s50.hotmail.com [65.54.51.87]) by cuda.sgi.com with ESMTP id TE5EFpnIKUAgMFJl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 12 Nov 2014 02:13:13 -0800 (PST) X-Barracuda-Envelope-From: elcrowde@msn.com X-Barracuda-Apparent-Source-IP: 65.54.51.87 Received: from SNT152-W87 ([65.55.90.135]) by SNT004-OMC3S50.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Wed, 12 Nov 2014 02:13:13 -0800 X-TMN: [vsE7brqtC6CuCaUNbM96+pDwnOEuiOq/] X-Originating-Email: [elcrowde@msn.com] Message-ID: Content-Type: multipart/alternative; boundary="_23d56071-c568-42c2-8f3c-29b026c2cb21_" From: manuel crow Subject: Greetings Date: Wed, 12 Nov 2014 10:13:12 +0000 X-ASG-Orig-Subj: Greetings Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 12 Nov 2014 10:13:13.0023 (UTC) FILETIME=[446BC4F0:01CFFE61] X-Barracuda-Connect: snt004-omc3s50.hotmail.com[65.54.51.87] X-Barracuda-Start-Time: 1415787193 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; --_23d56071-c568-42c2-8f3c-29b026c2cb21_ Content-Type: text/plain; charset="windows-1256" Content-Transfer-Encoding: base64 SGksIEkgYW0gTWFudWVsLCBmaW5hbmNpYWwgaW52ZXN0bWVudCBkaXJlY3Rvci4gVG8gaW50cm9k dWNlLCB3ZSBhcmUgRHViYWkgSW52ZXN0bWVudCBDb21wYW55IGFuZCBvZmZlcmluZyBmaW5hbmNp YWwgYXNzaXN0YW5jZSBmb3IgdmFyaW91cyBwcm9qZWN0cy4gV2UgY2FuIGV4dGVuZCB1cCB0byBo YWxmIGEgbWlsbGlvbiBjcmVkaXQgb3IgbW9yZSBkZXBlbmRpbmcgb24gdGhlIHNlY3Rvci4gQXBw cm92ZWQgY3JlZGl0IGlzIGV4ZW1wdGVkIGZyb20gY29sbGF0ZXJhbCBhbmQgZGlzYnVyc2Ugb24g My41JSBpbnRlcmVzdCByYXRlIHBlciBhbm51bS4gUGxlYXNlIGRvIGxldCBtZSBrbm93IGlmIHlv dSBoYXZlIGFueSBxdWVzdGlvbnMsIElmIGludGVyZXN0ZWQgcGxlYXNlIHJlcGx5IHdpdGggeW91 ciBidXNpbmVzcyBwbGFuIGFuZCBjb250YWN0IG5vLiBXYXJtIFJlZ2FyZHMsIE1hbnVlbCBDcm93 IA0KDQoNCg0KIAkJIAkgICAJCSAg --_23d56071-c568-42c2-8f3c-29b026c2cb21_ Content-Type: text/html; charset="windows-1256" Content-Transfer-Encoding: base64 PGh0bWw+DQo8aGVhZD4NCjxzdHlsZT48IS0tDQouaG1tZXNzYWdlIFANCnsNCm1hcmdpbjowcHg7 DQpwYWRkaW5nOjBweA0KfQ0KYm9keS5obW1lc3NhZ2UNCnsNCmZvbnQtc2l6ZTogMTJwdDsNCmZv bnQtZmFtaWx5OkNhbGlicmkNCn0NCi0tPjwvc3R5bGU+PC9oZWFkPg0KPGJvZHkgY2xhc3M9J2ht bWVzc2FnZSc+PGRpdiBkaXI9J2x0cic+PGRpdj5IaSwmbmJzcDs8L2Rpdj48ZGl2PkkgYW0gTWFu dWVsLCBmaW5hbmNpYWwgaW52ZXN0bWVudCBkaXJlY3Rvci4mbmJzcDs8L2Rpdj48ZGl2PlRvIGlu dHJvZHVjZSwgd2UgYXJlIER1YmFpIEludmVzdG1lbnQgQ29tcGFueSBhbmQgb2ZmZXJpbmcgZmlu YW5jaWFsIGFzc2lzdGFuY2UgZm9yIHZhcmlvdXMgcHJvamVjdHMuJm5ic3A7PC9kaXY+PGRpdj5X ZSBjYW4gZXh0ZW5kIHVwIHRvIGhhbGYgYSBtaWxsaW9uIGNyZWRpdCBvciBtb3JlIGRlcGVuZGlu ZyBvbiB0aGUgc2VjdG9yLiBBcHByb3ZlZCBjcmVkaXQgaXMgZXhlbXB0ZWQgZnJvbSBjb2xsYXRl cmFsIGFuZCBkaXNidXJzZSBvbiAzLjUlIGludGVyZXN0IHJhdGUgcGVyIGFubnVtLiZuYnNwOzwv ZGl2PjxkaXY+UGxlYXNlIGRvIGxldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMs IElmIGludGVyZXN0ZWQgcGxlYXNlIHJlcGx5IHdpdGggeW91ciBidXNpbmVzcyBwbGFuIGFuZCBj b250YWN0IG5vLiZuYnNwOzwvZGl2PjxkaXY+V2FybSBSZWdhcmRzLCZuYnNwOzwvZGl2PjxkaXY+ TWFudWVsIENyb3cmbmJzcDs8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2 Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj4gCQkgCSAgIAkJICA8L2Rpdj48L2JvZHk+DQo8L2h0 bWw+ --_23d56071-c568-42c2-8f3c-29b026c2cb21_-- From cyril.scetbon@free.fr Wed Nov 12 07:56:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 14CC97F58 for ; Wed, 12 Nov 2014 07:56:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E80468F8033 for ; Wed, 12 Nov 2014 05:56:00 -0800 (PST) X-ASG-Debug-ID: 1415800558-04cb6c1e6c23a9b0001-NocioJ Received: from mo6.mail-out.ovh.net (2.mo6.mail-out.ovh.net [46.105.76.65]) by cuda.sgi.com with ESMTP id lW9uEgYEZKivHEkN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 05:55:59 -0800 (PST) X-Barracuda-Envelope-From: cyril.scetbon@free.fr X-Barracuda-Apparent-Source-IP: 46.105.76.65 Received: from mail617.ha.ovh.net (gw6.ovh.net [213.251.189.206]) by mo6.mail-out.ovh.net (Postfix) with SMTP id E5D4BFFB648 for ; Wed, 12 Nov 2014 14:55:54 +0100 (CET) Received: from b0.ovh.net (HELO queueout) (213.186.33.50) by b0.ovh.net with SMTP; 12 Nov 2014 15:55:54 +0200 Received: from unknown (HELO elia.xerus.net?echo-net.net?x-echo.com?s1.p.fti.net) (cscetbon@atid.fr@193.252.149.222) by ns0.ovh.net with SMTP; 12 Nov 2014 15:55:53 +0200 Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Mac OS X Mail 8.0 \(1990.1\)) Subject: Re: Enforcing quota for root user From: Cyril Scetbon X-ASG-Orig-Subj: Re: Enforcing quota for root user In-Reply-To: <54622CE8.7050508@hardwarefreak.com> Date: Wed, 12 Nov 2014 14:55:52 +0100 Cc: xfs@oss.sgi.com Content-Transfer-Encoding: quoted-printable Message-Id: <3D602DDB-31DA-4923-9737-C1895DF55F34@free.fr> References: <67EDE14C-CCFB-4B42-8B78-FC6C813CD19A@free.fr> <5461B333.8050609@hardwarefreak.com> <54622CE8.7050508@hardwarefreak.com> To: Stan Hoeppner X-Mailer: Apple Mail (2.1990.1) X-Ovh-Tracer-Id: 7415458262487320539 X-Ovh-Remote: 193.252.149.222 () X-Ovh-Local: 213.186.33.20 (ns0.ovh.net) X-OVH-SPAMSTATE: OK X-OVH-SPAMSCORE: -100 X-OVH-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeejhedrieejucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrfeejhedrieejucetufdoteggodetrfcurfhrohhfihhlvgemucfqggfjnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd X-Barracuda-Connect: 2.mo6.mail-out.ovh.net[46.105.76.65] X-Barracuda-Start-Time: 1415800559 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11513 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --=20 Cyril SCETBON > On 11/11/2014 04:22 AM, Cyril Scetbon wrote: >> That's what I've read first, but someone showed me a sample where it = works. He just told me he was using project quota. However, does it make = sense ?=20 >> I've also read somewhere else that quota is never enforced for root = user (id,gid=3D0) that's why I was testing it .... >=20 > No, it doesn't make sense. =20 Cool I'm not crazy :) > Why would you want to enforce quotas for root? Cause I'm using a software that must be launched as root (a limitation = that should be removed in the future) and I want to apply quota to that = one ! > Regards, > Stan From tdm@sgi.com Wed Nov 12 09:01:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 451087F59 for ; Wed, 12 Nov 2014 09:01:49 -0600 (CST) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D3878F8037; Wed, 12 Nov 2014 07:01:46 -0800 (PST) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id EDA4070033BB; Wed, 12 Nov 2014 09:01:45 -0600 (CST) Message-ID: <54637659.5090105@sgi.com> Date: Wed, 12 Nov 2014 09:01:45 -0600 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com, Troy McCorkell Subject: Re: oss.sgi.com - maintenance downtime Friday 11/14/2014 at 10:00 CST USA References: <545CE78D.7030003@sgi.com> In-Reply-To: <545CE78D.7030003@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Second reminder. On 11/07/2014 09:38 AM, Troy McCorkell wrote: > > On Friday November 14, 2014 at 10:00 CST USA > oss.sgi.com will be unavailable for a short period of time to perform > network maintenance. > > The outage is expected to last approximately 15 minutes. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cmaiolino@redhat.com Wed Nov 12 11:33:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=FAKE_REPLY_C autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BEEA17F3F for ; Wed, 12 Nov 2014 11:33:01 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F6F3AC00B for ; Wed, 12 Nov 2014 09:32:57 -0800 (PST) X-ASG-Debug-ID: 1415813576-04cbb00e68248b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sxscNffXbCoC9lAQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 09:32:56 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sACHWtR4032443 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 12 Nov 2014 12:32:55 -0500 Received: from hades.localdomain (ovpn-113-66.phx2.redhat.com [10.3.113.66]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sACHWnoW007062 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Wed, 12 Nov 2014 12:32:53 -0500 Date: Wed, 12 Nov 2014 15:32:48 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Cc: Brian Foster Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Message-ID: <20141112173245.GA32185@hades.localdomain> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Mail-Followup-To: xfs@oss.sgi.com, Brian Foster MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141111192922.GC38867@bfoster.bfoster> X-Mutt-References: <20141111192922.GC38867@bfoster.bfoster> X-Mutt-Fcc: ~/sent User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415813576 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi Brian > > { > > xfs_trans_t *tp = NULL; > > xfs_mount_t *mp = src_dp->i_mount; > > int new_parent; /* moving to a new dir */ > > int src_is_directory; /* src_name is a directory */ > > + int tgt_is_directory; > > There's an unused variable warning for this. Thanks for catching this!!! > > > int error; > > xfs_bmap_free_t free_list; > > xfs_fsblock_t first_block; > > @@ -2706,6 +2708,7 @@ xfs_rename( > > cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > > + > > if (error == -ENOSPC) { > > spaceres = 0; > > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > > @@ -2756,143 +2759,155 @@ xfs_rename( > > } > > > > /* > > - * Set up the target. > > - */ > > - if (target_ip == NULL) { > > + * Handle RENAME_EXCHANGE flags > > + */ > > + if (flags & RENAME_EXCHANGE) { > > + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > > target_dp, > > + target_name, target_ip, &free_list, > > + &first_block, spaceres); > > + if (error) > > + goto abort_return; { > > The factoring of xfs_rename() looks much better, but we could probably > avoid all the extra indentation in the else branch that follows by using > a label. It does look like that indentation creates a bunch of 80+ char > lines in xfs_rename(). E.g., something like: > > if (flags & RENAME_EXCHANGE) { > ... > goto complete_tp; > } > ... > complete_tp: > ... > return xfs_trans_commit(...); > > ... and then kill the else above and leave the rest of xfs_rename() as > is. I don't think it's a bad idea at all. I particularly don't like the use of labels for flow control like this, in this case though, it's a simple "skip this bunch of code", and I'd not object to use it, it would make the code more clear IMHO too. > > > /* > > - * If there's no space reservation, check the entry will > > - * fit before actually inserting it. > > + * Set up the target. > > */ > > - if (!spaceres) { > > - error = xfs_dir_canenter(tp, target_dp, target_name); > > - if (error) > > + if (target_ip == NULL) { > > + /* > > + * If there's no space reservation, check the entry will > > + * fit before actually inserting it. > > + */ > > + if (!spaceres) { > > + error = xfs_dir_canenter(tp, target_dp, target_name); > > + if (error) > > + goto error_return; > > + } > > + /* > > + * If target does not exist and the rename crosses > > + * directories, adjust the target directory link count > > + * to account for the ".." reference from the new entry. > > + */ > > + error = xfs_dir_createname(tp, target_dp, target_name, > > + src_ip->i_ino, > > &first_block, > > + &free_list, spaceres); > > + if (error == -ENOSPC) > > goto error_return; > > - } > > - /* > > - * If target does not exist and the rename crosses > > - * directories, adjust the target directory link count > > - * to account for the ".." reference from the new entry. > > - */ > > - error = xfs_dir_createname(tp, target_dp, target_name, > > - src_ip->i_ino, &first_block, > > - &free_list, spaceres); > > - if (error == -ENOSPC) > > - goto error_return; > > - if (error) > > - goto abort_return; > > + if (error) > > + goto abort_return; > > > > - xfs_trans_ichgtime(tp, target_dp, > > - XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > > + xfs_trans_ichgtime(tp, target_dp, > > + XFS_ICHGTIME_MOD | > > XFS_ICHGTIME_CHG); > > > > - if (new_parent && src_is_directory) { > > - error = xfs_bumplink(tp, target_dp); > > + if (new_parent && src_is_directory) { > > + error = xfs_bumplink(tp, target_dp); . . . > > +/* xfs_cross_rename() > > + * > > + * responsible to handle RENAME_EXCHANGE flag > > + * in renameat2() sytemcall > > + */ > > +int > > +xfs_cross_rename( > > xfs_cross_rename() is only used by xfs_rename() so it can be defined > static. Somewhat of a nit, but I'd also expect to see it implemented > above xfs_rename() as it is a helper for the latter. That could be a > matter of personal taste, however. Otherwise, just stick a declaration > at the top of the file. > I agree, as you said, although it's a matter of taste, making it static and moving it above xfs_rename() will save us from some extra code. . . . > > + /* > > + * Update ".." entry to match the new parents > > + * > > + * In case we are crossing different file types between different > > + * parents, we must update parent's link count to match the ".." > > + * entry of the new child (or the removal of it). > > + */ > > The logic of the subsequent block looks Ok to me, but I would probably > split up the comment to be more specific. Something like the following > just as an example: > > /* > * If we're renaming one or more directories across different parents, > * update the respective ".." entries (and link counts) to match the new > * parents. > */ Can't argue here, I'm not a native english speaker, so, it should be much more readable in this way than mine :) . . . > > + if (new_parent) { > > + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | > > XFS_ICHGTIME_CHG); > > Long line. > I think there is no reason to break this line. We should avoid 80+ columns per line, but it's not a must, break this line will hurt readability of the code in exchange of just a few chars more than 80. I don't think it's worth. . . . > > +out_abort: > > The name out_abort doesn't really mean much here. We don't abort > anything. Perhaps just 'out?' > Agree, it doesn't mean an abort anymore, remains of the integration of the old cross_rename version, 'out' is much better here. . . . > > @@ -340,7 +340,12 @@ int xfs_link(struct xfs_inode *tdp, struct > > xfs_inode *sip, > > int xfs_rename(struct xfs_inode *src_dp, struct xfs_name > > *src_name, > > struct xfs_inode *src_ip, struct xfs_inode > > *target_dp, > > struct xfs_name *target_name, > > - struct xfs_inode *target_ip); > > + struct xfs_inode *target_ip, unsigned int flags); > > +int xfs_cross_rename(struct xfs_trans *tp, struct xfs_inode > > *src_dp, > > + struct xfs_name *src_name, struct xfs_inode > > *src_ip, > > + struct xfs_inode *target_dp, struct xfs_name > > *target_name, > > + struct xfs_inode *target_ip,struct > > xfs_bmap_free *free_list, > > + xfs_fsblock_t *first_block, int spaceres); > > There's no need for this once xfs_cross_rename() is static. > > Brian > Will vanish on the next version as soon as I make it static Thanks the review Brian -- Carlos From cmaiolino@redhat.com Wed Nov 12 12:13:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2A9CB7F3F for ; Wed, 12 Nov 2014 12:13:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 177C48F8033 for ; Wed, 12 Nov 2014 10:13:21 -0800 (PST) X-ASG-Debug-ID: 1415816000-04cb6c1e6c246ce0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oUPkrnAO2ACvgTTZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 10:13:21 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sACIDKJE004145 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 12 Nov 2014 13:13:20 -0500 Received: from hades.localdomain.com (ovpn-113-66.phx2.redhat.com [10.3.113.66]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sACIDItL005401 for ; Wed, 12 Nov 2014 13:13:19 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V4 Date: Wed, 12 Nov 2014 16:13:01 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V4 Message-Id: <1415815983-5615-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415816000 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag V4 fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 15 ++++--- 3 files changed, 122 insertions(+), 7 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Wed Nov 12 12:13:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 462D97F47 for ; Wed, 12 Nov 2014 12:13:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2490D8F8035 for ; Wed, 12 Nov 2014 10:13:25 -0800 (PST) X-ASG-Debug-ID: 1415816003-04cbb00e6824ad30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id RK1FmUFTsXrPhWQf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 10:13:24 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sACIDNV8015754 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 12 Nov 2014 13:13:23 -0500 Received: from hades.localdomain.com (ovpn-113-66.phx2.redhat.com [10.3.113.66]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sACIDItN005401 for ; Wed, 12 Nov 2014 13:13:22 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V4 Date: Wed, 12 Nov 2014 16:13:03 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V4 Message-Id: <1415815983-5615-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415815983-5615-1-git-send-email-cmaiolino@redhat.com> References: <1415815983-5615-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415816004 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() V3: - fix indentation to avoid 80 column crossing, decrease the amount of arguments passed to xfs_cross_rename() - Rebase patches over the latest linux code v4: - use a label/goto statement instead of an if conditional after xfs_cross_rename() return, to finish the rename operation - Make xfs_cross_rename() static - Fix some comments Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 4 +- 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..8014041 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2668,6 +2668,102 @@ xfs_sort_for_rename( } } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +STATIC int +xfs_cross_rename( + xfs_trans_t *tp, + xfs_inode_t *src_dp, + struct xfs_name *src_name, + xfs_inode_t *src_ip, + xfs_inode_t *target_dp, + struct xfs_name *target_name, + xfs_inode_t *target_ip, + xfs_bmap_free_t *free_list, + xfs_fsblock_t *first_block, + int spaceres) +{ + int error = 0; + int new_parent; + int src_is_directory; + int tgt_is_directory; + + new_parent = (src_dp != target_dp); + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); + + /* Replace source inode */ + error = xfs_dir_replace(tp, src_dp, src_name, + target_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + /* Replace target inode */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * If we're renaming one or more directories across different parents, + * update the respective ".." entries (and link counts) to match the new + * parents. + */ + if (new_parent) { + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + if (tgt_is_directory) { + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, + src_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer target ".." reference to src_dp */ + if (!src_is_directory) { + error = xfs_droplink(tp, target_dp); + if (error) + goto out; + error = xfs_bumplink(tp, src_dp); + if (error) + goto out; + } + } + + if (src_is_directory) { + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer src ".." reference to target_dp */ + if (!tgt_is_directory) { + error = xfs_droplink(tp, src_dp); + if (error) + goto out; + error = xfs_bumplink(tp, target_dp); + if (error) + goto out; + } + } + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + } + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); + +out: + return error; +} + /* * xfs_rename */ @@ -2678,7 +2774,8 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; @@ -2706,6 +2803,7 @@ xfs_rename( cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); + if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); @@ -2756,6 +2854,17 @@ xfs_rename( } /* + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, target_dp, + target_name, target_ip, &free_list, + &first_block, spaceres); + if (error) + goto abort_return; + goto finish_rename; + } + /* * Set up the target. */ if (target_ip == NULL) { @@ -2894,6 +3003,7 @@ xfs_rename( if (new_parent) xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); +finish_rename: /* * If this is a synchronous mount, make sure that the * rename transaction goes to disk before returning to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..051d9f0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0b8704c..481ae10 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -391,7 +391,7 @@ xfs_vn_rename( struct xfs_name nname; /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; xfs_dentry_to_name(&oname, odentry, 0); @@ -399,7 +399,7 @@ xfs_vn_rename( return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From cmaiolino@redhat.com Wed Nov 12 12:13:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F0CD17F56 for ; Wed, 12 Nov 2014 12:13:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87E33AC008 for ; Wed, 12 Nov 2014 10:13:23 -0800 (PST) X-ASG-Debug-ID: 1415816001-04cbb00e6924ad20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rwtqbAUNFeUFEdqA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 10:13:22 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sACIDLD2001158 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 12 Nov 2014 13:13:21 -0500 Received: from hades.localdomain.com (ovpn-113-66.phx2.redhat.com [10.3.113.66]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sACIDItM005401 for ; Wed, 12 Nov 2014 13:13:20 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Wed, 12 Nov 2014 16:13:02 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1415815983-5615-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415815983-5615-1-git-send-email-cmaiolino@redhat.com> References: <1415815983-5615-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415816002 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0b8704c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From axboe@kernel.dk Wed Nov 12 12:18:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3A5C07F3F for ; Wed, 12 Nov 2014 12:18:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18737304064 for ; Wed, 12 Nov 2014 10:18:25 -0800 (PST) X-ASG-Debug-ID: 1415816304-04bdf0650c27d750001-NocioJ Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id p5usgscyFPy0gtzG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 12 Nov 2014 10:18:24 -0800 (PST) X-Barracuda-Envelope-From: axboe@kernel.dk X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.177 Received: by mail-pd0-f177.google.com with SMTP id v10so12612183pde.22 for ; Wed, 12 Nov 2014 10:18:24 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type :content-transfer-encoding; bh=Fln5JSu3EAAMZmckiXNxTc1PFJTRkVblblkBPwlsS1A=; b=A2UbGCQqRgLpa6Jn/CrA9qDrxz9Q/1WVHXpEtcRva95zWqQSNzOPFsOjJZbyE6l2XP Eg7V6eYor4jllDfZFZbp9mf3j7Ye7WwdbQqSJoZefjZdw4o/GDzKU36qmymu+TzscpZv NM/R8nLNw3GDPajOgj7/zhr37oXxPQ7IAni+IxsUVCsDKC4wNsGUAwXElOOlxJd5iz6F uFRES2wH3GCMaRkyUWbyEZF0cWufOiipnMRa/APg1VVV3pwe9JOheIqiAb+1GsjDTIe7 EjHZ/7H9VrN914wDwe4t7Mh+OyXL6ejuaXosqazTM7E/3uyRlQpzTpduUrZ29hSjePDJ GDmA== X-Barracuda-BBL-IP: nil X-Gm-Message-State: ALoCoQnoByuxhyrYJAN3eEqt84h+NfmVRBcdqNVc2vLlLNTfq/OR+PgxVeAgu7RbVc0c32Yxw1NF X-Received: by 10.70.92.169 with SMTP id cn9mr7190222pdb.117.1415816304353; Wed, 12 Nov 2014 10:18:24 -0800 (PST) Received: from [192.168.3.12] (66.29.187.51.static.utbb.net. [66.29.187.51]) by mx.google.com with ESMTPSA id l16sm2331356pbq.96.2014.11.12.10.18.22 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Nov 2014 10:18:23 -0800 (PST) Message-ID: <5463A478.20603@kernel.dk> Date: Wed, 12 Nov 2014 11:18:32 -0700 From: Jens Axboe User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Ming Lei , Dongsu Park CC: "Michael S. Tsirkin" , Dave Chinner , xfs@oss.sgi.com, Jeff Layton , Rusty Russell , Lukas Czerner , Christoph Hellwig , Linux Virtualization Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> <54614AE7.2080204@kernel.dk> <20141111154250.GA16906@gmail.com> X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pd0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1415816304 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11519 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/11/2014 09:42 AM, Ming Lei wrote: > The attached patch should fix the problem, and hope it is the last one, :-) Dongsu and Jeff, any of you test this variant? I think this is the last one, at least I hope so as well... -- Jens Axboe From sandeen@sandeen.net Wed Nov 12 12:57:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 924137F3F for ; Wed, 12 Nov 2014 12:57:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7EDF18F8035 for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-ASG-Debug-ID: 1415818640-04cbb00e6924cd10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id lc8iEyAWaXvqGbEr for ; Wed, 12 Nov 2014 10:57:20 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 2830563BE1F4; Wed, 12 Nov 2014 12:57:19 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 0/9] Random xfsdump fixes Date: Wed, 12 Nov 2014 12:57:09 -0600 X-ASG-Orig-Subj: [PATCH 0/9] Random xfsdump fixes Message-Id: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818640 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is the result of needing some mindless work and going through coverity errors. It knocks out about 30 issues. Tested w/ xfstests, -g dump. -Eric From sandeen@sandeen.net Wed Nov 12 12:57:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CAF767F3F for ; Wed, 12 Nov 2014 12:57:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B98F5304043 for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-ASG-Debug-ID: 1415818641-04cb6c1e6d2489e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZxHaHSYnTVwGwSam for ; Wed, 12 Nov 2014 10:57:21 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 06F9D63BE1F7; Wed, 12 Nov 2014 12:57:21 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 3/9] xfsdump: fix wrong test for hard stack limit change failure Date: Wed, 12 Nov 2014 12:57:12 -0600 X-ASG-Orig-Subj: [PATCH 3/9] xfsdump: fix wrong test for hard stack limit change failure Message-Id: <1415818638-32700-4-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818641 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11522 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We test if ( rlimit64.rlim_cur < minstacksz ) to see whether we failed to increase rlimit64.rlim_max? Weird. Fix it. (Granted, we raise both cur and max together, but it's odd to test one, and report the other). Signed-off-by: Eric Sandeen --- common/main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/common/main.c b/common/main.c index 8e7451f..326f801 100644 --- a/common/main.c +++ b/common/main.c @@ -2077,7 +2077,7 @@ set_rlimits( size64_t *vmszp ) ( void )setrlimit64( RLIMIT_STACK, &rlimit64 ); rval = getrlimit64( RLIMIT_STACK, &rlimit64 ); ASSERT( ! rval ); - if ( rlimit64.rlim_cur < minstacksz ) { + if ( rlimit64.rlim_max < minstacksz ) { mlog( MLOG_NORMAL | MLOG_WARNING -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0323A7F47 for ; Wed, 12 Nov 2014 12:57:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 94F7CAC00A for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-ASG-Debug-ID: 1415818641-04bdf0650d27f1d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4thi5fjtssOx1I5k for ; Wed, 12 Nov 2014 10:57:21 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id A205963BE1F6; Wed, 12 Nov 2014 12:57:20 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 2/9] xfsdump: Fix overflow of "question" string in Media_prompt_erase() Date: Wed, 12 Nov 2014 12:57:11 -0600 X-ASG-Orig-Subj: [PATCH 2/9] xfsdump: Fix overflow of "question" string in Media_prompt_erase() Message-Id: <1415818638-32700-3-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818641 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The string we were sprintf'ing is trivially longer than the array we allocated for it. Allocate something big enough, and snprintf to avoid overflow Signed-off-by: Eric Sandeen --- dump/content.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dump/content.c b/dump/content.c index ac19021..786fc52 100644 --- a/dump/content.c +++ b/dump/content.c @@ -6174,7 +6174,7 @@ static bool_t Media_prompt_overwrite( drive_t *drivep ) { fold_t fold; - char question[ 100 ]; + char question[ 110 ]; char *preamblestr[ PREAMBLEMAX ]; size_t preamblecnt; char *querystr[ QUERYMAX ]; @@ -6201,7 +6201,7 @@ retry: /* query: ask if overwrite ok */ - sprintf( question, + snprintf( question, sizeof(question), "overwrite data on media in " "drive %u?\n", (unsigned int)drivep->d_index ); -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 157B97F3F for ; Wed, 12 Nov 2014 12:57:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 045D9304066 for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-ASG-Debug-ID: 1415818642-04cbb00e6624cd10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VblXDP4HUcMsWetg for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 0A03A63BE1F4; Wed, 12 Nov 2014 12:57:22 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 6/9] xfsdump: free suboptstrs if mlog_init1 fails Date: Wed, 12 Nov 2014 12:57:15 -0600 X-ASG-Orig-Subj: [PATCH 6/9] xfsdump: free suboptstrs if mlog_init1 fails Message-Id: <1415818638-32700-7-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818642 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 suboptstrs was never freed on error paths. Signed-off-by: Eric Sandeen --- common/mlog.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-) diff --git a/common/mlog.c b/common/mlog.c index b0135b9..f1fa12f 100644 --- a/common/mlog.c +++ b/common/mlog.c @@ -149,6 +149,7 @@ mlog_init1( intgen_t argc, char *argv[ ] ) ix_t soix; size_t vsymcnt; intgen_t c; + bool_t retval = BOOL_FALSE; /* Until proven otherwise */ /* prepare an array of suboption token strings. this will be the * concatenation of the subsystem names with the verbosity symbols. @@ -192,7 +193,7 @@ mlog_init1( intgen_t argc, char *argv[ ] ) progname, c ); usage( ); - return BOOL_FALSE; + goto out_free; } options = optarg; while ( *options ) { @@ -208,7 +209,7 @@ mlog_init1( intgen_t argc, char *argv[ ] ) progname, c ); usage( ); - return BOOL_FALSE; + goto out_free; } ASSERT( ( ix_t )suboptix < @@ -224,7 +225,7 @@ mlog_init1( intgen_t argc, char *argv[ ] ) c, mlog_ss_names[ suboptix ] ); usage( ); - return BOOL_FALSE; + goto out_free; } ssix = ( ix_t )suboptix; mlog_level_ss[ ssix ] = @@ -238,7 +239,7 @@ mlog_init1( intgen_t argc, char *argv[ ] ) progname, c ); usage( ); - return BOOL_FALSE; + goto out_free; } ssix = MLOG_SS_GEN; mlog_level_ss[ ssix ] = @@ -251,7 +252,7 @@ mlog_init1( intgen_t argc, char *argv[ ] ) progname, c ); usage( ); - return BOOL_FALSE; + goto out_free; } } break; @@ -267,8 +268,6 @@ mlog_init1( intgen_t argc, char *argv[ ] ) } } - free( ( void * )suboptstrs ); - /* give subsystems not explicitly called out the "general" verbosity */ for ( ssix = 0 ; ssix < MLOG_SS_CNT ; ssix++ ) { @@ -301,7 +300,11 @@ mlog_init1( intgen_t argc, char *argv[ ] ) mlog_qlockh = QLOCKH_NULL; - return BOOL_TRUE; + retval = BOOL_TRUE; + +out_free: + free( ( void * )suboptstrs ); + return retval; } bool_t -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 342517F50 for ; Wed, 12 Nov 2014 12:57:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 123BF8F8035 for ; Wed, 12 Nov 2014 10:57:23 -0800 (PST) X-ASG-Debug-ID: 1415818641-04cbb00e6724cd10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id YIB3sFqKVqTauxZm for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id A770B63BE1FB; Wed, 12 Nov 2014 12:57:21 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 5/9] xfsdump: remove some unreachable code Date: Wed, 12 Nov 2014 12:57:14 -0600 X-ASG-Orig-Subj: [PATCH 5/9] xfsdump: remove some unreachable code Message-Id: <1415818638-32700-6-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818641 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- in create_windows() we assign INFO_SIZE (which is defined to 4) to the infosize variable, then test whether it is <= 0. Remove the pointless test. in tsi_cmd_ls(), inside a if ( ! isdirpr ) block, we test whether isdirpr might be true... remove it. Signed-off-by: Eric Sandeen --- invutil/cmenu.c | 2 -- restore/tree.c | 5 ++--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/invutil/cmenu.c b/invutil/cmenu.c index ff4abef..c4747b0 100644 --- a/invutil/cmenu.c +++ b/invutil/cmenu.c @@ -555,8 +555,6 @@ create_windows() menusize, COLS - 1); infosize = INFO_SIZE; - if(infosize <= 0) - infosize = 1; infowin = newwin(infosize, COLS, menusize + 1, 0); keypad(infowin, TRUE); diff --git a/restore/tree.c b/restore/tree.c index fda4fc5..21d3880 100644 --- a/restore/tree.c +++ b/restore/tree.c @@ -2905,11 +2905,10 @@ tsi_cmd_ls( void *ctxp, */ if ( ! isdirpr ) { ( * pcb )( pctxp, - " %s %10llu %s%s\n", + " %s %10llu %s\n", isselpr ? "*" : " ", ino, - tranp->t_inter.i_name, - isdirpr ? "/" : " " ); + tranp->t_inter.i_name); return; } -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 35E637F51 for ; Wed, 12 Nov 2014 12:57:23 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 248B1304043 for ; Wed, 12 Nov 2014 10:57:23 -0800 (PST) X-ASG-Debug-ID: 1415818641-04cb6c1e6c2489e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cF1w5IKX0jRwc7s1 for ; Wed, 12 Nov 2014 10:57:21 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 582F263BE1F9; Wed, 12 Nov 2014 12:57:21 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 4/9] xfsdump: remove pointless if (dirty); Date: Wed, 12 Nov 2014 12:57:13 -0600 X-ASG-Orig-Subj: [PATCH 4/9] xfsdump: remove pointless if (dirty); Message-Id: <1415818638-32700-5-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818641 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11522 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- "dirty" seems to be a remnant of unfinished code; other bits of it are there but commented out, so comment out "if (dirty);" as well, which is a no-op if statement which can't be true. Signed-off-by: Eric Sandeen --- inventory/inv_stobj.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c index becac17..84b15d9 100644 --- a/inventory/inv_stobj.c +++ b/inventory/inv_stobj.c @@ -976,7 +976,9 @@ stobj_delete_mobj(int fd, } free ( mfiles ); +/* if ( dirty ); +*/ } free ( strms ); -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BCC3C7F47 for ; Wed, 12 Nov 2014 12:57:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AB4F8304043 for ; Wed, 12 Nov 2014 10:57:23 -0800 (PST) X-ASG-Debug-ID: 1415818642-04cbb00e6624cd10002-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 1Pw35NChj245xujq for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id E240C63BE1F4; Wed, 12 Nov 2014 12:57:22 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 9/9] xfsdump: fix uninit ackstr in content_mediachange_query() Date: Wed, 12 Nov 2014 12:57:18 -0600 X-ASG-Orig-Subj: [PATCH 9/9] xfsdump: fix uninit ackstr in content_mediachange_query() Message-Id: <1415818638-32700-10-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818642 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today, this sends an uninitialized ackstr[0] to be mlog'd - who knows what we get out of it. Other places follow this "count = 0, string = "\n"" pattern which seemsa bit odd, but better than printing uninitialized memory. To be completely honest, I have no test for this. Signed-off-by: Eric Sandeen --- restore/content.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/restore/content.c b/restore/content.c index c99aed7..bc5b398 100644 --- a/restore/content.c +++ b/restore/content.c @@ -2915,6 +2915,7 @@ content_mediachange_query( void ) bagp = 0; } ackcnt = 0; + ackstr[ ackcnt++ ] = "\n"; dlog_multi_ack( ackstr, ackcnt ); querycnt = 0; -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1EBDF7F4E for ; Wed, 12 Nov 2014 12:57:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3104304043 for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-ASG-Debug-ID: 1415818640-04bdf0650f27f1d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id iIMubdX1mPwG35AQ for ; Wed, 12 Nov 2014 10:57:20 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 5441763BE1F5; Wed, 12 Nov 2014 12:57:20 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 1/9] xfsdump: don't try to close fd from failed open Date: Wed, 12 Nov 2014 12:57:10 -0600 X-ASG-Orig-Subj: [PATCH 1/9] xfsdump: don't try to close fd from failed open Message-Id: <1415818638-32700-2-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818640 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I was going to just return if open() fails, but realized that failing ioctls on the not-opened fd are ... maybe intentional? By trying to run the ioctls on the invalid fd, it actually spits useful error messages to the log, so... Signed-off-by: Eric Sandeen --- restore/tree.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/restore/tree.c b/restore/tree.c index 08e177f..fda4fc5 100644 --- a/restore/tree.c +++ b/restore/tree.c @@ -2626,7 +2626,8 @@ setdirattr( dah_t dah, char *path ) path, strerror(errno)); } - ( void )close( fd ); + if (fd >= 0) + close( fd ); } /* deletes orphanage if empty, else warns -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F24237F4E for ; Wed, 12 Nov 2014 12:57:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D24618F8040 for ; Wed, 12 Nov 2014 10:57:24 -0800 (PST) X-ASG-Debug-ID: 1415818642-04cb6c1e6a2489e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id S8NfZfg7yVCODgpA for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 4F17563BE1F5; Wed, 12 Nov 2014 12:57:22 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 7/9] xfsdump: free allocated persistent paths Date: Wed, 12 Nov 2014 12:57:16 -0600 X-ASG-Orig-Subj: [PATCH 7/9] xfsdump: free allocated persistent paths Message-Id: <1415818638-32700-8-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818642 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11522 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words "perspath" gets allocated by open_pathalloc, and haphazardly freed at best; almost never on errors, often not on success. While we're in there, fix a few leaked fd's as well. Signed-off-by: Eric Sandeen --- restore/content.c | 2 ++ restore/inomap.c | 11 +++++++++++ restore/tree.c | 9 +++++++++ 3 files changed, 22 insertions(+), 0 deletions(-) diff --git a/restore/content.c b/restore/content.c index cfcf94d..c99aed7 100644 --- a/restore/content.c +++ b/restore/content.c @@ -1342,6 +1342,7 @@ content_init( intgen_t argc, char *argv[ ], size64_t vmsz ) "could not open/create persistent state file %s: %s\n"), perspath, strerror( errno )); + free(perspath); return BOOL_FALSE; } @@ -1356,6 +1357,7 @@ content_init( intgen_t argc, char *argv[ ], size64_t vmsz ) "could not map persistent state file hdr %s: %s\n"), perspath, strerror( errno )); + free(perspath); return BOOL_FALSE; } diff --git a/restore/inomap.c b/restore/inomap.c index 562492e..1976017 100644 --- a/restore/inomap.c +++ b/restore/inomap.c @@ -217,6 +217,7 @@ inomap_restore_pers( drive_t *drivep, "could not open %s: %s\n"), perspath, strerror( errno )); + free(perspath); return RV_ERROR; } @@ -233,6 +234,8 @@ inomap_restore_pers( drive_t *drivep, "unable to map %s: %s\n"), perspath, strerror( errno )); + close(fd); + free(perspath); return RV_ERROR; } @@ -363,6 +366,7 @@ inomap_sync_pers( char *hkdir ) perspath = open_pathalloc( hkdir, PERS_NAME, 0 ); pers_fd = open( perspath, O_RDWR ); if ( pers_fd < 0 ) { + free(perspath); return BOOL_TRUE; } @@ -377,6 +381,8 @@ inomap_sync_pers( char *hkdir ) "unable to map %s hdr: %s\n"), perspath, strerror( errno )); + close(pers_fd); + free(perspath); return BOOL_FALSE; } @@ -398,9 +404,14 @@ inomap_sync_pers( char *hkdir ) "unable to map %s: %s\n"), perspath, strerror( errno )); + close(pers_fd); + free(perspath); return BOOL_FALSE; } + close(pers_fd); + free(perspath); + /* correct the next pointers */ for ( hnkp = roothnkp diff --git a/restore/tree.c b/restore/tree.c index 21d3880..011fa44 100644 --- a/restore/tree.c +++ b/restore/tree.c @@ -420,6 +420,7 @@ tree_init( char *hkdir, "could not open %s: %s\n"), perspath, strerror( errno )); + free(perspath); return BOOL_FALSE; } @@ -435,6 +436,7 @@ tree_init( char *hkdir, "unable to map %s: %s\n"), perspath, strerror( errno )); + free(perspath); return BOOL_FALSE; } @@ -443,9 +445,12 @@ tree_init( char *hkdir, */ ok = hash_init( vmsz / HASHSZ_PERVM, dircnt, nondircnt, perspath ); if ( ! ok ) { + free(perspath); return BOOL_FALSE; } + free(perspath); + /* initialize the node abstraction. let it's use of backing store * begin immediately after the hash abstraction. give it the remainder * of vm. @@ -595,6 +600,7 @@ tree_sync( char *hkdir, "could not open %s: %s\n"), perspath, strerror( errno )); + free(perspath); return BOOL_FALSE; } @@ -610,6 +616,7 @@ tree_sync( char *hkdir, "unable to map %s: %s\n"), perspath, strerror( errno )); + free(perspath); return BOOL_FALSE; } @@ -632,9 +639,11 @@ tree_sync( char *hkdir, */ ok = hash_sync( perspath ); if ( ! ok ) { + free(perspath); return BOOL_FALSE; } + free(perspath); /* synchronize with the node abstraction. */ ASSERT( persp->p_hashsz <= ( size64_t )( OFF64MAX - ( off64_t )PERSSZ)); -- 1.7.1 From sandeen@sandeen.net Wed Nov 12 12:57:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C0987F63 for ; Wed, 12 Nov 2014 12:57:25 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2A43D8F8039 for ; Wed, 12 Nov 2014 10:57:25 -0800 (PST) X-ASG-Debug-ID: 1415818642-04cb6c1e6d2489f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id g1QcsMuDFMFGEs2k for ; Wed, 12 Nov 2014 10:57:22 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 9B54763BE1F6; Wed, 12 Nov 2014 12:57:22 -0600 (CST) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 8/9] xfsdump: children[] is an array of child pointers, not of child structures Date: Wed, 12 Nov 2014 12:57:17 -0600 X-ASG-Orig-Subj: [PATCH 8/9] xfsdump: children[] is an array of child pointers, not of child structures Message-Id: <1415818638-32700-9-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1415818638-32700-1-git-send-email-sandeen@redhat.com> References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415818642 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11522 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- node_t **children; /* child nodes */ so allocating space to hold nbr_children structures is wrong; we need to hold nbr_children _pointers_ to child structures. It's over-allocating, so it's relatively harmless. Signed-off-by: Eric Sandeen --- invutil/list.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/invutil/list.c b/invutil/list.c index 0157102..599e6af 100644 --- a/invutil/list.c +++ b/invutil/list.c @@ -34,7 +34,7 @@ parent_add_child(node_t *parent, node_t *child) d = parent->data; d->nbr_children++; - d->children = realloc(d->children, d->nbr_children * sizeof(*child)); + d->children = realloc(d->children, d->nbr_children * sizeof(node_t *)); d->children[d->nbr_children - 1] = child; return parent; -- 1.7.1 From BATV+9a998f02e1e1a47d93de+4098+infradead.org+hch@bombadil.srs.infradead.org Wed Nov 12 12:58:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C1707F3F for ; Wed, 12 Nov 2014 12:58:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DEB99304043 for ; Wed, 12 Nov 2014 10:58:46 -0800 (PST) X-ASG-Debug-ID: 1415818725-04bdf0650e27f320001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id GpM3K1S9jfNOnkDg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 10:58:45 -0800 (PST) X-Barracuda-Envelope-From: BATV+9a998f02e1e1a47d93de+4098+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xod7t-0006hk-Mv; Wed, 12 Nov 2014 18:58:45 +0000 Date: Wed, 12 Nov 2014 10:58:45 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfsdump: Fix overflow of "question" string in Media_prompt_erase() Message-ID: <20141112185845.GA24616@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfsdump: Fix overflow of "question" string in Media_prompt_erase() References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-3-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415818638-32700-3-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1415818725 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 12, 2014 at 12:57:11PM -0600, Eric Sandeen wrote: > The string we were sprintf'ing is trivially longer than the array > we allocated for it. > > Allocate something big enough, and snprintf to avoid overflow How about switching it to asprintf() to get rid of that dangerous static buffer entirely? From sandeen@sandeen.net Wed Nov 12 13:05:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B5F227F55 for ; Wed, 12 Nov 2014 13:05:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A403C8F8033 for ; Wed, 12 Nov 2014 11:05:34 -0800 (PST) X-ASG-Debug-ID: 1415819131-04cbb00e6624d320001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id a9EGHLq02BpKcPrm for ; Wed, 12 Nov 2014 11:05:31 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8CAC163BE1F4; Wed, 12 Nov 2014 13:05:31 -0600 (CST) Message-ID: <5463AF7A.8040006@sandeen.net> Date: Wed, 12 Nov 2014 13:05:30 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs@oss.sgi.com Subject: [PATCH 2/9 V2] xfsdump: Fix overflow of "question" string in Media_prompt_erase() References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-3-git-send-email-sandeen@redhat.com> X-ASG-Orig-Subj: [PATCH 2/9 V2] xfsdump: Fix overflow of "question" string in Media_prompt_erase() In-Reply-To: <1415818638-32700-3-git-send-email-sandeen@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415819131 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The string we were sprintf'ing is trivially longer than the array we allocated for it. Use asprintf instead, as suggested by Christoph. Signed-off-by: Eric Sandeen --- V2: use asprintf diff --git a/dump/content.c b/dump/content.c index ac19021..43756e3 100644 --- a/dump/content.c +++ b/dump/content.c @@ -6174,7 +6174,7 @@ static bool_t Media_prompt_overwrite( drive_t *drivep ) { fold_t fold; - char question[ 100 ]; + char *question; char *preamblestr[ PREAMBLEMAX ]; size_t preamblecnt; char *querystr[ QUERYMAX ]; @@ -6201,9 +6201,8 @@ retry: /* query: ask if overwrite ok */ - sprintf( question, - "overwrite data on media in " - "drive %u?\n", + asprintf( &question, + "overwrite data on media in drive %u?\n", (unsigned int)drivep->d_index ); querycnt = 0; querystr[ querycnt++ ] = question; @@ -6250,6 +6249,8 @@ retry: dlog_end( postamblestr, postamblecnt ); + free(question); + if ( responseix == sigintix ) { if ( cldmgr_stop_requested( )) { return BOOL_FALSE; From bfoster@redhat.com Wed Nov 12 13:38:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 27CE27F3F for ; Wed, 12 Nov 2014 13:38:07 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4C54AC00B for ; Wed, 12 Nov 2014 11:38:03 -0800 (PST) X-ASG-Debug-ID: 1415821082-04bdf0650d2810c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8DKaHMrcxbmCkmgy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 11:38:03 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sACJbsux021544 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 12 Nov 2014 14:37:54 -0500 Received: from laptop.bfoster (vpn-61-102.rdu2.redhat.com [10.10.61.102]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sACJbpuU023575 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Wed, 12 Nov 2014 14:37:53 -0500 Date: Wed, 12 Nov 2014 14:37:51 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq Message-ID: <20141112193751.GA2118@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq References: <1415722393-32223-1-git-send-email-bfoster@redhat.com> <20141111231246.GT28565@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141111231246.GT28565@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415821082 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Nov 12, 2014 at 10:12:46AM +1100, Dave Chinner wrote: > On Tue, Nov 11, 2014 at 11:13:13AM -0500, Brian Foster wrote: > > The xfslogd workqueue is a global, single-job workqueue for buffer ioend > > processing. This means we allow for a single work item at a time for all > > possible XFS mounts on a system. fsstress testing in loopback XFS over > > XFS configurations has reproduced xfslogd deadlocks due to the single > > threaded nature of the queue and dependencies introduced between the > > separate XFS instances by online discard (-o discard). > > > > Discard over a loopback device converts the discard request to a hole > > punch (fallocate) on the underlying file. Online discard requests are > > issued synchronously and from xfslogd context in XFS, hence the xfslogd > > workqueue is blocked in the upper fs waiting on a hole punch request to > > be servied in the lower fs. If the lower fs issues I/O that depends on > > xfslogd to complete, both filesystems end up hung indefinitely. This is > > reproduced reliabily by generic/013 on XFS->loop->XFS test devices with > > the '-o discard' mount option. > > > > Further, docker implementations appear to use this kind of configuration > > for container instance filesystems by default (container fs->dm-> > > loop->base fs) and therefore are subject to this deadlock when running > > on XFS. > > > > Replace the global xfslogd workqueue with a per-mount variant. This > > guarantees each mount access to a single worker and prevents deadlocks > > due to inter-fs dependencies introduced by discard. Since the queue is > > only responsible for iodone processing at this point in time, rename > > xfslogd to xfs-iodone. > > > > Signed-off-by: Brian Foster > > --- > > > > I've left the wq in xfs_mount rather than moved to the buftarg in this > > version due to the questions expressed here: > > > > http://oss.sgi.com/archives/xfs/2014-11/msg00117.html > > > > Another email from you that hasn't reached my inbox. That's two in a > week now, I think. > > > ... particularly around the potential creation of multiple (of what is > > now) max_active=1 queues per-fs. > > So concern #1 is that it splits log buffer versus metadata buffer > processing to different work queues causing concurrent processing. > > I see no problem there - the io completions have different iodone > processing functions that mostly don't intersect. As it is, the > "max-active=1" means 1 work item being processed per CPU, not "only > one queue" (you need to use alloc_ordered_workqueue() to only > get one queue). So there is already concurrency in the processing of > io completions and hence I don't see any problem with separating > the log iodone completions from the metadata iodone completions. > Ah, I see. I misinterpreted the meaning of max_active. It's not a pure concurrency limiter as such... moreso a limiter of scheduling multiple active work items on a particular cpu. The workqueue.txt doc explains it. That rules out the question that this change introduces concurrency. > Further, it might be work considering pushing the log buffer > completions to the m_log_workqueue rather than using a buftarg based > workqueue so that they are always separated from the rest of the > metadata completions regardless of whether we have an internal or > external log device. > Seems reasonable at first glance. I do like the side effect of consistent behavior. I'll look into it. > The xfslogd workqueue is tagged with WQ_HIGHPRI only to expedite the > log buffer io completions over XFS data io completions that may get > stuck waiting on log forces. i.e. the xfslogd_workqueue needs > higher priority than m_data_workqueue and m_unwritten_workqueue as > they can require log forces to complete their work. Hence if we > separate out the log buffer io completion processing from the > metadata IO completion processing we don't need to process all the > metadata buffer IO completion as high priority work anymore. > Ok, thanks. I didn't notice an explicit relationship between either of those queues and xfslogd. Is the dependency implicit in that those queues do transaction reservations, and thus can push on the log via the AIL (and if so, why wouldn't the cil queue be higher priority as well)? > Concern #2 is about the reason for max_active=1 and being unclear as > to why we only want a single completion active at a time on a CPU. > The reason for this is that most metadata and log buffer IO > completion work does not sleep - they > only ever take spinlocks and so there are no built in schedule > points during work processing. Hence it is rare to need a second > worker thread to process the queue because the first is blocked > on a sleeping lock and so max-active=1 makes sense. In comparison, > the data/unwritten io completion processing is very > different due to needing to take sleeping inode locks, buffer locks, > etc) and hence they use the wq default for max active (512). > Ok, max_active sounds more like a hint to the workqueue infrastructure in this usage. E.g., there's no hard rule against activation of more than one item, it's just of questionable value. > So, really, a log workqueue with WQ_HIGHPRI, max_active = 1 and a > buffer IO completion workqueue with just max_active = 1 would > probably be fine. > Thanks for the explanation. Brian > .... > > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > > index 9f622fe..ef55264 100644 > > --- a/fs/xfs/xfs_super.c > > +++ b/fs/xfs/xfs_super.c > > @@ -842,10 +842,16 @@ STATIC int > > xfs_init_mount_workqueues( > > struct xfs_mount *mp) > > { > > + mp->m_iodone_workqueue = alloc_workqueue("xfs-iodone/%s", > > + WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_FREEZABLE, 1, > > + mp->m_fsname); > > + if (!mp->m_iodone_workqueue) > > + goto out; > > m_buf_workqueue would be better, because... > > > + > > mp->m_data_workqueue = alloc_workqueue("xfs-data/%s", > > That's also an "iodone" workqueue for data IO, and ... > > > WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); > > if (!mp->m_data_workqueue) > > - goto out; > > + goto out_destroy_iodone; > > > > mp->m_unwritten_workqueue = alloc_workqueue("xfs-conv/%s", > > That's another an "iodone" workqueue for data IO that needs unwritten > extent conversion.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From xfs@tlinx.org Wed Nov 12 13:56:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DA8D57F3F for ; Wed, 12 Nov 2014 13:56:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 746B2AC008 for ; Wed, 12 Nov 2014 11:56:12 -0800 (PST) X-ASG-Debug-ID: 1415822164-04bdf0650c281dc0001-NocioJ Received: from Ishtar.hs.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id 7mlbIKQeYo4zXxdx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 11:56:05 -0800 (PST) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.4.12] (Athenae [192.168.4.12]) by Ishtar.hs.tlinx.org (8.14.7/8.14.4/SuSE Linux 0.8) with ESMTP id sACJu2tf029512 for ; Wed, 12 Nov 2014 11:56:04 -0800 Message-ID: <5463BB52.3080601@tlinx.org> Date: Wed, 12 Nov 2014 11:56:02 -0800 From: L Walsh User-Agent: Thunderbird MIME-Version: 1.0 To: xfs-oss Subject: Fwd: multiple processes hanging doing xfs ops -- 3.17.2 Content-Type: multipart/mixed; boundary="------------060205090002040702080705" X-ASG-Orig-Subj: Fwd: multiple processes hanging doing xfs ops -- 3.17.2 X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1415822165 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.24 X-Barracuda-Spam-Status: No, SCORE=1.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FRT_LEVITRA, FUZZY_VPILL, UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11524 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FUZZY_VPILL BODY: Attempt to obfuscate words in spam 0.74 FRT_LEVITRA BODY: ReplaceTags: Levitra 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase This is a multi-part message in MIME format. --------------060205090002040702080705 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit I just upped from 3.16.2 to 3.17.2 this morning, and after about 2 hours uptime, got several procs hanging in what looks like xfs territory. Watched load slowing climb to about 16 as I was trying to bring it down 'gracefully'.. Last message looked like a disk controller message -- maybe it blocked other processes, except sendmail should be running off a different controller (built-in controller handling system disks), while other procs would have been accessing 2nd controller -- actually it looks like xfsdump was trying to run too, so it could have been accessing both controllers (backup disks are on 2nd controller, but if backing up system disks...).. Attached are the call-traces from the hung tasks before the system came down, Also attached is my .config file. Looks a bit peculiar ... any ideas? --------------060205090002040702080705 Content-Type: text/plain; name="lines" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="lines" Ck5vdiAxMiAwMzoyNDoyOCBJc2h0YXIga2VybmVsOiBbIDExMjMuNTYyMzMyXSBwZXJmIGlu dGVycnVwdCB0b29rIHRvbyBsb25nICgyNTAyID4gMjUwMCksIGxvd2VyaW5nIGtlcm5lbC5w ZXJmX2V2ZW50X21heF9zYW1wbGVfcmF0ZSB0byA1MDAwMApOb3YgMTIgMDQ6NDE6NDYgSXNo dGFyIGtlcm5lbDogWyA1NzY2LjM2MjYzN10gSU5GTzogdGFzayBzZW5kbWFpbDozODUwOCBi bG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuCk5vdiAxMiAwNDo0MTo0NiBJc2h0 YXIga2VybmVsOiBbIDU3NjYuMzY5MzYyXSAgICAgICBOb3QgdGFpbnRlZCAzLjE3LjItSXNo dC1WYW4gIzEKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zNzM5ODRd ICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRp c2FibGVzIHRoaXMgbWVzc2FnZS4KTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsg NTc2Ni4zODE4NDJdICBmZmZmODgwZjIyMWQ3NzAwIDAwMDAwMDAwMDAwMDAwNDYgZmZmZjg4 MGE4ZjE2YTUxMCBmZmZmODgwZjIyMWQ3ZmQ4Ck5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2Vy bmVsOiBbIDU3NjYuMzgxODQ0XSAgMDAwMDAwMDAwMDFkM2I0MCAwMDAwMDAwMDAwMWQzYjQw IGZmZmY4ODE3ZmJjYTRhMjAgZmZmZjg4MGE4ZjE2YTUxMApOb3YgMTIgMDQ6NDE6NDYgSXNo dGFyIGtlcm5lbDogWyA1NzY2LjM4MTg0N10gIDdmZmZmZmZmZmZmZmZmZmYgZmZmZjg4MGJm Nzk2ZDM3MCAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMDAKTm92IDEyIDA0OjQx OjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE4NDhdIENhbGwgVHJhY2U6Ck5vdiAxMiAw NDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgxODU2XSAgWzxmZmZmZmZmZjgxNjBj ZWE0Pl0gc2NoZWR1bGUrMHgyNC8weDcwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVs OiBbIDU3NjYuMzgxODU5XSAgWzxmZmZmZmZmZjgxNjExNDA5Pl0gc2NoZWR1bGVfdGltZW91 dCsweDIzOS8weDJjMApOb3YgMTIgMDQ6NDE6NDYgSXNodGFyIGtlcm5lbDogWyA1NzY2LjM4 MTg2M10gIFs8ZmZmZmZmZmY4MTA3YWE4NT5dID8gbG9jYWxfY2xvY2srMHgyNS8weDMwCk5v diAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgxODY3XSAgWzxmZmZmZmZm ZjgxMDkzNzRlPl0gPyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8weDMwCk5vdiAxMiAw NDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgxODcwXSAgWzxmZmZmZmZmZjgxMDkz OGFlPl0gPyBsb2NrX3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEzZS8weDE5MApOb3Yg MTIgMDQ6NDE6NDYgSXNodGFyIGtlcm5lbDogWyA1NzY2LjM4MTg3NF0gIFs8ZmZmZmZmZmY4 MTA3NTczZD5dID8gZ2V0X3BhcmVudF9pcCsweGQvMHg1MApOb3YgMTIgMDQ6NDE6NDYgSXNo dGFyIGtlcm5lbDogWyA1NzY2LjM4MTg3N10gIFs8ZmZmZmZmZmY4MTYxMDU0OD5dIF9fZG93 bl9jb21tb24rMHg5ZC8weGYwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3 NjYuMzgxODgyXSAgWzxmZmZmZmZmZjgxMjg2ZDc1Pl0gPyBfeGZzX2J1Zl9maW5kKzB4MTY1 LzB4MmMwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgxODg0XSAg WzxmZmZmZmZmZjgxNjEwNWZhPl0gX19kb3duKzB4MTgvMHgxYQpOb3YgMTIgMDQ6NDE6NDYg SXNodGFyIGtlcm5lbDogWyA1NzY2LjM4MTg5MV0gIFs8ZmZmZmZmZmY4MTA5MWQ0Yz5dIGRv d24rMHgzYy8weDUwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgx ODk5XSAgWzxmZmZmZmZmZjgxMjg2YjM3Pl0geGZzX2J1Zl9sb2NrKzB4MzcvMHgxMTAKTm92 IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5MDNdICBbPGZmZmZmZmZm ODEyODZkNzU+XSBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0MTo0NiBJ c2h0YXIga2VybmVsOiBbIDU3NjYuMzgxOTA3XSAgWzxmZmZmZmZmZjgxMjg2ZWY1Pl0geGZz X2J1Zl9nZXRfbWFwKzB4MjUvMHgyMDAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTc2Ni4zODE5MTFdICBbPGZmZmZmZmZmODEyODdkMDc+XSB4ZnNfYnVmX3JlYWRfbWFw KzB4MjcvMHgxNzAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5 MTZdICBbPGZmZmZmZmZmODEyYjQzYTY+XSB4ZnNfdHJhbnNfcmVhZF9idWZfbWFwKzB4Mjk2 LzB4NTIwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgxOTIyXSAg WzxmZmZmZmZmZjgxMjc2Nzc5Pl0geGZzX3JlYWRfYWdpKzB4ODkvMHgxMDAKTm92IDEyIDA0 OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5MjZdICBbPGZmZmZmZmZmODEyNzY4 MWY+XSB4ZnNfaWFsbG9jX3JlYWRfYWdpKzB4MmYvMHhkMApOb3YgMTIgMDQ6NDE6NDYgSXNo dGFyIGtlcm5lbDogWyA1NzY2LjM4MTkzMF0gIFs8ZmZmZmZmZmY4MTI3NzFhOD5dIHhmc19k aWFsbG9jKzB4YzgvMHgyNzAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2 Ni4zODE5MzRdICBbPGZmZmZmZmZmODEyYTQ4ZjE+XSA/IGttZW1fem9uZV9hbGxvYysweGMx LzB4ZjAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5MzldICBb PGZmZmZmZmZmODEyOTg1Y2Q+XSB4ZnNfaWFsbG9jKzB4NGQvMHg1MTAKTm92IDEyIDA0OjQx OjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5NDJdICBbPGZmZmZmZmZmODEyOThhZTY+ XSB4ZnNfZGlyX2lhbGxvYysweDU2LzB4MjYwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2Vy bmVsOiBbIDU3NjYuMzgxOTQ3XSAgWzxmZmZmZmZmZjgxMjk4ZWQ1Pl0gPyB4ZnNfY3JlYXRl KzB4MTk1LzB4NjIwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgx OTUwXSAgWzxmZmZmZmZmZjgxMjk3MjZhPl0gPyB4ZnNfaWxvY2srMHhlYS8weDExMApOb3Yg MTIgMDQ6NDE6NDYgSXNodGFyIGtlcm5lbDogWyA1NzY2LjM4MTk2Ml0gIFs8ZmZmZmZmZmY4 MTI5OGY1OD5dIHhmc19jcmVhdGUrMHgyMTgvMHg2MjAKTm92IDEyIDA0OjQxOjQ2IElzaHRh ciBrZXJuZWw6IFsgNTc2Ni4zODE5NjRdICBbPGZmZmZmZmZmODEyOTU1NTA+XSB4ZnNfZ2Vu ZXJpY19jcmVhdGUrMHhjMC8weDIyMApOb3YgMTIgMDQ6NDE6NDYgSXNodGFyIGtlcm5lbDog WyA1NzY2LjM4MTk2Nl0gIFs8ZmZmZmZmZmY4MTI5NTZkZj5dIHhmc192bl9ta25vZCsweGYv MHgyMApOb3YgMTIgMDQ6NDE6NDYgSXNodGFyIGtlcm5lbDogWyA1NzY2LjM4MTk3MF0gIFs8 ZmZmZmZmZmY4MTI5NTcxZT5dIHhmc192bl9jcmVhdGUrMHhlLzB4MTAKTm92IDEyIDA0OjQx OjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5NzVdICBbPGZmZmZmZmZmODExYjE0MjU+ XSB2ZnNfY3JlYXRlKzB4YzUvMHgxMzAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTc2Ni4zODE5NzhdICBbPGZmZmZmZmZmODExYjIwMjY+XSBkb19sYXN0KzB4Yjk2LzB4 MTM1MApOb3YgMTIgMDQ6NDE6NDYgSXNodGFyIGtlcm5lbDogWyA1NzY2LjM4MTk4Ml0gIFs8 ZmZmZmZmZmY4MTFiMGJiMz5dID8gaW5vZGVfcGVybWlzc2lvbisweDEzLzB4NDAKTm92IDEy IDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5ODZdICBbPGZmZmZmZmZmODEx YjUwMDA+XSA/IHBhdGhfbG9va3VwYXQrMHg3NTAvMHg3YTAKTm92IDEyIDA0OjQxOjQ2IElz aHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5OTBdICBbPGZmZmZmZmZmODExYjUxMDk+XSBwYXRo X29wZW5hdCsweGI5LzB4NjkwCk5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3 NjYuMzgxOTk0XSAgWzxmZmZmZmZmZjgxMDdhYTg1Pl0gPyBsb2NhbF9jbG9jaysweDI1LzB4 MzAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5OTVdICBbPGZm ZmZmZmZmODEwOTRjODQ+XSA/IF9fbG9ja19hY3F1aXJlLmlzcmEuMzErMHgyYTQvMHhhNDAK Tm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODE5OTddICBbPGZmZmZm ZmZmODEwNzU3YzE+XSA/IHByZWVtcHRfY291bnRfc3ViKzB4NDEvMHg1MApOb3YgMTIgMDQ6 NDE6NDYgSXNodGFyIGtlcm5lbDogWyA1NzY2LjM4MjAwMV0gIFs8ZmZmZmZmZmY4MTFiNjZk NT5dIGRvX2ZpbHBfb3BlbisweDM1LzB4ODAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJu ZWw6IFsgNTc2Ni4zODIwMDRdICBbPGZmZmZmZmZmODEwNzU3M2Q+XSA/IGdldF9wYXJlbnRf aXArMHhkLzB4NTAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODIw MDhdICBbPGZmZmZmZmZmODE2MTI2MmM+XSA/IF9yYXdfc3Bpbl91bmxvY2srMHgyYy8weDUw Ck5vdiAxMiAwNDo0MTo0NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgyMDE0XSAgWzxmZmZm ZmZmZjgxMWMzZDZmPl0gPyBfX2FsbG9jX2ZkKzB4MTBmLzB4MTQwCk5vdiAxMiAwNDo0MTo0 NiBJc2h0YXIga2VybmVsOiBbIDU3NjYuMzgyMDE3XSAgWzxmZmZmZmZmZjgxMWE0ODg2Pl0g ZG9fc3lzX29wZW4rMHgxMjYvMHgyMzAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTc2Ni4zODIwMjBdICBbPGZmZmZmZmZmODExYTQ5YTk+XSBTeVNfb3BlbisweDE5LzB4 MjAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODIwMjddICBbPGZm ZmZmZmZmODE2MTMzNTI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDE2LzB4MWIKTm92IDEy IDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODIwMjldIDQgbG9ja3MgaGVsZCBi eSBzZW5kbWFpbC8zODUwODoKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2 Ni4zODIwMjldICAjMDogIChzYl93cml0ZXJzIzMpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZm ODExYzYyYmY+XSBtbnRfd2FudF93cml0ZSsweDFmLzB4NTAKTm92IDEyIDA0OjQxOjQ2IElz aHRhciBrZXJuZWw6IFsgNTc2Ni4zODIwNDJdICAjMTogICgmdHlwZS0+aV9tdXRleF9kaXJf a2V5KXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMWIxNzU4Pl0gZG9fbGFzdCsweDJjOC8w eDEzNTAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6IFsgNTc2Ni4zODIwNTJdICAj MjogIChzYl9pbnRlcm5hbCl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTJhMzA4Zj5dIHhm c190cmFuc19hbGxvYysweDFmLzB4NDAKTm92IDEyIDA0OjQxOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTc2Ni4zODIwNTddICAjMzogICgmeGZzX2Rpcl9pbG9ja19jbGFzcy8xKXsuLi4uLi59 LCBhdDogWzxmZmZmZmZmZjgxMjk3MjZhPl0geGZzX2lsb2NrKzB4ZWEvMHgxMTAKTm92IDEy IDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni40OTY0NjhdIElORk86IHRhc2sgeGZz ZHVtcDozODMxNyBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuCk5vdiAxMiAw NDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTAzMTM1XSAgICAgICBOb3QgdGFpbnRl ZCAzLjE3LjItSXNodC1WYW4gIzEKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsg NTg4Ni41MDc3NjBdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1l b3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KTm92IDEyIDA0OjQzOjQ2IElzaHRh ciBrZXJuZWw6IFsgNTg4Ni41MTU2MjJdICBmZmZmODgwYjZhZWMzOTIwIDAwMDAwMDAwMDAw MDAwNDYgZmZmZjg4MGJlNzVmMDAwMCBmZmZmODgwYjZhZWMzZmQ4Ck5vdiAxMiAwNDo0Mzo0 NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NjI1XSAgMDAwMDAwMDAwMDFkM2I0MCAwMDAw MDAwMDAwMWQzYjQwIGZmZmY4ODE3ZmJjYTI1MTAgZmZmZjg4MGJlNzVmMDAwMApOb3YgMTIg MDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTYyN10gIDdmZmZmZmZmZmZmZmZm ZmYgZmZmZjg4MTdiMDM4MzlmMCAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMDAK Tm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU2MjhdIENhbGwgVHJh Y2U6Ck5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NjM3XSAgWzxm ZmZmZmZmZjgxNjBjZWE0Pl0gc2NoZWR1bGUrMHgyNC8weDcwCk5vdiAxMiAwNDo0Mzo0NiBJ c2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NjQwXSAgWzxmZmZmZmZmZjgxNjExNDA5Pl0gc2No ZWR1bGVfdGltZW91dCsweDIzOS8weDJjMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5l bDogWyA1ODg2LjUxNTY0Nl0gIFs8ZmZmZmZmZmY4MTA3YWE4NT5dID8gbG9jYWxfY2xvY2sr MHgyNS8weDMwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NjUw XSAgWzxmZmZmZmZmZjgxMDkzNzRlPl0gPyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8w eDMwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NjUzXSAgWzxm ZmZmZmZmZjgxMDkzOGFlPl0gPyBsb2NrX3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEz ZS8weDE5MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTY1N10g IFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3BhcmVudF9pcCsweGQvMHg1MApOb3YgMTIg MDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTY1OV0gIFs8ZmZmZmZmZmY4MTYx MDU0OD5dIF9fZG93bl9jb21tb24rMHg5ZC8weGYwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIg a2VybmVsOiBbIDU4ODYuNTE1NjY1XSAgWzxmZmZmZmZmZjgxMjg2ZDc1Pl0gPyBfeGZzX2J1 Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4 ODYuNTE1NjY3XSAgWzxmZmZmZmZmZjgxNjEwNWZhPl0gX19kb3duKzB4MTgvMHgxYQpOb3Yg MTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTY2OV0gIFs8ZmZmZmZmZmY4 MTA5MWQ0Yz5dIGRvd24rMHgzYy8weDUwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVs OiBbIDU4ODYuNTE1NjcyXSAgWzxmZmZmZmZmZjgxMjg2YjM3Pl0geGZzX2J1Zl9sb2NrKzB4 MzcvMHgxMTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU2NzVd ICBbPGZmZmZmZmZmODEyODZkNzU+XSBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAx MiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NjgwXSAgWzxmZmZmZmZmZjgx Mjg2ZWY1Pl0geGZzX2J1Zl9nZXRfbWFwKzB4MjUvMHgyMDAKTm92IDEyIDA0OjQzOjQ2IElz aHRhciBrZXJuZWw6IFsgNTg4Ni41MTU2ODJdICBbPGZmZmZmZmZmODEyODdkMDc+XSB4ZnNf YnVmX3JlYWRfbWFwKzB4MjcvMHgxNzAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTg4Ni41MTU2ODVdICBbPGZmZmZmZmZmODEyYjQyZTk+XSB4ZnNfdHJhbnNfcmVhZF9i dWZfbWFwKzB4MWQ5LzB4NTIwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4 ODYuNTE1Njg4XSAgWzxmZmZmZmZmZjgxMjc2Nzc5Pl0geGZzX3JlYWRfYWdpKzB4ODkvMHgx MDAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU2OTBdICBbPGZm ZmZmZmZmODEyNzY4MWY+XSB4ZnNfaWFsbG9jX3JlYWRfYWdpKzB4MmYvMHhkMApOb3YgMTIg MDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTY5MV0gIFs8ZmZmZmZmZmY4MTI5 YjkzNT5dIHhmc19idWxrc3RhdCsweDE2NS8weDRlMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFy IGtlcm5lbDogWyA1ODg2LjUxNTY5M10gIFs8ZmZmZmZmZmY4MTA5NGM4ND5dID8gX19sb2Nr X2FjcXVpcmUuaXNyYS4zMSsweDJhNC8weGE0MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtl cm5lbDogWyA1ODg2LjUxNTY5NV0gIFs8ZmZmZmZmZmY4MTA5NGM4ND5dID8gX19sb2NrX2Fj cXVpcmUuaXNyYS4zMSsweDJhNC8weGE0MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5l bDogWyA1ODg2LjUxNTcwM10gIFs8ZmZmZmZmZmY4MTI5YjYyMD5dID8geGZzX2J1bGtzdGF0 X29uZV9pbnQrMHgzMTAvMHgzMTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsg NTg4Ni41MTU3MDhdICBbPGZmZmZmZmZmODEwNzU3M2Q+XSA/IGdldF9wYXJlbnRfaXArMHhk LzB4NTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU3MTNdICBb PGZmZmZmZmZmODEwNzU3YzE+XSA/IHByZWVtcHRfY291bnRfc3ViKzB4NDEvMHg1MApOb3Yg MTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTcxOV0gIFs8ZmZmZmZmZmY4 MTJkMjNjMz5dID8gc2VjdXJpdHlfY2FwYWJsZSsweDEzLzB4MjAKTm92IDEyIDA0OjQzOjQ2 IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU3MjRdICBbPGZmZmZmZmZmODEyOTExMWM+XSB4 ZnNfaW9jX2J1bGtzdGF0KzB4Y2MvMHgxYTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJu ZWw6IFsgNTg4Ni41MTU3MjhdICBbPGZmZmZmZmZmODEyOTM2NWU+XSB4ZnNfZmlsZV9pb2N0 bCsweDgyZS8weGMyMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUx NTczM10gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3BhcmVudF9pcCsweGQvMHg1MApO b3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTczOV0gIFs8ZmZmZmZm ZmY4MTA3NTdjMT5dID8gcHJlZW1wdF9jb3VudF9zdWIrMHg0MS8weDUwCk5vdiAxMiAwNDo0 Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NzQzXSAgWzxmZmZmZmZmZjgxMDkzNzRl Pl0gPyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8weDMwCk5vdiAxMiAwNDo0Mzo0NiBJ c2h0YXIga2VybmVsOiBbIDU4ODYuNTE1NzQ4XSAgWzxmZmZmZmZmZjgxMDkzOGFlPl0gPyBs b2NrX3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEzZS8weDE5MApOb3YgMTIgMDQ6NDM6 NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTc1M10gIFs8ZmZmZmZmZmY4MTFlNGJkMz5d ID8gZnNub3RpZnkrMHgyMjMvMHgzMzAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTg4Ni41MTU3NThdICBbPGZmZmZmZmZmODExZTRhMmI+XSA/IGZzbm90aWZ5KzB4N2Iv MHgzMzAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU3NjNdICBb PGZmZmZmZmZmODExYjhlM2M+XSBkb192ZnNfaW9jdGwrMHgyY2MvMHg0ZjAKTm92IDEyIDA0 OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU3NjddICBbPGZmZmZmZmZmODExYjkw ZTE+XSBTeVNfaW9jdGwrMHg4MS8weGEwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVs OiBbIDU4ODYuNTE1NzcyXSAgWzxmZmZmZmZmZjgxNjEzMzUyPl0gc3lzdGVtX2NhbGxfZmFz dHBhdGgrMHgxNi8weDFiCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYu NTE1Nzc1XSBubyBsb2NrcyBoZWxkIGJ5IHhmc2R1bXAvMzgzMTcuCk5vdiAxMiAwNDo0Mzo0 NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1Nzc5XSBJTkZPOiB0YXNrIHNlbmRtYWlsOjM4 NTA4IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KTm92IDEyIDA0OjQzOjQ2 IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU3ODJdICAgICAgIE5vdCB0YWludGVkIDMuMTcu Mi1Jc2h0LVZhbiAjMQpOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUx NTc4NF0gImVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2Vj cyIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLgpOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5l bDogWyA1ODg2LjUxNTc5NV0gIGZmZmY4ODBmMjIxZDc3MDAgMDAwMDAwMDAwMDAwMDA0NiBm ZmZmODgwYThmMTZhNTEwIGZmZmY4ODBmMjIxZDdmZDgKTm92IDEyIDA0OjQzOjQ2IElzaHRh ciBrZXJuZWw6IFsgNTg4Ni41MTU3OTZdICAwMDAwMDAwMDAwMWQzYjQwIDAwMDAwMDAwMDAx ZDNiNDAgZmZmZjg4MTdmYmNhNGEyMCBmZmZmODgwYThmMTZhNTEwCk5vdiAxMiAwNDo0Mzo0 NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1Nzk4XSAgN2ZmZmZmZmZmZmZmZmZmZiBmZmZm ODgwYmY3OTZkMzcwIDAwMDAwMDAwMDAwMDAwMDIgMDAwMDAwMDAwMDAwMDAwMApOb3YgMTIg MDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTc5OF0gQ2FsbCBUcmFjZToKTm92 IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4MDBdICBbPGZmZmZmZmZm ODE2MGNlYTQ+XSBzY2hlZHVsZSsweDI0LzB4NzAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBr ZXJuZWw6IFsgNTg4Ni41MTU4MDFdICBbPGZmZmZmZmZmODE2MTE0MDk+XSBzY2hlZHVsZV90 aW1lb3V0KzB4MjM5LzB4MmMwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4 ODYuNTE1ODAzXSAgWzxmZmZmZmZmZjgxMDdhYTg1Pl0gPyBsb2NhbF9jbG9jaysweDI1LzB4 MzAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4MDRdICBbPGZm ZmZmZmZmODEwOTM3NGU+XSA/IHB1dF9sb2NrX3N0YXRzLmlzcmEuMjMrMHhlLzB4MzAKTm92 IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4MDZdICBbPGZmZmZmZmZm ODEwOTM4YWU+XSA/IGxvY2tfcmVsZWFzZV9ob2xkdGltZS5wYXJ0LjI0KzB4MTNlLzB4MTkw Ck5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODA3XSAgWzxmZmZm ZmZmZjgxMDc1NzNkPl0gPyBnZXRfcGFyZW50X2lwKzB4ZC8weDUwCk5vdiAxMiAwNDo0Mzo0 NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODA5XSAgWzxmZmZmZmZmZjgxNjEwNTQ4Pl0g X19kb3duX2NvbW1vbisweDlkLzB4ZjAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTg4Ni41MTU4MTBdICBbPGZmZmZmZmZmODEyODZkNzU+XSA/IF94ZnNfYnVmX2ZpbmQr MHgxNjUvMHgyYzAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4 MTJdICBbPGZmZmZmZmZmODE2MTA1ZmE+XSBfX2Rvd24rMHgxOC8weDFhCk5vdiAxMiAwNDo0 Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODEzXSAgWzxmZmZmZmZmZjgxMDkxZDRj Pl0gZG93bisweDNjLzB4NTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4 Ni41MTU4MTVdICBbPGZmZmZmZmZmODEyODZiMzc+XSB4ZnNfYnVmX2xvY2srMHgzNy8weDEx MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTgxNl0gIFs8ZmZm ZmZmZmY4MTI4NmQ3NT5dIF94ZnNfYnVmX2ZpbmQrMHgxNjUvMHgyYzAKTm92IDEyIDA0OjQz OjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4MThdICBbPGZmZmZmZmZmODEyODZlZjU+ XSB4ZnNfYnVmX2dldF9tYXArMHgyNS8weDIwMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtl cm5lbDogWyA1ODg2LjUxNTgxOV0gIFs8ZmZmZmZmZmY4MTI4N2QwNz5dIHhmc19idWZfcmVh ZF9tYXArMHgyNy8weDE3MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2 LjUxNTgyMV0gIFs8ZmZmZmZmZmY4MTJiNDNhNj5dIHhmc190cmFuc19yZWFkX2J1Zl9tYXAr MHgyOTYvMHg1MjAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4 MjNdICBbPGZmZmZmZmZmODEyNzY3Nzk+XSB4ZnNfcmVhZF9hZ2krMHg4OS8weDEwMApOb3Yg MTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTgyNF0gIFs8ZmZmZmZmZmY4 MTI3NjgxZj5dIHhmc19pYWxsb2NfcmVhZF9hZ2krMHgyZi8weGQwCk5vdiAxMiAwNDo0Mzo0 NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODI2XSAgWzxmZmZmZmZmZjgxMjc3MWE4Pl0g eGZzX2RpYWxsb2MrMHhjOC8weDI3MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDog WyA1ODg2LjUxNTgyOF0gIFs8ZmZmZmZmZmY4MTJhNDhmMT5dID8ga21lbV96b25lX2FsbG9j KzB4YzEvMHhmMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTgz MF0gIFs8ZmZmZmZmZmY4MTI5ODVjZD5dIHhmc19pYWxsb2MrMHg0ZC8weDUxMApOb3YgMTIg MDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTgzMV0gIFs8ZmZmZmZmZmY4MTI5 OGFlNj5dIHhmc19kaXJfaWFsbG9jKzB4NTYvMHgyNjAKTm92IDEyIDA0OjQzOjQ2IElzaHRh ciBrZXJuZWw6IFsgNTg4Ni41MTU4MzNdICBbPGZmZmZmZmZmODEyOThlZDU+XSA/IHhmc19j cmVhdGUrMHgxOTUvMHg2MjAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4 Ni41MTU4MzRdICBbPGZmZmZmZmZmODEyOTcyNmE+XSA/IHhmc19pbG9jaysweGVhLzB4MTEw Ck5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODM1XSAgWzxmZmZm ZmZmZjgxMjk4ZjU4Pl0geGZzX2NyZWF0ZSsweDIxOC8weDYyMApOb3YgMTIgMDQ6NDM6NDYg SXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTgzN10gIFs8ZmZmZmZmZmY4MTI5NTU1MD5dIHhm c19nZW5lcmljX2NyZWF0ZSsweGMwLzB4MjIwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2Vy bmVsOiBbIDU4ODYuNTE1ODM5XSAgWzxmZmZmZmZmZjgxMjk1NmRmPl0geGZzX3ZuX21rbm9k KzB4Zi8weDIwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODQw XSAgWzxmZmZmZmZmZjgxMjk1NzFlPl0geGZzX3ZuX2NyZWF0ZSsweGUvMHgxMApOb3YgMTIg MDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg0Ml0gIFs8ZmZmZmZmZmY4MTFi MTQyNT5dIHZmc19jcmVhdGUrMHhjNS8weDEzMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtl cm5lbDogWyA1ODg2LjUxNTg0M10gIFs8ZmZmZmZmZmY4MTFiMjAyNj5dIGRvX2xhc3QrMHhi OTYvMHgxMzUwCk5vdiAxMiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODQ1 XSAgWzxmZmZmZmZmZjgxMWIwYmIzPl0gPyBpbm9kZV9wZXJtaXNzaW9uKzB4MTMvMHg0MApO b3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg0Nl0gIFs8ZmZmZmZm ZmY4MTFiNTAwMD5dID8gcGF0aF9sb29rdXBhdCsweDc1MC8weDdhMApOb3YgMTIgMDQ6NDM6 NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg0N10gIFs8ZmZmZmZmZmY4MTFiNTEwOT5d IHBhdGhfb3BlbmF0KzB4YjkvMHg2OTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6 IFsgNTg4Ni41MTU4NDldICBbPGZmZmZmZmZmODEwN2FhODU+XSA/IGxvY2FsX2Nsb2NrKzB4 MjUvMHgzMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg1MF0g IFs8ZmZmZmZmZmY4MTA5NGM4ND5dID8gX19sb2NrX2FjcXVpcmUuaXNyYS4zMSsweDJhNC8w eGE0MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg1Ml0gIFs8 ZmZmZmZmZmY4MTA3NTdjMT5dID8gcHJlZW1wdF9jb3VudF9zdWIrMHg0MS8weDUwCk5vdiAx MiAwNDo0Mzo0NiBJc2h0YXIga2VybmVsOiBbIDU4ODYuNTE1ODU0XSAgWzxmZmZmZmZmZjgx MWI2NmQ1Pl0gZG9fZmlscF9vcGVuKzB4MzUvMHg4MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFy IGtlcm5lbDogWyA1ODg2LjUxNTg1NV0gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3Bh cmVudF9pcCsweGQvMHg1MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2 LjUxNTg1N10gIFs8ZmZmZmZmZmY4MTYxMjYyYz5dID8gX3Jhd19zcGluX3VubG9jaysweDJj LzB4NTAKTm92IDEyIDA0OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4NTldICBb PGZmZmZmZmZmODExYzNkNmY+XSA/IF9fYWxsb2NfZmQrMHgxMGYvMHgxNDAKTm92IDEyIDA0 OjQzOjQ2IElzaHRhciBrZXJuZWw6IFsgNTg4Ni41MTU4NjFdICBbPGZmZmZmZmZmODExYTQ4 ODY+XSBkb19zeXNfb3BlbisweDEyNi8weDIzMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtl cm5lbDogWyA1ODg2LjUxNTg2M10gIFs8ZmZmZmZmZmY4MTFhNDlhOT5dIFN5U19vcGVuKzB4 MTkvMHgyMApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg2NF0g IFs8ZmZmZmZmZmY4MTYxMzM1Mj5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTYvMHgxYgpO b3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg2NV0gNCBsb2NrcyBo ZWxkIGJ5IHNlbmRtYWlsLzM4NTA4OgpOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDog WyA1ODg2LjUxNTg3MF0gICMwOiAgKHNiX3dyaXRlcnMjMyl7Li4uLi4ufSwgYXQ6IFs8ZmZm ZmZmZmY4MTFjNjJiZj5dIG1udF93YW50X3dyaXRlKzB4MWYvMHg1MApOb3YgMTIgMDQ6NDM6 NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg3M10gICMxOiAgKCZ0eXBlLT5pX211dGV4 X2Rpcl9rZXkpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODExYjE3NTg+XSBkb19sYXN0KzB4 MmM4LzB4MTM1MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtlcm5lbDogWyA1ODg2LjUxNTg3 Nl0gICMyOiAgKHNiX2ludGVybmFsKXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMmEzMDhm Pl0geGZzX3RyYW5zX2FsbG9jKzB4MWYvMHg0MApOb3YgMTIgMDQ6NDM6NDYgSXNodGFyIGtl cm5lbDogWyA1ODg2LjUxNTg3OV0gICMzOiAgKCZ4ZnNfZGlyX2lsb2NrX2NsYXNzLzEpey4u Li4uLn0sIGF0OiBbPGZmZmZmZmZmODEyOTcyNmE+XSB4ZnNfaWxvY2srMHhlYS8weDExMApO b3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjYzMDMwN10gSU5GTzogdGFz ayBubWJkOjE5NTQgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNvbmRzLgpOb3YgMTIg MDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjYzNjU5Ml0gICAgICAgTm90IHRhaW50 ZWQgMy4xNy4yLUlzaHQtVmFuICMxCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBb IDYwMDYuNjQxMjUxXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGlt ZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk5vdiAxMiAwNDo0NTo0NiBJc2h0 YXIga2VybmVsOiBbIDYwMDYuNjQ5MTQxXSAgZmZmZjg4MTdmOTJmMzcwMCAwMDAwMDAwMDAw MDAwMDQ2IGZmZmY4ODBiZmE5YjI1MTAgZmZmZjg4MTdmOTJmM2ZkOApOb3YgMTIgMDQ6NDU6 NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTE0NF0gIDAwMDAwMDAwMDAxZDNiNDAgMDAw MDAwMDAwMDFkM2I0MCBmZmZmZmZmZjgxYzE5NGMwIGZmZmY4ODBiZmE5YjI1MTAKTm92IDEy IDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkxNDddICA3ZmZmZmZmZmZmZmZm ZmZmIGZmZmY4ODBiZjc5NmQzNzAgMDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAwMDAwMDAwMDAw Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MTQ4XSBDYWxsIFRy YWNlOgpOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTE1Nl0gIFs8 ZmZmZmZmZmY4MTYwY2VhND5dIHNjaGVkdWxlKzB4MjQvMHg3MApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTE1OV0gIFs8ZmZmZmZmZmY4MTYxMTQwOT5dIHNj aGVkdWxlX3RpbWVvdXQrMHgyMzkvMHgyYzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjAwNi42NDkxNjNdICBbPGZmZmZmZmZmODEwN2FhODU+XSA/IGxvY2FsX2Nsb2Nr KzB4MjUvMHgzMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTE2 N10gIFs8ZmZmZmZmZmY4MTA5Mzc0ZT5dID8gcHV0X2xvY2tfc3RhdHMuaXNyYS4yMysweGUv MHgzMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTE3MF0gIFs8 ZmZmZmZmZmY4MTA5MzhhZT5dID8gbG9ja19yZWxlYXNlX2hvbGR0aW1lLnBhcnQuMjQrMHgx M2UvMHgxOTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkxNzRd ICBbPGZmZmZmZmZmODEwNzU3M2Q+XSA/IGdldF9wYXJlbnRfaXArMHhkLzB4NTAKTm92IDEy IDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkxNzddICBbPGZmZmZmZmZmODE2 MTA1NDg+XSBfX2Rvd25fY29tbW9uKzB4OWQvMHhmMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFy IGtlcm5lbDogWyA2MDA2LjY0OTE4NV0gIFs8ZmZmZmZmZmY4MTI4NmQ3NT5dID8gX3hmc19i dWZfZmluZCsweDE2NS8weDJjMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2 MDA2LjY0OTE4N10gIFs8ZmZmZmZmZmY4MTYxMDVmYT5dIF9fZG93bisweDE4LzB4MWEKTm92 IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkxOTBdICBbPGZmZmZmZmZm ODEwOTFkNGM+XSBkb3duKzB4M2MvMHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5l bDogWyA2MDA2LjY0OTE5Ml0gIFs8ZmZmZmZmZmY4MTI4NmIzNz5dIHhmc19idWZfbG9jaysw eDM3LzB4MTEwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MjA5 XSAgWzxmZmZmZmZmZjgxMjg2ZDc1Pl0gX3hmc19idWZfZmluZCsweDE2NS8weDJjMApOb3Yg MTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTIxMl0gIFs8ZmZmZmZmZmY4 MTI4NmVmNT5dIHhmc19idWZfZ2V0X21hcCsweDI1LzB4MjAwCk5vdiAxMiAwNDo0NTo0NiBJ c2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MjE1XSAgWzxmZmZmZmZmZjgxMjg3ZDA3Pl0geGZz X2J1Zl9yZWFkX21hcCsweDI3LzB4MTcwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVs OiBbIDYwMDYuNjQ5MjE5XSAgWzxmZmZmZmZmZjgxMmI0M2E2Pl0geGZzX3RyYW5zX3JlYWRf YnVmX21hcCsweDI5Ni8weDUyMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2 MDA2LjY0OTIyNF0gIFs8ZmZmZmZmZmY4MTI3Njc3OT5dIHhmc19yZWFkX2FnaSsweDg5LzB4 MTAwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MjI2XSAgWzxm ZmZmZmZmZjgxMjc2ODFmPl0geGZzX2lhbGxvY19yZWFkX2FnaSsweDJmLzB4ZDAKTm92IDEy IDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkyMjldICBbPGZmZmZmZmZmODEy NzcxYTg+XSB4ZnNfZGlhbGxvYysweGM4LzB4MjcwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIg a2VybmVsOiBbIDYwMDYuNjQ5MjM1XSAgWzxmZmZmZmZmZjgxMmE0OGYxPl0gPyBrbWVtX3pv bmVfYWxsb2MrMHhjMS8weGYwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYw MDYuNjQ5MjQxXSAgWzxmZmZmZmZmZjgxMjk4NWNkPl0geGZzX2lhbGxvYysweDRkLzB4NTEw Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MjQ1XSAgWzxmZmZm ZmZmZjgxMjk4YWU2Pl0geGZzX2Rpcl9pYWxsb2MrMHg1Ni8weDI2MApOb3YgMTIgMDQ6NDU6 NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTI0OV0gIFs8ZmZmZmZmZmY4MTI5OGVkNT5d ID8geGZzX2NyZWF0ZSsweDE5NS8weDYyMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5l bDogWyA2MDA2LjY0OTI1N10gIFs8ZmZmZmZmZmY4MTI5NzI2YT5dID8geGZzX2lsb2NrKzB4 ZWEvMHgxMTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkyNjNd ICBbPGZmZmZmZmZmODEyOThmNTg+XSB4ZnNfY3JlYXRlKzB4MjE4LzB4NjIwCk5vdiAxMiAw NDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MjcxXSAgWzxmZmZmZmZmZjgxMjk1 NTUwPl0geGZzX2dlbmVyaWNfY3JlYXRlKzB4YzAvMHgyMjAKTm92IDEyIDA0OjQ1OjQ2IElz aHRhciBrZXJuZWw6IFsgNjAwNi42NDkyODRdICBbPGZmZmZmZmZmODEyOTU2ZGY+XSB4ZnNf dm5fbWtub2QrMHhmLzB4MjAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAw Ni42NDkyODldICBbPGZmZmZmZmZmODEyOTU3MWU+XSB4ZnNfdm5fY3JlYXRlKzB4ZS8weDEw Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5Mjk2XSAgWzxmZmZm ZmZmZjgxMWIxNDI1Pl0gdmZzX2NyZWF0ZSsweGM1LzB4MTMwCk5vdiAxMiAwNDo0NTo0NiBJ c2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MzAxXSAgWzxmZmZmZmZmZjgxMWIyMDI2Pl0gZG9f bGFzdCsweGI5Ni8weDEzNTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAw Ni42NDkzMDhdICBbPGZmZmZmZmZmODExYjBiYjM+XSA/IGlub2RlX3Blcm1pc3Npb24rMHgx My8weDQwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MzEyXSAg WzxmZmZmZmZmZjgxMWI1MDAxPl0gPyBwYXRoX2xvb2t1cGF0KzB4NzUxLzB4N2EwCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MzIwXSAgWzxmZmZmZmZmZjgx MWI1MTA5Pl0gcGF0aF9vcGVuYXQrMHhiOS8weDY5MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFy IGtlcm5lbDogWyA2MDA2LjY0OTMyNV0gIFs8ZmZmZmZmZmY4MTA3YWE4NT5dID8gbG9jYWxf Y2xvY2srMHgyNS8weDMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYu NjQ5MzM0XSAgWzxmZmZmZmZmZjgxMDk0Yzg0Pl0gPyBfX2xvY2tfYWNxdWlyZS5pc3JhLjMx KzB4MmE0LzB4YTQwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5 MzQ3XSAgWzxmZmZmZmZmZjgxMDc1N2MxPl0gPyBwcmVlbXB0X2NvdW50X3N1YisweDQxLzB4 NTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDkzNTNdICBbPGZm ZmZmZmZmODExYjY2ZDU+XSBkb19maWxwX29wZW4rMHgzNS8weDgwCk5vdiAxMiAwNDo0NTo0 NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5MzU5XSAgWzxmZmZmZmZmZjgxNjEyNjJjPl0g PyBfcmF3X3NwaW5fdW5sb2NrKzB4MmMvMHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtl cm5lbDogWyA2MDA2LjY0OTM2NF0gIFs8ZmZmZmZmZmY4MTFjM2Q2Zj5dID8gX19hbGxvY19m ZCsweDEwZi8weDE0MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0 OTM3MV0gIFs8ZmZmZmZmZmY4MTFhNDg4Nj5dIGRvX3N5c19vcGVuKzB4MTI2LzB4MjMwCk5v diAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5Mzc2XSAgWzxmZmZmZmZm ZjgxMWE0OWE5Pl0gU3lTX29wZW4rMHgxOS8weDIwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIg a2VybmVsOiBbIDYwMDYuNjQ5MzgxXSAgWzxmZmZmZmZmZjgxNjEzMzUyPl0gc3lzdGVtX2Nh bGxfZmFzdHBhdGgrMHgxNi8weDFiCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBb IDYwMDYuNjQ5MzgzXSA0IGxvY2tzIGhlbGQgYnkgbm1iZC8xOTU0OgpOb3YgMTIgMDQ6NDU6 NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTM4NV0gICMwOiAgKHNiX3dyaXRlcnMjMyl7 Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTFjNjJiZj5dIG1udF93YW50X3dyaXRlKzB4MWYv MHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTQwNF0gICMx OiAgKCZ0eXBlLT5pX211dGV4X2Rpcl9rZXkpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODEx YjE3NTg+XSBkb19sYXN0KzB4MmM4LzB4MTM1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtl cm5lbDogWyA2MDA2LjY0OTQwOV0gICMyOiAgKHNiX2ludGVybmFsKXsuLi4uLi59LCBhdDog WzxmZmZmZmZmZjgxMmEzMDhmPl0geGZzX3RyYW5zX2FsbG9jKzB4MWYvMHg0MApOb3YgMTIg MDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTQxNF0gICMzOiAgKCZ4ZnNfZGly X2lsb2NrX2NsYXNzLzEpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODEyOTcyNmE+XSB4ZnNf aWxvY2srMHhlYS8weDExMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2 LjY0OTQyNl0gSU5GTzogdGFzayB0cmFuc21pc3Npb24tZGE6MjQ5NiBibG9ja2VkIGZvciBt b3JlIHRoYW4gMTIwIHNlY29uZHMuCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBb IDYwMDYuNjQ5NDI3XSAgICAgICBOb3QgdGFpbnRlZCAzLjE3LjItSXNodC1WYW4gIzEKTm92 IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk0MjddICJlY2hvIDAgPiAv cHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMg bWVzc2FnZS4KTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk0MzVd ICBmZmZmODgxN2Y5M2QzNzAwIDAwMDAwMDAwMDAwMDAwNDYgZmZmZjg4MTdmMWRlNGEyMCBm ZmZmODgxN2Y5M2QzZmQ4Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYu NjQ5NDM4XSAgMDAwMDAwMDAwMDFkM2I0MCAwMDAwMDAwMDAwMWQzYjQwIGZmZmY4ODE3ZmJj OGE1MTAgZmZmZjg4MTdmMWRlNGEyMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDog WyA2MDA2LjY0OTQ1MF0gIDdmZmZmZmZmZmZmZmZmZmYgZmZmZjg4MTdiMDM4MzlmMCAwMDAw MDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMDAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBr ZXJuZWw6IFsgNjAwNi42NDk0NTFdIENhbGwgVHJhY2U6Ck5vdiAxMiAwNDo0NTo0NiBJc2h0 YXIga2VybmVsOiBbIDYwMDYuNjQ5NDU1XSAgWzxmZmZmZmZmZjgxNjBjZWE0Pl0gc2NoZWR1 bGUrMHgyNC8weDcwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5 NDU5XSAgWzxmZmZmZmZmZjgxNjExNDA5Pl0gc2NoZWR1bGVfdGltZW91dCsweDIzOS8weDJj MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTQ2Ml0gIFs8ZmZm ZmZmZmY4MTA3YWE4NT5dID8gbG9jYWxfY2xvY2srMHgyNS8weDMwCk5vdiAxMiAwNDo0NTo0 NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NDY2XSAgWzxmZmZmZmZmZjgxMDkzNzRlPl0g PyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8weDMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0 YXIga2VybmVsOiBbIDYwMDYuNjQ5NDY5XSAgWzxmZmZmZmZmZjgxMDkzOGFlPl0gPyBsb2Nr X3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEzZS8weDE5MApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTQ3M10gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8g Z2V0X3BhcmVudF9pcCsweGQvMHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDog WyA2MDA2LjY0OTQ3NV0gIFs8ZmZmZmZmZmY4MTYxMDU0OD5dIF9fZG93bl9jb21tb24rMHg5 ZC8weGYwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NDc4XSAg WzxmZmZmZmZmZjgxMjg2ZDc1Pl0gPyBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NDgwXSAgWzxmZmZmZmZmZjgx NjEwNWZhPl0gX19kb3duKzB4MTgvMHgxYQpOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5l bDogWyA2MDA2LjY0OTQ4Ml0gIFs8ZmZmZmZmZmY4MTA5MWQ0Yz5dIGRvd24rMHgzYy8weDUw Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NDg1XSAgWzxmZmZm ZmZmZjgxMjg2YjM3Pl0geGZzX2J1Zl9sb2NrKzB4MzcvMHgxMTAKTm92IDEyIDA0OjQ1OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk0ODddICBbPGZmZmZmZmZmODEyODZkNzU+XSBf eGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVs OiBbIDYwMDYuNjQ5NDkwXSAgWzxmZmZmZmZmZjgxMjg2ZWY1Pl0geGZzX2J1Zl9nZXRfbWFw KzB4MjUvMHgyMDAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk0 OTJdICBbPGZmZmZmZmZmODEyODdkMDc+XSB4ZnNfYnVmX3JlYWRfbWFwKzB4MjcvMHgxNzAK Tm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk0OTVdICBbPGZmZmZm ZmZmODEyYjQzYTY+XSB4ZnNfdHJhbnNfcmVhZF9idWZfbWFwKzB4Mjk2LzB4NTIwCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NDk3XSAgWzxmZmZmZmZmZjgx Mjc2Nzc5Pl0geGZzX3JlYWRfYWdpKzB4ODkvMHgxMDAKTm92IDEyIDA0OjQ1OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjAwNi42NDk1MDBdICBbPGZmZmZmZmZmODEyNzY4MWY+XSB4ZnNfaWFs bG9jX3JlYWRfYWdpKzB4MmYvMHhkMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDog WyA2MDA2LjY0OTUwM10gIFs8ZmZmZmZmZmY4MTI3NzFhOD5dIHhmc19kaWFsbG9jKzB4Yzgv MHgyNzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1MDVdICBb PGZmZmZmZmZmODEyYTQ4ZjE+XSA/IGttZW1fem9uZV9hbGxvYysweGMxLzB4ZjAKTm92IDEy IDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1MDddICBbPGZmZmZmZmZmODEy OTg1Y2Q+XSB4ZnNfaWFsbG9jKzB4NGQvMHg1MTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBr ZXJuZWw6IFsgNjAwNi42NDk1MTBdICBbPGZmZmZmZmZmODEyOThhZTY+XSB4ZnNfZGlyX2lh bGxvYysweDU2LzB4MjYwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYu NjQ5NTEyXSAgWzxmZmZmZmZmZjgxMjk4ZWQ1Pl0gPyB4ZnNfY3JlYXRlKzB4MTk1LzB4NjIw Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NTE1XSAgWzxmZmZm ZmZmZjgxMjk3MjZhPl0gPyB4ZnNfaWxvY2srMHhlYS8weDExMApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTUxN10gIFs8ZmZmZmZmZmY4MTI5OGY1OD5dIHhm c19jcmVhdGUrMHgyMTgvMHg2MjAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsg NjAwNi42NDk1MjBdICBbPGZmZmZmZmZmODEyOTU1NTA+XSB4ZnNfZ2VuZXJpY19jcmVhdGUr MHhjMC8weDIyMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTUy Ml0gIFs8ZmZmZmZmZmY4MTI5NTZkZj5dIHhmc192bl9ta25vZCsweGYvMHgyMApOb3YgMTIg MDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTUyNF0gIFs8ZmZmZmZmZmY4MTI5 NTcxZT5dIHhmc192bl9jcmVhdGUrMHhlLzB4MTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBr ZXJuZWw6IFsgNjAwNi42NDk1MjZdICBbPGZmZmZmZmZmODExYjE0MjU+XSB2ZnNfY3JlYXRl KzB4YzUvMHgxMzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1 MjldICBbPGZmZmZmZmZmODExYjIwMjY+XSBkb19sYXN0KzB4Yjk2LzB4MTM1MApOb3YgMTIg MDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTUzMV0gIFs8ZmZmZmZmZmY4MTFi MGJiMz5dID8gaW5vZGVfcGVybWlzc2lvbisweDEzLzB4NDAKTm92IDEyIDA0OjQ1OjQ2IElz aHRhciBrZXJuZWw6IFsgNjAwNi42NDk1MzNdICBbPGZmZmZmZmZmODExYjUwMDE+XSA/IHBh dGhfbG9va3VwYXQrMHg3NTEvMHg3YTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6 IFsgNjAwNi42NDk1MzVdICBbPGZmZmZmZmZmODExYjUxMDk+XSBwYXRoX29wZW5hdCsweGI5 LzB4NjkwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NTM4XSAg WzxmZmZmZmZmZjgxMDdhYTg1Pl0gPyBsb2NhbF9jbG9jaysweDI1LzB4MzAKTm92IDEyIDA0 OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1NDBdICBbPGZmZmZmZmZmODEwOTRj ODQ+XSA/IF9fbG9ja19hY3F1aXJlLmlzcmEuMzErMHgyYTQvMHhhNDAKTm92IDEyIDA0OjQ1 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1NDNdICBbPGZmZmZmZmZmODEwNzU3YzE+ XSA/IHByZWVtcHRfY291bnRfc3ViKzB4NDEvMHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFy IGtlcm5lbDogWyA2MDA2LjY0OTU0NV0gIFs8ZmZmZmZmZmY4MTFiNjZkNT5dIGRvX2ZpbHBf b3BlbisweDM1LzB4ODAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42 NDk1NDhdICBbPGZmZmZmZmZmODE2MTI2MmM+XSA/IF9yYXdfc3Bpbl91bmxvY2srMHgyYy8w eDUwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NTUwXSAgWzxm ZmZmZmZmZjgxMWMzZDZmPl0gPyBfX2FsbG9jX2ZkKzB4MTBmLzB4MTQwCk5vdiAxMiAwNDo0 NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NTUyXSAgWzxmZmZmZmZmZjgxMWE0ODg2 Pl0gZG9fc3lzX29wZW4rMHgxMjYvMHgyMzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjAwNi42NDk1NTRdICBbPGZmZmZmZmZmODExYTQ5YTk+XSBTeVNfb3BlbisweDE5 LzB4MjAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1NTddICBb PGZmZmZmZmZmODE2MTMzNTI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDE2LzB4MWIKTm92 IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1NTldIDQgbG9ja3MgaGVs ZCBieSB0cmFuc21pc3Npb24tZGEvMjQ5NjoKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjAwNi42NDk1NjRdICAjMDogIChzYl93cml0ZXJzIzMpey4uLi4uLn0sIGF0OiBb PGZmZmZmZmZmODExYzYyYmY+XSBtbnRfd2FudF93cml0ZSsweDFmLzB4NTAKTm92IDEyIDA0 OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk1NjldICAjMTogICgmdHlwZS0+aV9t dXRleF9kaXJfa2V5KXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMWIxNzU4Pl0gZG9fbGFz dCsweDJjOC8weDEzNTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42 NDk1NzNdICAjMjogIChzYl9pbnRlcm5hbCl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTJh MzA4Zj5dIHhmc190cmFuc19hbGxvYysweDFmLzB4NDAKTm92IDEyIDA0OjQ1OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjAwNi42NDk1NzhdICAjMzogICgmeGZzX2Rpcl9pbG9ja19jbGFzcy8x KXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMjk3MjZhPl0geGZzX2lsb2NrKzB4ZWEvMHgx MTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk2MDVdIElORk86 IHRhc2sgeGZzZHVtcDozODMxNyBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMu Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NjA2XSAgICAgICBO b3QgdGFpbnRlZCAzLjE3LjItSXNodC1WYW4gIzEKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBr ZXJuZWw6IFsgNjAwNi42NDk2MDddICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdf dGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KTm92IDEyIDA0OjQ1 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk2MTVdICBmZmZmODgwYjZhZWMzOTIwIDAw MDAwMDAwMDAwMDAwNDYgZmZmZjg4MGJlNzVmMDAwMCBmZmZmODgwYjZhZWMzZmQ4Ck5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NjE4XSAgMDAwMDAwMDAwMDFk M2I0MCAwMDAwMDAwMDAwMWQzYjQwIGZmZmY4ODE3ZmJjYTI1MTAgZmZmZjg4MGJlNzVmMDAw MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTYyMF0gIDdmZmZm ZmZmZmZmZmZmZmYgZmZmZjg4MTdiMDM4MzlmMCAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAw MDAwMDAwMDAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk2MjFd IENhbGwgVHJhY2U6Ck5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5 NjI0XSAgWzxmZmZmZmZmZjgxNjBjZWE0Pl0gc2NoZWR1bGUrMHgyNC8weDcwCk5vdiAxMiAw NDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NjI2XSAgWzxmZmZmZmZmZjgxNjEx NDA5Pl0gc2NoZWR1bGVfdGltZW91dCsweDIzOS8weDJjMApOb3YgMTIgMDQ6NDU6NDYgSXNo dGFyIGtlcm5lbDogWyA2MDA2LjY0OTYyOF0gIFs8ZmZmZmZmZmY4MTA3YWE4NT5dID8gbG9j YWxfY2xvY2srMHgyNS8weDMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYw MDYuNjQ5NjMwXSAgWzxmZmZmZmZmZjgxMDkzNzRlPl0gPyBwdXRfbG9ja19zdGF0cy5pc3Jh LjIzKzB4ZS8weDMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5 NjMzXSAgWzxmZmZmZmZmZjgxMDkzOGFlPl0gPyBsb2NrX3JlbGVhc2VfaG9sZHRpbWUucGFy dC4yNCsweDEzZS8weDE5MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2 LjY0OTYzNl0gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3BhcmVudF9pcCsweGQvMHg1 MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTYzOF0gIFs8ZmZm ZmZmZmY4MTYxMDU0OD5dIF9fZG93bl9jb21tb24rMHg5ZC8weGYwCk5vdiAxMiAwNDo0NTo0 NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NjQxXSAgWzxmZmZmZmZmZjgxMjg2ZDc1Pl0g PyBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2Vy bmVsOiBbIDYwMDYuNjQ5NjQzXSAgWzxmZmZmZmZmZjgxNjEwNWZhPl0gX19kb3duKzB4MTgv MHgxYQpOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY0NV0gIFs8 ZmZmZmZmZmY4MTA5MWQ0Yz5dIGRvd24rMHgzYy8weDUwCk5vdiAxMiAwNDo0NTo0NiBJc2h0 YXIga2VybmVsOiBbIDYwMDYuNjQ5NjQ3XSAgWzxmZmZmZmZmZjgxMjg2YjM3Pl0geGZzX2J1 Zl9sb2NrKzB4MzcvMHgxMTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAw Ni42NDk2NTBdICBbPGZmZmZmZmZmODEyODZkNzU+XSBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4 MmMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NjUyXSAgWzxm ZmZmZmZmZjgxMjg2ZWY1Pl0geGZzX2J1Zl9nZXRfbWFwKzB4MjUvMHgyMDAKTm92IDEyIDA0 OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk2NTVdICBbPGZmZmZmZmZmODEyODdk MDc+XSB4ZnNfYnVmX3JlYWRfbWFwKzB4MjcvMHgxNzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjAwNi42NDk2NTddICBbPGZmZmZmZmZmODEyYjQyZTk+XSB4ZnNfdHJh bnNfcmVhZF9idWZfbWFwKzB4MWQ5LzB4NTIwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2Vy bmVsOiBbIDYwMDYuNjQ5NjYwXSAgWzxmZmZmZmZmZjgxMjc2Nzc5Pl0geGZzX3JlYWRfYWdp KzB4ODkvMHgxMDAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk2 NjJdICBbPGZmZmZmZmZmODEyNzY4MWY+XSB4ZnNfaWFsbG9jX3JlYWRfYWdpKzB4MmYvMHhk MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY2NV0gIFs8ZmZm ZmZmZmY4MTI5YjkzNT5dIHhmc19idWxrc3RhdCsweDE2NS8weDRlMApOb3YgMTIgMDQ6NDU6 NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY2OF0gIFs8ZmZmZmZmZmY4MTA5NGM4ND5d ID8gX19sb2NrX2FjcXVpcmUuaXNyYS4zMSsweDJhNC8weGE0MApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY3MF0gIFs8ZmZmZmZmZmY4MTA5NGM4ND5dID8g X19sb2NrX2FjcXVpcmUuaXNyYS4zMSsweDJhNC8weGE0MApOb3YgMTIgMDQ6NDU6NDYgSXNo dGFyIGtlcm5lbDogWyA2MDA2LjY0OTY3M10gIFs8ZmZmZmZmZmY4MTI5YjYyMD5dID8geGZz X2J1bGtzdGF0X29uZV9pbnQrMHgzMTAvMHgzMTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBr ZXJuZWw6IFsgNjAwNi42NDk2NzVdICBbPGZmZmZmZmZmODEwNzU3M2Q+XSA/IGdldF9wYXJl bnRfaXArMHhkLzB4NTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42 NDk2NzhdICBbPGZmZmZmZmZmODEwNzU3YzE+XSA/IHByZWVtcHRfY291bnRfc3ViKzB4NDEv MHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY4MV0gIFs8 ZmZmZmZmZmY4MTJkMjNjMz5dID8gc2VjdXJpdHlfY2FwYWJsZSsweDEzLzB4MjAKTm92IDEy IDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk2ODRdICBbPGZmZmZmZmZmODEy OTExMWM+XSB4ZnNfaW9jX2J1bGtzdGF0KzB4Y2MvMHgxYTAKTm92IDEyIDA0OjQ1OjQ2IElz aHRhciBrZXJuZWw6IFsgNjAwNi42NDk2ODZdICBbPGZmZmZmZmZmODEyOTM2NWU+XSB4ZnNf ZmlsZV9pb2N0bCsweDgyZS8weGMyMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDog WyA2MDA2LjY0OTY4OV0gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3BhcmVudF9pcCsw eGQvMHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY5MV0g IFs8ZmZmZmZmZmY4MTA3NTdjMT5dID8gcHJlZW1wdF9jb3VudF9zdWIrMHg0MS8weDUwCk5v diAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NjkzXSAgWzxmZmZmZmZm ZjgxMDkzNzRlPl0gPyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8weDMwCk5vdiAxMiAw NDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5Njk2XSAgWzxmZmZmZmZmZjgxMDkz OGFlPl0gPyBsb2NrX3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEzZS8weDE5MApOb3Yg MTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTY5OV0gIFs8ZmZmZmZmZmY4 MTFlNGJkMz5dID8gZnNub3RpZnkrMHgyMjMvMHgzMzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjAwNi42NDk3MDBdICBbPGZmZmZmZmZmODExZTRhMmI+XSA/IGZzbm90 aWZ5KzB4N2IvMHgzMzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42 NDk3MDRdICBbPGZmZmZmZmZmODExYjhlM2M+XSBkb192ZnNfaW9jdGwrMHgyY2MvMHg0ZjAK Tm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3MDZdICBbPGZmZmZm ZmZmODExYjkwZTE+XSBTeVNfaW9jdGwrMHg4MS8weGEwCk5vdiAxMiAwNDo0NTo0NiBJc2h0 YXIga2VybmVsOiBbIDYwMDYuNjQ5NzA5XSAgWzxmZmZmZmZmZjgxNjEzMzUyPl0gc3lzdGVt X2NhbGxfZmFzdHBhdGgrMHgxNi8weDFiCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVs OiBbIDYwMDYuNjQ5NzEwXSBubyBsb2NrcyBoZWxkIGJ5IHhmc2R1bXAvMzgzMTcuCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzEzXSBJTkZPOiB0YXNrIHNl bmRtYWlsOjM4NTA4IGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25kcy4KTm92IDEy IDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3MTRdICAgICAgIE5vdCB0YWlu dGVkIDMuMTcuMi1Jc2h0LVZhbiAjMQpOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDog WyA2MDA2LjY0OTcxNV0gImVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3Rp bWVvdXRfc2VjcyIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLgpOb3YgMTIgMDQ6NDU6NDYgSXNo dGFyIGtlcm5lbDogWyA2MDA2LjY0OTcyNF0gIGZmZmY4ODBmMjIxZDc3MDAgMDAwMDAwMDAw MDAwMDA0NiBmZmZmODgwYThmMTZhNTEwIGZmZmY4ODBmMjIxZDdmZDgKTm92IDEyIDA0OjQ1 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3MjddICAwMDAwMDAwMDAwMWQzYjQwIDAw MDAwMDAwMDAxZDNiNDAgZmZmZjg4MTdmYmNhNGEyMCBmZmZmODgwYThmMTZhNTEwCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzI5XSAgN2ZmZmZmZmZmZmZm ZmZmZiBmZmZmODgwYmY3OTZkMzcwIDAwMDAwMDAwMDAwMDAwMDIgMDAwMDAwMDAwMDAwMDAw MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTczMF0gQ2FsbCBU cmFjZToKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3MzJdICBb PGZmZmZmZmZmODE2MGNlYTQ+XSBzY2hlZHVsZSsweDI0LzB4NzAKTm92IDEyIDA0OjQ1OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3MzRdICBbPGZmZmZmZmZmODE2MTE0MDk+XSBz Y2hlZHVsZV90aW1lb3V0KzB4MjM5LzB4MmMwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2Vy bmVsOiBbIDYwMDYuNjQ5NzM3XSAgWzxmZmZmZmZmZjgxMDdhYTg1Pl0gPyBsb2NhbF9jbG9j aysweDI1LzB4MzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3 MzldICBbPGZmZmZmZmZmODEwOTM3NGU+XSA/IHB1dF9sb2NrX3N0YXRzLmlzcmEuMjMrMHhl LzB4MzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3NDFdICBb PGZmZmZmZmZmODEwOTM4YWU+XSA/IGxvY2tfcmVsZWFzZV9ob2xkdGltZS5wYXJ0LjI0KzB4 MTNlLzB4MTkwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzQ0 XSAgWzxmZmZmZmZmZjgxMDc1NzNkPl0gPyBnZXRfcGFyZW50X2lwKzB4ZC8weDUwCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzQ2XSAgWzxmZmZmZmZmZjgx NjEwNTQ4Pl0gX19kb3duX2NvbW1vbisweDlkLzB4ZjAKTm92IDEyIDA0OjQ1OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjAwNi42NDk3NDldICBbPGZmZmZmZmZmODEyODZkNzU+XSA/IF94ZnNf YnVmX2ZpbmQrMHgxNjUvMHgyYzAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsg NjAwNi42NDk3NTFdICBbPGZmZmZmZmZmODE2MTA1ZmE+XSBfX2Rvd24rMHgxOC8weDFhCk5v diAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzUzXSAgWzxmZmZmZmZm ZjgxMDkxZDRjPl0gZG93bisweDNjLzB4NTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjAwNi42NDk3NTZdICBbPGZmZmZmZmZmODEyODZiMzc+XSB4ZnNfYnVmX2xvY2sr MHgzNy8weDExMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc1 OF0gIFs8ZmZmZmZmZmY4MTI4NmQ3NT5dIF94ZnNfYnVmX2ZpbmQrMHgxNjUvMHgyYzAKTm92 IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3NjFdICBbPGZmZmZmZmZm ODEyODZlZjU+XSB4ZnNfYnVmX2dldF9tYXArMHgyNS8weDIwMApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc2M10gIFs8ZmZmZmZmZmY4MTI4N2QwNz5dIHhm c19idWZfcmVhZF9tYXArMHgyNy8weDE3MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5l bDogWyA2MDA2LjY0OTc2NV0gIFs8ZmZmZmZmZmY4MTJiNDNhNj5dIHhmc190cmFuc19yZWFk X2J1Zl9tYXArMHgyOTYvMHg1MjAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsg NjAwNi42NDk3NjhdICBbPGZmZmZmZmZmODEyNzY3Nzk+XSB4ZnNfcmVhZF9hZ2krMHg4OS8w eDEwMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc3MV0gIFs8 ZmZmZmZmZmY4MTI3NjgxZj5dIHhmc19pYWxsb2NfcmVhZF9hZ2krMHgyZi8weGQwCk5vdiAx MiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzczXSAgWzxmZmZmZmZmZjgx Mjc3MWE4Pl0geGZzX2RpYWxsb2MrMHhjOC8weDI3MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFy IGtlcm5lbDogWyA2MDA2LjY0OTc3Nl0gIFs8ZmZmZmZmZmY4MTJhNDhmMT5dID8ga21lbV96 b25lX2FsbG9jKzB4YzEvMHhmMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2 MDA2LjY0OTc3OF0gIFs8ZmZmZmZmZmY4MTI5ODVjZD5dIHhmc19pYWxsb2MrMHg0ZC8weDUx MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc4MF0gIFs8ZmZm ZmZmZmY4MTI5OGFlNj5dIHhmc19kaXJfaWFsbG9jKzB4NTYvMHgyNjAKTm92IDEyIDA0OjQ1 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk3ODNdICBbPGZmZmZmZmZmODEyOThlZDU+ XSA/IHhmc19jcmVhdGUrMHgxOTUvMHg2MjAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjAwNi42NDk3ODVdICBbPGZmZmZmZmZmODEyOTcyNmE+XSA/IHhmc19pbG9jaysw eGVhLzB4MTEwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5Nzg4 XSAgWzxmZmZmZmZmZjgxMjk4ZjU4Pl0geGZzX2NyZWF0ZSsweDIxOC8weDYyMApOb3YgMTIg MDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc5MF0gIFs8ZmZmZmZmZmY4MTI5 NTU1MD5dIHhmc19nZW5lcmljX2NyZWF0ZSsweGMwLzB4MjIwCk5vdiAxMiAwNDo0NTo0NiBJ c2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5NzkzXSAgWzxmZmZmZmZmZjgxMjk1NmRmPl0geGZz X3ZuX21rbm9kKzB4Zi8weDIwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYw MDYuNjQ5Nzk1XSAgWzxmZmZmZmZmZjgxMjk1NzFlPl0geGZzX3ZuX2NyZWF0ZSsweGUvMHgx MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc5N10gIFs8ZmZm ZmZmZmY4MTFiMTQyNT5dIHZmc19jcmVhdGUrMHhjNS8weDEzMApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTc5OV0gIFs8ZmZmZmZmZmY4MTFiMjAyNj5dIGRv X2xhc3QrMHhiOTYvMHgxMzUwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYw MDYuNjQ5ODAxXSAgWzxmZmZmZmZmZjgxMWIwYmIzPl0gPyBpbm9kZV9wZXJtaXNzaW9uKzB4 MTMvMHg0MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTgwNF0g IFs8ZmZmZmZmZmY4MTFiNTAwMD5dID8gcGF0aF9sb29rdXBhdCsweDc1MC8weDdhMApOb3Yg MTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTgwNl0gIFs8ZmZmZmZmZmY4 MTFiNTEwOT5dIHBhdGhfb3BlbmF0KzB4YjkvMHg2OTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjAwNi42NDk4MDhdICBbPGZmZmZmZmZmODEwN2FhODU+XSA/IGxvY2Fs X2Nsb2NrKzB4MjUvMHgzMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2 LjY0OTgxMF0gIFs8ZmZmZmZmZmY4MTA5NGM4ND5dID8gX19sb2NrX2FjcXVpcmUuaXNyYS4z MSsweDJhNC8weGE0MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0 OTgxM10gIFs8ZmZmZmZmZmY4MTA3NTdjMT5dID8gcHJlZW1wdF9jb3VudF9zdWIrMHg0MS8w eDUwCk5vdiAxMiAwNDo0NTo0NiBJc2h0YXIga2VybmVsOiBbIDYwMDYuNjQ5ODE2XSAgWzxm ZmZmZmZmZjgxMWI2NmQ1Pl0gZG9fZmlscF9vcGVuKzB4MzUvMHg4MApOb3YgMTIgMDQ6NDU6 NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTgxOF0gIFs8ZmZmZmZmZmY4MTA3NTczZD5d ID8gZ2V0X3BhcmVudF9pcCsweGQvMHg1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5l bDogWyA2MDA2LjY0OTgyMF0gIFs8ZmZmZmZmZmY4MTYxMjYyYz5dID8gX3Jhd19zcGluX3Vu bG9jaysweDJjLzB4NTAKTm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42 NDk4MjNdICBbPGZmZmZmZmZmODExYzNkNmY+XSA/IF9fYWxsb2NfZmQrMHgxMGYvMHgxNDAK Tm92IDEyIDA0OjQ1OjQ2IElzaHRhciBrZXJuZWw6IFsgNjAwNi42NDk4MjVdICBbPGZmZmZm ZmZmODExYTQ4ODY+XSBkb19zeXNfb3BlbisweDEyNi8weDIzMApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTgyN10gIFs8ZmZmZmZmZmY4MTFhNDlhOT5dIFN5 U19vcGVuKzB4MTkvMHgyMApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2 LjY0OTgzMF0gIFs8ZmZmZmZmZmY4MTYxMzM1Mj5dIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4 MTYvMHgxYgpOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTgzMV0g NCBsb2NrcyBoZWxkIGJ5IHNlbmRtYWlsLzM4NTA4OgpOb3YgMTIgMDQ6NDU6NDYgSXNodGFy IGtlcm5lbDogWyA2MDA2LjY0OTgzN10gICMwOiAgKHNiX3dyaXRlcnMjMyl7Li4uLi4ufSwg YXQ6IFs8ZmZmZmZmZmY4MTFjNjJiZj5dIG1udF93YW50X3dyaXRlKzB4MWYvMHg1MApOb3Yg MTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTg0MV0gICMxOiAgKCZ0eXBl LT5pX211dGV4X2Rpcl9rZXkpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODExYjE3NTg+XSBk b19sYXN0KzB4MmM4LzB4MTM1MApOb3YgMTIgMDQ6NDU6NDYgSXNodGFyIGtlcm5lbDogWyA2 MDA2LjY0OTg0NV0gICMyOiAgKHNiX2ludGVybmFsKXsuLi4uLi59LCBhdDogWzxmZmZmZmZm ZjgxMmEzMDhmPl0geGZzX3RyYW5zX2FsbG9jKzB4MWYvMHg0MApOb3YgMTIgMDQ6NDU6NDYg SXNodGFyIGtlcm5lbDogWyA2MDA2LjY0OTg1MF0gICMzOiAgKCZ4ZnNfZGlyX2lsb2NrX2Ns YXNzLzEpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODEyOTcyNmE+XSB4ZnNfaWxvY2srMHhl YS8weDExMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc2NDI1OV0g SU5GTzogdGFzayBubWJkOjE5NTQgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNvbmRz LgpOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc3MDU0OF0gICAgICAg Tm90IHRhaW50ZWQgMy4xNy4yLUlzaHQtVmFuICMxCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIg a2VybmVsOiBbIDYxMjYuNzc1MTk5XSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5n X3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuCk5vdiAxMiAwNDo0 Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMDgyXSAgZmZmZjg4MTdmOTJmMzcwMCAw MDAwMDAwMDAwMDAwMDQ2IGZmZmY4ODBiZmE5YjI1MTAgZmZmZjg4MTdmOTJmM2ZkOApOb3Yg MTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzA4NV0gIDAwMDAwMDAwMDAx ZDNiNDAgMDAwMDAwMDAwMDFkM2I0MCBmZmZmZmZmZjgxYzE5NGMwIGZmZmY4ODBiZmE5YjI1 MTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMwODddICA3ZmZm ZmZmZmZmZmZmZmZmIGZmZmY4ODBiZjc5NmQzNzAgMDAwMDAwMDAwMDAwMDAwMiAwMDAwMDAw MDAwMDAwMDAwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMDg4 XSBDYWxsIFRyYWNlOgpOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4 MzA5Nl0gIFs8ZmZmZmZmZmY4MTYwY2VhND5dIHNjaGVkdWxlKzB4MjQvMHg3MApOb3YgMTIg MDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzA5OV0gIFs8ZmZmZmZmZmY4MTYx MTQwOT5dIHNjaGVkdWxlX3RpbWVvdXQrMHgyMzkvMHgyYzAKTm92IDEyIDA0OjQ3OjQ2IElz aHRhciBrZXJuZWw6IFsgNjEyNi43ODMxMDNdICBbPGZmZmZmZmZmODEwN2FhODU+XSA/IGxv Y2FsX2Nsb2NrKzB4MjUvMHgzMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2 MTI2Ljc4MzEwN10gIFs8ZmZmZmZmZmY4MTA5Mzc0ZT5dID8gcHV0X2xvY2tfc3RhdHMuaXNy YS4yMysweGUvMHgzMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4 MzExMF0gIFs8ZmZmZmZmZmY4MTA5MzhhZT5dID8gbG9ja19yZWxlYXNlX2hvbGR0aW1lLnBh cnQuMjQrMHgxM2UvMHgxOTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEy Ni43ODMxMTRdICBbPGZmZmZmZmZmODEwNzU3M2Q+XSA/IGdldF9wYXJlbnRfaXArMHhkLzB4 NTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMxMTddICBbPGZm ZmZmZmZmODE2MTA1NDg+XSBfX2Rvd25fY29tbW9uKzB4OWQvMHhmMApOb3YgMTIgMDQ6NDc6 NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzEyMl0gIFs8ZmZmZmZmZmY4MTI4NmQ3NT5d ID8gX3hmc19idWZfZmluZCsweDE2NS8weDJjMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtl cm5lbDogWyA2MTI2Ljc4MzEyNF0gIFs8ZmZmZmZmZmY4MTYxMDVmYT5dIF9fZG93bisweDE4 LzB4MWEKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMxMjddICBb PGZmZmZmZmZmODEwOTFkNGM+XSBkb3duKzB4M2MvMHg1MApOb3YgMTIgMDQ6NDc6NDYgSXNo dGFyIGtlcm5lbDogWyA2MTI2Ljc4MzEyOV0gIFs8ZmZmZmZmZmY4MTI4NmIzNz5dIHhmc19i dWZfbG9jaysweDM3LzB4MTEwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYx MjYuNzgzMTMyXSAgWzxmZmZmZmZmZjgxMjg2ZDc1Pl0gX3hmc19idWZfZmluZCsweDE2NS8w eDJjMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzEzNV0gIFs8 ZmZmZmZmZmY4MTI4NmVmNT5dIHhmc19idWZfZ2V0X21hcCsweDI1LzB4MjAwCk5vdiAxMiAw NDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMTUxXSAgWzxmZmZmZmZmZjgxMjg3 ZDA3Pl0geGZzX2J1Zl9yZWFkX21hcCsweDI3LzB4MTcwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0 YXIga2VybmVsOiBbIDYxMjYuNzgzMTU1XSAgWzxmZmZmZmZmZjgxMmI0M2E2Pl0geGZzX3Ry YW5zX3JlYWRfYnVmX21hcCsweDI5Ni8weDUyMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtl cm5lbDogWyA2MTI2Ljc4MzE2MF0gIFs8ZmZmZmZmZmY4MTI3Njc3OT5dIHhmc19yZWFkX2Fn aSsweDg5LzB4MTAwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgz MTYzXSAgWzxmZmZmZmZmZjgxMjc2ODFmPl0geGZzX2lhbGxvY19yZWFkX2FnaSsweDJmLzB4 ZDAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMxNjZdICBbPGZm ZmZmZmZmODEyNzcxYTg+XSB4ZnNfZGlhbGxvYysweGM4LzB4MjcwCk5vdiAxMiAwNDo0Nzo0 NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMTY5XSAgWzxmZmZmZmZmZjgxMmE0OGYxPl0g PyBrbWVtX3pvbmVfYWxsb2MrMHhjMS8weGYwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2Vy bmVsOiBbIDYxMjYuNzgzMTc2XSAgWzxmZmZmZmZmZjgxMjk4NWNkPl0geGZzX2lhbGxvYysw eDRkLzB4NTEwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMTgz XSAgWzxmZmZmZmZmZjgxMjk4YWU2Pl0geGZzX2Rpcl9pYWxsb2MrMHg1Ni8weDI2MApOb3Yg MTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzE5Ml0gIFs8ZmZmZmZmZmY4 MTI5OGVkNT5dID8geGZzX2NyZWF0ZSsweDE5NS8weDYyMApOb3YgMTIgMDQ6NDc6NDYgSXNo dGFyIGtlcm5lbDogWyA2MTI2Ljc4MzE5OV0gIFs8ZmZmZmZmZmY4MTI5NzI2YT5dID8geGZz X2lsb2NrKzB4ZWEvMHgxMTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEy Ni43ODMyMDRdICBbPGZmZmZmZmZmODEyOThmNTg+XSB4ZnNfY3JlYXRlKzB4MjE4LzB4NjIw Ck5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMjExXSAgWzxmZmZm ZmZmZjgxMjk1NTUwPl0geGZzX2dlbmVyaWNfY3JlYXRlKzB4YzAvMHgyMjAKTm92IDEyIDA0 OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMyMjFdICBbPGZmZmZmZmZmODEyOTU2 ZGY+XSB4ZnNfdm5fbWtub2QrMHhmLzB4MjAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjEyNi43ODMyMzJdICBbPGZmZmZmZmZmODEyOTU3MWU+XSB4ZnNfdm5fY3JlYXRl KzB4ZS8weDEwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMjQw XSAgWzxmZmZmZmZmZjgxMWIxNDI1Pl0gdmZzX2NyZWF0ZSsweGM1LzB4MTMwCk5vdiAxMiAw NDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMjQ0XSAgWzxmZmZmZmZmZjgxMWIy MDI2Pl0gZG9fbGFzdCsweGI5Ni8weDEzNTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjEyNi43ODMyNTJdICBbPGZmZmZmZmZmODExYjBiYjM+XSA/IGlub2RlX3Blcm1p c3Npb24rMHgxMy8weDQwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYu NzgzMjU3XSAgWzxmZmZmZmZmZjgxMWI1MDAxPl0gPyBwYXRoX2xvb2t1cGF0KzB4NzUxLzB4 N2EwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMjY0XSAgWzxm ZmZmZmZmZjgxMWI1MTA5Pl0gcGF0aF9vcGVuYXQrMHhiOS8weDY5MApOb3YgMTIgMDQ6NDc6 NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzI2OF0gIFs8ZmZmZmZmZmY4MTA3YWE4NT5d ID8gbG9jYWxfY2xvY2srMHgyNS8weDMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVs OiBbIDYxMjYuNzgzMjc1XSAgWzxmZmZmZmZmZjgxMDk0Yzg0Pl0gPyBfX2xvY2tfYWNxdWly ZS5pc3JhLjMxKzB4MmE0LzB4YTQwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBb IDYxMjYuNzgzMjgwXSAgWzxmZmZmZmZmZjgxMDc1N2MxPl0gPyBwcmVlbXB0X2NvdW50X3N1 YisweDQxLzB4NTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMy OTNdICBbPGZmZmZmZmZmODExYjY2ZDU+XSBkb19maWxwX29wZW4rMHgzNS8weDgwCk5vdiAx MiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMjk5XSAgWzxmZmZmZmZmZjgx NjEyNjJjPl0gPyBfcmF3X3NwaW5fdW5sb2NrKzB4MmMvMHg1MApOb3YgMTIgMDQ6NDc6NDYg SXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzMwNV0gIFs8ZmZmZmZmZmY4MTFjM2Q2Zj5dID8g X19hbGxvY19mZCsweDEwZi8weDE0MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDog WyA2MTI2Ljc4MzMxMl0gIFs8ZmZmZmZmZmY4MTFhNDg4Nj5dIGRvX3N5c19vcGVuKzB4MTI2 LzB4MjMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMzIwXSAg WzxmZmZmZmZmZjgxMWE0OWE5Pl0gU3lTX29wZW4rMHgxOS8weDIwCk5vdiAxMiAwNDo0Nzo0 NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzMzI2XSAgWzxmZmZmZmZmZjgxNjEzMzUyPl0g c3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxNi8weDFiCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIg a2VybmVsOiBbIDYxMjYuNzgzMzI5XSA0IGxvY2tzIGhlbGQgYnkgbm1iZC8xOTU0OgpOb3Yg MTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzMzMl0gICMwOiAgKHNiX3dy aXRlcnMjMyl7Li4uLi4ufSwgYXQ6IFs8ZmZmZmZmZmY4MTFjNjJiZj5dIG1udF93YW50X3dy aXRlKzB4MWYvMHg1MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4 MzM1OV0gICMxOiAgKCZ0eXBlLT5pX211dGV4X2Rpcl9rZXkpey4uLi4uLn0sIGF0OiBbPGZm ZmZmZmZmODExYjE3NTg+XSBkb19sYXN0KzB4MmM4LzB4MTM1MApOb3YgMTIgMDQ6NDc6NDYg SXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzM2NV0gICMyOiAgKHNiX2ludGVybmFsKXsuLi4u Li59LCBhdDogWzxmZmZmZmZmZjgxMmEzMDhmPl0geGZzX3RyYW5zX2FsbG9jKzB4MWYvMHg0 MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzM3MF0gICMzOiAg KCZ4ZnNfZGlyX2lsb2NrX2NsYXNzLzEpey4uLi4uLn0sIGF0OiBbPGZmZmZmZmZmODEyOTcy NmE+XSB4ZnNfaWxvY2srMHhlYS8weDExMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5l bDogWyA2MTI2Ljc4MzM4Ml0gSU5GTzogdGFzayB0cmFuc21pc3Npb24tZGE6MjQ5NiBibG9j a2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIg a2VybmVsOiBbIDYxMjYuNzgzMzgzXSAgICAgICBOb3QgdGFpbnRlZCAzLjE3LjItSXNodC1W YW4gIzEKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODMzODRdICJl Y2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2Fi bGVzIHRoaXMgbWVzc2FnZS4KTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEy Ni43ODMzOTJdICBmZmZmODgxN2Y5M2QzNzAwIDAwMDAwMDAwMDAwMDAwNDYgZmZmZjg4MTdm MWRlNGEyMCBmZmZmODgxN2Y5M2QzZmQ4Ck5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVs OiBbIDYxMjYuNzgzMzk1XSAgMDAwMDAwMDAwMDFkM2I0MCAwMDAwMDAwMDAwMWQzYjQwIGZm ZmY4ODE3ZmJjOGE1MTAgZmZmZjg4MTdmMWRlNGEyMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFy IGtlcm5lbDogWyA2MTI2Ljc4MzQwN10gIDdmZmZmZmZmZmZmZmZmZmYgZmZmZjg4MTdiMDM4 MzlmMCAwMDAwMDAwMDAwMDAwMDAyIDAwMDAwMDAwMDAwMDAwMDAKTm92IDEyIDA0OjQ3OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0MDldIENhbGwgVHJhY2U6Ck5vdiAxMiAwNDo0 Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDEzXSAgWzxmZmZmZmZmZjgxNjBjZWE0 Pl0gc2NoZWR1bGUrMHgyNC8weDcwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBb IDYxMjYuNzgzNDE3XSAgWzxmZmZmZmZmZjgxNjExNDA5Pl0gc2NoZWR1bGVfdGltZW91dCsw eDIzOS8weDJjMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzQy MV0gIFs8ZmZmZmZmZmY4MTA3YWE4NT5dID8gbG9jYWxfY2xvY2srMHgyNS8weDMwCk5vdiAx MiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDI1XSAgWzxmZmZmZmZmZjgx MDkzNzRlPl0gPyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8weDMwCk5vdiAxMiAwNDo0 Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDI4XSAgWzxmZmZmZmZmZjgxMDkzOGFl Pl0gPyBsb2NrX3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEzZS8weDE5MApOb3YgMTIg MDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzQzM10gIFs8ZmZmZmZmZmY4MTA3 NTczZD5dID8gZ2V0X3BhcmVudF9pcCsweGQvMHg1MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFy IGtlcm5lbDogWyA2MTI2Ljc4MzQzNV0gIFs8ZmZmZmZmZmY4MTYxMDU0OD5dIF9fZG93bl9j b21tb24rMHg5ZC8weGYwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYu NzgzNDM4XSAgWzxmZmZmZmZmZjgxMjg2ZDc1Pl0gPyBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4 MmMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDQwXSAgWzxm ZmZmZmZmZjgxNjEwNWZhPl0gX19kb3duKzB4MTgvMHgxYQpOb3YgMTIgMDQ6NDc6NDYgSXNo dGFyIGtlcm5lbDogWyA2MTI2Ljc4MzQ0M10gIFs8ZmZmZmZmZmY4MTA5MWQ0Yz5dIGRvd24r MHgzYy8weDUwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDQ1 XSAgWzxmZmZmZmZmZjgxMjg2YjM3Pl0geGZzX2J1Zl9sb2NrKzB4MzcvMHgxMTAKTm92IDEy IDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0NDhdICBbPGZmZmZmZmZmODEy ODZkNzU+XSBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0 YXIga2VybmVsOiBbIDYxMjYuNzgzNDUxXSAgWzxmZmZmZmZmZjgxMjg2ZWY1Pl0geGZzX2J1 Zl9nZXRfbWFwKzB4MjUvMHgyMDAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsg NjEyNi43ODM0NTRdICBbPGZmZmZmZmZmODEyODdkMDc+XSB4ZnNfYnVmX3JlYWRfbWFwKzB4 MjcvMHgxNzAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0NTZd ICBbPGZmZmZmZmZmODEyYjQzYTY+XSB4ZnNfdHJhbnNfcmVhZF9idWZfbWFwKzB4Mjk2LzB4 NTIwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDU5XSAgWzxm ZmZmZmZmZjgxMjc2Nzc5Pl0geGZzX3JlYWRfYWdpKzB4ODkvMHgxMDAKTm92IDEyIDA0OjQ3 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0NjJdICBbPGZmZmZmZmZmODEyNzY4MWY+ XSB4ZnNfaWFsbG9jX3JlYWRfYWdpKzB4MmYvMHhkMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFy IGtlcm5lbDogWyA2MTI2Ljc4MzQ2NV0gIFs8ZmZmZmZmZmY4MTI3NzFhOD5dIHhmc19kaWFs bG9jKzB4YzgvMHgyNzAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43 ODM0NjddICBbPGZmZmZmZmZmODEyYTQ4ZjE+XSA/IGttZW1fem9uZV9hbGxvYysweGMxLzB4 ZjAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0NzBdICBbPGZm ZmZmZmZmODEyOTg1Y2Q+XSB4ZnNfaWFsbG9jKzB4NGQvMHg1MTAKTm92IDEyIDA0OjQ3OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0NzNdICBbPGZmZmZmZmZmODEyOThhZTY+XSB4 ZnNfZGlyX2lhbGxvYysweDU2LzB4MjYwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVs OiBbIDYxMjYuNzgzNDc1XSAgWzxmZmZmZmZmZjgxMjk4ZWQ1Pl0gPyB4ZnNfY3JlYXRlKzB4 MTk1LzB4NjIwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNDc4 XSAgWzxmZmZmZmZmZjgxMjk3MjZhPl0gPyB4ZnNfaWxvY2srMHhlYS8weDExMApOb3YgMTIg MDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzQ4MF0gIFs8ZmZmZmZmZmY4MTI5 OGY1OD5dIHhmc19jcmVhdGUrMHgyMTgvMHg2MjAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBr ZXJuZWw6IFsgNjEyNi43ODM0ODNdICBbPGZmZmZmZmZmODEyOTU1NTA+XSB4ZnNfZ2VuZXJp Y19jcmVhdGUrMHhjMC8weDIyMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2 MTI2Ljc4MzQ4Nl0gIFs8ZmZmZmZmZmY4MTI5NTZkZj5dIHhmc192bl9ta25vZCsweGYvMHgy MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzQ4OF0gIFs8ZmZm ZmZmZmY4MTI5NTcxZT5dIHhmc192bl9jcmVhdGUrMHhlLzB4MTAKTm92IDEyIDA0OjQ3OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0OTFdICBbPGZmZmZmZmZmODExYjE0MjU+XSB2 ZnNfY3JlYXRlKzB4YzUvMHgxMzAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsg NjEyNi43ODM0OTNdICBbPGZmZmZmZmZmODExYjIwMjY+XSBkb19sYXN0KzB4Yjk2LzB4MTM1 MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzQ5NV0gIFs8ZmZm ZmZmZmY4MTFiMGJiMz5dID8gaW5vZGVfcGVybWlzc2lvbisweDEzLzB4NDAKTm92IDEyIDA0 OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM0OThdICBbPGZmZmZmZmZmODExYjUw MDE+XSA/IHBhdGhfbG9va3VwYXQrMHg3NTEvMHg3YTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRh ciBrZXJuZWw6IFsgNjEyNi43ODM1MDBdICBbPGZmZmZmZmZmODExYjUxMDk+XSBwYXRoX29w ZW5hdCsweGI5LzB4NjkwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYu NzgzNTAzXSAgWzxmZmZmZmZmZjgxMDdhYTg1Pl0gPyBsb2NhbF9jbG9jaysweDI1LzB4MzAK Tm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1MDVdICBbPGZmZmZm ZmZmODEwOTRjODQ+XSA/IF9fbG9ja19hY3F1aXJlLmlzcmEuMzErMHgyYTQvMHhhNDAKTm92 IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1MDhdICBbPGZmZmZmZmZm ODEwNzU3YzE+XSA/IHByZWVtcHRfY291bnRfc3ViKzB4NDEvMHg1MApOb3YgMTIgMDQ6NDc6 NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzUxMV0gIFs8ZmZmZmZmZmY4MTFiNjZkNT5d IGRvX2ZpbHBfb3BlbisweDM1LzB4ODAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6 IFsgNjEyNi43ODM1MTNdICBbPGZmZmZmZmZmODE2MTI2MmM+XSA/IF9yYXdfc3Bpbl91bmxv Y2srMHgyYy8weDUwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgz NTE2XSAgWzxmZmZmZmZmZjgxMWMzZDZmPl0gPyBfX2FsbG9jX2ZkKzB4MTBmLzB4MTQwCk5v diAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNTE4XSAgWzxmZmZmZmZm ZjgxMWE0ODg2Pl0gZG9fc3lzX29wZW4rMHgxMjYvMHgyMzAKTm92IDEyIDA0OjQ3OjQ2IElz aHRhciBrZXJuZWw6IFsgNjEyNi43ODM1MjFdICBbPGZmZmZmZmZmODExYTQ5YTk+XSBTeVNf b3BlbisweDE5LzB4MjAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43 ODM1MjNdICBbPGZmZmZmZmZmODE2MTMzNTI+XSBzeXN0ZW1fY2FsbF9mYXN0cGF0aCsweDE2 LzB4MWIKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1MjVdIDQg bG9ja3MgaGVsZCBieSB0cmFuc21pc3Npb24tZGEvMjQ5NjoKTm92IDEyIDA0OjQ3OjQ2IElz aHRhciBrZXJuZWw6IFsgNjEyNi43ODM1MzFdICAjMDogIChzYl93cml0ZXJzIzMpey4uLi4u Ln0sIGF0OiBbPGZmZmZmZmZmODExYzYyYmY+XSBtbnRfd2FudF93cml0ZSsweDFmLzB4NTAK Tm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1MzZdICAjMTogICgm dHlwZS0+aV9tdXRleF9kaXJfa2V5KXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMWIxNzU4 Pl0gZG9fbGFzdCsweDJjOC8weDEzNTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6 IFsgNjEyNi43ODM1NDBdICAjMjogIChzYl9pbnRlcm5hbCl7Li4uLi4ufSwgYXQ6IFs8ZmZm ZmZmZmY4MTJhMzA4Zj5dIHhmc190cmFuc19hbGxvYysweDFmLzB4NDAKTm92IDEyIDA0OjQ3 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1NDZdICAjMzogICgmeGZzX2Rpcl9pbG9j a19jbGFzcy8xKXsuLi4uLi59LCBhdDogWzxmZmZmZmZmZjgxMjk3MjZhPl0geGZzX2lsb2Nr KzB4ZWEvMHgxMTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1 NzZdIElORk86IHRhc2sgeGZzZHVtcDozODMxNyBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIw IHNlY29uZHMuCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNTc3 XSAgICAgICBOb3QgdGFpbnRlZCAzLjE3LjItSXNodC1WYW4gIzEKTm92IDEyIDA0OjQ3OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1NzhdICJlY2hvIDAgPiAvcHJvYy9zeXMva2Vy bmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KTm92 IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM1ODddICBmZmZmODgwYjZh ZWMzOTIwIDAwMDAwMDAwMDAwMDAwNDYgZmZmZjg4MGJlNzVmMDAwMCBmZmZmODgwYjZhZWMz ZmQ4Ck5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNTg5XSAgMDAw MDAwMDAwMDFkM2I0MCAwMDAwMDAwMDAwMWQzYjQwIGZmZmY4ODE3ZmJjYTI1MTAgZmZmZjg4 MGJlNzVmMDAwMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzU5 Ml0gIDdmZmZmZmZmZmZmZmZmZmYgZmZmZjg4MTdiMDM4MzlmMCAwMDAwMDAwMDAwMDAwMDAy IDAwMDAwMDAwMDAwMDAwMDAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEy Ni43ODM1OTNdIENhbGwgVHJhY2U6Ck5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBb IDYxMjYuNzgzNTk1XSAgWzxmZmZmZmZmZjgxNjBjZWE0Pl0gc2NoZWR1bGUrMHgyNC8weDcw Ck5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNTk4XSAgWzxmZmZm ZmZmZjgxNjExNDA5Pl0gc2NoZWR1bGVfdGltZW91dCsweDIzOS8weDJjMApOb3YgMTIgMDQ6 NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzYwMF0gIFs8ZmZmZmZmZmY4MTA3YWE4 NT5dID8gbG9jYWxfY2xvY2srMHgyNS8weDMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2Vy bmVsOiBbIDYxMjYuNzgzNjAzXSAgWzxmZmZmZmZmZjgxMDkzNzRlPl0gPyBwdXRfbG9ja19z dGF0cy5pc3JhLjIzKzB4ZS8weDMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBb IDYxMjYuNzgzNjA2XSAgWzxmZmZmZmZmZjgxMDkzOGFlPl0gPyBsb2NrX3JlbGVhc2VfaG9s ZHRpbWUucGFydC4yNCsweDEzZS8weDE5MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5l bDogWyA2MTI2Ljc4MzYwOF0gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3BhcmVudF9p cCsweGQvMHg1MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzYx MV0gIFs8ZmZmZmZmZmY4MTYxMDU0OD5dIF9fZG93bl9jb21tb24rMHg5ZC8weGYwCk5vdiAx MiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjE0XSAgWzxmZmZmZmZmZjgx Mjg2ZDc1Pl0gPyBfeGZzX2J1Zl9maW5kKzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0Nzo0NiBJ c2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjE2XSAgWzxmZmZmZmZmZjgxNjEwNWZhPl0gX19k b3duKzB4MTgvMHgxYQpOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4 MzYxOF0gIFs8ZmZmZmZmZmY4MTA5MWQ0Yz5dIGRvd24rMHgzYy8weDUwCk5vdiAxMiAwNDo0 Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjIxXSAgWzxmZmZmZmZmZjgxMjg2YjM3 Pl0geGZzX2J1Zl9sb2NrKzB4MzcvMHgxMTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJu ZWw6IFsgNjEyNi43ODM2MjRdICBbPGZmZmZmZmZmODEyODZkNzU+XSBfeGZzX2J1Zl9maW5k KzB4MTY1LzB4MmMwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgz NjI2XSAgWzxmZmZmZmZmZjgxMjg2ZWY1Pl0geGZzX2J1Zl9nZXRfbWFwKzB4MjUvMHgyMDAK Tm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2MjldICBbPGZmZmZm ZmZmODEyODdkMDc+XSB4ZnNfYnVmX3JlYWRfbWFwKzB4MjcvMHgxNzAKTm92IDEyIDA0OjQ3 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2MzJdICBbPGZmZmZmZmZmODEyYjQyZTk+ XSB4ZnNfdHJhbnNfcmVhZF9idWZfbWFwKzB4MWQ5LzB4NTIwCk5vdiAxMiAwNDo0Nzo0NiBJ c2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjM0XSAgWzxmZmZmZmZmZjgxMjc2Nzc5Pl0geGZz X3JlYWRfYWdpKzB4ODkvMHgxMDAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsg NjEyNi43ODM2MzddICBbPGZmZmZmZmZmODEyNzY4MWY+XSB4ZnNfaWFsbG9jX3JlYWRfYWdp KzB4MmYvMHhkMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzY0 MF0gIFs8ZmZmZmZmZmY4MTI5YjkzNT5dIHhmc19idWxrc3RhdCsweDE2NS8weDRlMApOb3Yg MTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzY0M10gIFs8ZmZmZmZmZmY4 MTA5NGM4ND5dID8gX19sb2NrX2FjcXVpcmUuaXNyYS4zMSsweDJhNC8weGE0MApOb3YgMTIg MDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzY0Nl0gIFs8ZmZmZmZmZmY4MTA5 NGM4ND5dID8gX19sb2NrX2FjcXVpcmUuaXNyYS4zMSsweDJhNC8weGE0MApOb3YgMTIgMDQ6 NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzY0OF0gIFs8ZmZmZmZmZmY4MTI5YjYy MD5dID8geGZzX2J1bGtzdGF0X29uZV9pbnQrMHgzMTAvMHgzMTAKTm92IDEyIDA0OjQ3OjQ2 IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2NTFdICBbPGZmZmZmZmZmODEwNzU3M2Q+XSA/ IGdldF9wYXJlbnRfaXArMHhkLzB4NTAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6 IFsgNjEyNi43ODM2NTRdICBbPGZmZmZmZmZmODEwNzU3YzE+XSA/IHByZWVtcHRfY291bnRf c3ViKzB4NDEvMHg1MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4 MzY1OF0gIFs8ZmZmZmZmZmY4MTJkMjNjMz5dID8gc2VjdXJpdHlfY2FwYWJsZSsweDEzLzB4 MjAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2NjBdICBbPGZm ZmZmZmZmODEyOTExMWM+XSB4ZnNfaW9jX2J1bGtzdGF0KzB4Y2MvMHgxYTAKTm92IDEyIDA0 OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2NjNdICBbPGZmZmZmZmZmODEyOTM2 NWU+XSB4ZnNfZmlsZV9pb2N0bCsweDgyZS8weGMyMApOb3YgMTIgMDQ6NDc6NDYgSXNodGFy IGtlcm5lbDogWyA2MTI2Ljc4MzY2NV0gIFs8ZmZmZmZmZmY4MTA3NTczZD5dID8gZ2V0X3Bh cmVudF9pcCsweGQvMHg1MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2 Ljc4MzY2OF0gIFs8ZmZmZmZmZmY4MTA3NTdjMT5dID8gcHJlZW1wdF9jb3VudF9zdWIrMHg0 MS8weDUwCk5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjcxXSAg WzxmZmZmZmZmZjgxMDkzNzRlPl0gPyBwdXRfbG9ja19zdGF0cy5pc3JhLjIzKzB4ZS8weDMw Ck5vdiAxMiAwNDo0Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjczXSAgWzxmZmZm ZmZmZjgxMDkzOGFlPl0gPyBsb2NrX3JlbGVhc2VfaG9sZHRpbWUucGFydC4yNCsweDEzZS8w eDE5MApOb3YgMTIgMDQ6NDc6NDYgSXNodGFyIGtlcm5lbDogWyA2MTI2Ljc4MzY3Nl0gIFs8 ZmZmZmZmZmY4MTFlNGJkMz5dID8gZnNub3RpZnkrMHgyMjMvMHgzMzAKTm92IDEyIDA0OjQ3 OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2NzhdICBbPGZmZmZmZmZmODExZTRhMmI+ XSA/IGZzbm90aWZ5KzB4N2IvMHgzMzAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6 IFsgNjEyNi43ODM2ODJdICBbPGZmZmZmZmZmODExYjhlM2M+XSBkb192ZnNfaW9jdGwrMHgy Y2MvMHg0ZjAKTm92IDEyIDA0OjQ3OjQ2IElzaHRhciBrZXJuZWw6IFsgNjEyNi43ODM2ODRd ICBbPGZmZmZmZmZmODExYjkwZTE+XSBTeVNfaW9jdGwrMHg4MS8weGEwCk5vdiAxMiAwNDo0 Nzo0NiBJc2h0YXIga2VybmVsOiBbIDYxMjYuNzgzNjg3XSAgWzxmZmZmZmZmZjgxNjEzMzUy Pl0gc3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxNi8weDFiCk5vdiAxMiAwNDo0Nzo0NiBJc2h0 YXIga2VybmVsOiBbIDYxMjYuNzgzNjg5XSBubyBsb2NrcyBoZWxkIGJ5IHhmc2R1bXAvMzgz MTcuCk5vdiAxMiAwNTowNjowMCBJc2h0YXIgeGluZXRkWzE5ODVdOiBFeGl0aW5nLi4uCk5v diAxMiAwNTowNjowMCBJc2h0YXIgd2luYmluZGRbMjQ5OF06IFsyMDE0LzExLzEyIDA1OjA2 OjAwLCAgMF0gd2luYmluZGQvd2luYmluZGQuYzoyMTIod2luYmluZGRfc2lnX3Rlcm1faGFu ZGxlcikKTm92IDEyIDA1OjA2OjAwIElzaHRhciB3aW5iaW5kZFsyNDk4XTogICBHb3Qgc2ln WzE1XSB0ZXJtaW5hdGUgKGlzX3BhcmVudD0xKQpOb3YgMTIgMDU6MTU6NDkgSXNodGFyIG1j ZWxvZzogS2VybmVsIGRvZXMgbm90IHN1cHBvcnQgcGFnZSBvZmZsaW5lIGludGVyZmFjZQpO b3YgMTIgMDU6MTU6NTAgSXNodGFyIHhpbmV0ZFsyMDQ4XTogL2V0Yy94aW5ldGQuZC9SQ1Mg aXMgbm90IGEgcmVndWxhciBmaWxlLiBJdCBpcyBiZWluZyBza2lwcGVkLgpOb3YgMTIgMDU6 MTU6NTEgSXNodGFyIHhpbmV0ZFsyMDQ4XTogU2VydmVyIC91c3Ivc2Jpbi9zYW5lZCBpcyBu b3QgZXhlY3V0YWJsZSBbZmlsZT0vZXRjL3hpbmV0ZC5kL3NhbmUtcG9ydF0gW2xpbmU9MTJd Ck5vdiAxMiAwNToxNTo1MSBJc2h0YXIgeGluZXRkWzIwNDhdOiBFcnJvciBwYXJzaW5nIGF0 dHJpYnV0ZSBzZXJ2ZXIgLSBESVNBQkxJTkcgU0VSVklDRSBbZmlsZT0vZXRjL3hpbmV0ZC5k L3NhbmUtcG9ydF0gW2xpbmU9MTJdCk5vdiAxMiAwNToxNTo1MSBJc2h0YXIga2VybmVsOiBb ICAgMjYuOTQ5OTkxXSBpcCAoMTU2MikgdXNlZCBncmVhdGVzdCBzdGFjayBkZXB0aDogMTEx NDQgYnl0ZXMgbGVmdApOb3YgMTIgMDU6MTU6NTEgSXNodGFyIGtlcm5lbDogWyAgIDMwLjEy MjQ1OV0gLCByZWNlaXZlICYgdHJhbnNtaXQgZmxvdyBjb250cm9sIE9OCk5vdiAxMiAwNTox NTo1MiBJc2h0YXIgbmFtZWRbMjMxNl06IHVzaW5nIGJ1aWx0LWluIERMViBrZXkgZm9yIHZp ZXcgZXh0ZXJuYWwKTm92IDEyIDA1OjE1OjUyIElzaHRhciBuYW1lZFsyMzE2XTogdXNpbmcg YnVpbHQtaW4gcm9vdCBrZXkgZm9yIHZpZXcgZXh0ZXJuYWwKTm92IDEyIDA1OjE1OjUyIElz aHRhciBuYW1lZFsyMzE2XTogdXNpbmcgYnVpbHQtaW4gRExWIGtleSBmb3IgdmlldyBpbnRl cm5hbApOb3YgMTIgMDU6MTU6NTIgSXNodGFyIG5hbWVkWzIzMTZdOiB1c2luZyBidWlsdC1p biByb290IGtleSBmb3IgdmlldyBpbnRlcm5hbApOb3YgMTIgMDU6MTU6NTIgSXNodGFyIG5h bWVkWzIzMTZdOiB0aGUgd29ya2luZyBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlCk5vdiAx MiAwNToxNTo1NCBJc2h0YXIgTVJfTU9OSVRPUlsxNDYzXTogPE1STU9OMjY4PiBDb250cm9s bGVyIElEOiAgMSAgUEQgUmVzZXQ6ICAgUEQgICAgICAgPSAgIC06LToyMSwgICBDcml0aWNh bCAgICAgICA9ICAgMywgICBQYXRoICAgPSAgICAgICAweDUwMDI0MDgwNzhENzZBMDAK --------------060205090002040702080705 Content-Type: text/plain; name="config.txt" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="config.txt" IwojIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGU7IERPIE5PVCBFRElULgojIExpbnV4 L3g4NiAzLjE3LjIgS2VybmVsIENvbmZpZ3VyYXRpb24KIwpDT05GSUdfNjRCSVQ9eQpDT05G SUdfWDg2XzY0PXkKQ09ORklHX1g4Nj15CkNPTkZJR19JTlNUUlVDVElPTl9ERUNPREVSPXkK Q09ORklHX09VVFBVVF9GT1JNQVQ9ImVsZjY0LXg4Ni02NCIKQ09ORklHX0FSQ0hfREVGQ09O RklHPSJhcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWciCkNPTkZJR19MT0NLREVQ X1NVUFBPUlQ9eQpDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKQ09ORklHX0hBVkVfTEFU RU5DWVRPUF9TVVBQT1JUPXkKQ09ORklHX01NVT15CkNPTkZJR19ORUVEX0RNQV9NQVBfU1RB VEU9eQpDT05GSUdfTkVFRF9TR19ETUFfTEVOR1RIPXkKQ09ORklHX0dFTkVSSUNfSVNBX0RN QT15CkNPTkZJR19HRU5FUklDX0JVRz15CkNPTkZJR19HRU5FUklDX0JVR19SRUxBVElWRV9Q T0lOVEVSUz15CkNPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQpDT05GSUdfQVJDSF9NQVlfSEFW RV9QQ19GREM9eQpDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQpDT05GSUdfR0VO RVJJQ19DQUxJQlJBVEVfREVMQVk9eQpDT05GSUdfQVJDSF9IQVNfQ1BVX1JFTEFYPXkKQ09O RklHX0FSQ0hfSEFTX0NBQ0hFX0xJTkVfU0laRT15CkNPTkZJR19IQVZFX1NFVFVQX1BFUl9D UFVfQVJFQT15CkNPTkZJR19ORUVEX1BFUl9DUFVfRU1CRURfRklSU1RfQ0hVTks9eQpDT05G SUdfTkVFRF9QRVJfQ1BVX1BBR0VfRklSU1RfQ0hVTks9eQpDT05GSUdfQVJDSF9ISUJFUk5B VElPTl9QT1NTSUJMRT15CkNPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQpDT05GSUdf QVJDSF9XQU5UX0hVR0VfUE1EX1NIQVJFPXkKQ09ORklHX0FSQ0hfV0FOVF9HRU5FUkFMX0hV R0VUTEI9eQpDT05GSUdfWk9ORV9ETUEzMj15CkNPTkZJR19BVURJVF9BUkNIPXkKQ09ORklH X0FSQ0hfU1VQUE9SVFNfT1BUSU1JWkVEX0lOTElOSU5HPXkKQ09ORklHX0FSQ0hfU1VQUE9S VFNfREVCVUdfUEFHRUFMTE9DPXkKQ09ORklHX0hBVkVfSU5URUxfVFhUPXkKQ09ORklHX1g4 Nl82NF9TTVA9eQpDT05GSUdfWDg2X0hUPXkKQ09ORklHX0FSQ0hfSFdFSUdIVF9DRkxBR1M9 Ii1mY2FsbC1zYXZlZC1yZGkgLWZjYWxsLXNhdmVkLXJzaSAtZmNhbGwtc2F2ZWQtcmR4IC1m Y2FsbC1zYXZlZC1yY3ggLWZjYWxsLXNhdmVkLXI4IC1mY2FsbC1zYXZlZC1yOSAtZmNhbGwt c2F2ZWQtcjEwIC1mY2FsbC1zYXZlZC1yMTEiCkNPTkZJR19BUkNIX1NVUFBPUlRTX1VQUk9C RVM9eQpDT05GSUdfRklYX0VBUkxZQ09OX01FTT15CkNPTkZJR19ERUZDT05GSUdfTElTVD0i L2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCkNPTkZJR19JUlFfV09SSz15 CkNPTkZJR19CVUlMRFRJTUVfRVhUQUJMRV9TT1JUPXkKCiMKIyBHZW5lcmFsIHNldHVwCiMK Q09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgpDT05GSUdfQ1JPU1NfQ09NUElMRT0iIgoj IENPTkZJR19DT01QSUxFX1RFU1QgaXMgbm90IHNldApDT05GSUdfTE9DQUxWRVJTSU9OPSIt SXNodC1WYW4iCiMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKQ09ORklH X0hBVkVfS0VSTkVMX0daSVA9eQpDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQpDT05GSUdf SEFWRV9LRVJORUxfTFpNQT15CkNPTkZJR19IQVZFX0tFUk5FTF9YWj15CkNPTkZJR19IQVZF X0tFUk5FTF9MWk89eQpDT05GSUdfSEFWRV9LRVJORUxfTFo0PXkKIyBDT05GSUdfS0VSTkVM X0daSVAgaXMgbm90IHNldAojIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAojIENP TkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiMgQ09ORklHX0tFUk5FTF9YWiBpcyBub3Qg c2V0CiMgQ09ORklHX0tFUk5FTF9MWk8gaXMgbm90IHNldApDT05GSUdfS0VSTkVMX0xaND15 CkNPTkZJR19ERUZBVUxUX0hPU1ROQU1FPSJJc2h0YXIiCkNPTkZJR19TV0FQPXkKQ09ORklH X1NZU1ZJUEM9eQpDT05GSUdfU1lTVklQQ19TWVNDVEw9eQpDT05GSUdfUE9TSVhfTVFVRVVF PXkKQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQpDT05GSUdfQ1JPU1NfTUVNT1JZX0FU VEFDSD15CkNPTkZJR19GSEFORExFPXkKQ09ORklHX1VTRUxJQj15CkNPTkZJR19BVURJVD15 CkNPTkZJR19IQVZFX0FSQ0hfQVVESVRTWVNDQUxMPXkKQ09ORklHX0FVRElUU1lTQ0FMTD15 CkNPTkZJR19BVURJVF9XQVRDSD15CkNPTkZJR19BVURJVF9UUkVFPXkKCiMKIyBJUlEgc3Vi c3lzdGVtCiMKQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKQ09ORklHX0dFTkVSSUNfSVJR X1NIT1c9eQpDT05GSUdfR0VORVJJQ19JUlFfTEVHQUNZX0FMTE9DX0hXSVJRPXkKQ09ORklH X0dFTkVSSUNfUEVORElOR19JUlE9eQpDT05GSUdfSVJRX0RPTUFJTj15CkNPTkZJR19JUlFf RE9NQUlOX0RFQlVHPXkKQ09ORklHX0lSUV9GT1JDRURfVEhSRUFESU5HPXkKQ09ORklHX1NQ QVJTRV9JUlE9eQpDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0c9eQpDT05GSUdfQVJDSF9D TE9DS1NPVVJDRV9EQVRBPXkKQ09ORklHX0NMT0NLU09VUkNFX1ZBTElEQVRFX0xBU1RfQ1lD TEU9eQpDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMPXkKQ09ORklHX0dFTkVSSUNfQ0xP Q0tFVkVOVFM9eQpDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CkNPTkZJR19H RU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CkNPTkZJR19HRU5FUklDX0NMT0NLRVZF TlRTX01JTl9BREpVU1Q9eQpDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURT15CgojCiMgVGlt ZXJzIHN1YnN5c3RlbQojCkNPTkZJR19USUNLX09ORVNIT1Q9eQpDT05GSUdfTk9fSFpfQ09N TU9OPXkKIyBDT05GSUdfSFpfUEVSSU9ESUMgaXMgbm90IHNldApDT05GSUdfTk9fSFpfSURM RT15CiMgQ09ORklHX05PX0haX0ZVTEwgaXMgbm90IHNldApDT05GSUdfTk9fSFo9eQpDT05G SUdfSElHSF9SRVNfVElNRVJTPXkKCiMKIyBDUFUvVGFzayB0aW1lIGFuZCBzdGF0cyBhY2Nv dW50aW5nCiMKQ09ORklHX1RJQ0tfQ1BVX0FDQ09VTlRJTkc9eQojIENPTkZJR19WSVJUX0NQ VV9BQ0NPVU5USU5HX0dFTiBpcyBub3Qgc2V0CiMgQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJ TkcgaXMgbm90IHNldApDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CkNPTkZJR19CU0RfUFJP Q0VTU19BQ0NUX1YzPXkKQ09ORklHX1RBU0tTVEFUUz15CkNPTkZJR19UQVNLX0RFTEFZX0FD Q1Q9eQpDT05GSUdfVEFTS19YQUNDVD15CkNPTkZJR19UQVNLX0lPX0FDQ09VTlRJTkc9eQoK IwojIFJDVSBTdWJzeXN0ZW0KIwpDT05GSUdfVFJFRV9QUkVFTVBUX1JDVT15CkNPTkZJR19Q UkVFTVBUX1JDVT15CkNPTkZJR19SQ1VfU1RBTExfQ09NTU9OPXkKIyBDT05GSUdfUkNVX1VT RVJfUVMgaXMgbm90IHNldApDT05GSUdfUkNVX0ZBTk9VVD02NApDT05GSUdfUkNVX0ZBTk9V VF9MRUFGPTE2CiMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAojIENPTkZJ R19SQ1VfRkFTVF9OT19IWiBpcyBub3Qgc2V0CiMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlz IG5vdCBzZXQKQ09ORklHX1JDVV9CT09TVD15CkNPTkZJR19SQ1VfQk9PU1RfUFJJTz0xCkNP TkZJR19SQ1VfQk9PU1RfREVMQVk9NTAwCiMgQ09ORklHX1JDVV9OT0NCX0NQVSBpcyBub3Qg c2V0CkNPTkZJR19CVUlMRF9CSU4yQz15CkNPTkZJR19JS0NPTkZJRz15CkNPTkZJR19JS0NP TkZJR19QUk9DPXkKQ09ORklHX0xPR19CVUZfU0hJRlQ9MTkKQ09ORklHX0xPR19DUFVfTUFY X0JVRl9TSElGVD0xMgpDT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSz15CkNPTkZJ R19BUkNIX1NVUFBPUlRTX05VTUFfQkFMQU5DSU5HPXkKQ09ORklHX0FSQ0hfU1VQUE9SVFNf SU5UMTI4PXkKQ09ORklHX0FSQ0hfV0FOVFNfUFJPVF9OVU1BX1BST1RfTk9ORT15CkNPTkZJ R19BUkNIX1VTRVNfTlVNQV9QUk9UX05PTkU9eQpDT05GSUdfTlVNQV9CQUxBTkNJTkdfREVG QVVMVF9FTkFCTEVEPXkKQ09ORklHX05VTUFfQkFMQU5DSU5HPXkKQ09ORklHX0NHUk9VUFM9 eQpDT05GSUdfQ0dST1VQX0RFQlVHPXkKQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKQ09ORklH X0NHUk9VUF9ERVZJQ0U9eQpDT05GSUdfQ1BVU0VUUz15CkNPTkZJR19QUk9DX1BJRF9DUFVT RVQ9eQpDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQpDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlM9 eQpDT05GSUdfTUVNQ0c9eQpDT05GSUdfTUVNQ0dfU1dBUD15CkNPTkZJR19NRU1DR19TV0FQ X0VOQUJMRUQ9eQpDT05GSUdfTUVNQ0dfS01FTT15CiMgQ09ORklHX0NHUk9VUF9IVUdFVExC IGlzIG5vdCBzZXQKIyBDT05GSUdfQ0dST1VQX1BFUkYgaXMgbm90IHNldApDT05GSUdfQ0dS T1VQX1NDSEVEPXkKQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQpDT05GSUdfQ0ZTX0JBTkRX SURUSD15CkNPTkZJR19SVF9HUk9VUF9TQ0hFRD15CkNPTkZJR19CTEtfQ0dST1VQPXkKQ09O RklHX0RFQlVHX0JMS19DR1JPVVA9eQpDT05GSUdfQ0hFQ0tQT0lOVF9SRVNUT1JFPXkKQ09O RklHX05BTUVTUEFDRVM9eQpDT05GSUdfVVRTX05TPXkKQ09ORklHX0lQQ19OUz15CkNPTkZJ R19VU0VSX05TPXkKQ09ORklHX1BJRF9OUz15CkNPTkZJR19ORVRfTlM9eQpDT05GSUdfU0NI RURfQVVUT0dST1VQPXkKIyBDT05GSUdfU1lTRlNfREVQUkVDQVRFRCBpcyBub3Qgc2V0CkNP TkZJR19SRUxBWT15CiMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKIyBDT05G SUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldApDT05GSUdfU1lTQ1RMPXkKQ09O RklHX0FOT05fSU5PREVTPXkKQ09ORklHX0hBVkVfVUlEMTY9eQpDT05GSUdfU1lTQ1RMX0VY Q0VQVElPTl9UUkFDRT15CkNPTkZJR19IQVZFX1BDU1BLUl9QTEFURk9STT15CkNPTkZJR19F WFBFUlQ9eQojIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CkNPTkZJR19TR0VUTUFTS19TWVND QUxMPXkKQ09ORklHX1NZU0ZTX1NZU0NBTEw9eQojIENPTkZJR19TWVNDVExfU1lTQ0FMTCBp cyBub3Qgc2V0CkNPTkZJR19LQUxMU1lNUz15CkNPTkZJR19LQUxMU1lNU19BTEw9eQpDT05G SUdfUFJJTlRLPXkKQ09ORklHX0JVRz15CkNPTkZJR19FTEZfQ09SRT15CkNPTkZJR19QQ1NQ S1JfUExBVEZPUk09eQpDT05GSUdfQkFTRV9GVUxMPXkKQ09ORklHX0ZVVEVYPXkKQ09ORklH X0VQT0xMPXkKQ09ORklHX1NJR05BTEZEPXkKQ09ORklHX1RJTUVSRkQ9eQpDT05GSUdfRVZF TlRGRD15CkNPTkZJR19TSE1FTT15CkNPTkZJR19BSU89eQpDT05GSUdfUENJX1FVSVJLUz15 CiMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfUEVSRl9FVkVOVFM9 eQoKIwojIEtlcm5lbCBQZXJmb3JtYW5jZSBFdmVudHMgQW5kIENvdW50ZXJzCiMKQ09ORklH X1BFUkZfRVZFTlRTPXkKIyBDT05GSUdfREVCVUdfUEVSRl9VU0VfVk1BTExPQyBpcyBub3Qg c2V0CkNPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CkNPTkZJR19TTFVCX0RFQlVHPXkKQ09O RklHX0NPTVBBVF9CUks9eQojIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKQ09ORklHX1NMVUI9 eQojIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQ09ORklHX1NMVUJfQ1BVX1BBUlRJQUw9eQoj IENPTkZJR19TWVNURU1fVFJVU1RFRF9LRVlSSU5HIGlzIG5vdCBzZXQKIyBDT05GSUdfUFJP RklMSU5HIGlzIG5vdCBzZXQKQ09ORklHX1RSQUNFUE9JTlRTPXkKQ09ORklHX0hBVkVfT1BS T0ZJTEU9eQpDT05GSUdfT1BST0ZJTEVfTk1JX1RJTUVSPXkKQ09ORklHX0tQUk9CRVM9eQpD T05GSUdfSlVNUF9MQUJFTD15CkNPTkZJR19VUFJPQkVTPXkKIyBDT05GSUdfSEFWRV82NEJJ VF9BTElHTkVEX0FDQ0VTUyBpcyBub3Qgc2V0CkNPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFM SUdORURfQUNDRVNTPXkKQ09ORklHX0FSQ0hfVVNFX0JVSUxUSU5fQlNXQVA9eQpDT05GSUdf S1JFVFBST0JFUz15CkNPTkZJR19VU0VSX1JFVFVSTl9OT1RJRklFUj15CkNPTkZJR19IQVZF X0lPUkVNQVBfUFJPVD15CkNPTkZJR19IQVZFX0tQUk9CRVM9eQpDT05GSUdfSEFWRV9LUkVU UFJPQkVTPXkKQ09ORklHX0hBVkVfT1BUUFJPQkVTPXkKQ09ORklHX0hBVkVfS1BST0JFU19P Tl9GVFJBQ0U9eQpDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CkNPTkZJR19IQVZFX0RN QV9BVFRSUz15CkNPTkZJR19IQVZFX0RNQV9DT05USUdVT1VTPXkKQ09ORklHX0dFTkVSSUNf U01QX0lETEVfVEhSRUFEPXkKQ09ORklHX0hBVkVfUkVHU19BTkRfU1RBQ0tfQUNDRVNTX0FQ ST15CkNPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQpDT05GSUdfSEFWRV9IV19CUkVBS1BP SU5UPXkKQ09ORklHX0hBVkVfTUlYRURfQlJFQUtQT0lOVFNfUkVHUz15CkNPTkZJR19IQVZF X1VTRVJfUkVUVVJOX05PVElGSUVSPXkKQ09ORklHX0hBVkVfUEVSRl9FVkVOVFNfTk1JPXkK Q09ORklHX0hBVkVfUEVSRl9SRUdTPXkKQ09ORklHX0hBVkVfUEVSRl9VU0VSX1NUQUNLX0RV TVA9eQpDT05GSUdfSEFWRV9BUkNIX0pVTVBfTEFCRUw9eQpDT05GSUdfQVJDSF9IQVZFX05N SV9TQUZFX0NNUFhDSEc9eQpDT05GSUdfSEFWRV9BTElHTkVEX1NUUlVDVF9QQUdFPXkKQ09O RklHX0hBVkVfQ01QWENIR19MT0NBTD15CkNPTkZJR19IQVZFX0NNUFhDSEdfRE9VQkxFPXkK Q09ORklHX0FSQ0hfV0FOVF9DT01QQVRfSVBDX1BBUlNFX1ZFUlNJT049eQpDT05GSUdfQVJD SF9XQU5UX09MRF9DT01QQVRfSVBDPXkKQ09ORklHX0hBVkVfQVJDSF9TRUNDT01QX0ZJTFRF Uj15CkNPTkZJR19TRUNDT01QX0ZJTFRFUj15CkNPTkZJR19IQVZFX0NDX1NUQUNLUFJPVEVD VE9SPXkKIyBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IgaXMgbm90IHNldApDT05GSUdfQ0Nf U1RBQ0tQUk9URUNUT1JfTk9ORT15CiMgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SX1JFR1VM QVIgaXMgbm90IHNldAojIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUl9TVFJPTkcgaXMgbm90 IHNldApDT05GSUdfSEFWRV9DT05URVhUX1RSQUNLSU5HPXkKQ09ORklHX0hBVkVfVklSVF9D UFVfQUNDT1VOVElOR19HRU49eQpDT05GSUdfSEFWRV9JUlFfVElNRV9BQ0NPVU5USU5HPXkK Q09ORklHX0hBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRT15CkNPTkZJR19IQVZFX0FS Q0hfU09GVF9ESVJUWT15CkNPTkZJR19NT0RVTEVTX1VTRV9FTEZfUkVMQT15CkNPTkZJR19I QVZFX0lSUV9FWElUX09OX0lSUV9TVEFDSz15CkNPTkZJR19PTERfU0lHU1VTUEVORDM9eQpD T05GSUdfQ09NUEFUX09MRF9TSUdBQ1RJT049eQoKIwojIEdDT1YtYmFzZWQga2VybmVsIHBy b2ZpbGluZwojCiMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfSEFW RV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CkNPTkZJR19TTEFCSU5GTz15CkNP TkZJR19SVF9NVVRFWEVTPXkKQ09ORklHX0JBU0VfU01BTEw9MApDT05GSUdfTU9EVUxFUz15 CiMgQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEIGlzIG5vdCBzZXQKQ09ORklHX01PRFVMRV9V TkxPQUQ9eQojIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKQ09ORklH X01PRFZFUlNJT05TPXkKIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBz ZXQKIyBDT05GSUdfTU9EVUxFX1NJRyBpcyBub3Qgc2V0CkNPTkZJR19TVE9QX01BQ0hJTkU9 eQpDT05GSUdfQkxPQ0s9eQpDT05GSUdfQkxLX0RFVl9CU0c9eQpDT05GSUdfQkxLX0RFVl9C U0dMSUI9eQpDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFk9eQpDT05GSUdfQkxLX0RFVl9USFJP VFRMSU5HPXkKIyBDT05GSUdfQkxLX0NNRExJTkVfUEFSU0VSIGlzIG5vdCBzZXQKCiMKIyBQ YXJ0aXRpb24gVHlwZXMKIwpDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKIyBDT05GSUdf QUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfQUlYX1BBUlRJVElPTiBpcyBu b3Qgc2V0CiMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAojIENPTkZJR19BTUlH QV9QQVJUSVRJT04gaXMgbm90IHNldAojIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90 IHNldAojIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKQ09ORklHX01TRE9TX1BB UlRJVElPTj15CiMgQ09ORklHX0JTRF9ESVNLTEFCRUwgaXMgbm90IHNldAojIENPTkZJR19N SU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAojIENPTkZJR19TT0xBUklTX1g4Nl9QQVJU SVRJT04gaXMgbm90IHNldAojIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwgaXMgbm90IHNl dApDT05GSUdfTERNX1BBUlRJVElPTj15CiMgQ09ORklHX0xETV9ERUJVRyBpcyBub3Qgc2V0 CiMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAojIENPTkZJR19VTFRSSVhfUEFS VElUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CiMg Q09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0CkNPTkZJR19FRklfUEFSVElUSU9O PXkKIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0NNRExJ TkVfUEFSVElUSU9OIGlzIG5vdCBzZXQKQ09ORklHX0JMT0NLX0NPTVBBVD15CgojCiMgSU8g U2NoZWR1bGVycwojCkNPTkZJR19JT1NDSEVEX05PT1A9eQpDT05GSUdfSU9TQ0hFRF9ERUFE TElORT15CkNPTkZJR19JT1NDSEVEX0NGUT15CkNPTkZJR19DRlFfR1JPVVBfSU9TQ0hFRD15 CkNPTkZJR19ERUZBVUxUX0RFQURMSU5FPXkKIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90 IHNldAojIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldApDT05GSUdfREVGQVVMVF9J T1NDSEVEPSJkZWFkbGluZSIKQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTPXkKQ09ORklHX1VO SU5MSU5FX1NQSU5fVU5MT0NLPXkKQ09ORklHX0FSQ0hfU1VQUE9SVFNfQVRPTUlDX1JNVz15 CkNPTkZJR19SV1NFTV9TUElOX09OX09XTkVSPXkKQ09ORklHX0FSQ0hfVVNFX1FVRVVFX1JX TE9DSz15CkNPTkZJR19RVUVVRV9SV0xPQ0s9eQpDT05GSUdfRlJFRVpFUj15CgojCiMgUHJv Y2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiMKQ09ORklHX1pPTkVfRE1BPXkKQ09ORklHX1NN UD15CkNPTkZJR19YODZfWDJBUElDPXkKIyBDT05GSUdfWDg2X01QUEFSU0UgaXMgbm90IHNl dAojIENPTkZJR19YODZfRVhURU5ERURfUExBVEZPUk0gaXMgbm90IHNldAojIENPTkZJR19Y ODZfSU5URUxfTFBTUyBpcyBub3Qgc2V0CkNPTkZJR19YODZfU1VQUE9SVFNfTUVNT1JZX0ZB SUxVUkU9eQojIENPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVIgaXMgbm90IHNldAoj IENPTkZJR19IWVBFUlZJU09SX0dVRVNUIGlzIG5vdCBzZXQKQ09ORklHX05PX0JPT1RNRU09 eQojIENPTkZJR19NRU1URVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfTUs4IGlzIG5vdCBzZXQK IyBDT05GSUdfTVBTQyBpcyBub3Qgc2V0CkNPTkZJR19NQ09SRTI9eQojIENPTkZJR19NQVRP TSBpcyBub3Qgc2V0CiMgQ09ORklHX0dFTkVSSUNfQ1BVIGlzIG5vdCBzZXQKQ09ORklHX1g4 Nl9JTlRFUk5PREVfQ0FDSEVfU0hJRlQ9NgpDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTYK Q09ORklHX1g4Nl9JTlRFTF9VU0VSQ09QWT15CkNPTkZJR19YODZfVVNFX1BQUk9fQ0hFQ0tT VU09eQpDT05GSUdfWDg2X1A2X05PUD15CkNPTkZJR19YODZfVFNDPXkKQ09ORklHX1g4Nl9D TVBYQ0hHNjQ9eQpDT05GSUdfWDg2X0NNT1Y9eQpDT05GSUdfWDg2X01JTklNVU1fQ1BVX0ZB TUlMWT02NApDT05GSUdfWDg2X0RFQlVHQ1RMTVNSPXkKQ09ORklHX1BST0NFU1NPUl9TRUxF Q1Q9eQpDT05GSUdfQ1BVX1NVUF9JTlRFTD15CiMgQ09ORklHX0NQVV9TVVBfQU1EIGlzIG5v dCBzZXQKIyBDT05GSUdfQ1BVX1NVUF9DRU5UQVVSIGlzIG5vdCBzZXQKQ09ORklHX0hQRVRf VElNRVI9eQpDT05GSUdfSFBFVF9FTVVMQVRFX1JUQz15CkNPTkZJR19ETUk9eQojIENPTkZJ R19DQUxHQVJZX0lPTU1VIGlzIG5vdCBzZXQKQ09ORklHX1NXSU9UTEI9eQpDT05GSUdfSU9N TVVfSEVMUEVSPXkKIyBDT05GSUdfTUFYU01QIGlzIG5vdCBzZXQKQ09ORklHX05SX0NQVVM9 MTIKIyBDT05GSUdfU0NIRURfU01UIGlzIG5vdCBzZXQKQ09ORklHX1NDSEVEX01DPXkKIyBD T05GSUdfUFJFRU1QVF9OT05FIGlzIG5vdCBzZXQKIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRB UlkgaXMgbm90IHNldApDT05GSUdfUFJFRU1QVD15CkNPTkZJR19QUkVFTVBUX0NPVU5UPXkK Q09ORklHX1g4Nl9MT0NBTF9BUElDPXkKQ09ORklHX1g4Nl9JT19BUElDPXkKQ09ORklHX1g4 Nl9SRVJPVVRFX0ZPUl9CUk9LRU5fQk9PVF9JUlFTPXkKQ09ORklHX1g4Nl9NQ0U9eQpDT05G SUdfWDg2X01DRV9JTlRFTD15CiMgQ09ORklHX1g4Nl9NQ0VfQU1EIGlzIG5vdCBzZXQKQ09O RklHX1g4Nl9NQ0VfVEhSRVNIT0xEPXkKIyBDT05GSUdfWDg2X01DRV9JTkpFQ1QgaXMgbm90 IHNldApDT05GSUdfWDg2X1RIRVJNQUxfVkVDVE9SPXkKIyBDT05GSUdfWDg2XzE2QklUIGlz IG5vdCBzZXQKIyBDT05GSUdfSThLIGlzIG5vdCBzZXQKQ09ORklHX01JQ1JPQ09ERT15CkNP TkZJR19NSUNST0NPREVfSU5URUw9eQojIENPTkZJR19NSUNST0NPREVfQU1EIGlzIG5vdCBz ZXQKQ09ORklHX01JQ1JPQ09ERV9PTERfSU5URVJGQUNFPXkKIyBDT05GSUdfTUlDUk9DT0RF X0lOVEVMX0VBUkxZIGlzIG5vdCBzZXQKIyBDT05GSUdfTUlDUk9DT0RFX0FNRF9FQVJMWSBp cyBub3Qgc2V0CkNPTkZJR19YODZfTVNSPXkKQ09ORklHX1g4Nl9DUFVJRD15CkNPTkZJR19B UkNIX1BIWVNfQUREUl9UXzY0QklUPXkKQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVD15 CkNPTkZJR19ESVJFQ1RfR0JQQUdFUz15CkNPTkZJR19OVU1BPXkKIyBDT05GSUdfQU1EX05V TUEgaXMgbm90IHNldApDT05GSUdfWDg2XzY0X0FDUElfTlVNQT15CkNPTkZJR19OT0RFU19T UEFOX09USEVSX05PREVTPXkKIyBDT05GSUdfTlVNQV9FTVUgaXMgbm90IHNldApDT05GSUdf Tk9ERVNfU0hJRlQ9MgpDT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKQ09ORklHX0FS Q0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQpDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVM PXkKQ09ORklHX0FSQ0hfUFJPQ19LQ09SRV9URVhUPXkKQ09ORklHX0lMTEVHQUxfUE9JTlRF Ul9WQUxVRT0weGRlYWQwMDAwMDAwMDAwMDAKQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9 eQpDT05GSUdfU1BBUlNFTUVNX01BTlVBTD15CkNPTkZJR19TUEFSU0VNRU09eQpDT05GSUdf TkVFRF9NVUxUSVBMRV9OT0RFUz15CkNPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKQ09O RklHX1NQQVJTRU1FTV9FWFRSRU1FPXkKQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQX0VOQUJM RT15CkNPTkZJR19TUEFSU0VNRU1fQUxMT0NfTUVNX01BUF9UT0dFVEhFUj15CkNPTkZJR19T UEFSU0VNRU1fVk1FTU1BUD15CkNPTkZJR19IQVZFX01FTUJMT0NLPXkKQ09ORklHX0hBVkVf TUVNQkxPQ0tfTk9ERV9NQVA9eQpDT05GSUdfQVJDSF9ESVNDQVJEX01FTUJMT0NLPXkKQ09O RklHX01FTU9SWV9JU09MQVRJT049eQojIENPTkZJR19NT1ZBQkxFX05PREUgaXMgbm90IHNl dAojIENPTkZJR19IQVZFX0JPT1RNRU1fSU5GT19OT0RFIGlzIG5vdCBzZXQKIyBDT05GSUdf TUVNT1JZX0hPVFBMVUcgaXMgbm90IHNldApDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkK Q09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKQ09ORklHX0FSQ0hfRU5BQkxFX1NQTElUX1BN RF9QVExPQ0s9eQpDT05GSUdfQkFMTE9PTl9DT01QQUNUSU9OPXkKQ09ORklHX0NPTVBBQ1RJ T049eQpDT05GSUdfTUlHUkFUSU9OPXkKQ09ORklHX0FSQ0hfRU5BQkxFX0hVR0VQQUdFX01J R1JBVElPTj15CkNPTkZJR19QSFlTX0FERFJfVF82NEJJVD15CkNPTkZJR19aT05FX0RNQV9G TEFHPTEKQ09ORklHX0JPVU5DRT15CkNPTkZJR19ORUVEX0JPVU5DRV9QT09MPXkKQ09ORklH X1ZJUlRfVE9fQlVTPXkKQ09ORklHX01NVV9OT1RJRklFUj15CkNPTkZJR19LU009eQpDT05G SUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKQ09ORklHX0FSQ0hfU1VQUE9SVFNfTUVN T1JZX0ZBSUxVUkU9eQpDT05GSUdfTUVNT1JZX0ZBSUxVUkU9eQojIENPTkZJR19IV1BPSVNP Tl9JTkpFQ1QgaXMgbm90IHNldApDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0U9eQojIENP TkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVMgaXMgbm90IHNldApDT05GSUdfVFJB TlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRT15CkNPTkZJR19DTEVBTkNBQ0hFPXkKQ09ORklH X0ZST05UU1dBUD15CkNPTkZJR19DTUE9eQojIENPTkZJR19DTUFfREVCVUcgaXMgbm90IHNl dApDT05GSUdfQ01BX0FSRUFTPTcKIyBDT05GSUdfTUVNX1NPRlRfRElSVFkgaXMgbm90IHNl dAojIENPTkZJR19aU1dBUCBpcyBub3Qgc2V0CiMgQ09ORklHX1pQT09MIGlzIG5vdCBzZXQK IyBDT05GSUdfWkJVRCBpcyBub3Qgc2V0CiMgQ09ORklHX1pTTUFMTE9DIGlzIG5vdCBzZXQK Q09ORklHX0dFTkVSSUNfRUFSTFlfSU9SRU1BUD15CiMgQ09ORklHX1g4Nl9DSEVDS19CSU9T X0NPUlJVUFRJT04gaXMgbm90IHNldApDT05GSUdfWDg2X1JFU0VSVkVfTE9XPTQKQ09ORklH X01UUlI9eQpDT05GSUdfTVRSUl9TQU5JVElaRVI9eQpDT05GSUdfTVRSUl9TQU5JVElaRVJf RU5BQkxFX0RFRkFVTFQ9MApDT05GSUdfTVRSUl9TQU5JVElaRVJfU1BBUkVfUkVHX05SX0RF RkFVTFQ9MQpDT05GSUdfWDg2X1BBVD15CkNPTkZJR19BUkNIX1VTRVNfUEdfVU5DQUNIRUQ9 eQpDT05GSUdfQVJDSF9SQU5ET009eQojIENPTkZJR19YODZfU01BUCBpcyBub3Qgc2V0CkNP TkZJR19FRkk9eQpDT05GSUdfRUZJX1NUVUI9eQojIENPTkZJR19FRklfTUlYRUQgaXMgbm90 IHNldApDT05GSUdfU0VDQ09NUD15CiMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiMgQ09O RklHX0haXzI1MCBpcyBub3Qgc2V0CiMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CkNPTkZJ R19IWl8xMDAwPXkKQ09ORklHX0haPTEwMDAKQ09ORklHX1NDSEVEX0hSVElDSz15CkNPTkZJ R19LRVhFQz15CkNPTkZJR19LRVhFQ19GSUxFPXkKIyBDT05GSUdfS0VYRUNfVkVSSUZZX1NJ RyBpcyBub3Qgc2V0CkNPTkZJR19DUkFTSF9EVU1QPXkKQ09ORklHX1BIWVNJQ0FMX1NUQVJU PTB4MjAwMDAwCkNPTkZJR19SRUxPQ0FUQUJMRT15CiMgQ09ORklHX1JBTkRPTUlaRV9CQVNF IGlzIG5vdCBzZXQKQ09ORklHX1BIWVNJQ0FMX0FMSUdOPTB4MTAwMDAwMApDT05GSUdfSE9U UExVR19DUFU9eQojIENPTkZJR19CT09UUEFSQU1fSE9UUExVR19DUFUwIGlzIG5vdCBzZXQK IyBDT05GSUdfREVCVUdfSE9UUExVR19DUFUwIGlzIG5vdCBzZXQKIyBDT05GSUdfQ09NUEFU X1ZEU08gaXMgbm90IHNldApDT05GSUdfQ01ETElORV9CT09MPXkKQ09ORklHX0NNRExJTkU9 InJlYm9vdD1iaW9zIgojIENPTkZJR19DTURMSU5FX09WRVJSSURFIGlzIG5vdCBzZXQKQ09O RklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RQTFVHPXkKQ09ORklHX1VTRV9QRVJDUFVfTlVN QV9OT0RFX0lEPXkKCiMKIyBQb3dlciBtYW5hZ2VtZW50IGFuZCBBQ1BJIG9wdGlvbnMKIwoj IENPTkZJR19TVVNQRU5EIGlzIG5vdCBzZXQKIyBDT05GSUdfSElCRVJOQVRJT04gaXMgbm90 IHNldApDT05GSUdfUE1fUlVOVElNRT15CkNPTkZJR19QTT15CkNPTkZJR19QTV9ERUJVRz15 CiMgQ09ORklHX1BNX0FEVkFOQ0VEX0RFQlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfRFBNX1dB VENIRE9HIGlzIG5vdCBzZXQKQ09ORklHX1dRX1BPV0VSX0VGRklDSUVOVF9ERUZBVUxUPXkK Q09ORklHX0FDUEk9eQpDT05GSUdfQUNQSV9MRUdBQ1lfVEFCTEVTX0xPT0tVUD15CkNPTkZJ R19BUkNIX01JR0hUX0hBVkVfQUNQSV9QREM9eQojIENPTkZJR19BQ1BJX1BST0NGU19QT1dF UiBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUElfRUNfREVCVUdGUyBpcyBub3Qgc2V0CiMgQ09O RklHX0FDUElfQUMgaXMgbm90IHNldAojIENPTkZJR19BQ1BJX0JBVFRFUlkgaXMgbm90IHNl dApDT05GSUdfQUNQSV9CVVRUT049bQojIENPTkZJR19BQ1BJX0ZBTiBpcyBub3Qgc2V0CiMg Q09ORklHX0FDUElfRE9DSyBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX1BST0NFU1NPUj1tCkNP TkZJR19BQ1BJX0lQTUk9bQpDT05GSUdfQUNQSV9IT1RQTFVHX0NQVT15CkNPTkZJR19BQ1BJ X1BST0NFU1NPUl9BR0dSRUdBVE9SPW0KQ09ORklHX0FDUElfVEhFUk1BTD1tCkNPTkZJR19B Q1BJX05VTUE9eQojIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUIGlzIG5vdCBzZXQKQ09ORklH X0FDUElfREVCVUc9eQpDT05GSUdfQUNQSV9QQ0lfU0xPVD15CkNPTkZJR19YODZfUE1fVElN RVI9eQpDT05GSUdfQUNQSV9DT05UQUlORVI9eQojIENPTkZJR19BQ1BJX1NCUyBpcyBub3Qg c2V0CkNPTkZJR19BQ1BJX0hFRD15CkNPTkZJR19BQ1BJX0NVU1RPTV9NRVRIT0Q9bQpDT05G SUdfQUNQSV9CR1JUPXkKIyBDT05GSUdfQUNQSV9SRURVQ0VEX0hBUkRXQVJFX09OTFkgaXMg bm90IHNldApDT05GSUdfSEFWRV9BQ1BJX0FQRUk9eQpDT05GSUdfSEFWRV9BQ1BJX0FQRUlf Tk1JPXkKQ09ORklHX0FDUElfQVBFST15CkNPTkZJR19BQ1BJX0FQRUlfR0hFUz15CkNPTkZJ R19BQ1BJX0FQRUlfUENJRUFFUj15CkNPTkZJR19BQ1BJX0FQRUlfTUVNT1JZX0ZBSUxVUkU9 eQojIENPTkZJR19BQ1BJX0FQRUlfRUlOSiBpcyBub3Qgc2V0CiMgQ09ORklHX0FDUElfQVBF SV9FUlNUX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0FDUElfRVhUTE9HPW0KIyBDT05GSUdf U0ZJIGlzIG5vdCBzZXQKCiMKIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKIwpDT05GSUdfQ1BV X0ZSRVE9eQpDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTU1PTj15CkNPTkZJR19DUFVfRlJFUV9T VEFUPW0KQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUz15CiMgQ09ORklHX0NQVV9GUkVR X0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1BVX0ZSRVFf REVGQVVMVF9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1BVX0ZSRVFfREVG QVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRf R09WX09OREVNQU5EPXkKIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFU SVZFIGlzIG5vdCBzZXQKQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CkNPTkZJ R19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFPW0KQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BB Q0U9bQpDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKIyBDT05GSUdfQ1BVX0ZSRVFf R09WX0NPTlNFUlZBVElWRSBpcyBub3Qgc2V0CgojCiMgeDg2IENQVSBmcmVxdWVuY3kgc2Nh bGluZyBkcml2ZXJzCiMKIyBDT05GSUdfWDg2X0lOVEVMX1BTVEFURSBpcyBub3Qgc2V0CiMg Q09ORklHX1g4Nl9QQ0NfQ1BVRlJFUSBpcyBub3Qgc2V0CkNPTkZJR19YODZfQUNQSV9DUFVG UkVRPW0KIyBDT05GSUdfWDg2X1BPV0VSTk9XX0s4IGlzIG5vdCBzZXQKIyBDT05GSUdfWDg2 X1NQRUVEU1RFUF9DRU5UUklOTyBpcyBub3Qgc2V0CiMgQ09ORklHX1g4Nl9QNF9DTE9DS01P RCBpcyBub3Qgc2V0CgojCiMgc2hhcmVkIG9wdGlvbnMKIwojIENPTkZJR19YODZfU1BFRURT VEVQX0xJQiBpcyBub3Qgc2V0CgojCiMgQ1BVIElkbGUKIwpDT05GSUdfQ1BVX0lETEU9eQoj IENPTkZJR19DUFVfSURMRV9HT1ZfTEFEREVSIGlzIG5vdCBzZXQKQ09ORklHX0NQVV9JRExF X0dPVl9NRU5VPXkKIyBDT05GSUdfQVJDSF9ORUVEU19DUFVfSURMRV9DT1VQTEVEIGlzIG5v dCBzZXQKQ09ORklHX0lOVEVMX0lETEU9eQoKIwojIE1lbW9yeSBwb3dlciBzYXZpbmdzCiMK Q09ORklHX0k3MzAwX0lETEVfSU9BVF9DSEFOTkVMPXkKQ09ORklHX0k3MzAwX0lETEU9eQoK IwojIEJ1cyBvcHRpb25zIChQQ0kgZXRjLikKIwpDT05GSUdfUENJPXkKQ09ORklHX1BDSV9E SVJFQ1Q9eQpDT05GSUdfUENJX01NQ09ORklHPXkKQ09ORklHX1BDSV9ET01BSU5TPXkKIyBD T05GSUdfUENJX0NOQjIwTEVfUVVJUksgaXMgbm90IHNldApDT05GSUdfUENJRVBPUlRCVVM9 eQpDT05GSUdfUENJRUFFUj15CkNPTkZJR19QQ0lFX0VDUkM9eQojIENPTkZJR19QQ0lFQUVS X0lOSkVDVCBpcyBub3Qgc2V0CkNPTkZJR19QQ0lFQVNQTT15CiMgQ09ORklHX1BDSUVBU1BN X0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX1BDSUVBU1BNX0RFRkFVTFQ9eQojIENPTkZJR19Q Q0lFQVNQTV9QT1dFUlNBVkUgaXMgbm90IHNldAojIENPTkZJR19QQ0lFQVNQTV9QRVJGT1JN QU5DRSBpcyBub3Qgc2V0CkNPTkZJR19QQ0lFX1BNRT15CkNPTkZJR19QQ0lfTVNJPXkKIyBD T05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX1BDSV9SRUFMTE9DX0VOQUJMRV9B VVRPPXkKQ09ORklHX1BDSV9TVFVCPW0KIyBDT05GSUdfSFRfSVJRIGlzIG5vdCBzZXQKQ09O RklHX1BDSV9BVFM9eQpDT05GSUdfUENJX0lPVj15CkNPTkZJR19QQ0lfUFJJPXkKIyBDT05G SUdfUENJX1BBU0lEIGlzIG5vdCBzZXQKIyBDT05GSUdfUENJX0lPQVBJQyBpcyBub3Qgc2V0 CkNPTkZJR19QQ0lfTEFCRUw9eQoKIwojIFBDSSBob3N0IGNvbnRyb2xsZXIgZHJpdmVycwoj CkNPTkZJR19JU0FfRE1BX0FQST15CiMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiMgQ09O RklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKIyBDT05GSUdfUkFQSURJTyBpcyBub3Qgc2V0 CkNPTkZJR19YODZfU1lTRkI9eQoKIwojIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzIC8gRW11 bGF0aW9ucwojCkNPTkZJR19CSU5GTVRfRUxGPXkKQ09ORklHX0NPTVBBVF9CSU5GTVRfRUxG PXkKQ09ORklHX0FSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFPXkKQ09ORklHX0NPUkVf RFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTPXkKQ09ORklHX0JJTkZNVF9TQ1JJUFQ9eQojIENP TkZJR19IQVZFX0FPVVQgaXMgbm90IHNldApDT05GSUdfQklORk1UX01JU0M9eQpDT05GSUdf Q09SRURVTVA9eQpDT05GSUdfSUEzMl9FTVVMQVRJT049eQpDT05GSUdfSUEzMl9BT1VUPW0K IyBDT05GSUdfWDg2X1gzMiBpcyBub3Qgc2V0CkNPTkZJR19DT01QQVQ9eQpDT05GSUdfQ09N UEFUX0ZPUl9VNjRfQUxJR05NRU5UPXkKQ09ORklHX1NZU1ZJUENfQ09NUEFUPXkKQ09ORklH X0tFWVNfQ09NUEFUPXkKQ09ORklHX1g4Nl9ERVZfRE1BX09QUz15CkNPTkZJR19JT1NGX01C ST1tCkNPTkZJR19QTUNfQVRPTT15CkNPTkZJR19ORVQ9eQoKIwojIE5ldHdvcmtpbmcgb3B0 aW9ucwojCkNPTkZJR19QQUNLRVQ9eQpDT05GSUdfUEFDS0VUX0RJQUc9bQpDT05GSUdfVU5J WD15CkNPTkZJR19VTklYX0RJQUc9eQpDT05GSUdfWEZSTT15CkNPTkZJR19YRlJNX0FMR089 bQpDT05GSUdfWEZSTV9VU0VSPW0KIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBz ZXQKIyBDT05GSUdfWEZSTV9NSUdSQVRFIGlzIG5vdCBzZXQKIyBDT05GSUdfWEZSTV9TVEFU SVNUSUNTIGlzIG5vdCBzZXQKQ09ORklHX1hGUk1fSVBDT01QPW0KQ09ORklHX05FVF9LRVk9 bQojIENPTkZJR19ORVRfS0VZX01JR1JBVEUgaXMgbm90IHNldApDT05GSUdfSU5FVD15CkNP TkZJR19JUF9NVUxUSUNBU1Q9eQpDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKQ09ORklH X0lQX0ZJQl9UUklFX1NUQVRTPXkKQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CkNPTkZJ R19JUF9ST1VURV9NVUxUSVBBVEg9eQpDT05GSUdfSVBfUk9VVEVfVkVSQk9TRT15CkNPTkZJ R19JUF9ST1VURV9DTEFTU0lEPXkKIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKQ09ORklH X05FVF9JUElQPW0KQ09ORklHX05FVF9JUEdSRV9ERU1VWD1tCkNPTkZJR19ORVRfSVBfVFVO TkVMPW0KQ09ORklHX05FVF9JUEdSRT1tCiMgQ09ORklHX05FVF9JUEdSRV9CUk9BRENBU1Qg aXMgbm90IHNldApDT05GSUdfSVBfTVJPVVRFPXkKQ09ORklHX0lQX01ST1VURV9NVUxUSVBM RV9UQUJMRVM9eQojIENPTkZJR19JUF9QSU1TTV9WMSBpcyBub3Qgc2V0CiMgQ09ORklHX0lQ X1BJTVNNX1YyIGlzIG5vdCBzZXQKQ09ORklHX1NZTl9DT09LSUVTPXkKQ09ORklHX05FVF9V RFBfVFVOTkVMPW0KIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lORVRf RVNQIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAojIENPTkZJ R19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKQ09ORklHX0lORVRfVFVOTkVMPW0KIyBD T05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5F VF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5FVF9YRlJNX01PREVf QkVFVCBpcyBub3Qgc2V0CkNPTkZJR19JTkVUX0xSTz15CkNPTkZJR19JTkVUX0RJQUc9eQpD T05GSUdfSU5FVF9UQ1BfRElBRz15CkNPTkZJR19JTkVUX1VEUF9ESUFHPW0KQ09ORklHX1RD UF9DT05HX0FEVkFOQ0VEPXkKIyBDT05GSUdfVENQX0NPTkdfQklDIGlzIG5vdCBzZXQKIyBD T05GSUdfVENQX0NPTkdfQ1VCSUMgaXMgbm90IHNldApDT05GSUdfVENQX0NPTkdfV0VTVFdP T0Q9bQpDT05GSUdfVENQX0NPTkdfSFRDUD15CkNPTkZJR19UQ1BfQ09OR19IU1RDUD15CiMg Q09ORklHX1RDUF9DT05HX0hZQkxBIGlzIG5vdCBzZXQKIyBDT05GSUdfVENQX0NPTkdfVkVH QVMgaXMgbm90IHNldApDT05GSUdfVENQX0NPTkdfU0NBTEFCTEU9eQpDT05GSUdfVENQX0NP TkdfTFA9eQojIENPTkZJR19UQ1BfQ09OR19WRU5PIGlzIG5vdCBzZXQKIyBDT05GSUdfVENQ X0NPTkdfWUVBSCBpcyBub3Qgc2V0CiMgQ09ORklHX1RDUF9DT05HX0lMTElOT0lTIGlzIG5v dCBzZXQKQ09ORklHX0RFRkFVTFRfSFRDUD15CiMgQ09ORklHX0RFRkFVTFRfUkVOTyBpcyBu b3Qgc2V0CkNPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJodGNwIgojIENPTkZJR19UQ1BfTUQ1 U0lHIGlzIG5vdCBzZXQKQ09ORklHX0lQVjY9bQojIENPTkZJR19JUFY2X1JPVVRFUl9QUkVG IGlzIG5vdCBzZXQKQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQ9eQpDT05GSUdfSU5FVDZf QUg9bQpDT05GSUdfSU5FVDZfRVNQPW0KQ09ORklHX0lORVQ2X0lQQ09NUD1tCiMgQ09ORklH X0lQVjZfTUlQNiBpcyBub3Qgc2V0CkNPTkZJR19JTkVUNl9YRlJNX1RVTk5FTD1tCkNPTkZJ R19JTkVUNl9UVU5ORUw9bQpDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCkNP TkZJR19JTkVUNl9YRlJNX01PREVfVFVOTkVMPW0KQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9C RUVUPW0KQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTj1tCiMgQ09O RklHX0lQVjZfVlRJIGlzIG5vdCBzZXQKQ09ORklHX0lQVjZfU0lUPW0KIyBDT05GSUdfSVBW Nl9TSVRfNlJEIGlzIG5vdCBzZXQKQ09ORklHX0lQVjZfTkRJU0NfTk9ERVRZUEU9eQojIENP TkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CiMgQ09ORklHX0lQVjZfR1JFIGlzIG5vdCBz ZXQKIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAojIENPTkZJR19J UFY2X01ST1VURSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVExBQkVMIGlzIG5vdCBzZXQKIyBD T05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKQ09ORklHX05FVF9QVFBfQ0xBU1NJ Rlk9eQpDT05GSUdfTkVUV09SS19QSFlfVElNRVNUQU1QSU5HPXkKQ09ORklHX05FVEZJTFRF Uj15CkNPTkZJR19ORVRGSUxURVJfREVCVUc9eQpDT05GSUdfTkVURklMVEVSX0FEVkFOQ0VE PXkKQ09ORklHX0JSSURHRV9ORVRGSUxURVI9eQoKIwojIENvcmUgTmV0ZmlsdGVyIENvbmZp Z3VyYXRpb24KIwpDT05GSUdfTkVURklMVEVSX05FVExJTks9bQpDT05GSUdfTkVURklMVEVS X05FVExJTktfQUNDVD1tCkNPTkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRT1tCkNPTkZJ R19ORVRGSUxURVJfTkVUTElOS19MT0c9bQpDT05GSUdfTkZfQ09OTlRSQUNLPW0KQ09ORklH X05GX0xPR19DT01NT049bQpDT05GSUdfTkZfQ09OTlRSQUNLX01BUks9eQpDT05GSUdfTkZf Q09OTlRSQUNLX1pPTkVTPXkKIyBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUyBpcyBub3Qg c2V0CkNPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTPXkKQ09ORklHX05GX0NPTk5UUkFDS19U SU1FT1VUPXkKQ09ORklHX05GX0NPTk5UUkFDS19USU1FU1RBTVA9eQpDT05GSUdfTkZfQ09O TlRSQUNLX0xBQkVMUz15CkNPTkZJR19ORl9DVF9QUk9UT19EQ0NQPW0KQ09ORklHX05GX0NU X1BST1RPX0dSRT1tCkNPTkZJR19ORl9DVF9QUk9UT19TQ1RQPW0KQ09ORklHX05GX0NUX1BS T1RPX1VEUExJVEU9bQojIENPTkZJR19ORl9DT05OVFJBQ0tfQU1BTkRBIGlzIG5vdCBzZXQK Q09ORklHX05GX0NPTk5UUkFDS19GVFA9bQpDT05GSUdfTkZfQ09OTlRSQUNLX0gzMjM9bQpD T05GSUdfTkZfQ09OTlRSQUNLX0lSQz1tCkNPTkZJR19ORl9DT05OVFJBQ0tfQlJPQURDQVNU PW0KQ09ORklHX05GX0NPTk5UUkFDS19ORVRCSU9TX05TPW0KQ09ORklHX05GX0NPTk5UUkFD S19TTk1QPW0KQ09ORklHX05GX0NPTk5UUkFDS19QUFRQPW0KIyBDT05GSUdfTkZfQ09OTlRS QUNLX1NBTkUgaXMgbm90IHNldApDT05GSUdfTkZfQ09OTlRSQUNLX1NJUD1tCiMgQ09ORklH X05GX0NPTk5UUkFDS19URlRQIGlzIG5vdCBzZXQKQ09ORklHX05GX0NUX05FVExJTks9bQpD T05GSUdfTkZfQ1RfTkVUTElOS19USU1FT1VUPW0KQ09ORklHX05GX0NUX05FVExJTktfSEVM UEVSPW0KQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFX0NUPXkKQ09ORklHX05GX05B VD1tCkNPTkZJR19ORl9OQVRfTkVFREVEPXkKQ09ORklHX05GX05BVF9QUk9UT19EQ0NQPW0K Q09ORklHX05GX05BVF9QUk9UT19VRFBMSVRFPW0KQ09ORklHX05GX05BVF9QUk9UT19TQ1RQ PW0KIyBDT05GSUdfTkZfTkFUX0FNQU5EQSBpcyBub3Qgc2V0CkNPTkZJR19ORl9OQVRfRlRQ PW0KQ09ORklHX05GX05BVF9JUkM9bQpDT05GSUdfTkZfTkFUX1NJUD1tCiMgQ09ORklHX05G X05BVF9URlRQIGlzIG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9TWU5QUk9YWT1tCkNPTkZJ R19ORl9UQUJMRVM9bQpDT05GSUdfTkZfVEFCTEVTX0lORVQ9bQpDT05GSUdfTkZUX0VYVEhE Uj1tCkNPTkZJR19ORlRfTUVUQT1tCkNPTkZJR19ORlRfQ1Q9bQpDT05GSUdfTkZUX1JCVFJF RT1tCkNPTkZJR19ORlRfSEFTSD1tCkNPTkZJR19ORlRfQ09VTlRFUj1tCkNPTkZJR19ORlRf TE9HPW0KQ09ORklHX05GVF9MSU1JVD1tCkNPTkZJR19ORlRfTkFUPW0KQ09ORklHX05GVF9R VUVVRT1tCkNPTkZJR19ORlRfUkVKRUNUPW0KQ09ORklHX05GVF9SRUpFQ1RfSU5FVD1tCkNP TkZJR19ORlRfQ09NUEFUPW0KQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTPXkKCiMKIyBYdGFi bGVzIGNvbWJpbmVkIG1vZHVsZXMKIwpDT05GSUdfTkVURklMVEVSX1hUX01BUks9bQpDT05G SUdfTkVURklMVEVSX1hUX0NPTk5NQVJLPW0KQ09ORklHX05FVEZJTFRFUl9YVF9TRVQ9bQoK IwojIFh0YWJsZXMgdGFyZ2V0cwojCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0FVRElU PW0KIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DSEVDS1NVTSBpcyBub3Qgc2V0CkNP TkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KQ09ORklHX05FVEZJTFRFUl9Y VF9UQVJHRVRfQ09OTk1BUks9bQpDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9DVD1tCkNP TkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0RTQ1A9bQpDT05GSUdfTkVURklMVEVSX1hUX1RB UkdFVF9ITD1tCkNPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0hNQVJLPW0KQ09ORklHX05F VEZJTFRFUl9YVF9UQVJHRVRfSURMRVRJTUVSPW0KQ09ORklHX05FVEZJTFRFUl9YVF9UQVJH RVRfTE9HPW0KQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSz1tCkNPTkZJR19ORVRG SUxURVJfWFRfTkFUPW0KQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkVUTUFQPW0KQ09O RklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQpDT05GSUdfTkVURklMVEVSX1hUX1RB UkdFVF9ORlFVRVVFPW0KIyBDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLIGlz IG5vdCBzZXQKQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfUkFURUVTVD1tCkNPTkZJR19O RVRGSUxURVJfWFRfVEFSR0VUX1JFRElSRUNUPW0KQ09ORklHX05FVEZJTFRFUl9YVF9UQVJH RVRfVEVFPW0KQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFBST1hZPW0KQ09ORklHX05F VEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0U9bQpDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9U Q1BNU1M9bQpDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BPUFRTVFJJUD1tCgojCiMg WHRhYmxlcyBtYXRjaGVzCiMKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9BRERSVFlQRT1t CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQlBGPW0KQ09ORklHX05FVEZJTFRFUl9YVF9N QVRDSF9DR1JPVVA9bQojIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ0xVU1RFUiBpcyBu b3Qgc2V0CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09NTUVOVD1tCkNPTkZJR19ORVRG SUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9D T05OTEFCRUw9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5MSU1JVD1tCkNPTkZJ R19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9bQpDT05GSUdfTkVURklMVEVSX1hUX01B VENIX0NPTk5UUkFDSz1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ1BVPW0KQ09ORklH X05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9E RVZHUk9VUD1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUD1tCkNPTkZJR19ORVRG SUxURVJfWFRfTUFUQ0hfRUNOPXkKQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1A9bQpD T05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCkNPTkZJR19ORVRGSUxURVJf WFRfTUFUQ0hfSEVMUEVSPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ITD1tCkNPTkZJ R19ORVRGSUxURVJfWFRfTUFUQ0hfSVBDT01QPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRD SF9JUFJBTkdFPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MMlRQPW0KQ09ORklHX05F VEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xJ TUlUPW0KQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQpDT05GSUdfTkVURklMVEVS X1hUX01BVENIX01BUks9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVD1t CkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTkZBQ0NUPW0KQ09ORklHX05FVEZJTFRFUl9Y VF9NQVRDSF9PU0Y9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSPW0KIyBDT05G SUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWSBpcyBub3Qgc2V0CkNPTkZJR19ORVRGSUxU RVJfWFRfTUFUQ0hfUEhZU0RFVj1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQ RT1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUVVPVEE9bQpDT05GSUdfTkVURklMVEVS X1hUX01BVENIX1JBVEVFU1Q9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0K Q09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUNFTlQ9bQpDT05GSUdfTkVURklMVEVSX1hU X01BVENIX1NDVFA9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NPQ0tFVD1tCkNPTkZJ R19ORVRGSUxURVJfWFRfTUFUQ0hfU1RBVEU9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENI X1NUQVRJU1RJQz1tCkNPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HPW0KQ09ORklH X05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1M9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENI X1RJTUU9bQpDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1UzMj1tCkNPTkZJR19JUF9TRVQ9 bQpDT05GSUdfSVBfU0VUX01BWD0yNTYKQ09ORklHX0lQX1NFVF9CSVRNQVBfSVA9bQpDT05G SUdfSVBfU0VUX0JJVE1BUF9JUE1BQz1tCkNPTkZJR19JUF9TRVRfQklUTUFQX1BPUlQ9bQpD T05GSUdfSVBfU0VUX0hBU0hfSVA9bQpDT05GSUdfSVBfU0VUX0hBU0hfSVBNQVJLPW0KQ09O RklHX0lQX1NFVF9IQVNIX0lQUE9SVD1tCkNPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlRJUD1t CkNPTkZJR19JUF9TRVRfSEFTSF9JUFBPUlRORVQ9bQpDT05GSUdfSVBfU0VUX0hBU0hfTkVU UE9SVE5FVD1tCkNPTkZJR19JUF9TRVRfSEFTSF9ORVQ9bQpDT05GSUdfSVBfU0VUX0hBU0hf TkVUTkVUPW0KQ09ORklHX0lQX1NFVF9IQVNIX05FVFBPUlQ9bQpDT05GSUdfSVBfU0VUX0hB U0hfTkVUSUZBQ0U9bQpDT05GSUdfSVBfU0VUX0xJU1RfU0VUPW0KIyBDT05GSUdfSVBfVlMg aXMgbm90IHNldAoKIwojIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgojCkNPTkZJR19O Rl9ERUZSQUdfSVBWND1tCkNPTkZJR19ORl9DT05OVFJBQ0tfSVBWND1tCkNPTkZJR19ORl9M T0dfQVJQPW0KQ09ORklHX05GX0xPR19JUFY0PW0KQ09ORklHX05GX1RBQkxFU19JUFY0PW0K Q09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY0PW0KQ09ORklHX05GVF9DSEFJTl9OQVRfSVBW ND1tCkNPTkZJR19ORlRfUkVKRUNUX0lQVjQ9bQpDT05GSUdfTkZfVEFCTEVTX0FSUD1tCkNP TkZJR19ORl9OQVRfSVBWND1tCkNPTkZJR19ORl9OQVRfU05NUF9CQVNJQz1tCkNPTkZJR19O Rl9OQVRfUFJPVE9fR1JFPW0KQ09ORklHX05GX05BVF9QUFRQPW0KQ09ORklHX05GX05BVF9I MzIzPW0KQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUgg aXMgbm90IHNldApDT05GSUdfSVBfTkZfTUFUQ0hfRUNOPW0KQ09ORklHX0lQX05GX01BVENI X1JQRklMVEVSPW0KQ09ORklHX0lQX05GX01BVENIX1RUTD1tCkNPTkZJR19JUF9ORl9GSUxU RVI9bQpDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCkNPTkZJR19JUF9ORl9UQVJHRVRf U1lOUFJPWFk9bQpDT05GSUdfSVBfTkZfTkFUPW0KQ09ORklHX0lQX05GX1RBUkdFVF9NQVNR VUVSQURFPW0KQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQpDT05GSUdfSVBfTkZfVEFS R0VUX1JFRElSRUNUPW0KQ09ORklHX0lQX05GX01BTkdMRT1tCiMgQ09ORklHX0lQX05GX1RB UkdFVF9DTFVTVEVSSVAgaXMgbm90IHNldApDT05GSUdfSVBfTkZfVEFSR0VUX0VDTj1tCiMg Q09ORklHX0lQX05GX1RBUkdFVF9UVEwgaXMgbm90IHNldApDT05GSUdfSVBfTkZfUkFXPW0K IyBDT05GSUdfSVBfTkZfU0VDVVJJVFkgaXMgbm90IHNldApDT05GSUdfSVBfTkZfQVJQVEFC TEVTPW0KQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCiMgQ09ORklHX0lQX05GX0FSUF9NQU5H TEUgaXMgbm90IHNldAoKIwojIElQdjY6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCiMKQ09O RklHX05GX0RFRlJBR19JUFY2PW0KQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KQ09ORklH X05GX1RBQkxFU19JUFY2PW0KQ09ORklHX05GVF9DSEFJTl9ST1VURV9JUFY2PW0KQ09ORklH X05GVF9DSEFJTl9OQVRfSVBWNj1tCkNPTkZJR19ORlRfUkVKRUNUX0lQVjY9bQpDT05GSUdf TkZfTE9HX0lQVjY9bQpDT05GSUdfTkZfTkFUX0lQVjY9bQpDT05GSUdfSVA2X05GX0lQVEFC TEVTPW0KQ09ORklHX0lQNl9ORl9NQVRDSF9BSD1tCkNPTkZJR19JUDZfTkZfTUFUQ0hfRVVJ NjQ9bQpDT05GSUdfSVA2X05GX01BVENIX0ZSQUc9bQpDT05GSUdfSVA2X05GX01BVENIX09Q VFM9bQpDT05GSUdfSVA2X05GX01BVENIX0hMPW0KQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2 SEVBREVSPW0KQ09ORklHX0lQNl9ORl9NQVRDSF9NSD1tCkNPTkZJR19JUDZfTkZfTUFUQ0hf UlBGSUxURVI9bQpDT05GSUdfSVA2X05GX01BVENIX1JUPW0KIyBDT05GSUdfSVA2X05GX1RB UkdFVF9ITCBpcyBub3Qgc2V0CkNPTkZJR19JUDZfTkZfRklMVEVSPW0KQ09ORklHX0lQNl9O Rl9UQVJHRVRfUkVKRUNUPW0KQ09ORklHX0lQNl9ORl9UQVJHRVRfU1lOUFJPWFk9bQpDT05G SUdfSVA2X05GX01BTkdMRT1tCkNPTkZJR19JUDZfTkZfUkFXPW0KIyBDT05GSUdfSVA2X05G X1NFQ1VSSVRZIGlzIG5vdCBzZXQKQ09ORklHX0lQNl9ORl9OQVQ9bQpDT05GSUdfSVA2X05G X1RBUkdFVF9NQVNRVUVSQURFPW0KQ09ORklHX0lQNl9ORl9UQVJHRVRfTlBUPW0KQ09ORklH X05GX1RBQkxFU19CUklER0U9bQpDT05GSUdfTkZUX0JSSURHRV9NRVRBPW0KQ09ORklHX05G VF9CUklER0VfUkVKRUNUPW0KQ09ORklHX05GX0xPR19CUklER0U9bQpDT05GSUdfQlJJREdF X05GX0VCVEFCTEVTPW0KQ09ORklHX0JSSURHRV9FQlRfQlJPVVRFPW0KQ09ORklHX0JSSURH RV9FQlRfVF9GSUxURVI9bQpDT05GSUdfQlJJREdFX0VCVF9UX05BVD1tCkNPTkZJR19CUklE R0VfRUJUXzgwMl8zPW0KQ09ORklHX0JSSURHRV9FQlRfQU1PTkc9bQpDT05GSUdfQlJJREdF X0VCVF9BUlA9bQpDT05GSUdfQlJJREdFX0VCVF9JUD1tCiMgQ09ORklHX0JSSURHRV9FQlRf SVA2IGlzIG5vdCBzZXQKQ09ORklHX0JSSURHRV9FQlRfTElNSVQ9bQpDT05GSUdfQlJJREdF X0VCVF9NQVJLPW0KQ09ORklHX0JSSURHRV9FQlRfUEtUVFlQRT1tCkNPTkZJR19CUklER0Vf RUJUX1NUUD1tCkNPTkZJR19CUklER0VfRUJUX1ZMQU49bQpDT05GSUdfQlJJREdFX0VCVF9B UlBSRVBMWT1tCkNPTkZJR19CUklER0VfRUJUX0ROQVQ9bQpDT05GSUdfQlJJREdFX0VCVF9N QVJLX1Q9bQpDT05GSUdfQlJJREdFX0VCVF9SRURJUkVDVD1tCkNPTkZJR19CUklER0VfRUJU X1NOQVQ9bQpDT05GSUdfQlJJREdFX0VCVF9MT0c9bQpDT05GSUdfQlJJREdFX0VCVF9ORkxP Rz1tCkNPTkZJR19JUF9EQ0NQPW0KQ09ORklHX0lORVRfRENDUF9ESUFHPW0KCiMKIyBEQ0NQ IENDSURzIENvbmZpZ3VyYXRpb24KIwojIENPTkZJR19JUF9EQ0NQX0NDSUQyX0RFQlVHIGlz IG5vdCBzZXQKQ09ORklHX0lQX0RDQ1BfQ0NJRDM9eQojIENPTkZJR19JUF9EQ0NQX0NDSUQz X0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0lQX0RDQ1BfVEZSQ19MSUI9eQoKIwojIERDQ1Ag S2VybmVsIEhhY2tpbmcKIwojIENPTkZJR19JUF9EQ0NQX0RFQlVHIGlzIG5vdCBzZXQKQ09O RklHX05FVF9EQ0NQUFJPQkU9bQpDT05GSUdfSVBfU0NUUD1tCkNPTkZJR19ORVRfU0NUUFBS T0JFPW0KIyBDT05GSUdfU0NUUF9EQkdfT0JKQ05UIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NU UF9ERUZBVUxUX0NPT0tJRV9ITUFDX01ENSBpcyBub3Qgc2V0CiMgQ09ORklHX1NDVFBfREVG QVVMVF9DT09LSUVfSE1BQ19TSEExIGlzIG5vdCBzZXQKQ09ORklHX1NDVFBfREVGQVVMVF9D T09LSUVfSE1BQ19OT05FPXkKQ09ORklHX1NDVFBfQ09PS0lFX0hNQUNfTUQ1PXkKQ09ORklH X1NDVFBfQ09PS0lFX0hNQUNfU0hBMT15CkNPTkZJR19SRFM9bQpDT05GSUdfUkRTX1RDUD1t CiMgQ09ORklHX1JEU19ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX1RJUEMgaXMgbm90IHNl dAojIENPTkZJR19BVE0gaXMgbm90IHNldApDT05GSUdfTDJUUD1tCiMgQ09ORklHX0wyVFBf REVCVUdGUyBpcyBub3Qgc2V0CkNPTkZJR19MMlRQX1YzPXkKQ09ORklHX0wyVFBfSVA9bQpD T05GSUdfTDJUUF9FVEg9bQpDT05GSUdfU1RQPW0KQ09ORklHX0JSSURHRT1tCkNPTkZJR19C UklER0VfSUdNUF9TTk9PUElORz15CkNPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkc9eQpD T05GSUdfSEFWRV9ORVRfRFNBPXkKQ09ORklHX1ZMQU5fODAyMVE9bQojIENPTkZJR19WTEFO XzgwMjFRX0dWUlAgaXMgbm90IHNldAojIENPTkZJR19WTEFOXzgwMjFRX01WUlAgaXMgbm90 IHNldAojIENPTkZJR19ERUNORVQgaXMgbm90IHNldApDT05GSUdfTExDPW0KQ09ORklHX0xM QzI9bQpDT05GSUdfSVBYPW0KIyBDT05GSUdfSVBYX0lOVEVSTiBpcyBub3Qgc2V0CiMgQ09O RklHX0FUQUxLIGlzIG5vdCBzZXQKIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKIyBDT05GSUdf TEFQQiBpcyBub3Qgc2V0CiMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CiMgQ09ORklHXzZM T1dQQU4gaXMgbm90IHNldAojIENPTkZJR19JRUVFODAyMTU0IGlzIG5vdCBzZXQKQ09ORklH X05FVF9TQ0hFRD15CgojCiMgUXVldWVpbmcvU2NoZWR1bGluZwojCkNPTkZJR19ORVRfU0NI X0NCUT1tCkNPTkZJR19ORVRfU0NIX0hUQj1tCkNPTkZJR19ORVRfU0NIX0hGU0M9bQpDT05G SUdfTkVUX1NDSF9QUklPPW0KQ09ORklHX05FVF9TQ0hfTVVMVElRPW0KQ09ORklHX05FVF9T Q0hfUkVEPW0KQ09ORklHX05FVF9TQ0hfU0ZCPW0KQ09ORklHX05FVF9TQ0hfU0ZRPW0KQ09O RklHX05FVF9TQ0hfVEVRTD1tCkNPTkZJR19ORVRfU0NIX1RCRj1tCkNPTkZJR19ORVRfU0NI X0dSRUQ9bQpDT05GSUdfTkVUX1NDSF9EU01BUks9bQpDT05GSUdfTkVUX1NDSF9ORVRFTT1t CkNPTkZJR19ORVRfU0NIX0RSUj1tCkNPTkZJR19ORVRfU0NIX01RUFJJTz1tCkNPTkZJR19O RVRfU0NIX0NIT0tFPW0KQ09ORklHX05FVF9TQ0hfUUZRPW0KQ09ORklHX05FVF9TQ0hfQ09E RUw9bQpDT05GSUdfTkVUX1NDSF9GUV9DT0RFTD1tCkNPTkZJR19ORVRfU0NIX0ZRPW0KQ09O RklHX05FVF9TQ0hfSEhGPW0KQ09ORklHX05FVF9TQ0hfUElFPW0KQ09ORklHX05FVF9TQ0hf SU5HUkVTUz1tCkNPTkZJR19ORVRfU0NIX1BMVUc9bQoKIwojIENsYXNzaWZpY2F0aW9uCiMK Q09ORklHX05FVF9DTFM9eQpDT05GSUdfTkVUX0NMU19CQVNJQz1tCkNPTkZJR19ORVRfQ0xT X1RDSU5ERVg9bQpDT05GSUdfTkVUX0NMU19ST1VURTQ9bQpDT05GSUdfTkVUX0NMU19GVz1t CkNPTkZJR19ORVRfQ0xTX1UzMj1tCkNPTkZJR19DTFNfVTMyX1BFUkY9eQpDT05GSUdfQ0xT X1UzMl9NQVJLPXkKQ09ORklHX05FVF9DTFNfUlNWUD1tCiMgQ09ORklHX05FVF9DTFNfUlNW UDYgaXMgbm90IHNldApDT05GSUdfTkVUX0NMU19GTE9XPW0KQ09ORklHX05FVF9DTFNfQ0dS T1VQPW0KQ09ORklHX05FVF9DTFNfQlBGPW0KQ09ORklHX05FVF9FTUFUQ0g9eQpDT05GSUdf TkVUX0VNQVRDSF9TVEFDSz0zMgpDT05GSUdfTkVUX0VNQVRDSF9DTVA9eQpDT05GSUdfTkVU X0VNQVRDSF9OQllURT1tCkNPTkZJR19ORVRfRU1BVENIX1UzMj1tCkNPTkZJR19ORVRfRU1B VENIX01FVEE9bQpDT05GSUdfTkVUX0VNQVRDSF9URVhUPW0KQ09ORklHX05FVF9FTUFUQ0hf SVBTRVQ9bQpDT05GSUdfTkVUX0NMU19BQ1Q9eQpDT05GSUdfTkVUX0FDVF9QT0xJQ0U9bQpD T05GSUdfTkVUX0FDVF9HQUNUPXkKQ09ORklHX0dBQ1RfUFJPQj15CkNPTkZJR19ORVRfQUNU X01JUlJFRD1tCkNPTkZJR19ORVRfQUNUX0lQVD1tCkNPTkZJR19ORVRfQUNUX05BVD1tCkNP TkZJR19ORVRfQUNUX1BFRElUPW0KIyBDT05GSUdfTkVUX0FDVF9TSU1QIGlzIG5vdCBzZXQK Q09ORklHX05FVF9BQ1RfU0tCRURJVD1tCiMgQ09ORklHX05FVF9BQ1RfQ1NVTSBpcyBub3Qg c2V0CkNPTkZJR19ORVRfQ0xTX0lORD15CkNPTkZJR19ORVRfU0NIX0ZJRk89eQojIENPTkZJ R19EQ0IgaXMgbm90IHNldApDT05GSUdfRE5TX1JFU09MVkVSPXkKIyBDT05GSUdfQkFUTUFO X0FEViBpcyBub3Qgc2V0CiMgQ09ORklHX09QRU5WU1dJVENIIGlzIG5vdCBzZXQKQ09ORklH X1ZTT0NLRVRTPW0KQ09ORklHX05FVExJTktfTU1BUD15CkNPTkZJR19ORVRMSU5LX0RJQUc9 bQojIENPTkZJR19ORVRfTVBMU19HU08gaXMgbm90IHNldAojIENPTkZJR19IU1IgaXMgbm90 IHNldApDT05GSUdfUlBTPXkKQ09ORklHX1JGU19BQ0NFTD15CkNPTkZJR19YUFM9eQpDT05G SUdfQ0dST1VQX05FVF9QUklPPXkKQ09ORklHX0NHUk9VUF9ORVRfQ0xBU1NJRD15CkNPTkZJ R19ORVRfUlhfQlVTWV9QT0xMPXkKQ09ORklHX0JRTD15CkNPTkZJR19CUEZfSklUPXkKQ09O RklHX05FVF9GTE9XX0xJTUlUPXkKCiMKIyBOZXR3b3JrIHRlc3RpbmcKIwojIENPTkZJR19O RVRfUEtUR0VOIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1RDUFBST0JFIGlzIG5vdCBzZXQK Q09ORklHX05FVF9EUk9QX01PTklUT1I9bQojIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0 CiMgQ09ORklHX0NBTiBpcyBub3Qgc2V0CiMgQ09ORklHX0lSREEgaXMgbm90IHNldAojIENP TkZJR19CVCBpcyBub3Qgc2V0CiMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKQ09ORklH X0ZJQl9SVUxFUz15CiMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKIyBDT05GSUdfV0lN QVggaXMgbm90IHNldAojIENPTkZJR19SRktJTEwgaXMgbm90IHNldAojIENPTkZJR19ORVRf OVAgaXMgbm90IHNldAojIENPTkZJR19DQUlGIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0VQSF9M SUIgaXMgbm90IHNldAojIENPTkZJR19ORkMgaXMgbm90IHNldApDT05GSUdfSEFWRV9CUEZf SklUPXkKCiMKIyBEZXZpY2UgRHJpdmVycwojCgojCiMgR2VuZXJpYyBEcml2ZXIgT3B0aW9u cwojCkNPTkZJR19VRVZFTlRfSEVMUEVSPXkKQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0i IgpDT05GSUdfREVWVE1QRlM9eQpDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQpDT05GSUdfU1RB TkRBTE9ORT15CkNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKQ09ORklHX0ZXX0xP QURFUj15CiMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CkNPTkZJR19F WFRSQV9GSVJNV0FSRT0iIgpDT05GSUdfRldfTE9BREVSX1VTRVJfSEVMUEVSPXkKIyBDT05G SUdfRldfTE9BREVSX1VTRVJfSEVMUEVSX0ZBTExCQUNLIGlzIG5vdCBzZXQKIyBDT05GSUdf REVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBz ZXQKIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAojIENPTkZJR19HRU5FUklD X0NQVV9ERVZJQ0VTIGlzIG5vdCBzZXQKQ09ORklHX0dFTkVSSUNfQ1BVX0FVVE9QUk9CRT15 CkNPTkZJR19ETUFfU0hBUkVEX0JVRkZFUj15CiMgQ09ORklHX0ZFTkNFX1RSQUNFIGlzIG5v dCBzZXQKIyBDT05GSUdfRE1BX0NNQSBpcyBub3Qgc2V0CgojCiMgQnVzIGRldmljZXMKIwpD T05GSUdfQ09OTkVDVE9SPXkKQ09ORklHX1BST0NfRVZFTlRTPXkKIyBDT05GSUdfTVREIGlz IG5vdCBzZXQKQ09ORklHX0FSQ0hfTUlHSFRfSEFWRV9QQ19QQVJQT1JUPXkKQ09ORklHX1BB UlBPUlQ9bQpDT05GSUdfUEFSUE9SVF9QQz1tCiMgQ09ORklHX1BBUlBPUlRfU0VSSUFMIGlz IG5vdCBzZXQKQ09ORklHX1BBUlBPUlRfUENfRklGTz15CiMgQ09ORklHX1BBUlBPUlRfUENf U1VQRVJJTyBpcyBub3Qgc2V0CiMgQ09ORklHX1BBUlBPUlRfR1NDIGlzIG5vdCBzZXQKIyBD T05GSUdfUEFSUE9SVF9BWDg4Nzk2IGlzIG5vdCBzZXQKIyBDT05GSUdfUEFSUE9SVF8xMjg0 IGlzIG5vdCBzZXQKQ09ORklHX1BOUD15CkNPTkZJR19QTlBfREVCVUdfTUVTU0FHRVM9eQoK IwojIFByb3RvY29scwojCkNPTkZJR19QTlBBQ1BJPXkKQ09ORklHX0JMS19ERVY9eQojIENP TkZJR19CTEtfREVWX05VTExfQkxLIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9GRCBp cyBub3Qgc2V0CiMgQ09ORklHX1BBUklERSBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19ERVZf UENJRVNTRF9NVElQMzJYWCBpcyBub3Qgc2V0CiMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBp cyBub3Qgc2V0CiMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKIyBDT05GSUdf QkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlz IG5vdCBzZXQKQ09ORklHX0JMS19ERVZfTE9PUD1tCkNPTkZJR19CTEtfREVWX0xPT1BfTUlO X0NPVU5UPTgKIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKIyBDT05G SUdfQkxLX0RFVl9EUkJEIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfTkJEPW0KIyBDT05G SUdfQkxLX0RFVl9OVk1FIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl9TS0QgaXMgbm90 IHNldAojIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CkNPTkZJR19CTEtfREVWX1JB TT1tCkNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgpDT05GSUdfQkxLX0RFVl9SQU1fU0la RT04MTkyCkNPTkZJR19CTEtfREVWX1hJUD15CkNPTkZJR19DRFJPTV9QS1RDRFZEPW0KQ09O RklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NB Q0hFIGlzIG5vdCBzZXQKIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKQ09ORklH X1ZJUlRJT19CTEs9bQojIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIyBDT05GSUdf QkxLX0RFVl9SQkQgaXMgbm90IHNldAojIENPTkZJR19CTEtfREVWX1JTWFggaXMgbm90IHNl dAoKIwojIE1pc2MgZGV2aWNlcwojCiMgQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEIGlzIG5v dCBzZXQKIyBDT05GSUdfQUQ1MjVYX0RQT1QgaXMgbm90IHNldAojIENPTkZJR19EVU1NWV9J UlEgaXMgbm90IHNldAojIENPTkZJR19JQk1fQVNNIGlzIG5vdCBzZXQKIyBDT05GSUdfUEhB TlRPTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKIyBDT05GSUdf VElGTV9DT1JFIGlzIG5vdCBzZXQKIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CkNP TkZJR19FTkNMT1NVUkVfU0VSVklDRVM9bQojIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAoj IENPTkZJR19BUERTOTgwMkFMUyBpcyBub3Qgc2V0CiMgQ09ORklHX0lTTDI5MDAzIGlzIG5v dCBzZXQKIyBDT05GSUdfSVNMMjkwMjAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1RT TDI1NTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0JIMTc4MCBpcyBub3Qgc2V0CiMg Q09ORklHX1NFTlNPUlNfQkgxNzcwIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BUERT OTkwWCBpcyBub3Qgc2V0CiMgQ09ORklHX0hNQzYzNTIgaXMgbm90IHNldAojIENPTkZJR19E UzE2ODIgaXMgbm90IHNldAojIENPTkZJR19USV9EQUM3NTEyIGlzIG5vdCBzZXQKIyBDT05G SUdfQk1QMDg1X0kyQyBpcyBub3Qgc2V0CiMgQ09ORklHX0JNUDA4NV9TUEkgaXMgbm90IHNl dAojIENPTkZJR19VU0JfU1dJVENIX0ZTQTk0ODAgaXMgbm90IHNldAojIENPTkZJR19MQVRU SUNFX0VDUDNfQ09ORklHIGlzIG5vdCBzZXQKIyBDT05GSUdfU1JBTSBpcyBub3Qgc2V0CiMg Q09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CgojCiMgRUVQUk9NIHN1cHBvcnQKIwpDT05GSUdf RUVQUk9NX0FUMjQ9bQojIENPTkZJR19FRVBST01fQVQyNSBpcyBub3Qgc2V0CkNPTkZJR19F RVBST01fTEVHQUNZPW0KIyBDT05GSUdfRUVQUk9NX01BWDY4NzUgaXMgbm90IHNldAojIENP TkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAojIENPTkZJR19FRVBST01fOTNYWDQ2IGlz IG5vdCBzZXQKIyBDT05GSUdfQ0I3MTBfQ09SRSBpcyBub3Qgc2V0CgojCiMgVGV4YXMgSW5z dHJ1bWVudHMgc2hhcmVkIHRyYW5zcG9ydCBsaW5lIGRpc2NpcGxpbmUKIwojIENPTkZJR19U SV9TVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTElTM19JMkMgaXMgbm90IHNldAoK IwojIEFsdGVyYSBGUEdBIGZpcm13YXJlIGRvd25sb2FkIG1vZHVsZQojCiMgQ09ORklHX0FM VEVSQV9TVEFQTCBpcyBub3Qgc2V0CkNPTkZJR19JTlRFTF9NRUk9bQojIENPTkZJR19JTlRF TF9NRUlfTUUgaXMgbm90IHNldAojIENPTkZJR19JTlRFTF9NRUlfVFhFIGlzIG5vdCBzZXQK IyBDT05GSUdfVk1XQVJFX1ZNQ0kgaXMgbm90IHNldAoKIwojIEludGVsIE1JQyBCdXMgRHJp dmVyCiMKIyBDT05GSUdfSU5URUxfTUlDX0JVUyBpcyBub3Qgc2V0CgojCiMgSW50ZWwgTUlD IEhvc3QgRHJpdmVyCiMKCiMKIyBJbnRlbCBNSUMgQ2FyZCBEcml2ZXIKIwojIENPTkZJR19H RU5XUUUgaXMgbm90IHNldAojIENPTkZJR19FQ0hPIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVf SURFPXkKIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKCiMKIyBTQ1NJIGRldmljZSBzdXBwb3J0 CiMKQ09ORklHX1NDU0lfTU9EPXkKQ09ORklHX1JBSURfQVRUUlM9eQpDT05GSUdfU0NTST15 CkNPTkZJR19TQ1NJX0RNQT15CkNPTkZJR19TQ1NJX05FVExJTks9eQojIENPTkZJR19TQ1NJ X1BST0NfRlMgaXMgbm90IHNldAoKIwojIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBl LCBDRC1ST00pCiMKQ09ORklHX0JMS19ERVZfU0Q9eQojIENPTkZJR19DSFJfREVWX1NUIGlz IG5vdCBzZXQKIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKQ09ORklHX0JMS19E RVZfU1I9bQpDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1I9eQpDT05GSUdfQ0hSX0RFVl9TRz15 CiMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKQ09ORklHX1NDU0lfRU5DTE9TVVJF PW0KQ09ORklHX1NDU0lfQ09OU1RBTlRTPXkKQ09ORklHX1NDU0lfTE9HR0lORz15CkNPTkZJ R19TQ1NJX1NDQU5fQVNZTkM9eQoKIwojIFNDU0kgVHJhbnNwb3J0cwojCkNPTkZJR19TQ1NJ X1NQSV9BVFRSUz15CkNPTkZJR19TQ1NJX0ZDX0FUVFJTPW0KQ09ORklHX1NDU0lfSVNDU0lf QVRUUlM9eQpDT05GSUdfU0NTSV9TQVNfQVRUUlM9eQpDT05GSUdfU0NTSV9TQVNfTElCU0FT PXkKQ09ORklHX1NDU0lfU0FTX0FUQT15CkNPTkZJR19TQ1NJX1NBU19IT1NUX1NNUD15CkNP TkZJR19TQ1NJX1NSUF9BVFRSUz1tCkNPTkZJR19TQ1NJX0xPV0xFVkVMPXkKQ09ORklHX0lT Q1NJX1RDUD1tCkNPTkZJR19JU0NTSV9CT09UX1NZU0ZTPW0KIyBDT05GSUdfU0NTSV9DWEdC M19JU0NTSSBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfQ1hHQjRfSVNDU0kgaXMgbm90IHNl dApDT05GSUdfU0NTSV9CTlgyX0lTQ1NJPW0KQ09ORklHX1NDU0lfQk5YMlhfRkNPRT1tCiMg Q09ORklHX0JFMklTQ1NJIGlzIG5vdCBzZXQKIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JB SUQgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0hQU0EgaXMgbm90IHNldAojIENPTkZJR19T Q1NJXzNXXzlYWFggaXMgbm90IHNldAojIENPTkZJR19TQ1NJXzNXX1NBUyBpcyBub3Qgc2V0 CiMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FBQ1JBSUQg aXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAojIENPTkZJR19T Q1NJX0FJQzc5WFggaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNl dAojIENPTkZJR19TQ1NJX01WU0FTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9NVlVNSSBp cyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CiMgQ09ORklHX1ND U0lfQURWQU5TWVMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0 CiMgQ09ORklHX1NDU0lfRVNBUzJSIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVHQVJBSURfTkVX R0VOIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKQ09O RklHX01FR0FSQUlEX1NBUz15CkNPTkZJR19TQ1NJX01QVDJTQVM9bQpDT05GSUdfU0NTSV9N UFQyU0FTX01BWF9TR0U9MTI4CkNPTkZJR19TQ1NJX01QVDJTQVNfTE9HR0lORz15CkNPTkZJ R19TQ1NJX01QVDNTQVM9bQpDT05GSUdfU0NTSV9NUFQzU0FTX01BWF9TR0U9MTI4CkNPTkZJ R19TQ1NJX01QVDNTQVNfTE9HR0lORz15CiMgQ09ORklHX1NDU0lfVUZTSENEIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0JVU0xP R0lDIGlzIG5vdCBzZXQKQ09ORklHX1ZNV0FSRV9QVlNDU0k9bQpDT05GSUdfTElCRkM9bQpD T05GSUdfTElCRkNPRT1tCiMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAojIENPTkZJR19GQ09F X0ZOSUMgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKIyBD T05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlO IGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9HRFRIIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NT SV9JU0NJIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAojIENPTkZJ R19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qg c2V0CiMgQ09ORklHX1NDU0lfUFBBIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9JTU0gaXMg bm90IHNldAojIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAojIENPTkZJR19TQ1NJX1NZ TTUzQzhYWF8yIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAojIENP TkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NTSV9RTEFfRkMg aXMgbm90IHNldAojIENPTkZJR19TQ1NJX1FMQV9JU0NTSSBpcyBub3Qgc2V0CiMgQ09ORklH X1NDU0lfTFBGQyBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQK IyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0RFQlVHIGlz IG5vdCBzZXQKIyBDT05GSUdfU0NTSV9QTUNSQUlEIGlzIG5vdCBzZXQKIyBDT05GSUdfU0NT SV9QTTgwMDEgaXMgbm90IHNldAojIENPTkZJR19TQ1NJX0JGQV9GQyBpcyBub3Qgc2V0CkNP TkZJR19TQ1NJX1ZJUlRJTz1tCiMgQ09ORklHX1NDU0lfQ0hFTFNJT19GQ09FIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiMgQ09ORklHX1NDU0lfT1NEX0lOSVRJ QVRPUiBpcyBub3Qgc2V0CkNPTkZJR19BVEE9eQojIENPTkZJR19BVEFfTk9OU1RBTkRBUkQg aXMgbm90IHNldApDT05GSUdfQVRBX1ZFUkJPU0VfRVJST1I9eQpDT05GSUdfQVRBX0FDUEk9 eQojIENPTkZJR19TQVRBX1pQT0REIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9QTVAgaXMg bm90IHNldAoKIwojIENvbnRyb2xsZXJzIHdpdGggbm9uLVNGRiBuYXRpdmUgaW50ZXJmYWNl CiMKQ09ORklHX1NBVEFfQUhDST1tCkNPTkZJR19TQVRBX0FIQ0lfUExBVEZPUk09bQojIENP TkZJR19TQVRBX0lOSUMxNjJYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9BQ0FSRF9BSENJ IGlzIG5vdCBzZXQKIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CiMgQ09ORklHX0FU QV9TRkYgaXMgbm90IHNldApDT05GSUdfTUQ9eQpDT05GSUdfQkxLX0RFVl9NRD1tCkNPTkZJ R19NRF9MSU5FQVI9bQpDT05GSUdfTURfUkFJRDA9bQpDT05GSUdfTURfUkFJRDE9bQpDT05G SUdfTURfUkFJRDEwPW0KQ09ORklHX01EX1JBSUQ0NTY9bQojIENPTkZJR19NRF9NVUxUSVBB VEggaXMgbm90IHNldAojIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldApDT05GSUdfQkNB Q0hFPW0KIyBDT05GSUdfQkNBQ0hFX0RFQlVHIGlzIG5vdCBzZXQKIyBDT05GSUdfQkNBQ0hF X0NMT1NVUkVTX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfRE1fQlVJTFRJTj15 CkNPTkZJR19CTEtfREVWX0RNPXkKIyBDT05GSUdfRE1fREVCVUcgaXMgbm90IHNldApDT05G SUdfRE1fQlVGSU89eQpDT05GSUdfRE1fQklPX1BSSVNPTj1tCkNPTkZJR19ETV9QRVJTSVNU RU5UX0RBVEE9bQojIENPTkZJR19ETV9ERUJVR19CTE9DS19TVEFDS19UUkFDSU5HIGlzIG5v dCBzZXQKIyBDT05GSUdfRE1fQ1JZUFQgaXMgbm90IHNldApDT05GSUdfRE1fU05BUFNIT1Q9 eQpDT05GSUdfRE1fVEhJTl9QUk9WSVNJT05JTkc9bQojIENPTkZJR19ETV9DQUNIRSBpcyBu b3Qgc2V0CiMgQ09ORklHX0RNX0VSQSBpcyBub3Qgc2V0CkNPTkZJR19ETV9NSVJST1I9bQoj IENPTkZJR19ETV9MT0dfVVNFUlNQQUNFIGlzIG5vdCBzZXQKQ09ORklHX0RNX1JBSUQ9bQpD T05GSUdfRE1fWkVSTz1tCiMgQ09ORklHX0RNX01VTFRJUEFUSCBpcyBub3Qgc2V0CiMgQ09O RklHX0RNX0RFTEFZIGlzIG5vdCBzZXQKQ09ORklHX0RNX1VFVkVOVD15CiMgQ09ORklHX0RN X0ZMQUtFWSBpcyBub3Qgc2V0CiMgQ09ORklHX0RNX1ZFUklUWSBpcyBub3Qgc2V0CiMgQ09O RklHX0RNX1NXSVRDSCBpcyBub3Qgc2V0CkNPTkZJR19UQVJHRVRfQ09SRT1tCkNPTkZJR19U Q01fSUJMT0NLPW0KQ09ORklHX1RDTV9GSUxFSU89bQpDT05GSUdfVENNX1BTQ1NJPW0KQ09O RklHX0xPT1BCQUNLX1RBUkdFVD1tCiMgQ09ORklHX1RDTV9GQyBpcyBub3Qgc2V0CkNPTkZJ R19JU0NTSV9UQVJHRVQ9bQpDT05GSUdfU0JQX1RBUkdFVD1tCkNPTkZJR19GVVNJT049eQoj IENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5v dCBzZXQKQ09ORklHX0ZVU0lPTl9TQVM9eQpDT05GSUdfRlVTSU9OX01BWF9TR0U9MTI4CkNP TkZJR19GVVNJT05fQ1RMPW0KQ09ORklHX0ZVU0lPTl9MT0dHSU5HPXkKCiMKIyBJRUVFIDEz OTQgKEZpcmVXaXJlKSBzdXBwb3J0CiMKQ09ORklHX0ZJUkVXSVJFPW0KQ09ORklHX0ZJUkVX SVJFX09IQ0k9bQpDT05GSUdfRklSRVdJUkVfU0JQMj1tCiMgQ09ORklHX0ZJUkVXSVJFX05F VCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZJUkVXSVJFX05PU1kgaXMgbm90IHNldAojIENPTkZJ R19JMk8gaXMgbm90IHNldAojIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUyBpcyBub3Qgc2V0 CkNPTkZJR19ORVRERVZJQ0VTPXkKQ09ORklHX05FVF9DT1JFPXkKQ09ORklHX0JPTkRJTkc9 bQojIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qg c2V0CiMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CkNPTkZJR19JRkI9bQpDT05GSUdfTkVU X1RFQU09bQojIENPTkZJR19ORVRfVEVBTV9NT0RFX0JST0FEQ0FTVCBpcyBub3Qgc2V0CkNP TkZJR19ORVRfVEVBTV9NT0RFX1JPVU5EUk9CSU49bQojIENPTkZJR19ORVRfVEVBTV9NT0RF X1JBTkRPTSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9URUFNX01PREVfQUNUSVZFQkFDS1VQ IGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1RFQU1fTU9ERV9MT0FEQkFMQU5DRSBpcyBub3Qg c2V0CkNPTkZJR19NQUNWTEFOPW0KIyBDT05GSUdfTUFDVlRBUCBpcyBub3Qgc2V0CiMgQ09O RklHX1ZYTEFOIGlzIG5vdCBzZXQKQ09ORklHX05FVENPTlNPTEU9bQojIENPTkZJR19ORVRD T05TT0xFX0RZTkFNSUMgaXMgbm90IHNldApDT05GSUdfTkVUUE9MTD15CkNPTkZJR19ORVRf UE9MTF9DT05UUk9MTEVSPXkKQ09ORklHX1RVTj1tCkNPTkZJR19WRVRIPW0KQ09ORklHX1ZJ UlRJT19ORVQ9bQojIENPTkZJR19OTE1PTiBpcyBub3Qgc2V0CiMgQ09ORklHX0FSQ05FVCBp cyBub3Qgc2V0CgojCiMgQ0FJRiB0cmFuc3BvcnQgZHJpdmVycwojCkNPTkZJR19WSE9TVF9O RVQ9bQpDT05GSUdfVkhPU1RfU0NTST1tCkNPTkZJR19WSE9TVF9SSU5HPW0KQ09ORklHX1ZI T1NUPW0KCiMKIyBEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlIGRyaXZlcnMKIwoj IENPTkZJR19ORVRfRFNBX01WODhFNlhYWCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9EU0Ff TVY4OEU2MDYwIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfTkVFRF9Q UFUgaXMgbm90IHNldAojIENPTkZJR19ORVRfRFNBX01WODhFNjEzMSBpcyBub3Qgc2V0CiMg Q09ORklHX05FVF9EU0FfTVY4OEU2MTIzXzYxXzY1IGlzIG5vdCBzZXQKQ09ORklHX0VUSEVS TkVUPXkKQ09ORklHX01ESU89bQojIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNl dAojIENPTkZJR19ORVRfVkVORE9SX0FEQVBURUMgaXMgbm90IHNldAojIENPTkZJR19ORVRf VkVORE9SX0FMVEVPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0FMVEVSQV9UU0UgaXMgbm90IHNl dAojIENPTkZJR19ORVRfVkVORE9SX0FNRCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9YR0VO RSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfQVJDIGlzIG5vdCBzZXQKIyBDT05G SUdfTkVUX1ZFTkRPUl9BVEhFUk9TIGlzIG5vdCBzZXQKQ09ORklHX05FVF9WRU5ET1JfQlJP QURDT009eQojIENPTkZJR19CNDQgaXMgbm90IHNldApDT05GSUdfQk5YMj1tCkNPTkZJR19D TklDPW0KIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKIyBDT05GSUdfQk5YMlggaXMgbm90 IHNldAojIENPTkZJR19ORVRfVkVORE9SX0JST0NBREUgaXMgbm90IHNldAojIENPTkZJR19O RVRfVkVORE9SX0NIRUxTSU8gaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0NJU0NP IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1hfRUNBVCBpcyBub3Qgc2V0CiMgQ09ORklHX0RORVQg aXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0RFQyBpcyBub3Qgc2V0CiMgQ09ORklH X05FVF9WRU5ET1JfRExJTksgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0VNVUxF WCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfRVhBUiBpcyBub3Qgc2V0CiMgQ09O RklHX05FVF9WRU5ET1JfSFAgaXMgbm90IHNldApDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTD15 CiMgQ09ORklHX0UxMDAgaXMgbm90IHNldAojIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CkNP TkZJR19FMTAwMEU9eQojIENPTkZJR19JR0IgaXMgbm90IHNldAojIENPTkZJR19JR0JWRiBp cyBub3Qgc2V0CiMgQ09ORklHX0lYR0IgaXMgbm90IHNldApDT05GSUdfSVhHQkU9bQpDT05G SUdfSVhHQkVfSFdNT049eQpDT05GSUdfSVhHQkVfRENBPXkKIyBDT05GSUdfSVhHQkVWRiBp cyBub3Qgc2V0CiMgQ09ORklHX0k0MEUgaXMgbm90IHNldAojIENPTkZJR19JNDBFVkYgaXMg bm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX0k4MjVYWCBpcyBub3Qgc2V0CiMgQ09ORklH X0lQMTAwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0pNRSBpcyBub3Qgc2V0CiMgQ09ORklHX05F VF9WRU5ET1JfTUFSVkVMTCBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfTUVMTEFO T1ggaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX01JQ1JFTCBpcyBub3Qgc2V0CkNP TkZJR19ORVRfVkVORE9SX01JQ1JPQ0hJUD15CiMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBz ZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9NWVJJIGlzIG5vdCBzZXQKIyBDT05GSUdfRkVBTE5Y IGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKIyBD T05GSUdfTkVUX1ZFTkRPUl9OVklESUEgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9S X09LSSBpcyBub3Qgc2V0CiMgQ09ORklHX0VUSE9DIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVU X1BBQ0tFVF9FTkdJTkUgaXMgbm90IHNldAojIENPTkZJR19ORVRfVkVORE9SX1FMT0dJQyBp cyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfUkVBTFRFSyBpcyBub3Qgc2V0CiMgQ09O RklHX05FVF9WRU5ET1JfUkRDIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9TQU1T VU5HIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9TRUVRIGlzIG5vdCBzZXQKIyBD T05GSUdfTkVUX1ZFTkRPUl9TSUxBTiBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1Jf U0lTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0ZDIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZF TkRPUl9TTVNDIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9TVE1JQ1JPIGlzIG5v dCBzZXQKIyBDT05GSUdfTkVUX1ZFTkRPUl9TVU4gaXMgbm90IHNldAojIENPTkZJR19ORVRf VkVORE9SX1RFSFVUSSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9WRU5ET1JfVEkgaXMgbm90 IHNldAojIENPTkZJR19ORVRfVkVORE9SX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX05FVF9W RU5ET1JfV0laTkVUIGlzIG5vdCBzZXQKIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiMgQ09O RklHX0hJUFBJIGlzIG5vdCBzZXQKIyBDT05GSUdfTkVUX1NCMTAwMCBpcyBub3Qgc2V0CkNP TkZJR19QSFlMSUI9bQoKIwojIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKIwojIENPTkZJR19B VDgwM1hfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfQU1EX1BIWSBpcyBub3Qgc2V0CiMgQ09O RklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90 IHNldAojIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldApDT05GSUdfTFhUX1BIWT1tCiMg Q09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAojIENPTkZJR19WSVRFU1NFX1BIWSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKQ09ORklHX0JST0FEQ09NX1BI WT1tCiMgQ09ORklHX0JDTTdYWFhfUEhZIGlzIG5vdCBzZXQKQ09ORklHX0JDTTg3WFhfUEhZ PW0KIyBDT05GSUdfSUNQTFVTX1BIWSBpcyBub3Qgc2V0CiMgQ09ORklHX1JFQUxURUtfUEhZ IGlzIG5vdCBzZXQKIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKIyBDT05GSUdf U1RFMTBYUCBpcyBub3Qgc2V0CiMgQ09ORklHX0xTSV9FVDEwMTFDX1BIWSBpcyBub3Qgc2V0 CiMgQ09ORklHX01JQ1JFTF9QSFkgaXMgbm90IHNldApDT05GSUdfTURJT19CSVRCQU5HPW0K Q09ORklHX01ESU9fR1BJTz1tCiMgQ09ORklHX01JQ1JFTF9LUzg5OTVNQSBpcyBub3Qgc2V0 CiMgQ09ORklHX1BMSVAgaXMgbm90IHNldAojIENPTkZJR19QUFAgaXMgbm90IHNldAojIENP TkZJR19TTElQIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX05FVF9EUklWRVJTIGlzIG5vdCBz ZXQKIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CgojCiMgRW5hYmxlIFdpTUFYIChOZXR3b3Jr aW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycwojCiMgQ09ORklHX1dBTiBp cyBub3Qgc2V0CkNPTkZJR19WTVhORVQzPW0KIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0Cgoj CiMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKIwpDT05GSUdfSU5QVVQ9eQpDT05GSUdfSU5QVVRf RkZfTUVNTEVTUz1tCkNPTkZJR19JTlBVVF9QT0xMREVWPW0KQ09ORklHX0lOUFVUX1NQQVJT RUtNQVA9bQojIENPTkZJR19JTlBVVF9NQVRSSVhLTUFQIGlzIG5vdCBzZXQKCiMKIyBVc2Vy bGFuZCBpbnRlcmZhY2VzCiMKQ09ORklHX0lOUFVUX01PVVNFREVWPW0KQ09ORklHX0lOUFVU X01PVVNFREVWX1BTQVVYPXkKQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEyODAK Q09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTEyMDAKIyBDT05GSUdfSU5QVVRfSk9Z REVWIGlzIG5vdCBzZXQKQ09ORklHX0lOUFVUX0VWREVWPXkKIyBDT05GSUdfSU5QVVRfRVZC VUcgaXMgbm90IHNldAoKIwojIElucHV0IERldmljZSBEcml2ZXJzCiMKQ09ORklHX0lOUFVU X0tFWUJPQVJEPXkKIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CiMgQ09O RklHX0tFWUJPQVJEX0FEUDU1ODkgaXMgbm90IHNldApDT05GSUdfS0VZQk9BUkRfQVRLQkQ9 eQojIENPTkZJR19LRVlCT0FSRF9RVDEwNzAgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FS RF9RVDIxNjAgaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0 CiMgQ09ORklHX0tFWUJPQVJEX0dQSU8gaXMgbm90IHNldAojIENPTkZJR19LRVlCT0FSRF9H UElPX1BPTExFRCBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX1RDQTY0MTYgaXMgbm90 IHNldAojIENPTkZJR19LRVlCT0FSRF9UQ0E4NDE4IGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZ Qk9BUkRfTUFUUklYIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfTE04MzIzIGlzIG5v dCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfTE04MzMzIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZ Qk9BUkRfTUFYNzM1OSBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX01DUyBpcyBub3Qg c2V0CiMgQ09ORklHX0tFWUJPQVJEX01QUjEyMSBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJP QVJEX05FV1RPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBu b3Qgc2V0CiMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKIyBDT05GSUdf S0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMg bm90IHNldApDT05GSUdfSU5QVVRfTU9VU0U9eQpDT05GSUdfTU9VU0VfUFMyPW0KIyBDT05G SUdfTU9VU0VfUFMyX0FMUFMgaXMgbm90IHNldAojIENPTkZJR19NT1VTRV9QUzJfTE9HSVBT MlBQIGlzIG5vdCBzZXQKIyBDT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUyBpcyBub3Qgc2V0 CiMgQ09ORklHX01PVVNFX1BTMl9DWVBSRVNTIGlzIG5vdCBzZXQKIyBDT05GSUdfTU9VU0Vf UFMyX0xJRkVCT09LIGlzIG5vdCBzZXQKIyBDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQg aXMgbm90IHNldAojIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAojIENP TkZJR19NT1VTRV9QUzJfU0VOVEVMSUMgaXMgbm90IHNldAojIENPTkZJR19NT1VTRV9QUzJf VE9VQ0hLSVQgaXMgbm90IHNldApDT05GSUdfTU9VU0VfU0VSSUFMPW0KIyBDT05GSUdfTU9V U0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX0JDTTU5NzQgaXMgbm90 IHNldAojIENPTkZJR19NT1VTRV9DWUFQQSBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1ZT WFhYQUEgaXMgbm90IHNldAojIENPTkZJR19NT1VTRV9HUElPIGlzIG5vdCBzZXQKIyBDT05G SUdfTU9VU0VfU1lOQVBUSUNTX0kyQyBpcyBub3Qgc2V0CiMgQ09ORklHX01PVVNFX1NZTkFQ VElDU19VU0IgaXMgbm90IHNldApDT05GSUdfSU5QVVRfSk9ZU1RJQ0s9eQpDT05GSUdfSk9Z U1RJQ0tfQU5BTE9HPW0KIyBDT05GSUdfSk9ZU1RJQ0tfQTNEIGlzIG5vdCBzZXQKIyBDT05G SUdfSk9ZU1RJQ0tfQURJIGlzIG5vdCBzZXQKIyBDT05GSUdfSk9ZU1RJQ0tfQ09CUkEgaXMg bm90IHNldAojIENPTkZJR19KT1lTVElDS19HRjJLIGlzIG5vdCBzZXQKIyBDT05GSUdfSk9Z U1RJQ0tfR1JJUCBpcyBub3Qgc2V0CiMgQ09ORklHX0pPWVNUSUNLX0dSSVBfTVAgaXMgbm90 IHNldAojIENPTkZJR19KT1lTVElDS19HVUlMTEVNT1QgaXMgbm90IHNldAojIENPTkZJR19K T1lTVElDS19JTlRFUkFDVCBpcyBub3Qgc2V0CiMgQ09ORklHX0pPWVNUSUNLX1NJREVXSU5E RVIgaXMgbm90IHNldAojIENPTkZJR19KT1lTVElDS19UTURDIGlzIG5vdCBzZXQKIyBDT05G SUdfSk9ZU1RJQ0tfSUZPUkNFIGlzIG5vdCBzZXQKIyBDT05GSUdfSk9ZU1RJQ0tfV0FSUklP UiBpcyBub3Qgc2V0CiMgQ09ORklHX0pPWVNUSUNLX01BR0VMTEFOIGlzIG5vdCBzZXQKIyBD T05GSUdfSk9ZU1RJQ0tfU1BBQ0VPUkIgaXMgbm90IHNldAojIENPTkZJR19KT1lTVElDS19T UEFDRUJBTEwgaXMgbm90IHNldAojIENPTkZJR19KT1lTVElDS19TVElOR0VSIGlzIG5vdCBz ZXQKIyBDT05GSUdfSk9ZU1RJQ0tfVFdJREpPWSBpcyBub3Qgc2V0CiMgQ09ORklHX0pPWVNU SUNLX1pIRU5IVUEgaXMgbm90IHNldAojIENPTkZJR19KT1lTVElDS19EQjkgaXMgbm90IHNl dAojIENPTkZJR19KT1lTVElDS19HQU1FQ09OIGlzIG5vdCBzZXQKIyBDT05GSUdfSk9ZU1RJ Q0tfVFVSQk9HUkFGWCBpcyBub3Qgc2V0CiMgQ09ORklHX0pPWVNUSUNLX0FTNTAxMSBpcyBu b3Qgc2V0CiMgQ09ORklHX0pPWVNUSUNLX0pPWURVTVAgaXMgbm90IHNldApDT05GSUdfSk9Z U1RJQ0tfWFBBRD1tCkNPTkZJR19KT1lTVElDS19YUEFEX0ZGPXkKIyBDT05GSUdfSk9ZU1RJ Q0tfWFBBRF9MRURTIGlzIG5vdCBzZXQKIyBDT05GSUdfSk9ZU1RJQ0tfV0FMS0VSQTA3MDEg aXMgbm90IHNldApDT05GSUdfSU5QVVRfVEFCTEVUPXkKIyBDT05GSUdfVEFCTEVUX1VTQl9B Q0VDQUQgaXMgbm90IHNldAojIENPTkZJR19UQUJMRVRfVVNCX0FJUFRFSyBpcyBub3Qgc2V0 CiMgQ09ORklHX1RBQkxFVF9VU0JfR1RDTyBpcyBub3Qgc2V0CiMgQ09ORklHX1RBQkxFVF9V U0JfSEFOV0FORyBpcyBub3Qgc2V0CiMgQ09ORklHX1RBQkxFVF9VU0JfS0JUQUIgaXMgbm90 IHNldApDT05GSUdfVEFCTEVUX1NFUklBTF9XQUNPTTQ9bQpDT05GSUdfSU5QVVRfVE9VQ0hT Q1JFRU49eQojIENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2IGlzIG5vdCBzZXQKIyBDT05G SUdfVE9VQ0hTQ1JFRU5fQUQ3ODc3IGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5f QUQ3ODc5IGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQVRNRUxfTVhUIGlzIG5v dCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQVVPX1BJWENJUiBpcyBub3Qgc2V0CiMgQ09O RklHX1RPVUNIU0NSRUVOX0JVMjEwMTMgaXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVF Tl9DWThDVE1HMTEwIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQ1lUVFNQX0NP UkUgaXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9DWVRUU1A0X0NPUkUgaXMgbm90 IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9EWU5BUFJPIGlzIG5vdCBzZXQKIyBDT05GSUdf VE9VQ0hTQ1JFRU5fSEFNUFNISVJFIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5f RUVUSSBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX0ZVSklUU1UgaXMgbm90IHNl dAojIENPTkZJR19UT1VDSFNDUkVFTl9JTEkyMTBYIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9V Q0hTQ1JFRU5fR1VOWkUgaXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMg bm90IHNldApDT05GSUdfVE9VQ0hTQ1JFRU5fV0FDT01fVzgwMDE9bQojIENPTkZJR19UT1VD SFNDUkVFTl9XQUNPTV9JMkMgaXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9NQVgx MTgwMSBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX01DUzUwMDAgaXMgbm90IHNl dAojIENPTkZJR19UT1VDSFNDUkVFTl9NTVMxMTQgaXMgbm90IHNldAojIENPTkZJR19UT1VD SFNDUkVFTl9NVE9VQ0ggaXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9JTkVYSU8g aXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9NSzcxMiBpcyBub3Qgc2V0CiMgQ09O RklHX1RPVUNIU0NSRUVOX1BFTk1PVU5UIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JF RU5fRURUX0ZUNVgwNiBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1RPVUNIUklH SFQgaXMgbm90IHNldAojIENPTkZJR19UT1VDSFNDUkVFTl9UT1VDSFdJTiBpcyBub3Qgc2V0 CiMgQ09ORklHX1RPVUNIU0NSRUVOX1BJWENJUiBpcyBub3Qgc2V0CkNPTkZJR19UT1VDSFND UkVFTl9VU0JfQ09NUE9TSVRFPW0KIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0VHQUxBWCBp cyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9QQU5KSVQgaXMgbm90IHNldAoj IENPTkZJR19UT1VDSFNDUkVFTl9VU0JfM00gaXMgbm90IHNldAojIENPTkZJR19UT1VDSFND UkVFTl9VU0JfSVRNIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0VUVVJC TyBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9HVU5aRSBpcyBub3Qgc2V0 CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9ETUNfVFNDMTAgaXMgbm90IHNldAojIENPTkZJ R19UT1VDSFNDUkVFTl9VU0JfSVJUT1VDSCBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NS RUVOX1VTQl9JREVBTFRFSyBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9H RU5FUkFMX1RPVUNIIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0dPVE9Q IGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNCX0pBU1RFQyBpcyBub3Qgc2V0 CkNPTkZJR19UT1VDSFNDUkVFTl9VU0JfRUxPPXkKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVVNC X0UySSBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9aWVRST05JQyBpcyBu b3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9FVFRfVEM0NVVTQiBpcyBub3Qgc2V0 CiMgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9ORVhJTyBpcyBub3Qgc2V0CkNPTkZJR19UT1VD SFNDUkVFTl9VU0JfRUFTWVRPVUNIPXkKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fVE9VQ0hJVDIx MyBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NSRUVOX1RTQ19TRVJJTyBpcyBub3Qgc2V0 CiMgQ09ORklHX1RPVUNIU0NSRUVOX1RTQzIwMDUgaXMgbm90IHNldAojIENPTkZJR19UT1VD SFNDUkVFTl9UU0MyMDA3IGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fU1QxMjMy IGlzIG5vdCBzZXQKIyBDT05GSUdfVE9VQ0hTQ1JFRU5fU1VSNDAgaXMgbm90IHNldAojIENP TkZJR19UT1VDSFNDUkVFTl9UUFM2NTA3WCBpcyBub3Qgc2V0CiMgQ09ORklHX1RPVUNIU0NS RUVOX1pGT1JDRSBpcyBub3Qgc2V0CkNPTkZJR19JTlBVVF9NSVNDPXkKIyBDT05GSUdfSU5Q VVRfQUQ3MTRYIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfQk1BMTUwIGlzIG5vdCBzZXQK Q09ORklHX0lOUFVUX1BDU1BLUj15CiMgQ09ORklHX0lOUFVUX01NQTg0NTAgaXMgbm90IHNl dAojIENPTkZJR19JTlBVVF9NUFUzMDUwIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfQVBB TkVMIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfR1AyQSBpcyBub3Qgc2V0CiMgQ09ORklH X0lOUFVUX0dQSU9fQkVFUEVSIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfR1BJT19USUxU X1BPTExFRCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVUX0FUTEFTX0JUTlMgaXMgbm90IHNl dAojIENPTkZJR19JTlBVVF9BVElfUkVNT1RFMiBpcyBub3Qgc2V0CiMgQ09ORklHX0lOUFVU X0tFWVNQQU5fUkVNT1RFIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfS1hUSjkgaXMgbm90 IHNldAojIENPTkZJR19JTlBVVF9QT1dFUk1BVEUgaXMgbm90IHNldAojIENPTkZJR19JTlBV VF9ZRUFMSU5LIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfQ00xMDkgaXMgbm90IHNldApD T05GSUdfSU5QVVRfVUlOUFVUPXkKIyBDT05GSUdfSU5QVVRfUENGODU3NCBpcyBub3Qgc2V0 CiMgQ09ORklHX0lOUFVUX0dQSU9fUk9UQVJZX0VOQ09ERVIgaXMgbm90IHNldAojIENPTkZJ R19JTlBVVF9BRFhMMzRYIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5QVVRfSU1TX1BDVSBpcyBu b3Qgc2V0CiMgQ09ORklHX0lOUFVUX0NNQTMwMDAgaXMgbm90IHNldAojIENPTkZJR19JTlBV VF9JREVBUEFEX1NMSURFQkFSIGlzIG5vdCBzZXQKCiMKIyBIYXJkd2FyZSBJL08gcG9ydHMK IwpDT05GSUdfU0VSSU89eQpDT05GSUdfQVJDSF9NSUdIVF9IQVZFX1BDX1NFUklPPXkKQ09O RklHX1NFUklPX0k4MDQyPXkKQ09ORklHX1NFUklPX1NFUlBPUlQ9bQojIENPTkZJR19TRVJJ T19DVDgyQzcxMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklPX1BBUktCRCBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFUklPX1BDSVBTMiBpcyBub3Qgc2V0CkNPTkZJR19TRVJJT19MSUJQUzI9 eQpDT05GSUdfU0VSSU9fUkFXPW0KIyBDT05GSUdfU0VSSU9fQUxURVJBX1BTMiBpcyBub3Qg c2V0CiMgQ09ORklHX1NFUklPX1BTMk1VTFQgaXMgbm90IHNldAojIENPTkZJR19TRVJJT19B UkNfUFMyIGlzIG5vdCBzZXQKQ09ORklHX0dBTUVQT1JUPW0KIyBDT05GSUdfR0FNRVBPUlRf TlM1NTggaXMgbm90IHNldAojIENPTkZJR19HQU1FUE9SVF9MNCBpcyBub3Qgc2V0CiMgQ09O RklHX0dBTUVQT1JUX0VNVTEwSzEgaXMgbm90IHNldAojIENPTkZJR19HQU1FUE9SVF9GTTgw MSBpcyBub3Qgc2V0CgojCiMgQ2hhcmFjdGVyIGRldmljZXMKIwpDT05GSUdfVFRZPXkKQ09O RklHX1ZUPXkKQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TPXkKQ09ORklHX1ZUX0NPTlNP TEU9eQpDT05GSUdfSFdfQ09OU09MRT15CkNPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkc9 eQpDT05GSUdfVU5JWDk4X1BUWVM9eQpDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNF Uz15CiMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFMX05P TlNUQU5EQVJEIGlzIG5vdCBzZXQKIyBDT05GSUdfTk9aT01JIGlzIG5vdCBzZXQKIyBDT05G SUdfTl9HU00gaXMgbm90IHNldAojIENPTkZJR19UUkFDRV9TSU5LIGlzIG5vdCBzZXQKQ09O RklHX0RFVktNRU09eQoKIwojIFNlcmlhbCBkcml2ZXJzCiMKQ09ORklHX1NFUklBTF9FQVJM WUNPTj15CkNPTkZJR19TRVJJQUxfODI1MD15CkNPTkZJR19TRVJJQUxfODI1MF9ERVBSRUNB VEVEX09QVElPTlM9eQpDT05GSUdfU0VSSUFMXzgyNTBfUE5QPXkKQ09ORklHX1NFUklBTF84 MjUwX0NPTlNPTEU9eQpDT05GSUdfU0VSSUFMXzgyNTBfRE1BPXkKQ09ORklHX1NFUklBTF84 MjUwX1BDST15CkNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CkNPTkZJR19TRVJJQUxf ODI1MF9SVU5USU1FX1VBUlRTPTQKQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIyBD T05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUyBpcyBub3Qgc2V0CkNPTkZJR19TRVJJQUxf ODI1MF9TSEFSRV9JUlE9eQojIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VS SUFMXzgyNTBfRFcgaXMgbm90IHNldAoKIwojIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBv cnQKIwojIENPTkZJR19TRVJJQUxfS0dEQl9OTUkgaXMgbm90IHNldAojIENPTkZJR19TRVJJ QUxfTUFYMzEwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9NQVgzMTBYIGlzIG5vdCBz ZXQKIyBDT05GSUdfU0VSSUFMX01GRF9IU1UgaXMgbm90IHNldApDT05GSUdfU0VSSUFMX0NP UkU9eQpDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CkNPTkZJR19DT05TT0xFX1BPTEw9 eQojIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFMX1NDQ05Y UCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9TQzE2SVM3WFggaXMgbm90IHNldAojIENP TkZJR19TRVJJQUxfQUxURVJBX0pUQUdVQVJUIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFM X0FMVEVSQV9VQVJUIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFMX0lGWDZYNjAgaXMgbm90 IHNldAojIENPTkZJR19TRVJJQUxfQVJDIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VSSUFMX1JQ MiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFUklBTF9GU0xfTFBVQVJUIGlzIG5vdCBzZXQKQ09O RklHX1RUWV9QUklOVEs9eQojIENPTkZJR19QUklOVEVSIGlzIG5vdCBzZXQKIyBDT05GSUdf UFBERVYgaXMgbm90IHNldApDT05GSUdfSFZDX0RSSVZFUj15CkNPTkZJR19WSVJUSU9fQ09O U09MRT1tCkNPTkZJR19JUE1JX0hBTkRMRVI9eQpDT05GSUdfSVBNSV9QQU5JQ19FVkVOVD15 CkNPTkZJR19JUE1JX1BBTklDX1NUUklORz15CkNPTkZJR19JUE1JX0RFVklDRV9JTlRFUkZB Q0U9eQpDT05GSUdfSVBNSV9TST15CkNPTkZJR19JUE1JX1NJX1BST0JFX0RFRkFVTFRTPXkK Q09ORklHX0lQTUlfV0FUQ0hET0c9bQpDT05GSUdfSVBNSV9QT1dFUk9GRj1tCkNPTkZJR19I V19SQU5ET009eQpDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU09bQpDT05GSUdfSFdfUkFO RE9NX0lOVEVMPW0KIyBDT05GSUdfSFdfUkFORE9NX0FNRCBpcyBub3Qgc2V0CiMgQ09ORklH X0hXX1JBTkRPTV9WSUEgaXMgbm90IHNldApDT05GSUdfSFdfUkFORE9NX1ZJUlRJTz1tCkNP TkZJR19IV19SQU5ET01fVFBNPW0KQ09ORklHX05WUkFNPXkKIyBDT05GSUdfUjM5NjQgaXMg bm90IHNldAojIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CiMgQ09ORklHX01XQVZFIGlz IG5vdCBzZXQKQ09ORklHX1JBV19EUklWRVI9eQpDT05GSUdfTUFYX1JBV19ERVZTPTI1NgpD T05GSUdfSFBFVD15CkNPTkZJR19IUEVUX01NQVA9eQpDT05GSUdfSFBFVF9NTUFQX0RFRkFV TFQ9eQpDT05GSUdfSEFOR0NIRUNLX1RJTUVSPW0KQ09ORklHX1RDR19UUE09bQpDT05GSUdf VENHX1RJUz1tCkNPTkZJR19UQ0dfVElTX0kyQ19BVE1FTD1tCkNPTkZJR19UQ0dfVElTX0ky Q19JTkZJTkVPTj1tCkNPTkZJR19UQ0dfVElTX0kyQ19OVVZPVE9OPW0KQ09ORklHX1RDR19O U0M9bQpDT05GSUdfVENHX0FUTUVMPW0KQ09ORklHX1RDR19JTkZJTkVPTj1tCkNPTkZJR19U Q0dfU1QzM19JMkM9bQojIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CkNPTkZJR19ERVZQ T1JUPXkKCiMKIyBJMkMgc3VwcG9ydAojCkNPTkZJR19JMkM9bQpDT05GSUdfSTJDX0JPQVJE SU5GTz15CkNPTkZJR19JMkNfQ09NUEFUPXkKQ09ORklHX0kyQ19DSEFSREVWPW0KQ09ORklH X0kyQ19NVVg9bQoKIwojIE11bHRpcGxleGVyIEkyQyBDaGlwIHN1cHBvcnQKIwpDT05GSUdf STJDX01VWF9HUElPPW0KQ09ORklHX0kyQ19NVVhfUENBOTU0MT1tCkNPTkZJR19JMkNfTVVY X1BDQTk1NHg9bQpDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKQ09ORklHX0kyQ19BTEdPQklU PW0KCiMKIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKIwoKIwojIFBDIFNNQnVzIGhvc3Qg Y29udHJvbGxlciBkcml2ZXJzCiMKIyBDT05GSUdfSTJDX0FMSTE1MzUgaXMgbm90IHNldAoj IENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19BTEkxNVgzIGlz IG5vdCBzZXQKIyBDT05GSUdfSTJDX0FNRDc1NiBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19B TUQ4MTExIGlzIG5vdCBzZXQKQ09ORklHX0kyQ19JODAxPW0KQ09ORklHX0kyQ19JU0NIPW0K Q09ORklHX0kyQ19JU01UPW0KIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKIyBDT05G SUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAojIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qg c2V0CiMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAojIENPTkZJR19JMkNfU0lTOTZY IGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19W SUFQUk8gaXMgbm90IHNldAoKIwojIEFDUEkgZHJpdmVycwojCkNPTkZJR19JMkNfU0NNST1t CgojCiMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVt LW9uLWNoaXApCiMKIyBDT05GSUdfSTJDX0NCVVNfR1BJTyBpcyBub3Qgc2V0CiMgQ09ORklH X0kyQ19ERVNJR05XQVJFX1BMQVRGT1JNIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX0RFU0lH TldBUkVfUENJIGlzIG5vdCBzZXQKQ09ORklHX0kyQ19HUElPPW0KIyBDT05GSUdfSTJDX09D T1JFUyBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAoj IENPTkZJR19JMkNfUFhBX1BDSSBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19TSU1URUMgaXMg bm90IHNldAojIENPTkZJR19JMkNfWElMSU5YIGlzIG5vdCBzZXQKCiMKIyBFeHRlcm5hbCBJ MkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCiMKIyBDT05GSUdfSTJDX0RJT0xBTl9VMkMgaXMg bm90IHNldAojIENPTkZJR19JMkNfUEFSUE9SVCBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19Q QVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKIyBDT05GSUdfSTJDX1JPQk9URlVaWl9PU0lGIGlz IG5vdCBzZXQKIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKQ09ORklHX0kyQ19U SU5ZX1VTQj1tCgojCiMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCiMKQ09ORklHX0ky Q19TVFVCPW0KIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAojIENPTkZJR19J MkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90 IHNldApDT05GSUdfU1BJPXkKIyBDT05GSUdfU1BJX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklH X1NQSV9NQVNURVI9eQoKIwojIFNQSSBNYXN0ZXIgQ29udHJvbGxlciBEcml2ZXJzCiMKIyBD T05GSUdfU1BJX0FMVEVSQSBpcyBub3Qgc2V0CiMgQ09ORklHX1NQSV9CSVRCQU5HIGlzIG5v dCBzZXQKIyBDT05GSUdfU1BJX0JVVFRFUkZMWSBpcyBub3Qgc2V0CiMgQ09ORklHX1NQSV9H UElPIGlzIG5vdCBzZXQKIyBDT05GSUdfU1BJX0xNNzBfTExQIGlzIG5vdCBzZXQKIyBDT05G SUdfU1BJX09DX1RJTlkgaXMgbm90IHNldAojIENPTkZJR19TUElfUFhBMlhYIGlzIG5vdCBz ZXQKIyBDT05GSUdfU1BJX1BYQTJYWF9QQ0kgaXMgbm90IHNldAojIENPTkZJR19TUElfU0Mx OElTNjAyIGlzIG5vdCBzZXQKIyBDT05GSUdfU1BJX1hDT01NIGlzIG5vdCBzZXQKIyBDT05G SUdfU1BJX1hJTElOWCBpcyBub3Qgc2V0CiMgQ09ORklHX1NQSV9ERVNJR05XQVJFIGlzIG5v dCBzZXQKCiMKIyBTUEkgUHJvdG9jb2wgTWFzdGVycwojCiMgQ09ORklHX1NQSV9TUElERVYg aXMgbm90IHNldAojIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NQ TUkgaXMgbm90IHNldAojIENPTkZJR19IU0kgaXMgbm90IHNldAoKIwojIFBQUyBzdXBwb3J0 CiMKQ09ORklHX1BQUz15CiMgQ09ORklHX1BQU19ERUJVRyBpcyBub3Qgc2V0CgojCiMgUFBT IGNsaWVudHMgc3VwcG9ydAojCiMgQ09ORklHX1BQU19DTElFTlRfS1RJTUVSIGlzIG5vdCBz ZXQKIyBDT05GSUdfUFBTX0NMSUVOVF9MRElTQyBpcyBub3Qgc2V0CiMgQ09ORklHX1BQU19D TElFTlRfUEFSUE9SVCBpcyBub3Qgc2V0CiMgQ09ORklHX1BQU19DTElFTlRfR1BJTyBpcyBu b3Qgc2V0CgojCiMgUFBTIGdlbmVyYXRvcnMgc3VwcG9ydAojCgojCiMgUFRQIGNsb2NrIHN1 cHBvcnQKIwpDT05GSUdfUFRQXzE1ODhfQ0xPQ0s9eQojIENPTkZJR19EUDgzNjQwX1BIWSBp cyBub3Qgc2V0CkNPTkZJR19BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQj15CkNPTkZJR19H UElPTElCPXkKQ09ORklHX0dQSU9fREVWUkVTPXkKQ09ORklHX0dQSU9fQUNQST15CiMgQ09O RklHX0RFQlVHX0dQSU8gaXMgbm90IHNldApDT05GSUdfR1BJT19TWVNGUz15CkNPTkZJR19H UElPX0dFTkVSSUM9bQoKIwojIE1lbW9yeSBtYXBwZWQgR1BJTyBkcml2ZXJzOgojCkNPTkZJ R19HUElPX0dFTkVSSUNfUExBVEZPUk09bQojIENPTkZJR19HUElPX0lUODc2MUUgaXMgbm90 IHNldAojIENPTkZJR19HUElPX0Y3MTg4WCBpcyBub3Qgc2V0CiMgQ09ORklHX0dQSU9fU0NI MzExWCBpcyBub3Qgc2V0CiMgQ09ORklHX0dQSU9fU0NIIGlzIG5vdCBzZXQKQ09ORklHX0dQ SU9fSUNIPW0KIyBDT05GSUdfR1BJT19WWDg1NSBpcyBub3Qgc2V0CiMgQ09ORklHX0dQSU9f TFlOWFBPSU5UIGlzIG5vdCBzZXQKCiMKIyBJMkMgR1BJTyBleHBhbmRlcnM6CiMKIyBDT05G SUdfR1BJT19NQVg3MzAwIGlzIG5vdCBzZXQKIyBDT05GSUdfR1BJT19NQVg3MzJYIGlzIG5v dCBzZXQKIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKIyBDT05GSUdfR1BJT19Q Q0Y4NTdYIGlzIG5vdCBzZXQKIyBDT05GSUdfR1BJT19BRFA1NTg4IGlzIG5vdCBzZXQKCiMK IyBQQ0kgR1BJTyBleHBhbmRlcnM6CiMKIyBDT05GSUdfR1BJT19CVDhYWCBpcyBub3Qgc2V0 CiMgQ09ORklHX0dQSU9fQU1EODExMSBpcyBub3Qgc2V0CiMgQ09ORklHX0dQSU9fSU5URUxf TUlEIGlzIG5vdCBzZXQKIyBDT05GSUdfR1BJT19NTF9JT0ggaXMgbm90IHNldAojIENPTkZJ R19HUElPX1JEQzMyMVggaXMgbm90IHNldAoKIwojIFNQSSBHUElPIGV4cGFuZGVyczoKIwoj IENPTkZJR19HUElPX01BWDczMDEgaXMgbm90IHNldAojIENPTkZJR19HUElPX01DMzM4ODAg aXMgbm90IHNldAoKIwojIEFDOTcgR1BJTyBleHBhbmRlcnM6CiMKCiMKIyBMUEMgR1BJTyBl eHBhbmRlcnM6CiMKCiMKIyBNT0RVTGJ1cyBHUElPIGV4cGFuZGVyczoKIwoKIwojIFVTQiBH UElPIGV4cGFuZGVyczoKIwojIENPTkZJR19XMSBpcyBub3Qgc2V0CkNPTkZJR19QT1dFUl9T VVBQTFk9eQojIENPTkZJR19QT1dFUl9TVVBQTFlfREVCVUcgaXMgbm90IHNldAojIENPTkZJ R19QREFfUE9XRVIgaXMgbm90IHNldAojIENPTkZJR19URVNUX1BPV0VSIGlzIG5vdCBzZXQK IyBDT05GSUdfQkFUVEVSWV9EUzI3ODAgaXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX0RT Mjc4MSBpcyBub3Qgc2V0CiMgQ09ORklHX0JBVFRFUllfRFMyNzgyIGlzIG5vdCBzZXQKIyBD T05GSUdfQkFUVEVSWV9TQlMgaXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX0JRMjd4MDAg aXMgbm90IHNldAojIENPTkZJR19CQVRURVJZX01BWDE3MDQwIGlzIG5vdCBzZXQKIyBDT05G SUdfQkFUVEVSWV9NQVgxNzA0MiBpcyBub3Qgc2V0CiMgQ09ORklHX0NIQVJHRVJfTUFYODkw MyBpcyBub3Qgc2V0CiMgQ09ORklHX0NIQVJHRVJfTFA4NzI3IGlzIG5vdCBzZXQKIyBDT05G SUdfQ0hBUkdFUl9HUElPIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0hBUkdFUl9CUTI0MTVYIGlz IG5vdCBzZXQKIyBDT05GSUdfQ0hBUkdFUl9CUTI0MTkwIGlzIG5vdCBzZXQKIyBDT05GSUdf Q0hBUkdFUl9CUTI0NzM1IGlzIG5vdCBzZXQKIyBDT05GSUdfQ0hBUkdFUl9TTUIzNDcgaXMg bm90IHNldApDT05GSUdfUE9XRVJfUkVTRVQ9eQojIENPTkZJR19QT1dFUl9BVlMgaXMgbm90 IHNldApDT05GSUdfSFdNT049bQojIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldApDT05G SUdfSFdNT05fREVCVUdfQ0hJUD15CgojCiMgTmF0aXZlIGRyaXZlcnMKIwojIENPTkZJR19T RU5TT1JTX0FCSVRVR1VSVSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJV MyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQUQ3MzE0IGlzIG5vdCBzZXQKIyBDT05G SUdfU0VOU09SU19BRDc0MTQgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FENzQxOCBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNMTAyOSBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzMxMCBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfQURUNzQxMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzQxMSBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzQ2MiBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfQURUNzQ3MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQURUNzQ3NSBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQVNDNzYyMSBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfSzhURU1QIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19LMTBURU1QIGlz IG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19GQU0xNUhfUE9XRVIgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX0FQUExFU01DIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BU0Ix MDAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKIyBDT05G SUdfU0VOU09SU19EUzYyMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlz IG5vdCBzZXQKQ09ORklHX1NFTlNPUlNfSTVLX0FNQj1tCiMgQ09ORklHX1NFTlNPUlNfRjcx ODA1RiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0Y3NTM3NVMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0ZT Q0hNRCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiMg Q09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfRzc2 MEEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0c3NjIgaXMgbm90IHNldApDT05GSUdf U0VOU09SU19HUElPX0ZBTj1tCiMgQ09ORklHX1NFTlNPUlNfSElINjEzMCBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfSUJNQUVNIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19J Qk1QRVggaXMgbm90IHNldApDT05GSUdfU0VOU09SU19DT1JFVEVNUD1tCiMgQ09ORklHX1NF TlNPUlNfSVQ4NyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfSkM0MiBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfUE9XUjEyMjAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X0xJTkVBR0UgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xUQzI5NDUgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX0xUQzQxNTEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X0xUQzQyMTUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xUQzQyMjIgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX0xUQzQyNDUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X0xUQzQyNjAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0xUQzQyNjEgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX01BWDExMTEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X01BWDE2MDY1IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBz ZXQKIyBDT05GSUdfU0VOU09SU19NQVgxNjY4IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09S U19NQVgxOTcgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX01BWDY2MzkgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX01BWDY2NDIgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X01BWDY2NTAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX01BWDY2OTcgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX0hUVTIxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19N Q1AzMDIxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19BRENYWCBpcyBub3Qgc2V0CiMg Q09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE03MCBp cyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE03MyBpcyBub3Qgc2V0CiMgQ09ORklHX1NF TlNPUlNfTE03NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE03NyBpcyBub3Qgc2V0 CiMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE04 MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE04MyBpcyBub3Qgc2V0CiMgQ09ORklH X1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qg c2V0CiMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNf TE05MiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfTE05NTIzNCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE05NTI0 MSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE05NTI0NSBpcyBub3Qgc2V0CiMgQ09O RklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfUEM4NzQy NyBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTlRDX1RIRVJNSVNUT1IgaXMgbm90IHNl dAojIENPTkZJR19TRU5TT1JTX05DVDY2ODMgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X05DVDY3NzUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNl dApDT05GSUdfUE1CVVM9bQpDT05GSUdfU0VOU09SU19QTUJVUz1tCiMgQ09ORklHX1NFTlNP UlNfQURNMTI3NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfTE0yNTA2NiBpcyBub3Qg c2V0CiMgQ09ORklHX1NFTlNPUlNfTFRDMjk3OCBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNP UlNfTUFYMTYwNjQgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX01BWDM0NDQwIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19NQVg4Njg4IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VO U09SU19UUFM0MDQyMiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVUNEOTAwMCBpcyBu b3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVUNEOTIwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1NF TlNPUlNfWkw2MTAwIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TSFQxNSBpcyBub3Qg c2V0CiMgQ09ORklHX1NFTlNPUlNfU0hUMjEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JT X1NIVEMxIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQK IyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19F TUMxNDAzIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19FTUMyMTAzIGlzIG5vdCBzZXQK IyBDT05GSUdfU0VOU09SU19FTUM2VzIwMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNf U01TQzQ3TTEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90 IHNldAojIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAojIENPTkZJR19T RU5TT1JTX1NDSDU2WFhfQ09NTU9OIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TQ0g1 NjI3IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19TQ0g1NjM2IGlzIG5vdCBzZXQKIyBD T05GSUdfU0VOU09SU19TTU02NjUgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEQzEy OEQ4MTggaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FEUzEwMTUgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0FEUzc4MjggaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FE Uzc4NzEgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX0FNQzY4MjEgaXMgbm90IHNldAoj IENPTkZJR19TRU5TT1JTX0lOQTIwOSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfSU5B MlhYIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19USE1DNTAgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX1RNUDEwMiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVE1QMTAz IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19UTVA0MDEgaXMgbm90IHNldAojIENPTkZJ R19TRU5TT1JTX1RNUDQyMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVklBX0NQVVRF TVAgaXMgbm90IHNldAojIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVlQ4MjMx IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKIyBDT05G SUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3OTJE IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM3OTMgaXMgbm90IHNldAojIENPTkZJ R19TRU5TT1JTX1c4Mzc5NSBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRT IGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODNMNzg2TkcgaXMgbm90IHNldAojIENP TkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VOU09SU19XODM2 MjdFSEYgaXMgbm90IHNldAoKIwojIEFDUEkgZHJpdmVycwojCiMgQ09ORklHX1NFTlNPUlNf QUNQSV9QT1dFUiBpcyBub3Qgc2V0CiMgQ09ORklHX1NFTlNPUlNfQVRLMDExMCBpcyBub3Qg c2V0CkNPTkZJR19USEVSTUFMPW0KQ09ORklHX1RIRVJNQUxfSFdNT049eQpDT05GSUdfVEhF Uk1BTF9ERUZBVUxUX0dPVl9TVEVQX1dJU0U9eQojIENPTkZJR19USEVSTUFMX0RFRkFVTFRf R09WX0ZBSVJfU0hBUkUgaXMgbm90IHNldAojIENPTkZJR19USEVSTUFMX0RFRkFVTFRfR09W X1VTRVJfU1BBQ0UgaXMgbm90IHNldAojIENPTkZJR19USEVSTUFMX0dPVl9GQUlSX1NIQVJF IGlzIG5vdCBzZXQKQ09ORklHX1RIRVJNQUxfR09WX1NURVBfV0lTRT15CkNPTkZJR19USEVS TUFMX0dPVl9VU0VSX1NQQUNFPXkKIyBDT05GSUdfVEhFUk1BTF9FTVVMQVRJT04gaXMgbm90 IHNldAojIENPTkZJR19JTlRFTF9QT1dFUkNMQU1QIGlzIG5vdCBzZXQKQ09ORklHX1g4Nl9Q S0dfVEVNUF9USEVSTUFMPW0KIyBDT05GSUdfQUNQSV9JTlQzNDAzX1RIRVJNQUwgaXMgbm90 IHNldAojIENPTkZJR19JTlRFTF9TT0NfRFRTX1RIRVJNQUwgaXMgbm90IHNldAoKIwojIFRl eGFzIEluc3RydW1lbnRzIHRoZXJtYWwgZHJpdmVycwojCkNPTkZJR19XQVRDSERPRz15CkNP TkZJR19XQVRDSERPR19DT1JFPXkKIyBDT05GSUdfV0FUQ0hET0dfTk9XQVlPVVQgaXMgbm90 IHNldAoKIwojIFdhdGNoZG9nIERldmljZSBEcml2ZXJzCiMKIyBDT05GSUdfU09GVF9XQVRD SERPRyBpcyBub3Qgc2V0CiMgQ09ORklHX1hJTElOWF9XQVRDSERPRyBpcyBub3Qgc2V0CiMg Q09ORklHX0RXX1dBVENIRE9HIGlzIG5vdCBzZXQKIyBDT05GSUdfQUNRVUlSRV9XRFQgaXMg bm90IHNldAojIENPTkZJR19BRFZBTlRFQ0hfV0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfQUxJ TTE1MzVfV0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfQUxJTTcxMDFfV0RUIGlzIG5vdCBzZXQK IyBDT05GSUdfRjcxODA4RV9XRFQgaXMgbm90IHNldAojIENPTkZJR19TUDUxMDBfVENPIGlz IG5vdCBzZXQKIyBDT05GSUdfU0JDX0ZJVFBDMl9XQVRDSERPRyBpcyBub3Qgc2V0CiMgQ09O RklHX0VVUk9URUNIX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX0lCNzAwX1dEVCBpcyBub3Qg c2V0CiMgQ09ORklHX0lCTUFTUiBpcyBub3Qgc2V0CiMgQ09ORklHX1dBRkVSX1dEVCBpcyBu b3Qgc2V0CiMgQ09ORklHX0k2MzAwRVNCX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX0lFNlhY X1dEVCBpcyBub3Qgc2V0CkNPTkZJR19JVENPX1dEVD1tCkNPTkZJR19JVENPX1ZFTkRPUl9T VVBQT1JUPXkKIyBDT05GSUdfSVQ4NzEyRl9XRFQgaXMgbm90IHNldAojIENPTkZJR19JVDg3 X1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX0hQX1dBVENIRE9HIGlzIG5vdCBzZXQKIyBDT05G SUdfU0MxMjAwX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX1BDODc0MTNfV0RUIGlzIG5vdCBz ZXQKIyBDT05GSUdfTlZfVENPIGlzIG5vdCBzZXQKIyBDT05GSUdfNjBYWF9XRFQgaXMgbm90 IHNldAojIENPTkZJR19DUFU1X1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NNU0NfU0NIMzEx WF9XRFQgaXMgbm90IHNldAojIENPTkZJR19TTVNDMzdCNzg3X1dEVCBpcyBub3Qgc2V0CiMg Q09ORklHX1ZJQV9XRFQgaXMgbm90IHNldAojIENPTkZJR19XODM2MjdIRl9XRFQgaXMgbm90 IHNldAojIENPTkZJR19XODM4NzdGX1dEVCBpcyBub3Qgc2V0CiMgQ09ORklHX1c4Mzk3N0Zf V0RUIGlzIG5vdCBzZXQKIyBDT05GSUdfTUFDSFpfV0RUIGlzIG5vdCBzZXQKIyBDT05GSUdf U0JDX0VQWF9DM19XQVRDSERPRyBpcyBub3Qgc2V0CiMgQ09ORklHX01FTl9BMjFfV0RUIGlz IG5vdCBzZXQKCiMKIyBQQ0ktYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKIwojIENPTkZJR19QQ0lQ Q1dBVENIRE9HIGlzIG5vdCBzZXQKIyBDT05GSUdfV0RUUENJIGlzIG5vdCBzZXQKCiMKIyBV U0ItYmFzZWQgV2F0Y2hkb2cgQ2FyZHMKIwojIENPTkZJR19VU0JQQ1dBVENIRE9HIGlzIG5v dCBzZXQKQ09ORklHX1NTQl9QT1NTSUJMRT15CgojCiMgU29uaWNzIFNpbGljb24gQmFja3Bs YW5lCiMKIyBDT05GSUdfU1NCIGlzIG5vdCBzZXQKQ09ORklHX0JDTUFfUE9TU0lCTEU9eQoK IwojIEJyb2FkY29tIHNwZWNpZmljIEFNQkEKIwojIENPTkZJR19CQ01BIGlzIG5vdCBzZXQK CiMKIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCiMKQ09ORklHX01GRF9DT1JFPXkK IyBDT05GSUdfTUZEX0JDTTU5MFhYIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX0NST1NfRUMg aXMgbm90IHNldAojIENPTkZJR19NRkRfREE5MDUyX1NQSSBpcyBub3Qgc2V0CiMgQ09ORklH X01GRF9NQzEzWFhYX1NQSSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9NQzEzWFhYX0kyQyBp cyBub3Qgc2V0CiMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldApDT05GSUdfTFBDX0lD SD15CkNPTkZJR19MUENfU0NIPW0KIyBDT05GSUdfTUZEX0pBTlpfQ01PRElPIGlzIG5vdCBz ZXQKIyBDT05GSUdfTUZEX0tFTVBMRCBpcyBub3Qgc2V0CiMgQ09ORklHX0VaWF9QQ0FQIGlz IG5vdCBzZXQKIyBDT05GSUdfTUZEX1ZJUEVSQk9BUkQgaXMgbm90IHNldAojIENPTkZJR19N RkRfUkVUVSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CiMg Q09ORklHX01GRF9SREMzMjFYIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1JUU1hfUENJIGlz IG5vdCBzZXQKIyBDT05GSUdfTUZEX1JUU1hfVVNCIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZE X1NJNDc2WF9DT1JFIGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQK IyBDT05GSUdfQUJYNTAwX0NPUkUgaXMgbm90IHNldAojIENPTkZJR19NRkRfU1lTQ09OIGlz IG5vdCBzZXQKIyBDT05GSUdfTUZEX1RJX0FNMzM1WF9UU0NBREMgaXMgbm90IHNldAojIENP TkZJR19NRkRfTFAzOTQzIGlzIG5vdCBzZXQKIyBDT05GSUdfVFBTNjEwNVggaXMgbm90IHNl dAojIENPTkZJR19UUFM2NTAxMCBpcyBub3Qgc2V0CiMgQ09ORklHX1RQUzY1MDdYIGlzIG5v dCBzZXQKIyBDT05GSUdfTUZEX1RQUzY1MjE3IGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1RQ UzY1MjE4IGlzIG5vdCBzZXQKIyBDT05GSUdfTUZEX1RQUzY1OTEyIGlzIG5vdCBzZXQKIyBD T05GSUdfTUZEX1RQUzY1OTEyX1NQSSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9XTDEyNzNf Q09SRSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9MTTM1MzMgaXMgbm90IHNldAojIENPTkZJ R19NRkRfVE1JTyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9WWDg1NSBpcyBub3Qgc2V0CiMg Q09ORklHX01GRF9BUklaT05BX0kyQyBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9BUklaT05B X1NQSSBpcyBub3Qgc2V0CiMgQ09ORklHX01GRF9XTTgzMVhfU1BJIGlzIG5vdCBzZXQKIyBD T05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBu b3Qgc2V0CgojCiMgR3JhcGhpY3Mgc3VwcG9ydAojCkNPTkZJR19BR1A9bQojIENPTkZJR19B R1BfSU5URUwgaXMgbm90IHNldAojIENPTkZJR19BR1BfU0lTIGlzIG5vdCBzZXQKIyBDT05G SUdfQUdQX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX1ZHQV9BUkIgaXMgbm90IHNldAojIENP TkZJR19WR0FfU1dJVENIRVJPTyBpcyBub3Qgc2V0CgojCiMgRGlyZWN0IFJlbmRlcmluZyBN YW5hZ2VyCiMKQ09ORklHX0RSTT1tCkNPTkZJR19EUk1fS01TX0hFTFBFUj1tCiMgQ09ORklH X0RSTV9MT0FEX0VESURfRklSTVdBUkUgaXMgbm90IHNldApDT05GSUdfRFJNX1RUTT1tCgoj CiMgSTJDIGVuY29kZXIgb3IgaGVscGVyIGNoaXBzCiMKIyBDT05GSUdfRFJNX0kyQ19DSDcw MDYgaXMgbm90IHNldAojIENPTkZJR19EUk1fSTJDX1NJTDE2NCBpcyBub3Qgc2V0CiMgQ09O RklHX0RSTV9JMkNfTlhQX1REQTk5OFggaXMgbm90IHNldAojIENPTkZJR19EUk1fUFROMzQ2 MCBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9UREZYIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJN X1IxMjggaXMgbm90IHNldAojIENPTkZJR19EUk1fUkFERU9OIGlzIG5vdCBzZXQKIyBDT05G SUdfRFJNX05PVVZFQVUgaXMgbm90IHNldAojIENPTkZJR19EUk1fSTkxNSBpcyBub3Qgc2V0 CiMgQ09ORklHX0RSTV9NR0EgaXMgbm90IHNldAojIENPTkZJR19EUk1fU0lTIGlzIG5vdCBz ZXQKIyBDT05GSUdfRFJNX1ZJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9TQVZBR0UgaXMg bm90IHNldApDT05GSUdfRFJNX1ZNV0dGWD1tCkNPTkZJR19EUk1fVk1XR0ZYX0ZCQ09OPXkK IyBDT05GSUdfRFJNX0dNQTUwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0RSTV9VREwgaXMgbm90 IHNldAojIENPTkZJR19EUk1fQVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX01HQUcyMDAg aXMgbm90IHNldAojIENPTkZJR19EUk1fQ0lSUlVTX1FFTVUgaXMgbm90IHNldAojIENPTkZJ R19EUk1fUVhMIGlzIG5vdCBzZXQKIyBDT05GSUdfRFJNX0JPQ0hTIGlzIG5vdCBzZXQKCiMK IyBGcmFtZSBidWZmZXIgRGV2aWNlcwojCkNPTkZJR19GQj1tCiMgQ09ORklHX0ZJUk1XQVJF X0VESUQgaXMgbm90IHNldApDT05GSUdfRkJfRERDPW0KIyBDT05GSUdfRkJfQk9PVF9WRVNB X1NVUFBPUlQgaXMgbm90IHNldApDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPW0KQ09ORklHX0ZC X0NGQl9DT1BZQVJFQT1tCkNPTkZJR19GQl9DRkJfSU1BR0VCTElUPW0KIyBDT05GSUdfRkJf Q0ZCX1JFVl9QSVhFTFNfSU5fQllURSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1NZU19GSUxM UkVDVCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CiMg Q09ORklHX0ZCX1NZU19JTUFHRUJMSVQgaXMgbm90IHNldAojIENPTkZJR19GQl9GT1JFSUdO X0VORElBTiBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKQ09O RklHX0ZCX0RFRkVSUkVEX0lPPXkKIyBDT05GSUdfRkJfU1ZHQUxJQiBpcyBub3Qgc2V0CiMg Q09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfQkFDS0xJR0hUIGlz IG5vdCBzZXQKQ09ORklHX0ZCX01PREVfSEVMUEVSUz15CkNPTkZJR19GQl9USUxFQkxJVFRJ Tkc9eQoKIwojIEZyYW1lIGJ1ZmZlciBoYXJkd2FyZSBkcml2ZXJzCiMKIyBDT05GSUdfRkJf Q0lSUlVTIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfUE0yIGlzIG5vdCBzZXQKIyBDT05GSUdf RkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfQVJDIGlzIG5vdCBzZXQKQ09O RklHX0ZCX1ZHQTE2PW0KIyBDT05GSUdfRkJfVVZFU0EgaXMgbm90IHNldAojIENPTkZJR19G Ql9ONDExIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfSEdBIGlzIG5vdCBzZXQKIyBDT05GSUdf RkJfT1BFTkNPUkVTIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNl dApDT05GSUdfRkJfTlZJRElBPW0KQ09ORklHX0ZCX05WSURJQV9JMkM9eQojIENPTkZJR19G Ql9OVklESUFfREVCVUcgaXMgbm90IHNldAojIENPTkZJR19GQl9OVklESUFfQkFDS0xJR0hU IGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0k3 NDAgaXMgbm90IHNldAojIENPTkZJR19GQl9MRTgwNTc4IGlzIG5vdCBzZXQKQ09ORklHX0ZC X01BVFJPWD1tCiMgQ09ORklHX0ZCX01BVFJPWF9NSUxMRU5JVU0gaXMgbm90IHNldAojIENP TkZJR19GQl9NQVRST1hfTVlTVElRVUUgaXMgbm90IHNldAojIENPTkZJR19GQl9NQVRST1hf RyBpcyBub3Qgc2V0CkNPTkZJR19GQl9NQVRST1hfSTJDPW0KIyBDT05GSUdfRkJfUkFERU9O IGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKIyBDT05GSUdfRkJf QVRZIGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfUzMgaXMgbm90IHNldAojIENPTkZJR19GQl9T QVZBR0UgaXMgbm90IHNldAojIENPTkZJR19GQl9TSVMgaXMgbm90IHNldAojIENPTkZJR19G Ql9WSUEgaXMgbm90IHNldAojIENPTkZJR19GQl9ORU9NQUdJQyBpcyBub3Qgc2V0CiMgQ09O RklHX0ZCX0tZUk8gaXMgbm90IHNldAojIENPTkZJR19GQl8zREZYIGlzIG5vdCBzZXQKIyBD T05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1ZUODYyMyBpcyBub3Qg c2V0CiMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAojIENPTkZJR19GQl9BUksgaXMg bm90IHNldAojIENPTkZJR19GQl9QTTMgaXMgbm90IHNldAojIENPTkZJR19GQl9DQVJNSU5F IGlzIG5vdCBzZXQKIyBDT05GSUdfRkJfU01TQ1VGWCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZC X1VETCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAojIENPTkZJ R19GQl9NRVRST05PTUUgaXMgbm90IHNldAojIENPTkZJR19GQl9NQjg2MlhYIGlzIG5vdCBz ZXQKIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CiMgQ09ORklHX0ZCX0FVT19L MTkwWCBpcyBub3Qgc2V0CiMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qg c2V0CkNPTkZJR19WR0FTVEFURT1tCkNPTkZJR19IRE1JPXkKCiMKIyBDb25zb2xlIGRpc3Bs YXkgZHJpdmVyIHN1cHBvcnQKIwpDT05GSUdfVkdBX0NPTlNPTEU9eQpDT05GSUdfVkdBQ09O X1NPRlRfU0NST0xMQkFDSz15CkNPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLX1NJWkU9 MTAyNApDT05GSUdfRFVNTVlfQ09OU09MRT15CkNPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xF PW0KIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ERVRFQ1RfUFJJTUFSWSBpcyBub3Qg c2V0CiMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldApD T05GSUdfTE9HTz15CiMgQ09ORklHX0xPR09fTElOVVhfTU9OTyBpcyBub3Qgc2V0CiMgQ09O RklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldApDT05GSUdfTE9HT19MSU5VWF9DTFVU MjI0PXkKIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAoKIwojIEhJRCBzdXBwb3J0CiMKQ09O RklHX0hJRD15CiMgQ09ORklHX0hJRF9CQVRURVJZX1NUUkVOR1RIIGlzIG5vdCBzZXQKQ09O RklHX0hJRFJBVz15CiMgQ09ORklHX1VISUQgaXMgbm90IHNldApDT05GSUdfSElEX0dFTkVS SUM9eQoKIwojIFNwZWNpYWwgSElEIGRyaXZlcnMKIwojIENPTkZJR19ISURfQTRURUNIIGlz IG5vdCBzZXQKIyBDT05GSUdfSElEX0FDUlVYIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX0FQ UExFIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX0FQUExFSVIgaXMgbm90IHNldAojIENPTkZJ R19ISURfQVVSRUFMIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX0JFTEtJTiBpcyBub3Qgc2V0 CiMgQ09ORklHX0hJRF9DSEVSUlkgaXMgbm90IHNldAojIENPTkZJR19ISURfQ0hJQ09OWSBp cyBub3Qgc2V0CiMgQ09ORklHX0hJRF9DUDIxMTIgaXMgbm90IHNldAojIENPTkZJR19ISURf Q1lQUkVTUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9EUkFHT05SSVNFIGlzIG5vdCBzZXQK IyBDT05GSUdfSElEX0VNU19GRiBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9FTEVDT00gaXMg bm90IHNldAojIENPTkZJR19ISURfRUxPIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX0VaS0VZ IGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX0hPTFRFSyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJ RF9HVDY4M1IgaXMgbm90IHNldAojIENPTkZJR19ISURfSFVJT04gaXMgbm90IHNldAojIENP TkZJR19ISURfS0VZVE9VQ0ggaXMgbm90IHNldAojIENPTkZJR19ISURfS1lFIGlzIG5vdCBz ZXQKIyBDT05GSUdfSElEX1VDTE9HSUMgaXMgbm90IHNldAojIENPTkZJR19ISURfV0FMVE9Q IGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX0dZUkFUSU9OIGlzIG5vdCBzZXQKIyBDT05GSUdf SElEX0lDQURFIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1RXSU5IQU4gaXMgbm90IHNldApD T05GSUdfSElEX0tFTlNJTkdUT049eQojIENPTkZJR19ISURfTENQT1dFUiBpcyBub3Qgc2V0 CiMgQ09ORklHX0hJRF9MRU5PVk8gaXMgbm90IHNldAojIENPTkZJR19ISURfTE9HSVRFQ0gg aXMgbm90IHNldAojIENPTkZJR19ISURfTUFHSUNNT1VTRSBpcyBub3Qgc2V0CkNPTkZJR19I SURfTUlDUk9TT0ZUPW0KIyBDT05GSUdfSElEX01PTlRFUkVZIGlzIG5vdCBzZXQKIyBDT05G SUdfSElEX01VTFRJVE9VQ0ggaXMgbm90IHNldAojIENPTkZJR19ISURfTlRSSUcgaXMgbm90 IHNldAojIENPTkZJR19ISURfT1JURUsgaXMgbm90IHNldAojIENPTkZJR19ISURfUEFOVEhF UkxPUkQgaXMgbm90IHNldAojIENPTkZJR19ISURfUEVUQUxZTlggaXMgbm90IHNldAojIENP TkZJR19ISURfUElDT0xDRCBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9QUklNQVggaXMgbm90 IHNldAojIENPTkZJR19ISURfUk9DQ0FUIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1NBSVRF SyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TQU1TVU5HIGlzIG5vdCBzZXQKIyBDT05GSUdf SElEX1NPTlkgaXMgbm90IHNldAojIENPTkZJR19ISURfU1BFRURMSU5LIGlzIG5vdCBzZXQK IyBDT05GSUdfSElEX1NURUVMU0VSSUVTIGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1NVTlBM VVMgaXMgbm90IHNldAojIENPTkZJR19ISURfUk1JIGlzIG5vdCBzZXQKIyBDT05GSUdfSElE X0dSRUVOQVNJQSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TTUFSVEpPWVBMVVMgaXMgbm90 IHNldAojIENPTkZJR19ISURfVElWTyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9UT1BTRUVE IGlzIG5vdCBzZXQKIyBDT05GSUdfSElEX1RISU5HTSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJ RF9USFJVU1RNQVNURVIgaXMgbm90IHNldAojIENPTkZJR19ISURfV0FDT00gaXMgbm90IHNl dAojIENPTkZJR19ISURfV0lJTU9URSBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9YSU5NTyBp cyBub3Qgc2V0CiMgQ09ORklHX0hJRF9aRVJPUExVUyBpcyBub3Qgc2V0CiMgQ09ORklHX0hJ RF9aWURBQ1JPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0hJRF9TRU5TT1JfSFVCIGlzIG5vdCBz ZXQKCiMKIyBVU0IgSElEIHN1cHBvcnQKIwpDT05GSUdfVVNCX0hJRD15CkNPTkZJR19ISURf UElEPXkKQ09ORklHX1VTQl9ISURERVY9eQoKIwojIEkyQyBISUQgc3VwcG9ydAojCiMgQ09O RklHX0kyQ19ISUQgaXMgbm90IHNldApDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15 CkNPTkZJR19VU0JfU1VQUE9SVD15CkNPTkZJR19VU0JfQ09NTU9OPXkKQ09ORklHX1VTQl9B UkNIX0hBU19IQ0Q9eQpDT05GSUdfVVNCPXkKQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVW SUNFUz15CgojCiMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucwojCkNPTkZJR19VU0JfREVG QVVMVF9QRVJTSVNUPXkKIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9PVEdfV0hJVEVMSVNU IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX09UR19CTEFDS0xJU1RfSFVCIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX09UR19GU00gaXMgbm90IHNldApDT05GSUdfVVNCX01PTj15CiMgQ09O RklHX1VTQl9XVVNCX0NCQUYgaXMgbm90IHNldAoKIwojIFVTQiBIb3N0IENvbnRyb2xsZXIg RHJpdmVycwojCiMgQ09ORklHX1VTQl9DNjdYMDBfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX1hIQ0lfSENEIGlzIG5vdCBzZXQKQ09ORklHX1VTQl9FSENJX0hDRD15CkNPTkZJR19V U0JfRUhDSV9ST09UX0hVQl9UVD15CkNPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRD15CkNP TkZJR19VU0JfRUhDSV9QQ0k9eQojIENPTkZJR19VU0JfRUhDSV9IQ0RfUExBVEZPUk0gaXMg bm90IHNldAojIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0lTUDE3NjBfSENEIGlz IG5vdCBzZXQKIyBDT05GSUdfVVNCX0lTUDEzNjJfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX0ZVU0JIMjAwX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9GT1RHMjEwX0hDRCBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9NQVgzNDIxX0hDRCBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CkNPTkZJR19VU0JfVUhDSV9IQ0Q9eQojIENPTkZJ R19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1I4QTY2NTk3X0hDRCBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9IQ0RfVEVTVF9NT0RFIGlzIG5vdCBzZXQKCiMKIyBV U0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKIwojIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAojIENPTkZJR19VU0JfV0RNIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CgojCiMgTk9URTogVVNCX1NUT1JB R0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQojCgojCiMgYWxzbyBiZSBu ZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm8KIwpDT05GSUdfVVNC X1NUT1JBR0U9bQojIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TVE9SQUdFX1JFQUxURUsgaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFH RV9EQVRBRkFCIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTSBpcyBu b3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CiMgQ09ORklH X1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfU0RE UjA5IGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQK IyBDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1QgaXMgbm90IHNldAojIENPTkZJR19VU0Jf U1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAojIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VD SCBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BIGlzIG5vdCBzZXQKIyBD T05GSUdfVVNCX1NUT1JBR0VfQ1lQUkVTU19BVEFDQiBpcyBub3Qgc2V0CiMgQ09ORklHX1VT Ql9TVE9SQUdFX0VORV9VQjYyNTAgaXMgbm90IHNldAojIENPTkZJR19VU0JfVUFTIGlzIG5v dCBzZXQKCiMKIyBVU0IgSW1hZ2luZyBkZXZpY2VzCiMKIyBDT05GSUdfVVNCX01EQzgwMCBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9NSUNST1RFSyBpcyBub3Qgc2V0CkNPTkZJR19VU0JJ UF9DT1JFPW0KQ09ORklHX1VTQklQX1ZIQ0lfSENEPW0KQ09ORklHX1VTQklQX0hPU1Q9bQoj IENPTkZJR19VU0JJUF9ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9NVVNCX0hEUkMg aXMgbm90IHNldAojIENPTkZJR19VU0JfRFdDMyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9E V0MyIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0NISVBJREVBIGlzIG5vdCBzZXQKCiMKIyBV U0IgcG9ydCBkcml2ZXJzCiMKIyBDT05GSUdfVVNCX1VTUzcyMCBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAoKIwojIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZl cnMKIwojIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAojIENPTkZJR19VU0JfRU1JMjYg aXMgbm90IHNldAojIENPTkZJR19VU0JfQURVVFVYIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNC X1NFVlNFRyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAojIENP TkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qg c2V0CiMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAojIENPTkZJR19VU0JfQ1lQUkVTU19D WTdDNjMgaXMgbm90IHNldAojIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CiMgQ09O RklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBu b3Qgc2V0CiMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldAojIENPTkZJR19V U0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKIyBD T05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SIGlzIG5vdCBzZXQKIyBDT05GSUdfVVNCX0lPV0FS UklPUiBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIyBDT05GSUdf VVNCX0VIU0VUX1RFU1RfRklYVFVSRSBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9JU0lHSFRG VyBpcyBub3Qgc2V0CiMgQ09ORklHX1VTQl9ZVVJFWCBpcyBub3Qgc2V0CiMgQ09ORklHX1VT Ql9FWlVTQl9GWDIgaXMgbm90IHNldAojIENPTkZJR19VU0JfSFNJQ19VU0IzNTAzIGlzIG5v dCBzZXQKIyBDT05GSUdfVVNCX0xJTktfTEFZRVJfVEVTVCBpcyBub3Qgc2V0CgojCiMgVVNC IFBoeXNpY2FsIExheWVyIGRyaXZlcnMKIwojIENPTkZJR19VU0JfUEhZIGlzIG5vdCBzZXQK IyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CiMgQ09ORklHX1NBTVNVTkdfVVNC MlBIWSBpcyBub3Qgc2V0CiMgQ09ORklHX1NBTVNVTkdfVVNCM1BIWSBpcyBub3Qgc2V0CiMg Q09ORklHX1VTQl9HUElPX1ZCVVMgaXMgbm90IHNldAojIENPTkZJR19VU0JfSVNQMTMwMSBp cyBub3Qgc2V0CiMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAojIENPTkZJR19VV0Ig aXMgbm90IHNldAojIENPTkZJR19NTUMgaXMgbm90IHNldAojIENPTkZJR19NRU1TVElDSyBp cyBub3Qgc2V0CkNPTkZJR19ORVdfTEVEUz15CkNPTkZJR19MRURTX0NMQVNTPXkKCiMKIyBM RUQgZHJpdmVycwojCiMgQ09ORklHX0xFRFNfTE0zNTMwIGlzIG5vdCBzZXQKIyBDT05GSUdf TEVEU19MTTM2NDIgaXMgbm90IHNldAojIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNl dAojIENPTkZJR19MRURTX0dQSU8gaXMgbm90IHNldAojIENPTkZJR19MRURTX0xQMzk0NCBp cyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfTFA1NTIxIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVE U19MUDU1MjMgaXMgbm90IHNldAojIENPTkZJR19MRURTX0xQNTU2MiBpcyBub3Qgc2V0CiMg Q09ORklHX0xFRFNfTFA4NTAxIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19DTEVWT19NQUlM IGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19QQ0E5NTVYIGlzIG5vdCBzZXQKIyBDT05GSUdf TEVEU19QQ0E5NjNYIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19EQUMxMjRTMDg1IGlzIG5v dCBzZXQKIyBDT05GSUdfTEVEU19CRDI4MDIgaXMgbm90IHNldAojIENPTkZJR19MRURTX0lO VEVMX1NTNDIwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0xFRFNfTFQzNTkzIGlzIG5vdCBzZXQK IyBDT05GSUdfTEVEU19ERUxMX05FVEJPT0tTIGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19U Q0E2NTA3IGlzIG5vdCBzZXQKIyBDT05GSUdfTEVEU19MTTM1NXggaXMgbm90IHNldAoKIwoj IExFRCBkcml2ZXIgZm9yIGJsaW5rKDEpIFVTQiBSR0IgTEVEIGlzIHVuZGVyIFNwZWNpYWwg SElEIGRyaXZlcnMgKEhJRF9USElOR00pCiMKIyBDT05GSUdfTEVEU19CTElOS00gaXMgbm90 IHNldAoKIwojIExFRCBUcmlnZ2VycwojCiMgQ09ORklHX0xFRFNfVFJJR0dFUlMgaXMgbm90 IHNldAojIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5GSU5J QkFORCBpcyBub3Qgc2V0CkNPTkZJR19FREFDPXkKQ09ORklHX0VEQUNfTEVHQUNZX1NZU0ZT PXkKIyBDT05GSUdfRURBQ19ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19FREFDX01NX0VEQUM9 eQojIENPTkZJR19FREFDX0dIRVMgaXMgbm90IHNldAojIENPTkZJR19FREFDX0U3NTJYIGlz IG5vdCBzZXQKIyBDT05GSUdfRURBQ19JODI5NzVYIGlzIG5vdCBzZXQKIyBDT05GSUdfRURB Q19JMzAwMCBpcyBub3Qgc2V0CiMgQ09ORklHX0VEQUNfSTMyMDAgaXMgbm90IHNldAojIENP TkZJR19FREFDX0lFMzEyMDAgaXMgbm90IHNldAojIENPTkZJR19FREFDX1gzOCBpcyBub3Qg c2V0CiMgQ09ORklHX0VEQUNfSTU0MDAgaXMgbm90IHNldApDT05GSUdfRURBQ19JN0NPUkU9 bQojIENPTkZJR19FREFDX0k1MDAwIGlzIG5vdCBzZXQKIyBDT05GSUdfRURBQ19JNTEwMCBp cyBub3Qgc2V0CiMgQ09ORklHX0VEQUNfSTczMDAgaXMgbm90IHNldAojIENPTkZJR19FREFD X1NCUklER0UgaXMgbm90IHNldApDT05GSUdfUlRDX0xJQj15CkNPTkZJR19SVENfQ0xBU1M9 eQpDT05GSUdfUlRDX0hDVE9TWVM9eQpDT05GSUdfUlRDX1NZU1RPSEM9eQpDT05GSUdfUlRD X0hDVE9TWVNfREVWSUNFPSJydGMwIgojIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAoK IwojIFJUQyBpbnRlcmZhY2VzCiMKQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKQ09ORklHX1JU Q19JTlRGX1BST0M9eQpDT05GSUdfUlRDX0lOVEZfREVWPXkKIyBDT05GSUdfUlRDX0lOVEZf REVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBz ZXQKCiMKIyBJMkMgUlRDIGRyaXZlcnMKIwojIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBu b3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKIyBDT05GSUdfUlRD X0RSVl9EUzE2NzIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RTMzIzMiBpcyBub3Qg c2V0CiMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19E UlZfUlM1QzM3MiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfSVNMMTIwOCBpcyBub3Qg c2V0CiMgQ09ORklHX1JUQ19EUlZfSVNMMTIwMjIgaXMgbm90IHNldAojIENPTkZJR19SVENf RFJWX0lTTDEyMDU3IGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qg c2V0CiMgQ09ORklHX1JUQ19EUlZfUENGMjEyNyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19E UlZfUENGODUyMyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUENGODU2MyBpcyBub3Qg c2V0CiMgQ09ORklHX1JUQ19EUlZfUENGODUwNjMgaXMgbm90IHNldAojIENPTkZJR19SVENf RFJWX1BDRjg1ODMgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qg c2V0CiMgQ09ORklHX1JUQ19EUlZfQlEzMksgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJW X1MzNTM5MEEgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0 CiMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9S WDgwMjUgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0VNMzAyNyBpcyBub3Qgc2V0CiMg Q09ORklHX1JUQ19EUlZfUlYzMDI5QzIgaXMgbm90IHNldAoKIwojIFNQSSBSVEMgZHJpdmVy cwojCiMgQ09ORklHX1JUQ19EUlZfTTQxVDkzIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RS Vl9NNDFUOTQgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RTMTMwNSBpcyBub3Qgc2V0 CiMgQ09ORklHX1JUQ19EUlZfRFMxMzQzIGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9E UzEzNDcgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0RTMTM5MCBpcyBub3Qgc2V0CiMg Q09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUjk3 MDEgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX1JTNUMzNDggaXMgbm90IHNldAojIENP TkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUENGMjEy MyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUlg0NTgxIGlzIG5vdCBzZXQKIyBDT05G SUdfUlRDX0RSVl9NQ1A3OTUgaXMgbm90IHNldAoKIwojIFBsYXRmb3JtIFJUQyBkcml2ZXJz CiMKQ09ORklHX1JUQ19EUlZfQ01PUz15CiMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5v dCBzZXQKIyBDT05GSUdfUlRDX0RSVl9EUzE1MTEgaXMgbm90IHNldAojIENPTkZJR19SVENf RFJWX0RTMTU1MyBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBz ZXQKIyBDT05GSUdfUlRDX0RSVl9EUzI0MDQgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJW X0VGSSBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAoj IENPTkZJR19SVENfRFJWX000OFQ4NiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfTTQ4 VDM1IGlzIG5vdCBzZXQKIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAojIENP TkZJR19SVENfRFJWX01TTTYyNDIgaXMgbm90IHNldAojIENPTkZJR19SVENfRFJWX0JRNDgw MiBpcyBub3Qgc2V0CiMgQ09ORklHX1JUQ19EUlZfUlA1QzAxIGlzIG5vdCBzZXQKIyBDT05G SUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CgojCiMgb24tQ1BVIFJUQyBkcml2ZXJzCiMK IyBDT05GSUdfUlRDX0RSVl9YR0VORSBpcyBub3Qgc2V0CgojCiMgSElEIFNlbnNvciBSVEMg ZHJpdmVycwojCiMgQ09ORklHX1JUQ19EUlZfSElEX1NFTlNPUl9USU1FIGlzIG5vdCBzZXQK Q09ORklHX0RNQURFVklDRVM9eQojIENPTkZJR19ETUFERVZJQ0VTX0RFQlVHIGlzIG5vdCBz ZXQKCiMKIyBETUEgRGV2aWNlcwojCiMgQ09ORklHX0lOVEVMX01JRF9ETUFDIGlzIG5vdCBz ZXQKQ09ORklHX0lOVEVMX0lPQVRETUE9bQojIENPTkZJR19EV19ETUFDX0NPUkUgaXMgbm90 IHNldAojIENPTkZJR19EV19ETUFDIGlzIG5vdCBzZXQKIyBDT05GSUdfRFdfRE1BQ19QQ0kg aXMgbm90IHNldApDT05GSUdfRE1BX0VOR0lORT15CkNPTkZJR19ETUFfQUNQST15CgojCiMg RE1BIENsaWVudHMKIwpDT05GSUdfQVNZTkNfVFhfRE1BPXkKIyBDT05GSUdfRE1BVEVTVCBp cyBub3Qgc2V0CkNPTkZJR19ETUFfRU5HSU5FX1JBSUQ9eQpDT05GSUdfRENBPW0KIyBDT05G SUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CkNPTkZJR19VSU89bQojIENPTkZJR19VSU9fQ0lG IGlzIG5vdCBzZXQKIyBDT05GSUdfVUlPX1BEUlZfR0VOSVJRIGlzIG5vdCBzZXQKIyBDT05G SUdfVUlPX0RNRU1fR0VOSVJRIGlzIG5vdCBzZXQKIyBDT05GSUdfVUlPX0FFQyBpcyBub3Qg c2V0CiMgQ09ORklHX1VJT19TRVJDT1MzIGlzIG5vdCBzZXQKIyBDT05GSUdfVUlPX1BDSV9H RU5FUklDIGlzIG5vdCBzZXQKIyBDT05GSUdfVUlPX05FVFggaXMgbm90IHNldAojIENPTkZJ R19VSU9fTUY2MjQgaXMgbm90IHNldApDT05GSUdfVkZJT19JT01NVV9UWVBFMT1tCkNPTkZJ R19WRklPPW0KIyBDT05GSUdfVkZJT19QQ0kgaXMgbm90IHNldApDT05GSUdfVklSVF9EUklW RVJTPXkKQ09ORklHX1ZJUlRJTz1tCgojCiMgVmlydGlvIGRyaXZlcnMKIwpDT05GSUdfVklS VElPX1BDST1tCkNPTkZJR19WSVJUSU9fQkFMTE9PTj1tCkNPTkZJR19WSVJUSU9fTU1JTz1t CiMgQ09ORklHX1ZJUlRJT19NTUlPX0NNRExJTkVfREVWSUNFUyBpcyBub3Qgc2V0CgojCiMg TWljcm9zb2Z0IEh5cGVyLVYgZ3Vlc3Qgc3VwcG9ydAojCiMgQ09ORklHX1NUQUdJTkcgaXMg bm90IHNldApDT05GSUdfWDg2X1BMQVRGT1JNX0RFVklDRVM9eQojIENPTkZJR19BQ0VSSERG IGlzIG5vdCBzZXQKIyBDT05GSUdfQUxJRU5XQVJFX1dNSSBpcyBub3Qgc2V0CiMgQ09ORklH X0FTVVNfTEFQVE9QIGlzIG5vdCBzZXQKIyBDT05GSUdfREVMTF9XTUkgaXMgbm90IHNldAoj IENPTkZJR19ERUxMX1dNSV9BSU8gaXMgbm90IHNldAojIENPTkZJR19ERUxMX1NNTzg4MDAg aXMgbm90IHNldAojIENPTkZJR19GVUpJVFNVX1RBQkxFVCBpcyBub3Qgc2V0CiMgQ09ORklH X0hQX0FDQ0VMIGlzIG5vdCBzZXQKIyBDT05GSUdfSFBfV0lSRUxFU1MgaXMgbm90IHNldAoj IENPTkZJR19IUF9XTUkgaXMgbm90IHNldAojIENPTkZJR19USElOS1BBRF9BQ1BJIGlzIG5v dCBzZXQKIyBDT05GSUdfU0VOU09SU19IREFQUyBpcyBub3Qgc2V0CiMgQ09ORklHX0lOVEVM X01FTkxPVyBpcyBub3Qgc2V0CkNPTkZJR19BQ1BJX1dNST1tCiMgQ09ORklHX1RPUFNUQVJf TEFQVE9QIGlzIG5vdCBzZXQKIyBDT05GSUdfVE9TSElCQV9CVF9SRktJTEwgaXMgbm90IHNl dAojIENPTkZJR19UT1NISUJBX0hBUFMgaXMgbm90IHNldAojIENPTkZJR19BQ1BJX0NNUEMg aXMgbm90IHNldAojIENPTkZJR19JTlRFTF9JUFMgaXMgbm90IHNldAojIENPTkZJR19JQk1f UlRMIGlzIG5vdCBzZXQKIyBDT05GSUdfTVhNX1dNSSBpcyBub3Qgc2V0CiMgQ09ORklHX1NB TVNVTkdfUTEwIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5URUxfUlNUIGlzIG5vdCBzZXQKIyBD T05GSUdfSU5URUxfU01BUlRDT05ORUNUIGlzIG5vdCBzZXQKIyBDT05GSUdfUFZQQU5JQyBp cyBub3Qgc2V0CiMgQ09ORklHX0NIUk9NRV9QTEFURk9STVMgaXMgbm90IHNldAoKIwojIFNP QyAoU3lzdGVtIE9uIENoaXApIHNwZWNpZmljIERyaXZlcnMKIwoKIwojIEhhcmR3YXJlIFNw aW5sb2NrIGRyaXZlcnMKIwoKIwojIENsb2NrIFNvdXJjZSBkcml2ZXJzCiMKQ09ORklHX0NM S0VWVF9JODI1Mz15CkNPTkZJR19JODI1M19MT0NLPXkKQ09ORklHX0NMS0JMRF9JODI1Mz15 CiMgQ09ORklHX1NIX1RJTUVSX0NNVCBpcyBub3Qgc2V0CiMgQ09ORklHX1NIX1RJTUVSX01U VTIgaXMgbm90IHNldAojIENPTkZJR19TSF9USU1FUl9UTVUgaXMgbm90IHNldAojIENPTkZJ R19FTV9USU1FUl9TVEkgaXMgbm90IHNldAojIENPTkZJR19NQUlMQk9YIGlzIG5vdCBzZXQK Q09ORklHX0lPTU1VX0FQST15CkNPTkZJR19JT01NVV9TVVBQT1JUPXkKIyBDT05GSUdfQU1E X0lPTU1VIGlzIG5vdCBzZXQKQ09ORklHX0RNQVJfVEFCTEU9eQpDT05GSUdfSU5URUxfSU9N TVU9eQpDT05GSUdfSU5URUxfSU9NTVVfREVGQVVMVF9PTj15CkNPTkZJR19JTlRFTF9JT01N VV9GTE9QUFlfV0E9eQpDT05GSUdfSVJRX1JFTUFQPXkKCiMKIyBSZW1vdGVwcm9jIGRyaXZl cnMKIwojIENPTkZJR19TVEVfTU9ERU1fUlBST0MgaXMgbm90IHNldAoKIwojIFJwbXNnIGRy aXZlcnMKIwojIENPTkZJR19QTV9ERVZGUkVRIGlzIG5vdCBzZXQKIyBDT05GSUdfRVhUQ09O IGlzIG5vdCBzZXQKQ09ORklHX01FTU9SWT15CiMgQ09ORklHX0lJTyBpcyBub3Qgc2V0CiMg Q09ORklHX05UQiBpcyBub3Qgc2V0CiMgQ09ORklHX1ZNRV9CVVMgaXMgbm90IHNldAojIENP TkZJR19QV00gaXMgbm90IHNldAojIENPTkZJR19JUEFDS19CVVMgaXMgbm90IHNldAojIENP TkZJR19SRVNFVF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKIyBDT05GSUdfRk1DIGlzIG5vdCBz ZXQKCiMKIyBQSFkgU3Vic3lzdGVtCiMKQ09ORklHX0dFTkVSSUNfUEhZPXkKIyBDT05GSUdf QkNNX0tPTkFfVVNCMl9QSFkgaXMgbm90IHNldAojIENPTkZJR19QT1dFUkNBUCBpcyBub3Qg c2V0CiMgQ09ORklHX01DQiBpcyBub3Qgc2V0CkNPTkZJR19SQVM9eQojIENPTkZJR19USFVO REVSQk9MVCBpcyBub3Qgc2V0CgojCiMgRmlybXdhcmUgRHJpdmVycwojCkNPTkZJR19FREQ9 bQojIENPTkZJR19FRERfT0ZGIGlzIG5vdCBzZXQKQ09ORklHX0ZJUk1XQVJFX01FTU1BUD15 CkNPTkZJR19ERUxMX1JCVT1tCkNPTkZJR19EQ0RCQVM9eQpDT05GSUdfRE1JSUQ9eQpDT05G SUdfRE1JX1NZU0ZTPXkKQ09ORklHX0RNSV9TQ0FOX01BQ0hJTkVfTk9OX0VGSV9GQUxMQkFD Sz15CiMgQ09ORklHX0lTQ1NJX0lCRlRfRklORCBpcyBub3Qgc2V0CiMgQ09ORklHX0dPT0dM RV9GSVJNV0FSRSBpcyBub3Qgc2V0CgojCiMgRUZJIChFeHRlbnNpYmxlIEZpcm13YXJlIElu dGVyZmFjZSkgU3VwcG9ydAojCkNPTkZJR19FRklfVkFSUz1tCkNPTkZJR19FRklfVkFSU19Q U1RPUkU9bQpDT05GSUdfRUZJX1ZBUlNfUFNUT1JFX0RFRkFVTFRfRElTQUJMRT15CkNPTkZJ R19FRklfUlVOVElNRV9NQVA9eQpDT05GSUdfRUZJX1JVTlRJTUVfV1JBUFBFUlM9eQpDT05G SUdfVUVGSV9DUEVSPXkKCiMKIyBGaWxlIHN5c3RlbXMKIwpDT05GSUdfRENBQ0hFX1dPUkRf QUNDRVNTPXkKIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CkNPTkZJR19FWFQzX0ZTPW0K IyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKQ09ORklHX0VY VDNfRlNfWEFUVFI9eQpDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQojIENPTkZJR19FWFQz X0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQ09ORklHX0VYVDRfRlM9bQpDT05GSUdfRVhUNF9V U0VfRk9SX0VYVDIzPXkKQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMPXkKIyBDT05GSUdfRVhU NF9GU19TRUNVUklUWSBpcyBub3Qgc2V0CiMgQ09ORklHX0VYVDRfREVCVUcgaXMgbm90IHNl dApDT05GSUdfSkJEPW0KIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0pC RDI9bQojIENPTkZJR19KQkQyX0RFQlVHIGlzIG5vdCBzZXQKQ09ORklHX0ZTX01CQ0FDSEU9 bQojIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0pGU19GUyBpcyBu b3Qgc2V0CkNPTkZJR19YRlNfRlM9eQojIENPTkZJR19YRlNfUVVPVEEgaXMgbm90IHNldApD T05GSUdfWEZTX1BPU0lYX0FDTD15CkNPTkZJR19YRlNfUlQ9eQojIENPTkZJR19YRlNfV0FS TiBpcyBub3Qgc2V0CiMgQ09ORklHX1hGU19ERUJVRyBpcyBub3Qgc2V0CiMgQ09ORklHX0dG UzJfRlMgaXMgbm90IHNldAojIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CkNPTkZJR19C VFJGU19GUz1tCkNPTkZJR19CVFJGU19GU19QT1NJWF9BQ0w9eQojIENPTkZJR19CVFJGU19G U19DSEVDS19JTlRFR1JJVFkgaXMgbm90IHNldAojIENPTkZJR19CVFJGU19GU19SVU5fU0FO SVRZX1RFU1RTIGlzIG5vdCBzZXQKIyBDT05GSUdfQlRSRlNfREVCVUcgaXMgbm90IHNldAoj IENPTkZJR19CVFJGU19BU1NFUlQgaXMgbm90IHNldApDT05GSUdfTklMRlMyX0ZTPW0KQ09O RklHX0ZTX1BPU0lYX0FDTD15CkNPTkZJR19FWFBPUlRGUz15CkNPTkZJR19GSUxFX0xPQ0tJ Tkc9eQpDT05GSUdfRlNOT1RJRlk9eQpDT05GSUdfRE5PVElGWT15CkNPTkZJR19JTk9USUZZ X1VTRVI9eQpDT05GSUdfRkFOT1RJRlk9eQojIENPTkZJR19GQU5PVElGWV9BQ0NFU1NfUEVS TUlTU0lPTlMgaXMgbm90IHNldAojIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiMgQ09ORklH X1FVT1RBQ1RMIGlzIG5vdCBzZXQKQ09ORklHX0FVVE9GUzRfRlM9eQpDT05GSUdfRlVTRV9G Uz1tCkNPTkZJR19DVVNFPW0KCiMKIyBDYWNoZXMKIwpDT05GSUdfRlNDQUNIRT1tCiMgQ09O RklHX0ZTQ0FDSEVfU1RBVFMgaXMgbm90IHNldAojIENPTkZJR19GU0NBQ0hFX0hJU1RPR1JB TSBpcyBub3Qgc2V0CiMgQ09ORklHX0ZTQ0FDSEVfREVCVUcgaXMgbm90IHNldAojIENPTkZJ R19GU0NBQ0hFX09CSkVDVF9MSVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0FDSEVGSUxFUyBp cyBub3Qgc2V0CgojCiMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwojCkNPTkZJR19JU085NjYw X0ZTPW0KQ09ORklHX0pPTElFVD15CkNPTkZJR19aSVNPRlM9eQpDT05GSUdfVURGX0ZTPXkK Q09ORklHX1VERl9OTFM9eQoKIwojIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKIwpDT05GSUdf RkFUX0ZTPXkKQ09ORklHX01TRE9TX0ZTPW0KQ09ORklHX1ZGQVRfRlM9eQpDT05GSUdfRkFU X0RFRkFVTFRfQ09ERVBBR0U9NjUwMDEKQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0i NjUwMDEiCkNPTkZJR19OVEZTX0ZTPW0KIyBDT05GSUdfTlRGU19ERUJVRyBpcyBub3Qgc2V0 CkNPTkZJR19OVEZTX1JXPXkKCiMKIyBQc2V1ZG8gZmlsZXN5c3RlbXMKIwpDT05GSUdfUFJP Q19GUz15CkNPTkZJR19QUk9DX0tDT1JFPXkKQ09ORklHX1BST0NfVk1DT1JFPXkKQ09ORklH X1BST0NfU1lTQ1RMPXkKQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKQ09ORklHX0tFUk5G Uz15CkNPTkZJR19TWVNGUz15CkNPTkZJR19UTVBGUz15CkNPTkZJR19UTVBGU19QT1NJWF9B Q0w9eQpDT05GSUdfVE1QRlNfWEFUVFI9eQpDT05GSUdfSFVHRVRMQkZTPXkKQ09ORklHX0hV R0VUTEJfUEFHRT15CkNPTkZJR19DT05GSUdGU19GUz1tCkNPTkZJR19NSVNDX0ZJTEVTWVNU RU1TPXkKIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0FGRlNfRlMgaXMg bm90IHNldAojIENPTkZJR19FQ1JZUFRfRlMgaXMgbm90IHNldAojIENPTkZJR19IRlNfRlMg aXMgbm90IHNldAojIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfQkVG U19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0VG U19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX0xPR0ZTIGlzIG5vdCBzZXQKQ09ORklHX0NSQU1G Uz1tCkNPTkZJR19TUVVBU0hGUz1tCiMgQ09ORklHX1NRVUFTSEZTX0ZJTEVfQ0FDSEUgaXMg bm90IHNldApDT05GSUdfU1FVQVNIRlNfRklMRV9ESVJFQ1Q9eQojIENPTkZJR19TUVVBU0hG U19ERUNPTVBfU0lOR0xFIGlzIG5vdCBzZXQKIyBDT05GSUdfU1FVQVNIRlNfREVDT01QX01V TFRJIGlzIG5vdCBzZXQKQ09ORklHX1NRVUFTSEZTX0RFQ09NUF9NVUxUSV9QRVJDUFU9eQpD T05GSUdfU1FVQVNIRlNfWEFUVFI9eQpDT05GSUdfU1FVQVNIRlNfWkxJQj15CkNPTkZJR19T UVVBU0hGU19MWk89eQpDT05GSUdfU1FVQVNIRlNfWFo9eQojIENPTkZJR19TUVVBU0hGU180 S19ERVZCTEtfU0laRSBpcyBub3Qgc2V0CiMgQ09ORklHX1NRVUFTSEZTX0VNQkVEREVEIGlz IG5vdCBzZXQKQ09ORklHX1NRVUFTSEZTX0ZSQUdNRU5UX0NBQ0hFX1NJWkU9MwojIENPTkZJ R19WWEZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAojIENP TkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiMg Q09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiMgQ09ORklHX1FOWDZGU19GUyBpcyBub3Qg c2V0CiMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQ09ORklHX1BTVE9SRT15CiMgQ09O RklHX1BTVE9SRV9DT05TT0xFIGlzIG5vdCBzZXQKIyBDT05GSUdfUFNUT1JFX1JBTSBpcyBu b3Qgc2V0CiMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAojIENPTkZJR19VRlNfRlMgaXMg bm90IHNldAojIENPTkZJR19GMkZTX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfRUZJVkFSX0ZT IGlzIG5vdCBzZXQKQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQojIENPTkZJR19ORlNf RlMgaXMgbm90IHNldAojIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIyBDT05GSUdfQ0VQSF9G UyBpcyBub3Qgc2V0CkNPTkZJR19DSUZTPW0KQ09ORklHX0NJRlNfU1RBVFM9eQojIENPTkZJ R19DSUZTX1NUQVRTMiBpcyBub3Qgc2V0CiMgQ09ORklHX0NJRlNfV0VBS19QV19IQVNIIGlz IG5vdCBzZXQKIyBDT05GSUdfQ0lGU19VUENBTEwgaXMgbm90IHNldApDT05GSUdfQ0lGU19Y QVRUUj15CkNPTkZJR19DSUZTX1BPU0lYPXkKQ09ORklHX0NJRlNfQUNMPXkKQ09ORklHX0NJ RlNfREVCVUc9eQojIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CiMgQ09ORklHX0NJ RlNfREZTX1VQQ0FMTCBpcyBub3Qgc2V0CkNPTkZJR19DSUZTX1NNQjI9eQpDT05GSUdfQ0lG U19GU0NBQ0hFPXkKIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKIyBDT05GSUdfQ09EQV9G UyBpcyBub3Qgc2V0CiMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkNPTkZJR19OTFM9eQpD T05GSUdfTkxTX0RFRkFVTFQ9InV0ZjgiCkNPTkZJR19OTFNfQ09ERVBBR0VfNDM3PW0KIyBD T05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFH RV83NzUgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfODUwIGlzIG5vdCBzZXQK IyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RF UEFHRV84NTUgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfODU3IGlzIG5vdCBz ZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19D T0RFUEFHRV84NjEgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfODYyIGlzIG5v dCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CiMgQ09ORklHX05M U19DT0RFUEFHRV84NjQgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfODY1IGlz IG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CiMgQ09ORklH X05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0VfOTM2 IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CiMgQ09O RklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0Vf OTQ5IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CiMg Q09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAojIENPTkZJR19OTFNfQ09ERVBBR0Vf MTI1MCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQK Q09ORklHX05MU19BU0NJST1tCkNPTkZJR19OTFNfSVNPODg1OV8xPW0KIyBDT05GSUdfTkxT X0lTTzg4NTlfMiBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNl dAojIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0lTTzg4 NTlfNSBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAojIENP TkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBp cyBub3Qgc2V0CiMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKIyBDT05GSUdf TkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldApDT05GSUdfTkxTX0lTTzg4NTlfMTU9bQojIENP TkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qg c2V0CiMgQ09ORklHX05MU19NQUNfUk9NQU4gaXMgbm90IHNldAojIENPTkZJR19OTFNfTUFD X0NFTFRJQyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfQ0VOVEVVUk8gaXMgbm90IHNl dAojIENPTkZJR19OTFNfTUFDX0NST0FUSUFOIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX01B Q19DWVJJTExJQyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfR0FFTElDIGlzIG5vdCBz ZXQKIyBDT05GSUdfTkxTX01BQ19HUkVFSyBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNf SUNFTEFORCBpcyBub3Qgc2V0CiMgQ09ORklHX05MU19NQUNfSU5VSVQgaXMgbm90IHNldAoj IENPTkZJR19OTFNfTUFDX1JPTUFOSUFOIGlzIG5vdCBzZXQKIyBDT05GSUdfTkxTX01BQ19U VVJLSVNIIGlzIG5vdCBzZXQKQ09ORklHX05MU19VVEY4PXkKIyBDT05GSUdfRExNIGlzIG5v dCBzZXQKCiMKIyBLZXJuZWwgaGFja2luZwojCkNPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQ T1JUPXkKCiMKIyBwcmludGsgYW5kIGRtZXNnIG9wdGlvbnMKIwpDT05GSUdfUFJJTlRLX1RJ TUU9eQpDT05GSUdfTUVTU0FHRV9MT0dMRVZFTF9ERUZBVUxUPTQKIyBDT05GSUdfQk9PVF9Q UklOVEtfREVMQVkgaXMgbm90IHNldAojIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBz ZXQKCiMKIyBDb21waWxlLXRpbWUgY2hlY2tzIGFuZCBjb21waWxlciBvcHRpb25zCiMKQ09O RklHX0RFQlVHX0lORk89eQojIENPTkZJR19ERUJVR19JTkZPX1JFRFVDRUQgaXMgbm90IHNl dAojIENPTkZJR19ERUJVR19JTkZPX1NQTElUIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdf SU5GT19EV0FSRjQgaXMgbm90IHNldAojIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVE IGlzIG5vdCBzZXQKIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldApDT05G SUdfRlJBTUVfV0FSTj00MDk2CkNPTkZJR19TVFJJUF9BU01fU1lNUz15CiMgQ09ORklHX1JF QURBQkxFX0FTTSBpcyBub3Qgc2V0CiMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBz ZXQKQ09ORklHX0RFQlVHX0ZTPXkKIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0 CiMgQ09ORklHX0RFQlVHX1NFQ1RJT05fTUlTTUFUQ0ggaXMgbm90IHNldApDT05GSUdfQVJD SF9XQU5UX0ZSQU1FX1BPSU5URVJTPXkKQ09ORklHX0ZSQU1FX1BPSU5URVI9eQojIENPTkZJ R19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldApDT05GSUdfTUFHSUNfU1lT UlE9eQpDT05GSUdfTUFHSUNfU1lTUlFfREVGQVVMVF9FTkFCTEU9MHgxCkNPTkZJR19ERUJV R19LRVJORUw9eQoKIwojIE1lbW9yeSBEZWJ1Z2dpbmcKIwojIENPTkZJR19ERUJVR19QQUdF QUxMT0MgaXMgbm90IHNldAojIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKIyBD T05GSUdfU0xVQl9ERUJVR19PTiBpcyBub3Qgc2V0CiMgQ09ORklHX1NMVUJfU1RBVFMgaXMg bm90IHNldApDT05GSUdfSEFWRV9ERUJVR19LTUVNTEVBSz15CiMgQ09ORklHX0RFQlVHX0tN RU1MRUFLIGlzIG5vdCBzZXQKQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFPXkKIyBDT05GSUdf REVCVUdfVk0gaXMgbm90IHNldAojIENPTkZJR19ERUJVR19WSVJUVUFMIGlzIG5vdCBzZXQK IyBDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQgaXMgbm90IHNldAojIENPTkZJR19ERUJVR19Q RVJfQ1BVX01BUFMgaXMgbm90IHNldApDT05GSUdfSEFWRV9ERUJVR19TVEFDS09WRVJGTE9X PXkKIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CkNPTkZJR19IQVZF X0FSQ0hfS01FTUNIRUNLPXkKIyBDT05GSUdfS01FTUNIRUNLIGlzIG5vdCBzZXQKIyBDT05G SUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAoKIwojIERlYnVnIExvY2t1cHMgYW5kIEhhbmdz CiMKQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUj15CkNPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9S PXkKQ09ORklHX0JPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDPXkKQ09ORklHX0JPT1RQQVJB TV9IQVJETE9DS1VQX1BBTklDX1ZBTFVFPTEKQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQ X1BBTklDPXkKQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTEKQ09O RklHX0RFVEVDVF9IVU5HX1RBU0s9eQpDT05GSUdfREVGQVVMVF9IVU5HX1RBU0tfVElNRU9V VD0xMjAKIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CkNP TkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKIyBDT05GSUdfUEFOSUNf T05fT09QUyBpcyBub3Qgc2V0CkNPTkZJR19QQU5JQ19PTl9PT1BTX1ZBTFVFPTAKQ09ORklH X1BBTklDX1RJTUVPVVQ9MApDT05GSUdfU0NIRURfREVCVUc9eQpDT05GSUdfU0NIRURTVEFU Uz15CkNPTkZJR19USU1FUl9TVEFUUz15CiMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90 IHNldAoKIwojIExvY2sgRGVidWdnaW5nIChzcGlubG9ja3MsIG11dGV4ZXMsIGV0Yy4uLikK IwpDT05GSUdfREVCVUdfUlRfTVVURVhFUz15CkNPTkZJR19ERUJVR19TUElOTE9DSz15CkNP TkZJR19ERUJVR19NVVRFWEVTPXkKIyBDT05GSUdfREVCVUdfV1dfTVVURVhfU0xPV1BBVEgg aXMgbm90IHNldApDT05GSUdfREVCVUdfTE9DS19BTExPQz15CiMgQ09ORklHX1BST1ZFX0xP Q0tJTkcgaXMgbm90IHNldApDT05GSUdfTE9DS0RFUD15CkNPTkZJR19MT0NLX1NUQVQ9eQoj IENPTkZJR19ERUJVR19MT0NLREVQIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfQVRPTUlD X1NMRUVQIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RT IGlzIG5vdCBzZXQKIyBDT05GSUdfTE9DS19UT1JUVVJFX1RFU1QgaXMgbm90IHNldApDT05G SUdfVFJBQ0VfSVJRRkxBR1M9eQpDT05GSUdfU1RBQ0tUUkFDRT15CiMgQ09ORklHX0RFQlVH X0tPQkpFQ1QgaXMgbm90IHNldApDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiMgQ09ORklH X0RFQlVHX0xJU1QgaXMgbm90IHNldApDT05GSUdfREVCVUdfUElfTElTVD15CiMgQ09ORklH X0RFQlVHX1NHIGlzIG5vdCBzZXQKIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBz ZXQKIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAoKIwojIFJDVSBEZWJ1 Z2dpbmcKIwojIENPTkZJR19TUEFSU0VfUkNVX1BPSU5URVIgaXMgbm90IHNldAojIENPTkZJ R19UT1JUVVJFX1RFU1QgaXMgbm90IHNldAojIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlz IG5vdCBzZXQKQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD0zMAojIENPTkZJR19SQ1Vf Q1BVX1NUQUxMX1ZFUkJPU0UgaXMgbm90IHNldAojIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0lO Rk8gaXMgbm90IHNldAojIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAojIENPTkZJR19E RUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CiMgQ09ORklHX05PVElGSUVSX0VSUk9S X0lOSkVDVElPTiBpcyBub3Qgc2V0CiMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qg c2V0CkNPTkZJR19MQVRFTkNZVE9QPXkKQ09ORklHX0FSQ0hfSEFTX0RFQlVHX1NUUklDVF9V U0VSX0NPUFlfQ0hFQ0tTPXkKIyBDT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVD S1MgaXMgbm90IHNldApDT05GSUdfVVNFUl9TVEFDS1RSQUNFX1NVUFBPUlQ9eQpDT05GSUdf Tk9QX1RSQUNFUj15CkNPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CkNPTkZJR19IQVZF X0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CkNPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQ X1RFU1Q9eQpDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CkNPTkZJR19IQVZFX0RZTkFN SUNfRlRSQUNFX1dJVEhfUkVHUz15CkNPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JE PXkKQ09ORklHX0hBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUz15CkNPTkZJR19IQVZFX0ZFTlRS WT15CkNPTkZJR19IQVZFX0NfUkVDT1JETUNPVU5UPXkKQ09ORklHX1RSQUNFUl9NQVhfVFJB Q0U9eQpDT05GSUdfVFJBQ0VfQ0xPQ0s9eQpDT05GSUdfUklOR19CVUZGRVI9eQpDT05GSUdf RVZFTlRfVFJBQ0lORz15CkNPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQpDT05GSUdf UklOR19CVUZGRVJfQUxMT1dfU1dBUD15CkNPTkZJR19UUkFDSU5HPXkKQ09ORklHX0dFTkVS SUNfVFJBQ0VSPXkKQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CkNPTkZJR19GVFJBQ0U9eQoj IENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldApDT05GSUdfSVJRU09GRl9UUkFD RVI9eQpDT05GSUdfUFJFRU1QVF9UUkFDRVI9eQpDT05GSUdfU0NIRURfVFJBQ0VSPXkKIyBD T05GSUdfRlRSQUNFX1NZU0NBTExTIGlzIG5vdCBzZXQKQ09ORklHX1RSQUNFUl9TTkFQU0hP VD15CkNPTkZJR19UUkFDRVJfU05BUFNIT1RfUEVSX0NQVV9TV0FQPXkKQ09ORklHX0JSQU5D SF9QUk9GSUxFX05PTkU9eQojIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBp cyBub3Qgc2V0CiMgQ09ORklHX1BST0ZJTEVfQUxMX0JSQU5DSEVTIGlzIG5vdCBzZXQKIyBD T05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9 eQpDT05GSUdfS1BST0JFX0VWRU5UPXkKQ09ORklHX1VQUk9CRV9FVkVOVD15CkNPTkZJR19Q Uk9CRV9FVkVOVFM9eQojIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQK IyBDT05GSUdfTU1JT1RSQUNFIGlzIG5vdCBzZXQKIyBDT05GSUdfVFJBQ0VQT0lOVF9CRU5D SE1BUksgaXMgbm90IHNldAojIENPTkZJR19SSU5HX0JVRkZFUl9CRU5DSE1BUksgaXMgbm90 IHNldAojIENPTkZJR19SSU5HX0JVRkZFUl9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAoKIwoj IFJ1bnRpbWUgVGVzdGluZwojCiMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKIyBDT05GSUdf VEVTVF9MSVNUX1NPUlQgaXMgbm90IHNldAojIENPTkZJR19LUFJPQkVTX1NBTklUWV9URVNU IGlzIG5vdCBzZXQKIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CiMg Q09ORklHX1JCVFJFRV9URVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfSU5URVJWQUxfVFJFRV9U RVNUIGlzIG5vdCBzZXQKIyBDT05GSUdfUEVSQ1BVX1RFU1QgaXMgbm90IHNldAojIENPTkZJ R19BVE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX0FTWU5DX1JBSUQ2X1RF U1QgaXMgbm90IHNldAojIENPTkZJR19URVNUX1NUUklOR19IRUxQRVJTIGlzIG5vdCBzZXQK IyBDT05GSUdfVEVTVF9LU1RSVE9YIGlzIG5vdCBzZXQKIyBDT05GSUdfVEVTVF9SSEFTSFRB QkxFIGlzIG5vdCBzZXQKIyBDT05GSUdfUFJPVklERV9PSENJMTM5NF9ETUFfSU5JVCBpcyBu b3Qgc2V0CiMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAojIENPTkZJR19URVNU X01PRFVMRSBpcyBub3Qgc2V0CiMgQ09ORklHX1RFU1RfVVNFUl9DT1BZIGlzIG5vdCBzZXQK IyBDT05GSUdfVEVTVF9CUEYgaXMgbm90IHNldAojIENPTkZJR19URVNUX0ZJUk1XQVJFIGlz IG5vdCBzZXQKIyBDT05GSUdfVEVTVF9VREVMQVkgaXMgbm90IHNldAojIENPTkZJR19TQU1Q TEVTIGlzIG5vdCBzZXQKQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKQ09ORklHX0tHREI9eQpD T05GSUdfS0dEQl9TRVJJQUxfQ09OU09MRT15CiMgQ09ORklHX0tHREJfVEVTVFMgaXMgbm90 IHNldAojIENPTkZJR19LR0RCX0xPV19MRVZFTF9UUkFQIGlzIG5vdCBzZXQKQ09ORklHX0tH REJfS0RCPXkKQ09ORklHX0tEQl9LRVlCT0FSRD15CkNPTkZJR19LREJfQ09OVElOVUVfQ0FU QVNUUk9QSElDPTAKIyBDT05GSUdfU1RSSUNUX0RFVk1FTSBpcyBub3Qgc2V0CkNPTkZJR19Y ODZfVkVSQk9TRV9CT09UVVA9eQpDT05GSUdfRUFSTFlfUFJJTlRLPXkKIyBDT05GSUdfRUFS TFlfUFJJTlRLX0RCR1AgaXMgbm90IHNldAojIENPTkZJR19FQVJMWV9QUklOVEtfRUZJIGlz IG5vdCBzZXQKIyBDT05GSUdfWDg2X1BURFVNUCBpcyBub3Qgc2V0CkNPTkZJR19ERUJVR19S T0RBVEE9eQojIENPTkZJR19ERUJVR19ST0RBVEFfVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklH X0RFQlVHX1NFVF9NT0RVTEVfUk9OWCBpcyBub3Qgc2V0CiMgQ09ORklHX0RFQlVHX05YX1RF U1QgaXMgbm90IHNldApDT05GSUdfRE9VQkxFRkFVTFQ9eQojIENPTkZJR19ERUJVR19UTEJG TFVTSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lPTU1VX1NUUkVTUyBpcyBub3Qgc2V0CkNPTkZJ R19IQVZFX01NSU9UUkFDRV9TVVBQT1JUPXkKIyBDT05GSUdfWDg2X0RFQ09ERVJfU0VMRlRF U1QgaXMgbm90IHNldApDT05GSUdfSU9fREVMQVlfVFlQRV8wWDgwPTAKQ09ORklHX0lPX0RF TEFZX1RZUEVfMFhFRD0xCkNPTkZJR19JT19ERUxBWV9UWVBFX1VERUxBWT0yCkNPTkZJR19J T19ERUxBWV9UWVBFX05PTkU9MwpDT05GSUdfSU9fREVMQVlfMFg4MD15CiMgQ09ORklHX0lP X0RFTEFZXzBYRUQgaXMgbm90IHNldAojIENPTkZJR19JT19ERUxBWV9VREVMQVkgaXMgbm90 IHNldAojIENPTkZJR19JT19ERUxBWV9OT05FIGlzIG5vdCBzZXQKQ09ORklHX0RFRkFVTFRf SU9fREVMQVlfVFlQRT0wCkNPTkZJR19ERUJVR19CT09UX1BBUkFNUz15CiMgQ09ORklHX0NQ QV9ERUJVRyBpcyBub3Qgc2V0CkNPTkZJR19PUFRJTUlaRV9JTkxJTklORz15CiMgQ09ORklH X0RFQlVHX05NSV9TRUxGVEVTVCBpcyBub3Qgc2V0CiMgQ09ORklHX1g4Nl9ERUJVR19TVEFU SUNfQ1BVX0hBUyBpcyBub3Qgc2V0CgojCiMgU2VjdXJpdHkgb3B0aW9ucwojCkNPTkZJR19L RVlTPXkKQ09ORklHX1BFUlNJU1RFTlRfS0VZUklOR1M9eQojIENPTkZJR19CSUdfS0VZUyBp cyBub3Qgc2V0CiMgQ09ORklHX1RSVVNURURfS0VZUyBpcyBub3Qgc2V0CkNPTkZJR19FTkNS WVBURURfS0VZUz15CkNPTkZJR19LRVlTX0RFQlVHX1BST0NfS0VZUz15CiMgQ09ORklHX1NF Q1VSSVRZX0RNRVNHX1JFU1RSSUNUIGlzIG5vdCBzZXQKQ09ORklHX1NFQ1VSSVRZPXkKQ09O RklHX1NFQ1VSSVRZRlM9eQojIENPTkZJR19TRUNVUklUWV9ORVRXT1JLIGlzIG5vdCBzZXQK IyBDT05GSUdfU0VDVVJJVFlfUEFUSCBpcyBub3Qgc2V0CiMgQ09ORklHX0lOVEVMX1RYVCBp cyBub3Qgc2V0CiMgQ09ORklHX1NFQ1VSSVRZX1NNQUNLIGlzIG5vdCBzZXQKIyBDT05GSUdf U0VDVVJJVFlfVE9NT1lPIGlzIG5vdCBzZXQKIyBDT05GSUdfU0VDVVJJVFlfQVBQQVJNT1Ig aXMgbm90IHNldAojIENPTkZJR19TRUNVUklUWV9ZQU1BIGlzIG5vdCBzZXQKIyBDT05GSUdf SU1BIGlzIG5vdCBzZXQKIyBDT05GSUdfRVZNIGlzIG5vdCBzZXQKQ09ORklHX0RFRkFVTFRf U0VDVVJJVFlfREFDPXkKQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKQ09ORklHX1hPUl9C TE9DS1M9bQpDT05GSUdfQVNZTkNfQ09SRT1tCkNPTkZJR19BU1lOQ19NRU1DUFk9bQpDT05G SUdfQVNZTkNfWE9SPW0KQ09ORklHX0FTWU5DX1BRPW0KQ09ORklHX0FTWU5DX1JBSUQ2X1JF Q09WPW0KQ09ORklHX0NSWVBUTz15CgojCiMgQ3J5cHRvIGNvcmUgb3IgaGVscGVyCiMKQ09O RklHX0NSWVBUT19BTEdBUEk9eQpDT05GSUdfQ1JZUFRPX0FMR0FQSTI9eQpDT05GSUdfQ1JZ UFRPX0FFQUQ9bQpDT05GSUdfQ1JZUFRPX0FFQUQyPXkKQ09ORklHX0NSWVBUT19CTEtDSVBI RVI9eQpDT05GSUdfQ1JZUFRPX0JMS0NJUEhFUjI9eQpDT05GSUdfQ1JZUFRPX0hBU0g9eQpD T05GSUdfQ1JZUFRPX0hBU0gyPXkKQ09ORklHX0NSWVBUT19STkc9eQpDT05GSUdfQ1JZUFRP X1JORzI9eQpDT05GSUdfQ1JZUFRPX1BDT01QPW0KQ09ORklHX0NSWVBUT19QQ09NUDI9eQpD T05GSUdfQ1JZUFRPX01BTkFHRVI9eQpDT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKIyBDT05G SUdfQ1JZUFRPX1VTRVIgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fTUFOQUdFUl9ESVNB QkxFX1RFU1RTIGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19HRjEyOE1VTD1tCiMgQ09ORklH X0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1BDUllQVCBpcyBub3Qg c2V0CkNPTkZJR19DUllQVE9fV09SS1FVRVVFPXkKQ09ORklHX0NSWVBUT19DUllQVEQ9bQpD T05GSUdfQ1JZUFRPX0FVVEhFTkM9bQojIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0 CkNPTkZJR19DUllQVE9fQUJMS19IRUxQRVI9bQpDT05GSUdfQ1JZUFRPX0dMVUVfSEVMUEVS X1g4Nj1tCgojCiMgQXV0aGVudGljYXRlZCBFbmNyeXB0aW9uIHdpdGggQXNzb2NpYXRlZCBE YXRhCiMKIyBDT05GSUdfQ1JZUFRPX0NDTSBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19H Q00gaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAoKIwojIEJs b2NrIG1vZGVzCiMKQ09ORklHX0NSWVBUT19DQkM9eQojIENPTkZJR19DUllQVE9fQ1RSIGlz IG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0NUUyBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9f RUNCPXkKQ09ORklHX0NSWVBUT19MUlc9bQojIENPTkZJR19DUllQVE9fUENCQyBpcyBub3Qg c2V0CkNPTkZJR19DUllQVE9fWFRTPW0KCiMKIyBIYXNoIG1vZGVzCiMKQ09ORklHX0NSWVBU T19DTUFDPXkKQ09ORklHX0NSWVBUT19ITUFDPXkKIyBDT05GSUdfQ1JZUFRPX1hDQkMgaXMg bm90IHNldAojIENPTkZJR19DUllQVE9fVk1BQyBpcyBub3Qgc2V0CgojCiMgRGlnZXN0CiMK Q09ORklHX0NSWVBUT19DUkMzMkM9eQpDT05GSUdfQ1JZUFRPX0NSQzMyQ19JTlRFTD15CiMg Q09ORklHX0NSWVBUT19DUkMzMiBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19DUkMzMl9Q Q0xNVUwgaXMgbm90IHNldApDT05GSUdfQ1JZUFRPX0NSQ1QxMERJRj15CiMgQ09ORklHX0NS WVBUT19DUkNUMTBESUZfUENMTVVMIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX0dIQVNI IGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19NRDQ9eQpDT05GSUdfQ1JZUFRPX01ENT15CiMg Q09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19S TUQxMjggaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fUk1EMTYwIGlzIG5vdCBzZXQKIyBD T05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19STUQzMjAg aXMgbm90IHNldApDT05GSUdfQ1JZUFRPX1NIQTE9bQpDT05GSUdfQ1JZUFRPX1NIQTFfU1NT RTM9bQpDT05GSUdfQ1JZUFRPX1NIQTI1Nl9TU1NFMz1tCkNPTkZJR19DUllQVE9fU0hBNTEy X1NTU0UzPW0KQ09ORklHX0NSWVBUT19TSEEyNTY9eQpDT05GSUdfQ1JZUFRPX1NIQTUxMj1t CiMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fV1A1 MTIgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fR0hBU0hfQ0xNVUxfTklfSU5URUwgaXMg bm90IHNldAoKIwojIENpcGhlcnMKIwpDT05GSUdfQ1JZUFRPX0FFUz15CkNPTkZJR19DUllQ VE9fQUVTX1g4Nl82ND1tCkNPTkZJR19DUllQVE9fQUVTX05JX0lOVEVMPW0KIyBDT05GSUdf Q1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CkNPTkZJR19DUllQVE9fQVJDND15CiMgQ09ORklH X0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19CTE9XRklTSF9Y ODZfNjQgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAoj IENPTkZJR19DUllQVE9fQ0FNRUxMSUFfWDg2XzY0IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZ UFRPX0NBTUVMTElBX0FFU05JX0FWWF9YODZfNjQgaXMgbm90IHNldAojIENPTkZJR19DUllQ VE9fQ0FNRUxMSUFfQUVTTklfQVZYMl9YODZfNjQgaXMgbm90IHNldAojIENPTkZJR19DUllQ VE9fQ0FTVDUgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fQ0FTVDVfQVZYX1g4Nl82NCBp cyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CiMgQ09ORklHX0NS WVBUT19DQVNUNl9BVlhfWDg2XzY0IGlzIG5vdCBzZXQKQ09ORklHX0NSWVBUT19ERVM9eQoj IENPTkZJR19DUllQVE9fREVTM19FREVfWDg2XzY0IGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JZ UFRPX0ZDUllQVCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNl dAojIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19T QUxTQTIwX1g4Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19TRUVEIGlzIG5vdCBz ZXQKIyBDT05GSUdfQ1JZUFRPX1NFUlBFTlQgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9f U0VSUEVOVF9TU0UyX1g4Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19TRVJQRU5U X0FWWF9YODZfNjQgaXMgbm90IHNldAojIENPTkZJR19DUllQVE9fU0VSUEVOVF9BVlgyX1g4 Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19URUEgaXMgbm90IHNldAojIENPTkZJ R19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19UV09GSVNIX1g4 Nl82NCBpcyBub3Qgc2V0CiMgQ09ORklHX0NSWVBUT19UV09GSVNIX1g4Nl82NF8zV0FZIGlz IG5vdCBzZXQKIyBDT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQVZYX1g4Nl82NCBpcyBub3Qgc2V0 CgojCiMgQ29tcHJlc3Npb24KIwpDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQpDT05GSUdfQ1JZ UFRPX1pMSUI9bQpDT05GSUdfQ1JZUFRPX0xaTz15CiMgQ09ORklHX0NSWVBUT19MWjQgaXMg bm90IHNldAojIENPTkZJR19DUllQVE9fTFo0SEMgaXMgbm90IHNldAoKIwojIFJhbmRvbSBO dW1iZXIgR2VuZXJhdGlvbgojCkNPTkZJR19DUllQVE9fQU5TSV9DUFJORz1tCiMgQ09ORklH X0NSWVBUT19EUkJHX01FTlUgaXMgbm90IHNldApDT05GSUdfQ1JZUFRPX1VTRVJfQVBJPW0K Q09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KQ09ORklHX0NSWVBUT19VU0VSX0FQSV9T S0NJUEhFUj1tCiMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiMgQ09ORklHX0FTWU1N RVRSSUNfS0VZX1RZUEUgaXMgbm90IHNldApDT05GSUdfSEFWRV9LVk09eQpDT05GSUdfSEFW RV9LVk1fSVJRQ0hJUD15CkNPTkZJR19IQVZFX0tWTV9JUlFGRD15CkNPTkZJR19IQVZFX0tW TV9JUlFfUk9VVElORz15CkNPTkZJR19IQVZFX0tWTV9FVkVOVEZEPXkKQ09ORklHX0tWTV9B UElDX0FSQ0hJVEVDVFVSRT15CkNPTkZJR19LVk1fTU1JTz15CkNPTkZJR19LVk1fQVNZTkNf UEY9eQpDT05GSUdfSEFWRV9LVk1fTVNJPXkKQ09ORklHX0hBVkVfS1ZNX0NQVV9SRUxBWF9J TlRFUkNFUFQ9eQpDT05GSUdfS1ZNX1ZGSU89eQpDT05GSUdfVklSVFVBTElaQVRJT049eQpD T05GSUdfS1ZNPW0KQ09ORklHX0tWTV9JTlRFTD1tCiMgQ09ORklHX0tWTV9BTUQgaXMgbm90 IHNldAojIENPTkZJR19LVk1fTU1VX0FVRElUIGlzIG5vdCBzZXQKQ09ORklHX0tWTV9ERVZJ Q0VfQVNTSUdOTUVOVD15CkNPTkZJR19CSU5BUllfUFJJTlRGPXkKCiMKIyBMaWJyYXJ5IHJv dXRpbmVzCiMKQ09ORklHX1JBSUQ2X1BRPW0KQ09ORklHX0JJVFJFVkVSU0U9eQpDT05GSUdf R0VORVJJQ19TVFJOQ1BZX0ZST01fVVNFUj15CkNPTkZJR19HRU5FUklDX1NUUk5MRU5fVVNF Uj15CkNPTkZJR19HRU5FUklDX05FVF9VVElMUz15CkNPTkZJR19HRU5FUklDX0ZJTkRfRklS U1RfQklUPXkKQ09ORklHX0dFTkVSSUNfUENJX0lPTUFQPXkKQ09ORklHX0dFTkVSSUNfSU9N QVA9eQpDT05GSUdfR0VORVJJQ19JTz15CkNPTkZJR19QRVJDUFVfUldTRU09eQpDT05GSUdf QVJDSF9VU0VfQ01QWENIR19MT0NLUkVGPXkKQ09ORklHX0FSQ0hfSEFTX0ZBU1RfTVVMVElQ TElFUj15CiMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CkNPTkZJR19DUkMxNj1tCkNP TkZJR19DUkNfVDEwRElGPXkKQ09ORklHX0NSQ19JVFVfVD15CkNPTkZJR19DUkMzMj15CiMg Q09ORklHX0NSQzMyX1NFTEZURVNUIGlzIG5vdCBzZXQKQ09ORklHX0NSQzMyX1NMSUNFQlk4 PXkKIyBDT05GSUdfQ1JDMzJfU0xJQ0VCWTQgaXMgbm90IHNldAojIENPTkZJR19DUkMzMl9T QVJXQVRFIGlzIG5vdCBzZXQKIyBDT05GSUdfQ1JDMzJfQklUIGlzIG5vdCBzZXQKIyBDT05G SUdfQ1JDNyBpcyBub3Qgc2V0CkNPTkZJR19MSUJDUkMzMkM9eQojIENPTkZJR19DUkM4IGlz IG5vdCBzZXQKIyBDT05GSUdfQVVESVRfQVJDSF9DT01QQVRfR0VORVJJQyBpcyBub3Qgc2V0 CiMgQ09ORklHX1JBTkRPTTMyX1NFTEZURVNUIGlzIG5vdCBzZXQKQ09ORklHX1pMSUJfSU5G TEFURT15CkNPTkZJR19aTElCX0RFRkxBVEU9eQpDT05GSUdfTFpPX0NPTVBSRVNTPXkKQ09O RklHX0xaT19ERUNPTVBSRVNTPXkKQ09ORklHX1haX0RFQz1tCkNPTkZJR19YWl9ERUNfWDg2 PXkKIyBDT05GSUdfWFpfREVDX1BPV0VSUEMgaXMgbm90IHNldAojIENPTkZJR19YWl9ERUNf SUE2NCBpcyBub3Qgc2V0CiMgQ09ORklHX1haX0RFQ19BUk0gaXMgbm90IHNldAojIENPTkZJ R19YWl9ERUNfQVJNVEhVTUIgaXMgbm90IHNldAojIENPTkZJR19YWl9ERUNfU1BBUkMgaXMg bm90IHNldApDT05GSUdfWFpfREVDX0JDSj15CiMgQ09ORklHX1haX0RFQ19URVNUIGlzIG5v dCBzZXQKQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SPXkKQ09ORklHX1RFWFRTRUFSQ0g9eQpD T05GSUdfVEVYVFNFQVJDSF9LTVA9bQpDT05GSUdfVEVYVFNFQVJDSF9CTT1tCkNPTkZJR19U RVhUU0VBUkNIX0ZTTT1tCkNPTkZJR19BU1NPQ0lBVElWRV9BUlJBWT15CkNPTkZJR19IQVNf SU9NRU09eQpDT05GSUdfSEFTX0lPUE9SVF9NQVA9eQpDT05GSUdfSEFTX0RNQT15CkNPTkZJ R19DSEVDS19TSUdOQVRVUkU9eQpDT05GSUdfQ1BVX1JNQVA9eQpDT05GSUdfRFFMPXkKQ09O RklHX0dMT0I9eQojIENPTkZJR19HTE9CX1NFTEZURVNUIGlzIG5vdCBzZXQKQ09ORklHX05M QVRUUj15CkNPTkZJR19BUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkU9eQpDT05G SUdfQVZFUkFHRT15CiMgQ09ORklHX0NPUkRJQyBpcyBub3Qgc2V0CiMgQ09ORklHX0REUiBp cyBub3Qgc2V0CkNPTkZJR19VQ1MyX1NUUklORz15CkNPTkZJR19GT05UX1NVUFBPUlQ9bQpD T05GSUdfRk9OVFM9eQpDT05GSUdfRk9OVF84eDg9eQpDT05GSUdfRk9OVF84eDE2PXkKIyBD T05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKIyBDT05GSUdfRk9OVF83eDE0IGlzIG5vdCBz ZXQKIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldApDT05GSUdfRk9OVF9BQ09S Tl84eDg9eQpDT05GSUdfRk9OVF9NSU5JXzR4Nj15CkNPTkZJR19GT05UX1NVTjh4MTY9eQoj IENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKIyBDT05GSUdfRk9OVF8xMHgxOCBp cyBub3Qgc2V0CkNPTkZJR19BUkNIX0hBU19TR19DSEFJTj15Cg== --------------060205090002040702080705-- From bfoster@redhat.com Wed Nov 12 15:00:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC32B7F3F for ; Wed, 12 Nov 2014 15:00:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C6E098F8035 for ; Wed, 12 Nov 2014 13:00:45 -0800 (PST) X-ASG-Debug-ID: 1415826036-04cb6c1e6c24d800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HE4wIP1KJs762CTZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Nov 2014 13:00:39 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sACL0a97028965 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 12 Nov 2014 16:00:36 -0500 Received: from laptop.bfoster (vpn-61-102.rdu2.redhat.com [10.10.61.102]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sACL0XiE004278 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Wed, 12 Nov 2014 16:00:35 -0500 Date: Wed, 12 Nov 2014 16:00:33 -0500 From: Brian Foster To: L Walsh Cc: xfs-oss Subject: Re: Fwd: multiple processes hanging doing xfs ops -- 3.17.2 Message-ID: <20141112210031.GA2657@laptop.bfoster> X-ASG-Orig-Subj: Re: Fwd: multiple processes hanging doing xfs ops -- 3.17.2 References: <5463BB52.3080601@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5463BB52.3080601@tlinx.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415826038 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Nov 12, 2014 at 11:56:02AM -0800, L Walsh wrote: > > > I just upped from 3.16.2 to 3.17.2 this morning, and after about 2 hours > uptime, got > several procs hanging in what looks like xfs territory. > > Watched load slowing climb to about 16 as I was trying to bring it down > 'gracefully'.. > > Last message looked like a disk controller message -- maybe it blocked other > processes, except sendmail should be running off a different controller > (built-in > controller handling system disks), while other procs would have been > accessing > 2nd controller -- actually it looks like xfsdump was trying to run too, > so it could have > been accessing both controllers (backup disks are on 2nd controller, but > if backing > up system disks...).. > > Attached are the call-traces from the hung tasks before the system came > down, > > > Also attached is my .config file. > > Looks a bit peculiar ... any ideas? > Everything appears to be blocked on AGI buffers, either via file creates or bulkstat (xfsdump). I don't see enough information to make sense of it. If you reproduce it again, it might be a good idea to 'echo w > /proc/sysrq-trigger' and include all of the output from the system log. Brian > > > > > > > > > > Nov 12 03:24:28 Ishtar kernel: [ 1123.562332] perf interrupt took too long (2502 > 2500), lowering kernel.perf_event_max_sample_rate to 50000 > Nov 12 04:41:46 Ishtar kernel: [ 5766.362637] INFO: task sendmail:38508 blocked for more than 120 seconds. > Nov 12 04:41:46 Ishtar kernel: [ 5766.369362] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:41:46 Ishtar kernel: [ 5766.373984] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:41:46 Ishtar kernel: [ 5766.381842] ffff880f221d7700 0000000000000046 ffff880a8f16a510 ffff880f221d7fd8 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381844] 00000000001d3b40 00000000001d3b40 ffff8817fbca4a20 ffff880a8f16a510 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381847] 7fffffffffffffff ffff880bf796d370 0000000000000002 0000000000000000 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381848] Call Trace: > Nov 12 04:41:46 Ishtar kernel: [ 5766.381856] [] schedule+0x24/0x70 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381859] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381863] [] ? local_clock+0x25/0x30 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381867] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381870] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381874] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381877] [] __down_common+0x9d/0xf0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381882] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381884] [] __down+0x18/0x1a > Nov 12 04:41:46 Ishtar kernel: [ 5766.381891] [] down+0x3c/0x50 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381899] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381903] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381907] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381911] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381916] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381922] [] xfs_read_agi+0x89/0x100 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381926] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381930] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381934] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381939] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381942] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381947] [] ? xfs_create+0x195/0x620 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381950] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381962] [] xfs_create+0x218/0x620 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381964] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381966] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381970] [] xfs_vn_create+0xe/0x10 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381975] [] vfs_create+0xc5/0x130 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381978] [] do_last+0xb96/0x1350 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381982] [] ? inode_permission+0x13/0x40 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381986] [] ? path_lookupat+0x750/0x7a0 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381990] [] path_openat+0xb9/0x690 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381994] [] ? local_clock+0x25/0x30 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381995] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:41:46 Ishtar kernel: [ 5766.381997] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382001] [] do_filp_open+0x35/0x80 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382004] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382008] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382014] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382017] [] do_sys_open+0x126/0x230 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382020] [] SyS_open+0x19/0x20 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382027] [] system_call_fastpath+0x16/0x1b > Nov 12 04:41:46 Ishtar kernel: [ 5766.382029] 4 locks held by sendmail/38508: > Nov 12 04:41:46 Ishtar kernel: [ 5766.382029] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382042] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382052] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:41:46 Ishtar kernel: [ 5766.382057] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:43:46 Ishtar kernel: [ 5886.496468] INFO: task xfsdump:38317 blocked for more than 120 seconds. > Nov 12 04:43:46 Ishtar kernel: [ 5886.503135] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:43:46 Ishtar kernel: [ 5886.507760] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:43:46 Ishtar kernel: [ 5886.515622] ffff880b6aec3920 0000000000000046 ffff880be75f0000 ffff880b6aec3fd8 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515625] 00000000001d3b40 00000000001d3b40 ffff8817fbca2510 ffff880be75f0000 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515627] 7fffffffffffffff ffff8817b03839f0 0000000000000002 0000000000000000 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515628] Call Trace: > Nov 12 04:43:46 Ishtar kernel: [ 5886.515637] [] schedule+0x24/0x70 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515640] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515646] [] ? local_clock+0x25/0x30 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515650] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515653] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515657] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515659] [] __down_common+0x9d/0xf0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515665] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515667] [] __down+0x18/0x1a > Nov 12 04:43:46 Ishtar kernel: [ 5886.515669] [] down+0x3c/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515672] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515675] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515680] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515682] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515685] [] xfs_trans_read_buf_map+0x1d9/0x520 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515688] [] xfs_read_agi+0x89/0x100 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515690] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515691] [] xfs_bulkstat+0x165/0x4e0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515693] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515695] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515703] [] ? xfs_bulkstat_one_int+0x310/0x310 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515708] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515713] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515719] [] ? security_capable+0x13/0x20 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515724] [] xfs_ioc_bulkstat+0xcc/0x1a0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515728] [] xfs_file_ioctl+0x82e/0xc20 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515733] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515739] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515743] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515748] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515753] [] ? fsnotify+0x223/0x330 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515758] [] ? fsnotify+0x7b/0x330 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515763] [] do_vfs_ioctl+0x2cc/0x4f0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515767] [] SyS_ioctl+0x81/0xa0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515772] [] system_call_fastpath+0x16/0x1b > Nov 12 04:43:46 Ishtar kernel: [ 5886.515775] no locks held by xfsdump/38317. > Nov 12 04:43:46 Ishtar kernel: [ 5886.515779] INFO: task sendmail:38508 blocked for more than 120 seconds. > Nov 12 04:43:46 Ishtar kernel: [ 5886.515782] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515784] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:43:46 Ishtar kernel: [ 5886.515795] ffff880f221d7700 0000000000000046 ffff880a8f16a510 ffff880f221d7fd8 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515796] 00000000001d3b40 00000000001d3b40 ffff8817fbca4a20 ffff880a8f16a510 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515798] 7fffffffffffffff ffff880bf796d370 0000000000000002 0000000000000000 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515798] Call Trace: > Nov 12 04:43:46 Ishtar kernel: [ 5886.515800] [] schedule+0x24/0x70 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515801] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515803] [] ? local_clock+0x25/0x30 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515804] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515806] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515807] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515809] [] __down_common+0x9d/0xf0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515810] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515812] [] __down+0x18/0x1a > Nov 12 04:43:46 Ishtar kernel: [ 5886.515813] [] down+0x3c/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515815] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515816] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515818] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515819] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515821] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515823] [] xfs_read_agi+0x89/0x100 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515824] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515826] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515828] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515830] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515831] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515833] [] ? xfs_create+0x195/0x620 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515834] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515835] [] xfs_create+0x218/0x620 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515837] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515839] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515840] [] xfs_vn_create+0xe/0x10 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515842] [] vfs_create+0xc5/0x130 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515843] [] do_last+0xb96/0x1350 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515845] [] ? inode_permission+0x13/0x40 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515846] [] ? path_lookupat+0x750/0x7a0 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515847] [] path_openat+0xb9/0x690 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515849] [] ? local_clock+0x25/0x30 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515850] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515852] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515854] [] do_filp_open+0x35/0x80 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515855] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515857] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515859] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515861] [] do_sys_open+0x126/0x230 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515863] [] SyS_open+0x19/0x20 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515864] [] system_call_fastpath+0x16/0x1b > Nov 12 04:43:46 Ishtar kernel: [ 5886.515865] 4 locks held by sendmail/38508: > Nov 12 04:43:46 Ishtar kernel: [ 5886.515870] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515873] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515876] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:43:46 Ishtar kernel: [ 5886.515879] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.630307] INFO: task nmbd:1954 blocked for more than 120 seconds. > Nov 12 04:45:46 Ishtar kernel: [ 6006.636592] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:45:46 Ishtar kernel: [ 6006.641251] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649141] ffff8817f92f3700 0000000000000046 ffff880bfa9b2510 ffff8817f92f3fd8 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649144] 00000000001d3b40 00000000001d3b40 ffffffff81c194c0 ffff880bfa9b2510 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649147] 7fffffffffffffff ffff880bf796d370 0000000000000002 0000000000000000 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649148] Call Trace: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649156] [] schedule+0x24/0x70 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649159] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649163] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649167] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649170] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649174] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649177] [] __down_common+0x9d/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649185] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649187] [] __down+0x18/0x1a > Nov 12 04:45:46 Ishtar kernel: [ 6006.649190] [] down+0x3c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649192] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649209] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649212] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649215] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649219] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649224] [] xfs_read_agi+0x89/0x100 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649226] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649229] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649235] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649241] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649245] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649249] [] ? xfs_create+0x195/0x620 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649257] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649263] [] xfs_create+0x218/0x620 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649271] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649284] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649289] [] xfs_vn_create+0xe/0x10 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649296] [] vfs_create+0xc5/0x130 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649301] [] do_last+0xb96/0x1350 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649308] [] ? inode_permission+0x13/0x40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649312] [] ? path_lookupat+0x751/0x7a0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649320] [] path_openat+0xb9/0x690 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649325] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649334] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649347] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649353] [] do_filp_open+0x35/0x80 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649359] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649364] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649371] [] do_sys_open+0x126/0x230 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649376] [] SyS_open+0x19/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649381] [] system_call_fastpath+0x16/0x1b > Nov 12 04:45:46 Ishtar kernel: [ 6006.649383] 4 locks held by nmbd/1954: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649385] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649404] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649409] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649414] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649426] INFO: task transmission-da:2496 blocked for more than 120 seconds. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649427] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649427] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649435] ffff8817f93d3700 0000000000000046 ffff8817f1de4a20 ffff8817f93d3fd8 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649438] 00000000001d3b40 00000000001d3b40 ffff8817fbc8a510 ffff8817f1de4a20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649450] 7fffffffffffffff ffff8817b03839f0 0000000000000002 0000000000000000 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649451] Call Trace: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649455] [] schedule+0x24/0x70 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649459] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649462] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649466] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649469] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649473] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649475] [] __down_common+0x9d/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649478] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649480] [] __down+0x18/0x1a > Nov 12 04:45:46 Ishtar kernel: [ 6006.649482] [] down+0x3c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649485] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649487] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649490] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649492] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649495] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649497] [] xfs_read_agi+0x89/0x100 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649500] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649503] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649505] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649507] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649510] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649512] [] ? xfs_create+0x195/0x620 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649515] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649517] [] xfs_create+0x218/0x620 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649520] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649522] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649524] [] xfs_vn_create+0xe/0x10 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649526] [] vfs_create+0xc5/0x130 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649529] [] do_last+0xb96/0x1350 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649531] [] ? inode_permission+0x13/0x40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649533] [] ? path_lookupat+0x751/0x7a0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649535] [] path_openat+0xb9/0x690 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649538] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649540] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649543] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649545] [] do_filp_open+0x35/0x80 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649548] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649550] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649552] [] do_sys_open+0x126/0x230 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649554] [] SyS_open+0x19/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649557] [] system_call_fastpath+0x16/0x1b > Nov 12 04:45:46 Ishtar kernel: [ 6006.649559] 4 locks held by transmission-da/2496: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649564] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649569] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649573] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649578] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649605] INFO: task xfsdump:38317 blocked for more than 120 seconds. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649606] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649607] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649615] ffff880b6aec3920 0000000000000046 ffff880be75f0000 ffff880b6aec3fd8 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649618] 00000000001d3b40 00000000001d3b40 ffff8817fbca2510 ffff880be75f0000 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649620] 7fffffffffffffff ffff8817b03839f0 0000000000000002 0000000000000000 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649621] Call Trace: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649624] [] schedule+0x24/0x70 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649626] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649628] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649630] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649633] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649636] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649638] [] __down_common+0x9d/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649641] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649643] [] __down+0x18/0x1a > Nov 12 04:45:46 Ishtar kernel: [ 6006.649645] [] down+0x3c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649647] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649650] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649652] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649655] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649657] [] xfs_trans_read_buf_map+0x1d9/0x520 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649660] [] xfs_read_agi+0x89/0x100 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649662] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649665] [] xfs_bulkstat+0x165/0x4e0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649668] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649670] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649673] [] ? xfs_bulkstat_one_int+0x310/0x310 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649675] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649678] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649681] [] ? security_capable+0x13/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649684] [] xfs_ioc_bulkstat+0xcc/0x1a0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649686] [] xfs_file_ioctl+0x82e/0xc20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649689] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649691] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649693] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649696] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649699] [] ? fsnotify+0x223/0x330 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649700] [] ? fsnotify+0x7b/0x330 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649704] [] do_vfs_ioctl+0x2cc/0x4f0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649706] [] SyS_ioctl+0x81/0xa0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649709] [] system_call_fastpath+0x16/0x1b > Nov 12 04:45:46 Ishtar kernel: [ 6006.649710] no locks held by xfsdump/38317. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649713] INFO: task sendmail:38508 blocked for more than 120 seconds. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649714] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649715] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:45:46 Ishtar kernel: [ 6006.649724] ffff880f221d7700 0000000000000046 ffff880a8f16a510 ffff880f221d7fd8 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649727] 00000000001d3b40 00000000001d3b40 ffff8817fbca4a20 ffff880a8f16a510 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649729] 7fffffffffffffff ffff880bf796d370 0000000000000002 0000000000000000 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649730] Call Trace: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649732] [] schedule+0x24/0x70 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649734] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649737] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649739] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649741] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649744] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649746] [] __down_common+0x9d/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649749] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649751] [] __down+0x18/0x1a > Nov 12 04:45:46 Ishtar kernel: [ 6006.649753] [] down+0x3c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649756] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649758] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649761] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649763] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649765] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649768] [] xfs_read_agi+0x89/0x100 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649771] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649773] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649776] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649778] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649780] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649783] [] ? xfs_create+0x195/0x620 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649785] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649788] [] xfs_create+0x218/0x620 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649790] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649793] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649795] [] xfs_vn_create+0xe/0x10 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649797] [] vfs_create+0xc5/0x130 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649799] [] do_last+0xb96/0x1350 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649801] [] ? inode_permission+0x13/0x40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649804] [] ? path_lookupat+0x750/0x7a0 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649806] [] path_openat+0xb9/0x690 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649808] [] ? local_clock+0x25/0x30 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649810] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649813] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649816] [] do_filp_open+0x35/0x80 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649818] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649820] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649823] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649825] [] do_sys_open+0x126/0x230 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649827] [] SyS_open+0x19/0x20 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649830] [] system_call_fastpath+0x16/0x1b > Nov 12 04:45:46 Ishtar kernel: [ 6006.649831] 4 locks held by sendmail/38508: > Nov 12 04:45:46 Ishtar kernel: [ 6006.649837] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649841] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649845] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:45:46 Ishtar kernel: [ 6006.649850] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.764259] INFO: task nmbd:1954 blocked for more than 120 seconds. > Nov 12 04:47:46 Ishtar kernel: [ 6126.770548] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:47:46 Ishtar kernel: [ 6126.775199] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:47:46 Ishtar kernel: [ 6126.783082] ffff8817f92f3700 0000000000000046 ffff880bfa9b2510 ffff8817f92f3fd8 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783085] 00000000001d3b40 00000000001d3b40 ffffffff81c194c0 ffff880bfa9b2510 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783087] 7fffffffffffffff ffff880bf796d370 0000000000000002 0000000000000000 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783088] Call Trace: > Nov 12 04:47:46 Ishtar kernel: [ 6126.783096] [] schedule+0x24/0x70 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783099] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783103] [] ? local_clock+0x25/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783107] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783110] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783114] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783117] [] __down_common+0x9d/0xf0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783122] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783124] [] __down+0x18/0x1a > Nov 12 04:47:46 Ishtar kernel: [ 6126.783127] [] down+0x3c/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783129] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783132] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783135] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783151] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783155] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783160] [] xfs_read_agi+0x89/0x100 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783163] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783166] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783169] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783176] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783183] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783192] [] ? xfs_create+0x195/0x620 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783199] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783204] [] xfs_create+0x218/0x620 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783211] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783221] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783232] [] xfs_vn_create+0xe/0x10 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783240] [] vfs_create+0xc5/0x130 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783244] [] do_last+0xb96/0x1350 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783252] [] ? inode_permission+0x13/0x40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783257] [] ? path_lookupat+0x751/0x7a0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783264] [] path_openat+0xb9/0x690 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783268] [] ? local_clock+0x25/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783275] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783280] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783293] [] do_filp_open+0x35/0x80 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783299] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783305] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783312] [] do_sys_open+0x126/0x230 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783320] [] SyS_open+0x19/0x20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783326] [] system_call_fastpath+0x16/0x1b > Nov 12 04:47:46 Ishtar kernel: [ 6126.783329] 4 locks held by nmbd/1954: > Nov 12 04:47:46 Ishtar kernel: [ 6126.783332] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783359] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783365] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783370] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783382] INFO: task transmission-da:2496 blocked for more than 120 seconds. > Nov 12 04:47:46 Ishtar kernel: [ 6126.783383] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783384] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:47:46 Ishtar kernel: [ 6126.783392] ffff8817f93d3700 0000000000000046 ffff8817f1de4a20 ffff8817f93d3fd8 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783395] 00000000001d3b40 00000000001d3b40 ffff8817fbc8a510 ffff8817f1de4a20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783407] 7fffffffffffffff ffff8817b03839f0 0000000000000002 0000000000000000 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783409] Call Trace: > Nov 12 04:47:46 Ishtar kernel: [ 6126.783413] [] schedule+0x24/0x70 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783417] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783421] [] ? local_clock+0x25/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783425] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783428] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783433] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783435] [] __down_common+0x9d/0xf0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783438] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783440] [] __down+0x18/0x1a > Nov 12 04:47:46 Ishtar kernel: [ 6126.783443] [] down+0x3c/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783445] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783448] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783451] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783454] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783456] [] xfs_trans_read_buf_map+0x296/0x520 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783459] [] xfs_read_agi+0x89/0x100 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783462] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783465] [] xfs_dialloc+0xc8/0x270 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783467] [] ? kmem_zone_alloc+0xc1/0xf0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783470] [] xfs_ialloc+0x4d/0x510 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783473] [] xfs_dir_ialloc+0x56/0x260 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783475] [] ? xfs_create+0x195/0x620 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783478] [] ? xfs_ilock+0xea/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783480] [] xfs_create+0x218/0x620 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783483] [] xfs_generic_create+0xc0/0x220 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783486] [] xfs_vn_mknod+0xf/0x20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783488] [] xfs_vn_create+0xe/0x10 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783491] [] vfs_create+0xc5/0x130 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783493] [] do_last+0xb96/0x1350 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783495] [] ? inode_permission+0x13/0x40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783498] [] ? path_lookupat+0x751/0x7a0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783500] [] path_openat+0xb9/0x690 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783503] [] ? local_clock+0x25/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783505] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783508] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783511] [] do_filp_open+0x35/0x80 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783513] [] ? _raw_spin_unlock+0x2c/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783516] [] ? __alloc_fd+0x10f/0x140 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783518] [] do_sys_open+0x126/0x230 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783521] [] SyS_open+0x19/0x20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783523] [] system_call_fastpath+0x16/0x1b > Nov 12 04:47:46 Ishtar kernel: [ 6126.783525] 4 locks held by transmission-da/2496: > Nov 12 04:47:46 Ishtar kernel: [ 6126.783531] #0: (sb_writers#3){......}, at: [] mnt_want_write+0x1f/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783536] #1: (&type->i_mutex_dir_key){......}, at: [] do_last+0x2c8/0x1350 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783540] #2: (sb_internal){......}, at: [] xfs_trans_alloc+0x1f/0x40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783546] #3: (&xfs_dir_ilock_class/1){......}, at: [] xfs_ilock+0xea/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783576] INFO: task xfsdump:38317 blocked for more than 120 seconds. > Nov 12 04:47:46 Ishtar kernel: [ 6126.783577] Not tainted 3.17.2-Isht-Van #1 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783578] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > Nov 12 04:47:46 Ishtar kernel: [ 6126.783587] ffff880b6aec3920 0000000000000046 ffff880be75f0000 ffff880b6aec3fd8 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783589] 00000000001d3b40 00000000001d3b40 ffff8817fbca2510 ffff880be75f0000 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783592] 7fffffffffffffff ffff8817b03839f0 0000000000000002 0000000000000000 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783593] Call Trace: > Nov 12 04:47:46 Ishtar kernel: [ 6126.783595] [] schedule+0x24/0x70 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783598] [] schedule_timeout+0x239/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783600] [] ? local_clock+0x25/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783603] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783606] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783608] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783611] [] __down_common+0x9d/0xf0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783614] [] ? _xfs_buf_find+0x165/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783616] [] __down+0x18/0x1a > Nov 12 04:47:46 Ishtar kernel: [ 6126.783618] [] down+0x3c/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783621] [] xfs_buf_lock+0x37/0x110 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783624] [] _xfs_buf_find+0x165/0x2c0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783626] [] xfs_buf_get_map+0x25/0x200 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783629] [] xfs_buf_read_map+0x27/0x170 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783632] [] xfs_trans_read_buf_map+0x1d9/0x520 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783634] [] xfs_read_agi+0x89/0x100 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783637] [] xfs_ialloc_read_agi+0x2f/0xd0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783640] [] xfs_bulkstat+0x165/0x4e0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783643] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783646] [] ? __lock_acquire.isra.31+0x2a4/0xa40 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783648] [] ? xfs_bulkstat_one_int+0x310/0x310 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783651] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783654] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783658] [] ? security_capable+0x13/0x20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783660] [] xfs_ioc_bulkstat+0xcc/0x1a0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783663] [] xfs_file_ioctl+0x82e/0xc20 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783665] [] ? get_parent_ip+0xd/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783668] [] ? preempt_count_sub+0x41/0x50 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783671] [] ? put_lock_stats.isra.23+0xe/0x30 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783673] [] ? lock_release_holdtime.part.24+0x13e/0x190 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783676] [] ? fsnotify+0x223/0x330 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783678] [] ? fsnotify+0x7b/0x330 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783682] [] do_vfs_ioctl+0x2cc/0x4f0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783684] [] SyS_ioctl+0x81/0xa0 > Nov 12 04:47:46 Ishtar kernel: [ 6126.783687] [] system_call_fastpath+0x16/0x1b > Nov 12 04:47:46 Ishtar kernel: [ 6126.783689] no locks held by xfsdump/38317. > Nov 12 05:06:00 Ishtar xinetd[1985]: Exiting... > Nov 12 05:06:00 Ishtar winbindd[2498]: [2014/11/12 05:06:00, 0] winbindd/winbindd.c:212(winbindd_sig_term_handler) > Nov 12 05:06:00 Ishtar winbindd[2498]: Got sig[15] terminate (is_parent=1) > Nov 12 05:15:49 Ishtar mcelog: Kernel does not support page offline interface > Nov 12 05:15:50 Ishtar xinetd[2048]: /etc/xinetd.d/RCS is not a regular file. It is being skipped. > Nov 12 05:15:51 Ishtar xinetd[2048]: Server /usr/sbin/saned is not executable [file=/etc/xinetd.d/sane-port] [line=12] > Nov 12 05:15:51 Ishtar xinetd[2048]: Error parsing attribute server - DISABLING SERVICE [file=/etc/xinetd.d/sane-port] [line=12] > Nov 12 05:15:51 Ishtar kernel: [ 26.949991] ip (1562) used greatest stack depth: 11144 bytes left > Nov 12 05:15:51 Ishtar kernel: [ 30.122459] , receive & transmit flow control ON > Nov 12 05:15:52 Ishtar named[2316]: using built-in DLV key for view external > Nov 12 05:15:52 Ishtar named[2316]: using built-in root key for view external > Nov 12 05:15:52 Ishtar named[2316]: using built-in DLV key for view internal > Nov 12 05:15:52 Ishtar named[2316]: using built-in root key for view internal > Nov 12 05:15:52 Ishtar named[2316]: the working directory is not writable > Nov 12 05:15:54 Ishtar MR_MONITOR[1463]: Controller ID: 1 PD Reset: PD = -:-:21, Critical = 3, Path = 0x5002408078D76A00 > # > # Automatically generated file; DO NOT EDIT. > # Linux/x86 3.17.2 Kernel Configuration > # > CONFIG_64BIT=y > CONFIG_X86_64=y > CONFIG_X86=y > CONFIG_INSTRUCTION_DECODER=y > CONFIG_OUTPUT_FORMAT="elf64-x86-64" > CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" > CONFIG_LOCKDEP_SUPPORT=y > CONFIG_STACKTRACE_SUPPORT=y > CONFIG_HAVE_LATENCYTOP_SUPPORT=y > CONFIG_MMU=y > CONFIG_NEED_DMA_MAP_STATE=y > CONFIG_NEED_SG_DMA_LENGTH=y > CONFIG_GENERIC_ISA_DMA=y > CONFIG_GENERIC_BUG=y > CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y > CONFIG_GENERIC_HWEIGHT=y > CONFIG_ARCH_MAY_HAVE_PC_FDC=y > CONFIG_RWSEM_XCHGADD_ALGORITHM=y > CONFIG_GENERIC_CALIBRATE_DELAY=y > CONFIG_ARCH_HAS_CPU_RELAX=y > CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y > CONFIG_HAVE_SETUP_PER_CPU_AREA=y > CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y > CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y > CONFIG_ARCH_HIBERNATION_POSSIBLE=y > CONFIG_ARCH_SUSPEND_POSSIBLE=y > CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y > CONFIG_ARCH_WANT_GENERAL_HUGETLB=y > CONFIG_ZONE_DMA32=y > CONFIG_AUDIT_ARCH=y > CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y > CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y > CONFIG_HAVE_INTEL_TXT=y > CONFIG_X86_64_SMP=y > CONFIG_X86_HT=y > CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11" > CONFIG_ARCH_SUPPORTS_UPROBES=y > CONFIG_FIX_EARLYCON_MEM=y > CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" > CONFIG_IRQ_WORK=y > CONFIG_BUILDTIME_EXTABLE_SORT=y > > # > # General setup > # > CONFIG_INIT_ENV_ARG_LIMIT=32 > CONFIG_CROSS_COMPILE="" > # CONFIG_COMPILE_TEST is not set > CONFIG_LOCALVERSION="-Isht-Van" > # CONFIG_LOCALVERSION_AUTO is not set > CONFIG_HAVE_KERNEL_GZIP=y > CONFIG_HAVE_KERNEL_BZIP2=y > CONFIG_HAVE_KERNEL_LZMA=y > CONFIG_HAVE_KERNEL_XZ=y > CONFIG_HAVE_KERNEL_LZO=y > CONFIG_HAVE_KERNEL_LZ4=y > # CONFIG_KERNEL_GZIP is not set > # CONFIG_KERNEL_BZIP2 is not set > # CONFIG_KERNEL_LZMA is not set > # CONFIG_KERNEL_XZ is not set > # CONFIG_KERNEL_LZO is not set > CONFIG_KERNEL_LZ4=y > CONFIG_DEFAULT_HOSTNAME="Ishtar" > CONFIG_SWAP=y > CONFIG_SYSVIPC=y > CONFIG_SYSVIPC_SYSCTL=y > CONFIG_POSIX_MQUEUE=y > CONFIG_POSIX_MQUEUE_SYSCTL=y > CONFIG_CROSS_MEMORY_ATTACH=y > CONFIG_FHANDLE=y > CONFIG_USELIB=y > CONFIG_AUDIT=y > CONFIG_HAVE_ARCH_AUDITSYSCALL=y > CONFIG_AUDITSYSCALL=y > CONFIG_AUDIT_WATCH=y > CONFIG_AUDIT_TREE=y > > # > # IRQ subsystem > # > CONFIG_GENERIC_IRQ_PROBE=y > CONFIG_GENERIC_IRQ_SHOW=y > CONFIG_GENERIC_IRQ_LEGACY_ALLOC_HWIRQ=y > CONFIG_GENERIC_PENDING_IRQ=y > CONFIG_IRQ_DOMAIN=y > CONFIG_IRQ_DOMAIN_DEBUG=y > CONFIG_IRQ_FORCED_THREADING=y > CONFIG_SPARSE_IRQ=y > CONFIG_CLOCKSOURCE_WATCHDOG=y > CONFIG_ARCH_CLOCKSOURCE_DATA=y > CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y > CONFIG_GENERIC_TIME_VSYSCALL=y > CONFIG_GENERIC_CLOCKEVENTS=y > CONFIG_GENERIC_CLOCKEVENTS_BUILD=y > CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y > CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y > CONFIG_GENERIC_CMOS_UPDATE=y > > # > # Timers subsystem > # > CONFIG_TICK_ONESHOT=y > CONFIG_NO_HZ_COMMON=y > # CONFIG_HZ_PERIODIC is not set > CONFIG_NO_HZ_IDLE=y > # CONFIG_NO_HZ_FULL is not set > CONFIG_NO_HZ=y > CONFIG_HIGH_RES_TIMERS=y > > # > # CPU/Task time and stats accounting > # > CONFIG_TICK_CPU_ACCOUNTING=y > # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set > # CONFIG_IRQ_TIME_ACCOUNTING is not set > CONFIG_BSD_PROCESS_ACCT=y > CONFIG_BSD_PROCESS_ACCT_V3=y > CONFIG_TASKSTATS=y > CONFIG_TASK_DELAY_ACCT=y > CONFIG_TASK_XACCT=y > CONFIG_TASK_IO_ACCOUNTING=y > > # > # RCU Subsystem > # > CONFIG_TREE_PREEMPT_RCU=y > CONFIG_PREEMPT_RCU=y > CONFIG_RCU_STALL_COMMON=y > # CONFIG_RCU_USER_QS is not set > CONFIG_RCU_FANOUT=64 > CONFIG_RCU_FANOUT_LEAF=16 > # CONFIG_RCU_FANOUT_EXACT is not set > # CONFIG_RCU_FAST_NO_HZ is not set > # CONFIG_TREE_RCU_TRACE is not set > CONFIG_RCU_BOOST=y > CONFIG_RCU_BOOST_PRIO=1 > CONFIG_RCU_BOOST_DELAY=500 > # CONFIG_RCU_NOCB_CPU is not set > CONFIG_BUILD_BIN2C=y > CONFIG_IKCONFIG=y > CONFIG_IKCONFIG_PROC=y > CONFIG_LOG_BUF_SHIFT=19 > CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 > CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y > CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y > CONFIG_ARCH_SUPPORTS_INT128=y > CONFIG_ARCH_WANTS_PROT_NUMA_PROT_NONE=y > CONFIG_ARCH_USES_NUMA_PROT_NONE=y > CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y > CONFIG_NUMA_BALANCING=y > CONFIG_CGROUPS=y > CONFIG_CGROUP_DEBUG=y > CONFIG_CGROUP_FREEZER=y > CONFIG_CGROUP_DEVICE=y > CONFIG_CPUSETS=y > CONFIG_PROC_PID_CPUSET=y > CONFIG_CGROUP_CPUACCT=y > CONFIG_RESOURCE_COUNTERS=y > CONFIG_MEMCG=y > CONFIG_MEMCG_SWAP=y > CONFIG_MEMCG_SWAP_ENABLED=y > CONFIG_MEMCG_KMEM=y > # CONFIG_CGROUP_HUGETLB is not set > # CONFIG_CGROUP_PERF is not set > CONFIG_CGROUP_SCHED=y > CONFIG_FAIR_GROUP_SCHED=y > CONFIG_CFS_BANDWIDTH=y > CONFIG_RT_GROUP_SCHED=y > CONFIG_BLK_CGROUP=y > CONFIG_DEBUG_BLK_CGROUP=y > CONFIG_CHECKPOINT_RESTORE=y > CONFIG_NAMESPACES=y > CONFIG_UTS_NS=y > CONFIG_IPC_NS=y > CONFIG_USER_NS=y > CONFIG_PID_NS=y > CONFIG_NET_NS=y > CONFIG_SCHED_AUTOGROUP=y > # CONFIG_SYSFS_DEPRECATED is not set > CONFIG_RELAY=y > # CONFIG_BLK_DEV_INITRD is not set > # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set > CONFIG_SYSCTL=y > CONFIG_ANON_INODES=y > CONFIG_HAVE_UID16=y > CONFIG_SYSCTL_EXCEPTION_TRACE=y > CONFIG_HAVE_PCSPKR_PLATFORM=y > CONFIG_EXPERT=y > # CONFIG_UID16 is not set > CONFIG_SGETMASK_SYSCALL=y > CONFIG_SYSFS_SYSCALL=y > # CONFIG_SYSCTL_SYSCALL is not set > CONFIG_KALLSYMS=y > CONFIG_KALLSYMS_ALL=y > CONFIG_PRINTK=y > CONFIG_BUG=y > CONFIG_ELF_CORE=y > CONFIG_PCSPKR_PLATFORM=y > CONFIG_BASE_FULL=y > CONFIG_FUTEX=y > CONFIG_EPOLL=y > CONFIG_SIGNALFD=y > CONFIG_TIMERFD=y > CONFIG_EVENTFD=y > CONFIG_SHMEM=y > CONFIG_AIO=y > CONFIG_PCI_QUIRKS=y > # CONFIG_EMBEDDED is not set > CONFIG_HAVE_PERF_EVENTS=y > > # > # Kernel Performance Events And Counters > # > CONFIG_PERF_EVENTS=y > # CONFIG_DEBUG_PERF_USE_VMALLOC is not set > CONFIG_VM_EVENT_COUNTERS=y > CONFIG_SLUB_DEBUG=y > CONFIG_COMPAT_BRK=y > # CONFIG_SLAB is not set > CONFIG_SLUB=y > # CONFIG_SLOB is not set > CONFIG_SLUB_CPU_PARTIAL=y > # CONFIG_SYSTEM_TRUSTED_KEYRING is not set > # CONFIG_PROFILING is not set > CONFIG_TRACEPOINTS=y > CONFIG_HAVE_OPROFILE=y > CONFIG_OPROFILE_NMI_TIMER=y > CONFIG_KPROBES=y > CONFIG_JUMP_LABEL=y > CONFIG_UPROBES=y > # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set > CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y > CONFIG_ARCH_USE_BUILTIN_BSWAP=y > CONFIG_KRETPROBES=y > CONFIG_USER_RETURN_NOTIFIER=y > CONFIG_HAVE_IOREMAP_PROT=y > CONFIG_HAVE_KPROBES=y > CONFIG_HAVE_KRETPROBES=y > CONFIG_HAVE_OPTPROBES=y > CONFIG_HAVE_KPROBES_ON_FTRACE=y > CONFIG_HAVE_ARCH_TRACEHOOK=y > CONFIG_HAVE_DMA_ATTRS=y > CONFIG_HAVE_DMA_CONTIGUOUS=y > CONFIG_GENERIC_SMP_IDLE_THREAD=y > CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y > CONFIG_HAVE_DMA_API_DEBUG=y > CONFIG_HAVE_HW_BREAKPOINT=y > CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y > CONFIG_HAVE_USER_RETURN_NOTIFIER=y > CONFIG_HAVE_PERF_EVENTS_NMI=y > CONFIG_HAVE_PERF_REGS=y > CONFIG_HAVE_PERF_USER_STACK_DUMP=y > CONFIG_HAVE_ARCH_JUMP_LABEL=y > CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y > CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y > CONFIG_HAVE_CMPXCHG_LOCAL=y > CONFIG_HAVE_CMPXCHG_DOUBLE=y > CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y > CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y > CONFIG_HAVE_ARCH_SECCOMP_FILTER=y > CONFIG_SECCOMP_FILTER=y > CONFIG_HAVE_CC_STACKPROTECTOR=y > # CONFIG_CC_STACKPROTECTOR is not set > CONFIG_CC_STACKPROTECTOR_NONE=y > # CONFIG_CC_STACKPROTECTOR_REGULAR is not set > # CONFIG_CC_STACKPROTECTOR_STRONG is not set > CONFIG_HAVE_CONTEXT_TRACKING=y > CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y > CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y > CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y > CONFIG_HAVE_ARCH_SOFT_DIRTY=y > CONFIG_MODULES_USE_ELF_RELA=y > CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y > CONFIG_OLD_SIGSUSPEND3=y > CONFIG_COMPAT_OLD_SIGACTION=y > > # > # GCOV-based kernel profiling > # > # CONFIG_GCOV_KERNEL is not set > # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set > CONFIG_SLABINFO=y > CONFIG_RT_MUTEXES=y > CONFIG_BASE_SMALL=0 > CONFIG_MODULES=y > # CONFIG_MODULE_FORCE_LOAD is not set > CONFIG_MODULE_UNLOAD=y > # CONFIG_MODULE_FORCE_UNLOAD is not set > CONFIG_MODVERSIONS=y > # CONFIG_MODULE_SRCVERSION_ALL is not set > # CONFIG_MODULE_SIG is not set > CONFIG_STOP_MACHINE=y > CONFIG_BLOCK=y > CONFIG_BLK_DEV_BSG=y > CONFIG_BLK_DEV_BSGLIB=y > CONFIG_BLK_DEV_INTEGRITY=y > CONFIG_BLK_DEV_THROTTLING=y > # CONFIG_BLK_CMDLINE_PARSER is not set > > # > # Partition Types > # > CONFIG_PARTITION_ADVANCED=y > # CONFIG_ACORN_PARTITION is not set > # CONFIG_AIX_PARTITION is not set > # CONFIG_OSF_PARTITION is not set > # CONFIG_AMIGA_PARTITION is not set > # CONFIG_ATARI_PARTITION is not set > # CONFIG_MAC_PARTITION is not set > CONFIG_MSDOS_PARTITION=y > # CONFIG_BSD_DISKLABEL is not set > # CONFIG_MINIX_SUBPARTITION is not set > # CONFIG_SOLARIS_X86_PARTITION is not set > # CONFIG_UNIXWARE_DISKLABEL is not set > CONFIG_LDM_PARTITION=y > # CONFIG_LDM_DEBUG is not set > # CONFIG_SGI_PARTITION is not set > # CONFIG_ULTRIX_PARTITION is not set > # CONFIG_SUN_PARTITION is not set > # CONFIG_KARMA_PARTITION is not set > CONFIG_EFI_PARTITION=y > # CONFIG_SYSV68_PARTITION is not set > # CONFIG_CMDLINE_PARTITION is not set > CONFIG_BLOCK_COMPAT=y > > # > # IO Schedulers > # > CONFIG_IOSCHED_NOOP=y > CONFIG_IOSCHED_DEADLINE=y > CONFIG_IOSCHED_CFQ=y > CONFIG_CFQ_GROUP_IOSCHED=y > CONFIG_DEFAULT_DEADLINE=y > # CONFIG_DEFAULT_CFQ is not set > # CONFIG_DEFAULT_NOOP is not set > CONFIG_DEFAULT_IOSCHED="deadline" > CONFIG_PREEMPT_NOTIFIERS=y > CONFIG_UNINLINE_SPIN_UNLOCK=y > CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y > CONFIG_RWSEM_SPIN_ON_OWNER=y > CONFIG_ARCH_USE_QUEUE_RWLOCK=y > CONFIG_QUEUE_RWLOCK=y > CONFIG_FREEZER=y > > # > # Processor type and features > # > CONFIG_ZONE_DMA=y > CONFIG_SMP=y > CONFIG_X86_X2APIC=y > # CONFIG_X86_MPPARSE is not set > # CONFIG_X86_EXTENDED_PLATFORM is not set > # CONFIG_X86_INTEL_LPSS is not set > CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y > # CONFIG_SCHED_OMIT_FRAME_POINTER is not set > # CONFIG_HYPERVISOR_GUEST is not set > CONFIG_NO_BOOTMEM=y > # CONFIG_MEMTEST is not set > # CONFIG_MK8 is not set > # CONFIG_MPSC is not set > CONFIG_MCORE2=y > # CONFIG_MATOM is not set > # CONFIG_GENERIC_CPU is not set > CONFIG_X86_INTERNODE_CACHE_SHIFT=6 > CONFIG_X86_L1_CACHE_SHIFT=6 > CONFIG_X86_INTEL_USERCOPY=y > CONFIG_X86_USE_PPRO_CHECKSUM=y > CONFIG_X86_P6_NOP=y > CONFIG_X86_TSC=y > CONFIG_X86_CMPXCHG64=y > CONFIG_X86_CMOV=y > CONFIG_X86_MINIMUM_CPU_FAMILY=64 > CONFIG_X86_DEBUGCTLMSR=y > CONFIG_PROCESSOR_SELECT=y > CONFIG_CPU_SUP_INTEL=y > # CONFIG_CPU_SUP_AMD is not set > # CONFIG_CPU_SUP_CENTAUR is not set > CONFIG_HPET_TIMER=y > CONFIG_HPET_EMULATE_RTC=y > CONFIG_DMI=y > # CONFIG_CALGARY_IOMMU is not set > CONFIG_SWIOTLB=y > CONFIG_IOMMU_HELPER=y > # CONFIG_MAXSMP is not set > CONFIG_NR_CPUS=12 > # CONFIG_SCHED_SMT is not set > CONFIG_SCHED_MC=y > # CONFIG_PREEMPT_NONE is not set > # CONFIG_PREEMPT_VOLUNTARY is not set > CONFIG_PREEMPT=y > CONFIG_PREEMPT_COUNT=y > CONFIG_X86_LOCAL_APIC=y > CONFIG_X86_IO_APIC=y > CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y > CONFIG_X86_MCE=y > CONFIG_X86_MCE_INTEL=y > # CONFIG_X86_MCE_AMD is not set > CONFIG_X86_MCE_THRESHOLD=y > # CONFIG_X86_MCE_INJECT is not set > CONFIG_X86_THERMAL_VECTOR=y > # CONFIG_X86_16BIT is not set > # CONFIG_I8K is not set > CONFIG_MICROCODE=y > CONFIG_MICROCODE_INTEL=y > # CONFIG_MICROCODE_AMD is not set > CONFIG_MICROCODE_OLD_INTERFACE=y > # CONFIG_MICROCODE_INTEL_EARLY is not set > # CONFIG_MICROCODE_AMD_EARLY is not set > CONFIG_X86_MSR=y > CONFIG_X86_CPUID=y > CONFIG_ARCH_PHYS_ADDR_T_64BIT=y > CONFIG_ARCH_DMA_ADDR_T_64BIT=y > CONFIG_DIRECT_GBPAGES=y > CONFIG_NUMA=y > # CONFIG_AMD_NUMA is not set > CONFIG_X86_64_ACPI_NUMA=y > CONFIG_NODES_SPAN_OTHER_NODES=y > # CONFIG_NUMA_EMU is not set > CONFIG_NODES_SHIFT=2 > CONFIG_ARCH_SPARSEMEM_ENABLE=y > CONFIG_ARCH_SPARSEMEM_DEFAULT=y > CONFIG_ARCH_SELECT_MEMORY_MODEL=y > CONFIG_ARCH_PROC_KCORE_TEXT=y > CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 > CONFIG_SELECT_MEMORY_MODEL=y > CONFIG_SPARSEMEM_MANUAL=y > CONFIG_SPARSEMEM=y > CONFIG_NEED_MULTIPLE_NODES=y > CONFIG_HAVE_MEMORY_PRESENT=y > CONFIG_SPARSEMEM_EXTREME=y > CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y > CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y > CONFIG_SPARSEMEM_VMEMMAP=y > CONFIG_HAVE_MEMBLOCK=y > CONFIG_HAVE_MEMBLOCK_NODE_MAP=y > CONFIG_ARCH_DISCARD_MEMBLOCK=y > CONFIG_MEMORY_ISOLATION=y > # CONFIG_MOVABLE_NODE is not set > # CONFIG_HAVE_BOOTMEM_INFO_NODE is not set > # CONFIG_MEMORY_HOTPLUG is not set > CONFIG_PAGEFLAGS_EXTENDED=y > CONFIG_SPLIT_PTLOCK_CPUS=4 > CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y > CONFIG_BALLOON_COMPACTION=y > CONFIG_COMPACTION=y > CONFIG_MIGRATION=y > CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y > CONFIG_PHYS_ADDR_T_64BIT=y > CONFIG_ZONE_DMA_FLAG=1 > CONFIG_BOUNCE=y > CONFIG_NEED_BOUNCE_POOL=y > CONFIG_VIRT_TO_BUS=y > CONFIG_MMU_NOTIFIER=y > CONFIG_KSM=y > CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 > CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y > CONFIG_MEMORY_FAILURE=y > # CONFIG_HWPOISON_INJECT is not set > CONFIG_TRANSPARENT_HUGEPAGE=y > # CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS is not set > CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y > CONFIG_CLEANCACHE=y > CONFIG_FRONTSWAP=y > CONFIG_CMA=y > # CONFIG_CMA_DEBUG is not set > CONFIG_CMA_AREAS=7 > # CONFIG_MEM_SOFT_DIRTY is not set > # CONFIG_ZSWAP is not set > # CONFIG_ZPOOL is not set > # CONFIG_ZBUD is not set > # CONFIG_ZSMALLOC is not set > CONFIG_GENERIC_EARLY_IOREMAP=y > # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set > CONFIG_X86_RESERVE_LOW=4 > CONFIG_MTRR=y > CONFIG_MTRR_SANITIZER=y > CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 > CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 > CONFIG_X86_PAT=y > CONFIG_ARCH_USES_PG_UNCACHED=y > CONFIG_ARCH_RANDOM=y > # CONFIG_X86_SMAP is not set > CONFIG_EFI=y > CONFIG_EFI_STUB=y > # CONFIG_EFI_MIXED is not set > CONFIG_SECCOMP=y > # CONFIG_HZ_100 is not set > # CONFIG_HZ_250 is not set > # CONFIG_HZ_300 is not set > CONFIG_HZ_1000=y > CONFIG_HZ=1000 > CONFIG_SCHED_HRTICK=y > CONFIG_KEXEC=y > CONFIG_KEXEC_FILE=y > # CONFIG_KEXEC_VERIFY_SIG is not set > CONFIG_CRASH_DUMP=y > CONFIG_PHYSICAL_START=0x200000 > CONFIG_RELOCATABLE=y > # CONFIG_RANDOMIZE_BASE is not set > CONFIG_PHYSICAL_ALIGN=0x1000000 > CONFIG_HOTPLUG_CPU=y > # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set > # CONFIG_DEBUG_HOTPLUG_CPU0 is not set > # CONFIG_COMPAT_VDSO is not set > CONFIG_CMDLINE_BOOL=y > CONFIG_CMDLINE="reboot=bios" > # CONFIG_CMDLINE_OVERRIDE is not set > CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y > CONFIG_USE_PERCPU_NUMA_NODE_ID=y > > # > # Power management and ACPI options > # > # CONFIG_SUSPEND is not set > # CONFIG_HIBERNATION is not set > CONFIG_PM_RUNTIME=y > CONFIG_PM=y > CONFIG_PM_DEBUG=y > # CONFIG_PM_ADVANCED_DEBUG is not set > # CONFIG_DPM_WATCHDOG is not set > CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y > CONFIG_ACPI=y > CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y > CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y > # CONFIG_ACPI_PROCFS_POWER is not set > # CONFIG_ACPI_EC_DEBUGFS is not set > # CONFIG_ACPI_AC is not set > # CONFIG_ACPI_BATTERY is not set > CONFIG_ACPI_BUTTON=m > # CONFIG_ACPI_FAN is not set > # CONFIG_ACPI_DOCK is not set > CONFIG_ACPI_PROCESSOR=m > CONFIG_ACPI_IPMI=m > CONFIG_ACPI_HOTPLUG_CPU=y > CONFIG_ACPI_PROCESSOR_AGGREGATOR=m > CONFIG_ACPI_THERMAL=m > CONFIG_ACPI_NUMA=y > # CONFIG_ACPI_CUSTOM_DSDT is not set > CONFIG_ACPI_DEBUG=y > CONFIG_ACPI_PCI_SLOT=y > CONFIG_X86_PM_TIMER=y > CONFIG_ACPI_CONTAINER=y > # CONFIG_ACPI_SBS is not set > CONFIG_ACPI_HED=y > CONFIG_ACPI_CUSTOM_METHOD=m > CONFIG_ACPI_BGRT=y > # CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set > CONFIG_HAVE_ACPI_APEI=y > CONFIG_HAVE_ACPI_APEI_NMI=y > CONFIG_ACPI_APEI=y > CONFIG_ACPI_APEI_GHES=y > CONFIG_ACPI_APEI_PCIEAER=y > CONFIG_ACPI_APEI_MEMORY_FAILURE=y > # CONFIG_ACPI_APEI_EINJ is not set > # CONFIG_ACPI_APEI_ERST_DEBUG is not set > CONFIG_ACPI_EXTLOG=m > # CONFIG_SFI is not set > > # > # CPU Frequency scaling > # > CONFIG_CPU_FREQ=y > CONFIG_CPU_FREQ_GOV_COMMON=y > CONFIG_CPU_FREQ_STAT=m > CONFIG_CPU_FREQ_STAT_DETAILS=y > # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set > # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set > # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set > CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y > # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set > CONFIG_CPU_FREQ_GOV_PERFORMANCE=y > CONFIG_CPU_FREQ_GOV_POWERSAVE=m > CONFIG_CPU_FREQ_GOV_USERSPACE=m > CONFIG_CPU_FREQ_GOV_ONDEMAND=y > # CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set > > # > # x86 CPU frequency scaling drivers > # > # CONFIG_X86_INTEL_PSTATE is not set > # CONFIG_X86_PCC_CPUFREQ is not set > CONFIG_X86_ACPI_CPUFREQ=m > # CONFIG_X86_POWERNOW_K8 is not set > # CONFIG_X86_SPEEDSTEP_CENTRINO is not set > # CONFIG_X86_P4_CLOCKMOD is not set > > # > # shared options > # > # CONFIG_X86_SPEEDSTEP_LIB is not set > > # > # CPU Idle > # > CONFIG_CPU_IDLE=y > # CONFIG_CPU_IDLE_GOV_LADDER is not set > CONFIG_CPU_IDLE_GOV_MENU=y > # CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set > CONFIG_INTEL_IDLE=y > > # > # Memory power savings > # > CONFIG_I7300_IDLE_IOAT_CHANNEL=y > CONFIG_I7300_IDLE=y > > # > # Bus options (PCI etc.) > # > CONFIG_PCI=y > CONFIG_PCI_DIRECT=y > CONFIG_PCI_MMCONFIG=y > CONFIG_PCI_DOMAINS=y > # CONFIG_PCI_CNB20LE_QUIRK is not set > CONFIG_PCIEPORTBUS=y > CONFIG_PCIEAER=y > CONFIG_PCIE_ECRC=y > # CONFIG_PCIEAER_INJECT is not set > CONFIG_PCIEASPM=y > # CONFIG_PCIEASPM_DEBUG is not set > CONFIG_PCIEASPM_DEFAULT=y > # CONFIG_PCIEASPM_POWERSAVE is not set > # CONFIG_PCIEASPM_PERFORMANCE is not set > CONFIG_PCIE_PME=y > CONFIG_PCI_MSI=y > # CONFIG_PCI_DEBUG is not set > CONFIG_PCI_REALLOC_ENABLE_AUTO=y > CONFIG_PCI_STUB=m > # CONFIG_HT_IRQ is not set > CONFIG_PCI_ATS=y > CONFIG_PCI_IOV=y > CONFIG_PCI_PRI=y > # CONFIG_PCI_PASID is not set > # CONFIG_PCI_IOAPIC is not set > CONFIG_PCI_LABEL=y > > # > # PCI host controller drivers > # > CONFIG_ISA_DMA_API=y > # CONFIG_PCCARD is not set > # CONFIG_HOTPLUG_PCI is not set > # CONFIG_RAPIDIO is not set > CONFIG_X86_SYSFB=y > > # > # Executable file formats / Emulations > # > CONFIG_BINFMT_ELF=y > CONFIG_COMPAT_BINFMT_ELF=y > CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y > CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y > CONFIG_BINFMT_SCRIPT=y > # CONFIG_HAVE_AOUT is not set > CONFIG_BINFMT_MISC=y > CONFIG_COREDUMP=y > CONFIG_IA32_EMULATION=y > CONFIG_IA32_AOUT=m > # CONFIG_X86_X32 is not set > CONFIG_COMPAT=y > CONFIG_COMPAT_FOR_U64_ALIGNMENT=y > CONFIG_SYSVIPC_COMPAT=y > CONFIG_KEYS_COMPAT=y > CONFIG_X86_DEV_DMA_OPS=y > CONFIG_IOSF_MBI=m > CONFIG_PMC_ATOM=y > CONFIG_NET=y > > # > # Networking options > # > CONFIG_PACKET=y > CONFIG_PACKET_DIAG=m > CONFIG_UNIX=y > CONFIG_UNIX_DIAG=y > CONFIG_XFRM=y > CONFIG_XFRM_ALGO=m > CONFIG_XFRM_USER=m > # CONFIG_XFRM_SUB_POLICY is not set > # CONFIG_XFRM_MIGRATE is not set > # CONFIG_XFRM_STATISTICS is not set > CONFIG_XFRM_IPCOMP=m > CONFIG_NET_KEY=m > # CONFIG_NET_KEY_MIGRATE is not set > CONFIG_INET=y > CONFIG_IP_MULTICAST=y > CONFIG_IP_ADVANCED_ROUTER=y > CONFIG_IP_FIB_TRIE_STATS=y > CONFIG_IP_MULTIPLE_TABLES=y > CONFIG_IP_ROUTE_MULTIPATH=y > CONFIG_IP_ROUTE_VERBOSE=y > CONFIG_IP_ROUTE_CLASSID=y > # CONFIG_IP_PNP is not set > CONFIG_NET_IPIP=m > CONFIG_NET_IPGRE_DEMUX=m > CONFIG_NET_IP_TUNNEL=m > CONFIG_NET_IPGRE=m > # CONFIG_NET_IPGRE_BROADCAST is not set > CONFIG_IP_MROUTE=y > CONFIG_IP_MROUTE_MULTIPLE_TABLES=y > # CONFIG_IP_PIMSM_V1 is not set > # CONFIG_IP_PIMSM_V2 is not set > CONFIG_SYN_COOKIES=y > CONFIG_NET_UDP_TUNNEL=m > # CONFIG_INET_AH is not set > # CONFIG_INET_ESP is not set > # CONFIG_INET_IPCOMP is not set > # CONFIG_INET_XFRM_TUNNEL is not set > CONFIG_INET_TUNNEL=m > # CONFIG_INET_XFRM_MODE_TRANSPORT is not set > # CONFIG_INET_XFRM_MODE_TUNNEL is not set > # CONFIG_INET_XFRM_MODE_BEET is not set > CONFIG_INET_LRO=y > CONFIG_INET_DIAG=y > CONFIG_INET_TCP_DIAG=y > CONFIG_INET_UDP_DIAG=m > CONFIG_TCP_CONG_ADVANCED=y > # CONFIG_TCP_CONG_BIC is not set > # CONFIG_TCP_CONG_CUBIC is not set > CONFIG_TCP_CONG_WESTWOOD=m > CONFIG_TCP_CONG_HTCP=y > CONFIG_TCP_CONG_HSTCP=y > # CONFIG_TCP_CONG_HYBLA is not set > # CONFIG_TCP_CONG_VEGAS is not set > CONFIG_TCP_CONG_SCALABLE=y > CONFIG_TCP_CONG_LP=y > # CONFIG_TCP_CONG_VENO is not set > # CONFIG_TCP_CONG_YEAH is not set > # CONFIG_TCP_CONG_ILLINOIS is not set > CONFIG_DEFAULT_HTCP=y > # CONFIG_DEFAULT_RENO is not set > CONFIG_DEFAULT_TCP_CONG="htcp" > # CONFIG_TCP_MD5SIG is not set > CONFIG_IPV6=m > # CONFIG_IPV6_ROUTER_PREF is not set > CONFIG_IPV6_OPTIMISTIC_DAD=y > CONFIG_INET6_AH=m > CONFIG_INET6_ESP=m > CONFIG_INET6_IPCOMP=m > # CONFIG_IPV6_MIP6 is not set > CONFIG_INET6_XFRM_TUNNEL=m > CONFIG_INET6_TUNNEL=m > CONFIG_INET6_XFRM_MODE_TRANSPORT=m > CONFIG_INET6_XFRM_MODE_TUNNEL=m > CONFIG_INET6_XFRM_MODE_BEET=m > CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m > # CONFIG_IPV6_VTI is not set > CONFIG_IPV6_SIT=m > # CONFIG_IPV6_SIT_6RD is not set > CONFIG_IPV6_NDISC_NODETYPE=y > # CONFIG_IPV6_TUNNEL is not set > # CONFIG_IPV6_GRE is not set > # CONFIG_IPV6_MULTIPLE_TABLES is not set > # CONFIG_IPV6_MROUTE is not set > # CONFIG_NETLABEL is not set > # CONFIG_NETWORK_SECMARK is not set > CONFIG_NET_PTP_CLASSIFY=y > CONFIG_NETWORK_PHY_TIMESTAMPING=y > CONFIG_NETFILTER=y > CONFIG_NETFILTER_DEBUG=y > CONFIG_NETFILTER_ADVANCED=y > CONFIG_BRIDGE_NETFILTER=y > > # > # Core Netfilter Configuration > # > CONFIG_NETFILTER_NETLINK=m > CONFIG_NETFILTER_NETLINK_ACCT=m > CONFIG_NETFILTER_NETLINK_QUEUE=m > CONFIG_NETFILTER_NETLINK_LOG=m > CONFIG_NF_CONNTRACK=m > CONFIG_NF_LOG_COMMON=m > CONFIG_NF_CONNTRACK_MARK=y > CONFIG_NF_CONNTRACK_ZONES=y > # CONFIG_NF_CONNTRACK_PROCFS is not set > CONFIG_NF_CONNTRACK_EVENTS=y > CONFIG_NF_CONNTRACK_TIMEOUT=y > CONFIG_NF_CONNTRACK_TIMESTAMP=y > CONFIG_NF_CONNTRACK_LABELS=y > CONFIG_NF_CT_PROTO_DCCP=m > CONFIG_NF_CT_PROTO_GRE=m > CONFIG_NF_CT_PROTO_SCTP=m > CONFIG_NF_CT_PROTO_UDPLITE=m > # CONFIG_NF_CONNTRACK_AMANDA is not set > CONFIG_NF_CONNTRACK_FTP=m > CONFIG_NF_CONNTRACK_H323=m > CONFIG_NF_CONNTRACK_IRC=m > CONFIG_NF_CONNTRACK_BROADCAST=m > CONFIG_NF_CONNTRACK_NETBIOS_NS=m > CONFIG_NF_CONNTRACK_SNMP=m > CONFIG_NF_CONNTRACK_PPTP=m > # CONFIG_NF_CONNTRACK_SANE is not set > CONFIG_NF_CONNTRACK_SIP=m > # CONFIG_NF_CONNTRACK_TFTP is not set > CONFIG_NF_CT_NETLINK=m > CONFIG_NF_CT_NETLINK_TIMEOUT=m > CONFIG_NF_CT_NETLINK_HELPER=m > CONFIG_NETFILTER_NETLINK_QUEUE_CT=y > CONFIG_NF_NAT=m > CONFIG_NF_NAT_NEEDED=y > CONFIG_NF_NAT_PROTO_DCCP=m > CONFIG_NF_NAT_PROTO_UDPLITE=m > CONFIG_NF_NAT_PROTO_SCTP=m > # CONFIG_NF_NAT_AMANDA is not set > CONFIG_NF_NAT_FTP=m > CONFIG_NF_NAT_IRC=m > CONFIG_NF_NAT_SIP=m > # CONFIG_NF_NAT_TFTP is not set > CONFIG_NETFILTER_SYNPROXY=m > CONFIG_NF_TABLES=m > CONFIG_NF_TABLES_INET=m > CONFIG_NFT_EXTHDR=m > CONFIG_NFT_META=m > CONFIG_NFT_CT=m > CONFIG_NFT_RBTREE=m > CONFIG_NFT_HASH=m > CONFIG_NFT_COUNTER=m > CONFIG_NFT_LOG=m > CONFIG_NFT_LIMIT=m > CONFIG_NFT_NAT=m > CONFIG_NFT_QUEUE=m > CONFIG_NFT_REJECT=m > CONFIG_NFT_REJECT_INET=m > CONFIG_NFT_COMPAT=m > CONFIG_NETFILTER_XTABLES=y > > # > # Xtables combined modules > # > CONFIG_NETFILTER_XT_MARK=m > CONFIG_NETFILTER_XT_CONNMARK=m > CONFIG_NETFILTER_XT_SET=m > > # > # Xtables targets > # > CONFIG_NETFILTER_XT_TARGET_AUDIT=m > # CONFIG_NETFILTER_XT_TARGET_CHECKSUM is not set > CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m > CONFIG_NETFILTER_XT_TARGET_CONNMARK=m > CONFIG_NETFILTER_XT_TARGET_CT=m > CONFIG_NETFILTER_XT_TARGET_DSCP=m > CONFIG_NETFILTER_XT_TARGET_HL=m > CONFIG_NETFILTER_XT_TARGET_HMARK=m > CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m > CONFIG_NETFILTER_XT_TARGET_LOG=m > CONFIG_NETFILTER_XT_TARGET_MARK=m > CONFIG_NETFILTER_XT_NAT=m > CONFIG_NETFILTER_XT_TARGET_NETMAP=m > CONFIG_NETFILTER_XT_TARGET_NFLOG=m > CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m > # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set > CONFIG_NETFILTER_XT_TARGET_RATEEST=m > CONFIG_NETFILTER_XT_TARGET_REDIRECT=m > CONFIG_NETFILTER_XT_TARGET_TEE=m > CONFIG_NETFILTER_XT_TARGET_TPROXY=m > CONFIG_NETFILTER_XT_TARGET_TRACE=m > CONFIG_NETFILTER_XT_TARGET_TCPMSS=m > CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m > > # > # Xtables matches > # > CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m > CONFIG_NETFILTER_XT_MATCH_BPF=m > CONFIG_NETFILTER_XT_MATCH_CGROUP=m > # CONFIG_NETFILTER_XT_MATCH_CLUSTER is not set > CONFIG_NETFILTER_XT_MATCH_COMMENT=m > CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m > CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m > CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m > CONFIG_NETFILTER_XT_MATCH_CONNMARK=m > CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m > CONFIG_NETFILTER_XT_MATCH_CPU=m > CONFIG_NETFILTER_XT_MATCH_DCCP=m > CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m > CONFIG_NETFILTER_XT_MATCH_DSCP=m > CONFIG_NETFILTER_XT_MATCH_ECN=y > CONFIG_NETFILTER_XT_MATCH_ESP=m > CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m > CONFIG_NETFILTER_XT_MATCH_HELPER=m > CONFIG_NETFILTER_XT_MATCH_HL=m > CONFIG_NETFILTER_XT_MATCH_IPCOMP=m > CONFIG_NETFILTER_XT_MATCH_IPRANGE=m > CONFIG_NETFILTER_XT_MATCH_L2TP=m > CONFIG_NETFILTER_XT_MATCH_LENGTH=m > CONFIG_NETFILTER_XT_MATCH_LIMIT=m > CONFIG_NETFILTER_XT_MATCH_MAC=m > CONFIG_NETFILTER_XT_MATCH_MARK=m > CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m > CONFIG_NETFILTER_XT_MATCH_NFACCT=m > CONFIG_NETFILTER_XT_MATCH_OSF=m > CONFIG_NETFILTER_XT_MATCH_OWNER=m > # CONFIG_NETFILTER_XT_MATCH_POLICY is not set > CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m > CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m > CONFIG_NETFILTER_XT_MATCH_QUOTA=m > CONFIG_NETFILTER_XT_MATCH_RATEEST=m > CONFIG_NETFILTER_XT_MATCH_REALM=m > CONFIG_NETFILTER_XT_MATCH_RECENT=m > CONFIG_NETFILTER_XT_MATCH_SCTP=m > CONFIG_NETFILTER_XT_MATCH_SOCKET=m > CONFIG_NETFILTER_XT_MATCH_STATE=m > CONFIG_NETFILTER_XT_MATCH_STATISTIC=m > CONFIG_NETFILTER_XT_MATCH_STRING=m > CONFIG_NETFILTER_XT_MATCH_TCPMSS=m > CONFIG_NETFILTER_XT_MATCH_TIME=m > CONFIG_NETFILTER_XT_MATCH_U32=m > CONFIG_IP_SET=m > CONFIG_IP_SET_MAX=256 > CONFIG_IP_SET_BITMAP_IP=m > CONFIG_IP_SET_BITMAP_IPMAC=m > CONFIG_IP_SET_BITMAP_PORT=m > CONFIG_IP_SET_HASH_IP=m > CONFIG_IP_SET_HASH_IPMARK=m > CONFIG_IP_SET_HASH_IPPORT=m > CONFIG_IP_SET_HASH_IPPORTIP=m > CONFIG_IP_SET_HASH_IPPORTNET=m > CONFIG_IP_SET_HASH_NETPORTNET=m > CONFIG_IP_SET_HASH_NET=m > CONFIG_IP_SET_HASH_NETNET=m > CONFIG_IP_SET_HASH_NETPORT=m > CONFIG_IP_SET_HASH_NETIFACE=m > CONFIG_IP_SET_LIST_SET=m > # CONFIG_IP_VS is not set > > # > # IP: Netfilter Configuration > # > CONFIG_NF_DEFRAG_IPV4=m > CONFIG_NF_CONNTRACK_IPV4=m > CONFIG_NF_LOG_ARP=m > CONFIG_NF_LOG_IPV4=m > CONFIG_NF_TABLES_IPV4=m > CONFIG_NFT_CHAIN_ROUTE_IPV4=m > CONFIG_NFT_CHAIN_NAT_IPV4=m > CONFIG_NFT_REJECT_IPV4=m > CONFIG_NF_TABLES_ARP=m > CONFIG_NF_NAT_IPV4=m > CONFIG_NF_NAT_SNMP_BASIC=m > CONFIG_NF_NAT_PROTO_GRE=m > CONFIG_NF_NAT_PPTP=m > CONFIG_NF_NAT_H323=m > CONFIG_IP_NF_IPTABLES=m > # CONFIG_IP_NF_MATCH_AH is not set > CONFIG_IP_NF_MATCH_ECN=m > CONFIG_IP_NF_MATCH_RPFILTER=m > CONFIG_IP_NF_MATCH_TTL=m > CONFIG_IP_NF_FILTER=m > CONFIG_IP_NF_TARGET_REJECT=m > CONFIG_IP_NF_TARGET_SYNPROXY=m > CONFIG_IP_NF_NAT=m > CONFIG_IP_NF_TARGET_MASQUERADE=m > CONFIG_IP_NF_TARGET_NETMAP=m > CONFIG_IP_NF_TARGET_REDIRECT=m > CONFIG_IP_NF_MANGLE=m > # CONFIG_IP_NF_TARGET_CLUSTERIP is not set > CONFIG_IP_NF_TARGET_ECN=m > # CONFIG_IP_NF_TARGET_TTL is not set > CONFIG_IP_NF_RAW=m > # CONFIG_IP_NF_SECURITY is not set > CONFIG_IP_NF_ARPTABLES=m > CONFIG_IP_NF_ARPFILTER=m > # CONFIG_IP_NF_ARP_MANGLE is not set > > # > # IPv6: Netfilter Configuration > # > CONFIG_NF_DEFRAG_IPV6=m > CONFIG_NF_CONNTRACK_IPV6=m > CONFIG_NF_TABLES_IPV6=m > CONFIG_NFT_CHAIN_ROUTE_IPV6=m > CONFIG_NFT_CHAIN_NAT_IPV6=m > CONFIG_NFT_REJECT_IPV6=m > CONFIG_NF_LOG_IPV6=m > CONFIG_NF_NAT_IPV6=m > CONFIG_IP6_NF_IPTABLES=m > CONFIG_IP6_NF_MATCH_AH=m > CONFIG_IP6_NF_MATCH_EUI64=m > CONFIG_IP6_NF_MATCH_FRAG=m > CONFIG_IP6_NF_MATCH_OPTS=m > CONFIG_IP6_NF_MATCH_HL=m > CONFIG_IP6_NF_MATCH_IPV6HEADER=m > CONFIG_IP6_NF_MATCH_MH=m > CONFIG_IP6_NF_MATCH_RPFILTER=m > CONFIG_IP6_NF_MATCH_RT=m > # CONFIG_IP6_NF_TARGET_HL is not set > CONFIG_IP6_NF_FILTER=m > CONFIG_IP6_NF_TARGET_REJECT=m > CONFIG_IP6_NF_TARGET_SYNPROXY=m > CONFIG_IP6_NF_MANGLE=m > CONFIG_IP6_NF_RAW=m > # CONFIG_IP6_NF_SECURITY is not set > CONFIG_IP6_NF_NAT=m > CONFIG_IP6_NF_TARGET_MASQUERADE=m > CONFIG_IP6_NF_TARGET_NPT=m > CONFIG_NF_TABLES_BRIDGE=m > CONFIG_NFT_BRIDGE_META=m > CONFIG_NFT_BRIDGE_REJECT=m > CONFIG_NF_LOG_BRIDGE=m > CONFIG_BRIDGE_NF_EBTABLES=m > CONFIG_BRIDGE_EBT_BROUTE=m > CONFIG_BRIDGE_EBT_T_FILTER=m > CONFIG_BRIDGE_EBT_T_NAT=m > CONFIG_BRIDGE_EBT_802_3=m > CONFIG_BRIDGE_EBT_AMONG=m > CONFIG_BRIDGE_EBT_ARP=m > CONFIG_BRIDGE_EBT_IP=m > # CONFIG_BRIDGE_EBT_IP6 is not set > CONFIG_BRIDGE_EBT_LIMIT=m > CONFIG_BRIDGE_EBT_MARK=m > CONFIG_BRIDGE_EBT_PKTTYPE=m > CONFIG_BRIDGE_EBT_STP=m > CONFIG_BRIDGE_EBT_VLAN=m > CONFIG_BRIDGE_EBT_ARPREPLY=m > CONFIG_BRIDGE_EBT_DNAT=m > CONFIG_BRIDGE_EBT_MARK_T=m > CONFIG_BRIDGE_EBT_REDIRECT=m > CONFIG_BRIDGE_EBT_SNAT=m > CONFIG_BRIDGE_EBT_LOG=m > CONFIG_BRIDGE_EBT_NFLOG=m > CONFIG_IP_DCCP=m > CONFIG_INET_DCCP_DIAG=m > > # > # DCCP CCIDs Configuration > # > # CONFIG_IP_DCCP_CCID2_DEBUG is not set > CONFIG_IP_DCCP_CCID3=y > # CONFIG_IP_DCCP_CCID3_DEBUG is not set > CONFIG_IP_DCCP_TFRC_LIB=y > > # > # DCCP Kernel Hacking > # > # CONFIG_IP_DCCP_DEBUG is not set > CONFIG_NET_DCCPPROBE=m > CONFIG_IP_SCTP=m > CONFIG_NET_SCTPPROBE=m > # CONFIG_SCTP_DBG_OBJCNT is not set > # CONFIG_SCTP_DEFAULT_COOKIE_HMAC_MD5 is not set > # CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA1 is not set > CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE=y > CONFIG_SCTP_COOKIE_HMAC_MD5=y > CONFIG_SCTP_COOKIE_HMAC_SHA1=y > CONFIG_RDS=m > CONFIG_RDS_TCP=m > # CONFIG_RDS_DEBUG is not set > # CONFIG_TIPC is not set > # CONFIG_ATM is not set > CONFIG_L2TP=m > # CONFIG_L2TP_DEBUGFS is not set > CONFIG_L2TP_V3=y > CONFIG_L2TP_IP=m > CONFIG_L2TP_ETH=m > CONFIG_STP=m > CONFIG_BRIDGE=m > CONFIG_BRIDGE_IGMP_SNOOPING=y > CONFIG_BRIDGE_VLAN_FILTERING=y > CONFIG_HAVE_NET_DSA=y > CONFIG_VLAN_8021Q=m > # CONFIG_VLAN_8021Q_GVRP is not set > # CONFIG_VLAN_8021Q_MVRP is not set > # CONFIG_DECNET is not set > CONFIG_LLC=m > CONFIG_LLC2=m > CONFIG_IPX=m > # CONFIG_IPX_INTERN is not set > # CONFIG_ATALK is not set > # CONFIG_X25 is not set > # CONFIG_LAPB is not set > # CONFIG_PHONET is not set > # CONFIG_6LOWPAN is not set > # CONFIG_IEEE802154 is not set > CONFIG_NET_SCHED=y > > # > # Queueing/Scheduling > # > CONFIG_NET_SCH_CBQ=m > CONFIG_NET_SCH_HTB=m > CONFIG_NET_SCH_HFSC=m > CONFIG_NET_SCH_PRIO=m > CONFIG_NET_SCH_MULTIQ=m > CONFIG_NET_SCH_RED=m > CONFIG_NET_SCH_SFB=m > CONFIG_NET_SCH_SFQ=m > CONFIG_NET_SCH_TEQL=m > CONFIG_NET_SCH_TBF=m > CONFIG_NET_SCH_GRED=m > CONFIG_NET_SCH_DSMARK=m > CONFIG_NET_SCH_NETEM=m > CONFIG_NET_SCH_DRR=m > CONFIG_NET_SCH_MQPRIO=m > CONFIG_NET_SCH_CHOKE=m > CONFIG_NET_SCH_QFQ=m > CONFIG_NET_SCH_CODEL=m > CONFIG_NET_SCH_FQ_CODEL=m > CONFIG_NET_SCH_FQ=m > CONFIG_NET_SCH_HHF=m > CONFIG_NET_SCH_PIE=m > CONFIG_NET_SCH_INGRESS=m > CONFIG_NET_SCH_PLUG=m > > # > # Classification > # > CONFIG_NET_CLS=y > CONFIG_NET_CLS_BASIC=m > CONFIG_NET_CLS_TCINDEX=m > CONFIG_NET_CLS_ROUTE4=m > CONFIG_NET_CLS_FW=m > CONFIG_NET_CLS_U32=m > CONFIG_CLS_U32_PERF=y > CONFIG_CLS_U32_MARK=y > CONFIG_NET_CLS_RSVP=m > # CONFIG_NET_CLS_RSVP6 is not set > CONFIG_NET_CLS_FLOW=m > CONFIG_NET_CLS_CGROUP=m > CONFIG_NET_CLS_BPF=m > CONFIG_NET_EMATCH=y > CONFIG_NET_EMATCH_STACK=32 > CONFIG_NET_EMATCH_CMP=y > CONFIG_NET_EMATCH_NBYTE=m > CONFIG_NET_EMATCH_U32=m > CONFIG_NET_EMATCH_META=m > CONFIG_NET_EMATCH_TEXT=m > CONFIG_NET_EMATCH_IPSET=m > CONFIG_NET_CLS_ACT=y > CONFIG_NET_ACT_POLICE=m > CONFIG_NET_ACT_GACT=y > CONFIG_GACT_PROB=y > CONFIG_NET_ACT_MIRRED=m > CONFIG_NET_ACT_IPT=m > CONFIG_NET_ACT_NAT=m > CONFIG_NET_ACT_PEDIT=m > # CONFIG_NET_ACT_SIMP is not set > CONFIG_NET_ACT_SKBEDIT=m > # CONFIG_NET_ACT_CSUM is not set > CONFIG_NET_CLS_IND=y > CONFIG_NET_SCH_FIFO=y > # CONFIG_DCB is not set > CONFIG_DNS_RESOLVER=y > # CONFIG_BATMAN_ADV is not set > # CONFIG_OPENVSWITCH is not set > CONFIG_VSOCKETS=m > CONFIG_NETLINK_MMAP=y > CONFIG_NETLINK_DIAG=m > # CONFIG_NET_MPLS_GSO is not set > # CONFIG_HSR is not set > CONFIG_RPS=y > CONFIG_RFS_ACCEL=y > CONFIG_XPS=y > CONFIG_CGROUP_NET_PRIO=y > CONFIG_CGROUP_NET_CLASSID=y > CONFIG_NET_RX_BUSY_POLL=y > CONFIG_BQL=y > CONFIG_BPF_JIT=y > CONFIG_NET_FLOW_LIMIT=y > > # > # Network testing > # > # CONFIG_NET_PKTGEN is not set > # CONFIG_NET_TCPPROBE is not set > CONFIG_NET_DROP_MONITOR=m > # CONFIG_HAMRADIO is not set > # CONFIG_CAN is not set > # CONFIG_IRDA is not set > # CONFIG_BT is not set > # CONFIG_AF_RXRPC is not set > CONFIG_FIB_RULES=y > # CONFIG_WIRELESS is not set > # CONFIG_WIMAX is not set > # CONFIG_RFKILL is not set > # CONFIG_NET_9P is not set > # CONFIG_CAIF is not set > # CONFIG_CEPH_LIB is not set > # CONFIG_NFC is not set > CONFIG_HAVE_BPF_JIT=y > > # > # Device Drivers > # > > # > # Generic Driver Options > # > CONFIG_UEVENT_HELPER=y > CONFIG_UEVENT_HELPER_PATH="" > CONFIG_DEVTMPFS=y > CONFIG_DEVTMPFS_MOUNT=y > CONFIG_STANDALONE=y > CONFIG_PREVENT_FIRMWARE_BUILD=y > CONFIG_FW_LOADER=y > # CONFIG_FIRMWARE_IN_KERNEL is not set > CONFIG_EXTRA_FIRMWARE="" > CONFIG_FW_LOADER_USER_HELPER=y > # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set > # CONFIG_DEBUG_DRIVER is not set > # CONFIG_DEBUG_DEVRES is not set > # CONFIG_SYS_HYPERVISOR is not set > # CONFIG_GENERIC_CPU_DEVICES is not set > CONFIG_GENERIC_CPU_AUTOPROBE=y > CONFIG_DMA_SHARED_BUFFER=y > # CONFIG_FENCE_TRACE is not set > # CONFIG_DMA_CMA is not set > > # > # Bus devices > # > CONFIG_CONNECTOR=y > CONFIG_PROC_EVENTS=y > # CONFIG_MTD is not set > CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y > CONFIG_PARPORT=m > CONFIG_PARPORT_PC=m > # CONFIG_PARPORT_SERIAL is not set > CONFIG_PARPORT_PC_FIFO=y > # CONFIG_PARPORT_PC_SUPERIO is not set > # CONFIG_PARPORT_GSC is not set > # CONFIG_PARPORT_AX88796 is not set > # CONFIG_PARPORT_1284 is not set > CONFIG_PNP=y > CONFIG_PNP_DEBUG_MESSAGES=y > > # > # Protocols > # > CONFIG_PNPACPI=y > CONFIG_BLK_DEV=y > # CONFIG_BLK_DEV_NULL_BLK is not set > # CONFIG_BLK_DEV_FD is not set > # CONFIG_PARIDE is not set > # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set > # CONFIG_BLK_CPQ_CISS_DA is not set > # CONFIG_BLK_DEV_DAC960 is not set > # CONFIG_BLK_DEV_UMEM is not set > # CONFIG_BLK_DEV_COW_COMMON is not set > CONFIG_BLK_DEV_LOOP=m > CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 > # CONFIG_BLK_DEV_CRYPTOLOOP is not set > # CONFIG_BLK_DEV_DRBD is not set > CONFIG_BLK_DEV_NBD=m > # CONFIG_BLK_DEV_NVME is not set > # CONFIG_BLK_DEV_SKD is not set > # CONFIG_BLK_DEV_SX8 is not set > CONFIG_BLK_DEV_RAM=m > CONFIG_BLK_DEV_RAM_COUNT=16 > CONFIG_BLK_DEV_RAM_SIZE=8192 > CONFIG_BLK_DEV_XIP=y > CONFIG_CDROM_PKTCDVD=m > CONFIG_CDROM_PKTCDVD_BUFFERS=8 > # CONFIG_CDROM_PKTCDVD_WCACHE is not set > # CONFIG_ATA_OVER_ETH is not set > CONFIG_VIRTIO_BLK=m > # CONFIG_BLK_DEV_HD is not set > # CONFIG_BLK_DEV_RBD is not set > # CONFIG_BLK_DEV_RSXX is not set > > # > # Misc devices > # > # CONFIG_SENSORS_LIS3LV02D is not set > # CONFIG_AD525X_DPOT is not set > # CONFIG_DUMMY_IRQ is not set > # CONFIG_IBM_ASM is not set > # CONFIG_PHANTOM is not set > # CONFIG_SGI_IOC4 is not set > # CONFIG_TIFM_CORE is not set > # CONFIG_ICS932S401 is not set > CONFIG_ENCLOSURE_SERVICES=m > # CONFIG_HP_ILO is not set > # CONFIG_APDS9802ALS is not set > # CONFIG_ISL29003 is not set > # CONFIG_ISL29020 is not set > # CONFIG_SENSORS_TSL2550 is not set > # CONFIG_SENSORS_BH1780 is not set > # CONFIG_SENSORS_BH1770 is not set > # CONFIG_SENSORS_APDS990X is not set > # CONFIG_HMC6352 is not set > # CONFIG_DS1682 is not set > # CONFIG_TI_DAC7512 is not set > # CONFIG_BMP085_I2C is not set > # CONFIG_BMP085_SPI is not set > # CONFIG_USB_SWITCH_FSA9480 is not set > # CONFIG_LATTICE_ECP3_CONFIG is not set > # CONFIG_SRAM is not set > # CONFIG_C2PORT is not set > > # > # EEPROM support > # > CONFIG_EEPROM_AT24=m > # CONFIG_EEPROM_AT25 is not set > CONFIG_EEPROM_LEGACY=m > # CONFIG_EEPROM_MAX6875 is not set > # CONFIG_EEPROM_93CX6 is not set > # CONFIG_EEPROM_93XX46 is not set > # CONFIG_CB710_CORE is not set > > # > # Texas Instruments shared transport line discipline > # > # CONFIG_TI_ST is not set > # CONFIG_SENSORS_LIS3_I2C is not set > > # > # Altera FPGA firmware download module > # > # CONFIG_ALTERA_STAPL is not set > CONFIG_INTEL_MEI=m > # CONFIG_INTEL_MEI_ME is not set > # CONFIG_INTEL_MEI_TXE is not set > # CONFIG_VMWARE_VMCI is not set > > # > # Intel MIC Bus Driver > # > # CONFIG_INTEL_MIC_BUS is not set > > # > # Intel MIC Host Driver > # > > # > # Intel MIC Card Driver > # > # CONFIG_GENWQE is not set > # CONFIG_ECHO is not set > CONFIG_HAVE_IDE=y > # CONFIG_IDE is not set > > # > # SCSI device support > # > CONFIG_SCSI_MOD=y > CONFIG_RAID_ATTRS=y > CONFIG_SCSI=y > CONFIG_SCSI_DMA=y > CONFIG_SCSI_NETLINK=y > # CONFIG_SCSI_PROC_FS is not set > > # > # SCSI support type (disk, tape, CD-ROM) > # > CONFIG_BLK_DEV_SD=y > # CONFIG_CHR_DEV_ST is not set > # CONFIG_CHR_DEV_OSST is not set > CONFIG_BLK_DEV_SR=m > CONFIG_BLK_DEV_SR_VENDOR=y > CONFIG_CHR_DEV_SG=y > # CONFIG_CHR_DEV_SCH is not set > CONFIG_SCSI_ENCLOSURE=m > CONFIG_SCSI_CONSTANTS=y > CONFIG_SCSI_LOGGING=y > CONFIG_SCSI_SCAN_ASYNC=y > > # > # SCSI Transports > # > CONFIG_SCSI_SPI_ATTRS=y > CONFIG_SCSI_FC_ATTRS=m > CONFIG_SCSI_ISCSI_ATTRS=y > CONFIG_SCSI_SAS_ATTRS=y > CONFIG_SCSI_SAS_LIBSAS=y > CONFIG_SCSI_SAS_ATA=y > CONFIG_SCSI_SAS_HOST_SMP=y > CONFIG_SCSI_SRP_ATTRS=m > CONFIG_SCSI_LOWLEVEL=y > CONFIG_ISCSI_TCP=m > CONFIG_ISCSI_BOOT_SYSFS=m > # CONFIG_SCSI_CXGB3_ISCSI is not set > # CONFIG_SCSI_CXGB4_ISCSI is not set > CONFIG_SCSI_BNX2_ISCSI=m > CONFIG_SCSI_BNX2X_FCOE=m > # CONFIG_BE2ISCSI is not set > # CONFIG_BLK_DEV_3W_XXXX_RAID is not set > # CONFIG_SCSI_HPSA is not set > # CONFIG_SCSI_3W_9XXX is not set > # CONFIG_SCSI_3W_SAS is not set > # CONFIG_SCSI_ACARD is not set > # CONFIG_SCSI_AACRAID is not set > # CONFIG_SCSI_AIC7XXX is not set > # CONFIG_SCSI_AIC79XX is not set > # CONFIG_SCSI_AIC94XX is not set > # CONFIG_SCSI_MVSAS is not set > # CONFIG_SCSI_MVUMI is not set > # CONFIG_SCSI_DPT_I2O is not set > # CONFIG_SCSI_ADVANSYS is not set > # CONFIG_SCSI_ARCMSR is not set > # CONFIG_SCSI_ESAS2R is not set > # CONFIG_MEGARAID_NEWGEN is not set > # CONFIG_MEGARAID_LEGACY is not set > CONFIG_MEGARAID_SAS=y > CONFIG_SCSI_MPT2SAS=m > CONFIG_SCSI_MPT2SAS_MAX_SGE=128 > CONFIG_SCSI_MPT2SAS_LOGGING=y > CONFIG_SCSI_MPT3SAS=m > CONFIG_SCSI_MPT3SAS_MAX_SGE=128 > CONFIG_SCSI_MPT3SAS_LOGGING=y > # CONFIG_SCSI_UFSHCD is not set > # CONFIG_SCSI_HPTIOP is not set > # CONFIG_SCSI_BUSLOGIC is not set > CONFIG_VMWARE_PVSCSI=m > CONFIG_LIBFC=m > CONFIG_LIBFCOE=m > # CONFIG_FCOE is not set > # CONFIG_FCOE_FNIC is not set > # CONFIG_SCSI_DMX3191D is not set > # CONFIG_SCSI_EATA is not set > # CONFIG_SCSI_FUTURE_DOMAIN is not set > # CONFIG_SCSI_GDTH is not set > # CONFIG_SCSI_ISCI is not set > # CONFIG_SCSI_IPS is not set > # CONFIG_SCSI_INITIO is not set > # CONFIG_SCSI_INIA100 is not set > # CONFIG_SCSI_PPA is not set > # CONFIG_SCSI_IMM is not set > # CONFIG_SCSI_STEX is not set > # CONFIG_SCSI_SYM53C8XX_2 is not set > # CONFIG_SCSI_IPR is not set > # CONFIG_SCSI_QLOGIC_1280 is not set > # CONFIG_SCSI_QLA_FC is not set > # CONFIG_SCSI_QLA_ISCSI is not set > # CONFIG_SCSI_LPFC is not set > # CONFIG_SCSI_DC395x is not set > # CONFIG_SCSI_DC390T is not set > # CONFIG_SCSI_DEBUG is not set > # CONFIG_SCSI_PMCRAID is not set > # CONFIG_SCSI_PM8001 is not set > # CONFIG_SCSI_BFA_FC is not set > CONFIG_SCSI_VIRTIO=m > # CONFIG_SCSI_CHELSIO_FCOE is not set > # CONFIG_SCSI_DH is not set > # CONFIG_SCSI_OSD_INITIATOR is not set > CONFIG_ATA=y > # CONFIG_ATA_NONSTANDARD is not set > CONFIG_ATA_VERBOSE_ERROR=y > CONFIG_ATA_ACPI=y > # CONFIG_SATA_ZPODD is not set > # CONFIG_SATA_PMP is not set > > # > # Controllers with non-SFF native interface > # > CONFIG_SATA_AHCI=m > CONFIG_SATA_AHCI_PLATFORM=m > # CONFIG_SATA_INIC162X is not set > # CONFIG_SATA_ACARD_AHCI is not set > # CONFIG_SATA_SIL24 is not set > # CONFIG_ATA_SFF is not set > CONFIG_MD=y > CONFIG_BLK_DEV_MD=m > CONFIG_MD_LINEAR=m > CONFIG_MD_RAID0=m > CONFIG_MD_RAID1=m > CONFIG_MD_RAID10=m > CONFIG_MD_RAID456=m > # CONFIG_MD_MULTIPATH is not set > # CONFIG_MD_FAULTY is not set > CONFIG_BCACHE=m > # CONFIG_BCACHE_DEBUG is not set > # CONFIG_BCACHE_CLOSURES_DEBUG is not set > CONFIG_BLK_DEV_DM_BUILTIN=y > CONFIG_BLK_DEV_DM=y > # CONFIG_DM_DEBUG is not set > CONFIG_DM_BUFIO=y > CONFIG_DM_BIO_PRISON=m > CONFIG_DM_PERSISTENT_DATA=m > # CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set > # CONFIG_DM_CRYPT is not set > CONFIG_DM_SNAPSHOT=y > CONFIG_DM_THIN_PROVISIONING=m > # CONFIG_DM_CACHE is not set > # CONFIG_DM_ERA is not set > CONFIG_DM_MIRROR=m > # CONFIG_DM_LOG_USERSPACE is not set > CONFIG_DM_RAID=m > CONFIG_DM_ZERO=m > # CONFIG_DM_MULTIPATH is not set > # CONFIG_DM_DELAY is not set > CONFIG_DM_UEVENT=y > # CONFIG_DM_FLAKEY is not set > # CONFIG_DM_VERITY is not set > # CONFIG_DM_SWITCH is not set > CONFIG_TARGET_CORE=m > CONFIG_TCM_IBLOCK=m > CONFIG_TCM_FILEIO=m > CONFIG_TCM_PSCSI=m > CONFIG_LOOPBACK_TARGET=m > # CONFIG_TCM_FC is not set > CONFIG_ISCSI_TARGET=m > CONFIG_SBP_TARGET=m > CONFIG_FUSION=y > # CONFIG_FUSION_SPI is not set > # CONFIG_FUSION_FC is not set > CONFIG_FUSION_SAS=y > CONFIG_FUSION_MAX_SGE=128 > CONFIG_FUSION_CTL=m > CONFIG_FUSION_LOGGING=y > > # > # IEEE 1394 (FireWire) support > # > CONFIG_FIREWIRE=m > CONFIG_FIREWIRE_OHCI=m > CONFIG_FIREWIRE_SBP2=m > # CONFIG_FIREWIRE_NET is not set > # CONFIG_FIREWIRE_NOSY is not set > # CONFIG_I2O is not set > # CONFIG_MACINTOSH_DRIVERS is not set > CONFIG_NETDEVICES=y > CONFIG_NET_CORE=y > CONFIG_BONDING=m > # CONFIG_DUMMY is not set > # CONFIG_EQUALIZER is not set > # CONFIG_NET_FC is not set > CONFIG_IFB=m > CONFIG_NET_TEAM=m > # CONFIG_NET_TEAM_MODE_BROADCAST is not set > CONFIG_NET_TEAM_MODE_ROUNDROBIN=m > # CONFIG_NET_TEAM_MODE_RANDOM is not set > # CONFIG_NET_TEAM_MODE_ACTIVEBACKUP is not set > # CONFIG_NET_TEAM_MODE_LOADBALANCE is not set > CONFIG_MACVLAN=m > # CONFIG_MACVTAP is not set > # CONFIG_VXLAN is not set > CONFIG_NETCONSOLE=m > # CONFIG_NETCONSOLE_DYNAMIC is not set > CONFIG_NETPOLL=y > CONFIG_NET_POLL_CONTROLLER=y > CONFIG_TUN=m > CONFIG_VETH=m > CONFIG_VIRTIO_NET=m > # CONFIG_NLMON is not set > # CONFIG_ARCNET is not set > > # > # CAIF transport drivers > # > CONFIG_VHOST_NET=m > CONFIG_VHOST_SCSI=m > CONFIG_VHOST_RING=m > CONFIG_VHOST=m > > # > # Distributed Switch Architecture drivers > # > # CONFIG_NET_DSA_MV88E6XXX is not set > # CONFIG_NET_DSA_MV88E6060 is not set > # CONFIG_NET_DSA_MV88E6XXX_NEED_PPU is not set > # CONFIG_NET_DSA_MV88E6131 is not set > # CONFIG_NET_DSA_MV88E6123_61_65 is not set > CONFIG_ETHERNET=y > CONFIG_MDIO=m > # CONFIG_NET_VENDOR_3COM is not set > # CONFIG_NET_VENDOR_ADAPTEC is not set > # CONFIG_NET_VENDOR_ALTEON is not set > # CONFIG_ALTERA_TSE is not set > # CONFIG_NET_VENDOR_AMD is not set > # CONFIG_NET_XGENE is not set > # CONFIG_NET_VENDOR_ARC is not set > # CONFIG_NET_VENDOR_ATHEROS is not set > CONFIG_NET_VENDOR_BROADCOM=y > # CONFIG_B44 is not set > CONFIG_BNX2=m > CONFIG_CNIC=m > # CONFIG_TIGON3 is not set > # CONFIG_BNX2X is not set > # CONFIG_NET_VENDOR_BROCADE is not set > # CONFIG_NET_VENDOR_CHELSIO is not set > # CONFIG_NET_VENDOR_CISCO is not set > # CONFIG_CX_ECAT is not set > # CONFIG_DNET is not set > # CONFIG_NET_VENDOR_DEC is not set > # CONFIG_NET_VENDOR_DLINK is not set > # CONFIG_NET_VENDOR_EMULEX is not set > # CONFIG_NET_VENDOR_EXAR is not set > # CONFIG_NET_VENDOR_HP is not set > CONFIG_NET_VENDOR_INTEL=y > # CONFIG_E100 is not set > # CONFIG_E1000 is not set > CONFIG_E1000E=y > # CONFIG_IGB is not set > # CONFIG_IGBVF is not set > # CONFIG_IXGB is not set > CONFIG_IXGBE=m > CONFIG_IXGBE_HWMON=y > CONFIG_IXGBE_DCA=y > # CONFIG_IXGBEVF is not set > # CONFIG_I40E is not set > # CONFIG_I40EVF is not set > # CONFIG_NET_VENDOR_I825XX is not set > # CONFIG_IP1000 is not set > # CONFIG_JME is not set > # CONFIG_NET_VENDOR_MARVELL is not set > # CONFIG_NET_VENDOR_MELLANOX is not set > # CONFIG_NET_VENDOR_MICREL is not set > CONFIG_NET_VENDOR_MICROCHIP=y > # CONFIG_ENC28J60 is not set > # CONFIG_NET_VENDOR_MYRI is not set > # CONFIG_FEALNX is not set > # CONFIG_NET_VENDOR_NATSEMI is not set > # CONFIG_NET_VENDOR_NVIDIA is not set > # CONFIG_NET_VENDOR_OKI is not set > # CONFIG_ETHOC is not set > # CONFIG_NET_PACKET_ENGINE is not set > # CONFIG_NET_VENDOR_QLOGIC is not set > # CONFIG_NET_VENDOR_REALTEK is not set > # CONFIG_NET_VENDOR_RDC is not set > # CONFIG_NET_VENDOR_SAMSUNG is not set > # CONFIG_NET_VENDOR_SEEQ is not set > # CONFIG_NET_VENDOR_SILAN is not set > # CONFIG_NET_VENDOR_SIS is not set > # CONFIG_SFC is not set > # CONFIG_NET_VENDOR_SMSC is not set > # CONFIG_NET_VENDOR_STMICRO is not set > # CONFIG_NET_VENDOR_SUN is not set > # CONFIG_NET_VENDOR_TEHUTI is not set > # CONFIG_NET_VENDOR_TI is not set > # CONFIG_NET_VENDOR_VIA is not set > # CONFIG_NET_VENDOR_WIZNET is not set > # CONFIG_FDDI is not set > # CONFIG_HIPPI is not set > # CONFIG_NET_SB1000 is not set > CONFIG_PHYLIB=m > > # > # MII PHY device drivers > # > # CONFIG_AT803X_PHY is not set > # CONFIG_AMD_PHY is not set > # CONFIG_MARVELL_PHY is not set > # CONFIG_DAVICOM_PHY is not set > # CONFIG_QSEMI_PHY is not set > CONFIG_LXT_PHY=m > # CONFIG_CICADA_PHY is not set > # CONFIG_VITESSE_PHY is not set > # CONFIG_SMSC_PHY is not set > CONFIG_BROADCOM_PHY=m > # CONFIG_BCM7XXX_PHY is not set > CONFIG_BCM87XX_PHY=m > # CONFIG_ICPLUS_PHY is not set > # CONFIG_REALTEK_PHY is not set > # CONFIG_NATIONAL_PHY is not set > # CONFIG_STE10XP is not set > # CONFIG_LSI_ET1011C_PHY is not set > # CONFIG_MICREL_PHY is not set > CONFIG_MDIO_BITBANG=m > CONFIG_MDIO_GPIO=m > # CONFIG_MICREL_KS8995MA is not set > # CONFIG_PLIP is not set > # CONFIG_PPP is not set > # CONFIG_SLIP is not set > # CONFIG_USB_NET_DRIVERS is not set > # CONFIG_WLAN is not set > > # > # Enable WiMAX (Networking options) to see the WiMAX drivers > # > # CONFIG_WAN is not set > CONFIG_VMXNET3=m > # CONFIG_ISDN is not set > > # > # Input device support > # > CONFIG_INPUT=y > CONFIG_INPUT_FF_MEMLESS=m > CONFIG_INPUT_POLLDEV=m > CONFIG_INPUT_SPARSEKMAP=m > # CONFIG_INPUT_MATRIXKMAP is not set > > # > # Userland interfaces > # > CONFIG_INPUT_MOUSEDEV=m > CONFIG_INPUT_MOUSEDEV_PSAUX=y > CONFIG_INPUT_MOUSEDEV_SCREEN_X=1280 > CONFIG_INPUT_MOUSEDEV_SCREEN_Y=1200 > # CONFIG_INPUT_JOYDEV is not set > CONFIG_INPUT_EVDEV=y > # CONFIG_INPUT_EVBUG is not set > > # > # Input Device Drivers > # > CONFIG_INPUT_KEYBOARD=y > # CONFIG_KEYBOARD_ADP5588 is not set > # CONFIG_KEYBOARD_ADP5589 is not set > CONFIG_KEYBOARD_ATKBD=y > # CONFIG_KEYBOARD_QT1070 is not set > # CONFIG_KEYBOARD_QT2160 is not set > # CONFIG_KEYBOARD_LKKBD is not set > # CONFIG_KEYBOARD_GPIO is not set > # CONFIG_KEYBOARD_GPIO_POLLED is not set > # CONFIG_KEYBOARD_TCA6416 is not set > # CONFIG_KEYBOARD_TCA8418 is not set > # CONFIG_KEYBOARD_MATRIX is not set > # CONFIG_KEYBOARD_LM8323 is not set > # CONFIG_KEYBOARD_LM8333 is not set > # CONFIG_KEYBOARD_MAX7359 is not set > # CONFIG_KEYBOARD_MCS is not set > # CONFIG_KEYBOARD_MPR121 is not set > # CONFIG_KEYBOARD_NEWTON is not set > # CONFIG_KEYBOARD_OPENCORES is not set > # CONFIG_KEYBOARD_STOWAWAY is not set > # CONFIG_KEYBOARD_SUNKBD is not set > # CONFIG_KEYBOARD_XTKBD is not set > CONFIG_INPUT_MOUSE=y > CONFIG_MOUSE_PS2=m > # CONFIG_MOUSE_PS2_ALPS is not set > # CONFIG_MOUSE_PS2_LOGIPS2PP is not set > # CONFIG_MOUSE_PS2_SYNAPTICS is not set > # CONFIG_MOUSE_PS2_CYPRESS is not set > # CONFIG_MOUSE_PS2_LIFEBOOK is not set > # CONFIG_MOUSE_PS2_TRACKPOINT is not set > # CONFIG_MOUSE_PS2_ELANTECH is not set > # CONFIG_MOUSE_PS2_SENTELIC is not set > # CONFIG_MOUSE_PS2_TOUCHKIT is not set > CONFIG_MOUSE_SERIAL=m > # CONFIG_MOUSE_APPLETOUCH is not set > # CONFIG_MOUSE_BCM5974 is not set > # CONFIG_MOUSE_CYAPA is not set > # CONFIG_MOUSE_VSXXXAA is not set > # CONFIG_MOUSE_GPIO is not set > # CONFIG_MOUSE_SYNAPTICS_I2C is not set > # CONFIG_MOUSE_SYNAPTICS_USB is not set > CONFIG_INPUT_JOYSTICK=y > CONFIG_JOYSTICK_ANALOG=m > # CONFIG_JOYSTICK_A3D is not set > # CONFIG_JOYSTICK_ADI is not set > # CONFIG_JOYSTICK_COBRA is not set > # CONFIG_JOYSTICK_GF2K is not set > # CONFIG_JOYSTICK_GRIP is not set > # CONFIG_JOYSTICK_GRIP_MP is not set > # CONFIG_JOYSTICK_GUILLEMOT is not set > # CONFIG_JOYSTICK_INTERACT is not set > # CONFIG_JOYSTICK_SIDEWINDER is not set > # CONFIG_JOYSTICK_TMDC is not set > # CONFIG_JOYSTICK_IFORCE is not set > # CONFIG_JOYSTICK_WARRIOR is not set > # CONFIG_JOYSTICK_MAGELLAN is not set > # CONFIG_JOYSTICK_SPACEORB is not set > # CONFIG_JOYSTICK_SPACEBALL is not set > # CONFIG_JOYSTICK_STINGER is not set > # CONFIG_JOYSTICK_TWIDJOY is not set > # CONFIG_JOYSTICK_ZHENHUA is not set > # CONFIG_JOYSTICK_DB9 is not set > # CONFIG_JOYSTICK_GAMECON is not set > # CONFIG_JOYSTICK_TURBOGRAFX is not set > # CONFIG_JOYSTICK_AS5011 is not set > # CONFIG_JOYSTICK_JOYDUMP is not set > CONFIG_JOYSTICK_XPAD=m > CONFIG_JOYSTICK_XPAD_FF=y > # CONFIG_JOYSTICK_XPAD_LEDS is not set > # CONFIG_JOYSTICK_WALKERA0701 is not set > CONFIG_INPUT_TABLET=y > # CONFIG_TABLET_USB_ACECAD is not set > # CONFIG_TABLET_USB_AIPTEK is not set > # CONFIG_TABLET_USB_GTCO is not set > # CONFIG_TABLET_USB_HANWANG is not set > # CONFIG_TABLET_USB_KBTAB is not set > CONFIG_TABLET_SERIAL_WACOM4=m > CONFIG_INPUT_TOUCHSCREEN=y > # CONFIG_TOUCHSCREEN_ADS7846 is not set > # CONFIG_TOUCHSCREEN_AD7877 is not set > # CONFIG_TOUCHSCREEN_AD7879 is not set > # CONFIG_TOUCHSCREEN_ATMEL_MXT is not set > # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set > # CONFIG_TOUCHSCREEN_BU21013 is not set > # CONFIG_TOUCHSCREEN_CY8CTMG110 is not set > # CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set > # CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set > # CONFIG_TOUCHSCREEN_DYNAPRO is not set > # CONFIG_TOUCHSCREEN_HAMPSHIRE is not set > # CONFIG_TOUCHSCREEN_EETI is not set > # CONFIG_TOUCHSCREEN_FUJITSU is not set > # CONFIG_TOUCHSCREEN_ILI210X is not set > # CONFIG_TOUCHSCREEN_GUNZE is not set > # CONFIG_TOUCHSCREEN_ELO is not set > CONFIG_TOUCHSCREEN_WACOM_W8001=m > # CONFIG_TOUCHSCREEN_WACOM_I2C is not set > # CONFIG_TOUCHSCREEN_MAX11801 is not set > # CONFIG_TOUCHSCREEN_MCS5000 is not set > # CONFIG_TOUCHSCREEN_MMS114 is not set > # CONFIG_TOUCHSCREEN_MTOUCH is not set > # CONFIG_TOUCHSCREEN_INEXIO is not set > # CONFIG_TOUCHSCREEN_MK712 is not set > # CONFIG_TOUCHSCREEN_PENMOUNT is not set > # CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set > # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set > # CONFIG_TOUCHSCREEN_TOUCHWIN is not set > # CONFIG_TOUCHSCREEN_PIXCIR is not set > CONFIG_TOUCHSCREEN_USB_COMPOSITE=m > # CONFIG_TOUCHSCREEN_USB_EGALAX is not set > # CONFIG_TOUCHSCREEN_USB_PANJIT is not set > # CONFIG_TOUCHSCREEN_USB_3M is not set > # CONFIG_TOUCHSCREEN_USB_ITM is not set > # CONFIG_TOUCHSCREEN_USB_ETURBO is not set > # CONFIG_TOUCHSCREEN_USB_GUNZE is not set > # CONFIG_TOUCHSCREEN_USB_DMC_TSC10 is not set > # CONFIG_TOUCHSCREEN_USB_IRTOUCH is not set > # CONFIG_TOUCHSCREEN_USB_IDEALTEK is not set > # CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH is not set > # CONFIG_TOUCHSCREEN_USB_GOTOP is not set > # CONFIG_TOUCHSCREEN_USB_JASTEC is not set > CONFIG_TOUCHSCREEN_USB_ELO=y > # CONFIG_TOUCHSCREEN_USB_E2I is not set > # CONFIG_TOUCHSCREEN_USB_ZYTRONIC is not set > # CONFIG_TOUCHSCREEN_USB_ETT_TC45USB is not set > # CONFIG_TOUCHSCREEN_USB_NEXIO is not set > CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y > # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set > # CONFIG_TOUCHSCREEN_TSC_SERIO is not set > # CONFIG_TOUCHSCREEN_TSC2005 is not set > # CONFIG_TOUCHSCREEN_TSC2007 is not set > # CONFIG_TOUCHSCREEN_ST1232 is not set > # CONFIG_TOUCHSCREEN_SUR40 is not set > # CONFIG_TOUCHSCREEN_TPS6507X is not set > # CONFIG_TOUCHSCREEN_ZFORCE is not set > CONFIG_INPUT_MISC=y > # CONFIG_INPUT_AD714X is not set > # CONFIG_INPUT_BMA150 is not set > CONFIG_INPUT_PCSPKR=y > # CONFIG_INPUT_MMA8450 is not set > # CONFIG_INPUT_MPU3050 is not set > # CONFIG_INPUT_APANEL is not set > # CONFIG_INPUT_GP2A is not set > # CONFIG_INPUT_GPIO_BEEPER is not set > # CONFIG_INPUT_GPIO_TILT_POLLED is not set > # CONFIG_INPUT_ATLAS_BTNS is not set > # CONFIG_INPUT_ATI_REMOTE2 is not set > # CONFIG_INPUT_KEYSPAN_REMOTE is not set > # CONFIG_INPUT_KXTJ9 is not set > # CONFIG_INPUT_POWERMATE is not set > # CONFIG_INPUT_YEALINK is not set > # CONFIG_INPUT_CM109 is not set > CONFIG_INPUT_UINPUT=y > # CONFIG_INPUT_PCF8574 is not set > # CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set > # CONFIG_INPUT_ADXL34X is not set > # CONFIG_INPUT_IMS_PCU is not set > # CONFIG_INPUT_CMA3000 is not set > # CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set > > # > # Hardware I/O ports > # > CONFIG_SERIO=y > CONFIG_ARCH_MIGHT_HAVE_PC_SERIO=y > CONFIG_SERIO_I8042=y > CONFIG_SERIO_SERPORT=m > # CONFIG_SERIO_CT82C710 is not set > # CONFIG_SERIO_PARKBD is not set > # CONFIG_SERIO_PCIPS2 is not set > CONFIG_SERIO_LIBPS2=y > CONFIG_SERIO_RAW=m > # CONFIG_SERIO_ALTERA_PS2 is not set > # CONFIG_SERIO_PS2MULT is not set > # CONFIG_SERIO_ARC_PS2 is not set > CONFIG_GAMEPORT=m > # CONFIG_GAMEPORT_NS558 is not set > # CONFIG_GAMEPORT_L4 is not set > # CONFIG_GAMEPORT_EMU10K1 is not set > # CONFIG_GAMEPORT_FM801 is not set > > # > # Character devices > # > CONFIG_TTY=y > CONFIG_VT=y > CONFIG_CONSOLE_TRANSLATIONS=y > CONFIG_VT_CONSOLE=y > CONFIG_HW_CONSOLE=y > CONFIG_VT_HW_CONSOLE_BINDING=y > CONFIG_UNIX98_PTYS=y > CONFIG_DEVPTS_MULTIPLE_INSTANCES=y > # CONFIG_LEGACY_PTYS is not set > # CONFIG_SERIAL_NONSTANDARD is not set > # CONFIG_NOZOMI is not set > # CONFIG_N_GSM is not set > # CONFIG_TRACE_SINK is not set > CONFIG_DEVKMEM=y > > # > # Serial drivers > # > CONFIG_SERIAL_EARLYCON=y > CONFIG_SERIAL_8250=y > CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y > CONFIG_SERIAL_8250_PNP=y > CONFIG_SERIAL_8250_CONSOLE=y > CONFIG_SERIAL_8250_DMA=y > CONFIG_SERIAL_8250_PCI=y > CONFIG_SERIAL_8250_NR_UARTS=4 > CONFIG_SERIAL_8250_RUNTIME_UARTS=4 > CONFIG_SERIAL_8250_EXTENDED=y > # CONFIG_SERIAL_8250_MANY_PORTS is not set > CONFIG_SERIAL_8250_SHARE_IRQ=y > # CONFIG_SERIAL_8250_DETECT_IRQ is not set > # CONFIG_SERIAL_8250_RSA is not set > # CONFIG_SERIAL_8250_DW is not set > > # > # Non-8250 serial port support > # > # CONFIG_SERIAL_KGDB_NMI is not set > # CONFIG_SERIAL_MAX3100 is not set > # CONFIG_SERIAL_MAX310X is not set > # CONFIG_SERIAL_MFD_HSU is not set > CONFIG_SERIAL_CORE=y > CONFIG_SERIAL_CORE_CONSOLE=y > CONFIG_CONSOLE_POLL=y > # CONFIG_SERIAL_JSM is not set > # CONFIG_SERIAL_SCCNXP is not set > # CONFIG_SERIAL_SC16IS7XX is not set > # CONFIG_SERIAL_ALTERA_JTAGUART is not set > # CONFIG_SERIAL_ALTERA_UART is not set > # CONFIG_SERIAL_IFX6X60 is not set > # CONFIG_SERIAL_ARC is not set > # CONFIG_SERIAL_RP2 is not set > # CONFIG_SERIAL_FSL_LPUART is not set > CONFIG_TTY_PRINTK=y > # CONFIG_PRINTER is not set > # CONFIG_PPDEV is not set > CONFIG_HVC_DRIVER=y > CONFIG_VIRTIO_CONSOLE=m > CONFIG_IPMI_HANDLER=y > CONFIG_IPMI_PANIC_EVENT=y > CONFIG_IPMI_PANIC_STRING=y > CONFIG_IPMI_DEVICE_INTERFACE=y > CONFIG_IPMI_SI=y > CONFIG_IPMI_SI_PROBE_DEFAULTS=y > CONFIG_IPMI_WATCHDOG=m > CONFIG_IPMI_POWEROFF=m > CONFIG_HW_RANDOM=y > CONFIG_HW_RANDOM_TIMERIOMEM=m > CONFIG_HW_RANDOM_INTEL=m > # CONFIG_HW_RANDOM_AMD is not set > # CONFIG_HW_RANDOM_VIA is not set > CONFIG_HW_RANDOM_VIRTIO=m > CONFIG_HW_RANDOM_TPM=m > CONFIG_NVRAM=y > # CONFIG_R3964 is not set > # CONFIG_APPLICOM is not set > # CONFIG_MWAVE is not set > CONFIG_RAW_DRIVER=y > CONFIG_MAX_RAW_DEVS=256 > CONFIG_HPET=y > CONFIG_HPET_MMAP=y > CONFIG_HPET_MMAP_DEFAULT=y > CONFIG_HANGCHECK_TIMER=m > CONFIG_TCG_TPM=m > CONFIG_TCG_TIS=m > CONFIG_TCG_TIS_I2C_ATMEL=m > CONFIG_TCG_TIS_I2C_INFINEON=m > CONFIG_TCG_TIS_I2C_NUVOTON=m > CONFIG_TCG_NSC=m > CONFIG_TCG_ATMEL=m > CONFIG_TCG_INFINEON=m > CONFIG_TCG_ST33_I2C=m > # CONFIG_TELCLOCK is not set > CONFIG_DEVPORT=y > > # > # I2C support > # > CONFIG_I2C=m > CONFIG_I2C_BOARDINFO=y > CONFIG_I2C_COMPAT=y > CONFIG_I2C_CHARDEV=m > CONFIG_I2C_MUX=m > > # > # Multiplexer I2C Chip support > # > CONFIG_I2C_MUX_GPIO=m > CONFIG_I2C_MUX_PCA9541=m > CONFIG_I2C_MUX_PCA954x=m > CONFIG_I2C_HELPER_AUTO=y > CONFIG_I2C_ALGOBIT=m > > # > # I2C Hardware Bus support > # > > # > # PC SMBus host controller drivers > # > # CONFIG_I2C_ALI1535 is not set > # CONFIG_I2C_ALI1563 is not set > # CONFIG_I2C_ALI15X3 is not set > # CONFIG_I2C_AMD756 is not set > # CONFIG_I2C_AMD8111 is not set > CONFIG_I2C_I801=m > CONFIG_I2C_ISCH=m > CONFIG_I2C_ISMT=m > # CONFIG_I2C_PIIX4 is not set > # CONFIG_I2C_NFORCE2 is not set > # CONFIG_I2C_SIS5595 is not set > # CONFIG_I2C_SIS630 is not set > # CONFIG_I2C_SIS96X is not set > # CONFIG_I2C_VIA is not set > # CONFIG_I2C_VIAPRO is not set > > # > # ACPI drivers > # > CONFIG_I2C_SCMI=m > > # > # I2C system bus drivers (mostly embedded / system-on-chip) > # > # CONFIG_I2C_CBUS_GPIO is not set > # CONFIG_I2C_DESIGNWARE_PLATFORM is not set > # CONFIG_I2C_DESIGNWARE_PCI is not set > CONFIG_I2C_GPIO=m > # CONFIG_I2C_OCORES is not set > # CONFIG_I2C_PCA_PLATFORM is not set > # CONFIG_I2C_PXA_PCI is not set > # CONFIG_I2C_SIMTEC is not set > # CONFIG_I2C_XILINX is not set > > # > # External I2C/SMBus adapter drivers > # > # CONFIG_I2C_DIOLAN_U2C is not set > # CONFIG_I2C_PARPORT is not set > # CONFIG_I2C_PARPORT_LIGHT is not set > # CONFIG_I2C_ROBOTFUZZ_OSIF is not set > # CONFIG_I2C_TAOS_EVM is not set > CONFIG_I2C_TINY_USB=m > > # > # Other I2C/SMBus bus drivers > # > CONFIG_I2C_STUB=m > # CONFIG_I2C_DEBUG_CORE is not set > # CONFIG_I2C_DEBUG_ALGO is not set > # CONFIG_I2C_DEBUG_BUS is not set > CONFIG_SPI=y > # CONFIG_SPI_DEBUG is not set > CONFIG_SPI_MASTER=y > > # > # SPI Master Controller Drivers > # > # CONFIG_SPI_ALTERA is not set > # CONFIG_SPI_BITBANG is not set > # CONFIG_SPI_BUTTERFLY is not set > # CONFIG_SPI_GPIO is not set > # CONFIG_SPI_LM70_LLP is not set > # CONFIG_SPI_OC_TINY is not set > # CONFIG_SPI_PXA2XX is not set > # CONFIG_SPI_PXA2XX_PCI is not set > # CONFIG_SPI_SC18IS602 is not set > # CONFIG_SPI_XCOMM is not set > # CONFIG_SPI_XILINX is not set > # CONFIG_SPI_DESIGNWARE is not set > > # > # SPI Protocol Masters > # > # CONFIG_SPI_SPIDEV is not set > # CONFIG_SPI_TLE62X0 is not set > # CONFIG_SPMI is not set > # CONFIG_HSI is not set > > # > # PPS support > # > CONFIG_PPS=y > # CONFIG_PPS_DEBUG is not set > > # > # PPS clients support > # > # CONFIG_PPS_CLIENT_KTIMER is not set > # CONFIG_PPS_CLIENT_LDISC is not set > # CONFIG_PPS_CLIENT_PARPORT is not set > # CONFIG_PPS_CLIENT_GPIO is not set > > # > # PPS generators support > # > > # > # PTP clock support > # > CONFIG_PTP_1588_CLOCK=y > # CONFIG_DP83640_PHY is not set > CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y > CONFIG_GPIOLIB=y > CONFIG_GPIO_DEVRES=y > CONFIG_GPIO_ACPI=y > # CONFIG_DEBUG_GPIO is not set > CONFIG_GPIO_SYSFS=y > CONFIG_GPIO_GENERIC=m > > # > # Memory mapped GPIO drivers: > # > CONFIG_GPIO_GENERIC_PLATFORM=m > # CONFIG_GPIO_IT8761E is not set > # CONFIG_GPIO_F7188X is not set > # CONFIG_GPIO_SCH311X is not set > # CONFIG_GPIO_SCH is not set > CONFIG_GPIO_ICH=m > # CONFIG_GPIO_VX855 is not set > # CONFIG_GPIO_LYNXPOINT is not set > > # > # I2C GPIO expanders: > # > # CONFIG_GPIO_MAX7300 is not set > # CONFIG_GPIO_MAX732X is not set > # CONFIG_GPIO_PCA953X is not set > # CONFIG_GPIO_PCF857X is not set > # CONFIG_GPIO_ADP5588 is not set > > # > # PCI GPIO expanders: > # > # CONFIG_GPIO_BT8XX is not set > # CONFIG_GPIO_AMD8111 is not set > # CONFIG_GPIO_INTEL_MID is not set > # CONFIG_GPIO_ML_IOH is not set > # CONFIG_GPIO_RDC321X is not set > > # > # SPI GPIO expanders: > # > # CONFIG_GPIO_MAX7301 is not set > # CONFIG_GPIO_MC33880 is not set > > # > # AC97 GPIO expanders: > # > > # > # LPC GPIO expanders: > # > > # > # MODULbus GPIO expanders: > # > > # > # USB GPIO expanders: > # > # CONFIG_W1 is not set > CONFIG_POWER_SUPPLY=y > # CONFIG_POWER_SUPPLY_DEBUG is not set > # CONFIG_PDA_POWER is not set > # CONFIG_TEST_POWER is not set > # CONFIG_BATTERY_DS2780 is not set > # CONFIG_BATTERY_DS2781 is not set > # CONFIG_BATTERY_DS2782 is not set > # CONFIG_BATTERY_SBS is not set > # CONFIG_BATTERY_BQ27x00 is not set > # CONFIG_BATTERY_MAX17040 is not set > # CONFIG_BATTERY_MAX17042 is not set > # CONFIG_CHARGER_MAX8903 is not set > # CONFIG_CHARGER_LP8727 is not set > # CONFIG_CHARGER_GPIO is not set > # CONFIG_CHARGER_BQ2415X is not set > # CONFIG_CHARGER_BQ24190 is not set > # CONFIG_CHARGER_BQ24735 is not set > # CONFIG_CHARGER_SMB347 is not set > CONFIG_POWER_RESET=y > # CONFIG_POWER_AVS is not set > CONFIG_HWMON=m > # CONFIG_HWMON_VID is not set > CONFIG_HWMON_DEBUG_CHIP=y > > # > # Native drivers > # > # CONFIG_SENSORS_ABITUGURU is not set > # CONFIG_SENSORS_ABITUGURU3 is not set > # CONFIG_SENSORS_AD7314 is not set > # CONFIG_SENSORS_AD7414 is not set > # CONFIG_SENSORS_AD7418 is not set > # CONFIG_SENSORS_ADM1021 is not set > # CONFIG_SENSORS_ADM1025 is not set > # CONFIG_SENSORS_ADM1026 is not set > # CONFIG_SENSORS_ADM1029 is not set > # CONFIG_SENSORS_ADM1031 is not set > # CONFIG_SENSORS_ADM9240 is not set > # CONFIG_SENSORS_ADT7310 is not set > # CONFIG_SENSORS_ADT7410 is not set > # CONFIG_SENSORS_ADT7411 is not set > # CONFIG_SENSORS_ADT7462 is not set > # CONFIG_SENSORS_ADT7470 is not set > # CONFIG_SENSORS_ADT7475 is not set > # CONFIG_SENSORS_ASC7621 is not set > # CONFIG_SENSORS_K8TEMP is not set > # CONFIG_SENSORS_K10TEMP is not set > # CONFIG_SENSORS_FAM15H_POWER is not set > # CONFIG_SENSORS_APPLESMC is not set > # CONFIG_SENSORS_ASB100 is not set > # CONFIG_SENSORS_ATXP1 is not set > # CONFIG_SENSORS_DS620 is not set > # CONFIG_SENSORS_DS1621 is not set > CONFIG_SENSORS_I5K_AMB=m > # CONFIG_SENSORS_F71805F is not set > # CONFIG_SENSORS_F71882FG is not set > # CONFIG_SENSORS_F75375S is not set > # CONFIG_SENSORS_FSCHMD is not set > # CONFIG_SENSORS_GL518SM is not set > # CONFIG_SENSORS_GL520SM is not set > # CONFIG_SENSORS_G760A is not set > # CONFIG_SENSORS_G762 is not set > CONFIG_SENSORS_GPIO_FAN=m > # CONFIG_SENSORS_HIH6130 is not set > # CONFIG_SENSORS_IBMAEM is not set > # CONFIG_SENSORS_IBMPEX is not set > CONFIG_SENSORS_CORETEMP=m > # CONFIG_SENSORS_IT87 is not set > # CONFIG_SENSORS_JC42 is not set > # CONFIG_SENSORS_POWR1220 is not set > # CONFIG_SENSORS_LINEAGE is not set > # CONFIG_SENSORS_LTC2945 is not set > # CONFIG_SENSORS_LTC4151 is not set > # CONFIG_SENSORS_LTC4215 is not set > # CONFIG_SENSORS_LTC4222 is not set > # CONFIG_SENSORS_LTC4245 is not set > # CONFIG_SENSORS_LTC4260 is not set > # CONFIG_SENSORS_LTC4261 is not set > # CONFIG_SENSORS_MAX1111 is not set > # CONFIG_SENSORS_MAX16065 is not set > # CONFIG_SENSORS_MAX1619 is not set > # CONFIG_SENSORS_MAX1668 is not set > # CONFIG_SENSORS_MAX197 is not set > # CONFIG_SENSORS_MAX6639 is not set > # CONFIG_SENSORS_MAX6642 is not set > # CONFIG_SENSORS_MAX6650 is not set > # CONFIG_SENSORS_MAX6697 is not set > # CONFIG_SENSORS_HTU21 is not set > # CONFIG_SENSORS_MCP3021 is not set > # CONFIG_SENSORS_ADCXX is not set > # CONFIG_SENSORS_LM63 is not set > # CONFIG_SENSORS_LM70 is not set > # CONFIG_SENSORS_LM73 is not set > # CONFIG_SENSORS_LM75 is not set > # CONFIG_SENSORS_LM77 is not set > # CONFIG_SENSORS_LM78 is not set > # CONFIG_SENSORS_LM80 is not set > # CONFIG_SENSORS_LM83 is not set > # CONFIG_SENSORS_LM85 is not set > # CONFIG_SENSORS_LM87 is not set > # CONFIG_SENSORS_LM90 is not set > # CONFIG_SENSORS_LM92 is not set > # CONFIG_SENSORS_LM93 is not set > # CONFIG_SENSORS_LM95234 is not set > # CONFIG_SENSORS_LM95241 is not set > # CONFIG_SENSORS_LM95245 is not set > # CONFIG_SENSORS_PC87360 is not set > # CONFIG_SENSORS_PC87427 is not set > # CONFIG_SENSORS_NTC_THERMISTOR is not set > # CONFIG_SENSORS_NCT6683 is not set > # CONFIG_SENSORS_NCT6775 is not set > # CONFIG_SENSORS_PCF8591 is not set > CONFIG_PMBUS=m > CONFIG_SENSORS_PMBUS=m > # CONFIG_SENSORS_ADM1275 is not set > # CONFIG_SENSORS_LM25066 is not set > # CONFIG_SENSORS_LTC2978 is not set > # CONFIG_SENSORS_MAX16064 is not set > # CONFIG_SENSORS_MAX34440 is not set > # CONFIG_SENSORS_MAX8688 is not set > # CONFIG_SENSORS_TPS40422 is not set > # CONFIG_SENSORS_UCD9000 is not set > # CONFIG_SENSORS_UCD9200 is not set > # CONFIG_SENSORS_ZL6100 is not set > # CONFIG_SENSORS_SHT15 is not set > # CONFIG_SENSORS_SHT21 is not set > # CONFIG_SENSORS_SHTC1 is not set > # CONFIG_SENSORS_SIS5595 is not set > # CONFIG_SENSORS_DME1737 is not set > # CONFIG_SENSORS_EMC1403 is not set > # CONFIG_SENSORS_EMC2103 is not set > # CONFIG_SENSORS_EMC6W201 is not set > # CONFIG_SENSORS_SMSC47M1 is not set > # CONFIG_SENSORS_SMSC47M192 is not set > # CONFIG_SENSORS_SMSC47B397 is not set > # CONFIG_SENSORS_SCH56XX_COMMON is not set > # CONFIG_SENSORS_SCH5627 is not set > # CONFIG_SENSORS_SCH5636 is not set > # CONFIG_SENSORS_SMM665 is not set > # CONFIG_SENSORS_ADC128D818 is not set > # CONFIG_SENSORS_ADS1015 is not set > # CONFIG_SENSORS_ADS7828 is not set > # CONFIG_SENSORS_ADS7871 is not set > # CONFIG_SENSORS_AMC6821 is not set > # CONFIG_SENSORS_INA209 is not set > # CONFIG_SENSORS_INA2XX is not set > # CONFIG_SENSORS_THMC50 is not set > # CONFIG_SENSORS_TMP102 is not set > # CONFIG_SENSORS_TMP103 is not set > # CONFIG_SENSORS_TMP401 is not set > # CONFIG_SENSORS_TMP421 is not set > # CONFIG_SENSORS_VIA_CPUTEMP is not set > # CONFIG_SENSORS_VIA686A is not set > # CONFIG_SENSORS_VT1211 is not set > # CONFIG_SENSORS_VT8231 is not set > # CONFIG_SENSORS_W83781D is not set > # CONFIG_SENSORS_W83791D is not set > # CONFIG_SENSORS_W83792D is not set > # CONFIG_SENSORS_W83793 is not set > # CONFIG_SENSORS_W83795 is not set > # CONFIG_SENSORS_W83L785TS is not set > # CONFIG_SENSORS_W83L786NG is not set > # CONFIG_SENSORS_W83627HF is not set > # CONFIG_SENSORS_W83627EHF is not set > > # > # ACPI drivers > # > # CONFIG_SENSORS_ACPI_POWER is not set > # CONFIG_SENSORS_ATK0110 is not set > CONFIG_THERMAL=m > CONFIG_THERMAL_HWMON=y > CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y > # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set > # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set > # CONFIG_THERMAL_GOV_FAIR_SHARE is not set > CONFIG_THERMAL_GOV_STEP_WISE=y > CONFIG_THERMAL_GOV_USER_SPACE=y > # CONFIG_THERMAL_EMULATION is not set > # CONFIG_INTEL_POWERCLAMP is not set > CONFIG_X86_PKG_TEMP_THERMAL=m > # CONFIG_ACPI_INT3403_THERMAL is not set > # CONFIG_INTEL_SOC_DTS_THERMAL is not set > > # > # Texas Instruments thermal drivers > # > CONFIG_WATCHDOG=y > CONFIG_WATCHDOG_CORE=y > # CONFIG_WATCHDOG_NOWAYOUT is not set > > # > # Watchdog Device Drivers > # > # CONFIG_SOFT_WATCHDOG is not set > # CONFIG_XILINX_WATCHDOG is not set > # CONFIG_DW_WATCHDOG is not set > # CONFIG_ACQUIRE_WDT is not set > # CONFIG_ADVANTECH_WDT is not set > # CONFIG_ALIM1535_WDT is not set > # CONFIG_ALIM7101_WDT is not set > # CONFIG_F71808E_WDT is not set > # CONFIG_SP5100_TCO is not set > # CONFIG_SBC_FITPC2_WATCHDOG is not set > # CONFIG_EUROTECH_WDT is not set > # CONFIG_IB700_WDT is not set > # CONFIG_IBMASR is not set > # CONFIG_WAFER_WDT is not set > # CONFIG_I6300ESB_WDT is not set > # CONFIG_IE6XX_WDT is not set > CONFIG_ITCO_WDT=m > CONFIG_ITCO_VENDOR_SUPPORT=y > # CONFIG_IT8712F_WDT is not set > # CONFIG_IT87_WDT is not set > # CONFIG_HP_WATCHDOG is not set > # CONFIG_SC1200_WDT is not set > # CONFIG_PC87413_WDT is not set > # CONFIG_NV_TCO is not set > # CONFIG_60XX_WDT is not set > # CONFIG_CPU5_WDT is not set > # CONFIG_SMSC_SCH311X_WDT is not set > # CONFIG_SMSC37B787_WDT is not set > # CONFIG_VIA_WDT is not set > # CONFIG_W83627HF_WDT is not set > # CONFIG_W83877F_WDT is not set > # CONFIG_W83977F_WDT is not set > # CONFIG_MACHZ_WDT is not set > # CONFIG_SBC_EPX_C3_WATCHDOG is not set > # CONFIG_MEN_A21_WDT is not set > > # > # PCI-based Watchdog Cards > # > # CONFIG_PCIPCWATCHDOG is not set > # CONFIG_WDTPCI is not set > > # > # USB-based Watchdog Cards > # > # CONFIG_USBPCWATCHDOG is not set > CONFIG_SSB_POSSIBLE=y > > # > # Sonics Silicon Backplane > # > # CONFIG_SSB is not set > CONFIG_BCMA_POSSIBLE=y > > # > # Broadcom specific AMBA > # > # CONFIG_BCMA is not set > > # > # Multifunction device drivers > # > CONFIG_MFD_CORE=y > # CONFIG_MFD_BCM590XX is not set > # CONFIG_MFD_CROS_EC is not set > # CONFIG_MFD_DA9052_SPI is not set > # CONFIG_MFD_MC13XXX_SPI is not set > # CONFIG_MFD_MC13XXX_I2C is not set > # CONFIG_HTC_PASIC3 is not set > CONFIG_LPC_ICH=y > CONFIG_LPC_SCH=m > # CONFIG_MFD_JANZ_CMODIO is not set > # CONFIG_MFD_KEMPLD is not set > # CONFIG_EZX_PCAP is not set > # CONFIG_MFD_VIPERBOARD is not set > # CONFIG_MFD_RETU is not set > # CONFIG_MFD_PCF50633 is not set > # CONFIG_MFD_RDC321X is not set > # CONFIG_MFD_RTSX_PCI is not set > # CONFIG_MFD_RTSX_USB is not set > # CONFIG_MFD_SI476X_CORE is not set > # CONFIG_MFD_SM501 is not set > # CONFIG_ABX500_CORE is not set > # CONFIG_MFD_SYSCON is not set > # CONFIG_MFD_TI_AM335X_TSCADC is not set > # CONFIG_MFD_LP3943 is not set > # CONFIG_TPS6105X is not set > # CONFIG_TPS65010 is not set > # CONFIG_TPS6507X is not set > # CONFIG_MFD_TPS65217 is not set > # CONFIG_MFD_TPS65218 is not set > # CONFIG_MFD_TPS65912 is not set > # CONFIG_MFD_TPS65912_SPI is not set > # CONFIG_MFD_WL1273_CORE is not set > # CONFIG_MFD_LM3533 is not set > # CONFIG_MFD_TMIO is not set > # CONFIG_MFD_VX855 is not set > # CONFIG_MFD_ARIZONA_I2C is not set > # CONFIG_MFD_ARIZONA_SPI is not set > # CONFIG_MFD_WM831X_SPI is not set > # CONFIG_REGULATOR is not set > # CONFIG_MEDIA_SUPPORT is not set > > # > # Graphics support > # > CONFIG_AGP=m > # CONFIG_AGP_INTEL is not set > # CONFIG_AGP_SIS is not set > # CONFIG_AGP_VIA is not set > # CONFIG_VGA_ARB is not set > # CONFIG_VGA_SWITCHEROO is not set > > # > # Direct Rendering Manager > # > CONFIG_DRM=m > CONFIG_DRM_KMS_HELPER=m > # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set > CONFIG_DRM_TTM=m > > # > # I2C encoder or helper chips > # > # CONFIG_DRM_I2C_CH7006 is not set > # CONFIG_DRM_I2C_SIL164 is not set > # CONFIG_DRM_I2C_NXP_TDA998X is not set > # CONFIG_DRM_PTN3460 is not set > # CONFIG_DRM_TDFX is not set > # CONFIG_DRM_R128 is not set > # CONFIG_DRM_RADEON is not set > # CONFIG_DRM_NOUVEAU is not set > # CONFIG_DRM_I915 is not set > # CONFIG_DRM_MGA is not set > # CONFIG_DRM_SIS is not set > # CONFIG_DRM_VIA is not set > # CONFIG_DRM_SAVAGE is not set > CONFIG_DRM_VMWGFX=m > CONFIG_DRM_VMWGFX_FBCON=y > # CONFIG_DRM_GMA500 is not set > # CONFIG_DRM_UDL is not set > # CONFIG_DRM_AST is not set > # CONFIG_DRM_MGAG200 is not set > # CONFIG_DRM_CIRRUS_QEMU is not set > # CONFIG_DRM_QXL is not set > # CONFIG_DRM_BOCHS is not set > > # > # Frame buffer Devices > # > CONFIG_FB=m > # CONFIG_FIRMWARE_EDID is not set > CONFIG_FB_DDC=m > # CONFIG_FB_BOOT_VESA_SUPPORT is not set > CONFIG_FB_CFB_FILLRECT=m > CONFIG_FB_CFB_COPYAREA=m > CONFIG_FB_CFB_IMAGEBLIT=m > # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set > # CONFIG_FB_SYS_FILLRECT is not set > # CONFIG_FB_SYS_COPYAREA is not set > # CONFIG_FB_SYS_IMAGEBLIT is not set > # CONFIG_FB_FOREIGN_ENDIAN is not set > # CONFIG_FB_SYS_FOPS is not set > CONFIG_FB_DEFERRED_IO=y > # CONFIG_FB_SVGALIB is not set > # CONFIG_FB_MACMODES is not set > # CONFIG_FB_BACKLIGHT is not set > CONFIG_FB_MODE_HELPERS=y > CONFIG_FB_TILEBLITTING=y > > # > # Frame buffer hardware drivers > # > # CONFIG_FB_CIRRUS is not set > # CONFIG_FB_PM2 is not set > # CONFIG_FB_CYBER2000 is not set > # CONFIG_FB_ARC is not set > CONFIG_FB_VGA16=m > # CONFIG_FB_UVESA is not set > # CONFIG_FB_N411 is not set > # CONFIG_FB_HGA is not set > # CONFIG_FB_OPENCORES is not set > # CONFIG_FB_S1D13XXX is not set > CONFIG_FB_NVIDIA=m > CONFIG_FB_NVIDIA_I2C=y > # CONFIG_FB_NVIDIA_DEBUG is not set > # CONFIG_FB_NVIDIA_BACKLIGHT is not set > # CONFIG_FB_RIVA is not set > # CONFIG_FB_I740 is not set > # CONFIG_FB_LE80578 is not set > CONFIG_FB_MATROX=m > # CONFIG_FB_MATROX_MILLENIUM is not set > # CONFIG_FB_MATROX_MYSTIQUE is not set > # CONFIG_FB_MATROX_G is not set > CONFIG_FB_MATROX_I2C=m > # CONFIG_FB_RADEON is not set > # CONFIG_FB_ATY128 is not set > # CONFIG_FB_ATY is not set > # CONFIG_FB_S3 is not set > # CONFIG_FB_SAVAGE is not set > # CONFIG_FB_SIS is not set > # CONFIG_FB_VIA is not set > # CONFIG_FB_NEOMAGIC is not set > # CONFIG_FB_KYRO is not set > # CONFIG_FB_3DFX is not set > # CONFIG_FB_VOODOO1 is not set > # CONFIG_FB_VT8623 is not set > # CONFIG_FB_TRIDENT is not set > # CONFIG_FB_ARK is not set > # CONFIG_FB_PM3 is not set > # CONFIG_FB_CARMINE is not set > # CONFIG_FB_SMSCUFX is not set > # CONFIG_FB_UDL is not set > # CONFIG_FB_VIRTUAL is not set > # CONFIG_FB_METRONOME is not set > # CONFIG_FB_MB862XX is not set > # CONFIG_FB_BROADSHEET is not set > # CONFIG_FB_AUO_K190X is not set > # CONFIG_BACKLIGHT_LCD_SUPPORT is not set > CONFIG_VGASTATE=m > CONFIG_HDMI=y > > # > # Console display driver support > # > CONFIG_VGA_CONSOLE=y > CONFIG_VGACON_SOFT_SCROLLBACK=y > CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=1024 > CONFIG_DUMMY_CONSOLE=y > CONFIG_FRAMEBUFFER_CONSOLE=m > # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set > # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set > CONFIG_LOGO=y > # CONFIG_LOGO_LINUX_MONO is not set > # CONFIG_LOGO_LINUX_VGA16 is not set > CONFIG_LOGO_LINUX_CLUT224=y > # CONFIG_SOUND is not set > > # > # HID support > # > CONFIG_HID=y > # CONFIG_HID_BATTERY_STRENGTH is not set > CONFIG_HIDRAW=y > # CONFIG_UHID is not set > CONFIG_HID_GENERIC=y > > # > # Special HID drivers > # > # CONFIG_HID_A4TECH is not set > # CONFIG_HID_ACRUX is not set > # CONFIG_HID_APPLE is not set > # CONFIG_HID_APPLEIR is not set > # CONFIG_HID_AUREAL is not set > # CONFIG_HID_BELKIN is not set > # CONFIG_HID_CHERRY is not set > # CONFIG_HID_CHICONY is not set > # CONFIG_HID_CP2112 is not set > # CONFIG_HID_CYPRESS is not set > # CONFIG_HID_DRAGONRISE is not set > # CONFIG_HID_EMS_FF is not set > # CONFIG_HID_ELECOM is not set > # CONFIG_HID_ELO is not set > # CONFIG_HID_EZKEY is not set > # CONFIG_HID_HOLTEK is not set > # CONFIG_HID_GT683R is not set > # CONFIG_HID_HUION is not set > # CONFIG_HID_KEYTOUCH is not set > # CONFIG_HID_KYE is not set > # CONFIG_HID_UCLOGIC is not set > # CONFIG_HID_WALTOP is not set > # CONFIG_HID_GYRATION is not set > # CONFIG_HID_ICADE is not set > # CONFIG_HID_TWINHAN is not set > CONFIG_HID_KENSINGTON=y > # CONFIG_HID_LCPOWER is not set > # CONFIG_HID_LENOVO is not set > # CONFIG_HID_LOGITECH is not set > # CONFIG_HID_MAGICMOUSE is not set > CONFIG_HID_MICROSOFT=m > # CONFIG_HID_MONTEREY is not set > # CONFIG_HID_MULTITOUCH is not set > # CONFIG_HID_NTRIG is not set > # CONFIG_HID_ORTEK is not set > # CONFIG_HID_PANTHERLORD is not set > # CONFIG_HID_PETALYNX is not set > # CONFIG_HID_PICOLCD is not set > # CONFIG_HID_PRIMAX is not set > # CONFIG_HID_ROCCAT is not set > # CONFIG_HID_SAITEK is not set > # CONFIG_HID_SAMSUNG is not set > # CONFIG_HID_SONY is not set > # CONFIG_HID_SPEEDLINK is not set > # CONFIG_HID_STEELSERIES is not set > # CONFIG_HID_SUNPLUS is not set > # CONFIG_HID_RMI is not set > # CONFIG_HID_GREENASIA is not set > # CONFIG_HID_SMARTJOYPLUS is not set > # CONFIG_HID_TIVO is not set > # CONFIG_HID_TOPSEED is not set > # CONFIG_HID_THINGM is not set > # CONFIG_HID_THRUSTMASTER is not set > # CONFIG_HID_WACOM is not set > # CONFIG_HID_WIIMOTE is not set > # CONFIG_HID_XINMO is not set > # CONFIG_HID_ZEROPLUS is not set > # CONFIG_HID_ZYDACRON is not set > # CONFIG_HID_SENSOR_HUB is not set > > # > # USB HID support > # > CONFIG_USB_HID=y > CONFIG_HID_PID=y > CONFIG_USB_HIDDEV=y > > # > # I2C HID support > # > # CONFIG_I2C_HID is not set > CONFIG_USB_OHCI_LITTLE_ENDIAN=y > CONFIG_USB_SUPPORT=y > CONFIG_USB_COMMON=y > CONFIG_USB_ARCH_HAS_HCD=y > CONFIG_USB=y > CONFIG_USB_ANNOUNCE_NEW_DEVICES=y > > # > # Miscellaneous USB options > # > CONFIG_USB_DEFAULT_PERSIST=y > # CONFIG_USB_DYNAMIC_MINORS is not set > # CONFIG_USB_OTG is not set > # CONFIG_USB_OTG_WHITELIST is not set > # CONFIG_USB_OTG_BLACKLIST_HUB is not set > # CONFIG_USB_OTG_FSM is not set > CONFIG_USB_MON=y > # CONFIG_USB_WUSB_CBAF is not set > > # > # USB Host Controller Drivers > # > # CONFIG_USB_C67X00_HCD is not set > # CONFIG_USB_XHCI_HCD is not set > CONFIG_USB_EHCI_HCD=y > CONFIG_USB_EHCI_ROOT_HUB_TT=y > CONFIG_USB_EHCI_TT_NEWSCHED=y > CONFIG_USB_EHCI_PCI=y > # CONFIG_USB_EHCI_HCD_PLATFORM is not set > # CONFIG_USB_OXU210HP_HCD is not set > # CONFIG_USB_ISP116X_HCD is not set > # CONFIG_USB_ISP1760_HCD is not set > # CONFIG_USB_ISP1362_HCD is not set > # CONFIG_USB_FUSBH200_HCD is not set > # CONFIG_USB_FOTG210_HCD is not set > # CONFIG_USB_MAX3421_HCD is not set > # CONFIG_USB_OHCI_HCD is not set > CONFIG_USB_UHCI_HCD=y > # CONFIG_USB_SL811_HCD is not set > # CONFIG_USB_R8A66597_HCD is not set > # CONFIG_USB_HCD_TEST_MODE is not set > > # > # USB Device Class drivers > # > # CONFIG_USB_ACM is not set > # CONFIG_USB_PRINTER is not set > # CONFIG_USB_WDM is not set > # CONFIG_USB_TMC is not set > > # > # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may > # > > # > # also be needed; see USB_STORAGE Help for more info > # > CONFIG_USB_STORAGE=m > # CONFIG_USB_STORAGE_DEBUG is not set > # CONFIG_USB_STORAGE_REALTEK is not set > # CONFIG_USB_STORAGE_DATAFAB is not set > # CONFIG_USB_STORAGE_FREECOM is not set > # CONFIG_USB_STORAGE_ISD200 is not set > # CONFIG_USB_STORAGE_USBAT is not set > # CONFIG_USB_STORAGE_SDDR09 is not set > # CONFIG_USB_STORAGE_SDDR55 is not set > # CONFIG_USB_STORAGE_JUMPSHOT is not set > # CONFIG_USB_STORAGE_ALAUDA is not set > # CONFIG_USB_STORAGE_ONETOUCH is not set > # CONFIG_USB_STORAGE_KARMA is not set > # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set > # CONFIG_USB_STORAGE_ENE_UB6250 is not set > # CONFIG_USB_UAS is not set > > # > # USB Imaging devices > # > # CONFIG_USB_MDC800 is not set > # CONFIG_USB_MICROTEK is not set > CONFIG_USBIP_CORE=m > CONFIG_USBIP_VHCI_HCD=m > CONFIG_USBIP_HOST=m > # CONFIG_USBIP_DEBUG is not set > # CONFIG_USB_MUSB_HDRC is not set > # CONFIG_USB_DWC3 is not set > # CONFIG_USB_DWC2 is not set > # CONFIG_USB_CHIPIDEA is not set > > # > # USB port drivers > # > # CONFIG_USB_USS720 is not set > # CONFIG_USB_SERIAL is not set > > # > # USB Miscellaneous drivers > # > # CONFIG_USB_EMI62 is not set > # CONFIG_USB_EMI26 is not set > # CONFIG_USB_ADUTUX is not set > # CONFIG_USB_SEVSEG is not set > # CONFIG_USB_RIO500 is not set > # CONFIG_USB_LEGOTOWER is not set > # CONFIG_USB_LCD is not set > # CONFIG_USB_LED is not set > # CONFIG_USB_CYPRESS_CY7C63 is not set > # CONFIG_USB_CYTHERM is not set > # CONFIG_USB_IDMOUSE is not set > # CONFIG_USB_FTDI_ELAN is not set > # CONFIG_USB_APPLEDISPLAY is not set > # CONFIG_USB_SISUSBVGA is not set > # CONFIG_USB_LD is not set > # CONFIG_USB_TRANCEVIBRATOR is not set > # CONFIG_USB_IOWARRIOR is not set > # CONFIG_USB_TEST is not set > # CONFIG_USB_EHSET_TEST_FIXTURE is not set > # CONFIG_USB_ISIGHTFW is not set > # CONFIG_USB_YUREX is not set > # CONFIG_USB_EZUSB_FX2 is not set > # CONFIG_USB_HSIC_USB3503 is not set > # CONFIG_USB_LINK_LAYER_TEST is not set > > # > # USB Physical Layer drivers > # > # CONFIG_USB_PHY is not set > # CONFIG_NOP_USB_XCEIV is not set > # CONFIG_SAMSUNG_USB2PHY is not set > # CONFIG_SAMSUNG_USB3PHY is not set > # CONFIG_USB_GPIO_VBUS is not set > # CONFIG_USB_ISP1301 is not set > # CONFIG_USB_GADGET is not set > # CONFIG_UWB is not set > # CONFIG_MMC is not set > # CONFIG_MEMSTICK is not set > CONFIG_NEW_LEDS=y > CONFIG_LEDS_CLASS=y > > # > # LED drivers > # > # CONFIG_LEDS_LM3530 is not set > # CONFIG_LEDS_LM3642 is not set > # CONFIG_LEDS_PCA9532 is not set > # CONFIG_LEDS_GPIO is not set > # CONFIG_LEDS_LP3944 is not set > # CONFIG_LEDS_LP5521 is not set > # CONFIG_LEDS_LP5523 is not set > # CONFIG_LEDS_LP5562 is not set > # CONFIG_LEDS_LP8501 is not set > # CONFIG_LEDS_CLEVO_MAIL is not set > # CONFIG_LEDS_PCA955X is not set > # CONFIG_LEDS_PCA963X is not set > # CONFIG_LEDS_DAC124S085 is not set > # CONFIG_LEDS_BD2802 is not set > # CONFIG_LEDS_INTEL_SS4200 is not set > # CONFIG_LEDS_LT3593 is not set > # CONFIG_LEDS_DELL_NETBOOKS is not set > # CONFIG_LEDS_TCA6507 is not set > # CONFIG_LEDS_LM355x is not set > > # > # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) > # > # CONFIG_LEDS_BLINKM is not set > > # > # LED Triggers > # > # CONFIG_LEDS_TRIGGERS is not set > # CONFIG_ACCESSIBILITY is not set > # CONFIG_INFINIBAND is not set > CONFIG_EDAC=y > CONFIG_EDAC_LEGACY_SYSFS=y > # CONFIG_EDAC_DEBUG is not set > CONFIG_EDAC_MM_EDAC=y > # CONFIG_EDAC_GHES is not set > # CONFIG_EDAC_E752X is not set > # CONFIG_EDAC_I82975X is not set > # CONFIG_EDAC_I3000 is not set > # CONFIG_EDAC_I3200 is not set > # CONFIG_EDAC_IE31200 is not set > # CONFIG_EDAC_X38 is not set > # CONFIG_EDAC_I5400 is not set > CONFIG_EDAC_I7CORE=m > # CONFIG_EDAC_I5000 is not set > # CONFIG_EDAC_I5100 is not set > # CONFIG_EDAC_I7300 is not set > # CONFIG_EDAC_SBRIDGE is not set > CONFIG_RTC_LIB=y > CONFIG_RTC_CLASS=y > CONFIG_RTC_HCTOSYS=y > CONFIG_RTC_SYSTOHC=y > CONFIG_RTC_HCTOSYS_DEVICE="rtc0" > # CONFIG_RTC_DEBUG is not set > > # > # RTC interfaces > # > CONFIG_RTC_INTF_SYSFS=y > CONFIG_RTC_INTF_PROC=y > CONFIG_RTC_INTF_DEV=y > # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set > # CONFIG_RTC_DRV_TEST is not set > > # > # I2C RTC drivers > # > # CONFIG_RTC_DRV_DS1307 is not set > # CONFIG_RTC_DRV_DS1374 is not set > # CONFIG_RTC_DRV_DS1672 is not set > # CONFIG_RTC_DRV_DS3232 is not set > # CONFIG_RTC_DRV_MAX6900 is not set > # CONFIG_RTC_DRV_RS5C372 is not set > # CONFIG_RTC_DRV_ISL1208 is not set > # CONFIG_RTC_DRV_ISL12022 is not set > # CONFIG_RTC_DRV_ISL12057 is not set > # CONFIG_RTC_DRV_X1205 is not set > # CONFIG_RTC_DRV_PCF2127 is not set > # CONFIG_RTC_DRV_PCF8523 is not set > # CONFIG_RTC_DRV_PCF8563 is not set > # CONFIG_RTC_DRV_PCF85063 is not set > # CONFIG_RTC_DRV_PCF8583 is not set > # CONFIG_RTC_DRV_M41T80 is not set > # CONFIG_RTC_DRV_BQ32K is not set > # CONFIG_RTC_DRV_S35390A is not set > # CONFIG_RTC_DRV_FM3130 is not set > # CONFIG_RTC_DRV_RX8581 is not set > # CONFIG_RTC_DRV_RX8025 is not set > # CONFIG_RTC_DRV_EM3027 is not set > # CONFIG_RTC_DRV_RV3029C2 is not set > > # > # SPI RTC drivers > # > # CONFIG_RTC_DRV_M41T93 is not set > # CONFIG_RTC_DRV_M41T94 is not set > # CONFIG_RTC_DRV_DS1305 is not set > # CONFIG_RTC_DRV_DS1343 is not set > # CONFIG_RTC_DRV_DS1347 is not set > # CONFIG_RTC_DRV_DS1390 is not set > # CONFIG_RTC_DRV_MAX6902 is not set > # CONFIG_RTC_DRV_R9701 is not set > # CONFIG_RTC_DRV_RS5C348 is not set > # CONFIG_RTC_DRV_DS3234 is not set > # CONFIG_RTC_DRV_PCF2123 is not set > # CONFIG_RTC_DRV_RX4581 is not set > # CONFIG_RTC_DRV_MCP795 is not set > > # > # Platform RTC drivers > # > CONFIG_RTC_DRV_CMOS=y > # CONFIG_RTC_DRV_DS1286 is not set > # CONFIG_RTC_DRV_DS1511 is not set > # CONFIG_RTC_DRV_DS1553 is not set > # CONFIG_RTC_DRV_DS1742 is not set > # CONFIG_RTC_DRV_DS2404 is not set > # CONFIG_RTC_DRV_EFI is not set > # CONFIG_RTC_DRV_STK17TA8 is not set > # CONFIG_RTC_DRV_M48T86 is not set > # CONFIG_RTC_DRV_M48T35 is not set > # CONFIG_RTC_DRV_M48T59 is not set > # CONFIG_RTC_DRV_MSM6242 is not set > # CONFIG_RTC_DRV_BQ4802 is not set > # CONFIG_RTC_DRV_RP5C01 is not set > # CONFIG_RTC_DRV_V3020 is not set > > # > # on-CPU RTC drivers > # > # CONFIG_RTC_DRV_XGENE is not set > > # > # HID Sensor RTC drivers > # > # CONFIG_RTC_DRV_HID_SENSOR_TIME is not set > CONFIG_DMADEVICES=y > # CONFIG_DMADEVICES_DEBUG is not set > > # > # DMA Devices > # > # CONFIG_INTEL_MID_DMAC is not set > CONFIG_INTEL_IOATDMA=m > # CONFIG_DW_DMAC_CORE is not set > # CONFIG_DW_DMAC is not set > # CONFIG_DW_DMAC_PCI is not set > CONFIG_DMA_ENGINE=y > CONFIG_DMA_ACPI=y > > # > # DMA Clients > # > CONFIG_ASYNC_TX_DMA=y > # CONFIG_DMATEST is not set > CONFIG_DMA_ENGINE_RAID=y > CONFIG_DCA=m > # CONFIG_AUXDISPLAY is not set > CONFIG_UIO=m > # CONFIG_UIO_CIF is not set > # CONFIG_UIO_PDRV_GENIRQ is not set > # CONFIG_UIO_DMEM_GENIRQ is not set > # CONFIG_UIO_AEC is not set > # CONFIG_UIO_SERCOS3 is not set > # CONFIG_UIO_PCI_GENERIC is not set > # CONFIG_UIO_NETX is not set > # CONFIG_UIO_MF624 is not set > CONFIG_VFIO_IOMMU_TYPE1=m > CONFIG_VFIO=m > # CONFIG_VFIO_PCI is not set > CONFIG_VIRT_DRIVERS=y > CONFIG_VIRTIO=m > > # > # Virtio drivers > # > CONFIG_VIRTIO_PCI=m > CONFIG_VIRTIO_BALLOON=m > CONFIG_VIRTIO_MMIO=m > # CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set > > # > # Microsoft Hyper-V guest support > # > # CONFIG_STAGING is not set > CONFIG_X86_PLATFORM_DEVICES=y > # CONFIG_ACERHDF is not set > # CONFIG_ALIENWARE_WMI is not set > # CONFIG_ASUS_LAPTOP is not set > # CONFIG_DELL_WMI is not set > # CONFIG_DELL_WMI_AIO is not set > # CONFIG_DELL_SMO8800 is not set > # CONFIG_FUJITSU_TABLET is not set > # CONFIG_HP_ACCEL is not set > # CONFIG_HP_WIRELESS is not set > # CONFIG_HP_WMI is not set > # CONFIG_THINKPAD_ACPI is not set > # CONFIG_SENSORS_HDAPS is not set > # CONFIG_INTEL_MENLOW is not set > CONFIG_ACPI_WMI=m > # CONFIG_TOPSTAR_LAPTOP is not set > # CONFIG_TOSHIBA_BT_RFKILL is not set > # CONFIG_TOSHIBA_HAPS is not set > # CONFIG_ACPI_CMPC is not set > # CONFIG_INTEL_IPS is not set > # CONFIG_IBM_RTL is not set > # CONFIG_MXM_WMI is not set > # CONFIG_SAMSUNG_Q10 is not set > # CONFIG_INTEL_RST is not set > # CONFIG_INTEL_SMARTCONNECT is not set > # CONFIG_PVPANIC is not set > # CONFIG_CHROME_PLATFORMS is not set > > # > # SOC (System On Chip) specific Drivers > # > > # > # Hardware Spinlock drivers > # > > # > # Clock Source drivers > # > CONFIG_CLKEVT_I8253=y > CONFIG_I8253_LOCK=y > CONFIG_CLKBLD_I8253=y > # CONFIG_SH_TIMER_CMT is not set > # CONFIG_SH_TIMER_MTU2 is not set > # CONFIG_SH_TIMER_TMU is not set > # CONFIG_EM_TIMER_STI is not set > # CONFIG_MAILBOX is not set > CONFIG_IOMMU_API=y > CONFIG_IOMMU_SUPPORT=y > # CONFIG_AMD_IOMMU is not set > CONFIG_DMAR_TABLE=y > CONFIG_INTEL_IOMMU=y > CONFIG_INTEL_IOMMU_DEFAULT_ON=y > CONFIG_INTEL_IOMMU_FLOPPY_WA=y > CONFIG_IRQ_REMAP=y > > # > # Remoteproc drivers > # > # CONFIG_STE_MODEM_RPROC is not set > > # > # Rpmsg drivers > # > # CONFIG_PM_DEVFREQ is not set > # CONFIG_EXTCON is not set > CONFIG_MEMORY=y > # CONFIG_IIO is not set > # CONFIG_NTB is not set > # CONFIG_VME_BUS is not set > # CONFIG_PWM is not set > # CONFIG_IPACK_BUS is not set > # CONFIG_RESET_CONTROLLER is not set > # CONFIG_FMC is not set > > # > # PHY Subsystem > # > CONFIG_GENERIC_PHY=y > # CONFIG_BCM_KONA_USB2_PHY is not set > # CONFIG_POWERCAP is not set > # CONFIG_MCB is not set > CONFIG_RAS=y > # CONFIG_THUNDERBOLT is not set > > # > # Firmware Drivers > # > CONFIG_EDD=m > # CONFIG_EDD_OFF is not set > CONFIG_FIRMWARE_MEMMAP=y > CONFIG_DELL_RBU=m > CONFIG_DCDBAS=y > CONFIG_DMIID=y > CONFIG_DMI_SYSFS=y > CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK=y > # CONFIG_ISCSI_IBFT_FIND is not set > # CONFIG_GOOGLE_FIRMWARE is not set > > # > # EFI (Extensible Firmware Interface) Support > # > CONFIG_EFI_VARS=m > CONFIG_EFI_VARS_PSTORE=m > CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y > CONFIG_EFI_RUNTIME_MAP=y > CONFIG_EFI_RUNTIME_WRAPPERS=y > CONFIG_UEFI_CPER=y > > # > # File systems > # > CONFIG_DCACHE_WORD_ACCESS=y > # CONFIG_EXT2_FS is not set > CONFIG_EXT3_FS=m > # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set > CONFIG_EXT3_FS_XATTR=y > CONFIG_EXT3_FS_POSIX_ACL=y > # CONFIG_EXT3_FS_SECURITY is not set > CONFIG_EXT4_FS=m > CONFIG_EXT4_USE_FOR_EXT23=y > CONFIG_EXT4_FS_POSIX_ACL=y > # CONFIG_EXT4_FS_SECURITY is not set > # CONFIG_EXT4_DEBUG is not set > CONFIG_JBD=m > # CONFIG_JBD_DEBUG is not set > CONFIG_JBD2=m > # CONFIG_JBD2_DEBUG is not set > CONFIG_FS_MBCACHE=m > # CONFIG_REISERFS_FS is not set > # CONFIG_JFS_FS is not set > CONFIG_XFS_FS=y > # CONFIG_XFS_QUOTA is not set > CONFIG_XFS_POSIX_ACL=y > CONFIG_XFS_RT=y > # CONFIG_XFS_WARN is not set > # CONFIG_XFS_DEBUG is not set > # CONFIG_GFS2_FS is not set > # CONFIG_OCFS2_FS is not set > CONFIG_BTRFS_FS=m > CONFIG_BTRFS_FS_POSIX_ACL=y > # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set > # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set > # CONFIG_BTRFS_DEBUG is not set > # CONFIG_BTRFS_ASSERT is not set > CONFIG_NILFS2_FS=m > CONFIG_FS_POSIX_ACL=y > CONFIG_EXPORTFS=y > CONFIG_FILE_LOCKING=y > CONFIG_FSNOTIFY=y > CONFIG_DNOTIFY=y > CONFIG_INOTIFY_USER=y > CONFIG_FANOTIFY=y > # CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set > # CONFIG_QUOTA is not set > # CONFIG_QUOTACTL is not set > CONFIG_AUTOFS4_FS=y > CONFIG_FUSE_FS=m > CONFIG_CUSE=m > > # > # Caches > # > CONFIG_FSCACHE=m > # CONFIG_FSCACHE_STATS is not set > # CONFIG_FSCACHE_HISTOGRAM is not set > # CONFIG_FSCACHE_DEBUG is not set > # CONFIG_FSCACHE_OBJECT_LIST is not set > # CONFIG_CACHEFILES is not set > > # > # CD-ROM/DVD Filesystems > # > CONFIG_ISO9660_FS=m > CONFIG_JOLIET=y > CONFIG_ZISOFS=y > CONFIG_UDF_FS=y > CONFIG_UDF_NLS=y > > # > # DOS/FAT/NT Filesystems > # > CONFIG_FAT_FS=y > CONFIG_MSDOS_FS=m > CONFIG_VFAT_FS=y > CONFIG_FAT_DEFAULT_CODEPAGE=65001 > CONFIG_FAT_DEFAULT_IOCHARSET="65001" > CONFIG_NTFS_FS=m > # CONFIG_NTFS_DEBUG is not set > CONFIG_NTFS_RW=y > > # > # Pseudo filesystems > # > CONFIG_PROC_FS=y > CONFIG_PROC_KCORE=y > CONFIG_PROC_VMCORE=y > CONFIG_PROC_SYSCTL=y > CONFIG_PROC_PAGE_MONITOR=y > CONFIG_KERNFS=y > CONFIG_SYSFS=y > CONFIG_TMPFS=y > CONFIG_TMPFS_POSIX_ACL=y > CONFIG_TMPFS_XATTR=y > CONFIG_HUGETLBFS=y > CONFIG_HUGETLB_PAGE=y > CONFIG_CONFIGFS_FS=m > CONFIG_MISC_FILESYSTEMS=y > # CONFIG_ADFS_FS is not set > # CONFIG_AFFS_FS is not set > # CONFIG_ECRYPT_FS is not set > # CONFIG_HFS_FS is not set > # CONFIG_HFSPLUS_FS is not set > # CONFIG_BEFS_FS is not set > # CONFIG_BFS_FS is not set > # CONFIG_EFS_FS is not set > # CONFIG_LOGFS is not set > CONFIG_CRAMFS=m > CONFIG_SQUASHFS=m > # CONFIG_SQUASHFS_FILE_CACHE is not set > CONFIG_SQUASHFS_FILE_DIRECT=y > # CONFIG_SQUASHFS_DECOMP_SINGLE is not set > # CONFIG_SQUASHFS_DECOMP_MULTI is not set > CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y > CONFIG_SQUASHFS_XATTR=y > CONFIG_SQUASHFS_ZLIB=y > CONFIG_SQUASHFS_LZO=y > CONFIG_SQUASHFS_XZ=y > # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set > # CONFIG_SQUASHFS_EMBEDDED is not set > CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 > # CONFIG_VXFS_FS is not set > # CONFIG_MINIX_FS is not set > # CONFIG_OMFS_FS is not set > # CONFIG_HPFS_FS is not set > # CONFIG_QNX4FS_FS is not set > # CONFIG_QNX6FS_FS is not set > # CONFIG_ROMFS_FS is not set > CONFIG_PSTORE=y > # CONFIG_PSTORE_CONSOLE is not set > # CONFIG_PSTORE_RAM is not set > # CONFIG_SYSV_FS is not set > # CONFIG_UFS_FS is not set > # CONFIG_F2FS_FS is not set > # CONFIG_EFIVAR_FS is not set > CONFIG_NETWORK_FILESYSTEMS=y > # CONFIG_NFS_FS is not set > # CONFIG_NFSD is not set > # CONFIG_CEPH_FS is not set > CONFIG_CIFS=m > CONFIG_CIFS_STATS=y > # CONFIG_CIFS_STATS2 is not set > # CONFIG_CIFS_WEAK_PW_HASH is not set > # CONFIG_CIFS_UPCALL is not set > CONFIG_CIFS_XATTR=y > CONFIG_CIFS_POSIX=y > CONFIG_CIFS_ACL=y > CONFIG_CIFS_DEBUG=y > # CONFIG_CIFS_DEBUG2 is not set > # CONFIG_CIFS_DFS_UPCALL is not set > CONFIG_CIFS_SMB2=y > CONFIG_CIFS_FSCACHE=y > # CONFIG_NCP_FS is not set > # CONFIG_CODA_FS is not set > # CONFIG_AFS_FS is not set > CONFIG_NLS=y > CONFIG_NLS_DEFAULT="utf8" > CONFIG_NLS_CODEPAGE_437=m > # CONFIG_NLS_CODEPAGE_737 is not set > # CONFIG_NLS_CODEPAGE_775 is not set > # CONFIG_NLS_CODEPAGE_850 is not set > # CONFIG_NLS_CODEPAGE_852 is not set > # CONFIG_NLS_CODEPAGE_855 is not set > # CONFIG_NLS_CODEPAGE_857 is not set > # CONFIG_NLS_CODEPAGE_860 is not set > # CONFIG_NLS_CODEPAGE_861 is not set > # CONFIG_NLS_CODEPAGE_862 is not set > # CONFIG_NLS_CODEPAGE_863 is not set > # CONFIG_NLS_CODEPAGE_864 is not set > # CONFIG_NLS_CODEPAGE_865 is not set > # CONFIG_NLS_CODEPAGE_866 is not set > # CONFIG_NLS_CODEPAGE_869 is not set > # CONFIG_NLS_CODEPAGE_936 is not set > # CONFIG_NLS_CODEPAGE_950 is not set > # CONFIG_NLS_CODEPAGE_932 is not set > # CONFIG_NLS_CODEPAGE_949 is not set > # CONFIG_NLS_CODEPAGE_874 is not set > # CONFIG_NLS_ISO8859_8 is not set > # CONFIG_NLS_CODEPAGE_1250 is not set > # CONFIG_NLS_CODEPAGE_1251 is not set > CONFIG_NLS_ASCII=m > CONFIG_NLS_ISO8859_1=m > # CONFIG_NLS_ISO8859_2 is not set > # CONFIG_NLS_ISO8859_3 is not set > # CONFIG_NLS_ISO8859_4 is not set > # CONFIG_NLS_ISO8859_5 is not set > # CONFIG_NLS_ISO8859_6 is not set > # CONFIG_NLS_ISO8859_7 is not set > # CONFIG_NLS_ISO8859_9 is not set > # CONFIG_NLS_ISO8859_13 is not set > # CONFIG_NLS_ISO8859_14 is not set > CONFIG_NLS_ISO8859_15=m > # CONFIG_NLS_KOI8_R is not set > # CONFIG_NLS_KOI8_U is not set > # CONFIG_NLS_MAC_ROMAN is not set > # CONFIG_NLS_MAC_CELTIC is not set > # CONFIG_NLS_MAC_CENTEURO is not set > # CONFIG_NLS_MAC_CROATIAN is not set > # CONFIG_NLS_MAC_CYRILLIC is not set > # CONFIG_NLS_MAC_GAELIC is not set > # CONFIG_NLS_MAC_GREEK is not set > # CONFIG_NLS_MAC_ICELAND is not set > # CONFIG_NLS_MAC_INUIT is not set > # CONFIG_NLS_MAC_ROMANIAN is not set > # CONFIG_NLS_MAC_TURKISH is not set > CONFIG_NLS_UTF8=y > # CONFIG_DLM is not set > > # > # Kernel hacking > # > CONFIG_TRACE_IRQFLAGS_SUPPORT=y > > # > # printk and dmesg options > # > CONFIG_PRINTK_TIME=y > CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 > # CONFIG_BOOT_PRINTK_DELAY is not set > # CONFIG_DYNAMIC_DEBUG is not set > > # > # Compile-time checks and compiler options > # > CONFIG_DEBUG_INFO=y > # CONFIG_DEBUG_INFO_REDUCED is not set > # CONFIG_DEBUG_INFO_SPLIT is not set > # CONFIG_DEBUG_INFO_DWARF4 is not set > # CONFIG_ENABLE_WARN_DEPRECATED is not set > # CONFIG_ENABLE_MUST_CHECK is not set > CONFIG_FRAME_WARN=4096 > CONFIG_STRIP_ASM_SYMS=y > # CONFIG_READABLE_ASM is not set > # CONFIG_UNUSED_SYMBOLS is not set > CONFIG_DEBUG_FS=y > # CONFIG_HEADERS_CHECK is not set > # CONFIG_DEBUG_SECTION_MISMATCH is not set > CONFIG_ARCH_WANT_FRAME_POINTERS=y > CONFIG_FRAME_POINTER=y > # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set > CONFIG_MAGIC_SYSRQ=y > CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x1 > CONFIG_DEBUG_KERNEL=y > > # > # Memory Debugging > # > # CONFIG_DEBUG_PAGEALLOC is not set > # CONFIG_DEBUG_OBJECTS is not set > # CONFIG_SLUB_DEBUG_ON is not set > # CONFIG_SLUB_STATS is not set > CONFIG_HAVE_DEBUG_KMEMLEAK=y > # CONFIG_DEBUG_KMEMLEAK is not set > CONFIG_DEBUG_STACK_USAGE=y > # CONFIG_DEBUG_VM is not set > # CONFIG_DEBUG_VIRTUAL is not set > # CONFIG_DEBUG_MEMORY_INIT is not set > # CONFIG_DEBUG_PER_CPU_MAPS is not set > CONFIG_HAVE_DEBUG_STACKOVERFLOW=y > # CONFIG_DEBUG_STACKOVERFLOW is not set > CONFIG_HAVE_ARCH_KMEMCHECK=y > # CONFIG_KMEMCHECK is not set > # CONFIG_DEBUG_SHIRQ is not set > > # > # Debug Lockups and Hangs > # > CONFIG_LOCKUP_DETECTOR=y > CONFIG_HARDLOCKUP_DETECTOR=y > CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y > CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1 > CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y > CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1 > CONFIG_DETECT_HUNG_TASK=y > CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 > # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set > CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0 > # CONFIG_PANIC_ON_OOPS is not set > CONFIG_PANIC_ON_OOPS_VALUE=0 > CONFIG_PANIC_TIMEOUT=0 > CONFIG_SCHED_DEBUG=y > CONFIG_SCHEDSTATS=y > CONFIG_TIMER_STATS=y > # CONFIG_DEBUG_PREEMPT is not set > > # > # Lock Debugging (spinlocks, mutexes, etc...) > # > CONFIG_DEBUG_RT_MUTEXES=y > CONFIG_DEBUG_SPINLOCK=y > CONFIG_DEBUG_MUTEXES=y > # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set > CONFIG_DEBUG_LOCK_ALLOC=y > # CONFIG_PROVE_LOCKING is not set > CONFIG_LOCKDEP=y > CONFIG_LOCK_STAT=y > # CONFIG_DEBUG_LOCKDEP is not set > # CONFIG_DEBUG_ATOMIC_SLEEP is not set > # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set > # CONFIG_LOCK_TORTURE_TEST is not set > CONFIG_TRACE_IRQFLAGS=y > CONFIG_STACKTRACE=y > # CONFIG_DEBUG_KOBJECT is not set > CONFIG_DEBUG_BUGVERBOSE=y > # CONFIG_DEBUG_LIST is not set > CONFIG_DEBUG_PI_LIST=y > # CONFIG_DEBUG_SG is not set > # CONFIG_DEBUG_NOTIFIERS is not set > # CONFIG_DEBUG_CREDENTIALS is not set > > # > # RCU Debugging > # > # CONFIG_SPARSE_RCU_POINTER is not set > # CONFIG_TORTURE_TEST is not set > # CONFIG_RCU_TORTURE_TEST is not set > CONFIG_RCU_CPU_STALL_TIMEOUT=30 > # CONFIG_RCU_CPU_STALL_VERBOSE is not set > # CONFIG_RCU_CPU_STALL_INFO is not set > # CONFIG_RCU_TRACE is not set > # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set > # CONFIG_NOTIFIER_ERROR_INJECTION is not set > # CONFIG_FAULT_INJECTION is not set > CONFIG_LATENCYTOP=y > CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y > # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set > CONFIG_USER_STACKTRACE_SUPPORT=y > CONFIG_NOP_TRACER=y > CONFIG_HAVE_FUNCTION_TRACER=y > CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y > CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y > CONFIG_HAVE_DYNAMIC_FTRACE=y > CONFIG_HAVE_DYNAMIC_FTRACE_WITH_REGS=y > CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y > CONFIG_HAVE_SYSCALL_TRACEPOINTS=y > CONFIG_HAVE_FENTRY=y > CONFIG_HAVE_C_RECORDMCOUNT=y > CONFIG_TRACER_MAX_TRACE=y > CONFIG_TRACE_CLOCK=y > CONFIG_RING_BUFFER=y > CONFIG_EVENT_TRACING=y > CONFIG_CONTEXT_SWITCH_TRACER=y > CONFIG_RING_BUFFER_ALLOW_SWAP=y > CONFIG_TRACING=y > CONFIG_GENERIC_TRACER=y > CONFIG_TRACING_SUPPORT=y > CONFIG_FTRACE=y > # CONFIG_FUNCTION_TRACER is not set > CONFIG_IRQSOFF_TRACER=y > CONFIG_PREEMPT_TRACER=y > CONFIG_SCHED_TRACER=y > # CONFIG_FTRACE_SYSCALLS is not set > CONFIG_TRACER_SNAPSHOT=y > CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y > CONFIG_BRANCH_PROFILE_NONE=y > # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set > # CONFIG_PROFILE_ALL_BRANCHES is not set > # CONFIG_STACK_TRACER is not set > CONFIG_BLK_DEV_IO_TRACE=y > CONFIG_KPROBE_EVENT=y > CONFIG_UPROBE_EVENT=y > CONFIG_PROBE_EVENTS=y > # CONFIG_FTRACE_STARTUP_TEST is not set > # CONFIG_MMIOTRACE is not set > # CONFIG_TRACEPOINT_BENCHMARK is not set > # CONFIG_RING_BUFFER_BENCHMARK is not set > # CONFIG_RING_BUFFER_STARTUP_TEST is not set > > # > # Runtime Testing > # > # CONFIG_LKDTM is not set > # CONFIG_TEST_LIST_SORT is not set > # CONFIG_KPROBES_SANITY_TEST is not set > # CONFIG_BACKTRACE_SELF_TEST is not set > # CONFIG_RBTREE_TEST is not set > # CONFIG_INTERVAL_TREE_TEST is not set > # CONFIG_PERCPU_TEST is not set > # CONFIG_ATOMIC64_SELFTEST is not set > # CONFIG_ASYNC_RAID6_TEST is not set > # CONFIG_TEST_STRING_HELPERS is not set > # CONFIG_TEST_KSTRTOX is not set > # CONFIG_TEST_RHASHTABLE is not set > # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set > # CONFIG_DMA_API_DEBUG is not set > # CONFIG_TEST_MODULE is not set > # CONFIG_TEST_USER_COPY is not set > # CONFIG_TEST_BPF is not set > # CONFIG_TEST_FIRMWARE is not set > # CONFIG_TEST_UDELAY is not set > # CONFIG_SAMPLES is not set > CONFIG_HAVE_ARCH_KGDB=y > CONFIG_KGDB=y > CONFIG_KGDB_SERIAL_CONSOLE=y > # CONFIG_KGDB_TESTS is not set > # CONFIG_KGDB_LOW_LEVEL_TRAP is not set > CONFIG_KGDB_KDB=y > CONFIG_KDB_KEYBOARD=y > CONFIG_KDB_CONTINUE_CATASTROPHIC=0 > # CONFIG_STRICT_DEVMEM is not set > CONFIG_X86_VERBOSE_BOOTUP=y > CONFIG_EARLY_PRINTK=y > # CONFIG_EARLY_PRINTK_DBGP is not set > # CONFIG_EARLY_PRINTK_EFI is not set > # CONFIG_X86_PTDUMP is not set > CONFIG_DEBUG_RODATA=y > # CONFIG_DEBUG_RODATA_TEST is not set > # CONFIG_DEBUG_SET_MODULE_RONX is not set > # CONFIG_DEBUG_NX_TEST is not set > CONFIG_DOUBLEFAULT=y > # CONFIG_DEBUG_TLBFLUSH is not set > # CONFIG_IOMMU_STRESS is not set > CONFIG_HAVE_MMIOTRACE_SUPPORT=y > # CONFIG_X86_DECODER_SELFTEST is not set > CONFIG_IO_DELAY_TYPE_0X80=0 > CONFIG_IO_DELAY_TYPE_0XED=1 > CONFIG_IO_DELAY_TYPE_UDELAY=2 > CONFIG_IO_DELAY_TYPE_NONE=3 > CONFIG_IO_DELAY_0X80=y > # CONFIG_IO_DELAY_0XED is not set > # CONFIG_IO_DELAY_UDELAY is not set > # CONFIG_IO_DELAY_NONE is not set > CONFIG_DEFAULT_IO_DELAY_TYPE=0 > CONFIG_DEBUG_BOOT_PARAMS=y > # CONFIG_CPA_DEBUG is not set > CONFIG_OPTIMIZE_INLINING=y > # CONFIG_DEBUG_NMI_SELFTEST is not set > # CONFIG_X86_DEBUG_STATIC_CPU_HAS is not set > > # > # Security options > # > CONFIG_KEYS=y > CONFIG_PERSISTENT_KEYRINGS=y > # CONFIG_BIG_KEYS is not set > # CONFIG_TRUSTED_KEYS is not set > CONFIG_ENCRYPTED_KEYS=y > CONFIG_KEYS_DEBUG_PROC_KEYS=y > # CONFIG_SECURITY_DMESG_RESTRICT is not set > CONFIG_SECURITY=y > CONFIG_SECURITYFS=y > # CONFIG_SECURITY_NETWORK is not set > # CONFIG_SECURITY_PATH is not set > # CONFIG_INTEL_TXT is not set > # CONFIG_SECURITY_SMACK is not set > # CONFIG_SECURITY_TOMOYO is not set > # CONFIG_SECURITY_APPARMOR is not set > # CONFIG_SECURITY_YAMA is not set > # CONFIG_IMA is not set > # CONFIG_EVM is not set > CONFIG_DEFAULT_SECURITY_DAC=y > CONFIG_DEFAULT_SECURITY="" > CONFIG_XOR_BLOCKS=m > CONFIG_ASYNC_CORE=m > CONFIG_ASYNC_MEMCPY=m > CONFIG_ASYNC_XOR=m > CONFIG_ASYNC_PQ=m > CONFIG_ASYNC_RAID6_RECOV=m > CONFIG_CRYPTO=y > > # > # Crypto core or helper > # > CONFIG_CRYPTO_ALGAPI=y > CONFIG_CRYPTO_ALGAPI2=y > CONFIG_CRYPTO_AEAD=m > CONFIG_CRYPTO_AEAD2=y > CONFIG_CRYPTO_BLKCIPHER=y > CONFIG_CRYPTO_BLKCIPHER2=y > CONFIG_CRYPTO_HASH=y > CONFIG_CRYPTO_HASH2=y > CONFIG_CRYPTO_RNG=y > CONFIG_CRYPTO_RNG2=y > CONFIG_CRYPTO_PCOMP=m > CONFIG_CRYPTO_PCOMP2=y > CONFIG_CRYPTO_MANAGER=y > CONFIG_CRYPTO_MANAGER2=y > # CONFIG_CRYPTO_USER is not set > # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set > CONFIG_CRYPTO_GF128MUL=m > # CONFIG_CRYPTO_NULL is not set > # CONFIG_CRYPTO_PCRYPT is not set > CONFIG_CRYPTO_WORKQUEUE=y > CONFIG_CRYPTO_CRYPTD=m > CONFIG_CRYPTO_AUTHENC=m > # CONFIG_CRYPTO_TEST is not set > CONFIG_CRYPTO_ABLK_HELPER=m > CONFIG_CRYPTO_GLUE_HELPER_X86=m > > # > # Authenticated Encryption with Associated Data > # > # CONFIG_CRYPTO_CCM is not set > # CONFIG_CRYPTO_GCM is not set > # CONFIG_CRYPTO_SEQIV is not set > > # > # Block modes > # > CONFIG_CRYPTO_CBC=y > # CONFIG_CRYPTO_CTR is not set > # CONFIG_CRYPTO_CTS is not set > CONFIG_CRYPTO_ECB=y > CONFIG_CRYPTO_LRW=m > # CONFIG_CRYPTO_PCBC is not set > CONFIG_CRYPTO_XTS=m > > # > # Hash modes > # > CONFIG_CRYPTO_CMAC=y > CONFIG_CRYPTO_HMAC=y > # CONFIG_CRYPTO_XCBC is not set > # CONFIG_CRYPTO_VMAC is not set > > # > # Digest > # > CONFIG_CRYPTO_CRC32C=y > CONFIG_CRYPTO_CRC32C_INTEL=y > # CONFIG_CRYPTO_CRC32 is not set > # CONFIG_CRYPTO_CRC32_PCLMUL is not set > CONFIG_CRYPTO_CRCT10DIF=y > # CONFIG_CRYPTO_CRCT10DIF_PCLMUL is not set > # CONFIG_CRYPTO_GHASH is not set > CONFIG_CRYPTO_MD4=y > CONFIG_CRYPTO_MD5=y > # CONFIG_CRYPTO_MICHAEL_MIC is not set > # CONFIG_CRYPTO_RMD128 is not set > # CONFIG_CRYPTO_RMD160 is not set > # CONFIG_CRYPTO_RMD256 is not set > # CONFIG_CRYPTO_RMD320 is not set > CONFIG_CRYPTO_SHA1=m > CONFIG_CRYPTO_SHA1_SSSE3=m > CONFIG_CRYPTO_SHA256_SSSE3=m > CONFIG_CRYPTO_SHA512_SSSE3=m > CONFIG_CRYPTO_SHA256=y > CONFIG_CRYPTO_SHA512=m > # CONFIG_CRYPTO_TGR192 is not set > # CONFIG_CRYPTO_WP512 is not set > # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set > > # > # Ciphers > # > CONFIG_CRYPTO_AES=y > CONFIG_CRYPTO_AES_X86_64=m > CONFIG_CRYPTO_AES_NI_INTEL=m > # CONFIG_CRYPTO_ANUBIS is not set > CONFIG_CRYPTO_ARC4=y > # CONFIG_CRYPTO_BLOWFISH is not set > # CONFIG_CRYPTO_BLOWFISH_X86_64 is not set > # CONFIG_CRYPTO_CAMELLIA is not set > # CONFIG_CRYPTO_CAMELLIA_X86_64 is not set > # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64 is not set > # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set > # CONFIG_CRYPTO_CAST5 is not set > # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set > # CONFIG_CRYPTO_CAST6 is not set > # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set > CONFIG_CRYPTO_DES=y > # CONFIG_CRYPTO_DES3_EDE_X86_64 is not set > # CONFIG_CRYPTO_FCRYPT is not set > # CONFIG_CRYPTO_KHAZAD is not set > # CONFIG_CRYPTO_SALSA20 is not set > # CONFIG_CRYPTO_SALSA20_X86_64 is not set > # CONFIG_CRYPTO_SEED is not set > # CONFIG_CRYPTO_SERPENT is not set > # CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set > # CONFIG_CRYPTO_SERPENT_AVX_X86_64 is not set > # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set > # CONFIG_CRYPTO_TEA is not set > # CONFIG_CRYPTO_TWOFISH is not set > # CONFIG_CRYPTO_TWOFISH_X86_64 is not set > # CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set > # CONFIG_CRYPTO_TWOFISH_AVX_X86_64 is not set > > # > # Compression > # > CONFIG_CRYPTO_DEFLATE=m > CONFIG_CRYPTO_ZLIB=m > CONFIG_CRYPTO_LZO=y > # CONFIG_CRYPTO_LZ4 is not set > # CONFIG_CRYPTO_LZ4HC is not set > > # > # Random Number Generation > # > CONFIG_CRYPTO_ANSI_CPRNG=m > # CONFIG_CRYPTO_DRBG_MENU is not set > CONFIG_CRYPTO_USER_API=m > CONFIG_CRYPTO_USER_API_HASH=m > CONFIG_CRYPTO_USER_API_SKCIPHER=m > # CONFIG_CRYPTO_HW is not set > # CONFIG_ASYMMETRIC_KEY_TYPE is not set > CONFIG_HAVE_KVM=y > CONFIG_HAVE_KVM_IRQCHIP=y > CONFIG_HAVE_KVM_IRQFD=y > CONFIG_HAVE_KVM_IRQ_ROUTING=y > CONFIG_HAVE_KVM_EVENTFD=y > CONFIG_KVM_APIC_ARCHITECTURE=y > CONFIG_KVM_MMIO=y > CONFIG_KVM_ASYNC_PF=y > CONFIG_HAVE_KVM_MSI=y > CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y > CONFIG_KVM_VFIO=y > CONFIG_VIRTUALIZATION=y > CONFIG_KVM=m > CONFIG_KVM_INTEL=m > # CONFIG_KVM_AMD is not set > # CONFIG_KVM_MMU_AUDIT is not set > CONFIG_KVM_DEVICE_ASSIGNMENT=y > CONFIG_BINARY_PRINTF=y > > # > # Library routines > # > CONFIG_RAID6_PQ=m > CONFIG_BITREVERSE=y > CONFIG_GENERIC_STRNCPY_FROM_USER=y > CONFIG_GENERIC_STRNLEN_USER=y > CONFIG_GENERIC_NET_UTILS=y > CONFIG_GENERIC_FIND_FIRST_BIT=y > CONFIG_GENERIC_PCI_IOMAP=y > CONFIG_GENERIC_IOMAP=y > CONFIG_GENERIC_IO=y > CONFIG_PERCPU_RWSEM=y > CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y > CONFIG_ARCH_HAS_FAST_MULTIPLIER=y > # CONFIG_CRC_CCITT is not set > CONFIG_CRC16=m > CONFIG_CRC_T10DIF=y > CONFIG_CRC_ITU_T=y > CONFIG_CRC32=y > # CONFIG_CRC32_SELFTEST is not set > CONFIG_CRC32_SLICEBY8=y > # CONFIG_CRC32_SLICEBY4 is not set > # CONFIG_CRC32_SARWATE is not set > # CONFIG_CRC32_BIT is not set > # CONFIG_CRC7 is not set > CONFIG_LIBCRC32C=y > # CONFIG_CRC8 is not set > # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set > # CONFIG_RANDOM32_SELFTEST is not set > CONFIG_ZLIB_INFLATE=y > CONFIG_ZLIB_DEFLATE=y > CONFIG_LZO_COMPRESS=y > CONFIG_LZO_DECOMPRESS=y > CONFIG_XZ_DEC=m > CONFIG_XZ_DEC_X86=y > # CONFIG_XZ_DEC_POWERPC is not set > # CONFIG_XZ_DEC_IA64 is not set > # CONFIG_XZ_DEC_ARM is not set > # CONFIG_XZ_DEC_ARMTHUMB is not set > # CONFIG_XZ_DEC_SPARC is not set > CONFIG_XZ_DEC_BCJ=y > # CONFIG_XZ_DEC_TEST is not set > CONFIG_GENERIC_ALLOCATOR=y > CONFIG_TEXTSEARCH=y > CONFIG_TEXTSEARCH_KMP=m > CONFIG_TEXTSEARCH_BM=m > CONFIG_TEXTSEARCH_FSM=m > CONFIG_ASSOCIATIVE_ARRAY=y > CONFIG_HAS_IOMEM=y > CONFIG_HAS_IOPORT_MAP=y > CONFIG_HAS_DMA=y > CONFIG_CHECK_SIGNATURE=y > CONFIG_CPU_RMAP=y > CONFIG_DQL=y > CONFIG_GLOB=y > # CONFIG_GLOB_SELFTEST is not set > CONFIG_NLATTR=y > CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y > CONFIG_AVERAGE=y > # CONFIG_CORDIC is not set > # CONFIG_DDR is not set > CONFIG_UCS2_STRING=y > CONFIG_FONT_SUPPORT=m > CONFIG_FONTS=y > CONFIG_FONT_8x8=y > CONFIG_FONT_8x16=y > # CONFIG_FONT_6x11 is not set > # CONFIG_FONT_7x14 is not set > # CONFIG_FONT_PEARL_8x8 is not set > CONFIG_FONT_ACORN_8x8=y > CONFIG_FONT_MINI_4x6=y > CONFIG_FONT_SUN8x16=y > # CONFIG_FONT_SUN12x22 is not set > # CONFIG_FONT_10x18 is not set > CONFIG_ARCH_HAS_SG_CHAIN=y > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jlayton@poochiereds.net Wed Nov 12 15:02:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8B5457F3F for ; Wed, 12 Nov 2014 15:02:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C1DFAC008 for ; Wed, 12 Nov 2014 13:02:41 -0800 (PST) X-ASG-Debug-ID: 1415826160-04cbb00e68252040001-NocioJ Received: from mail-qa0-f50.google.com (mail-qa0-f50.google.com [209.85.216.50]) by cuda.sgi.com with ESMTP id HlAcR9rhp5lk8VP5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 12 Nov 2014 13:02:40 -0800 (PST) X-Barracuda-Envelope-From: jlayton@poochiereds.net X-Barracuda-Apparent-Source-IP: 209.85.216.50 Received: by mail-qa0-f50.google.com with SMTP id bm13so8997414qab.23 for ; Wed, 12 Nov 2014 13:02:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=jBcQlY5jjKA2kkzU8hJRubeFu0oQkUGDVhlhRljryjs=; b=aQQJACmDbmsr/rbef7yMVMkSrrdGh4J2YDK3p/h8p9n3P2U9pE/PA3p6lF5Z1uxR1z DhrIfpAShajZTMgbmOT1ZumUYPzY1+k8eK5JAg58+lXy0xb9ZUjQYzAhsyds6GQGAysG mjmkS7gYGtBE2JYbaUQgixJfKjT85XtbnNaHQlaoullacmifzy5KoNfSebnL1lUI2THK hEZiXUsvELjJO+8+ovVqvVtI23hJ50BIv064CeFXa4MKzqqilk4/THYfNuRZSw8WZobq yC7x/HL9nQgPThw1vRHpuaUcq2fY5IJSCmDMBaF4LptaTDto2cHVCN3DDIA7KBfU2Mop +ZIw== X-Gm-Message-State: ALoCoQlOFpqf5jGCekQf+G2S8ipYWDWaBEPI99tM8g+KuvmAkDg02YoL0XfssFiezySEB19dLnHC X-Received: by 10.224.127.193 with SMTP id h1mr34158282qas.1.1415826159886; Wed, 12 Nov 2014 13:02:39 -0800 (PST) Received: from tlielax.poochiereds.net ([2001:470:8:d63:3a60:77ff:fe93:a95d]) by mx.google.com with ESMTPSA id p10sm17654414qab.39.2014.11.12.13.02.38 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Nov 2014 13:02:39 -0800 (PST) Date: Wed, 12 Nov 2014 16:02:35 -0500 From: Jeff Layton To: Jens Axboe Cc: Ming Lei , Dongsu Park , "Michael S. Tsirkin" , Dave Chinner , xfs@oss.sgi.com, Rusty Russell , Lukas Czerner , Christoph Hellwig , Linux Virtualization Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! Message-ID: <20141112160235.19d8aefc@tlielax.poochiereds.net> X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! In-Reply-To: <5463A478.20603@kernel.dk> References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> <54614AE7.2080204@kernel.dk> <20141111154250.GA16906@gmail.com> <5463A478.20603@kernel.dk> X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.25; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qa0-f50.google.com[209.85.216.50] X-Barracuda-Start-Time: 1415826160 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11526 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, 12 Nov 2014 11:18:32 -0700 Jens Axboe wrote: > On 11/11/2014 09:42 AM, Ming Lei wrote: > > The attached patch should fix the problem, and hope it is the last one, :-) > > Dongsu and Jeff, any of you test this variant? I think this is the last > one, at least I hope so as well... > Yes, thanks! That patch seems to fix the problem for me. You can add: Tested-by: Jeff Layton From david@fromorbit.com Wed Nov 12 15:25:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3A9FF7F3F for ; Wed, 12 Nov 2014 15:25:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66BFCAC00B for ; Wed, 12 Nov 2014 13:25:13 -0800 (PST) X-ASG-Debug-ID: 1415827510-04cb6c1e6c24e7d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id EgwTp9FssEByGCRo for ; Wed, 12 Nov 2014 13:25:11 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArBPAL7PY1R5LbBUPGdsb2JhbABbgw6BLYc9sUUGlQ6FbAICAQECgRwXAQEBAQEGAQEBATg7hAIBAQEDATocIwULCAMYCSUPBSUDBxoTiDgI0EoBAQgCIBiGIopaB4RLAQSeMJp4KTCCSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Nov 2014 07:55:10 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XofPX-0003lB-Sa; Thu, 13 Nov 2014 08:25:07 +1100 Date: Thu, 13 Nov 2014 08:25:07 +1100 From: Dave Chinner To: L Walsh Cc: xfs-oss Subject: Re: Fwd: multiple processes hanging doing xfs ops -- 3.17.2 Message-ID: <20141112212507.GZ23575@dastard> X-ASG-Orig-Subj: Re: Fwd: multiple processes hanging doing xfs ops -- 3.17.2 References: <5463BB52.3080601@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5463BB52.3080601@tlinx.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1415827510 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11527 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 12, 2014 at 11:56:02AM -0800, L Walsh wrote: > > > I just upped from 3.16.2 to 3.17.2 this morning, and after about 2 hours > uptime, got > several procs hanging in what looks like xfs territory. .... > Nov 12 04:43:46 Ishtar kernel: [ 5886.496468] INFO: task xfsdump:38317 blocked for more than 120 seconds. .... > Nov 12 04:43:46 Ishtar kernel: [ 5886.515691] [] xfs_bulkstat+0x165/0x4e0 You ran xfsdump and that triggered one of the bulkstat regressions in 3.17. The fixes have been queued to the next 3.17.x stable kernel, so you'll want to hold off running xfsdump or xfs_fsr until that kernel is released and you upgrade. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Nov 12 15:38:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 69C927F3F for ; Wed, 12 Nov 2014 15:38:48 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56A438F8033 for ; Wed, 12 Nov 2014 13:38:44 -0800 (PST) X-ASG-Debug-ID: 1415828321-04cbb00e682537f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 42RoyvQwSNnBRYkC for ; Wed, 12 Nov 2014 13:38:42 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqZPABjSY1R5LbBUPGdsb2JhbABbgw5UWbhwEgaTMYFdhWwCAgEBAoEcFwEBAQEBBgEBAQE4O4QCAQEBAwE6HBwHEAgDDgoJJQ8FJQMHGhOIOAgO0DwBAQgCAR8YhiKIPYE7CQgBUAeDLYEeBZcNhEyCV4FHmTEpMAGBDoE8AQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Nov 2014 08:08:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xofcd-0003mZ-Lt; Thu, 13 Nov 2014 08:38:39 +1100 Date: Thu, 13 Nov 2014 08:38:39 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq Message-ID: <20141112213839.GA23575@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: replace global xfslogd wq with per-mount xfs-iodone wq References: <1415722393-32223-1-git-send-email-bfoster@redhat.com> <20141111231246.GT28565@dastard> <20141112193751.GA2118@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141112193751.GA2118@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1415828321 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11527 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 12, 2014 at 02:37:51PM -0500, Brian Foster wrote: > On Wed, Nov 12, 2014 at 10:12:46AM +1100, Dave Chinner wrote: > > On Tue, Nov 11, 2014 at 11:13:13AM -0500, Brian Foster wrote: > > > The xfslogd workqueue is a global, single-job workqueue for buffer ioend > > > processing. This means we allow for a single work item at a time for all > > > possible XFS mounts on a system. fsstress testing in loopback XFS over > > > XFS configurations has reproduced xfslogd deadlocks due to the single > > > threaded nature of the queue and dependencies introduced between the > > > separate XFS instances by online discard (-o discard). .... > > > I've left the wq in xfs_mount rather than moved to the buftarg in this > > > version due to the questions expressed here: > > > > > > http://oss.sgi.com/archives/xfs/2014-11/msg00117.html > > > > > > > > Another email from you that hasn't reached my inbox. That's two in a > > week now, I think. > > > > > ... particularly around the potential creation of multiple (of what is > > > now) max_active=1 queues per-fs. > > > > So concern #1 is that it splits log buffer versus metadata buffer > > processing to different work queues causing concurrent processing. ... > > The xfslogd workqueue is tagged with WQ_HIGHPRI only to expedite the > > log buffer io completions over XFS data io completions that may get > > stuck waiting on log forces. i.e. the xfslogd_workqueue needs > > higher priority than m_data_workqueue and m_unwritten_workqueue as > > they can require log forces to complete their work. Hence if we > > separate out the log buffer io completion processing from the > > metadata IO completion processing we don't need to process all the > > metadata buffer IO completion as high priority work anymore. > > > > Ok, thanks. I didn't notice an explicit relationship between either of > those queues and xfslogd. Is the dependency implicit in that those > queues do transaction reservations, and thus can push on the log via the > AIL (and if so, why wouldn't the cil queue be higher priority as well)? IIRC, the main dependency problem we found had to do with data IO completion on a loop device getting stuck waiting log IO completion on the backing device which was stuck in a dispatch queue behind more blocked completions on the loop device. using WQ_HIGHPRI meant they didn't get stuck in dispatch queues behind other queued work - they got dispatched immeidately.... > > Concern #2 is about the reason for max_active=1 and being > > unclear as to why we only want a single completion active at a > > time on a CPU. The reason for this is that most metadata and > > log buffer IO completion work does not sleep - they only ever > > take spinlocks and so there are no built in schedule points > > during work processing. Hence it is rare to need a second worker > > thread to process the queue because the first is blocked on a > > sleeping lock and so max-active=1 makes sense. In comparison, > > the data/unwritten io completion processing is very different > > due to needing to take sleeping inode locks, buffer locks, etc) > > and hence they use the wq default for max active (512). > > > > Ok, max_active sounds more like a hint to the workqueue > infrastructure in this usage. E.g., there's no hard rule against > activation of more than one item, it's just of questionable value. Right. ISTR that there were worse lock contention problems on the AIL and iclog locks when more concurency was introduced, so it was just kept down to the minimum required. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Nov 12 16:00:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 23F7A7F3F for ; Wed, 12 Nov 2014 16:00:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AD812AC00F for ; Wed, 12 Nov 2014 14:00:58 -0800 (PST) X-ASG-Debug-ID: 1415829655-04cbb00e682544b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id xyd6Bsq4iikeXTeq for ; Wed, 12 Nov 2014 14:00:56 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkMxAPHXY1R5LbBUPGdsb2JhbABbgw6BLYc9sUYGlQ6FbAQCAoEcFwEBAQEBBgEBAQE4O4QDAQEEOhwzCAMYCSUPBSUDBxoBEh6IItBGAQsgGIYiimGDLYEeBZ4wgTWDT4gEjXApMIJLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Nov 2014 08:30:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xofy0-0003qE-Ru; Thu, 13 Nov 2014 09:00:44 +1100 Date: Thu, 13 Nov 2014 09:00:44 +1100 From: Dave Chinner To: xfs@oss.sgi.com, Brian Foster Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Message-ID: <20141112220044.GB23575@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 References: <20141111192922.GC38867@bfoster.bfoster> <20141112173245.GA32185@hades.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141112173245.GA32185@hades.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1415829655 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11529 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 12, 2014 at 03:32:48PM -0200, Carlos Maiolino wrote: > > > + if (new_parent) { > > > + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | > > > XFS_ICHGTIME_CHG); > > > > Long line. > > > I think there is no reason to break this line. We should avoid 80+ columns per > line, but it's not a must, break this line will hurt readability of the code in > exchange of just a few chars more than 80. I don't think it's worth. You're not going to win that argument, Carlos: new code wraps at 80 columns. This: if (new_parent) { xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); ..... } Is no less readable on a wide terminal than a single line, and it doesn't end up a mess for people who use 80 column terminals for the code editing. Please fix it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 13 01:00:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 32AE77F37 for ; Thu, 13 Nov 2014 01:00:10 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1DCC88F8033 for ; Wed, 12 Nov 2014 23:00:09 -0800 (PST) X-ASG-Debug-ID: 1415862007-04cb6c1e6d25f650001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id JFvMRgaPH9CECpJm for ; Wed, 12 Nov 2014 23:00:08 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlExAAxWZFR5LbBUPGdsb2JhbABbgw5UWYc9sVkSBpMnAoFlhWwEgSAXAQEBAQEGAQEBATg7hF87JDQFJQMHLYhAqUOmNxiGIop3giAPRCSBHgWGPJBRhyOBNY19i0YpMIJLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl2.internode.on.net with ESMTP; 13 Nov 2014 17:30:07 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XooNx-00058N-HN for xfs@oss.sgi.com; Thu, 13 Nov 2014 18:00:05 +1100 Date: Thu, 13 Nov 2014 18:00:05 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to 263b537 Message-ID: <20141113070005.GD23575@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to 263b537 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="7ZAtKRhVyVSsbBD2" Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1415862007 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11544 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --7ZAtKRhVyVSsbBD2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: 263b537 xfs_copy: simplify first_agbno calculation New Commits: Eric Sandeen (1): [263b537] xfs_copy: simplify first_agbno calculation Nathan Scott (3): [3775434] packaging: rework dh_autoreconf invocation for deb builds [12a995c] packaging: clarify xfs header licensing within deb builds [b83be57] packaging: update deb changelog for upcoming release Code Diffstat: copy/xfs_copy.c | 20 +++----------------- debian/changelog | 8 ++++++++ debian/control | 2 +- debian/copyright | 4 ++-- debian/rules | 4 ++-- 5 files changed, 16 insertions(+), 22 deletions(-) --=20 Dave Chinner david@fromorbit.com --7ZAtKRhVyVSsbBD2 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJUZFb0AAoJEK3oKUf0dfoduKMP/iFUysSjscAlyeuPpGfmF//K S0t2UdvJtf0WM8VUdZrdTX6FIyUGZ6i9VKMzt6gJom24oMoE1DNTzlIEYw+QAd0r h1u9Flelirdte8PI65I/L0WkjR5sI2Nm7hVCk44HNaPhHVZkXYCivys3cLSG1+jM D2eYN8jaMem2WQP9K5PKUgmMGy99lGXdZRj99+xez70+iE1VlAxqOAwffmpdLfyI h5Ge33jFN/ywUZFlZW/t3In1UziBQe1Y9ulz5rFAG5c7kwcSJ/wt/BhS0H2xf5cR wUQxXaWK4OBOaMiqtPE4UO/tL5Qb2zfjzn5/T0lbWgTiMUtndN8DPuBeocBCJHf7 Cn848FSkxvZ5JtotjM0thMxt7Lsjt9BQXkGWkwP3dhbYuxYnsLfLKPuSrFZu8uKo /mEUScjoIw99keRH3O5/zdXL/M9WnUBEdxSNjNyjQ38PSY8yaGs1nULrFBsEsIQV ORw6Xou+u6QvnisKtZI8eRtgzn+aMiHBiM9bDfD8CAHdSTAD+KRijwm1J2rLQsjp 5TvwHUL7YQiPYWn4JzullT0NrZQX7Lmn4nUfwGyLbpocSOsxCquAAEzYUYn5JjZP MC+kwIDc2zAoq8NOyzwIVhLOPEEnvpQUPeooWBfmbw+eBLLfRePoXPs24N9lMG8W Zl4xSVuPCnzY8brfn8wC =fukd -----END PGP SIGNATURE----- --7ZAtKRhVyVSsbBD2-- From dongsu.park@profitbricks.com Thu Nov 13 05:04:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4D9A07F37 for ; Thu, 13 Nov 2014 05:04:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3AB5130405F for ; Thu, 13 Nov 2014 03:04:22 -0800 (PST) X-ASG-Debug-ID: 1415876659-04cbb00e6926b170001-NocioJ Received: from mail-wg0-f53.google.com (mail-wg0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id Ds2mZfNX0NV4GHzE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Nov 2014 03:04:20 -0800 (PST) X-Barracuda-Envelope-From: dongsu.park@profitbricks.com X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wg0-f53.google.com with SMTP id b13so16539091wgh.12 for ; Thu, 13 Nov 2014 03:04:19 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=o45ClXCBpQ0UVCqalUsCr95JtaWChmpaskCrOqvQlNk=; b=FWM5gbNZLH2Y/J4CtsySZ+6Dp7+wCskn1u4/rNEvo6MJRrO/IutoVzeuie2RWVugLi 3+BFwcGbJ+PYRsYpl0KtLzHjiIxcUvkGe8JPrAhBEPStaTYEdb9dJMvyDAQg/v2gG5Xb dBmQ/oo8ER5WPEMDIzaUp3AkhYiw1aX7C9yyV6M9AqZeSHklIykzW0tWzZv+3n8PYv7X y4sFTPvbzlH9wrizZxWtpqlKygDnnN6JluJTm5M1ND2KD9q5E4G6AMTEMtFF6FuSRYmv WY9YeCNc4L4PzR1ddw87+CJ2xx4+G1e8ed4t/cIPNUMI0vC8wLHFIsiM95YLWT2Pn3Yl 03ww== X-Gm-Message-State: ALoCoQknUUvVnXdrjvnOatoXjjvGDqEGY43ONelwKYiSs0Scsi+su6ic5aZeRvMNm0A+K/mrmhrZ X-Received: by 10.180.101.200 with SMTP id fi8mr2619404wib.77.1415876659081; Thu, 13 Nov 2014 03:04:19 -0800 (PST) Received: from gmail.com ([62.217.45.26]) by mx.google.com with ESMTPSA id wa10sm30404366wjc.8.2014.11.13.03.04.17 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Nov 2014 03:04:18 -0800 (PST) Date: Thu, 13 Nov 2014 12:04:15 +0100 From: Dongsu Park To: Jens Axboe Cc: Ming Lei , "Michael S. Tsirkin" , Dave Chinner , xfs@oss.sgi.com, Jeff Layton , Rusty Russell , Lukas Czerner , Christoph Hellwig , Linux Virtualization Subject: Re: kernel BUG at drivers/block/virtio_blk.c:172! Message-ID: <20141113110415.GB16906@gmail.com> X-ASG-Orig-Subj: Re: kernel BUG at drivers/block/virtio_blk.c:172! References: <20141107080416.0837a88c@tlielax.poochiereds.net> <87bnofnzop.fsf@rustcorp.com.au> <54614AE7.2080204@kernel.dk> <20141111154250.GA16906@gmail.com> <5463A478.20603@kernel.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <5463A478.20603@kernel.dk> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail-wg0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1415876660 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11550 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 12.11.2014 11:18, Jens Axboe wrote: > On 11/11/2014 09:42 AM, Ming Lei wrote: > > The attached patch should fix the problem, and hope it is the last one, :-) > > Dongsu and Jeff, any of you test this variant? I think this is the last > one, at least I hope so as well... Yes, I've just tested it again with the Ming's patch. It passed a full cycle of xfstests: No crash, no particular regression. The code in blk_recount_segments() seems to make sense too. Thanks! ;-) Dongsu From cmaiolino@redhat.com Thu Nov 13 07:04:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A60A37F37 for ; Thu, 13 Nov 2014 07:04:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32777AC008 for ; Thu, 13 Nov 2014 05:04:24 -0800 (PST) X-ASG-Debug-ID: 1415883863-04cb6c1e6a26ac20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4O6NXSZmGmQAtbMF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 05:04:24 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADD4MAW016525 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 08:04:22 -0500 Received: from hades.localdomain (ovpn-113-116.phx2.redhat.com [10.3.113.116]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADD4IP1001400 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 13 Nov 2014 08:04:21 -0500 Date: Thu, 13 Nov 2014 11:04:18 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Message-ID: <20141113130405.GA24180@hades.localdomain> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V3 Mail-Followup-To: xfs@oss.sgi.com References: <20141111192922.GC38867@bfoster.bfoster> <20141112173245.GA32185@hades.localdomain> <20141112220044.GB23575@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141112220044.GB23575@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415883863 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Nov 13, 2014 at 09:00:44AM +1100, Dave Chinner wrote: > On Wed, Nov 12, 2014 at 03:32:48PM -0200, Carlos Maiolino wrote: > > > > + if (new_parent) { > > > > + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | > > > > XFS_ICHGTIME_CHG); > > > > > > Long line. > > > > > I think there is no reason to break this line. We should avoid 80+ columns per > > line, but it's not a must, break this line will hurt readability of the code in > > exchange of just a few chars more than 80. I don't think it's worth. > > You're not going to win that argument, Carlos: new code wraps at 80 > columns. This: > > if (new_parent) { > xfs_trans_ichgtime(tp, target_dp, > XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > ..... > } > > Is no less readable on a wide terminal than a single line, and it > doesn't end up a mess for people who use 80 column terminals for the > code editing. Please fix it. > > Cheers, > > Dave. Ok, I don't mind, just gave my point of view :) I'm going to change this in the next version. -- Carlos From bounce-use=M=14241535726=echo7=9B533F2C2BDED015FF6E0F7188F10BC7@returnpath.bluehornet.com Thu Nov 13 08:05:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 40FE97F37 for ; Thu, 13 Nov 2014 08:05:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB8838F804C for ; Thu, 13 Nov 2014 06:05:11 -0800 (PST) X-ASG-Debug-ID: 1415887501-04bdf0650e2a7510001-NocioJ Received: from smtp.fortbliss.bluehornet.com (smtp.fortbliss.bluehornet.com [67.216.227.88]) by cuda.sgi.com with ESMTP id ex8GGCkdFUjUfAA7 for ; Thu, 13 Nov 2014 06:05:01 -0800 (PST) X-Barracuda-Envelope-From: bounce-use=M=14241535726=echo7=9B533F2C2BDED015FF6E0F7188F10BC7@returnpath.bluehornet.com X-Barracuda-Apparent-Source-IP: 67.216.227.88 X-Barracuda-IPDD: Level1 [returnpath.bluehornet.com/67.216.227.88] X-Barracuda-IPDD: Level1 [returnpath.bluehornet.com/67.216.227.88] X-MSFBL: eGZzQG9zcy5zZ2kuY29tQGZvcnRibGlzc0BlY2hvQGJvdW5jZS11c2U9TT0xNDI0 MTUzNTcyNj1lY2hvNz05QjUzM0YyQzJCREVEMDE1RkY2RTBGNzE4OEYxMEJDNw== DKIM-Signature: v=1; a=rsa-sha256; d=bluehornet.com; s=s1024-1.bh; c=simple/simple; q=dns/txt; i=@bluehornet.com; t=1415887501; h=From:Subject:Date:To:Mime-Version:Content-Type; bh=959tWHwS9eSlt622NvSqQD8yS0Lp5C5YpI6Tw4fD/EI=; b=QRieqopUV0DiO2rfA59CanP7u/K+OUDcagss54TBxjLyl9ZfLM32HjJ+zLB0mJNx kdQ2yNPrCp6x+wdEPythzpSHbiCb7wDPj5NdvzE83dd1I43z3gqlvlF2D2T2uGmZ ncZTcu1bae+AiEqV9413Rnc+BJyGRj/Jdk5X7KC/q38=; Received: from [10.46.3.18] ([10.46.3.18:13722] helo=localhost.localdomain) by returnpath.bluehornet.com (envelope-from ) (ecelerity 3.5.3.37097 r(Platform:3.5.3.0)) with ESMTP id 10/F7-10650-D8AB4645; Thu, 13 Nov 2014 06:05:01 -0800 Message-ID: <10.F7.10650.D8AB4645@dc4mta04> Date: Thu, 13 Nov 2014 06:00:56 -0800 From: "Verizon Wireless" Reply-To: no-reply@sendmail-direct.com To: X-Outgoing: echo Subject: Powerful. Portable. Productive. List-Unsubscribe: X-ASG-Orig-Subj: Powerful. Portable. Productive. Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--5464b998dfa14-MultiPart-Mime-Boundary" X-Barracuda-Connect: smtp.fortbliss.bluehornet.com[67.216.227.88] X-Barracuda-Start-Time: 1415887501 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ----5464b998dfa14-MultiPart-Mime-Boundary Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit Here's a special tablet offer for your team. View Online Desktop power. TOTAL MOBILITY. 4G LTE tablets give you the ability to manage your business from anywhere. CALL: 1.866.208.4335 Save on tablets THAT LET YOU DO MORE SAVE $100 on select 4G LTE tablets.*Partner with us and save more. Get 25% off select accessories when you sign up for a Verizon Business Agreement. Contact a Business Specialist to get started. 4G LTE tablets give you the freedom to do business smarter. • Close a sale on the spot by taking payments and automating paperwork • Manage a remote workforce through location-based dispatching, detailed tracking, and secure communications • Control connected devices like printers, vehicle computers, and security cameras Work Smarter with 4G LTE Tablets Get a MORE flexible business plan. The MORE Everything Plan for Small Business lets you choose the devices and data allowance that fit your team best. Plus you'll get support from a Business Specialist whenever you need it. Find Out MORE Explore More Business Solutions Contact Your Business Rep Quick Links: Why Verizon Phones & Devices Accessories Plans Unsubscribe *Available only on select 4G LTE tablets. New 2-year activation req'd. While supplies last. Offer only eligible for corporate accounts with 5 or more lines under a Major Account Agreement. Offer expires 12/31/14. If you no longer wish to receive future emails, you may unsubscribe, or easily adjust your subscription preferences from your profile information. We respect your privacy. Please review our privacy policy for more information about click activity with Verizon Wireless and links included in this email. © 2014 Verizon Wireless. Verizon Wireless | One Verizon Way | Mail Code: 180WVB | Basking Ridge, NJ 07920 This email was sent to xfs@oss.sgi.com. To unsubscribe from this list, please click here. ----5464b998dfa14-MultiPart-Mime-Boundary Content-Type: text/html; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit
Here’s a special tablet offer for your team.
View Online
Devices Plans Why Verizon
Desktop power.
TOTAL
MOBILITY.
4G LTE tablets give you the
ability to manage your business from anywhere.
Discover 4G LTE Tablets
Call: 1.866.2084.335
Save on tablets  THAT LET YOU DO MORE
SAVE $100
on select 4G LTE tablets.*
View Details
Partner with us and save more.
Get 25% off select accessories when you sign up for a Verizon Business Agreement. Contact a Business Specialist to get started.
 
4G LTE tablets give you the freedom to do business smarter.
• Close a sale on the spot by taking payments and automating paperwork
• Manage a remote workforce through location-based dispatching, detailed tracking, and secure communications
• Control connected devices like printers, vehicle computers, and security cameras
Work Smarter with 4G LTE Tablets
 
Get a MORE flexible business plan.
The MORE Everything Plan for Small Business lets you choose the devices and data allowance that fit your team best. Plus you’ll get support from a Business Specialist whenever you need it. Find Out MORE
Explore More Business Solutions
Contact Your Business Rep
Quick Links:
Why Verizon
Phones & Devices
Accessories
Plans
Unsubscribe
*Available only on select 4G LTE tablets. New 2-year activation req’d. While supplies last. Offer only eligible for corporate accounts with 5 or more lines under a Major Account Agreement. Offer expires 12/31/14.

If you no longer wish to receive future emails, you may unsubscribe, or easily adjust your subscription preferences from your profile information.
We respect your privacy. Please review our privacy policy for more information about click activity with Verizon Wireless and links included in this email.
© 2014 Verizon Wireless.
Verizon Wireless | One Verizon Way | Mail Code: 180WVB | Basking Ridge, NJ 07920
This email was sent to xfs@oss.sgi.com.

To unsubscribe from this list, please click here.
----5464b998dfa14-MultiPart-Mime-Boundary-- From cmaiolino@redhat.com Thu Nov 13 10:47:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC3F07F37 for ; Thu, 13 Nov 2014 10:47:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B9A888F8064 for ; Thu, 13 Nov 2014 08:47:58 -0800 (PST) X-ASG-Debug-ID: 1415897277-04bdf0650e2aef60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ecXUPHSX2oexLuIn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 08:47:57 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADGlvPX020340 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 11:47:57 -0500 Received: from hades.localdomain.com (ovpn-113-116.phx2.redhat.com [10.3.113.116]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADGltWV013196 for ; Thu, 13 Nov 2014 11:47:56 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V5 Date: Thu, 13 Nov 2014 14:47:45 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V5 Message-Id: <1415897267-28855-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415897277 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag V5 fs/xfs/xfs_inode.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 15 ++++--- 3 files changed, 123 insertions(+), 7 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Thu Nov 13 10:48:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 634B67F37 for ; Thu, 13 Nov 2014 10:48:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3446C8F8064 for ; Thu, 13 Nov 2014 08:47:59 -0800 (PST) X-ASG-Debug-ID: 1415897278-04bdf0650d2aef60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qPfxjQc0OTB3OeSn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 08:47:58 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADGlwS7003880 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 11:47:58 -0500 Received: from hades.localdomain.com (ovpn-113-116.phx2.redhat.com [10.3.113.116]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADGltWW013196 for ; Thu, 13 Nov 2014 11:47:57 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Thu, 13 Nov 2014 14:47:46 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1415897267-28855-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415897267-28855-1-git-send-email-cmaiolino@redhat.com> References: <1415897267-28855-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415897278 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0b8704c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From cmaiolino@redhat.com Thu Nov 13 10:48:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BE29929DFE for ; Thu, 13 Nov 2014 10:48:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AD247304032 for ; Thu, 13 Nov 2014 08:48:01 -0800 (PST) X-ASG-Debug-ID: 1415897280-04cb6c1e6b2745a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GNVUnCPdZM8deXc7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 08:48:00 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADGlxVf003892 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 11:47:59 -0500 Received: from hades.localdomain.com (ovpn-113-116.phx2.redhat.com [10.3.113.116]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADGltWX013196 for ; Thu, 13 Nov 2014 11:47:58 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V5 Date: Thu, 13 Nov 2014 14:47:47 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V5 Message-Id: <1415897267-28855-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415897267-28855-1-git-send-email-cmaiolino@redhat.com> References: <1415897267-28855-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415897280 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() V3: - fix indentation to avoid 80 column crossing, decrease the amount of arguments passed to xfs_cross_rename() - Rebase patches over the latest linux code v4: - use a label/goto statement instead of an if conditional after xfs_cross_rename() return, to finish the rename operation - Make xfs_cross_rename() static - Fix some comments V5: - Keep all the code under 80 columns Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 4 +- 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..bed6b93 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2668,6 +2668,103 @@ xfs_sort_for_rename( } } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +STATIC int +xfs_cross_rename( + xfs_trans_t *tp, + xfs_inode_t *src_dp, + struct xfs_name *src_name, + xfs_inode_t *src_ip, + xfs_inode_t *target_dp, + struct xfs_name *target_name, + xfs_inode_t *target_ip, + xfs_bmap_free_t *free_list, + xfs_fsblock_t *first_block, + int spaceres) +{ + int error = 0; + int new_parent; + int src_is_directory; + int tgt_is_directory; + + new_parent = (src_dp != target_dp); + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); + + /* Replace source inode */ + error = xfs_dir_replace(tp, src_dp, src_name, + target_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + /* Replace target inode */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * If we're renaming one or more directories across different parents, + * update the respective ".." entries (and link counts) to match the new + * parents. + */ + if (new_parent) { + xfs_trans_ichgtime(tp, target_dp, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + if (tgt_is_directory) { + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, + src_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer target ".." reference to src_dp */ + if (!src_is_directory) { + error = xfs_droplink(tp, target_dp); + if (error) + goto out; + error = xfs_bumplink(tp, src_dp); + if (error) + goto out; + } + } + + if (src_is_directory) { + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer src ".." reference to target_dp */ + if (!tgt_is_directory) { + error = xfs_droplink(tp, src_dp); + if (error) + goto out; + error = xfs_bumplink(tp, target_dp); + if (error) + goto out; + } + } + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + } + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); + +out: + return error; +} + /* * xfs_rename */ @@ -2678,7 +2775,8 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; @@ -2706,6 +2804,7 @@ xfs_rename( cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); + if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); @@ -2756,6 +2855,17 @@ xfs_rename( } /* + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, + target_dp, target_name, target_ip, + &free_list, &first_block, spaceres); + if (error) + goto abort_return; + goto finish_rename; + } + /* * Set up the target. */ if (target_ip == NULL) { @@ -2894,6 +3004,7 @@ xfs_rename( if (new_parent) xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); +finish_rename: /* * If this is a synchronous mount, make sure that the * rename transaction goes to disk before returning to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..051d9f0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0b8704c..481ae10 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -391,7 +391,7 @@ xfs_vn_rename( struct xfs_name nname; /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; xfs_dentry_to_name(&oname, odentry, 0); @@ -399,7 +399,7 @@ xfs_vn_rename( return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From BATV+fbd9eb0a9b591b439527+4099+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 13 11:34:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7BA77F37 for ; Thu, 13 Nov 2014 11:34:22 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C6B61304043 for ; Thu, 13 Nov 2014 09:34:19 -0800 (PST) X-ASG-Debug-ID: 1415900058-04cbb00e6827af90001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id VDYqj2ADzRId4E7f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 09:34:18 -0800 (PST) X-Barracuda-Envelope-From: BATV+fbd9eb0a9b591b439527+4099+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XoyHg-0000jL-Ds; Thu, 13 Nov 2014 17:34:16 +0000 Date: Thu, 13 Nov 2014 09:34:16 -0800 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 04/11] quota: Split ->set_xstate callback into two Message-ID: <20141113173416.GA31481@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/11] quota: Split ->set_xstate callback into two References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-5-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415739865-2438-5-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1415900058 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 10:04:18PM +0100, Jan Kara wrote: > Split ->set_xstate callback into two callbacks - one for turning quotas > on (->sysquota_on) and one for turning quotas off (->sysquota_off). That > way we don't have to pass quotactl command into the callback which seems > cleaner. Yes, I much prefer these to be split. But the names seem a little odd, why not enable_quota/disable_quota? > +static unsigned int generic_to_xfs_flags(unsigned int uflags) xfs_quota_flags() ? From tinguely@sgi.com Thu Nov 13 11:35:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F5BD7F37 for ; Thu, 13 Nov 2014 11:35:20 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay2.corp.sgi.com (Postfix) with ESMTP id E975E304051; Thu, 13 Nov 2014 09:35:19 -0800 (PST) Message-ID: <5464EBD6.3040107@sgi.com> Date: Thu, 13 Nov 2014 11:35:18 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH 4/9] xfsdump: remove pointless if (dirty); References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-5-git-send-email-sandeen@redhat.com> In-Reply-To: <1415818638-32700-5-git-send-email-sandeen@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/12/14 12:57, Eric Sandeen wrote: > "dirty" seems to be a remnant of unfinished code; other bits of > it are there but commented out, so comment out "if (dirty);" as > well, which is a no-op if statement which can't be true. > > Signed-off-by: Eric Sandeen > --- > inventory/inv_stobj.c | 2 ++ > 1 files changed, 2 insertions(+), 0 deletions(-) > > diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c > index becac17..84b15d9 100644 > --- a/inventory/inv_stobj.c > +++ b/inventory/inv_stobj.c > @@ -976,7 +976,9 @@ stobj_delete_mobj(int fd, > > } > free ( mfiles ); > +/* > if ( dirty ); > +*/ > } > > free ( strms ); Why not remove all the references to dirty in the function? Like you said, it doesn't do anything. --Mark. From BATV+fbd9eb0a9b591b439527+4099+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 13 11:36:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DBA6F7F37 for ; Thu, 13 Nov 2014 11:36:04 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA9408F804C for ; Thu, 13 Nov 2014 09:36:01 -0800 (PST) X-ASG-Debug-ID: 1415900160-04cbb00e6827b070001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 59uAyjomEhWKmZKK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 09:36:01 -0800 (PST) X-Barracuda-Envelope-From: BATV+fbd9eb0a9b591b439527+4099+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XoyJM-0002OM-5s; Thu, 13 Nov 2014 17:36:00 +0000 Date: Thu, 13 Nov 2014 09:36:00 -0800 From: Christoph Hellwig To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 07/11] ext4: Use generic helpers for quotaon and quotaoff Message-ID: <20141113173600.GB31481@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/11] ext4: Use generic helpers for quotaon and quotaoff References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-8-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415739865-2438-8-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1415900160 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words > static const struct quotactl_ops ext4_qctl_sysfile_operations = { > - .quota_on_meta = ext4_quota_on_sysfile, > - .quota_off = ext4_quota_off_sysfile, > + .sysquota_on = dquot_sysquota_on, > + .sysquota_off = dquot_sysquota_off, > .quota_sync = dquot_quota_sync, > .get_info = dquot_get_dqinfo, > .set_info = dquot_set_dqinfo, This vector now only has generic dquot_ methods. Maybe move the vector to fs/quota/dquot.c and allow multiple filesystems to share it? From BATV+fbd9eb0a9b591b439527+4099+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 13 11:38:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C83BB7F37 for ; Thu, 13 Nov 2014 11:38:17 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4C1B30404E for ; Thu, 13 Nov 2014 09:38:17 -0800 (PST) X-ASG-Debug-ID: 1415900296-04cbb00e6827b170001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 1tOoIJfbfidVao9f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 09:38:16 -0800 (PST) X-Barracuda-Envelope-From: BATV+fbd9eb0a9b591b439527+4099+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XoyLV-00035a-Nw; Thu, 13 Nov 2014 17:38:13 +0000 Date: Thu, 13 Nov 2014 09:38:13 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH 2/9 V2] xfsdump: Fix overflow of "question" string in Media_prompt_erase() Message-ID: <20141113173813.GA9959@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/9 V2] xfsdump: Fix overflow of "question" string in Media_prompt_erase() References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-3-git-send-email-sandeen@redhat.com> <5463AF7A.8040006@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5463AF7A.8040006@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1415900296 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > + asprintf( &question, > + "overwrite data on media in drive %u?\n", > (unsigned int)drivep->d_index ); Where is the error handling? From sandeen@sandeen.net Thu Nov 13 11:47:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 547A37F37 for ; Thu, 13 Nov 2014 11:47:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E485AAC00E for ; Thu, 13 Nov 2014 09:47:28 -0800 (PST) X-ASG-Debug-ID: 1415900847-04bdf0650c2b15a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id rXQSM9IIBRAwQ5uT for ; Thu, 13 Nov 2014 09:47:27 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B045063BE83C; Thu, 13 Nov 2014 11:47:26 -0600 (CST) Message-ID: <5464EEAD.3060500@sandeen.net> Date: Thu, 13 Nov 2014 11:47:25 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Mark Tinguely , Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH 4/9] xfsdump: remove pointless if (dirty); References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-5-git-send-email-sandeen@redhat.com> <5464EBD6.3040107@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 4/9] xfsdump: remove pointless if (dirty); In-Reply-To: <5464EBD6.3040107@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415900847 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/13/14 11:35 AM, Mark Tinguely wrote: > On 11/12/14 12:57, Eric Sandeen wrote: >> "dirty" seems to be a remnant of unfinished code; other bits of >> it are there but commented out, so comment out "if (dirty);" as >> well, which is a no-op if statement which can't be true. >> >> Signed-off-by: Eric Sandeen >> --- >> inventory/inv_stobj.c | 2 ++ >> 1 files changed, 2 insertions(+), 0 deletions(-) >> >> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c >> index becac17..84b15d9 100644 >> --- a/inventory/inv_stobj.c >> +++ b/inventory/inv_stobj.c >> @@ -976,7 +976,9 @@ stobj_delete_mobj(int fd, >> >> } >> free ( mfiles ); >> +/* >> if ( dirty ); >> +*/ >> } >> >> free ( strms ); > > Why not remove all the references to dirty in the function? > Like you said, it doesn't do anything. Somebody left this and the rest of the commented-out code there for some documentation reason, it seems, so I figured... It's not like the rest of the code is a thing of beauty, and this wart is ruining its perfection. ;) I have no idea, honestly. xfsdump is dropped in from some alien world. Somebody @ SGI might know, or could find out by looking at long-lost history? -Eric From sandeen@sandeen.net Thu Nov 13 12:00:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1330E7F37 for ; Thu, 13 Nov 2014 12:00:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F38BB304064 for ; Thu, 13 Nov 2014 10:00:10 -0800 (PST) X-ASG-Debug-ID: 1415901609-04cbb00e6927bd10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nPr60eHK33POC8PN for ; Thu, 13 Nov 2014 10:00:09 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E7AA663BE83C; Thu, 13 Nov 2014 12:00:08 -0600 (CST) Message-ID: <5464F1A7.20008@sandeen.net> Date: Thu, 13 Nov 2014 12:00:07 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH 2/9 V2] xfsdump: Fix overflow of "question" string in Media_prompt_erase() References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-3-git-send-email-sandeen@redhat.com> <5463AF7A.8040006@sandeen.net> <20141113173813.GA9959@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/9 V2] xfsdump: Fix overflow of "question" string in Media_prompt_erase() In-Reply-To: <20141113173813.GA9959@infradead.org> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415901609 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/13/14 11:38 AM, Christoph Hellwig wrote: >> + asprintf( &question, >> + "overwrite data on media in drive %u?\n", >> (unsigned int)drivep->d_index ); > > Where is the error handling? Well, ok. The error handling ahead of this is crap; if the function returns !ok, we change the media: ok = Media_prompt_overwrite( drivep ); if ( intr_allowed && cldmgr_stop_requested( )) { return RV_INTR; } if ( ! ok ) { goto changemedia; } I don't want to try to understand and rework all the ways we can back out of this if we don't have ~100 bytes available. So, what would you prefer: I could make a 110-byte array, and snprintf max 110 bytes to it. Or I could asprintf, and exit the whole program if it fails. I'm not trying to make xfsdump perfect, I'm trying to make it suck less. ;) -Eric From tinguely@sgi.com Thu Nov 13 12:10:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4539A7F37 for ; Thu, 13 Nov 2014 12:10:06 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C24C8F8064; Thu, 13 Nov 2014 10:10:02 -0800 (PST) Message-ID: <5464F3F9.10305@sgi.com> Date: Thu, 13 Nov 2014 12:10:01 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] xfsdump: fix uninit ackstr in content_mediachange_query() References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-10-git-send-email-sandeen@redhat.com> In-Reply-To: <1415818638-32700-10-git-send-email-sandeen@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/12/14 12:57, Eric Sandeen wrote: > Today, this sends an uninitialized ackstr[0] to be mlog'd - > who knows what we get out of it. Other places follow this > "count = 0, string = "\n"" pattern which seemsa bit odd, but > better than printing uninitialized memory. > > To be completely honest, I have no test for this. > > Signed-off-by: Eric Sandeen > --- > restore/content.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/restore/content.c b/restore/content.c > index c99aed7..bc5b398 100644 > --- a/restore/content.c > +++ b/restore/content.c > @@ -2915,6 +2915,7 @@ content_mediachange_query( void ) > bagp = 0; > } > ackcnt = 0; > + ackstr[ ackcnt++ ] = "\n"; > dlog_multi_ack( ackstr, > ackcnt ); > querycnt = 0; dlog_multi_ack() with count of 0 will exit without doing anything. Looks like some conditional code that filled the ackstr array (like the other callers) was removed. I vote to pull ackstr, ackcnt and the dlog_multi_ack() from this function. --Mark. From tinguely@sgi.com Thu Nov 13 13:02:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FF387F37 for ; Thu, 13 Nov 2014 13:02:58 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay1.corp.sgi.com (Postfix) with ESMTP id F05C28F8059; Thu, 13 Nov 2014 11:02:54 -0800 (PST) Message-ID: <5465005E.9020106@sgi.com> Date: Thu, 13 Nov 2014 13:02:54 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH 4/9] xfsdump: remove pointless if (dirty); References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-5-git-send-email-sandeen@redhat.com> <5464EBD6.3040107@sgi.com> <5464EEAD.3060500@sandeen.net> In-Reply-To: <5464EEAD.3060500@sandeen.net> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 11/13/14 11:47, Eric Sandeen wrote: > On 11/13/14 11:35 AM, Mark Tinguely wrote: >> On 11/12/14 12:57, Eric Sandeen wrote: >>> "dirty" seems to be a remnant of unfinished code; other bits of >>> it are there but commented out, so comment out "if (dirty);" as >>> well, which is a no-op if statement which can't be true. >>> >>> Signed-off-by: Eric Sandeen >>> --- >>> inventory/inv_stobj.c | 2 ++ >>> 1 files changed, 2 insertions(+), 0 deletions(-) >>> >>> diff --git a/inventory/inv_stobj.c b/inventory/inv_stobj.c >>> index becac17..84b15d9 100644 >>> --- a/inventory/inv_stobj.c >>> +++ b/inventory/inv_stobj.c >>> @@ -976,7 +976,9 @@ stobj_delete_mobj(int fd, >>> >>> } >>> free ( mfiles ); >>> +/* >>> if ( dirty ); >>> +*/ >>> } >>> >>> free ( strms ); >> >> Why not remove all the references to dirty in the function? >> Like you said, it doesn't do anything. > > Somebody left this and the rest of the commented-out code there > for some documentation reason, it seems, so I figured... > > It's not like the rest of the code is a thing > of beauty, and this wart is ruining its perfection. ;) > > I have no idea, honestly. xfsdump is dropped in from some alien > world. Somebody @ SGI might know, or could find out by looking > at long-lost history? > > -Eric I will see what I can dig up. We need to start pulling off the warts. The interactive command line parsing is also damaged, I will find the patch and post it. --Mark. From tinguely@eagdhcp-232-156.americas.sgi.com Thu Nov 13 13:17:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4DBE77F37 for ; Thu, 13 Nov 2014 13:17:18 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B4DC8F8059 for ; Thu, 13 Nov 2014 11:17:18 -0800 (PST) Received: from eagdhcp-232-156.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-156.americas.sgi.com (8.14.5/8.14.5) with ESMTP id sADJHHsv002311 for ; Thu, 13 Nov 2014 13:17:17 -0600 (CST) (envelope-from tinguely@eagdhcp-232-156.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-156.americas.sgi.com (8.14.5/8.14.5/Submit) id sADJHHvS002310; Thu, 13 Nov 2014 13:17:17 -0600 (CST) (envelope-from tinguely) Message-Id: <20141113191510.176392492@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 13 Nov 2014 13:14:45 -0600 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfsrestore: fix string corruption in shrink() Content-Disposition: inline; filename=xfsrestore-fix-string-corruption-in-shrink.patch Linux strcpy() corrupts the output string when the input and output strings overlap. The shrink() function in xfsrestore uses an overlapping strcpy() to remove special characters when processing an interactive command line. The resultant command will fail. examples: -> cd "AOGC exome chip core genotyping" AOGC exome chp core genotyping not found -> cd "t t" tt not found Fix my manually moving the characters in the array. Signed-off-by: Mark Tinguely --- restore/tree.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) Index: b/restore/tree.c =================================================================== --- a/restore/tree.c +++ b/restore/tree.c @@ -4857,7 +4857,19 @@ distance_to_space( char *s, char *l ) static void shrink( char *s, size_t cnt ) { - strcpy( s, s + cnt ); + /* + * Linux strcpy corrupts the string if the src and dst overlap. + * Manually copy the entries to the left. + * + * Since the liter array is mostly nulls, shrink is not moving + * the array left as intended. Does not seem to be many embedded + * processing characters, so leaving it for now + */ + char *m = s + cnt; + while (*m != '\0') + *s++ = *m++; + /* NULL the last character of the string */ + *s = '\0'; } static int From sandeen@redhat.com Thu Nov 13 13:23:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FDED7F37 for ; Thu, 13 Nov 2014 13:23:23 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2CCF98F8059 for ; Thu, 13 Nov 2014 11:23:23 -0800 (PST) X-ASG-Debug-ID: 1415906601-04cb6c1e6a27a720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wNZ1xEgNhqoN9hm5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 13 Nov 2014 11:23:22 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADJNLBN011754 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 13 Nov 2014 14:23:21 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADJNJYP000589 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 13 Nov 2014 14:23:20 -0500 Message-ID: <54650527.1@redhat.com> Date: Thu, 13 Nov 2014 13:23:19 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] xfsdump: fix uninit ackstr in content_mediachange_query() References: <1415818638-32700-1-git-send-email-sandeen@redhat.com> <1415818638-32700-10-git-send-email-sandeen@redhat.com> <5464F3F9.10305@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 9/9] xfsdump: fix uninit ackstr in content_mediachange_query() In-Reply-To: <5464F3F9.10305@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415906602 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 11/13/14 12:10 PM, Mark Tinguely wrote: > On 11/12/14 12:57, Eric Sandeen wrote: >> Today, this sends an uninitialized ackstr[0] to be mlog'd - >> who knows what we get out of it. Other places follow this >> "count = 0, string = "\n"" pattern which seemsa bit odd, but >> better than printing uninitialized memory. >> >> To be completely honest, I have no test for this. >> >> Signed-off-by: Eric Sandeen >> --- >> restore/content.c | 1 + >> 1 files changed, 1 insertions(+), 0 deletions(-) >> >> diff --git a/restore/content.c b/restore/content.c >> index c99aed7..bc5b398 100644 >> --- a/restore/content.c >> +++ b/restore/content.c >> @@ -2915,6 +2915,7 @@ content_mediachange_query( void ) >> bagp = 0; >> } >> ackcnt = 0; >> + ackstr[ ackcnt++ ] = "\n"; >> dlog_multi_ack( ackstr, >> ackcnt ); >> querycnt = 0; > > dlog_multi_ack() with count of 0 will exit without doing anything. Oh, yeah, I misread it. Sorry. I saw stuff like this in sigint_dialog() ackcnt = 0; ackstr[ ackcnt++ ] = "\n"; dlog_multi_ack( ackstr, ackcnt ); and got carried away. > Looks like some conditional code that filled the ackstr array (like > the other callers) was removed. I vote to pull ackstr, ackcnt and the > dlog_multi_ack() from this function. I wondered about that, but didn't want to go changing things I wasn't able to test or trivially understand. However, I guess I'm challenged even in the latter this week. ;) Anyway, yeah, just drop this patch, sorry. Thanks for the review, -Eric > --Mark. From bfoster@redhat.com Thu Nov 13 13:24:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4047B29DFB for ; Thu, 13 Nov 2014 13:24:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D1F8CAC00E for ; Thu, 13 Nov 2014 11:24:05 -0800 (PST) X-ASG-Debug-ID: 1415906644-04bdf0650d2b5400001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id znpZaeDhpFarVe0u (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 11:24:05 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADJO3Ms012272 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 14:24:04 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADJO3eZ002303 for ; Thu, 13 Nov 2014 14:24:03 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 14681122F87; Thu, 13 Nov 2014 14:24:01 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC v3 2/2] xfs: split metadata and log buffer completion to separate workqueues Date: Thu, 13 Nov 2014 14:24:01 -0500 X-ASG-Orig-Subj: [PATCH RFC v3 2/2] xfs: split metadata and log buffer completion to separate workqueues Message-Id: <1415906641-43587-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1415906641-43587-1-git-send-email-bfoster@redhat.com> References: <1415906641-43587-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415906644 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS traditionally sends all buffer I/O completion work to a single queue. This includes metadata buffer completion and log buffer completion. The log buffer completion requires a high priority queue to prevent stalls due to log forces getting stuck behind other queued work. Rather than continue to prioritize all buffer I/O completion due to the needs of log completion, split log buffer completion off to m_log_workqueue and move the high priority flag from m_buf_workqueue to m_log_workqueue. [XXX: Use of XBF_SYNCIO is purely for demonstration. Define a new flag.] Signed-off-by: Brian Foster --- fs/xfs/xfs_buf.c | 9 ++++++++- fs/xfs/xfs_super.c | 5 ++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index c06d790..58d729c 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1050,8 +1050,15 @@ void xfs_buf_ioend_async( struct xfs_buf *bp) { + struct workqueue_struct *wq; + + if (bp->b_flags & XBF_SYNCIO) + wq = bp->b_target->bt_mount->m_log_workqueue; + else + wq = bp->b_target->bt_mount->m_buf_workqueue; + INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); - queue_work(bp->b_target->bt_mount->m_buf_workqueue, &bp->b_iodone_work); + queue_work(wq, &bp->b_iodone_work); } void diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 03e3cc2..4b8cd37 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -843,8 +843,7 @@ xfs_init_mount_workqueues( struct xfs_mount *mp) { mp->m_buf_workqueue = alloc_workqueue("xfs-buf/%s", - WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_FREEZABLE, 1, - mp->m_fsname); + WQ_MEM_RECLAIM|WQ_FREEZABLE, 1, mp->m_fsname); if (!mp->m_buf_workqueue) goto out; @@ -869,7 +868,7 @@ xfs_init_mount_workqueues( goto out_destroy_cil; mp->m_log_workqueue = alloc_workqueue("xfs-log/%s", - WQ_FREEZABLE, 0, mp->m_fsname); + WQ_FREEZABLE|WQ_HIGHPRI, 0, mp->m_fsname); if (!mp->m_log_workqueue) goto out_destroy_reclaim; -- 1.8.3.1 From bfoster@redhat.com Thu Nov 13 13:24:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8130B29DFC for ; Thu, 13 Nov 2014 13:24:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 70ADB8F8033 for ; Thu, 13 Nov 2014 11:24:06 -0800 (PST) X-ASG-Debug-ID: 1415906644-04cbb00e6727f030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0OtimBxyigVf8CY5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 11:24:05 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADJO3qW009817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 14:24:04 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADJO3CO019118 for ; Thu, 13 Nov 2014 14:24:03 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 08067120296; Thu, 13 Nov 2014 14:24:01 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 1/2] xfs: replace global xfslogd wq with per-mount wq Date: Thu, 13 Nov 2014 14:24:00 -0500 X-ASG-Orig-Subj: [PATCH v3 1/2] xfs: replace global xfslogd wq with per-mount wq Message-Id: <1415906641-43587-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1415906641-43587-1-git-send-email-bfoster@redhat.com> References: <1415906641-43587-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415906645 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The xfslogd workqueue is a global, single-job workqueue for buffer ioend processing. This means we allow for a single work item at a time for all possible XFS mounts on a system. fsstress testing in loopback XFS over XFS configurations has reproduced xfslogd deadlocks due to the single threaded nature of the queue and dependencies introduced between the separate XFS instances by online discard (-o discard). Discard over a loopback device converts the discard request to a hole punch (fallocate) on the underlying file. Online discard requests are issued synchronously and from xfslogd context in XFS, hence the xfslogd workqueue is blocked in the upper fs waiting on a hole punch request to be servied in the lower fs. If the lower fs issues I/O that depends on xfslogd to complete, both filesystems end up hung indefinitely. This is reproduced reliabily by generic/013 on XFS->loop->XFS test devices with the '-o discard' mount option. Further, docker implementations appear to use this kind of configuration for container instance filesystems by default (container fs->dm-> loop->base fs) and therefore are subject to this deadlock when running on XFS. Replace the global xfslogd workqueue with a per-mount variant. This guarantees each mount access to a single worker and prevents deadlocks due to inter-fs dependencies introduced by discard. Since the queue is only responsible for buffer iodone processing at this point in time, rename xfslogd to xfs-buf. Signed-off-by: Brian Foster --- fs/xfs/xfs_buf.c | 12 +----------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_super.c | 11 ++++++++++- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 24b4ebe..c06d790 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -44,8 +44,6 @@ static kmem_zone_t *xfs_buf_zone; -static struct workqueue_struct *xfslogd_workqueue; - #ifdef XFS_BUF_LOCK_TRACKING # define XB_SET_OWNER(bp) ((bp)->b_last_holder = current->pid) # define XB_CLEAR_OWNER(bp) ((bp)->b_last_holder = -1) @@ -1053,7 +1051,7 @@ xfs_buf_ioend_async( struct xfs_buf *bp) { INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); - queue_work(xfslogd_workqueue, &bp->b_iodone_work); + queue_work(bp->b_target->bt_mount->m_buf_workqueue, &bp->b_iodone_work); } void @@ -1882,15 +1880,8 @@ xfs_buf_init(void) if (!xfs_buf_zone) goto out; - xfslogd_workqueue = alloc_workqueue("xfslogd", - WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 1); - if (!xfslogd_workqueue) - goto out_free_buf_zone; - return 0; - out_free_buf_zone: - kmem_zone_destroy(xfs_buf_zone); out: return -ENOMEM; } @@ -1898,6 +1889,5 @@ xfs_buf_init(void) void xfs_buf_terminate(void) { - destroy_workqueue(xfslogd_workqueue); kmem_zone_destroy(xfs_buf_zone); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b0447c8..394bc71 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -168,6 +168,7 @@ typedef struct xfs_mount { /* low free space thresholds */ struct xfs_kobj m_kobj; + struct workqueue_struct *m_buf_workqueue; struct workqueue_struct *m_data_workqueue; struct workqueue_struct *m_unwritten_workqueue; struct workqueue_struct *m_cil_workqueue; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 9f622fe..03e3cc2 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -842,10 +842,16 @@ STATIC int xfs_init_mount_workqueues( struct xfs_mount *mp) { + mp->m_buf_workqueue = alloc_workqueue("xfs-buf/%s", + WQ_MEM_RECLAIM|WQ_HIGHPRI|WQ_FREEZABLE, 1, + mp->m_fsname); + if (!mp->m_buf_workqueue) + goto out; + mp->m_data_workqueue = alloc_workqueue("xfs-data/%s", WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_data_workqueue) - goto out; + goto out_destroy_buf; mp->m_unwritten_workqueue = alloc_workqueue("xfs-conv/%s", WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); @@ -884,6 +890,8 @@ out_destroy_unwritten: destroy_workqueue(mp->m_unwritten_workqueue); out_destroy_data_iodone_queue: destroy_workqueue(mp->m_data_workqueue); +out_destroy_buf: + destroy_workqueue(mp->m_buf_workqueue); out: return -ENOMEM; } @@ -898,6 +906,7 @@ xfs_destroy_mount_workqueues( destroy_workqueue(mp->m_cil_workqueue); destroy_workqueue(mp->m_data_workqueue); destroy_workqueue(mp->m_unwritten_workqueue); + destroy_workqueue(mp->m_buf_workqueue); } /* -- 1.8.3.1 From bfoster@redhat.com Thu Nov 13 13:24:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2067629E08 for ; Thu, 13 Nov 2014 13:24:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A42A4AC002 for ; Thu, 13 Nov 2014 11:24:08 -0800 (PST) X-ASG-Debug-ID: 1415906644-04cbb00e6827f030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XeqmUC1mDSOQS1Sf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 11:24:04 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sADJO3JH024169 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 13 Nov 2014 14:24:03 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sADJO3ut002302 for ; Thu, 13 Nov 2014 14:24:03 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id E3C0F12310A; Thu, 13 Nov 2014 14:24:01 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 0/2] xfs: split up xfslogd global workqueue Date: Thu, 13 Nov 2014 14:23:59 -0500 X-ASG-Orig-Subj: [PATCH v3 0/2] xfs: split up xfslogd global workqueue Message-Id: <1415906641-43587-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415906644 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I've broken this up into two patches because the bugfix is easy (patch 1) and I don't want to rework it for the purpose of refactoring usage of the queue. Patch 1 is a straightforward, tested and backportable fix for a specific problem and it's no more difficult to refactor queue usage from a per-mount queue than from a single global queue. The metadata/log buffer I/O separation is not as straightforward as defining separate queues. We need to also define a mechanism to split the completions across multiple queues within the buffer code. The ioend code does this for the data/unwritten queues via the io type. There are a few different ways we can go from here with regard to buffers. For example: - Define per-buftarg workqueues and configure them appropriately for data and log devices. - Split buf completion processing based on a buffer flag (or some other identification). - Continue using a single queue (per-mount) for metadata/log completions. The first approach introduces variance in that the separation only occurs with separate data and log devices. This is not ideal and doesn't seem worthwhile to me. It doesn't change anything in the common case and introduces a new regression vector for the uncommon case. The second approach is implemented by the 2/2 RFC of this series using the XBF_SYNCIO flag simply because it only appears to be used by log buffers at the moment. If we take this approach, should we define something like an XBF_LOGIO or XBF_HIGHPRI flag? The third approach simply involves dropping patch 2/2 and using the per-mount queue as we use the global queue today. Brian v3: - Split bug fix and buf/log I/O split into separate patches. - Rename xfslogd workqueue to xfs-buf. v2: http://oss.sgi.com/archives/xfs/2014-11/msg00164.html - Rename xfslogd workqueue to xfs-iodone. v1: http://oss.sgi.com/archives/xfs/2014-10/msg00539.html Brian Foster (2): xfs: replace global xfslogd wq with per-mount wq xfs: split metadata and log buffer completion to separate workqueues fs/xfs/xfs_buf.c | 19 ++++++++----------- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_super.c | 12 ++++++++++-- 3 files changed, 19 insertions(+), 13 deletions(-) -- 1.8.3.1 From sandeen@sandeen.net Thu Nov 13 13:41:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD39E29DF7 for ; Thu, 13 Nov 2014 13:41:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9368304051 for ; Thu, 13 Nov 2014 11:41:39 -0800 (PST) X-ASG-Debug-ID: 1415907698-04cbb00e6627fc90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id SJMFe4sEVPU0yQYy for ; Thu, 13 Nov 2014 11:41:38 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C1E7363BE83C; Thu, 13 Nov 2014 13:41:37 -0600 (CST) Message-ID: <54650970.7010902@sandeen.net> Date: Thu, 13 Nov 2014 13:41:36 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfsrestore: fix string corruption in shrink() References: <20141113191510.176392492@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfsrestore: fix string corruption in shrink() In-Reply-To: <20141113191510.176392492@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415907698 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11563 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/13/14 1:14 PM, Mark Tinguely wrote: > Linux strcpy() corrupts the output string when the input Not Linux strcpy in particular; per C99: > The strcpy function copies the string pointed to by s2 > (including the terminating null character) into the array > pointed to by s1. If copying takes place between objects > that overlap, the behavior is undefined. ^^^^^^^^^^^^^^^^^^^^^^^^^ > and output strings overlap. The shrink() function in xfsrestore > uses an overlapping strcpy() to remove special characters when > processing an interactive command line. The resultant command > will fail. > > examples: > -> cd "AOGC exome chip core genotyping" > AOGC exome chp core genotyping not found > -> cd "t t" > tt not found > > Fix my manually moving the characters in the array. > > Signed-off-by: Mark Tinguely > --- > restore/tree.c | 14 +++++++++++++- > 1 file changed, 13 insertions(+), 1 deletion(-) > > Index: b/restore/tree.c > =================================================================== > --- a/restore/tree.c > +++ b/restore/tree.c > @@ -4857,7 +4857,19 @@ distance_to_space( char *s, char *l ) > static void > shrink( char *s, size_t cnt ) > { > - strcpy( s, s + cnt ); > + /* > + * Linux strcpy corrupts the string if the src and dst overlap. > + * Manually copy the entries to the left. > + * > + * Since the liter array is mostly nulls, shrink is not moving what is the "liter array?" Ah well. Context. ;) > + * the array left as intended. Does not seem to be many embedded > + * processing characters, so leaving it for now > + */ > + char *m = s + cnt; > + while (*m != '\0') > + *s++ = *m++; > + /* NULL the last character of the string */ > + *s = '\0'; > } Would this be any less manual? size_t n = strlen(s+cnt) + 1; /* 1 for terminating NULL */ memmove(s, s + cnt, n); because memmove is ok with overlaps. -Eric > static int > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Thu Nov 13 13:56:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CCB6D7F37 for ; Thu, 13 Nov 2014 13:56:17 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9202C304064; Thu, 13 Nov 2014 11:56:17 -0800 (PST) Message-ID: <54650CE1.3050706@sgi.com> Date: Thu, 13 Nov 2014 13:56:17 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfsrestore: fix string corruption in shrink() References: <20141113191510.176392492@sgi.com> <54650970.7010902@sandeen.net> In-Reply-To: <54650970.7010902@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/13/14 13:41, Eric Sandeen wrote: > On 11/13/14 1:14 PM, Mark Tinguely wrote: >> Linux strcpy() corrupts the output string when the input > > Not Linux strcpy in particular; per C99: > >> The strcpy function copies the string pointed to by s2 >> (including the terminating null character) into the array >> pointed to by s1. If copying takes place between objects >> that overlap, the behavior is undefined. > ^^^^^^^^^^^^^^^^^^^^^^^^^ > >> and output strings overlap. The shrink() function in xfsrestore >> uses an overlapping strcpy() to remove special characters when >> processing an interactive command line. The resultant command >> will fail. >> >> examples: >> -> cd "AOGC exome chip core genotyping" >> AOGC exome chp core genotyping not found >> -> cd "t t" >> tt not found >> >> Fix my manually moving the characters in the array. >> >> Signed-off-by: Mark Tinguely >> --- >> restore/tree.c | 14 +++++++++++++- >> 1 file changed, 13 insertions(+), 1 deletion(-) >> >> Index: b/restore/tree.c >> =================================================================== >> --- a/restore/tree.c >> +++ b/restore/tree.c >> @@ -4857,7 +4857,19 @@ distance_to_space( char *s, char *l ) >> static void >> shrink( char *s, size_t cnt ) >> { >> - strcpy( s, s + cnt ); >> + /* >> + * Linux strcpy corrupts the string if the src and dst overlap. >> + * Manually copy the entries to the left. >> + * >> + * Since the liter array is mostly nulls, shrink is not moving > > what is the "liter array?" Ah well. Context. ;) > >> + * the array left as intended. Does not seem to be many embedded >> + * processing characters, so leaving it for now >> + */ >> + char *m = s + cnt; >> + while (*m != '\0') >> + *s++ = *m++; >> + /* NULL the last character of the string */ >> + *s = '\0'; >> } > > Would this be any less manual? > > size_t n = strlen(s+cnt) + 1; /* 1 for terminating NULL */ > > memmove(s, s + cnt, n); > > because memmove is ok with overlaps. > > -Eric > I thought of that but if we are doing a strlen() might as well just copy it while you are walking the string. --Mark. From sandeen@sandeen.net Thu Nov 13 14:45:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2EBF77F37 for ; Thu, 13 Nov 2014 14:45:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0C42AC002 for ; Thu, 13 Nov 2014 12:45:53 -0800 (PST) X-ASG-Debug-ID: 1415911551-04bdf0650f2b8780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AhBVYBBeMx67zOzW for ; Thu, 13 Nov 2014 12:45:52 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7ED9463C3BCF; Thu, 13 Nov 2014 14:45:51 -0600 (CST) Message-ID: <5465187D.3060308@sandeen.net> Date: Thu, 13 Nov 2014 14:45:49 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfsrestore: fix string corruption in shrink() References: <20141113191510.176392492@sgi.com> <54650970.7010902@sandeen.net> <54650CE1.3050706@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfsrestore: fix string corruption in shrink() In-Reply-To: <54650CE1.3050706@sgi.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415911551 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11565 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/13/14 1:56 PM, Mark Tinguely wrote: > On 11/13/14 13:41, Eric Sandeen wrote: >> On 11/13/14 1:14 PM, Mark Tinguely wrote: >>> Linux strcpy() corrupts the output string when the input >> >> Not Linux strcpy in particular; per C99: >> >>> The strcpy function copies the string pointed to by s2 >>> (including the terminating null character) into the array >>> pointed to by s1. If copying takes place between objects >>> that overlap, the behavior is undefined. >> ^^^^^^^^^^^^^^^^^^^^^^^^^ >> >>> and output strings overlap. The shrink() function in xfsrestore >>> uses an overlapping strcpy() to remove special characters when >>> processing an interactive command line. The resultant command >>> will fail. >>> >>> examples: >>> -> cd "AOGC exome chip core genotyping" >>> AOGC exome chp core genotyping not found >>> -> cd "t t" >>> tt not found >>> >>> Fix my manually moving the characters in the array. >>> >>> Signed-off-by: Mark Tinguely >>> --- >>> restore/tree.c | 14 +++++++++++++- >>> 1 file changed, 13 insertions(+), 1 deletion(-) >>> >>> Index: b/restore/tree.c >>> =================================================================== >>> --- a/restore/tree.c >>> +++ b/restore/tree.c >>> @@ -4857,7 +4857,19 @@ distance_to_space( char *s, char *l ) >>> static void >>> shrink( char *s, size_t cnt ) >>> { >>> - strcpy( s, s + cnt ); >>> + /* >>> + * Linux strcpy corrupts the string if the src and dst overlap. >>> + * Manually copy the entries to the left. >>> + * >>> + * Since the liter array is mostly nulls, shrink is not moving >> >> what is the "liter array?" Ah well. Context. ;) >> >>> + * the array left as intended. Does not seem to be many embedded >>> + * processing characters, so leaving it for now >>> + */ >>> + char *m = s + cnt; >>> + while (*m != '\0') >>> + *s++ = *m++; >>> + /* NULL the last character of the string */ >>> + *s = '\0'; >>> } >> >> Would this be any less manual? >> >> size_t n = strlen(s+cnt) + 1; /* 1 for terminating NULL */ >> >> memmove(s, s + cnt, n); >> >> because memmove is ok with overlaps. >> >> -Eric >> > > I thought of that but if we are doing a strlen() might as well just copy it while you are walking the string. Ok, fair enough. I think mine is clearer to dummies like me, but *shrug.* I'd also prefer that the comment say "overlapping strcpy is undefined" rather than poking fun at Linux. ;) And the rest of the comment doesn't really help me understand what's going on. "liter?" "embedded processing characters?" I have no idea what that means when I'm reading this function, which simply moves part of a string around, so I'd rather have either a description of what it does & doesn't do at the top, or leave out those seemingly random details. But it fixes a bug, and those are nitpicks you can fix, or not, I suppose, though I really would prefer a clearer comment so future readers have some clue, and don't end up more confused than when they started reading it. ;) Anyway, for the fix itself, Reviewed-by: Eric Sandeen > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From ong@serviciocliente.me Thu Nov 13 15:37:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 196B429DF7 for ; Thu, 13 Nov 2014 15:37:50 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EC16F8F8066 for ; Thu, 13 Nov 2014 13:37:46 -0800 (PST) X-ASG-Debug-ID: 1415914664-04bdf0650e2ba930001-NocioJ Received: from mail5.serviciocliente.me (50-7-47-18.skynetky.net [50.7.47.18]) by cuda.sgi.com with ESMTP id 0P0dewoSqgTn0Tdi for ; Thu, 13 Nov 2014 13:37:45 -0800 (PST) X-Barracuda-Envelope-From: ong@serviciocliente.me X-Barracuda-Apparent-Source-IP: 50.7.47.18 Received: from WIN-FRCJD8Z2ZSJ (50.7.47.10) by mail5.serviciocliente.me id hckiaa0our06 for ; Thu, 13 Nov 2014 13:37:40 -0800 (envelope-from ) biler: 7111119519 Message-ID: <9265b76dfb36c30cc6d33db300197c03@serviciocliente.me> From: "Ultimos Lugares" To: Subject: Donaciones y Dinero ONG Date: Thu, 13 Nov 2014 13:37:40 -0800 X-ASG-Orig-Subj: Donaciones y Dinero ONG MIME-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: base64 X-Barracuda-Connect: 50-7-47-18.skynetky.net[50.7.47.18] X-Barracuda-Start-Time: 1415914665 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11567 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 oU5vIHRlIHF1ZWRlcyBmdWVyYSEsIFJlc2VydmEgdHUgbHVnYXIgeSChUGFydGljaXBhIFlhDQoN CkPzbW8gY29uc2VndWlyIERvbmFjaW9uZXMgeSBEaW5lcm8gcGFyYSBlbnRpZGFkZXMgc2luIGZp bmVzIGRlIGx1Y3JvIE9OR5JTDQpN6XhpY28sIEQuRi4gMjggZGUgbm92aWVtYnJlIDIwMTQNCg0K RWwgcHJvZ3JhbWEgY3VicmUsIGVudHJlIG90cm9zIHRlbWFzhQ0KLSBSZWluZ2VuaWVy7WEgZGUg bGFzIGVtcHJlc2FzIGRlbCB0ZXJjZXIgc2VjdG9yLg0KLSBU4WN0aWNhcyB5IGVzdHJhdGVnaWFz IGRlIG1hcmtldGluZyB5IGFkbWluaXN0cmFjafNuLg0KLSBDYW1wYfFhcyBlY29u821pY28tZmlu YW5jaWVyYXMgcGFyYSBlbnRpZGFkZXMgc2luIGZpbmVzIGRlIGx1Y3JvLg0KLSBQYXRyb2Npbmlv cyB5IGRvbmFjaW9uZXMuDQotIENvbXVuaWNhY2nzbiB5IGRpZnVzafNuIGRlIGxhIGluc3RpdHVj afNuIHkgc3VzIHRhcmVhcy4NCg0KQWRxdWllcmEgZWwgZm9sbGV0byBjb21wbGV0byB5IHNpbiBj b21wcm9taXNvLCBzb2xvIHJlc3BvbmRhIGVzdGUgY29ycmVvIGNvbiBhc3VudG8gLU9ORyArIE5v bWJyZSArIFRlbOlmb25vLSB5IGEgbGEgYnJldmVkYWQgbG8gcmVjaWJpcuEhIG8gbGzhbWVub3Mg c2luIGNvc3RvIGFsZ3VubyBhbCAwMTgwMC0yMTItMDY2MA0KDQpFc3RhIGludml0YWNp824gaGEg c2lkbyBlbnZpYWRvIGE6IHhmc0Bvc3Muc2dpLmNvbQ0KUGFyYSBldml0YXIgaW52aXRhY2lvbmVz IEZ1dHVyYXMgZGUgbG9zIG1lam9yZXMgdGVtYXMgZGUgYWN0dWFsaXphY2nzbiByZXNwb25kYSBj b24gYXN1bnRvIG1kZg0K From david@fromorbit.com Thu Nov 13 15:51:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E311B7F37 for ; Thu, 13 Nov 2014 15:51:40 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A51B0304048 for ; Thu, 13 Nov 2014 13:51:37 -0800 (PST) X-ASG-Debug-ID: 1415915450-04cbb00e66284620001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id SibF8dICJzKCbD67 for ; Thu, 13 Nov 2014 13:50:51 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Am5KAKUmZVR5LbBU/2dsb2JhbABbgw6BLblABpUOhWwCAgEBAoEhFwEBAQEBfYQCAQEBAwEnExwjEAgDGAklDwUlAyETiDgI0RMBAQEBBgEBAQEeGIYiiXZkB4MtgR4FnjCWaIQQKTCBBoFFAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail07.adl2.internode.on.net with ESMTP; 14 Nov 2014 08:20:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xp2Hk-0007Rt-3a; Fri, 14 Nov 2014 08:50:36 +1100 Date: Fri, 14 Nov 2014 08:50:36 +1100 From: Dave Chinner To: Mark Tinguely Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH] xfsrestore: fix string corruption in shrink() Message-ID: <20141113215035.GF23575@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsrestore: fix string corruption in shrink() References: <20141113191510.176392492@sgi.com> <54650970.7010902@sandeen.net> <54650CE1.3050706@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54650CE1.3050706@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1415915450 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11568 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 13, 2014 at 01:56:17PM -0600, Mark Tinguely wrote: > On 11/13/14 13:41, Eric Sandeen wrote: > >On 11/13/14 1:14 PM, Mark Tinguely wrote: > >>Linux strcpy() corrupts the output string when the input > > > >Not Linux strcpy in particular; per C99: > > > >>The strcpy function copies the string pointed to by s2 > >>(including the terminating null character) into the array > >>pointed to by s1. If copying takes place between objects > >>that overlap, the behavior is undefined. > > ^^^^^^^^^^^^^^^^^^^^^^^^^ > > > >>and output strings overlap. The shrink() function in xfsrestore > >>uses an overlapping strcpy() to remove special characters when > >>processing an interactive command line. The resultant command > >>will fail. > >> > >>examples: > >> -> cd "AOGC exome chip core genotyping" > >>AOGC exome chp core genotyping not found > >> -> cd "t t" > >>tt not found > >> > >>Fix my manually moving the characters in the array. > >> > >>Signed-off-by: Mark Tinguely > >>--- > >> restore/tree.c | 14 +++++++++++++- > >> 1 file changed, 13 insertions(+), 1 deletion(-) > >> > >>Index: b/restore/tree.c > >>=================================================================== > >>--- a/restore/tree.c > >>+++ b/restore/tree.c > >>@@ -4857,7 +4857,19 @@ distance_to_space( char *s, char *l ) > >> static void > >> shrink( char *s, size_t cnt ) > >> { > >>- strcpy( s, s + cnt ); > >>+ /* > >>+ * Linux strcpy corrupts the string if the src and dst overlap. > >>+ * Manually copy the entries to the left. > >>+ * > >>+ * Since the liter array is mostly nulls, shrink is not moving > > > >what is the "liter array?" Ah well. Context. ;) > > > >>+ * the array left as intended. Does not seem to be many embedded > >>+ * processing characters, so leaving it for now > >>+ */ > >>+ char *m = s + cnt; > >>+ while (*m != '\0') > >>+ *s++ = *m++; > >>+ /* NULL the last character of the string */ > >>+ *s = '\0'; > >> } > > > >Would this be any less manual? > > > > size_t n = strlen(s+cnt) + 1; /* 1 for terminating NULL */ > > > > memmove(s, s + cnt, n); > > > >because memmove is ok with overlaps. > > > >-Eric > > > > I thought of that but if we are doing a strlen() might as well just > copy it while you are walking the string. I'd much prefer the strlen() + memmove() because then it's self documenting that the move of the string is overlapping. It will also be faster for large strings than a manual byte-at-a-time copy, and there's less code to maintain overall. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Thu Nov 13 15:57:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 352D47F37 for ; Thu, 13 Nov 2014 15:57:30 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay1.corp.sgi.com (Postfix) with ESMTP id E28948F8064; Thu, 13 Nov 2014 13:57:29 -0800 (PST) Message-ID: <54652949.7090506@sgi.com> Date: Thu, 13 Nov 2014 15:57:29 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfsrestore: fix string corruption in shrink() References: <20141113191510.176392492@sgi.com> <54650970.7010902@sandeen.net> <54650CE1.3050706@sgi.com> <5465187D.3060308@sandeen.net> In-Reply-To: <5465187D.3060308@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/13/14 14:45, Eric Sandeen wrote: > On 11/13/14 1:56 PM, Mark Tinguely wrote: >> On 11/13/14 13:41, Eric Sandeen wrote: >>> On 11/13/14 1:14 PM, Mark Tinguely wrote: >>>> Linux strcpy() corrupts the output string when the input >>> >>> Not Linux strcpy in particular; per C99: >>> >>>> The strcpy function copies the string pointed to by s2 >>>> (including the terminating null character) into the array >>>> pointed to by s1. If copying takes place between objects >>>> that overlap, the behavior is undefined. >>> ^^^^^^^^^^^^^^^^^^^^^^^^^ >>> >>>> and output strings overlap. The shrink() function in xfsrestore >>>> uses an overlapping strcpy() to remove special characters when >>>> processing an interactive command line. The resultant command >>>> will fail. >>>> >>>> examples: >>>> -> cd "AOGC exome chip core genotyping" >>>> AOGC exome chp core genotyping not found >>>> -> cd "t t" >>>> tt not found >>>> >>>> Fix my manually moving the characters in the array. >>>> >>>> Signed-off-by: Mark Tinguely >>>> --- >>>> restore/tree.c | 14 +++++++++++++- >>>> 1 file changed, 13 insertions(+), 1 deletion(-) >> I thought of that but if we are doing a strlen() might as well just copy it while you are walking the string. > > Ok, fair enough. I think mine is clearer to dummies like me, but *shrug.* > > I'd also prefer that the comment say "overlapping strcpy is undefined" > rather than poking fun at Linux. ;) And the rest of the comment doesn't > really help me understand what's going on. "liter?" "embedded processing > characters?" I have no idea what that means when I'm reading this function, > which simply moves part of a string around, so I'd rather have either a > description of what it does & doesn't do at the > top, or leave out those seemingly random details. > > But it fixes a bug, and those are nitpicks you can fix, or not, I suppose, > though I really would prefer a clearer comment so future readers have some > clue, and don't end up more confused than when they started reading it. ;) > > Anyway, for the fix itself, > > Reviewed-by: Eric Sandeen No offense to Linux intended. liter is an array of mostly NULL characters that calls this function. The contents of the array seems at odds with how this function operates. The comment was mostly for my future self so I don't have to relearn what is going on here. I do not mind it removed from the community code. --Mark. From luto@amacapital.net Thu Nov 13 18:57:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2E06E7F37 for ; Thu, 13 Nov 2014 18:57:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BEAC9AC002 for ; Thu, 13 Nov 2014 16:57:36 -0800 (PST) X-ASG-Debug-ID: 1415926652-04bdf0616104790001-NocioJ Received: from mail-la0-f53.google.com (mail-la0-f53.google.com [209.85.215.53]) by cuda.sgi.com with ESMTP id YgnTD33Ei3aW5Ej8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Nov 2014 16:57:34 -0800 (PST) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.215.53 Received: by mail-la0-f53.google.com with SMTP id mc6so14402108lab.12 for ; Thu, 13 Nov 2014 16:57:32 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:from:date:message-id:subject:to :content-type; bh=D71JrzAhdQiRc22nm86ms4SmCa00tBEz/XP8JwrIoNg=; b=g3oe2pU6r6m7abtSuwfyLJl6sYjNtUvAUqpWi9bPHqIlWg3OYe1237kQHnNB53bXUE kfYGtyGEYDC1H5c4gfCDnSrbRdXazgvVAWQzwuWGTqzL/t6CI9b3OthFCS9k5N5OsAha GIzJkDDhCAj3jeohJzgugjCBWG+DHDDYX6F2rZczNyOES4k0ihs7Eh/HWlhlbAILEVb8 gM6hOzHpE0uF2ejZ7PXUmE0VDlQxxUP4WsrmVIe2Z5mMeq+HHqEdZ+NnErx2lrzel4W9 sCSM8YG1YuqpyaCawT3jpYq+E4yIbVedTB3xPD5PvDgA6W/IodSYTjr+IvW56UdXosSs V6BQ== X-Gm-Message-State: ALoCoQnYU13pGWQnS/s7KTGkHd7J9tMn9WomnhtXte/Iqd6TnFMo8NwNnvsMiFVdp3XL9snU+H6r X-Received: by 10.112.132.34 with SMTP id or2mr37231lbb.75.1415926652170; Thu, 13 Nov 2014 16:57:32 -0800 (PST) MIME-Version: 1.0 Received: by 10.152.4.71 with HTTP; Thu, 13 Nov 2014 16:57:11 -0800 (PST) From: Andy Lutomirski Date: Thu, 13 Nov 2014 16:57:11 -0800 Message-ID: Subject: XFS locking issues in 3.18-rc3+ To: xfs@oss.sgi.com X-ASG-Orig-Subj: XFS locking issues in 3.18-rc3+ Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-la0-f53.google.com[209.85.215.53] X-Barracuda-Start-Time: 1415926653 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11573 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I'm running a kernel somewhere between 3.18-rc3 and 3.18-rc4. I got the warnings below. Is this a known issue? Thanks, Andy Nov 07 18:05:38 hostname kernel: Nov 07 18:05:38 hostname kernel: ====================================================== Nov 07 18:05:38 hostname kernel: [ INFO: possible circular locking dependency detected ] Nov 07 18:05:38 hostname kernel: 3.18.0-rc3+ #508 Not tainted Nov 07 18:05:38 hostname kernel: ------------------------------------------------------- Nov 07 18:05:38 hostname kernel: gnome-session/2181 is trying to acquire lock: Nov 07 18:05:38 hostname kernel: (&mm->mmap_sem){++++++}, at: [] might_fault+0x43/0xa0 Nov 07 18:05:38 hostname kernel: but task is already holding lock: Nov 07 18:05:38 hostname kernel: (&xfs_dir_ilock_class){.+.+..}, at: [] xfs_ilock+0xda/0x110 [xfs] Nov 07 18:05:38 hostname kernel: which lock already depends on the new lock. Nov 07 18:05:38 hostname kernel: the existing dependency chain (in reverse order) is: Nov 07 18:05:38 hostname kernel: -> #2 (&xfs_dir_ilock_class){.+.+..}: Nov 07 18:05:38 hostname kernel: [] lock_acquire+0xa0/0x120 Nov 07 18:05:38 hostname kernel: [] down_read_nested+0x3f/0x60 Nov 07 18:05:38 hostname kernel: [] xfs_ilock+0xda/0x110 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_ilock_attr_map_shared+0x38/0x50 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_attr_get+0xb1/0x190 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_xattr_get+0x37/0x50 [xfs] Nov 07 18:05:38 hostname kernel: [] generic_getxattr+0x4f/0x70 Nov 07 18:05:38 hostname kernel: [] inode_doinit_with_dentry+0x150/0x640 Nov 07 18:05:38 hostname kernel: [] selinux_d_instantiate+0x1c/0x20 Nov 07 18:05:38 hostname kernel: [] security_d_instantiate+0x1b/0x30 Nov 07 18:05:38 hostname kernel: [] d_splice_alias+0x1b6/0x210 Nov 07 18:05:38 hostname kernel: [] xfs_vn_lookup+0x72/0xa0 [xfs] Nov 07 18:05:38 hostname kernel: [] lookup_real+0x1d/0x50 Nov 07 18:05:38 hostname kernel: [] __lookup_hash+0x33/0x40 Nov 07 18:05:38 hostname kernel: [] lookup_slow+0x47/0xad Nov 07 18:05:38 hostname kernel: [] link_path_walk+0x364/0x820 Nov 07 18:05:38 hostname kernel: [] path_lookupat+0x55/0x740 Nov 07 18:05:38 hostname kernel: [] filename_lookup+0x2b/0xc0 Nov 07 18:05:38 hostname kernel: [] user_path_at_empty+0x54/0xa0 Nov 07 18:05:38 hostname kernel: [] user_path_at+0x11/0x20 Nov 07 18:05:38 hostname kernel: [] SyS_access+0xa2/0x1f0 Nov 07 18:05:38 hostname kernel: [] system_call_fastpath+0x12/0x17 Nov 07 18:05:38 hostname kernel: -> #1 (&isec->lock){+.+.+.}: Nov 07 18:05:38 hostname kernel: [] lock_acquire+0xa0/0x120 Nov 07 18:05:38 hostname kernel: [] mutex_lock_nested+0x4b/0x3a0 Nov 07 18:05:38 hostname kernel: [] inode_doinit_with_dentry+0xa5/0x640 Nov 07 18:05:38 hostname kernel: [] selinux_d_instantiate+0x1c/0x20 Nov 07 18:05:38 hostname kernel: [] security_d_instantiate+0x1b/0x30 Nov 07 18:05:38 hostname kernel: [] d_instantiate+0x54/0x70 Nov 07 18:05:38 hostname kernel: [] __shmem_file_setup+0xe0/0x1d0 Nov 07 18:05:38 hostname kernel: [] shmem_zero_setup+0x28/0x70 Nov 07 18:05:38 hostname kernel: [] mmap_region+0x5ad/0x620 Nov 07 18:05:38 hostname kernel: [] do_mmap_pgoff+0x2f5/0x3c0 Nov 07 18:05:38 hostname kernel: [] vm_mmap_pgoff+0x90/0xc0 Nov 07 18:05:38 hostname kernel: [] vm_mmap+0x2d/0x40 Nov 07 18:05:38 hostname kernel: [] kvm_arch_prepare_memory_region+0x47/0x60 [kvm] Nov 07 18:05:38 hostname kernel: [] __kvm_set_memory_region+0x214/0x820 [kvm] Nov 07 18:05:38 hostname kernel: [] kvm_set_memory_region+0x31/0x50 [kvm] Nov 07 18:05:38 hostname kernel: [] vmx_set_tss_addr+0x4a/0x190 [kvm_intel] Nov 07 18:05:38 hostname kernel: [] kvm_arch_vm_ioctl+0x9a0/0xb60 [kvm] Nov 07 18:05:38 hostname kernel: [] kvm_vm_ioctl+0x8e/0x780 [kvm] Nov 07 18:05:38 hostname kernel: [] do_vfs_ioctl+0x300/0x520 Nov 07 18:05:38 hostname kernel: [] SyS_ioctl+0x81/0xa0 Nov 07 18:05:38 hostname kernel: [] system_call_fastpath+0x12/0x17 Nov 07 18:05:38 hostname kernel: -> #0 (&mm->mmap_sem){++++++}: Nov 07 18:05:38 hostname kernel: [] __lock_acquire+0x183d/0x1b10 Nov 07 18:05:38 hostname kernel: [] lock_acquire+0xa0/0x120 Nov 07 18:05:38 hostname kernel: [] might_fault+0x70/0xa0 Nov 07 18:05:38 hostname kernel: [] filldir+0x91/0x120 Nov 07 18:05:38 hostname kernel: [] xfs_dir2_sf_getdents.isra.11+0x200/0x270 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_readdir+0x14e/0x170 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_file_readdir+0x2b/0x30 [xfs] Nov 07 18:05:38 hostname kernel: [] iterate_dir+0xae/0x140 Nov 07 18:05:38 hostname kernel: [] SyS_getdents+0x81/0x100 Nov 07 18:05:38 hostname kernel: [] system_call_fastpath+0x12/0x17 Nov 07 18:05:38 hostname kernel: other info that might help us debug this: Nov 07 18:05:38 hostname kernel: Chain exists of: &mm->mmap_sem --> &isec->lock --> &xfs_dir_ilock_class Nov 07 18:05:38 hostname kernel: Possible unsafe locking scenario: Nov 07 18:05:38 hostname kernel: CPU0 CPU1 Nov 07 18:05:38 hostname kernel: ---- ---- Nov 07 18:05:38 hostname kernel: lock(&xfs_dir_ilock_class); Nov 07 18:05:38 hostname kernel: lock(&isec->lock); Nov 07 18:05:38 hostname kernel: lock(&xfs_dir_ilock_class); Nov 07 18:05:38 hostname kernel: lock(&mm->mmap_sem); Nov 07 18:05:38 hostname kernel: *** DEADLOCK *** Nov 07 18:05:38 hostname kernel: 2 locks held by gnome-session/2181: Nov 07 18:05:38 hostname kernel: #0: (&type->i_mutex_dir_key#5){+.+.+.}, at: [] iterate_dir+0x69/0x140 Nov 07 18:05:38 hostname kernel: #1: (&xfs_dir_ilock_class){.+.+..}, at: [] xfs_ilock+0xda/0x110 [xfs] Nov 07 18:05:38 hostname kernel: stack backtrace: Nov 07 18:05:38 hostname kernel: CPU: 1 PID: 2181 Comm: gnome-session Not tainted 3.18.0-rc3+ #508 Nov 07 18:05:38 hostname kernel: Hardware name: MSI MS-7760/X79A-GD65 (8D) (MS-7760), BIOS V1.8 10/18/2012 Nov 07 18:05:38 hostname kernel: ffffffff82643e00 ffff88044486bb48 ffffffff8173e3ea 0000000000000000 Nov 07 18:05:38 hostname kernel: ffffffff8265fb80 ffff88044486bb98 ffffffff81739f87 0000003fffffffc0 Nov 07 18:05:38 hostname kernel: ffff88044486bbf8 0000000000000001 ffff880445bf4fd0 0000000000000001 Nov 07 18:05:38 hostname kernel: Call Trace: Nov 07 18:05:38 hostname kernel: [] dump_stack+0x46/0x58 Nov 07 18:05:38 hostname kernel: [] print_circular_bug+0x202/0x213 Nov 07 18:05:38 hostname kernel: [] __lock_acquire+0x183d/0x1b10 Nov 07 18:05:38 hostname kernel: [] ? __lock_acquire+0x362/0x1b10 Nov 07 18:05:38 hostname kernel: [] lock_acquire+0xa0/0x120 Nov 07 18:05:38 hostname kernel: [] ? might_fault+0x43/0xa0 Nov 07 18:05:38 hostname kernel: [] might_fault+0x70/0xa0 Nov 07 18:05:38 hostname kernel: [] ? might_fault+0x43/0xa0 Nov 07 18:05:38 hostname kernel: [] filldir+0x91/0x120 Nov 07 18:05:38 hostname kernel: [] ? xfs_ilock_data_map_shared+0x34/0x40 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_dir2_sf_getdents.isra.11+0x200/0x270 [xfs] Nov 07 18:05:38 hostname kernel: [] ? xfs_ilock+0xda/0x110 [xfs] Nov 07 18:05:38 hostname kernel: [] xfs_readdir+0x14e/0x170 [xfs] Nov 07 18:05:38 hostname kernel: [] ? mark_held_locks+0x6a/0x90 Nov 07 18:05:38 hostname kernel: [] xfs_file_readdir+0x2b/0x30 [xfs] Nov 07 18:05:38 hostname kernel: [] iterate_dir+0xae/0x140 Nov 07 18:05:38 hostname kernel: [] SyS_getdents+0x81/0x100 Nov 07 18:05:38 hostname kernel: [] ? fillonedir+0xf0/0xf0 Nov 07 18:05:38 hostname kernel: [] system_call_fastpath+0x12/0x17 [...] Nov 07 18:05:39 hostname kernel: ------------[ cut here ]------------ Nov 07 18:05:39 hostname kernel: WARNING: CPU: 4 PID: 2461 at mm/truncate.c:758 pagecache_isize_extended+0x105/0x110() Nov 07 18:05:39 hostname kernel: Modules linked in: fuse xt_CHECKSUM tun ip6t_rpfilter bnep bluetooth ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_mangle iptable_security iptable_raw f71882fg xfs vfat fat libcrc32c iTCO_wdt iTCO_vendor_support mxm_wmi x86_pkg_temp_thermal coretemp kvm_intel joydev kvm snd_hda_codec_realtek sb_edac snd_hda_codec_generic snd_hda_codec_hdmi microcode edac_core serio_raw snd_hda_intel pcspkr snd_hda_controller snd_hda_codec snd_seq i2c_i801 snd_hwdep snd_seq_device snd_pcm lpc_ich mfd_core snd_timer wmi snd mei_me mei shpchp soundcore binfmt_misc dm_crypt Nov 07 18:05:39 hostname kernel: radeon i2c_algo_bit drm_kms_helper ttm drm crct10dif_pclmul firewire_ohci e1000e crc32_pclmul crc32c_intel ghash_clmulni_intel firewire_core i2c_core ptp pps_core crc_itu_t [last unloaded: ipmi_msghandler] Nov 07 18:05:39 hostname kernel: CPU: 4 PID: 2461 Comm: dconf-service Not tainted 3.18.0-rc3+ #508 Nov 07 18:05:39 hostname kernel: Hardware name: MSI MS-7760/X79A-GD65 (8D) (MS-7760), BIOS V1.8 10/18/2012 Nov 07 18:05:39 hostname kernel: 0000000000000009 ffff880444fffd38 ffffffff8173e3ea 0000000000000000 Nov 07 18:05:39 hostname kernel: 0000000000000000 ffff880444fffd78 ffffffff810886a1 ffffea000254d400 Nov 07 18:05:39 hostname kernel: 0000000000001000 ffff8804446b1550 0000000000000000 000000000000bf36 Nov 07 18:05:39 hostname kernel: Call Trace: Nov 07 18:05:39 hostname kernel: [] dump_stack+0x46/0x58 Nov 07 18:05:39 hostname kernel: [] warn_slowpath_common+0x81/0xa0 Nov 07 18:05:39 hostname kernel: [] warn_slowpath_null+0x1a/0x20 Nov 07 18:05:39 hostname kernel: [] pagecache_isize_extended+0x105/0x110 Nov 07 18:05:39 hostname kernel: [] ? __xfs_get_blocks+0x4f0/0x4f0 [xfs] Nov 07 18:05:39 hostname kernel: [] truncate_setsize+0x27/0x40 Nov 07 18:05:39 hostname kernel: [] xfs_setattr_size+0x13f/0x3c0 [xfs] Nov 07 18:05:39 hostname kernel: [] ? xfs_trans_commit+0x146/0x220 [xfs] Nov 07 18:05:39 hostname kernel: [] xfs_file_fallocate+0x2e7/0x300 [xfs] Nov 07 18:05:39 hostname kernel: [] ? selinux_file_permission+0xc4/0x120 Nov 07 18:05:39 hostname kernel: [] do_fallocate+0x12f/0x1d0 Nov 07 18:05:39 hostname kernel: [] SyS_fallocate+0x48/0x80 Nov 07 18:05:39 hostname kernel: [] system_call_fastpath+0x12/0x17 Nov 07 18:05:39 hostname kernel: ---[ end trace 378b089d93843b4c ]--- Nov 07 18:05:39 hostname colord[1813]: Profile added: icc-72594106bd9e2f43448d54e31e6440e9 Nov 07 18:05:39 hostname colord[1813]: Profile added: icc-c1b5ce44c83f251815721a2420252919 Nov 07 18:05:40 hostname goa[2519]: goa-daemon version 3.10.5 starting [main.c:117, main()] Nov 07 18:05:40 hostname goa[2519]: GoaKerberosIdentityManager: Using polling for change notification for credential cache type 'KEYRING' [goakerberosidentitymanager.c:1386, monitor_credentials_cache()] Nov 07 18:05:40 hostname polkitd[1090]: Registered Authentication Agent for unix-session:2 (system bus name :1.88 [/usr/bin/gnome-shell --mode=classic], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8) Nov 07 18:05:40 hostname sh[907]: abrt-dump-oops: Found oopses: 2 Nov 07 18:05:40 hostname sh[907]: abrt-dump-oops: Creating problem directories Nov 07 18:05:40 hostname kernel: ------------[ cut here ]------------ Nov 07 18:05:40 hostname kernel: WARNING: CPU: 0 PID: 2515 at mm/truncate.c:758 pagecache_isize_extended+0x105/0x110() Nov 07 18:05:40 hostname kernel: Modules linked in: fuse xt_CHECKSUM tun ip6t_rpfilter bnep bluetooth ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_mangle iptable_security iptable_raw f71882fg xfs vfat fat libcrc32c iTCO_wdt iTCO_vendor_support mxm_wmi x86_pkg_temp_thermal coretemp kvm_intel joydev kvm snd_hda_codec_realtek sb_edac snd_hda_codec_generic snd_hda_codec_hdmi microcode edac_core serio_raw snd_hda_intel pcspkr snd_hda_controller snd_hda_codec snd_seq i2c_i801 snd_hwdep snd_seq_device snd_pcm lpc_ich mfd_core snd_timer wmi snd mei_me mei shpchp soundcore binfmt_misc dm_crypt Nov 07 18:05:40 hostname kernel: radeon i2c_algo_bit drm_kms_helper ttm drm crct10dif_pclmul firewire_ohci e1000e crc32_pclmul crc32c_intel ghash_clmulni_intel firewire_core i2c_core ptp pps_core crc_itu_t [last unloaded: ipmi_msghandler] Nov 07 18:05:40 hostname kernel: CPU: 0 PID: 2515 Comm: mission-control Tainted: G W 3.18.0-rc3+ #508 Nov 07 18:05:40 hostname kernel: Hardware name: MSI MS-7760/X79A-GD65 (8D) (MS-7760), BIOS V1.8 10/18/2012 Nov 07 18:05:40 hostname kernel: 0000000000000009 ffff88000c80fd38 ffffffff8173e3ea 0000000000000000 Nov 07 18:05:40 hostname kernel: 0000000000000000 ffff88000c80fd78 ffffffff810886a1 ffffea0010273000 Nov 07 18:05:40 hostname kernel: 0000000000001000 ffff8804447a0f10 0000000000000000 0000000000000026 Nov 07 18:05:40 hostname kernel: Call Trace: Nov 07 18:05:40 hostname kernel: [] dump_stack+0x46/0x58 Nov 07 18:05:40 hostname kernel: [] warn_slowpath_common+0x81/0xa0 Nov 07 18:05:40 hostname kernel: [] warn_slowpath_null+0x1a/0x20 Nov 07 18:05:40 hostname kernel: [] pagecache_isize_extended+0x105/0x110 Nov 07 18:05:40 hostname kernel: [] ? __xfs_get_blocks+0x4f0/0x4f0 [xfs] Nov 07 18:05:40 hostname kernel: [] truncate_setsize+0x27/0x40 Nov 07 18:05:40 hostname kernel: [] xfs_setattr_size+0x13f/0x3c0 [xfs] Nov 07 18:05:40 hostname kernel: [] ? xfs_trans_commit+0x146/0x220 [xfs] Nov 07 18:05:40 hostname kernel: [] xfs_file_fallocate+0x2e7/0x300 [xfs] Nov 07 18:05:40 hostname kernel: [] ? selinux_file_permission+0xc4/0x120 Nov 07 18:05:40 hostname kernel: [] do_fallocate+0x12f/0x1d0 Nov 07 18:05:40 hostname kernel: [] SyS_fallocate+0x48/0x80 Nov 07 18:05:40 hostname kernel: [] system_call_fastpath+0x12/0x17 Nov 07 18:05:40 hostname kernel: ---[ end trace 378b089d93843b4d ]--- Nov 07 18:05:40 hostname kernel: ------------[ cut here ]------------ Nov 07 18:05:40 hostname kernel: WARNING: CPU: 5 PID: 2644 at mm/truncate.c:758 pagecache_isize_extended+0x105/0x110() Nov 07 18:05:40 hostname kernel: Modules linked in: fuse xt_CHECKSUM tun ip6t_rpfilter bnep bluetooth ip6t_REJECT nf_reject_ipv6 nf_conntrack_ipv6 nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_mangle iptable_security iptable_raw f71882fg xfs vfat fat libcrc32c iTCO_wdt iTCO_vendor_support mxm_wmi x86_pkg_temp_thermal coretemp kvm_intel joydev kvm snd_hda_codec_realtek sb_edac snd_hda_codec_generic snd_hda_codec_hdmi microcode edac_core serio_raw snd_hda_intel pcspkr snd_hda_controller snd_hda_codec snd_seq i2c_i801 snd_hwdep snd_seq_device snd_pcm lpc_ich mfd_core snd_timer wmi snd mei_me mei shpchp soundcore binfmt_misc dm_crypt Nov 07 18:05:40 hostname kernel: radeon i2c_algo_bit drm_kms_helper ttm drm crct10dif_pclmul firewire_ohci e1000e crc32_pclmul crc32c_intel ghash_clmulni_intel firewire_core i2c_core ptp pps_core crc_itu_t [last unloaded: ipmi_msghandler] Nov 07 18:05:40 hostname kernel: CPU: 5 PID: 2644 Comm: xdg-user-dirs-g Tainted: G W 3.18.0-rc3+ #508 Nov 07 18:05:40 hostname kernel: Hardware name: MSI MS-7760/X79A-GD65 (8D) (MS-7760), BIOS V1.8 10/18/2012 Nov 07 18:05:40 hostname kernel: 0000000000000009 ffff88040549bd38 ffffffff8173e3ea 0000000000000000 Nov 07 18:05:40 hostname kernel: 0000000000000000 ffff88040549bd78 ffffffff810886a1 ffffea001012d880 Nov 07 18:05:40 hostname kernel: 0000000000001000 ffff8804446bd3d0 0000000000000000 00000000000000ad Nov 07 18:05:40 hostname kernel: Call Trace: Nov 07 18:05:40 hostname kernel: [] dump_stack+0x46/0x58 Nov 07 18:05:40 hostname kernel: [] warn_slowpath_common+0x81/0xa0 Nov 07 18:05:40 hostname kernel: [] warn_slowpath_null+0x1a/0x20 Nov 07 18:05:40 hostname kernel: [] pagecache_isize_extended+0x105/0x110 Nov 07 18:05:40 hostname kernel: [] ? __xfs_get_blocks+0x4f0/0x4f0 [xfs] Nov 07 18:05:40 hostname kernel: [] truncate_setsize+0x27/0x40 Nov 07 18:05:40 hostname kernel: [] xfs_setattr_size+0x13f/0x3c0 [xfs] Nov 07 18:05:40 hostname kernel: [] ? xfs_trans_commit+0x146/0x220 [xfs] Nov 07 18:05:40 hostname kernel: [] xfs_file_fallocate+0x2e7/0x300 [xfs] Nov 07 18:05:40 hostname kernel: [] ? selinux_file_permission+0xc4/0x120 Nov 07 18:05:40 hostname kernel: [] do_fallocate+0x12f/0x1d0 Nov 07 18:05:40 hostname kernel: [] SyS_fallocate+0x48/0x80 Nov 07 18:05:40 hostname kernel: [] system_call_fastpath+0x12/0x17 Nov 07 18:05:40 hostname kernel: ---[ end trace 378b089d93843b4e ]--- From ScoreReportNotice@overning.us Thu Nov 13 20:27:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EC04E7F37 for ; Thu, 13 Nov 2014 20:27:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9DF68F8040 for ; Thu, 13 Nov 2014 18:27:35 -0800 (PST) X-ASG-Debug-ID: 1415932053-04cb6c0572072b0001-NocioJ Received: from overning.us ([198.12.110.41]) by cuda.sgi.com with ESMTP id 4BcEZoTa1Rv9tgkX for ; Thu, 13 Nov 2014 18:27:34 -0800 (PST) X-Barracuda-Envelope-From: ScoreReportNotice@overning.us X-Barracuda-Apparent-Source-IP: 198.12.110.41 Received: by overning.us id hclkb40001g2 for ; Thu, 13 Nov 2014 17:58:08 -0800 (envelope-from ) MIME-Version: 1.0 From: "ScoreReportNotice" To: Subject: Score Change: 05:55PM November 13, 2014 - Your Triple Bureau Score May Have Just Changed (Report Inside) Content-Type: text/plain; charset="us-ascii" X-ASG-Orig-Subj: Score Change: 05:55PM November 13, 2014 - Your Triple Bureau Score May Have Just Changed (Report Inside) Content-Transfer-Encoding: 7bit Message-ID: <0.0.0.26.1CFFFAE7039DC86.30674F@overning.us> Date: Thu, 13 Nov 2014 18:28:02 -0800 X-Barracuda-Connect: UNKNOWN[198.12.110.41] X-Barracuda-Start-Time: 1415932053 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11575 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 ------------------------------- November Credit Alert ------------------------------- US CREDIT ALERT SYSTEMS ------------------------------- November 13, 2014 ------------------------------- 1000000000160322342 xfs@oss.sgi.com, This is an automated message system to alert you to the fact that one or all of your Experian Equifax or TransUnion scores may have just changed. This notification supplies a full report and details on these changes. To view your report as of November 13, 2014, go here right now: http://overning.us/Z0goa6SmItgcOODaP+a2T3MxThVYbiuCkZqwDfsDubY7gQKyeBM1w6WIZDDGSzCL4esYGjH5gNHzIaSW+hFz/7dymDeqrTiTJirJwfsW1EchDtG745lj4+TuZXQSO5avtcAPB0w= Score Generated: 05:55PM ------------------------------- END OF AUTOMATED RESPONSE 1000000000160322342 understand the exact nature of the technique that was in practice up tofact that the amateurs of art were prepared by their classical studies toIn Raphael Petrucci, who died early in 1917, the world has lost one of therules. [Illustration: PLATE VII. GEESEfollowing, foretelling fresh developments.style of Ku K'ai-chih exemplifies the distinctive features of Chinesefeeling of reserve and intentional restraint, which gives it, with equalChina, the Mongol Kublai Khan could not but remember his purely Chinese Wu-hsi in the province of Kiang-su. He lived at the end of theVIII. THE CH'ING PERIOD--SEVENTEENTH TO TWENTIETH CENTURIEScharacteristic line is found in the paintings of men and horses where the - ******************************* All described in this letter is represented as an ad. SIMPLE-1NF0 P0.B0X./4120 N.49824 ------------ P0RT1AND_0REG0N 97208 \\\\\\\\\\\\\\\\\\\\\\\\\\\ - Stop receiving these messages: http://overning.us/Z0wobaKkJMxDNufdKqW4TzllBRYFOnnA0IT6X7Rc5/xk4RfgI1FmneibcAWXFWnY4fxEQ2X2hMOhKa+X8gY0q/QilTarpTWTISregvMO20QhD9CktJxg87ngZHMSKdW0489+Uxvm9StmPg== -- From robtench@hotmail.com Thu Nov 13 21:19:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E8B1D7F37 for ; Thu, 13 Nov 2014 21:19:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C76448F8040 for ; Thu, 13 Nov 2014 19:19:29 -0800 (PST) X-ASG-Debug-ID: 1415935167-04cb6c057108ca0001-NocioJ Received: from BLU004-OMC4S33.hotmail.com (blu004-omc4s33.hotmail.com [65.55.111.172]) by cuda.sgi.com with ESMTP id oWHonOQCUN6HsrcK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Nov 2014 19:19:27 -0800 (PST) X-Barracuda-Envelope-From: robtench@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.111.172 Received: from BLU172-W37 ([65.55.111.137]) by BLU004-OMC4S33.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Thu, 13 Nov 2014 19:19:27 -0800 X-TMN: [GdI5M0RTGwVx0cSieYaypzfHsb2OnbRe6Xw7p/To7LQ=] X-Originating-Email: [robtench@hotmail.com] Message-ID: Content-Type: multipart/alternative; boundary="_d4f14021-1f03-4966-9573-1a848415de13_" From: Robert Tench To: "xfs@oss.sgi.com" Subject: Mismatch of UUIDS on raid 5 Date: Fri, 14 Nov 2014 14:19:27 +1100 X-ASG-Orig-Subj: Mismatch of UUIDS on raid 5 Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 14 Nov 2014 03:19:27.0411 (UTC) FILETIME=[CC078030:01CFFFB9] X-Barracuda-Connect: blu004-omc4s33.hotmail.com[65.55.111.172] X-Barracuda-Start-Time: 1415935167 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11577 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_d4f14021-1f03-4966-9573-1a848415de13_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi there=2C I am seeking some assistance with an XFS filesystem that will not mount. I = have a Lacie NAS 5 Big Network 2 that has failed on me and basically I ende= d up losing access to my Shares and files. While I have backed up what I could using Ufsexplorer=2C I can see that man= y folders are incomplete. I have then set about removing the drives and connecting them to a Linux se= tup. $ of the drives are connected to Sata ports and the 5th is connected v= ia a sata to usb adaptor. Have reassembled the raid array=2C but when I try to mount the raid I get a= n error back stating that the 'structure needs cleaning.' I performed xfs_repair -n /dev/md4 which fed back a huge amount of issues -= namely the mismatch of UUID between the superblock and log files. I am trying to save the report of this and sendf to you put having issues a= t the moment getting it to save the report correctly. I am a complete Linux novice but would be interested to know if there is an= yway to resolve this problem? Regards=2C Rob =20 Kernel Version: Linux ubuntu 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03= :51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux xfsprogs version: xfs_repair version 3.1.9 Dual Core Contents of /proc/mem/info: MemTotal: 4012768 kB MemFree: 1745572 kB Buffers: 206952 kB Cached: 1240484 kB SwapCached: 0 kB Active: 1018332 kB Inactive: 1064536 kB Active(anon): 637004 kB Inactive(anon): 181272 kB Active(file): 381328 kB Inactive(file): 883264 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 511864 kB SwapFree: 511864 kB Dirty: 384 kB Writeback: 0 kB AnonPages: 635468 kB Mapped: 126116 kB Shmem: 182856 kB Slab: 109136 kB SReclaimable: 83716 kB SUnreclaim: 25420 kB KernelStack: 3176 kB PageTables: 25476 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2518248 kB Committed_AS: 3101376 kB VmallocTotal: 34359738367 kB VmallocUsed: 346400 kB VmallocChunk: 34359384300 kB HardwareCorrupted: 0 kB AnonHugePages: 172032 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 44544 kB DirectMap2M: 4114432 kB contents of /proc/mounts:rootfs / rootfs rw=2Csize=3D1994836k=2Cnr_inodes= =3D498709 0 0 sysfs /sys sysfs rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime 0 0 proc /proc proc rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime 0 0 udev /dev devtmpfs rw=2Crelatime=2Csize=3D1994852k=2Cnr_inodes=3D498713=2Cm= ode=3D755 0 0 devpts /dev/pts devpts rw=2Cnosuid=2Cnoexec=2Crelatime=2Cgid=3D5=2Cmode=3D6= 20=2Cptmxmode=3D000 0 0 tmpfs /run tmpfs rw=2Cnosuid=2Cnoexec=2Crelatime=2Csize=3D401280k=2Cmode=3D= 755 0 0 /dev/sdf1 /cdrom vfat rw=2Crelatime=2Cfmask=3D0022=2Cdmask=3D0022=2Ccodepag= e=3D437=2Ciocharset=3Diso8859-1=2Cshortname=3Dmixed=2Cerrors=3Dremount-ro 0= 0 /dev/loop0 /rofs squashfs ro=2Cnoatime 0 0 /dev/loop1 /cow ext2 rw=2Cnoatime 0 0 /cow / overlayfs rw=2Crelatime=2Clowerdir=3D//filesystem.squashfs=2Cupperdi= r=3D/cow 0 0 none /sys/fs/cgroup tmpfs rw=2Crelatime=2Csize=3D4k=2Cmode=3D755 0 0 none /sys/fs/fuse/connections fusectl rw=2Crelatime 0 0 none /sys/kernel/debug debugfs rw=2Crelatime 0 0 none /sys/kernel/security securityfs rw=2Crelatime 0 0 tmpfs /tmp tmpfs rw=2Cnosuid=2Cnodev=2Crelatime 0 0 none /run/lock tmpfs rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime=2Csize=3D5120k= 0 0 none /run/shm tmpfs rw=2Cnosuid=2Cnodev=2Crelatime 0 0 none /run/user tmpfs rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime=2Csize=3D10240= 0k=2Cmode=3D755 0 0 none /sys/fs/pstore pstore rw=2Crelatime 0 0 systemd /sys/fs/cgroup/systemd cgroup rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelati= me=2Cname=3Dsystemd 0 0 gvfsd-fuse /run/user/999/gvfs fuse.gvfsd-fuse rw=2Cnosuid=2Cnodev=2Crelatim= e=2Cuser_id=3D999=2Cgroup_id=3D999 0 0 Contents of /proc/partitions: major minor #blocks name 7 0 961232 loop0 7 1 4147200 loop1 8 16 2930266584 sdb 8 17 1024 sdb1 8 18 2928240776 sdb2 8 19 934 sdb3 8 20 1024 sdb4 8 21 256000 sdb5 8 22 8033 sdb6 8 23 16065 sdb7 8 24 843413 sdb8 8 25 875543 sdb9 8 26 8033 sdb10 8 48 2930266584 sdd 8 49 1024 sdd1 8 50 2928240776 sdd2 8 51 934 sdd3 8 52 1024 sdd4 8 53 256000 sdd5 8 54 8033 sdd6 8 55 16065 sdd7 8 56 843413 sdd8 8 57 875543 sdd9 8 58 8033 sdd10 8 0 2930266584 sda 8 1 1024 sda1 8 2 2928240776 sda2 8 3 934 sda3 8 4 1024 sda4 8 5 256000 sda5 8 6 8033 sda6 8 7 16065 sda7 8 8 843413 sda8 8 9 875543 sda9 8 10 8033 sda10 8 32 2930266584 sdc 8 33 1024 sdc1 8 34 2928240776 sdc2 8 35 934 sdc3 8 36 1024 sdc4 8 37 256000 sdc5 8 38 8033 sdc6 8 39 16065 sdc7 8 40 843413 sdc8 8 41 875543 sdc9 8 42 8033 sdc10 9 3 255936 md3 9 4 11712962560 md4 9 1 843328 md1 9 2 875456 md2 9 0 16000 md0 8 64 2930266584 sde 8 65 1024 sde1 8 66 2928240776 sde2 8 67 934 sde3 8 68 1024 sde4 8 69 256000 sde5 8 70 8033 sde6 8 71 16065 sde7 8 72 843413 sde8 8 73 875543 sde9 8 74 8033 sde10 8 80 30249984 sdf 8 81 30247936 sdf1 Raid Configuration - Hardware Raid from a Lacie NAS 5Big Network 2 (Raid 5) Types of Disks: Seagate Barracuda 3000gb X 5 = --_d4f14021-1f03-4966-9573-1a848415de13_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi there=2C

I am seeking = some assistance with an XFS filesystem that will not mount. I have a Lacie = NAS 5 Big Network 2 that has failed on me and basically I ended up losing a= ccess to my Shares and files.

While I have backed up what I could us= ing Ufsexplorer=2C I can see that many folders are incomplete.

I hav= e then set about removing the drives and connecting them to a Linux setup. = $ of the drives are connected to Sata ports and the 5th is connected via a = sata to usb adaptor.

Have reassembled the raid array=2C but when I t= ry to mount the raid I get an error back stating that the 'structure needs = cleaning.'

I performed xfs_repair -n /dev/md4 which fed back a huge = amount of issues - namely the mismatch of UUID between the superblock and l= og files.

I am trying to save the report of this and sendf to you pu= t having issues at the moment getting it to save the report correctly.
<= br>I am a complete Linux novice but would be interested to know if there is= anyway to resolve this problem?

Regards=2C
Rob =3B

K= ernel Version: Linux ubuntu 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:= 51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux


xfsprogs version: = xfs_repair version 3.1.9

Dual Core

Contents of /proc/mem/info= : MemTotal: =3B =3B =3B =3B =3B =3B =3B 4012768= kB
MemFree: =3B =3B =3B =3B =3B =3B =3B&nbs= p=3B 1745572 kB
Buffers: =3B =3B =3B =3B =3B =3B=  =3B =3B =3B 206952 kB
Cached: =3B =3B =3B = =3B =3B =3B =3B =3B =3B 1240484 kB
SwapCached: = =3B =3B =3B =3B =3B =3B =3B =3B =3B =3B=  =3B 0 kB
Active: =3B =3B =3B =3B =3B =3B&nb= sp=3B =3B =3B 1018332 kB
Inactive: =3B =3B =3B = =3B =3B =3B =3B 1064536 kB
Active(anon): =3B =3B&nbs= p=3B =3B 637004 kB
Inactive(anon): =3B =3B 181272 kB
Acti= ve(file): =3B =3B =3B =3B 381328 kB
Inactive(file): = =3B =3B 883264 kB
Unevictable: =3B =3B =3B =3B = =3B =3B =3B =3B =3B =3B 0 kB
Mlocked: =3B = =3B =3B =3B =3B =3B =3B =3B =3B =3B =3B=  =3B =3B =3B 0 kB
SwapTotal: =3B =3B =3B =3B=  =3B =3B =3B 511864 kB
SwapFree: =3B =3B =3B&nbs= p=3B =3B =3B =3B =3B 511864 kB
Dirty: =3B =3B&nb= sp=3B =3B =3B =3B =3B =3B =3B =3B =3B = =3B =3B =3B 384 kB
Writeback: =3B =3B =3B =3B&nb= sp=3B =3B =3B =3B =3B =3B =3B =3B 0 kB
AnonP= ages: =3B =3B =3B =3B =3B =3B =3B 635468 kB
= Mapped: =3B =3B =3B =3B =3B =3B =3B =3B&nbs= p=3B =3B 126116 kB
Shmem: =3B =3B =3B =3B =3B&nb= sp=3B =3B =3B =3B =3B =3B 182856 kB
Slab: =3B&nb= sp=3B =3B =3B =3B =3B =3B =3B =3B =3B = =3B =3B 109136 kB
SReclaimable: =3B =3B =3B =3B = =3B 83716 kB
SUnreclaim: =3B =3B =3B =3B =3B =3B=  =3B 25420 kB
KernelStack: =3B =3B =3B =3B =3B&n= bsp=3B =3B 3176 kB
PageTables: =3B =3B =3B =3B = =3B =3B =3B 25476 kB
NFS_Unstable: =3B =3B =3B = =3B =3B =3B =3B =3B =3B 0 kB
Bounce: =3B =3B=  =3B =3B =3B =3B =3B =3B =3B =3B =3B&nb= sp=3B =3B =3B =3B 0 kB
WritebackTmp: =3B =3B =3B=  =3B =3B =3B =3B =3B =3B 0 kB
CommitLimit: = =3B =3B =3B =3B 2518248 kB
Committed_AS: =3B =3B&nbs= p=3B 3101376 kB
VmallocTotal: =3B =3B 34359738367 kB
VmallocU= sed: =3B =3B =3B =3B =3B 346400 kB
VmallocChunk:&nbs= p=3B =3B 34359384300 kB
HardwareCorrupted: =3B =3B =3B&n= bsp=3B 0 kB
AnonHugePages: =3B =3B =3B 172032 kB
HugePage= s_Total: =3B =3B =3B =3B =3B =3B 0
HugePages_Fre= e: =3B =3B =3B =3B =3B =3B =3B 0
HugePages_R= svd: =3B =3B =3B =3B =3B =3B =3B 0
HugePages= _Surp: =3B =3B =3B =3B =3B =3B =3B 0
Hugepag= esize: =3B =3B =3B =3B =3B =3B 2048 kB
DirectMap= 4k: =3B =3B =3B =3B =3B =3B 44544 kB
DirectMap2M= : =3B =3B =3B =3B 4114432 kB

contents of /proc/mount= s:rootfs / rootfs rw=2Csize=3D1994836k=2Cnr_inodes=3D498709 0 0
sysfs /s= ys sysfs rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime 0 0
proc /proc proc rw= =2Cnosuid=2Cnodev=2Cnoexec=2Crelatime 0 0
udev /dev devtmpfs rw=2Crelati= me=2Csize=3D1994852k=2Cnr_inodes=3D498713=2Cmode=3D755 0 0
devpts /dev/p= ts devpts rw=2Cnosuid=2Cnoexec=2Crelatime=2Cgid=3D5=2Cmode=3D620=2Cptmxmode= =3D000 0 0
tmpfs /run tmpfs rw=2Cnosuid=2Cnoexec=2Crelatime=2Csize=3D401= 280k=2Cmode=3D755 0 0
/dev/sdf1 /cdrom vfat rw=2Crelatime=2Cfmask=3D0022= =2Cdmask=3D0022=2Ccodepage=3D437=2Ciocharset=3Diso8859-1=2Cshortname=3Dmixe= d=2Cerrors=3Dremount-ro 0 0
/dev/loop0 /rofs squashfs ro=2Cnoatime 0 0/dev/loop1 /cow ext2 rw=2Cnoatime 0 0
/cow / overlayfs rw=2Crelatime= =2Clowerdir=3D//filesystem.squashfs=2Cupperdir=3D/cow 0 0
none /sys/fs/c= group tmpfs rw=2Crelatime=2Csize=3D4k=2Cmode=3D755 0 0
none /sys/fs/fuse= /connections fusectl rw=2Crelatime 0 0
none /sys/kernel/debug debugfs rw= =2Crelatime 0 0
none /sys/kernel/security securityfs rw=2Crelatime 0 0tmpfs /tmp tmpfs rw=2Cnosuid=2Cnodev=2Crelatime 0 0
none /run/lock tmp= fs rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime=2Csize=3D5120k 0 0
none /run/= shm tmpfs rw=2Cnosuid=2Cnodev=2Crelatime 0 0
none /run/user tmpfs rw=2Cn= osuid=2Cnodev=2Cnoexec=2Crelatime=2Csize=3D102400k=2Cmode=3D755 0 0
none= /sys/fs/pstore pstore rw=2Crelatime 0 0
systemd /sys/fs/cgroup/systemd = cgroup rw=2Cnosuid=2Cnodev=2Cnoexec=2Crelatime=2Cname=3Dsystemd 0 0
gvfs= d-fuse /run/user/999/gvfs fuse.gvfsd-fuse rw=2Cnosuid=2Cnodev=2Crelatime=2C= user_id=3D999=2Cgroup_id=3D999 0 0


Contents of /proc/partitions:= major minor =3B #blocks =3B name

 =3B =3B 7 =3B=  =3B =3B =3B =3B =3B =3B 0 =3B =3B =3B&= nbsp=3B 961232 loop0
 =3B =3B 7 =3B =3B =3B =3B&= nbsp=3B =3B =3B 1 =3B =3B =3B 4147200 loop1
 =3B=  =3B 8 =3B =3B =3B =3B =3B =3B 16 2930266584 sd= b
 =3B =3B 8 =3B =3B =3B =3B =3B =3B 17&= nbsp=3B =3B =3B =3B =3B =3B 1024 sdb1
 =3B = =3B 8 =3B =3B =3B =3B =3B =3B 18 2928240776 sdb2 =3B =3B 8 =3B =3B =3B =3B =3B =3B 19 = =3B =3B =3B =3B =3B =3B =3B 934 sdb3
 =3B&nb= sp=3B 8 =3B =3B =3B =3B =3B =3B 20 =3B =3B&= nbsp=3B =3B =3B =3B 1024 sdb4
 =3B =3B 8 =3B&nbs= p=3B =3B =3B =3B =3B 21 =3B =3B =3B =3B 256= 000 sdb5
 =3B =3B 8 =3B =3B =3B =3B =3B = =3B 22 =3B =3B =3B =3B =3B =3B 8033 sdb6
 = =3B =3B 8 =3B =3B =3B =3B =3B =3B 23 =3B&nb= sp=3B =3B =3B =3B 16065 sdb7
 =3B =3B 8 =3B = =3B =3B =3B =3B =3B 24 =3B =3B =3B =3B 8434= 13 sdb8
 =3B =3B 8 =3B =3B =3B =3B =3B = =3B 25 =3B =3B =3B =3B 875543 sdb9
 =3B =3B 8&nb= sp=3B =3B =3B =3B =3B =3B 26 =3B =3B =3B&nb= sp=3B =3B =3B 8033 sdb10
 =3B =3B 8 =3B =3B = =3B =3B =3B =3B 48 2930266584 sdd
 =3B =3B 8 =3B=  =3B =3B =3B =3B =3B 49 =3B =3B =3B =3B=  =3B =3B 1024 sdd1
 =3B =3B 8 =3B =3B =3B&nb= sp=3B =3B =3B 50 2928240776 sdd2
 =3B =3B 8 =3B = =3B =3B =3B =3B =3B 51 =3B =3B =3B =3B = =3B =3B =3B 934 sdd3
 =3B =3B 8 =3B =3B =3B&= nbsp=3B =3B =3B 52 =3B =3B =3B =3B =3B =3B = 1024 sdd4
 =3B =3B 8 =3B =3B =3B =3B =3B&nbs= p=3B 53 =3B =3B =3B =3B 256000 sdd5
 =3B =3B 8&n= bsp=3B =3B =3B =3B =3B =3B 54 =3B =3B =3B&n= bsp=3B =3B =3B 8033 sdd6
 =3B =3B 8 =3B =3B = =3B =3B =3B =3B 55 =3B =3B =3B =3B =3B 1606= 5 sdd7
 =3B =3B 8 =3B =3B =3B =3B =3B = =3B 56 =3B =3B =3B =3B 843413 sdd8
 =3B =3B 8&nb= sp=3B =3B =3B =3B =3B =3B 57 =3B =3B =3B&nb= sp=3B 875543 sdd9
 =3B =3B 8 =3B =3B =3B =3B&nbs= p=3B =3B 58 =3B =3B =3B =3B =3B =3B 8033 sdd10<= br> =3B =3B 8 =3B =3B =3B =3B =3B =3B = =3B 0 2930266584 sda
 =3B =3B 8 =3B =3B =3B =3B&= nbsp=3B =3B =3B 1 =3B =3B =3B =3B =3B =3B 1= 024 sda1
 =3B =3B 8 =3B =3B =3B =3B =3B = =3B =3B 2 2928240776 sda2
 =3B =3B 8 =3B =3B =3B=  =3B =3B =3B =3B 3 =3B =3B =3B =3B =3B&= nbsp=3B =3B 934 sda3
 =3B =3B 8 =3B =3B =3B = =3B =3B =3B =3B 4 =3B =3B =3B =3B =3B = =3B 1024 sda4
 =3B =3B 8 =3B =3B =3B =3B =3B=  =3B =3B 5 =3B =3B =3B =3B 256000 sda5
 =3B&= nbsp=3B 8 =3B =3B =3B =3B =3B =3B =3B 6 =3B=  =3B =3B =3B =3B =3B 8033 sda6
 =3B =3B 8&nb= sp=3B =3B =3B =3B =3B =3B =3B 7 =3B =3B&nbs= p=3B =3B =3B 16065 sda7
 =3B =3B 8 =3B =3B = =3B =3B =3B =3B =3B 8 =3B =3B =3B =3B 84341= 3 sda8
 =3B =3B 8 =3B =3B =3B =3B =3B = =3B =3B 9 =3B =3B =3B =3B 875543 sda9
 =3B = =3B 8 =3B =3B =3B =3B =3B =3B 10 =3B =3B&nb= sp=3B =3B =3B =3B 8033 sda10
 =3B =3B 8 =3B = =3B =3B =3B =3B =3B 32 2930266584 sdc
 =3B =3B 8=  =3B =3B =3B =3B =3B =3B 33 =3B =3B =3B=  =3B =3B =3B 1024 sdc1
 =3B =3B 8 =3B =3B&nb= sp=3B =3B =3B =3B 34 2928240776 sdc2
 =3B =3B 8 = =3B =3B =3B =3B =3B =3B 35 =3B =3B =3B = =3B =3B =3B =3B 934 sdc3
 =3B =3B 8 =3B =3B&= nbsp=3B =3B =3B =3B 36 =3B =3B =3B =3B =3B&= nbsp=3B 1024 sdc4
 =3B =3B 8 =3B =3B =3B =3B&nbs= p=3B =3B 37 =3B =3B =3B =3B 256000 sdc5
 =3B&nbs= p=3B 8 =3B =3B =3B =3B =3B =3B 38 =3B =3B&n= bsp=3B =3B =3B =3B 8033 sdc6
 =3B =3B 8 =3B = =3B =3B =3B =3B =3B 39 =3B =3B =3B =3B = =3B 16065 sdc7
 =3B =3B 8 =3B =3B =3B =3B = =3B =3B 40 =3B =3B =3B =3B 843413 sdc8
 =3B = =3B 8 =3B =3B =3B =3B =3B =3B 41 =3B =3B&nb= sp=3B =3B 875543 sdc9
 =3B =3B 8 =3B =3B =3B&nbs= p=3B =3B =3B 42 =3B =3B =3B =3B =3B =3B 803= 3 sdc10
 =3B =3B 9 =3B =3B =3B =3B =3B = =3B =3B 3 =3B =3B =3B =3B 255936 md3
 =3B = =3B 9 =3B =3B =3B =3B =3B =3B =3B 4 11712962560= md4
 =3B =3B 9 =3B =3B =3B =3B =3B =3B&= nbsp=3B 1 =3B =3B =3B =3B 843328 md1
 =3B =3B 9&= nbsp=3B =3B =3B =3B =3B =3B =3B 2 =3B =3B&n= bsp=3B =3B 875456 md2
 =3B =3B 9 =3B =3B =3B&nbs= p=3B =3B =3B =3B 0 =3B =3B =3B =3B =3B 1600= 0 md0
 =3B =3B 8 =3B =3B =3B =3B =3B =3B= 64 2930266584 sde
 =3B =3B 8 =3B =3B =3B =3B&nb= sp=3B =3B 65 =3B =3B =3B =3B =3B =3B 1024 sde1<= br> =3B =3B 8 =3B =3B =3B =3B =3B =3B 66 29= 28240776 sde2
 =3B =3B 8 =3B =3B =3B =3B =3B=  =3B 67 =3B =3B =3B =3B =3B =3B =3B 934 sde= 3
 =3B =3B 8 =3B =3B =3B =3B =3B =3B 68&= nbsp=3B =3B =3B =3B =3B =3B 1024 sde4
 =3B = =3B 8 =3B =3B =3B =3B =3B =3B 69 =3B =3B&nb= sp=3B =3B 256000 sde5
 =3B =3B 8 =3B =3B =3B&nbs= p=3B =3B =3B 70 =3B =3B =3B =3B =3B =3B 803= 3 sde6
 =3B =3B 8 =3B =3B =3B =3B =3B = =3B 71 =3B =3B =3B =3B =3B 16065 sde7
 =3B = =3B 8 =3B =3B =3B =3B =3B =3B 72 =3B =3B&nb= sp=3B =3B 843413 sde8
 =3B =3B 8 =3B =3B =3B&nbs= p=3B =3B =3B 73 =3B =3B =3B =3B 875543 sde9
&nbs= p=3B =3B 8 =3B =3B =3B =3B =3B =3B 74 =3B&n= bsp=3B =3B =3B =3B =3B 8033 sde10
 =3B =3B 8&nbs= p=3B =3B =3B =3B =3B =3B 80 =3B =3B 30249984 sd= f
 =3B =3B 8 =3B =3B =3B =3B =3B =3B 81&= nbsp=3B =3B 30247936 sdf1

Raid Configuration - Hardware Raid fro= m a Lacie NAS 5Big Network 2 (Raid 5)

Types of Disks: Seagate Barrac= uda 3000gb X 5


= --_d4f14021-1f03-4966-9573-1a848415de13_-- From david@fromorbit.com Thu Nov 13 23:26:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 101197F37 for ; Thu, 13 Nov 2014 23:26:34 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D86FB8F8039 for ; Thu, 13 Nov 2014 21:26:30 -0800 (PST) X-ASG-Debug-ID: 1415942788-04bdf061610bda0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id iqspg1FvLFauvdan for ; Thu, 13 Nov 2014 21:26:28 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Agw7AACSZVR5LbBUPGdsb2JhbABbgw6BLoI2hQeyBgaVGYVrBAICgSIXAQEBAQEGAQEBATg7hAMBAQQnExwjEAgDDgoJJQ8FJQMHGhOIQNB1AQEIAgEfGIYmimQHgy2BHgEEmW2EXpsLKTCCSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail05.adl6.internode.on.net with ESMTP; 14 Nov 2014 15:55:27 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xp9Nr-00004r-4s; Fri, 14 Nov 2014 16:25:23 +1100 Date: Fri, 14 Nov 2014 16:25:23 +1100 From: Dave Chinner To: Andy Lutomirski Cc: xfs@oss.sgi.com Subject: Re: XFS locking issues in 3.18-rc3+ Message-ID: <20141114052523.GB29950@dastard> X-ASG-Orig-Subj: Re: XFS locking issues in 3.18-rc3+ References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1415942788 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11580 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 13, 2014 at 04:57:11PM -0800, Andy Lutomirski wrote: > I'm running a kernel somewhere between 3.18-rc3 and 3.18-rc4. I got > the warnings below. Is this a known issue? Yup, false positive. shmem is instantiating an inode under the mmap_sem and in doing so taking inode locks under the mmap_sem, which triggers other filesystems to issue false warnings about mmap_sem <-> inode lock order. Cheers, Dave. -- Dave Chinner david@fromorbit.com From paragkothari81@gmail.com Fri Nov 14 02:47:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=DEAR_SOMETHING, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_IMAGE_ONLY_16,HTML_MESSAGE, T_FRT_CLICK autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 165E07F3F for ; Fri, 14 Nov 2014 02:47:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 87B4CAC005 for ; Fri, 14 Nov 2014 00:47:31 -0800 (PST) X-ASG-Debug-ID: 1415954846-04cb6c057110f10001-NocioJ Received: from infy.dailymailz.in (vps.dailymailz.in [173.214.188.66]) by cuda.sgi.com with ESMTP id RsGDFiZTb5GcsQPG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 00:47:26 -0800 (PST) X-Barracuda-Envelope-From: paragkothari81@gmail.com X-Barracuda-Apparent-Source-IP: 173.214.188.66 Received: from dailymailz by infy.dailymailz.in with local (Exim 4.84) (envelope-from ) id 1XpCXM-0002PO-Kx for xfs@oss.sgi.com; Fri, 14 Nov 2014 08:47:25 +0000 To: xfs@oss.sgi.com Subject: Go Computerized with your Calls and Get More Attention Message-ID: <607cf3db1d6137ccaa9a1bbf4ef2885f@infinity.dailymailz.in> X-ASG-Orig-Subj: Go Computerized with your Calls and Get More Attention Date: Fri, 14 Nov 2014 06:23:05 +0000 From: "Virtual Number" Reply-To: paragkothari81@gmail.com MIME-Version: 1.0 X-Mailer-LID: 122 List-Unsubscribe: X-Mailer-RecptId: 489744 X-Mailer-SID: 257 X-Mailer-Sent-By: 6 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_14f6d0d21102438e3f6e3af4216deae1" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - infy.dailymailz.in X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [503 514] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Get-Message-Sender-Via: infy.dailymailz.in: authenticated_id: dailymailz/only user confirmed/virtual account not confirmed X-Barracuda-Connect: vps.dailymailz.in[173.214.188.66] X-Barracuda-Start-Time: 1415954846 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.43 X-Barracuda-Spam-Status: No, SCORE=1.43 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_HTTP_MISMATCH, HTML_IMAGE_ONLY_16, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11584 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.80 BSF_SC7_SA_HREF_HTTP_MISMATCH BODY: Custom Phishing Mismatch 0.63 HTML_IMAGE_ONLY_16 BODY: HTML: images with 1200-1600 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message --b1_14f6d0d21102438e3f6e3af4216deae1 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Your email client cannot read this email. To view it online, please go here: http://infinity.dailymailz.in/display.php?M=489744&C=b241f44e12f21a0dc1f8d3ac67374632&S=257&L=122&N=93 To stop receiving these emails:http://infinity.dailymailz.in/unsubscribe.php?M=489744&C=b241f44e12f21a0dc1f8d3ac67374632&L=122&N=257 --b1_14f6d0d21102438e3f6e3af4216deae1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Dear Sir/Madam,

If you are looking to go live with Virtual Number services to attract your clients and get a better management of your call flow on regular basis with below features:

1) Avoid Calls getting Missed
2) Getting Calls Recorded
3) Getting Calls Forwarded to different department
4) No Physical Infrasturcture and Investment


Solution starting @ Rs 12000 per year only

You can cllick on link : http://ivr.infisms.com/  to have an understanding of how it works

Let us know if you have queries on this so we can get it planned and activated for you

Regards
Infinity Solution
Bulk Sms & Bulk Email Service Provider 
Handheld : +91 - 9898 439 675
Email : mitul@infisms.com



Click here to unsubscribe --b1_14f6d0d21102438e3f6e3af4216deae1-- From robtench@hotmail.com Fri Nov 14 02:57:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1BD457F3F for ; Fri, 14 Nov 2014 02:57:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8970AAC005 for ; Fri, 14 Nov 2014 00:57:44 -0800 (PST) X-ASG-Debug-ID: 1415955462-04cb6c057011240001-NocioJ Received: from BLU004-OMC4S31.hotmail.com (blu004-omc4s31.hotmail.com [65.55.111.170]) by cuda.sgi.com with ESMTP id lQLdSM3BYPXGtYxS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 00:57:42 -0800 (PST) X-Barracuda-Envelope-From: robtench@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.111.170 Received: from BLU172-W9 ([65.55.111.136]) by BLU004-OMC4S31.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Fri, 14 Nov 2014 00:57:42 -0800 X-TMN: [tiiFX6yt5ebXPse4zpbWl6YOa1HBSd+zOjwQe0A3p7c=] X-Originating-Email: [robtench@hotmail.com] Message-ID: Content-Type: multipart/alternative; boundary="_2ccb4f2b-b880-48a2-a706-4b53b6bb5de4_" From: Robert Tench To: "xfs@oss.sgi.com" Subject: Mismatch UUID Date: Fri, 14 Nov 2014 19:57:42 +1100 X-ASG-Orig-Subj: Mismatch UUID Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 14 Nov 2014 08:57:42.0843 (UTC) FILETIME=[0D0CA8B0:01CFFFE9] X-Barracuda-Connect: blu004-omc4s31.hotmail.com[65.55.111.170] X-Barracuda-Start-Time: 1415955462 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11584 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_2ccb4f2b-b880-48a2-a706-4b53b6bb5de4_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Robert has a fi= le to share with you on OneDrive. To view it=2C click the link below. = = xfs.log = So finally have managed to find a way to sav= e the complete log of running xfs_repair -n /dev.md4 And below is the output of xfs_check /dev/md4 root@ubuntu:~# xfs_check /dev/md4 * ERROR: mismatched uuid in log * SB : 813833a7-1bd3-4447-b575-09d1471bb652 * log: ea3833af-25ce-9f91-b575-018fb49df3b1 ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log=2C and unmount it befo= re re-running xfs_check. If you are unable to mount the filesystem=2C then us= e the xfs_repair -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. And the output from mdadm -D /dev/md4 is as follows root@ubuntu:~# mdadm -D /dev/md4 /dev/md4: Version : 1.0 Creation Time : Fri Jan 1 01:31:17 2010 Raid Level : raid5 Array Size : 11712962560 (11170.35 GiB 11994.07 GB) Used Dev Size : 2928240640 (2792.59 GiB 2998.52 GB) Raid Devices : 5 Total Devices : 5 Persistence : Superblock is persistent Update Time : Fri Nov 14 15:58:16 2014 State : clean=20 Active Devices : 5 Working Devices : 5 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 512K Name : (none):4 UUID : e0829810:9782b51f:25529f65:8823419c Events : 1243386 Number Major Minor RaidDevice State 0 8 2 0 active sync /dev/sda2 6 8 18 1 active sync /dev/sdb2 2 8 34 2 active sync /dev/sdc2 5 8 50 3 active sync /dev/sdd2 4 8 66 4 active sync /dev/sde2 And then the response from mdadm -E /dev/md4 root@ubuntu:~# mdadm -E /dev/md4 mdadm: No md superblock detected on /dev/md4. Not sure what to do=2C any help would be appreciated Regards=2C Rob = --_2ccb4f2b-b880-48a2-a706-4b53b6bb5de4_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
=
= <= script type=3D"jsv#907_">
So fin= ally have managed to find a way to save the complete log of running xfs_rep= air -n /dev.md4

And below is the output of xfs_check /dev/md4
root@ubuntu:~# xfs_check /dev/md4
* ERROR: mismatched uuid in log
*&= nbsp=3B =3B =3B =3B =3B =3B =3B =3B =3B&nbs= p=3B =3B SB : 813833a7-1bd3-4447-b575-09d1471bb652
* =3B =3B=  =3B =3B =3B =3B =3B =3B =3B =3B =3B lo= g: ea3833af-25ce-9f91-b575-018fb49df3b1
ERROR: The filesystem has valuab= le metadata changes in a log which needs to
be replayed. =3B Mount t= he filesystem to replay the log=2C and unmount it before
re-running xfs_= check. =3B If you are unable to mount the filesystem=2C then use
the= xfs_repair -L option to destroy the log and attempt a repair.
Note that= destroying the log may cause corruption -- please attempt a mount
of th= e filesystem before doing this.

And the output from mdadm -D /dev/md= 4 is as follows

root@ubuntu:~# mdadm -D /dev/md4
/dev/md4:
&nb= sp=3B =3B =3B =3B =3B =3B =3B Version : 1.0
&nbs= p=3B Creation Time : Fri Jan =3B 1 01:31:17 2010
 =3B =3B&nb= sp=3B =3B Raid Level : raid5
 =3B =3B =3B =3B Array = Size : 11712962560 (11170.35 GiB 11994.07 GB)
 =3B Used Dev Size : 2= 928240640 (2792.59 GiB 2998.52 GB)
 =3B =3B Raid Devices : 5
=  =3B Total Devices : 5
 =3B =3B =3B Persistence : Superb= lock is persistent

 =3B =3B =3B Update Time : Fri Nov 14= 15:58:16 2014
 =3B =3B =3B =3B =3B =3B =3B&= nbsp=3B =3B State : clean
 =3BActive Devices : 5
Working Dev= ices : 5
 =3BFailed Devices : 0
 =3B Spare Devices : 0
 =3B =3B =3B =3B =3B =3B =3B =3B Layout : = left-symmetric
 =3B =3B =3B =3B Chunk Size : 512K
 =3B =3B =3B =3B =3B =3B =3B =3B =3B&n= bsp=3B Name : (none):4
 =3B =3B =3B =3B =3B =3B&= nbsp=3B =3B =3B =3B UUID : e0829810:9782b51f:25529f65:8823419c<= br> =3B =3B =3B =3B =3B =3B =3B =3B Events = : 1243386

 =3B =3B =3B Number =3B =3B Major = =3B =3B Minor =3B =3B RaidDevice State
 =3B =3B = =3B =3B =3B =3B 0 =3B =3B =3B =3B =3B = =3B 8 =3B =3B =3B =3B =3B =3B =3B 2 =3B&nbs= p=3B =3B =3B =3B =3B =3B 0 =3B =3B =3B = =3B =3B active sync =3B =3B /dev/sda2
 =3B =3B = =3B =3B =3B =3B 6 =3B =3B =3B =3B =3B = =3B 8 =3B =3B =3B =3B =3B =3B 18 =3B =3B&nb= sp=3B =3B =3B =3B =3B 1 =3B =3B =3B =3B&nbs= p=3B active sync =3B =3B /dev/sdb2
 =3B =3B =3B = =3B =3B =3B 2 =3B =3B =3B =3B =3B =3B 8&nbs= p=3B =3B =3B =3B =3B =3B 34 =3B =3B =3B&nbs= p=3B =3B =3B =3B 2 =3B =3B =3B =3B =3B acti= ve sync =3B =3B /dev/sdc2
 =3B =3B =3B =3B = =3B =3B 5 =3B =3B =3B =3B =3B =3B 8 =3B&nbs= p=3B =3B =3B =3B =3B 50 =3B =3B =3B =3B&nbs= p=3B =3B =3B 3 =3B =3B =3B =3B =3B active sync&= nbsp=3B =3B /dev/sdd2
 =3B =3B =3B =3B =3B = =3B 4 =3B =3B =3B =3B =3B =3B 8 =3B =3B&nbs= p=3B =3B =3B =3B 66 =3B =3B =3B =3B =3B&nbs= p=3B =3B 4 =3B =3B =3B =3B =3B active sync =3B&= nbsp=3B /dev/sde2


And then the response from mdadm -E /dev/md4
root@ubuntu:~# mdadm -E /dev/md4
mdadm: No md superblock detected = on /dev/md4.

Not sure what to do=2C any help would be appreciated
Regards=2C

Rob



<= /body> = --_2ccb4f2b-b880-48a2-a706-4b53b6bb5de4_-- From cmaiolino@redhat.com Fri Nov 14 06:48:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 340F07F3F for ; Fri, 14 Nov 2014 06:48:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 231D38F804C for ; Fri, 14 Nov 2014 04:48:29 -0800 (PST) X-ASG-Debug-ID: 1415969304-04cb6c05723f070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qyMwRa8xpDR4RAHg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 04:48:25 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAECmOiH003605 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 07:48:24 -0500 Received: from hades.localdomain (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAECmHbl006974 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 14 Nov 2014 07:48:23 -0500 Date: Fri, 14 Nov 2014 10:48:10 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Wrong d_type presented by xfs_io Message-ID: <20141114124807.GA2240@hades.localdomain> X-ASG-Orig-Subj: Wrong d_type presented by xfs_io Mail-Followup-To: xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415969305 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi guys, I've been looking through an issue raised by Brian, regarding my RENAME_EXCHANGE patchset, where, apparently, the d_type of some files are reseted during the exchange. Brian presented an example here: http://oss.sgi.com/archives/xfs/2014-11/msg00170.html When trying to debug it, I've been trying to create and rename some FS objects to try to reproduce the issue, but, all the files I've been creating are shown as DT_UNKNOWN type: ex: /dev/vdb2 on /xfs/scratch type xfs (rw,relatime,seclabel,attr2,inode64,noquota) [root@localhost scratch]# mkdir /xfs/scratch/dir1 [root@localhost scratch]# xfs_io -c "readdir -v" /xfs/scratch/ 00000006: d_ino: 0x00000083 d_off: 0x00000200 d_reclen: 0x18 d_type: DT_UNKNOWN d_name: dir1 [root@localhost scratch]# mknod /xfs/scratch/mybdev b 253 19 00000008: d_ino: 0x00000084 d_off: 0x00000200 d_reclen: 0x20 d_type: DT_UNKNOWN d_name: mybdev So, anyone knows if is there any problem with xfs_io, or, if I'm doing something wrong here? [root@localhost scratch]# xfs_io -V xfs_io version 3.2.1 or maybe, we have a bug somewhere else. Cheers -- Carlos From bfoster@redhat.com Fri Nov 14 07:24:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B9607F3F for ; Fri, 14 Nov 2014 07:24:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 09C2CAC006 for ; Fri, 14 Nov 2014 05:24:07 -0800 (PST) X-ASG-Debug-ID: 1415971443-04cbb01e5b6c380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1UkY68QwXBFnk2FV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 05:24:03 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEDO1vM009339 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 08:24:02 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEDO164000338 for ; Fri, 14 Nov 2014 08:24:01 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id B1D20122F87; Fri, 14 Nov 2014 08:24:00 -0500 (EST) Date: Fri, 14 Nov 2014 08:24:00 -0500 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: Wrong d_type presented by xfs_io Message-ID: <20141114132359.GA36731@bfoster.bfoster> X-ASG-Orig-Subj: Re: Wrong d_type presented by xfs_io References: <20141114124807.GA2240@hades.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141114124807.GA2240@hades.localdomain> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415971443 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 14, 2014 at 10:48:10AM -0200, Carlos Maiolino wrote: > Hi guys, > > I've been looking through an issue raised by Brian, regarding my RENAME_EXCHANGE > patchset, where, apparently, the d_type of some files are reseted during the > exchange. Brian presented an example here: > > http://oss.sgi.com/archives/xfs/2014-11/msg00170.html > > When trying to debug it, I've been trying to create and rename some FS objects > to try to reproduce the issue, but, all the files I've been creating are shown > as DT_UNKNOWN type: > Hi Carlos, I suspect you aren't using a v5 superblock. You can do that by passing '-m crc=1' to mkfs. Does d_type work once you're on v5? Brian > ex: > > /dev/vdb2 on /xfs/scratch type xfs (rw,relatime,seclabel,attr2,inode64,noquota) > > [root@localhost scratch]# mkdir /xfs/scratch/dir1 > > [root@localhost scratch]# xfs_io -c "readdir -v" /xfs/scratch/ > > 00000006: d_ino: 0x00000083 d_off: 0x00000200 d_reclen: 0x18 d_type: DT_UNKNOWN > d_name: dir1 > > > [root@localhost scratch]# mknod /xfs/scratch/mybdev b 253 19 > > 00000008: d_ino: 0x00000084 d_off: 0x00000200 d_reclen: 0x20 d_type: DT_UNKNOWN > d_name: mybdev > > > > > So, anyone knows if is there any problem with xfs_io, or, if I'm doing something > wrong here? > > [root@localhost scratch]# xfs_io -V > xfs_io version 3.2.1 > > > or maybe, we have a bug somewhere else. > > > Cheers > > -- > Carlos > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Nov 14 07:42:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 249117F3F for ; Fri, 14 Nov 2014 07:42:16 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1343E30404E for ; Fri, 14 Nov 2014 05:42:12 -0800 (PST) X-ASG-Debug-ID: 1415972531-04cbb01e5a6ced0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JSpNlZlQyZBmehYS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 05:42:12 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEDg9hW013362 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 14 Nov 2014 08:42:10 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEDg9ER003926; Fri, 14 Nov 2014 08:42:09 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 92338122F87; Fri, 14 Nov 2014 08:42:08 -0500 (EST) Date: Fri, 14 Nov 2014 08:42:08 -0500 From: Brian Foster To: Robert Tench Cc: "xfs@oss.sgi.com" Subject: Re: Mismatch UUID Message-ID: <20141114134208.GB36731@bfoster.bfoster> X-ASG-Orig-Subj: Re: Mismatch UUID References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415972532 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 14, 2014 at 07:57:42PM +1100, Robert Tench wrote: > Robert has a file to share with you on OneDrive. To view it, click the link below. xfs.log So finally have managed to find a way to save the complete log of running xfs_repair -n /dev.md4 > > And below is the output of xfs_check /dev/md4 > > root@ubuntu:~# xfs_check /dev/md4 > * ERROR: mismatched uuid in log > * SB : 813833a7-1bd3-4447-b575-09d1471bb652 > * log: ea3833af-25ce-9f91-b575-018fb49df3b1 > ERROR: The filesystem has valuable metadata changes in a log which needs to > be replayed. Mount the filesystem to replay the log, and unmount it before > re-running xfs_check. If you are unable to mount the filesystem, then use > the xfs_repair -L option to destroy the log and attempt a repair. > Note that destroying the log may cause corruption -- please attempt a mount > of the filesystem before doing this. > You want to use xfs_repair (-n) rather than xfs_check. I think you mentioned in your other email you've tried xfs_repair..? The above message indicates a dirty log, have you attempted to mount the device to replay the log? > And the output from mdadm -D /dev/md4 is as follows > How did you put the array back together? Did it assemble fine or did you have to recreate it? If the latter, how are you sure the geometry is correct (it looks like it's syncing)? Brian > root@ubuntu:~# mdadm -D /dev/md4 > /dev/md4: > Version : 1.0 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Used Dev Size : 2928240640 (2792.59 GiB 2998.52 GB) > Raid Devices : 5 > Total Devices : 5 > Persistence : Superblock is persistent > > Update Time : Fri Nov 14 15:58:16 2014 > State : clean > Active Devices : 5 > Working Devices : 5 > Failed Devices : 0 > Spare Devices : 0 > > Layout : left-symmetric > Chunk Size : 512K > > Name : (none):4 > UUID : e0829810:9782b51f:25529f65:8823419c > Events : 1243386 > > Number Major Minor RaidDevice State > 0 8 2 0 active sync /dev/sda2 > 6 8 18 1 active sync /dev/sdb2 > 2 8 34 2 active sync /dev/sdc2 > 5 8 50 3 active sync /dev/sdd2 > 4 8 66 4 active sync /dev/sde2 > > > And then the response from mdadm -E /dev/md4 > > root@ubuntu:~# mdadm -E /dev/md4 > mdadm: No md superblock detected on /dev/md4. > > Not sure what to do, any help would be appreciated > > Regards, > > Rob > > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cmaiolino@redhat.com Fri Nov 14 07:42:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BE97A7F3F for ; Fri, 14 Nov 2014 07:42:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D21DAC007 for ; Fri, 14 Nov 2014 05:42:39 -0800 (PST) X-ASG-Debug-ID: 1415972557-04cbb01e5a6cf10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gwx3w2hUiBTKSVmA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 05:42:38 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEDgb9R013671 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 08:42:37 -0500 Received: from hades.localdomain (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEDgXp1026384 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 14 Nov 2014 08:42:36 -0500 Date: Fri, 14 Nov 2014 11:42:32 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: Wrong d_type presented by xfs_io Message-ID: <20141114134230.GB2240@hades.localdomain> X-ASG-Orig-Subj: Re: Wrong d_type presented by xfs_io Mail-Followup-To: xfs@oss.sgi.com References: <20141114124807.GA2240@hades.localdomain> <20141114132359.GA36731@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141114132359.GA36731@bfoster.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415972558 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 14, 2014 at 08:24:00AM -0500, Brian Foster wrote: > On Fri, Nov 14, 2014 at 10:48:10AM -0200, Carlos Maiolino wrote: > > Hi guys, > > > > I've been looking through an issue raised by Brian, regarding my RENAME_EXCHANGE > > patchset, where, apparently, the d_type of some files are reseted during the > > exchange. Brian presented an example here: > > > > http://oss.sgi.com/archives/xfs/2014-11/msg00170.html > > > > When trying to debug it, I've been trying to create and rename some FS objects > > to try to reproduce the issue, but, all the files I've been creating are shown > > as DT_UNKNOWN type: > > > > Hi Carlos, > > I suspect you aren't using a v5 superblock. You can do that by passing > '-m crc=1' to mkfs. Does d_type work once you're on v5? > Yes, it works, thanks man :) > Brian > > > ex: > > > > /dev/vdb2 on /xfs/scratch type xfs (rw,relatime,seclabel,attr2,inode64,noquota) > > > > [root@localhost scratch]# mkdir /xfs/scratch/dir1 > > > > [root@localhost scratch]# xfs_io -c "readdir -v" /xfs/scratch/ > > > > 00000006: d_ino: 0x00000083 d_off: 0x00000200 d_reclen: 0x18 d_type: DT_UNKNOWN > > d_name: dir1 > > > > > > [root@localhost scratch]# mknod /xfs/scratch/mybdev b 253 19 > > > > 00000008: d_ino: 0x00000084 d_off: 0x00000200 d_reclen: 0x20 d_type: DT_UNKNOWN > > d_name: mybdev > > > > > > > > > > So, anyone knows if is there any problem with xfs_io, or, if I'm doing something > > wrong here? > > > > [root@localhost scratch]# xfs_io -V > > xfs_io version 3.2.1 > > > > > > or maybe, we have a bug somewhere else. > > > > > > Cheers > > > > -- > > Carlos > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From tdm@sgi.com Fri Nov 14 09:09:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E42A47F3F for ; Fri, 14 Nov 2014 09:09:51 -0600 (CST) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8E8C8F8040; Fri, 14 Nov 2014 07:09:48 -0800 (PST) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id 99D0A700394B; Fri, 14 Nov 2014 09:09:48 -0600 (CST) Message-ID: <54661B3C.80003@sgi.com> Date: Fri, 14 Nov 2014 09:09:48 -0600 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: Troy McCorkell , xfs@oss.sgi.com Subject: Re: oss.sgi.com - maintenance downtime Friday 11/14/2014 at 10:00 CST USA References: <545CE78D.7030003@sgi.com> <54637659.5090105@sgi.com> In-Reply-To: <54637659.5090105@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Third and final reminder. On 11/12/2014 09:01 AM, Troy McCorkell wrote: > > Second reminder. > > On 11/07/2014 09:38 AM, Troy McCorkell wrote: >> >> On Friday November 14, 2014 at 10:00 CST USA >> oss.sgi.com will be unavailable for a short period of time to perform >> network maintenance. >> >> The outage is expected to last approximately 15 minutes. >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > From bfoster@redhat.com Fri Nov 14 10:37:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 555B37F3F for ; Fri, 14 Nov 2014 10:37:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42E4A8F8039 for ; Fri, 14 Nov 2014 08:37:26 -0800 (PST) X-ASG-Debug-ID: 1415981829-04cb6c057346f20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id x4DMjloKpTMFxXwM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 08:17:10 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH9JG007842 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 11:17:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH8WR012329 for ; Fri, 14 Nov 2014 11:17:08 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 94971120296; Fri, 14 Nov 2014 11:17:07 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs: replace on-stack xfs_trans_res with pointer in xfs_create() Date: Fri, 14 Nov 2014 11:17:05 -0500 X-ASG-Orig-Subj: [PATCH 1/3] xfs: replace on-stack xfs_trans_res with pointer in xfs_create() Message-Id: <1415981827-52993-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1415981827-52993-1-git-send-email-bfoster@redhat.com> References: <1415981827-52993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415981829 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There's no need to store a full struct xfs_trans_res on the stack in xfs_create() and copy the fields. Use a pointer to the appropriate structures embedded in the xfs_mount. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig --- fs/xfs/xfs_inode.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..2ffb802 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1082,7 +1082,7 @@ xfs_create( struct xfs_dquot *udqp = NULL; struct xfs_dquot *gdqp = NULL; struct xfs_dquot *pdqp = NULL; - struct xfs_trans_res tres; + struct xfs_trans_res *tres; uint resblks; trace_xfs_create(dp, name); @@ -1105,13 +1105,11 @@ xfs_create( if (is_dir) { rdev = 0; resblks = XFS_MKDIR_SPACE_RES(mp, name->len); - tres.tr_logres = M_RES(mp)->tr_mkdir.tr_logres; - tres.tr_logcount = XFS_MKDIR_LOG_COUNT; + tres = &M_RES(mp)->tr_mkdir; tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR); } else { resblks = XFS_CREATE_SPACE_RES(mp, name->len); - tres.tr_logres = M_RES(mp)->tr_create.tr_logres; - tres.tr_logcount = XFS_CREATE_LOG_COUNT; + tres = &M_RES(mp)->tr_create; tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE); } @@ -1123,17 +1121,16 @@ xfs_create( * the case we'll drop the one we have and get a more * appropriate transaction later. */ - tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; - error = xfs_trans_reserve(tp, &tres, resblks, 0); + error = xfs_trans_reserve(tp, tres, resblks, 0); if (error == -ENOSPC) { /* flush outstanding delalloc blocks and retry */ xfs_flush_inodes(mp); - error = xfs_trans_reserve(tp, &tres, resblks, 0); + error = xfs_trans_reserve(tp, tres, resblks, 0); } if (error == -ENOSPC) { /* No space at all so try a "no-allocation" reservation */ resblks = 0; - error = xfs_trans_reserve(tp, &tres, 0, 0); + error = xfs_trans_reserve(tp, tres, 0, 0); } if (error) { cancel_flags = 0; -- 1.8.3.1 From tdm@sgi.com Fri Nov 14 10:43:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 64BC17F3F for ; Fri, 14 Nov 2014 10:43:20 -0600 (CST) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BFE58F804C for ; Fri, 14 Nov 2014 08:43:20 -0800 (PST) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id C97D9700396E; Fri, 14 Nov 2014 10:43:19 -0600 (CST) Message-ID: <54663127.7020601@sgi.com> Date: Fri, 14 Nov 2014 10:43:19 -0600 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com, pcp@oss.sgi.com, tdm@sgi.com Subject: Re: test - please ignore References: <5466306A.6010804@sgi.com> In-Reply-To: <5466306A.6010804@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/14/2014 10:40 AM, Troy McCorkell wrote: > test email to verify the network maintenance on oss.sgi.com From tdm@sgi.com Fri Nov 14 10:56:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 92B807F51 for ; Fri, 14 Nov 2014 10:56:13 -0600 (CST) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id 775858F8040 for ; Fri, 14 Nov 2014 08:56:13 -0800 (PST) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id 180AA700397A; Fri, 14 Nov 2014 10:56:13 -0600 (CST) Message-ID: <5466342D.7030301@sgi.com> Date: Fri, 14 Nov 2014 10:56:13 -0600 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Cc: Troy McCorkell Subject: oss.sgi.com - network maintenance complete Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit The network maintenance on oss.sgi.com is complete. If you have problems accessing oss.sgi.com, please send me an email. Thanks, Troy McCorkell tdm@sgi.com From bfoster@redhat.com Fri Nov 14 11:04:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 656EF7F3F for ; Fri, 14 Nov 2014 11:04:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D7C67AC006 for ; Fri, 14 Nov 2014 09:04:49 -0800 (PST) X-ASG-Debug-ID: 1415984688-04cbb01e5a75250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EgPAZ5kbSDEg5zQv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 09:04:48 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH9ei022092 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 11:17:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH8ND014169 for ; Fri, 14 Nov 2014 11:17:08 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9F1A0122FC1; Fri, 14 Nov 2014 11:17:07 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfs: fix error handling in xfs_qm_log_quotaoff() Date: Fri, 14 Nov 2014 11:17:06 -0500 X-ASG-Orig-Subj: [PATCH 2/3] xfs: fix error handling in xfs_qm_log_quotaoff() Message-Id: <1415981827-52993-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1415981827-52993-1-git-send-email-bfoster@redhat.com> References: <1415981827-52993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415984688 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The error handling in xfs_qm_log_quotaoff() has a couple problems. If xfs_trans_commit() fails, we fall through to the error block and call xfs_trans_cancel(). This is incorrect on commit failure. If xfs_trans_reserve() fails, we jump to the error block, cancel the tp and restore the superblock qflags to oldsbqflag. However, oldsbqflag has been initialized to zero and not yet updated from the original flags so we set the flags to zero. Fix up the error handling in xfs_qm_log_quotaoff() to not restore flags if they haven't been modified and not cancel the tp on commit failure. Remove the flag restore code altogether because commit error is the only failure condition and we don't know whether the transaction made it to disk. Reported-by: Dan Carpenter Signed-off-by: Brian Foster --- fs/xfs/xfs_qm_syscalls.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 80f2d77..d1e0ab7 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -784,19 +784,21 @@ xfs_qm_log_quotaoff( { xfs_trans_t *tp; int error; - xfs_qoff_logitem_t *qoffi=NULL; - uint oldsbqflag=0; + xfs_qoff_logitem_t *qoffi; + + *qoffstartp = NULL; tp = xfs_trans_alloc(mp, XFS_TRANS_QM_QUOTAOFF); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_quotaoff, 0, 0); - if (error) - goto error0; + if (error) { + xfs_trans_cancel(tp, 0); + goto out; + } qoffi = xfs_trans_get_qoff_item(tp, NULL, flags & XFS_ALL_QUOTA_ACCT); xfs_trans_log_quotaoff_item(tp, qoffi); spin_lock(&mp->m_sb_lock); - oldsbqflag = mp->m_sb.sb_qflags; mp->m_sb.sb_qflags = (mp->m_qflags & ~(flags)) & XFS_MOUNT_QUOTA_ALL; spin_unlock(&mp->m_sb_lock); @@ -809,19 +811,11 @@ xfs_qm_log_quotaoff( */ xfs_trans_set_sync(tp); error = xfs_trans_commit(tp, 0); + if (error) + goto out; -error0: - if (error) { - xfs_trans_cancel(tp, 0); - /* - * No one else is modifying sb_qflags, so this is OK. - * We still hold the quotaofflock. - */ - spin_lock(&mp->m_sb_lock); - mp->m_sb.sb_qflags = oldsbqflag; - spin_unlock(&mp->m_sb_lock); - } *qoffstartp = qoffi; +out: return error; } -- 1.8.3.1 From tdm@sgi.com Fri Nov 14 11:09:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ABE0F7F3F for ; Fri, 14 Nov 2014 11:09:14 -0600 (CST) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85B6130406B for ; Fri, 14 Nov 2014 09:09:11 -0800 (PST) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id 89519700396D; Fri, 14 Nov 2014 10:40:10 -0600 (CST) Message-ID: <5466306A.6010804@sgi.com> Date: Fri, 14 Nov 2014 10:40:10 -0600 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com, pcp@oss.sgi.com Subject: test - please ignore Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit test email to verify the network maintenance on oss.sgi.com From cmaiolino@redhat.com Fri Nov 14 11:33:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 572C97F3F for ; Fri, 14 Nov 2014 11:33:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 35B618F8040 for ; Fri, 14 Nov 2014 09:33:52 -0800 (PST) X-ASG-Debug-ID: 1415986430-04bdf061604bc80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sWs3X3itQjQqM57f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 09:33:51 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEHXokZ001232 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 12:33:50 -0500 Received: from hades.localdomain.com (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEHXmpV000577 for ; Fri, 14 Nov 2014 12:33:49 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V6 Date: Fri, 14 Nov 2014 15:33:28 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V6 Message-Id: <1415986410-18367-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415986431 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Also, this new version contains a fix to ensure both files will have their i_mode updated, so that d_type object (in superblock V5) will contain the proper information after the exchange happens Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag V6 fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 24 +++++++++--- 3 files changed, 130 insertions(+), 8 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Fri Nov 14 11:33:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3D3F27F51 for ; Fri, 14 Nov 2014 11:33:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C01F4AC009 for ; Fri, 14 Nov 2014 09:33:53 -0800 (PST) X-ASG-Debug-ID: 1415986432-04cbb01e5b762a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XrgBpXbnFf30U5TH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 09:33:52 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEHXpjT029894 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 12:33:51 -0500 Received: from hades.localdomain.com (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEHXmpW000577 for ; Fri, 14 Nov 2014 12:33:50 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Fri, 14 Nov 2014 15:33:29 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1415986410-18367-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415986410-18367-1-git-send-email-cmaiolino@redhat.com> References: <1415986410-18367-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415986432 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0b8704c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From cmaiolino@redhat.com Fri Nov 14 11:33:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 65D847F54 for ; Fri, 14 Nov 2014 11:33:55 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 54F528F8040 for ; Fri, 14 Nov 2014 09:33:55 -0800 (PST) X-ASG-Debug-ID: 1415986433-04cb6c057249e00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id s33gAGSkL7QTGOBc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 09:33:54 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEHXrgg010944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 12:33:53 -0500 Received: from hades.localdomain.com (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEHXmpX000577 for ; Fri, 14 Nov 2014 12:33:52 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V6 Date: Fri, 14 Nov 2014 15:33:30 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V6 Message-Id: <1415986410-18367-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415986410-18367-1-git-send-email-cmaiolino@redhat.com> References: <1415986410-18367-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415986434 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() V3: - fix indentation to avoid 80 column crossing, decrease the amount of arguments passed to xfs_cross_rename() - Rebase patches over the latest linux code v4: - use a label/goto statement instead of an if conditional after xfs_cross_rename() return, to finish the rename operation - Make xfs_cross_rename() static - Fix some comments V5: - Keep all the code under 80 columns V6: - Ensure i_mode of both files are updated during exchange Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 15 +++++-- 3 files changed, 123 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..996b929 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2668,6 +2668,102 @@ xfs_sort_for_rename( } } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +STATIC int +xfs_cross_rename( + xfs_trans_t *tp, + xfs_inode_t *src_dp, + struct xfs_name *src_name, + xfs_inode_t *src_ip, + xfs_inode_t *target_dp, + struct xfs_name *target_name, + xfs_inode_t *target_ip, + xfs_bmap_free_t *free_list, + xfs_fsblock_t *first_block, + int spaceres) +{ + int error = 0; + int new_parent; + int src_is_directory; + int tgt_is_directory; + + new_parent = (src_dp != target_dp); + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); + + /* Replace source inode */ + error = xfs_dir_replace(tp, src_dp, src_name, + target_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + /* Replace target inode */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * If we're renaming one or more directories across different parents, + * update the respective ".." entries (and link counts) to match the new + * parents. + */ + if (new_parent) { + xfs_trans_ichgtime(tp, target_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + if (tgt_is_directory) { + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, + src_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer target ".." reference to src_dp */ + if (!src_is_directory) { + error = xfs_droplink(tp, target_dp); + if (error) + goto out; + error = xfs_bumplink(tp, src_dp); + if (error) + goto out; + } + } + + if (src_is_directory) { + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer src ".." reference to target_dp */ + if (!tgt_is_directory) { + error = xfs_droplink(tp, src_dp); + if (error) + goto out; + error = xfs_bumplink(tp, target_dp); + if (error) + goto out; + } + } + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + } + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); + +out: + return error; +} + /* * xfs_rename */ @@ -2678,7 +2774,8 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; @@ -2706,6 +2803,7 @@ xfs_rename( cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); + if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); @@ -2756,6 +2854,17 @@ xfs_rename( } /* + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, + target_dp, target_name, target_ip, + &free_list, &first_block, spaceres); + if (error) + goto abort_return; + goto finish_rename; + } + /* * Set up the target. */ if (target_ip == NULL) { @@ -2894,6 +3003,7 @@ xfs_rename( if (new_parent) xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); +finish_rename: /* * If this is a synchronous mount, make sure that the * rename transaction goes to disk before returning to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..051d9f0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0b8704c..4e5d8ce 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -387,19 +387,26 @@ xfs_vn_rename( unsigned int flags) { struct inode *new_inode = ndentry->d_inode; + int omode = 0; struct xfs_name oname; struct xfs_name nname; - /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; - xfs_dentry_to_name(&oname, odentry, 0); + /* + * if we are exchanging files, we should set + * i_mode of both files + */ + if (flags & RENAME_EXCHANGE) + omode = ndentry->d_inode->i_mode; + + xfs_dentry_to_name(&oname, odentry, omode); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From bfoster@redhat.com Fri Nov 14 12:00:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FC377F47 for ; Fri, 14 Nov 2014 12:00:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5EB28304051 for ; Fri, 14 Nov 2014 10:00:15 -0800 (PST) X-ASG-Debug-ID: 1415988013-04cbb01e5c77340001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id joRqocmfHM1sFtHb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 10:00:14 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH8pm006333 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 11:17:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH8du014165 for ; Fri, 14 Nov 2014 11:17:08 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6F544122F87; Fri, 14 Nov 2014 11:17:07 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RESEND 0/3] xfs: misc. fixes Date: Fri, 14 Nov 2014 11:17:04 -0500 X-ASG-Orig-Subj: [PATCH RESEND 0/3] xfs: misc. fixes Message-Id: <1415981827-52993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415988014 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This series includes a few miscellaneous patches I came across while doing some local branch housekeeping. These have been posted previously and appear to have fallen through the cracks. Note that there was an alternative version of patch 3 floating around somewhere. It doesn't matter much to me which one we take. Brian Brian Foster (3): xfs: replace on-stack xfs_trans_res with pointer in xfs_create() xfs: fix error handling in xfs_qm_log_quotaoff() xfs: allow lazy sb counter sync during filesystem freeze sequence fs/xfs/xfs_inode.c | 15 ++++++--------- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_mount.c | 29 +++++++++++++++++++++-------- fs/xfs/xfs_mount.h | 2 +- fs/xfs/xfs_qm_syscalls.c | 26 ++++++++++---------------- 5 files changed, 39 insertions(+), 35 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Fri Nov 14 12:00:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C2E867F47 for ; Fri, 14 Nov 2014 12:00:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B09A38F8050 for ; Fri, 14 Nov 2014 10:00:26 -0800 (PST) X-ASG-Debug-ID: 1415988013-04cbb01e5c77340002-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hFGaX2rXWrCd9LrQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 10:00:25 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH9Yl006340 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 11:17:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEGH81i012331 for ; Fri, 14 Nov 2014 11:17:08 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id AB9D012310A; Fri, 14 Nov 2014 11:17:07 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs: allow lazy sb counter sync during filesystem freeze sequence Date: Fri, 14 Nov 2014 11:17:07 -0500 X-ASG-Orig-Subj: [PATCH 3/3] xfs: allow lazy sb counter sync during filesystem freeze sequence Message-Id: <1415981827-52993-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1415981827-52993-1-git-send-email-bfoster@redhat.com> References: <1415981827-52993-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415988025 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The expectation since the introduction the lazy superblock counters is that the counters are synced and superblock logged appropriately as part of the filesystem freeze sequence. This does not occur, however, due to the logic in xfs_fs_writable() that prevents progress when the fs is in any state other than SB_UNFROZEN. While this is a bug, it has not been exposed to date because the last thing XFS does during freeze is dirty the log. The log recovery process recalculates the counters from AGI/AGF metadata to ensure everything is correct. Therefore should a crash occur while an fs is frozen, the subsequent log recovery puts everything back in order. See the following commit for reference: 92821e2b [XFS] Lazy Superblock Counters We might not always want to rely on dirtying the log on a frozen fs. Modify xfs_log_sbcount() to proceed when the filesystem is freezing but not once the freeze process has completed. Modify xfs_fs_writable() to accept the minimum freeze level for which modifications should be blocked to support various codepaths. Signed-off-by: Brian Foster --- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_mount.c | 29 +++++++++++++++++++++-------- fs/xfs/xfs_mount.h | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index fe88ef6..e810e9d 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1031,7 +1031,7 @@ xfs_log_need_covered(xfs_mount_t *mp) struct xlog *log = mp->m_log; int needed = 0; - if (!xfs_fs_writable(mp)) + if (!xfs_fs_writable(mp, SB_FREEZE_WRITE)) return 0; if (!xlog_cil_empty(log)) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 51435db..13d1170 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1074,11 +1074,23 @@ xfs_unmountfs( xfs_sysfs_del(&mp->m_kobj); } -int -xfs_fs_writable(xfs_mount_t *mp) +/* + * Determine whether modifications can proceed. The caller specifies the minimum + * freeze level for which modifications should not be allowed. This allows + * certain operations to proceed while the freeze sequence is in progress, if + * necessary. + */ +bool +xfs_fs_writable( + struct xfs_mount *mp, + int level) { - return !(mp->m_super->s_writers.frozen || XFS_FORCED_SHUTDOWN(mp) || - (mp->m_flags & XFS_MOUNT_RDONLY)); + ASSERT(level > SB_UNFROZEN); + if ((mp->m_super->s_writers.frozen >= level) || + XFS_FORCED_SHUTDOWN(mp) || (mp->m_flags & XFS_MOUNT_RDONLY)) + return false; + + return true; } /* @@ -1086,9 +1098,9 @@ xfs_fs_writable(xfs_mount_t *mp) * * Sync the superblock counters to disk. * - * Note this code can be called during the process of freezing, so - * we may need to use the transaction allocator which does not - * block when the transaction subsystem is in its frozen state. + * Note this code can be called during the process of freezing, so we use the + * transaction allocator that does not block when the transaction subsystem is + * in its frozen state. */ int xfs_log_sbcount(xfs_mount_t *mp) @@ -1096,7 +1108,8 @@ xfs_log_sbcount(xfs_mount_t *mp) xfs_trans_t *tp; int error; - if (!xfs_fs_writable(mp)) + /* allow this to proceed during the freeze sequence... */ + if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE)) return 0; xfs_icsb_sync_counters(mp, 0); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b0447c8..8852418 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -384,7 +384,7 @@ extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); extern void xfs_freesb(xfs_mount_t *); -extern int xfs_fs_writable(xfs_mount_t *); +extern bool xfs_fs_writable(struct xfs_mount *mp, int level); extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -- 1.8.3.1 From webmaster@testfreewww5.com Fri Nov 14 12:31:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE, LOCALPART_IN_SUBJECT,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 00AF77F3F for ; Fri, 14 Nov 2014 12:31:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E34638F8033 for ; Fri, 14 Nov 2014 10:30:58 -0800 (PST) X-ASG-Debug-ID: 1415989853-04cbb01e5a78890001-NocioJ Received: from 109 ([109.237.111.90]) by cuda.sgi.com with ESMTP id rsjVC0dCqHNeq5GG (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 14 Nov 2014 10:30:55 -0800 (PST) X-Barracuda-Envelope-From: webmaster@testfreewww5.com X-Barracuda-Apparent-Source-IP: 109.237.111.90 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=testfreewww5.com; s=dkim; h=Content-Type:MIME-Version:Date:From:Message-ID:Subject:To; bh=ayDc+mdxG3pSjxzdtMKChZ3nOctpS8CM1YYYZQ8T0RA=; b=RrFiZ7fg/0cScHm1KztJJKuN54KiJwNrszT3ZG/B+4PaxGUTP12yqmHTmIM/MrG0rjhtkQ2AYUVFdH1FD0i4mDyUm3sMLIfawgC7yzF3K8NBM/KuiSK0+N8E0D2R6vYlfvWNJlG1Et/WFczAW+1kO8xZgSjqa8vFM1XcHubELLQ=; Received: from puxas by 109 with local (Exim 4.80) (envelope-from ) id 1XpLdZ-0001jL-JU for xfs@oss.sgi.com; Fri, 14 Nov 2014 13:30:26 -0500 To: "xfs" Subject: =?windows-1251?B?eGZzLCDz5+3g6fLlLCDq4Oog7+Xw5eny6CDt?= =?windows-1251?B?4CDi4Ov+8u376SDu6uvg5C4=?= X-PHP-Originating-Script: 500:rumail.php X-ASG-Orig-Subj: =?windows-1251?B?eGZzLCDz5+3g6fLlLCDq4Oog7+Xw5eny6CDt?= =?windows-1251?B?4CDi4Ov+8u376SDu6uvg5C4=?= Message-ID: <14EE87128E5A74C71B1E57E8ECFFFE63@drbao> From: =?windows-1251?B?wujq8u7wIM/u5OTz4e376Q==?= Date: Fri, 14 Nov 2014 18:30:48 +0000 Organization: BinarOption 2015 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_069A_01D00039.1C397D90" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3538.513 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3538.513 X-Barracuda-Connect: UNKNOWN[109.237.111.90] X-Barracuda-Start-Time: 1415989854 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, LOCALPART_IN_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11597 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 LOCALPART_IN_SUBJECT Local part of To: address appears in Subject -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS This is a multi-part message in MIME format. ------=_NextPart_000_069A_01D00039.1C397D90 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E2=E5=F2=F1=F2=E2=F3=FE, xfs! =D0 =F3 =E1 =EB =FC =F2=E5=F0=FF=E5=F2 =F1=E8=EB=F3, =E8 =F1=E5=E9=F7=E0=F1= =F1=E0=EC=EE=E5 =E2=F0=E5=EC=FF =EF=E5=F0=E5=E9=F2=E8 =ED=E0 =C2=C0=CB=DE=D2=D3.=20 =C2=EE=F2 =FD=F2=EE =EF=EE=EC=EE=E6=E5=F2 =C2=E0=EC =ED=E5 =EF=F0=EE=F1=F2= =EE =EE=F1=F2=E0=F2=FC=F1=FF =ED=E0 =EF=EB=E0=E2=F3, =ED=EE =E8 =E2=FB=F2=E0=F9=E8=F2=FC =E8=E7 =EA=F0= =E8=E7=E8=F1=ED=EE=E3=EE =E2=EE=E4=EE=E2=EE=F0=EE=F2=E0 =E2=F1=E5=F5 =F1=E2=EE=E8=F5 =E1=EB=E8=E7=EA= =E8=F5: =20 =95 http://bisnessrassel.ru/ckick/id34654 =D3=F1=EB=EE=E2=E8=FF =F2=E0=EC =E1=E5=F1=EF=F0=E5=F6=E5=E4=E5=ED=F2=ED=FB= =E5 =96 =F2=E0=EA=EE=E3=EE =E5=F9=E5 =ED=E5 =EF=F0=E5=E4=EB=E0=E3=E0=EB=E0 =ED=E8 =EE=E4=ED=E0 =EF=F0=EE=E3=F0= =E0=EC=EC=E0. =20 =CD=E0=E2=E0=F0, =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE, =E7=E0=F8=EA= =E0=EB=E8=E2=E0=E5=F2. =C4=EB=FF =E2=F1=F2=F3=EF=EB=E5=ED=E8=FF =AB=E2 =E4=EE=EB=FE=BB =F0=E0=F1= =EA=EE=F8=E5=EB=E8=E2=E0=F2=FC=F1=FF =ED=E5 =ED=F3=E6=ED=EE. =CD=E0=F7=E8=F1=EB=E5=ED=ED=F3=FE =ED=E0=EB=E8=F7= =ED=EE=F1=F2=FC =E7=E0=E1=E8=F0=E0=E5=F2=E5 =F1=F0=E0=E7=F3. =CF=E5=F0=E2=FB=E5 =AB=F1=EB= =E8=E2=EA=E8=BB =F1=ED=E8=EC=E5=F2=E5 =F3=E6=E5 =E2 =EF=E5=F0=E2=FB=E9 =E4=E5=ED=FC. =C8=E7 =E3=EB=E0=E2=ED=EE=E3=EE, =EA=E0=E6=E5=F2=F1=FF, =E2=F1=E5.=20 =C2=ED=E8=EC=E0=F2=E5=EB=FC=ED=EE =EF=EE=F1=EC=EE=F2=F0=E8=F2=E5 =E8=ED=F4= =EE=F0=EC=E0=F6=E8=FE, =F3=E7=ED=E0=E5=F2=E5 =E5=F9=E5 =EC=ED=EE=E3=EE =E8=ED=F2=E5=F0=E5=F1=ED=EE=E3=EE:=20 =95 http://bisnessrassel.ru/ckick/id34654 =C4=EB=FF =C2=E0=F1 =E2=E0=EA=E0=ED=F1=E8=FF =E1=F3=E4=E5=F2 =EE=F2=EA=F0= =FB=F2=E0 2 =E4=ED=FF. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D =C2=E8=EA=F2=EE=F0 =CF=EE=E4=E4=F3=E1=ED=FB=E9,=20 =E1=E8=F0=E6=E5=E2=EE=E9 =FD=EA=F1=EF=E5=F0=F2 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ------=_NextPart_000_069A_01D00039.1C397D90 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=F0=E8=E2=E5=F2=F1=F2=E2=F3=FE, xfs!

=D0 =F3 =E1 =EB =FC= =F2=E5=F0=FF=E5=F2 =F1=E8=EB=F3, =E8=20 =F1=E5=E9=F7=E0=F1 =F1=E0=EC=EE=E5
=E2=F0=E5=EC=FF =EF=E5=F0=E5=E9=F2=E8= =ED=E0 =C2=C0=CB=DE=D2=D3
.
 
=C2=EE=F2 =FD=F2=EE =EF=EE=EC=EE=E6=E5=F2 =C2=E0=EC =ED= =E5 =EF=F0=EE=F1=F2=EE =EE=F1=F2=E0=F2=FC=F1=FF
=ED=E0 =EF=EB=E0=E2=F3= , =ED=EE =E8=20 =E2=FB=F2=E0=F9=E8=F2=FC =E8=E7 =EA=F0=E8=E7=E8=F1=ED=EE=E3=EE
=E2=EE=E4= =EE=E2=EE=F0=EE=F2=E0 =E2=F1=E5=F5 =F1=E2=EE=E8=F5 =E1=EB=E8=E7=EA=E8=F5:=
 
=95 =20
http://bisnessrassel.ru/ckick/id34654
 
=D3=F1=EB=EE=E2=E8=FF =F2=E0=EC =E1=E5=F1=EF=F0=E5=F6= =E5=E4=E5=ED=F2=ED=FB=E5 =96 =F2=E0=EA=EE=E3=EE =E5=F9=E5
=ED=E5 =EF=F0= =E5=E4=EB=E0=E3=E0=EB=E0 =ED=E8=20 =EE=E4=ED=E0 =EF=F0=EE=E3=F0=E0=EC=EC=E0.
 
=CD=E0=E2=E0=F0,=20 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE, =E7=E0=F8=EA=E0=EB=E8=E2=E0=E5= =F2.
 
=C4=EB=FF =E2=F1=F2=F3=EF=EB=E5=ED=E8=FF =AB=E2 =E4=EE= =EB=FE=BB =F0=E0=F1=EA=EE=F8=E5=EB=E8=E2=E0=F2=FC=F1=FF
=ED=E5 =ED=F3=E6= =ED=EE.=20 =CD=E0=F7=E8=F1=EB=E5=ED=ED=F3=FE =ED=E0=EB=E8=F7=ED=EE=F1=F2=FC
=E7=E0= =E1=E8=F0=E0=E5=F2=E5 =F1=F0=E0=E7=F3.
=CF=E5=F0=E2=FB=E5 =AB=F1=EB=E8=E2=EA=E8=BB =F1=ED=E8=EC=E5=F2=E5=
=F3=E6=E5 =E2 =EF=E5=F0=E2=FB=E9 =E4=E5=ED=FC.
 
=C8=E7 =E3=EB=E0=E2=ED=EE=E3=EE, =EA=E0=E6=E5=F2=F1=FF= , =E2=F1=E5.
 
=C2=ED=E8=EC=E0=F2=E5=EB=FC=ED=EE =EF=EE=F1=EC=EE=F2=F0= =E8=F2=E5 =E8=ED=F4=EE=F0=EC=E0=F6=E8=FE, =F3=E7=ED=E0=E5=F2=E5
=E5=F9= =E5 =EC=ED=EE=E3=EE=20 =E8=ED=F2=E5=F0=E5=F1=ED=EE=E3=EE:
 
 
=C4=EB=FF =C2=E0=F1 =E2=E0=EA=E0=ED=F1=E8=FF =E1= =F3=E4=E5=F2 =EE=F2=EA=F0=FB=F2=E0 2 =E4=ED=FF.
 
 
 
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
 
=C2=E8=EA=F2=EE=F0 =CF=EE=E4=E4=F3=E1=ED=FB=E9, <= BR>=E1=E8=F0=E6=E5=E2=EE=E9 =FD=EA=F1=EF=E5=F0=F2
 

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
------=_NextPart_000_069A_01D00039.1C397D90-- From cmaiolino@redhat.com Fri Nov 14 12:32:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 46CA87F47 for ; Fri, 14 Nov 2014 12:32:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 34E658F804C for ; Fri, 14 Nov 2014 10:32:42 -0800 (PST) X-ASG-Debug-ID: 1415989961-04cb6c05724c5c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GKydEH4Y9QaUXmbQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 10:32:42 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEIWfd6021075 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 13:32:41 -0500 Received: from hades.localdomain.com (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEIWdb6025768 for ; Fri, 14 Nov 2014 13:32:40 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V7 Date: Fri, 14 Nov 2014 16:32:18 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V7 Message-Id: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415989962 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Also, this new version contains a fix to ensure both files will have their i_mode updated, so that d_type object (in superblock V5) will contain the proper information after the exchange happens Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag V7 fs/xfs/xfs_inode.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 24 +++++++++--- 3 files changed, 131 insertions(+), 8 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Fri Nov 14 12:32:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B6FAA7F56 for ; Fri, 14 Nov 2014 12:32:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A66FB30404E for ; Fri, 14 Nov 2014 10:32:45 -0800 (PST) X-ASG-Debug-ID: 1415989964-04cbb01e59789e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NsNQEtswnWl7d0ow (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 10:32:44 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEIWiHf032037 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 13:32:44 -0500 Received: from hades.localdomain.com (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEIWdb8025768 for ; Fri, 14 Nov 2014 13:32:43 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 Date: Fri, 14 Nov 2014 16:32:20 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 Message-Id: <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> References: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415989964 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() V3: - fix indentation to avoid 80 column crossing, decrease the amount of arguments passed to xfs_cross_rename() - Rebase patches over the latest linux code v4: - use a label/goto statement instead of an if conditional after xfs_cross_rename() return, to finish the rename operation - Make xfs_cross_rename() static - Fix some comments V5: - Keep all the code under 80 columns V6: - Ensure i_mode of both files are updated during exchange V7: - Use struct names instead of typedefs in the xfs_cross_rename() definition Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 15 +++++-- 3 files changed, 124 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..3a77254 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2668,6 +2668,103 @@ xfs_sort_for_rename( } } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +STATIC int +xfs_cross_rename( + struct xfs_trans *tp, + struct xfs_inode *src_dp, + struct xfs_name *src_name, + struct xfs_inode *src_ip, + struct xfs_inode *target_dp, + struct xfs_name *target_name, + struct xfs_inode *target_ip, + struct xfs_bmap_free *free_list, + xfs_fsblock_t *first_block, + int spaceres) +{ + int error = 0; + int new_parent; + int src_is_directory; + int tgt_is_directory; + + new_parent = (src_dp != target_dp); + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); + + /* Replace source inode */ + error = xfs_dir_replace(tp, src_dp, src_name, + target_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + /* Replace target inode */ + error = xfs_dir_replace(tp, target_dp, target_name, + src_ip->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + /* + * If we're renaming one or more directories across different parents, + * update the respective ".." entries (and link counts) to match the new + * parents. + */ + if (new_parent) { + xfs_trans_ichgtime(tp, target_dp, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + + if (tgt_is_directory) { + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, + src_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer target ".." reference to src_dp */ + if (!src_is_directory) { + error = xfs_droplink(tp, target_dp); + if (error) + goto out; + error = xfs_bumplink(tp, src_dp); + if (error) + goto out; + } + } + + if (src_is_directory) { + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, + target_dp->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer src ".." reference to target_dp */ + if (!tgt_is_directory) { + error = xfs_droplink(tp, src_dp); + if (error) + goto out; + error = xfs_bumplink(tp, target_dp); + if (error) + goto out; + } + } + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); + } + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); + +out: + return error; +} + /* * xfs_rename */ @@ -2678,7 +2775,8 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; @@ -2706,6 +2804,7 @@ xfs_rename( cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); + if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); @@ -2756,6 +2855,17 @@ xfs_rename( } /* + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, + target_dp, target_name, target_ip, + &free_list, &first_block, spaceres); + if (error) + goto abort_return; + goto finish_rename; + } + /* * Set up the target. */ if (target_ip == NULL) { @@ -2894,6 +3004,7 @@ xfs_rename( if (new_parent) xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); +finish_rename: /* * If this is a synchronous mount, make sure that the * rename transaction goes to disk before returning to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..051d9f0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0b8704c..4e5d8ce 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -387,19 +387,26 @@ xfs_vn_rename( unsigned int flags) { struct inode *new_inode = ndentry->d_inode; + int omode = 0; struct xfs_name oname; struct xfs_name nname; - /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; - xfs_dentry_to_name(&oname, odentry, 0); + /* + * if we are exchanging files, we should set + * i_mode of both files + */ + if (flags & RENAME_EXCHANGE) + omode = ndentry->d_inode->i_mode; + + xfs_dentry_to_name(&oname, odentry, omode); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From cmaiolino@redhat.com Fri Nov 14 12:32:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 461DD7F61 for ; Fri, 14 Nov 2014 12:32:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 358EB30404E for ; Fri, 14 Nov 2014 10:32:45 -0800 (PST) X-ASG-Debug-ID: 1415989963-04cb6c05724c5d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MPCoHAkkUXl0QKvt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 10:32:44 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEIWgcl015793 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 13:32:43 -0500 Received: from hades.localdomain.com (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEIWdb7025768 for ; Fri, 14 Nov 2014 13:32:41 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Fri, 14 Nov 2014 16:32:19 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1415989940-20004-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> References: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415989964 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0b8704c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From sandeen@sandeen.net Fri Nov 14 12:57:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 769AE7F3F for ; Fri, 14 Nov 2014 12:57:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 54AB38F8040 for ; Fri, 14 Nov 2014 10:57:48 -0800 (PST) X-ASG-Debug-ID: 1415991466-04bdf0615e4fac0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6bAOPCI1P9kaFnXG for ; Fri, 14 Nov 2014 10:57:46 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D97F163C3CA6; Fri, 14 Nov 2014 12:57:45 -0600 (CST) Message-ID: <546650A8.9030002@sandeen.net> Date: Fri, 14 Nov 2014 12:57:44 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Carlos Maiolino , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 References: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 In-Reply-To: <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1415991466 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11598 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/14/14 12:32 PM, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. I really hate to do this, but, here: > + /* > + * If we're renaming one or more directories across different parents, > + * update the respective ".." entries (and link counts) to match the new > + * parents. > + */ and here: > /* > + * Handle RENAME_EXCHANGE flags > + */ there are whitespace issues w/ the comments (need a " " before the "*") who knows, maybe Dave can fix them on commit ;) -Eric From bfoster@redhat.com Fri Nov 14 13:12:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 889357F3F for ; Fri, 14 Nov 2014 13:12:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A8ADAC005 for ; Fri, 14 Nov 2014 11:12:41 -0800 (PST) X-ASG-Debug-ID: 1415992360-04cbb01e5c7a410001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8cBmMdPk9istCREB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 11:12:41 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEJCd7k010100 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 14:12:40 -0500 Received: from laptop.bfoster (vpn-49-47.rdu2.redhat.com [10.10.49.47]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEJCa96000681 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 14 Nov 2014 14:12:38 -0500 Date: Fri, 14 Nov 2014 14:12:35 -0500 From: Brian Foster To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-ID: <20141114191234.GA3390@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall References: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> <1415989940-20004-2-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415989940-20004-2-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415992360 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 14, 2014 at 04:32:19PM -0200, Carlos Maiolino wrote: > To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS > must have its inode_operations updated, exporting .rename2 method, instead of > .rename. > > This patch just replaces the (now old) .rename method by .rename2, using the > same infra-structure, but checking rename flags. > > calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, > still returns -EINVAL. > > RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside > xfs_vn_rename. > > Changelog: > > V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 > > Signed-off-by: Carlos Maiolino > --- Reviewed-by: Brian Foster > fs/xfs/xfs_iops.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index ec6dcdc..0b8704c 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -383,18 +383,23 @@ xfs_vn_rename( > struct inode *odir, > struct dentry *odentry, > struct inode *ndir, > - struct dentry *ndentry) > + struct dentry *ndentry, > + unsigned int flags) > { > struct inode *new_inode = ndentry->d_inode; > struct xfs_name oname; > struct xfs_name nname; > > + /* XFS does not support RENAME_EXCHANGE yet */ > + if (flags & ~RENAME_NOREPLACE) > + return -EINVAL; > + > xfs_dentry_to_name(&oname, odentry, 0); > xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); > > return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), > - XFS_I(ndir), &nname, new_inode ? > - XFS_I(new_inode) : NULL); > + XFS_I(ndir), &nname, > + new_inode ? XFS_I(new_inode) : NULL); > } > > /* > @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { > */ > .rmdir = xfs_vn_unlink, > .mknod = xfs_vn_mknod, > - .rename = xfs_vn_rename, > + .rename2 = xfs_vn_rename, > .get_acl = xfs_get_acl, > .set_acl = xfs_set_acl, > .getattr = xfs_vn_getattr, > @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { > */ > .rmdir = xfs_vn_unlink, > .mknod = xfs_vn_mknod, > - .rename = xfs_vn_rename, > + .rename2 = xfs_vn_rename, > .get_acl = xfs_get_acl, > .set_acl = xfs_set_acl, > .getattr = xfs_vn_getattr, > -- > 2.1.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Nov 14 13:13:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 850D07F3F for ; Fri, 14 Nov 2014 13:13:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05A1BAC006 for ; Fri, 14 Nov 2014 11:13:04 -0800 (PST) X-ASG-Debug-ID: 1415992382-04cb6c05704e030001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PTKH3l7qjZqZRZUr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 11:13:03 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAEJD2uA018172 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 14 Nov 2014 14:13:02 -0500 Received: from laptop.bfoster (vpn-49-47.rdu2.redhat.com [10.10.49.47]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAEJCxVF000814 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 14 Nov 2014 14:13:01 -0500 Date: Fri, 14 Nov 2014 14:12:59 -0500 From: Brian Foster To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 Message-ID: <20141114191258.GB3390@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 References: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1415992383 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 14, 2014 at 04:32:20PM -0200, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. > > Changelog: > > V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() > > V3: - fix indentation to avoid 80 column crossing, decrease the amount of > arguments passed to xfs_cross_rename() > - Rebase patches over the latest linux code > > v4: - use a label/goto statement instead of an if conditional after > xfs_cross_rename() return, to finish the rename operation > - Make xfs_cross_rename() static > - Fix some comments > > V5: - Keep all the code under 80 columns > > V6: - Ensure i_mode of both files are updated during exchange > > V7: - Use struct names instead of typedefs in the xfs_cross_rename() > definition > > Signed-off-by: Carlos Maiolino > --- Aside from the comment alignment things that Eric pointed out, this one looks Ok to me: Reviewed-by: Brian Foster > fs/xfs/xfs_inode.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_inode.h | 2 +- > fs/xfs/xfs_iops.c | 15 +++++-- > 3 files changed, 124 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8ed049d..3a77254 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2668,6 +2668,103 @@ xfs_sort_for_rename( > } > } > > +/* xfs_cross_rename() > + * > + * responsible to handle RENAME_EXCHANGE flag > + * in renameat2() sytemcall > + */ > +STATIC int > +xfs_cross_rename( > + struct xfs_trans *tp, > + struct xfs_inode *src_dp, > + struct xfs_name *src_name, > + struct xfs_inode *src_ip, > + struct xfs_inode *target_dp, > + struct xfs_name *target_name, > + struct xfs_inode *target_ip, > + struct xfs_bmap_free *free_list, > + xfs_fsblock_t *first_block, > + int spaceres) > +{ > + int error = 0; > + int new_parent; > + int src_is_directory; > + int tgt_is_directory; > + > + new_parent = (src_dp != target_dp); > + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); > + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); > + > + /* Replace source inode */ > + error = xfs_dir_replace(tp, src_dp, src_name, > + target_ip->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + /* Replace target inode */ > + error = xfs_dir_replace(tp, target_dp, target_name, > + src_ip->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + > + /* > + * If we're renaming one or more directories across different parents, > + * update the respective ".." entries (and link counts) to match the new > + * parents. > + */ > + if (new_parent) { > + xfs_trans_ichgtime(tp, target_dp, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + > + if (tgt_is_directory) { > + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, > + src_dp->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out; > + > + /* transfer target ".." reference to src_dp */ > + if (!src_is_directory) { > + error = xfs_droplink(tp, target_dp); > + if (error) > + goto out; > + error = xfs_bumplink(tp, src_dp); > + if (error) > + goto out; > + } > + } > + > + if (src_is_directory) { > + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, > + target_dp->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out; > + > + /* transfer src ".." reference to target_dp */ > + if (!tgt_is_directory) { > + error = xfs_droplink(tp, src_dp); > + if (error) > + goto out; > + error = xfs_bumplink(tp, target_dp); > + if (error) > + goto out; > + } > + } > + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); > + } > + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); > + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); > + > +out: > + return error; > +} > + > /* > * xfs_rename > */ > @@ -2678,7 +2775,8 @@ xfs_rename( > xfs_inode_t *src_ip, > xfs_inode_t *target_dp, > struct xfs_name *target_name, > - xfs_inode_t *target_ip) > + xfs_inode_t *target_ip, > + unsigned int flags) > { > xfs_trans_t *tp = NULL; > xfs_mount_t *mp = src_dp->i_mount; > @@ -2706,6 +2804,7 @@ xfs_rename( > cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > + > if (error == -ENOSPC) { > spaceres = 0; > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > @@ -2756,6 +2855,17 @@ xfs_rename( > } > > /* > + * Handle RENAME_EXCHANGE flags > + */ > + if (flags & RENAME_EXCHANGE) { > + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > + target_dp, target_name, target_ip, > + &free_list, &first_block, spaceres); > + if (error) > + goto abort_return; > + goto finish_rename; > + } > + /* > * Set up the target. > */ > if (target_ip == NULL) { > @@ -2894,6 +3004,7 @@ xfs_rename( > if (new_parent) > xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > > +finish_rename: > /* > * If this is a synchronous mount, make sure that the > * rename transaction goes to disk before returning to > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 9af2882..051d9f0 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, > int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, > struct xfs_inode *src_ip, struct xfs_inode *target_dp, > struct xfs_name *target_name, > - struct xfs_inode *target_ip); > + struct xfs_inode *target_ip, unsigned int flags); > > void xfs_ilock(xfs_inode_t *, uint); > int xfs_ilock_nowait(xfs_inode_t *, uint); > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 0b8704c..4e5d8ce 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -387,19 +387,26 @@ xfs_vn_rename( > unsigned int flags) > { > struct inode *new_inode = ndentry->d_inode; > + int omode = 0; > struct xfs_name oname; > struct xfs_name nname; > > - /* XFS does not support RENAME_EXCHANGE yet */ > - if (flags & ~RENAME_NOREPLACE) > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > return -EINVAL; > > - xfs_dentry_to_name(&oname, odentry, 0); > + /* > + * if we are exchanging files, we should set > + * i_mode of both files > + */ > + if (flags & RENAME_EXCHANGE) > + omode = ndentry->d_inode->i_mode; > + > + xfs_dentry_to_name(&oname, odentry, omode); > xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); > > return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), > XFS_I(ndir), &nname, > - new_inode ? XFS_I(new_inode) : NULL); > + new_inode ? XFS_I(new_inode) : NULL, flags); > } > > /* > -- > 2.1.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From luto@amacapital.net Fri Nov 14 15:03:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7D9187F3F for ; Fri, 14 Nov 2014 15:03:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F1E7FAC00A for ; Fri, 14 Nov 2014 13:03:22 -0800 (PST) X-ASG-Debug-ID: 1415999000-04cbb01e597e520001-NocioJ Received: from mail-lb0-f175.google.com (mail-lb0-f175.google.com [209.85.217.175]) by cuda.sgi.com with ESMTP id YJCZn0H4CKvtuHk3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Nov 2014 13:03:21 -0800 (PST) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.217.175 Received: by mail-lb0-f175.google.com with SMTP id n15so13351181lbi.6 for ; Fri, 14 Nov 2014 13:03:20 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=jXWG8el89g5Zx8N42sfJGtzENt7Vy2aflZP9WBHNtW0=; b=Z1OS+ycClRfnvJuBObAZfKbXYORXPhU6MJa4sV70C3fr/1cD+/TORKKzO45BzTFg/y TpEwzTUPSZI7ho/Z1wpkeJvYz/2Y1NNW9wvE07DURPTMtlVQb7PWSHRaTu0zK7LlC2OI yPZhQs2LKptvUYjRx3d4qi0aJujwgWxYfWq7vvR+azIolUQvuFxrrf3hvYPUGa542uCF iz4ODs8LOvKJVi+ew+jXZlcg9HhgEdF/EklCVhNgq14ZFdxL9ll1gPLqd00PDudPbQ25 qqBIS6t0+OJ6jdxVg8H2af6w9Rr11VUuBvu6QAnZKb2fSYjtfrDrlP74qxoqn6bLKv+/ ujqA== X-Gm-Message-State: ALoCoQkliaHfZthofZH+/yZSgkS057OfkmeqX+LdxZw/ZS8q/7FAU8n9s0cWzHP3zKRV94dXqTgK X-Received: by 10.112.54.162 with SMTP id k2mr10239393lbp.63.1415998999865; Fri, 14 Nov 2014 13:03:19 -0800 (PST) MIME-Version: 1.0 Received: by 10.152.4.71 with HTTP; Fri, 14 Nov 2014 13:02:59 -0800 (PST) In-Reply-To: <20141114052523.GB29950@dastard> References: <20141114052523.GB29950@dastard> From: Andy Lutomirski Date: Fri, 14 Nov 2014 13:02:59 -0800 Message-ID: Subject: Re: XFS locking issues in 3.18-rc3+ To: Dave Chinner X-ASG-Orig-Subj: Re: XFS locking issues in 3.18-rc3+ Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f175.google.com[209.85.217.175] X-Barracuda-Start-Time: 1415999000 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11601 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 13, 2014 at 9:25 PM, Dave Chinner wrote: > On Thu, Nov 13, 2014 at 04:57:11PM -0800, Andy Lutomirski wrote: >> I'm running a kernel somewhere between 3.18-rc3 and 3.18-rc4. I got >> the warnings below. Is this a known issue? > > Yup, false positive. shmem is instantiating an inode under the > mmap_sem and in doing so taking inode locks under the mmap_sem, > which triggers other filesystems to issue false warnings about > mmap_sem <-> inode lock order. I still have an enormous flood of warnings even if CONFIG_PROVE_LOCKING=n. This one is repeated at high frequency: [ 70.969118] ------------[ cut here ]------------ [ 70.969121] WARNING: CPU: 8 PID: 653 at mm/truncate.c:758 pagecache_isize_extended+0x105/0x110() [ 70.969122] Modules linked in: x86_pkg_temp_thermal igb ioatdma mei_me dca ipmi_si ipmi_msghandler efivarfs radeon mgag200 drm_kms_helper ttm [ 70.969128] CPU: 8 PID: 653 Comm: systemd-journal Tainted: G W 3.18.0-rc3+ #9 [ 70.969129] Hardware name: Supermicro X9DRH-iF-NV/X9DRH-iF-NV, BIOS 2.0 08/06/2013 [ 70.969130] 0000000000000009 ffff88046611bd38 ffffffff819769bd 0000000000000000 [ 70.969132] 0000000000000000 ffff88046611bd78 ffffffff810cf621 ffff88086402da40 [ 70.969134] 0000000000001000 ffff88086402dc30 0000000003f5c000 0000000003f5d000 [ 70.969136] Call Trace: [ 70.969139] [] dump_stack+0x46/0x58 [ 70.969141] [] warn_slowpath_common+0x81/0xa0 [ 70.969144] [] warn_slowpath_null+0x1a/0x20 [ 70.969145] [] pagecache_isize_extended+0x105/0x110 [ 70.969147] [] truncate_setsize+0x27/0x40 [ 70.969150] [] xfs_setattr_size+0x13f/0x3c0 [ 70.969152] [] ? xfs_trans_commit+0x146/0x220 [ 70.969153] [] xfs_file_fallocate+0x2e7/0x300 [ 70.969155] [] ? __sb_start_write+0x58/0xf0 [ 70.969158] [] ? selinux_file_permission+0xc4/0x120 [ 70.969160] [] do_fallocate+0x12f/0x1d0 [ 70.969163] [] SyS_fallocate+0x48/0x80 [ 70.969165] [] system_call_fastpath+0x12/0x17 [ 70.969166] ---[ end trace cb00af92b6f227a7 ]--- That's WARN_ON(!mutex_is_locked(&inode->i_mutex)); --Andy > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Andy Lutomirski AMA Capital Management, LLC From david@fromorbit.com Fri Nov 14 15:50:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 552EF7F3F for ; Fri, 14 Nov 2014 15:50:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 419008F8050 for ; Fri, 14 Nov 2014 13:50:13 -0800 (PST) X-ASG-Debug-ID: 1416001809-04cb6c057153ed0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id e4CMEd7OTKCVK7cY for ; Fri, 14 Nov 2014 13:50:10 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArNcAKV4ZlR5LbBUPGdsb2JhbABbgw6BLoI2hQeyBgaVGYVrAgIBAQKBGxcBAQEBAQYBAQEBHxkNLoQDAQEEJxMcIxAIAw4KCSUPBSUDBxoTiEDSFgEBCAIBHxiGJopkB4MtgR4BBIZAiTuJcoRemwspMIJLAQEB Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 15 Nov 2014 08:20:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XpOkp-0002bq-RR; Sat, 15 Nov 2014 08:50:07 +1100 Date: Sat, 15 Nov 2014 08:50:07 +1100 From: Dave Chinner To: Andy Lutomirski Cc: xfs@oss.sgi.com Subject: Re: XFS locking issues in 3.18-rc3+ Message-ID: <20141114215007.GC29950@dastard> X-ASG-Orig-Subj: Re: XFS locking issues in 3.18-rc3+ References: <20141114052523.GB29950@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1416001810 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11602 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 14, 2014 at 01:02:59PM -0800, Andy Lutomirski wrote: > On Thu, Nov 13, 2014 at 9:25 PM, Dave Chinner wrote: > > On Thu, Nov 13, 2014 at 04:57:11PM -0800, Andy Lutomirski wrote: > >> I'm running a kernel somewhere between 3.18-rc3 and 3.18-rc4. I got > >> the warnings below. Is this a known issue? > > > > Yup, false positive. shmem is instantiating an inode under the > > mmap_sem and in doing so taking inode locks under the mmap_sem, > > which triggers other filesystems to issue false warnings about > > mmap_sem <-> inode lock order. > > I still have an enormous flood of warnings even if > CONFIG_PROVE_LOCKING=n. This one is repeated at high frequency: > > [ 70.969118] ------------[ cut here ]------------ > [ 70.969121] WARNING: CPU: 8 PID: 653 at mm/truncate.c:758 > pagecache_isize_extended+0x105/0x110() Fixed in 3.18-rc4. Cheers, Dave. -- Dave Chinner david@fromorbit.com From luto@amacapital.net Fri Nov 14 16:06:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14EB57F3F for ; Fri, 14 Nov 2014 16:06:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B44E2AC002 for ; Fri, 14 Nov 2014 14:06:06 -0800 (PST) X-ASG-Debug-ID: 1416002764-04bdf0615f575e0001-NocioJ Received: from mail-lb0-f178.google.com (mail-lb0-f178.google.com [209.85.217.178]) by cuda.sgi.com with ESMTP id Nup4sFEvh3qtVzc6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Nov 2014 14:06:05 -0800 (PST) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.217.178 Received: by mail-lb0-f178.google.com with SMTP id f15so14791212lbj.23 for ; Fri, 14 Nov 2014 14:06:03 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=wENUhzS2OGEOVaAd+tRJQgb+3xaw/Kj2MIoWiDFpavo=; b=OnYRvdO87c6SPqezsIj0q73jP/ZCAD+uZT576VqcHDizxjycGBE8lbx/Kdq0GsS1hO jwbyZ14m9ab59jh9b1LS8Zo9bcM/zs0UoABmWLqF/OoUxFasvzsgc8VrGqaKvmihExTe u75TtVudF2F+6Injhf5JBSlrQ5pfXTIU9iXMb8MkK+8NPj88lwK22DUUJhXVgQwRXYTL KsUcjv1p4hvh66qN3e7a/psQp9YrYkSKGwKyfI7mRlDwYqCNf7h4piO9uTOHtDC04weJ qKYw2pBozwf6QR7NSh2WT2Gf66KFDZvLxbAr6ggE70SvnTyf8OxBsavc0pBNA3E/PiLT jvFA== X-Gm-Message-State: ALoCoQkx4uXdE+YzCwhYjri/Vi+mScj+I3jevlPAdB9BB0a83phv+Of7/Q9YHeyc1v2LoIW/piRe X-Received: by 10.152.6.41 with SMTP id x9mr28207lax.95.1416002763685; Fri, 14 Nov 2014 14:06:03 -0800 (PST) MIME-Version: 1.0 Received: by 10.152.4.71 with HTTP; Fri, 14 Nov 2014 14:05:43 -0800 (PST) In-Reply-To: <20141114215007.GC29950@dastard> References: <20141114052523.GB29950@dastard> <20141114215007.GC29950@dastard> From: Andy Lutomirski Date: Fri, 14 Nov 2014 14:05:43 -0800 Message-ID: Subject: Re: XFS locking issues in 3.18-rc3+ To: Dave Chinner X-ASG-Orig-Subj: Re: XFS locking issues in 3.18-rc3+ Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-lb0-f178.google.com[209.85.217.178] X-Barracuda-Start-Time: 1416002764 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11603 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 14, 2014 at 1:50 PM, Dave Chinner wrote: > On Fri, Nov 14, 2014 at 01:02:59PM -0800, Andy Lutomirski wrote: >> On Thu, Nov 13, 2014 at 9:25 PM, Dave Chinner wrote: >> > On Thu, Nov 13, 2014 at 04:57:11PM -0800, Andy Lutomirski wrote: >> >> I'm running a kernel somewhere between 3.18-rc3 and 3.18-rc4. I got >> >> the warnings below. Is this a known issue? >> > >> > Yup, false positive. shmem is instantiating an inode under the >> > mmap_sem and in doing so taking inode locks under the mmap_sem, >> > which triggers other filesystems to issue false warnings about >> > mmap_sem <-> inode lock order. >> >> I still have an enormous flood of warnings even if >> CONFIG_PROVE_LOCKING=n. This one is repeated at high frequency: >> >> [ 70.969118] ------------[ cut here ]------------ >> [ 70.969121] WARNING: CPU: 8 PID: 653 at mm/truncate.c:758 >> pagecache_isize_extended+0x105/0x110() > > Fixed in 3.18-rc4. Yeah, I just confirmed that, too. Thanks. (The lockdep splat is still there, but that's much less annoying.) --Andy > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com -- Andy Lutomirski AMA Capital Management, LLC From lists@colorremedies.com Fri Nov 14 16:31:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F29DC7F47 for ; Fri, 14 Nov 2014 16:31:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF0BE8F8039 for ; Fri, 14 Nov 2014 14:31:44 -0800 (PST) X-ASG-Debug-ID: 1416004303-04cbb01e5a81470001-NocioJ Received: from slmp-550-94.slc.westdc.net (slmp-550-94.slc.westdc.net [50.115.112.57]) by cuda.sgi.com with ESMTP id nWv5DK2xkYRVyALW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 14:31:43 -0800 (PST) X-Barracuda-Envelope-From: lists@colorremedies.com X-Barracuda-Apparent-Source-IP: 50.115.112.57 Received: from c-75-70-18-61.hsd1.co.comcast.net ([75.70.18.61]:64325 helo=[192.168.1.126]) by slmp-550-94.slc.westdc.net with esmtpsa (TLSv1:RC4-SHA:128) (Exim 4.84) (envelope-from ) id 1XpPP5-000oLW-1R; Fri, 14 Nov 2014 15:31:43 -0700 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: Mismatch UUID From: Chris Murphy X-ASG-Orig-Subj: Re: Mismatch UUID In-Reply-To: Date: Fri, 14 Nov 2014 15:31:42 -0700 Cc: "xfs@oss.sgi.com" Content-Transfer-Encoding: quoted-printable Message-Id: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com> References: To: Robert Tench X-Mailer: Apple Mail (2.1878.6) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - slmp-550-94.slc.westdc.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - colorremedies.com X-Get-Message-Sender-Via: slmp-550-94.slc.westdc.net: authenticated_id: whatever@colorremedies.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: slmp-550-94.slc.westdc.net[50.115.112.57] X-Barracuda-Start-Time: 1416004303 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11603 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Nov 14, 2014, at 1:57 AM, Robert Tench wrote: > Robert has a file to share with you on OneDrive. To view it, click the = link below. > xfs.log > So finally have managed to find a way to save the complete log of = running xfs_repair -n /dev.md4 >=20 > And below is the output of xfs_check /dev/md4 >=20 > root@ubuntu:~# xfs_check /dev/md4 > * ERROR: mismatched uuid in log > * SB : 813833a7-1bd3-4447-b575-09d1471bb652 > * log: ea3833af-25ce-9f91-b575-018fb49df3b1 > ERROR: The filesystem has valuable metadata changes in a log which = needs to > be replayed. Mount the filesystem to replay the log, and unmount it = before > re-running xfs_check. If you are unable to mount the filesystem, then = use > the xfs_repair -L option to destroy the log and attempt a repair. > Note that destroying the log may cause corruption -- please attempt a = mount > of the filesystem before doing this. >=20 > And the output from mdadm -D /dev/md4 is as follows >=20 > root@ubuntu:~# mdadm -D /dev/md4 > /dev/md4: > Version : 1.0 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Used Dev Size : 2928240640 (2792.59 GiB 2998.52 GB) > Raid Devices : 5 > Total Devices : 5 > Persistence : Superblock is persistent >=20 > Update Time : Fri Nov 14 15:58:16 2014 > State : clean=20 > Active Devices : 5 > Working Devices : 5 > Failed Devices : 0 > Spare Devices : 0 >=20 > Layout : left-symmetric > Chunk Size : 512K >=20 > Name : (none):4 > UUID : e0829810:9782b51f:25529f65:8823419c > Events : 1243386 >=20 > Number Major Minor RaidDevice State > 0 8 2 0 active sync /dev/sda2 > 6 8 18 1 active sync /dev/sdb2 > 2 8 34 2 active sync /dev/sdc2 > 5 8 50 3 active sync /dev/sdd2 > 4 8 66 4 active sync /dev/sde2 >=20 >=20 > And then the response from mdadm -E /dev/md4 >=20 > root@ubuntu:~# mdadm -E /dev/md4 > mdadm: No md superblock detected on /dev/md4. -D is for examining the logical md device, -E is for examining the = individual members so you=92d use: mdadm -E /dev/sd[abcde]2 Hopefully you haven=92t used mdadm -C/=97create ? The web is full of = such suggestions and it=92s almost always the wrong thing to do, it=92s = a near last resort in any case. >=20 > Not sure what to do, any help would be appreciated It=92s very good to ask instead of haphazardly trying things. Trying to = normally mount the file system should be safe; and then use dmesg to = check for kernel messages. The xfs kernel code is responsible for log = replay and making most kinds of repairs, anything it can=92t deal with = will be reported as a kernel message. If mount fails, report kernel xfs = related messages, and also the results from xfs_check -n. Chris Murphy= From david@fromorbit.com Fri Nov 14 17:02:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F0A2D7F4E for ; Fri, 14 Nov 2014 17:02:50 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E856AC005 for ; Fri, 14 Nov 2014 15:02:47 -0800 (PST) X-ASG-Debug-ID: 1416006165-04bdf0616059700001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5wREDOhJ1r5JhWBl for ; Fri, 14 Nov 2014 15:02:45 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArNcAAWJZlR5LbBUPGdsb2JhbABbgw6BLoI2hQeyBgaVGYVrAgIBAQKBGhcBAQEBAQYBAQEBHxkNLoQDAQEEJxMcIxAIAw4KCSUPBSUDBxoTiEDSFgEBAQcCAR8YhiaKZAeDLYEeAQSGQIk7iXKEXpsLKTCCSwEBAQ Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail04.adl6.internode.on.net with ESMTP; 15 Nov 2014 09:32:44 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XpPt4-0002n0-Lt; Sat, 15 Nov 2014 10:02:42 +1100 Date: Sat, 15 Nov 2014 10:02:42 +1100 From: Dave Chinner To: Andy Lutomirski Cc: xfs@oss.sgi.com Subject: Re: XFS locking issues in 3.18-rc3+ Message-ID: <20141114230242.GD29950@dastard> X-ASG-Orig-Subj: Re: XFS locking issues in 3.18-rc3+ References: <20141114052523.GB29950@dastard> <20141114215007.GC29950@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1416006165 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11604 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 14, 2014 at 02:05:43PM -0800, Andy Lutomirski wrote: > On Fri, Nov 14, 2014 at 1:50 PM, Dave Chinner wrote: > > On Fri, Nov 14, 2014 at 01:02:59PM -0800, Andy Lutomirski wrote: > >> On Thu, Nov 13, 2014 at 9:25 PM, Dave Chinner wrote: > >> > On Thu, Nov 13, 2014 at 04:57:11PM -0800, Andy Lutomirski wrote: > >> >> I'm running a kernel somewhere between 3.18-rc3 and 3.18-rc4. I got > >> >> the warnings below. Is this a known issue? > >> > > >> > Yup, false positive. shmem is instantiating an inode under the > >> > mmap_sem and in doing so taking inode locks under the mmap_sem, > >> > which triggers other filesystems to issue false warnings about > >> > mmap_sem <-> inode lock order. > >> > >> I still have an enormous flood of warnings even if > >> CONFIG_PROVE_LOCKING=n. This one is repeated at high frequency: > >> > >> [ 70.969118] ------------[ cut here ]------------ > >> [ 70.969121] WARNING: CPU: 8 PID: 653 at mm/truncate.c:758 > >> pagecache_isize_extended+0x105/0x110() > > > > Fixed in 3.18-rc4. > > Yeah, I just confirmed that, too. Thanks. (The lockdep splat is > still there, but that's much less annoying.) Fixing the lockdep split is, unfortunately, a lot more work. I've basically got to redesign the way readdir does readahead to hold locks in different ways and so we don't need to hold various locks of the filldir callout where the might_fault() triggers the warnings. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Nov 14 17:40:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47DB87F51 for ; Fri, 14 Nov 2014 17:40:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 355B38F8050 for ; Fri, 14 Nov 2014 15:40:14 -0800 (PST) X-ASG-Debug-ID: 1416008413-04cbb01e5983410001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id avUSTr8EHPd326Xy for ; Fri, 14 Nov 2014 15:40:13 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.example.com (74-95-67-117-Minnesota.hfc.comcastbusiness.net [74.95.67.117]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6358D63C3BCF; Fri, 14 Nov 2014 17:40:12 -0600 (CST) Message-ID: <546692DA.9040105@sandeen.net> Date: Fri, 14 Nov 2014 17:40:10 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Chris Murphy , Robert Tench CC: "xfs@oss.sgi.com" Subject: Re: Mismatch UUID References: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com> X-ASG-Orig-Subj: Re: Mismatch UUID In-Reply-To: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1416008413 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11605 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/14/14 4:31 PM, Chris Murphy wrote: > It’s very good to ask instead of haphazardly trying things. Trying to > normally mount the file system should be safe; and then use dmesg to > check for kernel messages. The xfs kernel code is responsible for log > replay and making most kinds of repairs, anything it can’t deal with > will be reported as a kernel message. If mount fails, report kernel > xfs related messages, and also the results from xfs_check -n. xfs_repair -n xfs_check is deprecated and has no -n option ;) -Eric From lists@colorremedies.com Fri Nov 14 18:03:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5DE7F7F55 for ; Fri, 14 Nov 2014 18:03:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3C433304043 for ; Fri, 14 Nov 2014 16:03:55 -0800 (PST) X-ASG-Debug-ID: 1416009833-04cbb01e5c83d20001-NocioJ Received: from slmp-550-94.slc.westdc.net (slmp-550-94.slc.westdc.net [50.115.112.57]) by cuda.sgi.com with ESMTP id XCxwNlXFzqV7hBqS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 16:03:53 -0800 (PST) X-Barracuda-Envelope-From: lists@colorremedies.com X-Barracuda-Apparent-Source-IP: 50.115.112.57 Received: from c-75-70-18-61.hsd1.co.comcast.net ([75.70.18.61]:49321 helo=[192.168.1.126]) by slmp-550-94.slc.westdc.net with esmtpsa (TLSv1:RC4-SHA:128) (Exim 4.84) (envelope-from ) id 1XpQqG-001NwS-OH; Fri, 14 Nov 2014 17:03:52 -0700 Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: Mismatch UUID From: Chris Murphy X-ASG-Orig-Subj: Re: Mismatch UUID In-Reply-To: <546692DA.9040105@sandeen.net> Date: Fri, 14 Nov 2014 17:03:51 -0700 Cc: Robert Tench , "xfs@oss.sgi.com" Content-Transfer-Encoding: quoted-printable Message-Id: <22EDE821-F431-4EA2-9CAD-BA7F3A4729DB@colorremedies.com> References: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com> <546692DA.9040105@sandeen.net> To: Eric Sandeen X-Mailer: Apple Mail (2.1878.6) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - slmp-550-94.slc.westdc.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - colorremedies.com X-Get-Message-Sender-Via: slmp-550-94.slc.westdc.net: authenticated_id: whatever@colorremedies.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: slmp-550-94.slc.westdc.net[50.115.112.57] X-Barracuda-Start-Time: 1416009833 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11605 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Nov 14, 2014, at 4:40 PM, Eric Sandeen wrote: > On 11/14/14 4:31 PM, Chris Murphy wrote: >=20 >> It=92s very good to ask instead of haphazardly trying things. Trying = to >> normally mount the file system should be safe; and then use dmesg to >> check for kernel messages. The xfs kernel code is responsible for log >> replay and making most kinds of repairs, anything it can=92t deal = with >> will be reported as a kernel message. If mount fails, report kernel >> xfs related messages, and also the results from xfs_check -n. >=20 > xfs_repair -n >=20 > xfs_check is deprecated and has no -n option ;) Yep, brain flatulence. Chris= From robtench@hotmail.com Fri Nov 14 20:17:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0E37A7F57 for ; Fri, 14 Nov 2014 20:17:46 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A48448F8039 for ; Fri, 14 Nov 2014 18:17:42 -0800 (PST) X-ASG-Debug-ID: 1416017860-04bdf061615f3c0001-NocioJ Received: from BLU004-OMC3S5.hotmail.com (blu004-omc3s5.hotmail.com [65.55.116.80]) by cuda.sgi.com with ESMTP id ExPcE4zFPTZpvwuV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 18:17:40 -0800 (PST) X-Barracuda-Envelope-From: robtench@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.116.80 Received: from BLU172-W19 ([65.55.116.73]) by BLU004-OMC3S5.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Fri, 14 Nov 2014 18:17:40 -0800 X-TMN: [4rwjezG6Cwu9VPbrOMDqwDHTFPBacnMvOknQzgKkE4c=] X-Originating-Email: [robtench@hotmail.com] Message-ID: Content-Type: multipart/alternative; boundary="_11767b43-37f7-42b5-a31a-efa393c893ba_" From: Robert Tench To: Eric Sandeen , Chris Murphy , Brian Foster , "xfs@oss.sgi.com" Subject: RE: Mismatch UUID Date: Sat, 15 Nov 2014 13:17:39 +1100 X-ASG-Orig-Subj: RE: Mismatch UUID Importance: Normal In-Reply-To: <546692DA.9040105@sandeen.net> References: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com>,<546692DA.9040105@sandeen.net> MIME-Version: 1.0 X-OriginalArrivalTime: 15 Nov 2014 02:17:40.0086 (UTC) FILETIME=[54B45960:01D0007A] X-Barracuda-Connect: blu004-omc3s5.hotmail.com[65.55.116.80] X-Barracuda-Start-Time: 1416017860 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11608 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_11767b43-37f7-42b5-a31a-efa393c893ba_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Hi all=2C Many thanks for the replies so far. So here is the reponse from the command line mdadm -E /dev/sd[abcde]2 ubuntu@ubuntu:~$ sudo mdadm -E /dev/sd[abcde]2 /dev/sda2: Magic : a92b4efc Version : 1.0 Feature Map : 0x0 Array UUID : e0829810:9782b51f:25529f65:8823419c Name : (none):4 Creation Time : Fri Jan 1 01:31:17 2010 Raid Level : raid5 Raid Devices : 5 Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) Array Size : 11712962560 (11170.35 GiB 11994.07 GB) Super Offset : 5856481536 sectors State : clean Device UUID : d405d0c5:2a07d7ed:27abcb5a:0eeadc7d Update Time : Fri Nov 14 15:58:16 2014 Checksum : c082e9bb - correct Events : 1243386 Layout : left-symmetric Chunk Size : 512K Device Role : Active device 0 Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing) /dev/sdb2: Magic : a92b4efc Version : 1.0 Feature Map : 0x0 Array UUID : e0829810:9782b51f:25529f65:8823419c Name : (none):4 Creation Time : Fri Jan 1 01:31:17 2010 Raid Level : raid5 Raid Devices : 5 Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) Array Size : 11712962560 (11170.35 GiB 11994.07 GB) Super Offset : 5856481536 sectors State : clean Device UUID : 33acf23a:52a0ad00:cda69d9f:468a8c13 Update Time : Fri Nov 14 15:58:16 2014 Checksum : 22fdc525 - correct Events : 1243386 Layout : left-symmetric Chunk Size : 512K Device Role : Active device 1 Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing) /dev/sdc2: Magic : a92b4efc Version : 1.0 Feature Map : 0x0 Array UUID : e0829810:9782b51f:25529f65:8823419c Name : (none):4 Creation Time : Fri Jan 1 01:31:17 2010 Raid Level : raid5 Raid Devices : 5 Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) Array Size : 11712962560 (11170.35 GiB 11994.07 GB) Super Offset : 5856481536 sectors State : clean Device UUID : 1a4f20e2:34926568:af5351a1:9c9f60e9 Update Time : Fri Nov 14 15:58:16 2014 Checksum : 96b21ac - correct Events : 1243386 Layout : left-symmetric Chunk Size : 512K Device Role : Active device 2 Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing) /dev/sdd2: Magic : a92b4efc Version : 1.0 Feature Map : 0x0 Array UUID : e0829810:9782b51f:25529f65:8823419c Name : (none):4 Creation Time : Fri Jan 1 01:31:17 2010 Raid Level : raid5 Raid Devices : 5 Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) Array Size : 11712962560 (11170.35 GiB 11994.07 GB) Super Offset : 5856481536 sectors State : clean Device UUID : 0ee6b711:242fbd18:44c2839e:60e8ad0d Update Time : Fri Nov 14 15:58:16 2014 Checksum : ada0762 - correct Events : 1243386 Layout : left-symmetric Chunk Size : 512K Device Role : Active device 3 Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing) /dev/sde2: Magic : a92b4efc Version : 1.0 Feature Map : 0x0 Array UUID : e0829810:9782b51f:25529f65:8823419c Name : (none):4 Creation Time : Fri Jan 1 01:31:17 2010 Raid Level : raid5 Raid Devices : 5 Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) Array Size : 11712962560 (11170.35 GiB 11994.07 GB) Super Offset : 5856481536 sectors State : clean Device UUID : f89fdd4c:627a6650:3de0dcab:6790076f Update Time : Fri Nov 14 15:58:16 2014 Checksum : ec5bd289 - correct Events : 1243386 Layout : left-symmetric Chunk Size : 512K Device Role : Active device 4 Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing) What I am curious about is how I should go about attempting to Mount the de= vice and the command line needed. Am I mounting the Raid Array /dev/md4=2C = or am I trying to mount the XFS data partitions contained within with would= be made up of /dev/sd[abcde2]? I am a little bit confused by all the vario= us options and what I am exactly suppose to use given being a complete linu= x novice. Any help is appreciated? Rob > Date: Fri=2C 14 Nov 2014 17:40:10 -0600 > From: sandeen@sandeen.net > To: lists@colorremedies.com=3B robtench@hotmail.com > CC: xfs@oss.sgi.com > Subject: Re: Mismatch UUID >=20 > On 11/14/14 4:31 PM=2C Chris Murphy wrote: >=20 > > It=92s very good to ask instead of haphazardly trying things. Trying to > > normally mount the file system should be safe=3B and then use dmesg to > > check for kernel messages. The xfs kernel code is responsible for log > > replay and making most kinds of repairs=2C anything it can=92t deal wit= h > > will be reported as a kernel message. If mount fails=2C report kernel > > xfs related messages=2C and also the results from xfs_check -n. >=20 > xfs_repair -n >=20 > xfs_check is deprecated and has no -n option =3B) >=20 > -Eric = --_11767b43-37f7-42b5-a31a-efa393c893ba_ Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable
Hi all=2C

Many thanks for= the replies so far.

So here is the reponse from the command line md= adm -E /dev/sd[abcde]2

ubuntu@ubuntu:~$ sudo mdadm -E /dev/sd[abcde]= 2
/dev/sda2:
 =3B =3B =3B =3B =3B =3B =3B=  =3B =3B Magic : a92b4efc
 =3B =3B =3B =3B = =3B =3B =3B Version : 1.0
 =3B =3B =3B Feature Map := 0x0
 =3B =3B =3B =3B Array UUID : e0829810:9782b51f:255= 29f65:8823419c
 =3B =3B =3B =3B =3B =3B =3B&= nbsp=3B =3B =3B Name : (none):4
 =3B Creation Time : Fri Jan=  =3B 1 01:31:17 2010
 =3B =3B =3B =3B Raid Level : r= aid5
 =3B =3B Raid Devices : 5

 =3BAvail Dev Size : 5= 856481280 (2792.59 GiB 2998.52 GB)
 =3B =3B =3B =3B Arra= y Size : 11712962560 (11170.35 GiB 11994.07 GB)
 =3B =3B Super O= ffset : 5856481536 sectors
 =3B =3B =3B =3B =3B = =3B =3B =3B =3B State : clean
 =3B =3B =3B Devic= e UUID : d405d0c5:2a07d7ed:27abcb5a:0eeadc7d

 =3B =3B = =3B Update Time : Fri Nov 14 15:58:16 2014
 =3B =3B =3B = =3B =3B =3B Checksum : c082e9bb - correct
 =3B =3B = =3B =3B =3B =3B =3B =3B Events : 1243386

 = =3B =3B =3B =3B =3B =3B =3B =3B Layout : left-s= ymmetric
 =3B =3B =3B =3B Chunk Size : 512K

 = =3B =3B Device Role : Active device 0
 =3B =3B Array State := AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing)
/dev/sdb2:
 =3B&= nbsp=3B =3B =3B =3B =3B =3B =3B =3B Magic : a92= b4efc
 =3B =3B =3B =3B =3B =3B =3B Version := 1.0
 =3B =3B =3B Feature Map : 0x0
 =3B =3B = =3B =3B Array UUID : e0829810:9782b51f:25529f65:8823419c
 =3B&nb= sp=3B =3B =3B =3B =3B =3B =3B =3B =3B Name = : (none):4
 =3B Creation Time : Fri Jan =3B 1 01:31:17 2010
&= nbsp=3B =3B =3B =3B Raid Level : raid5
 =3B =3B Raid= Devices : 5

 =3BAvail Dev Size : 5856481280 (2792.59 GiB 2998.5= 2 GB)
 =3B =3B =3B =3B Array Size : 11712962560 (11170.3= 5 GiB 11994.07 GB)
 =3B =3B Super Offset : 5856481536 sectors =3B =3B =3B =3B =3B =3B =3B =3B =3B S= tate : clean
 =3B =3B =3B Device UUID : 33acf23a:52a0ad00:cd= a69d9f:468a8c13

 =3B =3B =3B Update Time : Fri Nov 14 15= :58:16 2014
 =3B =3B =3B =3B =3B =3B Checksum : = 22fdc525 - correct
 =3B =3B =3B =3B =3B =3B = =3B =3B Events : 1243386

 =3B =3B =3B =3B = =3B =3B =3B =3B Layout : left-symmetric
 =3B =3B&nbs= p=3B =3B Chunk Size : 512K

 =3B =3B Device Role : Active= device 1
 =3B =3B Array State : AAAAA ('A' =3D=3D active=2C '.'= =3D=3D missing)
/dev/sdc2:
 =3B =3B =3B =3B =3B&= nbsp=3B =3B =3B =3B Magic : a92b4efc
 =3B =3B = =3B =3B =3B =3B =3B Version : 1.0
 =3B =3B = =3B Feature Map : 0x0
 =3B =3B =3B =3B Array UUID : e082= 9810:9782b51f:25529f65:8823419c
 =3B =3B =3B =3B =3B=  =3B =3B =3B =3B =3B Name : (none):4
 =3B Creati= on Time : Fri Jan =3B 1 01:31:17 2010
 =3B =3B =3B = =3B Raid Level : raid5
 =3B =3B Raid Devices : 5

 =3B= Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB)
 =3B =3B&nb= sp=3B =3B Array Size : 11712962560 (11170.35 GiB 11994.07 GB)
 = =3B =3B Super Offset : 5856481536 sectors
 =3B =3B =3B&n= bsp=3B =3B =3B =3B =3B =3B State : clean
 =3B&nb= sp=3B =3B Device UUID : 1a4f20e2:34926568:af5351a1:9c9f60e9

&nbs= p=3B =3B =3B Update Time : Fri Nov 14 15:58:16 2014
 =3B&nbs= p=3B =3B =3B =3B =3B Checksum : 96b21ac - correct
 = =3B =3B =3B =3B =3B =3B =3B =3B Events : 124338= 6

 =3B =3B =3B =3B =3B =3B =3B =3B L= ayout : left-symmetric
 =3B =3B =3B =3B Chunk Size : 512= K

 =3B =3B Device Role : Active device 2
 =3B =3B= Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missing)
/dev/sdd2= :
 =3B =3B =3B =3B =3B =3B =3B =3B = =3B Magic : a92b4efc
 =3B =3B =3B =3B =3B =3B&nb= sp=3B Version : 1.0
 =3B =3B =3B Feature Map : 0x0
 = =3B =3B =3B =3B Array UUID : e0829810:9782b51f:25529f65:8823419= c
 =3B =3B =3B =3B =3B =3B =3B =3B = =3B =3B Name : (none):4
 =3B Creation Time : Fri Jan =3B 1 0= 1:31:17 2010
 =3B =3B =3B =3B Raid Level : raid5
&nbs= p=3B =3B Raid Devices : 5

 =3BAvail Dev Size : 5856481280 (2= 792.59 GiB 2998.52 GB)
 =3B =3B =3B =3B Array Size : 117= 12962560 (11170.35 GiB 11994.07 GB)
 =3B =3B Super Offset : 5856= 481536 sectors
 =3B =3B =3B =3B =3B =3B =3B&= nbsp=3B =3B State : clean
 =3B =3B =3B Device UUID : 0ee= 6b711:242fbd18:44c2839e:60e8ad0d

 =3B =3B =3B Update Tim= e : Fri Nov 14 15:58:16 2014
 =3B =3B =3B =3B =3B&nb= sp=3B Checksum : ada0762 - correct
 =3B =3B =3B =3B = =3B =3B =3B =3B Events : 1243386

 =3B =3B = =3B =3B =3B =3B =3B =3B Layout : left-symmetric
&nbs= p=3B =3B =3B =3B Chunk Size : 512K

 =3B =3B Devi= ce Role : Active device 3
 =3B =3B Array State : AAAAA ('A' =3D= =3D active=2C '.' =3D=3D missing)
/dev/sde2:
 =3B =3B =3B=  =3B =3B =3B =3B =3B =3B Magic : a92b4efc
 = =3B =3B =3B =3B =3B =3B =3B Version : 1.0
 = =3B =3B =3B Feature Map : 0x0
 =3B =3B =3B =3B A= rray UUID : e0829810:9782b51f:25529f65:8823419c
 =3B =3B =3B=  =3B =3B =3B =3B =3B =3B =3B Name : (none):4 =3B Creation Time : Fri Jan =3B 1 01:31:17 2010
 =3B = =3B =3B =3B Raid Level : raid5
 =3B =3B Raid Devices : 5=

 =3BAvail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB)
&nb= sp=3B =3B =3B =3B Array Size : 11712962560 (11170.35 GiB 11994.= 07 GB)
 =3B =3B Super Offset : 5856481536 sectors
 =3B&nb= sp=3B =3B =3B =3B =3B =3B =3B =3B State : clean=
 =3B =3B =3B Device UUID : f89fdd4c:627a6650:3de0dcab:67900= 76f

 =3B =3B =3B Update Time : Fri Nov 14 15:58:16 2014<= br> =3B =3B =3B =3B =3B =3B Checksum : ec5bd289 - c= orrect
 =3B =3B =3B =3B =3B =3B =3B =3B = Events : 1243386

 =3B =3B =3B =3B =3B =3B&nb= sp=3B =3B Layout : left-symmetric
 =3B =3B =3B =3B C= hunk Size : 512K

 =3B =3B Device Role : Active device 4
&= nbsp=3B =3B Array State : AAAAA ('A' =3D=3D active=2C '.' =3D=3D missin= g)


What I am curious about is how I should go about attempt= ing to Mount the device and the command line needed. Am I mounting the Raid= Array /dev/md4=2C or am I trying to mount the XFS data partitions containe= d within with would be made up of /dev/sd[abcde2]? I am a little bit confus= ed by all the various options and what I am exactly suppose to use given be= ing a complete linux novice.

Any help is appreciated?

Rob
=

>=3B Date: Fri=2C 14 Nov 2014 17:40:10 -0600
>=3B From: sand= een@sandeen.net
>=3B To: lists@colorremedies.com=3B robtench@hotmail.c= om
>=3B CC: xfs@oss.sgi.com
>=3B Subject: Re: Mismatch UUID
&g= t=3B
>=3B On 11/14/14 4:31 PM=2C Chris Murphy wrote:
>=3B
&g= t=3B >=3B It=92s very good to ask instead of haphazardly trying things. T= rying to
>=3B >=3B normally mount the file system should be safe=3B = and then use dmesg to
>=3B >=3B check for kernel messages. The xfs k= ernel code is responsible for log
>=3B >=3B replay and making most k= inds of repairs=2C anything it can=92t deal with
>=3B >=3B will be r= eported as a kernel message. If mount fails=2C report kernel
>=3B >= =3B xfs related messages=2C and also the results from xfs_check -n.
>= =3B
>=3B xfs_repair -n
>=3B
>=3B xfs_check is deprecated a= nd has no -n option =3B)
>=3B
>=3B -Eric
= --_11767b43-37f7-42b5-a31a-efa393c893ba_-- From robtench@hotmail.com Fri Nov 14 20:58:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E03A7F58 for ; Fri, 14 Nov 2014 20:58:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 67A36304043 for ; Fri, 14 Nov 2014 18:58:17 -0800 (PST) X-ASG-Debug-ID: 1416020295-04cb6c05735d2f0001-NocioJ Received: from BLU004-OMC3S32.hotmail.com (blu004-omc3s32.hotmail.com [65.55.116.107]) by cuda.sgi.com with ESMTP id hlMHHeFH3dYCnGAz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Nov 2014 18:58:15 -0800 (PST) X-Barracuda-Envelope-From: robtench@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.116.107 Received: from BLU172-W37 ([65.55.116.74]) by BLU004-OMC3S32.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Fri, 14 Nov 2014 18:58:15 -0800 X-TMN: [h6CRn8vx5/ZXfFr6uYc4Da2JBKEBNoo3la+gGPtbkxI=] X-Originating-Email: [robtench@hotmail.com] Message-ID: Content-Type: multipart/alternative; boundary="_72263632-d409-4d1b-9981-ae412709ee08_" From: Robert Tench To: Eric Sandeen , Chris Murphy , Brian Foster , "xfs@oss.sgi.com" Subject: RE: Mismatch UUID Date: Sat, 15 Nov 2014 13:58:14 +1100 X-ASG-Orig-Subj: RE: Mismatch UUID Importance: Normal In-Reply-To: <546692DA.9040105@sandeen.net> References: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com>,<546692DA.9040105@sandeen.net> MIME-Version: 1.0 X-OriginalArrivalTime: 15 Nov 2014 02:58:15.0414 (UTC) FILETIME=[0045E960:01D00080] X-Barracuda-Connect: blu004-omc3s32.hotmail.com[65.55.116.107] X-Barracuda-Start-Time: 1416020295 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11609 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_72263632-d409-4d1b-9981-ae412709ee08_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable Hi all=2C So I used mount command mount -o ro /dev/md4 /xfs (after having made the x= fs directory) Returned with saying 'Structure needs cleaning' Here are parts of the dmesg relating to the raid array and the attempted mo= unting [ 12.359728] EXT4-fs (sda7): mounting ext3 file system using the ext4 sub= system [ 12.361314] EXT4-fs (sda7): mounted filesystem with ordered data mode. O= pts: (null) [ 14.382337] sde: sde1 sde2 sde3 sde4 sde5 sde6 sde7 sde8 sde9 sde10 [ 14.388298] sd 4:0:0:0: [sde] No Caching mode page found [ 14.388303] sd 4:0:0:0: [sde] Assuming drive cache: write through [ 14.388308] sd 4:0:0:0: [sde] Attached SCSI disk [ 14.676543] md: bind [ 14.681538] md: kicking non-fresh sdd8 from array! [ 14.681544] md: unbind [ 14.700028] md: export_rdev(sdd8) [ 14.700055] md: kicking non-fresh sdb8 from array! [ 14.700063] md: unbind [ 14.708021] md: export_rdev(sdb8) [ 14.709145] md/raid1:md1: active with 3 out of 5 mirrors [ 14.709165] md1: detected capacity change from 0 to 863567872 [ 14.713570] md: bind [ 14.713663] md1: unknown partition table [ 14.715628] md: kicking non-fresh sdd5 from array! [ 14.715635] md: unbind [ 14.724074] md: export_rdev(sdd5) [ 14.724095] md: kicking non-fresh sdb5 from array! [ 14.724102] md: unbind [ 14.736021] md: export_rdev(sdb5) [ 14.737203] md/raid1:md3: active with 3 out of 5 mirrors [ 14.737222] md3: detected capacity change from 0 to 262078464 [ 14.739508] md3: unknown partition table [ 14.742037] md: bind [ 14.748793] md: bind [ 14.749250] md/raid:md4: device sde2 operational as raid disk 4 [ 14.749252] md/raid:md4: device sdd2 operational as raid disk 3 [ 14.749254] md/raid:md4: device sda2 operational as raid disk 0 [ 14.749255] md/raid:md4: device sdb2 operational as raid disk 1 [ 14.749257] md/raid:md4: device sdc2 operational as raid disk 2 [ 14.749707] md/raid:md4: allocated 0kB [ 14.749814] md/raid:md4: raid level 5 active with 5 out of 5 devices=2C = algorithm 2 [ 14.749815] RAID conf printout: [ 14.749816] --- level:5 rd:5 wd:5 [ 14.749818] disk 0=2C o:1=2C dev:sda2 [ 14.749820] disk 1=2C o:1=2C dev:sdb2 [ 14.749821] disk 2=2C o:1=2C dev:sdc2 [ 14.749823] disk 3=2C o:1=2C dev:sdd2 [ 14.749824] disk 4=2C o:1=2C dev:sde2 [ 14.749846] md4: detected capacity change from 0 to 11994073661440 [ 14.769544] md: kicking non-fresh sdd9 from array! [ 14.769553] md: unbind [ 14.770503] md4: unknown partition table [ 14.784024] md: export_rdev(sdd9) [ 14.784040] md: kicking non-fresh sdb9 from array! [ 14.784045] md: unbind [ 14.796026] md: export_rdev(sdb9) [ 14.797259] md/raid1:md2: active with 3 out of 5 mirrors [ 14.797278] md2: detected capacity change from 0 to 896466944 [ 14.804201] md2: unknown partition table [ 15.536766] EXT4-fs (sdb8): mounting ext3 file system using the ext4 sub= system [ 15.556508] EXT4-fs (sdb8): mounted filesystem with ordered data mode. O= pts: (null) [ 15.575379] EXT4-fs (sdb9): mounting ext3 file system using the ext4 sub= system [ 15.581829] EXT4-fs (sdb9): mounted filesystem with ordered data mode. O= pts: (null) [ 16.044429] sd 5:0:0:0: [sdf] 60499968 512-byte logical blocks: (30.9 GB= /28.8 GiB) [ 16.045044] sd 5:0:0:0: [sdf] Write Protect is off [ 16.045049] sd 5:0:0:0: [sdf] Mode Sense: 23 00 00 00 [ 16.045669] sd 5:0:0:0: [sdf] No Caching mode page found [ 16.045673] sd 5:0:0:0: [sdf] Assuming drive cache: write through [ 16.049167] sd 5:0:0:0: [sdf] No Caching mode page found [ 16.049172] sd 5:0:0:0: [sdf] Assuming drive cache: write through [ 16.072442] sdf: sdf1 [ 16.075294] sd 5:0:0:0: [sdf] No Caching mode page found [ 16.075299] sd 5:0:0:0: [sdf] Assuming drive cache: write through [ 16.075303] sd 5:0:0:0: [sdf] Attached SCSI removable disk [ 38.533458] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 39.643476] FAT-fs (sdf1): Volume was not properly unmounted. Some data = may be corrupt. Please run fsck. [ 40.485718] EXT4-fs (loop1): mounting ext2 file system using the ext4 su= bsystem [ 40.489678] EXT4-fs (loop1): warning: mounting unchecked fs=2C running e= 2fsck is recommended [ 40.495984] EXT4-fs (loop1): mounted filesystem without journal. Opts: (= null) [ 88.354507] Adding 255932k swap on /dev/sdb5. Priority:-1 extents:1 acr= oss:255932k FS [ 88.359216] Adding 255932k swap on /dev/sdd5. Priority:-2 extents:1 acr= oss:255932k FS [ 1636.143467] systemd-hostnamed[20496]: Warning: nss-myhostname is not ins= talled. Changing the local hostname might make it unresolveable. Please ins= tall nss-myhostname! [ 1918.676658] SGI XFS with ACLs=2C security attributes=2C realtime=2C larg= e block/inode numbers=2C no debug enabled [ 1925.660198] XFS (md4): Mounting Filesystem [ 1925.824734] XFS (md4): log has mismatched uuid - can't recover [ 1925.824748] XFS (md4): failed to find log head [ 1925.824751] XFS (md4): log mount/recovery failed: error 117 [ 1925.824793] XFS (md4): log mount failed [ 2049.523180] systemd-hostnamed[21362]: Warning: nss-myhostname is not ins= talled. Changing the local hostname might make it unresolveable. Please ins= tall nss-myhostname! [20679.813021] XFS (md4): Mounting Filesystem [20679.884528] XFS (md4): log has mismatched uuid - can't recover [20679.884542] XFS (md4): failed to find log head [20679.884545] XFS (md4): log mount/recovery failed: error 117 [20679.884590] XFS (md4): log mount failed [21024.505390] XFS (md4): Mounting Filesystem [21024.601886] XFS (md4): log has mismatched uuid - can't recover [21024.601900] XFS (md4): failed to find log head [21024.601903] XFS (md4): log mount/recovery failed: error 117 [21024.601946] XFS (md4): log mount failed [21672.562447] XFS (md4): Mounting Filesystem [21672.617195] XFS (md4): log has mismatched uuid - can't recover [21672.617209] XFS (md4): failed to find log head [21672.617212] XFS (md4): log mount/recovery failed: error 117 [21672.617246] XFS (md4): log mount failed Rob > Date: Fri=2C 14 Nov 2014 17:40:10 -0600 > From: sandeen@sandeen.net > To: lists@colorremedies.com=3B robtench@hotmail.com > CC: xfs@oss.sgi.com > Subject: Re: Mismatch UUID >=20 > On 11/14/14 4:31 PM=2C Chris Murphy wrote: >=20 > > It=92s very good to ask instead of haphazardly trying things. Trying to > > normally mount the file system should be safe=3B and then use dmesg to > > check for kernel messages. The xfs kernel code is responsible for log > > replay and making most kinds of repairs=2C anything it can=92t deal wit= h > > will be reported as a kernel message. If mount fails=2C report kernel > > xfs related messages=2C and also the results from xfs_check -n. >=20 > xfs_repair -n >=20 > xfs_check is deprecated and has no -n option =3B) >=20 > -Eric = --_72263632-d409-4d1b-9981-ae412709ee08_ Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable
Hi all=2C

So I used mount= command mount -o ro /dev/md4 /xfs =3B (after having made the xfs direc= tory)

Returned with saying 'Structure needs cleaning'

Here ar= e parts of the dmesg relating to the raid array and the attempted mounting<= br>[ =3B =3B 12.359728] EXT4-fs (sda7): mounting ext3 file system u= sing the ext4 subsystem
[ =3B =3B 12.361314] EXT4-fs (sda7): mou= nted filesystem with ordered data mode. Opts: (null)
[ =3B =3B 1= 4.382337] =3B sde: sde1 sde2 sde3 sde4 sde5 sde6 sde7 sde8 sde9 sde10[ =3B =3B 14.388298] sd 4:0:0:0: [sde] No Caching mode page found=
[ =3B =3B 14.388303] sd 4:0:0:0: [sde] Assuming drive cache: wr= ite through
[ =3B =3B 14.388308] sd 4:0:0:0: [sde] Attached SCSI= disk
[ =3B =3B 14.676543] md: bind<=3Bsde8>=3B
[ =3B=  =3B 14.681538] md: kicking non-fresh sdd8 from array!
[ =3B&nbs= p=3B 14.681544] md: unbind<=3Bsdd8>=3B
[ =3B =3B 14.700028] = md: export_rdev(sdd8)
[ =3B =3B 14.700055] md: kicking non-fresh= sdb8 from array!
[ =3B =3B 14.700063] md: unbind<=3Bsdb8>= =3B
[ =3B =3B 14.708021] md: export_rdev(sdb8)
[ =3B = =3B 14.709145] md/raid1:md1: active with 3 out of 5 mirrors
[ =3B&nb= sp=3B 14.709165] md1: detected capacity change from 0 to 863567872
[&nbs= p=3B =3B 14.713570] md: bind<=3Bsde5>=3B
[ =3B =3B 14.71= 3663] =3B md1: unknown partition table
[ =3B =3B 14.715628] = md: kicking non-fresh sdd5 from array!
[ =3B =3B 14.715635] md: = unbind<=3Bsdd5>=3B
[ =3B =3B 14.724074] md: export_rdev(sdd5= )
[ =3B =3B 14.724095] md: kicking non-fresh sdb5 from array![ =3B =3B 14.724102] md: unbind<=3Bsdb5>=3B
[ =3B = =3B 14.736021] md: export_rdev(sdb5)
[ =3B =3B 14.737203] md/rai= d1:md3: active with 3 out of 5 mirrors
[ =3B =3B 14.737222] md3:= detected capacity change from 0 to 262078464
[ =3B =3B 14.73950= 8] =3B md3: unknown partition table
[ =3B =3B 14.742037] md:= bind<=3Bsde2>=3B
[ =3B =3B 14.748793] md: bind<=3Bsde9>= =3B
[ =3B =3B 14.749250] md/raid:md4: device sde2 operational as= raid disk 4
[ =3B =3B 14.749252] md/raid:md4: device sdd2 opera= tional as raid disk 3
[ =3B =3B 14.749254] md/raid:md4: device s= da2 operational as raid disk 0
[ =3B =3B 14.749255] md/raid:md4:= device sdb2 operational as raid disk 1
[ =3B =3B 14.749257] md/= raid:md4: device sdc2 operational as raid disk 2
[ =3B =3B 14.74= 9707] md/raid:md4: allocated 0kB
[ =3B =3B 14.749814] md/raid:md= 4: raid level 5 active with 5 out of 5 devices=2C algorithm 2
[ =3B&= nbsp=3B 14.749815] RAID conf printout:
[ =3B =3B 14.749816] = =3B --- level:5 rd:5 wd:5
[ =3B =3B 14.749818] =3B disk 0=2C= o:1=2C dev:sda2
[ =3B =3B 14.749820] =3B disk 1=2C o:1=2C d= ev:sdb2
[ =3B =3B 14.749821] =3B disk 2=2C o:1=2C dev:sdc2[ =3B =3B 14.749823] =3B disk 3=2C o:1=2C dev:sdd2
[ = =3B =3B 14.749824] =3B disk 4=2C o:1=2C dev:sde2
[ =3B = =3B 14.749846] md4: detected capacity change from 0 to 11994073661440
[&= nbsp=3B =3B 14.769544] md: kicking non-fresh sdd9 from array!
[ = =3B =3B 14.769553] md: unbind<=3Bsdd9>=3B
[ =3B =3B 14.7= 70503] =3B md4: unknown partition table
[ =3B =3B 14.784024]= md: export_rdev(sdd9)
[ =3B =3B 14.784040] md: kicking non-fres= h sdb9 from array!
[ =3B =3B 14.784045] md: unbind<=3Bsdb9>= =3B
[ =3B =3B 14.796026] md: export_rdev(sdb9)
[ =3B = =3B 14.797259] md/raid1:md2: active with 3 out of 5 mirrors
[ =3B&nb= sp=3B 14.797278] md2: detected capacity change from 0 to 896466944
[&nbs= p=3B =3B 14.804201] =3B md2: unknown partition table
[ =3B&n= bsp=3B 15.536766] EXT4-fs (sdb8): mounting ext3 file system using the ext4 = subsystem
[ =3B =3B 15.556508] EXT4-fs (sdb8): mounted filesyste= m with ordered data mode. Opts: (null)
[ =3B =3B 15.575379] EXT4= -fs (sdb9): mounting ext3 file system using the ext4 subsystem
[ =3B=  =3B 15.581829] EXT4-fs (sdb9): mounted filesystem with ordered data mo= de. Opts: (null)
[ =3B =3B 16.044429] sd 5:0:0:0: [sdf] 60499968= 512-byte logical blocks: (30.9 GB/28.8 GiB)
[ =3B =3B 16.045044= ] sd 5:0:0:0: [sdf] Write Protect is off
[ =3B =3B 16.045049] sd= 5:0:0:0: [sdf] Mode Sense: 23 00 00 00
[ =3B =3B 16.045669] sd = 5:0:0:0: [sdf] No Caching mode page found
[ =3B =3B 16.045673] s= d 5:0:0:0: [sdf] Assuming drive cache: write through
[ =3B =3B 1= 6.049167] sd 5:0:0:0: [sdf] No Caching mode page found
[ =3B =3B= 16.049172] sd 5:0:0:0: [sdf] Assuming drive cache: write through
[ = =3B =3B 16.072442] =3B sdf: sdf1
[ =3B =3B 16.075294] sd= 5:0:0:0: [sdf] No Caching mode page found
[ =3B =3B 16.075299] = sd 5:0:0:0: [sdf] Assuming drive cache: write through
[ =3B =3B = 16.075303] sd 5:0:0:0: [sdf] Attached SCSI removable disk
[ =3B = =3B 38.533458] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ = =3B =3B 39.643476] FAT-fs (sdf1): Volume was not properly unmounted. So= me data may be corrupt. Please run fsck.
[ =3B =3B 40.485718] EX= T4-fs (loop1): mounting ext2 file system using the ext4 subsystem
[ = =3B =3B 40.489678] EXT4-fs (loop1): warning: mounting unchecked fs=2C r= unning e2fsck is recommended
[ =3B =3B 40.495984] EXT4-fs (loop1= ): mounted filesystem without journal. Opts: (null)
[ =3B =3B 88= .354507] Adding 255932k swap on /dev/sdb5. =3B Priority:-1 extents:1 ac= ross:255932k FS
[ =3B =3B 88.359216] Adding 255932k swap on /dev= /sdd5. =3B Priority:-2 extents:1 across:255932k FS


[ 1636.14= 3467] systemd-hostnamed[20496]: Warning: nss-myhostname is not installed. C= hanging the local hostname might make it unresolveable. Please install nss-= myhostname!
[ 1918.676658] SGI XFS with ACLs=2C security attributes=2C r= ealtime=2C large block/inode numbers=2C no debug enabled
[ 1925.660198] = XFS (md4): Mounting Filesystem
[ 1925.824734] XFS (md4): log has mismatc= hed uuid - can't recover
[ 1925.824748] XFS (md4): failed to find log he= ad
[ 1925.824751] XFS (md4): log mount/recovery failed: error 117
[ 1= 925.824793] XFS (md4): log mount failed
[ 2049.523180] systemd-hostnamed= [21362]: Warning: nss-myhostname is not installed. Changing the local hostn= ame might make it unresolveable. Please install nss-myhostname!
[20679.8= 13021] XFS (md4): Mounting Filesystem
[20679.884528] XFS (md4): log has = mismatched uuid - can't recover
[20679.884542] XFS (md4): failed to find= log head
[20679.884545] XFS (md4): log mount/recovery failed: error 117=
[20679.884590] XFS (md4): log mount failed
[21024.505390] XFS (md4):= Mounting Filesystem
[21024.601886] XFS (md4): log has mismatched uuid -= can't recover
[21024.601900] XFS (md4): failed to find log head
[210= 24.601903] XFS (md4): log mount/recovery failed: error 117
[21024.601946= ] XFS (md4): log mount failed
[21672.562447] XFS (md4): Mounting Filesys= tem
[21672.617195] XFS (md4): log has mismatched uuid - can't recover[21672.617209] XFS (md4): failed to find log head
[21672.617212] XFS (m= d4): log mount/recovery failed: error 117
[21672.617246] XFS (md4): log = mount failed

Rob

>=3B Date: Fri=2C 14 Nov 2014 17:40:1= 0 -0600
>=3B From: sandeen@sandeen.net
>=3B To: lists@colorremedi= es.com=3B robtench@hotmail.com
>=3B CC: xfs@oss.sgi.com
>=3B Subj= ect: Re: Mismatch UUID
>=3B
>=3B On 11/14/14 4:31 PM=2C Chris Mu= rphy wrote:
>=3B
>=3B >=3B It=92s very good to ask instead of = haphazardly trying things. Trying to
>=3B >=3B normally mount the fi= le system should be safe=3B and then use dmesg to
>=3B >=3B check fo= r kernel messages. The xfs kernel code is responsible for log
>=3B >= =3B replay and making most kinds of repairs=2C anything it can=92t deal wit= h
>=3B >=3B will be reported as a kernel message. If mount fails=2C = report kernel
>=3B >=3B xfs related messages=2C and also the results= from xfs_check -n.
>=3B
>=3B xfs_repair -n
>=3B
>=3B= xfs_check is deprecated and has no -n option =3B)
>=3B
>=3B -Er= ic


= --_72263632-d409-4d1b-9981-ae412709ee08_-- From bfoster@redhat.com Sat Nov 15 08:27:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D207F7F3F for ; Sat, 15 Nov 2014 08:27:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7043BAC006 for ; Sat, 15 Nov 2014 06:27:38 -0800 (PST) X-ASG-Debug-ID: 1416061654-04bdf061606f340001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kKeqwpMJFAPrXegY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Nov 2014 06:27:34 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAFERWXN006677 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 15 Nov 2014 09:27:32 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAFERWfx012933; Sat, 15 Nov 2014 09:27:32 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4BD6E122F87; Sat, 15 Nov 2014 09:27:31 -0500 (EST) Date: Sat, 15 Nov 2014 09:27:31 -0500 From: Brian Foster To: Robert Tench Cc: xfs@oss.sgi.com Subject: Re: Mismatch UUID Message-ID: <20141115142730.GA54930@bfoster.bfoster> X-ASG-Orig-Subj: Re: Mismatch UUID References: <20141114134208.GB36731@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416061654 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 (Re-CC xfs list) On Sat, Nov 15, 2014 at 08:10:18AM +1100, Robert Tench wrote: > Hi Brian, > > Thanks for your reply. > > I had run xfs_repair -n previously which spewed out a ton of stuff, in the last email you would have received, there should be a link to hotmail onedrive where you could view the output of that command, I called it xfs.log > I didn't see a link in the plaintext of the message. I see something now buried in an html attachment that my mailer doesn't interpret very well, and the link doesn't appear to work. > If I try to mount the array, it comes back with 'Structure needs Cleaning' and won't mount. > > When I tried to reassemble the array, it would only begin with 2 of the 5 drives, as I know that 3 of the drives had different update times and were out of sync. > > I ended up doing a force assemble, which created the array and went into a resync process (really not sure if I did the right thing here). > It's been a while since I've played around with md raid. Do you have a command that you ran to put things back together? As was mentioned up-thread, using a create (-C) command could just force an array together in a particular geometry and write new metadata. This would make the array look fine afterwards, but then there's no way to know whether the array is actually in the original order and the data could very well be scrambled. Brian > As to the geometry of the raid, I hope I had it in the right order. I previously had a data recovery tech remote connect to my desktop who had a look at the array. He had also not been able to successfully mount the raid, it was him that told me the order of the drives, which happened to be the exact order of their placement in the drive bays of the lacie nas. > > Is there a way to check whether I have the correct geometry, or by doing the force assemble it would now be impossible to tell? > > The data recovery tech, was also having the same issue of mismatched UUID. > > Any help is appreciated, > > Rob > > > Date: Fri, 14 Nov 2014 08:42:08 -0500 > > From: bfoster@redhat.com > > To: robtench@hotmail.com > > CC: xfs@oss.sgi.com > > Subject: Re: Mismatch UUID > > > > On Fri, Nov 14, 2014 at 07:57:42PM +1100, Robert Tench wrote: > > > Robert has a file to share with you on OneDrive. To view it, click the link below. xfs.log So finally have managed to find a way to save the complete log of running xfs_repair -n /dev.md4 > > > > > > And below is the output of xfs_check /dev/md4 > > > > > > root@ubuntu:~# xfs_check /dev/md4 > > > * ERROR: mismatched uuid in log > > > * SB : 813833a7-1bd3-4447-b575-09d1471bb652 > > > * log: ea3833af-25ce-9f91-b575-018fb49df3b1 > > > ERROR: The filesystem has valuable metadata changes in a log which needs to > > > be replayed. Mount the filesystem to replay the log, and unmount it before > > > re-running xfs_check. If you are unable to mount the filesystem, then use > > > the xfs_repair -L option to destroy the log and attempt a repair. > > > Note that destroying the log may cause corruption -- please attempt a mount > > > of the filesystem before doing this. > > > > > > > You want to use xfs_repair (-n) rather than xfs_check. I think you > > mentioned in your other email you've tried xfs_repair..? The above > > message indicates a dirty log, have you attempted to mount the device to > > replay the log? > > > > > And the output from mdadm -D /dev/md4 is as follows > > > > > > > How did you put the array back together? Did it assemble fine or did you > > have to recreate it? If the latter, how are you sure the geometry is > > correct (it looks like it's syncing)? > > > > Brian > > > > > root@ubuntu:~# mdadm -D /dev/md4 > > > /dev/md4: > > > Version : 1.0 > > > Creation Time : Fri Jan 1 01:31:17 2010 > > > Raid Level : raid5 > > > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > > > Used Dev Size : 2928240640 (2792.59 GiB 2998.52 GB) > > > Raid Devices : 5 > > > Total Devices : 5 > > > Persistence : Superblock is persistent > > > > > > Update Time : Fri Nov 14 15:58:16 2014 > > > State : clean > > > Active Devices : 5 > > > Working Devices : 5 > > > Failed Devices : 0 > > > Spare Devices : 0 > > > > > > Layout : left-symmetric > > > Chunk Size : 512K > > > > > > Name : (none):4 > > > UUID : e0829810:9782b51f:25529f65:8823419c > > > Events : 1243386 > > > > > > Number Major Minor RaidDevice State > > > 0 8 2 0 active sync /dev/sda2 > > > 6 8 18 1 active sync /dev/sdb2 > > > 2 8 34 2 active sync /dev/sdc2 > > > 5 8 50 3 active sync /dev/sdd2 > > > 4 8 66 4 active sync /dev/sde2 > > > > > > > > > And then the response from mdadm -E /dev/md4 > > > > > > root@ubuntu:~# mdadm -E /dev/md4 > > > mdadm: No md superblock detected on /dev/md4. > > > > > > Not sure what to do, any help would be appreciated > > > > > > Regards, > > > > > > Rob > > > > > > > > > > > > > > > > > _______________________________________________ > > > xfs mailing list > > > xfs@oss.sgi.com > > > http://oss.sgi.com/mailman/listinfo/xfs > > > From bfoster@redhat.com Sat Nov 15 08:40:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 39D657F3F for ; Sat, 15 Nov 2014 08:40:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A0AB304048 for ; Sat, 15 Nov 2014 06:40:01 -0800 (PST) X-ASG-Debug-ID: 1416062400-04cb6c05736aee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2iApVv8BM134QNla (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Nov 2014 06:40:00 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAFEdrjG005283 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sat, 15 Nov 2014 09:39:54 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAFEdqw6007848; Sat, 15 Nov 2014 09:39:53 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D6752122F87; Sat, 15 Nov 2014 09:39:51 -0500 (EST) Date: Sat, 15 Nov 2014 09:39:51 -0500 From: Brian Foster To: Robert Tench Cc: Eric Sandeen , Chris Murphy , "xfs@oss.sgi.com" Subject: Re: Mismatch UUID Message-ID: <20141115143951.GB54930@bfoster.bfoster> X-ASG-Orig-Subj: Re: Mismatch UUID References: <6AB68617-0884-486D-8B96-8FD22DBC76D1@colorremedies.com> <546692DA.9040105@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416062400 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Nov 15, 2014 at 01:17:39PM +1100, Robert Tench wrote: > Hi all, > > Many thanks for the replies so far. > > So here is the reponse from the command line mdadm -E /dev/sd[abcde]2 > > ubuntu@ubuntu:~$ sudo mdadm -E /dev/sd[abcde]2 > /dev/sda2: > Magic : a92b4efc > Version : 1.0 > Feature Map : 0x0 > Array UUID : e0829810:9782b51f:25529f65:8823419c > Name : (none):4 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Raid Devices : 5 > > Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Super Offset : 5856481536 sectors > State : clean > Device UUID : d405d0c5:2a07d7ed:27abcb5a:0eeadc7d > > Update Time : Fri Nov 14 15:58:16 2014 > Checksum : c082e9bb - correct > Events : 1243386 > > Layout : left-symmetric > Chunk Size : 512K > > Device Role : Active device 0 > Array State : AAAAA ('A' == active, '.' == missing) > /dev/sdb2: > Magic : a92b4efc > Version : 1.0 > Feature Map : 0x0 > Array UUID : e0829810:9782b51f:25529f65:8823419c > Name : (none):4 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Raid Devices : 5 > > Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Super Offset : 5856481536 sectors > State : clean > Device UUID : 33acf23a:52a0ad00:cda69d9f:468a8c13 > > Update Time : Fri Nov 14 15:58:16 2014 > Checksum : 22fdc525 - correct > Events : 1243386 > > Layout : left-symmetric > Chunk Size : 512K > > Device Role : Active device 1 > Array State : AAAAA ('A' == active, '.' == missing) > /dev/sdc2: > Magic : a92b4efc > Version : 1.0 > Feature Map : 0x0 > Array UUID : e0829810:9782b51f:25529f65:8823419c > Name : (none):4 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Raid Devices : 5 > > Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Super Offset : 5856481536 sectors > State : clean > Device UUID : 1a4f20e2:34926568:af5351a1:9c9f60e9 > > Update Time : Fri Nov 14 15:58:16 2014 > Checksum : 96b21ac - correct > Events : 1243386 > > Layout : left-symmetric > Chunk Size : 512K > > Device Role : Active device 2 > Array State : AAAAA ('A' == active, '.' == missing) > /dev/sdd2: > Magic : a92b4efc > Version : 1.0 > Feature Map : 0x0 > Array UUID : e0829810:9782b51f:25529f65:8823419c > Name : (none):4 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Raid Devices : 5 > > Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Super Offset : 5856481536 sectors > State : clean > Device UUID : 0ee6b711:242fbd18:44c2839e:60e8ad0d > > Update Time : Fri Nov 14 15:58:16 2014 > Checksum : ada0762 - correct > Events : 1243386 > > Layout : left-symmetric > Chunk Size : 512K > > Device Role : Active device 3 > Array State : AAAAA ('A' == active, '.' == missing) > /dev/sde2: > Magic : a92b4efc > Version : 1.0 > Feature Map : 0x0 > Array UUID : e0829810:9782b51f:25529f65:8823419c > Name : (none):4 > Creation Time : Fri Jan 1 01:31:17 2010 > Raid Level : raid5 > Raid Devices : 5 > > Avail Dev Size : 5856481280 (2792.59 GiB 2998.52 GB) > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > Super Offset : 5856481536 sectors > State : clean > Device UUID : f89fdd4c:627a6650:3de0dcab:6790076f > > Update Time : Fri Nov 14 15:58:16 2014 > Checksum : ec5bd289 - correct > Events : 1243386 > > Layout : left-symmetric > Chunk Size : 512K > > Device Role : Active device 4 > Array State : AAAAA ('A' == active, '.' == missing) > > > What I am curious about is how I should go about attempting to Mount the device and the command line needed. Am I mounting the Raid Array /dev/md4, or am I trying to mount the XFS data partitions contained within with would be made up of /dev/sd[abcde2]? I am a little bit confused by all the various options and what I am exactly suppose to use given being a complete linux novice. > Normally the array (/dev/md*) is used directly, but I suppose it could be partitioned. It depends on how the storage is configured. It does look like you have several arrays configured from the log snippet in the subsequent mail. What does 'cat /proc/mdstat' on the box show? How about 'file -s /dev/md##' for each md device specified in the former output? Brian > Any help is appreciated? > > Rob > > > > Date: Fri, 14 Nov 2014 17:40:10 -0600 > > From: sandeen@sandeen.net > > To: lists@colorremedies.com; robtench@hotmail.com > > CC: xfs@oss.sgi.com > > Subject: Re: Mismatch UUID > > > > On 11/14/14 4:31 PM, Chris Murphy wrote: > > > > > It’s very good to ask instead of haphazardly trying things. Trying to > > > normally mount the file system should be safe; and then use dmesg to > > > check for kernel messages. The xfs kernel code is responsible for log > > > replay and making most kinds of repairs, anything it can’t deal with > > > will be reported as a kernel message. If mount fails, report kernel > > > xfs related messages, and also the results from xfs_check -n. > > > > xfs_repair -n > > > > xfs_check is deprecated and has no -n option ;) > > > > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From li.mengyang@stonybrook.edu Sat Nov 15 14:41:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 195537F3F for ; Sat, 15 Nov 2014 14:41:43 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 05420304043 for ; Sat, 15 Nov 2014 12:41:42 -0800 (PST) X-ASG-Debug-ID: 1416084101-04cb6c057373520001-NocioJ Received: from mail-ie0-f176.google.com (mail-ie0-f176.google.com [209.85.223.176]) by cuda.sgi.com with ESMTP id 9Ek80MaPjsdQktC9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 15 Nov 2014 12:41:41 -0800 (PST) X-Barracuda-Envelope-From: li.mengyang@stonybrook.edu X-Barracuda-Apparent-Source-IP: 209.85.223.176 Received: by mail-ie0-f176.google.com with SMTP id rd18so19183311iec.7 for ; Sat, 15 Nov 2014 12:41:41 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to:cc :content-type; bh=l0/zYuhS9nTmBJ/NI9SycbSlWYK7tZ10S/yoVaKZToQ=; b=YKyqUuf0jUzoUpGP3Zdd6YAia8rvanvXpi5iGUhPjEvIfPRUyg9NJxC8Lud042SngO tb4Vx+rtNN+TAUwy/vXdiYRNzMIWP1xjlhGZXkPDIQweXT9AQsZw5Y12Bxr/jQCMGXk+ J9y9ri+XirrOSlIV+hoU5T3Zp/YbCnmSEnHf16GrgZBnyLNDGnOBgm/IPGoYaFwnqfIQ dVtdqOKk0vFLgUm5mkjVnX2219KqY/qs4YqDJvjvjhzT4WALGR5XXPz5wvJrngY4trNw xNhXVTvGT5a+D1PnAYI4h9txHiJz3xuUqw9Z/9f5xdO02INlBuwla7bA5fzx+ZGD/5VW CS/g== X-Gm-Message-State: ALoCoQkArU1E9h059U9rGLiF7s8eiNVTmXKA+p3H2Ld6ARo/rkR5LTmAwyhicbjr4fqazhf3N+Lu MIME-Version: 1.0 X-Received: by 10.107.138.26 with SMTP id m26mr3692608iod.64.1416084101056; Sat, 15 Nov 2014 12:41:41 -0800 (PST) Received: by 10.64.9.227 with HTTP; Sat, 15 Nov 2014 12:41:39 -0800 (PST) Date: Sat, 15 Nov 2014 15:41:39 -0500 Message-ID: Subject: Support overlayfs testing. From: Li Mengyang X-ASG-Orig-Subj: Support overlayfs testing. To: xfs@oss.sgi.com Cc: miklos@szeredi.hu, Erez Zadok Content-Type: multipart/mixed; boundary=001a113ff6aad1097f0507ebc5d2 X-Barracuda-Connect: mail-ie0-f176.google.com[209.85.223.176] X-Barracuda-Start-Time: 1416084101 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a113ff6aad1097f0507ebc5d2 Content-Type: multipart/alternative; boundary=001a113ff6aad1097a0507ebc5d0 --001a113ff6aad1097a0507ebc5d0 Content-Type: text/plain; charset=UTF-8 Hi, Recently people are proposing overlayfs for inclusion into the mainline, I found it could be helpful if xfstests supports overlayfs testing. Here is the patch and example configuration file for that. Thank you. -- Regards, Li -------------------------------------- Mengyang Li / Computer Science, SUNYSB 6315047325/ li.mengyang@stonybrook.edu --001a113ff6aad1097a0507ebc5d0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi,
=C2=A0Recently people are proposing overlayfs for = inclusion into the mainline, I found it could be helpful if xfstests suppor= ts overlayfs testing. Here is the patch and example configuration file for = that. Thank you.

--
<= div dir=3D"ltr">
Regards,
Li
--------------------------------------
Mengya= ng Li=C2=A0/=C2=A0Computer Science, SUNYSB

6315047325/=C2= =A0li.mengyang@stonybrook.edu

--001a113ff6aad1097a0507ebc5d0-- --001a113ff6aad1097f0507ebc5d2 Content-Type: text/x-patch; charset=US-ASCII; name="0001-overlayfs-Add-support-for-overlayfs.patch" Content-Disposition: attachment; filename="0001-overlayfs-Add-support-for-overlayfs.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i2jfto5u0 RnJvbSA0ZWZhZmUwZjQzMTFiYzkxNDBhNjY3MzcwNTc2ZmRlMjRiODRmZWNiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNZW5neWFuZyBMaSA8bGkubWVuZ3lhbmdAc3Rvbnlicm9vay5l ZHU+CkRhdGU6IFNhdCwgMTUgTm92IDIwMTQgMTA6NTM6NDEgLTA1MDAKU3ViamVjdDogW1BBVENI IDEvMV0gb3ZlcmxheWZzOiBBZGQgc3VwcG9ydCBmb3Igb3ZlcmxheWZzCgoKU2lnbmVkLW9mZi1i eTogTWVuZ3lhbmcgTGkgPGxpLm1lbmd5YW5nQHN0b255YnJvb2suZWR1PgpTaWduZWQtb2ZmLWJ5 OiBFcmV6IFphZG9rIDxlemtAY3Muc3VueXNiLmVkdT4KLS0tCiBjb21tb24vcmMgICAgICAgICAg ICAgICAgfCAgIDIxICsrKysrKysrKysrKysrKysrKysrKwogY29uZmlncy9vdmVybGF5ZnMuY29u ZmlnIHwgICAxNiArKysrKysrKysrKysrKysrCiAyIGZpbGVzIGNoYW5nZWQsIDM3IGluc2VydGlv bnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBjb25maWdzL292ZXJsYXlmcy5jb25maWcKCmRpZmYg LS1naXQgYS9jb21tb24vcmMgYi9jb21tb24vcmMKaW5kZXggZDVlM2FmZi4uZWZhMGZhYyAxMDA2 NDQKLS0tIGEvY29tbW9uL3JjCisrKyBiL2NvbW1vbi9yYwpAQCAtMTEzMyw2ICsxMTMzLDI0IEBA IF9yZXF1aXJlX3Rlc3QoKQogCQkgICAgX25vdHJ1biAidGhpcyB0ZXN0IHJlcXVpcmVzIGEgdmFs aWQgXCRURVNUX0RJUiBhbmQgdW5pcXVlICRURVNUX0RFViIKIAkJZmkKIAkJOzsKKwlvdmVybGF5 ZnMpCisJCWlmIFsgLXogIiRPVkxGU19MT1dFUkRJUiIgLW8gISAtZCAiJE9WTEZTX0xPV0VSRElS IiBdOworCQl0aGVuCisJCSAgICBfbm90cnVuICJ0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCBc JE9WTEZTX0xPV0VSRElSIgorCQlmaQorCQlpZiBbIC16ICIkT1ZMRlNfVVBQRVJESVIiIC1vICEg LWQgIiRPVkxGU19VUFBFUkRJUiIgXTsKKwkJdGhlbgorCQkgICAgX25vdHJ1biAidGhpcyB0ZXN0 IHJlcXVpcmVzIGEgdmFsaWQgXCRPVkxGU19VUFBFUkRJUiIKKwkJZmkKKwkJaWYgWyAteiAiJE9W TEZTX1dPUktESVIiIC1vICEgLWQgIiRPVkxGU19XT1JLRElSIiBdOworCQl0aGVuCisJCSAgICBf bm90cnVuICJ0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCBcJE9WTEZTX1dPUktESVIiCisJCWZp CisJCWlmIFsgLXogIiRURVNUX0RJUiIgLW8gISAtZCAiJFRFU1RfRElSIiBdOworCQl0aGVuCisJ CSAgICBfbm90cnVuICJ0aGlzIHRlc3QgcmVxdWlyZXMgYSB2YWxpZCBcJFRFU1RfRElSIgorCQlm aQorCQk7OwogCSopCiAJCSBpZiBbIC16ICIkVEVTVF9ERVYiIC1vICJgX2lzX2Jsb2NrX2RldiAk VEVTVF9ERVZgIiA9ICIiIF0KIAkJIHRoZW4KQEAgLTE5NDcsNiArMTk2NSw5IEBAIF9jaGVja190 ZXN0X2ZzKCkKICAgICB0bXBmcykKIAkjIG5vIHdheSB0byBjaGVjayBjb25zaXN0ZW5jeSBmb3Ig dG1wZnMKIAk7OworICAgIG92ZXJsYXlmcykKKwkjIG5vIHdheSB0byBjaGVjayBjb25zaXN0ZW5j eSBmb3Igb3ZlcmxheWZzCisJOzsKICAgICAqKQogCV9jaGVja19nZW5lcmljX2ZpbGVzeXN0ZW0g JFRFU1RfREVWCiAJOzsKZGlmZiAtLWdpdCBhL2NvbmZpZ3Mvb3ZlcmxheWZzLmNvbmZpZyBiL2Nv bmZpZ3Mvb3ZlcmxheWZzLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li40MmVmOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9vdmVybGF5ZnMuY29uZmlnCkBA IC0wLDAgKzEsMTYgQEAKKyMgRXhhbXBsZSBjb25maWcgZm9yIG92ZXJsYXlmcworIyBzb3VyY2Ug bWUgYmVmb3JlIHJ1biAuL2NoZWNrCisKK2V4cG9ydCBPVkxGU19MT1dFUkRJUj0vbW50L292bGxv d2VyCitleHBvcnQgT1ZMRlNfVVBQRVJESVI9L21udC9vdmx1cHBlcgorZXhwb3J0IE9WTEZTX1dP UktESVI9L21udC93b3JrZGlyCisKK2V4cG9ydCBURVNUX0RJUj0vbW50L21lcmdlZAorZXhwb3J0 IFRFU1RfREVWPS9kZXYvbG9vcDAKKworZXhwb3J0IFRFU1RfRlNfTU9VTlRfT1BUUz0tb2xvd2Vy ZGlyPSRPVkxGU19MT1dFUkRJUixcCit1cHBlcmRpcj0kT1ZMRlNfVVBQRVJESVIsd29ya2Rpcj0k T1ZMRlNfV09SS0RJUgorCit1bnNldCBTQ1JBVENIX0RFVgordW5zZXQgU0NSQVRDSF9NTlQKK2V4 cG9ydCBGU1RZUD1vdmVybGF5ZnMKLS0gCjEuNy45LjUKCg== --001a113ff6aad1097f0507ebc5d2-- From robtench@hotmail.com Sat Nov 15 16:31:58 2014 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E51F97F3F for ; Sat, 15 Nov 2014 16:31:56 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9EBD3AC002 for ; Sat, 15 Nov 2014 14:31:52 -0800 (PST) X-ASG-Debug-ID: 1416090703-04cbb01e5ba0f30001-NocioJ Received: from BLU004-OMC4S7.hotmail.com (blu004-omc4s7.hotmail.com [65.55.111.146]) by cuda.sgi.com with ESMTP id d3xp1DWWBi6n3KmH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Nov 2014 14:31:43 -0800 (PST) X-Barracuda-Envelope-From: robtench@hotmail.com X-Barracuda-Apparent-Source-IP: 65.55.111.146 Received: from BLU172-W48 ([65.55.111.137]) by BLU004-OMC4S7.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.22751); Sat, 15 Nov 2014 14:31:42 -0800 X-TMN: [Vpjq7VNLm3Fggadu+Y5k6KGI0l59KcS4jfBajL/yDPw=] X-Originating-Email: [robtench@hotmail.com] Message-ID: Content-Type: multipart/mixed; boundary="_ac84ba17-d0a6-4978-b5ed-906ef566b17d_" From: Robert Tench To: Brian Foster CC: "xfs@oss.sgi.com" Subject: RE: Mismatch UUID Date: Sun, 16 Nov 2014 09:31:41 +1100 X-ASG-Orig-Subj: RE: Mismatch UUID Importance: Normal In-Reply-To: <20141115142730.GA54930@bfoster.bfoster> References: ,<20141114134208.GB36731@bfoster.bfoster>,,<20141115142730.GA54930@bfoster.bfoster> MIME-Version: 1.0 X-OriginalArrivalTime: 15 Nov 2014 22:31:42.0657 (UTC) FILETIME=[EE429B10:01D00123] X-Barracuda-Connect: blu004-omc4s7.hotmail.com[65.55.111.146] X-Barracuda-Start-Time: 1416090703 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 --_ac84ba17-d0a6-4978-b5ed-906ef566b17d_ Content-Type: multipart/alternative; boundary="_80795b56-43d4-4718-8254-bcdb0c73ae70_" --_80795b56-43d4-4718-8254-bcdb0c73ae70_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Brian=2C=20 Attached is the report back from running command xfs_repair -n that I tried= to post before. Rob > Date: Sat=2C 15 Nov 2014 09:27:31 -0500 > From: bfoster@redhat.com > To: robtench@hotmail.com > CC: xfs@oss.sgi.com > Subject: Re: Mismatch UUID >=20 > (Re-CC xfs list) >=20 > On Sat=2C Nov 15=2C 2014 at 08:10:18AM +1100=2C Robert Tench wrote: > > Hi Brian=2C > >=20 > > Thanks for your reply. > >=20 > > I had run xfs_repair -n previously which spewed out a ton of stuff=2C i= n the last email you would have received=2C there should be a link to hotma= il onedrive where you could view the output of that command=2C I called it = xfs.log > >=20 >=20 > I didn't see a link in the plaintext of the message. I see something now > buried in an html attachment that my mailer doesn't interpret very well= =2C > and the link doesn't appear to work. >=20 > > If I try to mount the array=2C it comes back with 'Structure needs Clea= ning' and won't mount. > >=20 > > When I tried to reassemble the array=2C it would only begin with 2 of t= he 5 drives=2C as I know that 3 of the drives had different update times an= d were out of sync. > >=20 > > I ended up doing a force assemble=2C which created the array and went i= nto a resync process (really not sure if I did the right thing here). > >=20 >=20 > It's been a while since I've played around with md raid. Do you have a > command that you ran to put things back together? As was mentioned > up-thread=2C using a create (-C) command could just force an array > together in a particular geometry and write new metadata. This would > make the array look fine afterwards=2C but then there's no way to know > whether the array is actually in the original order and the data could > very well be scrambled. >=20 > Brian >=20 > > As to the geometry of the raid=2C I hope I had it in the right order. I= previously had a data recovery tech remote connect to my desktop who had a= look at the array. He had also not been able to successfully mount the rai= d=2C it was him that told me the order of the drives=2C which happened to b= e the exact order of their placement in the drive bays of the lacie nas. > >=20 > > Is there a way to check whether I have the correct geometry=2C or by do= ing the force assemble it would now be impossible to tell? > >=20 > > The data recovery tech=2C was also having the same issue of mismatched = UUID. > >=20 > > Any help is appreciated=2C > >=20 > > Rob > >=20 > > > Date: Fri=2C 14 Nov 2014 08:42:08 -0500 > > > From: bfoster@redhat.com > > > To: robtench@hotmail.com > > > CC: xfs@oss.sgi.com > > > Subject: Re: Mismatch UUID > > >=20 > > > On Fri=2C Nov 14=2C 2014 at 07:57:42PM +1100=2C Robert Tench wrote: > > > > Robert = has a file to share with you on OneDrive. To view it=2C click the link belo= w. = xfs.log = So finally have managed to find a wa= y to save the complete log of running xfs_repair -n /dev.md4 > > > >=20 > > > > And below is the output of xfs_check /dev/md4 > > > >=20 > > > > root@ubuntu:~# xfs_check /dev/md4 > > > > * ERROR: mismatched uuid in log > > > > * SB : 813833a7-1bd3-4447-b575-09d1471bb652 > > > > * log: ea3833af-25ce-9f91-b575-018fb49df3b1 > > > > ERROR: The filesystem has valuable metadata changes in a log which = needs to > > > > be replayed. Mount the filesystem to replay the log=2C and unmount= it before > > > > re-running xfs_check. If you are unable to mount the filesystem=2C= then use > > > > the xfs_repair -L option to destroy the log and attempt a repair. > > > > Note that destroying the log may cause corruption -- please attempt= a mount > > > > of the filesystem before doing this. > > > >=20 > > >=20 > > > You want to use xfs_repair (-n) rather than xfs_check. I think you > > > mentioned in your other email you've tried xfs_repair..? The above > > > message indicates a dirty log=2C have you attempted to mount the devi= ce to > > > replay the log? > > >=20 > > > > And the output from mdadm -D /dev/md4 is as follows > > > >=20 > > >=20 > > > How did you put the array back together? Did it assemble fine or did = you > > > have to recreate it? If the latter=2C how are you sure the geometry i= s > > > correct (it looks like it's syncing)? > > >=20 > > > Brian > > >=20 > > > > root@ubuntu:~# mdadm -D /dev/md4 > > > > /dev/md4: > > > > Version : 1.0 > > > > Creation Time : Fri Jan 1 01:31:17 2010 > > > > Raid Level : raid5 > > > > Array Size : 11712962560 (11170.35 GiB 11994.07 GB) > > > > Used Dev Size : 2928240640 (2792.59 GiB 2998.52 GB) > > > > Raid Devices : 5 > > > > Total Devices : 5 > > > > Persistence : Superblock is persistent > > > >=20 > > > > Update Time : Fri Nov 14 15:58:16 2014 > > > > State : clean=20 > > > > Active Devices : 5 > > > > Working Devices : 5 > > > > Failed Devices : 0 > > > > Spare Devices : 0 > > > >=20 > > > > Layout : left-symmetric > > > > Chunk Size : 512K > > > >=20 > > > > Name : (none):4 > > > > UUID : e0829810:9782b51f:25529f65:8823419c > > > > Events : 1243386 > > > >=20 > > > > Number Major Minor RaidDevice State > > > > 0 8 2 0 active sync /dev/sda2 > > > > 6 8 18 1 active sync /dev/sdb2 > > > > 2 8 34 2 active sync /dev/sdc2 > > > > 5 8 50 3 active sync /dev/sdd2 > > > > 4 8 66 4 active sync /dev/sde2 > > > >=20 > > > >=20 > > > > And then the response from mdadm -E /dev/md4 > > > >=20 > > > > root@ubuntu:~# mdadm -E /dev/md4 > > > > mdadm: No md superblock detected on /dev/md4. > > > >=20 > > > > Not sure what to do=2C any help would be appreciated > > > >=20 > > > > Regards=2C > > > >=20 > > > > Rob > > > >=20 > > > >=20 > > > >=20 > > > > =20 > > >=20 > > > > _______________________________________________ > > > > xfs mailing list > > > > xfs@oss.sgi.com > > > > http://oss.sgi.com/mailman/listinfo/xfs > > >=20 > > =20 = --_80795b56-43d4-4718-8254-bcdb0c73ae70_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi Brian=2C

Attached is = the report back from running command xfs_repair -n that I tried to post bef= ore.

Rob

>=3B Date: Sat=2C 15 Nov 2014 09:27:31 -0500<= br>>=3B From: bfoster@redhat.com
>=3B To: robtench@hotmail.com
&g= t=3B CC: xfs@oss.sgi.com
>=3B Subject: Re: Mismatch UUID
>=3B >=3B (Re-CC xfs list)
>=3B
>=3B On Sat=2C Nov 15=2C 2014 at 0= 8:10:18AM +1100=2C Robert Tench wrote:
>=3B >=3B Hi Brian=2C
>= =3B >=3B
>=3B >=3B Thanks for your reply.
>=3B >=3B
&g= t=3B >=3B I had run xfs_repair -n previously which spewed out a ton of st= uff=2C in the last email you would have received=2C there should be a link = to hotmail onedrive where you could view the output of that command=2C I ca= lled it xfs.log
>=3B >=3B
>=3B
>=3B I didn't see a link = in the plaintext of the message. I see something now
>=3B buried in an= html attachment that my mailer doesn't interpret very well=2C
>=3B an= d the link doesn't appear to work.
>=3B
>=3B >=3B If I try to = mount the array=2C it comes back with 'Structure needs Cleaning' and won't = mount.
>=3B >=3B
>=3B >=3B When I tried to reassemble the ar= ray=2C it would only begin with 2 of the 5 drives=2C as I know that 3 of th= e drives had different update times and were out of sync.
>=3B >=3B =
>=3B >=3B I ended up doing a force assemble=2C which created the ar= ray and went into a resync process (really not sure if I did the right thin= g here).
>=3B >=3B
>=3B
>=3B It's been a while since I'v= e played around with md raid. Do you have a
>=3B command that you ran = to put things back together? As was mentioned
>=3B up-thread=2C using = a create (-C) command could just force an array
>=3B together in a par= ticular geometry and write new metadata. This would
>=3B make the arra= y look fine afterwards=2C but then there's no way to know
>=3B whether= the array is actually in the original order and the data could
>=3B v= ery well be scrambled.
>=3B
>=3B Brian
>=3B
>=3B >= =3B As to the geometry of the raid=2C I hope I had it in the right order. I= previously had a data recovery tech remote connect to my desktop who had a= look at the array. He had also not been able to successfully mount the rai= d=2C it was him that told me the order of the drives=2C which happened to b= e the exact order of their placement in the drive bays of the lacie nas.>=3B >=3B
>=3B >=3B Is there a way to check whether I have the= correct geometry=2C or by doing the force assemble it would now be impossi= ble to tell?
>=3B >=3B
>=3B >=3B The data recovery tech=2C w= as also having the same issue of mismatched UUID.
>=3B >=3B
>= =3B >=3B Any help is appreciated=2C
>=3B >=3B
>=3B >=3B Ro= b
>=3B >=3B
>=3B >=3B >=3B Date: Fri=2C 14 Nov 2014 08:42:= 08 -0500
>=3B >=3B >=3B From: bfoster@redhat.com
>=3B >=3B = >=3B To: robtench@hotmail.com
>=3B >=3B >=3B CC: xfs@oss.sgi.com=
>=3B >=3B >=3B Subject: Re: Mismatch UUID
>=3B >=3B >=3B=
>=3B >=3B >=3B On Fri=2C Nov 14=2C 2014 at 07:57:42PM +1100=2C R= obert Tench wrote:
>=3B >=3B >=3B >=3B = Robert has a file to share with you on O= neDrive. To view it=2C click the link below. = xf= s.log = So finally have managed to find a way to save the complete log of run= ning xfs_repair -n /dev.md4
>=3B >=3B >=3B >=3B
>=3B >= =3B >=3B >=3B And below is the output of xfs_check /dev/md4
>=3B &= gt=3B >=3B >=3B
>=3B >=3B >=3B >=3B root@ubuntu:~# xfs_chec= k /dev/md4
>=3B >=3B >=3B >=3B * ERROR: mismatched uuid in log>=3B >=3B >=3B >=3B * SB : 813833a7-1bd3-4447-b575-09d= 1471bb652
>=3B >=3B >=3B >=3B * log: ea3833af-25ce-9f= 91-b575-018fb49df3b1
>=3B >=3B >=3B >=3B ERROR: The filesystem h= as valuable metadata changes in a log which needs to
>=3B >=3B >= =3B >=3B be replayed. Mount the filesystem to replay the log=2C and unmo= unt it before
>=3B >=3B >=3B >=3B re-running xfs_check. If you = are unable to mount the filesystem=2C then use
>=3B >=3B >=3B >= =3B the xfs_repair -L option to destroy the log and attempt a repair.
&g= t=3B >=3B >=3B >=3B Note that destroying the log may cause corruption= -- please attempt a mount
>=3B >=3B >=3B >=3B of the filesystem= before doing this.
>=3B >=3B >=3B >=3B
>=3B >=3B >=3B=
>=3B >=3B >=3B You want to use xfs_repair (-n) rather than xfs_c= heck. I think you
>=3B >=3B >=3B mentioned in your other email you= 've tried xfs_repair..? The above
>=3B >=3B >=3B message indicates= a dirty log=2C have you attempted to mount the device to
>=3B >=3B = >=3B replay the log?
>=3B >=3B >=3B
>=3B >=3B >=3B >= =3B And the output from mdadm -D /dev/md4 is as follows
>=3B >=3B &g= t=3B >=3B
>=3B >=3B >=3B
>=3B >=3B >=3B How did you p= ut the array back together? Did it assemble fine or did you
>=3B >= =3B >=3B have to recreate it? If the latter=2C how are you sure the geome= try is
>=3B >=3B >=3B correct (it looks like it's syncing)?
>= =3B >=3B >=3B
>=3B >=3B >=3B Brian
>=3B >=3B >=3B >=3B >=3B >=3B >=3B root@ubuntu:~# mdadm -D /dev/md4
>=3B &g= t=3B >=3B >=3B /dev/md4:
>=3B >=3B >=3B >=3B Version= : 1.0
>=3B >=3B >=3B >=3B Creation Time : Fri Jan 1 01:31:17= 2010
>=3B >=3B >=3B >=3B Raid Level : raid5
>=3B >= =3B >=3B >=3B Array Size : 11712962560 (11170.35 GiB 11994.07 GB)<= br>>=3B >=3B >=3B >=3B Used Dev Size : 2928240640 (2792.59 GiB 29= 98.52 GB)
>=3B >=3B >=3B >=3B Raid Devices : 5
>=3B >= =3B >=3B >=3B Total Devices : 5
>=3B >=3B >=3B >=3B Pe= rsistence : Superblock is persistent
>=3B >=3B >=3B >=3B
>= =3B >=3B >=3B >=3B Update Time : Fri Nov 14 15:58:16 2014
>= =3B >=3B >=3B >=3B State : clean
>=3B >=3B >=3B &= gt=3B Active Devices : 5
>=3B >=3B >=3B >=3B Working Devices : = 5
>=3B >=3B >=3B >=3B Failed Devices : 0
>=3B >=3B >= =3B >=3B Spare Devices : 0
>=3B >=3B >=3B >=3B
>=3B &g= t=3B >=3B >=3B Layout : left-symmetric
>=3B >=3B >=3B= >=3B Chunk Size : 512K
>=3B >=3B >=3B >=3B
>=3B &g= t=3B >=3B >=3B Name : (none):4
>=3B >=3B >=3B >= =3B UUID : e0829810:9782b51f:25529f65:8823419c
>=3B >=3B = >=3B >=3B Events : 1243386
>=3B >=3B >=3B >=3B
= >=3B >=3B >=3B >=3B Number Major Minor RaidDevice State>=3B >=3B >=3B >=3B 0 8 2 0 activ= e sync /dev/sda2
>=3B >=3B >=3B >=3B 6 8 18= 1 active sync /dev/sdb2
>=3B >=3B >=3B >=3B = 2 8 34 2 active sync /dev/sdc2
>=3B >=3B= >=3B >=3B 5 8 50 3 active sync /dev/s= dd2
>=3B >=3B >=3B >=3B 4 8 66 4 = active sync /dev/sde2
>=3B >=3B >=3B >=3B
>=3B >=3B &g= t=3B >=3B
>=3B >=3B >=3B >=3B And then the response from mdad= m -E /dev/md4
>=3B >=3B >=3B >=3B
>=3B >=3B >=3B >= =3B root@ubuntu:~# mdadm -E /dev/md4
>=3B >=3B >=3B >=3B mdadm: = No md superblock detected on /dev/md4.
>=3B >=3B >=3B >=3B
&= gt=3B >=3B >=3B >=3B Not sure what to do=2C any help would be appreci= ated
>=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B Regards= =2C
>=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B Rob
&= gt=3B >=3B >=3B >=3B
>=3B >=3B >=3B >=3B
>=3B >= =3B >=3B >=3B
>=3B >=3B >=3B >=3B =
>=3B >=3B >=3B
>=3B >=3B >=3B >=3B _______________= ________________________________
>=3B >=3B >=3B >=3B xfs mailing= list
>=3B >=3B >=3B >=3B xfs@oss.sgi.com
>=3B >=3B >= =3B >=3B http://oss.sgi.com/mailman/listinfo/xfs
>=3B >=3B >=3B =
>=3B >=3B
= --_80795b56-43d4-4718-8254-bcdb0c73ae70_-- --_ac84ba17-d0a6-4978-b5ed-906ef566b17d_ Content-Type: application/zip Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="xfs log.zip" UEsDBBQAAAAIANmxb0UEJYIsVVcbAES00gEHABwAeGZzIGxvZ1VUCQADWtBnVFLQZ1R1eAsAAQTn AwAABOcDAAC8/c2SpkdyrYeO2VeRsj3Q3mbsPhn/HgMONDpTmUxzWaGQ6AYBVLVVFZrNffWKeN/K SjRJZMZaeiTZORJJfO4oZHhkfe7xrOX/+1/efX56SA9/fPjhxw/fP7xb//+/PX368Yd/f/j861+f Pn3388f3P/3pT3/6w/9+fS6vz/36+ccPf3748cOXp08f3v388PPHP//h4ev/88eHz+/ffViZfn76 /O+fvzz98vDDp6enz3999/7pyvzjh4/fPz388u6vn3fKK/fDf6/tn9PoM0X+49f/7/94+OXXn7/8 +Nef//3h/c/vfvzl6fuH79b/+OHLw53qy0r6zw+fv7z78rT+lfkP7/78w/+1/0Xf/fzT54eaR378 54f3H39df8Lv9/86Y/2LH979+aG2P3z+7v/64fvrX/z5YdTZykjjN5++/0+5xm/+k35Y/+z7h08f P375+ud//5dfP/z09QdSrg98enh69/4vD//b/3//Z/2HH8Z//+7XLw/ff/zwv35Z/zFP7z79j/Un +fHh1w8///jhp/Vv/PnHz18+/2PYXz99fP/0+fPDTx8+/tuH+9/5+frxrfNY/65fvv4xvv/x8/uP 66z+/R+j3/35w8eHf3l4/MP3P356ev/l46d/f/jh53d//vzw+enLw8cPDx8+fvjjyz+6U+XHnsTP d/HzU/v8EP/8Q/zzjyx+voifr+Lnm/h58ec/hvj50D4f4s8zxJ9niD+fEP97p1hvU/zvneJ/7xTr Z4o/nynWz1R/nmL9TO33Q3rUzis9ar8f0qN2vulRO9/0qJ1vetTONz1q55setfNNj9r5pkfxfJN4 vkn9+yv94Z8f/u3jrz9/v76t/P3hu3ff31F/kv8aRNJMJM36SxNJw/xs1l+xSJrCpKlMmsakYepm /a2OpAkkTTAHHsyBB3NSwfyIJ3M1J/MjnsyPeDJ3ajInNZk7NaEDZ+7URP5m2F+XkDTI3wz7yxWS Bqni/VUMSYNU8f7ihqRBqnh/zUPSMFWcmCpORBVXsSWqYktUxZaoii1RFVuiKrZEVWxxqtjiVLHF qWKLU8UWp4otThVbnCq2OOvz4nklqYVdnxfPN4nnm8TzTeL5JvG8svjzz+LPM4s/nyz+92bxv7eI /71FrLci1k8Rfz5F/PkU8b4X8edZxftexZ9/FX/+VazPKp5XFc+rive9iudbxfOt4vk28XybeL5N PN8mnm8Tz7eJ59vE823i+TbxfJt2vkxjWJnGsDKNYWUaw8o0hpVpDCvT0VWmo6tMR1eZjq4yHV1l OrrKdHQV6uj2N2YkDTGXuL5fI2mYKk5MFSemihNTfpmpm8wceGZOKjM/4sz8iAvzIy7M1SzMnSrM SRXmpArzK70wB16ZX+mVqZvK1E1lbnhlyq8y5VeZX+mVqeLKVHFlqrgxVdyYKm5MFTemihtTxY2p 4sZUcWOquDFV3JAqzqG1xFmj4NbntRFG1qi59XlthJE1am59XhthZI2aW5/XRhhZfCLK4hNREZ+I ivhEVMQnoqJRc+vz2vkW8UmpiE9KRXxSKuKTUhGflIr4pFTEJ6UiPikV8YmoiE9ERXwiKuITUUni eYlPSiWL55XFn7/4BFWyeF5Z/PmIT1CliD8f8cmqiE9WpYg/T/GJq4hPXKWI9S8+iRXxSayIT2JF fBIr4pNYEZ/EivgkVsQnsSI+WRXxyaqIT1ZFfLIq4pPV/v5JfI1F4Mnr2yqSBmnGMsJgXl95kTRI M5YRBvP63oykgcoPacYK89RWmKe2wjy1FYTBvL7YI2mQKi7Mi11hXuwK82JXmBe7wrzYFebFrjAv doV5aivMU1thntoK89S2eyAkDVN+mSm/zNQN8/C32y4kDXNSzMPf7t2QNMwvCub9cDeASBrmwJln yN1FImmY3zfMa2ZhXjML85pZmNfMwrxmFuY1szCvmYV5PyzM+2Fh3g8L835YkPfDLqK7XUR3u4ju dhHd7SK620V0t4vobhfR3S6iu11Ed7uI7nYR3e0iuttFdLeL6G4X0d2euni+mhvO+rx4vl083y6e bxfPV3PzWZ8Xz7eL56u5BfWkuQWtz4vnq7kFrc+L56u5Ba3Pi+eruQWtz4vnq7kFrc+L5xvi+YZ4 vpp70fq8eL4hnq/mdrQ+L56v5o60Pi+eb4jnq3En6/Pi+Wrcyfq8eL4ad7I+L56vxp2sz4vnq3En 6/Pa+WaNO1mf1843a9zJ+rx2vlnjTtbntfPNGneyPq9+fyY6tc5wp53hTjvDnXaGO+0Md9oZ7rQz 3GlnuNPOcKed4U47w512hjvtDHfaGe60M9zp1W8haZgq7kwVd6aKO1PFnalixMDuagiRNEwVI3Z6 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 CwfEFw6ILxwQXzggvnBAfOFQtSVD1ZYMVVsyVG3JULUlQ9WWDFVbMlRtyVC1JUPVlgxVWzJUbclQ tSVD1ZYMVVsyVG3JULUlQ9WWDFVbMlRtyVC1JUPVlgxVWzJUbclQtSVD1ZYMVVsyVG3JULUlQ9WW DFVbMlRtyVC1JUPVlgxVWzJUbclQGamhMlJDZaSGykgNlZEaKiM1VEZqqIzUUBmpoTJSQ2WkhspI DZWRGiojNVRGaqiM1FAZqaEyUkNlpIbKSA2VkRoqIzVURmqojNRQGamhMlJDZaSGykgNSJ80IH3S gPRJA9InDUifNCB90oD0SQPSJw1InzQgfdKA9EkD0icNSJ80IH3SgPRJA9InDUifNCB90oD0SQPS Jw1InzQgfdKA9EkD0icNSJ80IH3SgPRJA9InDUifNCB90oD0SQPSJw1InzQgfdKA9EkD0icNiC8c EF84IL5wQHzhgPjCAfGFA+ILB8QXDogvHBBfOCC+cEB84YD4wgHxhQPiCwfEFw6ILxwQXzggvnBA fOGA+MIB8YUD4gsHxBcOiC8cEF84IL5wQHzhUDVyQ9XIDVUjN1SN3FA1ckPVyA1VIzdUjdxQNXJD 1cgNVSM3VI3cUDVyQ9XIDVUjN1SNXKgauVA1cqFq5ELVyIWqkQtVIxeqRi5UjVyoGrlQNXKhauRC 1ciFqpELVSMXqkYuVMlbqJK3UCVvoUreQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWe QkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkWeQkaeILnRgORG A5IbDUhuNCC50YDkRgOSGw1IbjQgudGA5EYDkhsNSG40ILnRgORGA5IbDUhuFJDcKCC5UUByo4Dk RgHJjQKSGwUkNwpIbhSQ3CgguVFAcqOA5EYByY0CkhsFJDcKSCYUkEwoIJlQQDKhgDC/gDC/gDC/ gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/gDC/ gDC/gDC/gDC/gDC/gDC/YDC/2kQ5xQrQJkMrQJsBrgBtBlibKKdYAdoMcAVoM8AVoM0AV4A2A1wB 2gxwBagnLT6nrwD1pMXn9NrE5/QVoJ60+Jy+AtSTFl/HV4B6DuJjd+3i2/UKEH+sXXy7XgHij7WL b9crQDyHLr5drwDx4NRVsFVdBVu7+HZd1d2xVd0dW9XdsVXdHVvV3bFV3R1b1d2xVd0dW9XdsVXd HVvV3bFV3R1b1d2xVd0dW9XdsVXdHVvV3bFV3R1b1d2xVd0dW9XdsVXdHVvVVbBVXQVb1VWwVV0F W9VVsFVdBXt992a+w1O9ANLbXl/gkTwMgnt93WfyIL3t1RwweZDe9molmDxQPTNv7lc/wuSB6pl5 c7+aGiYPVM/Mm/vVGTF5oPph3riv9orJw5x7Z96mrx6NycP8HuvM2/TV6DF5mDqEVmRXaEX21UQy eaB6Zt6mK7Rqu0Krtiu0artCq7YrtGq7Qqu2K7Rqu0Krtiu0artCq7YrtGq7Qqu2K7Rqu0Krtiu0 artCq7YrtGq7Qqu2K7Rqu0Krtiu0IrtCK7IrtCK7QiuyK7Qiu0Irsrs6vuvq+K6r47uuju+6Or7r 6viuq+O7ro7vujq+613UqnR13tfVeV9Xx3ddHd91dXzXuyg96V2UnvQuKkl6F5UkvYtKkt5FJUnv opKkd9E8t3fRC7d30Qu3d9ELt3fRC7d30Qu3d9ELt6v7wru6L7yr+8K7ui+8q/vCu7ovvKv7wru6 L7yr+8K7ui+8q/vCu7ovvKv7wru6L7yr+8K7ui+8q/vCu7ovvKv7wru6L7yr+8K7ui+8q/vCu7ov vKv7wru6L7yr+8K7ui+8q/vCu7ovvKv7wru6L7xDTX6HmvwONfkdavI71OR3qMnvUJPfoSa/Q03+ 1XsweaB6ZoYFHWryO9Tkd6zJZwD0qzli8kD1w4DjV4fF5IF+HzLg+NWmIXkYX9erqWPyQL/HGF/X qzNk8kB1yPi6dmhvfIf2xndob3yH9sZ3aG98h/bGd2hvfIf2xndob3yH9sZ3aG98h/bGd2hvfIf2 xndob3yH9sZ3aG98h/bGd2hvfIf2xndob3yH9sb3V/bG/+YjD3+8/sHT3788ffjy8PnLu09ffvzw 54fvfv74/qeHD7/+8t3Tp4e0/mpu62vr6DP6Pz98/OGH/S9O6/9QRo0orZXVO7z/+Gn/EXb0hzvd 54cfPn76hz/P/ld9/+7Lu/0Pflr/5B/+4f1H/cu7vz09vP/56d2np+//nw1JkB8iQ8J2aNl9h5bd d2jZfYeW3Xdo2X1/Zdn9/h/vj63i++Xdl38ov4iXSxFzFeHnh//j/7wir3/fd79+efjyl6dPTw8/ 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 maDRZoJGmwkabSZotJmg0WaCRpsJGm0maLSZoNFmgkabCRolJsRA6e5/mDxQ/UCjzQSNNhM02kzQ aDNBo80EjTYTNJJM0EgyQSPJBI0kEzSSTNRIEhHX3I0lkgdZS3e3oUweqA4Rkc7dyzJ5oDpE1snd DTGTh6nDjKyTu7tqJg/zezVDoqGMrJO7O3YmD1OHGVkDd7f9SB5kDdw9JGDyQHWILIC4Jw1MHuT3 ankUhzErQBvGrABttrICtNnKCtCGYitAm3GVR21d2v1jZY4HKd/rEJg8VNkhv/6uk0Ty/P6+kB9/ effXh/c/v/vxl88P7x5++PT09Juo/PDj5/W/Pvz6+ek5/P3HTzv7wxX37sP6P/z89O7THfN6skIm q2SyRibrZLJBJgsy2QSTlUcyWSKTkTegkDegkDegkDegkDegkDegkDegkDegkjegkjegkjegkjeg kjegkjegkjegkjegkjegkjegkTegkTegkTegkTegkTegkTegkTegkTegkTegkTegkzegkzegkzeg kzegkzegkzegkzegkzegkzegkzdgkDdgqDdA6qiT6KG0AjRSaQWIU5wkmi6tAHHsk0TTpRWgkUor QJympdJerwLyV9cgf3UN8lfXIH91DfJX1yB/dQ3yV9cgf3UF+asryL+8g7wBQd6AIG9AkDcgyBsQ 5A0I8gYEeQMmeQMmeQMmeQMmeQMmeQMmeQMmeQMmeQMmeQMmeAPSI3gD0iN4A9IjeAPSI3gD0iN4 A9IjeAPSI3gD0iN4A9IjeAPSI3kDEnkDEnkDEnkDEnkDEnkDEnkDEnkDEnkDEnkDEnkDMnkDMnkD yMf8RD7mJ/kxX57UEAxFYlz6rrkOkodx+7umQEwehuVJjNvfNUpi8iBMUFO9h5vqPdxU7+Gmeg83 1Xu4qd7DTfUebqr3cFO9h5vqPdxU7+Gmeg831Xu4qd7DTfUebqr38ApQT1r0gmiqu3FT3Y2b6m7c VHfjprobN9XduKnuxk11N26qu3FT3Y2b6m7cVHfjprobN9XduIk7TneAetKiecQKUE9a26K6A9ST Ft0mmrhFdQeoJy26TTRx7eoOEE86iW4TTdzTugPEkxb3tO4A8aTTo3jSSbSnWAHiSSfRnmIFqCct 2lOsAPWkRUXEClBPWpRQrAD1pJN60qLmYgWoJy2KNBrkjtsgd9wGueM2yB23Qe64DXLHbZA7boPc cRvkjtsgd9wGueM2yB23Qe64DXLHbZA7boPcca9+jckD1TNjadEgt94GufU2yK23QW69DXLrbZBb b4Pcehvk1tsgt94GufU2yK23QW69DXLrbcze2bttRvIw1hhXk83kgeqZsdhozB7cu4Fn8kD1zFhs NGaf7j0cIPIkxmKjMXt57wkDk4ep58RYbFxjCiYPU8+Jseq4Zh1MHqieGauOa2DC5IHqmbHquKYu TB6onhNUz4z3wjXRYfJA9ZzVSZ/o6rEC1ElfVid9WZ30icvQV4A66ROFPE0V8jRVyNNUIU9ThTxN FfI0VcjTVCFPS+L29BWgnrS4PX0FqCctbk9vSdyevgLUkxa3p68A9aSretJVPWlxP/sKUE9a3M++ AtSTFvezrwD1pMVtNk3dZtPUbTZN3WbT1G02Td1m09RtNk3dZtPUbTZN3WbT1G02Td1m09RtNk3d ZtPUbTZN3WbT1G02K0A9aZWRUvflNHVfTlP35TR1X05T9+U0dV9OU/flNHVfTlP35TR1X84KUE9a ZaTUBTtX/8D0IVA/nKF+OEP9cIb6YWZL/dXJMHmgfpjh3xvEvzeIf28Q/94g/r1B/HuD+PdG8e+J 2XZ/tXFMHqiemW33Vy/I5IHqmdl2fzWUTB6onitUzxWq5wrVc4XquUL13KB6blA9MyuqGrSiqkEr qhq0oqpBK6oatKKqQSuqGrSiqkErqhq0oqpBK6oatKKqQSuqGrSiqkErqhq0oqpBK6quMQWSB+IL oZVZDVqZ1aCVWQ1amdWglVkNWpnVoJVZDVqZ1aCVWQ1amXWNbpg8UD0zfOFQ9TRD1dMMVU8zVD3N UPU0Q9XTDFVPM1Q9zVD1NEPV0wxVTzNUPc1Q9TRjQxm7cO///YePn35592X9L7/55/H6P89v/PPy +MY/z2/88/rGP+9v/PM3/nz1jT+f+AA5IBptQDTagGi0AdFoA6LRBkSjDYhGGxCNNiAabUA02niF RvvNRx7+eP2Dp79/efrw5eHzl3efvvz44c8P3/388f1PDx9+/eW7p08Pq38YJc8+4jHSPz98/OGH /S9eF3CUUSNKa2Vd9q/+Mjv6w53u876W//Dn2f+q7999ebf/wU//+Nuq/uH+o/7l3d+ebmuap+// 4R/Lv3+ZHyJ0CX8foXvrl/irP5bf/o788u9/fXp4/M0/nK/Hzldi8+Orsfnxtdj0emx6LTa/Hptf iy2vx5bXYl8vv1xfi22vx7bXYvvrsf212PF67BvfD/LrpbX+8e87TK1/PEWHqbe+a7z2Z1n/+LU/ i7yf6K3vNa/+WfLrfxbVxuut71Cv/lnq638W1brure9rr/5Z+ut/FtWs7q3vhq/+WV6vXXnP0Fvf Q1/7s9TXaxfcLLSScYZ0KxlnSLeScZaMKxlnybiScZaMKxla5fX1Kq+vVzm4S2gkcJfQSkbWPLhL aCUja17eJfT5x//5tL5dP3xe372fvvwmUXv4X/5l/c3/32usX6Pf/fuXp8//49XKaK9tcFj/mCx5 cJXQSsa5kK5k5AUAVwmtZOQFAFcJrWTkBQBXCa1k5C99cJXQSqbeAKlzzKLmaAWI09Asao5WgNiN Z1FztALEaWgWJUQrQBxjZ1FCtALS62VD/q4Dl0aNBC6NWsnI33Xg7qGVjPxdB+4eWsnI33Xg7qGV jPzbHtw9tJKRNwDcPbSSkTcA3D20kpE3ANw9tJKRNwDcPbSSkTcA3D20kpE3ANw9tJKRNwDcPbSS kTcA3D20kpE3ANw9tJKRNwDcPbSSgTcgg7uHVjLwBmRw99BKBt6ADO4eWsnAG5DB3UMrGXgDMrh7 aCUjbwC4e2glI28AuHtoJSNvALh7aCUjbwC4e2glI28AuHtoJSNvgLx7SB7tEHBBZnSf1yCIycOQ VJnRfV7TJCYPQ0BlRq95jaSYPFAdih44K0CdPIoeOCtAnTyKHjgrQCRus+iBswLUUaXogbMC1Bmz 6IGzAtSTFj1wVoB60qIHzgpQT1pFULPogTOy6IGzAtSTFj1wVoB60qIHzgpQT1r0wFkB6sGJljYj i5Y2K0A9ONHSZgWoByda2qwA9eBES5sVoF5R0dJmBagnLVrarAD1pEVLmxWgnrRoabMC1JMWLW1W gHrSoqXNClBPWrS0WQHqSYuWNitAPWlx7dcKUE9aXPu1AtSTFtd+rQD1pMUtXitAPThxi9cKUA9O 3OJ1fbtnugSoy2TcWK4WgckDdZmMG8vVZzB5oG6VcWO5mhUmD1TPjBvL1fEweaB6ZtxYrraJyQPV M+PGcvVeTB6onhk3lquBY/JA9cy4sVxdIJMHqkPGReVqJZk8UB0yLipXP8rkgeqQcVG5mlomD/R7 lXFRuTpjJA/jonL10UweqJ4ZF5WrGWfyQPXMuKhcHT2TB6pnxkXlGgsweaB6ZlxUrtkCkweqZ2ZL 2zWgYPJA9cxsabumHEgeZrvaNRNh8kB1yGxXuwYrQJ6pbh+Y6vaBqW4fmOr2galuH5jq9oGpbh+Y 6vaBqW4fmOr2galuH5jq9oGpbh+Y6vaBqW4fmOr2galuH5jq9oGpbh+Y6vaBqW4fmOr2galuH5jq 9oGpbh+Y6vaBqW4fmOr2galuH5jq9oGpbh+Y6vaBFaCetPhUswLUkxafalaAetLiU81MUz1p8W1n BagnLb7trAD1pMW3nRWgnvRUT3qqJz3Fk86P4knnR/Gk86N40vlRPOksOkquAPGks+gouQLEk86i o+QKUE9adJRcAepJi46SK0A9adHRbAXI372R/mpC7uwTcmefkDv7hNzZJ+TOPiF39gm5s0/InX1C 7uwTcmefkDv7hNzZJ+TOPiF39gm5s0/InX1C7uwTcmefkDv7hNzZJ+TOPiF39gm5s0/InX1C7uwT cmefkDv7hNzZJ+TOPiF39gm5s1/9MZMHqmfmXeFqspk8UD0z7wpXp87kgeqZeZ+42n0mD1TP1PvE hOp5QvU8oXqeTD3veQSTh6nnPb1g8jD1nBm//WsEwuRh6jkzfvvXHIXJA9Uz47d/DWOYPFA9M377 10SHyQPVs7hRZAWok76kTvqSOunL6qRPdEucqlviVN0Sp+qWOFW3xKm6Ja4A9aRFe8Wp2itO1V5x btG6GKCetKhOn6o6farq9Kmq06eqTp+qOn2q6vSpqtOnqk6fqjp9qur0qarTp6pOn6o6farq9Kmq 06eqTp+qOn2q6vSpqtOnqk6fqjp9qur0qarTV4B60iojpcrZpypnn6qcfapy9qnK2acqZ5+qnH2q cvapytmnKmefqpx9qnL2qcrZpypnn6qcfapy9qnK2acqZ5+qnH2qcvapytmv/oHpQ6B+OEH9cIL6 4Qz1w4wL2IRcwCbkAjYhF7AJuYBNyAXsap6YPFA9M25iE3ITm5Cb2IT8BibkNzAhv4EJ+Q1MyG9g Qn4DE/IbmJDfwIT8BibkNzAhv4EJ+Q1MyG9gQn4DE/IbmJDfwIT8BibkNzAhv4EJ+Q1MyG9gQn4D E/IbmJDfwIT8Bq52n8kD1TPEF0K+BRPyLZiQb8GEfAsm5FswId+CCfkWTMi3YEK+BRPyLZiQb8GE fAsm5FswId+CCfkWTMi3YEK+BRPyLZiQb8GEfAumamc4VTvDqdoZTtXOcKp2hlO1M5yqneFU7Qyn amc4VTvDmVWNnOp/OFX/w6n6H07V/3Cq/ocrQD1pVSOXVY1cVjVyRdXIFVUjV1SNXFE1ckXVyBVV I1dUjVxRNXJF1cgVVSNXVMlbUSVvRZW8FVXyVlTJW1GRp6IiT0VFnoqKPBUVeSoq8lRU5KmoyFNR kaeiIk9FRZ6KijwVFXkqKvJUVOSpqMhTUZGnoiJPRUWeioo8FRV5KiryVFTkqajIU1GRp6IiT0VF noqMPEFyI8jGbEI2ZhOyMZuQjdmEbMwmZGM2IRuzCdmYTcjG7Gp6mDxQPUNyI8gObUJ2aJOyQ8uQ 3ChDcqMMyY0yJDcqkNyoQHKjAsmNCiQ3KpDcqEByowLJjQokNyqQ3KhAcqMCyYQKJBMqkEyoQDKh AsmECoT5FQjzKxDmVyDMr0CYX4EwvwJhfgXC/AqE+RUI8ysQ5lcgzK9AmF+BML8CYX4FwvwKhPkV CPMrEOZXIMyvQJhfgTC/AmF+BcL8CoT5FQjzKxDmVxDMryXRFnEHSLOnHSDNnnaANHvaAdKUcQdI U8YdIE0Zd4A0ZdwB0pRxB0hTxhWg2SLuAPWktTeiHaCetPZGtAPUk9beiHaAetLaG9EOUE9aeyPa AepJa29EO0A9ae2NaAeoJ629Ee0A9aS1N6IdoJ609ka0A9ST1t6IdoB60tob0Q5QT1p7I9oB6klr b0Q7QD1p7Y1oB6gnrb0R7QD1pDVZ/A5QT1qTxe8A9aQ1WfwOUE9ak8XvAPWkNVn8DlBPWpPF7wD1 pDVZ/A5QT1qTxe8A9aQ1WfwOUE9ak8XvAPm7N9Ff3W0Fk4for+4mhMlDzAvuloXJQ8wL7gaHyUPM C+52CMmD2JjdzROTB6pn5H3i7sCYPFA9I+8TdxvH5IHqGXmfuHtBJg9Uz8j7xN1QMnmgekbeJ+6u lMkD1TPyPnG3tkge5H3iboSZPFA9I+8TdzfN5IHqGXmfuFtyJg9Uz8j7xN3XM3mgekbeJ+7hAJMH qmfEhuCeMDB5oHpGbAjuMQWSB7EhuIcaTB6onhEbgnsywuSB6hmxIbjHK0weqJ4RG4J7RsPkgeoZ sSG4Bz1MHnXSp9ki7gB10qfZIu4AddKn2SKuAM0WcQeokz7NFnEHqJM+zRZxB6gnrdki7gD1pDVb xB2gnrQmi98B6klrsvgdoJ60JovfAepJa7L4HaCetCaL3wHqSWuy+B2gnrQmi98B6klrsvgdoJ60 JovfAepJayr3lkSV+w4QD05Uue8A8eBElfsOEA9OVLnvAPHgRJX7DlBPWkWeRFn8DlBPWkWeRFn8 DlBPWkWeRFn8DlBPWkWeRFn8DlBPWkWeRFn8DlBPWkWeRFn8DpC/SkPtLeJKdjcPTB6ovUVcye4O BMmDuJLd/QqTB2pvEVeyu+lh8kD1jLiS3Z0TkweqZ8SV7G6/mDxQPSM2BHcPx+SB6hmxIbgbQSYP VM+IDcHdTSJ5EBuCu/dk8kD1jNgQ3A0skweqZ8SG4O6CmTxMHTL2AXcrzeRh6pCxD7j7cSYPU4eM fcDd1DN5mN+rjH3APRlg8kD1DGF+jA3BPXVg8kD1DGF+jA3BPdFg8kD1DGF+jA3BPS1h8kD1DGF+ jA3BPYlh8vxuPe//8Zd3f/7x/cOHX3/57unTw+PfH3eir6FlkyP7M397+vT5x/0vePVTr2eaR5nm 25na40mmr596PVM6ypQOMuWjTPkgUznKVA4y1aNM9SBTO8rUDjL1o0z9INM4yjQOMh3VeDuo8XZU 4+2gxvtRjfeDGu9HNd4Parwf1Xg/qPF+VOP9oMb7UY33gxrvRzXeD2q8H9V4P6jxflTj/aDG+1GN 94Ma70c13g9qfBzV+Dio8XFU4+OgxsdRjY+DGh9HNT4Oanwc1fg4qPFxVOPjoMbHUY2PgxofRzU+ Dmp8HNX4OKjxcVTj46DG46jG46DG46jG46DG46jG46DG46jG46DG46jG46DG46jG46DG46jG46DG 46jG46DG46jG46DG46jG46DG51GNz4Man0c1Pg9qfB7V+Dyo8XlU4/OgxudRjc+DGp9HNT4Panwe 1fg8qPF5VOPzoMbnUY3PgxqfRzU+367xPdp+O9Pzp17PdFLjz596PdNJjT9/6vVMJzX+/KnXM53U +POnXs90UuPPn3o900mNP3/q9UwnNf78qdczndT486dez3RS48+fejVTOqrxdFDj6ajGRY6uqZho UzHRpmKiTaU+m0p9NpX6bCr12VTqs6nUZ1Opz6ZSn02lPptKfTa5WlXqs6nUZ1Opz6ZSn02lPptK fTaV+mwq9dlU6rOp1GdTqc+mUp9NpT6bSn02lfpsKvXZxGVIO0A9adHoronLkHaAetKi0V0TlyHt APWkRaO7Ji5D2gHqSYtGd01chrQD1JMWje6auAxpB6gnLRrdrQD1pEWjuxWgnrRodNeKaHS3AtST Fo3uVoB60qLR3QpQT1o0ulsB6kmLRncrQDxpiIprEBXXXqHi9v/4EvDdzx/f//S1H/pvD48rwdf/ 0+PDDx8/PfwXP5rHxz+8//jp069//fLtkyvov/7gP91/gn/99cNP94dP/+3p+N+elH/7h48Pf3p4 +vBl/xD/If8dsP/xa//8r58+fvfz0y8P//bjl7/85h++//jhywr6vP8kv/333//6v7z729PD+5+f 3n16+v4f/rHYIyDYSoOwwgZhhQ3CChuEFTYIK2wQVtggrLBBWGGDsMIGYYUNwgobhBU2CCtsEFbY IKywQVhhg7DCBmGFDcIKG4QVNggrbBBW2CCssEFYYYOwwsZsN7oHA0weqJ4Z98DGbDe6hw5MHqie GffAxmw3ugcaTB6onhn3wMZsN7qHJUweqJ4Z98AGbTe6BjFMHqieGffAa5rD5IHqmXEPvEZCTB6o nhn3wGuuxOSB6plxD7yGU0weqJ4Z98BrwoXkETc8rAB1xClueFgB6ohTdPhbAeqIU3T4WwHqiFN0 +FsB6jBbdPhbAepJiw5/K0A9adHhbwWoJy06/K0A9aRFh78VoJ606PC3AtSTFh3+VoB60qLD3wpQ T1p0+FsB6kmLDn8rQD1p0eFvBagnLTr8rQD1pEWHvxWgnrSKbhUV3SpTPWmV9arqg0NV4bCqwmFV hcOqCodVFQ6rKhxWVTisqnBYVeGwqsJhVYXDqgqHVRUOqyocVlU4rKpwWFXhsKrCYVWFw6oKh1UV DqsqHFZlOIxxH7/aCiYP1A8z7uNXb8Lkgfphxm7wanCYPFA/zNgNXl0SkweqZ8Zu8Gq1mDxQPTN2 g1e/xuSB6pmxG7yaPiQPYzd4tYhMHqieGbvBq89k8kD1zNgNXs0qkweqZ8Zu8Op4mTxQPTN2g1fb zOSB6pmxG7x6byYPVM8TqmfGtvDq65k8TD1XiC+sEF9YIb6wQnxhhfjCCvGFFeILK8QXVogvrBBf WCG+sEJ8YYX4wgrxhRXiCyvEF1aIL6wQX1ghvrBCfGGF+MIK8YVVFQdWVRxYVXFgVcWBVRUHVlUc WFWtX1Wle1VV4lVViVdVJV5VlXhVVeJVVYlXVSVeVZV4VVXiVVWJV1UlXlWVeFVV4lVViVdVJV5V lXhVVeJVVYlXVSVeVZV4VVXiVVWJV1UlXlWVeFVV4lUVSKoqkFRVIKmqQFJVgaSqAklVBZKqCiRV lS+qKl9UVb6oqrhQVemfqtI/VaV/qkr/VJX+qSr9U1X6p6r0T1Xpn6rSP1Wlf6pK/1SV/qmQ8qZC ypsKKW8qpLypkPKmQsqbCilmKqR0qZBCpUIKlQopVCqkUKmQQqVCCpUKKVQqpFCpkEKlQgqVCilU KqRQqZBCpUIKlQopVCqkUKmQQqVCCpUKKVQqpFCpkEKlQgqVCilUKqRQqZBCpUKEWYUIswoRZhUi zCpEmFWIMKsQYVYhwqxCZFiFyLAKkWEVIroqRGJViMSqEIlVIRKrQiRWhUisCpFYFSKxKkRiVYjE qhCJVSESq/4+ibX/x1esjMcWh+/PvGpl/O1Tr2c6MLT+9qnXMx0YWn/71OuZDgytv33q9UwHhtbf PvV6pgND62+fejXTyaKwb596PdOBofW3T72e6cC0/dunXs90YNr+7VOvZzqq8bcXhY1ysijs26de z3RU428vChvlZFHYt0+9numoxt9eFDbKyaKwb596NdPJorBvn3o901GNv70obJSTRWHfPvV6pqMa f3tR2Cgni8K+fer1TEc1/vaisFFOFoV9+9TrmY5q/O1FYaOcLAr79qnXMx3V+NuLwkY5WRT27VOv Zzqq8bcXhY1ysijs26dez3RU428vChvlZFHYt0+9numoxt9eFDbKyaKwb596PdNRjb+9KGyUk0Vh 3z71eqajGn97UdgoJ4vCvn3q9UxHNf72orBRThaFffvU65mOavztRWGjnCwK+/ap1zMd1fjbi8JG OVkU9u1Tr2c6qvG3F4WNcrIo7NunXs90VONvLwob5WRR2LdPvZ7pqMbfXhQ2ysmisG+fej3TUY2/ vShslJNFYd8+9Xqmoxp/e1HYKCeLwr596vVMRzX+9qKwUU4WhX371P2///Dx0y/vvjz8+J//+ev/ pqM78PYisVFPFol9+9TrmU7uQH17kdioJ4vEvn3q9Uwnd+D5U793IvXtRWOjniwa+/ap1zOd3JH6 9qKxUU8WjX371OuZTu6I6pwxVSeZqTrJTNVJZqpOMlN1kpmqk8xUnWSm6iQzVSeZqTrJTNVJZqpO MlN1kpmqk8xUnWSmfB9UJ5mpOslM1Ulmqk4yU3WSmaqTzFSdZKbqJDNVJ5mpOslM1Ulmqk4yU3WS maqTzFSdZKbqJDNVJdFUlURTVRJNVUk0VSXRVJVEs4prxqYqPVoB6kmLWqUVoJ60KG6aqrhpquKm qYqbpipumqq4aaripqmKm6YqbpqquGmq4qapipumKm6aqrhpquKmqYqbpipumqq4aaripqmKm6Yq bpqQ08aEnDYm5LQxIaeNCTltTMhpY0JOGxNy2piQ08aEnDYm5LQxIaeNCTltTMhpY0JOGxNy2piQ 08aEnDYm5LQxIaeNCTltTMhpY0JOGxNy2piQ08aEnDYm5LQxIaeNCTltTMhpY0JOGxNy2piQnnBC esIJ6QknpCeckJ5wQnrCq1Nn8kD1zGzympC+8ZoCMHmgemZ0khPSSU5IJzkhneSEdJIT0klOSCc5 IZ3khHSSE9JJTkgnOSGd5IR0khPSSU5IJzkhneSEdJIT0klOSCc5IZ3kVM1tpmpuM1Vzm6ma20zV 3Gaq5jZTNbeZqrnNVM1tpmpuM1Vzm6ma26wA9aRFN5ypuuFM1Q1nBagnLdrnrAD1pEW/nan67UzV b2eqfjtT9duZqt/OVP12puq3M1W/nan67UzVb2eqfjtT9dtZAepJi9u2ZhW3ba0A9aRVRqqqjFRV GamqMlJVZaSqykhVlZGqKiPVVEaqqYxUUxmppjJSTWWkmspINZWRaioj1VRGqqmMVFMZqaYyUk1l pJrKSDWVkWoqI9VURqqpjFRTGakmM1KMz8qEfFYm5LMyIZ+VCfmsTMhnZUI+KxPyWZmQz8qEfFYm 5LMyIZ+Vq6di8kD1zPi1TMiv5erXmDxQPTObvCbkHzMh/5gJ+cdMyD9mQv4xE/KPmZB/zIT8Yybk HzMh/5gJ+cdMyD9mvuIfI/fHTB6onplNXleTzeSB6hniCyvEF1aIL6wQX1ghvrBCfGGF+MIG8YUN 4gsbxBc2iC9sEF/YIL6wQXxhg/jCBvGFDeILG8QXNogvbBBf2CC+sEF8YYP4wgbxhQ3iCxvEFzaI L2yqRq6pGrmmauSaqpFrqkauqRq5pmrkmqqRa6pGrqkauaZK3pqqYGuqgq2pCramKtiaqmBrqoKt qQq2pirYmqpga6qCrakKtqYK0pqqL2uqvqyp+rKm6suaqi9rqr6sqfqypsrFmooLNRUXaiou1FRc qKm4UFNxoabiQk3FhZqKCzUVF2oqLtRUXKipuFBTcaGm4kJNxYWaigs1FRdqKi7UVFyoqbhQU3Gh puJCTcWFmooLNRUXaiou1FRcqEFSnQZJdRok1WmQVKdBUp0GSXUaJNVpkFSnQVKdBkl1GiSxaZA0 pkHSmAZJYxokjWmQNKZB0pgGSWMaJI1pkDSmQdKYBkljGiRpaZAUpUFSlAZJURokRWmQFKVBUpQG SVEaJCFpEALWIASsQQhYgxCwBiFgDULAGoSANQgBaxAC1iAErEEIWIMQsAYhYA1CwBqEgDUIAWsQ AtYgBKxBCFiDELAGIWANQsAahIA1CAFrEALWIASsQQhYQxCwnkTLvB0gzVZ2gDRb2QHSbGUHSFO0 HSBN0XaANEXbAdIUbQdIU7QdIE3RVoD2pLED1JPWnjR2gHrSmmXeDlBPWnsD2QHqSWtvIDtAPWnt DWQHqCetvYHsAPWktTeQHaCetPYGsgPUk9beQHaAetLaG8gOUE9aewPZAepJa28gO0A9ae0NZAeo J629gewA9aS1N5AdoJ609gayA9ST1iTTO0A9aU0yvQPUk9Yk0ztAPWlNMr0D1JPWJNM7QD1pTTK9 A9ST1iTTO0A9aU0yvQPEkxYl0ztAPGlRMr0D5O/eRH91txVMHqK/upsQJg8xL7hbFiYPMS+4Gxwm DzEvuNshJA/yrnA3T0weqJ6Rd4W7A2PyQPWMvE/cbRyTB6pn5H3i7gWZPFA9I+8Td0PJ5IHqGXmf uLtSJg9Uz8j7xN3aInmQ94m7EWbyQPWMvE/c3TSTB6pn5H3ibsmZPFA9I+8Td1/P5IHqGXmfuIcD TB6onhGJ+j1hYPJA9YxI1O8xBZIHkajfQw0mD1TPiET9nowweaB6RiTq93iFyQPVMyJRv2c0TB6m nhmJ+j3oYfKIkz7RMm8HiJM+0TJvB4iTPtEybwVolnk7QJ30aZZ5O0Cc9ImWeTtAPWnNMm8HqCet WebtAPWkNcn0DlBPWpNM7wD1pDXJ9A5QT1qTTO8A9aQ1yfQOUE9aWyu6A9ST1taK7gD1pDVR9g5Q T1oTZe8A9aQ1UfYOUE9aZaREUfYOUE9aZaSaykiJKu4doJ60ykiJsu8doJ60ykiJsu8doJ60ykg1 lZESdeI7QD1plZESdeI7QD1plZESdeI7QD1plZESdeI7QD1plZESdeJ3/8D0IUw/zFhc3U0Ik4fp hxmLq7uTYfJA/TBicXW3Q0weqJ4Ri6u7p2LyQPWMWFzdjRmSB9Hl320ckweqZ0SXf/eCTB6onhFd /t1QMnmgekZ0+XdXyuSB6hlZoXm3tkweqJ4Rn4C7P2byQPWM+ATcTTaSB+ILGZ+Au1Nn8kD1DPGF jN/APQVg8kD1DPGFjG/BPWFg8kD1DPGFjG/BPb1g8kD1DPGFjP/BPRlh8kD1DPGFjP/BPXVh8kD1 DPGFjP/BPdFh8kD1rGrkRJ/AFaBq5ESfwB2gTvpUjZzoE7gD1EmfqpETfQJ3gHrSqkZO9AncAepJ qxo50SdwB6gnrWrkmqqRa6pGrqkauaZq5JqqkWuqRq6pGrmmauSaqpFrqkauqRq5pmrkmqqRa6pG rqsaua5q5LqqkeuqRq6rjFRXGamuMlJdZaS6ykh1lZHqKiPVVUaqq4xUVxmprjJSXWWkuspIdZWR 6ioj1VVGqquMVFcZqa4yUl1lpLrKSHWVkeoqI9VVRqqrjFRXGamuMlJdZqQgfRLjn3Z3G0weqB+G 9EmMf9rdyTB5oH4Y0icx/ml3l8TkgeoZ0icx/ml3B8bkgeoZ0ic1SJ/UIH1Sg/RJDdInNUif1CB9 UoP0SQ3SJzVIn9QgfVKD9EkN0ic1SJ/UIH1Sg/RJHdIndUif1CF9Uof0SR3iCzvEF3aIL+wQX9gh vrBDfGGH+MIO8YUd4gs7xBd2iC/sEF/YIb6wQ3xhh/jCDvGFHeILO8QXdogv7BBf2CG+sEN8YYf4 wg7xhR3iCzvEF3aIL+wQX9hVjVxXNXJd1ch1VSPXVY1cVzVyXdXIdVUj11WNXFc1cl3VyHVVI9dV jVxXNXJd1ch1VSPXVY1cVzVyXdXIdVUj11WNXFc1cl3VyHVVI9dVjVxXNXJd1ch1VSPXVY1cVzVy XdXIdVUj11WNXFc1cl3VyHVVI9dVRqqrjFRXGamuMlJdZaS6ykh1lZHqKiPVVUaqq4xUVxmprjJS XWWkuspIdZWR6ioj1VVGqquMVFcZqa4yUl1lpLrKSHWVkeoqI9VVRqqrjFRXGamuMlId0id1SJ/U IX1Sh/RJHdIndUif1CF9Uof0SR3SJ3VIn9QhfVKH9Ekd0id1SJ/UIX1Sh/RJHdIndUif1CF9Uof0 SR3SJ3VIn9QhfVKH9Ekd0id1SJ/UIX1Sh/RJHdIndUif1CF9Uof0SR3SJ3VIn9QhfVKH9Ekd4gs7 xBd2iC/sEF/YIb6wQ3xhh/jCDvGFHeILO8QXdogv7BBf2CG+sEN8YYf4wg7xhR3iCzvEF3aIL+wQ X9ghvrBDfGGH+MIO8YUd4gs7xBd2iC/sEF/YVY1cVzVyXdXIdVUjN1SN3FA1ckPVyA1VIzdUjdxQ NXJD1cgNVSM3VI3cUDVyQ9XIDVUjN1SN3FA1ckPVyA1VIzdUjdxQNXJD1cgNVSM3VI3cUDVyQ9XI DVUjN1SN3FA1ckPVyA1VIzdUjdxQNXJD1cgNVSM3VEZqqIzUUBmpoTJSQ2WkhspIDZWRGiojNVRG aqiM1FAZqaEyUkNlpIbKSA2VkRoqIzVURmqojNRQGamhMlJDZaSGykgNlZEaKiM1VEZqqIzUUBmp ITNSkD6pQ/qkDumTOqRPGpA+aUD6pAHpkwakTxqQPmlA+qQB6ZMGpE8akD5pQPqkAemTBqRPGpA+ aUD6pAHpkwakTxqQPmlA+qQB6ZMGpE8akD5pQPqkAemTBqRPGpA+aUD6pAHpkwakTxqQPmlA+qQB 6ZMGpE8aEF84IL5wQHzhgPjCAfGFA+ILB8QXDogvHBBfOCC+cEB84YD4wgHxhQPiCwfEFw6ILxwQ XzggvnBAfOGA+MIB8YUD4gsHxBcOiC8cEF84IL5wQHzhgPjCoWrkhqqRG6pGbqgauaFq5IaqkRuq Rm6oGrmhauSGqpEbqkZuqJK3oUrehip5G6rkbaiSt6FK3oYqeRuq5G2okrehSt6GKnkbquRtqAq2 oSrYhqpgG6ogbaiCtKEK0oYqSBuqIG2ogrShCtKGCiQNFUgaKpA0VCApVCApVCApVCApVCApVCAp VCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApVCApZCAJ EgMNSAw0IDHQgMRAAxIDDUgMNCAx0IDEQAMSAw1IDDQgMdCARDwDEvEMSMQzIBHPgEQ8AxLxDEjE MyARz4BEPAMS8QxIxDMgEc+AxDcDEt8MSHwzINHMgEQzAxLNDEg0MyDRzIBEMwMSzQwIehsQ9DYg 6G1A0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA0FtA 0FtA0FtA0FtA0FtA0FtA0Fv8PvS2/8df3v35x/cPH3795bunTw+Pf3/cib6GlhpxfeZvT58+/7j/ Ba9+6vVM8yjTfDvT+lp4kOnrp17PlI4ypYNM+ShTPshUjjKVg0z1KFM9yNSOMrWDTP0oUz/INI4y jYNMRzU+D2p8HtX4fLvG2+NJjT9/6vVMJzX+/KnXM53U+POnXs90UuPPn3o900mNP3/q9UwnNf78 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 2hzNanM0q83RrDZHs9oczWpzNKvN0aw2R7PaHM1qczSrzdGsNkez2hzNanM0q83RrDZHs9oczWpz NKvNYfaaw+w1h9lrDrPXHGavOcxec5i95jB7zWH2msPsNYfZaw6z1xxmrznMXnOYveYwe81h9prD 7DWH2WsOs9ccZq85zF5zmL3mMHvNYfaaw+w1h9lrFrMH6gUrqBesoF6wgnrBBuoFG6gXbKBesIF6 wQbqBRuoF2ygXrCBesEG6gUbqBdsoF6wgXrBBuoFG6gXbKBesIF6wQbqBRuoF2ygXrCBesEG6gUb qBdsoF6wgXrBBuoFG6gXbKBesIF6wQbqBRuoF2ygXrCBesEG8q4N5F0byLs2kHdtIO/aQN61gbxr A3nXBvKuDeRdG8i7NpB3bSDv2kDetYG8awN51wbyrg3kXRvIuzaQd20g79pA3rWBvGsDedcG8q4N 5F0byLs2kHdtjma1OZrV5mhWm6NZbY5mtTma1eZoVpujWW2OZrU5mtXmaFabo1ltjma1OZrV5mhW m6NZbY5mtTma1eZoVpujWW2OZrU5mtXmaFabo1ltjma1OZrV5mhWm6NZbY5mtTma1eZoVpujWW2O ZrU5mtXmaFabo1ltDrPXHGavOcxec5i97jB73WH2usPsdYfZ6w6z1x1mrzvMXneYve4we91h9rrD 7HWH2esOs9cdZq87zF53mL3uMHvdYfa6w+x1h9nrDrPXHWavO8xet5g9UC/YQL1gA/WCDdQLNlAv 2EC9YAP1gg3UCzZQL9hAvWAD9YIN1As2UC/YQL1gA/WCDdQLNlAv2EC9YAP1gg3UCzZQL9hAvWAD 9YIN1As2UC/YQL1gA/WCDdQLNlAv2EC9YAP1gg3UCzZQL9hAvWAD9YIN1As2kHdtIO/aQN61gbxr B3nXDvKuHeRdO8i7dpB37SDv2kHetYO8awd51w7yrh3kXTvIu3aQd+0g79pB3rWDvGsHedcO8q4d 5F07yLt2kHftIO/aQd61g7xrdzSr3dGsdkez2h3Nanc0q93RrHZHs9odzWp3NKvd0ax2R7PaHc1q dzSr3dGsdkez2h3Nanc0q93RrHZHs9odzWp3NKvd0ax2R7PaHc1qdzSr3dGsdkez2h3Nanc0q93R rHZHs9odzWp3NKvd0ax2R7PaHc1qd5i97jB73WH2usPsdYfZ6w6z1x1mrzvMXneYve4we91h9rrD 7HWH2esOs9cdZq87zF53mL3uMHvdYfa6w+x1h9nrDrPXHWavO8xed5i97jB73WH2usPsdVAv2EG9 YAf1gh3UC3ZQL9hBvWAH9YId1At2UC/YQb1gB/WCHdQLdlAv2EG9YAf1gh3UC3ZQL9hBvWAH9YId 1At2UC/YQb1gB/WCHdQLdlAv2EG9YAf1gh3UC3ZQL9hBvWAH9YId1At2UC/YQb1gB/WCHdQLdpB3 7SDv2kHetYO8awd51w7yrh3kXTvIu3aQd+0g79pB3rWDvGsHedcO8q4d5F07yLt2kHftIO/aQd61 g7xrB3nXDvKuHeRdO8i7dpB37SDv2kHetYO8a3c0q93RrHZHs9odzWp3NKvd0ax2R7PaHc1qdzSr 3dGsdkez2h3N6nA0q8PRrA5HszoczepwNKvD0awOR7M6HM3qcDSrw9GsDkezOhzN6nA0q8PRrA5H szoczepwNKvD0awOR7M6HM3qcDSrw9GsDkezOhzN6nCYveEwe8Nh9obD7A2H2RsOszccZm84zN5w mL3hMHvDYfaGw+wNh9kbDrM3HGZvOMzecJi94TB7w2H2hsPsDYfZGw6zNxxmbzjM3nCYveEwe8Nh 9obF7IF6wQ7qBTuoF+ygXrCDesEO6gU7qBfsoF6wg3rBDuoFO6gX7KBecIB6wQHqBQeoFxygXnCA esEB6gUHqBccoF5wgHrBAeoFB6gXHKBecIB6wQHqBQeoFxygXnCAesEB6gUHqBccoF5wgHrBAeoF B6gXHKBecIC86wB51wHyrgPkXQfIuw6Qdx0g7zpA3nWAvOsAedcB8q4D5F0HyLsOkHcdIO86QN51 gLzrAHnXAfKuA+RdB8i7DpB3HSDvOkDedYC86wB51wHyrgPkXYejWR2OZnU4mtXhaFaHo1kdjmZ1 OJrV4WhWh6NZHY5mdTia1eFoVoejWR2OZnU4mtXhaFaHo1kdjmZ1OJrV4WhWh6NZHY5mdTia1eFo VoejWR2OZnU4mtXhaFaHo1kdjmZ1OJrV4WhWh6NZHY5mdTia1eFoVofD7A2H2RsOszccZm84zN5w mL3hMHvDYfaGw+wNh9kbDrM3HGYvHGYvHGYvHGYvHGYvHGYvHGYvHGYvHGYvHGYvHGYvHGYvHGYv HGYvHGYvHGYvLGYP1AsOUC84QL3gAPWCA9QLDlAvOEC94AD1ggPUCw5QLzhAveAA9YID1AsOUC84 QL3gAPWCA9QLDlAvOEC94AD1ggPUCw5QLzhAveAA9YID1AsOUC84QL3gAPWCA9QLDlAvOEC94AD1 ggPUCw5QLzhAveAA9YID5F0HyLsOkHcdIO86QN51gLzrAHnXAfKuA+RdB8i7DpB3HSDvGiDvGiDv GiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGiDvGo5mNRzNajia1XA0q+Fo VsPRrIajWQ1HsxqOZjUczWo4mtVwNKvhaFbD0ayGo1kNR7MajmY1HM1qOJrVcDSr4WhWw9GshqNZ DUezGo5mNRzNajia1XA0q+FoVsPRrIajWQ1HsxqOZjUczWo4mtVwNKvhMHvhMHvhMHvhMHvhMHvh MHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvhMHvh4HfhQHHhQHHh QHEBCvICFOQFKMgLUJAXoCAvQEFegIK8AAV5AQryAhTkBSjIC1CQF6AgL0BBXoCCvAAFeQEK8gIU 5AUoyAtQkBegIC9AQV6AgrwABXkBCvICFOQFKMgLUJAXoCAvQEFegIK8AAV5AQryAhTkBSjIC1CQ FyBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQGiBQ GiBQGiBQGiAEGiBsGSBsGSBsGY5gMhzBZDiCyXAEk+EIJsMRTIYjmAxHMDmdl9TpvKRO51F0Oo+i 03nfnM775nSeKqfzVDmdp8ppPVWCmHSAmHSAmHSAmHSAmHSAmHSAmHSAmPQEJ3gTnOBNcOo2wanb BCdlE5yUTXC6NcHp1gSnW5ObbtVioAUrSP8NvoL0v2lXkP437QrSv6esIP2v51qMx/EV5Pw3GY/j K8j6b9K/ctRiPFmvIKf2DJuZFeSck2Ezs4KcczJe1FeQdU76i3otRte0gpyKMBqgFeQcrtEArSDn cA3zlxXknJNh/rKCnB+EYZSygpwqN4xSVpDx06uGUcoKMqq8Gp4nK8io8mp4nqwg45yqYV9Sq+EP soKcn57hD7KCrC8f2Be963sWlwtrJK5vZVwurCG8vsNhubhngOsbH5cL/HlxzwDX10YsFzduv75k crnA+8iN7q9vqlwusL64J4Xr6y6XC3tSuL4cc7nAuueGidc3bC4XWKvcMPH6ms7lAuvr930S3n/8 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 2vH6qXa4fqodr59qh+un2vH6qXa4fqodr59qh+un2vH6qXa4fqodr59qh+un2vH6qXa4fqodr59q h+un2vH6qXa4fqodr59qh+un2vH6qXa4fqodr59qh+un2vH6qXa4fqodr59qh+un2vH6qXa4fqod r59qh+un2vH6qXa4fqodr59qh+un2vH6qXa4fqodr59qh+un2vH6qW+ffDvj6Z15/uTbGU/vzPMn 3854emeeP/l2xtM78/zJtzOe3pnnT76d8fTOPH/yzYzp+M6kwzuTju9MOrwz6fjOpMM7k47vTDq8 M+n4zqTDO5OO70w6vDPp+M6kwzuTju9MOrwz6fjOpMM7k47vTDq8M/n4zuTDO5OP70w+vDP5+M7k wzuTj+9MPrwz+fjO5MM7k4/vTD68M/n4zuTDO5OP70w+vDP5+M7kwzuTj+9MPrwz5fjOlMM7U47v TDm8M+X4zpTDO1OO70w5vDPl+M6UwztTju9MObwz5fjOlMM7U47vTDm8M+X4zpTDO1OO70w5vDP1 +M7UwztTj+9MPbwz9fjO1MM7U4/vTD28M/X4ztTDO1OP70w9vDP1+M58/eT9f/vh46df3n1Z/8t/ +Zm3/63H96oe3qt6fK/q4b2qx/eqHt6rdnyv2uG9asf3qh3eq3Z8r9rhvWrH96od3qt2fK/a4b1q x/eqHd6rdnyv2uGdacd3ph3emXZ8Z9rhnWnHd6Yd3pl+fGf64Z3px3emH96Zfnxn+uGd6cd3ph/e mX58Z/rhnenHd6Yf3pl+fGf6wd9F/fBe9eN71Q/vVT++V18/+fp/x+Hd68d3rx/evXF898bh3RvH d28c3r1j5iAdMgfpmDlIh8xBOmYO0iFzkI6Zg3TIHKRj5iAdMgfpmDlIh8xBOmYO0iFzkI6Zg3TI HKRj5iAdMgfpmDlIh8xBOmYO0iFzkI6Zg3TIHKRj5iAdMgfpmDlIh8xBOmYO0iFzkI6Zg3TIHKRj 5iAdMgfpmDlIh8xBOmYO0iFzkI6Zg3TIHKRj5iAdMgfpmDlIh8xBOmYO0iFzkI6Zg3TIHKRj5iAd MgfpmDlIh8xBOmYO0iFzkI6ZA0dvP5xVFsNZZTGcVRbD2UoxnK0Uw9lKMZytFMPZSjGcrRTD2Uox nK0Uw9lKMZytFCvIqQhjK8VwtlIMZyvFcLZSDGcrxXC2UgxnK8VwtlIMZyvFcLZSDGcrxXC2Ugxn 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 e+MEtzdOcHvjBLc3TnD7yAS3j0xw+8gEt49McPvIBLePTHD7yAS3j0xw+8gEt49McPvIBLePTHD7 yAS3j0xw+8gEt49McPvIBLePTHD7yAS3j0xw+8gEt49McPvIBLePTHD7yAS3j0xw+8gEt49McPvI BLePTHD7yAS3j0xw+8gEt49McPvIBLePTHD7yAS3j0xw+8gEt49McPvIBLePTHD7yAS3j0xw+8gE t49McPvIBLePTGcb7HS2wU5nG+x0tsFOZxvsdLbBTmcb7HS2wU5nG+x0tsFOZxvsdLbBTmcb7HS2 wU5nG+x0tsFOZxvGdLZhTGcbxnS2YUxnG8Z0tmFMZxvGdLZhTGcbxnS2YUxnG8Z0FltMZ0fFdNZN TGfdxHTWTUxn3cR01k1MZ93EdNZNTGfdxHQ2R0xnc8R0NkesIOecHOrM2ecwnX0O09nnMJ19DtPZ 5zCdfQ7TWc0wndUM01nNMJ3VDNNZzTCd1QzTWc0wndUME9wKOMGtgBPcCjjBrYAT3Ao4wa2AE9wK OMGtgBPcCjjBrYAT3Ao4wa2AE9wKOMGtgBPcCjjBrYAT3Goxwa0WE9xqMcGtFhPcajHBrRYT3Gox wa0WE9xqMcGtFhPcajHBTRQT3B4xwY0PE9z4MMGNDxPc+DDBjQ8T3PgwwY0PE9z4MMEtDRPc0jDB LQ1Xv8zlAmsC5O/AbQgT3IYwwW0IE9yGMMFtCBPcYDDBDQYT3GAwwQ0GE9xgMMENBhPcYDBf2WCw /8df3v35x/cPH3795bunTw+Pf3/cyV7CI23UYX/ub0+fPv+4/0VvfvLtjOM44zjMGMcZ4zDjPM44 zzLmx9OMXz/5dsZ0nDEdZszHGfNhxnKcsRxmrMcZ62HGdpyxHWY8vjP58M7k4zuTD+9MPr4z+fDO 5OM7kw/vTDm+M+XwzpTjO1MO70w5vjPl8M6U4ztTDu9MOb4z5fDOlOM7Uw7vTDm+M+XwzpTjO1MO 70w5vjPl8M6U4ztTDu9MPb4z9fDO1OM7Uw/vTD2+M/XwztTjO1MP70w9vjP18M7U4ztTD+9MPb4z 9fDO1OM7Uw/vTD2+M/XwztTjO1MP70w7vjPt8M604zvTDu9MO74z7fDOtOM70w7vTDu+M+3wzrTj O9MO70w7vjPt8M604zvTDu9MO74z7fDOtOM70w7vTD++M/3wzvTjO9MP70w/vjP98M704zvTD+9M P74z/fDO9OM70w/vTD++M/3wzvTjO9MP70w/vjP98M704zvTD+/MOL4z4/DOjOM7Mw7vzDi+M+Pw zozjOzMO78w4vjPj8M6M4zszDu/MOL4z4/DOjOM7Mw7vzDi+M+PwzozjOzMO70wc35k4vDNxfGfi 8M7E8Z2JwzsTx3cmDu9MHN+ZOLwzcXxn4vDOxPGdicM7E8d3Jg7vTBzfmTi8M3F8Z+LwzszjOzMP 78w8vjPz8M7M4zszD+/MPL4z8/DOzOM7Mw/vzDy+M/PwzszjOzMP78w8vjPz8M7M4zszD+/MPL4z 8+zO7AXRZxmfP/l2xtM78/zJtzOe3pnnT76d8fTOPH/y7Yynd+b5k29nPL0zz598O+PpnXn+5NsZ T+/M8yffznh6Z54/+XbG0zvz/Mk3M6bjO5MO70w6vjPp8M6k4zuTDu9MOr4z6fDOpOM7kw7vTDq+ M+nwzhxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMO oBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxz AOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQ AyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjH HEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA5 5ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADK MQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQ DjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmA cswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswB lEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMOoBxzAOWQAyjHHEA55ADKMQdQDjmAcswBlEMO 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 Ra8gpyJkc9AryDlcB79rDknXHJKuOSRdc0i65pB0zSHpmkPSNYekaw5J1xySrjkkXXNIuuaQdM0h 6ZpD0jWHpGsOSdcckq45JF1zSLrmkHTNIemaQ9I1h6RrFklHKVa+NjtcLrCbp7TDXzsmLhfYzQfY zVOKmq/d2P/N3N8s2XUka5bgrEUyRv0I3pWTTJG6Wb7V/kukBv0KJTXsCchwMpBBAiEAGBl1n75t 702AEYQ73Gxx3ZK8cgdB8qj6+fnsHDO19al6ucTTvOWo+fVI5+USdW85an49F3q5RN1bjppfD5de LlH3lqPm1xOql8vTfbE6ff96zPVyebov1gi+X8/KXi5P98XqGv7rgVvLZXUN//V47uUSdW91Df/1 jO/lErUqkqNFpD2LSHsWkfYsIu1ZRNqziLRnEWnPItKeRaQ9i0h7FpH2LCLtWUTas4i0ZxFpzyLS nkWkPYtIexaR9iwi7VlE2rOItGcRac8i0p7Foz2DuLGCuLGCuLGCuLGCuLGCuLGCuLGCuLGCuLGC uLGCuLGCuLGCuLGCuLGCGKuCgCVBwJIgYEkQsCQIWBIELAkClgQBS4KAJUHAkiBgSRCwJAhYEgQs CQKWBAFLgoAlQcCSIGBJELAkCFgSBCwJApYEAUuCgCVBwJIgYEkQsCQIWBIELAkClgQBS4KAJUHA khlEFAFolCA0ShAaZQYRRQCEJQjCEgRhCYKwBEFYgiAsQRCWIAhLEIQlRCNEiEaIEI0QIRohQjRC hGiECNEIEaIRIkQjRIhGiBCNECEaIUI0QoRohAjRvBAi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi 5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi5hMi 5hMi5hMi5hMi5hMi5hMi5hMi5nNVXLxcou49ZChEZOiq5ni5RN17+FGI+FGI+FGI+FGI+FGI+FGI +FGI+FEQ21UQ21UQ21UQ21UQ21UQ21UQ21UQ21UQ21UQ21UQ21UQ21UQ21UQM9QMIp8TaCs+g8jn BNqKzyDyOYG24lFAW/EZRFYuaCs+g8hbDvp2zyDyloO+3VFA3+4ZRN5y0Ld7BpFFSEixQkixQkix QkixQkixQkixQkixQkixQkixQkixQkixQkixQkixQkixAvp2zyCiCIKXFYKXFYKXFYKXFYKXFYKX FYKXFYKXFYKXFYKXFYKXFYKXia6FEF0LIboWQnQthOhaCNG1EKJrIUTXQoiuhRBdCyG6FkJ0LcS3 XAtvPr05R33+9eGe2/kl4nj4/qc3b3/++PDDh6enX0eOzl+vfuRA1J9oKiheC+nrGOflEmXptZC+ zoJeLlGWXgvp60Dp5Xr56/iF5VLSc8ult3iMeh43Xgorz4WNeSg8EoJXvWbO1xnYyyUq0GvmfB2k vVyiAr1mztdp3MslfvOKDGMRGcYiMoxFZBiLyDAWkWEsIsNYRIaxiAxjERnGIjKMRWQYi8gwFq+Z 81X90HKJPGQRecgi8pBF5CGLyEMWkYcsIg9ZRB6yiDxkEXnIIvKQxeMhM/EYZeIxysRjlInHKBOP USZ2oUzsQpnYhTKxC2ViF8rELpSJXSgTu1AmdqFM7EKZoBeZoBeZoBeZUBSZUBSZXLRnctGeyUV7 JnfmmdyZZ3L9PYPIWw6mas8g8jmB2/lMbuczuTPP5M48kzvzTO7MM7kzz+TOPJM780zuzDO5M8/k zjyTO/NM7swzuTPP5M48kzvzTO7Ms4g2ZxFtziLanEW0OYtocxZx5CziyFnEkbOII2cRR84ijpxF HDmLOHIWceQs4shZ5AqyyBVkkSvIIguQRRYgixelWbwozeJFaRYvN7N4uZm/dSFJDgReLvH7y5tp m8Vr0Cxeg2bxujGL141ZvG7M4nVjFq8bs3jdmMXrxixeN2bxujGL141ZvG7M4nVjFq8bs3jdmMXr xixeN1ZSQ6mkhlJJDaWSGkolNZRKaiiV1FAqqaFUUkOppIZSSQ2lkhpKJTWUSmooldRQKqmhVOI7 qMR3UInvoBLfQSW+g0p8B5X4DirxHVTiO6jEd1CJ76AS30ElvoNKfAeV+A4q8R3MIKII0NZ2BhFF gLa2M4goArS1nUFEEaCtba2gre0MAoqooK3tDAKKqKCt7QwCiqiADJ5BQBEVtLWdQUQRoK3tDCKK AMjJDCKKAMjJDCKKAMjJDCKKAJzKDCKKAJzKDCKKAJzKDEJnDe0cXMX6TxXrP1Ws/1Sx/lPF+k8V 6z9VrP9Usf5TxfpPFes/Vaz/VLH+U8X6TxXrP1Wt/3i4eRVx8yri5lXEzauIm1cRN6/fwM1/97CH f7v+49M/Pj29+/Tw8dObD5/evvvxV6Pau19+/u7pw8ORcjrGqHW0//Xh/Q8/nH/+yI8ttdx7KiWl +NP37z+cT+SMfXcn+3j64b56Vucf+71Z7l8ecD/pv7z5+9PD9z89vfnw9GenJuC9teLS9Yj5KhLz VSTmq0jM128R8/+sqQ9PP/7y05vfi298tmL+8nGK6lZ4z8fjMU60Yk3A4xLwuyv448Px3CM+P8EP T+fr+fT+4fGO+Zx0NQiVYbR32vMAXEUbL5e4kr2eyFflx8slrmSvJ/JVPvJyeT/C1euJfNWgvFye 7qvXE/kqZHm5PN1XryfyVQ3zcnm6r15P5Kuk5uUSde+Bw1ddzssl6t4Dh6/inpdL1L0HIV8VQi2X ByFf9UQvl6j7lyHk83/eD537yJ/ffPr9IaoCr9wMIlVp4JWbQaQqDbxyM4hUpYFXbgaRqjQw2M0g ck8B2hTPIKII0KZ4BhFFgDbFM4goArQpnkFEEZkoAjREnkFEEcCnOYOIIoBPcwYRRQBzZ63A3DmD iCKAI3QGEUUAR+gMIooAjtAZRBQB+jXPIKIIwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1W wk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1Wwk1WckdSCTdZCTdZCTdZCTdZe1s6Lr1y 54RPVN5pUKwQeHbN61jm5RIrBJ5d8zrbebnECoFn/bwOiF4uUfdeG+jrlOnlEnXvtYG+jqpeLlH3 WdS912f6OgZ7uUTde/bp6yzt5RJ171mxrwO5l0vUvWfrvk71Xi5R956t+yoNeLlE3Xvdra/6gpZL xI2riBtXETeuIm5cRdy4irhxFXHjKuLGVcSNq4gbVxE3riJuXEXcuIq4cRVx4yrixlXEjauIG1cR N64iblxF3LiKuHH1ultfdSgvl6h7kdWtIqtbRVa3EstwJZbhSizDlViGK7EMV2IZrsQyXIlluBLL cCWW4Uosw5VYhhuxDDdiGW7EMtyIZbgRy3AjluFGLMONWIYbsQw3YhluxDLciGW4EctwI5bhRizD jViGG7EMN2IZbsST24gntxFPbiOcVSOcVSOcVSOcVSOcVUP0k2jfqd7Ai2sD4eUSt8Ki2aWKZpcq ml2qaHapotmlimaXKppd6stml989bMWNmeKxHI9zu1S+mDEfl9xr59P4pv3yfMBrV+F0a2e9l000 6DTRoNNEg04TDTpNNOg00aDTRINOEw06TTToNNGg00SDThMNOk006DTRoNNEg04TDTrtZYPOvz99 eP/w09O7Hz/95WF+gV+BDx//8v7Dp5Ncepj5vuTon1P891/e/fUhSrkC3j59/Jfv7/s3YX6D//ZU viR4+Pj2358efvjw/ueHo56G47oaOv4pdP7hGVryYmw8/lNsy9efJadJ0bTTRNNO+8bkgNfs6S36 M/b0o4/Sz5HMbekXfiZ5xZ8+H/H5Ga77018O+u19uJ/vz29+fPv9w39+ePzH8d2b86Xe//rxSvnS qeTevfzyt09fHj0DX37wf/on5V8Bf3r3/uG//bpi/vXv/BZ0PuS1x/ztw/vvfnr6+eF/vJ0L8LcH fP/+3f3G/G63dIa8sltqxEzUREisiZBYEyGxJkJi7WVIbO1bKf3zl+H9pcQO13/4ez0//sHv9fzP X7Dz23bjez0fX78L1794/8PDT28+fvr1qb//+9OHH356/z/mW/K3N98/zdf1w69I7QsvKX311XGs PqP0zz9S14uZG4T7afwv/8tXf/F3wWX+wR+ePjy9+/7pXLp/f/PT28+L83HnIyl/9CMp//yRpPuN /Rfl5LrUhGekcuTHmlKKlsfm2W/+kW+f/c4HvPZtll+acz//03huzv05s2Zc/rkXwsrjc2El1dzj dGa9FHY8F1bjMdUBaqVjAG/WFSR9h81c+185YwCOfgxwgL+envZSvXvU68U4uY7Hx/2K7xm0XfE9 g7Y/tzNoWyEzaH93fb8R3ptq7Rnut83LZQn6fpO1XPsulzNo+9LmDCLS2L/qn0H7V/1n0PY38hm0 fdNzBoElfOxfGJ5B4Bvm2L8wPIPAN8yxf2F4BgHtHfs9hs8goL1jv8fwGQS0d+zfZ55BRBH7brQz iChiv7/HGUQUsd/f4wwiitg/kp9BRBH7985nEFEE2YUcZBdykF3Isd/f4wwiiti/4Z5B+/09ziCi iP3+HmcQ2ZdqgOG9vfBymXslcfOv0QT31sXLZdUC742OlevQbpDubZGXy3yN3nnj0G6Q7i2Xl8tb j4fW4u3et3m5vPV4aLdF9+bPyyXqXmtccO8gvVyi7rXGBfc2VMulNS64N61eLlH3Yn3pEOtLh1hf OsT60qE1Lrh31V4uUfda44J7a+7lEnWvNS44HkEPtTMInMNAD7UzCJzDQA+1Mwicw0APtTMInMNA D7UzCJzMQQ+1M4goglwqgB5qxyPooXYGEUXs91A7g4gi9nuonUFEEfs91M4gooj9HmpnEFHEfg+1 M4goYr+H2hlEFLHfQ+0MIoogt0uV3C4BI+n9o+b9QHqbJq/7x/3LqOXSun/cv6NeLm/T5HX/uH+M vVzeYcHr/nH/onu5RN1r3T/ubYGXS9S91v3j3lt4uUTda90/7g2Kl0vUvdb9497laLm07h/3nsjL Jepe6/5xb6y8XKLuxcs5r/vHvWmzcnVy3uv7HSruv6Q9a81AejwOcg4d3s9RgK4BZ9D+ESEaKPdE A+WeGbT/ps6g/aPcDNo/ys2g/aPcDCKfEyj3zKD99RWeke5Wl5bLO0ldWvRyiUvYO0ldgvZyab+s l/y9XKK+vJNUbvtjXM6g/W+gGbT/DTSD9r+BZtD+N9AM2v8GmkH7xaRMfpMy+U3K5Dcpk9+kTH6T MvlNyuQ3KZPfpEx+k2YQUQTYkuYGriBmEFEEuIKYQUQR4ApiBhFFgCuIGUQUAa4gZhBRBLiCmEFE EeAKYgYRRYAriBlEFAGuIGYQUQS4gphBRBHA4DKDiCKAwWUGEUUAV8wMIorY72V5BhFF7PeyPIOA Ivp+L8szCCii7/eyPIOAIvp+L8szCCii7/eyPIOAIvp+L8sziChiv5flGUQUAaxpM4goAljTZhA6 a2jn4OtY5eXSzsHXIczLpZ2DryObl0urMGex/pPF+k8W6z9ZrP9ksf6TxfpPFus/Waz/ZLX+492k X8dYLZd3k34der1cou69m/Tr5OzlEnXv3aRfx28vl6h77yb9OsN7uUTdezfpVyHAyyXq3rtJv6oJ Xi5R995N+lWS0HJ5NtergOHlEnWvNc2+qyBeLlH3WtPsu5Ti5RJ17/V2uuoxXi5P911rQH0Xdbxc nu671oD6rgx5uTzdd60B9V1e0nJpDajvYpSXS9S91z7gqmh5uUTdAyprBpGKKGjNNINIRRS0ZppB pCIKWjPNIFIRBa2ZZhCpkYPWTDOIKAK0ZppBRBGgNdMMIooArZlmEFEEaM00g4giQGumGUQUAVoz zSCiCNCaaQYRRYDWTLkTJqJ7DOT1Fe/lEvcwXiuY63fCyyXuYbxWMNePjZdL3MN4rWCuXywvl6h7 rxXM9bOn5fJawVw/kl4uUfdeK5jrl9bLJereawVz/Vx7uUTde61grt98L5eoe68VzLVxkHLVnvc3 ITNof7N4/SXvWb+4Ks7/eT/0nMXw5tfpEv8UWvPSY+7kL0wzuB+y+7R7B2TvDNrfW86g/dPGDEKv aV9AM2hfQDNo/7Qxg/ZPGzNo/7TROyB7ZxBRBCB7ZxBRBCB7ZxBRBCB7ZxBRBCB7ZwxRBCB7r+8I 6Wvy+urwcmmbreuLxsul/axcX0teLm2zdX2Jebm0zdb1leflEnXvgRDX96aXS9S9B0JcX75eLlH3 HghxfYNruTwQog9wvTCDwO/yADcFMwj8Lg9wUzCDwO/yADcFfQD35AwC+6dBTgkDuCdnEPmcgHty BpHPCbgn+wDuyU4aZ8wgoghyxhrkjDXIGWt4Febr+8bL5f1wDa8qfH1pebm8H67hVYWvbz4vl7cx Gp4j4Pr69HKJ+vIcAdd3sJdL1JfnCOhiM6Pr+93LJepePAgP7SAcj2ADdwZt/8bPoH1q4wza/o0/ g7Z/48+g7d/4M2j7N/4M2v6NP4O2d31nEPlw96mNM4goYp/aOIOIIvapjTOIfLj7tyxnEHnLM3nL 9xsMnUFkaew3GDqDyLu332DoDCJLY7/B0BlEPidti3p/W2u5NNjg/m73clk/+/cvgZfL+tm/fze8 XNZ29/6V8XJZ2937N0nLpcEG9y+Yl0vUfRa1qiEA96+jl0vUhNZs4v6J9XKJn6PWbOL+nfZyid85 WrOJ+8deyhVk/xlk/zmD9ndQM2h/BxVkpxtkpxuj7B8uZtD+4SLInjrInjrInjrInjrInjrInjrI njrInjrGftPOM4goYv/a6Qwiiti/djqDiCL2r53OIKKI/WunM4goYv/a6Qwiiti/djqDiCL2r53O IKKIfUrvDCIf7j5wdwaRz2kfuDuDyOe0D9ydQeRz2gfuziD0OZFFuM/OnUHkw91vcHkGkbd8v1fl GYQ2VNpmP8RD27Wl9HJpm/0QD5MhHiav7aqXSyswhHjIDfGQG+IhN8RDboiH3BAPuSEeckM95God Fe+9updL1L3GT9wbfi+XqHuNn7hPDV4uUfcaP3EfPbxcou41fuI+v3i5RN17/MR1CPJyiVrVgP37 JOXlEvWlAfv3cczLJepLA/bvM52XS/wu1CD7+2Do5RL1pXX1u0+XXi7t+6s8AiysPKbHy6X723/9 7qf33//14ec3P779/uE/PzzOR//6rx5PE+/DS3+7/un79x8+/PK3T18ePQNffvB/ul/zf//l3V/v gD+9e//w3x6e3n06n/u//J3fgs6HvPaYv314/91PTz8//I+3n/7yTw/4/v27TzPw48O/OJDvkG86 kO+HoA9D+2A96qM8gtr4DNqv3Myg/QrbDNov98wg8gGB2vgM2i/LzSCyLkFtfAbtl+VmEFEEqI3P IKIIUBufQUQRoKA+g4gi9m3vMwhU4WcQUQSows8goghQhZ9BRBGgCj+DiCJA6X4GEUWA0v0MIorY H2h1BhFF7A+0OoOIIsAlwQwiitgfaHUGAUUc+wOtziCgiGN/oNUZBBRx7A+0OoOAIo79gVb3hsrb nGknnmv75eXSTk/XZs3LJZ6evErltePTcnmVymt/6OUSde9VKq9NppdL1L3W8uTeqXq5RN1rLU/u 7a6XS9S9V0G99sxeLlH3XgX12nh7uUTde9XYa/eu5fKqsdde38sl6t6r7F4HBi+XqHuvSnydOrxc ou612S/30cXL5en+0Ga/3OcfL5en+0Ob/XIforRcpJQS++NuzyByXhR/QkIbaXK/GClXewQ+jhm0 X1GYQfsVhRm0X1GYQfsKmUH7CplB+xWFGdReaZw7HwNKf9dn6elC+4q9Pnkvl/YVe+nEy2WuSe0r 9hLbC7lWNPjtq9PrIWeavz99+Pj2fB6//Pzd04eHx398fz6rf37kEY+v/sHPj7nvpr/kSj+04+t0 x/N/OOeXHvrtv3w895eP7/PT1+ni+b/cXnrkt/9wPPeH8zj61+nSCy/5zy899Nt/OT37Zo945iXn 5//yD7/+30sB3/77+bm/X1P/7ut05fm/n9JLD/32Xy7P/eU/916+Tlef/8tHvPTQb//l+sJ7/ky6 9q33/M/PvPLXf1U+P+Z3f//NY3vm7/cX3vMXH/rtv9yf13l5Rm3jm2p75rvgDvgv755+fPPp7d+f /uvDx7f//vTwb8cpsjxfXCupjXmQbM+s0bH8iaQXvuvup/VmvBTwzfclPfuV9+wnkl74ykuPLz30 23/52a+8POrX393pha+8Fz+RXwO+/kRqfkw9zS/60o/SxlGfedee/UZ8/hNZ+JpLz37N5dS+Fl56 4Wsu1Zce+u2//OwX3Ny8P/OXX/iCe+ZrJi18wYEOWO0ADNAMAjvtAzBAMwjstI/6wpfoc9uTz7uk D09n3n8NWdq6vLJX2tvd/Ouz+eeYjX3PH3xJx+svaWfbtPuSnttQ/cFXFK+/op392PaH9NxO7Q++ pPT6S9rZ6O2+pG9sAf/gC3tlcszuDnL3hT27t/yDL6m8/pJ2tqa7L+nZTesffEmv0bWbe14mv2d3 w3/whbXXX9jOZnpbfq8n2X5J/fWXtLNLh18Vz+3fX31hdG//6gve2f6zF/zsweCPfZLp9c3G1rli W5zPnTj+4Et6fbOxdWDRxPn7VEviXDvmvPqCd05Cr7zg185Irz6XnWPUtp6eO2D9QT29vn3YOp8J v7W/T7L9kl7fPtCDn1VtPjwo8Tomerm8ivrhQYkz1/4F6AzaJ4fbAfwmMwjc8x3AbzKDUPVBu5+9 3lQtl4d0Xh+Bl8u7hzs8pHOQy85BfA6D+BwG8TkM4nMYxOcwiM9hEJ/DID6HQXwOg/gcBvE5DOJz GMTnMIjPYRCfwyA+hxkEFHE8AkUcj0QRB1HEQRRxEEUcRBGAZJpBRBEHUcRBFHEQRRxEEUEUEUQR +5MFzyCiiP1xhGcQUQQwvY8DTLMZx/44wjOIKAKMwBkHGIEzDjACZxxgBM44wBCXGXQITR/GidCv Nn24Hrzb9OEKeqXpw/WYvaYPV8i3j8qDuHiHyO4Pkd0fIrs/RHZ/iOz+ENn9IbL7Q2T3h8juD5Hd HyK7P0R2f4js/hDZ/SGy+0Nk94fI7l/nBS+Xp/vzdKHlOkTdH6LuD1H3h6h7z+RwnXO8XKLuD1H3 h6j7Q9R9iLoPUffaJOb7fOblEnWvTXW+D3leLlH32lTn+6So5fIasV3nSi+XqHtv/N51OPVyie8X mCozg8iZHlCzg1Czg1Czg1Cz4wCd8wa5yRzkJnOQm8xBbjIHuckcgS4UvNbql469XOKXhccGDJEN GCIbMEQ2YIi320O83R7i7fYQb7eHeLt9LWInVzpABXcG7c96O4O2v4PPoO3v4Bm0P+vtDNr+Dj6D tr9Oz6DtX+UzaPtX+Qza/lU+g7Z/lc8gooj9X+UziChi/1f5DCKK0Dad9zLzclnf1/ei1HJpI2Du JezlEr9jtX3K/T3g5bL2Kfe3hpdL1L22T7m/erRc2j7l/qKyckUC3/6hDZSfufb7K99B1hNI+7fn ZxD4VUrk5zmRn+e038b8DEJ/CWwE0n4b8zOIvOX7bczPILARSPttzM8gsDVM+23MzyCiiP025mcQ UcQ+AHEGEUXs471nEFGEVie9v29eyvXm05sTVfnrDHj48PTjLz+9+fCvsWU8fP/Tm7c/f3z45ePT n3+FZyI/tpJOS9BF1cy/+fbdjw/vnv5xMywn+/K7JBfE8+6K/vhwPPeIf3WUfHr/cNu+viRdDULf rNpbLe5sktbS9/569nJ5O66ktfS9v+O1XFpL3/sXwcslfi1oLX3vnxUvl6h7raXv/dvk5RJ1r7X0 vX/gvFya7tMBti0zaH/bMoP2ty0zaH/bkkDL0DNof9uSDrBtmUH725YZtL+RnUH7G9kZRBSx70o6 g4gi9l1JZxBRxL4raW4u911JZxBQBLhEPIOAImLflXQGAUXEvivpDAKKiH1X0hlEFLHvSjqDiCL2 XUlnEFHEvivpDCKK2HclnUFEEfuupDOIKGLflXQGEUXsu5LOIKKIfVfSGUQUse9KOoOIIvZdSWcQ UcS+K+kMIooAddUZRBSRiCL2u1OcQUQRiSgiEUWAqnQKQATMIKKITBSRiSIyUUQmishEERmdNbTz +XWs8nJp5/PrEObl0s7n15FNy+Wdz68DnpdLq0tdx0Evl6h7zbZ3nym9XKLuNdvefTC1coVm27uP sV4uT/eh2fbus7CXy9N9aLa9+0Dt5fJ0H5pt7z6Ve7lE3Wu2vfto7+USda/Z9u76gJdL1L1m27uL DFouzbZ3lyS8XKLuNdveXdfwcom612x7d3HEyyXqXrPt3RUWL5eoew9Huco0Xi5R90nUvQc5XiUg L5eo+29gRaSO5OUSdZ9F3WdR91nUfRZ1n0XdZ1H3mVREM6mI7k+hPINIRXR/CuUZRCqi+1MozyBS Ed2fQnkGkRo5cJjNIKII4DCbQUQRwGE2g4gigMNsBhFFAIR9BhFFAIfZDCKKAA6zGUQUse/7PoOI IhpRBLAazCCiCGA1mEFEEcBqkAJYDWYQUQSwGswgogjC7BFHzwwiiiDMXhBmLwizF4TZC8LsBWH2 gjB7QZi9IMxeEGYvCLMXhNkLwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlxOxl sW6QxbqBNif+PoR5ucS6gTYn/j7JebnEuoE2J/4+Dnq5RN17nRCuM6WXS9S91wnhOph6uUTde37B 63Tr5RJ173VCuI7IWi6vE8J1oPZyibrX5hHdp3Ivl6h7z496He29XKLuPT/qVR/wcom69/yoV5HB yyXqXuRdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+Rdk8i7JpF3TSLv mkTeNYm8axJ51yTyrknkXZPIuyaRd00i75pE3jURz2ointVEPKuJuI8ScR8l4j5KhL5IhL5IhL5I hL5IhL5IhL5IhL5IhL5IhL5IhL5IhL5IhL5IhL5IhL5IhL5IhL5IhL4gDQQTaSA4g4giCH2RCH2R CH2RCH2RCH2RCH2RCH2RRBNHEk0cSTRxJBFuTCLcmES4MYmXc0m8nEvi5VwSL+eSeDmXxMu5JF7O JfFyLomXc0m8nEvi5VwSL+eSeDmXxMu5JF7OJfFyLomXc2IzzyQ287z2RF4uUffi5VwSL+eSeDmX xMu5JF7OJe9yrhDIvBDIvBDIvBDIvBDIvBDIvBDIvBDIvBDIvAQ45hQCmRcCmRcCmRcCmRcCmRcC mRcCmRcCmRcCmRcCmRcCmRcCmRcCmReRaSoi01REpqmITFMRmaYiMk1FZJqKyDQVkWm6vpG1XN62 qYhMUxGZpiIyTUVkmorINBWRaSoi01REpqmITFMRmaYiMk1FZJpKAs1kZxDYe5DbvOvpeS/Vk79Y aS1kyFBJwHRUMrDNzCCwD86g920R53Zc74+VK3tMyfVuarm8/jwtgQ9sBu2fdq6/5D1r7Zd2PIKm rzNof0XNoP33+np63kvVBH29GCvXAboWX0HWEyBTBwZpeD5Iw/NBGp4P0vB8kIbngzQ8H6Th+RC7 bQ6xw9wQO8wNscPcEDvMDbHD3BA7zA2xw9wglNYglNYgcx8Hmfs4yNzHQeY+DjL3cZC5j4PMfRxk 7uMgcx8Hmfs4RChhiFDCEKfXDXF63RCn1w1xet0Qp9cNcXrdEKfXDXF63RCn1w1vel0+8v7+6Q7S nsA+O30GbX/JnUHbP0YzaP+38gwib+o+0XwGbf8YnUHbP0ZnEPmc9onmM2j7x+gM2v4xOoOIIvav +mfQ/g/sGURe0363oxm037joDCKC3W9cdAYRwe7XEM8gItj9xkVnEPlw9xsX5aPsH/vPIKCIsl+B PYOIIjSu+P4x8XJZ28j7p8fLJf5ia/zu/fvl5bK2kfevnZdL1JfG794/mV4uUfcaiHL/7nq5xPdL M+nfP95eLnFta8b6ewfg5RLXtmasv7cRXi5Rq5qx/t6LeLk83RftEvTe0Ei5Ut6ffXoG7W9iZ9D+ JnYG7W9iZ9D+Jjbl/dmnZ9D+JnYG7W9iZ9D+JnYG7R9rZhBRxP7s0zOIKGJ/9ukZRBSxP/v0DCKK 2L8GP4OIIvZnn55BRBGggjaDiCL2uw+cQUQRoFaXSK0ukVpdIrW6RGp1idTqEqnVJVKrS6RWl0it LpFa3Qwiiti35ZxBRBH7tpwziChi35ZzBhFF7NtyziCiiH1bzhlEFLFvyzmDiCL2bTlnEFHEvi3n DCKK2LflnEFEEfu4wRlEFLGPG5xBRBH7uMEZRBSxjxucQeisoR3brxOSl0s7tl/nKS+Xdmy/Tl9e Lu3Yfp3VvFzisV2bi3gf+Lxcou61uYj3qdHLJepem4t4Hz29XKLuNcT5Pr96uUTde1d81yHYyyXq 3rt6TOLVYxKvHpN49ZjEq8ckXj0m8eoxiVePSbx6TOLVYxKvHpN49XiVEbxcou41D/xdi/ByibrX PPB3QcPLJepe88DfVREvl6h7zQN/l1a8XKLuNQ/8XZ/xcom61zzwd5FHy6WR+ndJyMsl6l4j9e+6 kpdL1L1G6t/FKSlXIVXMQqqYhVQxS9nvkH4G7dcWZ9B+bXEG7dcWZ9B+bXEGgc+p7JtcZ9C+yfUM 2q82z6D9avMMIorYN7meQUQRgGyZQUQRgGyZQUQRgGyZQUQRgGyZQUQRgGyZQUAR4s6iiDuLIu4s rq9pL5f2C359qXu5tF/w6yfAy+Xpq2j++ft3xMul7VyvXx0vl6h7zT9//3R5uUTdezeR1++fl0vU vXcTef2IerlE3Xs3kdcvsZfL030FVrEZBPYidX/G/RkE9iJ1f8b9GQR2p3V/xv0ZBHandX/G/RkE dqd1f8bXGUQUQU6wlZxgKznBVnKCreQEW8kJtpITbCUn2EpOsJWcYCs5wVZygq3kBFvJCbaSE2wl J9hKTrCVnGArOcFWcoKt5DBagc1iBpEPF9gsZhD5cIHNYgaRDxfYLGYQ+XCBzWIGEUUAm8UMIooA NosZRBQBbBYziCgC2CxmEFEEsFnMIKIIYLOYQUQRwGYxg4gigM1iBhFFAJvFDELHBu9AVz1H6HWc 8XKZBzqvkFG1Ucv3UcnL5RUyqjZq+T5veblE3YuF6yoWrqtYuK5i4bqKhesqFq6rWLiuYuG6ioXr Khauq1i4rmLhuoqF6yoWrqtYuK5i4bqKhesqFq6rWLiuYuG6ioXrahabPdvLdVz3cola9Wwv15nf yyVq1bO9XIUDL5f4He3ZXq7qg5dL1L1ne7lKGFouz/ZyFTy8XKLuPdvLVTXxcom692wvV+nFyyXq 3rO9XPUbL5eoe8/2chWBrFyN3F00cnfRyN1FI/RdIxcejVx4NHLh0ciFRyMXHo1ceDRy4dHIhUcj Fx6NXHg0cuHRyIVHIxcejVx4NHLh0ciFRyMXHo1ceDRy4dHIhUcjFx6NXHg0cuHRyIVHIxcejVx4 NHLh0ciFRyMXHg30lZpBRBGgr9QMIooAfaVmEFEE6Cs1g4giQF+pGUQUAfpKzSCiCNBXagYRRRBH VgPjEa5Norfh9DbCTSzSNZEubWLBr4kFvyYW/JpY8Gtiwa+JBb8mFvyaWPBrYsGviQW/Jhb8mljw a2LBr4kFvyYW/JpY8Gtiwa+JBb8mFvyaWPBrYsGviQW/Jhb8mljwa2LBr4kFvyYW/JpY8Gtmwc/r c3Mdmbxcou69PjfXucvLJere63NzHd68XKLuvT431wnQyyXq3utzcx0jvVyi7r2xPo10nWik60Qj XSca6TrRSNeJRrpONNJ1Yu5u9qtIcxuDPiftS62JVvAmWsGbaAVvohW8iVbw9g0r+P0v//Lm708P 37//cAY//fnhtyyfFdcePr7996eHHz68//nhiPbw6f0DmGd5SVd7US/vNM//eT/0h/cffn7zaf7D v4b2fD3mv7x7+vHNp7d/f/qv98v7t5riKCXnftRo/RiPKZ1P4l9j98t8c4NNvlHAmNEZVK+X9vOb H99+//Dul5+/e/rw8PiP/Ob77756JWP86Xf/PIXw8eH//L+uP3b9re9++fTw6S9PH54e3n6cf/X8 b39++vvb75/IMxt/+uHtT09fP/76t79/6Mpn+M/i/enpzYenP6sf86vpoRK0FeCNm7t0843VtCan zwk+PJ1/759j/icW2qvfIZ/+7789PTwe6XH+31fRr2nkd2usPh4P/3b9mad/fHp69+nh46c3Hz69 fffjw3c/vf/+r5/f4aOW1lOUx2Mc6X99eP/DD+erOPJjSy33ns5GDvlPv35hn9Hv7nQfz8Xy8Ls/ eL2UP7/59Ob8j3/9/To6H/DKi6hgYm87qZjX1nAlvyHfwG1W/t5rr3U+5F//ua18YHGkPr9RxuMx v3TG8eUj66n3s+3f0kc12isf1XzAq09//+ZqFHCXOYP2d6GjgLvMGbQvvxm0f1qYQfunhRm0/9s+ g/Z/22fQ/nKZQUQR4C5zBhFFgO6SM4goAszImUFEEWBGzgwiigAzcmYQUQTY7MwgoohBFAHu0Qdp s3F9WUqbrus7VMvlFSCvb1wvl3ZWv76fvVzaRvz6NvdyaQXI67vfyyXq3muHef2AeLlE3XuNtq9f IS+XqHuv0fb1U+blEnXfRd13UfdD1L13ITBEJ/CoZPdVye6rkt1XJbuvSnZfley+Ktl9VbL7qmj3 NcB+vA6iCFB9nUFIEd4XdRW/qKv4RV3FL+oqflFX8Yu6il/UVfyiruYX9fA2KOey9HKJuvcq5IOY LAYxWQxishjEZDGIyWIQk8UgJotBTBaDmCwGMVkMYrIYxGQxiMliNFIla6RK1sg+rZF9WiP7tEb2 aY3s0xrZpzWyp2lkT9PInqaBS5oZRN69gd49sNz7I1juHVyDzSCwnjroRj6DgCI66EY+g4AiOuhG PoOAIjroRj466EY+g4giQDfyGUQUAbqRzyCiCNCNfAYRRYBu5DOIKAKQjTMIbRK9Xb3IuQ+Rcx8i 5z5Ezn2InPsQOfchcu5D5NyHyLkPkXMfIuc+RM792oR7ucTXKFaqmlipamKlqomVqiZWqppYqWpi 5aWJlZdmVl5eZhPRwcTLZX6O3nf0ebrxcnnfX91rfH4dkbxcnu671/j8Omd5uTzdd6/x+XVY03J5 jc+vo52XS9S91/j8Oh96uUTde43Pr0Oml0vUvdf4/DqperlE3YM2bzOIlBJAm7cZREoJoM3b6KDN 2wwixSXQ5m0GkeISaPM2g4giQJu3GUQUAdq8zSCiCGDHnEFEEeTqqHudY64F7eUSv829zjHXt4KW y+scc32HeLnEXYzXOeb6IvJyibr3Osdc32ZeLlH3np/3+kr0com616qB5QBDxs6g7W/wM2j75/kM 2v55PoO2f57PoO2f5zNo++f5DNr+eZ5B+zjIGbT983wGEUXs/6afQUQR+z61M4goYt+ndgYRRez7 1O6V630LmN8o1q/fvfy9XNav3/1l4eWyfv3urxYtl3avdn8ReblE3Zu/pJp96/6S83KJutfsW/c3 pZdL030i+5RE9imJ7FMS2acksk9JZJ+SyD4lkX1KIvuURPYpiexTEtmnJLJPSWSfksg+JZF9Sqr7 fvoziChinxSeQftOoTOIyGgfWz2DyIe7j62eQeDDbfvY6hkE3vK2j62eQeBzavvY6hkElnvbx1bP IKCIto+tnkFEEfvY6hlEFLGPrZ5B5MPdJ1DPIPLh7hOoZxD5cPcJ1Bm0T6CeQeQb1jtFJvEUmcRT ZBJPkUk8RSbxFJnEU2QST5FJPEUm8RSZxFNkEk+RSTxFJvEUmcRTZFJPkVoTkHsz7OUSda95f+8d tZdL1KpGZ97bci+Xp9Wm0Zn33t7L5Wm1aXTmfUDwcnnf0U2jM+9ThpfL033T6Mz7qOLlEnWv0Zn3 ecfLJWpVIyrvQ5OXS9SqRlTeJy8vl6jVIMfIfartDCJ/aZ9qO4NINQKAFAn01TiDSAmDXFCAvhpn EClhkAsK0FdjBpELCtBX4wwiiiAXFGB46RlEFEEuKMDw0jOIKIJcUDRyQQFamZxBRBH7rUzOIKKI /VYmZxBRxH4rkzOIKGK/5dwM2m85dwYRRYS4RdAwyvvHVsulYZT3T7OXS9xmewBV8hoT3D/7Xi5x yy6Wvr3GBPeWQssllr69xgT3vsTLJepeLH17A/juPY+XS9S9WPpuYum7iaVvr1nFvfvycom615pV 3Fs4L5eoe61Zxb0P9HKJutfaqt6bSSlXIZzEDNo/dRQCVxQCVxQCVxQCVxQCVxQCVxQCVxQCV8wg ooj9waVnEFHE/hSUM4goIogigigC1ElLS0QRiSgiEUUkoohEFJGIIhJRRCKKSEQRiSgC1H6LeJ90 /S54ubSNTxHvpop4N1XEu6ki3k0V8W6qiHdTRbybun7mvFyi7rWhzPdvpZdL1H2Iug9R917B9fp5 9nKJuk+i7pOo+yTqPom6T6Luk6j7JOo+ibr3CtSNXNA3ckHfyAV9Ixf0jWzSGrmgb+SCvpEL+kYu 6Bu5oG/kgr6RC/pGLugbuaBv5IK+kQv6Ri7oG7mgb+SCvpEL+kYu6Bu5oG/kgr6RC/pGLugbuaBv 5IK+kQv6Ri7oG7mgb+SCvpEL+hkUrwxxLw2Md7h/+LwfUW3z2MRb8Sbeijd306FtHpt4K97EW/Em 3oo38Va8ibfiTbwVb+KteBNvxZt4K97EW/Em3oo38Va8ibfiTbwVb+KteBNvxZt4K97EW/Em3oo3 8Va8ibfiTbwVb+KteBNvxZt4K97EW/FrY/dCrpX93h34lzd/f3r4/qenNx+e/vzVQ7afUgeXcFOO 4EzQSd2gk7pBJ3WDTuoGndQNOqkbdFI3AF2PzyBwSuykbtBJ3aCTukEndYNO6gad1A06qRt0Ujfo pG7QSd2gk7pBJ3WDTuoG3buvuL4OvVzeT30Xj3ZdPNp18WjXxaNdF492XTzaib2Xr293L5eoe/Fo 18WjXRePdl082nXxaNfFo10Xj3ZdPNp18WjXxaNdF4923TvakfHBhYwPLmR8cCHjgwsZH1zI+OBC xgcXMj64kPHBhYwPLmR8cCHjgwsZH3wGEUUAvngGEUUAvngGEUUAvngGEUUAvnh0gETMIPI5ASRC nMRXxEl8RZzEV8RJfEWcxFfESXxFnMRXxEl8RZzEV8RJfEWcxFfESXxFnMR3/0R4uUTde2zu9Tvj 5RJ177G514+Vl0vUvYcxXL94Xi5RX6A3+BjAUzSDwC5wgOuMGQR2FwN4imYQ2QV67SCvT8LL5X01 D68ce32cXi5v6QwPH5+5wMlgAMvYGPuTaM8g8i0B7vpmEDiDDHBbNQb75vN+QoeH5l+fqpdL/H7y riwuaWi5vFL3JSQnVz3ApfoM2r8NnUH7141n0PYv6xm0/ct6Bm0v6TOIvHv7141nEHrLt7/bZtA+ pnwGbe+1ziCiiP0pNmcQUcQgitifl3MvQm1Ba/dN95L1clmbqnuBe7msL+b768DLJX7Ja5jd/Z2i 5dIwu/sbyMsl6l6bEXB/jXm5RN1rswvqMfbvbs4g8KMw9q9hziDwozD2r2HOILBNGPvXMGcQ2CaA kswZRD7c/ZLMGUQUsV+SOYOIIvaP32cQUcT+mf0MIorIRBGZKCITRWSiiEwUkYki9sskZxBRRCaK yEQRhSiiEEUUoohCFFGIIgpRRCGKKEQR+6MNziCiiP3OCWcQUcQ+JnAGEUXsYwJnEFEEKdaAqugZ RBSxX0qdQfsOiDOIKGLfAXEGEUXsOyDOIKKIfQfEGUQUQWp+Y98BMYP2HRBnEFEEKUkOUpIcGoVw H3a8XN6JcmjkwH1i8nJ5lZShkQP3sUvLpV3L3oc0L5dXSfGuZe+TnpdL1L123XcfF71cou61rl73 mdPLJeo+i7rPou6zqPss6l67Tr4PxV4uUfdZ1H0RdV9E3RdR90XUfRF1X0TdF1H3RdS9NpbpLhRo ubQGVHdZwcsl6l4jN+/ahJdL1L144+0hP3fdw8sl6l5zKd/FEy+XqHvNpXxXYLxcou41l/JdxvFy ibrXXMp3LcjLJepeJGOGR8ak8bhfRExj33V7Bu0X3GbQfsFtBu0X3GbQfgl2BqF3b78EO4P2S7Az aL8EO4P2S7Bp7LtuzyCiiH3X7RlEFAFwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rw j0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0Rwj0RwjzTA5X4il/uJXO4ncrmfyOV+Ipf7idzTJ3JP n8g9fSL39Inc01/7PW3vqHUbuHeHXi5tr33tJb1c2hnz2nl6ubQz5rVP9XJpZ8xrV6vl0roN3Htg L5eoe48ZSCIzkERmIInMQBKZgSQyA0lkBpLIDCSRGUgiM5BEZiCJzEASmYEkMgNJZAaSyAwkkRlI IjOQRGYgicxAEpmBJDIDSWQGknh3msS70yTenSbx7jSJd6dJvDtN4n1nEu87k3jfmcT7ziTedxbi myjEN1GIb6IQ30QhpZVCSiuFlFYKKa0UUloppLRSiG+ikHpMIfWYQuoxhdRjCqnHFOKbKMQ3UYhv ohDfRCG+iUJ8E4X4JgrxTRTimyjEN1GIb6IQ30QhvolCfBOF+CYK8U3MIKII0MrlbHJHgogiQCuX s4kbCAKtXGYQUQRo5XI2pCJBRBGglcvZ/4kEEUUMooixr4j6+LiviBm0r4gZtK+IGbSviBm0r4gZ tK+IGbSviBm0r4gZtK+IGUQUAeCfGUQUAeCfGUQUAeCfGYTOGlrNpoi8exF59yLy7kWs2RSxZlPE mk0RazZFrNkUsWZTRN69iPWfItZ/ilj/KWL9p6j1H493LyLvXkTevYi8exF59yLy7kXk3YvIuxeR dy8i715E3r2IvHsRefci8u5F5N2LyLtf9QEvl6h7rxPkVWTwcom69zpBXpUKL5eoe68T5FXu8HKJ uvc6QV41Ey+XqPsh6n5our/qMV4uTfdX9cbLpen+qvV4uTTdX5UhL5em+6uO5OUSde+xxlcxyssl 6t5jja+KlpdL1D24c5pBpHoI7pxmEKkegjunGUTqyeDOaQaRejK4c5pBpJ4M7pxmEFEEuHOaQUQR 4M5pBhFFgDunGUQUAe6cZhBQxEHunA5y53SQO6eD3Dkd5M7pIHdOB7lzOsilzkEudQ5yqXOQS52D XOoc4FJnBqG3HCzCAzi6ZxBZhMDRPYOIIoCjewYRRQBH9wwiigCO7hlEFAEc3TOIKAI4umcQUQRw dF87S2+XKp4QvErotT31coknBK8Seu1xvVziydirhF4bZS2XVwm9ttVeLlH3XiX02pt7uUTde5XQ a4Pv5RJ1L1ZCD7ESeoiV0EOshB7fqIS++fTm4Yf3H/46Ax4+PP34y09vPvw+9uH7n968/fnjwy8f n/788N1P77//6/xvj/kx98dW/vT9+w/n33z77seHd0//+PT07tPHM+FXT+D8o++u6I8PY+TRU3nu cZ+f54en82V9ev/weEd+Tt0Xg9DRynvDvQV9iCXeQyx/HmL58xDLn4dY/jzE8uchlj8Pr9XCdYD0 cnlf8ofXauE6hXq5RN17rRauo6yXS9S912rhOg97uUTde60WrkO1lstrtXAdwb1cmu47sRZ0Yi3o xFrQibWgE2tBfwTFohm0XyyaQfvFov4IWuX1R2D5nUHk3QOW3y5iFF3EKLqIUXQRo+giRnHJ3cul /RZci0PL9XIbmftf/uXN358efj2BzcPZb1k+i/p4+Pj2358efvjw/ueH47GfZyNwj3utQ+1FeR6R a9VquYBbewaRdxO4tWfQfrF9HtDJjyNwa88g8uMI7NDX5+R95uLC9zwN14et5fI8DZc0vFzij5TH +3dybTSDwEblAI2AZxDYqBygEfAMAt9tB2gEPIPAd9sBGgHPIPDddoBGwDOIKAI0Au4H+Q06QH+I GUQ+J8DqzSDyOQFWbwaRzwmwejOIrFzA6s0gogjA6s0gogjA6s0gogix0HB4PR2vb34vl7cHPrye jtfPh5fL21sdXk/H6zfIy+XtrQ6vp+P1Q+blEnUv7t0Pz5d5/UhquTwa6fpJ9XKJ+vJopOt32csl fq96NNL14+7lEnXv0UjXDsHLZem+PT7m7T3SGbS9R5pBZXuPdAZt75HOoO1d8xm0vWs+g7Z3zWfQ 9q75DNreNZ9B27vmM4goYr8X5wza78V5BhFF7LfVPIPIh7t/5jiDyLu3f3w4g8jS2Lf6nEHk3du3 +pxBZGnsW33OIPLh7lt92iOw+pxBQBHA6nMGAUUAq88ZBBQBrD5nEFDEsd9e7gwiith3Ip1B5DtC G9V+7xS0XNqo9ntf4eWyjg73LsTLZR0d7j2Ll8s6Otw7HC+XqHutdd29TfJyibrX2s3dey0tl3YE vHdmWi7z2KaZSO7tnZdL/Bw1E8m9R/Ryid85monk3mhauTwTyb0t9XJ5uv+WiYTsbb1cnu49r8W9 QfZyebo/tHY69y7byyXqfv/+8wwihxNSiwD3n2cQOJwEOUQGOUQGOkRqpez74/NyiWtEK2XfGrBy hfgdHOJ3cHjfwUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFqXUFq XQG67pxBRBH7XXfOIKKI/a47ZxBRxH7XnTOIKGK/684ZRBSx33XnDCKK2O+6cwYRRewbqc4gooh9 I9UZRBSx33XnDCKK2MenzyCiiH18+gwiitjHp88gooh9fPoMIorYx6fPIKKIfXz6DCKK2MenzyCi iEwUkYkiAHIyg4giAHIyg4giAHIyg4giAHIyg4giAHIyg4giAHIyg4AixDpwiHXgEOvAIdaBQ6wD h1gHDrEOHGIdOMQ6cIh14BDrwCHWgUOsA4dYBw6xDhxiHTi8vkL3MdbLJepe6yt0n4W9XKLutb5C 94Fay6X1FbqP314uUfdaX6H7DO/lEnWv9ZK4CwFeLlH3Wl+hu5rg5RJ1r9n97pKEl0vUvWb3u+sa Xi5R95rd7y6OaLk0u99dSvFyibrX7H53PcbLJeo+i7rPou49lvgqAWm5PJb4Khh5uUTdeyzxVXXy com691jiq3Tl5RJ177HEcQDL1QwiFdFKKqLApzWDSEW0korofkOtM4hURPcbap1BpEa+31DrDCKK 2G+odQYRRTSiiEYUsd/v6wwiithvb3MGEUXst7c5g4gi9tvb3F9h3teh+NNdxZ9uz1pxfT16ucSf bq3r3f0d6+USf7q1rnf3F7WXS9S91vXu/rb3com6b6Lutc5+9y+Jl0vUvdYx5v458nKJutc6xrQI wvAE2Y2GWGwL8Rs8ATNAZMLzZsLzZsLzZsLzZsLzZsLzZsLzZsLzZsLzZsLzZsLzZsLzZsLzZsLz Js8jca0YL5f3Y51FbiKL3EQWuYkschNZ5CayyE1kkZvIIjeRRW4ii9xEFrmJLHITmVC7mdCgWbwZ y+LNRQZNj2YQ+VEATY+iEKS/EKQ/e+0BrvfHy+XJvYi4RBFxiUqI+0rWbiXEfSW14ypeq1fxy6OK 1+pVrNVUUgGvpMTcyCmiETtXFes8VayBNHGL1kQsrxGXSiP1gbbfPP5+etpLFYsKTWvE26KT814n Tpwu7gm7yJgM4kUaxFY0iENoELPPIGafQcw+g5h9BjH7DGL2GcTsM4jZZxCzzyDcwiAIwiAIwiA0 wSDfz4PQBIPQBIPQBIPsCAehCQahCQbZSw1CEwxCEwxCEwyy1RuEJhiEJhiEJhiEJhiEJhhkvzP2 h+WcQUQR+8NyziCiCNAsagYRRYBmUTOIKEKkdYdI2A6Rih0iyTpEknWIJOsQSdYhkqxDJFmHSLIO kWQdIsk6RHRriLjVEHGrISJSQzwLDxGRGiIiNUREaohltyEiUkNEpIZYOhsiIjVERGqIiNQQy4ND RKSGiEgNEZEaIiI1RERqiLW8oQ3Vurf1Xi5R914n0uts4OUSde91Ir0OGC/kOv/nz29+fPv9w7tf fv7u6cPD4z8ez2T/FJ5PY+D5uL8/ffj49vxDrz7y9YxlOWNZzFiXM9bFjG05Y1vM2Jcz9sWMYznj WMs4j1yLGX995OsZj+WMx2LGWM4YixnTcsa0mHF5zZTFNVOW10xZXDNlec2UxTVTltdMWVwzZXnN lMU1U5bXTFlcM3V5zdTFNVOX10xdXDN1ec3UxTVTl9dMXVwzdXnN1MU1U5fXTF1cM3V5zdTFNVOX 10xdXDN1ec3UxTVTl9dMXVwzbXnNtMU105bXTFtcM215zbTFNdOW10xbXDNtec20xTXTltdMW1wz bXnNtMU105bXTFtcM215zbTFNdOW10xbXDN9ec30xTXTl9dMX1wzfXnN9MU105fXTF9cM315zfTF NdOX10xfXDN9ec30xTXTl9dMX1wzfXnN9MU105fXTF9cM2N5zYzFNTOW18xYXDNjec2MxTUzltfM WFwzY3nNjMU1M5bXzFhcM2N5zYzFNTOW18xYXDNjec2MxTUzltfMWFsz8bi6Zj4/8vWMq2vm8yNf z7i6Zj4/8vWMq2vm8yNfz7i6Zj4/8vWMq2vm8yNfz7i6Zj4/8vWMq2vm8yNfz7i6Zj4/8vWMq2vm 8yNfzXgsr5ljcc0cy2vmWFwzx/KaORbXzLG8Zo7FNXMsr5ljcc0cy2vmWFwzx/KaORbXzLG8Zo7F NXMsr5ljcc0cy2vmWFwzsbxmYnHNxPKaicU1E8trJhbXTCyvmVhcM7G8ZmJxzcTymonFNRPLayYW 10wsr5lYXDOxvGZicc3E8pqJxTWTltdMWlwzaXnNpMU1k5bXTFpcM2l5zaTFNZOW10xaXDNpec2k xTWTltdMWlwzaXnNpMU1k5bXTFpcM2l5zaTFNZOX10xeXDN5ec3kxTWTl9dMXlwzeXnN5MU1s8wB xCIHEMscQCxyALHMAcQiBxDLHEAscgCxzAHEIgcQyxxALHIAscwBxCIHEMscQCxyALHMAcQiBxDL HEAscgCxzAHEIgcQyxxALHIAscwBxCIHEMscQCxyALHMAcQiBxDLHEAscgCxzAHEIgcQyxxALHIA scwBxCIHEMscQCxyALHMAcQiBxDLHEAscgCxzAHEIgcQyxxALHIAscwBxCIHEMscQCxyALHMAcQi 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 vjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y37 8njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL 4y378njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y378njLvjjesi+Pt+yL4y378njLvjjesi+P t+yL4y17rLa1/PLIVzOutrXsi+Mt+/J4y7443rIvj7fsi+Mt+/J4y7443rIvj7fsi+Mt+/J4y744 3rIvj7fsi+Mt+/J4y7443rIvj7fsi+Mt+/J4y7443rLHalvLL498PePymllra9mXx1v2xfGWfXm8 ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGW fXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2 xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mX x1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8c b9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8 ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1v2xfGW fXm8ZV8cb9mXx1v2xfGWfXm8ZV8cb9mXx1t+eeT97354/+HnN58e3j7/mNf/6vK6WhuB2ZdHYH55 5Ldfx+LaWx2T2RfHZPblMZl9cUxmXx6T2RfHZPblMZl9cUxmXx6T2RfHZPblMZl9cUxmXx6T2RfH ZPblMZl9cUxmXx6T+eWR31wFi8zB8ijNvjhKsy+P0uyLozT78ijNvjhKsy+P0uyLozT78ijNvjhK sy+P0uyLozT78ijNvjhKsy+P0uyLozT78ijNvjhKsy+P0uyLozT78ijNvjhKsy+P0uyLozT78ijN vjhKsy+P0uyLozT78ijNvjhKsy+P0uyLozT78ijNvjhKsy+P0uyLozT78ijNvjhKsy+P0uyLozT7 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 RBEEvwPjOM4gogiC34FxHGcQUQTB78A4jvso5B2rxBKAaP3LovUvi9a/LFr/smj9y6JdL4t2vSza 9bJo18uiXS+Ldr0s2vWyaNfzRpbcR08vl6h70a7njSy5j7VeLlH3ol3PG39yH5m9XKLuRbueN/7k Po57uUTdi3Y9b/zJfdTXcol2PW/8yV0v8HKJuhdxU2/8yV2L8HKJuhdxU2/8yV3n8HKJuhdxU2/8 yV1D8XKJuhdxU2/8yV2f8XKJuhdxU2/8yV378XKJuhdxU2/8yV1X8nKJuhdxU2/8SQ/STjZIO9kg 7WSDtJMN0k42SDvZIO1kg7STDdJONkg72SDtZIO0kw3STjZIO9kg7WSDtJMN0k4jSDuNIO00grTT CNJOI0g7jSDtNIK00wjSTiNIO40g7TSCtNMI0k4jSDuNIO00grTTCNJOI0g7jSDtNIK00wjSTiNI O40g7TSCtNMI0k4jSDuNIO00grTTCNJOI0g7jSDtNIK00wjSTiNIO40g7TSCtNMI0k4jSDuNIO00 grTTCNJOI0g7jSDtNIK00wjSTiNIO40g7TSCtNMIsf1jiO0fQ2z/GGL7xxDbP4bY/jHE9o8htn8M sf1jiO0fQ2z/GGL7xxDbP4bY/jHE9o8htn8MsX1JiO1LQmxfEmL7khDbl4TYviTE9iUhti8JsX1J iO1LQmxfEmL7khDbl4TYviTE9iUhti8JsX1JiO1LQmxfEmL7khDbl4TYviTE9iUhti8JsX1JiO1L QmxfEmL7khDbl4TYviTE9iUhti8JsX1JiO1LQmxfEmL7khDbl4TYviTE9iUhti8JsX1JiO1LQmxf EmL7khDbl4TYviTE9iUhti8J0k42SDvZIO1kg7STDdJONkg72SDtZIO0kw3STjZIO9kg7WSDtJMN 0k42SDvZIO1kg7STDdJOI0g7jSDtNIK00wjSTiNIO40g7TRmEFEE6MERpAdHkB4cQXpwBOnBEaQH R5AeHEF6cATpwRGkB0eQHhxBenAE6cERpAdHkB4cQXpwBOnBEaQHR5AeHEHaaQRppxGknUaQdhpB 2mkEaacRpJ1GkHYaQdppBGmnEaSdRpB2GkHaaQRppxGknUaQdhpB2mkE6YwRpDNGiE0ZQ2zKGGJT xhCbMobYlDHEpowhNmUMsSljiE0ZQ2zKGGJTxhCbMobYlDHEpowhNmUMsSljiJ1IQuxEEmInkhA7 kYTYiSTETiQhdiK5jrleLlH3XleTELuahNjVJMSuJiF2NQmxq0mIXU1C7GoSYleTELuahNjVJMSu JiF2NQmxq0mIXU1C7GoSYleTELuahNiJJMROJCF2IgmxE0mInUhC7EQSYieSEDuRhNiJJMROJCF2 IgmxE0mInUhC7EQSYieSEDuRhNiJJMTuIfGN7iHn//z5zY9vv39498vP3z19eHj8x+OZ7J/C8wn8 nI/7+9OHj2/PP/TqI1/PWJYzlsWMdTljXczYljO2xYx9OWNfzDiWM461jONxNeOvj3w947Gc8VjM GMsZYzFjWs6YFjMur5mxuGbG8poZi2tmLK+ZsbhmxvKaGYtrZiyvmbG4Zsbymhlra+Ysva9l/PzI 1zOurpnPj3w94+qa+fzI1zOurpnPj3w94+qa+fzI1zOurpnPj3w94+qa+fzI1zOurpnPj3w94+qa +fzI1zOurpnPj3w147G8Zo7FNXMsr5ljcc0cy2vmWFwzx/KaORbXzLG8Zo7FNXMsr5ljcc0cy2vm WFwzx/KaORbXzLG8Zo7FNXMsr5ljcc3E8pqJxTUTy2smFtdMLK+ZWFwzsbxmYnHNxPKaicU1E8tr JhbXTCyvmVhcM7G8ZmJxzcTymonFNRPLayYW10xaXjNpcc2k5TWTFtdMWl4zaXHNpOU1kxbXTFpe M2lxzaTlNZMW10xaXjNpcc2k5TWTFtdMWl4zaXHNpOU1kxbXTF5eM3lxzeTlNZMX10xeXjN5cc3k 5TWTF9dMXl4zeXHN5OU1kxfXTF5eM3lxzeTlNZMX10xeXjN5cc3k5TWTF9dMWV4zZXHNlOU1UxbX TFleM2VxzZTlNVMW10xZXjNlcc2U5TVTFtdMWV4zZXHNlOU1UxbXTFleM2VxzZTlNVMW10xdXjN1 cc3U5TVTF9dMXV4zdXHN1OU1UxfXTF1eM3VxzdTlNVMX10xdXjN1cc3U5TVTF9dMXV4zdXHN1OU1 UxfXTFteM21xzbTlNdMW10xbXjNtcc205TXTFtdMW14zbXHNtOU10xbXTFteM21xzbTlNdMW10xb XjNtcc205TXTFtdMX14zfXHN9OU10xfXTF9eM31xzfTlNdMX18wyB5AXOYC8zAHkRQ4gL3MAeZED yMscQF7kAPIyB5AXOYC8zAHkRQ4gL3MAeZEDyMscQF7kAPIyB5AXOYC8zAHkRQ4gL3MAeZEDyMsc QF7kAPIyB5AXOYC8zAHkRQ4gL3MAeZEDyMscQF7kAMoyB1AWOYCyzAGURQ6gLHMAZZEDKMscQFnk AMoyB1AWOYCyzAGURQ6gLHMAZZEDKMscQFnkAMoyB1AWOYCyzAGURQ6gLHMAZZEDKMscQAEdXCrp zlBJd4ZKujNU0p2hku4MlXRnqKQ7QyXdGSrpzlBJd4ZKujPUDCYqVdLSoZKWDpW0dKikpUMlLR0q aelQSUuHSlo6VNLSoZKWDpW0dKikpUMlLR0qaelQSUuHSlo6VNLSoWYwUamSPhCV9IGoGUxUqhlM VKoZTFSqGUxUqhlMVKoZTFSqGUxUqhlMVKoZTFSqGUxUqhlMVKoZTFSqGUxUqhlMVKoZTFSqGUxU qhlMVKoZTFSqGUxUqhlMVKoZTFSqGUxUqhlMVKoZTFSqGUxUqhlMVKoZTFSqGUxUqhlMVKoZTFSq GUxUqhlMVKqiT76KPvkq+uSr6JOvok++ij75Kvrkq+iTr6JPvoo++Sr65K/Do5dL1L3nua+i576K nvsqeu6r6Lmvoue+ip77Knruq+i5r6Lnvoqe+yp67qvoua+i576Knvsqeu6vo72XS9S9N63pqg94 uUTde9OariKDl0vUvTet6apUeLlE3XvTmq5yh5dL1L03remqmXi5RN1705quwouWy5vWdJVpvFyi 7r1pTVetx8sl6t6b1nQVjLxcou69aU1X1cnLJerem9Z0la68XKLuvWlNNYOJ4jWDieI1g4niNYOJ 4rWAiUq1gIlKtYCJSrWAiUq1gIlKtYCJSrWAiUq1gIlKtYCJSrWAiUq1gIlKFfE4BUxUmkFEEWCi 0gwiigATlWYQUQSYqDSDiCLARKUZRBQBJirNIKIIMFFpBhFFgIlKM4goAkxUmkFEEWCi0gwiiiDM XiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHM XiHMXiHMXiHMXiHMXiHMXiHMXiHMXkHMnjft9jpWebnEuoE37fY6m3m5vLpB8eZCXQc8L5dXNyje XKjrlOjl8nRfvLlQ11FTy+XNhboOpl4uUffeXKjrdOvlEnXvzYW6jsheLlH33lyo65zt5RJ1782F ug7rXi5R995cqOvE7+USde/NhbrKBlouby7UVWTwcom6F3nXIvKuReRdi8i7FpF3LSLvWkTetYi8 axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsRedci8q5F5F2LyLsWkXctIu9aRN61iLxrEXnXIvKu ReRdC/GsFuJZLcSzWohntRDPaiGe1UI8q4V4VgvxrBbiWS3Es1qIZ7UQz2ohntVCPKuFeFYL8awW 4lktxLNaiGe1EM9qIZ7VQjyrhXhWC/GsFuJZLcSzWohntRDPaiGe1UI8q4V4VgvxrBbiWS3Es1qI Z7UQZq8QZq8QZq8QZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8SZq8S Zq8SZq8SZq8SZq8SZq8S/K4S/K4i/E508RXRxVdEF18RXXxFdPEV0cVXRBdfEV18RXTxFdHFV0QX XxFdfEV08RXRxVdEF18RXXxFdPEV0cVXRBdfEV18RXTxFdHFV0QXXxFdfEV08RXRxVdEF18RXXxF dPEV0cVXRBdfEV18RXTxFdHFV0QXXxFdfEWkUItIoRaRQi0ihVpFCrWKFGoVKdQqUqhVpFCrSKFW kUKtIoVaRQq1ihRqFSnUKlKoVaRQq0ihVpFCrSKFWkUKtYoUahUp1CqSo1UkR6tIjlbi2KzEsVmJ Y7MSx2Yljs1KHJuVODYrcWxW4tisxLFZiWOzEsdmJY7NShyblTg2K3FsVuLYrMSxWYljsxLHZiWO zUocm5U4NitxbFbi2KzEsVmJY7MSx2Yljs1KHJuVODYrcWxW4tisxLFZiWOzEsdmJcRaJcRaJcRa JcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRaJcRa JcRaJcRaJcRaJcRaJcRaJcRaFd1yVXTLVdEtV0W3XBXdclV0y1XRLVdFt1wV3XJVdMtV0S1XRbdc Fd1yVXTLVdEtV0W3XBXdclV0y1XRLVdFt1wV3XJVdMtV0S1XRbdcFd1yVXTLVdEtV0W3XBXdclV0 y1XRLVdFt1wV3XJVdMtV0S1XRbdcFbnSKnKlVeRKq8iVVpErrSJXWkWutIpcaRW50ipypVXkSqvI lVaRK60iV1pFrrSKXGkVudIqcqVV5EqryJVWkSutIldaRa60ilxpFbnSKnKlVeRKq8eVdjINtpNp sJ1Mg+1kGmwn02A7mQbbyWDXTma0djKjtZMZrZ3MaO1kRmsnM1o7mdHayYyKTmZUdDKjopNxE52M m+hk3EQn4yY6mRzRyeSIToZAdDIEopMhEJ3Mc+hknkMn8xw6mefQyTyHTuY5dDIwoYsjtbo4UquL I7X6N0Zq/e5hD/92/cenf3x6evfp4eOnNx8+vX3348N3P73//q8P7375+bunDw+ppRjpcbTxvz68 /+GH868//un79x/Ov3w++N0d/fHhh/cfvnoaZ/Y/v/n05vyPf53/9asH3M/yL2/+/vTw/U9Pbz48 /dn5kV96/Xnt9ecjRYke268/v/b68+uvH+5Xll5/WXz9oz32xyjbr7+89vrL66//1xxfXuj93H5+ 8+Pb7x/+88PjP+ZX/GN98/3Tmfz+b4/XM3npranXc//lb5++PHoGvvzg/3Q/wf/+y7u/3gHffjq/ PYtj61kcu8/i3fuH//Yw3/ZTFf/yd34LOh/y2mP+9uH9dz89/fzwP95++ss/PeD79+/uz/SrT6y+ /omR/dTLx5bFt/vbH3rf+dA7ebv7wtvd99/u/vrbDXY44qy+Ls7q6+Ksvi7O6uvfmNX3u4ctfaHW dKQ66mPf/UIdr/2gjtd/UOlpbOn1r/2g1se5xU61pu3X/9oP6nj9B5UeLJde/9oPauk5jpJy3n79 r/2gjtd/UOkZeen117XPfz621ZG3N5Tzabzy+l//eaLH/aXX39Ze/2mDfZzvwfbrb6+9/vb664eV i6XX35c31Pkx1X3999de/+u/l7QIs/D658OWXv/o9SiP+fFx8/WfT+Obr/98wCuvH9eTll7/sfL6 8zFKfsxtW//n03jl9R+vv35YGlt6/bH0+mMu/jFqHNuvP157/fH664dVvqXXv7T/ma9/RH4spW6/ /lf2P+cDXn396U/3Hv3cdL95+25uun/66enHNz89fP+XNx/efP/p6fyjDx//8v7Dp/k3fj636V9i /2V7cR4PZvY72//yv/+//1//2//v/1veffpfXj5bkDm7XRys1MXBSl0chtTFYUhdHIbUxQFGXRxg 1MUBRl0cYNTFAUZdHGDUxeE+ncxB7GTQYCczAzvpmd5Jz/ROeqZ30jO9k57pnfRM76Rneic90zvp md5Jz/ROeqZ30jO9k57pnfRM76Rneic9afs35lJ8uzB9fPdmrTx5ToVYLk+eD94uT55Br5Unz8ds lifPkNe2W8Dj28XRFl0cR9HFxq1dbNzaxcatXWzc2sXGrV1s3NrFxq1dbNzaxcatXWzc2sXGrV1s 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 yDo2kXVsIuvYRNaxiaxjE1nH5rGOQcbBBhkHG2QcbJBxsEHGwQYZBxtkHGyQcbBBJrsGmewaZLJr kMmuQSa7RgEW0SCTXYOMdQgy1iHIWIcgExqCTGgIMqEhyISGIMMWggxbCDI3IcjchCBzE4KMQAgy AiHICIQgIxCCjEAIMgIhyIyBEKdQhTiFKsQpVCFOoQpxClWIU6hCnEIV4hSqECdHhTg5KsTJUSFO jgpxctS1afByiVr1nCAhdj4PsfN5iN3KQ+xWHmK38hC7lYfYYTzEDuMhdgUPsSt4iF3BQ+zkHWIn 7xA7eYfYyTvETt4hdvIOsct1kIEgQSZuBBmeEaR5YJDmgUGaBwZpHhikeWCQ5oFBmgcGaR4YpHlg kOaBQZoHBmkeGKR5YJDmgUGaBwZpzhRig9YQm5eG2HA0xIY5ITbMCbFhTogNc0JsmBNiw5wQG+aE 2DAnxIY5ITbMCbFhTogNc0JsmBNiw5wQG+bENwzb5//8+c2Pb79/ePfLz989fXh4/MfjmeyfwvM5 o+J83N+fPnx8e/6hVx/5esaynLEsZqzLGetixracsS1m7MsZ+2LGsZxxrGVMj6sZf33k6xmP5YzH YsZYzhiLGdNyxrSYcXnNpMU1k5bXTFpcM2l5zaTFNZOW10xaXDNpec2kxTWTltdMWlwzeXnN5MU1 k5fXTF5cM3l5zeTFNZOX10xeXDN5ec3kxTWTl9dMXlwzeXnN5MU1k5fXTF5cM3l5zeTFNZOX10xe XDNlec2UxTVTltdMWVwzZXnNlMU1U5bXTFlcM2V5zZTFNVOW10xZXDNlec2UxTVTltdMWVwzZXnN lMU1U5bXTFlcM3V5zdTFNVOX10xdXDN1ec3UxTVTl9dMXVwzdXnN1MU1U5fXTF1cM3V5zdTFNVOX 10xdXDN1ec3UxTVTl9dMXVwzbXnNtMU105bXTFtcM215zbTFNdOW10xbXDNtec20xTXTltdMW1wz bXnNtMU105bXTFtcM215zbTFNdOW10xbXDN9ec30xTXTl9dMX1wzfXnN9MU105fXTF9cM315zfTF NdOX10xfXDN9ec30xTXTl9cMoJ0ruViqZDBEJYMhKhkMUclgiEoGQ1QyGKKSwRCVNMabQfv3yJV0 06ukm14l3fRmEFEEaMFXSQu+SlrwVdKCr5IWfJW04KukBd8MIooAfftq+7U++9t//e6n99//9ddv 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 DzOIKAIYCGYQUQQwEMwgoghgIJhBRBHAQDCDiCL2+/ifQUQRwHUwg4gigOtgBhFFANfBDCKKAK6D GUQUAVwHM4goArgOZhBRBHAdzCCiiEQUkYgigL9hBhFFAH/DDCKKAP6GGUQUAfwNM4goAvgbZhBR BLhEnkFEEeASeQYRRYBL5BlEFAEukWcQUQS4RJ5BRBHgEnkGAUU8ap3y72OVl0urQVyHMCvX4ZlI riObl0urQVwHPC+XVoO4joNeLk/3h2ciuc6UXi5R915viOtg6uUSde8ZUq7TrZdL1L1nSLmOyF4u UfeeIeU6Z3u5RN175pbrsO7lEnXvmVuuE7+XS9S9Z265ygZaLs/cchUZvFyi7j1zy1Wp8HKJuk+i 7pOoe890cxVHtFye6eYqpXi5RN17ppurHuPlEnXvmW6uoo6XS9S9xyFelSEvl6h7j9W7ykteLlH3 Hqt31ai8XKLuPVbvKnRpuYCJYgaRiigwUcwgUhEFJooZRCqiwEQxg0hFFJgoZhCpke9PwDmDiCKA XWMGEUUAu8YMIooAdo0ZRBQB7BoziCgC2DVmEFEEsGvMIKIIYNeYQUQRwK4xg4gi9scbnUFEEfvj jc4gooj98UZnEFHEIIoYRBGE2TsIs3cQZu8gzF4QZi8IsxeE2QvC7AVh9oIwe0GYvSDMXhBmLwiz F4TZC8LsBWH2gjB7QZi9IMxeEGYvCLMXhNkLwuwFYfaCMHtBmL1AzJ7ndbqOVV4usW7geZ2us5mX S6wbeF6n64Dn5RLrBtq8pPuU6OUSde95sK6jppdL1L3nwbrOq14uUfeeB+s69Gq5PA/WdUT2com6 9zxY1znbyyXqXvRgHdpsr/sM7+USda/N9roLAV4uUffabK+7muDlEnUv8q6HyLseIu96iLxriLxr iLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxriLxr iLxriLxriLxriLxrEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9qEM9q EPtpEPtpECdpECdpECdpECdpECdpECdpECdpECdpECdpECdpEFNoEFNoEFNoEFNoEFNoEFNoECgu CBQXBIoLAsUFgeKCQHFBoLggUFwQKC4IFBcEigsCxQWB4oJAcUGguCBQXBAoLggUFwSKCwLFBYHi gkBxQaC4IFBcECguCBQXBIoLAsWFaMgL0ZAXoiEvRENeiIa8EA15IRryQjTkhWjIC9GQF6IhL0RD XoiGvBANeSEa8kI00YVoogvR+Bai8S1E41uIxrcQjW8hGt9CNL6FaHwL0fgWovEtRLNaiGa1EM1q IZrVQjSrhWhWCxG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2 DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DBG2DA+27KSZaifNVDtpptpJM9VOmql20ky1 k2aqnTRT7aSZaifNVDtpptpJM9VOmql20ky1k2aqnTRT7aSZRCfNJGYQUQS4N+ukmUQnzSQ6aSbR STOJTvpCdNIXopO+EJ30heikL0QnfSE66QvRSV+ITvpCdNIXopMWD510a+ikW0MnPRQ66aHQSQ+F TnoodNJDoZMeCp30UOikh0InPRQ66aHQSQ+FTnoodNJDoZMeCp30UOikh0InPRQ66aHQSQ+FTnoo dNJDoZMeCl3s+dfFnn9d7PnXxZ5/Xez518Wef13s+dfFnn9d7PnXxZ5/Xez518Wef13s+dfFnn9d 7PnXxZ5/XexZ0cWeFdehzssl6t67Ruliz4ou9qzoYs+KLvaZ6GKfiS72mehin4ku9pnoYp+JLvaZ 6GKfiS72mehin4ku9oboYj+HLvZz6GLfhC72Tehi34Qu9k3oYt+ELvZN6GLfhC72Tehi34Qu9k3o Yt+ELvZN6GLfhC72Tehi34Qu9k3oYt+ELvZN6GLfhC72Tehi34Tu9U2YitivaZ5B2xWsM2i7gnUG bVewzqDtCtYZtF3BOoO2a5pn0HZNc662/ZrmGbRd0zyDgCJATfMMAooANc0zCCgC1DTPIKAI0Bd2 Bu33hT2DiCL2+8KeQUQR+31hzyCiiP2+sGcQUcR+X9gziChiv1vrGUQ+p/1+C2cQ0d5+v4UzCL0m or39fgtnENHefr+FM4hob39G+Azab9JwBhFF7M8IP4OIIvaxtjOIKGIfazuDiCL2sbYziChiH2s7 g4gi9rG2M4goYh9rO4PQHtY6X93bdS+Xdb66N/deLut8dR8FvFxWXeE+OFi5vLrCfczwcnm69+oK 91nFy+Xp3qsr3AceL5ene68f431q8nKJutf6Md5HLy+XqHutH+N9fvNyibrX+jHeh0Atl9b38D4y arm0dhT3AdPLJb5fWjuK+5Tq5RLXo9aO4j7qernE9ajNh77Py14uUffafOj70O3lEnWvsaL3yd3L JepeY0Xv47+WS2NF72KBl0vUvcaK3hUHL5em+yD1viD1viD1viD1viD1viD1viD1viD1viD1viD1 viD1viD1viD1viD1viD1viD1vgDtX88gooh9G+sZRBSxb2M9g4gi9m2sZxBRxL6N9Qwiiti3sZ5B RBH77V/PIKKIfe/rGUQUse99PYOIIva9r2cQUcS+9/UMIorY976eQUQR+4bZM4goYt9lewYRRey3 fz2DiCL2/bxnEFHEvp/3DCKK2PfznkFEEYB9m0FEEYB9m0FEEYB9m0FEEYB9m0FAEQmwbzMIKCIB 9m0GobOGdg4Osf4TYv0nxPpPiPWfEOs/IdZ/Qqz/hFj/CbH+E2L9J8T6T4j1nxDrPyHWf0Kt/2he 4fsY6+USda95he+zsJdL1L3mFb4P1F4uUfeaV/g+lXu5RN1rLVfvo72WS/Md34UAL5eoe813fFcT vFyi7jXf8V2S8HKJutdart51DS+XqHvND30XR7xcou61lqt3hcXLJepe82nfZRotl+bTvos6Xi5R 9x5PfVWGvFyi7j2e+ioveblE3Xs89VWj8nJ5uk8eT30VurxcoCKagPdzBoGKaALezxkEKqIJeD8j Ae/nDCIVUeD9nEGgIpqA93MGEUUA7+cMIooA3s8ZRBQRRBFBFAFcpjOIKGJ/JvoZRBSxPxP9DCKK 2J+JfgYRRQCP7gwiigAe3RlEFAE8ujOIKAJ4dGcQUQTw6M4gogjC7CXC7CXC7CXC7CXC7CXC7CXC 7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CVC0iVC 0iXPJXoddrxc3mk+eS7R68Tk5RJP855L9Dp2ebnE07znEr3Obl4uUfeeS/Q6AHq5RN17LtHrFOnl EnXvuVevo6iXS9R9iLoPUfch6j5E3Yeoe8+FfB2hvVyi7j0X8nUO93KJuvdcyNdh3ssl6t5zIV8V AS+XqHuRQk0ihZpECjWJFGoSKdQkUqhJpFCTSKEmkUJNIoWaRAo1iRRqEinUJFKoSaRQk0ihJpFC TSKFmkQKNYkUahIp1CRSqEmkPZNIeybi2EzEsZmIYzMRx2Yijs1EHJuJODYTcWwm4thMxLGZiGMz EcdmIo7NRBybiTg2E3FsJuLYTMSxmYhjMxHHZiKOzUQcm4k4NhNxbCbi2EzEsZmIYzMRx2Yijs1E HJuJODYTcWxm4tjMxLGZiWMzE8dmJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRa JsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaJsRaRsSa6JZLolsuiW65 JLrlkuiWS6JbLoluuSS65ZLolkuiWy6JbrkkuuWS6JZLolsuiW65JLrlkuiWS6JbLoluuSS65ZLo lkuiWy6JbrkkuuWS6JZLolsuiW65JLrlkuiWS6JbLoluuSS65bLolsuiWy6LbrksuuWyyJVmkSvN IleaRa40i1xpFrnSLHKlWeRKs8iVZpErzSJXmkWuNItcaRa50ixypVnkSrPIlWaRK80iV5pFrjSL XGkWudIscqVZ5EqzyJVmkSvNIleaPa40k26umXRzzaSbaybdXDPp5ppJN9dMurlm0s01k26umXRz zaSbaybdXDPp5ppJN9dMurlm0s01k24WmXSzyKSbRSbdLDLpZpFJN4tMullk0s0ik24WmXSzyKSb RSbdLDLpZpFJN4tMullk0s0ik24WmXSzyKSbRSbdLDLpZpFJN4tMullk0s0ik24WmXSzyKSbRSbd LDLpZpFJN4tMullk0s0ik24WmXSzyKSbRSbdLDLpZpFJN4tMullk0s0ik24WmXSzyKSbRSbdLDLp ZpFJN4tMullk0s0ii90Xs9h9MYvdF7PYfTGL3Rez2H0xi90Xs9h9MYvdF7PYfTGL3Rez2H0xi90X s9h9MYvdF7PYfTGLfUqy2Kcki31KstinJIt9SrLYpySLfUqy2Kcki31KstinJIt9SrLYpySLfUqy 2Kcki31KstinJIt9SrLYpySLfUqy2Kcki31KstinJIt9SrLYpySLfUqy2Kcki31KstinJIt9SrLY pySLfUqy2Kcki31KstinJIt9SrLYpySLfUqy2Kcki31KstinJIt9SrLYpySLfUqy2Kcki31Kstin JIt9SrLYpySTbq6ZdHPNpJtrJt1cM+nmmkk310y6uWbSzTWTbq6ZdHPNpJtrJt1cZxD5cEHLh0xa PmTS8iGTlg+ZdG/IpHtDJt0bMunekEn3hky6N2TSHiGT9giZtEfIpD1CJu0RMmmPkEl7hEzaI2TS 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 ftvdM4goYr/t7hlEFLHfl+cMIorY78tzBhFF7PflOYOIIvZb7Myg/RY7ZxD5cPdb7JxBaLfsHSM8 +PzekHu5vOOzB5/fu3ovl3d89oDx+2jg5RK1KpY4TWC8iyXOLpY4u1ji7GKJs4slzi6WOLtY4uxi ibOLJc4ulji7WOLsYomziyXOLpYSu1hK7GL5r5vlP61d930o9HKJ319ai+37ZOnlEvWltdi+j6de LlGrWovt+4zr5RK/v7QW2/dB2csl6l5rDHWftr1cou61xlD3kd3LJepea+Z0n/u9XKJWtWZOd/HA yjVI+XoQjH8QjH+QQvkghfJBMP5BquuDVNcHqa4PUl0f+5PwziCiCFKSH6QkP0hJfpCS/CAl+UFK 8oOU5AcpyQ9Skh+kJD9ISX6QkvwgJflBSvKDlOQHKckPUpIfpCQ/9lvln0FEEaSOP0gdf5A6/iB1 /LHfKv8MIorYb5V/BhFF7LfKP4OIIvZb5Z9BRBGkIcggDUEGaQgySEOQQRqCDNIQZJCGIIM0BBmk IcggDUEGaQgySEOQQRqCDNIQZJCGIIM0BBmkIcjoRBGki8jY769/n5+8s5h3Dh4iVjvEWvgQa+FD xGqHWFcfYl19iHX1IdbVhzYG8z48arnEGv0Qa/RDrNEPsUY/xBr9EGv0Q6zRD7FGP8Qa/RBr9EOs 0Q+xRj/EGv0Qa/RDrNEPsUY/xBr9EGv0QxvecBcCtFxivX+I9f4h1vuHWe/XhjfcJQkvl6h7bXjD Xdfwcom614Y33MURL5eoe7Hd0BDbDQ2x3dAQ2w0Nsd3QENsNDbHd0BDbDQ2x3dAQ2w0Nsd3QENsN DbHd0BDbDQ2x3dAQ2w2dpSstl9i6aGiDIM5cpCJKWu8O0np3kNa7g7TeHaT17iCtdwdovXs8gta7 M2i/IjqD9hUxg/YVMYP2FTGD9hUxg/YVMYP2FTGD9hUxg4giQOvdGUQUASznM4goAljOZxBRBLCc zyCiCGA5n0FEEcByPoOIIoDlfAaRDxe4x2cQ+XCBe3wGkQ8X4HfHIyDpZhD5nABJN4PIhwtIuhlE PlxA0s0g8uECku54BCTdDCKKACTdDCKKACTdDCKKACTdDCKKACTdDCKKACTdDCKKACTdDCKKACTd DEInAPE0LzZ3HWJz1yE2dx1ic9chNncdYnPX4TV3vU5jXi7tNH+d3bxcmu6vk56XS9P9dS70cmm6 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 9SCe1YN4Vg/iWT2IZ/UgntWDeFYP4lk9iGf1IJ7Vg3hWD+JZPYhn9SCe1YN4Vg/C7B2E2TsIs3cQ Zu8gzN5BmL2DMHsHYfYOwuwdhNk7CLN3EGbvIMzeQZi9gzB7B2H2DsLsHYTZOwizdxBm7yDM3kGY vYMwewdh9g7C7B2E2TsIs3cgZk/0Cx6iX/AQ/YKH6Bc8RL/gIfoFD9EveIh+wUP0Cx6iX/AQ/YKH 6Bc8RL/gIfoFD9EveIh+wUP0Cx6iX/AQ/YKH6Bc8RL/gIfoFD9EveIh+wUP0Cx6iX/AQ/YKH6Bc8 RL/gIfoFD9EveIh+wUP0Cx6iX/AQ/YKH6Bc8RN71EHnXQ+RdD5F3PUTe9RB510PkXQ+Rdz1E3vUQ eddD5F0PkXc9RN71EHnXQ+RdD5F3PUTe9RB510PkXQ+Rdz1E3vUQeddD5F0PkXc9RN71EHnXQ+Rd D5F3DeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZ DeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDeJZDcLs BWH2gjB7QZi9IMxeEGYvCLMXhNkLwuwFYfaCMHtBmL0gzF4QZi8IsxeE2QvC7AVh9oIwe0GYvSDM XhBmLwizF4TZC8LsBWH2gjB7QZi9EP2CIfoFQ/QLhugXDNEvGKJfMES/YIh+wRD9giH6BUP0C4bo FwzRLxiiXzBEv2CIfsEQ/YIh+gVD9AuG6BcM0S8Yol8wRL9giH7BEP2CIfoFQ/QLhugXDNEvGKJf MES/YIh+wRD9giH6BUP0C4boFwyRdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2R dw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw2Rdw3iWQ3iWQ3iWQ3i WQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3i WQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWQ3iWU2E2UuE2UuE2UuE2UuE2UuE 2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE2UuE 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 mL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1GmL1G mL1GmL1GmL1GmL1GmL1GmL0m+gWb6Bdsol+wiX7BJvoFm+gXbKJfsIl+wSb6BZvoF2yiX7CJfsEm +gWb6Bdsol+wiX7BJvoFm+gXbKJfsIl+wSb6BZvoF2yiX7CJfsEm+gWb6Bdsol+wiX7BJvoFm+gX bKJfsIl+wSb6BZvoF2yiX7CJfsEm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3 bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs2kXdtxLPaiGe1 Ec9qI57VRjyrjXhWG/GsNuJZbcSz2ohntRHPaiOe1UY8q414VhvxrDbiWW3Es9qIZ7URz2ojntVG PKuNeFYb8aw24lntxLPaiWe1E89qJ57VTjyrnXhWO/GsduJZ7cSz2olntRPPaiee1U6YvU6YvU6Y vU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6YvU6Y vU6YvU6YvU6YvU6YvU6YvY6YPdEv2ES/YBP9gk30CzbRL9hEv2AT/YJN9As20S/YRL9gE/2CTfQL NtEv2ES/YBP9gk30CzbRL9hEv2AT/YJN9As20S/YRL9gE/2CTfQLdtEv2EW/YBf9gl30C3bRL9hF v2AX/YJd9At20S/YRb9gF/2CXfQLdpF37SLv2kXetYu8axd51y7yrl3kXbvIu3aRd+0i79pF3rWL vGsXedcu8q5d5F27yLt2kXftIu/aRd61i7xrF3nXLvKuXeRdu8i7dpF37SLv2kXetYu8ayee1U48 q514VjvxrHbiWe3Es9qJZ7UTz2onntVOPKudeFY78ax24lntxLPaiWe1E89qJ57VTjyrnXhWO/Gs duJZ7cSz2olntRPPaiee1U48q514VjvxrHbiWe3Es9qJZ7UTz2onntVOPKudeFY78ax2wux1wux1 wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1wux1 wux1wux1wuwNwuwNwuwNwuwNxOyJfsEu+gW76Bfsol+wi37BLvoFu+gX7KJfsIt+wS76BbvoF+yi X7CLfsEu+gW76Bfsol+wi37BLvoFu+gX7KJfsIt+wS76BbvoF+yiX7CLfsEu+gW76Bfsol+wi37B LvoFu+gX7KJfsIt+wS76BbvoF+yiX7CLvGsXedcu8q5d5F27yLt2kXftIu/aRd61i7xrF3nXLvKu XeRdu8i7dpF37SLv2kXetYu8axd51y7yrl3kXbvIu3aRd+0i79pF3nWIvOsQedch8q5D5F0H8awO 4lkdxLM6iGd1EM/qIJ7VQTyrg3hWB/GsDuJZHcSzOohndRDP6iCe1UE8q4N4VgfxrA7iWR3EszqI Z3UQz+ogntVBPKuDeFYH8awO4lkdxLM6iGd1EM/qIJ7VQTyrg3hWB/GsDuJZHcSzOohndRBmbxBm bxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBmbxBm bxBmbxBmbxBmbxBmbxBmbxBmbxBmb4h+wSH6BYfoFxyiX3CIfsEh+gWH6Bccol9wiH7BIfoFh+gX HKJfcIh+wSH6BYfoFxyiX3CIfsEh+gWH6Bccol9wiH7BIfoFh+gXHKJfcIh+wSH6BYfoFxyiX3CI fsEh+gWH6Bccol9wiH7BIfoFh+gXHKJfcIi86xB51yHyrkPkXYfIuw6Rdx0i7zpE3nWIvOsQedch 8q5D5F2HyLsOkXcdIu86RN51iLzrEHnXIfKuQ+Rdh8i7DpF3HSLvOkTedYi86xB51yHyrkPkXQfx rA7iWR3EszqIZ3UQz+ogntVBPKuDeFYH8awO4lkdxLM6iGd1EM/qIJ7VQTyrg3hWB/GsDuJZHcSz OohndRDP6iCe1UE8q4N4VgfxrA7iWR3EszqIZ3UQz+ogntVBPKsDeFb7I/CszqB9RcygfUXMoH1F zKB9RcygfUXMoH1FzKB9RcygfUXMIKIIwOzNIKIIwOzNIKIIwOzNIKIIwOzNIKIIwOzNIKIIwOzN IKIIwOzNIKIIwOzNIKIIwOzNIKIIwOzNIKIIwOzNIERfiHUD0S84RL/gEP2CQ/QLDtEvOES/4BD9 gkP0Cw7RLzhEv+AQ/YJD9AsO0S84RL/gEP2CQ/QLDtEvOES/4BD9gkP0Cw7RLzhEv+AQ/YJD9AsO 0S84RL/gEP2CQ/QLDtEvOES/4PD8gld9wMul6f6qJni5NN1ftQcvl6b7q1Lh5dJ0f9U1vFyi7j3e 9SqOeLlE3Xu861Vh8XKJuvd416tM4+USde/xrletx8sl6t7jXa+CkZdL1L3Hu15VJy+XqHuPd71K V1ouj3e9Cl1eLlIRBZ7VGUQqosCzOoNIRRR4VmcQqYgCz2p/BJ7VGURq5MCzOoOIIoBndQYRRQDP 6gwiigCe1RlEFAE8qzOIKAJ4VmcQUQTwrM4gogjgWZ1BRBHAszqDiCKAZ3UGEUUAz+oMIooAntUZ RBQBPKsziCgCMHsziCgCMHsziCgCMHsziCgCMHsziCgCMHsziCgCMHsziCgCMHsziCgCMHsziCgC MHsziCgCMHsziCgCMHsziCgCMHsziCgCMHsziCgCMHszCJ01xLqB5xe8TlteLrFu4PkFryObl0us G3h+wevc5+US6waeX/A6PHq5RN17fsHrBOrlEnXv+QWvY6yWy/MLXodeL5eoe88veJ2cvVyi7j2/ 4HX89nKJuvf8gtcZ3ssl6t7zC16FAC+XqHvPL3hVE7xcou493vUqSWi5PN71KmB4uUTde7zrVQXx com693jXq5Ti5RJ17/GuVz3GyyXq3uNdr6KOl0vUvce7XpUhL5eoe493vcpLWi6Pd72KUV4uUfce 73pVtLxcou6BZ3UGkYoo8KzOIFARPYhn9SCe1YN4Vg/iWT2IZ/UgntWDeFYP4lk9iGf1IJ7Vg3hW D+JZPYhn9SCe1YN4Vg/iWT2IZ/UgntWDeFYP4lk9iGf1IJ7Vg3hWD+JZPYhn9SCe1YN4Vg/iWT2I Z/UgntWDeFYP4FmdQUQRhNk7CLN3EGbvIMzeQZi9gzB7B2H2DsLsHYTZOwizdxBm7yDM3kGYvYMw ewdh9g7C7B2E2TsIs3cQZu8gzN5BmL2DMHsHYfYOwuwdhNk7CLN3IGbP8wtexyovl1g3EP2Ch+gX PES/4CH6BQ/RL3iIfsFD9Aseol/wEP2Ch+gXPES/4CH6BQ/RL3iIfsFD9Aseol/wEP2Ch+gXPES/ 4CH6BQ/RL3iIfsFD9Aseol/wEP2Ch+gXPES/4CH6BQ/RL3iIfsFD9Aseol/wEP2Ch8i7HiLveoi8 6yHyrofIux4i73qIvOsh8q6HyLseIu96iLzrIfKuh8i7HiLveoi86yHyrofIux4i73qIvOsh8q6H yLseIu96iLzrIfKuh8i7HiLveoi86yHyrgfxrB7Es3oQz+pBPKsH8awexLN6EM/qQTyrB/GsHsSz ehDP6kE8qwfxrB7Es3oQz+pBPKsH8awexLN6EM/qQTyrB/GsHsSzehDP6kE8qwfxrB7Es3oQz+pB PKsH8awexLN6EM/qQTyrB/GsHsSzehDP6kE8qwdh9g7C7B2E2TsIsxeE2QvC7AVh9oIwe0GYvSDM XhBmLwizF4TZC8LsBWH2gjB7QZi9IMxeEGYvCLMXhNkLwuwFYfaCMHtBmL0gzF4QZi8Qsyf6BQ/R L3iIfsFD9Aseol/wEP2Ch+gXPES/4CH6BQ/RL3iIfsFD9Aseol/wEP2Ch+gXPES/4CH6BQ/RL3iI fsFD9Aseol/wEP2Ch+gXPES/4CH6BQ/RL3iIfsFD9Aseol/wEP2Ch+gXPES/4CH6BQ/RL3iIfsFD 9AseIu96iLzrIfKuh8i7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7 hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7hsi7BvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGs BvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGs BvGsBvGsBvGsBvGsBvGsBvGsBvGsBvGsBmH2gjB7QZi9IMxeEGYvCLMXhNkLwuwFYfaCMHtBmL0g zF4QZi8IsxeE2QvC7AVh9oIwe0GYvSDMXhBmLwizF4TZC8LsBWH2gjB7QZi9IMxeiH7BEP2CIfoF Q/QLhugXDNEvGKJfMES/YIh+wRD9giH6BUP0C4boFwzRLxiiXzBEv2CIfsEQ/YIh+gVD9AuG6BcM 0S8Yol8wRL9giH7BEP2CIfoFQ/QLhugXDNEvGKJfMES/YIh+wRD9giH6BUP0C4bIu4bIu4bIu4bI u4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bIu4bI u4bIu4bIu4bIu4bIu4bIuwbxrAbxrAbxrAbxrAbxrAbxrAbxrAbxrAbxrAbxrAbxrAbxrCbiWU3E s5qIZzURz2ointVEPKuJeFYT8awm4llNxLOaiGc1Ec9qIp7VRDyriXhWE/GsJuJZTcSzmohnNRHP aiKe1UQ8q4l4VhPxrCbC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC 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 1UY8q414VhvxrDbiWW3Es9qIZ7URz2ojzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4j zF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzF4jzN7/n7m/aZLkSBLt0DX7V6SQm0uR O3xh32YLbvgTKNxR7qIAJLrBxsdIodCv7/31z90DWZjO9KxQP3XANyMyIg3AVSMyQi0izPwc1UGY vUGYvUGYvYGYPdEXHKIvOERfcIi+4BB9wSH6gkP0BYfoCw7RFxyiLzhEX3CIvuAQfcEh+oJD9AWH 6AsO0Rccoi84RF9wiL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERfcIi+4BB9wSH6gkP0BYfoCw7RFxyi LzhEX3CIvuAQedch8q5D5F3HF3jXD58+PH3/y8e/bwFPH5//+tuPHz6+jn369scPP/z069Nvvz5/ 9/TNj798+/en1Xq57TfQ/vLtLx/3h/zh578+/fz8z0/PP3/6dc/35vH3x/z5CP71ac2zS16e4cfn /Q/69MvT7R70kjUFg9BRjfdSi0tZRHiHiPAOEeEdIsI7RIR3iAjvEBHeISK8Q0R4h4jwDhHhHSLC O0SEd4gI7xAR3iEivENEeIeI8A4R4R0iwjtEhHeICO8kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4k Gu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4k Gu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGu4kGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIk GOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIkGOIUFcgp KpBTVCCnqEBOUYGcogI5RQVyigrkFBXIKSqQU1Qgp6hATlGBnKICOUUFcooK5BQVyCkqkFNUIKeo QE5RgZyiAjlFBXKKCuQUFcgpKpBTVCCnqEBOUYGcogI5RQVyigrkFBXIKSqQU1Qgp6hAThHhnSLC O0WEd4oI7xQR3ikivFNEeKeI8E4R4Z0iwjtFhHeKCO8UEd4pIrxTRHiniPBOEeGdIsI7RYR3igjv FBHeKSK8U0R4p4jwThHhnSLCO0WEd4oI7yQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa 7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa7iQa 7iQa7iQa7iQa7iQa7iQa7iQa7iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM 3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3iLM3kLMnqhATlGBnKICOUUF cooK5BQVyCkqkFNUIKeoQE5RgZyiAjnFkR9T9AWn6AtO0Recoi84RV9wir7gFH3BKfqCU/QFp+gL TtEXnKIvOEVfcIq+4BR9wSn6gvN9X3D/nz99+OsP3z79L0+3f9b6bfr+w3Pfol8nePovn83x//Xp m5+++fS7GJ7HqCOnfcrznutf9PLXz+H+DP724R/PT9/++Pzh4/N3zlFD6G/7rn03b99/V98+sfLg b9vVzQd/W3n8t8ETEa8GxM8F0aecok85RZ9yij7lEnngJfLAS+SBl8gDL5EHXiIPvEQeeIk88BJ5 4CXywEvkgZfIAy+RB14iD7xEHniJPPASeeAl8sBL5IGXyAMvkQdeIg+8RB54iTzwEnngJfLAS+SB l8gDL+L0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0 LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LuL0LsI0 LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0 LsI0LsI0LsI0LsI0LsI0LsI0LsI0LsI0LtGnXKJPuUSfcok+5RJ9yiX6lEv0KZfoUy7Rp1yiT7lE n3KJPuUSfcol+pRL9CmX6FMu0adcok+5RJ9yiT7lEn3KJfqUS/Qpl+hTLtGnXKJPuUSfcok+5RJ9 yiX6lEv0KZfoUy7Rp1yiT7lEn3KJPuUSeeAl8sBL5IGXyAMvkQdeIg+8RB54iTzwEnngJfLAS+SB l8gDL5EHXiIPvEQeeIk88BJ54CXywEvkgZfIAy+RB14iD7xEHniJPPASeeAl8sBL5IGXyAMvAtou QrAu4vQu4vQu4vQu4vQu4vQu4PSuG3B6t6DrJ6Jb0PWK2IKuV8QWdL0itqDrFbEFXa+ILeh6RWxB 1ytiCyIVAZzeLYhUBHB6tyBSEcDp3YJIRQCndwsiFQGc3i2IVARwercgUhHA6d2CSEUAp3cLIhUB nN4tiFQEYPa2IFIRgNnbgkhFAGZvCyIVAZi9LYhUBGD2tiBSEYDZ24JIRQBmbwsiFQGYvS2IVARg 9rYgUhGA2duCSEUAZm8LIhUBmL0tiFQEYPa2IFIRgNnbgtBeQzw3EOcvLtEXXF/wBR+NEN5iT0YI 5zTLbaa99CIzhPcnsD/o5xnCaY23E4G3q16eZXyM8HkQ2nJ6L7d4HCJqkMvTII/trJdLOw45Nr9e Lm05H1tlL5d2DHhsrL1cWt0f23Avl1j3ngZ57OW9XGLdexrkcSDg5RLr3tMgj1MFL5dY954GeRxN eLnEuvc0yON8w8sl1r2nQR6HJF4use49jPc4adFyeRjvcS7j5RLr3sN4j8MdL5dY9x7Ge5wQebnE uvcw3uOYycsl1r2H8R5nVV4use49jPc48PJyiXXvYbzHqZmWy8N4jzM2L5dY9x7GexzUebnEugcq 7hZEDnqBirsFkYNeoOJuQeSgF6i4WxA56AUq7hZEjv6BirsFkYoAKu4WRCoCqLhbEKkIoOJuQaQi gIq7BZGKACruFkQqAqi4WxCpCKDibkGkIoCKuwWRigAq7hZEKgKouFsQqQig4m5BpCKAirsFkYoA KOIWRCoCoIhbEKkIgCJuQaQiAIq4BYGKSARFTARFTARFTARFTARFTARFTARFTARFTARFTARFTARF TARFTARFTARFTARFTARFTARFTARFTARFTAhF9DTIY1vl5RLPDTwN8tibebnEcwNPgzw2eF4u8dzA 0yCPXaKXS6x7T4M8tppaLk+DPDamXi6x7j0N8tjdernEuvc0yGOL7OUS697TII99tpdLrHtPgzw2 614use49DfLY8Xu5xLr3NMjj2EDL5WmQxyGDl0usew/jPU4qvFxi3Xu863Hc4eUS617kXZPIuyaR d00i75pE3jWJvGsSedck8q5J5F2TyLsmkXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTe NREVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEV NxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNxEVNwEVdwsiFUGY vUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSYvUSY vUSYvUSYvUSYvUSYvUSYvUSYvUSYvST6gkn0BZPoCybRF0yiL5hEXzCJvmASfcEk+oJJ9AWT6Asm 0RdMoi+YRF8wib5gEn3BJPqCSfQFk+gLJtEXTKIvmERfMIm+YBJ9wST6gkn0BZPoCybRF0yiL5hE XzCJvmASfcEk+oJJ9AWT6Asm0RdMIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8axJ5 1yTyrknkXZPIuyaRd00i75pE3jWJvGsSedck8q5J5F2TyLsmkXdNIu+aRN41ibxrEnnXRJzVRJzV RJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVRJzVTJzVTJzVTJzVTJzVTJzV TJzVTJzVTJzVTJzVTJzVTJzVTJzVTJzVTEzSTEzSTEzSTEzSTEzSTEi6TEi6TEi6TEi6TEi6TEi6 TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6TEi6 TEi6TEi6jEg60eJLosWXRIsviRZfEi2+JFp8SbT4kmjxJdHiS6LFl0SLL4kWXxItviRafEm0+JJo 8WXR4suixZdFiy+LFl8WLb4sWnxZtPiyaPFl0eLLosWXRYsvixZfFi2+LNpyWbTlsmjLZdGWy6It l0XaM4u0ZxZpzyzSnlmkPbNIe2aR9swi7ZlF2jOLtGcWac8s0p5ZpD2zSHtmkfbMIu2ZRdozi7Rn FmnPLNKeWaQ9s0h7ZpH2zCLtmUXaM4u0ZxZpz/w+7bn/z58+/PWHb59+/u2nb54/Pt3+eduT/RHe bmv7Kbhf94/nj7/+sD/QwysfZyzhjCWYsYYz1mDGFs7Yghl7OGMPZhzhjCOYcYYzzmDGFc64Yhnz LZrx9ysfZ0zhjCmYMbxmcnDN5PCaycE1k8NrJgfXTA6vmRxcMzm8ZnJwzeTwmsnBNZPDayYH10wO r5kcXDMlvGZKcM2U8JopwTVTwmumBNdMCa+ZElwzJbxmSnDNlPCaKcE1U8JrpgTXTAmvmRJcMyW8 ZkpwzZTwminBNVPDa6YG10wNr5kaXDM1vGZqcM3U8JqpwTVTw2umBtdMDa+ZGlwzNbxmanDN1PCa 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 /GyunEu7tfNuq+dQ7dTHf9qVI/HLtXN2WP6V71Z7/CddOWv/ymfTHz+bK0f1bu2820I7VDvj8Z92 5S7B5do5u3/wle/WfPwnXbn98JXPZj1+NlfuXnzhBX515Z99X+Mrqi49/iK/dONE+LZ7neTq+5we f4FfuiPzlc/m8XfvpRs64ar702/1fE3VPf4JcOle0uWqO7vL9JXv8+Ov/ks3qb7y2Tz+1v7Ke1wP 01+5Dfbg/aM3yB4+xyv30NBzfHx37eFzvHIDjjzHwK25h8/xyt079Bwf39d79Bwv3fpDz/HxTcGH z/HKfcPoF8F/qjuKwe+M8fYrIz/+Hv1z7lh+4Sn//M2Pv3z791+f0v4x/DrwX9+fT7885X7+8/Kd +59Xv9O+cGf0675L8uNvtj/nxuqXXvkt8H88f/zl6fmfn55//nRfhmmfRlVm6vl4P/ZrPj5/+PHT Dz89/3+2645rXj3GmzdpT3o8wodPnz7uaf7+9Mv33+//ca63r8wW/9OHf/7vgY9Iep/46mtQe5u3 uX1kRF+Cfv4SvLro6d+OR395pE8fPn764ee/Ph31/1KCKed12+9G79+Vv79ot798+8vH/W/br/75 Hv7ryWq5/1j47sOnD/fX/M0r/fgHx6Wb6l+5Ih7/tPh//578O5Xy/S+//fz6uc3tOX/44af9Pdne 72+enz487VXyb3uZPO2f24//vAsMwFe+1oG1dQUh0D5WX6e6+oeVx79ZKJvw3pCz/7i8Pj7/9bcf P3x8HXuvjF+ffvt1ezL35Z2339fbZ+rYvr1Ci/l3OOLlyzFvX+W91G1FrO2DqbQ+T74uS3rzMXT/ vfb5YaJB939xvJxPv3zz6y8/Pn96fvr5xx9+/vv2cjz/uL/Cn9+q/Dbft79tf+HPn37879u3ybkd 9g7lcbWuzviPryyox7+QLuEjX/lsHm/xL9EnV1/fUy7lK/+kxz+EKNZy9Wt++y05g9/w5cqPnLSl ffNnx3/lXAJ01LP390fAvros8ktm1G3jPuts45bTXjUvr86Yfc7gp+CjnzTl8U8ayiN9oZrevOO1 v31mI/6Gx+Cnh2ku8FFfuYYDf1MAr4r/2Kq3r/6xRXEu/DOgnv0M6Pk2er3dSqz+67/+Cjj5+q7k O/806Cu+8+u/fOfvH6sXKDj1E+wLw48fv2H59A1bfY25fSXF3rD88A3L5A07C/qaNyz/y4+0x4vn CnZ49UfGKZD4dR9Q9fHvpks8o1uj79IRry4LnRfUPrd1lWYeI89++/w1u3/SbF+9KfhN+zt++f43 bX38u+0Swin8FH2d5HKVPL6/Q9nQKz8e0qhvn1oP/3q4RKJefdVPGdWvfNUfn/tQxFWaS36Qr16u 939DEE7Wy/XuqTyiar1c727kEIPr5Xp3S4CIXS/X8nJ1se67WPddrPuu1f24AcZ73ADjPW6A8R43 wHiPG2C8xw0w3uMGGO+xzwoEQddPlMY+8Q8EkYropCI6qYhOKmKQihikIgapiEEqYpCKGKQiBqmI QSpikIoYpCImqYhJKmKSipikIiapiEkqYpKKmKQiJqmISSpikYpYpCIWqYhFKmKRilikIhapiEUq YpGKWKAi9tFfIAhUxD7ACwSBikigf9PYJ22BIFARCXRNGvtILBBEKiKRikikIhKpiEQqIpGKSKQi EqmIRCoikYpI5FvD258f2yovl7Y/PzZhWi5vf35s2bxc2v782OB5ubRzqWM76OUS676Ldd/Fuu9i 3Q+x7odY90Os+yHW/RDrfoh1P8S6H2LdD7Huh1j3U6z7Kdb9FOt+inU/xbqfYt1Pse6nWPdTrPsp 1v0S636Jdb/Eul9i3S+x7pdY90us+yXW/RLrfnl1v5+ZeLm8ut9PWLxcXt2n9xuNoGMaL5dX9+n9 hhjorMfLJdb9++0X0IGRl0us+/dlf3Tq5OUS6z6JdZ/Euk9i3Sex7jM5Ec3kRDSTE9FMTkQzOREF ZufYB4GDIHIimsmJaCZn5MBWG/vcbRBEKqKQigA+z9hnYIMgUhGFVEQhFVFIRQBxYexTpUEQqYhK KgJ0iB0JsLhjH74MgkhFgBarY5+AfD0I9GUdCfRlHQn0ZR0J9GUdCfRlHQn0ZR2JMHuJMHuJMHuJ MHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJ MHuJMHuJMHuJMHuJMHuJMHv7/snbi4nnBu83aUKbMC+XeG7wfm8htJPzconnBu93hEHbQS1XEev+ C61OyJ7SyyXWfRHr/v1GE2i/6uUS676IdV/Eun+/aQDaInu5xLqvYt2/rxqj7beXS6z7Kta955Ae W3stl+ejHgcBXi6x7j0f9ThN8HKJdS/yrknkXZPIuyaRd00i75pE3jWJvGsSedck8q5J5F2TyLsm kXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8axJ51yTyrknkXZPIuyaRd03EWU3E WU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWU3EWc3EWc3EWc3EWc3EWc3E Wc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc3EWc2E2cuE2cuE2cuE 2cuE2SPTGEYmzF4mzF4mzF4mzB7pMD8yYfYyYfYyYfZID+5BWi2PTPC7TPC7TPA70jd4ZILfkYHw IxP8jgxoH6QV5sgEvyPtH4+tkLetEo8ARPUviepfEtW/JKp/SVT/kqj+JVH9S6L6l0T1L4nqXxLV vySqf0lU/5Ko/mVR/fvC7Ha0UfVyeXX/hRnjaLfr5fLq/guzsNGW2csl1r2o/mVR/cui+veFOb9o 8+7lEuteVP+yqP5lUf3LovqXRXQ1i+jqF+aLorMIL5dY9yK6+oXxkuicw8sl1r2IrmYRXf3SlD5y tOLlEuteRFe/MN8LHdt4ucRaFXHTL8yoQkdCXi6xVkXc9AuTbdBxk5dLrHsPN12knewi7WQXaSe7 SDvZRdrJLtJOdpF2sou0k12knewi7WQXaSe7SDvZRdrJLtJOdpF2sou0k12kncYi7TQWaaexSDuN RdppLNJOY5F2Gou001ikM8YinTEW6YyxSGeMRTpjLNIZY5HOGIt0xlikM8YinTEW6YyxSGeMRTpj LNIZY5HOGIt0xlikM8YinTEW6YyxSGeMRTpjLNIZY5HOGIt0xlikM8YinTEW6YyxSGeMRTpjLNIZ Y5HOGIt0xlikM8YinTEW6YyxSGeMRTpjLNIZY5HOGEvs5LjETo5L7OS4xE6OS+zkuMROjkvs5LjE To5L7OS4xE6OS+zkuMROjkvs5LjETo5L7OS4xE6OS+xEssROJEvsRLLETiRL7ESyxE4kS+xEssRO JEvsHrLE7iFL7B6yxO4hS+wessTuIUvsHrLE7iFL7B6yxO4hS+wessTuIUvsHrLE7iFL7B6yxO4h S+wessTuIUvsHrLE7iFL7B6yxO4hS+wessTuIUvsHrLE7iFL7B6yxO4hS+wessTuIUvsHrLE7iFL 7B6yxO4hS+wessTuIUvsHrLE7iFL7B6ySDfXRbq5LtLNdZFurot0c12km+si3VwX6ea6SDfXRbq5 LtLNdZFurot0c12km+si3VwX6ea6SDeLRbpZLNLNYpFuFot0s1ikm8Ui3SwW6WaxSDeLRbpZLNLN YpFuFot0s1ikm8Ui3SwW6WaxSDeLRbpZLNLNYpFuFot0s1ikm8Ui3SwW6WaxSDeLRbpZLNLNYpFu Fot0s1ikm8Ui3SwW6WaxSDeLRbpZLNLNYpFuFot0s1ikm8Ui3SwW6WaxSDeLRbpZLNLNYpFuFot0 s1ikm8Ui3SwW6WaxxO6LS+y+uMTui0vsvrjE7otL7L64xO6LS+y+uMTui0vsvrjE7otL7L64xO6L S+y+uMTui0vsvrjEliNLbDmyxJYjS2w5ssSWI0tsObLEliNLbDmyxJYjS2w5ssSWI0tsObLEliNL bDmyxJYjS2w5ssSWI0tsObLEliNLbDmyxJYjS2w5ssSWI0tsObLEliNLbDmyxJYjS2w5ssSWI0ts ObLEliNLbDmyxJYjS2w5ssSWI0tsObLEliNLbDmyxJYjS2w5ssSWI0tsObLEliNLbDmyxJYjS2w5 ssSWI0tsObJIN9dFurku0s11CyInosQzJS1gF2kBu0gL2EVawC7SAnaRFrCLtIBdpAXsIi1gF2kB u0gL2C2IVATxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDPxTDNRRjNR RjNRRjMh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TIh6TKB4jKB4jKB4jLh 2zLh2zLh2zLh2zLh2zLh2zLh2zLh28T2hktsb7jE9obHhsXLJe6xRbdObJW4xFaJS2yVuMRWiUts lbjEVolLbJW4xFaJS2yVuMxWiVl067Lo1mXRrcuiW5dFty6Lbl0W3bosunVZdOuy6NZl0a3LoluX Rbcui25dFt26LLp1WfThsujDZdGHyyKDmUUGM4sMZhYZzCwymFlkMLPIYGaRwcwig5lFBjOLDGYW GcwsMphZZDCzyE1mkZvMIjeZRdYxi6xjFlnHLLKOWWQds8g6ZpF1zO+zjvv//OnDX3/49unn3376 5vnj0+2ftz3ZH+E97e0y9uv+8fzx1x/2B3p45eOMJZyxBDPWcMYazNjCGVswYw9n7MGMI5xxBDPO cMYZzLjCGVcs47YFCGb8/crHGVM4YwpmDK+ZHlwzPbxmenDN9PCa6cE108NrpgfXTA+vmR5cMz28 ZnpwzfTwmunBNdPDa6YH18wIr5kRXDMjvGZGcM2M8JoZwTUzwmtmBNfMCK+ZEVwzI7xmRnDNjPCa GcE1M8JrZgTXzAivmRFcMyO8ZkZwzczwmpnBNTPDa2YG18wMr5kZXDMzvGZmcM3M8JqZwTUzw2tm BtfMDK+ZGVwzM7xmZnDNzPCamcE1M8NrZgbXzAqvmRVcMyu8ZlZwzazwmlnBNbPCa2YF18wKr5kV XDMrvGZWcM2s8JpZwTWzwmtmBdfMCq+ZFVwzK7xmVmzN7DpcLOPLlY8zRtfMy5WPM0bXzMuVjzNG 18zLlY8zRtfMy5WPM0bXzMuVjzNG18zLlY8zRtfMy5WPM0bXzMuVjzNG18zLlQ8zpvCaScE1k8Jr JgXXTAqvmRRcMym8ZlJwzaTwmknBNZPCayYF10wKr5kUXDMpvGZScM2k8JpJwTWTwmsmBddMDq+Z HFwzObxmcnDN5PCaycE1k8NrJgfXTA6vmRxcMzm8ZnJwzeTwmsnBNZPDayYH10wOr5kcXDM5vGZy cM2U8JopwTVTwmumBNdMCa+ZElwzJbxmSnDNlPCaKcE1U8JrpgTXTAmvmRJcMyW8ZkpwzZTwminB NVPCa6YE10wNr5kaXDM1vGZqcM3U8JqpwTVTw2umBtdMDa+ZGlwzNbxmanDN1PCaqcE1U8NrpgbX TA2vmRpcMzW8ZmpwzbTwmmnBNdPCa6YF10yYA8hBDiCHOYAc5ABymAPIQQ4ghzmAHOQAcpgDyEEO IIc5gBzkAHKYA8hBDiCHOYAc5ABymAPIQQ4ghzmAHOQAcpgDyEEOIIc5gBzkAHKYA8hBDiCHOYAc 5ABymAPIQQ4ghzmAHOQAcpgDyEEOIIc5gBzkAHKYA8hBDiCHOYAc5ABymAPIQQ4ghzmAHOQAcpgD yEEOIIc5gBzkAHKYA8hBDiCHOYAc5ABymAPIQQ4ghzkAYG33AmYb7EGXbeA96LINvAddtoH3oMs2 8B502Qbegy6r3nvQZY9/D7rsh+9BpCKuzzbYg0hFXJ9tsAeRirg+22APIhVxfbbBHkQq4vpsgz2I VMT12QZ7EKmI67MN9iBSEddnG+xBpCKuzzbYg0hFXJ9tsAeRirg+22APIhVxvbfbHkQq4npvtz2I VMT13m57EKmI673d9iBSEdd7u+1BpCKu93bbg0hFXO/ttgeRirje220PIhVxvbfbHkQq4npvtz2I VMT13m57EKmI673d9iBSEdd7u+1BpCKu93bbg0hFXO/ttgeRirje220PQnsNywO8b6u8XJYHeN+E ebksD/C+ZfNyWc7qfYPn5bL81/t2UMul9X6/bx69XGLda73f7ztQL5dY91rv9/s21ssl1r3W+/2+ F/ZyiXWv9X6/b6i9XGLda73f77tyL5dY91rv9/vWXsul9X6/HwR4ucS61/ox3k8TvFxi3Wv9GO9H El4use61foz3cw0vl1j3Wj/G++GIl0use60f4/2Excsl1r3Wj/F+TKPl0vox3g91vFxi3Wv9GO8n Q14use61foz34yUvl1j3Wj/G+xmVl0use60f4/2gy8tFTkSvD0TYg8iJ6PWBCHsQORG9PkVhC7o+ RWEPIiei16co7EHkRPT6FIU9iFTE9SkKexCpiOtTFPYgUhHXpyjsQaQirk9R2INIRVwfvbAHkYq4 PnphDyIVcX1ewx5EKuL6vIY9iFTE9XkNexCpiOvzGvYgUhGLVMQiFbFIRSxQEYUwe4Uwe4Uwe4Uw e4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uw e4Uwe4Uwe4Uwe4UwewUxe108N9B64993W14u8dygi+cGWp/9+07OyyWeG2h99u/bQS+XWPdan/37 ntLLJda91mf/vjHVcml99u/bWC+XWPdTrHutZ/99i+zlEut+inWv9f+/b7+1XFr///tm3csl1r3W //++4/dyiXW/xLpfYt0vse6XV/dF5F2LyLsWkXctIu9aRN61iLxrEXnXIvKuReRdi8i7FpF3LSLv WkTetYi8axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsRedci8q5F5F2LyLsWkXctIu9aiLNaiLNa iLNaiLNaiLNaiLNaiLNaiLNaiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5a iH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aiH5aCH5XCH5XCH5XCH5XCH5X CH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCH5XCElXCElXCElXCElXCElX CElXCElXCElXRIuviBZfES2+Ilp8RbT4imjxFdHiK6LFV0TzrojmXRHNuyKad0U074po3hXRvCui eVdE866I5l0RzbsimndFNO+KaN4V0bwronlXRPOuiOZdEc27Ipp3RTTvimjeFdG8K6J5V0Tzrojm XRHNuyKSo0UkR4tIjhaRHC0iOVpEcrSI5GgRydEikqNFJEeLSI4WkRwtIjlaRHK0iORoEcnRIpKj RSRHi0iOFpH2LCLtWUTas4i0ZxFpzyLSnkWkPYtHezbSzbWRbq6NdHNtpJtrI91cG+nm2kg310a6 uTbSzbWRbq6NdHNtpJtrI91cG+nm2kg310a6uTbSmKKRxhSNNKZopDFFI40pGmlM0UhjikYaUzTS mKKRxhSNNKZopDFFI40pGmlM0UiPiUZ6TDTSY6KRHhON9JhopMdEIz0mGukx0UiPiUZ6TDTSY6KR HhONtItopF1EI+0iGun80Ejnh0Y6PzTS+aGRzg+NdH5opPNDI50fGun80Ejnh0Y6PzTSxKGRJg6N NHFoYtPBJjYdbGLTwSY2HWxi08EmNh1sYtPBJjYdbGLTwSY2HWxi08EmNh1sYtPBJjYdbGLTwSY2 HWxio4smNrpoYqOLJja6aGKjiyY2umhio4smNrpoYqOLJja6aGKjiyY2umhio4smNrpoYnOKJjan aGJziiY2p2hic4omNqdoYnOKJjanaGJziiY2p2hic4omNqdoYkOJJjaUaGJDiSY2gWhiE4gmNoFo YhOIJjaBaGITiCY2gWhiE4gmNoFoYhOIJjaBaGLjhiY2bmhi44ZBThoHOWkc5NBwkEPDQQ4NBzk0 HOT8b5CjvEGauA5y/jfI+d8g53+DNHEdpInrIE1cB2niOkgT10GauA7SxHWQJq6DNHEdpInrIE1c B2niOkgT10GauA7SxHWQJq6DNLEYpInFIE0sBmliMUgTi0GaWAzSxGKQJhZbEKkI0PlikM4Xg3S+ GKTzxSCdLwbpfDFI54tBOl8M0vlikM4Xg3S+GKTzxSCdLwbpfDFI54tBOl8M0vlikM4Xg3S+GKTz xSCdLwbpfDFI54shnkkM8UxiiOcIQzxHGOI5whDPEYa49x/ifn2ITRuHuPcf4t5/mHt/sWnjEJs2 DrFp4xCbNg6xaeMQmzYOsWnjEJs2DrFp4xCbNg6xaeMQmzYOsWnjEJs2DrFp4xCbNg6xvckQ25sM sb3JENubDLG9yRDbmwyxvckQ25sc+3Qvl1j3XquUIbZKGWKrlCG2Shliq5QhtkoZYquUIbZKGWKr lCG2Shliq5QhtkoZYquUIbZKGWKrlCG2Shliq5QhtkoZYquUIbZKGWKrlCG2Shmkk+kgTUkHaUo6 SFPSQZqSDtKUdJCmpIM0JR2kv+ggrUIHaRU6SKvQQVqFbkHkfQJC5CCtQgdpFTpIq9BBWoUO0ip0 CyIVASzKQfqLDtJfdJD+ooP0Fx2kVeggrUK3IPLmAiFyCyIvOcGUCsKUgBA5KmGbKsGUKtAUtyCw NCrQFLcg8D5VwjZVwjZVgilVQhxVAg9VBA951tYQm8wNscncEJvMDbHJ3BCbzA2xydwQm8wNsTHc EJu5DbGZ2xCbuQ2xmdvxg9XLJdaXZ0cNsZnbEJu5DbGZ2xCbuR2/qL1cYt17ptUQG8MNsTHcEBvD DbGZ2xCbuR07AS+XWF/eiNxjO+HlMmvC+yysItVURRKpehbSsbHxcnn1VUWqqYpUUxWppiqSSFWk h6pI/NT3iZ+n3//v354+/PXnX57+96dL+/K2/erJqV3Ds1+CLm18fw+6hme/BF3aLb8EXTrVeAm6 tMV+CSIv+TU8+yXo0r78JejSUchLEKmIa3j270HX8Ozfg66dEr4EkTf32tHiSxB5c6+dR74EkTf3 2nnkH58RX/9x9sdHh5ZLgT3++KDxchk/Vf74WPJyGT97/vgQ83IZP3v++Mjzcol1r8Aef3xuvpPr Xy8b20+D/T8+//PT88+fnn799OHjpx9+/uvTNz/+8u3fn37+7advnj8+pd52Zb3NcrvN//r0y/ff 708gbb8fy6hzlu2/lvqXb3/5uD+VPfrne7pfn77/5eOr5zX+sj/cdx8+fdj/49+3//rmgvvT/tuH fzw/ffvj84ePz9+9uQR9J2gvrtKZ449vEC+XuOCUfewfX0NeLm3BlXbtBu5L0PVv7y3o+rf3FnS9 zreg69/eW9D1n2alXbvr+xJ0/cd6Ib/nCvk9V8jvuUJ+zxXye66Q33NbEHhz+7VbxS9B4M3t1+4v vwSBN7dfuyn9e9C1PhMvQeRvunYD9yUI1F6/dgP3JQjUXr/W/eEliBTste4PL0GkYK91f3gJIm/u te4PL0GkIq51f3gJIhVxrfvDSxCpiGvdH16CSEVc6/7wEkQq4lr3h5cgUhHXuj+8BJGKAMeLWxCp CHC8uAWRigDHi1sQqQhwvLgFkYoAx4tbEPoNq+2Jjp/rXi5tT3T8uPdymXsi7RDi2CF4ubTDtyKe BRTxLKCIZwFFPAso4llAEc8Cjp2Nlasr96H/2Ad5ubxa7Up3jT82U1oupfPEH1svL5f4ein3e//Y v3m5vPXYlQ4Pf2wCtVxKh4c/toxeLrFWlQ4Pf+w7vVxi3SsdHv7YvHq5xLpXOjz8sQP2col1r3R4 +GMb7eUS617p8PDHXtzLJda9d9P/2NBrubyb/sf238sl1r130/84Q/ByiXXv3fQ/DiKsXOOaNvt7 0DUD9iUInCONazLrSxA4RxrkXugg90IHuRc6yL3QQe6FDnIvdJB7oYPcCx3kFuAktwAnuQU4yS3A SW4BTnILcF7zUl+CQJXPa17qSxB5c8ltzXnNS30JIu/TtU74L0HkfSK3NSe5rTnJbc1JbmtOcltz ktuak9zWnOS25iS3NSe5rTnJbc1JbmtOcltzktuak9zWnOS25iS3NSe5rTnJbc1JbmtOcltzktua k9zWHIrm+sevVC+Xt90Zik76x09dL5e33Rni7cUh3l4c4u3FId5eHOLtxSHeXhzi7cUh3uKa4i2u Kd7imuItrine4priLa6pKKB/bC28XN7nxFS0zT/2J14usVbFW4JTaSD/x97HyyXWhHhLcIq3BKd4 S3CKtwSneEtwircEp3hLcIq3BKd4S3CKtwSneEtwircEp3hLcIq3BKd4S3CKtwSneEtwircEp3hL cIq3BKd4S3B6twQbQbQbQbQbQbQboa0bAacbAacbAacbAacbAacbAacbYaAbYaAbYaC3IPI+XZtL 9xJEXr1r0+JegsgLcW2G2+9BnbwQ19p3vwSR5X6tffdLEKm9a+27X4LIB0sn79O1nt8vQeTNvdYo /CWIVMS1RuEvQaQirjUKfwkiFQGIhy2IVATAJLYgUhGArdiCSEUAtmILIhUB2IotiFQEYCu2IFIR gK3YgkhFALZiCyIVATzzJmKTTcQmm4hNNhF1bCKe2EQ8sYl4YhPxxCbiiU3EE5uIFDYRKWwiUnj8 3NdyKcOZ/tgceLnE91EZXPTHDkPL1cXXXmlN/8c2xcslvo9Ka/o/9jpeLvG7o4v1pbS5/2Mf5eUS vzuUlvl/bMa8XGLdKy3z/9jRebnEulda5v+xLfRyiXXvMU7H3tLLJda9xzgdG1Qvl1j3HuN07HK1 XB7jdOyJvVxi3XstFI6NtZeLHKaAFm1bEDlMAVJHG0Dq2ILAYcoAUscWBA5TBpA6tiBwvDaA1LEF gYoY14aNvQSRigAmyBZEKgJ0xduCSEUAfWQLIhUBWultQaQigHOyBZGKAM7JFkQqAjgnWxCpCOCc bEGkIoBzsgWRigDOyRZEKgI4J1sQqQjCaQzCaQzCaQzgnGxBpCKAc7IFkYogRMggRMggRMggRMgg RMgArfS2IFIRBCMZBCMZYFLHFkQqAkzq2IJIRTRSEYRyGY1UBEFjRiMVQXiagXgarwPcsUPyconb dk+1ObZZXi5v2z481ebYq3m5vG378FSbY8Pn5fLqfijT1v7YNWq5PG3n2GN6ucS69xSgY6Pq5RLr 3usweOx2vVxi3Xs60bFl9nKJde/pRMe+28sl1r2nEx2bdy+XWPeeTnScAGi5PJ3oOC/wcol1L6Jy Q0TlhqcTHUcUXi6x7kWEb4gI3xARviEifENE+IaI8A2vw+Bx4uLlEutexAGHN1bwOM3Rcr0/VhCd /Xi5xLoXkcf9AMnLJdZ9E+teRDGHh2IOYpIMYpIMYpIMYpIMYpIMYpIMYpIMYpIMYpIMYpIMYpIM YpIMYpIMYpIMYpJsQaQiAA4zCA4zCA4zCA4zCA4zCA4zCA4zCA4zCA4zCA4zCA4zCA4zCNkyCNky CNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNky CNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyCNkyRHtiiPbEEO2JIdoTQ7Qn hmhPDNGeGKI9MUR7Yoj2xBDtiSHaE0O0J4ZoTwzRnjj2mF4use49/GiI+NEQ8aMh4kdDxI+GiB8N ET8aIn40RPxoiPjREPGjISJDQ0SGhogMDREZGiIyNERkaIjI0BCRoSEiQ0NEhoaIDA0RGRoiMjRE ZGiIyNAQkaEhIkNDRIaGiAwNERkaIjI0RGRoiMjQEJGhISJDQ0SGhogMDREZGiIyNERkaIjI0BCR oSEiQ0NEhoaIDA1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iYw1iY21BpCKA wjVGJxUB+ihvQaQiQPPlLYhUBGi+vAWRigDNl7cgUhGg+fIYoPnyFkQqAjRf3oJIRYDmy1sQqQjQ fHkLIhUBmi9vQaQiCDI3CDJHBlsPMth6kMHWgwy2HmSw9SCDrQeZUT3IjOpBZlRvQeTNJfTbIPTb IPTbIPTbIPQbGdY9yLDuQYZ1DzKse5Bh3YMM6x5k7vYgc7eH6DQM0WkYotMwRKdhiE7DEJ2GIToN Q3Qahug0DNFpGKLTMESnYYhOwxCdhmOL5+US676Lde+1vT62j14use69FtrHHtTLJda910L72Mh6 ucS691poH7thL5dY914L7WNL7eUS695roX3sy71cYt17LbSPzb2XS6x7EQIdIgQ6RAh0iBDoECHQ IUKgQwQ3hwhuDhHcHCK4OURwc4jg5hDBzSGCm0MEN4cIW04RtpwibDlF2HKKsOUUYcspApLTAyQX EZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgWEZgW4ToW4ToW4ToW4ToW 4ToW4ToW4ToW4ToW4ToW4ToW4ToW4ToW4ToW4ToW4ToWQTQWQTQWoS0WoS0WoS0WoS0WoS0WoS0W oS0WoS0WoS0WoS0WoS0WAScWAScWAScWAScWAScWAScWAScWASe2IPJCAMhgEV5giaj6ElH1JaLq S0TVl4iqLxFVXyKqvkRUfYmo+hJR9SWi6ktE1ZeIqi8RVV8iqr5EemOJ9MYS6Y0l0htLpDeWSG8s kd5YIr2xRHpjifTGEumNJdIbS6Q3lkhvLJHeWCJxsUTiYomUxBIpiSVSEkukJJZISSyRklgiJbFE SmKJlMQSKYklUhJLJBuWSDYskWxYItmwRLJhiWTDEsmGJZINxxbeyyW+9trd9ZLA0csWdP3oZQ+6 fEyxB10+etmDLp+r7UGXT1r3oMuHcXvQ5cO4PejyYdwedPkMqqR5vYXrHgTe3Hm9heseBN7ceb2F 6x4E3tx5vYXrHgTe3Hm9heseBJb7vN7CdQ8iFXG9heseRCri+u34PQg9Eqm96zfJ9yBSRtdvku9B 5FtD+/lx/wbycolfp9rPj/vXmJfL2iLev/S8XNbP7vtXpJfL+ul3/0L1cnm1OrVua/dvZS+XV6tT 67Z2/2r3cnm1OrVua/ffB1ourdva/deEl0use63b2v0niZfLfF7ietRuC95/7ni5xDWk3RYsZV6f NLAHXd+4bEHXf3FuQdd/cW5B139xbkHXf3GWeR3U3YOu7wy2oOsbl0K2E4VsJ7YgUhFgD1LIHqSQ PUghe5Ayr4O6exCpiOug7h5EKuI63bsHkYq4TvfuQaQirtO9exCpiOt07x5EKuI63bsHkYq4Tvfu QaQirtO9exCpiOt07x5EKuI6ErwHkYq43rVtDyIVcZ0j3oNIRVzniPcgUhHXOeI9iFTEdY54DyIV cZ0j3oNIRVzv2rYHkYq4Dh/vQaQirsPHexCpCHAHbAsiFQHugG1BpCLAHbAtiFQEuAO2BaG9hrZ3 PbZVXi5tH3xswrxc2j742LJpuTQs/L7B83JpZ0lFPLMp4pnNsXn0col1753/FPH8p6jnPxoWft/G ernEutc6mN/3wl4use41xPy+ofZyiXWvIeb3XbmXS6x7DTG/b+29XGLda4j5/XzAyyXWvYaY3w8Z tFwarn4/kvByiXWvoe/3cw0vl1j3Gvp+Pxzxcol1r6Hv9xMWL5dY9xr6fj+m8XKJda9h9PezHi+X WPcaRn8/MNJyeRzbcbzk5RLr3uPYjjMqL5dY9x7Hdhx0WbkWuRO0yE2dRW61LHKrZZFbLYvcalnk Vssit1oWudWyyK2WRW61LHKrZZFbLYvcalnkVssit1oWudWyyK2WRW61LHKrZZFbLYvcalnkVssi t1oWudWyyK2WRW61LHKrZZFbLev6BJo9iLx61yfQ3L+fvO867zt4iXv6Je7pl7inX+Kefol7+iXu 6Ze4p1/inn6Je/ol7umXuKdf4p5+iXv6Je7pl7inX+Kefol7+iXu6Ze4p1/inn6Je/ol7umXuKdf 4p5+iXv6Je7pl7inX1pD/PsvKi+X9j42wps1wps1wps1wps1wps1wps1wps1wps1wps1wps1wps1 wps1wps1wps1wps1wpttQaQirnf93ILAxm4LIhUBNnZbEKmI66NF9yBSEddHi+5BpCIWqYjr80hL W9fnke5BoCLW9XmkexCoiHV9HukeBCpiXR9iugeBilg3UBHrRioCtHLZgkhFgFYuWxCpCNDKZQsi FQFauWxBpCJAK5ctiFQEaOWyBZGKAK1ctiBSEcCR3YJIRQBHdgsiFQEc2S2IVARwZLcgUhHAkd2C SEUAR3YLQnsNcy+m7ambyIc0kQ9pIh/SRD6kiXxIE/mQJvIhTeRDmsiHNJEPaSIf0kQ+pIl8SBP5 kGO/6uUS6947ezs2vV4use61YZT3nbOXS6x7bRjlffvt5RLrXhtsed/De7m8ul/aYMv7QYCXy6v7 /djAy+XV/dKGZN7PHrxcYt17PfKOAwwvl1j3Xo+84xTEyyXWvdcj7zhK8XKJde/1yDvOY7xcYt17 PfKOQx0vl1j3ns9/nAx5ucS693z+43hJy+X5/MdhlJdLrHvP5z9OtLxcYt2DHnFbEDkRBT3itiBy Igp6xG1B5EQU9IjbgsiJKOgRtwWRM3LQI24LIhUBesRtQaQiQI+4LYhUBOgRtwWRigBm0BZEKgLo RFsQqQjQI64RcakRcakRcakRcakRcakRnagRnagRnagRnagRnagRnagRnagRnagRnagRnagRnagR nagRnagRnagRnagRnagRnagRnagRnagRnWgLIhVBSLpFSLpFSDqiSDWiSDWiSG1BpCIISbcISbcI SbcISbcQFOc1HDv2LV4ucWPuNRw7Nj9eLnFj7jUcO3ZQXi5xY+41HDu2YV4use69hmPHXk7L5TUc O3Z+Xi6x7r2GY00Ud49dpZdLrHuv4dixNfVyiXXvyclNlJObKCc3UU5uogTcRAm4iRJwEyXgJkrA TZSAmygBN1ECbqIE3EQJuIkScBMl4CZKwE2UgJsoATdRAm6iBNxECbiJEnATJeDjwMPLJda9CG4u EdwUpekmStPNlKaXCG4uEdxcIri5RHBzieDm8mDLQWSoQWSoQWSoQWSoQWSoQWSoQWSoQWSoQbym QbymQbymQbymQbymQbymfdGQIPLmAq5jEK5jEK5jEK5jEK5jEERjEERjENpiENpiENpiENpiENpi ENpiEHBiEAZiEAZiEAZiEAZiEAZiEAZiEJxhEJxhkD6sg/RhHQScGAScGAScGAScGAScGAScGASc GAScGAScGAScGAScGAScGAScGAScGAScGAScGAScGAScGCJ+P0T8foj4/RDx+yHi90PE74eI3w8R vx8iMj9EZH6IyPwQkfkhIvNDROaHiMwPkUgZIpEyRCJliETKEImUIRIpQ6RIhkiRDJH8GCL5MUTy Y4jkxxDJjyGSH0OkNYZIWAyRsBgiYTFEwmKIhMUQCYshUhFDpCKG2LJ9iC3bh0hrDJHWGCKtMURa Y4i0xhBpjSHSGkOkNYZIawyR1hgirTFEWmOItMYQaY0h0hpDpDWGSGsMkdZY5BxykXPIRc4hFzmH XOQccpFzyEXOIRc5h1zkHHKRc8hFziEXOYdc5BxykXPIRc4hFzmHXETgWkTgWkTgWkTgWkTgWsTF WsTFWsTFWkSrWkSrWkSrWkSr2oLQ+3R55dbb7XqD8j3o8pu7B11+c/egyyt3D7pcEXvQ5YrYgy5X xB50uSL2oMsVsQeRirjeoHwPIhVxvUH5HkQq4nqD8j2IVMT1BuV7EKmI6w3K9yBSEdeZvD2IVMR1 Jm8PIhVxncnbg0hFXGfy9iBSEdcblO9BpCKug3x7EPlJ4J3KLPFUZomnMks8lVniqcwST2WWeCqz xFOZJZ7KLPFUZomnMks8lVniqcwST2WWeCqz1FMZz6FZokOzRIdmiQ7NEh2aJXovS/Relui9LNFV WaKrskRXZYmuyrGz9nJZn6v3fbiXy6rV+67dy2V9rt73+F4uq+7vJwJeLqvu7+cHXi6x7rUm4/dD CC+XWPdak/H7SYaXS6x7rcn4/TjEyyXWvdZk/H6m4uUS616jnO8HM14use41yvl+uuPlEuteazJ+ PyLScmnE9P1AyctFTh6vC6N7EDl5vC6M7kHk5PG6MLoHkZPH68LoFnRdGN2DyFn09UbgexCpiOuW 6R5EKuK6mroHkYq4rqbuQaQirqupexCpiOuNwPcgUhHXG4HvQaQirkuwexCpiOsS7B5EKuK6BLsH kYq4bs7uQaQirpuzexCpiOvm7B5EKuI6sbYHkYq4TqztQaQirhNrexCpiOvE2h5EKuI6sbYHkYq4 TqztQaQirhNrexCpiOvE2h5EKuI6sbYHkYq4TqztQaQirhNrexCpiOuY2x5EKuI65rYHkYq4zsbt QWivIZ4baMbpfbfl5RLPDTTj9L5l83KJ5waacXrf93m5xHMDrQf6ffPo5RLrXuuBft+BernEutdM 2Ps2VsulmbD3Ta+XS6x7zaq975y9XGLda4buffvt5RLrXjN073t4L5dY95rtez8I8HKJda/ZvvfT BC+XWPcaV3o/ktByaVzp/QDDyyXWvcaV3k9BvFxi3Wtc6f0oxcsl1r3Gld7PY7xcYt1rXOn9UMfL Jda9xpXeT4a8XGLda1zp/XhJy6UxqvfDKC+XWPdab/b7iZaXS6z7627oHkRORK+7oXsQOBFNxA1N xA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1N xA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1NxA1N193QPYhUBGH2EmH2EmH2EmH2EmH2EmH2 EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2EmH2 EmH2EmL2NF/wvq3yconnBqIvmERfMIm+YBJ9wST6gkn0BZPoCybRF0yiL5hEXzCJvmASfcEk+oJJ 9AWT6Asm0RdMoi+YRF8wib5gEn3BJPqCSfQFk+gLJtEXTKIvmERfMIm+YBJ9wST6gkn0BZPoCybR F0yiL5hE3jWJvGsSedck8q5J5F2TyLsmkXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTe NYm8axJ51yTyrknkXZPIuyaRd00i75pE3jWJvGsSedck8q6JOKuJOKuJOKuJOKuJOKuJOKuJOKuJ OKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJ6KeJ6KeJ6KeJ6KeJ6KeJ6KeJ6KeJ 6KeJ6KeJ6KeJ6KeJ6KeJ6KeJ6KeJ6KeJ6KeJkHSJkHSJkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZ kHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHSZkHQZkXSixZdEiy+J Fl8SLb4kWnxJtPiSaPEl0eJLosWXRIsviRZfEi2+JFp8SbT4kmjxJdHiS6LFl0SLL4kWXxLNuySa d0k075Jo3iXRvEuieZdE8y6J5l0SzbskmndJNO/SF8y7D58+PH3/y8e/bwFPH5//+tuPHz6+jn36 9scPP/z069Nvvz5/9/TNj798+/endRvbh8/eJfrbXz7uD/nDz399+vn5n5+ef/70657vzePvj/nz EfzrU8tzzXR22cuz/Pi8/1Gffnm63QNfMkeD0KmD93K/v5wfv9zl5OXeFmKdde7daWKvd/mX13us XHM7e+3Koxe8BYPQ4Yv3goufUyKdm0Q6N4l0bhbp3CzSuVmkc7NI52aRzs0inZtFOjeLdG4W6dws 0rlZpHOzSOdmkc7NIp2bRTo3i3RuFuncLNK5WaRzs0jnZpHOzSKdm0U6N3t0biZTcjOZkpvJlNxM puRmMiU3kym5eZ/Rsr/693+3/Xz86cOn/efuv1wD7M5MRh5kMvIgk5EHmYw8yGTkQSYjD/Le9vHh 2wLEx0yGFWQyrCCTYQWZDCvIZFhBJsMKMhlWkMmwgkyGFWQyrCCTYQWZDCvIZFhBJsMKMhlWkMmw gkyGFWQyrCCTYQWZDCvIZFhBJsMKMhlWkMmwgkyGFWQyrCCTYQWZDCvIZFhBFofrZXG4XhaH62Vx uF4Wh+tlcbhe/sJwvcjvuXvg3z784/np2x+fP3x8/u7NJc8/f9oe83/+n/fwX//2y8dPe7anP57N yy+V9PTx+fvnj88/f/v863btPz78+MNLsttf/sfzx1+efnz++a+f/vZ0T/g62x95Xv6c/+e3n//+ VI7Lf3j+9V+e6v08dXuy91zf/vLbz8efd/asvv/4y09Paz/x7Oc5zoJ+/eF/PN8jU2p7LGknlsVO 7lns5J7FTu5Z7OSexU7u+Qud3P/1svn0b8d/vJ+eP/366cPH46T+for/828/ffP88SnVVtrav+bH f3365fvv94dPdfveGnXO0lrZ3p3AKf/+cMe6/Jd7Cq8veLQoQU+V/IUG8pENxqOnRPcg2rvtuTRZ 7B2fxd7xWewdn8Xe8VnsHZ/F3vFZ7B2fxd7xWewdn8Xe8VnsHZ/F3vFZ7B2fxd7xWewdn8Xe8Vns HZ/F3vFZ7B2fxd7xWewdn8Xe8VnsHZ/F3vFZ7B2fxd7xWewdX8lxUyXHTZUcN1Vy3FTJcVMlx02V HDdVctxUyXFTJcdNlRw3VXLcVMlxUyXHTZUcN1Vy3FTJbMxKZmNWMhuzktmYlczGrGQ2ZiWzMSuZ jVnJbMxKZmNWMhuzktmYlczGrGQ2ZiWzMSuZjVlJm/9K2vxX0ua/kjb/lbT5r6QlfiWN6ivpBF9J U/dKmrpX0tS9kqbulfRnr6Q/eyX92Svpz15Jf/ZK+rNXcWdcxZ1xFXfGVdwZV3FnXMWdcRV3xlXc GVdxZ1zFnXEVd8ZV3BlXcWdcxZ1xFXfGVd0Ze25XFaeqVXGqWhWnqlVxqloVp6pVcapaFaeqVXGq WhWnqlVxqloVp6pVcapaFaeqVXGqWhWnqlWxk38VO/lXsZN/FTv5V7GTfxU701exA3wVu6NXsaN5 FTuaV7Gjef1CR/Mdgvjt3z/9Tk/cnv4FyvnXHOsv/9N/AH2OgL/8/MvT//Y71LOjE3+E/hG0X/Lo mn//+Ms3Pz7/9PT//eHT3/7DBd/+8vMdy/hXwuEI+TLhUMkksyp2WK9ih/UqdlivYof1KnZYr2KH 9UomnVUy6aySSWeVTDqrZNJZJZPOKpl0Vsmks0omnVUy6aySSWeVTDqrZNJZJZPOKpl0Vsmks0om nVUy6aySoWWVDC2rZGhZJUPLKhlaVsnQskqGllUytKySoWWVDC2rZP5YJfPHKum/XEn/5Ur6L1fS f7mS/suV9F+upP9yJf2XK+m/XEn/5Ur6L1fSf7mS/suV9F+upP9yJf2XK+m/XEn/5Ur6L29BpCII F0FaKVfSSrmSVsqVtFKupJVyJa2UK2mlXEkr5UpaKVdxalIVpyZVcWpSFacmVXFqUhWnJlVxalIV pyZVcWpSFacmVXFqUhWnJlVxalIVpyZVcWpSFacmVXFqUhWnJlVx0lEVJx1VcdJRFScdVXHSURUn HVVx0lEVJx1VcdJRFScdVXE6URWnE1Wxj3cV+3hXsY93Fft4V7GPdxX7eFexj3cV+3hXsY93Fft4 V7GPdxX7eFexj3cV+3hXsY93Fft4V7GPdxX7eFexj/dxpKHlErkxsfd2FXtvV7H3dhV7b1ex93YV e29Xsfd2FXtv1y/13r6ei5zEEvuEjMaqZDTWFkRO+IiyQuZpVTJPq5J5WpXM06pknlYl87QqmadV yTytSuZpVTJPq5J5WpXM06pknlYl87QqmadVyTytSuZpVTJPq5J5WpXM06pknlYl87QqmadVyTyt SuZpVTJPawsiFUHMp5xJRWRSEYTXyoTXyoTXyoTXyoTXyoTXyoTXyoTXyoTXyoTXyoTXyoTXyoTX yoTXyoTXyoTXyoTXyoTXyqC18hZEKoJAXplAXplAXpnwWpnwWpnwWhnxWqKq8qV5PWTj5OUSjwCW eAQgai/iiJwqjsip4oicKo7IqeKInCqOyKniiJwqjsip4oicKo7IqeKInCqOyKniiJwqjsip4oic Ko7IqeKInCqOyKniiJwqjsip4oicKo7IqeKInCqOyKniiJwqjsg5tvpeLrHus1j3Wax7EcXMIoqZ RRQziyhmFlHMLKKYWUQxs4hiZhHFzCKKmUUUM4soZhZRzCyimFlEMbOIYmYRxcwiipm9Nv/H2Y+X S6x7EevMItaZRRQziyhmFlHM7KGYnfhDnahAnahAW9D1g+Mt6PrZYifSUSfSUSfSUSfSUSfSUSfS USfSUSfSUSfSUSfoSCfoSCfoSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcU SCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcU SCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSCcUSBeJ/i5S+F2k8I+9h5dL25Z20Q7oX7ID/uMI v4/Pf/3txw8fX8c+ffvjhx9++vXpt1+fv/u9Jd62E2hz2+1uW4/AwMDjCewP+vMR/etTPrvi5Rl+ fN7/oE+/PN3uMS9JUzAIbdW8l1o7Feqi8NBF4aGLwkMXhYcuCg9dpGm6SNN0kabpIgHTRQKmiwRM FwmYLhIwXSRgukjAdJGA6SIB00UCposETBcJmC4SMF0kYLpIwHSRgOkiAdNFAqaLBEwXCZguEjBd JGC6SMB0kYDpIgHTRQKmiwRMFwmYLhIwXSRgukjAdJGA6SIB00UCposETBcJmC4SMF0kYLpIwHSR gOkiAdNFAqYTuagTuagTuagTuagTuagTuagTuagTuagTuagTuagTuWgLIhUBjKROjKROjKROjKQt iFREIxUB2k5vQaQiQNvpLYhUBGg7vQWRigBtp7cgUhGg7fQWRCoCtJ3egkhFgLbTWxCpCNB2egsi FQHaTm9BpCJA2+ktiFQEaDu9BZGKIKxZJqxZJqxZJqxZJqxZJqxZJqxZJqxZJqxZJqxZJqxZJqxZ Bg2RtiBSEYRqy4Rqy4Rqy6Ah0hZEKoKgcIWgcIWgcIWgcAWhcJ5B0EWDoIsGQRcNgi4aBF00CLpo EHTRIOiiQdBFg6CLBsGxefRyiXXv2QhdtBG6aSNkrzH0sY31col17zWZPvbCXi6x7r0m08eG2ssl 1r3XZPrYlXu5xLr3mkwfW3stl9dk+jgI8HKJde81mT5OE7xcYt17TaaPIwkvl1j3It6aRbw1i3hr FvHWLOKt2Wt+fRyleLnEuhdZ0CyyoFlkQbPIgmaRBc1ex7fjCMjLJda9yKhmkVHNXse349TJy+XV fRF51yLyrkXkXYvIuxaighaighaighaighaighaighaighaighaighaighaighaighaighaighai ghaighaighaighaighaighaighaighaighZidRZidRZidRZidRZidRYiaBYiaBYiaBYiaBYiaBYi aBZC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC0hVC 0hVC0hVC0hVC0hXCtxXCtxXCtxXCtxXRrSuiW1dEt66Ibl0R3boiunVFdOuK6NYV0a0roltXRLeu iG5dEd26Irp1RXTriujWFdGtK6JbV0S3rohuXRHduiK6dUV064rowxXRhyuiD1dEH66IPlwRHbYi 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 LrHuPa70OALycol173GlxzmSl0use48rPQ6jtFweV3ocXXm5xLr3uNItFzkRBcbmFkRORIGxuQWR E1FgbM4KjM0tiJyIAmNzCyInosDY3IJIRQBjcwsiFQGMzS2IVAQwNrcgUhFgysKsQPOcFWies4Ip C7MCN3RW4IbOCtzQWYEbOitwQ2cFbuiswA2dFbihswI3dFbghs4K3NBZgRs6K3BDZwVu6GyE2WuE 2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE2WuE 2WuE2WuE2WuE2WuE2WuE2WuE2WuI2fO8vGNb5eUSzw08L+/Ym3m5xHMDz8s7NnheLvHcwPPyjl2i l0use8/LO7aaXi6x7j0v79ivernEuvemQxybXi+XWPfedIhj5+zlEuve8wWP7beWy/MFj826l0us e88XPHb8Xi6x7j1f8Dg28HKJdS/6gk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs2kXdt Iu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i79qIs9qI s9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qI s9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9qIs9oIs9cIs9cIs9cI s9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cIs9cI s9cIs9cIs9cIs9cIs9cIs9dEX7CJvmATfcEm+oJN9AWb6As20Rdsoi/YRF+wib5gE33BJvqCTfQF m+gLNtEXbKIv2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm+oJN9AWb6As20Rds oi/YRF+wib5gE33BJvqCTeRdm8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i79pE3rWJ vGsTedcm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bSLv2oiz2oiz2oiz2oiz 2oiz2oiz2oiz2oiz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz 2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2omz2gmz1wmz1wmz1wmz1wmz1wmz 1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz1wmz 1wmz1wmz1xGzJ/qCTfQFm+gLNtEXbKIv2ERfsIm+YBN9wS76gl30BbvoC3bRF+yiL9hFX7CLvmAX fcEu+oJd9AW76At20Rfsoi/YRV+wi75gF33BLvqCXfQFu+gLdtEX7KIv2EVfsIu+YBd9wS76gl30 BbvoC3bRF+wi79pF3rWLvGsXedcu8q5d5F27yLt2kXftIu/aRd61i7xrF3nXLvKuXeRdu8i7dpF3 7SLv2kXetYu8axd51y7yrl3kXbvIu3aRd+0i79pF3rWLvGsXeddOnNVOnNVOnNVOnNVOnNVOnNVO nNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVOnNVO nNVO9NNO9NNO9NNO9NNO9NNO9NNOTNJOoLhOoLhOoLhOoLhOoLhOoLhOoLhOoLhBoLhBoLhBoLhB oLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLhBoLiBoDhRyOuikNdF Ia+LQl4XhbwuCnldFPK6KOR1UcjropDXRSGvi0JeF4W8Lgp5XRTyuijkdVHI66KQ10Uhr4tCXheF vC4KeV0U8roo5HVRyOuikNdFia6LEl0XJbouSnRdlOi6KNF1UXzrImzZRdiyi7BlF2HLLsKWXYQt uwhbdhG2HCJsOUTYcoiw5RBhyyHClkOELYcIWw4RthwibDlE2HKIsOUQYcshwpZDhC2HCFsOEbYc Imw5RNhyiLDl0GDLfqvXJZs96PIp1BZ0XbLZgy6fS+5Bl88l96DL55J70OVzyT3o8rnkHnT5XHIP unwuuQeRirgOGWxB1yGDPYhUxHXIYA8iFXEdMtiDSEVchwz2IFIR1yGDPYhUxHXIYA8iFXEdMtiD SEVchwz2IFIR1yGDPYhUxHXIYA8iFXEdMtiDSEVcb4y9B5GKuE4m7EGkIq6TCXsQqYjrZMIeRCri Os6wB5GKuM5A7EGkIq4zEHsQqYjrDMQeRCriOgOxB4GKaNcZiD0IVES7zkDsQaAi2nUGYg8CFdGu MxB7EKiIdp2B2INIRVxnIPYg8hmhweX3bZWWS4PL75swL5d1nnHfsnm5rPOM+wbPy2WdZ9y3g14u se41duO+p/RyiXWvsRv3jamXS6x7jd247269XGLda+zGfYus5dLYjfuG2ssl1r3Gbtx35V4use41 duO+tfdyiXWvsRv38wEvl1j3WjPl+yGDl0use40DuZ9UeLnEutc4kPtxh5ZLY0ruhyNeLrHuNT7l fsLi5RLrXuNT7sc0Xi6x7jU+5X7W4+Xy6r5pfMr9wMjL5dV90/iU+6mTl8ur+6bxKfejKy2Xxqfc D7q8XORE9LoDtAeRE9HrDtAeRE5ErztAexA5Eb3uAG1B1xtj70HkjPx6Y+w9iFTE9cbYexCpiOuN sfcgUhHXG2PvQaQirjfG3oNIRVxvjL0HkYq43hh7DyIVcb0x9h5EKuJ6Y+w9iFTE9cbYexCpiOuN sfcgUhHXG2PvQaQirjfG3oNIRRBmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFm rxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmrxFmr2l8/31b5eUSzw00 vv++N/NyiecGGt9/3+BpubRmyvftoJdLrHutmfJ9T+nlEutea6Z835h6ucS615op33e3Xi6x7rVm yvctspdLrHutmfJ9n+3lEutea6Z836xrubRmyvetvZdLrHutmfL9fMDLJda91kz5fsjg5RLrXuRd m8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs2kXdt Iu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZ bcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbUQ/bUQ/bUQ/7UQ/7UQ/7UQ/7UQ/7UQ/7UQ/7cQk 7cQk7cQk7cQk7cQk7YSk64Sk64Sk64Sk64Sk64Sk64Sk64Sk64Sk64Sk64Sk6wSK6wSK6wSK6wSK 6wTr6gTr6gTr6gTr6gTr6gjrEpWyJiplTVTKmqiUNVEpa6JS1kSlrIlKWROVsiYqZU1UypqolDVR KWuiUtZEpayJSlkTlbImKmVNVMqaqJQ1UQNrogbWRA2sixpYFzWwLmpgXdTAuqiBdVED66K61UV1 q4vqVhfVrS6qW11ED7uIHnYRPewiethF9LCL6GEX0cMuooddRA+7iB52ET3sIi7YRVywi7hgF3HB LmJmXcTMuoiZdREz6yJm1j3MLJM2kpm0kcykjWQmbSQzaSOZSRvJTNpIZtJGMpM2kpm0kcykI2Qm HSEz6QiZSUfITDpCZmLEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LE Z2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEZ2LEb0GkIsCtk0yM+EyM+EyM+EyM+EyM+Ezs8Uzs 8Uyc7kyc7kyc7kyc7kyc7kyc7kyc7kyc7iz2IMtiD7Is9iDLYg+y/IUeZN/89OHfn7aYp19+25J8 //TLx++eP/7X19FPzz9/2nKmp//7l6dfn779b0//d0pj9NvTWGWNmevtqeY05/xv//Xptv3Hehtl 1DnLtjjy3K5Kfaztn5/uYf/tL9/+8nF/oj/8/Nenn5//+WlL/+vT9798fPOs92f68zc//vLt3399 6rPOVMfZdS9/3Mfn/bX49Mvvj3MPf8m/YpFsS+W9VdpZTxbbsmWxLVsW27JlsZVaFlupZbGVWhZb qWWxlVoWWwFksRVAFlsBZLEVQBZbAWSxFUAWWwFksRVAFlsBZLEVQBZbAWSxFUAWWwFksRVAFlsB ZLEVQBZbAWSxFUAWWwFksRVAFlsBZLEVQBZbAWSxFUAWWwEc5w5eLrHuxXs0YiuALLYCyGIrgCy2 Asii2p5FtT2LCnkWFfIsKuRZVMizqJBnUSHPokKeRYW8khaZlRwIVtJOspJTxEoOBCs5EKzkQLCS A8FKDgQr6ddYSevFSlovVtJ6sZLWi5W0Xqyk9WIlrRcrab1YSevFSlovVtJ6sZLWi5W0Xqyk9WIl 6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl6nkl 6vkWRCoCcG6V+OqV+OqV+OqV+OqV+OqV+OqV+OqV+OpbEKgIIrlXsTVdFfejVWy1VsW9bRX3o1Xc j1ZxP1rF/WgV96NVbENWxdZhVWwdVsXWYVVsHVbF1mFVbB1WxdZhVWwdVsXWYVVsHVbF1mFVbB1W xdZhVWwdVsW+BlXsa1DFvgZV7GtQxb4GVexrUMW+BlXsa1DFvgZV7GtQxb4GVexrUMW+BlXsa1DF vgZV7GtQxb4GVexrUMW+BlXsa3Dsxb1cYt17mGoVeyRUsUdCFXskVLFHQhV7JFSxR0IVeyQcJw5e Lq/uSRO+SprwVdKEr5ImfJU04aukCV8lTfgqacJXSRO+SprwVdKEr5ImfJU04aukCV8lTfi2IFIR QN6rpHNfJZ37KunctwWRigDyXu1A3tuCSEUAeW8LIhUB5L1K+h5W0vewkr6HlfQ9rKTvYe1A3tuC SEUAeW8LIhVBWJ0OxtluQaQiwDjbLYhUBOGPOuGPOhhnuwWRigDq4xZEKoKQTp2QTp2QTp2QTh2o j7UTPKqDcbZbEKkIwlR1wlR1wlR1wlR1wlR1wlR1wlR1wlR1wlSJ/eqq2K+uiv3qqtivror96qrY r66K/eqq2K+uiv3qqtivror96uqX+tV9+PRhV5T/vgU8fXz+628/fvj4Ovbp2x8//PDTr0+//fr8 3dPhRT/lVNZttbFaxKo+nsB/tKpTzmfXvPGiX8nUKRiENsrai+1Jf1Vswnfstr1c4mL2pL8qNvSr YkO/Y4Pv5RK/xDzp7zgl8HKJde9Jf1VszFjFxoxVbMxYxcaMVWzMWMXGjMehh5dLrHtP+jtOTrxc Yt1783+P4xcvl1j3niR5nOFouUQotXvzf4+DIC+XWPciLNtFWLaLsGwXYdkuwrJdlDe7CN52b/7v cdzl5RLrXoR4uwjxdhHi7SLE20WIt4sQbxch3i5CvJ2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2I kp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2Ikp2I koOIkoOIkoOIkoOIkoOIkoOIkoOIkoOIkoOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOA iIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiIOAiAOBiKIE2UUJ sosSZBclyC5KkF2UILsoQXZRguyiBNlFCbKLEmQXJcguSpBdlCC7KEF2UYLsogTZRQmyixJkFyXI LkqQXZQguyhBdlGC7KIE2UUJsosSZBclyCFKkEOUIIcoQQ5RghyiBDlECXKIEuQQJcghQrxDhHiH CPEOEeIdIsQ7RIh3iBDvECHeIUK8Q4R4hwjxDm/IxXEe4+US617kXYfIuw6Rdx0i7zpE3nWIvOsQ edch8q5D5F2HyLsOkXcdIu86RN51iLzrICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLu ICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLuICLu ICLuICLuICLuICLuICLuICLuIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMze IMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeQMye6AsO0Rccoi84RF9w iL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERfcIi+4BB9wSH6gkP0BYfoCw7RFxyiLzhEX3CIvuAQfcEh +oJD9AWH6AsO0Rccoi84RF9wiL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERfcIi86xB51yHyrkPkXYfI uw6Rdx0i7zpE3nWIvOsQedch8q5D5F2HyLsOkXcdIu86RN51iLzrEHnXIfKuQ+Rdh8i7DpF3HSLv OkTedYi86xB51yHyrkPkXSdxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidx VidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidxVidx VidxVidxVidxVidh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh 9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9iZh9qboC07RF5yiLzhFX3CKvuAUfcEp +oJT9AWn6AtO0Recoi84RV9wir7gFH3BKfqCU/QFp+gLTtEXnKIvOEVfcIq+4BR9wSn6glP0Bafo C07RF5yiLzhFX3CKvuAUfcEp+oJT9AWn6AtO0Recoi84RV9wirzrFHnXKfKuU+Rdp8i7TpF3nSLv OkXedYq86xR51ynyrlPkXafIu06Rd50i7zpF3nWKvOsUedcp8q5T5F2nyLtOkXedIu86Rd51irzr FHnXKfKuU+RdJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FW J3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FWJ3FW J3FWF2H2FmH2FmH2FmH2FmH2FmH2FmH2FmH2FmH2FmHBFmHBFmHBFmHBFmHBFmHBFmHBFmHBFmHB FmHBFmLBRA9tih7aFD20KXpoU/TQpuihTdFDm6KHNkUPbYoe2hQ9tCl6aFP00KbooU3RQ5uihzZF D22KHtoUPbQpemhT9NCm6KFN0UObooc2RQ9tih7aFD20KXpoU/TQpuihTdFDm6KHNkUPbYoe2hQ9 tCl6aEvkKJfIUS6Ro1wiR7lEjnKJHOUSOcolcpRL5CiXyLktkXNbIue2RM5tiZzbEjm3JXJuS+Tc lsi5LZFzWx7n1jvQOLeg6wc1W9D1g5ot6PpBzRZ0/aBmC7p+dLcFXT+66x0c3W1B14/utqDrR3db EKkIcHS3BZGKAEd3WxCpCKBxbkGkIoDGuQWRNxcYmVsQeXOBkbkFkTcXGJlbEHlzgZF5fMJ6n9ba t9vxeezl0r7djk9vL5f2q+74rNdyeb/qjm8GL5f2q+74HvFyiXXv/ao7voy8XGLde/bC8Y2m5fLs heP7z8sl1qpnHBxfol4usVY94+D4JvZyebU6yM/0QX6mD/IzfZCf6YP8TB/kZ/ogP9MH+Zk+yM/0 QX6mD/IzfYBuK32Q3/aD/LYf5Lc9GXbWybCzToaddTLsrJNhZ50MO+tk2Fknw846GXbWybCzToad dTLsrJNhZ52MIOtkBFknI8g6GUHWyQiyTkaQdTKCrJMRZJ2MIOtkBFknI8g6mSbWyTSxTqaJdTJN rJMZX53M+OpkxlcnM746mfHVyYyvTmZ8dTLjq5MZX53M+OpkXFcn47o6GdfVybiuLo6X7uJ46S6O l+7ieOkujpfu4njpLo6X7uJ46S6Ol+7ieOkujpfu4njpLo6X7uJ46S6Ol+7iSLMujjTr4kizLo40 6+JIsy6ONOviSLMujjTr4kizLo406+JIsy6ONOviSLMujg7r4uiwLo4O6+LosC6ODuvi6LAujg7r 4uiwLo4O6+LosC6ODuviuK8ujvvq4rivLo776uJYrS6O1eriWK0ujtXq4litLo7V6uJYrS6O1eri WK0ujtXq4iisLo7C6uIorC6Owpod3JTYgq4fxWxB149itqDr52xb0PVzti3o+jnbFnT9nG0Lun7O tgVdP3mdHXRz34JIRYDbH1sQqQhw+2MLIhUBbn9sQaQiwO2PLYhUBLj9sQWR9wncydiCyPsE7mRs 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 4BSV4BSV4BRb0PVfNVvQ9V81lYAblYAblYAbWxCpCPCrZgsiFQEGNdUJBjVtQaAiJhjUVMlZVCVn UZWcRW1BoCImGNS0BYGKmGBQU52JVASY7rQFkYpIpCLASKgtiFREIhUB+hxW0uewkj6HlfQ5rKTP YSV9Divpc7gFkYoAzREraY5YSXPESpojVtIcsZLmiJU0R6ykOWIlzREraY5YSXPESpojVtIcsZJ7 JZXcK6nkXkklzREraY5YSXPESpojVtIcsZLmiJU0R6zizeMq3jw+dlteLnO/qZ2zVPGmdhVvah8b PC+Xds5SxZvtVbzZXsWb7cee0ssl1r032OrYmFq5pjfY6tjGerm8uhfv0VfxHn0V79EfO2cvl1f3 0xtsdWy/tVxJrHtvSNaxh/dyiXXvDdw6DgK8XGLde41Eq9hItIqNRKvYSLSKjUSr2Ei0io1Ej3MN L5dY915T0io2Ja1iU9IqNiWtYlPSKjYlrWJT0io2Ja1iU9IqNiWtYlPSKjYlrSIjWUVGsoqMZBWb klaxKWkVm5JWsSlpFZuSVrEpaRWbktZFzv0XOcJf5DR+kYP1Rc7IFznuXuTkepFD6EUOoRc5hF7k EHqRQ+hFDqEXOYRe5BB6kUPoRQ6hF2j0VRfo2bUFkfcJ9OzagshLDtpvbUHkJQdayhZE3iegpWxB 5H0CnbS2ILKegB+wBZH3CTTF2oLI+wRMhC2ILELQFGsLIm8ucB62ILJyxX32EvfGS9zPLnEPusR9 4xL3ekvcny1xT7XEPdUS91RL3FMtcU+1xD3VEvdUS9xTLXFPtcw9ldf06PiV5+US68trVHT8VPRy iTXhNRc6fm96ucT68vzU40erl0usL8+JO375ernE+vKa+Bw/n7Vcnl93/Nj2com16jXxOX6xe7m0 z9VOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOuNNOhnJ3MpS7 k6HcnQzl7mQodydDuTsZyt3JUO5OhnJ3MpS7k0Y5nTTK6aRRTidDuTsZyt3JUO5OeqN00hulk94o nQzl7mQodyddWDrpwtJJF5ZOhnJ3MpS7k34vnfR76aTfSyf9Xjrp99JJv5dO+r100u+lk34vnfR7 6aTfSyf9XrYgUhHAld+CSEUAV75P4MpvQaQigCu/BZGKAK78FoT2Gtp+s4ucWBc5sS5yYl3kxLrI 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 l1j3Hu96HElouTze9TjA8HKJde/xrscpiJdLrHuPdz2OUrxcYt17vOtxHuPlEuve412PQx0vl1j3 Hu96nAx5ucS693jX43hJy+XxrsdhlJdLrHuPdz1OtLxcYt0DZzXdgLOabsBZTTfgrKYbcFbTDTir 6Qac1XQDzmq6AWc13YCzmm7AWU034KymG3BW0w04q+kGnNVE+nlsQaQigLO6BZGKAM7qFkQqAjir WxCpCOCsphtwVrcgUhHAWd2CSEUAZ3ULIhUBnNUtiFQEcFa3IFIRwFndgkhFAGZvCyIVAZi9LYhU BGD2tiBSEYDZ24JARSTC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC 7CXC7CXC7CXC7CXC7CXE7Hm+4LGt8nKJ5waeL3jszbxc4rmB5wseGzwvl3hu4PmCxy7RyyXWvecL HltNLZfnCx4bUy+XWPeeL3jsbr1cYt17vuCxRfZyiXXv+YLHPtvLJda95wsem3Uvl1j3ni947Pi9 XGLde77gcWyg5fJ8weOQwcsl1r3Hux4nFV4use493vU47vByiXUv8q5J5F2TyLsmkXdNIu+aRN41 ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8axJ51yTyrknkXZPIuyaRd00i75qIs5qIs5qIs5qI s5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qI s5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qIs5qAs7oFkYogzF4izF4izF4izF4i zF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4i zF4izF4izF4izF4SfcEk+oJJ9AWT6Asm0RdMoi+YRF8wib5gEn3BJPqCSfQFk+gLJtEXTKIvmERf MIm+YBJ9wST6gkn0BZPoCybRF0yiL5hEXzCJvmASfcEk+oJJ9AWT6Asm0RdMoi+YRF8wib5gEn3B JPqCSfQFk+gLJpF3TSLvmkTeNYm8axJ51yTyrknkXZPIuyaRd00i75pE3jWJvGsSedck8q5J5F2T yLsmkXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8ayLOaiLOaiLOaiLOaiLOaiLO aiLOaiLOaiLOaiLOaiLOaiLOaiLOaiLOaiLOaiLOaibOaibOaibOaibOaibOaibOaibOaibOaibO aibOaibOaibOaibOaibOaibOaibOaibOaibOaibOaibOaibMXibMXibMXibMXibMXibMXibMXibM XibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibM XkbMnugLJtEXTKIvmERfMIm+YBJ9wST6gkn0BZPoCybRF0yiL5hEXzCJvmASfcEk+oJJ9AWz6Atm 0RfMoi+YRV8wi75gFn3BLPqCWfQFs+gLZtEXzKIvmEVfMIu+YBZ9wSz6gln0BbPoC2bRF8yiL5hF XzCLvGsWedcs8q5Z5F2zyLtmkXfNIu+aRd41i7xrFnnXLPKuWeRds8i7ZpF3zSLvmkXeNYu8axZ5 1yzyrlnkXbPIu2aRd80i75pF3jWLvGsWedcs8q5Z5F0zcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYz cVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYz cVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzYfYyYfYyYfYyYfYyYfYyYfYyYfYyYfYyYfYyYfYy YfYyYfYyYfYyYfYyYfYyYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYvZEXzCL vmAWfcEs+oJZ9AWz6Atm0RfMoi+YRV8wi75gFn3BLPqCWfQFs+gLZtEXzKIvmEVfMIu+YBZ9wSz6 gln0BbPoC2bRF8yiL5hFXzCLvmAWfcEs+oJZ9AWz6Atm0RfMoi+YRV8wi75gFn3BLPqCWeRds8i7 ZpF3zSLvmkXeNYu8axZ51yzyrlnkXbPIu2aRd80i75pF3jWLvGsWedcs8q5F5F2LyLsWkXctIu9a RN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoiz WoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoiz WoizWoizWoizWoizWoizWoizWgizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwiz VwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizV0RfsIi+YBF9wSL6 gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi+oJF9AWL6AsW0Rcsoi9YRF+wiL5gEX3BIvqCRfQFi+gL FtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi+oJF5F2LyLsWkXctIu9a RN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWkTetYi8axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsR edci8q5F5F2LyLsWkXctIu9aiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNa iLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaiLNaibNaibNaibNaibNaibNaibNaibNaibNa ibNaibNaibNaibNaCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNX CbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXCbNXEbMn+oJF9AWL6AsW0Rcsoi9YRF+w iL5gEX3BIvqCRfQFi+gLFtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEq +oJV9AWr6AtW0Resoi9YRV+wir5gFX3BKvqCVfQFq+gLVtEXrCLvWkXetYq8axV51yryrlXkXavI u1aRd60i71pF3rWKvGsVedcq8q5V5F2ryLtWkXetIu9aRd61irxrFXnXKvKuVeRdq8i7VpF3rSLv WkXetYq8axV510qc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc 1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc 1Uqc1UqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqYvUqY vUqYvUqYvUqYvUqYvUqYvUqYvUaYvUaYvUaYvYaYPdEXrKIvWEVfsIq+YBV9wSr6glX0BavoC1bR F6yiL1hFX7CKvmAVfcEq+oJV9AWr6AtW0Resoi9YRV+wir5gFX3BKvqCVfQFq+gLVtEXrKIvWEVf sIq+YBV9wSr6glX0BavoC1bRF6yiL1hFX7CKvmAVedcq8q5V5F2ryLtWkXetIu9aRd61irxrFXnX KvKuVeRdq8i7VpF3rSLvWkXetYq8axV51yryrlXkXavIu1aRd60i71pF3rWKvGsTedcm8q5N5F2b yLs24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw2 4qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw2wuw1 wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1 wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw10Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv2ERf sIm+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm+oJN9AWb6As20Rdsoi/YRF+wib5gE33B JvqCTfQFm+gLNtEXbKIv2ERfsIm+YBN51ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2b yLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzbirDbi rDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbi rDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirDbirHbirHbirHbirHbirHbC7HXC7HXC7HXC 7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC 7HXC7HXC7HXC7HXC7HXE7Im+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm+oJN9AWb6As2 0Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hE X7CLvmAXfcEu+oJd9AW7yLt2kXftIu/aRd61i7xrF3nXLvKuXeRdu8i7dpF37SLv2kXetYu8axd5 1y7yrl3kXbvIu3aRd+0i79pF3rWLvGsXedcu8q5d5F27yLt2kXftIu/aRd61E2e1E2e1E2e1E2e1 E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1 E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2avE2avE2avE2avE2avE2av E2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2avE2av E2avE2avE2avi75gF33BLvqCXfQFu+gLdtEX7KIv2EVfsIu+YBd9wS76gl30BbvoC3bRF+yiL9hF X7CLvmAXfcEu+oJd9AW76At20Rfsoi/YRV+wi75gF33BLvqCXfQFu+gLdtEX7KIv2EVfsIu+YBd9 wS76gl30BbvIu3aRd+0i79pF3rWLvGsXedcu8q5d5F27yLt2kXftIu/aRd61i7xrF3nXLvKuXeRd u8i7dpF37SLv2kXetYu8axd51y7yrl3kXbvIu3aRd+0i79pF3rUTZ7UTZ7UTZ7UTZ3UQZ3UQZ3UQ Z3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQ Z3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZ3UQZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8Q Zm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8QZm8g Zk/0BbvoC3bRF+yiLzhEX3CIvuAQfcEh+oJD9AWH6AsO0Rccoi84RF9wiL7gEH3BIfqCQ/QFh+gL DtEXHKIvOERfcIi+4BB9wSH6gkP0BYfoCw7RFxyiLzhEX3CIvuAQfcEh+oJD9AWH6AsO0Rccoi84 RN51iLzrEHnXIfKuQ+Rdh8i7DpF3HSLvOkTedYi86xB51yHyrkPkXYfIuw6Rdx0i7zpE3nWIvOsQ edch8q5D5F2HyLsOkXcdIu86RN51iLzrEHnXIfKugzirgzirgzirgzirgzirgzirgzirgzirgzir gzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzir gzirgzirgzirgzirgzirgzirgzirgzirgzB7gzB7gzB7gzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7 kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7EzF7oi84RF9w iL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERfcIi+4BB9wSH6gkP0BYfoCw7RFxyiLzhEX3CIvuAQfcEh +oJD9AWH6AsO0Rccoi84RF9wiL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERfcIi+4BB9wSHyrkPkXYfI uw6Rd50i7zpF3nWKvOsUedcp8q5T5F2nyLtOkXedIu86Rd51irzrFHnXKfKuU+Rdp8i7TpF3nSLv OkXedYq86xR51ynyrlPkXafIu06Rd53EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3E WZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3E WZ3EWZ3EWZ3EWZ3EWZ3EWZ2E2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE 2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuiLzhFX3CKvuAUfcEp +oJT9AWn6AtO0Recoi84RV9wir7gFH3BKfqCU/QFp+gLTtEXnKIvOEVfcIq+4BR9wSn6glP0Bafo C07RF5yiLzhFX3CKvuAUfcEp+oJT9AWn6AtO0Recoi84RV9wir7gFH3BKfKuU+Rdp8i7TpF3nSLv OkXedYq86xR51ynyrlPkXafIu06Rd50i7zpF3nWKvOsUedcp8q5T5F2nyLtOkXedIu86Rd51irzr FHnXKfKuU+Rdp8i7TpF3ncRZncRZncRZncRZncRZncRZncRZncRZncRZncRZncRZncRZXcRZXcRZ XcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZXcRZ XcRZXcRZXcRZXYTZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZ W4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4TZW4jZE33BKfqCU/QFp+gLTtEXnKIvOEVf cIq+4BR9wSn6glP0BafoCy7RF1yiL7hEX3CJvuASfcEl+oJL9AWX6Asu0Rdcoi+4RF9wib7gEn3B JfqCS/QFl+gLLtEXXKIvuERfcIm+4BJ9wSX6gkv0BZfoCy6Rd10i77pE3nWJvOsSedcl8q5L5F2X yLsukXddIu+6RN51ibzrEnnXJfKuS+Rdl8i7LpF3XSLvukTedYm86xJ51yXyrkvkXZfIuy6Rd10i 77pE3nWJvOsizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoi zuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoizuoi zuoizN4izN4izN4izN4izN4izN4izN4izN4izN4izN4izN4CzF6+AWZvC7peEVvQ9YrYgq5XxBZ0 vSK2oOsVsQVdr4gt6HpFbEHXK2ILIhUBmL0tiFQEYPa2IFIRgNnbgtBeQzw3EH3BJfqCS/QFl+gL LtEXXKIvuERfcIm+4BJ9wSX6gkv0BZfoCy7RF1yiL7hEX3CJvuASfcEl+oJL9AWX6Asu0Rdcoi+4 RF9wib7gEn3BJfqCS/QFl+gLLtEXXKIvuERfcIm+4BJ9wSX6gkv0BZfIuy6Rd10i77pE3nWJvOsS edcl8q5L5F2XyLsukXddIu+6PN71OI/xcml1f5zeeLm0uj/OerxcWt0fJ0NeLq3uj3MkL5dY9x7v ehxGebnEuvd41+NEy8sl1j1wVrcgciIKnNUtiJyIAmd1CyInosBZ3YLIiShwVrcgckYOnNUtiFQE cFa3IFIRwFndgkhFAGd1CyIVAZzVLYhUBHBWtyBSEcBZ3YJIRQBndQsiFQGc1S2IVARwVrcgUhHA Wd2CSEUAZ3ULIhUBnNUtiFQEYPa2IFIRgNnbgkhFAGZvCyIVAZi9LYhUBGD2tiBSEYDZ24JIRQBm bwsiFQGYvS2IVARg9rYgUhGA2duCSEUAZm8LIhUBmL0tiFQEYPa2IFIRgNnbghB9IZ4beL7gsdvy connBp4veGzZvFziuYHnCx77Pi+XeG7g+YLH5tHLJda95wseO1Avl1j3ni94bGO9XGLde77gsRf2 col17/mCx4Zay+X5gsf228sl1r3nCx57eC+XWPeeL3gcBHi5xLr3fMHjNMHLJda9x7seRxJeLrHu Pd71ONfwcol17/Gux+GIlsvjXY+jFC+XWPce73qcx3i5xLr3eNfjUMfLJda9x7seJ0NeLrHuPd71 OF7ycol17/GuxxmVl0use493PQ66tFzAWd2CyIkocFa3IHIiCpzVLYiciAJndQsiJ6LAWd2CyIko cFa3IFIRwFndgkhFAGd1CyIVAZzVLYhUBHBWtyBQEYk4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4 q4k4q4k4q4k4q4k4q4k4q4k4qwk4q1sQqQjC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC 7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXC7CXE7Hm+4LGt8nKJ 5waeL3jszbxc4rmB5wseGzwvl3hu4PmCxy7RyyXWvecLHltNL5dY954veOxXvVxi3Xu+4LHptXIl 0RdMoi+YRF8wib5gEn3BJPqCSfQFk+gLJtEXTKIvmERfMIm+YBJ9wST6gkn0BZPoCyaRd00i75pE 3jWJvGsSedck8q5J5F2TyLsmkXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8axJ5 1yTyrknkXZPIuyaRd00i75pE3jWJvGsizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoi zmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoizmoi zmoizmoizmoizmoizmoizmoizF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4izF4i zF4izF4izF4izF4izF4izF4izF4mzF4mzF4mzF4mzF4mzF4mzF4mzF5GzJ7oCybRF0yiL5hEXzCJ vmASfcEk+oJJ9AWT6Asm0RdMoi+YRF8wib5gEn3BJPqCSfQFk+gLJtEXTKIvmERfMIm+YBJ9wST6 gkn0BZPoCybRF0yiL5hEXzCJvmASfcEk+oJJ9AWT6Asm0RdMoi+YRF8wibxrEnnXJPKuSeRdk8i7 JpF3TSLvmkTeNYm8axJ51yTyrknkXZPIuyaRd00i75pE3jWJvGsSedck8q5J5F2zyLtmkXfNIu+a Rd41i7xrFnnXLPKuWeRdM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FW M3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FWM3FW M3FWM3FWM3FWM2H2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2 MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2MmH2sugLZtEXzKIvmEVfMIu+YBZ9wSz6 gln0BbPoC2bRF8yiL5hFXzCLvmAWfcEs+oJZ9AWz6Atm0RfMoi+YRV8wi75gFn3BLPqCWfQFs+gL ZtEXzKIvmEVfMIu+YBZ9wSz6gln0BbPoC2bRF8yiL5hFXzCLvGsWedcs8q5Z5F2zyLtmkXfNIu+a Rd41i7xrFnnXLPKuWeRds8i7ZpF3zSLvmkXeNYu8axZ51yzyrlnkXbPIu2aRd80i75pF3jWLvGsW edcs8q5Z5F0zcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYz cVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYzcVYLcVYLcVYLcVYLcVYLcVYLcVYLcVYL cVYLYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYK YfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYfYKYvZEXzCLvmAWfcEs+oJZ9AWz6Atm0RfMoi+YRV8w i75gFn3BLPqCWfQFs+gLZtEXzKIvmEVfMIu+YBZ9wSz6gln0BbPoC2bRF8yiL5hFXzCLvmAWfcEs +oJF9AWL6AsW0Rcsoi9YRF+wiL5gEX3BIvqCReRdi8i7FpF3LSLvWkTetYi8axF51yLyrkXkXYvI uxaRdy0i71pE3rWIvGsRedci8q5F5F2LyLsWkXctIu9aRN61iLxrEXnXIvKuReRdi8i7FpF3LSLv WoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoiz WoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWoizWgizVwiz VwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwizVwiz VwizVwizVwizVwizVwizVwizVxCzJ/qCRfQFi+gLFtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxbR FyyiL1hEX7CIvmARfcEi+oJF9AWL6AsW0Rcsoi9YRF+wiL5gEX3BIvqCRfQFi+gLFtEXLKIvWERf sIi+YBF9wSL6gkX0BYvoCxbRFywi71pE3rWIvGsRedci8q5F5F2LyLsWkXctIu9aRN61iLxrEXnX IvKuReRdi8i7FpF3LSLvWkTetYi8axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsReddKnNVKnNVK nNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVK nNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKnNVKmL1KmL1KmL1KmL1K mL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1KmL1K mL1KmL1KmL1KmL1KmL0q+oJV9AWr6AtW0Resoi9YRV+wir5gFX3BKvqCVfQFq+gLVtEXrKIvWEVf sIq+YBV9wSr6glX0BavoC1bRF6yiL1hFX7CKvmAVfcEq+oJV9AWr6AtW0Resoi9YRV+wir5gFX3B KvqCVfQFq+gLVtEXrCLvWkXetYq8axV51yryrlXkXavIu1aRd60i71pF3rWKvGsVedcq8q5V5F2r yLtWkXetIu9aRd61irxrFXnXKvKuVeRdq8i7VpF3rSLvWkXetYq8axV510qc1Uqc1Uqc1Uqc1Uqc 1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc 1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1Uqc1UaYvUaYvUaYvUaYvUaYvUaYvUaY vUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaYvUaY vUaYvYaYPdEXrKIvWEVfsIq+YBV9wSr6glX0BavoC1bRF6yiL1hFX7CKvmAVfcEq+oJV9AWr6AtW 0Resoi9YRV+wir5gFX3BKvqCVfQFq+gLVtEXrKIvWEVfsIq+YBV9wSr6glX0BavoC1bRF6yiL1hF X7CKvmATedcm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bSLv2kTetYm8axN5 1ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs24qw24qw24qw24qw24qw24qw24qw2 4qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw24qw2 4qw24qw24qw24qw24qw24qw24qw24qw24qw24qw2wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1 wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1wuw1 0Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hE X7CJvmATfcEm+oJN9AWb6As20Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv2ERfsIm+YBN5 1ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRd m8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzbirDbirDbirDbirDbirDbirDbirDbirHbirHbi rHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbirHbi rHbirHbirHbirHbirHbirHbirHbirHbC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC 7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXC7HXE7Im+YBN9wSb6 gk30BZvoCzbRF2yiL9hEX7CLvmAXfcEu+oJd9AW76At20Rfsoi/YRV+wi75gF33BLvqCXfQFu+gL dtEX7KIv2EVfsIu+YBd9wS76gl30BbvoC3bRF+yiL9hFX7CLvmAXfcEu+oJd9AW7yLt2kXftIu/a Rd61i7xrF3nXLvKuXeRdu8i7dpF37SLv2kXetYu8axd51y7yrl3kXbvIu3aRd+0i79pF3rWLvGsX edcu8q5d5F27yLt2kXftIu/aRd61E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1 E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1E2e1 E2e1E2e1E2e1E2e1E2e1E2avE2avE2avE2avE2avE2avE2avE2ZvEGZvEGZvEGZvEGZvEGZvEGZv EGZvEGZvEGZvEGZvEGZvEGZvEGZvEGZvEGZvEGZvEGZvEGZvEGZvIGZP9AW76At20Rfsoi/YRV+w i75gF33BLvqCXfQFu+gLdtEX7KIv2EVfsIu+YBd9wS76gl30BbvoC3bRF+yiL9hFX7CLvmAXfcEu +oJd9AW76At20Rfsoi/YRV+wi75gF33BLvqCXfQFu+gLdtEX7KIv2EXetYu8axd51y7yrl3kXbvI u3aRd+0i7zpE3nWIvOsQedch8q5D5F2HyLsOkXcdIu86RN51iLzrEHnXIfKuQ+Rdh8i7DpF3HSLv OkTedYi86xB51yHyroM4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4 q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4q4M4 q4M4q4M4q4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mw e4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe4Mwe0P0BYfoCw7RFxyiLzhEX3CIvuAQfcEh +oJD9AWH6AsO0Rccoi84RF9wiL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERfcIi+4BB9wSH6gkP0BYfo Cw7RFxyiLzhEX3CIvuAQfcEh+oJD9AWH6AsO0Rccoi84RN51iLzrEHnXIfKuQ+Rdh8i7DpF3HSLv OkTedYi86xB51yHyrkPkXYfIuw6Rdx0i7zpE3nWIvOsQedch8q5D5F2HyLsOkXcdIu86RN51iLzr EHnXIfKugzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirgzirkzir kzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzirkzir kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7 kzB7kzB7kzB7kzB7kzB7kzB7kzB7kzB7EzF7oi84RF9wiL7gEH3BIfqCQ/QFh+gLDtEXHKIvOERf cIi+4BB9wSH6gkP0BYfoCw7RF5yiLzhFX3CKvuAUfcEp+oJT9AWn6AtO0Recoi84RV9wir7gFH3B KfqCU/QFp+gLTtEXnKIvOEVfcIq+4BR9wSnyrlPkXafIu06Rd50i7zpF3nWKvOsUedcp8q5T5F2n yLtOkXedIu86Rd51irzrFHnXKfKuU+Rdp8i7TpF3nSLvOkXedYq86xR51ynyrlPkXafIu06Rd53E WZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3E WZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ3EWZ2E2ZuE2ZuE 2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2ZuE2VuE2VuE2VuE2VuE2VuE2VuE 2VuE2VuE2VuE2VuE2VuE2VuI2RN9wSn6glP0BafoC07RF5yiLzhFX3CKvuAUfcEp+oJT9AWn6AtO 0Recoi84RV9wir7gFH3BKfqCU/QFp+gLTtEXnKIvOEVfcIq+4BR9wSn6glP0BafoC07RF5yiLzhF X3CKvuAUfcEp+oJT9AWn6AtOkXedIu86Rd51irzrFHnXKfKuU+Rdp8i7TpF3nSLvOkXedYq86xR5 1ynyrlPkXafIuy6Rd10i77pE3nWJvOsSedcl8q5L5F2XyLsukXddIu+6RN51ibzrIs7qIs7qIs7q Is7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7q Is7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIs7qIszeIszeIszeIszeIsze IszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIszeIsze IszeIszeIszeIszeEn3BJfqCS/QFl+gLLtEXXKIvuERfcIm+4BJ9wSX6gkv0BZfoCy7RF1yiL7hE X3CJvuASfcEl+oJL9AWX6Asu0Rdcoi+4RF9wib7gEn3BJfqCS/QFl+gLLtEXXKIvuERfcIm+4BJ9 wSX6gkv0BZfoCy6Rd10i77pE3nWJvOsSedcl8q5L5F2XyLsukXddIu+6RN51ibzrEnnXJfKuS+Rd l8i7LpF3XSLvukTedYm86xJ51yXyrkvkXZfIuy6Rd10i77pE3nW9z7vu//OnD3/94dunn3/76Zvn j0+3f972ZP8a3o/r/vH88dcf9gd6eOXjjCOccQQzznDGGcy4whlXLOO8RTP+fuXjjCmcMQUz5nDG HMxYwhlLMGMNZ6zBjC2csQUzhtfMDK6ZGV4zM7hmZnjNzOCameE1M4NrZoXXzAqumRVeMyu4ZlZ4 zazgmlnhNbOCa2aF18wKrpkVXjMruGZWeM2s4JpZ4TWzgmtmhdfMCq6ZFV4zK7Rmyu0WXDOfr3yc MbhmPl/5OGNwzXy+8nHG4Jr5fOXjjME18/nKxxmDa+bzlY8zBtfM5ysfZwyumc9XPs4YXDOfr3yc MbhmPl/5MGMKr5kUXDMpvGZScM2k8JpJwTWTwmsmBddMCq+ZFFwzKbxmUnDNpPCaScE1k8JrJgXX TAqvmRRcMym8ZlJwzeTwmsnBNZPDayYH10wOr5kcXDM5vGZycM3k8JrJwTWTw2smB9dMDq+ZHFwz ObxmcnDN5PCaycE1k8NrJgfXTAmvmRJcMyW8ZkpwzZTwminBNVPCa6YE10wJr5kSXDMlvGZKcM2U 8JopwTVTwmumBNdMCa+ZElwzJbxmSnDN1PCaqcE1U8NrpgbXTA2vmRpcMzW8ZmpwzdTwmqnBNVPD a6YG10wNr5kaXDM1vGZqcM3U8JqpwTVTw2umBtdMC6+ZFlwzLbxmWnDNtPCaacE108JrpgXXTAuv mRZcMy28ZlpwzbTwmmnBNdPCa6YF10wLr5kWXDMtvGZacM308JrpwTXTw2umB9dMD6+ZHlwzPbxm enDN9PCa6cE108NrpgfXTA+vmR5cMz28ZnpwzfTwmunBNdPDa6YH18wIr5kRXDMjvGZGcM2M8JoZ wTUzwmtmBNfMCK+ZEVwzI7xmRnDNRDmAz1c+zhheMzEOYLsuvGZiHMB2XXjNxDiAcotyAJ+vfJwx vGZiHMB2XXjNxDiA7brwmolxANt14TUT4wC268JrJsYBbNeF10yMA9iuC6+ZGAewXRdeMzEOYLsu vGZiHEC5RTmAz1c+zhheMzEOYLsuvGZiHMB2XXjNxDiA7brwmolxANt14TUT4wC268JrJsYBbNeF 10yMA9iuC6+ZGAewXRdeM0EOIIU5gBTkAFKYA0hBDiCFOYAU5ABSmANIQQ4ghTmAFOQAUpgDSEEO IIU5gBTkAFKYA0hBDiCFOYAU5ABSmANIQQ4ghTmAFOQAUpgDSEEOIIU5gBTkAFKYA0hBDiCFOYCX K+//7vtfPv704dP2D6fXPH7U8LoKsgIpzAqkICuQwqxACrICKcwKpCArkMKsQAqyAinMCqQgK5DC rEAKsgIpzAqkICuQwqxACrICKcwKpCArkMKsQAqyAinMCqQgK5DCrEAKsgIpzAqkICuQwqxACrIC KcwKpCArkMKsQAqyAinMCqQgK5DCrEAKsgIpzAqkICuQwqxACrICKcwKpCArkMKsQAqyAinMCqQg K5DCrEAKsgIpzAqkICuQwqxACrICKcwKpCArkMKsQAqyAinMCqQgK5DCrEAKsgIpzAqkICuQwqxA CrICKcwKpCArkMKsQAqyAinMCqQgK5DCrEAKsgIpzAqkICuQwqxACrICKcwKpCArkMKsQAqyAinM CqQgK5DCrEAKsgIpzAqkICuQwqxACrICKcwKpCArkMKsQAqyAinMCqQgK5DCrEAKsgIpzAqkICuQ wqxACrICKcwKpCArkMKsQDpnBVK6fXh76TvLprx35RePXM6Rgvxdrm/TvbO6vr//33fvBXz58U8X Yuv1+U2638mC//Lz818/fPrhH8//69OvP/yP56d/GzW/d+2rtL1/WG8vfWdBvvtn/R7wxT/rnFko /ZuTp/rO8h2nl17tCvA5/6un8u2Hmt7mf2fdj5MXoVx4M04/JOq337wt2ff4iPffjHrheZx+tHzT vzl5Jd75dHn/ebQLz+P0A6l9qO3tpe98Jp29I/3CMzj9APu+15O073yGnbx348ITOP28K89nb8U7 n3fvvxXzwvM4/fg7L4mrH3+/B8Sex+nH4PZ5Md9c+h5Wcn8az2+fx7zwuXlOonxTT16P92CUd1+P 3wNiz+P087M+n3wtgPnwR9Dp1055+30LRskfQdHv81n/8uqfn/724den//P/Oh7seKxvfvv09Olv zx+fn374dXvU/b999/yPH759fhP58y+fnj5uAT98+unDv5PnXf/y/Q8/Pr+9/vi3ry89+RPH6m9/ 3bzH25x8xW2XvvrnC6/G2fNJZ8/nvU/Vk+fTXz2f/pXP5/uz5/POZ+zZ8xmvns+4+HzePEg+eZDA D8f3aKKzdIHfge+hRCfpfid/vpjuPY7oLF3g59w5GtS+uX3/Nt07P+fa2w/E3y/98iOff1B9N95+ EL5HEZ18pv1+6Zcf+fQj7PyR3/nVdvbIgdvA50jS+SO/88ly9sgt8Minv8zG9jPhbbp3PkPa243T 75d++ZFPf5Gdfpq+RzmdfFqsV58W6+qnReTT9D1G6uz5zFfPZ/4Jn6bvEVZnz2e9ej7r4vN582Om tnarpY4ytw+N2tto4/Wj5nMMq377/ObTJN/SX17984UnePnrf3+44Nd/Pie/2ukfkV/9EfnP/SNy /I84/XTtp39EefVHlD/3jyjxP+L0g3qc/hH11R9x5bcm+CPCvybzOVL37fObj/x8a6/+hiu/EMHf cPqV8O3zN2+f2OOP+XxO5aXTv3O8+juvfHaDv/P8BPLb70+qaL56Zlc+xcEzOz+iPH3N1qtnduXz HDyz8137t72/eWbp9pdX//ynPrNzarGcfSak9Jf/48N3/yHz65o95xW/X99++zZXPv9WLDXnWtve C2CNlfMsb34l5XOI8cPpi/nO4eP2m7WmnkerubS2d656N/bNw5y9Mu+cLW67i1vavuVTr6nkeUvl zelIPkcZvzkr2vTu0eGoveaWt7+m3totvTm7zud449kxQ079VQFe2ci+jvzKY4Z8DlGWb/LJm/DO r923+6mXS7/4AXwOW54/8ju/a88e+fGGOZ9DmeeP/M4v2LNHfry3zufw5riNt4/8Hr9Z3xZUfrwN fzfd2214zo+34fk9FvQs3eO9dX4PBD1L93jDnN+jQM/SPd4F53Ow82wXnN9jO8vbHyn58S44nwOg 54/8zi747JEDP4/OQdHzR37vvsTJIwc+F86B0lrTm51/fo8pPVmdOfC5cA6enn4uvMeenj1y4HPh HFA9feT3GNWTRy6Bz4VzkHV8+3Y3n99jWd/u5vdLX/3z150unH6PvkfCnrwQgY+gc1r2/C145+Pl 7C0IfFqdU7Xnj/zO8d7ZIwc+2M7p2/NHfueD7eyRAx9s55Tu+SO/d7x38siBD7Zzmvf8keM/eErg g+2c+j1/5PgHWwl8sJ3TweePHP9gK4EPtnOKePvB8/bD/D2Q+OQHTw18sL2X7uQ3QA384HkPSj5L F/i0eY9IPksX+Ah5D0c+Sxf4XDgnjE+//N+DjMvJIwc+F85J5PNHfu8Hz8kjBz4Xzonl80d+7wfP ySMHPhfOyebTr7z34Oa3i7MGPhbOAehxO/nuf4+BPvnur69OfurVk/zXz+f55Pm8R1CfPJ/26ryn XTnvif42eo+/Pns+r34bta/8bTQ+nD2fMMqWwVz59/OffOC0wOfXe2j4WbrA59d7XPhZusCH0ntQ +Fm6wCfNOed9+knzHup98knTAp805zz4+SO/x7aePHLgo+acGz9/5Hc+as4eOfAL5JwvP91OvoeY n/z26YFfIOcc+umvrvdQ9LNHDvxYOefVzx85DEm8XPrlR47vot5D288eOfARcs6/n36L9uuz62nQ 9YH3W1AnQYMETRK0QNC4kaBEgsjX2QBkYR6kIgapiEEqYpCKGKQizpHZur59++E+A5+b5+RruuU3 UHaer35LzSu/pV5Hfu2tlHNSNp/dNpuvOIz553IYM85hnOO42x/xFp6ZrziM+edyGDPOYZwzv9sf 8fZe5yvmN19ifsEfEecwzqne7Y84WQavQIxLqC74I0436dsze/sL7RW0my9Bu+CZ9fjLe/orfPsj 3t5BfkX65kukL/gjRvyPOP1Bn89uoc9XqMj8c1GR7eHCf8T56eTp5+ars4X551Il28OF/4j3AJS3 q3W9OpBYfy6Asj1c9I847+RYzhb2evXNu/5cHPIc+y5nEMd69d26/tzv1nMs/Nu13n5hrndgmXm7 rbTqSL2VuvL2/28r/5wB//7sN9Z6B5ZpY/tiXDPvMwNrb2mst+dG58D3+cO8A8scDzO2v6fOVOct 5xP055zufucu38sk5Y/P+7vxH2Pi9//+Nce/hoTuDd7D//bhH89P3/74/OHj83dvLonfPrz6F53e WPzKP6k8/pOu3Jc0/qT6lX9SffwnXbnhafxJ7Sv/pPb4T7pyJ9X4k/pX/kn98Z905Rat8SeNr/yT xuM/6cq9X+NPml/5J83Hf9KVm8rGn7S+8k9aj/+kK3err/5Jp/exv+5PqreHf9Kl2+Bf+WzS42dz 5S76Vz6bx9/Zl27Cf+Wzefx1e+ke/lc+m8fflJcQgKtL4RQO+Mo/6fE35SW2wPiTvvKbsj7+prwE LRh/0ld+U9bH35SXaIiv3xq8znH5L3r8RXkJs7j6F50CGF/8k15de2Fz/JL2+x/++bQ/mWOL/L/9 h9fo03//9+enWxq37f9eP6fHL9P5l+85/SG8TK+TfOllusSMfMXL1B5/oZ93BHwHSjFepi//Knh1 7f9LL9PjXxrnbQ7fYWWMl+nLP1cQYfM1r9DjXz+XEJ6v+5Bsj3/9XCKAvvLZPP71cwkg+spn8/iH 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 A1dV0b8F5mYfYTAvEMmMzOIkk2wEmTWFffpVMwuPqCYj6Kpnz25jd9DVZSL08E/0c1PRc0TvFpCX S6z77w97RH0kL5dY998fBoiaUV4use6/P1sNdbS8XGLdD9IRHaQjOklHdJKO6CQd0Uk6opN0RCfp iE7SEZ2kIzpJRUxQEekVVER6BRWRXkFFpFdQEekVVER6BRWRXkFFpFdQEekVVER6JRWRSEUkUhGJ VEQiFZFIRSRSEcDgXUGkIhKpiEQqIpOKyKQiMqmITCqCMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJ MHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHuJMHsJ MXvfn9+LtlVaru/PdUWbMC+X2DeYYt9gin2DKfYNptg3mGLfYIp1P726v/aUXi6v7q8dqJfLq/tr v+rl8ur+2t16uby6v/bCXi6x7pNY90ms+yTWfRLrPol1n8S6T2LdJ7Huk1j3Saz7LNZ9Fus+i3Wf xboXedck8q5J5F2TyLsmkXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8axJ51yTy rknkXZPIuyaRd00i75pE3jWJvGsSedck8q5J5F2TyLsm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm 4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm 4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwm4qwmwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwlwuwl wuwlwuxlwuxlwuxlwuxlwuxlgt9lgt9lgt9lgt9lgt9lgt9lgt9lgt9lgt9lgt9lhN+J6l8S1b8k qn9JVP+SqP4lUf1LovqXRPUviepfEtW/JKp/SVT/kqj+JVH9S6L6l0T1L4nqXxLVvySqf0lU/5Ko /iVR/Uui+pdE9S+J6l8S1b8kqn9JVP+SqP4lUf1LovqXRPUviepfEtW/JKp/SVT/koiuJhFdTSK6 mkR0NYnoahLR1SSiq0lEV5OIriYRXU0iuppEdDWL6GoW0dUsoqtZRFeziJtmETfNIm6aRdw0i7hp FnHTLOKmWcRNs4ibZhE3zR5u2sk42U7GyXYyTraTcbKdjJPtZJxsJ+NkOxkn28lk2E6GvHYy5LWT Ia+dDHntZMhrJ0MuOhly0cmQi06GXHQy5KKTIRedDLnoZMhFJ0MuOhly0cm8ik7mVXQyr6KTeRWd zKvoZF5FJ6MnOpki0ckUiU6mSHQyRaKTKRKdTJHoZIpEJ1MkOpki0ckUiU6mSHQyRaKTKRKdTJHo ZIpEJ1MkOpki0ckUiU6mSHQyRaKTKRKdTJHoZIpEJ1MkOpki0ckUiU6mSHRxgGEXBxh2cYBhFwcY dnGAYRcHGHZxgGEXBxh2cehgFwcFdnFQYBcHBXZxUGAXBwV2cdBFFwdddHHQRRcHXXRx0EUXB110 cdBFFwdddHHQRRcHXXRxOEUXh1N0cThFF4dTdHE4RReHU3RxoEQXh0B0cQhEF4dAdHEIRBeHQHRx CEQXh0B0cQhEF4dAdHEIRBeHQHRxCEQXh0B0cQhEF4dAdHEIRBeHQHRxCEQXh0B0cQhEF4dAdHEI RBeHQHRxCEQXh0B0cQhE/5MhENf/9Xf32//+cvt5fc1cz/3hvvfvPvl+xrSdMW1mzNsZ82bGsp2x bGaM7YyxmbFuZ6ybGdt2xraZsW9n7JsZx3bGsZlxbmecexnL9popm2umbK+ZsrlmyvaaKZtrpmyv mbK5Zsr2mimba6Zsr5myuWbK9popm2umbK+ZsrlmyvaaKZtrpmyvmbK5ZmJ7zcTmmontNRObaya2 10xsrpnYXjOxuWZie83E5pqJ7TUTm2smttdMbK6Z2F4zsblmYnvNxOaaie01E5trpm6vmbq5Zur2 mqmba6Zur5m6uWbq9pqpm2umbq+Zurlm6vaaqZtrpm6vmbq5Zur2mqmba6Zur5m6uWbq9pqpm2um ba+Ztrlm2vaaaZtrpm2vmba5Ztr2mmmba6Ztr5m2uWba9pppm2umba+Ztrlm2vaaaZtrpm2vmba5 Ztr2mmmba6Zvr5m+uWb69prpm2umb6+Zvrlm+vaa6Ztrpm+vmb65Zvr2mumba6Zvr5m+uWb69prp m2umb6+Zvrlm+vaa6ZtrZmyvmbG5Zsb2mhmba2Zsr5mxuWbG9po55/RnAoPirqBjVG4FnQ+Ku4KO Ubkr6BiVu4LIb+/cRrmCjuHJK+gYnryCjuHJK4hUxLmNsoLOB8VdQaQizgfFXUGkIs69lyuIVMS5 93IFkYo4916uIFIR597LFUQq4tx7uYJIRZx7L1cQqYhz7+UKIhVxPijuCgIVAQbFXUGgIsCguCsI VEQ+l2WuIFARYLrcFQQqAkyXu4JIRZxrOVcQqYhzLecKIhVxruVcQaQizrWcK4h8uOeGzXWYTD7c c8PmCiIf7rlhcwWRD/fcsLmCyId7bthcQaQizg2bCwYgFXFu2DxbIQcReXZIWi5tcNmzn/JyWXjO s/vycllY2rNX83JZWNqzs/NyiXWvKT/P9tDLJda9Nrjs2WN6ucS611SkZ6Pq5RLrXlORnt2ulktT kZ69sZdLrHtNRXo22F4use41FenZpXu5xLrXtKZnq+/l8ureG1z29Au8XF7de0PQnqaDl8ure28I 2tO50HJputXT5/ByiXWv6VZPs8TLJda9pls9HRcvl1irmiL1tG28XGKtaorU0/vxcom1qilSTwPJ yyXWvaZIPV0oL9d36/59IGCW62tmBwj4+uT7Gfdwkq9Pvp9xDyf5+uT7Gfdwkq9PvptxU8P6+uT7 Gfdwkq9PPv9vf/vl0z8//Lb+h28+8/5/dQ85+frk+xn3kJOvT76fcQ/T+vrk+xn3MK2vT76fcXtd bala13Pb62pL1bqe215XW6rW9dz2utpStdZzm6rW1yffz7i9rrZUreu57TWzpWpdz22vmS1V63pu e81sqVrXc9trZkvVup7bXjNbqtb13Paa2VK1rue218yWqnU9t71mtlSt9dymqvX1yfczbq+ZLVXr em57zWypWtdz22tmS9W6ntteM1uq1vXc9prZUrWu57bXzJaqdT23vWa2VK3rue01s6VqXc9tr5kt VWs9t6lqfX3y/Yzba2ZL1bqe214zW6rW9dz2mtlSta7nttfMlqp1Pbe9ZrZUreu57TWzpWpdz22v mS1V63pue81sqVrXc9trZkvVWs9tqlpfn3w/4/aa2VK1rue218yWqnU9t71mtlSt67ntNbOlal3P ba+ZLVXrem57zWypWtdz22tmS9W6ntteM1uq1vXc9prZUrXWc5uq1tcn38+4vWa2VK3rue01s6Vq Xc9tr5ktVet6bnvNbKla13Pba2ZL1bqe214zW6rW9dz2mtlSta7nttfMlqp1Pbe9ZrZUrfXcpqr1 9cn3M26vmbHRW9vSua7nttfVls51Pbe9rsbmuhrb6+rzk3/+m9lce2N77Y3NtTe21x4wX76kf//H 2F6wwKX5kv79H2N7lQM750v693+M7a8G4Pt8Sf/ujzG3v0+AQfQl/fs/xvaXEHCSvqR//8fY/lYC ltOX9O//GNtfZcCb+pL+/R9j+/sPmFhf0r//Y2x/IQK360v693+M7W9RYIt9Sf/+j7H9LQr8sy/p 3/8xtr9FgdH2Jf37P8b2tyhw5L6kf+/HKK+736JvT76fcfcLsQAl70v693+M3S/EAiS/L+nf/zF2 vxAL0Aa/pH//x9j9QixARPyS/v0fY/cLsQC18Uv693+M3S/EAmTJL+nf/zF2vxAL0C+/pH//x9j9 QixA6PyS/v0fY/cLsQBF9Ev6d3+MtP2FCKTTL+nf/zG2v0WBxvol/fs/xva3KBBjv6R//8fY/hYF qu2X9O//GNvfokDe/ZL+/R9j+1sU6MBf0r//Y2x/iwLB+Ev693+M7W/R85sEv6Z//8fY/hYF5vSX 9O//GNvfosDF/pL+3R9jG6QrwO7+kv79H2P7WxT44l/Sv/9jbH+LAgP9S/r3f4ztb1HgtH9J//6P sf0tCiz5L+nf/zG2v0WBd/8l/fs/xva3KDD5v6R//8fY/hYFswG+pH//x9j+FgXTBr6kf//H2P4W BfMLvqR/98fYxiYLmIjwJf37P8b2tyiYsfAl/fs/xva36Pm9qF/Tv/9jbH+Lnt+0+jX9+z/G9rfo +d2tX9O//2Nsf4sW8i26CZ2Wbej0ehL8GJvfotuk6vUk+DE2v0W38dbrSfBjbH6LbjOx15Pgx9j8 Ft0Gaa8nz3+MTfq2bNO315Pgx9j8Ft1Gdq8nwY+x+S26zfleT4If4zyoXlwWCDr/WqsXXQWCzr8y agazXGsGs1xrBrNcawazXGsGs1xrBrNcawazXGsGs1xrBrNcawazXGsGs1xrBrNcawazXGsGs1xr BrNcawazXGsGs1xrBrNcKyFaKuFPKqFFKmE7KiExKuEmKqEcKmESKiEIKjnvr+R0vpKz9EpOvis5 p64FzHKt5OC4kmPeSg5lKzlCreTAs5LjyUoOEys5+qvkoK6SY7VKDsEqObKq5ICpkuOgSg5vKjlq qeRgpJJjjEoOHSo5IqikoV9J+72SZnklre1KGtGVtI0rafLe+ydpIMa9rfJyaYNN7k2Yl0sbbHJv 2bRc3nDZe4Pn5dIG+tzbQS+XWPfecNl7T+nlEuveGy57b0y1XN5w2Xsb6+US694bLnvvhb1cYt17 w2XvDbWXS6x7b7jsvSv3col17w2Xvbf2Xi6x7r3hsnd/wMsl1r03XPZuMli5ijdc9m5JeLm8ui/e cNm7r+Hl8uq+eMNl7+aIl8ur++INl707LF4use694bJ3m8bLJda9N1z27vV4ucS69wbV3g0jLZc3 qPZuL3m5xLr3BtXePSovl1j33qDau9Hl5SIdUQAQVoL7VQLnVYLSVQK+VYKpVQKVVYKAVQJsVcI1 VUIhVcIMVUL4VITWlCAfbpAPN8jnFGTlBvlwK/lwK/lwK/lwK/lwK/lwK/lwK1m5lVREJR9uIx9u Ix9uIx9uIx8u4dsK4dsK4dsKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUK QdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdUKQdWKd7/FvZvQcnn3W9x7Dy+XuF0u4na5iNvlIm6X i7hdLuJ2uYi1GmKthlirIdZqiLUaYq2GWKsh1leI36sh1moVa7WKtVrFWq1irVaxVqtYq1X8Xq1i 3VexVptYq02s1SbWahNrVcQWi4gtFhFbLCJqWETUsIioYRFRwyKihkVEDYuIGhYRNSwialhE1LCI qGERUcMiooZFRA2LiBoWETUsImpYRNSwiKhhEVHDIqKGRUQNi4cadqICdaICdaICdaICdaICdaIC daICdaICdaICdaICdaICdaICdaICdaICdaICdaICdYJCdIJCdIJCdIJCdIJCdIJCdIJCdIJCdIJC dIJCdDJpphN+ohN+ohMUohMUohMUYgWRzwmgEJ2gEJ1QDZ1QDZ1QDZ1QDZ1QDZ1QDZ1QDZ1QDSsI fbhkEQIUohMUohMUohMUYgWRigD8RCf8RCf8RCf8RCf8RCf8RCcoRCdUQxfh8y7C512Ez7sIn3cR Pu8ifN5F+LyL8HkX4fMuwuddhM+7CJ93ET7vInzeRfi8i/B5FymSLlIkXaRIukiRdJEi6SJF0kWK pIsUSRcpki5SJPe+0ssl1r1HpHSRIukiRdJFiuTe4Xq5xPryKJIukh9dJD+6SH50kfzoIvnRRfKj i+RHF8mPe3vv5RK/Cz2KpIsUSRcpki5SJHejwcsl1r1HpHSRSOkikdJFIqWLREoXKZL+J+TH9X99 Z3b3vJbz9dy7s7u/PPl+xs3Z6F+efD/j5pjzL0++n3FzYvmXJ9/PuHmFw5cn38+4eRvDlyffz7h5 scKXJ9/PuHlHwpcn38+4ed3Blyffz7h5c8GXJ9/N2LfXTN9cM317zfTNNdO310zfXDN9e830zTXT t9dM31wzfXvN9M0107fXTN9cM317zfTNNdO310zfXDN9e830zTUzttfM2FwzY3vNjM01M7bXzNhc M2N7zYzNNTO218zYXDNje82MzTUzttfM2FwzY3vNjM01M7bXzNhcM2N7zYzNNTO318zcXDNze83M zTUzt9fM3Fwzc3vNzM01M7fXzNxcM3N7zczNNTO318zcXDNze83MzTUzt9fM3Fwzc3vNzL01E6+7 a+btyfcz7q6Z2LvOfj23u2Zi72b69dzumom9S+bXc7trJvbui1/P7a6Z2Lv6fT23u2Zi7xb39dzu mom9C9nXc7trJvbuVl/P7a6Z2LsmfcbuNelfnnw/4/aa2bu8fD23vWb27iFfz22vmb0rxddz22tm 73bw9dz2mtm76Hs9t71m9u7sXs9tr5m967fXc9trZu8m7fXc9prZuxR7xu6l2F+efD/j9prZu6p6 Pbe9ZvZunV7Pba+ZvQuk13Pba2bvLuj13Paa2bvWeT23vWb2bmhez22vmb3Lltdz22tm797k9dz2 mtm7AnnG7hXIX558P+P2mtm7mHg9t71m9u4YXs9tr5m964LXc9trZu/m3/Xc9prZu8R3Pbe9Zvbu 413Pba+Zvat113Pba2bvltz13Paa2bvwdsbuhbdfnnw/4/aa2buGdj23vWb2bpRdz22vmdhcM7G9 ZmJzzcT2monNNRPbayY210xsr5nYXDOxvWZic83E9pqJzTVTt9dM3VwzdXvN1M01U7fXTN1cM3V7 zdTNNVO310zdXDN1e83UzTVTt9dM3VwzdXvN1M01U7fXTN1cM3V7zdTNNbPNAcQmBxDbHEBscgCx zQHEJgcQ2xxAbHIAsc0BxCYHENscQGxyALHNAcQmBxDbHEBscgCxzQHEJgcQ2xxAbHIAsc0BxCYH ENscQGxyALHNAcQmBxDbHEBscgCxzQHEJgcQ2xxAbHIAsc0BxCYHENscQGxyALHNAcQmBxDbHEBs cgCxzQHEJgcQ2xxAbHIAsc0BxCYHENscQGxyALHNAcQmBxDbHEBscgCxzQHEJgcQ2xzA9eTL5//z 314+/P3nX17+95cjlbT19Dpf+9m0lregI+X3LehI+X0LOpLA34KOPOHPQWfTWt6Cjnzut6AjT/gt 6MjnfgsiH+7Z4JXPQWdTQN6C0H+JlNHZbI7PQWfXlLwFkYo4m83xFkR+5WfXlLwFkc/pbKDHWxD5 nM4GerwFkQ9XcdK/fod6uQw/4es3rpfLcB2+fj97uQyX5uu3uZfLcGm+fvd7ucRaVZzhr39AvFzi GlLc3K9/hbxcYt0rbu7XP2VeLrHuFc/3699DL5dYX4rn+/WPqpQr97MZbG9B5+8PuZ/NYHsLOn9/ yOTlMJOXw0xeDjN5Oczk5TCTl8MVRCoCvFFm8kaZyRvlCiIVcTYi7i2IVMTZiLi3IFIRZyPi3oJI RZyNiPscdDYi7i2IVMTZiLi3IFIRZyPi3oJIRZyNiHsLIhXRSEWczZX7HHQ2V+4tiFTE2b18b0Gk Is7u5XsLIhVxdvHd56Czu9E+B51dc/YWRH7lk/zKJ/mVT/Irn2QRTrIIJ1mEk3y4ykClr++OWi5l oNLXN00vl7YBzOIGMIsbwCxuALO4AcziBvB+FfZyiXXvbSazuplUhkZ9ffv2col1rwyN+voK7+US 614ZGvV1H6DlUoZGfd01eLnEuleGRn3deni5xLpXhkZ93b94ucS6VwZQfd0EebnEuleuRPu6k/Jy iXWvXIn2dTum5VKuYPq6efNyiTUxxZqYYk1MsSam+F04xe/CKX4XTq9W59k1Qm9BYNc7z64RegsC fZB5do3QWxDog0wAEK0g0AeZgDpaQaAPMskR1iRHWJMcYU1yhDXJEdYkR1iTHGFNcoQ1yRHWJEdY kxxhTXKENckR1iRHWJMcYU1yhDXJEdYkR1iTHGFNcoQ1yRHWJEdYkxxhTXKENckR1iRHWJMcYU1y hDXJEdYkR1iTHGFNcoQ1yRHWJEdYkxxhTXKENckR1iRHWLOTiuikIjqpCHLCNgepiEEqYpCKGKQi BqmIQSpikIoYpCIGqQhyfDonqQhy5jqVS4G+bqu0XMqlQF83YV4ur58xlUuBvu7kvFxeP2N6sPC9 HfRyiXUvnmFP8Qx7imfYUzzDnuIZ9hTPsKd4hj3FM+wpnmFP8Qx7imfYUzzDnuIZ9hTPsKd4hj3F M+wpnmFP8Qx7imfYUzzDnuIZ9hTPsKd4hj3FM+wpnmFP8Qx7imfYUzzDnuIZ9hTPsKd4hj3FM+wp nmFP8Qx7imfYUzzDnuIZ9tWP8XKJdd/FuhfP6a9ej5dLrPsh1v0Q636IdT/Euh9i3Q+x7odY9yJT cnW0vFxa3UcHfcoVdN6nXEHnfcoVdN6nXEHnfcogmkd00KcM4oYEcUOCuCFB3JAgbkgQNySIGxLE DQnihsR4BRUxXkFFjFdQEeMVVMR4BRUxXkFFjFdQEeMVfLjjlXy4iXy4iXy4iXy4iXy4iXy4YH7X CiIfLpjftYJIRYD5XTHA/K4VRCoCDP1aQaQiwNCvFUQqAgz9WkGkIgAmuYJIRQBMcgWRigCY5Aoi FQEwyRVEKgJgkiuIVATAJFcQqQiASa4gUhEAk1xBpCIAJrmCSEUATHIFoW2DttW+d0heLm2rfe+n vFzaVjv+TN/48NuHl7/98ukfK+Dl08e//+unD59+H/vyw08ffvznry//+vXjX1/+8tMvP/zjJZdV bjm39cX/wy+frv/mjz///eXnj//528eff/v1SviHH+D6j/58R//6ktJreW3feuztx/z08fpX/fbL S3n9POP5S/K8FYd2gVoXIUTLJUTLJUTLJUTLJUTLJUTLJUTLJUTLJUTL5d5Ve7m8ur/24F4ur+6v HbuXy6v7a3/v5fJq9eoGaLmSWKtJrNUk1moSazWJteqNyr3bFV4u7zt6eKNy756HlssblXt3SLxc Yt17Y3fvNouXS6x7b+zu3avxcol175Had8PHyyXWvUdq310jL5dY9x6pfbeevFxi3Xuk9t2/0nJ5 pPbd7fJyiXXvkdp3y8zLJda9R2rffTcvF2nQAms5BrCWVxBp0AJreQWRBi2wllcQadACa3kFkZY9 sJZXEKkIYC2vIFIRwFpeQaQigLW8gkhFAGt5BZGKANbyCiIVAQTkFUQ+XCAgryDy4QIBeQWRDxcI yCuIfLhAQI4BBOQVRCoCCMgriFQEAfsGAfsGAfsGAfsGAfsGAfsGAfsGAfsGAfsGAfsGAfsGAfsG AfsGAfsGAfsGAfsmAfsmYfQmYfQmYfQmYfQmYfTmK/hwJwH7JgH7JgH7JgL7PP/03uxouTz/9N4a ebnE3bznn977Ky+XuJv3/NN7k+blEuve80/vnZ6XS6x7zz+9t4teLrHuPf/03nN6ucS69/zTe+Oq 5fKc0Xub6+USa9VzRu+9spdLrFXPGb033F4usVY9Z/TetXu5xLr3nNF76+/lEuteBFmHCLIOEWQd njN6NyG8XGLdi7TnEGnPIdKeQ6Q9h0h7DpH2HCLtOUTac4q05xQJzSkSmlMkNKdIaE6R0LyaPl4u r1anSHtOkfacHu3ZiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzWiBzW iBzWCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3SCI3S CI3SCI3SCI3SCI3SBpih3wjC0gjC0gjC0gjC0gjC0ghP0QhP0QhP0QhP0QhP0QhP0QhP0QhP0QhP 0QhP0QhP0QhP0QhP0USUv4kofxNR/iai/E1E+ZuI8jcR5W8iyt9ElL+JKH8TUf4movxNRPmbiPI3 EeVvIsrfROilidBLE6GXJkIvTYRemgi9NBF6aSL00kTopYnQSxOhlyZCL02EXpoIvTQRemki9NJE 6KWJ0EsToZcmQi9NhF6aCL3c22Yvl1j3HkDTRICmiQBNEwGaJsISTYQlmghLNBGWaCIs0URYoomw RBNhiSbCEk2EJZoISzQRlmgiLDGIizWIizVIn22QPtsgfbZB+myD9NkG6bMN0mcbpM82SJ9tkD7b IN7SIN7SIN7SIN7SIN7SIDbRII7PII7PII7PII7PII7PCgJLY4Lh3SuIfE5gePcKAktjguHdK4hU BJjDvYLIhwvmcK8g8uGCOdwriHy4YA73CiIfLpjDPSaYwz0mmMM9JpjDPSZArcYEqNWYALUaE1BT YwJqakxATY0JqKkxATU1JqCmxgTU1JiAmhqi5TBEy2GIG9EhbkSHuBEd4kZ0iBvRIW5Eh7gRHeJG dIgb0aFuRD1qf4jU/hCp/SFS+0Ok9odIxw+RQh8ihT5ECn2IFPoQKfR7J+Tl8r5z5p/MHH7nuoEr 9hvXDYxYP1+Ptc43bhu4//vXf/PttoHccor41mNvP+WXWwNe/8erBtJmENoler9u76t0eqOU762m lssbf3xvTL1c4hL0xh/fu1svl1ir3vjje4vs5TJrVfzT440/vrffXi6x7j1m8t7De7nEWvU4x7sR 4OUSa9XjHO9ugpdLrFWLc0yvr+fdujvotKFzBR136+6g04bOHXTa0LmDThs6d9BpK/YKOm4d3UGn fcE7CP14p83EO+i0mXgHkdo7Fu6uoGPh7g4iZXSswd1B5HM61uDuIPI5HRttV9Cx0XYHkeV+rO3c QeRXfowT3EHkV36ME9xB5HM6xgnuIPI5Wa+3n/8Cabms19vPf6+8XNIrw+e/bl4uaSv2+W+hl0t6 7f78l9PLJb3Cf/476+US16OlbHz+Y+3lEteQpUZ8/ovv5RLry1IjPr82aLksneHzS4aWy0KLP7+S eLnEmrBOdD+/13i5xPqyTnQ/vxxJucrrMQVxBYHtxAo6f7ctr8fzBu6g83fb+xeh/VK9L9/716bl snyTz79kKVd9PabU7qDzIlxB50W4gs43WCvovAhX0PkGq76CvtcKOl9YK+i8YbGCzrtRK4hUBGiW rSBSEcdo2x1EKuIYbbuCwJf6CiIVcYy23UGkIkB/cgWRigD9yRVEKgL0J1cQqQjQn1xBpCJAU3MF kYoAndBKXl0qeXVZQaQijgeC3UGkIkD7dAWRijgeCHYHkYo4Hgh2B5GKOB4IdgeRijgeCHYHkYo4 Hgh2B5GKOB4IdgeRijgeCHYHkYo4vtPuDiIVAbY3K4hUxLFHeQeRiji+0+4OIhUBDnNWEKkIcJiz gtBeQ2sS3dsqL5e2d703YV4uc++qNYnunZyXS9vr3/s+L5d2IHPvEr1cYt1bTNXnraaXS6x7i6n6 vF/1col1bzFVnze9Xi6x7r2DyHvn7OUS6947iLy331ou7yDy3qx7ucS6t2bHfd7xe7nEuvd69Hfb wMsl1r132Hr3HrxcYt1bs+M+NzC8XGLdW7PjPndBvFxi3Vuz4z63UrRc1uy4z40XL5dY99bsuM/d Gy+XWPfW5YufW0BeLrHurcsXP/eRvFxi3VuXL35uRnm5xLr3oJ+7o+XlEusewMwriHREAcy8gkhH 9Hg22h1EOqLHs9HuINIRPZ6NdgeRjujxbLQ7CFREOp6NdgeBikivoCLSK6iIdDy67Q4CFZFeQUWk 4yFxdxCoiHQ8JO4KOh4SdweRijgeEncHkYo4HhJ3B5GKOB4SdweRijgeEncHkYo4nix3B5GKOJ4s dweRiiDMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLM XiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXiLMXkLMnidN3NsqLZcnTdybMC+X2DewxuB93sl5ucS+ gTUG7/N20Msl1r01Bu/zntLL5dX9tQP1cnl1n6xRf5+3sV4ur+6TNYLw817YyyXWvTWC8POG2ssl 1r01gvDzrtzLJda9Navv89beyyXWfRLr3pr797lt4OUS696a+/e59+DlEute5F2TyLsmkXdNIu+a RN41ibxrEnnXJPKuSeRdk8i7JpF3TSLvmkTeNYm8axJ51yTyrknkXZPIuyaRd00i75pE3jWJvGsS edck8q5J5F2TyLsm4qwm4qwm4qwm4qwm4qwm4qwmop8mop8mop8mop8mop8mop8mYpImYpImYpIm YpImYpImIoUmIoUmIoUmomomomomYl0mYl0mYl0mYl0mYl0mYl0mYl0mYl0mQp0lQp0lQp0lQp0l Qp0lQp0lQp0lQp0lQp0lQp0lQp0lQp1lQp1lQp1lQp1lQp1lQp1lQp1lQp1lQp1lQp1lApBlQmhl RGiJdlgS7bAk2mFJtMOSaIcl0Q5LotGVRKMriUZXEo2uJBpdSTS6kmhhJdHCSqKFlUQLK4kWVhLN qSSaU0k0p5JoKCXRUEqiVZREqyiJVlESraIkWkVJtIqSaBUl0SpKIhWXRCouiVRcEqm4JFJxSaTi kkjFJZGKSyIVl0QqLolUXBKpuCxScVmk4rJIxWWRissiFZdFKi6LVFwWqbgsUnFZJNmySHllj/Lq ZIpjJ1McO5ni2MkUx06mOHYyxbGTKY6dTHHsZIpjJ1McO5ni2MkUx06mOHYyxbGTKY6dTHHsxGLv xGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGLvxGJfQaAiiMXeicXe icXeicV+/f9JEKkIYLF3YrF3YrF3YrF3YrF3YrF3YrF3YrF34ix34ix34ix3YhJ3cfJVFydfdXHy VRcnX3Vx8lUXJ191cfJVFydfdXHyVRcnX3Vx8lUXJ191cfJVFydfdXHyVRcnX3XR3O6iud1Fc7uL 5nYXze0umttdNLe7aG530dzuorndRXO7i+Z2F83tLprbXTS3u2hud9HcvrduXi6v7kVzu4vmdhfN 7Xu36OUS694zt7tobnfR3O6iud1Fc7uL5nYXze0umttdNFi7aLB20WDtoinayRCuToZwdTKEq5Mh XJ0M4epkNFYno7E6GY3VyWisTkZjdTIaq5MpV51Yfp1Yfp1Yfp1Yfp1Yfp1YfiuIfLhADexEDexE DexEDezE8ltB5MMFamAnamAnamAnamAnauAKIh8uwROIT9iJT7iCSEUQPIGYi52YiyuIVATBE4ju 2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2Inu2MWh MF0cCtPFoTBdHArTxaEwXRy+0sXhK10cvtLF4StdHL7SxeErXRyY0kUFtIsKaBcV0C4qoF1UQLuo gN6bOi+XWKueTtpFnbSLOmkXFdB7e+nlEmvV00m7qJN2USftok56b3S9XGKtimiTqKbem2gvl1j3 ItokKrP3Bl3LJaJNon7bRf22i/ptF/XbLuq3XdRvu6jfdlG/7aJ+20X9tov6bRf12y7qt13Ub7uo 33ZRv+2ifttF/baL+u0kl5hNconZJJeYTXKJ2SSXmE1yidkkl5hNconZJJeYTXKJ2SRCwCRCwCRC wCSXmE1yidkk6sEkl5hNwk9Mwk9Mwk9MgkJMch/ZJPzEJPzEJPzEJPzEJPzEJPzEJFeLTQJdTAJd TAJdTAJdTAJdTAJdTAJdTMJPTMJPTMJPTMJPTDJaeRLoYhLoYhLoYhLoYhLoYhLoYhLoYhLoYhLo YhLoYhLoYhLoYhLoYhLoYhLoYhLoYhLoYhLoYhLoYhLoYoq3KE3xFqUp3qI0xVuUpniL0hRvUZri LUpTvEVpircoTfEWpSky6FNk0KfIoE/xFqUp3qI0RTZ+ircoTRGYmSIwM0VgZoqQyxRvPpoiMDNF YGaKwMwUgZkpAjNTBGameFvRFOGbKcI3U4RvpgjfTBG+mSJ8M0X4ZorAzBSBmSkCM1MEZqY4f32K 8M0U4ZspwjdThG+mCN9MEb6ZInwzRfhmivDNFOGbKcI3U4RvpgjfTBG+mSJ8M0X4ZorwzRThmynC N1OEbyYRciYRciYRciYRciYRciYRciZxayZxayZxayZxayZxayZxayZxayZxayZxaya5SmySq8Qm uUpskqvEJrlKbJILvia54GsFkc8JDORcQeRzAgM5VxD5nMBAzkkuLVtBYOVmMJBzBZGKAAM5ZyZE ViZEViZEViZEViZEViZEViZEViZEViZEViZwVSZwVSZwVSZwVSZwVSZwVSZwVSZwVSZwVSZwVQbD aVYQqQhCZOUgFUEwrkwwrkwwrowwLg/0nyLoP0XQf4qg/xRB/ymC/lOE86cI508Rzp8inD9FOH+K cP4U4fwpwvnThPPFu7GmeDfWFO/GmuLdWFO8G2uKd1BN8Q6qe5ep5fLme957Ui+XWF/efM8p3tk1 xTu77m2wl0use2++572X1nKJTGEWmcIsMoVZZAqzyBRmkSnMIlOYRaYwi0xhFjnALHKAWeQAs8gB ZpEDzCIHmEUOMIscYBY5wCxygNkbnHW3S7xcYt2HWPcin5hFPjGLfGLW+MT1f849nSvouMO3/s+5 p3MFHXf4rqDjDt8VdNzhu4KOO3xX0HGH7wo67vBdQccdviuIVMS5p7P+z7mncwWRijj3dK4gUhHn LMYVRCrinMW4gkhFnLMYVxCpiPPhqFcQqYhzgOMKIhVxDnBcQaQizgGOK4hUxDnAcQWBigAAxxUE KgIAHFcQqAgAcFxBoCLy+d2tVxCoCICKXEGkIs5RkSuIVMQ5KnIFkYo4R0WuIFIR56jIFUQq4hwV uYJIRZyjIlcQqYhzVOQKIhVxjopcQaQizlGRK4hUxDkqcgWRijjnS64g8h6huQMpee5ASp47kJLn DqTkuQMpee5ASp47kJLnDqTkuQMpee5ASp47kJLnDqTkuQMpee5ASp47kJLnDqTk8TwpeTxPSh7P k5LH86Tk8TwpeTxPSt7gzpQ8Nigljw1KyWODUvLYoJQ8Nigljw1KyWODUvLYoJQ8NujpD3i5vLr3 2KCnyeDl8uo+a3cSP50KL5dX9x6z9LQ7tFwas/Q0R7xcYt1rzNLTYfFyiXWvMUtPm8bLJda9xiw9 vR4vl1j3GrP0NIy8XGLda8zS03Xycol1rzFLT+tKy6XxT0+jy8tFOqLnftUVRDqi537VFUQ6oud+ 1RVEOqLnftUKOverriDSIz/3q64gUhHnftUVRCri3K+6gkhFnI/JvoJIRZyPyb6CSEWcj8m+gkhF nI/JvoJIRZyPyb6CSEWc301+BZGKOJ+tfQWRijifrX0FkYo4n619BZGKOJ+tfQWRiiDMXibMXibM XibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibMXibM XibMXibMXibMXibMXibMXibMnuePPNsqL5fYN9D8kWdv5uUS+waaP/Js8LRcmj/ybAe9XGLda/7I s6f0col1r/kjz8bUyyXWvTbf+tndernEutfmWz9bZC+XWPfafOtnn+3lEuteu1z+2axrubRZ2c/W 3ssl1r02K/vpD3i5xLrXZmU/TQYvl1j3Iu+aRd41i7xrFnnXLPKuWeRds8i7ZpF3zSLvmkXeNYu8 axZ51yzyrlnkXbPIu2aRd80i75pF3jWLvGsWedcs8q5Z5F2zyLtmkXfNIu+aRd41i7xrJs5qJs5q Js5qJs5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5q Ic5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIc5qIcxeIcxeIcxeIcxe IcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxeIcxe IcxeIcxeIcxeIcxeQcye6Atm0RfMoi+YRV+wiL5gEX3BIvqCRfQFi+gLFtEXLKIvWERfsIi+YBF9 wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi+oJF9AWL6AsW0Rcsoi9YRF+wiL5gEX3BIvqCRfQF i+gLFtEXLKIvWERfsIi8axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsRedci8q5F5F2LyLsWkXct Iu9aRN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWkTetYi8axF51yLyrkXkXQtxVgtxVgtxVgtxVgtx VgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtx VgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgtxVgth9gph9gph9gph9oIwe0GYvSDM XhBmLwizF4TZC8LsBWH2gjB7QZi9IMxeEGYvCLMXhNkLwuwFYfaCMHtBmL0gzF4QZi8IsxeE2QvC 7AVi9kRfsIi+YBF9wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi+oJF9AWL6AsW0Rcsoi9YRF+w iL5gEX3BIvqCRfQFi+gLFtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi +oJF5F2LyLsWkXctIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8a Iu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8aIu8axFkN4qwGcVaDOKtBnNUgzmoQZzWIsxrEWQ3i rAZxVoM4q0Gc1SDOahBnNYizGsRZDeKsBnFWgzirQZzVIM5qEGc1iLMaxFkN4qwGcVaDOKtBnNUg zmoQZzWIsxrEWQ3irAZxVoM4q0GYvSDMXhBmLwizF4TZC8LsBWH2gjB7QZi9IMxeEGYvCLMXhNkL wuwFYfaCMHtBmL0gzF4QZi8IsxeE2QvC7AVh9oIwe0GYvSDMXhBmLwizF6IvGKIvGKIvGKIvGKIv GKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIv GKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGKIvGCLvGiLvGiLvGiLvGiLvGiLvGiLv GiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLvGiLv GiLvGiLvGsRZDeKsBnFWgzirQZzVIM5qEGc1iLMaxFkN4qwGcVaDOKuVOKuVOKuVOKuVOKuVOKuV OKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuV MHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuV MHuVMHuVMHuVMHuVMHuVMHuVMHuVMHsVMXuiLxiiLxiiLxiiLxiiLxiiLxiiLxiiLxiiLxiiLxii LxiiL1hFX7CKvmAVfcEq+oJV9AWr6AtW0Resoi9YRV+wir5gFX3BKvqCVfQFq+gLVtEXrKIvWEVf sIq+YBV9wSr6glX0BavoC1bRF6yiL1hF3rWKvGsVedcq8q5V5F2ryLtWkXetIu9aRd61irxrFXnX KvKuVeRdq8i7VpF3rSLvWkXetYq8axV51yryrlXkXavIu1aRd60i71pF3rWKvGsVedcq8q6VOKuV OKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuV OKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVOKuVMHuVMHuVMHuV MHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuVMHuNMHuNMHuNMHuNMHuNMHuNMHuNMHuNMHuNMHuNMHuN MHuNMHuNMHuNMHuNMHsNMXuiL1hFX7CKvmAVfcEq+oJV9AWr6AtW0Resoi9YRV+wir5gFX3BKvqC VfQFq+gLVtEXrKIvWEVfsIq+YBV9wSr6glX0BavoC1bRF6yiL1hFX7CKvmAVfcEq+oJV9AWr6AtW 0Resoi9YRV+wir5gFX3BKvKuVeRdq8i7VpF3rSLvWkXetYq8axV51yryrlXkXavIu1aRd20i79pE 3rWJvGsTedcm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bcRZbcRZbcRZbcRZ bcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZ bcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbcRZbYTZa4TZa4TZa4TZa4TZa4TZ a4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZa4TZ a4TZa4TZa4TZa6Iv2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm+oJN9AWb6As2 0Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hE X7CJvmATfcEm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3bSLv2kTetYm8axN5 1ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs2kXdtxFltxFltxFltxFltxFltxFlt xFltxFltxFltxFltxFltRD9tRD9tRD9tRD9tRD9tRD9tRD9tRD/tRD/tRD/tRD/tRD/tRD/tRD/t RD/tRD/tRD/tRD/tRD/tRD/tRD/tRD/tRD/tRD/tBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/r BL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/rBL/riG8T3bomunVNdOua 6NY10a1rolvXRLeuiW5dE926Jrp1TXTrmujDNdGHa6IP10Qfrok+XBN9uCb6cE304brow3XRh+ui D9dFH66LPlwXfbgu+nBd9OG66MN10Yfrog/XRR+uiz5cF324LvpwXfThushzdpHn7CLP2UWes4s8 Zxd5zi7ynF3kObvIc3aR5+wiz9lFnrOLPGcXec4u8pxd5Dm7yHN2kefsIs/ZRZ6zizxnF3nOLvKc XeQ5u8g6duIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIr duIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrduIrdoJe dYJedYJedYJedYJedYJedUJRdUJRdUJRdUJRdTL5vxP0qhP0qhP0qhP0qhP0qhMgahAgahAgahAg ahAgahAgahAgahAgaiAgSvSquuhVddGr6qJX1UWvqoteVRe9qi56VV30qrroVXXRq+qiV9VFr6qL XlUXvaouelVd9Kq66FV10avqolfVRa+qi15VF72qLnpVXfSquuhVddGr6qJX1UWvqoteVRe9qi56 VV30qrroVXXRq+oin9hFPrGLfGIX+cQu8old5BO7yBR2kSnsIlPYRaawi/P6u8gndpFP7CKf2EU+ sYt8Yhc5wCFygEPkAIfIAQ6RAxwiBzhEDnCIHODwOMCSgTi1gs7btyvovC1YMnCgVtB5W3AFnbcF V9B5W3AFnbcFV9B5W3AFkQ8XOFAriFQEcKBKBg7UCiIVARyoFUQqAjhQK4hUBHCgVhCpCOBArSBS EWAE+QoiFQFGkK8gUhEA6VlBpCIA0rOCSEUApGcFkYoASM8KIhUBkJ4VRCoCID0riFQEQHpWEKkI gPSsIFIRAOlZQaQiANKzgkhFAKRnBZGKAEjPCiIVAZCeFUQqAiA9K4hUBEB6VhCpCID0rCBSEYDO WUHkwwXTxO9djbdD0jpP9x5Iy+UZI/eOyculdQbu/ZWXS+sM3LsxL5dYq54xcm/pvFxi3XvGyL0v 9HKJde8ZI/fm0ssl1r1njNw7VC+XWPeeMXJvc71cYt17E8DvvbKXS6x7j1S7N9xeLrHuPVLt3rVr uTxS7d7je7nEuvdItbtR4OUS694j1e5ug5dLrHuPVLtbFl4use49Uu3ue3i5xLr3SLW7eeLlEuve I9XuDoyWyyPV7n6Nl0use49Uu5s+Xi6x7j267O4cebm8Wg0wHnYFgY5WgPGwKwi0KwOMh11BoF0Z YDzsCgLtyiCUQ4DxsCuIVARBI4KgEUHQiCBoRBA0IggaEQSNCIJGBEEjgqARQdCIIGhEEDQiCBoR BI0IgkYEQSOCoBFB0IggaEQQNCIIGhEEjQiCRgRBI4KgEUHQiCBoRBA0IggaEQSNCIJGBEEjgqAR QdCIIGhEEDQiCOUQhHIIQjkEoRyCUA5BKIcglEMQyiEI5RCEcghCOQShHIJQDkEohyCUQ3gDRe8d kpbLGyh676e8XF47IbyBovemzMvltRNCRDrCGyh6b/i8XGLdi3hIiHhIiHhIiHhIiHhIiHhIiHhI iHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhI iHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiHhIiEhHiEhHiEhHiEhHiEhHiEhHiEhHiEhHiEhH iEhHiEhHiEhHiEhHiEhHeEhHJQZVJQZVJQZVJQZVJQZVJQZVJQZVJQZVJQZVJQZVJQZVJQbVCiIV AbSrSrSrSrSrmsEk5RVEKgJMUl5BpCLAJOUVRCoCXGK/gkhFgPHLK4hUBBi/vIJIRYDxyyuIVAQY v7yCSEWA8csriFTEJBUBBj3XAgY9ryBQEQUMel5BoCIKGPS8gkBFFDDoeQWBiigAbVxBpCIA2riC SEUAtHEFkYoAaOMKIhUB0MYVRCoCoI0riFQEQBtXEKkIgDauIFIRAG1cQaQiANq4gtBeQ9ufV1G5 qKJyUUXloorKRRWViyoqF1VULqqoXFRRuaiiclFF5eLeU3q5xLr39I0q6hv3ftXLJda9N2j43vR6 ucS69wYN3ztnL5dY997Q4nv7reXyhhbfm3Uvl1j33tDie8fv5RLr3htafLcNvFxi3XvDlO/eg5fL q/viDVO+GxheLq/uizdM+e6CeLm8ui8eA323UrRcHgN9N168XGLdewz03b3xcol17zHQdwvIyyXW vcdA330kL5dY9x4DfTejvFxi3XsM9N3R8nKJdQ/U3hVEOqJA7V1BpCMK1N4VRDqiQO1dQaQjCtTe FUR65EDtXUGkIoDau4JIRQC1dwWRigBq7woiFQHU3hVEKgKovSuIVARQe1cQqQig9q4gUhFA7V1B pCLA1PMVRCoC+MC1ALV3BZEPF6i9K4h8uAS/KwS/KwS/KwS/KwS/KwS/KwS/KwS/KwS/KwS/KwS/ KwS/KwS/KwS/KwS/KwS/K4SkK4SkK4SkK4SkK4SkK4SkK4SkK4SkK4SkK4SkK4SkK57ZeW92tFye 2Xlvjbxc4m7eMzvv/ZWXS9zNe2bnvUnzcol175md907PyyXWvWd23ttFL5dY957Zee85vVxi3Xtm 571x1XJ5Zue9zfVyiXXvmZ33XtnLJda9N/j73nB7ucS698zOe9fu5RJr1TM7762/l0usVZEcLSI5 WkRytIjkaPk+Ofq7x17+2/2//Pifv338+beXX3/78Om3H3/++8tffvrlh3+8/Pyvf/7l46eX1K6C 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 G1RENqiIbFAR2aC73eHlEuve44yKyBkVkTMqImdURM6oiJxRETmjInJGReSMisgZFZEzKiJnVETO qIicURE5o7vr5OUS696bMFNE/qmI/FMR+adCPKZCPKZCPKZCPKZCPKZCPKZCPKZCPKZCPKZCPKZC PKZCPKZCPKZCPKZCPKZCPKYVRCqikIoopCIKqYggFRGkIoJURJCKCFIRQSoCDCBdQaQiwADSFUQq AgwgXUGkIsAA0hVEKgIMIF1BpCIIs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJ s1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJs1cJsyf6I0X0R4rojxTR HymiP1JEf6SI/kgR/ZEi+iNF9EeK6I8U0R8poj9SRH+kiP5IMf2Ra7/q5RLrvoh1X8S6D7HuQ6z7 EOs+xLoPse5DrHtvuvO9WfdyiXXvTXe+d/xeLrHuvenOd9vAyyXWvTfd+e49eLnEuhd51yryrlXk XavIu1aRd60i71pF3rWKvGsVedcq8q5V5F2ryLtWkXetIu9aRd61irxrFXnXKvKuVeRdq8i7VpF3 rSLvWkXetYq8axV51yryrpU4q5U4q5U4q5U4q5U4q5U4q5U4q5U4q5U4q5U4q5U4q5U4q5U4q5U4 q5U4q5U4q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404 q404q404q404q40we40we40we40we40we40we40we40we40we40we40we40we40we40we40we40w e40we40we40we40we40we40we40we40we40we40we40wew0xe6IvWEVfsIq+YBV9wSr6glX0Bavo C1bRF6yiL1hFX7CKvmAVfcEq+oJV9AWr6AtW0Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv 2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm8q5N5F2byLs2kXdtIu/aRN61ibxr E3nXJvKuTeRdm8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcm8q5N 5F2byLs2kXdtxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFlt xFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFltxFlt xFlthNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNlrhNnrhNnrhNnr hNnrhNnrhNnrhNnrhNnrhNnrhNnrhNnrhNnriNkTfcEm+oJN9AWb6As20Rdsoi/YRF+wib5gE33B JvqCTfQFm+gLNtEXbKIv2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm+oJN9AWb 6As20Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i 79pE3rWJvGsTedcm8q5N5F2byLt2kXftIu/aRd61i7xrF3nXLvKuXeRdu8i7dpF37SLv2kXetYu8 ayfOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifO aifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifOaifMXifM XifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifMXifM XifMXifMXifMXifMXifMXifMXifMXhd9wS76gl30BbvoC3bRF+yiL9hFX7CLvmAXfcEu+oJd9AW7 6At20Rfsoi/YRV+wi75gF33BLvqCXfQFu+gLdtEX7KIv2EVfsIu+YBd9wS76gl30BbvoC3bRF+yi L9hFX7CLvmAXfcEu+oJd9AW76At2kXftIu/aRd61i7xrF3nXLvKuXeRdu8i7dpF37SLv2kXetYu8 axd51y7yrl3kXbvIu3aRd+0i79pF3rWLvGsXedcu8q5d5F27yLt2kXftIu/aRd61i7xrJ85qJ85q J85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85qJ85q J85qJ85qJ87qIM7qIM7qIM7qIM7qIM7qIM7qIM7qIM7qIM7qIM7qIM7qIM7qIMzeIMzeIMzeIMze IMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMzeIMze IMzeIMzeIPjdQPidqP51Uf3rovrXRfWvi+pfF9W/Lqp/XVT/uqj+dVH966L610X1r4vqXxfVvy6q f11U/7qo/nVR/eui+tdF9a+L6l8X1b8uqn9dVP+GqP4NUf0bovo3RPVviOrfENW/Iap/Q1T/hqj+ DVH9G6L6N0T1b4jo6hDR1SGiq0NEV4eIrg4RXR0iujpEdHWI6OoQ0dUhoqtDRFeHiK4OEV0dIro6 RHR1iOjqENHVIaKrQ0RXh4iuDhFdHSK6OkR0dYjo6hBx0yHipoMoo4Moo4Moo4Moo4Moo4Moo4Mo o4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Mo o4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Moo4Mgc4Mgc4Mgc4Mgc4Mgc4PQb4PQb4PQb4PQ b4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb4PQb5PQb5PQb5PQbxPRb6J5 N0Tzbojm3RDNuyGad0M074Zo3g3RvBuieTdE826I5t0QzbshmndDNO+GaN4N0bwbonk3RPNuiObd EM27IZp3QzTvhmjeDdG8G6J5N0Tzbojm3RDNuyGad0M074Zo3g3RvBuieTdE826I5t0Qzbsh4qZD xE2HiJsOETcdIm46RER0iIjoEBHRISKiQ0REh4iIDhERHSIiOkREdIiI6BAR0SEiokNERIeIiA4R ER0iIjpERHSIiOgUEdEpIqJTRESnh4jWCg5iVtB5S20FnbfUVtB5k3UFnTdZV9B5k3UFnTdZV9B5 k3UFnTdZawVnKivovMm6gsiHC85UVhD5cMGZygoiHy44U1lB5MMFZyoriHy44ExlBZGKAGcqK6j9 2/UV+Py//e2XT//88Nv6H/6HZxo4blhB6d/+X2/frffjf8gKfjENHC2sIPCLaUCsX0FgqTQg1q8g sFQaEOtrA2L9CgJLpQGxfgWRikjxb//j/1xf/v3Dry//x/95Z7gT/OVfv7389u8fP318+fHXler6 3/3143/8+MNH8p8jtQSU/BVEagko+SuI1BJQ8lcQqSWg5K8gUktAyV9BpCKAkr+CSEUAJX8FkYoA Sv4KIn+Ivcbr/Q7v5TI3JNpG/N4IeLm0jfi9bfByaRvxe5Oh5fKapfeWxMsl1qrXLL33NV4usVa9 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 rCDyOQG5pJL5wpXMF65kvnAl84UrmS9cyXzhSuYLVzJfuJL5wpXMF65kvnAl84UrmS9cyXzhSuYL VzJfuJL5wlXspFSxk1LFTkoVOylV7KRUsZNSxU7Kve3ycmldmSp2ZarYlaliV6aKXZkqdmWq2JWp alfGs0buzaWXS6x7zxq5d6heLrHuPWvk3uZ6ucS696yRe6/s5RLr3rNG7g23l0use+86xnvX7uUS 694zUKo4i7uKs7irOIv77h94ucT68kyPuwnh5RLryzM9qjgjvIozwqs4I7yKM8KrOCO8ijPCqzgj vIozwqs4I7yKM8KrOCO8ijPCqzgjvIozwqs4I7yKM8KrOCO8ijPCO+nbdtK37aRv20nftpO+bSct 2E5asJ20YDtpwXbSTe2km9pJN7WTxmgnF691cvFaJxevdXLxWicXr3Vy8VonF691cvFaJxevdXLx WicXr3Vy8VonF691cvFaJxevdXLxWicXr3Vy8VonF691cvFaJxevdXLxWicXr3Vy8VonF691cvFa JxevdXLxWicXr3Vy8VonF691cvFaJ0O/Oxn63cnQ706Gfncy9LuTod+dDP3uZOh3J0O/Oxn63cn8 7k7md3cyv7uT+d2dzO/uYq+ki72SLvZKutgr6WKvpIv9jS72N7rY3+hif6OLPYku9iS62JPoZh9B vGusi3eNdfGusS7eNdbFu8a6eNdYF+8a6+JdY128a6yLd4118a6xLt411sW7xrp411gX7xrr4l1j XbxrrIt3jXXxrrEu3jXWxbvGunjXWBfvGuviXWNdvGusi3eNdfGusS7eNdbFu8a6eNdYF+8a6+Jd Y12cyt/FqfxdnMrfxan8XZzK38Wp/F2cyt/FqfxdnMrfxan8XZyk38VJ+l2cpN/FSfpdnKQ/Satz klbnJK3OSVqdk7Q6J2l1TtLqnKTVOUmrc5JW5yStzklanZO0OidpdU7S6pzkqsJJriqc5KrCSa4q nOSqwkmuKpzkqsJJriqc5KrCSa4qnOSqwkmuKpzkqsJJriqc5KrCSa4qnOSqwknuApzkLsBJ7gKc 5C7ASe4CnOQuwEnuApzkWr9JLtub5LK9SS7bm+SyvUku25vksr1JLtub5LK9Se7Nm+TevEnuzZvk 3rxJ7s2b5N68FYReR7Vt/RS39VPc1k9xWz/Fbf0Ut/VT3NZPcVs/xW39FLf1U9zWT3FbP8Vt/RS3 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 e+8SlbsZ5eUS617kb4vI3xaRvy1EMSxEMSxEMSxEMSxEMSxEMSxEMSxEMSxEMSxEMSxEMSxEMSzg MtMVRCqCeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImFeImF eImFeImFeImFeImFeImFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuF MHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHuFMHtF9BeL6C8W0V8sor9YRH+x iP5iEf3FIvqLRfQXi+gvFtFfLKK/WLwLLe+tppdLrHvRhSyiC1lEF7KILmTxblS498JeLrHuRV+w iL5gEX3BIvqCRfQFi+gLFtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxaRdy0i71pE3rWIvGsRedci 8q5F5F2LyLsWkXctIu9aRN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWkTetYi8axF51yLyrkXkXYvI uxaRdy0i71pE3rWIvGshzmohzmohzmohzmohzmohzmohzmohzmohzmohzmohzmohzmohzmohzmoh zmohzmoQZzWIsxrEWQ3irAZxVoM4q0Gc1SDOahBnNYizGsRZDeKsBnFWgzirQZzVIM5qEGc1iLMa xFkN4qwGYfaCMHtBmL0gzF4QZi8IsxeE2QvC7AVh9oIwe0GYvSDMXhBmLwizF4TZC8LsBWH2gjB7 QZi9IMxeEGYvCLMXhNkLwuwFYfaCMHtBmL1AzJ7oCxbRFyyiL1hEX7CIvmARfcEi+oJF9AWL6AsW 0Rcsoi9YRF+wiL5gEX3BIvqCRfQFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QF Q/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ/QFQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+Rd Q+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdQ+RdgzirQZzV IM5qEGc1iLMaxFkN4qwGcVaDOKtBnNUgzmoQZzWIsxrEWQ3irAZxVoM4q0Gc1SDOahBnNYizGsRZ DeKsBnFWgzirQZzVIM5qEGc1iLMaxFkN4qwGcVaDOKtBnNUgzmoQZzUIsxeE2QvC7AVh9oIwe0GY vSDMXhBmLwizF4TZC8LsBWH2gjB7QZi9IMxeEGavEmavEmavEmavEmavEmavEmavEmavEmavEmav EmavEmavImZP9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD 9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD9AVD 9AVD5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F1D5F2ryLtWkXet Iu9aRd61irxrFXnXKvKuVeRdq8i7VpF3rSLvWkXetRJntRJntRJntRJntRJntRJntRJntRJntRJn tRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJntRJn tRJntRJntRJntRJntRJntRJntRJntRJntRJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJm rxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmrxJmr4q+YBV9 wSr6glX0BavoC1bRF6yiL1hFX7CKvmAVfcEq+oJV9AWr6AtW0Resoi9YRV+wir5gFX3BKvqCVfQF q+gLVtEXrKIvWEVfsIq+YBV9wSr6glX0BavoC1bRF6yiL1hFX7CKvmAVfcEq+oJV9AWryLtWkXet Iu9aRd61irxrFXnXKvKuVeRdq8i7VpF3rSLvWkXetYq8axV51yryrlXkXavIu1aRd60i71pF3rWK vGsVedcq8q5V5F2ryLtWkXetIu9aRd61Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1 Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1Eme1EWe1EWe1EWe1EWe1EWe1EWe1 EWe1EWe1EWe1EWe1EWe1EWe1EWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWav EWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWavEWavIWZP9AWr6AtW0Resoi9Y RV+wir5gFX3BKvqCVfQFq+gLVtEXrKIvWEVfsIq+YBV9wSr6glX0BavoC1bRF6yiL1hFX7CKvmAV fcEq+oJN9AWb6As20Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv2ETetYm8axN51ybyrk3k XZvIuzaRd20i79pE3rWJvGsTedcm8q5N5F2byLs2kXdtIu/aRN61ibxrE3nXJvKuTeRdm8i7NpF3 bSLv2kTetYm8axN51ybyro04q404q404q404q404q404q404q404q404q404q404q404q404q404 q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404q404 q404q404q404q40we40we40we40we40we40we40we40we40we40we40we40we40we40we40we40w e40we40we40we40we40we40we40we40we50we50we50wex0xe6Iv2ERfsIm+YBN9wSb6gk30BZvo CzbRF2yiL9hEX7CJvmATfcEm+oJN9AWb6As20Rdsoi/YRF+wib5gE33BJvqCTfQFm+gLNtEXbKIv 2ERfsIm+YBN9wSb6gk30BZvoCzbRF2yiL9hEX7CJvmATfcEm8q5N5F2byLs2kXdtIu/aRN61ibxr E3nXJvKuTeRdm8i7NpF3bSLv2kTetYm8axN51ybyrk3kXZvIuzaRd20i79pE3rWJvGsTedcu8q5d 5F27yLt2kXftxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFnt xFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFntxFnt xFnthNnrhNnrhNnrhNnrhNnrhNnrhNnrhNnrhNnrhNnrBL/rBL/rBL/rBL/rBL/rBL/rhKTrhKTr hKTrhKTrhKTrhKTrhKTrhKTrhKTrhKTrosXXRYuvixZfFy2+Llp8XbT4umjxddHi66LF10WLr4sW Xxctvi5afF20+Lpo8XXR4uuixddFi6+LFl8XLb4uWnxdtPi6aPF10eLrosXXRYuvixZfFy2+Llp8 XbT4umjxddHi66LF10WLr4sWXxctvi5SqF2kULtIoXaRQu0ihdpFCrWLFGoXKdQuUqhdpFC7SI52 kRztIjnaRXK0i+RoF8nRLtKeXaQ9u0h7dpH27CLt2UXas4u0Zxdpzy7Snt2jPesEhtkKOu+draDz 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 iJJUiJJUmJJUFvnELPKJReQTi3flxt2h8XJ9t+6v/+s/P/z9xx9efv7XP//y8dPL63++Xsn+S3i7 cJfruf/4+OnXH6//0LtPPv9vf/vl0z8//Lb+h28+8/5/tW7/V+tmxradsW1m7NsZ+2bGsZ1xbGac 2xnnxqc39/6r5XX3v/r5yfczpu2M6f1/x+dn3v+v5u3/at7MWLYzlo1/R9n8r26v4bKxhsvmGi7b a7hsruGyvYbL5hou22u4bK7hsr2Gy+YaLttruGyuz9hen7G5PmN7fcbm2ovttRebay+2115srqvY XlexuWZie83E5pqJ7TUTm2smttdMbK6Z2F4zsblmYnvNxOaaqdtrpm6umbq9Zurmmqnba6Zurpm6 vWbq5pqp22umbq6Zur1m6uaaqdtrpm6umbq9Zurmmqnba6Zurpm6vWbq5ppp22umba6Ztr1m2uaa adtrpm2umba9Ztrmmmnba6Ztrpm2vWba5ppp22umba6Ztr1m2uaaadtrpm2umba9ZtrG/qptrqu+ va765rrq2+uqb+yv+uba69trr2+uvb699vrm2uvba69vrr2+vfY+P/nnv+vN9dm312ffXJ99e332 zfXZt9dn31yffXt99s21N7bX3thce2N77Y3NdTW219XYXFdje12NzXU1ttfV2FxXY3tdjc01M7bX zNhcM2N7zYzNNTO218zYXDNje82MzTUzt9fM3Fwzc3vNzM01M7fXzNxcM3N7zczNNTO318zcXDNz e83MzTUzt9fM3Fwzc3vNzM01M7fXzOcn//Qv8NxcV3N7Xc29dXUdX+1lfHvy/Yy76+rtyfcz7q6r tyffz7i7rt6efD/j7rp6e/L9jLvr6u3J9zPurqu3J9/PuLuu3p58P+Puunp78v2Mu2vm7cl3M6bt NZM210zaXjNpc82k7TWTNtdM2l4zaXPNpO01kzbXTNpeM2lzzaTtNZM210zaXjNpc82k7TWTNtdM 2l4zaXPN5O01kzfXTN5eM3lzzeTtNZM310zeXjN5c81ssxRlk5Mo25xE2eQkyjYnUTY5ibLNSZRN TqJscxJlk5Mo25xE2WQgyjYDUTYZiLLNQJRNvqFs8w1lk28o23xD2WQXyja7UDa5hLLNJbw9+Wdv /2WTXSjb7ELZZBfKNrtQNtmFss0ulE12oWyzC29P/vnvenPtbfMNZZNvKNt8w9uTf/rv2GQgyjYD UTYZiLLNQJRNBqJsMxBlk4Eo2wxE2WQgyjYD8fbkn396m+tzm5Mom5xE2eYkyiYnUbY5ibLJSZRt TqJschJlm5MoYGTOIDM0BpmhMcgMjUFmaAwyQ2OQGRqDzNAYZIbGyGCGxiAzNAaZoTHIDI1BZmgM MkNjkBkag8zQGGSGxiAzNAaZoTHIDI1BZmgMMkNjkBkag8zQGGSGxiAzNAaZoTHIDI1BZmgMMkNj kBkag8zQGAXc1zIKuK9lFHBfyyjgvpZRwH0to4D7WkYB97WMAu5rGQXc1zIKuK9lFHBfyyjgvpZR wH0to4D7WkYB97WMAu5rGQXc1zIKuK9lFHBfyyjgvpZRwH0to4D7WkYB97WMAu5rGQXc1zIKuK9l FHBfyyjgvpZRwH0to4D7WkYB97WMAu5rGeJMhiHOZBjiTIYhzmQY4kyGIc5kGOJMhiHOZLj3fV4u zdEd4kyGIc5kGOJMhiHOZBjiTIYhzmQY4kyGIc5kGOJMhiHOZBjiTIYhzmQY4kyGIc5kGOJMhiHO ZBjiTIYhzmQY4kyGIc5kGOJMhvEnMxlQf8DL5dV98e6fupsMXi6v7ot3/9TdqfByiXXv3T91tzu8 XGLde/dP3T0TL5dY9979U3fjRcvl3T91t2m8XGLde/dP3b0eL5dY9979U3fDyMsl1r13/9TddfJy iXXv3T91t668XGLde/dPjQLuKx4F3Fc8CriveBRwX/G4sCgQRDqi4DaqUcBtVKOA26hGAbdRjQJu oxoXAwSCSEWAK6xGAVdYDcTjlEoqAtx7tYJIRYB7r1YQqQhw79UKIhUB7r0aBdx7tYJIRYB7r1YQ qQhw79UKIhUB7r1aQaQiwL1XK4hUBLj3agWRiiDMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHM XiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXiHMXkHMnnd/ 772t8nKJfQPv/t57b+blEvsG3l1f9wbPyyX2Dby7vu5dopdLrHvv3rB7q6nl8u4NuzemXi6x7r07 yO7drZdLrHvvDrJ7i+zlEuveu4Ps3md7ucS69+4guzfrXi6x7r07yO4dv5dLrHvvDrK7baDl8u4g u5sMXi6x7kXetYi8axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsRedci8q5F5F2LyLsWkXctIu9a RN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWkTetYi8axF51yDHR0GOj4IcHwU5PgpyfBTk+CjISVCQ k6AgJ0FBToKCnAQFOQkKchIU5CQoyElQkJOgICdBQU6CgpwEBTkJCnISFOQkKMhJUJCToCAnQUFO goKcBAU5CQpyEhTkJCjISVCQk6AgJ0FBToIqmd5QyfSGSqY3VDK9oZLpDZVMb6hkekMl0xsqmd5Q yfSGSqY3VDK9oZLpDZVMb6hkekMl0xsqmd5QyfSGSqY3VDK9oZLpDZVMb6hkekMl0xsqmd5QyfSG SqY3VDK9IcTOeYid8xA75yF2zkPsnIfYOQ+x2x1itzvEbneI3e4Qu90hdrtD7HaH2O0OsdsdYrc7 xG53iN3uELvdIXa7Q+x2h9jtDrHbHWK3O8Rud4jd7hC73SF2u0PsdofY7Q6x2x1itzvEbneI3e4q Tneo4nSHKk53qOJ0hypOd6jidIcqTneo4nSHKk53qOJ0hypOd6jidIcqTneo4nSHKk53qOJ0hypO d6jidIcqTneo4nSHKk53qOJ0hypOd6jidIcqTneo4nSHKk53qOJ0h0qmhFYyJbSSKaGVTAmtZEpo JVNCK5kSWsmU0EqmJFQyJaGSKQmVTEmoZEpCJVMSKpmSUMmUhEqmJFQyJaGSKQmVTEmoZEpCJVMS KpmSUMmUhEqmJFQyJaGSKQmVTEmoZEpCJVMSKpmSUMmUhEqmJFQyJaGSKQmVTEmoZEpCJZhbJZhb JZhbJZhbJZhbJZhbJVMSKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHjKmHj KmHjKmHjKmHjKmHjKmHjKmHjqjgdr4rT8ao4Ha+K0/GqOB2vitPxqjgdr4rT8ao43aGK0x2qON2h itMdqjjdoYrTHao43aGK0x2qON2hitMdqjjdoYrTHao43aGK0x2qON2hitMdqjjdoYrTHao43aGK 0x2qON2hitMdqjjdoYrTHao43aGK0x2qON2hitMdqjjdoYqMahUZ1SoyqlVkVKvIqFaRUa3idIcq 8q5V5F2ryLtWkXetIu9aRd61irxrFXnXKvKuVeRdq8i7VpF3rSLvWkXetYq8axV51yryrlXkXavI u1aRd63EDa3EDa3EDa3EDa3EDa3EDa3EDa3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3E DW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW3EDW2E 2WuE2WuE2WuE2WuE2WuE2WsEv2sEv2sEv2sEv2sEv2sEv2sEv2sEv2sEv2sEv2sEv2sEv2sEv2sE v2sEv2sEv2sEv2sEv2sEv2sEv2sIvxPVvyqqf1VU/6qo/lVR/aui+ldF9a+K6l8T1b8mqn9NVP+a qP41Uf1rovrXRPWviepfE9W/Jqp/TVT/mqj+NVH9a6L610T1r4nqXxPVvyaqf01U/5qo/jVR/Wui +tdE9a+J6l8T1b8mqn9NVP+aqP41EV1tIrraRHS1iehqE9HVJqKrTcRNm4ibNhE3bSJu2kTctIm4 aRNx0ybipk3ETZuImzYRN20ibtpE3LSJuGkTcdMm4qZNxE2biJs2ETdtIm7aNNx07bbPj3yuoOOO 3xV03PG7go47flfQccfvCjru+F1Bxz3gK+i4B3wFHfeAr6DjHvAKOj/yuYJIRZwf+VxB5MM9P/K5 gsiHe37kcwWRD/f8yGcFnR/5XEHkwz0/vbmCyId7fnpzBZEP9/z05goiH+756c0KOj+9uYLIh3t+ enMFkYo4P725gkhFnA9PuIJIRZwPT7iCSEWcD0+4gkhFnA9PuIJIRZwPT7iCSEWcD0+4gkhFnA9P uIJIRZwPT7iCSEWcD0+4gkhFnA9PuIJIRZwPT7iCSEWcD0+4gkhFnA9PuIJIRZwPT7iC0A7A2p0+ mx0vl7U7fbZGXi5rd/pspLxcVlfm2XZ5uayuzLNJ03JpnfNnS+flEuteG9Tw7Au9XGKtap3zZ3Pp 5RJrVeucPztUL5f4vap1u59trpdLrFWt2/3slb1cYq1q3e5nw+3lEr9XtW73s2v3col1rw1XeLb+ Xi6x7rXhCk//wMsl1r02XOFpQni5xLrXhis8nQwvl1j32nCFpx2i5dKGKzzNEy+XWPfacIWnA+Pl EuteG67wtHG8XGLda8MVnl6Ql0use224wtNQ8nKRzuP5kM4riHQez4d0XkGk83g+pHMFnQ/pvIJI 5/F8SMEVRDqP50MKriBSEedDCq4gUhHnQwquIFARcT6k4AoCFRHnQwquIFARcT6k4AoCFRHnQwqu IFARcT6k4AoiFXE+pOAKIhVxPqTgCiIVcT6k4AoiFXE+pOAKIhVxPqTgCiIVQYi1IMRaEGItCLEW hFgLQqwFIdaCEGtBiLUgxFoQYi0IsRaEWIvzIQVXEKkIgrkFwdyCYG5BMLcgmFsQzC0I5hbnkw2u IFIRhI0LwsYFYeMCsXHacLpnW+XlEvsG2nC6Z2/m5RL7BtpwumeD5+US+wbaRIZnl+jlEutem8jw bDW9XGLdaxMZnv2ql8ur+9AmMjybXi+XV/ehTWR4ds5eLq/uQ5vI8Gy/tVzaRIZns+7lEutem8jw 7Pi9XGLdaxMZnraBl0use20iw9N78HKJdS9ypSFypSFypSFypSFypSFypSFypSFypSFypSFypSFy pfH9iQzX//WfH/7+4w8v/9PL639+/Fj/9pfysa/o3yd4+Z//+uG3Dy9/++XTP/6Xl7/88y+/vfzl p19++MdLHvP1dYzXWu5cXx76Rop/e36Cf//wHx9ffvjp44dPH//qdJO835O4DkVmNkRmNkRmNkRm NkRmNkRmNrRpE09zzMsl1r3I34bI34bI3wZxVYO4qkFc1SCuahBXNYirGsRVDeKqBnFVg2inQQzS IDJoEK8ziKIZxLYMIk4GESeDiJNBxMkg4mQQcTKIOBlEnAwiTgYRJ4OIk0HEySDiZBBxMgjQFgRo CwK0BQHaggBtQYC2IEBbEKAtCNAWBGgLArQFAdqCAG1BgLYgQFsQoK0SoK0SoK0SoK0SNq0SNq0S Nq0SNq0SNq0SNq0SNq0iNk304kL04kL04kL04kL04kL04kL04kL04kL04kJ02UL0z0J0xkL0vEJ0 s0L0qUJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJ0oEJk+EJk+EJk+EJk +EJk+EJk+EJk+EJk+EJk+EJk+EJk+EJk+EJk+EJk+EJk+EJk+KrI8FWR4asiw1dF7q6K3F0Vubsq cndV5O6qyN1Vkbur3+fuvvIOP//rn3/5+Onl9T9fr2T/JTxfoxuu5/7j46dff7z+Q+8++X7GuZ1x 7mVcW5jNjJ+ffD9j2s6YNjPm7Yx5M2PZzlg2M8Z2xtjMWLcz1s2MbTtj28zYtzP2zYzba6Zvrpm+ vWb65poZ22tmbK6Zsb1mxuaaGdtrZmyumbG9Zsbmmhnba2ZsrpmxvWbG5poZ22tmbK6Zsb1mxuaa GdtrZmyumbG9Zsbmmpnba2Zurpm5vWbm5pqZ22tmbq6Zub1m5uaamdtrZm6umbm9Zubmmpnba2Zu rpm5vWbm5pqZ22tmbq6Zub1m5t6audSpvYxvT76fcXfNvD35fsbdNfP25PsZd9fM25PvZ9xdM29P vp9xd828Pfl+xt018/bk+xl318zbk+9n3F0zb0++n3F3zbw9+W7GtL1m0uaaSdtrJm2umbS9ZtLm mknbayZtrpm0vWbS5ppJ22smba6ZtL1m0uaaSdtrJm2umbS9ZtLmmknbayZtrpm8vWby5prJ22sm b66ZvL1m8uaaydtrJm+umby9ZvLmmsnbayZvrpm8vWby5prJ22smb66ZvL1m8uaaydtrJm+umbK9 Zsrmminba6ZsrpmyvWbK5pop22umbK6Zsr1myuaaKdtrpmyumbK9Zsrmminba6ZsrpmyvWbK5pop 22umbK6Z2F4zsblmYnvNxOaaie01E5trJrbXTGyumdheM7G5ZmJ7zcTmmontNRObaya210xsrpnY XjOxuWZie83E5pqp22umbq6Zur1m6uaaqdtrpm6umbq9Zurmmqnba6Zurpm6vWbq5pqp22umbq6Z ur1m6uaaqdtrpm6umbq9Zurmmmnba6Ztrpm2vWba5ppp22umba6Ztr1m2uaaadtrpm2umba9Ztrm mmnba6Ztrpm2vWba5prZ5gBikwOIbQ4gNjmA2OYAYpMDiG0OIDY5gNjmAGKTA4htDiA2OYDY5gBi kwOIbQ4gNjmA2OYAYpMDiG0OIDY5gNjmAGKTA4htDiA2OYDY5gBikwOIbQ4gNjmA2OYAYpMDiG0O IDY5gNjmAGKTA4htDiA2OYDY5gBikwOIbQ4gNjmA2OYAYpMDiG0OIDY5gNjmAGKTA4htDiA2OYDY 5gBikwOIbQ4gNjmA2OYAYpMDiG0OgKjLQebsB5mzH2TOfpA5+0Hm7AeZsx9kzn6QOftB5uwHmbMf ZM5+kDn7QebsB5mzH2TOfpCR+UGGnAUZmR9kZH6QkflBRuYHGZkfZGR+kJH5QUbmBxmZH2RkfpCR +UFG5geZfh9k2laQaVtBpm0FmbYVZNpWkGlbQQZnBRmcFVf7EASRD7eSDxeM6IqrlQeCyIfbyIcL hoHF1VYDQaQiGqkIMHYsrhbXeRCYVRZkVlmQWWVBZpUFmVUWZFZZkFllQWaVBZlVFmRWWYiDvkMc 9B3ioO8QB32HOOg7xEHfIQ76DnHQd4iDvkMc9B3ioO8QB32HOOg7xEHf8SeDvq//69egZ67103b5 n15eV5LP/0+v12Drl+9lT//2wy+fPv3rv//25ekV+P2H/x/PT/J//evnfzwB//bzLy//28vHn3+7 /kn/w3/na9D1yHvP/PdPv/zlp4//fPm/f/zt3//LAz/88vNvK/DXl/9xLvcd8udzuYPcJxfi/PL4 k/nlaCvt5RKXszcvPMR54SHOCw9xXniI88JDnBce4rzwEOeFhzgvPMR54SHO+A5xlmCIswRDnCUY 4izBEGcJhjhLMMT5fyHO/7u7JV4usVarWKveXMK7E+PlEmu1ibXqzUu8uzxeLrHum1j33hzHu4Ok 5fJmQoY4EzLEmZAhzoQMcSZkiDMhQ5wJGeJMyBBnQoY4E7KRdnQj7ehG2tGNtKMbaUc30o5upB3d SDu6kXZ0I+3oRtrRjXSW2xsC+Py//e2XT//88Nvv+hON9IQbub+ikfsrGrm/opH7Kxq5v6KRqyga uVWikVslGrlVopFbJRq5VaKRWyUaoawauSCikQsiGrkgopELIhq5IKKRCyJWEPicyF0Pjdz10Mhd D43c9dDIXQ+N3PWwgsB6qol8Tgl879VEPlyAOq4g8uEC1HEFkQ8XoI4riCxCgDquIFIRAHVcQaQi AOq4gtArq7adamIboYlthCa2EZrYRmhiG6GJbYQmthGa2EZoYhuhiW2E9idb/9899vLf7v/lx/+8 jkRffv3tw6fffvz5758Pbj8D9CW/1jLrev5/ffnlb3+7/uuv9xHv+i9fD//8RP96H8T+/se4T5S/ cxXy/cCfH7l+zfHlH0pOpdvVwNg9lb4fPj2VvoPeOZW+nzk7lb5D3v0Vka/Z73dhdjai7/5IcK+q rYDvX8rxu8d2VkDk/Dpa7S2froDPktv3V8B4Dzrgu/Gtf3/e+venlmaU1Mfxvz+/9+/P7//7YWNh 699f9v796+k6ykzH//4/vwz+fuDdfz/skWz9+2Ov/mMV//oV9ON/f7z374/3//2w3UMYp/9Mf/mw +RdlnPxFGeQvytj4izLO/6KM9/+igCtYm3jnTfuTO29+99jWC0wps/cSvR6X73yvfN//U0jbgTv/ /vm69+9PpbfXOo9f4D4brN//968H3vv3087m1r9/6893yWOUUl9fj7++53t/vuf7f75pk3br37/1 57usrfgo6+/ocf3P9/58z/f/fNN+89a/f+vPd2nx2nqkcvz6Mt/78z3f//NNW+fad6l3V1QT74pq 4l1RTbwrqol3RbU/uyvqv9bUp49//9dPHz79Ljavgvrw4z9/ffnXr6uonpKO9SLe+0hb9Vs/Tyz/ +Y799SV/64m3n+/Tx+uf89svL8933pekJ0Hff6+qf031tb2WvZer6wfffrm6Hj5+ubqC3nu5up45 fLm6Qt75QiCXeN8HOxtfiOuxrS/E+bq+DGcf5fALsb6+84V4PfDuv7/87mfe3IOk8pr7Wp3HP/M7 e5DrgXd/ZtJo//4lar97bO8zm+sja32e9iDq5wH+f/Lvr+//++ERofdF6v3hES9+a+LFb+1PLn57 Z8861qtt3fxmTft6zv3w+TdrelfPuZ85/WZN775qX4+A37p3HnAd63q5vPOA6xDYyyWu6j+xTN99 PUr9G69HOY2U1gvSWpZb342fL0F4e0FK33riD+86r//jC9JuEPj1iF9Unjh7H6V7ubyjvfon4uy7 5ZS/9bad83VL332d81Y55fxeOeU/vjq/X07fDAK/HvHbyXOBbyDByyV+O33fBb7+r78bR1ZHxJXv f8zwnXl2/XtP/tm5W/32XRH5Yxt/TPedsXd/u//PX9L3Av78v//NCXkfyu/nq7X6vbslSvneo3/6 H967gGI9951BevmPv6D16O/+5/Ve8evL//F/3h/xXRx/+ddaaf/+8dPHlx9/XWVy/e/++vE/fvzh 47d+mPRD+uGP/5HvjOH7RqV8fvTPfw3fnNWXX7/xi/jOtL7n4//bdwPe/w1vDu27n/zd//z/i1/w dyb+lW984M+j//PPH//+4bcf/+Pj//Ly64//748v/620UV7ba6+z1NJSHrV+L/b930773b+5rX/W by+f1j/1x9/++eG//9vffvzp4x+/fu7/198n+sZ/8IcfPn5j/XxnCOfzSf/wjV9E36i0b87r/ND+ Mv+Y7jtfcZ//+3/9XsCf//e/+U33l9r+9sd03/mma9/4UTe+4759E8gP5W/5D+m+dxlIfPfRPxRf L6OVtWtYdfda2yq91z/+1N++SSR/XE/84dHNQaJfnvzTX8W3LxxJP3zjR9wcN3o/+bv/+eBb4fwv +LdvOPnrD69/+eNPtjng9MuTf/gwc50XJXLdmdzGWDuR8cc/83sXpKzntr9nPz/5jZ+mpJnS+qOd crrEsvnHP/rfvlzlrz/89Y/ftLv3q3x58o8/ULT1Lp3KfG2pry/b8Y2/W9++m+Wvf/3rN5bU5jjj L09+6wfKLc/rftS1X+xzfXbfi/3jD/SN39DmNOQvT37jB6pzrO++sv6kR3mNXr7xkX3zm/nbP9Dm MOUvT37zB8q9t9FXJZW4fk/fi/3dD9T+9pdvFP/mLOYvT/4uacnlj5/Q966X+caPWjdeNffuoFnP bX/VfvsOmvJa/vgL+t41NPmPX/V1431x766a9dz2V9+376qZH/744Pb3V/3O99f68npd72WvY/0B XIVXZv5u7O9r7xs/zva3195NN+u57a+fvZtu1nPb3x/fvumml298oe5edvPlyfd/zO1FvHfZTau7 l918efL9jNuLc++ym/Xc9hvO3mU367ntRbd32c16bnvN7V12s57bXjZ7l92s57aXzd5lN+u57WWz d9nNem57zexddrOe214ze5fdtLp72c2XJ9/PuL1m9i67Wc9tr5m9y27Wc9trZu+ym/Xc9prZu+xm Pbe9ZvYuu7mw8+2Mm2tm97KbL0++n3F7zexddrOe214ze5fdtLp72c2XJ9/PuL1m9i67Wc9tr5m9 y24u8G874+aa2b3s5suT72fcXjN7l92s57bXzN5lN+u57TWzd9nNem57zexddrOe214ze5fdtLp7 2c2XJ9/PuL1mADg7iI09iI09iI09iI09iI09iI09iI09iI09iI09iI09iI09iI09iI09iFg9iFg9 KrhDZlRwh8yo4A6ZUcFs3VHBxTOjgotnRgUXz4wKLp4ZFVw8Myq4eOZqNZIgUhHg4plRwcUzo4KL Z0YFF8+MCi6eGRVcPDOuLjQIIhUBbqsZFdxWcx11kSBSEeDimXG1FkEQ+XDBbTWjgttqRgW31YwK bqsZFdxWMyq4rWZUcFvNqOC2mlHBeMBRwXjAUcF4wFHBeMBRwXjAUcF4wFHBeMBRwXjAUcF4wFHB eMBRwXjAUcFtNUNklIfIKA+RUR4iozxERnn8GaNM9ldeLg3oHSLQO0Sgd/wZ0Eu2dF6u79b99X99 Mx++51Ws+LrCP/x6/4/9tY7y//yc7TNlzPaR3j9PLHnvEpx7M6rl+v4lOGjr6uUSS967Lebe/3q5 xK9677aYexPt5RLr3rst5t6Je7nEuvdui7m3814use6922LunoCXS6x77+aZu7Gg5fJunrnbEF4u sVarWKvezTN3i8PLJdaqd/PM3SfRcnk3z9xdFS+X+B3t3Txzt2a8XGLdeyNj7/6Ol0use29k7N0k 8nKJde+NjL07TV4use61m2fWfva8/XsFHTf7rqDjZt8VdNzsu4KOm31X0HGz7wo6bv9eQcft3yvo uP17BR23f1fQefv3CiIf7nkn9woiH+75RS9XEPmczq8Qv4LI53R+XcwVRD6n86meVxBZT+c3v1xB 5HM6vy7mCiKf0/lQxSuIfMOej++7gsginKQizu+YuYJIRZzfMXMFkYo4v2OmX6YMCQIV0c7nl11B oCLa+dStKwhURDu/zeYKAh9uO7+YZgWdX0xzBZEP95yfvILIh3vOT15B5MM95yevILDc2zk/eQWR ijjnJ68gUhHn/OQVhF6xre3fs5vwclnbv2fv4eWytn/PTsXLZbU9nn2Nl8tqezy7IC2X1vZ49kxe LrFWtVbFs/Hycon1pV1s++zetFzavSrPXs/LJdbEEL+/vn93BNpHernE+vr+BQtoM+rlEv9uf3+I PtrRernEutcGxT/bYi+XWPfaoPhnb23latqg+Gcn7uXy6r59f+442s57uby6b9qc6qcn4OUSa/X7 s6VRY8HLJdaqRjY/3Qkvl1irGtn8tDi8XGLda2Tz0yfxcol1r5HNT7Nlf07t7zzrnq+vrB0j++uT 72fc89C/PvluxrTnoX998v2Mex761yffz7g3u+Hrk+9n3Jvd8PXJ9zPuzW74+uT7GfdmN3x98v2M e7Mbvj75fsa92Q1fn3w/4/aaSZtrJm2vmbS5ZvL2msmbayZvr5m8uWby9prJm2smb6+ZvLlm8vaa yZtrJm+vmby5ZvL2msmbayZvr5m8uWa+Nwz9u0++n3F7zXx7dPkfn/ve4PLvPvl+xu01UzbXzPem in/3yfczbq+ZrTnh13Pba6Zsrpnvjfr+7pPvZ9xeM98ex/2N57bXzLcHbH/jue018+2R2d94bnvN fHsU9h+f+94c7O8++X7G7TXz7RnV33hue818e2T0N57bXjNbM5+v57bXzLfnNn/jue018+3By994 bnvNfHty8jee214z3x59/I3nttfMt2cXf+O57TXz7cHFf3zue1OLv/vk+xm318y3BxJ/47ntNbM1 aPh6bnvNfHvQ8Dee214z354V/I3nttfM1qjg67ntNbM1Kvh6bnvNfHtU8Dee214zW3OCr+e218zW nOD13Oac4K9Pvp9xe81szQm+ntteM1tzgq/nttfM1pzg67ntNbM1J/h6bnvNbM0Jvp7bXjNbc4Kv 57bXzNac4Ou57TWzNSf4em57zWzNCV7Pbc4J/vrk+xm318zWnODrue01szUn+Hpue81szQm+ntte M1tzgq/nttfM1pzg67ntNbM1J/h6bnvNbM0Jvp7bXjNbc4Kv57bXzNac4PXc5pzgr0++n3F7zWzN Cb6e214zW3OCr+e218zWnODrue01szUn+Hpue81szQm+ntteM1tzgq/nttfM1pzg67ntNbM1J/h6 bnvNbM0JXs9tzgn++uT7GbfXzNxcM3N7zczNNTO318zcXDNze83MzTUzt9fM3Fwzc3vNzM01M7fX zNxcM3N7zczNNTO318zcWzP9dXfNvD35fsbdNfP25PsZd9fM25PvZ9xdM29Pvp9xd828Pfl+xt01 8/bk+xl318zbk+9n3F0zb0++n3F3zfRNDqBvcwB9kwPo2xxA3+QA+jYH0Dc5gL7NAfRNDqBvcwB9 kwPo2xxA3+QA+jYH0Dc5gL7NAfRNDqBvcwB9kwPo2xxA3+QA+jYH0Dc5gL7NAfRNDqBvcwB9kwPo 2xxA3+QA+jYH0Dc5gL7NAfRNDqBvcwB9kwPo2xxA3+QA+jYH0Dc5gL7NAfRNDqBvcwB9kwPo2xxA 3+QA+jYH0Dc5gL7NAfRNDqBvcwB9kwPo2xxA3+QA+jYH0M8vX+jRzqexX0HnrnC082nsV9C5KxwN jOOJBsbxRAPjeKKBcTzRwDieaGAcTzQwjicaGMcTDYzjiQbG8UQD43hWEKkIMMMnGpjhEw3M8Il2 Po39CiIVAQb/RAODf6KBwT/RwOCfuLrVIIhUxCAVAUYMRQMjhqKBEUPRwIihaGDEUDQwYigaGDEU DYwYigZGDEUDI4aigRFD0cCIoWhgxFA0MGIoGhgxFA2MGIoORgxFByOGooMRQ9HBiKHoYMRQdDBi KDoYMRRX7w4EgYroYC5RdDBiKDoYMRQdjBiKDkYMRQcjhqKDEUPRwYih6GDEUHQwYujeCkmK2r1D 8nJpquG9n9JyeeOL7t2Xl0tTDe+9mpdLU2zvnZ2XS6x7b3zRvT30col1740vuveYXi6x7r1RSPdG 1csl1r03Vune7Xq5xLr3xirdW2Yvl1j33oime9/t5RLr3hv3dG/evVxi3Xvjnu4OgJbLG/d09wu8 XGLde+Oe7qaDl0use2/c09258HKJde+Ne7rbH14ur+67N+7p7qF4uby67964p7sR4+Xy6r57o6Pu bo6Wyxv3dPd+vFxirf7JuKcPv314+dsvn/6xAl4+ffz7v3768On3sS8//PThx3/++vKvXz/+9eUv P/3ywz9eWn7tLV7XOv98peePP//95eeP//nbx59/+/XK94f//vXf/PkO/vUlfeuJtx/w08fr3/Pb Ly8PefAl6W4Qaol5v2lx9XkDrO6+mpfru6tvA3Fo20Br2wRa2zbQ2jaB1rYNtLZNoLVtA61tE2ht 20Br2wRa2zbQ2jaB1rYNtLZNoPX6/2xn3AKN2jbQ2jaB1rYNtLZNoLVtA61tE2ht20Br2wRa2zbQ 2jaB1rYNtLZNoLVtA61tE2ht20Br2wRa2zbQ2jaB1rYNtLZNoLVtA61tE2ht20Br2wRa2zbQ2jaB 1rYNtLZNoLVtA61tE2ht20Br2wRa2zbQ2jaB1rYNtLZNoLVtA61tE2ht20Br2wRa2zbQ2jaB1rYN tLZNoLVtA61tE2ht20Drlyffz7i9ZvYGW63nttfM3mCr9dz2mtkbbLWe214ze4OtWt8dbPXlyfcz bq+ZvcFW67ntNbM32Go9t71m9gZbree218zeYKv13Paa2RtstZ7bXjN7g63Wc9trZm+w1Xpue83s DbZaz22vmb3BVq3vDrb68uT7GbfXzN5gq/Xc9prZG2y1ntteM3uDrdZz22tmb7DVem57zewNtlrP ba+ZvcFW67ntNbM32Go9t71m9gZbree218zeYKvWdwdbfXny/Yzba2ZvsNV6bnvN7A22Ws9tr5m9 wVbrue01szfYaj23vWb2Blut57bXzN5gq/Xc9prZG2y1ntteM3uDrdZz22tmb7BV67uDrb48+X7G 7TWzN9hqPbe9ZvYGW63nttfM5yef/7e//fLpnx9+W//DN595/7+6va72hl+t57bX1d7wq/Xc9rra G361ntteV5+f/PPf9eba2x2Q9eXJ9zNur729AVmt7w7I+vLk+xm3197egKz13Pba+/zkn356e0O0 1nPb63NsrM+9QVvrue31uTdoaz23vT73Bm2t57bX5+cn//w3s7mGd4dxfXny/Yzb63NvGNd6bnt9 7g3jan13GNeXJ//0d703sGs9t72G9wZ2ree21/DewK713Pb63BvYtZ7bXnt7A7vWc9trb29g13pu e+3tDexaz22vq72BXeu57XW1N7BrPbe9rvYGdrWxO7Dry5PvZ9xdM2NvYNd6bnfNjL2BXeu53TUz 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 ucS691CAIaIAQ0QBhogCDBEFGCIKMEQUYIgowBBRgLsr4uXy6v7qoXi5vLrv3o2eQ8QwhohhDBHD GCKGMUQMY4gYxhAxjCFiGHcDycsl1r03lOTuQnm5xLoH4P0g4P0g4P0g4P0g4P0g4P0g4P0g4P0K Il1MQOuPDmb5rSBSEWCW3yAywQoiFQFm+a0gUhFglt8KIhUBZvmNDmb5rSBSEWCW3woiFQFm+a0g UhFglt8KIhUBZvmtIFIRYJbfCiIVAWb5rSBSEWCW3woiFUGQuQ5m+a0gUhGEs+uEs+uEs+uEs+uE s+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uEs+uE s+uEsxOx/yFi/0PE/oeI/Q8R+x8i9j9E7H+I2P+97/NyiX0Db0DkvXn0col1L2oS3RsQeW9MvVxi 3XsDIu/drZdLrHtvQOS9RfZyiXXvDYi899leLrHuvQGR92bdyyXWvTcg8t7xe7nEuvcGRN5tAy+X WPfegMi79+DlEute5F27yLt2kXftIu/aRd61i7xrF3nXLvKuXeRdu8i7dpF37SLv2kXetYu8axd5 1y7yrl3kXbvIu3aRd+0i79pF3rWLvGsXedcu8q5d5F27yLt24pl24pl24pl2oox2oox2oox2oox2 oox2oox2oox2oox2Yn92Yn92Yn8OYn8OYn8OYn8OYn8OYn8OYn8OInIO4mQO4mQO4mQO4mQO4mQO 4mQO4mQO4mQO4mQO4mQO4mQOwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcN wrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNwrcNxLeJbl0X3bouunVd9OG6 6MN10Yfrog/XRR+uiz5cF324LvpwXXTYuuiwddFhG6LDNkSHbYgO2xAdtiE6bEN02IbonQ3RFRui KzZEV2yIrtgQXbEhumJDdMWG6IoN0RUbois2RFdsiKzjEFnHIbKOQ2Qdh8g6DpF1HCLrOETWcYis 4xBZxyGyjkNkHYfIOg6RdRwi6zhE1nGIrOMQWcchso5DZB2HyDoOkXUcIus4RNZxiKzjEFnHIbKO Q2Md8yuYP3oFHfeorqDjHtUVdNyjuoKOu5ZX0HHXcgWdn3VdQcddyyvouGt5BR13La8gUhHnZ11X EKmI87OuK4hUxPlZ1wo6P+u6gkhFnJ91XUGkIs7Puq4gUhHnZ11XEKmI87OuK4hUxPlZ1xVEKuL8 rOsKIhVxftZ1BZGKOD/ruoJIRZyfdV1BpCLOz7quIFIR52ddVxCpiPOzriuIVMT5WdcVRCrifJbD FUQq4nyWwxVEKuJ8lsMVRCrifJbDFUQq4nyWwxVEKuJ8lsMVRCrifJbDFUQq4nyWwxVEKuJ8lsMV RCrifJbDFYT2GtZ+89lWebms/eazCfNyWX2WZ8um5dLOk54NnpfL6rM820Evl1j32nnSs6f0col1 r50nPRtTLZd2nvRsY71cYt1r50nPXtjLJda9dp70bKi9XGLda+dJz67cyyXWvXae9GztvVxi3Wvn SU9/wMsl1r12nvQ0GbRc2nnS05Lwcol1r50nPX0NL5dY99p50tMc8XKJda/Nzng6LF4use612RlP m8bLJda9Njvj6fV4ucS612ZnPA0jLZc2O+NpL3m5xLrXZmc8PSovl1j32uyMp9Hl5SId0fNZpivo fJbpFUQ6ouezTK8g0hE9n2V6BZGO6Pks0yuIdETPZ5leQaQizmeZXkGkIs5nmV5BpCLOZzlcQaQi zmc5XEGkIs4HQFxBpCLOB0BcQaQizgdAXEGkIs4HQFxBpCLO7wy/gkhFnE+NuIJARYCpEVcQqAgw NeIKAhUBpkZcQaAiBmH2wKiJKwhUBJhPsYIIswfmU1xBpCIIswfmU1xBpCIIswfmU1xBpCIIswfm U1xBpCIIswfmU1xBpCIIswfmU1xBpCIIswfmU6wgwuyB+RTP/snbi4l9A2324LMJ83KJfQNt9uCz k/NyiX0Dbfbgsx30col1r80efPaUXi6x7rXZg8/G1Msl1r02D+TZ3Xq5xLrXZos8W2QtlzZb5NlQ e7nEutdmizy7ci+XWPfaXdvP1t7LJda9Nqfk6Q94uby69+aUPE0GL5dX90PkXYfIu3ozT56+hpdL rHuRd/Xmpzw9Ey+XWPci7+rNT3n6MV4use5F3tWbn/L0erxcYt2LvKs3P+XpI3m5xLoXeVdvfsrT o/JyiXUv8q7e/JQrF+mIEmcVzGe9gkhHlDirYD7rFUQ6osRZBfNZryDSIyfOKpjPegWRiiD6KRi1 egWRD5fop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Pop4Po p4Pop4Pgd4Pgd4Pgd4Pgd4Pgd4Pgd4Pgd4Pgd4OQdIOQdIOQdINAcYNAcYNAcYPwbYPwbYOgaoOg aoOgaoOgaoOgaoOgaoOgaoOgat7YxWc34eUSt8uiJueNXXx2Kl4ucbssanLe2MVnF+TlEute1OS8 sYvPDsvLJdaqqLYNUW0boto2RLVtiGrbENW2IaptQ1Tbhqi2DVFtG6LaNkS1bYhq2xDVtiGqbUNU 24aotg1RbRui2jZEtW2IaOYQ0cwhoplDRDOHiGYOEc0cIpo5RDRziDjlEHHKIeKUQ0Qgh4hADhGB HCK2OERscYio4RBRwyGihkNEDYeIGg4RNRwiajg81DCTUaKZjBLNZJRoJqNEMxklmsko0UxGiWYy SjSTUaKZjBLNZJRoJqNEMxklmsko0UxGiWYySjSTUQqZjFLIZJRCJqMUMhmlkMkohUxGKWQySiGT UQqZjFLIZJRCJqMUMhmlkMnYgUzGDmQydiCTsQOZjB3IZOxAJmMHMhk7kMnYgUwmCGSi6Gei6Gei 6Gei6Gei6Gei6Gdi22di22di22cizmcizmcizmcizmcizmcizmdx0FsWB71lcdBbFge9ZXHQWxYH vWVx0FsWB71lcdBbFge9ZXHQWxYHvWVx0FsWB71lcdBbFge9ZXFQQRYHFWRxUEEWBxVkcVBBFgcV ZHFQQRYHFWRxUEEWBxVkcVBBFgcVZHFQQRbF+yyK91kU77Mo3mdRvM+ieJ9F8T6L4n0WxfssyvJZ FMmzKJJnUSTPokieRZE8iyJ5FuXvLMrfWZS/syhsZ1HYzqKwnUVhO4vCdhaF7SDdriDdriDdriDd riDdrhV03kUJ0iIL0iIL0iILMpAySF8tSF8tSF8tSF8tSF8tSF8tyEDKIAMpgwykDDKQMshAyiAD KYMMpAwykDLIQMogAymDDKQMMpAyyEDKIAMpgwykDDKQMoiQH0TIDyLkBxHygwj5QYT8IEJ+ECE/ iJAfRMgPIuQHEfKDCPkriFQEsPiDWPxBLP4gFn8Qiz+IxR/E4g9i8Qex+INY/EEs/iAWfxCLP4jF H8TiD2LxB7H4g1j8IfZZQuyzhNhnCbHPEmKf5d6yebm0nk2IPZsQezYhDuwLsf8TYv8nxP5PiP2f EPs/ofZ/vIF9IQ7sC3FgX4gD+0Ic2BfiwL4QB/aFOLAvxIF9IQ7sC3FgX4gD+0Ic2BfiwL4QB/aF OLAvxMkbIU7eCHHyRoiTN0KcvBHi5I0QJ2+EOHkjxMkbIU7eCHHyRoiTN0KcvHG3UrxcYt17UzxC nOIR4hSPEKd4hDjFI8QpHiFO8QhxikeIUzxCnOIR4hSPEKd4hDjFI8QpHiFO8QhxikeIUzyCTLEM MsUyyBTLIFMsg0yxDDLFMsgUyyBTLINMsQwyxTLIFMsgUyxXEKkIYD4GGX0ZZPRlDGA+BpmXGWRe ZpB5mSuIVASwOYMM2VxBpCKAzRlkMmeQyZxBJnMGmcwZZDJnkMmcQSZzriBSEeAS6RVEKgIYqjEJ szcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJszcJ szcJszcJszcJszcJszcJszcJszcJszcRs+d5nyFOQQxxCmKIUxBDnIIY4hTEEKcghjgFMcQpiCFO QQxxCmKIUxDvPaWXS6x7z/sMcaLivV/1col1701nDHE6470X9nKJde95sveG2ssl1r3nyYY4NTLE qZEhTo0McWpkiFMjQ5waefcHvFxi3XsXVN9NBivXFHnXKfKuU+Rdp8i7TpF3nSLvOkXedYq86xR5 1ynyrlPkXafIu06Rd50i7zpF3nWKvOsUedcp8q5T5F2nyLtOkXedIu86Rd51irzrFHnXKfKuU+Rd p8i7TuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKs TuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTuKsTsLs TcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLs TcLsTcLsTcLsTcLsTcLsTcLsTcLsTcLsTdEXnKIvOEVfcIq+4BR9wSn6glP0BafoC07RF5yiLzhF X3CKvuAUfcEp+oJT9AWn6AtO0Recoi84RV9wir7gFH3BKfqCU/QFp+gLTtEXnKIvOEVfcIq+4BR9 wSn6glP0BafoC07RF5yiLzhFX3CKvuAUedcp8q5T5F2nyLtOkXedIu86Rd51irzrFHnXKfKuU+Rd p8i7TpF3nSLvOkXedYq86xR51ynyrlPkXafIu06Rd50i7zpF3nWKvOsUedcp8q5T5F2nyLtO4qxO 4qxO4qxO4qxO4qxO4qxO4qxO4KzWV+CsrqDzjugKOq+IFXT+Oa2g889pBZ1/Tivo/HNaQeRzAibp CiKfEzBJV9D5yl1B5yt3BZGKACbpCiIVAUzS+gqk0BVEPlwgha4g8uECKXQFkQ8XSKEriHy4AIpb QeigSnxtFHWRKeoiU9RFpqiLTFEXmaIuMj1d5P6z7+XSXhvvlwQvl1Zf9yuFl0urr/sFxMsl1pen ZdxvMV4usb48LeN+FfJyiXXvaRn3+5SXS6x7T6W4X8q8XGKteirF/Wbn5RJr1VMp7tdDL5dZq9// jv7w24eXv/3y6R8r4OXTx7//66cPn/5rbJsjvfzw04cf//nry79+/fjXl7/89MsP/3hJrdTeR2vl 33745dP13/zx57+//PzxP3/7+PNvv14Jf5/k367/6M939K8v6VtPvP2Enz5e/6Dffnl5fWLeku4G nf56RgI45wo63xOtoPM90Qo63xOtoPM90Qo63xOtoPM90Qo63xOtoPM90UgA51xBpCIAzrmCSEUA nHMFkYoAOOcKIhUBcM4VRCoC4JwrCH1HaH/X7+8bL5f2d/3+dvJyaX/X7+8yL5f2d/3+5vNyaXuv +3vSyyXWvXcUen/ZernEuveOQu9vbC+XWPfeUej9ta/l8o5C7z8SVi4y6naQUbeDjLodZNTtIKNu Bxl1O8io20FG3Q4y6naQUbeDjLodZNTtIKNuBxl1O8io20FG3Q4y6naQUbeDjLodZNTtIKNuBxl1 O8io20FG3Q4y6naQUbeDjLodZNTtIKNuBxl1O8io20FG3Q4y6mOQUR+DjPoYZNTHIKM+Bhn1Mcio j0FGfQwy6mOQUR+DjPoYZNTHIKM+Bhn1Mcioj0FGfQwy6mOQUR+DjPoYZNTHIKM+Bhn1Mcioj0FG fQwy6mOQUR+DjPoYZNTHIKM+Bhn1Mcioj0FGfQxxFOgQR4EOcRToEEeBDnEU6BBHgQ5xFOgQR4EO cRToEEeBDnEU6BBHgQ5xFOgQR4EOcRToEEeBDnEU6BBHgQ5xFOgQR4EOcRToEEeBDnEU6BBHgQ5x FOgQR4EOcRToEEeBDnEU6BBHgQ5xFOgQR4EOcZTNEEfZDHGUzRBH2QxxlM0QR9kMcZTNEEfZDHGU zRBH2QxxlM0QR9kMcZTNEEfZDHGUzRBH2QxxlM0QR9kMcZTNEEfZDHGUzRBH2QxxlM0QR9kMcZTN EEfZDHGUzRBH2QxxlM0QR9kMcZTNEEfZDDLqdpBRt4OMuh1k1O0go24HGXU7yKjbQUbdDjLqdpBR t4OMuh1k1O0go24HGXU7yKjbQUbdDjLqdpBRt4OMuh1k1O0go24HGXU7yKjbQUbdDjLqdpBRt4OM uh1k1O0go24HGXU7yKjbQUbdDjLqY5BRH4OM+hhk1Mcgoz4GGfUxyKiPQUZ9TDLqY5JRH5OM+lhB 5xWxgs4rYpKhIpMMFZlkqMgkQ0UmGSoyyVCRSYaKTDJUZJKhIpMMFZlkqMgkQ0UmGSoyyVCRFUQq AjB7k0wimWQSySSTSIY4CnSIo0CHOAp0iKNAhzgKdIijQIc4CnSIo0CHOAp0iKNAhzgKdIijQIc4 CnSIo0CHOAp0iKNAhzgKdIijQIc4CnSIo0CHOAp0iKNAhzgKdIijQIc4CnSIo0CHOAp0iKNAhzgK dIijQIc4CnSIo0CHOMtsiLPMhjjLbIizzIY4y2yIs8yGOMtsiLPMpjjLbIqzzKY4y+xujni5tLqf 4oy1Kc5Ym+KMtSnOWJvijLUpzlib4oy1Kc5Ym+KMtSnOWJvijLUpzlib4oy1Kc5Yu5tRWi6Pd53i vLYpzmub4ry2SSbxTjKJd5JJvJNM4p1kEu8kk3jnK3BWVxDpiAJndQWRHjlwVlcQqQjgrK4gUhHA WV1BpCKAs7qCSEUAZ3UFkYoAzuoKIhUBnNUVRCoCOKsriFQEcFZXEKkI4KyuIFIRwFldQaQigLO6 gkhFAGd1BZGKAMzeCiIVAZi9FUQqAjB7K4hUBGD2VhCpCMDsrSBSEYDZW0GkIgCzt4JIRQBmbwWR igDM3goiFQGYvRVEKgIweyuIVARg9lYQqQjA7K0gUhGA2VtBaK8h9g08X3CK866nOO96ivOu55/N uyY7OS+X2DfwfMF7O+jlEuve8wXvPaWXS6x7zxe8N6ZaLs8XvLexXi6x7j1f8N4Le7nEuvd8wXtD 7eUS697zBe9duZdLrHvPF7y39l4use49X/DuD3i5xLr3fMG7yaDl8njXuyXh5RLr3uNd776Gl0us e493vZsjXi6x7j3e9e6weLnEuvd417tN4+US697jXe9ej5dLrHuPd70bRlouj3e920teLrHuPd71 7lF5ucS693jXu9Hl5SIdUeCszlfgrK4g0hEFzuoKIh1R4KyuINIRBc7qCiIdUeCsriBQEYk4q4k4 q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4q4k4 q4k4q4k4qwk4qyuIVARh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh 9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJh9hJi9jxf8N5Wabk8X/DehHm5xL6B5wve Ozkvl9g38HzBezvo5RLrXvQFk+gLJtEXTKIvmERfMIm+YBJ9wST6gkn0BZPoCybRF0yiL5hEXzCJ vmASfcEk+oJJ9AWT6Asm0RdMoi+YRF8wib5gEn3BJPqCSfQFk8i7JpF3TSLvmkTeNYm8axJ51yTy rknkXZPIuyaRd00i75pE3jWJvGsSedck8q5J5F2TyLsmkXdNIu+aRN41ibxrEnnXJPKuSeRdk8i7 JpF3TSLvmkTeNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFn NRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFnNRFn NRFnNRFmLxFmLxFmLxFmLxFmLxFmLxFmLxFmLxFmLxFmLxFmLxFmLxNmLxNmLxNmLxNmLxNmLxNm LxNmLxNmLxNmLxNmLxNmLxNmLxNmLxNmLxNmLyNmT/QFk+gLJtEXTKIvmERfMIm+YBJ9wST6gkn0 BZPoCybRF0yiL5hEXzCJvmASfcEk+oJJ9AWT6Asm0RdMoi+YRF8wib5gEn3BJPqCSfQFk+gLJtEX TKIvmERfMIm+YBJ9wST6gkn0BZPoCybRF0yiL5hE3jWJvGsSedck8q5J5F2TyLsmkXdNIu+aRN41 ibxrEnnXJPKuWeRds8i7ZpF3zSLvmkXeNYu8axZ51yzyrlnkXbPIu2aRd80i75pF3jWLvGsWedcs 8q6ZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZ OKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZOKuZMHuZ MHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZMHuZ MHuZMHuZMHuZMHuZMHuZMHuZMHuZMHtZ9AWz6Atm0RfMoi+YRV8wi75gFn3BLPqCWfQFs+gLZtEX zKIvmEVfMIu+YBZ9wSz6gln0BbPoC2bRF8yiL5hFXzCLvmAWfcEs+oJZ9AWz6Atm0RfMoi+YRV8w i75gFn3BLPqCWfQFs+gLZtEXzKIvmEXeNYu8axZ51yzyrlnkXbPIu2aRd80i75pF3jWLvGsWedcs 8q5Z5F2zyLtmkXfNIu+aRd41i7xrFnnXLPKuWeRds8i7ZpF3zSLvmkXeNYu8axZ51yzyrpk4q5k4 q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q5k4q4U4 q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4U4q4Uwe4Uwe4Uwe4Uw e4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uwe4Uw e4Uwe4Uwe4Uwe4UwewUxe6IvmEVfMIu+YBZ9wSz6gln0BbPoC2bRF8yiL5hFXzCLvmAWfcEs+oJZ 9AWz6Atm0RfMoi+YRV8wi75gFn3BIvqCRfQFi+gLFtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxbR FyyiL1hEX7CIvmARfcEi8q5F5F2LyLsWkXctIu9aRN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWkTe tYi8axF51yLyrkXkXYvIuxaRdy0i71pE3rWIvGsRedci8q5F5F2LyLsWkXctxFktxFktxFktxFkt xFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFkt xFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFktxFkthNkrhNkrhNkrhNkrhNkrhNkr hNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkrhNkLwuwFYfaCMHtBmL0gzF4Q Zi8IsxeI2RN9wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi+oJF9AWL6AsW0Rcsoi9YRF+wiL5g EX3BIvqCRfQFi+gLFtEXLKIvWERfsIi+YBF9wSL6gkX0BYvoCxbRFyyiL1hEX7CIvmARfcEi+oJF 9AWL6AsWkXctIu9aRN61iLxrEXnXIvKuReRdi8i7FpF3LSLvWkTetYi8axF51yLyrkXkXYvIuxaR dy0i71pE3rWIvGuIvGuIvGuIvGuIvGuIvGuIvGuIvGuIvGsQZzWIsxrEWQ3irAZxVoM4q0Gc1SDO ahBnNYizGsRZDeKsBnFWgzirQZzVIM5qEGc1iLMaxFkN4qwGcVaDOKtBnNUgzmoQZzWIsxpEPw2i nwbRT4Pop0H00yD6aRD9NIh+GkQ/DYLfBcHvguB3QfC7IPhdEPwuCH4XBL8Lgt8Fwe+C4HdB8Lsg +F0Q/C4IfhcEvwuC3wXB74Lgd0HwuyD4XRD8Lgh+FwS/C4LfBcHvguB3QfC7ENW/ENW/ENW/ENW/ ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ENW/ ENW/ENW/ENW/EHW9EHW9EHW9EHW9EHW9EHW9EHW9EHW9EHW9EHHTEHHTEHHTEHHTEHHTEHHTEHHT EHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHTEHHT EHHTEHHTIMpoEGU0iDIaRBkNoowGUUaDKKNBlNEgymgQZTSIMhrEyQziZAZxMoM4mUGczCBOZhAn M4iTGcTJDOJkBnEygziZQZzMIE5mJU5mJU5mJU5mJU5mJU5mJU5mJU5mJU5mJUxaJUxaJUxaJUxa JUxaJUxaJUxaJUxaJUxaJUxaJUxaJUxaJUxaJUxaJUxaJXhZJXhZJXhZJXhZJXhZJXhZJXhZJXhZ JXhZJXhZJVciVMSkiWpbiGpbiGpbiGpbiGpbiGpbiGpbiGpbiGpbiGpbiGpbiNpXiNpXiNpXiNpX iNpXiNpXiNpXiNpXiNpXiNpXiNpXiNpXiNpXiNpXFbWvKmpfVdS+qqh9VVH7qqL2VUXtq4raVxVZ xyqyjlVkHavIOlaRdawi61hF1rGKrGMVWccqso5VZB2ryDpWkXWsIutYRdaxinxiFfnEKvKJVeQT q8gnVpFPrCKfWEU+sYp8YhX5xCpeTVA11rG8znN37Qo67hxdQce9xCvouC14BR23BVfQuYZ2BR23 Ba+g47bgFXTcFryCyId7rqFdQeTDPdfQriBSEeca2go619CuIFIR5xraFUQq4lxDu4LIh3tulF1B 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 XVxBpCsHBhMVMFM+CkErC0ErC0ErC0ErC0ErC0ErC0ErC0ErC0ErC0ErC0ErC0ErC5hefwWRigDT jAqYXn8FkYoA04xWEKkIMM2ogDn5VxCpCDDNqIA5+VcQqQgwzaiA4fpXEKkIMM1oBZGKANOMVhCp CIJLFYJLFTDNaAWRiiCMVSGMVSGMVSGMVSG4VDm/6f0KIp8TYawKGEy0gsjnRMCsQsCsQsCsQsCs QsCsQhirQhirQhirQhirghgrDwG/tyBeLnGP7Y3GKSLmXkTMvYiYexEx9yJi7kXE3IuIuRcRcy8i 5l5EzL2ImHsxMXfvcoBny+flEuveG7NTvMsBnu2kl0use2/MTvEuLXi2ql4use69MTv3ftfLJda9 N2aniBcg3HtpL5dY996YnXtD7uUS617kE4s3Zufe7Hu5xLoXWcciso5FZB2LyCdebQcvl1hfIutY vNE4d0vDyyXWl8hNFpGbLCI3WURusoisYxFZxyKyjkVkHYvIOhbizBXizBXizBXizBXizBXizBXi zBXizBXizBXizBXizBXizBXizBXizBXizBXizBXizBXizBXizBWivxWivxWivxWivxWivxWivxWi vxWivxWivxWivxVishVishUipRUipRUCRBUCRBUCRBUCRAUBooIAUUGAqCBAVBAgKggQFQSICgJE BQGiggBRQYCoIEBUECAqCBAVBIgKAkQFAaKCAFFBgKggQFQQICoIEBUEiAoERIkyVhFlrCLKWEWU sYooYxVRxiqijFVEGauIMlYRZawiylhFlLGKKGMVUcYqooxVRBmriDJWEWWsIspYRRSoiihQFVGg KqJAVUSBqogCVREFqiIKVEUUqIooUBVReiqi9FREUamIolIR4cEiwoNFhAeLCA+GCA+GCA+GCA+G CA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+GCA+G CA+GBw9WMsyxkmGOlQxzrGSYYyXDHCsZ5ljJMMdKhjlWMsyxkmGOlQxzrGSYYyXDHCsZ5ljJMMdK hjlWMkigkkEClQwSqGSQQCWDBCoZJFDJIIFKBglUMkigkkEClQwSqGSQQCWDBCoZJFCJ3l+J3l+J 3l+JCl+JCl+JCl+JCl+JCl+JYl2JLV2JLV2JLV2JLV2JLV2JLb3+f6SMgpQR8LKv10f2kui9cGov 1VWc7lXF6V5VnO5VxeleVZzuVcXpXlWc7lXF6V5VnO5VxeleVZzuVcXpXv8f3v5lSZPj2NJEx8Wn iCM16RbZe59wu9ugXqKlZyU9SCQCJIpAJiWRYPHU0x8zd0QGNvIS6h++6mqRlk3SlmbE76p/uKqt tbSK7l5VdPeqouK+ior7Kiruq6i4r6LivoqK+yoq7quouK+i4r6KivsqKu6rqLivouK+ior7Kirb q6hsr6KyvYpK7Soqtauo1K6iUruKSu0qKmmrqH6tovq1iurXKqpfq6h+raL69ewXvVhiDXmq3LPp lGJ14oTXiRNeJ054nTjhdTKm6cQJr5PZTieznU5mO53MdjqZ7XQy2+lkttPJbKeT2U4ns51OPPc6 8dzrxHOvE8+9Tjz3OvHc68RzrxPPvU489xaIZAQw6uvEqK8To74FIhkB3P06cffrRA3eiRq8EzV4 J2rwTtTgnajBO1GDd6IG70QN3okavBM1eCdq8E7U4J2owTtRg3eiBu9EDd6JGrwTNfgCkYwApJtO JOSdSMg7kZB3IiHvRELeiYS8Ewl5JxLyTiTkPQPSTSe68y66n3XR/ayL7mdddD/r4symi+5nXZz/ dHH+08X5TxfnP12c/3Rx/tPF+U8X5z9dnP90df7jubJ10ZWti65sXXRl66IrWxdd2broytZFV7Yu urKd7bcXS8x7z+Gtiw5vZ2vvxRLz3nOL66IZQxfNGLpoxtBFM4YumjF00Yyhi2YMXTRj6KIZQxfN GLpoxtBFM4YumjF00Yyhi2YMXTRj6KIZQxfNGLpoxnAOdbRYHne2i8YOXTR26KKxQxeNHbpo7NBF Y4cuGjt00dihi8YO50TLi6Xl/STz5EnmyZPMkyeZJ08yT55knjzJPHmSefIk8+RJ5smTzJMnmSdP Mk+eZJ48yTx5knnyJD6mC0QyAog4JzE/ncT8dBLz00nMTycxP53E/HQS89NJzE8nMT+dxPx0EvPT ScxPJzE/ncT8dBLz00nMTycxP53E/HQS89NJzE8nMT+dxPx0EvPTScxPJzE/ncT8dBLz00nMTycx P10gkhFgG/QCkYwA26AXiGQE4MDOAjiwC0QyAnBgF4hkBODALhDJCMCBXSCSEYADu0DkzdKb/0xx /jPF+c8U5z9TnP9Mcf4zxfnPFOc/U5z/THH+M8X5zxTnP1Oc/0xx/jPF+c9U5z+edvpsY71YYt57 2ukpGo5O0XB0ioajUzQcnaLh6BQNR6doODpFw9EpGo5O0XB0ioajUzQcnaLh6BQNR6doODpFw9Ep Go5O0XB0ioajUzQcnaLh6BQNR6doODpFw9EpGo5O0XB0ioajUzQcPecxXiwx771t5edQx4sl5r3H 1z8nQ14sMe89vv45XvJiiXnv8fXPGZUXS8x7j69/Drq0WEADvkBkIgo04AtEJqJAA75AZCIKNOAL RCaiQAO+QGRGDjTgC0QyAmjAF4hkBNCALxDJCKABXyCSEUADvkAkI4AGfIFIRgAN+AKRjAAa8AUi GQE04AtEMgJowBeIZATQgC8QyQigAV8gkhFAA75AJCMIZ68Qzl4hnL1COHuFcPYK4ewVwtkrhLNX CGevEM5eIZy9Qjh7hXD2CuHsFcLZK4SzVwhnrxDOXiGcvUI4e4Vw9grh7BXC2SuEs1cJZ68Szl4l nL2KOHue3vlsq7xY4tzA0zufvZkXS5wbeHrns8HzYolzA0/vfHaJXiwx7z2989lqerHEvPf0zme/ 6sUS897TO59NrxbL0zufLbIXS8x7T+989tleLDHvPb3z2ax7scS89/TOZ8fvxRLz3tM7n2MDL5aY 957e+Zw9eLHEvBf5rkXkuxaR71pEvmsR+a5F5LsWke9aRL5rEfmuReS7FpHvWkS+axH5rkXkuxaR 71pEvmsR+a5F5LsWke9aRL5rEfmuReS7VpHvWkW+axX5rlXku1aiWa1Es1qJZrUSzWolmtVKNKuV aFYr0axWolmtRLNaiWa1Es1qJZrVSjSrlWhWK9GsVqJZrUSzWolmtRLNaiWa1Uo0q5VoVivRrFai Wa1Es1qJZrUSzWolmtVKNKuVyE8rkZ9WIj+tRH5aify0EvpdJfS7Suh3ldDvKqHfVUK/q4R+Vwn9 rhL6XSX0u0rod5XQ7yqh31VCv6uEflcJ/a4S+l0l9LtK6HeV0O8qod9VQr+rhH5XCf2uEvpdJfS7 Suh3ldDvqij9q6L0r4rSvypK/6oo/aui9K+K0r8qSv+qKP2rovSvitK/Kkr/qij9q6L0r4rSvypK /6oo/aui9K+K0r8qSv+qKP2rovSvitK/Kkr/qij9q6L0r4rSvypK/6oo/aui9K+Kcr0qyvWqKNer olyvinK9KtJNq0g3rSLdtIp00yrSTatIN60i3bSKdNMq0k2rSDetIt20inTTKtJNq0g3rSLdtIp0 0yrSTatIN60i3bSKdNMq0k2rSDetIt20inTTKtJNq0g3rSLdtGp009W537+a26Dbc7gNuj2H26Db c7gNuj2Z3aDbk9kFun81t0G3J7MbdHsyu0G3J7MbRDLi/n3eBpGMuH+ft0EkI+7f5y3Q/fu8DSIZ cf8+b4NIRty/z9sg8nDvX81tEHm496/mFuj+1dwGkYd7/2pug8jDvX81t0Gk3O9fzW0QyYj7V3Mb RDLi/tXcBpGMuH81t0EkI+5fzW0QyYj7V3MbRDLivjPGBpGMuO+MsUEkI+47Y2wQyYj7zhgbRDLi vjPGBpGMuO+MsUEkI+47Y2wQyYj7zhgbRDLivjPGBpGMuO+MsUGobbBax6tD8mJZrePVT3mxrJHJ 1X1psbTrnKtX82JZI5Ors/NiiXmvXQ1d7aEXS8x77Wro6jG1WNrV0NWRerHEvNeuhq621osl5qp2 nXP1xl4sMVe165yrwfZiibmqXedcXboXS/yO1q5zrlbfiyXmvXadc80LvFhi3mvXOdfQwYsl5r12 nXNNLrxYYt5r7iHX+EOLpbmHXMMSL5aY95p7yDVx8WKJea+5h1xjGy+WmPeae8g1+/FiiXmvuYdc AyQvlpj3mnvINYXyYnl53+4roDcITMfafQX0BoF5abuvgN4gMC9t9xXQGwTmpY3QLBqhWTRCs2iE ZtEIzaIRmkUjNItGaBaN0CwaYUw0wphohDHRCGOiEcZEI4yJRhgTjTAmGmFMNMKYaIQx0e4roDeI ZAShWTRCs2iEZtEIzaIRmkUjNItGaBaN0CwaoVk0QrNohGbRCM2iEZpFI4yJRhgTjTAmGmFMNMKY aIQx0QhjohHGRCOMiUYYE40wJhphTDTCmGiEMdEIY6IRxkQjjIlGGBONMCaaJty9mh0vljdlaJpw 9+qYvFjelKFpwt2r7fJieVOGJjI9msj0aCLTo4lMjyYyPZrI9Ggi06OJTI8msjOayM5oIjujieyM JrIzmsjOaCI7o4nsjCayM5rIzmgiO6Npwt2r4fZiiXkvMj2ayPRoItOjiUyPJjI9msj0aCLTo4lM jyYyPZrI9Ggi06OJTI8msjOayM5oIjujieyMJrIzmsjOaCI7o4nsjCayM5rIzmgiO6OJ7IwmsjOa yM5oIjujieyMJrIzmsjOaCI7Y9z3ed8gMNEa933eNwjMOMd9n/cNAjPOcd/nfYPAjHMQlsMgLIdB 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 BQIZ0YAn+gKBjGjAE32BQEY04Im+QCAjGvBEX00DyQjgib5AJCOAJ/oCkYwAnugLRDICeKIvEMkI 4Im+Wj+SEYSz1whnrxHOXiOcvUY4e41w9hrh7DXC2WuEs9cIZ68Rzl4jnL1GOHuNcPYa4ew1wtlr hLPXCGevEc5eI5y9Rjh7jXD2GuHsNcLZa4Sz1whnryHOnqfGqaIap4pqnPoNNQ7qzbxY4tzA049U UT9SRf1IFfUjVdSPVFE/UkX9SBX1I1XUj1RTP9I8H/ezjfVieXnfPB/3sxf2Ynl53zwf97Oh9mJ5 ed88H/ezK/diiXnv+bifrb0XS8x7z8f9nA94scS893zczyGDFkvkuzaR79pEvmsT+a5N5Ls2ke/a RL5rE/muTeS7NpHv2kS+axP5rk3kuzaR79pEvmsT+a5N5Ls2ke/aRL5rE/muTeS7NpHv2kS+axP5 rk3kuzaR79pEvmsT+a6NaFYb0aw2olltRBTaiL6zEX1nI/rORvSdjeg7G5FqNiLVbESq2YhUsxGp ZiNSzUakmo1INRuRajYi1WxEqtmIVLMRqWYjUs1GpJqNSDUbkWo2ItVsRKrZiFSzEalmI1LNRqhq jVDVGqGqNUJVa4Sq1ghVrRGqWiNUtUaoao1Q1RqhqjVCVWuEqtYIVa0RqlojVLVOqGqdUNU6oap1 QlXrhKrWCVWtE6paJ1S1TqhqnVDVOqGqdURVE2VyTZTJNVEm10QJWRNlX02UfTVR9tVE2VcTZV9N lGo1UarVRKlWE6VaTZRqNVGq1USpVhOlWk2UajVRqtVEqVYTpVpNlGo1UarVRKlWE6VaTZRqNVGq 1USpVhOlWk2UajVRqtVEqmETqYZNpBo2kWrYRKphE6mGTaQaNpFq2ESqYROphk2kGjaRathEqmET qYZNpBo2kWrYRaphF6mGXaQadpFq2EWqYRephl2kGnaRathFqmEXqYZdpBp2j2rYiZVoJ1ainViJ dmIl2omVaCdWop1YiXZiJdqJlWgnVqKdWIl2YiXaiZVoJ1ainViJdmIl2omVQidWCp1YKXRipdCJ lUInVgqdWCl0YqXQiZVCJ1YKnVgpdGKl0ImVQidWCp1YKXRipdCJlUInVgqdWCl0YqXQiZVCJ1YK nVgpdGKl0ImVQidWCp1YKXRipdCJlUInVgqdWCl0YqXQiZVCJ1YKnVgpdGKl0ImVQidWCp1YKXRi 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 8+Xei6X13Gcr4MXSeu6zcfBiaT332WZosTwh1NmUeLHEXPWEUGdn48US894TQp3tkRdLzHtPCHX2 WF4sMe89IdTZqHmxxLz3hFBnt+fFEvPeE0KdLaMWyxNCnQ2mF0vMe08IdXapXiwx7z0h1NnqerHE vPeEUGe/7MUS894TQp1NtxdLzHtPCHV27l4sMe89IdTZ/muxPCHUOSzwYol573HTzomDF0vMe0DR XyAysQIU/XQAZvoCkUENIC8vEPkgAA95gcDoLgEe8gKB0V0Cq58WCIzuEmA8LxB4uAkwnhcIZEQC jOcFIhkBGM8LRDICMJ4XiGQEWP20QCQjwOqnBSIZAVY/LRDJCMIBSYQDkggHJIHVTwtEMoKQLBIh WSRCskiEZJEIySIRkkUiJItESBaJkCwSIVkkRLLwyP7ne5YXS2wkPML5+bKmxfJIvOernRdL/Ow9 4u35fujF8pq45K36OF8yvVhe3iePEHy+qXqxvLxPHiH4fN3VYnmE4PPl2Isl5r236uN8w/ZiiXnv rfo4X9O9WGLeiwSSJBJIkkggSSKBJHmrPs4+woslPkeRXJFEckUSyRVJJFckkVyRRHJFEskVSSRX JJFckTxyRSbrxDNZJ57JOvFM1olnsk48k3XimawTz2SdeCbrxDNZJ57JOvFM1olnsk48k3XimawT z2Sd+AKRjABzskz2OWWyzymTfU6Z7HPKZJ9TJvucMtnnlMk+p0z2OWWyzymTfU6Z7HPKZJ9TJvuc MtnnlMk+p0z2OWWyzymTfU6Z7HPKZJ9TJvucMtnnlMk+p0z2OWWyzymTfU6Z7HPKZJ9TJvucMtnn lMk+p0z2OWWyzymTfU6Z7HPKZJ9TJvucMtnnlMk+p0z2OWWyzymTfU6Z7HPKZJ9TJvucsrhKOIur hLO4SjiLq4SzuEo4i6uEs7hKOIurhLO4SjiLq4SzuEo4i6uEs7hKOIurhLO4SjiLq4TPftWLJea9 N4/N4tavLG79yuLWryxu/cri1q8sbv3K4tavLG79yuLWryxu/cri1q8sbv3K4tavLG79yuLWryxu /cri1q8sbv3K4tavLG79yuLWryxu/cri1q8sbv3K4tavLG79yuLWryxu/cri1q8sbv3K4tavLG79 yuLWryxu/cri1q8sbv3K4tavLG79yuLWryxu/cri1q8sbv3K4tavLG79yuLWr0z2mWeyzzyTfeaZ 7DPPZJ/5ApGJKNhHk8nm9Ew2p2eyOT2TzemZbE7PZHN6JpvTM9mcnsnm9AUiGQH20SwQyQgg6Vwg khFAB7pAJCOADjQPoANdIJARA+hAFwhkxAA60AUCGTGADnSBQEYMoANdIJIRQAe6QCQjCGdvEM7e IJy9QTh7g3D2BuHsDcLZG4SzNwhnbxDO3iCcvUE4e4Nw9gbh7A3C2RuEszcIZ28Qzt4gnL1BOHuD cPYG4ewNwtkbhLM3CGdvEM7eIJy9gTh7nrY1i1uTs7g1OYtbk7O4Nfls2bxY4tzAW2SVxW3OWdzm nMVtzlnc5pzFbc5Z3OacxW3OWdzmfParXiwx771FVmfT68US897T05+dsxfLy/vh6enP9tuL5eX9 8PT0Zw/vxfLyfnh6+nMQ4MXy8n54evpzmuDFEvNe5LsOke86RL7rEPmuQ+S7DpHvOkS+6xD5rkPk uw6R7zpEvusQ+a5D5LsOke86RL7rEPmuQ+S7DpHvOkS+6xD5rkPkuw6R7zpEvusQ+a5D5LsOke86 RL7rEPmug2hWB9GsDqJZHUSzOohmdRDN6iCa1UE0q4NoVgfRrA6iWR1EszqIZnUQzeogmtVBNKuD aFYH0awOolkdRLM6iGZ1EM3qIJrVQeSng8hPB5GfDiI/HUR+Ooj8dBD56SDy00Hkp4PITweRnw4i Px2EfjcI/W4Q+t0g9LtB6HeD0O8God8NQr8bhH43CP1uEPrdIPS7Qeh3g9DvBqHfDUK/G4R+Nwj9 bhD63SD0u0Hod4PQ7wah3w1Cv5uEfjcJ/W4S+t1E9DtR+jdE6d8QpX9DlP4NUfo3ROnfEKV/Q5T+ DVH6N0Tp3xClf0OU/g1R+jdE6d8QpX9DlP4NUfo3ROnfEKV/Q5T+DVH6N0Tp3/i69O/t+w8ffv3H x4fvfnr/9u8Pjwv28LUY+S//5QrxP3599/cL8Jd37x/+4+Hp3cf9s7z/8DvoC2gfee0M+I3EihFF g0MUDQ5RNDhE0eAQRYNDFA0OUTQ4RNHgEEWDQxQNDlE0OETS6xBJr0MkvQ6R9DpE0usQSa9DJL0O kfQ6RNLrEEmvQyS9DpH0OkTS6xBJr0MkvQ6R9DpE0usQSa9DJL0OkfQ6RNLrEEmvQyS9DpH0OkXS 6xRJr1MkvU6R9DrJxdMkF0+TXDxNcvE0ycXTJBdPk1w8TXLxNMnF0yQXT5NcPE1yhzTJHdIkd0iT 3CFNcoc0yR3SJHdIk9whTXKHNMkd0iR3SJPcIU1yhzTJHdIkd0iT3CFNcoc0yR3SBHdI5RHcIS3Q /YxYoPsZsUD3M2KB7mfEAt3PiAW6nxELdD8jFuh+RiwQyQhg4bBAJCOAhcMCkYwAFg4LRDICWDgs EMkIYOGwQCQjgIXDApGMABYOC0QyAlg4LBDJCGDhsEAkI4CFwwKRjAAWDgtE3iPEyfkUJ+dTnJxP cXI+xcn5FCfnU5ycT3FyPsXJ+RQn51OcnE9x2j3FafcUp91TnHZPcdo9xWn3FKfdU5x2T3HaPcVp 9xSn3VOcdk9x2j3FafcUp91TnHZPcdo9xWn39KbdZx/uxdLy/uzavVha3p89vhdLy/tzIuDF0vL+ nB94scS89yweziGEF0vMe8/i4ZxkeLHEvPcsHs5xiBdLzHvP4uGcqXixxLz3LB7OwYwXS8x7z+Lh nO54scS89ywezhGRFsuzeDgHSlKsSlbCVrIStpKVsJWshK1kJWwlK2ErWQlbyUrYSlbCVrIStpKV sJWshK1kJWwlK2ErWQlbyUrYSlZiVLISo5KVGJWsxKhkJUYlKzEqWYlRyUqMSlZiVLISo5KVGJWs xKhkJUYlKzEqWYlRyUqMSlZiVLISo5KVGJWsxKhkJUYlKzEqWYlRyUqMSlZiVLISo5KVGJWsxKhk JcYCgYwgKzEqWYlRyUqMSlZiVLISo5KVGJWsxKhkJUYlKzEqWYlRyUqMSlZiVLISo5KVGJWsxKhk JUYlKzEqWYlRxRWOVVzhWMUVjlVc4VjFFY5VXOFYxRWOVVzhWMUVjlVc4VjFFY5VXOFYxRWOVVzh WMUVjlVc4VjFFSRVXEFSxRUkVVxBUsUVJFVcQVLFFSRVXEFSxRUkVVxBUsUVJFVcQVLFFSRVXEFS xRUkVVxBUsUVJFVcQVLFFSRVXEFSxRUkVVxBUsUVJFVcQVLFFSRVXEFSxRUkVVxBUsUVJOcoxYvl 5b24gqSKK0iquIKkiitIqriCpIorSKq4gqSKK0iquIKkiitIqriCpIorSKq4gqSKK0iquIKkiitI qriCpJKVsJWshK1kJWwlK2ErWQlbyUrYSlbCVrIStpKVsJWshK1kJWwlK2ErWQlbyUrYSlbCVrIS tpKVGJWsxKhkJUYlKzEqWYlRyUqMSlZiVLISo5KVGJWsxKhkJUYlKzEqWYlRyUqMSlZiVLISo5KV GJWsxKhkJUYlKzEqWYlRyUqMSlZiVOLSWckejUr2aFSyR6OSPRqV7NGoZI9GJXs0KtmjUckejUr2 aFSyR6OSPRqV7NGoZI9GJXs0KtmjUckejUr2aFSyR6OSPRqV7NGoZI9GJXs0KtmjUcUVjlVc4VjF FY5VXOFYxRWOVVzhWMUVjlVc4VjFFY5VXOFYxRWOVVzhWMUVjlVc4VjFFY5VXOFYxb0lVdxbUsW9 JVXcW1LFvSVV3FtSxb0lVdxbUsW9JVXcW1LFvSVV3FtSxb0lVdxbUsW9JVXcW1LFvSVV3FtSxb0l VdxbUsW9JVXcW1K/sbcEDTC8WGLei3xXcftIFbePVHH7SBW3j1Rx+0gVt49UcftIFbePVHH7SBW3 j1Rx+0gVt49UcftIFbePVHH7SBW3j1Rx+0gVt49UcftIFbePVHH7SBW3j1SyR7aSPbKV7JGtZI9s JXtkK9kjW8ke2Ur2yFayR7aSPbKV7JGtZI9sJXtkK9kjW8ke2Ur2yC4QyIhJNKuTaFYn0axOolmd RLM6iWZ1Es3qJPLTSeSnk8hPJ5GfTiI/nUR+Oon8dBL56STy00nkp5PITyeh301Cv5uEfjcJ/W4S +t0k9LtJ6HeT0O8mod9NQr+bhH43Cf1uEvrdJPS7Seh3k9DvJqHfTUK/m4R+Nwn9bhL63ST0u0no d5PQ7yah301Cv5uEfjcR/U6U/omLGKu4iLGKixiruIixiosYq7iIsYqLGKu4iLGKixiruIixiosY q7iIsYqLGKu4iLGKixjP1tOL5eX9FKV/U5T+TVH6N0Xp3xSlf1OU/k1RrjdFud4U5XpTlOtNUa43 RbneFOV6U5TrTVGuN0W53hTlelOkm06RbjpFuukU6aZTpJtOkW46RbrpFOmmU6SbTpFuOkW66RTp plOkm06RbjpFuukU6aZTpJtOkW46RbrpFOmmU6SbTpFuOkW66RTpplOkm06RbjpFuun06Kad2Ml2 YifbiZ1sJ3ayndjJdmIn24mdbCd2sp3YyXZiJ9uJnWwndrKd2Ml2YifbiZ1sJ3ayndhpdGKn0Ymd Rid2Gp3YaXRip9GJnUYndhqd2Gl0YqfRiZ1GJ3YandhpdGKn0YmdRid2Gp3YaXRip9GJnUYndhqd 2Gl0YqfRiZ1GJ3YandhpdGKn0YmdRid2Gp3YaXRip9GJnUYndhqd2Gl0YqfRiZ1GJ3YandhpdGKn 0YmdRid2Gp3YaXRip9GJnUYndhqd2Gl0YqfRiZ1GJ3YaXbR/7KL9YxftH7to/9hF+8cu2j920f6x i/aPXbR/7KL9YxftH7to/9hF+8cu2j920f6xi/aPXbQv6aJ9SRftS7poX9JF+5Iu2pd00b6ki/Yl XbQv6aJ9SRftS7poX9JF+5Iu2pd00b6ki/YlXbQv6aJ9SRftS7poX9JF+5Iu2pd00b6ki/YlXbQv 6aJ9SRftS7poX9JF+5Iu2pd00b6ki/YlXbQv6aJ9SRftS7poX9JF+5Iu2pd00b6ki/YlXbQv6aJ9 SRftS7poX9JF+5Iu2pd00b6ki/YlndjJdmIn24mdbCd2sp3YyXZiJ9uJnWwndrKd2Ml2YifbiZ1s J3ayndjJdmIn24mdbCd2sp3YaXRip9GJnUYndhqd2Gl0YqfRiZ1GJ3YandhpdGKn0YmdRid2Gp3Y aXRip9GJnUYndhqd2Gl0YqfRiZ1GJ3YandhpdGKn0YmdRid2GgtEMoJw9ogHRyceHJ14cHTiwdGJ B0cnHhydeHB04sHRiQdHJx4cnXhwdOLB0YkHRyceHJ14cHTiwdGJB0cnHhydeHB04sHRiQdHJx4c XbR/7KL9YxftH7to/9hF+8cu2j920f6xi/aPXbR/7KL9YxftH7to/9hF+8cu2j920f6xi/aPXfQ8 6aLnSRc9T7roedJFz5Muep500fOki54nXfQ86aLnSRc9T7roedJFz5Muep500fOki54nXfQ86aLn SRc9T7roedJFz5Muep500fOki54n51zDiyXmvch3Ff1Tuuif0kX/lC76p3TRP6WL/ild9E/pon9K F/1Tuuif0kX/lC76p3TRP6WL/ild9E/pon9KF/1Tuuif0kX/lC76p3TRP6UTD9pOPGg78aDtxIO2 Ew/aTjxoO/Gg7cSDthMP2k48aDvxoO3Eg7YTD9pOPGg78aDtxIN2gUhGEM3qJJrVSTSrk2hWJ9Gs TqJZnUSzOolmdRLN6iTy00nkp5PITyeRn04iP51EfjqJknQSJekkpLhJ+G2TUNUmYZ1NQiCbhAs2 CRdsEi7YJFywSbhgk3DBJuGCTcIFm4QLNgkXbBIu2CRcsEm4YJNwwSbhgk3CBZuICybq0ERfwy76 GnbR17CLvoZd9DXsoq9hF30Nu+hr2EVfwy76GnbR17CLvoZd9DXsoq9hN30Np6hDm6IObYo6tCnq 0KaoQ5uiDm2KOrQp6tCmqEObog5titqxKWrHpqgdm6J2bIrasSlqx6ao95qi3muKHMMp8gKnyOWb Iv9uipy5KfLcpshzmyLPbYo8tyny3KbIc5siz22KPLcp8tymyHObIs9tijy3KfLcpshzmyLPbYo8 t/l1ntv+P39+89cf3z68+/Xn754+PDz+63EH+x18bquEfe6fTx9++XH/Q6+efD1iD0fswYgjHHEE I85wxBmLuF5dgxF/O/l6xCMc8QhGTOGIKRgxhyPmYMQSjliCEWs4Yg1GDNdMC9ZMC9dMC9ZMC9dM C9ZMC9dMC9ZMD9dMD9ZMD9dMD9ZMD9dMD9ZMD9dMD9ZMD9dMD9ZMD9dMD9ZMD9dMD9ZMD9dMD9ZM D9dMD9ZMD9dMD9bMCNfMCNbMCNfMCNbMCNfMCNbMCNfMCNbMCNfMCNbMCNfMCNbMCNfMCNbMCNfM CNbMCNfMCNbMCNfMCNbMDNfMDNbMDNfMDNbMDNfMDNbMDNfMDNbMDNfMDNbMDNfMDNbMDNfMDNbM DNfMDNbMDNfMDNbMDNfMjNXMljzFIj6ffD1itGaeT74eMVozzydfjxitmeeTr0eM1szzydcjRmvm +eTrEaM183zy9YjRmnk++XrEaM08n3w9YrRmnk++GvEI18wRrJkjXDNHsGaOcM0cwZo5wjVzBGvm CNfMEayZI1wzR7BmjnDNHMGaOcI1cwRr5gjXzBGsmSNcM0ewZlK4ZlKwZlK4ZlKwZlK4ZlKwZlK4 ZlKwZlK4ZlKwZlK4ZlKwZlK4ZlKwZlK4ZlKwZlK4ZlKwZlK4ZlKwZnK4ZnKwZnK4ZnKwZnK4ZnKw ZnK4ZnKwZnK4ZnKwZnK4ZnKwZnK4ZnKwZnK4ZnKwZnK4ZnKwZnK4ZnKwZkq4ZkqwZkq4ZkqwZkq4 ZkqwZkq4ZkqwZkq4ZkqwZkq4ZkqwZkq4ZkqwZkq4ZkqwZkq4ZkqwZkq4ZkqwZmq4ZmqwZmq4Zmqw Zmq4ZmqwZmq4ZmqwZmq4ZmqwZmq4ZmqwZsI8gBnkAcwwD2AGeQAzzAOYQR7ADPMAZpAHMMM8gBnk AcwwD2AGeQAzzAOYQR7ADPMAZpAHMMM8gBnkAcwwD2AGeQAzzAOYQR7ADPMAZpAHMMM8gBnkAcww D2AGeQAzzAOYQR7ADPMAZpAHMMM8gBnkAcwwD2AGeQAzzAOYQR7ADPMAZpAHMMM8gBnkAcwwD2AG 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 c/RiiXmvLMt6aT+9WGLee9Kus4fVYnnSrrPj9WKJ+SWSvZJI9koi2SuJZK8sErSyJ8c6O3Uvlpdf 2ZNQne2+F8vLr6z4Ob/MDLRYijf0y4TBiyXml0jayyLRLotEuywS7fIkY0CiEcxk8prJEDWjISoR 4RUyeS1k8lrI5LUQ5V4h49pCxrWFjGsLGdcWMq4tZFxbyLi23Fsa9gwiD5fMeAuZ8RaisCxkMFzI YLiQwXAhCstCxJKFiCULEUsWIpYsRCxZiFiyELFkIWLJQsSShYglCxFLFiKWLEQsWYhYshCxZCFi yUJ0j4XoHgvRPRaieyxE91iI7rEQ3WMhusdCdI9ZWdz98pbqxRLbCnGUkc1RhqhbK+JYpIhjkSKO RYqogSviiKWII5YijliKOGIp4oiliCOWIo5YirJ+66VZ8GKJuSqOa4qosSzi6KeIo58ijn6KqLEs oi6yiLrIIuoii6iLLKIusoi6yCLqIouoiyyiLrKIusgi6iKLqIssoi6yiLrIIuoii6iLLKKWsYha xiJqGYuoZSyilrGIWsYiahmLqGUsmpYxPwIPpw26PcvYoNuzjA26PcvYoNuzjA26PcvYoNuzjA26 PcvYoNujyw26Pd1aoPseThtEMuK+h9MGkYy4r6jcIPKR3xdHLtB9ceQGkY/8vjhyg8hHfl8cuUGk CO+LIzeIFOF9ceQGkYy4L47cIJIR98WRG0Qy4r44coNIRtwXR24QyYj74sgNIhlxXxy5QSQj7osj N4hkxH1x5AaRjLgvjtwgkhH3xZEbRDLivjhyg0hG3FdUbhB5uPd5PRtEHu59MtAGkYd7nwyUH4EM c4PAwwUyzKtt8FoQqy29mgwvltWWXi2JF8tqS68GxotltqXW6PDqgrRYmsXO1TN5scS81yx2rsbL iyXmhKZYvbo3L5aYE5pi9WoBvVjid6GmWL36SC+W+F2oKVavZlSLpSlWr9bViyXmvaZYvfpfL5aY 95pi9WqivVhi3muK1asT92KJea8pVq923osl5r2mWL1mAl4sMe81xeo1WNBiaYrVawzhxRJzVVO/ XrMML5aYqxpl9BqIeLG8XPWUtNdUxYulfUcnMmlMZNKYyKQxkUnjAt0fRiUynkxkPJnIeDKR8WQi k8ZEhoaJDA0TGRouEHhOwPBtg8BzAoZvG3R/jJyA4dsGgcoFhm8bRDLivkvcBpGMuC873CCSEfdl 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 UrFGpGKNSMUaUX01ovpqRPXViOqrEdVXI6qvRlRfjai+GlF9NaL6akT11YjqqxHVVyOqr0ZUX42o vhpRfTWi+mpE9dWI6qsR1Vcjqq9GVF+NqL4aUX01ovpqRPXViOqrEdVXI6qvRlRfjai+GmG9NMJ6 aYT10gjrpRHWSyOsl0ZYL42wXhphvTTCemmE9dII66UR1ksjrJdGWC+NsF4aYb00wnpphPXSCOul EdZLI6yXRlgvjbBeGmG9NMJ6aYT10gjrpYmKmyYqbpqouGmiSqaJKpkmqmSaqJJpokqmiSqZJqpk mqiSaaJKpokqmSaqZJqokmmiSqaJKpkmqmSaqJJpokqmiSqZJqpkmqiSaaJKpokqmSaqZJqokmmi SqaJKpkmqmSaqJJpokqmiSqZJqpkmqiSaSKFr4kUviZS+JpI4Wsiha+JFL4mUviaSOFrIoWviRS+ JlL4mkjhayKFr4kUviZS+JpI4Wsiha+JFL4mUviaSOFrIoWviRS+JlL4mkjhayKFr4kUviZS+JpH 4UvExTERF8dEXBwTcXFMxMUxERfHRFwcE3FxTMTFMREXx0RcHBNxcUwV3Ocl4uKYiItjIi6OiajY E1GxJ6JiT0TFnoiKPREVeyIq9kRU7Imo2BNRsSeiYk9ExZ6Iij0RFXsiKvZEVOyJqNgTUbEnomJP RMWeiIo9ERV7Iir2RFTsiajYE1GxJ6JiT0TFnoiKPREVeyIq9kRU7Imo2BNRsSeiYk9ExZ6Iij0R FXsiKvZEVOyJqNgTUbEvEMkIsHlmgUhGgM0zqYLNMwtEMsK7T0qi61oSXdeS6LqWRNe1JLquJdF1 LYmua0l0XUui61oSXdeS6Lp29pReLDHvvfukJLquJdESIomWEEm0hEiiJUQSLSGSaAmRREuIJFpC JNESIomWEEm0hEiiJUQSLSGSaAmRREuIJFpCJNESIomWEEm0hEiiJUQSLSGSaAmRREuIJFpCJNES IomWEEm0hEiiJUQSLSGSaAmRREuIJFpCJNESIomWEEm0hEiiJUQSLSGSaAmRREuIJFpCJNESIomW EOfUyYsl5r23JescXWmxvC1Z56DLi0UmosADMxEPzEQ8MBPxwEzEAzMRD8xEPDAT8cBcIDARJcaZ CwQygrhtJuK2mYjb5gKBjCB2GonYaSRip7FAJCOAB0ciHhyJeHAk4sGRiAdHIh4ciXhwJOLBkYgH RyIeHIl4cCTiwZGIB0ciHhyJeHAk4sGRiAdHIh4ciXhwJOLBkYgHRyIeHIl4cCTiwZGIB0ciHhyJ eHAk4sGRiAdHIh4ciXhwJOLBkYgHRyIeHIl4cCTiwZGIB0ciHhyJeHAk4sGRiAdHEr0Hk+g9mETv wSR6DybRezCJ3oNJ9B5MovdgEr0Hz37Li+XlffPW+CbREzGJnohJ9EQ8Oz8vlpf3oqlIEk1Fzq7S iyXmvWdQkkSDkiQalCTRoCSJBiVJNChJokFJEg1KkmhQkkSDkiQalCTRoCSJBiVJNChJokFJEg1K kmhQkkSDkiQalCTRoCSJBiVJNChJokFJEg1KkmhQkkSDkiQalCTRoCSJBiVJNChJokFJEg1KkmhQ kkSDkiQalCTRoCSJBiVJNChJokFJEg1KEjFATcQANRED1EQMUBMxQE3EADURA9REDFATMUBNxAA1 EQPURAxQEzFATcSWdIHIcyIyxkZkjI3IGBuRMTYiY2xExtiIjLERGWMjMsZGZIyNyBgbkTE2ImNs RMbYiIyxERljIzLGRmSMjcgYG2FkNcLIaoSR1QgjqxFGViOMrEYYWZ0wsjphZHXCyOqEkdUJI6sT RlYnjKxOGFmdMLI6YWR1wsjqhJHVCSOrE0ZWJ4ysThhZnTCyOmFkdcLI6oiRJarBRHfBJLoLJtFd MInugkl0F0yiu2AS3QWT6C6YRHfBJLoLJtFdMInugsl08Wui6qqJqqsmqq6aqLpqouqqiaqrJqqu mqi6aqLqqomqqyaqrpqoumqi6qqJqqsmqq6aqLpqouqqiaqrJqqumqi6aiIRsYlExCYSEZtIRGwi EbGJRMQmEhG7SETsIhGxi0TELhIRu0hE7CIRsYtExC4SEbtIROwiEbGLRMQuEhG7SETsIhGxi0TE LhIRu0hE7CIRsYtExO4REQtx8izEybMQJ89CnDwLcfIsxMmzECfPQpw8C3HyLMTJsxAnz0KcPAtx 8izEybMQJ89CnDwLcTIoxMmgECeDQpwMCnEyKMTJoBAng0KcDApxMijEyaAQJ4NCnAwKcTIoxMmg ECeDQpwMCnEyKMTJoBAng0KcDApxMijEyaAQJ4NCnAwKcTIoxMmgECeDQpwMCnEyKMTJoBAng0Kc DApxMijEyaAQJ4NCnAwKcTIoxMmgECeDQpwMCnEyKMTJoBAng0KcDApxMijEyaAQJ4NCnAyK6LxX ROe9IjrvFdF5r4jOe0V03iui814RnfeK6LxXROe9IjrvFdF5r4jOe0V03iui814RnfeKaGxRRGOL IhpbFNHYoojGFkU0tiiisUURjS2KaGxRRGOLIhpbFNHYoojGFkU0tiiisUURjS2KaGxRRGOLIhpb FNHYoojGFkU0tiiisUURjS2KaGxRRGOLIhpbFNHYoojGFkU0tiiisUURjS2KaGxRRGOLIhpbFNHY oojGFkU0tiiisUURjS2KaGxRRGOLIhpbFNHYoojGFkU0tiiisUURjS0KcfIsxMmzECfPQpw8C3Hy LMTJsxAnz0KcPAtx8izEybMQJ89CnDwLcfJcIJIRYPv2ApGMAGYShZhJFGImUYiZRCFmEoWYSRRi JlGImUQhZhKFmEkUYiZRiJlEIWYSC0QyAmzfLsS2ohDbikJsKwqxrSjEtqIQ24pCbCsKsa0oxLai ENuKQmwrCrGtKMS2ohDbikJsKwqxrSjEtqKIRmZFNDIropFZEY3MimhkVkQjsyIamRXRyKyIRmZF NDIropFZEY3Mimhkdr4ae7HEvPc24xbRC6GIXghF9EIoohdCEb0QiuiFUEQvhCJ6IRTRC6GIXghF 9EIoohdCEb0QzlZEi+Vtxi2iR0MRPRqK6NFQRI+GIno0FNGjoYgeDUX0aCiiR0MRPRqK6NFQRI+G Ino0FNGjoYgeDUX0aCiiR0Mj3m6N+KA14oPWiA9aIz5ojfigNeKD1ogPWiM+aI34oDXig9aID9r6 00kyAug5FohkBNBzLBB5uB7JrIki/CaK8Jsowm+iCL+JIvwmivCbKMJvogi/iSL8JorwmyjCP7+Y vFhi3nukqfPbzYul5ero4NJrge7/+RkdXHot0P0/Pwt0/8/PAt3/87NA919IFuj+36wFuv9CskD3 X0gWiGQEuPQaHVxFLRB5TuAqaoHIcwJXUQtEnhOwj1gg8pyAfcQCkcoF9hELRDIC2EcsEMkIYB+x QCQjgH3EApGM8MaW5x8TLZY3tjz/9HixtDeJ8w+VF0t7gz7/rHmxtDfo84+gF0vMe29sef4l9WKJ +eWNB88/x14sMb+88eD5N92LJeaXJ989Xwy8WGLee/Ld8+3CiyXmvSffPV9RvFhi3nvy3TGAedUC gffRAS4GFgi8jw5gXrVA4H10APOqBQLvowNcdiwQ6FAGuOxYIPJwwb3FApGHC+4tFog8XHBvMQa4 t1gg8nDBvcUCkXIHPlQLRDIC+FAtEMkI4EO1QCQjgA/VApGMAD5UC0QyAvhQLRDJCOBDtUAkI4AP 1QKRjAA6vAUiDxdI6haIPFwgqVsg8nCBpG6ByMMFkroxgKRugUi5A0ndApGMAJK6BSIZASR1C0Qy AkjqFohkBJDULRDJCCCpWyDUAXi97PAsec7OxIvl9bLDs+Q52xsvltfLDo9dcvZIXixvhjM8dsnZ aHmxxFz1GCFnt+bFEnPVY4ScLZ8XS8xVjxFy9o1eLDHvRXbJ8Gx0zp7UiyXmvWejcza2Xiwx7z0b nbM79mKJee/Z6JwtthdLzHvPRufs07VYnqz67Oq9WGKuelLoczTgxRJz1ZNCn/MFL5aYq54U+hxS eLHEvPek0Oekw4sl5r0nhT7HJV4sMe89KfQ5c/FiiXnvSaHPwY0Tqz4Cuc0G3Z5RbdDtGdUG3Z5R bdDtqeUG3R5AbtDtAeQC3b8X2iDykd+/F9og8pHfvxfaoNuD4g0iz+n+vdAG3R4Ub9DtQfEC3b8X 2iCSEfcvkzaIZMT9y6QNIg/3/r3QBpGHe/9eaIHu3wtt0PGX/bV+/Xc/vP/w85uP6z/84Qx5luud 6T//5/Lwtze/PPxf//cZ4Qzw3a8fHz7+7enD08OPv6xQ+3/7/umfP759Iv8cyYL7F0gbRFLn/gXS BpHUuX+BtED3L5A2iHwv3L9A2iDyvXDfk3GDSEbc92TcIJIR9+VpG0Qy4r48bYNIRtyXp20QyYj7 8rQNIhlxX562QSQj7svTNohkxH1Pxg0iGXFfCLdB6AXeauKuXsWLZTVxV2fjxbKGF1cf5MWyBg5X 1+TFEnNCu3S4Wi8vlpgT2qXD1b95scz8sgZaVxOoxdIuHa6W0Ysl5r12gXH1nV4sMVe1S4erefVi ibmqXTpcHfBXYkUa4wv4tzf/fHp4+9PTmw9P3392BPXOX/mR/l9uqYM/xb+f/+PTvz4+vfv48MvH Nx8+/vjurw/f/fT+7d8f3v3683dPHx7S/iNdcxszH+3I+d8e3v/ww/4ZRm19nvaD28nj8fjL2/cf 9o+zI7y7Qv6yP//Pfrb9T37/5uOb/T/+/fNHU15/NHBk4GWeWPXalcs1d/BiiVWvXblcwwsvlvgX yrxy0dxnr8GIF0vM+6+7z/7hWORLqj/mVvJIxxjb1OHTd1RN6w1wpHYquEPfT+vH+vb30zrw2vcT nRB5n61Yu5oVxTVm8mKJtatZUVyzKi+WWLuaFcU18PJiiXmvWVFcUzMvlpj3mkXGNXrzYpGXsvvW VBtEZrT3rak2iMxo71tTLdB9a6oNIjPa+9ZUG0RmtPetqTaIZMR9a6oNIhlx35pqg0BGjEeQEeMR ZAQwh9ggkBHAHGKDQEYAc4gNAhkBzCE2iGTEfXOIDSIZcd8cYoNIRtx3lNggkhH3HSU2iGTEfUeJ DSIZQah5wFFig0hGEGoecJTYIJIRhM8HHCU2iGTEfUeJBSLMQeAosUEkIwhzEDhKbBDJCMIcBI4S G0QygjAHgaPEBpGMIMxBYEOxQSQj7ttQbBDJCEQ31CwGr7bKiyXODTSLwas382KJcwPNYvBq8LxY 4txAsxi8ukQvlpj3msXg1Wp6scS81ywGr37Vi+XlvWdHcjW9Xiwv7z07kqtz9mJ5ee/ZkVzttxZL syO5mnUvlpj32rKbq+P3Yol5r1mbXGMDL5aY95q1yTV78GKJeS8ycD1rk2uu4cUS815k83rWJtfM xIsl5r3IMvasTa55jBdLzHuRZexZm1yzHi+WmPciy9izNrnmSF4sMe9FlrFnk3LNqLxYYt6LjGXP JmXHIhNRIrcFNqwbRCaihEMMbFg3iExEiYoW2LBuEJmRExUtsGFdIKKiBTasG0QygqhoB1HRDqKi HURFOwhHchAV7SAq2kFUtIOoaAdR0Q6ioh1ERTuIinYQFe0gKtpBVLSDqGgHUdEOoqIdREU7iIp2 EM7eIJy9QTh7g3D2BuHsDcLZG4SzNwhnbxDO3iCcvUE4e4Nw9gbh7A3C2RuEszcIZ28Szt4knL1J OHuTcPYm4exNwtmbhLM3CWdvEs7eJJy9STh7E3H2RMWnZzN5dVteLHFuoNlMXi2bF0ucG4iaR89m 8moHvVhi3ouaR89m8mo1vVhi3ouaxyFqHoeoeRyi5nF8XfOIemEvlpj3ol5wiHrBIeoFh6gXHKJe cIh6wSHqBYeoFxyiXnCIesEh6gWHqBccol5wiHrBIfJdh8h3HSLfdYh81yHyXYfIdx0i33WIfNch 8l2HyHcdIt91iHzXIfJdh8h3HSLfdYh81ynyXafId50i33WKfNcp8l2nyHedIt91inzXKfJdp8h3 nSLfdYp810k0q5NoVifRrE6iWZ1EszqJZnUSzeokStJJlKSTKEknUZJOoiSdREk6iZJ0EiXpJErS SZSkkyhJJ1GSTqIknURJOomSdBIl6SRK0kmUpJMoSSdRkk6iJJ1ESTqJknQSJekkStJJlKSTKEkn YdJNwqSbhEk3CZNuEibdJEy6SZh0kzDpJmHSTcKkm4RJNwmTbhIm3SRMukmYdJMw6SZh0k3CpJuE STcJk24SJt0kTLpJmHSTMOkmYdJNwqSbhEk3CZNuiiq+Kar4pqjim6KKb4oqvimq+Kao4puiWm6K arkpquWmqJabolpuimq5KarlpqiWm6JabopquSmq5aaolpuiWm6KarkpquWmqJabolpuimq5Karl pqiWm6JabopquSmq5aaolpuiWm6KarkpquWmyPacIttzimzPKbI9p8j2nCLbc4pszymyPafI9pwi 23OKbM8psj2nyPacIttzimzPKbI9p8j2nCLbc4pszymyPafI9pwi23OKbM8psj2nyPacIttzimzP 6bE9E9lPm4gZeiJm6ImYoSdihp6IGXoiZuiJmKEnYoaeiBl6ImboiZihJ2KGnogZeiJm6ImYoSfi a56Ir3kiFuWJWJQnYlGeiEV5IhbliViUJ2JRnohFeSIW5YlYlCdiUZ6IRXkiFuWJWJQnYlGexJVa SbRdTaLtahJtV5Nou5pE29Uk2q4m0XY1ibarSbRdTaLtahJtV5Nou5pE29Uk2q4m0XY1iVapSbRK TaK9aRLtTZNob5pEe9Mk2psm0d40ifamSbQ3TaK9aRLtTZNob5pEe9Mk2psm0d40ifamidjFJGIX k4hdTCJ2MYnYxSRiF5OIXUwidjGJ2MUkYheTiF1MInYxidjFJGIXk4hdTCJ2MYnIZRKRyyQil0lE LpOIXCYRuUwicpkFIhlB5idEmJOIMCcRYU4iwpxEhDmJCHMSEeYkIsxJRJiTiDAnEWFOIhqbRDQ2 iWhsEtHYJKKxSURjs0Dk4QKNTSIam0Q0NonIZRKRyyQil0lELpOIXCYRuUwicplE5DKJyGUSkcsk IpdZIJIRQC6TiFwmEblMInKZJJouJNF0IYmmC0k0XUii6UISTReSaLqQRNOFJJouJNF0IYmmC0k0 XUii6UISTReSaLqQRNOFJMqTkihPSqI8KYnypCTKk5IoT0qiPOlsc7VY4hRelE0lUTaVRNlUEmVT SZRNJVE2lUTZVBJlU0mUTSVRNpVE2VQSpU5JlDolUeqURKlTEqVOSZQ6nbMJLZYndUqi1CmJUqck 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 VylYVylcVylYVylcVylYVylcVylYVylcVylYVylcVylYVzlcVzlYVzlcVzlYMzlcMzlYMzlcMzlY MzlcMzlYMzlcMzlYMzlcMzlYMzlcMzlYMzlcMzlYMzlcMzlYMyVcMyVYMyVcMyVYMyVcMyVYMyVc MyVYMyVcMyVYMyVcMyVYMyVcMyVYMyVcMyVYMyVcMyVYMyVcMyVYMzVcMzVYMzVcMzVYMzVcMzVY MzVcMzVYMzVcMzVYMzVcMzVYMzVcMzVYMzVcMzVYMzVcMzVYMzVcMzVYMy1cMy1YMy1cMy1YMy1c My1YMy1cMy1YMy1cMy1YMy1cMy1YMy1cMy1YMy1cMy1YMy1cMy1YMy1cMy1YMz1cMz1YMz1cMz1Y Mz1cMz1YMz1cMz1YMz1cMz1YMz1cMz1YMz1cMz1YMz1cMz1YMz1cMz1YMz1cMz1YMyNcM7+d/OYk bATraoTragTraoTragTraoTragTraoTragTraoTragTraoTragTraoTragTraoTragTraoTragTr aobragbqagbraobragbraobr6reT3/49grU3w7U3g7U3w7U3g7U3w7U3g7U3w7U3g7U3w7U3g7U3 w7U3g7U3w7U3Y7WXw7yEHOQl5DAvIQd5CTnMS8hBXkIO8xJykJeQw7yEHOQl5DAvIQd5CTnMS8hB XkIO8xJykJeQw7yEHOQl5DAvIQd5CTnMS8hBXkIO8xJykJeQw7yEHOQl5DAvIQd5CTnMS8hBXkIO 8xJykJeQw7yEHOQl5DAvIQd5CTnMS8hBXkIO8xJykJeQw7yE55PfejfKQe5CDnMXcpCXkMO8hBzk JeQwLyEHeQk5zEvIQV5CDvMScpCXkMO8hBzkJeQwL+H55Lcz7LbutB/lvt/6Bt0WFe81XbcV4xt0 Wx+8Qbd13BtEPoj7zjN7xxj5IO77wWzQbaH0BpFP774fzAaRj/y+H8wGoed0WwW/l76Rh3vfD2aD SEbc94PZIJIR9/1gNohkxH0/mA0iGXHfD2av7iMZcd8PZoNIRkySEZNkxH3nmQ0iGTFJRkySERNk RL3vprNBICPqfWOcDQIPt943xtkg8JzqfbuavaeSfOT37Wo2CBRhvW9Xs0HkOd23q9kgUIT1vl3N BoEirPftaq4XX0dodb0Pa7E0Q97r7dmLZQkyr3dtL5b42WvmLdcLuxfLEiter/deLEv4eDUDXixL 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 mR6umR6smR6umR6smR6umR6smR6umR6smR6umR6smR6umR6smR6umR6smR6umR6smR6umR6smR6u mR6smRGumRGsmRGumRGsmRGumRGsmRGumRGsmRGumRGsmRGumRGsmRGumRGsmRGumRGsmRGumRGs mRGumRGsmRmumRmsmRmumRmsmRmumRmsmRmumRmsmRmumRmsmRmumRmsmRmumRmsmRmumRmsmRmu mRmsmRmumRmrmX1tEYv4fPL1iNGaeT75esRozTyffD1itGaeT74eMVozzydfjxitmeeTr0eM1szz ydcjRmvm+eTrEaM183zy9YjRmnk++WrEI1wzR7BmjnDNHMGaOcI1cwRr5gjXzBGsmSNcM0ewZo5w zRzBmjnCNXMEa+YI18wRrJkjXDNHsGaOcM0cwZpJ4ZpJwZpJ4ZpJwZpJ4ZpJwZpJ4ZpJwZpJ4ZpJ wZpJ4ZpJwZpJ4ZpJwZpJ4ZpJwZpJ4ZpJwZpJ4ZpJwZrJ4ZrJwZrJ4ZrJwZrJ4ZrJwZrJ4ZrJwZrJ 4ZrJwZrJ4ZrJwZrJ4ZrJwZrJ4ZrJwZrJ4ZrJwZrJ4ZrJwZop4ZopwZop4ZopwZop4ZopwZop4Zop wZoJ8wBKkAdQwjyAEuQBlDAPoAR5ACXMAyhBHkAJ8wBKkAdQwjyAEuQBlDAPoAR5ACXMAyhBHkAJ 8wBKkAdQwjyAEuQBlDAPoAR5ACXMAyhBHkAJ8wBKkAdQwjyAEuQBlDAPoAR5ACXMAyhBHkAJ8wBK kAdQwjyAEuQBlDAPoAR5ACXMAyhBHkAJ8wBKkAdQwjyAEuQBlDAPoAR5ACXMAyhBHkAJ8wBKkAdQ wjyAEuQBlDAPoAR5ACXMAyjA8mMSi4JJLAomsSjY/z8Cuq9ZnsSiYBKLgkksCiaxKJjEomASi4JJ LApmAas3JvE1mMTXYBJfg0l8DSbxNZjE12ASX4NJfA0m8TWYxNdgEl+DSXwNJvE1mMTXYBJfg0l8 DSbxNZjE12ASX4NZwA6SWcAOklnADpJZwA6SWcAOklnADpJZwA6SWcAOklnADpJZwA6SWcAOklnA DpJZwA6SWcAOklnADpJZwA6SWcAOklnADpJZwA6SWcAOklnADpJZwA6SWcAOklnADpJZwA6SWcAO klnADpJZwA6SWcAOklnADpJZwA6SWcAOkilq7qeouZ+i5v5swrxYmp5zipr7KWrup6i5n6Lmfoqa +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 nH78+c0/nktz1fCHp6c/wh9+PG+9V90+B/qtWB9O7Jt3319/si7cq3/J4tN34Xc//tzvfti/e/ie QPjd05/73ZP9u4dvNITfPf+53z3bv3v47kX43cuf+92L/buHb4mE3/3bL+Kv/u7V/t3D91nC797+ 3O/e7N89fPMm/O79z/3u3f7dw3eEwu8+/tzvPuzfPXybKfzu88/97tP+3cP3rn/+d/9jjJu/e7bf 6+I3xMLv/u33usi98qu/TvjqWfh1/tyrWrZf1eKX5MLv/u1XtcjV+qu/Tvj2Xfh1/tzbV7bfvuI8 AeF3//bb1y8//q+nh/c/PPzy/u3fnz7+Efrw//lvD48P/0cZuT989//7+PTL//n67xZmLAi/2597 u8r221WcWyH87t9+u/rmc+2/Pdcxcw4/1zDLQ/jd/tzbU7bfnuJ8FOF3/3NvT9l+e4ozZ/787/7H GDd/92K/PcU5PsLv/uemYsWeisXZSMLv/udetYr9qhXnTQm/+5+bihV7KhZneAm/+597Lyv2e1mc iyb87n9uKlbsqVicNSf87n/uva3Y721xfp/wu/+5qVixp2JxJqLwu/+597piv9fFOZPC7/7n3uuK /V4XZ3f++d/9jzFu/u7Vfq+L81CF3/3PvddV+70uzpgVfvc/915X7fe6OLdX+N3/3Htdtd/r4ixk 4Xf/c+911X6vi/Olhd/9z73XVfu9Ls7sFn73P/deV+33ujgHXfjd/9x7XbXf6+JseeF3/3PvddV+ r4vz+oXf/c+911X7vS6uQPjzv/sfY9z83Zv9XhfXSgi/+597r2v2e11c1SH87n/uva7Z73Vx/Ynw u/+597pmv9fFlTLC7/7n3uua/V4X1/QIv/ufe69r9ntdXH0k/O5/7r2u2e91cZ2U8Lv/ufe6Zr/X fVnR9YWf+ysqyO++dvL6775C6GjBN6o2//KH/7x+lV8e/q//+2TYn9z87379+PDxb08fnvYH8+79 /t++f/rnj2+fYv9C/4py8nNBWw++DfSwcnKd/MN/vvHb/RH57v3Hhw8L8OPHlQbBn/Qriszyw9eO fvOh9i/+2UxlvZN+Fu4rys369LWj3/6Xv/hHq+T8hd/5KwrPN187+e1/+It/Mcpcbfdn4b4iBM1f yLSAL1j/4vf1my/9xl/Ri+b2taPf/oe/+GVZnr70K39FV9q/8C/3wL/8xa+qYx7j83Bf+bZKb792 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 FMoNIrNcKJQbRJy5UCg3iDhzoUhuZCLOXCiSG5mIMxeK5EYmks6FIrmRyd6PhSK5kRGvMCNeYUa8 wox4hRnxCjPiFWbEK8yIV5gRrzAjXmFGvMKMeIUZ8Qoz4hVmxCvMiFeYEa8wI15hRrzCjHiFGfEK M+IVZsQrzIhXmBGvMCNeYUa8wsx4haIN0dmWicHMCYSocD17OzGYOYEQ5bJng+gFG+YEQhTynl2m GMysAFHIe7aqYjCzAkQh79nvisHMChCFvGfTLAYzK0CUGJ+dtxjMrABRr3y272IwswJEvfI5AxCD iRWQRb3yOUgQg4kVkEXx8zmNEIOJFZBNTm42ObnZ5ORmk5ObTU5uNjm52eTkZpOTm01ObjY5udnk 5GaTk5tNTm42ObnZ5ORmk5ObTU5uNjm52eTkZpOTm01ObjY5udnk5GaTk5tNTm42ObnZ5ORmk5Ob kS43I11uRrrcjHS5GelyM9LlZqSwzUhhm5FWNiOtbEZa2Yy0shlpZXM9/rLT//ovf3j/4ec3H9d/ +OMhNPpG0tiMpLEZSWMzksZmJI3NSBqbkTQ2I2lsRtLYjKSxGUljM5LGZiSNzUgam5E0NiNpbEbS 2IyksRlJYzOi9mVE7cuI2pcRtS8jal9G1L6MqH0ZUfsyovZlRO3LiNqXEbUvI2pfRtS+jKh9GVH7 MqL2ZUTty4jalxG1LyNqX0bUvoyofRlR+zKi9mVE7cuI2pcZtc+UJWZTlphNWWI2ZYnZlCVmU5aY TSVhNpWE2RT/ZVP8l03xXzbFf9kU/+Wvi/9CTeSF/Nubfz49vP3p6c2Hp+8/P8MaTfFXNBPWFP5l U/iXTeFfNoV/2RT+ZVP4l03hXzaFf9kU/mVT+JdN4V82hX/ZFP7lrwv/9v+5kf/r6cP7h6d/fXx6 9/Hhlx//19PD2N+U5//04enNTx9//Pnp/7v+5/N/+mPs59AfnvaP8vH9ww72lz+eevj38999/jc+ vvnw8cd3f3347qf3b//+8O7Xn797+vDQH3ObZR6Px2Ntj//28P6HH3bI0sdRH9v6hnn7/sP+DTfw 3RXpl/Pn/OzX3f/U928+vtn/698//7ZfJ179tsdjj6981H88F/lA1udQaz7mgrTH+buPpI6eHlP8 E5mvfiIz8InQkc7/tuTrj5Hk64/h5KslH6O2Vj590ulx9qPuXQaxj3r9uq981OvEqx81noP97/uo j9BHfUQ+6pbzSuqajtnb77N6PtbZH0uOpnU/Xv2sj8BnTaeHdz/rVMIfdgp92CnyYafjWIDHbWu3 vkoS/QpZv+9rn3XgFRrPXO9+1iWe2PnLn/UO/ebjxw/Xb/v8bXDML/ziK8LPb/71347AdygeH3tv A6bWIJtag2xqDbKpNcim1iCbWoNsag2yqTXIptYgm1qDbGoNsqk1yKbWIJtag2xqDbKpNcim1iCb WoNsag2yqTXIptYgm1qDbGoNsqk1yJ7WoD0S3/ONun/ZslH3O9mNut/tLRQgd2zU/Vfwjbr/MrlR 99/ANur+RdxG3b+I2yiUG4DcsVEoN8AkYKFAU7tRKDdAo7FRKDcAuWOjUG4AcsdGodwA5I6NQrkB yB0bhXIDkDs2CuUGIHdsFMoNQO7YKJQbgNyxUSg3ALljo1BuAHLHRqHcAOSOjUK5AcgdG4VyA5A7 NorkBvFt2iiSG8S3aaNIbhDfpo0iuUF8mzaK5AbxbdoolBvAt2mjUG4A36aNQrkBfJs2CuUG8G3a KJQbwLdpo9DfFI+ucLVlYjCtZ72aOC+YR1e4Wj4xmDa1uRpEMZg2tbnaSTGYWQEeXeHqScVgZgV4 PsVXYysGMyvA88m6umMxmFkB3t3V1WKLwcwK8O6urj5dDGZWgHd3dTX7YjCzAry7q2tiIAYzK8C7 u7rGDl4w7+7qGlKIwcwK8O6urkmHGMysAO/u6hqXiMHMCjDvrkSfrGsUIwYTK0D0ybrmOWIwsQJE n6xrKCQGEytA9Mm6JktiMLMCPJ+sazwlBjMrwPPJumZcYjCzAjyfrGtQ5gUDvucbhWarwPd8o9Bs FfiebxSarQLf841Cs1Xge75RaO4OfM83CuUG8D3fKJQbwPd8o1BuAN+mjUK5AXybNgrlBvBt2iiU GwXlBnB72iiUGwXlBvCI2iiUG8AjaqNQbgCPqI1CuQG0vBuFcgOYRm0Uyg3EKySmURuFcgPxColp 1Eah3EC8QmIatVEoNxCvkJhGbRTKDcQrJArDhUK8QiL72iiUG4hXSEyjNgrlBuIVEtOojUK5gXiF xDRqo1BuIF4hMY26+i+xmTMnEJ5P8dXEicHMCYTnU3x1gmIwcwLh+RRf7aQXzPMpvppPMZhZAZ5P 8dXBisHMCvBMuq42WAxmVoBn0nX10mIwswKKWQGe49fVp4vBzArw7MOuZl8MZlaAZx92TQzEYGYF VLMCPAuxaxohBjMrwOTkihZi16RDDGZWgMnJFS3ErimKGMysAJOTK1qIXRMaMZhZASYn9xsmWWz6 IwYzK8Dk5H7DA4dNlsRgZgWYnFzRT+aaWonBzAowObmin8w1ERODeRWQkL4uIX1dQvq6hPR1Cenr EtLXJaSvS0hfl5C+LiF9XUL6uoT0dQnp6xLS1yWkr0tIX5cQPyghflBC/KCE+EEJ8YMS4gclxA9K iB+UED8oIX5QQvyghPhBCfGDEuIHJcQPSogflBA/KCF+UEL8oIT4QQnxgxLiByXED0qIH5QQPygh flBC/KCE+EEJ8YMS4gclxA9KiB+UED8oIX5QQvyghPhBCfGDEuIHJcQPSogflBBnJyHOTkKcnYQ4 O8nUjSRTN5JM3UgydSPJ1I0kUzeSTN1IMnUjydSNJFM3kkzdSDJ1I8nUjSRTN5JM3UgydSPJ5C0l k7eUTN5SMnlLyeQtJZO3lEzeUjJ5S8nkLSWTt5RM3lIyeUvJ5C0lk7eUTN5SMnlLyeQtJZO3lEze UjJ5S8nkLSWTt5RM3lIyeUvJ5C0lk7eUTN5SMnlLyeQtJZO3lEzeUjJ5S8nkLSWTt5RM3lIyeUvJ 5C0lk7eUTN5SMnlLyWQHJZMdlEx2UDLZQQlpqhLSVCWkqUpIU5WQpiohTVVCmqqENFUJqaMSUhEl pCJKZPX8RqFPg7iTJ7J6fqNQpRB38kRWz28UqhTiM57IEvmNQk+Z+IwnskR+o9BTJj7jqRCf8YUi T7kQn/GFIrlREA+qIB5UQTyognhQBfGgCuJBFcSDKogHVRAPqiAeVEGMpoIYTQUxmgpiNBXEaCqI 0VQQo6kgRlNBjKaCGE0FMZoKYjQVxGgqiNFUEKOpIEZTYYwmkYmfTCZ+Mpn4yWTiJ5OJn0wmfjKZ +Mlk4ieTPJ9MInhyieCiOXMSF4teDZMYTH2a5leQaM6cxMWiV48mBjOTVvRTTuIu0Kv/E4OZSSv6 KSdzF+jZW4rBxKQtop/y2aCKwcQKKCYvrpi8uGLy4orJiysmL66YvLhi8uKKyYsrJi+umFS2YlLZ ikllKyaVrZhUtmJS2YpJZSsmla2YVLZiUtmKSWUrJpWtfIPK9ubjm4cf3n/4+0I8fHj6668/vfnw Gfjh7U9vfvz5l4dff3n6/uG7n96//ftD6/nIbZOu377/sP/RH9/99eHd078+Pr37+MsO+PlPsP/V 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 GUNQqVNMSp1iUuoUk1KnmJQ6xaTUKSalTjEpdYpJqVNMSp1iUuoUk1KnmJQ6xaTUKSalTjEpdYpJ qVNMSp1iUuoUk1KnmJQ6xaTUKSalTjEpdYpJqVNMSp1iUuoUk1KnmJQ6xaTUKSalTjEpdYpJqVNM Sp1iUuoUk1KnmJQ82aTkySYlTzYpebJJyZNNSp5sUvJkk5Inm5Q82aTkySYlTzYpebJZyZPNSp5s VvJks5Inm5U82azkyWYlTzYrebJZyZPNSp5sVvJks5LampXU1qyktmakSM1IkZqRIjUjRWpGitSM FKkZKVIzUqRmpEjNSJGakSI1I0VqRorUjBSpGSlSM1KkZqRIzUiRmpEiNSNFakaK1IwUqRkpUjNS pGakSM1IkZqRIjUjRWpGitSMFKkZKVIzUqRmpEjNSJGakSI1I0VqRoy6jBh1GTHqMmLUZcSoy4hR lxGjLiNGXUaMuowYdRkx6jJi1GXEqMuIUZcRoy4jRl1GjLqMGHUZMeoyYtRlxKjLiFGXEaMuI0Zd Roy6jBh1GTHqMmLUZaUaMCvVgFmpBsxKNWBWqgGzUg2YlWrArFQDZqUaMCvVgFmpBsxKNWBWqgGz Ug2YlWrArFQDZqUaMCvVgFmpBsxKNWBWqgGzUg2YlWrArFQDZqUaMCvVgFmpBsxKNWBWqgGzUg2Y lWrArFQDZqUaMCvVgFmpBsxKNWBWMl+zkvmalczXrGS+ZiXzNSuZr1nJfM1K5mtWMl+zkvmalczX rGS+ZiXzNSuZr1nJfM1K5mtWMl+zkvmalczXrGS+ZiXzNSuZr1nJfM1K5mtWMl+zkvmalczX/Dbz df3P3z789ZePD59+/+2nxy8Pl39dlrc/2pc1/GU9+M/HL19/WX/q/qMBnxb3aVGfHvfpUZ8l7rNE fda4zxr12eI+W9Rnj/vsUZ8j7nMEffZL2OfTowGfKe4zRX3GcdSjOOpxHPUojnocRz2Kox7HUY/i qMdx1KM46nEc9SiOehxHPYqjHsdRj+JoxHE0ojgacRyNKI5GHEcjiqMRx9GI4mjEcTSiOBpxHI0o jkYcRyOKoxHH0YjiaMRxNKI4GnEcjSCOVgPloM/rowGfYRxdHw34DOPo+mjAZxhH10cDPsM4uj4a 8BnG0fXRgM8wjq6PBnyGcXR9NOAzjKProwGfYRxdH73vM8VxlKI4SnEcpSiOUhxHKYqjFMdRiuIo xXGUojhKcRylKI5SHEcpiqMUx1GK4ijFcZSiOEpxHKUojnIcRzmKoxzHUY7iKMdxlKM4ynEc5SiO chxHOYqjHMdRjuIox3GUozjKcRzlKI5yHEc5iqMcx1GO4sjiOLIojiyOI4viyOI4siiOLI4ji+LI 4jiyKI4sjiOL4sjiOLIojiyOI4viyOI4siiOLI4ji+LI4zjyKI48jiOP4sjjOPIojjyOI4/iyOM4 8iiOPI4jj+LI4zjyKI48jiOP4sjjOPIojjyOI4/iqMRxVKI4KnEclSiOShxHJYqjEsdRieKoxHFU ojgqcRyVKI5KHEcliqMSx1GJ4qjEcVSiOCpxHJUojmocRzWKoxrHUY3iqMZxVKM4qnEc1SiOahxH NYqjGsdRjeKoxnFUoziqcRzVKI5qHEc1iqMax1GN4qjFcdSiOGpxHLUojuJ8hhTlM6Q4nyFF+Qwp zmdIUT5DivMZUpTPkOJ8hhTlM6Q4nyFF+QwpzmdIUT5DivMZUpTPkOJ8hhTlM6Q4nyFF+QwpzmdI UT5DivMZUpTPkOJ8hhTlM6Q4nyFF+QwpzmdIUT5DivMZUpTPkOJ8hhTlM6Q4nyFF+QwpzmdIUT5D ivMZUpTPkOJ8hhTlM6Q4nyFF+QwpzmdIUT5DivMZUpTPkOJ8hhTlM6Q4nyFF+QwpzmdIUT5DivMZ 0GSBlkifp5ZIn6eWSJ+nlkifp5ZIn6eWSJ+nlkifp5ZIn6eWSJ+nlkjHppZI76WWSO+llkjvpZZI 76WWSO+llkjvpZZI76WWSO+llkjvpZZI76WWSO+llkjvpZZI76WWSO+llkjvpZZI76WWSO+llkjv pZZI76WWSO+lhqYZNjTNsKFphg1NM2xommFD0wwbmmbY0DTDhqYZNjTNsKFphg3NJWxoLmFDcwkb mkvY0FzChuYSNjSXsKG5hA3NJWxoLmFDcwkbmkvY0FzChuYSNjSXsKG5hA3NJWxoLmFDcwkbmku4 ZTcq3d2W9Aid6fSdW4okdKbTd24JldCZTt+5pV9CZzp955as3dB3Plv99Ovnj39/qiH854fL9PL0 jy4PP3/+8vCm+/Snj5+/fPn9H9++Pz4tbzz9n/bP8t9///T33eJPnz4//NeHx0/f1rf64S/9wWo9 c/ehf3z5/NOvj789/I9fvv3tD098/Pzp27T8uj7Yq4+zf5q/ffjn48PHXx8/fHn8y+tnWLIrfIVK QAobL20Zs9CZEpDCxktb2i10pms5sCXpQmfKnyRh46Ut0xc6UyJA2HhpKxcInSkRIGy8tNUcdM6E jZe2CoXQmRIBwsZLTTlytClHjjblyNGmHDnalCNHm3LkaFOOHG3KkaNNOXK0KaeENuWU0KacEtqU U0KbckpoU04JbcopoU05JbQpp4Q25ZTQppwS2pRTQptySmhTTgltyimhTTkltCmnhDbllNCmnBLa bkwJjXAWRpzfOqL81hHnt44ov3XE+a0jym8dcX7riPJbR5zfOqL81hHnt44ov3XE+a0jym8dcX7r iPJbR5zfOqL81hHnt44ov3XE+a0jym8dcX7riPJbR5zfOqL81hHnt44ov3XE+a0jym8dcX7riPJb R5zfOqL81hHnt44ov3XE+a0jym8dcX7riPJbR5zfOqL81hHnt44ov3XE+a0jym8dcX7riPJbR5zf OqL81hHnt44ov3XE+a0jym8dcX7riPJbR5zf+v3R/R/+/PnLbx++vbwjGVES7IiTYEeUBDviJNgR JcGOOAn2+6N3feZwU6/vjwZ8hsF2ffTmi8zBzl8jhzt/fX804DOMyBzs/DVyuPPX90cDPsOIvD56 Z9GDsM3h9mDfHw34DCPy+uidLxOEbQ73EPv+aMBnGLY52ENs5HAPse+P3l6gYKOx+WAc2ymC7WA3 spHD3ci+PxrwGcf206N3vkx0Awi3LPv+aMBnfAMItiwbOdyy7PujAZ9xbAdblo0cbln2/dGAzzhs gy3LRg63LPv+aMBnHJHBlmUjh1uWfX804DMOtmDLspHDLcu+PxrwGcdRsGXZyOGWZd8fDfiM4yjY smzkcMuy748GfMZxFGxZNnK4Zdn3RwM+4zg6z6zql7R2SGJ1mjS7WZ0mzW5Wp0mzy+q8dG6zQmt4 Xjq3WZ0mzW5WpwnVm9VpQvVmhWLjvHRus0KxkVFsnBfcbVYoNs7L9DYrFBvnZXqbFYqN8zK9zQrF xnmZ3rI6L7jbrNBbPi+426zQWz4vuNus0Fs+L7jbrNBbPi+426zQDnBecLdZodg4L7jbrFBsnBfc bVYoNs4L7jYrFBvnBXebFYqN84K7zQrFxnnB3WaFYuO8TG+zQrFxXqa3WaHYOC/T26xQbJyX6W1W KDbOy/Q2KxQb52V6mxWKjfMyvc0KxcZ5md5mhWIjqUhbTwmW0JmKtPWUjumcySSAT8mb0JmKtPWU 6gmdqWiLT4mh0JkSATIJ4FN2KXSmRMDbekKWogqdKREg09w95blCZ0oEyDR3T8my0JkSATKZ3FPG LXSmDFqZTO4pbRc6UwatTCb3lPsLnUmDVrlty2RyT3UFoTMlAmQyuafihNCZEgEymdxThUPoTIkA mUzuqUwidKZEgEwm91RrETpTIkCmuXsq2AidKREg09w9VX10zmSau6cakdCZEgEyzd1ToUnoTIkA mebuqVoldKZEgExzt5yd70y1WaFy6PnOVJsVKod2VA7tqBzaUWGzo8JmR4XNgd7yQO9roPc10Psa 6H0NVL4e6C0P8pbtQt6XXQgq7ULesl3IW7YLect2IW/ZLuQt24W9L4JKS+gtJ/SWE3rLCb3lhN5y Qm8Zkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8Mkd8M kd8Mkd8Mkd8Mkd8Mkd/sfI/6ZYUoc4Yoc4Yoc8Yoc7LeIE/pi9CZMlN/uzcIy4GEzpSZelcm112Z XHdlcj2UQTuUcTaUcTaUcTaUcTaUFaGhDNohDNqVLgqdCTfHlVwKnQmDdqWiQmfCoF2Jq9CZNM6E m+PKfoXOlEGblEGblEGblEGblEGrpE6akjppSuqkKamTpqROmpI6aUrqpCmpk6akTpqSOmlK6qQp qZOmpE6akjppSuqkKamTpqROmpI6aUrqpCmpk6akTpqSOmlK6qTJxhU81WuEzpQIUPIwTcjDNCSD MiSDMiSDMiSDMiSDMiSDMiRoMiRoMiRoMiRoMiRoMiRoMiRoMiRoMiRoMsTuMMTuMMTuMMTuMMTu MMTumFYoNggnxBAnxBAnxBAnZFqh2CBMEkNMEkNMEkNMEkNMEkNMEkNMkmlFYgPxTwzxTwzxTwzx TwzxTwzxTwzxT6YViQ3EWjHEWjHEPzHEPzHEPzHEPzHEJDHECTHECTHE7jDE7jDE7jDE7jDE7jDE 7jDE7jAl69+UrH9Tsv5Nyfo3JevflKx/UxL1TUnUNyVR35REfVMS9U1J1DclUd+URH1TEvVNSYAx JQHGlAQYUxJgTEmAMSUBZksqhc6UCBCyaUzJpjElm2bLY4XOlAgQUnNMSc0xJTXHlNQcU1JzTEnN 2fJvmTMlz8eUPB9T8nxMyfMxJc/HlDwfU/J8trqB0JkQAUrSkCl5Pqbk+ZiS52NKno8pqTmmZNOY kk1jSgKMKQkwpiTAmJIAY0oCjCkJMKYkwBgS5xgS5xgS5xgS5xgS5xgS5xgS5xgS5xgS5xgS5xgS 5xgS5xgS5xgS5xgS5xgS50wrFBukn/W0QrFB+llPKxQbpJ/1BAqKDdLPelqh2CD9rKcVig3Sz3pa odgg/aynFYoN0s96bocoNkg/62mFYoP0s55WKDYQkcsQkcsQkcsQkcsQkctIP+tphWID0b8M0b8M 0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b8M0b+UAgRT ChBMKUAwpQDBlAIEUwoQTClAMKUAwZQCBFMKEEwpQDClAMGUAgRTChBMKUAwqQDBhI2gtzRY6EyJ AGEj6C2XFjpTIkDYCHpLyIXOlAgQNoLesnqhMyUChI2gt9KA0JkSAcJG0Ft9QehMiQBhI+itSCF0 pkSAkhJqSkqoKSmhpqSEmpISasJG0FtxRehMiQAlv9SU/FJT8ktNyS81Jb/UlPxSU/JLTckvNSW/ 1JT8UlPyS03JLzUlv9SU/FJT8ktNyS81Jb/UlPxSU/JLDcknDcknDcknDcknDcknDcknDcknDckn HcknHcknHcknHcknHcknHcknHcknHcknHcknHcknnTT9nlYoNpDo0pHo0pHo0knT72mFYoM0/Z5W KDaQwNNJ0+9phWIDyUIdyUIdyUIdyUIdyUIdyUId8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod 8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qod8Qqd8QqV +j5T6vtMqe8zpb7PlPo+U+r7TKnvM6W+z5X6Plfq+1yp73Olvs+V+j5X6vtcqe9zpb7Plfo+V+r7 XNgUfEuahc6UCFCKBV0pFnRhU/AtTxc6UyJAKWN0pYzRhU3Bt9KA0JkSAUpNpCs1ka7URLpSE+lK TaQrObmu5OS6kpPrSk6uKzm5ruTkupKT60pOris5ua7k5LqSk+tKTq4rObmu5OS6kpPrSk6uKzm5 ruTkupKT60pOris5ua7k5LqSk+tKTq4rObmu5OS6kpPrSk6uI12uI12uI12uI12uI12uI12uI12u I12uI12uI12uI12uI12uI12uI4WtI4WtI4WtI4WtI4WtI4WtI4WtI4WtI4WtI4WtI62sI9WrI9Wr I9WrI9WrI9WrI9WrI9WrI9WrI9WrI9aeI9aeI9aeI9aeI9aeI9aeI9aeI9ZeQay9glh7BbH2CmLt FcTaK4i1VxBrryDWXkGsvYJYewWx9gpi7RXE2iuItVcQa68g1l5BrL2CWHsFsfYKY+0pFYeuVBy6 UnHoSsWhKxWHrlQculJx6ErFoSsVh65UHLpScehKxaErFYeuFAm6UiToSpGgK0WCrhQJulIk6EqR oCtFgq4UCbpSJOhKXZ8rpXiulOK5UornSimeK6V4rpTiuVKK50opniuleK6kgrqSCupKKqgrqaCu pIK6kgrqSiqoK6mgRUkFLUoqaFFSQYuSClqUVNCipIIWJRW0KKmgRUkFLUoqaFFSQYuSClqUVNCi pIIWJRW0KKmgRUkFLUoqaFFSQcvbVND1P3/78NdfPj58+v23nx6/PFz+dVne/mhf1kiS9eA/H798 /WX9qfuPBnxa3KdFfXrcp0d9lrjPEvVZ4z5r1GeL+2xRnz3us0d9jrjPEfSZL2GfT48GfKa4zxT1 GcdRjuIox3GUozjKcRzlKI5yHEc5iqMcx1GO4ijHcZSjOMpxHOUojnIcRzmKI4vjyKI4sjiOLIoj i+PIojiyOI4siiOL48iiOLI4jiyKI4vjyKI4sjiOLIoji+PIojiyOI4siiOP48ijOPI4jjyKI4/j yKM48jiOPIojj+PIozjyOI48iiOP48ijOPI4jjyKI4/jyKM48jiOPIqjEsdRieKoxHFUojgqcRyV KI5KHEcliqMSx1GJ4qjEcVSiOCpxHJUojkocRyWKoxLHUYniqMRxVKI4qnEc1SiOahxHNYqjGsdR jeKoxnFUoziqcRzVKI5qHEc1iqMax1GN4qjGcVSjOKpxHNUojmocRzWKoxbHUYviqMVx1KI4anEc tSiOWhxHLYqjFsdRi+KoxXFERAMNjb1raOxdQ2PvGhp719DYu4bG3jU09q6hsXcNjb1raOxdQ2Pv Ghp719DYu4bG3jU09q5BfBFRTkNj7xoae9fQ2Lv1f5AVig0y9q6hsXcNjb1raOxdQ2PvGhpg19Ao uoaaYjflqJOmHHXSlKNOmnLUSVOOOmnKUSdNOeqkKUedNOWok6YcddKUo06actRJU446acpRJ005 6qQpR5005aiTphx10pSjTppy1Ml2PhA6UyJAOOqkKUedNOWok6YcddKUo06acjpJUw4UaTd60D48 /effHz789dPnh/94OHdozpc2aqondaxXq3OHy6vVucPl1epc4nG1OnckvVqhNTypEr1aoZU/qRK9 Wp1LPK5W5xKPqxWKjZMq0asVio2TKtGrFYqNk33ur1ZoDU/2ub9aoTU82ef+aoXW8GSf+6sVwtfJ PvdXK4Svk33ur1YoNk72ub9aodg42ef+aoVi42Rn9yerkwXc599KwQ/780+o0JnkMPT8gyt0JjlZ Pf8865xphAbPP+ZCZ5J04PmnX+hMkg48HxSEzpQI0AgNnk8bQmdKBGi6xz4fWYTOlG9T0z32+dwj dKZ8m5rusc+HJ6Ez5X6m6R77fAITOlMiQNM99vkYJ3SmRICme+zzWVDnTHOVsjkzdCI2dCK2enLy 09UKZEvTCmRL0wqcvqcVyJYM5QfTCmRL0wpkS9MKxcbJzrVPViepNVcr9L5O0l2uVuh9naS7XK3Q +zpJd7laofd1ku5ytUJYPkl3uVqh2DhJd7laodg4SXe5WqHYOEl3ebI6SSa5WqGVP0kmuVqhlT9J JrlaoZU/SUF5sjrZMXS3aic7hl6tCCrbyY6hVysSG+1kx9CrFYmNRu6CphWJjUbugqYVig1yFzSt 0I4tPImb8iS+nUGFznS56HZiFTpT5giaOQ7Px16hM10uuh2Shc6UCNB0On0+aQudKeNMQ+t7Pq4L nSnjTEPrez7zC50p40xD63tOHITOlDuthtb3nH0InSkRoKH1PacwQmdKBGj4bs95kNCZMjQ0fLfn ZEroTBkaGvLcc0Ymc9Y03RSf8zehMyECmqab4nMSKHQmREATkhy2TFLoTIiAJiQ5bOmo0JkSAags 11BZrqGyXDupDLtaoYINKuY1VMxrqCzXUFmuobJcOznk6cnqpJ7saoXe8snBS7tVR6WyjkplHZWv OipfdVS+6oTKPK0IUjqhMk8rtPKEXjyt0PvK6H1l9L4yWvmMVj6jlc9kj+oZva+M3peh92XofRnC l6G3TGju0wrth4TmPq1QbBCa+7RCv1/K5L8pk/+mTP6bRjn3fNoSOlPmUcpKQlMm/02Z/Ddl8t80 w0Sej4NCZ8qg1YzseD5TCp0J46wrE9muTGS7MpHtQrb+droVOlPGmZBgvx2Rhc6UcZaVcZaVcZaV oZGVoZGVoZGFv07raC90powzU8aZKePMlPuZKYNWqFfZcg+hMyUChHqVLYEROtMhoNSTM76vViC1 KoixVxBjryDuXUHcu4JYdAWx6Api0RXEoiuIRVcQi25aofdFCorTCr0v0uVgWqH3RcqQpZEy5LRC 7yuDsta0Qm+ZFC+nFShrTSv0lknxclqht0yKl9MKvWVSvJxW6C2T4uW0Qm+ZFC9LI90bphWKDaI6 K42ozqYVig2iOptWKDaI6mxaodggqrNphfYNojqbViQ26tvjVtf//PTTr58//v3rQ64PP3/+8sr0 avnlcf2lb58f0E6u5BUVJa+oKHlFRUkFKkoqUFGyd4qSvVOU7J2iZO8UJXunKNk726FZ6EwZZ8I6 5XbyFjpTxpmw6Lkd34XOlHGWdcWoLQcQOlMGbdYVo7ZEQuhMGbTCCuqWjQidKYNWWEHdUhqhM2XQ CiuoW16kcyZsnrJlUUJnSgQIVZZbKiZ0pkSAUGW55XNCZ0oECFWWW1IodKZEgFBlWRrpZzKtUHZ+ cijJkxUhdhdE0S6Iol0QRbsginZBFO2CKNoFUbSnFVn5Tro0TCsSGx3dFCHqeUHU82lF4rCj+yVE cy+I5l4Qzb0gmntBNPeCaO7TCsUGu5US6uK3jVznTDNr4nnbFzpTngyE7M+iZH8WJfuzKNmfRcn+ LEr25/ZzJXPWhaLU7cdN6Ey4ZkrGbFEyZrcfTqEzITaVXN6i5PIWJZe3KLm8RcnlLUou7/aDL3Sm C9qGDksN6fQaOsA0pO5rSN3XkLqvIXXftEIrTy5jG9IETitwTG1ISdiQkrAhJWFDSsKG1H2tk0El 0wq9LzKoZFqh90UGlUwr9L4IQaZ1QpCZVgjLhCAzrVBsEILMtEKxQQgyTfmj3pQymCb+6dSd95pS U9OUmpqm1NRsP3pCZ7rzXlMKdLZfTqEzJQKEd9VNqfZpSrVPU2pqtt9woTNlnAknYGwHAaEzZZwJ b4S304TOmfBGeDt7CJ0pESC8Ed4OMEJnSgQIb4RHG+BMOK3AmXCgq7dpBc6EA13YTSuQL0wrcPIf nYjPphU4+Q90pTjQleJAV4oDXSkOdKU40JXiQFeKA10pDnSlOFCVbKArxYGuFAe6UhyojjdQHW+g Ot5AFbmBKnIDVeQGqsgNVJEbqCI3UEVuoIrcQBW5gSpyA1XkBuqBNVAPrIF6YA3UzWp0MrR5WiGk kKHNA9VCB6qFDlQLHagWOlAtdKBa6EC10IFqoQPVQgeqhQ5UCx2oFjpQLXQ7zwuTA11CNZQEhy0p EDqTJlS6ksKWWcicdaE8cctDhM6EcaYkhQwlKWQoSSFDSQoZSlLIUJJChpIUMpSkkKG8PxpKUshQ kkKGkhQylNdkQ3lNNpTXZEN5szWUN1tDebM1lDdbQ3mzNZQ3W0N5szWUN1tDebM1lDdbQ3mzNZQ9 2YayJ9tQ9mQbyjZqW54tdKbcglwZGsJLz6G89BzKS8+hvPQcykvPobz0HMpLz6G89BzKS8+hvPQc ykvPobz0HMJLz5ZI3XBZna8NLavztaFldb42tKzO14aW1fna0LI6XzdcVufrhsvqfN1wWZ2vG04r UDdcVig2QN1wWaG3DCqAywq9ZdAubFmhtwzahU0rIOpeVugtV/SWK9oBKooNIFZfVig2KoqNimKj othoKDYaio2GYqOh2GgoNhqKDTB5b1mh2ACT95YVio2OYgNM+VtWKDZAM4hlhWKjo9gAjSeWFYoN 0HhiWaHYAI0nlhV6y4Azt6zQ+wLst2WF3hdo2L6syPsagDO3rAiWB2jesaxYFiDLVfekR+hMlqvu KZLQmSxX3RMqoTNZtWZPv4TOZNWaPVnTOdNVa/bUTuhMiQBdgWXPD4XOlEGr6zO2J5lCZ8qg1XWt 2TNVoTNl0Fbltl2VCNB1+tmTY6EzJQKqEgFViYCmREBTIqApEdCUCGhKBDQlAnSjZvfKgNCZEgG6 ll57eUHoTIkA3RDcvUYhdKZEQFciQNdTba9/CJ0pEaDrqbYXUYTOlEGr4y/vlRihM2Wc6SjHezlH 6EwYZ0PHX95rQkJnwqAdOjJ0M1RMNVRMNVRMnVagOGeoBGuoBDutQKHdUOHWUDHVUDHVUIHTUIFz WpE1HEBKvKxA8XtakZUfQBQ8rYAoeFkRpAwgCl5W6C0DUfCyQm8ZiIKXFbjimFYoNkBzv2kFpMTL CsUGkBIvKxQbQEq8rFBsACnxskKxAaTEywrFBpi0uaxQbADZ8rJCsQEmbS4rFBtAIr2sUGwYig0g rJ5WhCA5rVBsEILktEKxQQiS0wrFBiFITisUG4QgOa1QbBCCpCkrDqasOJiy4rAlIEJnukzQlOWL LYsROtPVQkxZcTBlxcGUeb1J8/qhEznvaZbQma6ytSVlQmfK0NDpkvfMTuhMGbQ6XfKeHgqdKYNW p0vec0yhMyUCdO1790RV6EyJAJ3Iec92hc6UCNCJnPeUWehMiQCdyHnPu3XOdKNm9yxd6EyJAN2o 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 hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYZ4hYYYgoYYgoYYgoYYgoYY goYYgoYYgoYYgoYYgsYYgsLZy105e7krZy935ezlrpy93JWzl7ty9nJXzl7uytnLW2IodKZEwBAi QDkVuiunQnflVOgtRRU6EyJAOWK6K0dMd+WI6a4cMb0lyzpnSYkA4fDrLeMWOlMiQDhJuysnaXfl JO2unKTdlZO0+41J2qxSIHSmREBWIiArEaBk15qSXWtKdq0p2bWmZNeakl1rSnatKdm1pmTXmpJd a0p2rSnZtaZk15qSXWtKdq0p2bWmZNeakhBrSkKsKQmxpiTEmpIQa0pCrCkJsaYkxJqSEGtKQqwh UawhUawhUawhUawhUawhUawhUawhUawhUawhUawhUawhUawhUawhUawhUSxrLmJIFGtIFGtIFGtI FGtIFGtI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mpI3mqInmeInmeInmeI nmeInmeInmeInmeInmeInmeInmeInmeInueInueInueInueInueInueInueInueInueInueInueI nueInueInueInueInueMnqeUFppSWmhKaaEppYWmlBaaUlpoSmmhKaWFppQWmlJaaEppoSmlhaaU FppSWmhKaaEppYWmlBaaUlpoSmmhKaWFppQWmlINaEo1oCnVgKZUA5pSDWhKNaAp1YCmVAOaUg1o SjWgKdWAplQDmlINaEo1oCk5rKbksJqSw2pKDqspOaym5LCaksNqSg6rKTmspuSwmpLDakoOqys5 rK7ksLqSw+pKDqsrOayu5LC6ksPqSg6rKzmsruSwupLD6koOqys5rK7ksLqSw+o6Duu4kM64y+p8 KW9ZnS/lLavzpbxldb7Mu6zOl3mX1fky77I6X+adVuDqcFmdL/MuKxQb4OpwWaHYAFeHywrFBrg6 XFYoNsDV4bQCV4fLCsUGuDpcVig2wNXhskKxAa4OlxWKDXB1OC6kR8eyIu+LdNtYVuR9kW4by4q8 L9I3Y1kRVJK+GcsKvS9wxbas0PsCV2zLCr0v0AFjWaG3DDpgTCvQAWNZkb2XdMBYVig2QAeMZYVi A3TAWFYoNkAHjGWFYgN0wFhWKDZAB4xlhWIDdMBYVuw8L8vt9vRF6EyW2+3JjtCZrLqxp0ZCZ7Lq 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 dIZqq2RGpTuZUelOZlT6UpoSK1RbNVRbNVRbdVRbdVR3dxQbjmLDUWw4ig1HseEoNhzFhqPYKCg2 CoqNgmKjoNgoKDYKio2CYqOg2CgoNgqKjYpio6LYqCg2KoqNimKjotioKDYqig3EK3TEK3TEK3TE K3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TEK3TE K3TEK3TEK3TEK3TEK3TEK3ThzLktLRM6U1Yg3p45x3I7oTNlBcKUFQhTViBcWYFwZQXClQhwJQJc iQBXIsCVCHAlAlyJAFcioCgRUJQIKEoEFCUCihIBRYmAokRAUSKgKBFQlAioSgRUJQKqEgFViYCq REBVIqAqEVCVCFBycl3JyXUlJ9eVnFxXcnJdycl1JSfXlZxcV3JyXcnJdSUn15WcXFdycl3JyXUl J9eVnFxXcnJdycl1JSfXlZxcV3JyXcnJdSUn15WcXFdycl3JyXUlJ9eVnFxHulxHulxHulxHutyC dLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC9Llsv4mBelyC9LlFqTLLUiXW5AutyBdbkG6 3IJ0uQUpbAtS2BaksC1IYVuQwrYghW1BCtuCFLYFKWwLUtgWpLAtiCFYEEOwIIZgQQzBghiCBTEE C2IIFsQQLIghWBBDsCCGYEEMwYIYggUxBAtiCBbEECyIIVgQQ7AghmBBDMGCGIIFMQQLYggWxBAs iCFYEEOwIIZgYQxBpbrRlepGV6obXaluLEp1Y1GqG4tS3ViU6saiVDcWpbqxKNWNRaluLEp1Y1Gq G4tS3ViU6saiVDcWpbqxKNWNRaluLEp1Y1GqG4tS3ViU6saiFCQWpSCxKAWJRSlILEpBYlEKEotS kFiUgsSiFCQWpSCxKAWJRUmILUpCbFESYouSEFuUhNiiJMQWJSG2KAmxRUmILUpCbFESYouSEFuU hNiiJMQWJSG2KAmxRUmILUpCbFESYouSEFuUhNiiJMQWJSG2KAmxRUmILUpCbFESYouQEFtRc96K mvNW1Jy3oua8FTXnrag5b0XNeStqzltRc96K2uxW1Ga3oja7FbXZrajNbkVtditqE1JRm5CK2oRU 1CakojYhFbUJqahNSEVtQipqE1JRm5CK2oRU1PCjooYfFTX8qKjhR0UNPypq3VFR646KWndU1Lqj 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 CSErEkJWJISsSAhZkRCyIiFkRULIioSQFQkhKxJCViSErEgIWZEQsiIhZEVCyIqEkBUJISsSQlYk hKxICFmRELIiIWRFQsiKhJAVCSErEkJWJGmsSNJYESWrIkpWRZSsiihZFVGyKiJXVUSuaohc1RBN qiGaVEM0qYZoUg3RpBqiSTVEeGqI8NQQ4akh6lJDJKSG6ESNEYOUoqaqFDVVpaipKkVNVSlqqkpR U1WKmqpS1FSVoqaqFDVVpaipKkVNVSlqqkpRU1WKmqpS1FSVoqaqFDVVpaipKkVNVSlqqkpRU1WK mqpS1FSVoqaqFDVVpaipKkVNVSlqqkpRU1WKmqpS1FSVoqaq1CFVpQ6pKlmBVckKrEpWYFWyAquS FViVRL6qJPI1JZGvKbl3Tcm9a0ruXVNy75qSe9eU3LumpMs1JV2uKelyTclwa0pSWlPyyJqK+tUv l8v5wZG71dkqz251tiq3W52tDe1WZ6tyu9XZitJudbb2uludrUNtVqcFarsVesunpWa7FXrLp6Vm uxV6y6elZrsVesunpWab1Wmp2W51tmK7W6HYOC01261QbJyWmu1WKDZOS812KxQbp6VmuxV6y6cF arsVesunZW27FXpfp9vK71bsfSEsn5a17VZo5U9LzXYrtPKnuUq7FVr506yj3Qqt/Gn+0G6FYv40 f2i3Qit/mtOzWZ1m5+xWaLc5zc7ZrdDKn2bnXE/LwqO3KF25nq2FzkS5z/UkLnQmSqSu53ahM2VW phLkXA//QmfKoFVpaK4ZhNCZMmhVGpprGiJ0pgxalYbmmssInSkRoNLQXBMioTMlAlQammtWJXSm RIBKQ3NNzYTOlEGrar5+ze+EzpRxpuqXfk0Shc6UO61K3XPNNIXOlFuQinN3TVeFzpShoaLJXXNe oTNlaKiYbdfEWehMGRoq/tg1+xY6U/6gqChf1xRe6EwZGqflOLsVKtCcluPsVqisc1qOs1uhYtBp Oc5uhYpBp+U4uxUqBp2W4+xWKDZOTxjbrE7LcXYr9JZPC2t2K/S+Tgtrdiv0vk73Ot6tEJZPy3GW 1flex7sVecvnex3vViQ2zvc63q1IbJzvdbxbkdg43+t4t0KxcVr6s1uh2EBUkvO9jncr9JYRKeR8 /+HdCr0vRO843394t0LvC5FCzvcf3q3QW0akkPP9h3crFBuI3nG+k/Buhd4yonec7yS8W6G3jOgd 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 odgg/QIaukNo6A5hWqHYIDcP0wrFBukXMK1QbJB+AdOK5Sm6bLopeWxNyWNrSh5bU/LYmpLH1pQ8 tqbksTUlj60peWxNyWNrSh5bU/LYmpLH1pQ8tqbksTXlvXJT3is35b1yU94rN+W9clPeKzflvXJT 3is35b1yU94rN+W9clPeKzflvXJT3is35b1yU94rN+W9clPeKzflvXJT3is35b1yU94rN+W9clPe KzflvXJT3is35b1yU94rN+W9clPeKzflvXJT3is35b1yU94rN+W9clPeKzflvfJWQhI6UyJAeOPd lDfeW3lK6EyJAGFvk63GJXSmRICwt8lWKNM5I53HphWqXJLOYzMdQDVIxJXoiCvREVeiI65ER1yJ jrgSHXElOmIHdHSL3tEteke36B3dond0i97RLXpHt+gd3aJ3dIveheL6bRMSOlP+ECnvEbryHqEr 7xG68h6hK+8RuvIeoSvvEbryHqEry9hdWZLtypJsV5Zku7Ik25Ul2a4syXZlSbYrS7JdWJIdiF4x EL1iIHrFQPSKgegVA9ErBqJXDESvGIheMRC9YiB6xUD0ioHoFQPRKwaiVwxEr5hWKDbIOIZphWKD jGOYVig2yDiG0ck4hmmFYoOMY5hWKDbIOIZphWKDjGOYVig2yDiGaYVig4xjmFYoNsg4hmmFYoOM Y5hWKDbIOIZphWKDjGOYVig2yDiGaYVig4xjmFYoNsg4hmmFYoOMYxioKDpQUXSgoujoRHY2UCl1 oFLqQKXUgUqpA5VSByqlDlRKHaiUOq1QbBDZ2bRCsSG8Dh3K69ChvA4dyuvQobwOHcrr0KG8Dh3K 69ChvA4dyuvQobwOHcrr0KG8Dh3K69ChvA4dyuvQLd8VOlMiQDjqYUuahc6UCBCOetgyb6EzJQKE ox629F3oTIkA4aiHrQYgdKZEgHDUw1ZI0DkTjnrYyg5CZ0oECEc9bLULoTMlAoSjHrYCiNCZEgHC UQ9bFUXoTIkA4aiHrRQjdKZEgHDUw1bPETpTIkDIRhlKNspWKxI6UyJASG0ZSmrLUFJbhpLaMpTU lqGktgwltWUrfemcCSWyW6FM6AzVVknbpoGImdMK1VZJ26ZphWqrpG3TQITTgQinAxFOByKcDkQ4 HYhwOhDhdCDC6UCE02mFYoO0bRqdtG2aVig2SNumaYVig7RtmlYoNkjbpmmFYoO0bZpWJDYGads0 rUhsDNK2aVqR2BikbdO0IrExSNumaUViYyBe4UC8woF4hQPxCgfiFQ7EKxyIVzgQr3AgXuFAvMKB eIUD8QoHYggOxBAciCE4EENwIIbgQAzBgRiCAzEEB2IIDsQQHIghOBBDcCCG4EAMwcEYgsJmQ1uC JXSmrCUImw1tWZrQmbKWIGw2NJTKlqFUtgylsmUolS1DqWwZSmXLUCpbhlLZMrTKFmGzoS2h1TkT Nhva0l+hMyUChM2Gthxa6EyJAGGzoS0RFzpTIkDYbGjL5oXOhAgYwmZDW0lA6EyIgCFsNrTVFYTO hAgYSnbtULJrh5JdO5Ts2qFk1w4lu3Yo2bVDya4dSnbtULJrh5JdO5Ts2qEkxA4lIXYoCbFDSYgd SkLsUBJih5IQO5SE2KEkxA4lIXYoCbFDSYgdSkLsUBJih4wQmy8JiNs2q9Pl0M3qdDl0szpdDl1W 58Vtm9XpcuhmdboculmdLoduVqfLoZvV6XLoZoVi47y4bbNCsXFe3LaszovbNisUG+fJOZsVio3z 5JzNCsXGeXLOZoVi4zw5Z7NCsXGenLNZodg4T87ZrFBsnCfnbFYoNs6TczYrFBvnyTmbFYqN8+Sc zQrFxnlyzmaFYuM8OWezQrFxnpyzWaHYOE/O2axIbAByzmZFYgOQczYrEhuAnLNZkdgA5JzNisQG IOdsVig2zpNzNisUG+fJOZsVio3z5JzNCsXGeXLOZoVi4zw5Z7NCvykyMcpTWiZ0pqpAPCVxOmcy McpTyid0pqpAPCWIQmeqCsRTOil0pkSATIzylJMKnSkRIBOjPCW2QmdKBMgoVE/ZsdCZEgEyCtVT ii10pkSAjEL1lKcLnSkRIKNQPSX7QmdKBMgoVE8VA6EzJQJkFKqnsoPOmYxC9VSkEDpTIkBGoXqq dAidKREgo1A9lUuEzpQIkFGonmouQmdCBOgoVE+FG6EzIQJ0FKqn6o/QmRABOgrVUwlJ50xGoXoq OAmdKREgo1A9Va2EzpQIkFGonkpfQmdKBMgoVMvZ+ab5mxWqrZ6XxG1WqLZ6XhK3WaHa6nlJ3GaF aqvnJXGbFaq7n5fEbVYoNs5L4jYrFBvnJXGbFYqN803zNysUG+eb5m9WKDbON83frFBsnG+av1mh 2DjfNH+zQrFxvmn+ZoVi43zT/M0Kxcb5pvmbFYqN803zNysUG+eb5m9WKDYQr3AgXuFAXL+BuH4D cf0G4voNxPUbiOs3ENdvIK7fQFy/gbh+A3H9BuL6DcT1G4jrNxDXbyCu30Bcv4G4fgNx/Qbi+g3E 9RuI6zcQ128grt+QNW1/SpWEzpRVAZlG5SnfEjpTVgVkGpWnpE3oTFkVkGlUnjI/oTMlAmQalaf0 UehMiQClRmXImrY/paZCZ0oEyJq2P+W3QmdKBMiatj8lyUJnSgTImrY/ZdpCZ0oEyJq2P6XrOmey pu1Pyb3QmRIBsqbtTxUCoTMlApQ82aHkyQ4lG3Uo2ahDyUYdSjbqULJRh5KNOpRs1KFkow4lG3Uo 2ahDyUYdSjbqULJRh5KNOpRs1KFkow4lG3Uo2ahDyUYdSjbqULJRh5KNOpRs1CFkoxpSlhlSlhlS lhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlSlhlixhhixhhixhhixhhixhhi xhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhhixhji ghjighjighjighjighjighjighjighjigkwrhBTSY8oQ78QQ78QQ78QQ78QQ78QQ78QQ78QQ78SU 2gdTah9MqX0wpfbBlNoHU2ofTKl9MKX2wZTaB1NqH0ypfTCl9sGU2gdTah9MqX0wpfbBlDwfU/J8 TMnzMSXPx5Q8H1PyfEzJ8zElz8eUPB9T8nxMyfMxJc/HlDwfU/J8TMnzMSXPx5Q8H1PyfEzJ8zEl z8eUPB9T8nxMyfMxJc/HlDQTU9JMTEkzMSXNxJQ0E1PSTExJMzElzcSUNJOtsCF0pkSAkABjSgKM KQkwpiTAmJIAY0oCjCkJMKYkwBRUHi2oPFpQebSg8mhB5dGCyqMFlUcLKo8WVB4tqDxaUHm0oPJo QeXRMkjj42mF3jJpfDytwFuuF9L4eFqBtzytwFueVuAtTyvwlqcV2AGmFYiNaQViY1qB2JhWKDYI PWVaodgg9JRphWKD0FOmFft10J1hivIUX5Sn+KI8xRflKb4oT/FFeYovylN8UZ7ii/IUX5Sn+KI8 xRflKX47IAidKYNW2AFwO2WonG2HD6EzXdBuRxWhM13QbgcboTPdtr0dg4TOdAjYDk1CZ0oECG/B t5OX0JkSAcJb8O34JnSmQ0BHyVRHyVRHyVRHyVRHyVRHyVRHyVRHyVRHyVRHyVRHyVRHyVRHCU5H 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 pKHoSEPRkYaiIw1FRxqKjjQUHWkoOtJQdKSh6EhD0ZGGoiMNRUcaio40FB1pKDrSUHR0Cd/RJXxH l/AdXcJ3dAnf0SV8R5fwHV3Cd3QJ39ElfEeX8B1dwnd0Cd/RJXxHl/AdXcJ3dAnf0SV8R5fwHV3C d3QJ39ElfEeX8B1dwnd0Cd/RJXxHl/AdXcJ3dAnf0SV8R5fw0wrFBummPa1QbBCaQEc0gY5oAh3R BDqiCXREE+iIJtARTaAjmkBHNIGOaAId0QQ6oglMK5an6LLpriSddyXpvCtJ511JOu9K0nlXks67 knTelaTzriSddyXpvCtJ511JOu9K0nlXks67knTeldSWrqS2dCW1pSupLV1JbelKaktXUlu6ktrS ldSWrqS2dCW1pSupLV1JbelKaktXUlu6ktrSldSWrqS2dCW1pSupLV1JbelKaktXUlu6ktrSldSW rqS2dCW1pSupLV1JbelKaktXUlu2wo3QmRIBwk7iXcng6UoGT1cyeLqSwdOVDJ6uZPB0JYOnKxk8 Xcng6UoGT1cyeLqSwdOVDJ6tUKZzRuQoHclROpKjdCRH6UiO0pEcZVqRmrElUjO2RGrGllDNOKPY yCg2SF/haYVig/QVnlYoNkhf4WmFYoP0FZ5WKDZIX+FphWKD9BWeVig2SF/haYVig/QVnlYoNkhf 4WmFYgNx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx 4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4gxx4pRM9q5ksnclk70rmexdyWTvUia7CbuubsmN 0Jmw4rBSIZ2zrERAViJA2PZ2S7OEzpQIELa93XI1oTMlAoRtb7eET+dM2PZ2Sw+FzpQIELa93XJM oTMlAoRtb7dEVehMiQBh29st2xU6UyJAyUA0JQPRlAxEUzIQTclANCUD0ZQMRFMyEE3JQDQlA9GU DERTMhBNyUA0JQPRlAxEUzIQTclANCUD0ZQMRFMyEE3JQDQlA9GUDERTMhBNyUA0JQOxopurim6u Krq5qujmqqKbq4puriq6uaro5qqim6uKbq4qurmq6Oaqopurim6uKrq5qujmqqKbq4puriq6uaro 5qqim6uKbq4qurmq6Oaqopurim6uKrq5qujmqqKbq4puriq6uaro5qqim6uKbq4qurmq6Oaqotuk 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 3eOUBY5TmNgWW4TQccqTVyvD0/mfSLt7nLLAcQrz9GKLELsfG2s+b88EDnfvxyxwP4Zph7qT19uD Ll8+Fzt5jT5q8XG+fml3T14WOHlhcmVsEWInr7Gmwc4IB2F19+RlgZMX5orGFiF48kopzZUAmbvd PXlZ4OSFqa+xRQievFLJtY8BFuHuycsCJy/M5I0tQqyQNYrN42cFN4529+RlgZMXJiaHFsFjhaxh F+uNXLv63ZOXB05emGcdW4RYIatback7OHT43ZOXB05efny75Xdvt0YbZ2rMHjgAkQGgG4Vd99sv nAqzEd6FzoI/yB76QfY05k582ZioZ+Pu7g+yB36QMa3/jUVY/3MvPD59w8u/SndfDl+42H9F/vn4 5esv669dn/75zUf3f/jEyn39ZfvR364f2+XA4Tj+2/nxzWfv/PFx9Mc/2MHfLpfjvz2To7eevf23 nx568beP/nI6/svl7Wfv/OUUX/KSj//48aMgJJ/+QOgV2BuvoL757J2FsOgr8BOvwCN/2U+8ghJ/ BShXefoDoVdQ33gF481n7yxEjb6CduIVtMhfbidewRub3vGjL//B3Me/Pvxf//f2Qrb38dPv3x6+ /e3xy+M6Gnz6vP7dXx7/+cvHR/T2DjfQ47f3xv55uIdF9s9yuH8e/OX6xu559Pbmsy//wYkV/PmX Xx9fL972Tw8/Uuj91ze24ONHX/6D/73vvx7u5ofvv76xmVt589nb778ebt5Hf/mNrfvw/Ue27hrd uusbW/fbj/750+NfP3z75Z+P/7ZLP/49l17baJeZa11KbT1le9P4xQf6y8d0sDPW+I7+9OjxZ+rW ek69XqzO//+bxrHP9MbOfvSZ6o3PVKvV1Eb31Obv65vGsc/0xp5/9Jna259pzeTMY5408kir1vSW 8evP9NPBs/GfgqdHjz9TvnRbc0y999aO1ulwW3/jM72xrx99pnHjM13mx7GUZ7BfLn7wm1APt/v5 mQ4O/+2NHf/gM7XDndiGHaQf7Y2duH5889nbG0k73D6PPmX8JNwOt8VysMu2N/bFI6fRHa/Fd7x2 uGkdPRjfsZ4evbPqhzvTkbc3tqUPbz565w9Hz5stvvfMR1/+gxM/+cGPE992WiTtbofbS/rweLC9 tDe2l3T0EiLHxna4jxzXG3okl+7RXLqfyKV7ZPvoJ3LpHt9ByCiZ73/g5UZ6sYOzQX9j5zmqpfTI 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 io2EYoNM+JxWKDYyio2MYiOj2MgoNjKKDdJNa/VPR1YoNjKKjYxiw1BsGIoNQ7FhKDYMxYah2DAU G4Ziw1BsGDqLCrt951vdvlG2JnSm62uVlb23863e2ygTFDrTDYzJt9oMo3RS6EyJAGGT0XyryShK VXXOhP0U841+iizfFTpTImAoETCUCBhKBAwlAoYSAUOIgJWnC50JEbCyeqEzIQJWDUDoTIiAVTEQ OhMiYNUXhM6UCEhKBCQlApISAUmJgKREQFIiICkRkJQISEoEJCUCshIBWYmArERAViIgKxGQlQjI SgRkJQKyEgFZiQBTIsCUCDAlAkyJAFMiwJQIMCUCTIkAUyLAlAhwVFt1VFt1VFt1VFt1VFt1VFt1 VFtFfJPqqLbqqO5eUGwUFBsFxUZBsUFm5k0rFBsFxUZBsUEmX2Q0+SKjyRdrXiGyQrFRUWxUFBsV xUZFsVFRbFQUGxXFRkOx0VBsNBQbDcVGQ7HRUGwgXmFFvMKKeIUV8QrRFJuM5tFkNI9mWqG3jBiC FTEEK2IIVsQQrIghWBFDsCKGYEUMwYoYghUxBCtiCFbEEKyIIVgRQ7AihmBDDMGGGIINMQQbYwi6 spbgylqCK2sJrqwluLKW4MpagitrCa6sJbiyluDKWkJRIqAoEVCUCChKBBQlAooSAUWJgKJEgHBi YFZODMzKiYFbsix0pkRAVSKgKhFQlQioSgRUJQKqEgFViYCmREBTIqApEdCUCGhKBDQlApTs2qpk 11Ylu7Yq2bXK2YNZOS4w3xgXyMokQmfKoFUSYquSEFuVhNiqJMRWJSG2KgmxVUmIrUpCbFUSYquS EFuVhNiqJMRWJSG2KgmxTUmIbUpCbFMSYpuQEOtI3OZI3OZI3OZI3OZI3OZI3OZI3OZI3OZI3OZI 3OZI3OZI3OZI3OZI3OZI3OZI3OaInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOI nOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOInOOI nOOInOOInOOInOOInOOInOOInOOInOOInOOInDOtUGwQSo8jSo8jSo8jSo8jSo8jSo/fEqN8+Pbh 4efPX/4+LR6+PP7191+vQ47/YHwdnvz718e/PPz06+ePf3/IqXldsyvsT0+Tkn/59NeHT4//+vb4 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 QOCTxPdYMPDr+Q8EPkl8j+1ojw0KDOeD8T0W9BB//gOBTxLfY0Ff8uc/EPgk8T0W9Dp//gOBTxLf Y0H/9Oc/EPgk8T22oz02KLf0HpZbbo+CTxIUac4H43ss6Dj//AcCnyS+x4Iu9s9/IPBJ4nvsQHts UEY6H4zvsaBH//MfCHyS+B4L+v4//4HAJ4nvsWCWwPMfCHyS+B4bFLrOB+O7JZhe8PwHAp8kvluC iQjPf+DuJxlhUe326PlPMoJS3PlgeLccYHLD8x8IfJLwbjnANIjnPxD4JOHdcoAJE89/IPBJwrvl AFMrnv9A4JOEd8sBJmE8/4HAJwnvlgNM13j+A4FPEt4tB5jY8fwHAp8kvMeOoAh6PhjeLQeYEfL8 B+5/krB0+vujAZ/xfQ9MJXn+A4FPEt/3wKST5z8Q+CTxfQ9MT3n+A4FPEt/3wESW5z8Q+CTxfQ9M eXn+A4FPEt/3iEzy+x8IfJL4vkekl9//QOCTxPc9Iuf8/gcCnyS+WxKJ6Pc/cP+ThAXy26PgkwRl 9fPB+B5LpKzf/0Dgk8T3WCKP/f4HAp8kvscSye33PxD4JPE9lsh4v/+BwCeJ77HBdgHzwfhuSYTD 3/9A4JPEd0siRt6sHp7+8+8PH/766fPDfzzM00f7ee4ZKZef2uXy/334/334y6fHr1+n6cPfH//n w6+fP//99388/PnXx09//fa3f/vTT//4jz//NC2b9byaKtb/8jD/1UNPIz/89D+/PX79t2V2+Ixf Rn165l1/c+T7f/P6zB//5pkV81ZttMtJWd/V6twvyNXq3G7/ZFXP7cxXq3O76NXq3I53tTq3O12t zu0kV6tzJ6ur1TlcX61QbJzkq1ytUGyc5IFcrVBsnORXXK1QbJzkLVytUGyc5ANcrVBsnLxnv1qh 2Dh5f321QrFx8l74aoVi4+R969UKxcbJe8yrFYqNk/eDVysUGyfv3a5WKDZO3mddrVBsnLwnulqh 2Dh5/3K1QrFx8jbkakViI528ZbhakdhIJ6v3VysSG+lkVfxqRWIjnaw2X61IbKSTs5yvVig2Ts5y vlqh2DhZ4bxaodg4WTm8WqHYOFmRu1qh2DhZ6bpaod+UG7KoD98+LBr631f69+Xxr7//+uHLK+OH j79++OW3rw+/f338y8NPv37++PcHr6mV5DO9+Pj5y/qjv3z668Onx399e/z07ety+PoTrL/6abP+ +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 OinlyXZDnoyuRoXOlMdepY7WlDpaU+po7YaO9pwzn8eV8xfdm9XpavmyOt9ibrM6XaZdVucbnW1W 7G+dvs7ZrE5f+m1Wp89hy+p8grtZnd4GN6vTNI3NCr2v8y3LNisUvedblm1WKDbOtyzbrFBsnL// 2axQbJxvWbZZodg437Jss0KxcZ6Sv1mh2DhPyd+sSGzk85T8zYrERj5Pyd+sSGzk8+T6zYq85Xye XL9Zkbe8ptIAq/OU/M0KveXzlPzNCr3l85T8zQrtALgRzm58RIGYh+PitUVSzqdP8CLl7Bf3l2Xw /clXCc/ldpr0phU7O+qOr7I2IU8nTZ0zWX+Fp3Op0Jkqs3k6xQqdKTMbmSD+6SgsdKbK7Z8OzkJn SjjJBPFPp2+hMyUCZFN9n47w/GekH90SeRutdg/dIj99gh9vCqr7q5uC/cF7vyIvG4e8acWyFt2q yyYWP+U4Qmf0dn03PmRW9jxPBqFZRdfki/8pa6WFRtQ+/akXdOLur7qz7Q++vqpptbDqDZ7jvBsf 3haMkvxiPdIm4OkjvL4sP0LP0SDni7d+Xoj3lOsKI1W5QcvUHk8J8zte8OF1UB2+tBqhrrDXnJ3/ rWIXrzXSfujpb70OppcXnvuDr4Kp9FTPy/2e6guyN5ZlKpinagR+/dP4kKM9v+6iqEQu+p8+wg+v pF5yfjVddX/wNb6TFdCk9KmiIlxG4Tnz1nDkwDs5uudeHZX9cgld0D59gtdkuZdkmP3B169kXcPA ApJwDWlXp934iORlufhoFqLgP32EHxdxnhX7YVwfdr53QMF/qo0Jl1G5cd0QwqACm9CZci+QaSCe qnRCZ8IjTT4vT9usUL33fHOOzQptQ+ebc2xWqN57vjnHZoXqvec5M5sVugs435xjs0Kxcb45x2aF YuN8c47NCsXG+eYcmxWKjfPNOTYrFBvnm3NsVig20GkdDD9dVuebc2xWKDbON+fYrFBsnG/psVmh 2Dg//HSzQrFxvhHIZoVi43wjkM0Kxcb5RiCbFYoNxI8CI1M3KxQb58XkmxWKjfONQJbV+ZGpmxWK jfMjUzcrFBuIzwZGpm5WKDbOj0zdrFBsnFcILKvzI1M3KxQbrIqCmIRgZOpmhWID1b3ByNTNCsUG Yi3mG4L2+xWO9EZDfLuUPkLdpJ8+wo8Vjj5GedlXYn/wgER+Nftz+reHr799+PXXxy8P3/724dOd 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 6YajphuO2mc4ap/hqH2Go3mljppuOGq64ajphqP2GY7aZzhqn+GofYajyaOOmm44arrhqOmGo6Yb jppuOGq64ajphqOmG46abjhquuGo6YajphuOmm44arrhiO3riO3riO3riO3riO3riO3riO3riO3r iO3raPKoI46wI46wI46wI46wI46wI7avoxmijmaIOmIWO5oh6oiP7IiP7IiP7IiP7IiP7IiP7Erp uCul466Ujvv/n7m/W5LjSNar4WPNVbSZTrbMtKWK/wyZ6USXINMNNMEmByIIjDXA0ex99V9kFsEh gaxur4XF/b1jr15RZLp3daZ7dYbHep4wpePVlI7XF9Ter6+00ylg1NYb677DGKQ29o/wh5X21nIZ ZyvtRACj8yi2sBNvu7lsNwXa1RRoV/MY0Gqqvaup9q4vqL1fb6J8uq/R0xiri6InlO4f4Y+T3nmp +WRavy4kTXQaxVbb4m0XtwSrKdCupkC7mkdAVlPtXU21dzXV3tU8ArKaguj6giD69e+KcjraHmnM 9VUbNXPYP8If/+DuRw6eYJLrQvJdcRrF5ijibTfb+wW1d+AZbqfPsNba5hY9qGv/CH/cx95Kv5yY ta0L0TM8i2KTJu+2m1L2akrZqyllry9I2V+vrnr6NrG/SszLfmR9rLrql04VNZ2errkuJNV1GsUm d+JtN19NTElPNSU91ZT0VFPSU01JTzUlPdWU9FTzpMH6gj4IjS3FZGYHmBKaakpoqnkmXTXPpKvm mXTVlKzUF86ke/0PXD8XteVRDkvk2N+3/sXIaebZTgGdjkZOp1FswizedbMhTW1PNbU91dT2VFPb 05FCvaMjiDrStXekUO9Iod7REUQd6do74po64po64po64po64po6OoKoIxqqIxqqoyOIOmKoOmKo OmKoOmKoOmKoOmKoOmKoOjq4qCPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPy qiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPyqiPy qiPyqiPyqiN3xo54rY54rY54rY54rW7qhbp5Fkk3zyLppqSmvyCpQYs3MZk4S+gmUNZfAMpeHVSt 4FMRekkzjR7d59s/whc7MTVvJ5OqdSGYVJ1HsVWvd9tNWq6/QMu9/gzTqRywXEYeef/+jz3D9IUc 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 XKQhc5GGzEUaMhdpyFykIXORhsxFmmmm2UwzzWaaaTbTTLOZZprNNNNspplmM800m2mm2UwzzWaa aTbTTLOZZprNNNNspplmM800m2nm0kwzl2aauTTTzKWZZi7NNHNppplLM81cmmnm0kwzl2aauTTT zKWZZi7NNHNppplLM81cmmnm0kwzl2aauTTTzKWZZi7NNHNppplLM81cmmnm0kwzl2aauTTTzKWZ Zi7NNHNppplLM81cmmnm0kwzl2aauTTTzKWZZi7NNHNppplLM81cmmnm0kwzl2aauTTTzKWZZi7N NHNppplLM81cGjLnbcictyFz3obMeRsy523InLchc96GzHkbskxoyDKhIcuEhiwTGrJMaMgyoSHL hIYsExqyTGjIMqEhy4SGLBMaskxoyDKhIcuEhiwTGrJMaMgyoSHLhIYsExqyTGjIMqEhy4SGLBMa skxoyDKhIcuEhiwTGrJMaMgyoSHLhIYsExqyTGjIMqEhy4TWES2FjBYaMlpoyGihIaOFhowWmmkR 2EyLwGZaBDbTIrCZFoHNtAhspkVgMy0Cm6kqb6aqvJmq8maqypupKm+mqryZqvJmqsqbqSpvpqq8 maryZqrKm6kqb6aqvJmq8maqypupKm+mqryZqvJmqsqbqSpvpqq8maryZqrKm6kqb6aqvJmq8maq ypupKm+mqryZqvJmqsqbqSpvpqq8maryY8koJjM7wMR8TIl6MyXqzZSoD4TsD4TsD4TsD4TsD4Ts D4TsD4TsD4TsD4TsD4TsD4TsD4TsD4TsD4TsD4TsD4TsD7TlONCW40BbjgNtOQ605TjQluNAW44D bTkOdB7oQOeBDnQe6EDngQ50HuhA54EOdB7oQOeBDnSewUDnGQx0nsFA5xkMdJ7BQOcZDHSewUCb 8wNtzg+0OT/Q5vxA2+wDbbMPtM0+0Db7QNvsA22zD7TNPtA2+0Db7ANtsw+0zT7QNvtA2+wDbbMP tM0+0Db7QNvsA22zD7TNPtA2+zBh2WHCssOEZYcJyw4Tlh0mLDtMWHaYsOwwYdlhwrLDhGWHCcsO E5YdJiw7TFh2mLDsMLGGYWINw8Qahok1DBNrGCbWMEysYZhYwzBPPhzmyYfDPPlwmCcfDvPkw2Ge fDjMkw+HefLhMM/rGOZ5HcM8r2OY53UM87yOYZ7XMczzOoZJVg2TrBomWTVMsmqYMNQwYahhwlDD hKGGCUMNE4YaJgw1TBhqmDDUMGGoYcJQw4ShhglDDROGGiYMNUwYapgw1DBhqGHCUMOEoSYaKU80 Up5opDzRSHmikfJEI+WJRsoTjZQnGilPNFKeaKQ80Uh5opHyRCPliYbDE2mwJtJgTaTBmkiDNZEG ayIN1kQarIk0WBNpsCbSYE2kwZpIgzWRBmsiDdZEGqyJNFgTHXY70WG3Ex12O9FhtxMddjvRYbcT HXY70WG3Ex12O9FhtxMddjvRYbcTHXY70WG3Ex12O9FhtysK1QZxrF5RqDaIY/WKQrVB8NcVhZ4y AVlXFHrKBGRdUegpE5B1RaGnTEDWFcXWDt4Kd5oznmnOeKY545nmjGeaM55pznimOeOZ5oxnmjOe ac54pjnjmeaMZ5oznqmOZUyN2jQ1atPUqE1TozZNjdo0NWrT1KhNU6M2TY3aNDVq09SoTVOjNk2N 2jQ1atPUqE1TozbNY1SneYzqNI9RneYxqtM8RnWax6hO8xjVaR6jOs1jVKd5jOo0j1Gd5jGq0zxG dZrHqE7zGNVpHqN6DFPEZGYHiFbUx0RGTGZ2gEjXH2MdL5kIxB9DIDGZWbQiEH9MksRkZtGKQPwx jpKS5dSBwHiPun9mt0fdP7Pbo+6f2e1R98/s9qj7p/Z71P3z3BUFBMZ71P2T2T0KPWUgFd6j0FMG UuE9Cj1lIBXeo9BTBlLhPer+qf0ehWoDSIX3KFQbQCq8R6HaAFLhPQrVBvDxXlFAYLxHodoAAuM9 CtUGoMH2KFQbgAbbo1BtABpsj0K1AWiwPQrVBqDB9ij25qC98F1fQ8Rk2gvf9aVFTKa+8Gnr9Oub j5fM039d35PEZGbRepKt68uWmMwsWk+ydX1jE5OZRetJtq6vfWIyswM8ydb13VFMZnaAJ9m6voCK ycwO8Mywr2+xYjKzAzz91/VVWExmdoDHBl3fp8VkZgd4bND1pdxL5rFB11d4MZnZAbfZoP0fr9f+ 8OH558dP6//xZSxapgFhxh6FlmlAzpHTAHKOPYos0waQc+xRZJk2gJxjjyJL+HHpRwH9/Pjj2zcP 73/5+bun54fLP+r3s+2Rf7wWiB1WFMDF9yhSswPg4nsUqdkBcPEVBXDxPQrdeYCL71GoZgEuvkeh 2gC4+B6FagO4Je9RqDYAZL5HodoAuPgehZ4ywMX3KPSUgRfxigJexHsUuvPAi3iPQs8LbRUOtFU4 0FbhQFuFA20VjjZjL0vX16y/Pv796eHNu6fH56fvv76GvVCJ74PmC/lt7vnL6x7+9fivT//49PT+ 08PHT4/Pn96+//Hhu3cf3vz0+fWh5HrZcun5kldcH//14cMPP+yfYruMtcQpvedtP/Zk+8ubD8/7 B9ozvL+m/Lg/l68/3f4zv3/89Lj/159OntkMPDP6iqnd5uFB3NcXUjGZuL4eHsR9fasVk91cX9/x Dvw5w/PT/hN/H/S7b5dP//a3p4dLapf1v6/fol8rVv6m7d0rD3a8vpeLycSvvuHBjteXezGZ+W3h wY7XFYKYzPy28GDH6zJDTGZ2gGclfF2reMk8cvK6shGTmUXrwY7X5ZGYzCxaz2P3usYSk5ml4Xns XhdqYjKzzkzGYpiMxTAZi2EyFsNkLDaEMG0IYdoQwrQhhGlDCNOGEKYNGFrtUWSisaFl/ob2TTa0 b7KhRe1E+yYT7ZtMtG8ygfHTigIWTnsU+r2AhdMeRWp+AgunFYV2GibaaZhop2GinYaJdhom2mmY aM9goj2Diab/E03/J7CY2aPQnUfT/4mm/xOYxexR7Hmh71600zDRTsNmQhubCW1sJrSxmdDGZkIb m2focn3zEZOJa4HNM3S5vj6JycwO8Nxhru9gYjKxA6a5sTA9c5Lr+52YzLxnnp/I9SVRTCZ+a0xz vj3N+fY059vTnG9Pc749zfn2NEfS0xxJT3OKPM0p8vT099f3aTGZWRrmFHmakvnpnSF3fYX3kpnz 7SnOtwuSuhYkdS1I6lqQ1LUgqWtBUteCpK4FSV0LkroWJFotSLRakGi1INHqikJPmUx8C6LXC0KL CqLXC6LXC6LXC6LXC6LXC6LXywCHEexRpCsHmUmvKFQbZJJdEDW0olBtkEn2ikK1AY4V2KPQUwYH BKwocEDAHoWeFzggYI9CzwscELBHoV4mio+CFB8FKT4KUnwUpPgoSPFRkOKjIMVHQYqPghQfBSk+ ClJ8FKT4KEjxUZDioyDFRzGlwsWUChdTKlxMqXAxpcLFlAoXUypcTKlwMaXCxVT3FlPdW0x1b3lB 3csWTGIys2jF7ZjygmiFLcbEZGKdmTqPYuo8iqnzKKbOo7yg82CrRTGZ2AHDM+u/LjnFZGYHiJtr x7pVTGZ2gOevf138isnMOvMs8a8raDGZWWeeJf51GS4mM79pRZVYMVVixVSJFVMlVkyVWDFVYsVU iRVTJVZMlVgxVWLFVIkVUyVWTJVYMVVixVSJFVMl1tDYraGxW0OjsIZGYQ2NwhoahTU0CmtoFNbQ KGxFoedFLFMaskxpyDKlIcuUhixTGrJMacgypSHLlIYsUxqyTGnIMqUhy5SGLFMaskxpg5yu0AY5 XWFFodogZzKsKFQb5EyGFYVqg5zJsKJQbZAzGVYUqg1yJsOKQrVBzmRYUag2yJkMKwrVBjmTYUWh 2iBnMqwoVBsEVFtRqDYIqLaiUG0QUG1FodogoNqKQrVBQLUVhWqD4G0rir3Pq0sKb1HdzKVrM5eu zVy6NnPp2sylazOXrs1duopoejPdUprpltJMt5RmuqU00y2lmW4pzXRLaaZbSjPdUprpltJMt5Rm uqU00y2lmW4pzXRLORaRYjKzA8TjbY6VqJjM7ADxeJtjOSsmMztAPN7mWBN7ycTjbY4VtJjM7ADx eJtjGS4mMztAPN7mWMuLycwOEI+3OQYCYjKzA0Rm9ZgqiMnMDhCZ1WM0ISYzO0BkVo/5hpdMBGCP aYiYDA3QiAZwRaEBGtEArig0QCOubysKDdCI3rBtRG+4osgAbSN6wxVFamMjesMVRWpjI3rDFUVq YyN6wxWFaoPoDVcUqg2iN1xRqDaI3nBFodogKsUVhWojodog2sa2EW3jikK1QbSNKwrVBtE2rihU G0TbuKJQbRBt44pCtUG0jSsK1QaCrDaibVxRqDYQ0LUhyGpDkNWGEKYNIUwbQpg2hDBtxPdxRaE7 j3CpDYFPGwKfNgQ+bQh82hj4JIrnjiWFmMxcPYviuWNdIiYzV8+irO9Y3GjJNlHWdyyFxGRiB2yi rO9YT4nJxA7YRFnfsSgTk4kdsImyvmNlJyYzO0CU9R3LQzGZ2QHJ7ABRI3gsPcVkZgeIgsNj/Som MztAFBwei2AxmdkBouDwWEmLycwOEAWHx3LcSyYKDo/Fu5jM7ABRcHhMAMRkZgeYbORmspGbCQ1u JjS4mdDgZkKDm2iOeww0xGRmaZgE4mYSiJtJIG4mgbiJBOJA4o+BZBwDiSQGEkkMJJIYSCQxkEhi IJHEQCKJgUQSA4kkBtr/H2j/f6D9/4H2/wfa/x9o/3+g/f+B9v8H2v8faP9/oP3/gfb/B9r/H2j/ f6D9/4H2/wfa/x9o/3+g/f+B9v8H2v8faP9/oP3/gfb/B9r/H2j/f6D9/4H2/wfa/x9o/3+g/f+B 9v8H2v8faP9/oP3/gfb/B9r/H2j/f6D9/4H2/wfa/x9o/3+g/f+B9v9XFKoNYugyEGswEGswTER9 mFT5MHHrYeLWw8Sth4lbDxO3HiZuPUzcepi49TBx62EiE8NEJoaJTAwTmRgmMjFMZGKYyMQwkYlh IhPDRCaGiUwME5kYJjIxTGRimMjEMJGJYSITw0QmholMDBOZGCYyMUxkYpjIxDCRiWEiE8NEJoaJ TAwTmRgmMjFMZGKYyMQwkYlhIhPDRCaGiUwME5kYJjIxTGRimMjEMJGJYSITw0QmholMDBOZOEYs YjKzA0SYY5gwx1o6kVHRJJ6Qa2VFxoiT+DSuKDLam8SncUWR0d5EW/WT+DSuKPS8iE/jiiJj30l8 GlcUqg2EIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyEIEyCIGwXgiCs KFAbKwrUxooCtbGiwFNeUeApryjwlFcUeMorCj1lAhOsKPSUCUywotBTJjDBikJPmWABKwo9ZbLB v6LQ8yIb/CsK3XmyVb+i0PMiW/Urij0v1JVkq35Fob/LoqXesaTwkomWescCREwmrp6naFx3rGLE ZOLqeYrGdcdSyEsmGtcdCycxmTg/miZJMU2SYpokxTRJimmSFNMkKaZJUkyTpJgmSTFNkmKaJMU0 SYppkhTTJCmmSVJMk6SYIklxrHbFZF4HHGtjMZnXAcdKWkzmFe2x7haTeUV7rNK9ZCL8cKzpxWRm 0YrwwzEYEJOZRSvyCsd0wUsmIgbHLEJMZtaZSAUcAw0xmVlnIhVwTEXEZOaXo0gFHKMVLxnZMVhR aGpFdgxWFJlaJbRjkNCOQUI7BgntGCQiWlxRZKKZ0D5DQvsMCe0zJLTPkNCOQUI7BgntGCS0Y5CI /HBFoaeM9hkS2mdIRH64JbQ7kdDuREK7E4nID1cUqg20p5HQnkZCexoJ7Wkkss+wotDzIuK+FYXu PBHcrSjUKeQE9RWF7jw5QX1FoU4h9sMrCj0vYj+8olCnEPvhFYVqg5zWvqJQbRDT4hWFaoOYFq8o VBvktPYVhWqDnNa+otDOsDjbPZYUYjJzJWjOdpM5203mbDeZs91kznaTqJI7lkJiMrEDkjkoTuag OJmD4mTOdpM5203mbDeZs90kCtuOBZ+YzCxac1CcRGHbsZgUk5kdYE6dkyhsOxaqYjKzA8wRdjJH 2MkcYSdzUJxE+dixkhaTmaUh6qqO5biXrJpfQdUsjWqWhugFfEwAxGRmnYlewMcYQUxmdoDoBXzM IsRkZgeIxsLHQENMZnaAaCx8TEXEZGYHNLMDmtcBE1kPTmQ9OJH14ETWgxNZD05kPTiR9eBE1oMT WQ9OZD04kfXgRNaDE1kPTmQ9OJH14ETWg3MjOyErCtUG2QmZ6CDGiQ5inOggxokOYpzoIMa5dXQP O7qHHd3Dju5hR/ews3uI+ov4NcyN+DWsKNRfA9UG8YZYUegpE5eHFYWeMvFrmBvxa1hR6HkRv4YV hZ4X8WtYUegpE7+GFcXeo7y3/Wl6SU3TS2qaXlLT9JKappfUNL2kpuklNV/yknr89Pjww4fnn1bE w/PTj7+8e3z+KvjhzbvHtz9/fPjl49P3D9+9+/Dmp4e05ctI264AfvPhef+pb9//+PD+6R+fnt5/ +rhn/Poj7D/2/RH+8WGUfmmnl33+oM9P+y/26cPD5Rr4OXWJRrE3efGmm80tDk2naZM1TZusadpk TdMm61hqiMnM5hbHudM82m2aR7tN82i3aR7tNs2j3Y4lkpjMfJrdfJrdfJrdfJpdfZrm95lokHEs 7cRk5vfZMDtAtO44lo1iMrNoRbeNY+3pJRMNMo6VqpjMrDPRIONY7orJzKIVDTKONbOUrFwIPL5H 3T8i2KPuHxHsUfePCPao+8d9e9T946MVBeDxPer+8dEedf/4aI+6f3y0R6HaAPD4HoVqA2DgexR6 yh095Y6eMhj471HoKYOB/x6FnjIY+O9R6BsAjO5XFBjd71HoKYPR/R6FnjKwdd6j0FMGA/89Cj1l YOu8R6HaANsEexSqDbBNsEeh2gDbBHsUqg2wTbBHodoAts57FKoNYOu8R6HaALbOexSqDWDrvEeh 2gB2C3sUesrAbqFcMrBb2KPIU87AbmGPIk85A7uFPYo85QzsFvYotgrQVoTXRY+YTFsRXpdIYjJt 9nZdUHnJPDD2uvwSk2kzketiTUxmdoAHxl5XfGIys2g9lvW6bBSTmUXrbZlc155iMrNovS2T6wJW TGZ+bXu7HNdVsJjMLFpvl+O6lBaTmUXrbZlc1+NiMrNoPYPy66LeS+btv1xHAGIyswO8/ZfrHEFM ZnaAt/9yHUaIycwO8AzKrxMNMZnZAZ5B+XUsIiYzO8AzKL/OVsRkZtF6vjPXAY2YTCza7PnOXKc8 YjKxaLPnO3MdFYnJvA5YfQ4GgSsKDAJXFBgErigwCFxRYBC4osAgcEWBQeCKAoPb9VWKnhfZol9R 6HmRLfoVhZ4X2aJfUWAEu6LAeH5FoadMNttXFHpeZLN9RaHnRTbbVxTqL7LZnshpyHsUespki35F odogW/SJnLy8R6HaIFv0iZy8vEeh2iBb9ImcvLyiyBZ9Iicv71GoNsgWfSInL+9RqDbIFn0iJy/v Uag2yBZ9Iicv71GoNsgWfSInL+9RqDbIFn0iJy/vUag2yMZ+IicvX9/nxcWBt2483v7FZN668Vgr iMm8deOxshCTefOJYx0iJjPrTNzCPhYzYjKzzsQt7GNFJCbzhmrH+slLJu46H6stMZlZZ+Ku87Fk E5OZ32firnMST7K+Lge9ZOIW9rF4FJOZHSBuYSfxjO3rwlRMZnaAuIWdxDO2r4teL5m4hZ3EM7av K2cxmdkB4hZ2Es/Yvq7KxWRmB4hb2Ek8Y/u64heTmR0gbmEn8Yzt6zRBTGZ2gHcOy3UkISYzO0Dc D88XAvbnCwH784WA/flCwP58Aeco7lFgNpT3I59JFJgb5gs4fXGPAnPDfAGnL+5RqDbA6Yt7FKoN cCLiHoUqCnjzrijgzbtHoacM/HL3KPSUgV/uHoWeMvDL3aPQ8yK0x4pC3wCE9lhRqDYI7bGiUG0Q G4cVhZ4yYUTyhTAiKwo9ZcKIrCj0lAkjsqLQUyY2DisK1QYhS1YUqg1i/rCiUG0QHuV40xNfG733 9uO9UEzmvbcfb5FiMvO9PXkr1+NVVEzmrVyPF1cxmdkB3lF017dfMZnZAd6Bb9dXaDGZ2U6exfD1 PVxMZhat53Z7fZkXk5lF67ndXlcEXjIRIznWD2Iy82tbxEiORYiYzOwA0VbhWMmIycyiFZmUYzkk JjOLVmRSjjWVmMwsWtFW4ViYicnMDhABl2N1JyYzO0CkZQqCiAvCgQvCgQvCgQvCgQvCgQvCgQvC gQvCgQvCgQvCgQvCgQvCgQvCgQvCgeuFOHbVSwKfcEWhT0g2OVYU+r0yqN4VBap3RYHqXVGgelcU qN4VBaq3ou2liraXKtpeWlGoNsDRj3sUqg2ylVXRVlZFW1kVbWVVtJVV0VZWRVtZFW1lVbSVVdFW VkVbWRVtZa0oVBtkA6yYQFoxGbJiMmTFZMiKyZAVkyErJkNWTIasmAxZMRmyYjJkxWTIismQFZMh KyZDdrwMe8mS92ser85eMnEr5HjRFpN5jX68lovJvEY/XuLFZF6jH6/8YjKzA8Rdsmrukh3LCTGZ 2QHi/l019++quX9Xzf27au7fVXP/rpr7d9Xcv6vm/l019++quX9Xzf27au7fHes0MZnYAZ3MuVcU WfF3MudeUWTF38mce0WRFX8nc+4VRVb8ncy5VxSZBnUy515RpDYGOc9iRZHaGOQ8ixVFamMQ2cuK IrUxiOxlRZHaGET2sqJQbRDZy4pCtUFkLysK1QaRvawoVBtE9rKiUG2g3aeBdp8G2n0aaPdpoN2n gXafBtp9Gmj3aaDdp4F2nwbafRpo92mg3aeBdp8G2n0aaPdpoH2kgXaEBtrbGWiXZqD9loF2TgbZ A1lRqHqJCKgOIuc53ufFxYG4ou3i9sWxKBCTiSvaLm5fHCsLMZm4ou3i9sWxPBGTmR1gbl8M0RL+ WPqIycQOGKIl/LF+EpOJHTBEMdmxCBOTiR0wRDHZsZITk5kdIIrJjuWgmMzsAFFMdqwpxWRmB5h7 u8Pc2x3m3u4w93aHubc7zL3dYe7tDnNvd5h7u8Pc2x3m3u4w93aHubc7zL3dYe7tDnNvd5jbscPc QR3mpucw9ymHubU4zN3AYW7gDVHNd0wqvGSiAK+hYz0aOtajoWM9GjrWo6FjPRo61qOhYz0aOtaj oWM9GjrWo6FjPRo61qOhYz0aOtajoWM9GjrWoyFFXkPHejSk42tIx9eQjq8hHV9DOr6GdHwN6fga 0vE1pONrSMfXkI6vIR1fQzq+hnR8/UL4ho7UfysK1MaKArXRka1nR7aeHdl6dmTr2ZGtZ0e2nh3Z enZk69mRrWdHtp4d2Xp2ZOvZka1nRzrZjnSyHelkO1K8dqRd7Ui72pF2tSPtakfa1Y60qx1pVzvS rjbz8IpmHl7RzMMrmnl4RTMPr2jm4RXNPLyimYdXNPPwimYeXtHMwyuaeXhFMw+vaObhFc08vKKZ h1c0UyvczMMrmik8bqbwuJnC42YKj5spPG6m8LiZwuNmCo+bKTxupvC4mcLjZgqPmyk8bqbw+Fi9 i8m8DjjW+mIyrwO6aQPdTRvobtpAd9MGups20N20ge6mDXQ3baC7aQPdTRvobtpAd9MGups20N00 UuimkUI3jRS66X3QTbuCbtoVdNOuoL9kV/D46fHhhw/PP62Ih+enH3959/j8VfDDm3ePb3/++PDL x6fvH7579+HNTw8j5dTzfhDsmw/P+w99+/7Hh/dP//j09P7Txz3h159g/6nvj+iPDzlvabbT6z5/ 0Oen/Rf79GH/T9fYz9lzMA5OtsTbbjaRyOt004uhJ3IUxooizyeRozBWFJmbp06mt6mT6W3qZHqb OpneJsJwrCgyvU2ExlhR6CkTGmNFoadMaIwVhZ4yoTFWFHrKhMboidAYKwrVBuEqVhR6yoSrWFHo KROuYkWhp0y4ip4IV7Gi0FMmXMWKQrVBuIoVhWqDcBUrCtUG4SpWFKmNjLiKjLiKjLiKjLiKjLiK jLiKjLiKjLiKjLiKjLiKjLiKjLiKjLiKjLiKjLiKjLiKjLiKTHwjVhSqDURjZERjZOIbsaJQbRDf iGNNJC6w1NWaOD/ZF1ZiMnEYsy/D8MhjBZ+NPEpvW0m5xUYe+yf4w8ijX8bop9ehkcdpHFx6irdd HMMnEcc51q9eMpGgOVa7YjKzI0WC5lgyi8nMohUJmmPdLSYzi1YkaI7Fu5jMLFoRejkmAGIys2hF 6OUYI4jJzKIVoZdjFiEmM7+2RejlGGiIycwOEKGXYyoiJjM7wIResgm9ZBN6ySb0kk3oJZvQSzah l2xCL9mEXrIJvWQTeskm9JJN6CWb0Es2oZdsQi/ZhF6yCb1k0a7mGHyJycwOMAmaLNrVHEM1MZnX Adt+ijGJAjOUbT+XmESB0eK2nzRMosDYedvPDiZRYOy87acBkygwdt4uBFnZLgRZ2S4EWVlRqDYI srKiUG0QZGVFodogyMqKQrVBbEdWFKoNArqsKFQbBHRZUag2COiyolBtENBlRc2/vP358W+f5/yP Dz88Pz19cU3qD28/7rsEv3x8+vx36dfZ/8MR/Ph+/Yt3T5/3DwIZh55x0zNOO2O+6BmTnjHrGYue seoZm55R75ms90zWeybrPVP0nil6zxS9Z4reM0XvmaL3TNF7pug9U/SeKXrPVL1nqt4zVe+ZqvdM 1Xum6j1T9Z6pes/Ue3vmD2jKF7nm5x/189Onx+PCK5Yycx5jXRCiUvY8f6BSyuklX4Ellz/iKHdF /fMN/PqBf3788e2bh//8cPlH22otea+297/+t8uR+NY7+6+f/bunj5+Ou/3p8bt3T78PXv94O/Z/ /Pbx/vb49vkaDOdK4pDq9izuNUxpDz7BlFK6bK0eC7dYRayP8PuKmKeXvFYRKRrFhmvfcI/y6T1K rW9t3w8O3qP8h3uULqfXoJt0FsVmid9wk8rpTcotjdb7Fr1JJXCTCrpJZ1FsdPoNN6me3qRSykzr +yV6k+ofb9LXZN9+DbpJZ1FsUvwNN+mMnExpy2OWWcJfSX9EJ7fTS9A9Ootic/FvuEf99B7N/TbN 0qP3qAe6raObdBbFtgG+4SadqY7XTZptpDbC3TZe/9v2tXI4co/Ootimxzfco+3sHuXLmLuyPVxI 2x8L6fTX3dBNOotiezzfcJPm6U3aSm1j90YP3qQZ6LZX35tPb9JZFNvS8l5LX1AcvH7H++lrablc cmnbFr3jPb1elh29l55GsY098Y5/y/tbP31/K2lc0lodRr8se3n91aSj97fTKLa9+Q036fT9reRW L2k/sz54k754f/vaxGK/Bt0k6f3tBeUL2uT9hjt++qJTak6z7ecDBu94D5QletE5jWJ72t9wk05f dEpbfz3rmDN6k0bgJqE3ndMotoX/DTfp9E1n/TmZre1GbsGb9MWbTj29Bt0k6U3nBZFS4CadvumU PspaxIdX8X0GKgm96ZxGMUDD+4J7Qcn1+h0f5286W13/p6zXg9gdH3980zn7izLQi85pFKNUxBv+ LS864/RFp14u29xqUJl5fIRXbzh6zzmNYqiOeMPN94EXdHeBp3f6PlBzX+8+a9kafXp/fB/4WlK7 X4KenvQ6IMoJD7pJTHbzz8v4YaaZn74rY7v8j4f/9fj9+6ePx9bVT0//9vDuw4effvnbw7+8e3r/ 46e//pe/fPe3//kv373/8DDKltdvu9+39Z8e6mX2h+/+7dPTx/+yh51es62f8us13/QzZ379Z36+ 5vc/c/+VrxtQ73/5+bun5193ofYb98dbtV0L5u9Pzx/f7nf189U/3Lz0+i9XWf38+Onhq/27Xy/6 4mf3ub7Rvk6Yzn/2WljfuvaVH57OfvgY7ey3yTd++NPNa1/54fn0N39z+tuU8x8+8s1rX/nh5fyH 57Pfpt74zcfNa1/54fX0tl9Ob2W7UW/H/57mzYhXPkK74yP0849Qz37/Hvnh/Y4fPm48+bMSHZEf Ps5+eH4al5OE20s3//HxZsQrH2G74/efd9z8GfnhM/7D560vu+N/3518Rc3Id948/c47fwQz8j02 T7/HbiS88T12dkNn5Htsnn6P3bihN77Hzj5n+cuX/+Lhr48fH/73/zn+Nh9/1r/7Zb2N/PXp+Wnn SdYfuPXfvn/6+9s3T1+Hvv/w6eF5Rbz99PPj3+74wDe++84+cP3yp9Y7PjB4a1k/8Ie3756+Djj+ 7env8cXvXMvZ9/288ZV79n2/rv3yX/zJv3S745c+/ZI/e3Q3vuHPL/3yX9zxC598nNTXK//XP+bG 1/7ZJxp/+V+fX1iPH/91h55+5deezn7wja/8sx+8vfqDT7/ot3H6G9/4oj/7wddL/+X904+Pn97+ /em/PHx8++9PD/+6XS5l5K3XuZ5K7q20k1epefr9/933tX11bbrc+P7/+jN9vvTrz9TrSJeU+pZL butTbdvN4C8fUP7u7AfdeAk+v/TlB/Q52asdki43/mqcX/rlv6Bf3Hvoq1/crdSvyyldbvylKWeP OfDG/PmiL7v3JNuNPxnp7MEHXpc/X/RVdZyke/Fl+YevXxn3iNdKJPglmi43vkSvP/rN1y+LnyO+ +sUez3618Bfi50tfuamn34nff73iTZfwN+LnS1/5yadfimfZwt+Iny99PWeKf6Ol0y+l0i5n1974 Uro++7OvvHT6zXM6c0gp/uWTAm+sny8K3K3Tnj+7MPya+PnSr/5QlJLSVnIZPe//Vy2Xsztx+lXw ww/t66VISi9+GZz1WAqsnD9fFLgnL34fnHXarxFf3Zq69fWXIOeyza3VfDkrp9Ovku8up8Ua/yoh RqG//YDALYp/taxLv/wX3/beWb8/+wuS4t85KbDa/nzRl381zx5LvvHV1E8qZV375b/4trux5e+/ HiWlHH/Xyq++a+Xou1a+8XX36x/Sk7/iv0acvXyub9Q+28iz9d5SO3nk+fTb8DGfvSnlG29Vv360 s1/m9Cv0+3r2NpRvfIueFWqOvDnl06/Ls08Z/VLL4ZXi50sDOW98H518p+fIq02Ofv3k+NdPjr60 5PgXSI6+tJT4S0s5fWk5uzDe2iXauCX+nlKiryAlPDH7fGkgZ/xtpUQ7qNx427h9aSBnvNlKtNlK /I9/ifZRifdRifZRifdRifZRjfdRjfZRjfdRjfZRjfdRjfZRjfdRvd9GpF4SOPt9j7rfimVFgbPf 96j7rVj2qPutWPYodA/L/VYse9T9pip71P2v9nsUesoFPeWKnnJFT7mip8w6paKnXO833NmjUG1U VBsV1UZFtQFM3PYoVBvAxG2PQrUBTNz2KFQbwMRtj0K1AUzc9ihUG8DEbY9CtQFM3PYoVBvAWG2P Qs8LGKvtUeh5AWO1PQo9L2Cstkeh5wWM1fYo1MvAWG2PQrUBjNX2KFQb4ATBPQrVxoZqA5w7uEeh 2gDnDu5RqDbAuYN7FKoNcO7gigLnDu5RqDa883+vix4vmXf+73WJJCbT5AHXBZWYTOPor8svMZnG iF8Xa2Iys2irWbTVLNpqFm01i7aaRVs18cd1kSkmMzugmh1QzQ7w3KKu61oxmdkBL9gPocWxmMzs gBd8X9AKW0xmdsALhhtomS4mMzvAM3C4rvXFZGadeWcyXgcGYjKzzjxZ8HXqICYz68w74PE6uhCT md+03gGP1/mHmMzsAO+Ax+sQRUxmdsBmdoB3WuR1QCMmMzvAOy3yOuURk5kd4J0WeR0VicnMDpho ODfRcG6S4dx+ziCJImO2/bA/EkWGqfvxfSSKPK/9QD4SxZ4XGabuZ+mRKPSUExm078fgkShUGwnV RkK1ARjrPQrVRkK1kdFTzugpZ/SUM3rKGT3ljJ5yRk8ZQVUZQVUZQVUZQVUZQVUZQVUZQVW5oNpA KFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZGKFZm KJZ3/vl1cSAmE9d04pHl1xWGmEycHYinjF+XKWIysc7EU8avax0xmTg7EE8Zvy6YxGTi9Ew8Zfy6 6hKTmR3gnTJ+XbqJycwO8E4Zv67/xGRm0XoHg18XkWIys2izWbTZLFqTi8smF5dNLi6bXFw2ubhs cnHZ5OL2FbSYzOwAE7LLJmSXTcgum5BdNiG7bEJ22YTssgnZZROyyyZkl03ILpuQXTYhu2xCdtmE 7LIJ2WUTsssmZJdvQ3YB1XLNYeejf14ayBlUQv/z0kDOoKPAPy8N5Aw6Cvzz0kDOoKPAPy8N5Aw6 Cvzz0kDOoKPAPy8N5Aw6Cvzz0tdz3vLsuX1pIGfQUeCflwZyxvvo3A7n7MJ4H52b4JxdGO+jmLfN fmG8j2I2OPuF8T6K2eDsF8b7KOZws18Y76OYw81+YbyPYg4368Kow80/Lw3kjPdRzOFmvzDeRzGH m/3CeB/FHG72C+N9FHO42S+M91HM4Wa/MN5HMYeb/cJ4H8UcbvYL430Uc7jZL4z3UczhZl0Ydbj5 56WBnPE+ijnc7BfG+yjmcLNfGO+jGu2jGu+jGu2jGu+jGu2jGu+jGu2jGu+jGu2jGu+jGu2jGu+j Gu2jFu+jFu2jFu+jFu2jFu+jFu2jFu+jFu2jFu+jFu2jFu+jFu2jFu+jFu2jFu+jFu2jFu+jFu2j Fu+jFu2jHu+jHu2jHu+jHu2jHu+jHu2jHu+jHu2jHu+jHu2jHu+jHu2jHu+jHu2jHu+jHu2jHu+j Hu2jHu+jHu2jEe+jEe2jEe+jEe2jEe+jEe2jEe+jEe2jEe+jEe2jEe+jEe2jEe+jEe2jEe+jEe2j Ee+jEe2jEe+jEe2jW6f33b40kDPeR+fn7Z1dGO+j82P0zi6M99H56XhnF8b76PzQu7ML4310ford 2YXxPjo/nO7swngfnZ85d3ZhvI/OD5E7uzDeR+dnw51ceOtguNuXBnLG++j8vLezC+N9dH6M29mF 8T6a0T6KHrP2z0sDOeN9FDsobL8w3kcz2kfRo77+eWkgZ7yPzs/oOrsw3kfnZ2x9fWGOHrD1z0sD OcN9lGPHX+0Xhvvo86WBnOE+yudnT51dGO6jfH6q1NmF4T7KsbOi9gvDfZTPD4k6uzDcR/n88Kez C8N9lGPHOu0Xhvsox451WhdGj3X656WBnPE+Oj/M6ezCeB9FeYYc5xlylGfIcZ4hR3mGHOcZcpRn yHGeIUd5hhznGXKUZ8hxniFHeYYc5xlylGfIcZ4hR3mGHOcZcpRnyHGeIUd5hhznGXKUZ8hxniFH eYYc5xlylGfIcZ4hR3mGHOcZcpRnyHGeIUd5hhznGXKUZ8hxniFHeYYc5xlylGfIcZ4hR3mGHOcZ cpRnyHGeIUd5hhznGXKUZ8hxniFHeYYc5xlylGfIcZ4hR3mGHOcZkAi9Il//inz9K/L1r8jXv+47 NSQKCI0rOkOgojMEKjpDoKIzBCo6Q6CiMwQqOkOgojMEKjpDoKIzBCo6Q6CiMwQqOkOgojMEKjpD oKIzBCo6Q6CiMwQqOkOgojMEKjpDoKIzBCo6Q6CiMwQqOkOgojME6j5hJlGoNiaqjYlqg1jYVWRh V5GFXd3nsfdHIeO7iozv6j41JVGkNpBdXkV2eRXZ5VVkl1eRXV5FdnkV2eVVZJdXkV1eRXZ5Fdnl VWSXV5FdXkV2eRXZ5VVkl7ePrVEUqg1isleRyV41DduradheTcP2ahq2H2s7MZmnJ66mlXw1reSr aSVfTSv5alrJV9NKvppW8tW0kq+mlXw1reSraSVfTSv5alrJV9NKvppW8tW0kq+mlXw1reSraSVf TSv5alrJV9NKvppW8tW0kq+mlXw1reSP+YKYzOyAaXbANDtANN6spvFmNY03jwGIlsx08aymi+cx RRGTiR1gWoJW0xK0mpag1bQEraYlaDUtQatpCVpNS9BqWoJW0xK0mpag1bQEraYlaDUtQatpCVpN S9BjxiUmMztA9Betpr9oRYdUVHRIRUWHVFR0SEVFh1RUdEhFRYdUVHRIRUWHVFR0SEVFh1RUdEhF RYdUVHRIRUWHVFTGB6FDKio6pKKiQyoqOqSiokMqKjqkoqJDKio6pKKiQyoqOqSiokMqKjqkoqJD Kio6pKKiQyoqOqRiRaHaaKg2GqqNhmoDcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZ cYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYUZcYXm+Q7VPN+h muc7VPN8h2qe71DN8x2qeb5DNc93qOb5DtU836Ga5ztU83yHap7vUM3zHap5vkM1z3eo5vkO1Tzf oZrnO1TzfIdqnu9QzfMdqnm+QzXPd6jm+Q7VPN+hmuc7VPN8h2qe71DN8x2qeb5DfeF8BzZfEJOZ HdDMDmhmB5hMbjaZ3GwyudlkcrPJ5GaTyc0mk5tNJjebTG42mdxsMrnZZHKzyeRmk8nNJpObTSY3 m0xuNpncbDK52WRys8nkZpPJzSaTm00mN5tMbjaZ3GwyudlkcjPS5Waky81Il5uRLjcjXW5GutyM dLkZ6XIz0uVmpMvNSJebkS63IF1uQbrcgnS5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS 5Rakyy1Il1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IK6wIK6wIK6wIK6wIK6wIK6wIEKw IEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKwIEKw MELQVDdmU92YTXVjNtWN2VQ3ZlPdmE11YzbVjdlUN2ZT3ZhNdWM21Y3FVDcWU91YTHVjMdWNxVQ3 FlPdWEx1YzHVjcVUNxZT3VhMdWMx1Y3FVDcWU91YTHVjMdWNxVQ3FlPdWEx1YzHVjcVUNxZT3VhM dWMx1Y3FpGuLSdcWk64tJl1bTLq2mHRtMYHYYgKxxQRiiwnEFhOILSYQW0wgtphAbDGB2GICscUE YosJxBYTiC0mEFtMILaYQGwxgdhiArHFBGKLCcQWEYjtyJy3I3Pejsx5OzLn7cictyNz3o7MeTsy 5+3InLcjc96OzHk7MuftyJy3I3Pejsx5OzLn7chcpCNzkY7MRToyF+nIXKQjc5GOzEU6MhfpyFyk I3ORjsxFOjIX6chcpCNzkY7MRToyF+nIXKQjc5GOzEU6MhfpyFykI3ORjsxFOjIX6chcpCNzkY7M RToyF+nIXKQjc5GOzEU6MhfpyFykI3ORjsxFOjIX6chcpCNzkY7MRToyF+nIXKQjc5GOzEU6Mhfp yFykI3ORjsxFOjIX6aaZZjfNNLtpptlNM81umml200yzm2aa3TTT7KaZZjfNNLtpptlNM81umml2 00yzm2aa3TTT7KaZSzfNXLpp5tJNM5dumrl008ylm2Yu3TRz6aaZSzfNXLpp5tJNM5dumrl008yl m2Yu3TRz6aaZSzfNXLpp5tJNM5dumrl008ylm2Yu3TRz6aaZSzfNXLpp5tJNM5dumrl008ylm2Yu 3TRz6aaZSzfNXLpp5tJNM5dumrl008ylm2Yu3TRz6aaZSzfNXLpp5tJNM5dumrl008ylm2Yu3TRz 6cictyNz3o7MeTsy5+3InLcjc96OzHk7MuftyJy3I3Pejsx5OzLn7cictyNz3o7MeTsy5+3IXKQj c5GOzEU6MhfpyFykI3ORjsxFOjIX6chcpCNzkY7MRToyF+nIXKQjc5GOzEU6MhfpyFykI3ORjsxF OjIX6chcpCNzkY7MRToyF+nIXKQjc5GOzEU6MhfpyFykI3ORjsxFOjIX6chcpCNzkY7MRToyF+nI XKQjc5GOzEU6MhfpyFykI3ORXhBXiCxJOrIk6ciSpCNLko4sSbppptlNM81umml200yzm2aa3TTT 7KaZZjfNNLtpptlNM81umml200yzm2aa3TTT7KaZZjfNNLtpAdNNC5huWsB00wKmmxYw3bSA6aYF TDctYLppAdNNC5huWsB00wKmmxYw3bSA6aYFTDctYLppAdNNC5huWsB00wKmmxYw3bSA6aYFTDct YLppAdNNC5huWsB00wKmmxYw3bSA6aYFTDctYLppAdNNC5huWsB00wKmmxYw3bSA6aYFTDctYLpp AdNNC5hjaiUmMzvAZHJNP5lu+sl000+mI0vfjix9O7L07cjStyNL344sfTuy9O3I0rcjS9+OLH07 svTtyNK3I0vfjix9O7L07cjSd0Wh2kC63IJ0uQXpcgvS5Rakyy1Il1uQLrcgXW5ButyCdLkF6XIL 0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKCyIECyIECyIE CyIECyIECyIECyIECyIECyIECyIECyIECyIECyIECyIECyIECyIECyIECyIECyMETXWj6czZTWfO bjpzdtOZs5vOnN105uymM2c3nTm76czZTWfObjpzdtOZs5vOnN105uyqM2cx1Y3FVDcWU91YTHVj MdWNxVQ3FlPdWEx1YzHVjcVUNxZT3VhMdWMx1Y3FVDcWU91YTHVjMdWNxVQ3FlPdWEx1YzHp2mLS tcWka4tJ1xaTri0mXVtMuraYdG0xgdhiArHFBGKLCcQWE4gtJhBbTCC2mEBsMYHYYgKxxQRiiwnE FhOILSYQW0wgtphAbDGB2GICseU2ELv/48+PP7598/D+l5+/e3p+uPzjsmf7ffy2+7fsF/796fnj 2/1HvX5pIOeI5xzRnFs85xbNOeM5ZzDnWv1Ec/56aSBniudM0Zw5njNHc5Z4zhLNWeM5azRni+ds 0ZzxPurRPurxPurRPurxPurRPurxPurRPhrxPhrRPhrxPhrRPhrxPhrRPhrxPhrRPhrxPhrRPhrx PhrRPhrxPhrRPhrxPhrRPhrxPhrRPhrxPhrRPtrifbRF+2iL99EW7aMt3kdbtI+2eB9t0T7a4n20 Rftoi/fRFu2jLd5HW7SPtngfbdE+2uJ9tEX7aIv30Rbtoxnvoxntoxnvoxntoxnvoxntoxnvoxnt oxnvoxntoxnvoxntoxnvoxntoxnvoxntoxnvoxntoxnvoxnso11zGcz5+dJAznAffb40kDPcR58v DeQM99HnSwM5w330+dJAznAffb40kDPcR58vDeQM99HnSwM5w330+dJAznAffb709Zwp3kcp2kcp 3kcp2kcp3kcp2kcp3kcp2kcp3kcp2kcp3kcp2kcp3kcp2kcp3kcp2kcp3kcp2kcp3kcp2kc53kc5 2kc53kc52kc53kc52kc53kc52kc53kc52kc53kc52kc53kc52kc53kc52kc53kc52kc53kc52kcl 3kcl2kcl3kcl2kcl3kcl2kcl3kcl2kcl3kcl2kcl3kcl2kcl3kcl2kcl3kcl2kcl3kcl2kcl3kcl 2kc13kc12kc13kc12kc13kc12kc13kc12kc13kc12kc13kc12kc13kc12kc13kc12kc13kc12kc1 3kc12kct3kct2kct3kct2kct3kct2kct3kct2kct3kct2kct3kct2kdxnqFEeYYS5xlKlGcocZ6h RHmGEucZSpRnKHGeoUR5hhLnGUqUZyhxnqFEeYYS5xlKlGcocZ6hRHmGEucZSpRnKHGeoUR5hhLn GUqUZyhxnqFEeYYS5xlKlGcocZ6hRHmGEucZSpRnKHGeoUR5hhLnGUqUZyhxnqFEeYYS5xlKlGco cZ6hRHmGEucZSpRnKHGeoUR5hhLnGUqUZyhxnqFEeYYS5xlKlGcocZ6hRHmGEucZSpRnKHGeoUR5 hhLnGUqUZyhxnqFEeYYS5xlKlGcocZ6hRHmGEucZSpRnKHGeoUR5hhLnGUqUZyhxnqFEeYYS5xlK lGcocZ6hRHmGEucZSpRnKHGeoUR5hhLnGUqUZyhxnqFEeYYS5xlKlGeocZ6hRnmGGucZapRnqHGe oUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa 5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRn qHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFG eYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZ apRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hx nqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmG GucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqU Z6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6h RnmGGucZapRnqHGeoUZ5hhrnGWqUZ6hxnqFGeYYa5xlqlGeocZ6hRnmGGucZapRnqHGeoUZ5hhrn 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 AXosE8VkZmmICtBjreklq+ZXkCgnPRasYjKzA16Qkz5+erwebfD2/cPz04+/vHt8/ir4evDDx4df Pj59//Dduw9vftpPQNhyzuXS//KrO8F+LsT76xkMH49DF776CPuPfX+Ef3xIp5d8/pC/HcFwPS/k t7ThKLaY/4Z71E7vUer9st4DZ/QetdfvUUP36CyKjS6+4R7103uU65wpX1r0HvXX71FH9+gsig1q vuEejdN7VErZLmP9hQ3eo/H6PRroHp1FsbHUN9yj7fQe7Ue+zNnD30fb6/doQ/foLIoN4b7hHs3T e9QuaX2+doneo/n6PZroHp1FsZEjv0ftcn6PtlVKeYvWUbu8eo/ahdyj0yg2YP2Ge5RO71Efaaat R/+utfT6PUroHp1FsXHyN9yjfHqPxnrt7VuPfme3/Po9yugenUWx4fk33KNyeo+2MuYYNdxr5fV7 9PUxXpF7dBbFtgq+4R6dv2fPnLZ0KeFee/09u6H37NMotjHyDffo9D27Xy51y7NE/66119+zG3rP Po1i20DfcI9O37P7Zb1lt5K26D16/T27offs0yi26fUN9+j0PbunUXJe/7/oPXr9Pbuh9+zTKLbF 9w336PQ9u69v7XEpl3Cvvf6e3dB79mkU29D8hnt0+p7dS72MVOJ/+19/z27oPfs0im3f8nvUT9+z e801H7Z1sXvUX3/P7ug9+zSKbVZ/wz06fc/egcmc1/+J3qPX37M7es8+jWJb899wj07fs/t6Qepj hL+P+uvv2R29Z59GMRDhG+7R6Xt276Nvadbo37X++nt2R+/Zp1EMu/iGe3T6nr1u0WUbbYbv0evv 2R29Z59GMcjkG+7R+Xv2VkvfdsA/eI9ef8/u6D37NIohNd9wj87fs2fe2tjivfb6e3ZH79mnUQwg +oZ7dPqePS4ptdF7+Dv79ffsjt6zT6MYLvUN9+j0PXtcZs9rVRvutdffszt6zz6NYnDYN9yj0/fs kca8zFlq9B69/p7d0Xv2aRRD4fg9Gqfv2WOtRvqMr9fG6+/ZA71nn0Yx8O8b7tHpe/YodZTeW3S9 Nl5/zx7oPfs0imGO33CPTt+zRy2XmUoK36PX37MHes8+jWJQ5zfco9P37NFSXfcoh+/R6+/ZA71n n0YxhPUb7tHpe/Z6zd6nteH9tfH6e/ZA79mnUQzY/YZ7dPqePfYX7UsKMxHj9ffsgd6zb0b9/Pjj 2zcP73/5+bun54fLPy77Tfp96LZruvcL//70/PHtfgdfvzSQc8RzjmjOLZ5zi+ac8ZwzlnPXewdz fr40kDPFc6ZozhzPmaM5Szxnieas8Zw1mrPFc7ZoznAffb40kDPcR58vDeQM99HnSwM5w330+dLX c6Z4H6VoH6V4H6VoH6V4H6VoH6V4H6VoH6V4H6VoH6V4H6VoH6V4H6VoH6V4H6VoH6V4H6VoH6V4 H6VoH+V4H+VoH+V4H+VoH+V4H+VoH+V4H+VoH+V4H+VoH+V4H+VoH+V4H+VoH+V4H+VoH+V4H+Vo H+V4H+VoH5V4H5VoH5V4H5VoH5V4H5VoH5V4H5VoH5V4H5VoH5V4H5VoH5V4H5VoH5V4H5VoH5V4 H5VoH5V4H5VoH9V4H9VoH9V4H9VoH9V4H9VoH9V4H9VoH9V4H9VoH9V4H9VoH9V4H9VoH9V4H9Vo H9V4H9VoH9V4H9VoH7V4H7VoH7V4H7VoH7V4H7VoH7V4H7VoH7V4H7VoH7V4H7VoH7V4H7VoH7V4 H7VoH7V4H7VoH7V4H7VoH/V4H/VoH/V4H/VoH/V4H/VoH/V4H/VoH/V4H/VoH/V4H/VoH/V4H/Vo H/V4H/VoH/V4H/VoH/V4H/VoH414H41oH414H41oH414H41oH414H41oH414H41oH414H41oH414 H41oH414H41oH414H41oH414H41oH23xPtqifbTF+2iL9tEW76Mt2kdbvI+2aB9t8T7aon20xfto i/bRFu+jLdpHW7yPtmgfbfE+2qJ9tMX7aIv20Yz30Yz20Yz30Yz20Yz30Yz20Yz30Yz20Yz30Yz2 0Yz30Yz2UZxnaFGeocV5hhblGVqcZ2hRnqHFeYYW5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7l GXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfo UZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5 hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6 nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGe ocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe 5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn 6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHH eYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZ epxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hR nqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mG HuUZepxn6FGeocd5hh7lGXqcZ+hRnqHHeYYe5Rl6nGfoUZ6hx3mGHuUZepxn6FGeocd5hh7lGUac ZxhRnmHEeYYR5RlGnGcYUZ5hxHmGEeUZRpxnGFGeYcR5hhHlGUacZxhRnmHEeYYR5RlGnGcYUZ5h xHmGEeUZRpxnGFGeYcR5hhHlGUacZxhRnmHEeYYR5RlGnGcYUZ5hxHmGEeUZRpxnGFGeYcR5hhHl GUacZxhRnmHEeYYR5RlGnGcYUZ5hxHmGEeUZRpxnGFGeYcR5hhHlGUacZxhRnmHEeYYR5RlGnGcY UZ5hxHmGEeUZRpxnGFGeYcR5hhHlGUacZxhRnmHEeYYR5RlGnGcYUZ5hxHmGEeUZRpxnGFGeYcR5 hhHlGUacZxhRnmHEeYYR5RlGnGcYUZ5hxHmGEeUZRpxnGFGeYcR5hhHlGUacZxhRnmHEeYYR5RlG nGcYUZ5hxHmGEeUZRpxnGFGeYcR5hhHlGUacZxhRnmHEeYYR5RlGnGcYUZ5hxHmG/dKHX//3rw+P P77/8PA/H9b65h7f1J4ufaXbBoqaJGqSqO1ynx/s56iEosg93C4NRXUURZ7XdtlQFHpeCT2vhJ4X qvltrdpJVEVRqDYSqo2EaiOh2kioNjKqjYxqI6PayKg2MqqNjGojo9rIqDYyqo2MaqOg2iioNgqq jYJqo6DaKKg2CqqNgmqjoNooqDYqqo2KaqOi2qioNiqqjYpqo6LaqOz98PZpRehl00s2xWT7q6mY 7PaJKuhFVkx2+2wF9NorJhPrbH9JFpOZdZbMOktmnSWzztLts2DQ67qYzOyAZHZAMjsgmR2QzA7I ZgdkswOy2QHZ7IBsdkA2OyCbHZDNDshmB2SzA4rZAcXsgGJ2QDE7oJgdUMwOKGYHFLMDitkBxeyA anZANTugmh1QzQ6oZgdUswOq2QHV7ICKBhsVDTYaGmw0NNhoaLDR0GCjocFGQ4ONhgYbDQ29GqqN hmqjo9roqDY6qo2OaqOj2uioNjqqjY5qo6Pa6Kg2BqqNgWpjoNoYqDYGqo2BamOg2hioNgaqjYFq Y0O1saHa2FBtbKg2NlQbG6qNDdUGgim2DdUGQjC2iWpjotqYqDYmqo2JamOi2pioNiaqjYlqA4E2 E4E2E4E2E4E280JqY15IbUwE9UwE9UwE9UwE9UwE9UwE9UwG9VRzAlHNCUQzJxDNnEA0cwLRzAlE MycQzZxANHMC0cwJRDM7oJkd0M0O6GYHdLMDutkB3eyAbnZANzugmx3QzQ7oZgcMswOG2QHD7IBh dsAwO2CYHTDMDhhmBwyzA4bZAZvZAZvZAZvZAZvZAZvZAZvZAZvZASb3t89FxGRmB0yzA6bZAdPs gGl2wDQ7YJodMM0OmGYHTLMDTPJ1muTrNMnXaZKv+8BJTCZ2wDSZ3GkyudNkcqfJ5E6TyZ0mkztN JnciUdxEoriJRHETieImEsVNJIqbSBQ3kShuIlHcRKK4iURxE4niJhLFTSSKm0gUN5EobiJR3ESi uIlEcROJ4iYSxU0kiptIFDeRKG4iUdxEoriJRHETieImEsVNJIqbSBQ3kShuIlHcRKK4iURxE4ni JuIKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IK J+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKJ+IKp6mJnKYmcpqayGlqIqepiZymJnKamshpaiKnqYmc piZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKamshpaiKnqYmcpiZymprIaWoip6mJnKYmcpqa yGlqIqepiZymJnKamshpaiKnqYmcpiZymprIaWoip8nkTpPJnSaTO00md5pM7jSZ3GkyudNkcqfJ 5E6TyZ0mkztNJneaTO40mdxpMrnTZHLnC0zu46fHhx8+PP+0Ih6en3785d3j81fBD2/ePb79+ePD Lx+fvn/47t2HNz895JbrHGO3in/z4Xn/qW/f//jw/ukfn57ef/q4Z/z6I+w/9v0R/vEhrSVYOr3s 8wd9ftp/sU8fHq6Gwr+lDkex6Zh4083mNnHjaeLG08SNp4kbTxM3niZuPE3ceJq48TRx44kkxxNJ jieSHE8kOZ5IcjyR5HgiyfFEkuOJJMcTSY4nkhxPJDmeSHI8keR4IsnxRJLjiSTHE0mOJ5IcTyQ5 nkhyPJHkeCLJ8SSS43YhkuMVBWpjRYHaWFGgNlYUqI0VBWpjRYHaWFGgNlYUqI0VhWqDSI5XFKoN gkyuKFQbBJlcUag2CDK5olBtEGRyRaHaIMjkikK1QZDJFYVqgyCTKwrVBkEmVxSqDYJMrihUGwSZ XFGoNggyuaJQbRBkckWh2iDI5IpCtUGQyRXF8BZzAmHKPacp95ym3HOacs9pyj2nKfecptxzmnLP aco9pyn3nKbcc5pyz2nKPacp95ym3HOacs9pyj2nKfecptxzmnLPaco9pyn3nKLc81ini8m8DjhW 9WIyrwOOGYCYzOuAY2IgJvM64JgviMnMDhDlnseQQkxmdoCIGx+TDjGZ2QEibnyMS8RkZgeIuPEx cxGTmR0g4sbH4EZMZnaAiBsf0x8xmdkBIm58jJC8ZCJufAycxGRmB4i48TG1EpPd7oDXqJ09+ITa 2XpL9dLaJQTtHJ/g99DOvLSaTy+7H9q5EcWmd+I9N3tbBKmPEaCXjIipVxSaGhMx9YpCU2Mipl5R aGpMxNQrCk2NiZh6RaEdBSKmXlGoNoiYekWh2iBi6hWFaoOIqVcUqg0ipl5RqDaImHpFodogYuoV hWqDiKlXFKoNIqZeUag2iJh6RaHaIGLqFYVqg4ipVxSqDSKmXlGoNggxuaJQbRBickWh2iDE5IpC tUGIyRWFaoMQkysK1QYhJlcUqg1CTK4oVBuEmFxRqDYIMbmiUG0QYnJFodogxOSKQrVBiMkVRWoj IWIyIWIyIWIyMWJSFLIeyzIxmTlbEYWsx9pOTGZOF0Uh67FAFJOZEwhRyHqsMsVkZgeIQtZjqSom MztAFLIe610xmdkBopD1WDR7yUQh67HEFpOZHSAKWY91upjM7ABR7Xks9sVkZgeIas9jYiAmMztA VHseYwcxmdkBotrzmF2IycwOEGnjYwDiJRNp42NcIiYzO0CkjY+Zi5jM7ACRNj4GN2IyswNE2viY /ojJzA4QaeNjhCQmMztApI2POZSYzOwAkTY+hllasmTSxsmkjZNJGyeTNk5IcZyQ4jghxXFCiuOE FMcJKY4TUhwnpDhOSHGckOI4IcVxQorjhBTHCSmOE1IcJ6Q4TkhxnJDiOCHFcUKK44QUxwkpjhNS HCekOE5IcZyQ4jghxXFCiuOEFMcJKY4TUhwnpDhOSHGckOI4IcVxIorjHS5FUag2EFeYEFeYEFeY EFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeYEFeY EFeYEFeYEFeYEFeYTLVnMtWeyVR7JlPtmUy1ZzLVnslUeyZT7ZlMtWcy1Z7JVHsmU+2ZTLVnMtWe yVR7JlPtmUy1ZzLVnslUeyZT7ZlMtWcy1Z7JVHsmU+2ZTLVnMtWeyVR7JlPtmUy1ZzLVnslUeybx cJljviAmMzvA1EQmUxOZTCY3mUxuMpncZDK5yWRyk8nkJpPJTSaTm0wmN5lMbjKZ3GQyuclkcpPJ 5CaTyU0mk5tMJjeZTG4ymdxkMrnJZHKTyeQmk8lNJpObTCY3mUxuMpncZDK5CelyE9LlJqTLTUiX m5AuNyFdbkK63IR0uQnpchPS5Saky01Il5uQLjchXW5CutyEdLkJ6XIT0uUmpMtNSJebkC43IV1u QrrchHS5CelyE9LlJqTLTUiXm5AuNyFdbkK63IR0uRnpcjPS5Waky81Il5sRV5gRV5gRV5gRV5gR V5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gR V5gRV5gRV5gRV5gZV2hqIpOpiUymJjKZmshkaiKTqYlMpiYymZrIZGoik6mJTKYmMpmayGRqIpOp iUymJjKZmshkaiKTqYlMpiYymZrIZGoik6mJTKYmMpmayGRqIpOpiUymJjKZmshkaiKTqYlMpiYy mZrIbGois6mJzKYmMpuayGwyudlkcrPJ5GaTyc0mk5tNJjebTG42mdxsMrnZZHKzyeRmk8nNJpOb TSY3m0xuNpncbDK52WRys8nkZpPJzSaTm00mN5tMbjaZ3GwyudlkcrPJ5GaTyc1Il5uRLjcjXW5G utyMdLkZ6XIz0uVmpMvNSJebkS43I11uRrrcjHS5GelyM9LlZqTLzUiXm5EuNyNdbka63Ix0uRnp cjPS5Waky81Il5uRLjcjXW5GutyMdLkZ6XIz0uVmpMvNSJebkS43I11uRrrcjLjCjLjCjLjCjLjC jLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjCjLjC jLjCjLjCjLjCjLjCjLjCbGois6mJzKYmMpuayGxqIrOpicymJjKbmshsaiKzqYnMpiYym5rIbGoi s6mJzKYmMpuayGxqIrOpicymJjKbmshsaiKzqYnMpiYym5rIbGois6mJzKYmMpuayGxqIrOpicym JjKbmshsaiKzqYnMpiYym5rIbDK52WRys8nkZpPJzSaTm00mN5tMbjaZ3GwyudlkcrPJ5GaTyc0m k5tNJjebTG42mdxsMrnZZHKzyeRmk8nNJpObTSY3m0xuNpncbDK52WRys8nkZpPJzUiXm5EuNyNd bka63IJ0uQXpcgvS5Rakyy1Il1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5 BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rakyy1Il1uQLrcgXW5ButyCuMKCuMKCuMKC uMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKC uMKCuMKCuMKCuMKCuMLCuEJTE5lNTWQ2NZHZ1EQWUxNZTE1kMTWRxdREFlMTWUxNZDE1kcXURBZT E1lMTWQxNZHF1EQWUxNZTE1kMTWRxdREFlMTWUxNZDE1kcXURBZTE1lMTWQxNZHF1EQWUxNZTE1k MTWRxdREFlMTWUxNZDE1kcXURBaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExu MZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG5ButyCdLkF 6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rak yy1Il1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC9LlFsQVFsQVFsQV FsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQV VsQVVsQVVsQVVsQVVsQVVsYVmprIYmoii6mJLKYmspiayGJqIoupiSymJrKYmshiaiKLqYkspiay mJrIYmoii6mJLKYmspiayGJqIoupiSymJrKYmshiaiKLqYkspiaymJrIYmoii6mJLKYmspiayGJq IoupiSymJrKYmshiaiKLqYkspiaymExuMZncYjK5xWRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVk cqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK51WRyK9LlVqTL rUiXW5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVWpMutSJdbkS63 Il1uRbrcinS5FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrcirrAirrAi rrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAirrAi rrAirrAirrAirrAirrAirrAirrCamshqaiKrqYmspiaymprIamoiq6mJrKYmspqayGpqIqupiaym JrKamshqaiKrqYmspiaymprIamoiq6mJrKYmspqayGpqIqupiaymJrKamshqaiKrqYmspiaymprI amoiq6mJrKYmspqayGpqIqupiaymJrKaTG41mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK5 1WRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVkcqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHIr0uVW pMutSJdbkS63Il1uRbrcinS5FelyK9LlVqTLrUiXW5EutyFdbkO63IZ0uQ3pchvS5Taky21Il9uQ LrchXW5DutyGdLkN6XIb0uU2pMttSJfbkC63IV1uQ7rchnS5DelyG9LlNqTLbUiX25AutyGusCGu sCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGu sCGusCGusCGusCGusCGusCGusDGu0NREVlMTWU1NZDU1kdXURFZTE1lNTWQ1NZHV1ERWUxNZTU1k NTWRzdRENlMT2UxNZDM1kc3URDZTE9lMTWQzNZHN1EQ2UxPZTE1kMzWRzdRENlMT2UxNZDM1kc3U RDZTE9lMTWQzNZHN1EQ2UxPZTE1kMzWRzWRym8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaT yW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT25Au tyFdbkO63IZ0uQ3pchtS2DaksG1IYduQVrYhrWxDWtmGVK8NqV4bUr02pERtSFPakKa0IU1pQ5rS hjSlDWlKG9KUNqQpbUhT2pCmtCFNaUOa0oY0pQ1pShvSlDbExDXExDXExDXExDXExDXExDXExDXE xDXExDXExDXExDXExHXExHXExHXExHXExHXExHXExHXExHXExHXExHXExHXExHVEnHVGnJlquWaq 5ZqplmumWq6ZarlmCtyaKXBrpsCtmZq0ZmrSmqlJa6aMrJkysmbKyJop1mqmvqqZ+qpm6quaqa9q pr6qmfqqZuqrmqmvaqa+qpn6qmbqq5qpr2qmvqqZ+qpm6quayfc1k+9rJt/XTL6vmXxfM/m+ZvJ9 zeT7msn3NZPvaybf10y+r5t8Xzf5vm7yfd3k+7rJ93WT7+sm39dNvq+bfF83+b5u8n3dBN+6CL71 jYhzVhQYbq0oMGJZUWDEsqLAcGtFgeHWigLDrRUFhlt9I+KcFQUGnysK1QYR56wo9LyIYGZFoedF BDN9I4KZFYXuPNmEX1HozpPt9L6RjfEVhX4W2WhdUehukI3WFcV+L1SHZKN1RaHvDbLRuqLQ9wbZ aF1RqDbIRuuKQrVBNlpXFKoNstG6olBtkI3WFYVqg2y0rij2vuEtS47XKzGZ9+55vIyJybxlyfHq JibzliXHi56XTARuj9dCMZnZASJwe7xbisnMOhOx1uMF1UsmYq3H66yYzPw+E3eVj3diL5m4EXy8 QXvJxA26431bTGb2prhBd7y0e8nEDbrjFV9MZja6uEF3rBPEZGYHiBt0x2JDTGZ2gLhBd6xYxGRm B4gbdMeyR0xmdoC4QTcuxNBrRYF12ooCa/gVBdbwKwqs4VcUWMOPCzH0WlFgDb+iwGp8RaGnTKb/ Kwo9ZTL9X1HoKZPp/7iQ6f+KQk+ZTP9XFKoNYs21olBtkJ2GFYVqg+w0rChUG2SnYUWh2iD7EysK 1QbZ1VhRqDbIXsiKQrVBdlBWFKoNsu+yolBtEBnjikJPmRwhuaJQHRK534pCT5ns8YwL2eNZUegp kz2eFYXuPNnjWVHoG4Ds1hxvsOLrsPpu7a0uj9dgMZm3ujxemr1koq3L8YotJvMWhMcLuZjMLFpx Y+h4qxeTmUUrbgwdSwMxmVm04sbQsb4Qk5kdIDqxHIsUMZnZAeKW1bHS8ZKJW1bHukhMZnaAqPc8 FldiMrMDxJ25Y4UmJjM7QBSPHss8MZnZAaIS9VgresnEU+uOlaWYTP01zaIVdzOPVauYzCxacTfz WPqKyczSEHczj/WzlWxD0OqGoNUNQavbJN4gKwqMQVYUGIOsKDAGWVFgELqiwPBkRYER2YoCI7Jt Em+QFUUqapLzslYUqg3iXrKiUG2Q87JWFKoNcvLVNsnJVysKPWVy8tWKQk+ZbJSvKPSUyUb5ikJP mWyUryhUG2SjfEWh2iCb1ysK3Xmyeb2i0D0k29ArCt1Dsg29mYjcZiJym4nIHa8fYjLvDfV4WRGT eW+ox6uNmEx83Z2iGPp4P/KSiWLo421KTGZ2gHjYyfFKJiYzO0A87OR4rxOTmUUrnk9yvByKycyi Fc8nOd4wxWRm0Yob2cdr6q1kj58eH3748PzTinh4fvrxl3ePz18FP7x59/j2548Pv3x8+v7hu3cf 3vz0kLZW8yXXsf3lzYfn/ae+ff/jw/unf3x6ev/p457x64+w/9j3R/jHh9xzqvX0us+f9Plp/80+ fXi4XCM/507RKPZmLt51s7vFTfrj9V5MZpa9uBV+rBHEZObTFHevj4WGmEz7rs4XstDdo+5fpK0o sNDdo+5fpO1R9y/S9qj7hyB71P1DkD3q/qX4HnX/UnyPQk8ZMNB71P3L/j2KfUJUh4BL3qNQHQIu eY9CdQi45D0K1SHgkvcoVBuAS96jUG0ALnlFAYp0j0LPC1CkexR6XoA93aPQ8wJOISsKOIXsUaiX vVfP659QL5n36nn9gysmM19WPNj0+ldbTKa9YV//xovJzKL18MTri4KYTP01zd70IMDrS4iYzOxN DwK8vsmIyW735iujlSP4ZLTSUh5tzlkjk5XrJ3h9snJcd/dk5VYUe6UTb7rZ3B7feH0v9JJ5fOP1 LVJMZraQB2RdX0XFZGadefYS1/dZL5lnL3F9+7WS5QnsKfcosLBYUWBhkdFyJKPlSEbLkYyWIysK jBZWFFiq5gmMC/cosFRdUaiiwAlxexSqDXBCXC4XcELcHgVqY0WB2lhRoDZWFKiNFQVqY0WB2lhR oDZWFKiNFYVqA1CgexSqDUCB7lGoNhK6h4CxXFGAsdyj0D0EjOUehe4hYCz3KNRfgLHco1B/ka2n QsyIVhTZeirEjGiPQn9TPNvB6+uVmMx7K87mK3Y2X7Gz+Yqd3Vdsz8Ht+v4nJvMWmcfbopjMbCfv iKXrK6eYzOuA4wVVTOZ1wPE6KybzOuB4+RWTeR1wvCqLybwOOF6sxWRmB3hU8fXtXExmdoBHFV9f 8cVk5tP0cNvrOkFMZj5ND7e9LjbEZOb3mYfbXlcsYjKzA0QuoIi+UdfVkJjMu2cNrVobWrU2tGpt aNXa0Kq1oVXrigITjUaMd/coMNFoxHh3j0K1AbSLexSqDaB4XFFAhbhHoedFQNBGzHD3KPS8CHTa iBnuHoWeF4FOGzHD3aNQbRDotBEz3D0K1QbBLJv54tDMF4dmvjg088WhmS8OzXxxOP5Oicm8V+cm ulde/9iJycwO8CQ717+YYjKzA0SVTRM9Iq9/jcVkZp15HpHXP+liMrPORDy0iR6R19cFMZnZASIe 2kSPyOuriJdMRPiQl3xGXvIZecnvUeA1bkWBV/wVBV7xkdt9Rm73GbndZ+R2n5HbfUZu9xm53Wfk dr9HodogOqUVhWqDgIHjQsDAFYVqg4CBKwrVBgEDVxSqDQIGrihUGwQMXFGkNhIBA1cUqY1EwMAV RWojETBwRZHaSAQMXFHkKSeC+I1EEL8Vhe48sFHco9A9BDaKexS68wQMHImAgSsK9RcBA1cUesoE DFxRqDbIFsuKQrVBtlhWFKoNssWyolBtkC2WFYVqg2yxrCj2Pu8tFE3D8mwall8XO2Iyb1RyLI3E ZN6oxPRlz6YvezZ92bPpy55NX/Zs+rJn05f9utITk5kdIDLKx3LRSyYyysfiUkxmdoDIKB8rVDGZ 2QEio3wsc8VkZgeIjPKxVhaTiR2QREb5WHCLycQOSCKjfKzabyTb//GfUVfbhZ8ff3z75uE/P1xW ll//1eXwQ7iZfhwGDb/87dNvl6/IF67+T9fP8n9/ef/TNeIv7z88/LeHp/ef9t/qDz/pd1H7Na9e 9LfnD9+9e/r54f+9/fTX313x5sP7q7PD+mBffZzrp/nr49+fHt68e3p8fvr+62vY1EN8hGZ3i/z1 MToRk5ll79kdX+cvYjKzNESY+xjiiMnML34R5j4mQWIy84tfhLmPcZKYzOwAkck6ZlJeMpHJOiZY YjKzA0Qm6xiDicm8DphoKD3RUHqiofREQ+mJhtITDaUnGkpPNJSeaCg90VB6oqH0REPpiYbSEw2l JxpKTzSUXlGoNgiLPxM4fWiPQs+LcP8rCj0vwv2vKPS8CPe/olAvE+5/RaHaINz/ikK1Qbj/FYVq g3D/KwrVBjGbXlGoNojZ9IpCtUHMplcUqo2OaqOj2uioNjqqjY5qo6Pa6Kg2OqqNgWpjoNogoOmK QrVBQNMVhWqDgKYrCtUGAU1XFKoNApquKFQbBDRdUWzt4K1wpznjmeaMZ5oznmnOeKY545nmjGea M55pznimOeOZ5oxnmjOeac54pjnjmeaMZ7ozHlF3dyxNvWTe6VbXhayYzKwzUXd3rIbFZGadibq7 Y0ktJjO/aUXd3bEuF5OZHSDq7o7FvZjM7ABRd3dMCMRkZgeIZxccYwYvmXh2wTGUEJOZHdDNDuhm B3SzA7rZAd3sgG52QDc7YJgdMMwOEJH6Y1AjJjM7QETqj2mPmMzsABGpP0ZGXjIRqT8GTGIyswNE pH4lQxNMIodeUWiCSeTQKwpNMIkceiYih15RaBZJhM0rCj1lIlFeUejOE7HxzERsvKLI7DgTsfGK Is8rE9nwiiLPKxPsdkWRp5yJ2HhmIjZeUegpk/NEVhR6yol0ZSYS5RWFnhfiujLiujLiujLiujLi ujLiujLiujLiujLiujLiujLiujLiujLiujLiujIitDIitDJxZl1R6CkjGiwjGiwjGiwjGiwjGiwj GiwjGiwjGiwzGkyUyB6v+WIyc0UrSmSPtYKYzFzRihLZY8EhJjMXoaKq9Vi1iMnM0hC1o8fSR0wm DjuyqB091k9iMvH7LItH0hyLMDGZWLRZlEQeKzkxmVm04pE0x3JQTCZ+OWZRX3msKb1kJi6XTVwu m7hcNnG5bOJy2cTlsonLZROXyyYul01cLpu4XDZxuWzictnE5bJJuGWTcMuis/yx4heTmUVrsnfZ ZO+yyd5lk73LJnuXTfYum+xd9ti7kohaZY+6f+a1ooBaZY+6f+a1R90/89qj7p957VH3z7z2qPtn XnvU/TOvPer+mdcehWoDqFVWFFCr7FGoNoBaZY9CtQE4gD0K1QbgAPYoVBuAA9ijUG0ADmCPQrUB OIA9Cj1lYHC+R6GnDAzO9yj0lAFzUBJhDvYo8pQJc7BHkdrIwOB8jyK1QUiFPYrUBiEV9ihUG4BU 2KNQbQBSYY9CtQFIhT0K1QYwbt+jUG0AKmKPQrUBWIo9CtUGYCn2KFQbgKXYo1BtAJZij0K1AViK PQrVBmAp9ij05uAR7NcFlpfMI9ivyzExmTZLuC7exGTaLOG61BOTabOE68JQTGZ2gEewX1eXYjKz AzyC/bpEFZOZHeARL9d1rpjM7ACPeLkulr1kHvFyXVqLycyi9YiX6/pcTGYWrefjfl3ki8nEohVZ nOukQEwmfm2LLM513CAmEztABHuuMwsxmdgBIthzHXyIycwO8MCe6/RETGZ2gGfpfh3BiMnMDvCQ o+scx0vm8UvXqY+YzOwAj1+6jo7EZGYHePzSdf4kJjM7wOOXrkMsMZnYAQ1Yye5RZBzagJXsHkXG oQ1Yye5RZLDZgCnsigKmsHsUGWw2YAq7R6GnDExh9yj0lIEp7B5Fht4NYTYN4SgNwR4NwR4NYRsN YRsNYRsNYRsNARgNARgNARgNARgNARgNARgNARgN2DfsUegpI2yjIWyjIWyjIWyjIWyjIWyjI2yj I2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjI2yjeUaP11dvMZm4ymye 0eP1/V1MJi4Mm+fNeF0EiMnMhaHnzXhdSYjJzKL1vBmvyxExmTgaaSbZ0kxKo5n4QjPxhWYSB80k DppJHDSTOGgmJNBMSKCZkEAzIYFmQgLNhASaCQk0z2PjulgUk5l/UEzioJnEQTOJg2YSB80kDrpJ HHSTOOgmcdBN4qCbxEE3iYNuEgfdJA66SRx0kzjoJnHQTeKgm8RBN4mDbhIHXSQOChJ9FCT6KEj0 UZDooyDRR0Gij4JEHwWJPgoSfRQk+ihI9FGQ6KMg0UdBoo+CRB8FiT4KMdDco1BtgIOR9yhUG8B2 c49CtQFsN/coVBvAdnNFkf3lFYXuIdlfXlHoHhIbh5KJtcKKQjVPrBVWFHpeZAd8RaF7KJKAxSQB i0kCFpMELCYJWEwSsJgkYDFJwGKSgMUkAYtJAhaTBCwmCVhMErCYJGAxScAiOpldX4/EZGYHeLZo 13csMZnZAZ4t2vVFzUvm2aJdX+vEZObTFLfvjndDMZn5NEX59/GCKSYzvzVE+ffxliomM58mYUFX FFp3ExZ0RaE1CLHwWlFoDUII0hWF1oyEBS2ZsKArCj1lwoKuKPSUCQu6otBTJizoikJPmbCgpRA+ c0WR51UIn7miyPMqhM9cUeR5FcJnrij2vEgvF8JnrihUG4TPXFGoNgifuaJQbaAdloJ2WAraYSlo h6WgHZaCdlgK2mEpaIeloB2WgvZKCtorKWivpKC9koL2SgraKylor6SgvZKC9koK2ispaK+koL2S gvZKCtorKWivpIAjyvYoVBvgiLLrOkVc9JhTNBHNPBY7YjJzPSxynseKSUxmzl1ENPNYdonJzKIV 0cxj7SYmM4tWRDOPBaCYzCxaEc08VpFiMrHOighAHktRMZlYZ0UEII/1rJhMrTPxm7aIAOSxVhaT mR0gApDHgltMZnaACVoUE7QoJmhRTNCimKBFMUGLYoIWxQQtiglaFJONKCYbUUw2ophsRDHZiGKy EcVkI4rJRhSTjSgmG1FMNqKYbEQx2YhishHFZCOKd2TcdbojJvM6oGXiN9UQD9wQD9wQD9wQD9wQ D9wyOdZtRYE5YUPscUPscUPscUPs8YpCtUGcvhrinBvinBtiQhpiQhpiQhpiQhpiQhpiQhpiQhpi QlYUqg1CkjREkjREkjREkjREkjREkjREkjREkjREkqwo8pQL8QdriD9piD9piD9piD9piD9piD9p iD9piD9piCRpiCRpiCRpiCRpiCRpiCRpiCRpiCRpiCRpiCRpiCRpiAlpiAlpiAlpiAlpiAk51ini osdbqTeTe28m995M7r2Z3PuxYhKTeSv1ZhL5zSTym0nkN5PIP9ZuYjKzA0StQDO1As1kcJrJ4DST wWkmg9NMBqeZDE4zGZxmMjjHelZMZnaACPQ0E+hpJtDTTKCnmUBPM4GeZgI9zQR6jlW7lqyI9mjN pIOaSQc1kw5qJh3UTDqomXRQM+mgZtJBzQR6mgn0NBPoaSbQ00ygp5lATzOBnmYCPc0EepoJ9DQT 6Gkmg9NMBqeZDE4zGZxmMjijkF2/FQUmfqOQ/bsVBea6KwpM/FYUmPitKDC7W1HozpPdsVHI7tiK Qnee7HOtKDA1XVFgNr6i0PMi+1wrCnUK2R0bleyOrSjylCvZHVtRpDYq2R1bUaQ2KtkdW1GkNirZ HVtRqDbIntqKQrVB9tRWFKoNsqe2olBtkD21FYVqg+yprShUG2RPbUWh2iA7cSsK1QbZiVtRqDbI TtyKQk+ZqLNHJersFYWeMlFnryj0lIk6e0Whp0zU2SsK1QZRZ68o9H4obhQdiwMvmbi3cywlxGTe 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 ud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK5HelyO9Ll dqTL7UiX25EutyNdbke63I50uR3pcjvS5Xaky+1Il9uRLrcjXW5HutyOdLkd6XI70uV2pMvtSJc7 kC53IF3uQLrcgXS5A+lyB9LlDqTLHUiXO5AudyBd7kC63IF0uQPpcgfS5Q6kyx1IlzsQVzgQVzgQ VzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQ VzgQVzgQVzgQVzgQVzgQVzgYV2hqIrupieymJrKbmshuaiK7qYnspiaym5rIbmoiu6mJ7KYmspua yG5qIrupieymJrKbmshuaiK7qYnspiaym5rIYWoih6mJHKYmcpiayGFqIoepiRymJnKYmshhaiKH qYkcpiZymJrIYWoih6mJHKYmcpiayGEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQO k8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR1IlzuQ LncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC53IF3uQLrcgXS5A+lyB9LlDqTLHUiXO5AudyBd7kC6 3IF0uQPpcgfS5Q6kyx1IlzuQLncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC53IF3uQLrcgbjCgbjC gbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCDXGF G+IKN8QVbogr3BBXuCGucENc4ca4QlMTOUxN5DA1kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWR w9REDlMTOUxN5DA1kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN5DA1kcPURA5T EzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztM JneYTO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuZjK5m8nkbiaTu5lM7mYyuZvJ5G4mk7uZTO6G dLkb0uVuSJe7IV3uhnS5G9LlbkiXuyFd7oZ0uRvS5W5Il7shXe6GdLkb0uVuSJe7IV3uhnS5G9Ll bkiXuyFd7oZ0uRvS5W5Il7shXe6GdLkb0uVuSJe7IV3uhnS5G9LlbkiXuyFd7oZ0uRvS5W5Il7sh Xe6GuMINcYUb4go3xBVuiCvcEFe4Ia5wQ1zhhrjCDXGFG+IKN8QVbogr3BBXuCGucENc4Ya4wg1x hRviCjfEFW6IK9wQV7ghrnBDXOGGuMINcYUb4go3xBVupiZyMzWRm6mJ3ExN5GZqIjdTE7mZmsjN 1ERupiZyMzWRm6mJ3ExN5GZqIjdTE7mZmsjN1ERupiZyMzWRm6mJ3ExN5GZqIjdTE7mZmsjN1ERu piZyMzWRm6mJ3ExN5GZqIjdTE7mZmsjN1ERupiZyMzWRm6mJ3ExN5GYyuZvJ5G4mk7uZTO5mMrmb yeRuJpO7mUzuZjK5m8nkbiaTu5lM7mYyuZvJ5G4mk7uZTO5mMrmbyeRuJpO7mUzuZjK5m8nkbiaT u5lM7mYyuZvJ5G4mk7uZTO6GdLkb0uVuSJe7IV3uhnS5G9LlbkiXuyFd7oZ0uRvS5W5Il7shXe6G dLkb0uVuSJe7IV3uhnS5G9LlbkiXuyFd7oZ0uRvS5W5Il7shXe6GdLkb0uVuSJe7IV3uRLrciXS5 E+lyJ9LlTqTLnUiXO5EudyJd7kRc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc 4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4WRcoamJ3ExN5GZqIjdT E7mZmsjN1ERupiZyMzWRm6mJ3ExN5GZqIjdTE7mZmsjN1ERupiZyMzWRm6mJ3ExN5GZqIjdTE7mZ msjN1ERupiZyMzWRm6mJ3ExN5GZqIjdTEzlNTeQ0NZHT1EROUxM5TU3kNDWR09RETlMTOU0md5pM 7jSZ3GkyudNkcqfJ5E6TyZ0mkztNJneaTO40mdxpMrnTZHKnyeROk8mdJpM7TSZ3mkzuNJncaTK5 02Ryp8nkTpPJnSaTO00md5pM7jSZ3GkyuRPpcifS5U6ky51IlzuRLnciXe5EutyJdLkT6XIn0uVO pMudSJc7kS53Il3uRLrciXS5E+lyJ9LlTqTLnUiXO5EudyJd7kS63Il0uRPpcifS5U6ky51IlzuR LnciXe5EutyJdLkT6XIn0uVOpMudSJc7EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4 EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4EVc4GVdoaiKnqYmc piZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKamshpaiKnqYmcpiZymprIaWoip6mJnKYmcpqa yGlqIqepiZymJnKamshpaiKnqYmcpiZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKamshpMrnT ZHKnyeROk8mdJpM7TSZ3mkzuNJncaTK502Ryp8nkTpPJnSaTO00md5pM7jSZ3GkyudNkcqfJ5E6T yZ0mkztNJneaTO40mdxpMrnTZHKnyeROkcndLkSXu6LAbHVFgdnqigKz1RUFZqsrCsxWVxSYra4o MFtdUWC2uqLAbHW7EF3uikK1QXS5KwrVBtHKrij0vIgSdUWhu0GUqCsKdQpRoq4odOeJEnVFoU4h StTtQpSoKwrVBlGirihUG0RTuqLQUyZM3IpCT5kwcduFMHErCj1lwsStKPSUCRO3olBtECZuRaHa IEzcikK1QZi4FYVqgzBxKwrVBmHiVhSqDcLErShUG4SJW1GoNggTt6JQbRAmbkWxd2xv9XwsKcRk 3ur5WICIybzV87FcEZN5q+djcSMm81bPx1LISybq+Y6Fk5jM7ABRz3esvsRkZp2JcrJjCScmMx+A KCc71oFiMrM0RDnZsZgUk5lfQaKc7FiRisnMDhDlZMeyVkxmFq1IIB5rYzGZWbQigXgssMVkZtGK BOKxSheTmR0gEojHUl9MZnaASCAe8wIxmdkBIoF4DB3EZGYHiATiMbkQk5kdIBKIx/jDSyYSiMew RExmdoBIIM5OdmtXFJgkrSgwSVpRYJK0osCUcUWBKeOKAlPGFQWmjCsKTBlXFJgyzk52a1cUqg2y W7uiUG0QF+UVhWqD7AyvKFQbxEV5RaHaIC7KKwrVBtm7XlGoNsje9YpCtUH2rlcUqg2yd72iUG2Q vesVhWqD7F2vKFQbxEV5RaHaIDveKwrVBtnxXlGoNsiO94pCtUF2vFcUqg2y472iUG2QHe8VhWqD 7HivKFQbZMd7RaHaIDveKwrVBtnxXlHoKZNd6GMVIC4pvJXTsWYQk6krJ292cCw8xGTe7OBYpojJ vNnBsajxkon7rscSSExmdoC473qso8RkZgeIO8LHYkxMZnaA6KN6rOjEZGYHiBvfx7JQTGZ2gLjx fawtxWRmB4gb38cC9UayL697+Nfjvz7949PT+5X270/PP7z78P8+rn/98dPj86d1Zaspl3lprcz/ +vD0/vtf/1UdaXf6/68PH374Yf9EqV5GGXXbyrpyLQnffHjeP9vb9z8+vL9m//jww4fnrz/o/uO/ f/z0uP/Xn9Z//vqK6y/y18e/Pz28eff0+Pz0vbUe9+64uKF/rN7FZGZni/6wxwhATGZ2tkgHHHME MZn5t02kA45hhJjM7ACRDjgmGmIyswNEOuAYi4jJzA4Q6YBjtiImMztApAOOAY2YzOwAcUP/mPJ4 yYil7IpC4yliKbui0FCLWMrOTixlVxQaQhJL2RWFhpDEUnZFodoglrIrCtUGMTZdUegTEovSFYXq kJiNrihUG8Q2dEWh50WsPFcUuYcDwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0D wS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS0DwS2DwS2i8+HxYismM1eX ovPh8XbsJROdD493aTGZuboUnQ+PF3IxmdkBovPh8VbvJRPt7Y41gJjM7E3Rke5YSIjJzA4Qfd+O 1YiYzHyaorvasaQRk4mlMUxSZ5ikzjBJnWGSOsMkdYZJ6gyT1BkmqTNMUmeYpM4wSZ1hkjrDJHWG SeoMk9QZJqkzTFJnmKTOMEmdYZI6wyR1hknqDJPUGSapM0xSZ3ikTkuE/d6j7h+5rCjAfu9R949c 9qj7Ry571P0jlz3q/pHLHnX/yGWPun/kskfdP3LZo1BtALezFQXczvYoVBvA7WyPQrUBTgDdo1Bt gO3aPQrVBtiu3aNQbYDt2j0K1QbYrt2jUG2A7do9CtUG2K7do1BtgBNA9yhUG+AE0D0K1QY4AXSP QrUBTgDdo1BtgI3yPQrVBthe36NQbYATQPcoVBvgBNA9CtUG2Mrfo1BtgBNA9yhUGwAAaIkAAHsU ecoEANijyFMmAMAeRZ4yAQD2KPKUCQCwR6HaAADAHoW+ATwu9LrA8pJ5XOh1OSYm02YJ18WbmEyb JVyXemIybZZwXRiKycwO8FyjrqtLMZnZAZ5r1HWJKiYzO8CjN67rXDGZ2QEevXFdLHvJPHrjurS+ lez32rfnpx9/eff4/FXww5t3j29//vjwy8en7x++e/fhzU8PKbVWRsrrdTOgtbt+hP3Hvj/CPz5s /dJmr6cXfv6oz0/7r/bpw0PdS2h9jR4JPv+IGYyFQwXx5ptN7gEq18mEmMxscg9QuY43xGRmk3tH c15nJGIyswO8ozmvgxYxmdkBHrt0ndaIycwO8ECo68hHTGZ2gHc053VuJCYzO8A7mvM6fBKTmR3g 8V7XCZaYTCxakfe6jsHEZGLRirzXdZYmJhOLVuS9rgM5L5nHe13Hd1aygubfBc2/C5HN7VFgMlrQ 1LygqXlBU/OCpuYFzYkLmhMXIvnao8CEvhBB1R6F7gaQK+1R6PcCYqA9inTKAM46Kwo43e5RqFOA 0+0ehToFeNbuUeT7cADP2j0KPWXgPrtHoecF3Gf3KPS8gPvsHoWeMnCf3aPQUyYE4opCvUwIxBWF aoMQiCsK1QYhEFcUqg1CIK4oVBuEQFxRpDbMxWYxF5vlJaXSa+P2Pfhs3F5SvtRZV8dGxu3HR/j9 uD2leZmtb6dXfjUzL7XlmbfX5u2nsaSwzdV5MVfnxVydF3N1XszVeTEXh8VcHBZRv3N9lReTiV8Z ohbluh4Qk5n3TJRCHIsKMZn5ADxzz+vKRExmloZn7nld3ojJxHeD4flxXtdIXjLPQvO6ohKTmXXm WWhel2ViMrNoPQvN69pOTKYWrflNK6KSx7pRTGZ2gIhKHotPMZnZASIqeaxgxWRmB4ioZBlEHLei 0ACCyNxWFBpAEJnbikIDCCJzK4PI3FYUGk4RmduKQsMpInNbUag2iMxtRaHaIDK3FYVqg8jcVhSq DSJzW1GoNojMbUWh2iAytxWFaoPI3FYUqg0ic1tRqDaIzG1FodogMrcVhWoDbfMPtM0/0Db/QNv8 G9p639DW+0YEayuKPK+NCNZWFHleGxGsrSj0vBCIsBHB2opCtQEca/codOeBH+wehe488IPdo9Cd R4DFBvxgr+/z4uLAXOqJmqBjUSAmM5d6oiboWFl4yURN0LEOEZOZRSsKZo7FjJjM7ABRMHOsiMRk ZgeIgpljWSUmMztAFMwcazMxmdkBomDmWOCJycwOEAUzxyrRSyYKZo41pZjM7ABRMHMsTMVkZgeY DNMwGabhuS1f18Jass2kaDaTotlEjcuxzhaTiXW2iRqXY7EuJjPrzMSYNlPjsplM1OZ5Gl/HBmIy szRMwGrzzH6vIwkxmVkat81+93/8+fHHt28e3v/y83dPzw+Xf1z2bL+PbztqsV/496fnj2/3H/X6 pYGcLZ6zRXP2eM4ezTniOUc05xbPuUVzznjOGczZLuGcv14ayJniOVM0Z47nzNGcJZ6zRHPG+6hF +6jF+6hF+6jF+6hF+6jF+6hF+6jF+6hF+6jF+6hF+6jH+6hH+6jH+6hH+6jH+6hH+6jH+6hH+6jH +6hH+6jH+6hH+6jH+6hH+6jH+6hH+6jH+6hH+6jH+6hH+2jE+2hE+2jE+2hE+2jE+2hE+2jE+2hE +2jE+2hE+2jE+2hE+2jE+2hE+2jE+2hE+2jE+2hE+2jE+2hE+2iL99EW7aMt3kdbtI+2eB9t0T7a 4n20Rftoi/fRFu2jLd5HW7SPtngfbdE+2uJ9tEX7aIv30Rbtoy3eR1u0j2a8j2a0j2a8j2a0j2a8 j2a0j2a8j2a0j2a8j2a0j2a8j2a0j2a8j2a0j2a8j2a0j2a8j2a0j2a8j2awj7ZLuI8+XxrIGe6j z5cGcob76POlgZzhPvp8aSBnuI8+XxrIGe6jz5cGcob76POlgZzhPkJUYpuE+19RgDxbUeUvb39+ /NtnI4HHhx+en56+uKaMh7cf17/bbQY+T3l/9RZ4OIIf369/8e7ps0FBIOOmZ5x2xnrRMyY9Y9Yz Fj1j1TN2PaNe4VWv8KpXeNMrvOkV3vQKb3qFN73CW9Mz6j3T9J5pes80vWe63jNd75mu90zXe6br PdP1nul6z3S9Z7reM/3enmFvuBZ7cLz4isluggyv3rihl/TQS3roJT30kh56SQ/9z8Cm/xnY9D8D m/5nYNP/DGx6z2x6z2x6z2x6z2x6z2x6z0y9Z6beM1Pvman3zNR7Zuo9M/WemXrPTL1n5p/+6tQT EcGvKCCqXlFApLuigEi3Z+Jav6LAqHRFgVHpiiL3MJMR8Ioidz4TYXrPRJi+otCdJ8L0FQXk0SsK mBYc/WWtJo62E5N5kPvRpFqyLProHi0tJvPWhscXgJjM0z8cXxdiMrM0RGnM8Z0jJjNLQ5TGHF9c bAaxQuU3uZVRfpNbGeU3uZVRfpNbGeXVT89ZXv2sjPLqZ2WUVz8ro7z6WRnl1c/KqPdM1nsm6z2T 9Z7Jes8UvWeK3jNF75mi90zRe6boPVP0nrGxlZVR7xkbW+nZxlZWRr1nbGxlZdR7xsZWVka9Z2wQ ZmXUe8YGYVZGvWdsEGZl1HvGBmFWRr1nbBBmZby3Z+5ebg1kfDqQ8elAxqcDGZ8OZHw6kPHpQMan Axmfjo1MisdGJsUDmawOZLI6kMnqQCarA5msDoQzD2SyOpDJ6kAmqwOZrA5ksjqQyeqKQrVBzqNd Uag2iA3sQDawA9nADmQDO5AN7EA2sAPZwK4oVBvkTN8VhWqDnAS8olBtkJOAx0ZOAl5RqDbIScAr CtVGQbVBzg9eUag2yPnBKwrVRkG1QU4dXlGoNsipwysK1QY5dXhFodogpw6vKFQb5NThFYVqg5w6 vKJQbZBTh1cUqg1y6vCKYusUbyNumG6gw3QDHaYb6DDdQIfpBjpMN9BhuoEe60YxmbcVPUyf0mH6 lA7Tp3SYPqXD9Ckdpk/pMH1Kh+lTOkyf0mH6lA7Tp3SYPqXHyltMZnZAMjtAtGMdph3rMO1Yh2nH Okw71mHasY4X7FjZfEFMZnZANjtAPHD8mF2IycwOEA8cPwYgYjKzA8QDx48pipjM7ADx9PJjFCMm MzugmB0gHoV+jHnEZGYHiEehH7MiMZnZAeJR6MfASUxmdoB4FPoxtRKTmR0gHoV+jL7EZGYHiEeh r2RottrQbLWh2WpDs9WOZqsdzVbJ0egrCs1WyYHqKwrN3cmB6isK1QY5UH1FodogB6qvKFQbxFht RaHaIAeqryhUG+RA9RWFaoMcqL6iUG2QA9VXFKoNcqD6ikK1QQ5UX1GoNsiB6isK1QY5UH1Fodog B6qvKFQbiCvcEFe4Ia5wQ1zhhrjCDXGFG+IKN8QVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQV TsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsYVNnMC0cwJRDMnEM2cQHRzAtHNCUQ3JxDd nEB0cwLRzQlENzugmx3QzQ7oZgcMswNEP8VjvSsmMztgmB0wzA4YZgcMswOG2QHD7IDN7IDN7IDN 7IDN7IDN7IDN7IDN7IDN7IDN7IDN7IBpdsA0O8BkcjeTyd1MJnczmdzNZHI3k8ndTCZ3M5ncaTK5 02Ryp8nkTpPJnSaTO00md5pM7jSZ3GkyudNkcqfJ5E6TyZ0mkztNJneaTO40mdxpMrnTZHKnyeRO k8mdSJc7kS53Il3uRLrciXS5E+lyJ9LlTqTLnUiXO5EudyJd7kS63Il0uRPpcifS5U6ky51IlzuR LnciXe5EutyJdLkT6XIn0uVOpMudSJc7kS53Il3uRLrciXS5E+lyJ9LlTqTLnUiXO5EudyJd7kS6 3Im4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4QnRg60AHto6JuMKJ uMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMJpaiKnqYmcpiZymprIaWoip6mJnKYmcpqayGlq IqepiZymJnKamshpaiKnqYmcpiZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKamshpaiKnqYmc piZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKamshpMrnTZHKnyeROk8mdJpM7TSZ3mkzuNJnc aTK502Ryp8nkTpPJnSaTO00md5pMrnnG+TDPOB8vnHHOJktiMrMDTCZ3mkzuNJncaTK502Ryp8nk TpPJnSaTO5EudyJd7kS63Il0uRPpcifS5U6ky51IlzuRLnciXe5EutyJdLkT6XIn0uVOpMudRJe7 XYgud0WB2lhRoDZWFKiNFQVqY0WB2lhRoDZWFKiNFQVqY0Wh2iC63BWFaoMobFcUel5EK7ui0PMi qtftQqi9FYXuPKH2VhTqL8LfrSj0vAh/t6JQfxH+brsQ/m5FoadM+LsVhbqS8HcrCtUG4e9WFKoN wt+tKFQbhL9bUag2CH+3olBtEP5uRaHaIPzdimLv8+ZK3dQOTlM7OE3t4DS1g9PUDk5TOzhN7eA0 tYPT1A5OUzs4Te3gNLWD09QOTlM7OEXt4LEuFJN5HXCsIsVkXgcca04xmdcBxwpVTOZ1wLGeFZOZ HSBqB49FsZjMLFpRoXesrMVkZp2JorpjeS4mM0tDhDqPNb6YzKwzkcM8BgViMvP7TOQwj2mDmMws WpHDPEYWYjKzA0QO85h7iMnMDhA5zGN44iUTOcxj1CImMztA5DCPeY2YzOwAkcM8hj43ku3/+PPj j2/fPLz/5efvnp4fLv+47Nl+Hz/3Y0/2C//+9Pzx7f6jXr80kDPFc6ZozhzPmaM5Szxnieas8Zw1 mrPFc7Zozh7P2aM5RzzniObc4jm3aM4ZzzmDOVu8j1q0j1q8j1q0j1q8j1q0j1q8j1q0j1q8j1q0 j1q8j1q0j1q8j1q0j1q8j1q0j1q8j1q0j1q8j1q0j3q8j3q0j3q8j3q0j3q8j3q0j3q8j3q0j3q8 j3q0j3q8j3q0j3q8j3q0j3q8j3q0j3q8j3q0j3q8j3q0j0a8j0a0j0a8j0a0j0a8j0a0j0a8j0a0 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 mWY1zTSraaZZTTPNapppVtNMs5pmmtU006ymmWY1zTSraaZZTTPNalrAVNMCppoWMNW0gKmmBUw1 LWCqaQFTTQuYalrAVNMCppoWMNW0gKmmBUw1LWCqaQFTTQuYalrAVNMCppoWMNW0gKmmBUw1LWCq aQFTTQuYalrAVNMCppoWMNW0gKmmBUw1LWCqaQFTTQuYalrAVNMCppoWMNW0gKmmBUw1LWCqaQFT TQuYalrAVNMCppoWMNW0gKmmBcwx+hKTmR0gMrkVWfpWZOm7otBslehyK7L0rcjStyJL34osfSuy 9K3I0rciS9+KLH0rsvStyNK3Ikvfiix964XoclcUqg2iy11RqDaILndFodogutwVhWqD6HJXFKoN ostdUag2iC53RaHaILrcFYVqg+hyVxSqDaLLXVGkNhLiChPiChPiChPiChPiChPiChPiChPiChPi ChPiChPiChMiBBNi/RJi/RJi/RJi/RKi9hLi7xLi7xLi7xIi6RJj4kQ9XzW9KI+VhpjMXD2Ler5q elFW04uyml6U1fSirKYXZTW9KKvpRVlNL8pqelFW04uyml6Ux1pNTGZ2gKjnOxZ8YjKzA0Q937Fq FJOZHSDq+Y6lp5dM1PMdC1UxmdkBop7vWO2KycwOEPV8x5JZTGZ2gKnnSyZPmkyeNJk8aTJ50mTy pMnkSZPJkyaTJ00mT5pMnjSZPGkyEdBkUpvJpDaTSW0mk9pMJmiZTDYymWxkMtnIZOKMySQQE1Ih JqRCTEiFmJAKMSEVYkIqxIRUiAmpEBNSISakQkxIhZiQCjEhFWJCKsSEVIgJqRATUiEmpEJMSIWY kAoxIRViQirEhFSICakQE1IhJqRCTEiFmJAKMSEVYkIqxIRUiAmpEBNSISakQkxIhZiQCjEhiioh iiohiiohiiohiiohiiohiiohiiohHiohHiohHiohHiohHiohHiohHiohHiohHiohHiohsikhsikh sikhRikhRikhRikhRimZ+qpk6quSqa9Kpr4qmfqqZOqrkqmvSqa+Kpn6qmTqq5Kpr0qmviqZ+qpk 6quSqa9Kpr4qmfqqZOqrkqmvSqa+Kpn6qmTqq5Kpr0qmviqZ+qpk6quSqa9Kpr4qmfqqZOqrkqmv Sqa+Kpn6qmTqq5Kpr0qmviqZjGQyGclkMpLJZCSTyUgmk5FMJiOZTEYymVhjMrHGZGKNycQak4k1 JhNrTCbWmEysMZlYYzKxxmSSiMkkEZNJIiYTHkwmPJhMeDDdhgf3f/z58ce3bx7e//Lzd0/PD5d/ XPZsv49v+zkT+4V/f3r++Hb/Ua9fGsjZ4jlbNGeP5+zRnCOec0RzbvGcWzTnjOecwZyrCKM5f700 kDPFc6ZozhzPmaM5SzxnieaM99GM9tGM99GM9tGM99GM9tGM99GM9tGM99GM9tGM99GM9VHffVVj OX+7NJAz2ke/XRrIGe2j3y4N5Iz20W+XBnJG++i3SwM5o33026WBnNE++u3SQM5oH/12aSBntI9+ uzSQM9pHv136es4U76MU7aMU76MU7aMU76MU7aMU76MU7aMU76MU7aMU76MU7aMU76MU7aMU76MU 7aMU76MU7aMU76MU7aMc76Mc7aMc76Mc7aMc76Mc7aMc76Mc7aMc76Mc7aMc76Mc7aMc76Mc7aMc 76Mc7aMc76Mc7aMc76Mc7aMS76MS7aMS76MS7aMS76MS7aMS76MS7aMS76MS7aMS76MS7aMS76MS 7aMS76MS7aMS76MS7aMS76MS7aMa76Ma7aMa76Ma7aMa76Ma7aMa76Ma7aMa76Ma7aMa76Ma7aMa 76Ma7aMa76Ma7aMa76Ma7aMa76Ma7aMW76MW7aMW76MW7aMW76MW7aMW76MW7aMW76MW7aMW76MW 7aMW76MW7aMW76MW7aMW76MW7aMW76MW7aMe76Me7aMe76Me7aMe76Me7aMe76Me7aMe76Me7aMe 76Me7aMe76Me7aMe76Me7aMe76Me7aMe76Me7aMR76MR7aMR76MR7aMR76MR7aMR76MR7aMR76MR 7aMR76MR7aMR76MR7aMR76MR7aMR76MR7aMR76MR7aMt3kdbtI+2eB9t0T7a4n20Rftoi/fRFu2j MM/w26WBnPE+CvIM/RLmGX67NJAz3kdBnqFfwjzDb5cGcsb7KMgz9EuYZ/jt0kDOeB8FeYZ+CfMM v10ayBnvoyDP0C9hnuG3SwM5430U5Bn6Jcwz/HZpIGe8j4I8Q7+EeYbfLg3kjPdRlGdIcZ4hRXmG FOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKU Z0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4h RXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTn GVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdI cZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5 hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlS lGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGe IUV5hhTnGVKUZ0hxniFFeYYU5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGVKUZ0hxniFFeYYU 5xlSlGdIcZ4hRXmGFOcZUpRnSHGeIUV5hhTnGZCZ6HYh9urbhdirbxdir75diL36diH26tuF2Ktv F2Kvvl2Ivfp2Ifbq24XYq28XYq++XYi9+nYh9urbhdirbxdir75diL36diH26tuF2KtvF2Kvvl2I vfp2Ifbq24XYq28XYq++XYi9+nYh9urbhdirbxdir75diL36diH26tuF2KtvF2Kvvl2Ivfp2Ifbq 24XYq68oVBvEXn27EHv17ULs1bcLsVffLv8/5v6n2ZIj6c/EFpIW0xtpodlfcTakjC/nxP8ImXEx Y/MJxmY3w0Wh+gINNlDVVlVoNt+NvroiMnFRDVTeOnGeeiip2UbrF0j3e06me55wj+fnQcar90Wc EisUG2Qoe7+xdRQZyt5vZCh7v5Gh7P1GhrL3GxnK3m9kKHu/kaHsfXGSxArFBhnl3m9klHtfvCKx QrFBBsD3GxkA329kAHxfZCCxQrExUGwMWn9Zk9GOskx05g3NO4o40Zk3NO8o+URn3gS+o0D0nIlD 2o9yUnRmZoA4pP2oSUVnZgaIQ9qPwlZ0ZmaAOKT9qI5FZ2YGiEPajxJbdGZmgDik/ajTRWdmBohD 2o9i33MmDmk/WgOiMzMDxCHtR39BdGZmgDik/WhSiM7MDBCHtB+dDtGZmQHNzABx4vvRRRGdmRkg Tnw/WjGiMzMDxInvRz9HdGZmgDjx/WgKic7MDBDHxx+dJdGZmQHiLPqjPeU5E2fRH80s0ZmZAcPM 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 1dREVpPJrSaTW00mt5pMbjWZ3GoyudVkcqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHKryeRWk8mt JpNbTSa3mkxuNZnc+hUm982nN0/fv//w12nx9OH5h19+evPhC+Ontz+9+fHnj0+/fHz+89N3P71/ +9enmFuu+bZ+qt6+/7D+6o/vfnh69/yPT8/vPn1cHr/8COvPvjvMPz6FXlq9vOzlg354Xl/s0/un uVI9LF98pz0z1tU0s9vkjZvJGzeTN24mb9xM3rghzXFDmuOGNMcNaY4b0hw3pDluSHPckOa4Ic1x Q5rjhjTHDWmOG9IcN6Q5bkhz3JDmuCHNcUOa44Y0xw1pjhvSHDekOW5Ic9yQ5rghzXFDmuOGNMcN aY4b0hw3pDluSHPckOa4Ic1xQ5rjhjTHDWmOG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2Im G2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2ImG2Imm6n3 bKbes5l6z2bqPZup92ym3rOZes9m6j2bqfdspt6zmXrPZuo9m6n3bKbes5l6z2bqPZup92ym3rOZ es9m6j2bqfdspt6zmXrPZuo9m6n3bKbes5l6z2bqPZup92ym3rOZes9m6j2bqfdspt6zmXrPZuo9 m8kbN5M3biZv3EzeuJm8cTN542byxs3kjZvJGzeTN24mb9xM3riZvHEzeeNm8sbN5I2byRs3kzdu Jm/cTN64mbxxM3njZvLGzeSNm8kbN5M3biZv3EzeuCHNcUOa44Y0xw1pjhvSHDekOW5Ic9yQ5rgh zXFDmuOGNMcNaY4b0hw3pDluSHPckOa4Ic1xQ5rjhjTHDWmOG9IcN6Q5bkhz3JDmuCHNcUOa44Y0 xw1pjhvSHDekOW5Ic9yQ5rgjzXFHmuOONMcdaY474go74go74go74go74go74go74go74go74go7 4go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74wpN vWcz9Z7N1Hs2U+/ZTL1nM/WezdR7NlPv2Uy9ZzP1ns3UezZT79lMvWcz9Z7N1Hu2r+g97yq3pvGF cmuUmm75NuubLeHW+gT/LNwquVxe9IX+6vZ71VbYtWJ1vHjHzcw2dazN1LE2U8faTB1rM3WszdSx NlPH2kwdazN1rM3UsTZTx9rMs2WaqfVsptazm1rPbmo9u6n17KbWs5uscTdZ426yxt1kjbvJGneT Ne4ma9xN1ribrHE3WeNussbdZI27yRp3kzXuJmvcTda4m6xxN1njbrLG3WSNu8kad5M17iZr3E3W uJuscTdZ426yxt1kjTvSG3ekN+5Ib9yR3rgjvXFHeuOO9MYd6Y070ht3pDfuSG/ckd64I71xR3rj jvTGHemNO9Ibd6Q37khv3JHeuCO9cUd64470xh3pjTvSG3ekN+5Ib9yR3rgjvXFHeuOO9MYd6Y07 0ht3pDfuSG/ckd64I16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16y I16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16yI16ym1rPbmo9u6n17KbWs5taz25q Pbup9eym1rObWs9uaj27qfXsptazm1rPbmo9u6n17KbWs5taz25qPbup9eym1rObWs9uaj27qfXs ptazm1rPbmo9u6n17KbWs5taz25qPbup9eym1rObWs9uaj27qfXsptazm6xxN1njbrLG3WSNu8ka d5M17iZr3E3WuJuscTdZ426yxt1kjbvJGneTNe4ma9zNs2W6yeR2k8ntJpPbTSa3m0xuN5ncbjK5 3WRyu8nkdpPJ7SaT200mtyO9cUd64470xh3pjQfSGw+kNx5IbzyQ3nggvfFAeuOB9MYD6Y0H0hsP pDceSG88kN54IL3xQHrjgfTGA+mNB9IbD6Q3HkhvPJDeeCC98UB644H0xgPpjQfSGw+kNx5IbzyQ 3nggvfFAeuOB9MYD6Y0H4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH 4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4wpNTWQ3NZHd1ER2UxM5TE3k MDWRw9REDlMTOUxN5DA1kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN5DA1kcPU RA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN5DA1kcPURA5TEzlMJneYTO4wmdxhMrnD ZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6T yR0mkztMJneYTO4wmdxhMrkD6XIH0uUOpMsdSJc7kC53IF3uQLrcgXS5A+lyB9LlDqTLHUiXO5Au dyBd7kC63IF0uQPpcgfS5Q6kyx1IlzuQLncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC53IF3uQLrc gXS5A+lyB9LlDqTLHUiXOxBXOBBXOBBXOAhXmG6EK5xWIDamFYiNaQViY1qB2JhWIDamFYiNaQVi Y1qB2JhWKDYIVzitUGwQrnBaodggXOG0QrFBuMJphWKDcIXTCsUG4QqnFYoNwhVOK1anmB0IUxM5 TE3kMDWRw9REDlMTOUxN5DA1kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN5DA1 kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN5DA1kcPURA5TEzlMTeQwNZHDZHKH yeQOk8kdIpN79EVEZ14GHF0U0ZmXAUfPRXTmZcDRoRGdeRlw9HNEZ2YGiEzu0RQSnZkZIDK5R2dJ dGZmgMjkHu0p0ZmZASKTe/S4RGdmBohM7tEoE52h3irR5U4r1FslutxphXqrRJebbkSXO61Qb5Xo cqcV6rsTXe60QrFBdLnTCsUG0eVOKxQbRJc7rVBsEF3utEKxQXS50wrFBtHlTisUG0SXO61QbBBd 7rRCsUF0udMKxQbR5U4rFBtElzutUGwQXe60QrFBuMJphWKDcIXTCsUG4QqnFYoNwhVOKxQbhCuc Vig2CFc4rVBsEK5wWqHYIFzhtEKxQbjCaYVig3CF0wrFBuEKpxWKDcIVTisUG4QrnFYoNghXOK1Y nWJ2IERN5FGtic7MDoSoiTxKPs+ZqIk8CkTRmdmBEDWRR5UpOjMzQNREHqWq6MzMAFETedS7ojMz A0RN5FE0i87MDBA1kUflLTozM0DURB7lu+dM1EQexb7ozMwAURN5dAxEZ2YGiJrIo+0gOjMzQNRE Hr0L0ZmZASKTezRARGdmBohM7tFFEZ2ZGSAyuUcrxnMmMrlH40Z0ZmaAyOQe3R/RmZkBIpN7tJBE Z2YGiEzu0YcSnZkZIDK5RzNLdGZmgMjkHh0x0ZmZAUSXO61Qb5XocqcV6q0SXe60Qr1VosudVqi3 SnS50wr1Vokud1qR2AhIlxuQLjcgXW5AutyAdLkB6XID0uUGpMsNSJcbkC43IF1uQLrcgHS5Aely A9LlBqTLDUiXG5AuNyBdbkC63IB0uQHpcgPS5Qaiy51WKDYQVxgQVxgQVxgQVxgQVxgQVxgQVxgQ VxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgQVxgY VyhqIo+yzHMmaiKPIk50ZnYgRE3kUQmKzswOhKiJPMpJ0ZmZAaYmMpiayGBqIoOpiQymJjKYmshg aiKDqYkMpiYymJrIYGoig6mJDKYmMpiayGBqIoOpiQymJjKYmshgaiKDqYkMpiYymJrIYGoig6mJ DKYmMphMbjCZ3GAyucFkcoPJ5AaTyQ0mkxtMJjeYTG4wmdxgMrnBZHKDyeQGk8kNJpMbTCY3mExu MJncYDK5wWRyg8nkBpPJDSaTG0wmN5hMbjCZ3GAyucFkcgPS5Qakyw1IlxuQLjcgXW5AutyAdLkB 6XID0uUGpMsNSJcbkC43IF1uQLrcgHS5AelyA9LlBqTLDUiXG5AuNyBdbkC63IB0uQHpcgPS5Qak yw1IlxuQLjcgXW5AutyAdLkB6XID0uUGpMsNSJcbkC43IK4wIK4wIK4wIK4wIK4wIK4wIK4wIK4w IK4wIK4wIK4wIK4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4wIq4w Mq7Q1EQGUxMZTE1kMDWRwdREBlMTGUxNZDA1kcHURAZTExlMTWQwNZHB1EQGUxMZTE1kMDWRwdRE BlMTGUxNZDA1kcHURAZTExlMTWQwNZHB1EQGUxMZTE1kMDWRwdREBlMTGUxNZDA1kcHURAZTExlM TWQwNZHBZHKDyeQGk8kNJpMbTCY3mExuMJncYDK5wWRyg8nkBpPJDSaTG00mN5pMbjSZ3GgyudFk cqPJ5EaTyY0mkxtNJjeaTG40mdxoMrnRZHKjyeRGk8mNJpMbkS43Il1uRLrciHS5EelyI9LlRqTL jUiXG5EuNyJdbkS63Ih0uRHpciPS5Uaky41IlxuRLjciXW5EutyIdLkR6XIj0uVGpMuNSJcbkS43 Il1uRLrciHS5EelyI9LlRqTLjUiXG5EuNyJdbkS63Ih0uRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFx hRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFxhRFx 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 QkoyQkoyQkoyQkoyEtVmJKrNSFSbkag2I1QmI1QmI1FtRoBNRqLajLCcjLCcjES1mcE84uDvoywT nZlts9cHaLPaTnRmdiCG2YF4ff4wqxtFZ2IHIpvK4mwqi7OpLM6msnhVsKIzMQOyKVPOpkw5mzLl bMqUVy0tOjMzwNQ8Z1PznE3NczY1z9nUPGdT85xNzXM2Nc+rYyA6MzPAFFBnU0CdTQF1NgXU2RRQ Z5P7y6aAOpsC6mwSidkkErNJJGaTSMwmkZhNIjGbRGI2icRsEonZJBKzSSRmU0CdTQF1NgXU2RRQ Z5PizCbFmU0BdTaR0GwKqLPJl2aTL82mgDqbsGpGYriMxHAZDaXLaChdRmK4jMRwGYnhMhLDZSSG y0gMl5EYLiMxXEZiuIzEcBmJ4TISw2UkhstIDJeRrC0jWVtGsraMZG0ZydoykrVlJGvLHT1lJIbL SAyXkRguIzFcRmK4jMRwGYnhMqL2MqL2MqL2MqL2MqL2MqL2MqL2MqL2CqL2CqL2CqL2CqL2CqL2 CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqL2CqP2TCleNqV42RwPlc3x UNmU4mVTipdNKV42pXjZlOJlU4qXTSleNqV42ZTiZVOKl00pXjaleNmU4mVTipdN9Vw21XPZVM9l Uz2XTfVcNtVz2VTPreJYdGYGrSnFy6YUL5tSvGxK8bIpxcumFC+bKGg2UdBsoqDZREGziYJmEwXN JgqaTRS0mChoMVHQYqKgxURBi4mCFhMFLSYKWkwUtJgoaDFR0GKioMVEQYuJghYTBS0mClpMFLSY KGgxUdBioqDFQ0FrCGDrZlk93mZbVo+32ZbV4222ZfV4m21aga2bZfV4C3ZZPd6CXVaPt2CX1eMt 2GWFYgNs3SwrFBtg62ZZkdiIYOtmWZHYIGeELysSG+SM8GVFYiOCrZtlRWKDnCy+rFBsgK2bZYVi A2zdLCsUG2DrZlmh2ABbN8sKxQbYullWKDbAwIVlhWIDDFxYVig2wMCFZYViAwxcWFYoNsDAhWWF YgMMXFhWKDbAwIVlhWIDDFxYVig2wMCFZYViAwxcWFYoNsDAhWWFYgMMXFhWKDbAwIVlhWIDDFxY VqxO0UrZs8ASnWml7FmOic7MUtZr6J81nehMa+acFaDoTGvmnPWi6MzMAK+hfxadojMxA6LX0D8r V9GZmAHiqfFn+Ss6EzMgeg39s4YWnYkZIB5BfxbiojMzA7yG/lnNi87MDPAa+mdLQHRmZoDX0D/7 Cp4zb7bD2YUQnZkZ4M12OFsZojMzA7zZDmc/RHRmZoA32+FsqojOzAzwZjucnRnRmZkB3myHs70j OjMzwJvtcPaIPGfebIezoyQ6MzPAm+1wtqVEZ2YGeLMdzt6W6Ay1Q8GM0WkFZowuK9QOBTNGlxVq h4IZo8sKtUPBjIRlhVrlYEbCskKxAQ4nXlYoNsA8hmWFYgPMY1hWKDbAPIZlhWIDzGNYVig2wDyG ZYViA8xjWFYoNsA8hmWFYgMcTrysUGyAKQ7LCsUGmOKwrFBsgCkOywrFBpjisKxQbCAUMCIUMCIU MCIUMCIUMCIUMCIUMCIUMCIUMCIUMCIUMCIUMCIUMCIUMCEUMCEUMCEUMCEUMCEUMCEUMCEUMCEU MCEUMCEUMCEUMDEU0Jutd5ZlnjNvtt5ZxL3m7M2nN0/fv//w12nx9OH5h19+evPhC+Ontz+9+fHn j0+/fHz+89N3P71/+9enkG9j/nLVMP709v2H9Vd/fPfD07vnf3x6fvfp4/L45UdYf/bdYf7xKVxe 8vIhPzyvL/Xp/dPtNHpxu23FSlbxhpuNFW9k4Fn3is7Mxoo3VOMsnkVnZmJ7J2+fFbjozMwAb9zH WcaLzswM8MZ9nL0A0ZmZAd64j7OhIDozM8Ab93F2JURnZgZ44z7O1obozMwAb3bI2R/xnHmzQ85u iujMzABvdsjZkhGdmRlgosbRRI2jiRpHEzWOJmocTdQ4mqhxNFHjaKLG0USNo4kaRxM1jiZqHE3U OJmocTJR42SixslEjZOJGicTNU4mapxM1DiZqHEyUeNkosbJRI0T2q5LaLsuoe26hLbrEtquS2i7 LqHtuoS26xLarkto4y2hjbeENt4S2nhLaOMtoY23hDbeEtp4S2jjLaGNt4Q23hLaeEto4y2jLbSM ttAy2kLLaAstoy20jLbQMtpCy2gLLaMttIy20DLaQstoCy2jaRoZTdPIaJpGRtM0MpqmkdE0jYym aWQ0TSOjaRoZTdPIaJpGRtM0MpqmkdE0jYymaWQ0TSOjaRoZTdPIaJpGRtM0MpqmkdE0jYymaWQ0 TSOjaRoZTdPIaJpGRtM0ktnnT2afP5l9/mT2+ZPZ509mnz+Zff5k9vmT2edPZms+ma35ZLbmk9ma T2ZrPpmt+WS25pPZmk9maz6ZrflktuaT2ZpPZms+m930bHbTs9lNz2Y3PZvd9Gx207PZTc9mNz2b 3fRsdtOz2U3PZjc9m4M7sjm4I5uDO7I5uCObgzuyObgjm4M7sjm4I5uDO7I5uCObgzuyObgjm4M7 sjm4I5uDO7I5uCObgzuyObgjm4M7sjm4I5uDO7I5uCObgzuyObgjm4M7sjm4I5uDO7I5uCOjma8Z zXzNaOZrRjNfM5r5mtHM14xmvmY08zWjARgZDcDIaABGRgMwMhqAkdEAjIwGYGQ0ACOjARgZDcDI aABGRgMwMhqAkdEAjIwGYGQ0ACOjARgZDcDIaABGRgMwMhoUkdHIh4xGPmTEkGXEkGVEg2VEg2VE g2VEg2VEg2VEg2U0vCEjhiwjhiwjhiwjhiwjhiwjhiwjhiwjGiwjGiwjGiwjGiwzGgyNYSiIISuI ISuIISuMITPH92VzfF82x/dlc3xfNsf3ZXN8XzbH92VzfF82x0dkc3xENsdH5K+Mj0CVkejMzABz zkI25yxkc85CNucsZHPOQjbnLGRzzkI25yxkc85CNucsZHPOQjbnLGRzzkI25yxkc2ZANmX+2ZT5 ZxP/yyb+l01iL5vEXjaJvWwSe9kk9rJJ7GVTmZ9N/C+b+F828b9s4n/ZxP+yif9lE//LJrGXTWIv m8ReNom9rBJ7ppi+mPhfMfG/YuJ/RcT/EjrONKHjTBM6zjSh40wTOs40oeNMEzrONKHjTBM6zjSh 40wTOs40oeNMEzrONH3tJJh7Iy2X8cVIy5rSOiri1rcmWh6fYP3V3yZa3loat8vrXj7oa2Mt064V y9dvuE/p4j61lNJtjBJ371P6/X2aK4yYL6+7d5/irhV7Q33DfcoX96mHUUe8pe37lH9/n2YSpsvI yPfu05djUl+xYu9k8Sfo9aXOxk2vVze9hHVIUdi+6fV3N73dQr28Ct3yKyv207Rzl6bRP5m83Jvv Pzw/v9yberuVmJb0GtnlrafSrp7K6WH/ldF+91R6LfHyzdrQY7myYr/93xC8/eI2jdZGKSlu/wL1 392mHG798sXa0W26smKLnW+4TeNq9vQt9hr7A+E0fh9OrZfLn5KB7tOVFVve8fuUb5f3qcS+jh+r m/cp334fT7d8u/rG+Ubu06UVW9A++jbM4eKttk51b7EcRBszRBWDuAGcvnZ+26tfKV19pRRnHMe+ uEpkuNDKhw1rm78KgRpGZJhaZh91GrKPmtr4yg/u1w0zMxwRftQR2V2dbwoSOcvwj5HzyvvtqhD5 1UVo2++331ciLdd0tazIX5YUJYcS7xcjF5as/P6WYiRfFSMhpd5K3f/NzPkPS7Bwu1oZZ1SMXFr9 +PObv7188jdnqPzBqjz9+HF97/m9Xux//TJPh/Gbd/Mf/PT8ckc2PFbdY9M9dt3jsD2Wm+4x6B6j 7jHpHrPuUc+ZoudM0XOm6DlT9Jypes5UPWeqnjNVz5mq50zVc6bqOVP1nKl6zlQ9Z5qeM03Pmabn TNNzpuk50/ScaXrOND1nmp4zTc+ZrudM13Om6znT9Zzpes50PWe6njNdz5mu50zXc2boOTP0nBl6 zgw9Z4aeM+PRnFm9iJ/f/PDj26d3v/z83fOHp9s/bqv98ge35zbg358/fPxx9WbuX7rhs+37bLs+ +77Pvutz7Pscez7X4SabPl8u3fAZ9n2GXZ9x32fc9Zn2faZdn3nfZ971WfZ9ll2f23n0cumGz+08 erl0w+d2Hr1cuuFzO49eLr3vM+znUdjNo7CfR2E3j8J+HoXdPAr7eRR28yjs51HYzaOwn0dhN4/C fh6F3TwK+3kUdvMo7OdR2M2jsJ9HYTeP4n4exd08ivt5FHfzKO7nUdzNo7ifR3E3j+J+HsXdPIr7 eRR38yju51HczaO4n0dxN4/ifh7F3TyK+3kUd/Mo7edR2s2jtJ9HaTeP0n4epd08Svt5lHbzKO3n UdrNo7SfR2k3j9J+HqXdPEr7eZR28yjt51HazaO0n0dpN4/yfh7l3TzK+3mUd/Mo7+dR3s2jvJ9H eTeP8n4e5d08yvt5lHfzKO/nUd7No7yfR3k3j/J+HuXdPMr7eZR386js51HZzaOyn0dlN4/Kfh6V 3Twq+3lUdvOo7OdR2c2jsp9HZTePyn4eld08Kvt5VHbzqOznUdnNo7KfR2VsAGOp/ka5/hMwFuO4 3eZ/620PGJtejo/1m3zl8hIAi11b7XytKw4uplpKbzVucnDTy/2vRRi4a6udr3WlHIh5wf8l74rX ppfffa0LndG8BH2tS9nAxte6Iv1j7ukWewxt92uN+0+LUP7XVhtfq13mVsnz3/dSd79Wu59bDeXW pdXO17oSUMZS61hTycLu14r3v9Zd8eS21c7XusKMY731XlqLm5jx9PK7r3UBCs9L0Ne61DpufK3L N2Gdz2uuXHve/Vr334QNvQkvrXa+Vrn8WjnmENou6Dy93P9aBX2tK6udr3X5gm+hjdtYI7I2v9Yf tGGXl6CvBV/w/TIIe7iFPvN192v1+0HYURBeWm18rXGlvKoLti/ruKy9bzVud7/VIKKra6udb3X1 fm+ph9Fa310Rjvuv94Fe75dWO9/q6vXe5xojpnbbjcBx/+0+0Nv90mrnW12Kz2sJM7n69re6n1cD 5dWl1f1vlW+XisYwQuix7IZgvt1NrHkJ+FrXVjtf62o9OL/WKG3+aG2+L/Lt7npwXoK+FlsP5tu1 5qj0UXLtm+vBfLsbhPMS9LVoEF6tMML8ZW9pRuJmbuXb3RXGvAR9LbbCmFXi1dcqa6jH7Za3c6vf /1pkhXFttfO1LsXipc4KMtTbdhCOe+/3eQn6WqyEnIvZq681v1WMuYTdpxXuvzICemVcWu18rUtJ Z5vPquQFX2x+rXT/a5Ff42urna91+cqYq6bU5y/yZlGSQ7kbhAG9Mi6tdr7W1ViPuXKfTyv0+YLb /Frt/tciMz2urXa+1uUrY4RZ88e2O4cjh7tdp3kJ+lrwlREvF08jtVZ7KbuvjHi7+7QiWjxdWu18 rcs34ahxpLzmCW5+rftvwojehJdWO1/rqtgKo8/a+Bba7u9WvFttzUvQ12LVVo6XzbT5szXL/Z43 m2k53n/BR/SCf9Xq7g5M3qef8i79lPfpp7xLP+V9+inv0k95n37Ku/RT3qef8i79lPfpp7xLP+V9 +inv0k95n37Ku/RT3qef8i79lPfpp7xLP+V9+inv0k95n37Ku/RT3qef8i79lPfpp7xLP+V9+inv 0k95n37Ku/RT3qef8i79lPfpp7xLP+V9+inv0k95n37Ku/RT3qef8i79lPfpp7xLP+V9+inv0k95 n37Ku/RT3qef8i79lPfpp7xLP+V9+inv0k95n37Ku/RT3qef8i79lPfpp7xLP+V9+inv0k95n37K u/RT3qef1qV//AdPf3nz8el//d+OiVLHMKrvfpmr3788f3he0sp379e/+/Pz3398+/yl6bv3n54+ TIsfP/385m9Xn/bNxUfYz9B56f/85s//NCfrx1ecbfzV/Ryel977q5dZHq7+7H6a/3rp+Q9nffLz m6u/vPsuqPvvgnr5Lojf366u3X8d/Hrpv333/MObTz/+/fnfPX388V+fn/6l1wUZ1FFaHKXWEkp8 1fgPn+nt999fXLr/Nqm7b5O6/zaZl/7xHzyQUZsfZ/9FVC9fRP3qylfeRN//+p9XLTY+7ysvpF89 v27xB9fpbb+4dP/9US/fDvMTPF9c+8oL4vzIb6+8942ErbsLgvrKm+Ir92z3XdBeeRf8+tUu7vGv Fl//am13DdH2Xxrz0j/+A/z7NE1///v0+OTF9Xm+//Gn5y8Njn96+TX/cD/muy5ffM9XXloXgfnr pXeexeWb7Zjs86XDV15uLb167Z0/frmgeuWPv/Iqu/zjeeePX77wXvnjr7zyLv942fnjl2/EV/74 Ky/Fyz9ed/749Tvz+o+/8tK8/ONt549fvlpf+eOvvFov//jOS7VdvlRf+eOvvFcv//jOEqxdvnav /3h/5c179cf7zju3X75zX/njr7x2L/942Pnjly+4V/74Ky+4yz++84brD7zh+gNvuL7zhusPvOH6 A2+4vvOG6w+84foDb7i+84brD7zh+gNvuL7zhuuXb7iLMqvvrwn73Zqyk0Hu6wQ/YkWOflpn8hEr Mnt6nbJHrMjRT+sQPmJFjgVbx+oRKxQbA8XGILGxjr4jVuQpr/PniBV5yuVGnnK5kadcbuQplxt5 yuWGnnJATzmQN0AJKDYCio2AYiOg2AgoNgKKjYBiI6DYiCg2IoqNiGIjotiIKDYiio2IYiOi2Igo NiKKjYRiI6HYQAeKFnSgaEEHihZ0oGhBB4qaJzwn84TnZJ7wnMwTnpN5wvOxJBWdecdFJ/O46GQe F53M46KTeVx0Mo+LTuZx0ck84TmpJzyvhbfoTAzatUwXnYlBuxb1ojMzaIMZtEF8ba+CQXRmZkAw MyCYGRDMDAhmBgQzA4KZAdHMgGhmQDQzIJoZEM0MiGYGRDMDopkB0cyAaGZAMjMgmRmQzAz4yqH1 qFQUnZkZ8Prx5/fOQSjJPpejJPtcjpLsczlKts/lKNk+l6PkqHu0z+Uo2T6Xo+hncxb9bM6in81Z 9LM5i342Z9HP5iwPn835+Ktx/v/IivT3Wib9vZZJ77dl0vttmfR+WyFd3DU4i1iRLm4r6CkX9JQL esrokPdW0FMu6ClX0uFvFcVGRbFRUWxUFBsVxUZFsVFRbFQUGxXFRkOx0VBsNBQbDcVGQ7HRUGw0 FBsNxUZDsdFQbHQUGx3FRkex0VFsdBQbHcVGR7GBeLOGeLOGeLOGeLOGeLOGeLOGeLOGeLOGeLOG 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 rdMKxQYZ0DqtUGyQAa3TCsUGGdA6rVBsILg0Ibg0Ibg0Ibg0Ibg0Ibg0Ibg0Ibg0Ibg0Ibg0Ibg0 Ibg0Ibg0Ibg0oe2XhJDUhJDUhJDUhJDUhJDUjJDUjJDUjJDUjJDUjJDUjJDUjJDUzJBUcQTrUZaJ zswOhDiC9ajtRGdmB0IcwXoUiKIzswMhjmA9qkzRmZkB4gjWo1QVnZkZII5gPepd0ZmZAeI816No Fp2ZGSDOcz0qb9GZmQHicNijfPecicNhj2JfdGZmgDgc9ugYiM7MDBCHwx5tB9GZmQHicNijdyE6 MzPA5J6TyT0nk3tOJvecTO45mdxzMrnnZHLPyeSek8k9J5N7TuJw2KP7IzozM8BkcpPJ5CaTyU0m k5tNJjebTG42mdxsMrnZZHKzyeRmk8nNJpObkaQ7I0l3RpLujCTdGUm6M5J0ZyTpzkjSnZGkOyNJ d0aS7owk3RlJujOSdGck6c5I0p2RpDsjSXdGku6MJN0ZSbozknRnJOnOSNKdkaQ7I0l3RpLujCTd GUm6M5J0ZyTpzkjSnZGkOyNJd0aS7owk3RlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlx hRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhRlxhdnURGZT E5lNTWQ2NZHZ1ERmUxOZTU1kNjWR2dREZlMTmU1NZDY1kdnURGZTE5lNTWQ2NZHZ1ERmUxOZTU1k NjWR2dREZlMTmU1NZDY1kdnURGZTE5lNTWQ2NZHZ1ERmUxOZTU1kNjWR2dREZlMTmU1NZDY1kdlk crPJ5GaTyc0mk5tNJjebTG42mdxsMrnZZHKzyeRmk8nNJpObTSY3m0xuNpncbDK52WRys8nkZpPJ zSaTm00mN5tMbjaZ3GwyudlkcrPJ5GaTyc0mk5uRLjcjXW5GutyMdLkZ6XIz0uVmpMvNSJebkS43 I11uRrrcjHS5GelyM9LlZqTLzUiXm5EuNyNdbka63Ix0uRnpcjPS5Waky81Il5uRLjcjXW5GutyM dLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5BXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGF BXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFhRGCproxm+rG bKobs6luzKa6MZvqxmyqG7OpbsymujGb6sZsqhuzqW7Mproxm+rGbKobs6luzKa6MZvqxmyqG7Op bsymujGb6sZsqhuzqW7Mproxm+rGbKobs6luLKa6sZjqxmKqG4upbiymurGY6sZiqhuLqW4sJl1b TLq2mHRtMenaYtK1xaRri0nXFpOuLSZdW0y6tph0bTHp2mLStcWka4tJ1xaTri0mXVtMuraYdG0x 6dpi0rXFpGuLSdcWk64tJl1bTLq2mEBsQaLYgkSxBYliCxLFFiSKLUgUW5AotiBRbEGi2IJEsQWJ YgsSxRYkii1IFFuQKLYgUWxBotiCRLEFiWILEsUWJIotSBRbkCi2IFFsQaLYgkSxBYliCxLFFiSK LUgUW5AotiBRbEGi2IJEsQXJWwvC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC 8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrC8wrD80xpYTGlhcWUFhZT WlhMaWExpYXFlBYWU1pYTGlhMaWFxZQWFlNaWExpYTGlhcWUFhZTWlhMaWExpYXFlBYWU1pYTGlh MaWFxZQWFlNaWExpYTGlhcWUFhZTWlhMaWExpYXFlBYWU1pYTGlhMaWFxVQDFpNhLSbDWkyGtZgM azEZ1mIyrMVkWIvJsBaTYS0mw1pMhrWYDGsxGdZiMqzFZFiLybAWk2EtJsNaTIa1mAxrMRnWYjKs xWRYi8mwFpNhLSbDWkyGtYgMa0tEqTStQHutJaJUmlag9TqtQOt1WoHW67QCrddpBVqv0wq0XqcV aL1OKxQbBPZoiWAb0wo9LwJgtEQAjJYIgNESQSlaIihFSwSlaImgFC0RlKIlglK0RFCKlghK0RJB KVoiKEVLBKVoiaAULRGUoiWCUrREoIiWCBTREoEiWiJQREsEimiJQBEtESiiJQJFtESgiJYIFNES gSJaIlBESwSKaIlAES0RKKIlAkW0RKCIlggU0RKBIloieENLBG9oieANLRG8oSWCN7RE8IaWCN5w VAFiSWHWJ1+hy998evP0/fsPf50WTx+ef/jlpzcfvjB+evvTmx9//vj0y8fnPz9999P7t399Cul2 i/NXdBZ4b99/WH/1x3c/PL17/sen53efPi6PX36E9WffHeYfn8LlJS8f8sPz+lKf3j/9avTidtuK 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 X2N235alMdpZGi/Xl6/Qe8J76o9OHn77xo0F5mNc4Lfsii9i8P7HeYgqfDjOLnnDb73LGwtDzCti Cfk0vhpJcKslpbQ7kmB9gvVXv6Ign5cABfm1FYMzv+EWXY0WLGFWx7d025yatz7B3VtEJgteWzES 9Rtu0dWgndLXTnLMm+M61ie4e4vInJ1rK4bdajNk8lcOgkSQLn946WogTWnzwaW6/QpId+fR5ETm 0VxbMSL5G27R1TyaFd+tj7h52Nb6BHdvERlHc23F8OtvuEWXs21GTTNtwnYU3Z1tk9HhltdWjDUX s1Y83DJ/5XBLBKyLzsTjEvO3HJeYL49LrD20EFrZjtG7o84yOi3xdasdll8oJP7o5NFSKt/sUuoB 3YHx/e9U8ne/f9C//75Gwvj+31hKZ72UfkDPYXz/rxfS979/0r//vvbE+P5f39K5//2z/v33dTLG 9/96iX//+xf9++9reozv//VNovvfv+rff19/ZHz/O9tJd79/07//vlbK+P5f38a5//27/v33dV3G 9//GDZ+sb/g8oEETvv8fnTz6/Yu+/ntAL2d8/29c/xV9/feAts/4/t+4/iv6+u8BHaLx/b9x/Vf0 9d8Dmknj+3/j+q/o678H9J3G9//G9V/R13/XWtSrj76v6S67a6qyr+kuu+uUsq/pLru//WVf0112 f0/rvqa77v5G1X1Nd91979d9TXfdfZfWfU133X0/1X1Nd93N+bqv6a67eVT386ju5lHdz6O6m0d1 P4/qbh7V/Tyqu3nU9vOo7eZR28+jtptHbT+P2m4etf08art51PbzqO3mUdvPo7abR20/j9puHrX9 PGq7edT286jt5lHbz6O2m0d9P4/6bh71/Tzqu3nU9/Oo7+ZR38+jvptHfT+P+m4e9f086rt51Pfz qO/mUd/Po76bR30/j/puHvX9POq7eTT282js5tHYz6Prcd1XF+7n0fWAmKsL9/No7ObR2M+jsZtH Yz+Pxm4ejf08Grt5NPbzaOzm0djPo7GbR2M/j8ZmHpXbdh69XLrhczuPXi7d8LmdRy+XbvjczqOX Szd8bufRy6UbPrfz6OXSDZ/befRy6YbP7Twq10Lfqwu386hcy2yvLtzOo3Ktcr248LWp569fuuFz P4+u9Z1XF+7n0a68srw2f/z1Szd87ufRtbbw6sL9PLoW9l1duJ9H16q6qwv38+haInZ14X4eXeuz ri7cz6NrwVMItzdfXhs3DgUo1+qg+Of4pYyhRDJzZlntygDLK2KZdU7sl5/mlQxMX2piXq69cyte cViv7m360x//wX9TMWV5baz198d/nq8+4pnO//bd8w9vPv349+d/9/Txx399fvqXtk7W7KtEyLnU W0q3qxt2+S6IJX0piiuvDamuX6pc17V//Af/je8bEZCUePmKKSN/KZAu8ZW3zPlkxlUetZ1oJEPf Srx858wy67uLj0GGiUGrtPMuSq/8Tl/EUdpJ6HnR//zmz//0Ib+8gsxOKukyOcaf65diyJLKdRam UHoro7VY+qjzo7YvBxMUNJG7oIncBU3kLmgid0kohjLh00tGP1qZTBYrGYVTJrOrSkaxkVFsZBQb GcVGRrFRUGwUFBsFxUZBsVFQbBQUGwXFRkGxUVBsFBQbFcVGRbFRUWxUFBsVxUZFsVFRbFQUGxXF RkWx0VBsNBQbDcVGQ7HRUGw0FBsNxUZDsdFQbDQUGx3FRkexcb1P91pd/y3TBMrGzJAHuwJf+Tj/ 7fsFm+M7Qv1yfkfZmN/xYEvi4RlOl82KbxussBoZ97/WQ82O/YEu/99ohHzlkb/59OnDKXn8de5m qRf3Z36fn9/84z+G++MZUd/l7uPDPZn7H/ehvs3D8+EuOzqPBMd/+27PK8Hx/ftf3n1xs8pJry55 66f3T989P72ZX+LNT//y6cefZ3bN183GDaf9pa8E8bL81+cP738bMrtiJKRRQk4x1EMou65Zn3V9 1P9xXndc88c/8oV6dnm9zpMYwkWi1AcS5aGW2aOR97Vm2re+Le9PkOPNuEefcqy3vv18vxzi8frz DdPvl1+9P/B8H+osykuCvVMc5nU705kXYVdHurXWa/ynoxzmP94dy7A+0fo7r49pXlfcv6e0l/rI L2C++AVMt/0Hv9u6ve/okfbuNyZ12lgCbbWHH/g5eZn38S0/J7ghjUdATOOLERAh59hzSLOC30uI X3viX5kBMS8BMyCurX6VkhzKkffffXz/0/On56d3P/347q/zBjz/tO7qbzETLxy+/WV+p3effvqv xwv3kW7+nR8u3Oe/Hxl0L+AbIuNqElrIZdTQ4yi7kXF3FFpJZBTatRXb+fiGe3Q1Ci3k2m+3Fkfe vUd3Z6HNS9A9cmahla9MrNm4R1ez0ML8uZ1L2kU0bN6ju8PQ5iXoHjnD0Mq3DOIpl4N4Ql7ztHK6 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 oLJMdGZ2IL4y5R3VdqIzswPxlQHbqEAUnZkdiK/MNkZVpujMzICvjJVFparozMyAr0z0RPWu6MzM gK8MU0RFs+fsK+P5UIktOjMz4CuT0VCdLjozM+ArQ6lQsS86MzPgK/OAUMdAdGZmwFdGsaC2g+jM zICvTMFAvQvRmZkBJpObTSY3m0xuNpncbDK52WRys8nkZpPJzSaTm00mN5tMbjaZ3GwyudlkcrPJ 5GaTyc0mk5tNJjebTG42mdxsMrnZZHKLyeQWk8ktJpNbTCa3IF1uQbrcgnS5BelyC9LlFqTLLUiX W5AutyBdbkG63IJ0uQXpcgvS5Rakyy1Il1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1u QbrcgnS5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgviCgviCgsiBAsiBAsiBAsiBAsiBAsi BAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsiBAsi BIupbiymurGY6sZiqhuLqW4sprqxmOrGYqobi6luLKa6sZjqxmKqG4upbiymurGY6sZiqhuLqW4s prqxmOrGYqobi6luLKa6sZjqxmKqG4upbiymurGY6sZiqhuLqW4sprqxmOrGYqobi6luLKa6sZjq xmKqG4tJ1xaTri0mEFtMILaYQGwxgdhiArHFBGKLCcQWE4gtJhBbTCC2mEBsMYHYrx1xj9o7ojMz A0wg9mvHcKPWkejMzAATiP3aUcGoLSU6MzPABGK/dpzpg85aIMN5l9Xjrbxl9Xgrb1k93spbVo+3 eZfV423eaQU2AZfV423eZfV4m3dZPd7mXVYoNsAm4LJCTxls5y0r9JTBdt6yQk8ZjAlZVuh5ge28 ZYVyGWznLSv0lMF23rQC23nLCj1lsJ23rFAug+28ZYViA2znLSsUG2BjblqBjbllhZ4y2JhbVugp g425ZYWeMthiW1Yol8EQjmkFhnAsK/SUwRCOZYWeMhjCsazQUwZDOJYVig0whGNagXEaLZBxGssK PWUwTmNZoacMxmksK7Yy1+qts6QQnWn11lmAiM60jsNZrnjOvK2Ss7gRnWkdh7MUEp2ZGeBtlZz1 lOjMDFpvd+MsykRnZtB6s0POyk50ZsaZt7txloeiMzNovd2Ns8YUnZlB6+1unIWq6MzMAG9346x2 RWdmBngbEmfJLDozg9bbkDjrbtGZGbRf2ZC4cxT1YXx17He49TLrp7Z17vf5EdafffUo6uOSlw+5 fRT1a1asJyHecPMHxJsVcjY2RGdmLnqzQs7uiOjMzEVvVsjZYhGdmRngzQo5+zSiMzNovfEeZ7NH dGYGrTfe4+wYveJs/c+f3/zw49und7/8/N3zh6fbP27L2z/bp/WiWBf+/fnDxx/Xn7p/6YbPtO8z 7frM+z7zrs+y77Ps+qz7Puuuz7bvs+367Ps++67Pse9zbPrst22fv1664TPs+wy7PvfzqO/mUd/P o76bR30/j/puHvX9POq7edT386jv5lHfz6O+m0d9P4/6bh71/Tzqu3k09vNo7ObR2M+jsZtHYz+P xm4ejf08Grt5NPbzaOzm0djPo7GbR2M/j8ZuHo39PBq7eTT282js5tHYz6OxmUdrMNKmz5dLN3xu 59HLpRs+t/Po5dINn9t59HLphs/tPHq5dMPndh69XLrhczuPXi7d8LmdRy+XbvjczqOXSzd8bufR y6X3fYb9PAq7eRT28yjs5lHYz6Owm0dhP4/Cbh6F/TwKu3kU9vMo7OZR2M+jsJtHYT+Pwm4ehf08 Crt5FPbzKOzmUdzPo7ibR3E/j+JuHsX9PIq7eRT38yju5lHcz6O4m0dxP4/ibh7F/TyKu3kU9/Mo 7uZR3M+juJtHcT+P4m4epf08Srt5lPbzKO3mUdrPo7SbR2k/j9JuHqX9PEq7eZT28yjt5lHaz6O0 m0dpP4/Sbh6l/TxKu3mU9vMo7eZR3s+jvJtHeT+P8m4e5f08yrt5lPfzKO/mUd7Po7ybR3k/j/Ju HuX9PMq7eZT38yjv5lHez6O8m0d5P4/ybh6V/Twqu3lU9vOo7OZR2c+jsptHZT+Pym4elf08Krt5 VPbzqOzmUdnPo7KbR2U/j8puHpX9PCq7eVT286js5lHdz6O6m0d1P4/qbh7V/Tyqu3lU9/Oo7uZR 3c+juptHdT+P6m4e1f08qrt5VPfzqO7mUd3Po7qbR3U/j+puHrX9PGq7edT286jt5tE+z1B2eYay zzOUXZ6h7PMMZZdnKPs8Q9nlGco+z1B2eYayzzOUXZ6h7PMMZZdnKPs8Q9nlGco+z1B2eYayzzOU XZ6h7PMMZZdnKPs8Q9nlGco+z1B2eYayzzOUXZ6h7PMMZZdnKPs8Q9nlGco+z1B2eYayzzOUXZ6h 7PMMZZdnKPs8Q9nlGco+z1B2eYayzzOUXZ6h7PMMZZdnKPs8Q9nlGco+z1B2eYayzzOUXZ6h7PMM ZZdnKPs8Q9nlGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdn qPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8 Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93l Geo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+ z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3 eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6 zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPU XZ6h7vMMdZdnqPs8Q93lGeo+z1B3eYa6zzPUXZ6h7vMMdZdnqPs8QyVjWws5YXpZgRGWhZwwvazY 9wIjLAs5YXpZgRGWhZwwvazAoNJCTpieVmS4fCEnTC8rFBtkuHwhJ0wvKxQb4ITpZYVig4ykL+SE 6WlFRtIXcsL0skKxAc6lXlYoNshI+kJOmF5W6CmTkfSFnDC9rNBTJiPpCzkrelmhXCbD5Qs5K3pZ oadMRtIXclb0skJPmYykL+Ss6GWFYoOMpC/krOhlhWKDDLIvhQyyL4UMsi+FDLIvhQyyL4UMsi+F DLIvhQyyL4UMsi+FDLIvhQyyL4vlA1Zk/H0pZPx9KWT8fSlk/H0Rzy4+SyXRmTcurohnF5/1lujM GxdXxLOLz6JNdObNOCzi2cVn5Sc6MzNAHMhfxLOLz6pSdGZmgHd28Vmais7MDBCn+xfx7OKz7BWd mRngHYR81s6iMzNoxen+RTy7+KzLPWfidP8inl18FveiMzPOxIH8RTxu+GwciM7MoBWn+xfxuOGz KSE6M4NWnO5fxOOGz4aH6MzMAHGm/tE1EZ2ZGSDO1D9aL6IzMwPEmfpH/0Z0ZmaAOFP/aAKJzswM aGYGiAP6jwaT6MzMgNcH9O/QAG1fOd92lfNtXznfdpXzbV8533aV821fOd92lfNtXznfdpXzbV85 33aV821fOd92lfNtXznfdpXzbV8533aV821fOd92lfNtXznfdpXzbV85/9ul5z/8/v2Hn998mv/H 9UX3//C2vL7tyuvbvry+7crr2768vu3K69u+vL7tyuvbvrz+t0u//iA3NfhtX4PfdjX4bV+D33Y1 +G1fg992NfhtX4PfdjX4bV+D/9uldx7kbkZuC/XbrlC/7Qv1f7v0619mU83f9tX8bVfN3/bV/G1X zd/21fxtV83f9tX8v11656bvpu225L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277k v+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/ 7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/t Sv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K /tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+ 277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7b vuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+ 5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuS/7Ur+277k v+1K/tu+5L/tSv7bvuS/7Ur+277kv+1K/tu+5L/tSv7bvuT/t0s3fO7n0eYRBvPC/TzaPMJgXrif R5tHGMwL9/No8wiDeeF+Hu2CGHUfxKi7IEbdBzHqLohR90GMugti1H0Qo+6CGHUfxKi7IEbdBzHq LohR90GMugti1H0Qo+6CGHUfxKi7IEbdBzHqLohR90GMustY1H3Gou4yFnWfsai7jEXdZyzqLmNR 9xmLustY1H3Gou7iE3Ufn6i7+ETdxyfqLj5R9/GJuotP1H18ou7iE3Ufn6g7+ETdxSfqPj5Rd/GJ uo9P1B18ou7iE3Ufn6i7+ETdxyfqLj5R9/GJuotP1H18ou6SEXWfjHi59M6D3E3bfXyi7uITdR+f qLv4RN3HJ+ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4 RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvH J9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ou PtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH2 8Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2 i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0 fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi7eITbR+faLv4RNvHJ9ouPtH28Ym2i0+0fXyi 7eITbR+faLv4RNvHJxqZ7jsWkE+swPTRsaB6YoW+Fzm5YFRycsGo5OSCUcnJBaOSkwtGJScXjEpO LhiVnFwwKjm5YFRycsGo5OSCUcnJBaOSkwtGJScXjEpOLhiVnFwwKjm5YFRycsGo5OSCUcnJBaOS kwtGJScXjEpOLhiVnFwwKjm5YCxUmFih2CDnHYxKzjsYlZx3MCo572BUct7BqOS8g7HQWWKFYoOc kjAqOSVhVHJKwqjklIRR2TqKnJIwKjklYVRySsJAJ0CNSk5JGJWckjAqOSVhVHJKwqjklIRRySkJ o5JTEkYlpySMSk5JGJWckjAqOSVhVHJKwqjklIRRySkJo5JTEo5KypoFdxRYojNvst9RjnnOxLMU juJNdOZN9jtKPdGZN9vyKAxFZ2YGiGcpHNWl6MzMAPEshaNEFZ2ZGSCepXDUuaIzMwPEsxSOYll0 ZmaAeJbCUXGLzswMEM9SOMp20ZmZAdnMAPFghqMlIDozM0A8mOHoK4jOzAwQD2Y4mhOiMzMDxFMe jg6H6MzMAPGUh6NN4jkTT3k4miqiMzMDxFMejs6M6MzMAPGUh6O9IzozM0A85eHoEYnOzAwQT3k4 Gk2iMzMDxFMejm6V6MzMAPGUh1HJEZ+jkiM+RyVHfI5KjvgcS1VKrFBjs6PGZkeNzY4amx01vQeK jYGe8kBPeaCnPNBTHugpD/SUB3rKgzzlJegjVuQNsER5xIrExhLWESsSG0scR6xIbCyBG7FCsRFQ bAQUGwHFRkCxEVBsBBQbCM9rCM9rCM9rCM9rCM9rCM9rCM9rCM9rCM9rCM9rCLRrCLRrCLRrCJlr CH5rCH5rCH5rCH5rCH5rCH5rCH5rCH5rCH5rCH5rDH4TD5A7yhfRmVlcv36AHKuBRGdmcd3N4rqb xXVXi2uzvTTMDBhm0A4zaIcZtMMM2mEG7TCDdphBO8SgXcWl6Ex8ba9SVHQmZsAqXEVnYgasMld0 JmbAKopFZ2YGBDMDgpkBwcyAYGZAMDMgmBlgEqLNJESbSYg2kxBtJiHaTEK0mYRoMwnRZhKizSRE mwl1NhPqbCbU2UwOs5noZDPRyWaik81EJ5uJTjYTnWwmOtlMdLKZ6GQz0cnmoZM9EEHTsnq8T7is Hu8TLqvH+4TL6vE+4bJ6vE84rYCgaVk93idcVo/3CZfV433CZYViAwialhWKDSBoWlYoNhqKDcCE LCsUG4AJWVYoNgATsqxQbAAmZFmh2ABMyLJCsQGYkGWFYgOQJMsKxQYgSZYVig1AkiwrFBuAJFlW JDYISbKsSGwQkmRZkdggJMmyIrFBSJJlRWKDkCTLCsUGIEmWFYoNQJIsKxQbgCRZVig2AEmyrFBs AJJkWaHYACTJskKxAUiSZYViA5AkywrFBhj0tKxYnaJ1IM6yTHSmdSDOIk50pnUgzpLPc+bJFs4C UXSmdSDOclJ0ZmaAJ1s4a1LRmZkBnmzhLGw9Zx5bdJbBojMzAzy26KylRWdmBnhs0VmQi87MDPDY orOqF52ZGeCBSmdrQHRmZoAHKp39BdGZmQEeqHQ2KTRnIqh0tjREZ2IGiKDS2RcRnYkZIIJKZ3NF dCZmgAgqnR0a0ZmZAR6odLZ5RGdmBnig0tkrEp2ZGeCBSmfDyXPmgUpne0p0ZmaAByqdPS7RmZkB 3ii7s1EmOkO9VaDfmlZgUPqyQr1VMCh9WaHeKtCKLSvUWwVasWWF+u5AK7asUGwArdiyQrEBtGLL CsUGGJS+rFBsgEHpywrFBhiUPq3AyPNlhZ4XGF6+rNDzAsPLlxV6XmAM+bJCWQnGkC8rlJVgDPmy Qk8ZUXsNUXsNUXsNUXsN8XcNkXQNkXQNMXEN0W0N0W0N0W0N0W0N0W0N0W0N0W0N0W0N0W0N0W0N 0W0NcWoNEWcNEWeiHuFcsHvOvCHT5/JedGbWpp5S4qwRRGdmbeopJc5CQ3RmZoCnlDirFdGZmQGe UuIseURnZgZ4Q6bPukl0ZmaAN2T6LL5EZ2aceaOczwpOdGbGmTfK+SwDRWfmy9GbvnzWkqIzM2i9 6ctnQSo6M4PWxBibiTE2kzxsJizYTFiwmXxfM5G8ZiJ5zUTymonkNRPJayaS10wkr5lIXjORvGYi ec1E8ppJ0TUTfGuvg29Pv/7nX57e/PDu/dN/fHpQNtLnBy23BK0ea/G8WD3W4nmxeqz992L1WGPo xeqx9t+vVg+KTV6sHmsnvVg91v57sXqs/fdihWLjQbHJixWKjQfFJi9WKDYe3Cz/1erBzfIXKxQb D26Wv1ih2Hhws/zFCsXGg5vlL1YoNh7cLH+xQrHx4Gb5ixWKjQc3y1+sUGw8uFn+YoVi48HN8hcr FBsPbpa/WKHYeHCL/cUKxcaDG/MvVig2HtyYf7FCsfHgxvyLFYqNB7fzX6xQbDy4nf9ihWLjwe38 FysUGw9u579Yodh4cDv/xYqtRZUq6vPSW3SmVFGfF+qiM6Uk+7ys95w5SO/nIkB0pvQRPpcMojMz Axyk93PdITozM8ABBz4XL54zBxz4XOqIzswMcMCBz/WS6MzMAAcc+Fx0ic7MDHDAgc+Vm+jMzAAH HPhc/onOzAxwwIHPNaTozMwABxz4XIh6zhwK4XPZKjozM8BBGj7XvqIzMwMcpOFzAS06MzPA4SM+ V+GiMzMDHD7icykvOjMzwOEjPvcDRGdmBjw4wvfFCnWWHhzh+2KFOksPCg9erFBn6UG5wosV6iw9 KHJ4sUKdpQdFDi9WKDYeFDm8WKHYeFDk8GKFYuNBkcOLFYqNB0UOL1YoNh6URrxYodh4UFDxYoVi 48ERvi9WKDYeHOH7YoVi48ERvi9WKDYeHOH7YkViIz84wvfFisRGfnCE74sViY384AjfFysSG/nB Eb4vViQ28oMjfF+sUGw8OML3xQrFxoMjfF+sUGwgqiojqiojqiojqiojqiojqiojqiojqiojqioj qiojqiojqiojqiojqiojqiojqiojqiozqsoZs/u5LPOcOWN2PxdxojOzA+GM2f1cCYrOzA6Ew/R/ LidFZ2YGOEz/55pUdGZmgMP0fy5sRWdmBjhM/+fqWHRmZoAjEPhcYnvOHLXB54JcdGZmgDNm93NV LzozM8AZs/u5NSA6MzPAGbP7ub8gOhMzIDtjdj83KURnYgZkZ8zu506H6EzMgOyM2f3cLvGcOWN2 PzdXRGdmBjhjdj93aERnZgaYTG42mdxsMrnZZHKzyeRmk8nNJpObTSY3m0xuNpncbDK52WRys8nk ZpPJzSaTm00mNyNVYkaqxIxUiRmpEjNSJWakSsxIlZiRKjEjVWJGqsSMVIkZqRIzUiVmpErMSJWY kSoxI1ViRqrEjFSJGakSM1IlZqRKzEiVmJEqMSNVYkaqxIxUiRmpEjNSJWakSsxIlZiRKjEjVWJG qsSMVIkZqRIz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz 4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4goz4gqzqYnMpiYym5rIbGois6mJzKYmMpua yGxqIrOpicymJjKbmshsaiKzqYnMpiYym5rIbGois6mJzKYmMpuayGxqIrOpicymJjKbmshsaiKz qYnMpiYym5rIbGois6mJzF/RRL759Obp+/cf/jotnj48//DLT28+fGH89PanNz/+/PHpl4/Pf376 7qf3b//6tMaGtjbqfIe/ff9h/dUf3/3w9O75H5+e3336uDx++RHWn313mH98iuvI+cvLXj7oh+f1 xT69f7qdhi+uw64Va4aIN91MblPumU25Zzblnvkrcs+NQG0XgRpzzOk24vwV3gzU9vtAvcVWLi/7 IuRKiL8P1bRnxzpw5pvrKyz1xm0fV7e9jBhu8RbC7m0fv7vtY/TQLi9D74crK9Z88266iYlnExPP JiaeTUw8m5h4NjHxbGLi2cTEs4mJZxMTzyYmnk1MPH8FE7//Quzp6oUYQhqtjnjbfCHOj/DPL8QQ b7c8Lq8jb8RLK9aaFe+6md0mAp9NBD6bCHw2EfhsIvDZROCzicBnE4HPJgKfTQQ+Ixl8RjL4jGTw GcngC5LBFySDL0gGX5AMviAZfEEy+IJk8AXJ4AuSwRckgy9IBl+QDL4gGXxBMviCZPAFyeALksEX JIMvSAZfkAy+IBl8QTL4gmTwBcngC5LBFySDL0gGX5AMviAZfEEy+IJk8AXJ4AvCeAvCeAvCeAvC eAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvCeAvC eAvCeAvCeAvCeAvCeAvDeE0JcjYlyNmUIGdTglxMCXIxJcjFlCAXU4JcTAlyMSXIxZQgF1OCXEwJ cjElyMWUIBdTglxMCXIxJcjFlCAXU4JcTAlyMSXIxZQgF1OCXEwJcjElyMWUIBdTglxMCXIxJcjF lCAXU4JcviJBvrvJN40vNvl6H2HUhdxu7fGtT/A71qSFeHkV2OG7tmL9FO+Wm9rqYmqri8n2F5Pt LybbX0y2v5hsfzHZ/mKy/cVk+4vJ9heT7S8m219Mtr+YbH8x2f5isv3FZPuLyfYXk+0vJttfTLa/ mGx/Mdn+YrL9xWT7i8n2F5PtLybbX0y2vyB9f0H6/oL0/QXp+wvS9xek7y9I31+Qvr8gfX9B+v6C 9P0F6fsL0vcXpO8vSN9fkL6/IH1/Qfr+gvT9Ben7C9L3F6TvL0jfX5C+vyB9f0H6/oL0/QXp+wvS 9xek7y9I31+Qvr8gfX9B+v6C9P0F6fsLAiYLAiYLAiYLAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYr AiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAiYrAyZNbXUxz5st pgC5mALkYgqQiylALqYAuZjnzRZTo1vM846KKWQtXxGy3t9Ha1fTBWJJKfXe5w3c20hrv58uUMfF bIF5EdlHu7RixbZ4y83UNhW6xVToFlOhW0yFbjEVusVU6BZToVtMhW4xFbrFPMipmCrWYqpYi6li LaaKtZgq1mKqWIupYi2mirWYKtZiqliLqWItpoq1mBR1MSnqYlLUxaSoq0lRV5OiriZFXU2KupoU dTUp6mpS1NWkqKtJUVeToq4mRV1NirqaFHU1KepqUtTVpKirSVFXk6KuJkVdv0JR3y2kp/FlIZ1D mx+ybRbS6yP8cyE9F2aXF4FC+tqKdSW9W27i4dXEw6uJh1ckEa9IIl6RRLwiiXhFEvGKJOIVScQr kohXJBGvSCJekUS8Iol4RRLxiiTiFUnEK5KIVyQRr0giXpFEvCKJeEUS8Yok4hVJxCuSiFckEa9I Il6RRLwiiXhFEvGKJOIVScQrkohXJBGvSCJekUS8Iol4RSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRo RSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRoRSRo RSRoNeW51ZTnVlOeW015bjVPCK6mirWaKtZqqlirqWKtpoq1mirWaqpYq6liraaKtZoq1mqqWKup Yq2mirWaKtZqqlirqWKtpoq1mirWaqpYq6liraaKtZoq1mqqWOtXVKz3dxFKvDrsJ8d6632+QzZ3 EUr83S5CmhXr5VVkG+HSijU9xHtu5rapz62mPrea+txq6nOrqc+tJh9eTT68mnx4NfnwavLh1eTD q8mHV5MPryYfXk0+vJp8eDUPOqomRl1NjLqaGHU1MepqYtTVxKiriVFXE6OuJkZdTYy6mhh1NTHq amLU1cSoq4lRVxOjrkgjXpFGvCKNeEUa8Yo04hVpxCvSiFekEa9II16RRrwijXhFGvGGNOINacQb 0og3pBFvSCPekEa8IY14QxrxhjTiDWnEG9KIN6QRb0gj3pBGvCGNeEMa8YY04g1pxBvSiDekEW9I I96QRrwhjXhDGvGGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmG iMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMmGiMnGiElTxlpNGWs1ZazVlLFWU8ZaTRlr NWWs1ZSxVlPGWk0ZazVlrNWUsTZTxtpMGWszZazNlLE2U8baTBlrM2WszZSxNlPG2kwZazNlrM2U sTZTxtpMGWszZazNlLE2U8baTBlrM2WszTwMqJlqz2aqPZup9mym2rOZtHEzaeNm0sbNpI2bSRs3 kzZuJm3cTNq4mbRxM2njZtLGzaSNm0kbN5M2biZt3EzauJm0cTNp42bSxs2kjZtJGzeTNm4mbdxM 2riZtHEzaeNm0sbNpI0bUhw3pDhuSHHckOK4IcVxQ4rjhhTHDSmOG1IcN6Q4bkhx3JDiuCHFcUOK 44YUxw0pjhtSHDekOG5IcdyQ4rghxXFDiuOGFMcNKY4bUhw3pDhuSHHckOK4IcVxQ4rjhhTHDSmO G1IcN6Q4bkhx3JDiuCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCOusCOusCOu sCOusCOusCOusCOusCOusCOusCOusCOusCOusCOusCOusCOusDOu0DyztJmayGZqIpupiWymJrKZ mshmaiKbqYlspiaymZrIZmoim6mJbKYmspmayGZqIpupiWymJrKZmshmaiKbqYlspiaymZrIZmoi m6mJbKYmspmayGZqIpupiWymJrKZmshmaiKbqYlspiaymZrIZmoim6mJbCaT20wmt5lMbjOZ3GYy uc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK53WRyu8nk dpPJ7SaT200mt5tMbjeZ3I50uR3pcjvS5Xaky+1Il9uRLrcjXW5HutyOdLkd6XI70uV2pMvtSJfb kS63I11uR7rcjnS5HelyO9LldqTL7UiX25EutyNdbke63I50uR3pcjvS5Xaky+1Il9uRLrcjXW5H utyOdLkd6XI70uV2pMvtiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvs iCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvspiaym5rIbmoiu6mJ7KYm spuayG5qIrupieymJrKbmshuaiK7qYnspiaym5rIbmoiu6mJ7KYmspuayG5qIrupieymJrKbmshu aiK7qYnspiaym5rIbmoiu6mJ7KYmspuayG5qIrupieymJrKbmshuaiK7qYnsJpPbTSa3m0xuN5nc bjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7 yeR2k8ntJpPbTSa3m0xuN5ncjnS5HelyO9LldqTL7UiX25EutyNdbke63I50uR3pcjvS5Xaky+1I l9uRLrcjXW5HutyOdLkd6XI70uV2pMsdSJc7kC53IF3uQLrcgXS5A+lyB9LlDqTLHUiXO5AudyBd 7kC63IF0uQPpcgfS5Q6kyx2IKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyI KxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyMKzQ1kd3URHZTE9lNTWQ3 NZHd1ER2UxPZTU1kNzWR3dREdlMT2U1NZDc1kd3URHZTE9lNTWQ3NZHd1ER2UxPZTU3kMDWRw9RE DlMTOUxN5DA1kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN5DCZ3GEyucNkcofJ 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 RbH1UZOKzsQMqKLY+ihsRWdiBlRRbH1Ux6IzMwNEsfVRYovOzAwQxdZHnY6Boml8BRTFcKu153kD t4Ci9RH+GShqIV9eBGiiayvWlxBvuZnaoor8aG6IzszUFiXpR4dEdGamtihJP9osojMzA0xcuZq4 cjVx5WriytXElauJK1cTV64mrlxNXLmauHI1ceVq4srVxJWrKEk/2lqiMzMDTKS3mkjvapmJzswM MGHjasLG1YSNqwkbVxM2riZsXE3YuJqwcUWS5YokyxVJliuSwFYkMK1IeliRiLAiOWBFcsCKhH0V CfsqEvZVBO1UBO1UBO1UBO1UBO1UBO00BO00BO00BO00BO00BO00BO00BO00hN80hN80hN80hN80 hN80hN80hN80hN80hN80hN80hN80ht+Y0qFqSoeqKR2qpqSjmlqHamLj1SS9qwlnVxPOriZPXU2e upo8dTU3uqu50V3Nje5qbnRXc6O7mhvdzdzobuZGdzM3upu50d3Mje5mbnQ3c6O7mXvTzdybbube dDP3ppu5N93Mvelm7k03c2+6iYPAj7Wt6MzMAHELN6NJWxlN2spo+lVG068ymn6V0fSrjKZfZTT9 KqPpVxlNv8po+lVG068ymn6V0fSrjLR3GWnvMtLeZaS9y0h7l5H2LiPtXUbau4y0dxlp7zLS3mWk vctIe5eR9i4j7V1G2ruMtHcZqegyUtFlpIfLSA+XkbItI2VbRsq2jJRtGSnbMtKNZaQby0g3lpFu LCPdWEa6sYx0YxnpxjLSjWWkAMtIAZaRAiwjBVhGCrCMFGDZnHiSzYkn2Zwrks25ItmcK5LNuSLZ nCuSzbki2Zwrks25ItmcK5LNuSLZnCuSzbki2dS1ZVPXlk1dWzZ1bdnUtWVT15a/pmu7p7ZYxldq i9bCbfS2Ob71+Aj/rLZYnH7+UnCxrntccPGKFSsstbtuavayqdnLpmYvm5q9bGr2sqnZy6ZmL5ua vWxq9rIps8umzC6byrhsKuPy18RsqGIXnamhYb4cRc1XNsVQ2RRDZVMMlU0xVDbFUNkUQ2VTDJVN MVQ2xVDZ1C9lU7+UTf1SNvVL2dQvZVO/VFFDsqKGZEUNyYoakhU1JCtqSFbUWqyotVjRSKqKGpIV NSQrakhW1JCsqCFZUUOyopFUFQ2Xqmi4VEXDpSoaLlXRcKmKhktVNFyqouFSFQ2Xqmi4VEXDpSoa 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 mUBsMoHYZAKxyQRikwnEJiSKTUgUm5AoNiFRbEKi2IREsQmJYhMSxSYkik1IFJuQKDYhUWxCotiE RLEJiWITEsUmJIpNSBSbkLw1IXlrQvLWhOStCUlOE5KcJiQ5TUhympDkNCHJaUKS04TEowmJRxMS jyYEvyUEvyUEvyUEvyUEvyUEpCWERSWERSWERSWERSWERSWERSWERSWERSWERSWERSWERSWERSWE RSVT0pVMSVcyJV3JlHQlU9KVTElXMiVdyZR0JVPSlUxJVzIlXcmUdCVT0pVMSVcyJV3JlHQlU9KV TElXMlVYyVRhJVOFlUwVVjK1TsnUOiVT65RMrVMytU7J1DolU+uUTHlSMuVJyZQnJROqSyZUl0yo LplQXTKhumSia8nkk5LJJyWTT0omn5RMPimZfFIy+aRk8knJ5JOSySclk09KJp+URD6pBTLddlqB En5agfbOtALtnWkF2jvTCrR3WiDs+rQC7Z1pBdo70wq0d6YVig2ykTetUGyQjbxphWKDbOS1QDby WiAbeS2QjbwWyEZeC2QjrwWykdcC2chrgWzktUA28logG3ktkOm2LZDtvxbI9l8LZPuvBbL91wKZ btsCmW7bAtlqbIFsNbZAthpbIFuNLZCtxhbIVmMLZKuxBTLdtgWyQdkC2aBsgWxQtkA2KFsgG5Qt kA3KFsgGZQtkg7IFMp2jBTKdowWyGdoCmc7RApnO0QKZztECmc7RApnO0QKZztECmc7RAtmGboFs Q7dAtqFbINvQLZBt6KP+Eos5tTL0eiNHESc683ojR8nnORMB0KNAFJ15vZGjnBSdmRkgbp8fNano zMwAcfv8KGw9Z+L2+VEGi87MDBC3z49aWnRmZoC4fX4U5KIzMwPE7fOjqhedmRkg7sUfrQHRmZkB 4kTUo78gOjMzQKQEjiaF50ykBI6WhujMzACREjj6IqIzMwNE5OBorojOzAwQkYOjQyM6MzNARA6O No/ozMwAEYY4ekWiMzMDxDk+R8PJcybO8TnaU6IzMwNETubocYnOzAwQOZmjUSY6Q71VIuNogcg4 phXqrRIZx7RCvVUi45hWqLdKpttOK9RbJdNtpxWKDTLddlqh2CDTbacVig0y3bYFMt22BTLddlqh 2CDTbVsg021bINNtWyDTbVsg021bINNtWyDTbVsg021bINNtWyDTbVsg021bINNtWyTTbVsk021b JNNtWyTTbVtEXGFEXGFEXGFEXGFEXGFEXGFEXGFEXGFEXGFEXGFEXGFEhGBEhGBEhGBEhGBEhGBE hGBEhGBEhGBEhGBEhGBEhGBEhGBEhGBEhGBEhGBkhKCoODgKLM+ZqDg4yjHRmdlLEBUHR00nOjN7 CeJE1KMwFJ2ZGSBORD2qS9GZmQHiRNSjRBWdmRkgTkQ96lzRmZkB4kTUo1j2nIkTUY/SWnRmZoA4 EfWoz0VnZgaIE1GPIl90ZmaAOBH16BSIzsQMiOJE1KPdIDoTMyCadG006dpo0rXRpGujSddGk66N Jl0bTbo2mnRtNOnaaAKx0QRiownERhOIjSYQG00gNppAbDSB2GgCsdEEYqMJxEYTiI0mEBtNIDaa QGwUgdiBxG0DidsGErcNJG4bSNw2kLhtIHHbQOK2gcRtA4nbBhK3DSRuG0jcNpC4bSBx20DitoHg nIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnIHgnBEI nDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQ nDMQnDMQnDMQnDMQnDMQnDMQnDMQnDMQnDOtWJ3idSCGKUYZphhlmGKUYYpRhilGGaYYZZhilGGK UYYpRhmmGGWYYpRhilGGKUYZphhlmGKUYSJUw0SoholQDROhGiZCNUyEapgI1TARqmEiVMNEqIaJ UA0ToRomQjVMhGqYCNUwEaphIlTDRKiGiVAdTQrRmZkBIkI1TIRqmAjVMBGqYSJUw0SoholQDROh GiZCNUyEapgI1TARqmEiVMNEqIaJUA0ToRomQjVMhGqYCNUwEaphIlTDRKiGiVANE6EaJkI1TITq aJSJzlBvlUjiBpLEDSSJG0gSN5AkbiBJ3ECSuIEkcQNJ4gaSxA0kiRtIEjeQJG4gSdxAkrhphWKD DM2fVig2yND8aYVigwzNn1YoNsjQ/BHJ0PxphWKDDM2fVig2yND8aYVigwzNn1YoNsjQ/GmFYoMM zZ9WKDYQVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgR VxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRVxgRV2jqYYaphxmmHmaYephh6mGGqYcZph5mmHqY YephhqmHGaYeZph6mGHqYYaphxmmHmaoepgoDog/ymDRmZkB4oD4o5YWnZkZIA6IPwpyz5k4IP4o 30VnZgaIA+KPHoDozMwAcUD80UgQnZkZIA6IP7oRojMzA0wmN5pMbjSZ3GgyudFkcqPJ5EaTyY0m kxtNJjeaTG40mdxoMrnRZHKjyeRGk8mNJpMbTSY3mkxuNJncaDK50WRyo8nkRpPJjSaTG00mN5pM bjSZ3GgyuRHpciPS5Uaky41IlxuRLjciXW5EutyIdLkR6XIj0uVGpMuNSJcbkS43Il1uRLrciHS5 EelyI9LlRqTLjUiXm5AuNyFdbkK63IR0uQnpchPS5Saky01IYZuQwjYhhW1CCtuEFLYJKWwTUtgm pLBNiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiBBMiPVLiPVLiPVLiPVL iPVLiPVLiPVLiPVLiPVLiPVLiPVLiPVLjPUzdYrR1ClGU6cYTZ1iNHWK0dQpRlOnGE2dYjR1itHU KUZTpxhNnWI0dYrR1ClGU6cYTZ1iNHWK0dQpRlOnGE2dYjJ1isnUKSZTp5hMnWIydYrJ1CkmU6eY TGlhMqWFyZQWJlNamExpYTKlhcmUFiZTWphMtDWZaGsy0dZkoq3JRFuTibYmE21NJtqaTLQ1mWhr MtHWZKKtyURbk4m2JpNGTSaNmkwaNZk0ajJp1GTSqMmkUZNJoyaTRk0mjZpMGjWZNGryaNQRyGTc ZfV4921ZPd59W1aPd9+W1eOd2WX1eGd2WT3emV1Wj3dml9Xjndll9XhndlqBfbtlhWID7NstKxQb YN9uWaHYAPt2ywrFBti3W1YoNsC+3bJCsQH27ZYVig2wb7esUGyAfbtlhWID7NstKxQbYLLHskKx AXb7lhWKDbDbt6xQbIDdvmWFYgPs9i0rFBtgt29ZodgAu33LCsUGmOyxrFBsgMkeywrFBpjsMa3A BIxlhe4GmPmwrFBEgZkPy4qtYLVq5lywi860auZc3ovOtHr+LAZEZ1o9f5YOojOtnj8LDc+ZtxFx liWiMzMDvI2Is7YRnZkZ4G1EnAWS6MzMAG8j4qyyRGdmBngbEWepJjozM8DbiDjrPdGZmQHeRsRZ NHrOvBkbZ4kpOjMzwNvVOOtU0ZmZAd6uxlnsis7MDPB2Nc6KWXRmZoC3q3GW3aIzMwO8GRtn7S46 MzPAm7FxNgBEZ+YD8MYVnF0E0ZmZTt64guUMNbfA+MllhZpbYPzkskLNLTB+clqB8ZPLCrWpwPjJ ZYXaVGD85LJCsQHGTy4rFBtg/OSyQrEB5PPLCsUGkM8vKxQbQD6/rFBsAPn8skKxAeTzywrFBpDP LysUG0A+v6xQbAD5/LJCsQHk88sKxQaQzy8rEhtEPr+sSGwQ+fyyIrFBhPDLijzlhDAcIp9fVugp IwyHyOeXFXrKCMMh8vllhWIDYThEPr+sUGwgDIcI4ZcVesoIqCGS9mWFnhdDY7xhbGfRIzozmwXe MLazchKdme0ybxjbWX6Jzsz63hvGdtZwojMzA7xhbGchKDozM8AbxnZWk6IzMwO8wQNnSSo6MzPA Gzxw1rWiMzMDvMEDZ3HsOfMGD5yltOjMzABv8MBZj4vOzAzwBg+cRb3ozMwAb/DA2RkQnYkZIA4e ONsLojMxaMVZAWePQnQmBq04eOBsdIjOzKA1eT9x8MDZRBGdmRlg8n7i4IGzQSM6MzPARPTEWQFn 80d0ZsaZSdWJ8v41xAA0bhM5qXRZgZZeQjqNRE4qXVagEZjISaXLCjQCEzmpdFmBxm1CqpWEVCsJ qVYSUq0khIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIokhIok hIokhIokhIokhIokhIokhIokhIokhIokhIokhIokBH0kBH0kBH0kBH0khG8khG8khG8khG8khG8k hG8khG8kcvrBsiJPGUEfCUEfCUEfCUEfCUEfCUEfSTzD8CxfRGdeCZtMJj2JZxiepZHozKuHk3iG 4Vlfic68vksyRQHJFAUkUxSQTFFAMrGZZGIzycRmkonNJBObSSY2k0xsJpnYTDKxmWRiM8nEZpKJ zSQTm0kmNpNMbCaZ2EwysZlkYjPJxGaSic0kE5tJJjaTTGwmmdhMMrGZZGIz6SvYzPqfn62+++n9 278+/fzmhx/fPv0PT7fp5dd/dHv6/v2Hp1fdhz+9ff/hwy9/+/Tb5dPyK1f/d+dn+c+/vPvrafGn d++f/sPT87tP61v97i/9k9W65u5Ff/vw/rufnn9++i8/fvrLP13x9v27T9Py4/pgX3yc89P85c3f n5/e/vT85sPzn7+8hvVfxEdoZreIBCUTCUomxZNMiieZFE8yKZ5kUjzJpHiSSfEk8fiQsyclOhN/ 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 nkc1mkc1nkc1mkc1nkc1mkc1nkc1mkc1nkc1mkc1nkc1mkc1nkc1mkctnkctmkctnkctmkctnkct mkctnkctmkctnkctmkctnkctmkctnkctmkctnkctmkctnkctmkctnkctmkc9nkc9mkc9nkc9mkc9 nkc9mkc9nkc9mkc9nkc9mkc9nkc9mkc9nkc9mkc9nkc9mkc9nkc9mkc9nkc9mkcjnkcjmkcjnkcj mkcjnkcjmkcjnkcjmkcjnkcjmkcjnkcjmkcjnkcjmkcjnkcjmkcjnkcjmkcjnkcjmEfb+4ugz6dL Az7DefR0acBnOI+eLg34DOfR06UBn+E8ero04DOcR0+XBnyG8+jp0oDPcB49XRrwGc6jp0sDPsN5 9HTpbZ8pnkcpmkcpnkcpmkcpnkcpmkcpnkcpmkcpnkcpmkcpnkcpmkcpnkcpmkcpnkcpmkcpnkcp mkcpnkcpmkc5nkc5mkc5nkc5mkc5nkc5mkc5nkc5mkc5nkc5mkc5nkc5mkc5nkc5mkc5nkc5mkc5 nkc5mkc5nkc5mkclnkclmkclnkclmkclnkclmkclnkclmkclnkclmkclnkclmkclnkclmkclnkcl mkclnkclmkclnkclmkdxnsGjPIPHeQaP8gwe5xk8yjN4nGfwKM/gcZ7BozyDx3kGj/IMHucZPMoz eJxn8CjP4HGewaM8g8d5Bo/yDB7nGTzKM3icZ/Aoz+BxnsGjPIPHeQaP8gwe5xk8yjN4nGfwKM/g cZ7BozyDx3kGj/IMHucZPMozeJxn8CjP4HGewaM8g8d5Bo/yDB7nGTzKM3icZ/Aoz+BxnsGjPIPH eQaP8gwe5xk8yjN4nGfw4z1t0qmAPhi71WEt9mZ1vA/GbnW4Q8JudVinv1sd1unvVod1+rvVYZ3+ bnVYp79bodg43gdjWoE+GLsVucugD8ZuRe4y6IOxW5G7DPpg7FbkLoPuGbsVio3jPTd2KxQbxzt1 7FYoNo536titUGwc79SxW6HYON6pY7dCsXF8RtRuhWLj+Iyo3QrFxvEZUbsVio3jM6J2KxQbx2dE 7VYoNo7PiNqtUGwcnxG1W6HYOD4jardCsXF8RtRuhWLj+Iyo3QrFxvEZUbsVio3jM6J2KxQbx2dE 7VYoNo7PiNqtUGwcnxG1W6HYOD4jardCJw6Zav/xgKVzJlPtPx7HhM5UKtfHw5vQmUrl+njUEzpT qVwfD4ZXtKQ/rM6tNs71iv98d5peHv/Rae+DcdH9udfLH3//9v3yaXnl6v90/iz/649PfztbRD9H OvY50uHP8enz3X+9e/j0bVvdX/7ST1bbNTcv+vuXz28+PHy8+9/vv/31pyvefv507izy/tPLj3P+ NH+9/8fD3dsPD/dfHn57eQ25+8KnjK7NwmM5QOhM+JTRtVl4rCkInQmfMro2C4+FCaEz4e/sVsbQ OZM1gHgsegidKTNA1k3isXIidKbMAFk3icfyi9CZMgNk08ceazhCZ8oMkE0feywECZ0pM0A2feyx miR0pswA2fSxx5KUzpls+thjAUvoTJkBsuljj1UwoTNlBsimjz2W0oTOlBkgmz72WI8TOlNmgGz6 2GNRT+hMmQGy6WOPlUGhM2UGyKaPPZYXdc5k08cei5FCZ6h+fXyO/W6F6tfH59jvVqh+fXxC2G6F 6tfHJ4RtVscnhO1W6N3G8QlhuxWKjeMTwnYrFBvHJ4TtVig2jk8I261QbDQUG8fniu1WKDaOzxXb rVBsHJ8rtluh2Dg+V2y3QrFxfK7YZnV8rthuhWLj+Fyx3QrFRkexcXwa2W6FYuP4NLLdCsUGojAd UZiOKExHFKYjCtMRhemIwnREYTqiMB292nHEblbEblbEblbEblbEblbEblbEblbEblbEblbEblbE blbEblbEblbEblbEblbEblbGbsqmPz8ey4TOlBUI2fTnx7Od0JmyAiGb4PZ4QNQ5k01wezxOCp0p M0A2we3xTCp0pswA2QS3x4Ot0JkyA2QT3B5Px0JnygyQjYN7PGILnSkzQDYO7vGcLnSmzADZOLjH w77OmWwc3GNpQOhMmQGyuWmP9QWhM2UGyIawPRYphM6UGaDknl3JPbuSe3Yl9+xK7tmV3LMruWdX cs9+mXtmFRqhM2EGVCWTW5VMblUyuVXJ5FYlk1uVTG5VMrlVyeRWJZNblUxuVTK5VcnkViWTW5VM blUyuVXJ5Fakfa5I+1yR9rki7XNF2ueKtM8VaZ8r0j5XpH2uSPtckfa5Iu1zRdrnirTPFWmfK9I+ V6R9rkj7XJH2uSLtc0Xa54q0zxVpnyvSPlekfa5I+1yR9rki7XNF2ueKtM8VaZ8r0j5XpH2uSPtc kfa5Iu1zRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxh RVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhVWoiq1ITWZWayKrURFalJrIqNZFVqYms Sk1kVWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1kVWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1k VWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1kVWoiq1ITWZWayKrURFYlk1uVTG5VMrlVyeRWJZNb lUxuVTK5VcnkViWTW5VMblUyuVXJ5FYlk1uVTG5VMrlVyeRWJZNblUxuVTK5VcnkViWTW5VMblUy uVXJ5FYlk1uVTG5VMrlVyeRWpMutSJdbkS63Il1uRbrcihS2FWllK9LKVqSVrUgrW5FWtiLVa0X6 1Yr0qxXpVyvSrzakRG1IidqQErUhJWpDStSGlKgNKVEbUqI2pERtSInakBK1ISVqQ0rUhpSoDSlR GyLpGiLpGiLpGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLiGmLi GmLiGmLiGmLiGmLiGmLiGmLiGmLiGmPilHq+qtTzVaWeryr1fFWp56tKCV5VquaqUjVXlaq5qlTN VaVqriqFblWpTatKbVpVatOqUpvWlHKyppSTNaWcrCnlZE0pJ2tKOVlTysmaUk7WlHKyppSTNaWc rCnlZE0pJ2tKOVlTysmaEmdsSpyxKXHGpiQQm5JAbEoCsSkJxKYkEJuSQGxKArEpCcSmJBCbkkBs SgKxKQnEpiQQm5JAbEoCsSkJxKYkEJuSQGxKArEpCcSmJBCbkkBsSgKxXSYQt/96nhv46Y+Pbx6+ 3J3+edq8/Wzv28CP7cJ/PHz5+n77U7cvDfhscZ8t6rPHffaozxH3OYI+Z9hFfT5eGvCZ4j5T1GeO +zxfev6H7z5/+Xj/7e79hYsCf7jE/3CJ+rS4T4t8GYv+YY//YY/6jGekRTPS4hlp0Yy0eEZaNCMt npEWzUiPZ6RHM9LjGfl46fWA82jaejxtPZqRHs9Ij2akxzPSo8nm8WTzaLJ5PNk8mmweTzaPJpvH k82jyebxZPNostV4stVostV4stVoHtV4HtVoHtV4HtVoHtV4HtVoHtV4HtVoHtV4HtVoHtV4HtVo HtV4HtVoHtV4HtVoHrV4HrVoHrV4HrVoHrV4HrVoHrV4HrVoHrV4HrVoHrV4HrVoHrV4HrVoHrV4 HrVoHrV4HrVoHrV4HrVoHvV4HvVoHvV4HvVoHvV4HvVoHvV4HvVoHvV4HvVoHvV4HvVoHvV4HvVo HvV4HvVoHvV4HvVoHvV4HvVoHo14Ho1oHo14Ho1oHo14Ho1oHo14Ho1oHo14Ho1oHo14Ho1oHo14 Ho1oHo14Ho1oHo14Ho1oHo14Ho1gHm39iYM+ny4N+Azn0dOlAZ/hPHq6NOAznEdPlwZ8hvPo6dKA z3AePV0a8BnOo6dLAz7DefR0acBnOI+eLg34DOfR06W3faZ4HqVoHqV4HqVoHqV4HqVoHqV4HqVo HqV4HqVoHqV4HqVoHqV4HqVoHqV4HqVoHqV4HqVoHqV4HqVoHuV4HuVoHuV4HuVAcfzposAfjidb jiZbjidbjiZbjidbjiZbjifb46U3Fj2akTmekTmakTmekTmakTmekTmakTmekTmakSWekSWakSWe kSWabCWebCWabCWebI+XXg/iEs3IEs/IEs3IEs/IEk22OK1Ro7RGjdMaNUpr1DitUaO0Ro3TGjVK a9Q4rVGjtEaN0xo1SmvUOK1RoyBGjYMYNQpi1DiIUaOMRY0zFjXKWNQ4Y1GjjEWNMxY1yljUOGNR o4xFjTMWNcpY1DhjUaOMRY0zFjWKT9Q4PlGj+ESN4xM1ik/UOD5Ro/hEjeMTNYpP1Dg+UaP4RI3j EzWKT9Q4PlGj+ESN4xM1ik/UOD7xdOn1DVCUsahxxqJGGYsaZyxqlLGoccairhmLlE73i2vj+VYD AGFdsxit15XDC3lp62uf/4O7v95/vfsf/3Onfndg+M0f3+6+/fXhy8Pd+693nz5v/+63h3+8f/vw 0vTT5293X6bF+28f7/9+nD7eP8+79x8eXhrs/3T5PZ+tiXnqi+954bniv1289sYNqc+/fTuwcGRl lo8mH/aw+Ab9+Yfr/+IP1//tv9//9tP1L9dr+cR64+3Ny49/iVUpy0uf/4PXB+F0Gg5CMuvB6yVy JufFVwQdErDVhUfcKsiaPV96+9cG2ZqjsdFXiwYaeuxWy9vSVpEXeUpcom/qwl+L+Fs+BOzt8v6c 9x1/+vTw+/239/94+PPd1/f/8XD3l9J8pFZ6Gt3My6mOcdH4xVq3tLh2RD75Mv/XP56XGJvFXeiR TcsaxGmjLVbtEotTF1+8R4rNa2LH27u3C4cXNjjv9v+M1VLl9U1uKQ/35H6y5Hlu27pdNH720bL9 5otrL+yTzh/tzeIp3iMFtTUnlNrD6iNc2FOdP8K7yxY3PsLysfK29NV3uvCAKKvQ9Au3prXeTlb8 5GP+Pxu2+uTLvU2ZFy+uvbS3WTwXe+SptQaYcvttFbIXDlfne9IX26tHixfrkm2ctsXIbZT5X0b3 xX51zUE9nOriiXoJhTp/tIdVQvfI6iwfjfenh9VyXzjStYuX3vjby6foQ3pYfP1LhFVefPHHa1/c kw0wtpFPfWz1tZz66jG45rPqb78t7t8lROsxXBa/RCPykF3jXA/5zbuFwwsPWV88XkdAqVbX3JfZ m0W6XEK/zt//fvHIGZHH6BoTe8jvVt/p6mP0fvEke7R4uZPInq2exigzbW2UvAyt5eP1/u3bRQ5c As4en/Cr6Ii8ehxoM0g6vDrq1eqoV6u3Ezl7oA6vjjq8Ourw6qjDq6NerY56tTrq1eqoV6ujrquO +qc66p/qqH+qo/6pjvqnOuqfOq3Q/SJdVx11XXXUddVR11VHXVcddV111HXV2xrduFSgfepy8OVh c/2z0YHS7a9OfrWJlXXP9n+9/8fD3dsPD/dfHn57ec2B0u/Rb7UuCl/9Ws8v/v+ngvGV1hbna7/9 n78/3J2Sn+Z/XprfvlmHatJHb9a6Wv3aGKyBr/V/odp94Va9+/zHpxcfr83Pff/+4/tPv999+3z3 5uHufq7G/Ye/fHv/cX7xGQmBr3iovn7lzj2/9F9eeT+yUF2wUJFa/5HPNASf6dDbhaNpt3zvcOAR +X/hnUT0OZcWz7lpfnPB8WuPKx9ss/yPhy+f7x7++e3h07fzITNZq2XMx3HfHmD7NVtwbLHx3+Z1 +zXP/8ivt2bG1Ob1+T1Jd3/ZP8DTH/t2/+XbFoJvPnx++7ene19Op5JymmfB/3L3+d27zV0q9d/e fv6yfcHt8k9n+6/7p3vxbbc/8Nv9t/vt3/7tZaLMK26v9KFXRVejkr1GOnzHkpnn7qOE71he37Ht T9x/+/blvHpP65/GYiGnh4/3//z3uWO/vaD0zdjhhSip2Dyk9xReiBIK3RIJ3Tx6GqdWckn9VPuP AK5mI83Abi0ax+VmHJfAsh96tRj+ff1/4aXjgd+y+Wle/Vt27DXnlYViL0CDvxxt9cMR2CAfe8X6 yq1tC2xtD72ife3naYHPc+gV742tDH75e/tjHnpBfONj3li1yEP90OtlwQbwuZPDsdADu6xjL66P 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 xBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUm xBUmxBUmxBUmxhXq9DDnY5nQmbICodPDnM92QmfKCoROD3M+IAqdKSsQOj3M+ZQpdKbMAJ0e5nxU FTpTZoBUDyMZ2fLTMVjoTJkBkpEtP52lhc6EGZAkI1t+OpALnQkzIElGtvx0qhc6E2ZAkoxs+ak0 oHMmGdnyUyFB6EyZAZKRLT9VI4TOlBmgZHKTkslNSiY3KZncpGRyk5LJTUomNymZ3KRkcpOSyU1K JjcpmdykZHKTkslNSiY3KZncpGRyk5LJTUomNymZ3KRkcpOSyU1KJjcpmdykZHKTkslNSiY3KZnc hHS5CelyE9LlJqTLTUiXm5AuNyFdbkK63IR0uQnpchPS5Saky01Il5uQLjchXW5CutyEdLkJ6XIT 0uUmpMtNSJebkC43IV1uQrrchHS5CelyE9LlJqTLTUiXm5AuNyFdbkK63IR0uQnpchPS5Saky02I K0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yIK0yI K8yIK8yIK8yIK8yIK8yIK8yIK8yIK8yMK1RqIpNSE5mUmsh0RRN5/+3+7t3nL3+bFndfHn7/48P9 lxfGd28/3L//+PXuj68Pv929+fD57d/u0ikXS3l7Lfn285ftr77/9Pvdp4d/fnv49O3r5vHlR9j+ 7Kfd/OtdMa++vOzpg3552L7Yt893p7Phk+sUtWLHVuGiK4srSrlnuiL3vB0Onlbh4MXT/N9kwXCY H+HncHA/WVleRsJhacVO+8JFV9aNlErWpFSyJqWSNSmVrEmpZE1KJWtSKlmTUsmarihZbz8pal48 KbLXOsy2cSixJ8X8CD8/KXKr9bR6VNRMHhVLK1bGEa66MruVKt2kVOkmpUo3KVW6SanSTUqVblKq dJNSpZuUKt2kVOkmpUo3KVW6SanSTUqVblKqdJOSEk9KSjwpKfGkpMSTkhJPSko8KSnxpKTEk5IS T0pKPCkp8aSkxJOSEk9KSjwpKfGkpMSTkhJPSko8KSnxpKTEs5ISz0pKPCsp8aykxLOSEs9KSjwr KfGspMQzUopnpBTPSCmekVI8I6V4RkrxjJTiGSnFM1KKZ6QUz0gpnpFSPCOleEZK8YyU4hkpxTNS imekFM9IKZ6RUjwjpXhGSvGMlOIZKcUzUopnpBTPSCmekVI8I6V4RkrxjJTiGSnFM1KKZ6QUz0gp npFSPCPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPS NSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNSPSNStVulmp0s1KlW5WqnSzUqWblSrdrFTpZqVK NytVulmp0s1KlW5WqnSzUqWblSrdrFTpZqVKNytVulmp0s1KlW5WqnSzUqWblSrdrFTpZqVKNytV ulmp0s1KlW5WqnSzUqWblSrdrFTpZqVKNytVulmp0s1KlW5WqnSzkhLPSko8KynxrJyck5UodVai 1FmJUmfl5Jys5I2zkjfOSt44K3njrOSNs5I3zkreOF/hjW+CuNN4BeLWbqWlFAVxt4/wM4jbWh19 eRngcNdWrAymW3QlSp2VQ4GyEjfOStw4K3HjrMSNsxI3zkrcOCtx46zEjbMSN85IBJ+RCD4jEXxG IviMRPAZieAzEsFnJILPSASfkQg+IxF8RiL4jETwGYngMxLBZySCz0gEn5EIPiMRfEYi+IxE8BmJ 4DMSwWckgs9IBJ+RCD4jEXxGIviCRPAFieALEsEXJIIvSARfkAi+IBF8QSL4gpDJgpDJgpDJgpDJ gpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJgpDJ gpDJgpDJgpDJgpDJwpBJpdwzK+WeWSn3zEq5Z1bKPbNS7pmVcs+slHtmpdwzK+WeWSn3zEq5Z1bK PbNS7pmVcs+slHtmpdwzK+WeWSn3zEq5Z1bKPbNS7pmVcs+slHtmpdwzK+WeWSn3zEq5Z1HKPYtS 7lmUcs+ilHsWpdyzKOWeRSn3LEq5Z1HixkWJGxclblyUuHFR4sZFiRsXJW5clLhxUeLGRYkbFyVu XJS4cVHixkWJGxclblyUuHFR4sZFiRsXJW5clLhxUeLGRYkbFyVuXJS4cVHixkWJGxclblyUuHFB kuOCJMcFSY4LkhwXJDkuSHJckOS4IMlxQZLjgiTHBUmOC5IcFyQ5LkhyXJDkuCDJcUGS44IkxwVJ jguSHBckOS5IclyQ5LggyXFBkuOCJMcFSY4LkhwXJDkuSHJckOS4IMlxQZLjgiTHBUmOC5IcF8QV FsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQV FsQVFsQVFsQVFsQVFsQVFsQVFsQVFsYVKuWeRSn3LEq5Z1HKPYtS7lmUcs+ilHsWpdyzKOWeRSn3 LEq5Z1HKPYtS7lmUcs+ilHsWpdyzKOWeRSn3LEq5Z1HKPYtS7lmUcs+ilHsW5XiZotREFqUmsig1 kUWpiSxKTWRRaiKLUhNZlJrIotREFqUmsig1kUWpiSxKJrcomdyiZHKLksktSia3KJncomRyi5LJ LUomtyiZ3KJkcouSyS1KJrcomdyiZHKLksktSia3KJncomRyi5LJLUomtyiZ3KJkcouSyS1KJrco mdyiZHKLksk1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1 pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1 pMs1xBUa4goNcYWGuEJDXKEhrtAQV2iIKzTEFRriCg1xhYa4QkNcoSGu0BBXaIgrNMQVGuIKDXGF hrhCQ1yhIa7QEFdoiCs0xBUa4goNcYWGuEJTaiJNqYk0pSbSlJpIU2oiTamJNKUm0pSaSFNqIk2p iTSlJtKUmkhTaiJNqYk0pSbSlJpIU2oiTamJNKUm0pSaSFNqIk2piTSlJtKUmkhTaiJNqYk0pSbS lJpIU2oiTamJNKUm0pSaSFNqIk2piTSlJtKUmkhTMrmmZHJNyeSaksk1JZNrSibXlEyuKZlcUzK5 pmRyTcnkmpLJNSWTa0om15RMrimZXFMyuaZkck3J5JqSyTUlk2tKJteUTK4pmVxTMrmmZHJNyeSa ksk1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1 pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMt1xBU6 4godcYWOuEJHXKEjrtARV+iIK3TEFTriCh1xhY64QkdcoSOu0BFX6IgrdMQVOuIKHXGFjrhCR1yh I67QEVfoiCt0xBU64godcYXOuEKlJtKUmkhTaiJNqYk0pSbSlJpIU2oiTamJNKUm0pSaSFNqIk2p iTSlJtKUmkhTaiJNqYk0pSbSlJpIU2oiTamJNKUm0pSaSFNqIk2piTSlJtKUmkhTaiJNqYk0pSbS lJpIU2oiTamJNKUm0pSaSFNqIk2piXQlk+tKJteVTK4rmVxXMrmuZHJdyeS6ksl1JZPrSibXlUyu K5lcVzK5rmRyXcnkupLJdSWT60om15VMriuZXFcyua5kcl3J5LqSyXUlk+tKJteVTK4rmVxHulxH ulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxH ulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHulxHXKEjrtARV+iI K3TEFTriCh1xhY64QkdcoSOu0BFX6IgrdMQVOuIKHXGFjrhCR1yhI67QEVfoiCt0xBU64godcYWO uEJHXKEjrtARV+iIK3SlJtKVmkhXaiJdqYl0pSbSlZpIV2oiXamJdKUm0pWaSFdqIl2piXSlJtKV mkhXaiJdqYl0pSbSlZpIV2oiXamJdKUm0pWaSFdqIl2piXSlJtKVmkhXaiJdqYl0pSbSlZpIV2oi XamJdKUm0pWaSFdqIl2piXQlk+tKJteVTK4rmVxXMrmuZHJdyeS6ksl1JZPrSibXlUyuK5lcVzK5 rmRyXcnkupLJdSWT60om15VMriuZXFcyua5kcl3J5LqSyXUlk+tKJteVTK4rmVxHulxHulxHulxH ulxHulxHulxHulxHutyKdLkV6XIr0uVWpMutSJdbkS63Il1uRbrcinS5FelyK9LlVqTLrUiXW5Eu tyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVWpMutiCusiCusiCusiCus iCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCusiCus iCusiCusiCusiCusjCtUaiJdqYl0pSbSlZpIV2oiXamJdKUm0pWayKrURFalJrIqNZFVqYmsSk1k VWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1kVWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1kVWoi q1ITWZWayKrURFalJrIqNZFVqYmsSia3KpncqmRyq5LJrUomtyqZ3KpkcquSya1KJrcqmdyqZHKr ksmtSia3KpncqmRyq5LJrUomtyqZ3KpkcquSya1KJrcqmdyqZHKrksmtSia3KpncqmRyq5LJrUiX W5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVWpMutSJdbkS63Il1u RbrcinS5FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKuMKK uMKKuMKKuMKKuMKKuMKKuMKKuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKG uMKGuMKGuMKGuMKGuMKGuMKGuMLGuEKlJrIqNZFVqYmsSk1kVWoiq1ITWZWayKrURFalJrIqNZFV qYmsSk1kVWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1kVWoiq1ITWZWayKrURFalJrIqNZFVqYms Sk1kVWoiq1ITWZWayKrURFalJrIqNZFVqYmsSk1kVTK5VcnkViWTW5VMblUyuVXJ5FYlk1uVTG5T MrlNyeQ2JZPblExuUzK5TcnkNiWT25RMblMyuU3J5DYlk9uUTG5TMrlNyeQ2JZPblExuUzK5Tcnk NiWT25RMbkO63IZ0uQ3pchvS5Taky21Il9uQLrchXW5DutyGdLkN6XIb0uU2pMttSJfbkC63IV1u Q7rchnS5DelyG9LlNqTLbUiX25AutyFdbkO63IZ0uQ3pchvS5Taky21Il9uQLrchXW5DutyGdLkN 6XIb0uU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2 xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2xBU2pSayKTWRTamJbEpNZFNqIptSE9mUmsim 1EQ2pSayKTWRTamJbEpNZFNqIptSE9mUmsim1EQ2pSayKTWRTamJbEpNZFNqIptSE9mUmsim1EQ2 pSayKTWRTamJbEpNZFNqIptSE9mUmsim1EQ2pSayKTWRTamJbEpNZFMyuU3J5DYlk9uUTG5TMrlN yeQ2JZPblExuUzK5TcnkNiWT25RMblMyuU3J5DYlk9uUTG5TMrlNyeQ2JZPblExuUzK5TcnkNiWT 25RMblMyuU3J5DYlk9uUTG5DutyGdLkN6XIb0uU2pMttSJfbkC63IV1uQ7rchnS5DelyG9LlNqTL bUiX2xF90xEd0BEd0BEd0NEb+47e2Hf0xr6jN/advbFXqg2aUm3QlGqDplQbNKXaoCnVBk2pNmhK tUFTqg2aUm3QlGqDplQbNKXaoCnVBl35CrArS+ZdWTLvypJ5Vxamu7Iw3ZWF6a4sTHdhYTqfCDwz rcDP6rQCG5p8ImjKtAIbtWkFtsjTCmyephVaeYKmTCuweZpW6C4TNGVaodggaMq0QrFBjrvTCt0v ctydVuh+kePutEL3ixx3pxXKSnIsnFZoDUm7ppxI46VpRaI3kcZL04o82RJpvDStyP1KpIXStCLR m0gzpGmF7hdphjSt0P0izZCmFXmyJdIMaVqhu0yaIU0rFBtEzDWtUGwQMde0QrFBxFzTCsUGEXNN K7YX1Z0V9u2w0JnusLZvnoXOdAfcfastdKY7Ru4bc6Ez3TFy38YLnSmDVvhmbz8L6JwJ3+ztJweh M2WcCavM+/FD6EwZZ8Iq836G0TkTVpn3E4/QmfJuCium+7FJ5iwJW6rshyyhM+HdTMKWKvtJTehM GGdJ2AVlP+7pnAkbl+yHQ6EzZZwJG5fsJ0yhM+FPXRI2LtmPqUJnyoejsHHJftYVOlNmgFA4tx+Y hc6UGSAUzu2nbqEzXQZYIu8fphWo+kwrUPWxRN4/TCtQ9ZlWoBIzrUAlZlqBSsy0QitP3iRYIm8S phVaefL+YVqBetu0QitP3lpMK3S/yJAJy+Rdx7Qi9yuTdx3TityvTN51TCuSlZm8IZlWJDYyGTIx rVBskPcq0wrFBnmvMq1QbJD3KtMKxQZ5rzKtUGyQ9yrTCsUGea8yrVBskPcq0wrFBnmvMq1QbJD3 KtMK3S/SuG5aoftFGtdNK3S/SOO6aYVWnrSg23fLwq237vC57611zoT1/H0nLnSmO+Lt+3ahM90R b9/lC50pQ0NYgt+PCkJnurrEfrAQOlOGhvDlwH46EToTxlkWvmnYjzhCZ8I4y8I3Dfs5SehM+HDM wtcW+2FL6EyYAVn4DmQ/sQmdKTNA+A5kP/YJnSkzQPgOZD87Cp0pM0D4DmQ/gOqcCd+B7MdVoTNl BgjfgexnXqEzZQYI34HsB2edM2GLvv2YLXSmjDNhi779rC50pgwNYVc9q6iEVFEJqaISUiVo7rQi 5cWKSkgVlZAqKiFVVEKqZPbBtEL3CxWeKuluMK1IebGS7gbTCt1l0hNhWqG7THoiTCt0l0lPhGmF 7jKZYmCVTDGYVugJQKYYTCsUG2SKwbRCsUGmGFglUwyskikGVskUA6tkioFVMsXAKpliYJVMMbBK hNhWyRQDq2SKgVUi+rZKphhYJVJxq0S+bRVhRhVhRhVhRhVhRhVhRpV04LdKOvBbRUhTRUhTRUhT JZLqfWcu3OYLD7pVedCtStivCrvk74cBoTPhQbcqD7pVedCtwl70+/lD6EwZZ8LGOvshRudM2Fhn P/IInSmDVtilZz83CZ0pg1bYpWc/fAmdKYNW2D5+P8EJnSkzQNg+fj8GCp0pM0DYPn4/SwqdKTNA 2D5+P5AKnSkzQNg+fj/VCp0pM0DYPn4/GgudKTNA2D5+P1/rnAlbOeyncaEz5ZopMcaqxBirEmOs wobje11A6Ez51FACllUJWFZhw4SaSLl0WoHS0bQCpaNpBUpH0wqUjqYVKB1NK1A6mlagdDStQFlx WoGyYk2ks+a0QrFBSrPTCt1l0iNzWqG7TIrHFWlUK9KoVqRRrUijOq3QXSbF44r0sBXpYSvSw04r FBtERVuRHrYiZWtFytZphe4XGQlRkYq2IhVtRSrailS0FalopxXJZaSirUhFW5GKtiIVbUUq2opU tBWpaCtS0Vakoq1IRVuRHrYiPWxFetiK9LAV6WEr0sNWpIetSA9bkR62Ij1sRXrY/ZwiPPTozsP7 qUboTHce3s9AQme68/B+YhI6k56HdRWh/dilcyZs1bof0oTOlBkg7K66n/SEzpRBKyxjVqUauyrV 2FWpxq5KNfZ+FBU6Uz62hWXMqtSJV6VOfD/9Cp0pM0CoE69KaXdVSrv3A7fQmTLOhKLzqhSdV6Xo vCpF51UpOt8rAkJnwgxQis6rUnRelaLzqhSdV6XovCpF51UpOq9K0XlVis6rUidelTrxqtSJV6VO vCp14lWpE69KnXhV6sSrUidelTrxqtSJ14qqphVVTSuqmlZUNa2k9+C0IvW0iqqmFVVNK6qaIpFf ReKqisRVFYmrKhJXVSSuqkhcVZG4an5AdL8QLVCVm5Cq3IRU5SakKjchVdj5Zn/oCJ0JNyFVuQmp yk2IEoWvSty2KnHbqsRtqxK3rUrctipx26rEbfcHsdCZ7hHU0evujl53d/S6u6PX3R01je7oJXlH L8k7et3d0evujl53d/S6u6PX3R297u7odXdHr7s7av/cUfvnjto/TysUG6R3T0etpjtqNd1Rq+mO Wk131Gq6o1bT0wrFBukT1FGD6mmFYoP0CeqZ9AmaVugukz5B0wrdZdInaFqhu0z6BE0rdJdJB5lp hWKDSCKmFXpuEEnEtEIRRYoc0wpFFClyTCsUUaTIMa1QbJAix7RCsSEscnTlm5aufNPSlW9aurK9 b1e+tunK1zZd+aalK9+0dOWblq5809KVb1q68k1LV75p6co3LV3ZkbcrO/J2ZUfe/SwjdKbMAGGv 4K7sFdyVvYK7sldwV/YK7spewfsZTOhMmQHCFkr7QU7oTJkBwhZK+2lQ6EwZtMIWSvuRUuhMGbTC Fkr7uVTnTNiNZj/F6pwJdTT7mVfoTJlOwtdj+8FZ6EyZTsLXY/vpW+hMmQHC12P7EV7oTJYB/ZRB S+bN6njRZLM6XjTZrI4XTaYVKKhtVseLJpvV8YLaZnW8oLZZHS+obVbHC2qbFYoNUFDbrFBsgILa tAIFtc0KxQboMbJZodgAnUk2KxQboDPJZoViA3Qm2axQbIDOJJsVig3QmWSzQrEBOpNsVig2QGeS zQrFBuhMslmh2AD9TDYrFBugC8pmhWIDdEHZrFBsgC4omxWKDdAFZbMisVFAF5TNisRGAV1QNisS GwV0QdmsSGwU0AVlsyKxUQAWtlmh2ABY2GaFnhu6brnnbb7Qmex0dj4U6Jzp6hPnI4TQmaw+cT5w CJ3J6hPn44nQmTIDdPWJ8xlH6EyZAbr6xPmgJHR2OQPuv93fvfv85W/T4u7Lw+9/fLj/8sL47u2H +/cfv9798fXht7s3Hz6//dtd2t7Yt2rzjPX285ftr77/9Pvdp4d/fnv49O3r5vHlR9j+7Kfd/Otd 3uSQtrzu6ZN+edi+2bfPd6ez5ZPvFLViR0bhqiuzW9cQ5XzuFDpTZreuIcr58KpzpmuIcj7qCp0p f990DVHO52WhM2UG6BqinA/dQmfKDOjKDNB1Vzkf6IXOlBmga9VyrgoInSkzQNeq5VxaEDpTZoCu Vcu5PiF0JsyAomvVci5yCJ0JM6DoWrWcKyVCZ8IMKDqA+Fxu0TnTAcTn4ozKWUY1toxqbBnV2DKq sWVUY8uoxpZRjS2jGtu0AvXXaQXqr9MKxQbotLFZodgAgs3NCsUGEGxuoCeKDSDY3KxQbADB5maF YgMINjcrFBtAsLlZodgAgs2N20WxAQSbmxWKDSDY3KxQbADB5maFYgMINjcrFBtAsLlh2Cg2DMUG kHluVig2gMxzs0KxAWSemxWKDSDz3KxQbIBOUZsVig1HseEoNhzFhqPYIOzhtEKxQdjDaYVig7CH 0wrFBmEPpxWKDcIeTisUG4Q9nFbsnKI752flOT8rz/lZec7PynN+Vp7zs/Kcn7XnfJ1Q+HycFDpT ZoCutdr5TCp0pswAner4fLDVOdOpjs/HYKEzZQboVMfns7TQmTIDdKrj84Fc6EyZATrV8flUL3Sm zACd6vhcGhA6U2aATnV8ri8InSkzQKc6PhcpdM50quNzSUPoTJkBOgnzuS4idKbMAJ2E+VxcETpT ZoApM0DX+vZcuBE6U2aAKzPAlRngygwQcu17CUnoTJkBQq59r0MJnSkzQMi178UsoTNlBgi59r0i JnQmzABDb3IMvckx9CbH0JscQ29yDL3JMfQmx9CbHENvcgy9yTH0JsfQmxxDb3IMvckx9CbH0Jsc Q29yDL3JMfQmx9CbHENvcgy9yTH0JsfQmxxDb3IMvckx9CbH0JscQ29yDL3JMfQmx0gXiWmFYoN0 kZhWKDZIF4lspIvEtEKxQbpITCsUG6SzQzbS2WFaoZUn3RamFVpD0m1hWqH8It0WphW6X6TbwrRC +UW6LUwrlF+k28K0QrGhLHaasthpymKnKYudpix2mrLYacpipymLnaYsdpqy2GnKYqcpi52mLHaa sthpymKnKYudpix2mrLYacpipymLnaYsdpqy2GnKYqcpi52mLHaasthpymKnKYudpix2mrLYadJi p7CJx37y1DkTNvHYz6lCZ8oMEDa62A+7QmfKDBA2uthPzDpnwnYS+/la6Ex5N4VNG/ZDutCZ8nkm bNqwn/R1zoRNG/a6gNCZMmiFTRv24oLQmS4DDIlYDIlYDIlYDIlYDIlYDIlYDIlYDIlYDIlYDIlY DIlYDIlYDIlYDIlYDIlYDIlYphWKDfLqwwp59TGtUGyQVx/TCsUGefUxrVBskFcf0wrFBmmgPa1Q bJDXLNMKxQZ5OTOtUGyQVzrTCsUGeaUzrVBskFc60wrFBnmlM61QbJBXOtMKxQZ5pTOtUGyQBtrT Ct1l0grbjDS1nlbkfhlpaj2tyP0y0nBnWpH7ZaThzrQid9lIwx0z0nBnWqHYIA13phWKDdJwx5RI tymRblMi3aZEuk2JdJsS6TYl0m1KpNuUSLcpkW5TIt2mRLpNiXSbEuk2JdJtSqR7P00KnSkzQPiW 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 wo5De9VE6EyZAcKOQ3vpRehMmQHC9kV7/UboTJkBwvZFexFI50zYvmgvGQmdKTNA2L5orzsJneky oKIqcEVV4IqqwBVVgSuqAldUBa6oClxRFbiiKnBFVeCKqsAVVYErqgJXVAWuqApcURV4WqHYIK0U phWKDdJKoVbSSmFaodgg7Q2mFbpfpJ/1NEL3izRFmFbofpGmCNMK3S/Sz3paoVwmDRimFYoN0s96 WqHYIG0bphWKDdK2YVqh2CBtG6YVig3StmFaodggbRumFYoN0s96WqHYIM0ephWKDUKRTisUG4Qi nVYoNghFOq1QbBCKdFqR2GiEIp1WJDYaoUinFTs76E64VVnjqcoaT1XWeKqyxlOVNZ6qrPFUZY2n Kms8VVnjqcoaT1XWeKqyxlOVNZ6qrPFUbY1H2FxjP5oKnSkzQNhcYz/fCp0pM0DYwmI/JAudKeNM 2A9jP2kLnSnjTNgPYz+uC50pn7TCTh37mV/oTJkBwkbQe+FA6EyZAcK2H3v1QehMmQHCth97CUPo TJkBwrYfex1E6EyZAcJG0HsxRedM2ENkL70InSkzQMiw7/UboTNlBggZ9r0IJHSmzAAhw75XkoTO hBnQhAz7Xo4SOiMVzEa0ztOKVDAb0TpPK1LBbETrPPfLqIJJtM7TClUwidZ5WqHYIFrnaYVig2id pxWKDaJ1nscfFBtE6zytUGwQrfO0QrGRUWxkFBtEVz2tUGwQXfU8zaLYQNRUQyRTQyRTQyRTQyRT QyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTQyRTI0NhphWKDURNNURNNURN NURNNaF2c98OC50JT35NqN3c99RCZ8qTn1C7uW/Mhc6UJz+hdnPf3QudKTNAqN3cjwhCZ8oMEGo3 93OG0JkyA4Tazf2wInSmzICszICszAChqnQ/HwmdKTNAqCrdD1lCZ8o4U1JNTUk1NSXV1JRUU1NS TU1JNTUl1dSUVFNTUk1NSTU1JdXUlFRTU1JNTUk1NSXV1JRUU1NSTU04Mmg/MAudKTNAyVs1JW/V hLxVRwqFjhQKHSkUOlIodKRQ6Eih0JFCoSOFQkcKhY4UCh0pFDpSKHSkUOhIodCRQqEjhUJH7347 evfb0bvfjt79dvTut6N3vx29++3o3W9H7347evfb0bvfjt79dvTut6N3vx29++3o3W9H7347evfb 0bvfjt79dvTut6N3vx29++3o3W9H7347evfb0bvfaYVig/TUnlYoNkhP7WmFYoP01J5WKDZIT+1p hWKDdFPpiAuYVig2SDeVjhiEjhiEjhiEjhiEjhiEjhiEjhiEjhiErmSdu5J17krWuStZ565knbuS de5K1rkrWeeuZJ27knXuSta5K1nnrmSdu5J17krWuStZ565kPrqS+ehK5qMrmY+uZD66kvnoSuaj K5mPrmQ+upL56ErmoyuZj65kPrqS+ehK5qMrmY+uZD66kvnoSuajK5mPrmQ+upL56ErmoyuZj65k PrqS+ehK5mMvrgidKTNA2El8r9AInSkzQNhJfC/zCJ0pM0DYSXyvFQmdKTNA2GVqLzgJnSkzQMhj dSWP1ZU8VlfyWF3JY3Ulj9WVPFZHGp6ONDwdaXg60vB0pOHpSMPTkYanIw1PRxqejjQ8HWl4OtLw dKTh6UjD05GGpyMNz7RCsUE6H/dGOh9PKxQbpPPxtEKxQTofTysUG6Tz8bRCsUE6H08rFBuk8/G0 QrFBOh9PKxQbpPPxtEKxQTofTysUG4grbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgr 7IgQ7IgQ7IgQ7IgQ7IgQ7IgQ7IgQ7Ij164j164ja64ja64ja64zaE6pNulJt0pVqk65Um3Sl2qQr 1SZdqTbpSrVJV6pNulJt0pVqk65Um3Sl2qQr1SZdqTbpUrVJE3b33Q+ZOmfC7r77kVToTJkBwu6+ +7lW6EyZAcLuvvvhWOhMmQHC7r77CVvoTJkBwu6++zFd6EyZAcLuvvtZX+hMmQFK4rUpidemJF6b knhtSuK1KYnXpiRem5J4bUritSmJ16YkXpuSeO1KSLUrIdWuhFS7ElLtSki1KyHVroRUu5Ir7Uqu tCtR0K5EQbsSBe0yFLScTkDWtVsdLgTuVofLvbvV4fLhZnVc1rVbHS4S71aHi4671eGi4251uOi4 Wx0uOu5WKDaOy7p2KxQbx2Vdm9VxWdduhWLjOJayW6HYOI6l7FYoNo5jKbsVio3jWMpuhWLjOJay W6HYOI6lbFbHMYfdiv0tFIfHMYfdCsXhccxht0JxeBxz2K1QHB7HHHYrFBvHMYfdCsXGccxht0Kx cRxY2K3QXT4OLGxWx4GF3Qrd5ePAwm6F7vJxYGG3Qnf5OLCwW6HYOA4s7FYoNmSA/uOGXehMVbZ4 3N7rnMkA/cfDgNCZ6mz6eHQQOlOdTR8PGkJnygyQAfqPpxWhM2UGyAD9xyOP0JkyA2QIy+O5SehM mQEyhOXx8CV0pswAGcLyeIITOlNmgAxheTwGCp1JP5kyN2VoweMRU+hMmZsytODxnCp0psxNGVrw eNgVOlNmwBW04P7b/d27z1/+Ni3uvjz8/seH+y8vjO/efrh///Hr3R9fH367e/Ph89u/3aU0z6X5 lOfP+9vPX7a/+v7T73efHv757eHTt6+bx5cfYfuzn3bzr3e9+hjDlhc+fdQvD9tX+/b5zlvKmw59 d/D0J0bMlh25lUkuoyceSwhCZ8q8lAEPj3UIoTNlXsqAh8dihtCZMmhlwMNjRUToTJkBMuDhsayi cpZRXTKjumQG8qvdCjxaM6pmZlTNzKiamVE1M6NqZkbVzIyqmRlVMzOqZmZUzcyomplRNTP3423d dysSG0B+tVuR+wUkUbsVWXkgpNqsjgupdiu08sflV7sVul/H5Ve7FbrLx5um71YoNo43Td+tUGwc b5q+W6HYON40fbdCsXG8afpuhWLjeNP03QrFxvGm6bsVio3jTdN3KxQbx5um71YoNo43Td+tUGwQ um5aodggdN20QrFB6LpphWKD0HXTCsUGoeumFYoNQtdlZakkK0slWSc0eTzsCJ3pTp1ZWXfJyrpL VtZdsrLukpV1l6ysu2Rl3SUr6y5ZWXfJyrpLltZduqy1+uNxUehMGLQ6bcjjmVPoTBgaOm3I48FV 6EwZGjKhyePpV+hM+HBUCk32I7TQmTIDZD3HH8/hOmeynuOPp3ahM2UGyHqOPx79hc6UGSDrOf5Y PxA6U2aArOf4YxFC6EyZAbKe44+VDKEzZQbIeo4/lkOEzpQZIESa95qKzpkQad4rMEJnygwQIs17 GUfoTJkBQqR5OkMVP6KZzJ1oJqcVqvgRzeS0QhU/opmcVqjiRzST0wpVg4lmclqh2CCayWmFYoNo JqcVio3jrbx3KxQbx1t571YoNo638t6tUGwcb+W9W6HYIBrXaYVig2hcpxWKDaJxnVYoNojGdVqh 2CAa12mFYoNoXKcVig3EknXEknXEknXEknXEknXEknXEknXEknXEknXEknXEknXEknXEknXEknXE knXEkg3Ekg3Eko3jDcB3qzN9f/6H7z5/+Xj/bf4fzy8ioTAQpjaO9/verUgoDAS3DQS3DQS3DQa3 CUWf+ylM50wo+tzPbEJnyhqBUPS5H/yEzpQ1AqHocz89Cp0pM0Ao+tyPoEJnygwQij73c6zQmTID ZH3LHw/DQmfKDJD1LX88UeucyfqWP56/hc6UGSAUF++HeKEzZQYIxcV7JUDoTJkBQnHxXk4QOlNm gFBcvNckhM6UGaDESbsSJ+1KnLQrcdKuxEm7EiftSpy0K3HSrsRJuxIn7UqctCtx0q7ESbsSJ+1K nHQocdKhxEmHrAn6Y33pgrNQ2els+df7fzzcvf3wcP/l4beX17DSlPArCqN/KInZoSRmh5KYHUpi diiJ2YGEoQMJQwcShg4kDB1IGDqQMHQgYehAwtCBhKEDCUMHEoYOJAwdSBg6kDB0IGHoyG1/hn+8 //3927tPf3x88/Dl7vTPlE73m+Wza889ev7x8OXr+83t09Xl4qXXfxoeL3r2t+1d+m3hcKz/trWL 19744xccvtv/82a8dIsUqpvV4ku+Hfaw+Avp357/g/mz+fXuf/zP/e/tf+7NH9/uvv314cvD3fuv 8w9v/+63h3+8f/vw0vTT5293X6bF+28f7/+OPnta3qBiq9XJ6/VcxNHjpdfvz+NFz//2vb1ZOCzh wCyRV2WPFz1Pivrbu4VDW/9tXwTx47V/+vTw+/239/94+PPd1/f/8XD3l95SHfOHPrd08o3BHHVp TG4hepaUuv5SdXU30a9LaReWbfXNIw+TedGzfzAECXDhIVEWN9dOgU/5eNELh4uHgaWIP/QTaOvc +u2dLz4G+uGDVijEkR56ID30INNGphXaSiFydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBy diBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiBydiiFukMp1B1K oe5QCnWHUqg7lELdoRTqDqVQdyiFukMp1B1Koe5QCnWHUqg7lELdoRTqjstC3QNlnicP5zbLPxsd KAD96uRXm1hx6OZ7g2MFpKPfal1aeu3XGoGvBUpTVz8WK1tdiaPN8j8evny+O7frPpcx0kh70+7t X355uP/w7f3Hh/82L9j/5fXP++3z3ebu+Qn+dPeX/S8//ZVv91/2RuTnJuWP61JO83lYLHtNVszs v9x9fvduc5qzpzZGT/Mf5txzqJX594LdL63TX1xx8x4eK/tdCc3/rxUEL0TFu89/fHqxBuncWn5b 8HmH3zzc3d9tgfGXLTKmgw8PgXU8VII8muLL4uQrM7zkwLc6VNwUPI6fOzn+rUrgWx0qmx79VuuC 6s2vhYutt78uLcgefbCW3Go/nU7hp6uHnq4+n66Pf+bxifnt8+e7D/dffp+rdH7Y3uWSvNlcsrnQ b2eKf7vb/+/t1/3RJqVem/f5EM7mo4zwY9ZvPmY9cA9oefvwPUjew+tf1+u/Ob//9u3L+fs+rl8v i28+HXy8/+e/p8Bm4VipXr5NuLjdfH5d5Kc8eZkpmX3+ntdso34Pspq34VRjWDS42s3gaoGlPfSO 4rUP2MB+91/1juNKMryI1/nD+/KzjwPxeuiVyisX1QI7tUOvZF77eVLg89BXOof363PTnFrLPfzD YvnAg2344vvneKAce0l1ZTfBXl8dXs3ea8m59vDPxPMPvf6ZthJ5clY/jVRyHdl63dLm8SbE5jft X/jGA9MCG0D81k9X/1C2zxnK9jlDOBF0f6ModKasTSrFoUMpDh1KcehQikOHUhw6lOLQoRSHDqU4 dCjFoUMpDh1KcehQikOHUhw6lOLQoRSHDqU4dCjFoUMpDh1KcehQikOHUhw6lOLQoRSHDqU4dCjF oUMpDh2oH9RA/aAG6gc1UD+ogfpBDdQPaqB+UAN1dhqos9NAnZ0G6tE0UI+mgXo0DdSjaaAeTQP1 aBqoR9NAPZoG6tE0UI+mQbotlRPptjStwF2eVuAuTytwl6cVuMvTCtzlaQXu8jbiFFmBJ8C0QrFB 2i9NKxQbREI2rVBsEAnZtEKxQSRk0wrFBpGQTSsUG0RCNq1QbBAJ2bRCsUEkZNMKxQaRkE0rFBtk tuD2q0KsiHJr/g+KDTJbcP4Pig3yBnr+D4oNMltw/g+KDTJbcP4P456V53tl65uhbH0zlK1vhrL1 zVC2vhnK1jdD2a1mKLvVDGW3mqFsMDOUDWaGssHMUDaYGcoGM0PZYGYoG8wMZYOZoWwwM5QNZoaw J8x+gBU60wXtftwVOtMF7X44FjrTBe1+lBY60wXtfvAWOlNmgLAvzH56FzpTZoBQoLWXAITOlBkg FGjtdQShM2UGCAVaezFC6EyZAUKB1l7REDpTZoBQoLWXRYTOlBkgnKS411Z0zoSTFPdKjNCZMgOE kxT3co7QmTIDhJMU95qQ0JkyA4STFK2TQqB1Ugi0TgqB1kkh0DopBFonhUDrpBBonRQCbZt8SaxA kdi2WZbECsUGaapjnTTVsU6a6kwrFBukqY6hcZSGxlEaGkdpaByloXGUhsZRGhpHaWgcpaFxlIbG URoaR2loHKWhcZSGxlEaGkdpaByloXGUhsZRGhpHaWgcpaFxlIbGURoaR2loHKWhcZSGxlEaGkdp aByloXGUhsZRGhpHaWgcpaFxlIbGURoaR2loHKWhcZSGxlEaGkdpaByloXGUhsZRGhpHaWgcpaFx lIbGURoaR7mfv4SHOd05fz+tCZ3pzvn72U7oTHfO30+CQmfKc77pKl37cVLoTJkBlyWx7EwqdKbM AKHkcz/YCp0pM0Ao+TTlPFBTzgM15TxQU84DNeU8UFPOAzXlPFBTzgM15TxQU84DNeU8UFPOAzXl PFBTzgM15TxQU84DNeU8UFPOAzXlPFBTzgM15TxQU84DNeU8UFPOAzXlPFBTzgM15TxQU84DNeU8 UFPOAzXlPFBTzgM15TxQU84DNeU8UFPOAzXlPFBTzgM15TxQU84DNeU8UFPOAzXlPFBTzgM15TxQ U84DtU6kwtaJVNi2CZ/EitRWBxEY2yACYxtEYGyDCIwNDdG0QQTGNojA2AYRGNsgAmMbRGBsgwiM bRCBsaEZlYZmVBqaUWloRqWhGZWGZlQamlFpaEaloRmVhmZUGppRaWhGpaEZlYZmVBqaUWmDCIxt EIGxDSIwNjQa0gYRGNtAXOFAXCFqcW2oKbMNxBWi6YM2EFc4EFc4EFeIusDaQFwhattpaFifoWF9 hob1GRrWZ2hYn6FhfYaG9Rka1mdoWJ+hYX2GhvUZGtZnaFifoWF9hob1GRrWt5+/hIc5ZQViKCsQ Qu3tfrYTOhNWIIZQe7sfEIXOhBWIIdTe7qdMoTNhBgyh9nY/quqcCbW3+8FW6EyZAULtrSmHI5py OKIphyOacjiiKYcjmnI4oimHI5pyOKIphyOacjiiKYcjmnI4oimHI9qV4YisviB0pswAofbWrox8 Y7ULoTNlBiiZ3CszvlhdROhMmQFKJvfKGCJWcxE6U2aAksm9MqaG1XOEzpQZoGRylWNYTDmGxZRj WEw5hsWUY1hMOYbFlGNYTDmGxZRjWEw5hsWUY1hMOYbFlGNYbCBd7kC63IF0uQPpcgfS5Q6kyx1I lzuQLncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC4XjQUxNBbE0IAPQwM+DA34MDTgY1qhu4wUtmgs iKGxINMK3WWksEXDRAwNEzE0TMTQMBFDw0QMDRMxNEzE0DARQ8NEphWKDUIIOhpB4mgEiaMRJI6G iTgaJuJomIijYSKOhok4GibiaJiIo2EijoaJTCvwBHA0FsTRWBBHY0EcDfhwNODD0YAPRwM+HA34 MOW4SFOOizTluEhTjos05bhIU46LNOW4SFOOizTluEhTjos05bhIU46LNOW4SFOOizTluEhTjos0 5UAVUw5UMeUMFFPOQDHlDBRTzkDZT6hCZ8qgVcr9lANV9tOv0Jnysa2U+ymns5hyOospp7OYcjqL KaezmHI6iymns5hyOst+9Bc602WAK0e9uHLUiytHvbhyOosrp7O4cjqLK6ezuHI6iyuns7hyOosr p7O4cjrLXjwROlMGrRDqdOVAFVfOQHHlDBRXzkBx5QwUV85AcTTs1dGwV0fDXh0Ne3U07NXRsFdH w14dDXt1NOzV0bBXR8NeHQ17dTTs1dGwV0fDXh0Ne/UT0WJOKxQbRIs5rVBsEC3mtEKxQbSY0wrF BtFiTisUG0SLOa1QbBAt5rRCsUG0mNMKxQbRYk4rFBtEizmtUGwQlmxaodggLNm0QrFBWLJphWKD sGTTCsUGYcmmFYoNwpJNKxQbhCWbVig2CEs2rVBsEJZsWqHYIDMephWKDUKgTSsUG4RAm1YoNgiB Nq1QbBACbVqxc4qy0iXUwblyBqUrZ1C6cgalK2dQunIGpStnULpyBqUrZ1C6cgalK2dQunIGpStn ULpyBqUrZ1Du512hM2UGCHVw+6FZ6EyZAUId3H7yFjpTZoBQB7cf33XOhDq4/bAvdKbMAKEObq8Y CJ0pM0Cog9vLDkJnygwQ6uD22oXQmTIDhHzpXgAROlNmgJAv3asoQmfKDBDypXspRudMyJfuhRuh M2UGCPnSvfojdKbMACFfupeQhM6UGSCEVfc6lNCZMgOEsOpezBI6U2aAEFbdK2JCZ8oMIArOaYVq q0TBOa1QbZUoOKcVqq0SBee0QrVVouCcVqi2ShSc04rERkIKzoQUnAkpOBOZ8TCtSGwkpPtMSPeZ kO4zId1nQrrPhHSfCek+E9J9JqT7TGTGw7RCsYHUogmpRROZ8TCtUGwgjWlCGtOENKaJaEynFYoN xBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUmxBUm xBUmxBUmxBUmxBUmxBUmxBUmxBUmxhUKxYL7sUznTCgW3A9xQmfKCoRQLLifBIXOlBUIoVhwP04K nSkzQCkWTEqxYFKKBZNSLJiEsyn2867QmTADklJ5mJTKw6RUHial8jAplYdJqTxMSuVhUioPk3A2 xX7YFzpTZoBSxpiEsyn2QoLOmVITmZSayKTURCalJjIpmdykZHKTkslNSiY3KZncpGRyk5LJTUom NymZ3KRkcpOSyU1KJjcpmdykZHKTkslNSiY3KZncpGRyk5LJTUomNymZ3KRkcpOSyU1KJjcpmdyk ZHKTkslNSiY3IV1uQrrchHS5CelyE9LlJqTLTUiXm5AuNyFdbkK63IR0uQnpchPS5Saky01Il5uQ LjchXW5CutyEdLkJ6XIT0uUmpMtNSJebkC43IV1uQrrchHS5CelyE9LlJqTLTUiXm5AuNyFdbkK6 3IR0uQnpchPiChPiChPiChPiChPiChPiChPiChPiChPiChPiChPiChPiCjPiCjPiCjPiCjPiCjPi CjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPjCpWayKTURCalJjIpNZFJqYlMSk1kUmoi k1ITmZSayKTURCalJjIpNZFJqYlMSk1kUmoik1ITmZSayKTURCalJjIpNZFJqYlMSk1kUmoik1IT mZSayKTURCalJjIpNZFJqYlMSk1kUmoik1ITmZSayKTURCalJjIpNZFJyeQmJZOblExuUjK5Scnk JiWTm5RMblIyuUnJ5CYlk5uUTG5SMrlZyeRmJZOblUxuVjK5WcnkZiWTm5VMblYyuVnJ5GYlk5uV TG5WMrlZyeRmJZOblUxuVjK5GelyM9LlZqTLzUiXm5EuNyNdbka63Ix0uRnpcjPS5Waky81Il5uR LjcjXW5GutyMdLkZ6XIz0uVmpMvNSJebkS43I11uRrrcjHS5GelyM9LlZqTLzUiXm5EuNyNdbka6 3Ix0uRnpcjPS5Waky81Il5sRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gR V5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5gRV5iVmsis1ERmpSYyKzWR WamJzEpNZFZqIrNSE5mVmsis1ERmpSYyKzWRWamJzEpNZFZqIrNSE5mVmsis1ERmpSYyKzWRWamJ zEpNZFZqIrNSE5mVmsis1ERmpSYyKzWRWamJzEpNZFZqIrNSE5mVmsis1ERmpSYyKzWRWcnkZiWT m5VMblYyuVnJ5GYlk5uVTG5WMrlZyeRmJZOblUxuVjK5WcnkZiWTm5VMblYyuVnJ5GYlk5uVTG5W MrlZyeRmJZOblUxuVjK5WcnkZiWTm5VMblYyuRnpcjPS5Waky81Il5uRLjcjXW5GutyMdLkZ6XIz 0uVmpMvNSJebkS43I11uRrrcjHS5GelyM9LlZqTLzUiXW5AutyBdbkG63IJ0uQXpcgvS5Rakyy1I l1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdY EFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYGFeo1ERm pSYyKzWRWamJzEpNZFZqIrNSE5mVmsis1ERmpSYyKzWRWamJzEpNZFZqIrNSE5mVmsis1ERmpSYy KzWRWamJLEpNZFFqIotSE1mUmsii1EQWpSayKDWRRamJLEpNZFFqIotSE1mUmsii1EQWpSayKDWR RamJLEomtyiZ3KJkcouSyS1KJrcomdyiZHKLksktSia3KJncomRyi5LJLUomtyiZ3KJkcouSyS1K JrcomdyiZHKLksktSia3KJncomRyi5LJLUomtyiZ3KJkcouSyS1Il1uQLrcgXW5ButyCdLkF6XIL 0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rakyy1I l1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgrjCgrjCgrjCgrjCgrjCgrjCgrjC grjCgrjCgrjCgrjCgrjCgrjCgrjCgrjCgrjCgrjCgrjCgrjCgrhCQ1yhIa7QEFdoiCs0xBUa4goN cYXGuEKlJrIoNZFFqYksSk1kUWoii1ITWZSayKLURBalJrIoNZFFqYksSk1kUWoii1ITWZSayKLU RBalJrIoNZFFqYksSk1kUWoii1ITWZSayKLURBalJrIoNZFFqYksSk1kUWoii1ITWZSayKLURBal JrIoNZFFqYksSk1kUTK5RcnkFiWTW5RMblEyuUXJ5BYlk1uUTG5RMrlFyeQWJZNblExuUTK5Rcnk FiWTW5RMblEyuUXJ5BYlk1uUTK4pmVxTMrmmZHJNyeSaksk1JZNrSibXlEyuIV2uIV2uIV2uIV2u IV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2u IV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIa7QEFdoiCs0xBUa4goNcYWG uEJDXKEhrtAQV2iIKzTEFRriCg1xhYa4QkNcoSGu0BBXaIgrNMQVGuIKDXGFhrhCQ1yhIa7QEFdo iCs0xBWaUhNpSk2kKTWRptREmlITaUpNpCk1kabURJpSE2lKTaQpNZGm1ESaUhNpSk2kKTWRptRE mlITaUpNpCk1kabURJpSE2lKTaQpNZGm1ESaUhNpSk2kKTWRptREmlITaUpNpCk1kabURJpSE2lK TaQpNZGm1ESaksk1JZNrSibXlEyuKZlcUzK5pmRyTcnkmpLJNSWTa0om15RMrimZXFMyuaZkck3J 5JqSyTUlk2tKJteUTK4pmVxTMrmmZHJNyeSaksk1JZNrSibXlEyuIV2uIV2uIV2uIV2uIV2uIV2u IV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2uIV2u IV2uIV2uIV2uI12uI12uI12uI12uI12uI12uI12uI12uI67QEVfoiCt0xBU64godcYWOuEJHXKEj rtARV+iIK3TEFTriCh1xhY64QkdcoSOu0BFX6IgrdMQVOuIKHXGFjrhCR1yhI67QEVfoiCt0xhUq NZGm1ESaUhNpSk2kKTWRptREmlITaUpNpCk1kabURJpSE2lKTaQpNZGm1ESaUhNpSk2kKTWRptRE mlITaUpNpCk1kabURJpSE2lKTaQpNZGm1ESaUhNpSk2kKzWRrtREulIT6UpNpCs1ka7URLpSE+lK TaQrmVxXMrmuZHJdyeS6ksl1JZPrSibXlUyuK5lcVzK5rmRyXcnkupLJdSWT60om15VMriuZXFcy ua5kcl3J5LqSyXUlk+tKJteVTK4rmVxXMrmuZHJdyeQ60uU60uU60uU60uU60uU60uU60uU60uU6 0uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU60uU6 0uU60uU60uU60uU60uU60uU60uU60uU60uU64godcYWOuEJHXKEjrtARV+iIK3TEFTriCh1xhY64 QkdcoSOu0BFX6IgrdMQVOuIKHXGFjrhCR1yhI67QEVfoiCt0xBU64godcYWOuEJnXKFSE+lKTaQr NZGu1ES6UhPpSk2kKzWRrtREulIT6UpNpCs1ka7URLpSE+lKTaQrNZGu1ES6UhPpSk2kKzWRrtRE ulIT6UpNpCs1ka7URLpSE+lKTaQrNZGu1ES6UhPpSk2kKzWRrtREulIT6UpNpCs1ka7URLqSyXUl k+tKJteVTK4rmVxXMrmuZHJdyeS6ksl1JZPrSibXlUyuK5lcVzK5rmRyXcnkupLJdSWT60om15VM riuZXFcyua5kcl3J5LqSyXUlk+tKJteVTG5FutyKdLkV6XIr0uVWpMutSJdbkS63Il1uRbrcinS5 FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVW pMutSJdbkS63Il1uRbrcinS5FelyK9LlVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQV VsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVsQVVqUmsio1 kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUmsio1kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUmsio1kVWp iaxKTWRVaiKrUhNZlZrIqtREVqUmsio1kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUmsio1kVWpiaxK TWRVMrlVyeRWJZNblUxuVTK5VcnkViWTW5VMblUyuVXJ5FYlk1uVTG5VMrlVyeRWJZNblUxuVTK5 VcnkViWTW5VMblUyuVXJ5FYlk1uVTG5VMrlVyeRWJZNblUxuRbrcinS5FelyK9LlVqTLrUiXW5Eu tyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVWpMutSJdbkS63Il1uRbrc inS5FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0uRXpcivS5TbEFTbEFTbEFTbEFTbEFTbEFTbEFTbE FTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbEFTbE FTbGFSo1kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUmsio1kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUm sio1kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUmsio1kVWpiaxKTWRVaiKrUhNZlZrIqtREVqUmsio1 kVWpiaxKTWRVaiKbksltSia3KZncpmRym5LJbUomtymZ3KZkcpuSyW1KJrcpmdymZHKbksltSia3 KZncpmRym5LJbUomtymZ3KZkcpuSyW1KJrcpmdymZHKbksltSia3KZncpmRyG9LlNqTLbUiX25Au tyFdbkO63IZ0uQ3pchvS5Taky21Il9uQLrchXW5DutyGdLkN6XIb0uU2pMttSJfbkC63IV1uQ7rc hnS5DelyG9LlNqSwbUhh25DCtiGFbUMK24YUtg0pbBtS2DaksG1IYdsQIdgQIdgQIdgQIdgQIdgQ IdgQIdgQIdgQIdgQIdgQIdgQIdgQIdgQIdgQIdgQIdgQIdgQ69cQtdcQtdcQtdcQtdcQtdcQtdcQ tdcQtdeUisOmVBw2peKwKRWHTak4bErFYVMqDptScdiUisOmVBw2peKwKRWHTak4bErFYVMqDptS cdiUisOmVBw2peKwKRWHTak4bErFYVMqDptScdiUisOmFAk2pUiwKUWCTSkSbEqRYFOKBJtSJNiU IsGmFAk2pUiwKSHVpoRUmxJSbUpItSkh1aaEVJsSUm1KSLUpIdWmhFSbElJtSki1KSHVpoRUmxJS bUpItSkh1abkSpsSBW1KFLQpUdCmREGbEgVtShS0KVHQJkRBaydFx2kFiljTCpQqpxUoSE8rUOCc VqDAOa1AgXNagVLltAKlytpJqXJaobtMBMbTCt1lIjCeVuguE4HxtAJl7GmFYoMIjOsgAuNpRWJj EIHxtCKxMYjAeFqR2BhEYDytSGwMIjCeVig2iMB4WqHYIALjaYVigwiMpxWKDSIwnlYoNojAeFqh 2CAC42mFYoMIjKcVig0iMJ5WKDaIwHhaodgggOS0QrFBAMlphWKDAJLTCsUGASSnFYoNAkhOKxQb BJCcVig2CCA5rVBsEEByWrETh+6Mtx+whM50hYn9OCZ0pqty7Ic3oTNdlWM/6gmd6QoT+8FQ6EwZ tEKN6n66FDpTBq1Qo7ofUYXOdKW5/UArdCbMgCHUqO6nYqEzYQYMoUZ1P1oLnQkzYAg1qvv5XOhM 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 BxE6U2aAkAHeiylCZ8oMEDLAe0VG6EwZZ0IadS/rCJ0p40xIo+61IaEzYZwlJY2alDRqUtKoSUij FqSaK0g1V5BqriDVXEGquYJUcwWp5gpSzRWkmitINVeQaq4g1VxBqrmCVHMFqeYKUs0VRMYURMYU RMYURMYUxLgURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsURKsU RKsURKsURKsURKsUxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0UxJ0URJAU xIIUxIIUxIIUpfahKLUP5Zr24WcR7zT6yeRJuvvuy8PDk3Q3J69ebDtbMUNnhnXb8yDDbdsDDG3v GcQMMzVs1LDfFmP/7OJnMfbZRbLQHO9zKP0sxh6teOvL646LsS9YsaO1MHsu14UCq96XEnj3kVOe e4bgqvdfp6fXecOWl6FFX1mxGsMr1mms1smt5xkUORyd48U6+fKyF984b4exX5YqxwxZseNyQe/2 UpXTMpF7Sa1uLdVjS1VOL5Zq9Y3LiYTU0oqVknR5fEUzFlj0vIzPPn/1PVuslcX+EX5Z9HEaqzwu +cXy9TTy7fhcGLL45F0/NuNLS1VnJp+iS1VeLFVbXvbiG88naw0s1UtDtlTKXZ9Q71eu6f0CN3G5 W9iep/m0jVoI3sRfdwvW515ledmLe+EpP3vOrB7kC0N2E5X7BaGasSjVjOUauXs7Imz1s5NaT3mY j2hE2LOfnTFsLC8jPztLK1alfsU6peU6jbnLHvOK6DqlXzMne2nLhUq3Fmr18FtascK8MDpf86Nj yx+duambT6s+PLrqz350bG6rlpeh6FxZzT90/+H5hXb30zf+Oi/8fDe/8e8Pd3/6+v4/Hu7+/W6M XPo8QPyXu4/3/5z/9zzE/Xn/AM8PkL94/bfzX//r/T8e5mI93H+ZC/XiGvbK5MKNe3ZdvfvL/m/P q3T39dv9l/2OnO/Wpz8+vnn4clfqfCT0uVWYy/X53bvt74cfLvXmItTAIqCa0RX0PRC9bfXMyFbK mBvM8DOj/Rq9Pv/p8jIUvSsr9s4rFiw9Eizzt2ekXkvz48HSbwZLDwQLfYX3imBZHpXnAWGrKoRL CjaeB4stb/vLE28kWFZW7KVlKFj8FAyWYsVPp3Y4WPx0K1jmFTeDBb+DjS1Cii2Cpz5/10Y+vgjp 5iKkwCLQV8q6nYZQ2FKUwpaiFLaUa8KW208ZXx0Ak516azZ3HtGQ+fUAmLe3xqttrKNy8dKKvaF/ xUItf7vnbj3NXUwPL9Svv91pq3wuL0PrJPrtvqJHCqzTqhKeyjzXnJL1aIXX+4t1WsbTzUr4cnVF lfArUqvAOq1+3lMZLVlrLboX9PFsnfxUl5eheBL9vF9Rkd1ep7qsR1ipNn/jU3QbVE/P46mtyowV 1SOWVoy0ecU6reoRuXf3uWM8RfOunn/7//awfba7Nx/ffLv78vnzt7s/zfNp3oflLWLizy93CPPT fP/Mz34arC13oPVlrSL925PVn9Kf775+vP/wYe5svv31/tONr3Bzc4KZJt2v9mXN4fPrYqfpOnKt Hex5a7m13ZtX3F5RSm7FFsFCizB/Yko+ldSPL4LdXIRAXQWDaLFF8NgibCIfHwlEgt9cBA8sAuXq YosQKy61nGqxU07HF+FmcakGiksbJhh4Zq/2lLlvPEvbmKbgJ/51T2mnZQW5oi3lRautQvnf5vUf 77/tZj/u608f6+9fPr/58PDx7n+///bXn654+/nT+S++XNoWWFpEbV1WGD+/LhRfY25lt30aeNLc rEfVQD0KA6WxRRihRUjzMdOzmx1fhHFzEUZgESgfG1qEFiw2jTZ3RWnbFx1chHaz2NQCxSaM+8YW IVRs2qDIUueW/HR8EW4Wm1pgP4fpZd1+TqigL1cU9M+vC96eluauaIAYvbkvaoF9EUa3Y4sQ2xed TinPbDkdf4XQbu6LWmBfhEn02CLE9kWpzR+uXlo9vgg390UtsC/CYH1sEVpoEXIqNkNhgEVoNxch sIPBOoHYIsR2MGlYmktQwTPh5g6mBXYwWPYQW4ToDsZqteHgd+vmDqYFdjBYxRFahB7awcx0yN7y KR9/MPabO5ge2MFgUUpsEWI7mLmB6/Pifjwd+s0dTA/sYOY1K0ak51uMyDYlbf6qHUFEeg58HqTs utxE5fl1kZsyH1D1VE6jHkdE+s2iVg8UteY1y5tyE9zZG5R1O3RTAvso0l63XOkf8/y6WGll5Oqn dDp+9O0391E9sI/CCjFeW++rl6Tda+s+T37Rb//sHek8X64uIlWapRUTxL1ikVbFrF5txkoK4+D9 GduUyvIitEiit6OkF3RBvaDnow99QtJBelqhJz7pO11Q3+mC+k4X1He6oL7TBfWdLqjvdEF9pwvq O11Q3+mC+k6X7V0lsSKxMX+lkRWJjW0QLrFCsZFQbCQUGwnFRkKxkVBsJBQbCcVGQrGRUGwkFBsZ xUZGsZFRbGQUG6gTWEKdwBLqBJZQJ7CEOoEl1AksoU5gCXUCS6gTWEKdwBLqBJZQJ7CEOoEl1Aks oU5gCXUCS6gTWEKdwBLqBJZQJ7CExDAJ9Q9LSHOSUNexhCQLCXUdS4h4TwwRF/aJLco+sftpTehM qYkfyjedwg62RdnBtig72BZlB9ui7GBblB1si7KDbVF2sC3KDrZF2cG2SDvYbuddoTNhBmynY6Ez YQZsZ2mhM2UGJGUGJGUGJGUGJGUGJGUGJGUGJGUGJGUGJGUGJGUGZGUGZGUGZGUGZGUGKHsKJmVP wXSlpyAqgAidKTPgSlMzVEUROlNmwJXeWKgUI3SmzABlf6V0pb8SKvMInSkzQNmBKAlnh+4lJKEz ZQYIZ4fudSihM2UGCGeH7sUsoTNlBghnh+4VMaEzZQagrv0Jde1PqGt/Ql37E+ran1DX/oS69ifU tT+hrv0JKVwT6tqfkPYzIbFkQurChLr2J6Q0S0ialZCWKSHxT0JqmYR6/SfU6z8hwUhCCouEJAkJ MfwJQe8JUeIJYdUJ9fpPiBZOaEJAQhBsQtRoQnMFEporkBBXmBBXmBBXmBBXmBBXmBBXmBBXmBBX mBBXmBBXmBBXmBBXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFXmBFX mBlXqGxxl5Qt7pKyxV1StrhLV1rcoSOf0JmyAnGloRg6NwqdKSsQyj5K6XIfJXYmFTpTZsDl/jjs YCt0psyAyx1K2OlY6EyZAcrOE0nZeSJd7jzBDuRCZ8oMuNxRgJ3qhc6UGXBZKc5KA0Jnygy4LDtm 9QWhM2UGXNGwoiKF0JkyA5RMblIyuUnJ5CYlk5uUTG5SMrlJyeQmJZOblExuUjK5ScnkZiWTm5VM blYyuVnJ5GYlk5uVTG5WMrlZyeRmJZOblUxuVjK5WcnkZiWTm5VMblYyuVnJ5Gaky81Il5uRVjYj TWlGmtKM1KEZqUMz0nlmpPPMSOeZkc4zI51nRjrPjHSeGek8M9J5ZqTzzEjnmZHOMyOdZ0Y6z4x0 nhnpPDPSeWak88xI55mRzjMjnWdGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpG nFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpGnFpWauyyUmOXlUq2 rFRlZaUqKyuFVFkppMpK7VNWap+yUvuUldqnrNQ+ZaX2KSu1T1mpfcpK7VNWap+yUvuUldqnrNQ+ ZaX2KSu1T1mpfcpK7VNWap+yUvuUldqnrNQ+ZSV7l5XsXVayd1nJ3mUle5eV7F1WsndZyd5lJXuX lexdVrJ3WcneZSV7l5XsXVayd1nJ3mUle5eV7F1WsndZyd5lJXuXlexdVrJ3WcneZSV7l5XsXVay d1nI3jma9+RoQJKjiUKORvA4mlnjaMiLn4ga0U9EV+houIajaRR+IrpCPxFdoaN5BY7mFTiaV+Bo XoGjeQWOJg84mjzgaPKAo8kDjmYIOJoh4GiGgKMZAo5mCDiaIeBohoCjGQKOZgg4miHgaIaAo2kA jqYBOJoG4GgagKNpAI6mATiaBuBoGoCjaQCOpgE4mgbgaBqAo2kAjqYBOJoG4GgagKNpAI6mATia BuBoGoAnQolNKxQbhBJzNA3At6Zy24Hgx78+T7j6eP/7+7d3//nu9M86DR7/4enZTPRnO+iyT8P6 4+/fvl8+La9c/Z/OZ5L/9cenv50t/u3T57v/evfw6dv2BRbT13er7ZqbFx0c0b7bnD/NxRFt+zXs wCQ8felOrH5l/iw7dQmdKU+sQrWYX5nPyU50Qme6MotfGa7IjoVCZ8qgFQq8XDl0wZVDF1w5dMGV QxdcOSfBlXMSXDknwa/MSTjwizk6+cWcVrd/MedFh38xx81p2I4GB7pydoMrZze4cnaDK2c3uHJ2 gytnN7hydoMrZze4cnaDK2c3uHJ2gyvHLbhy3IIrxy24ctyCK8ctuHLcgivHLbhy3IIrxy24ctyC K8ctuHLcgivHLbhy3IIrxy24ctyCK8ctuHLcgivHLbhy3IIrxy3sRS2hM2UGCJFjV45bcDQ+09H4 TEfjMx2Nz3Q0PtPR+ExH4zMdjc90ND7T0fhMR+MzHY20dDTS0tFIS0ct+R215HfUkt9RS35HLfkd teR31JLfUUt+Ry35HbXkd9SS31FLfkct+R215HfUkt9RS35HLfkdteR31JLfUUt+Ry35HbXkd9SS 31FLfkct+R215HfUkt9RS35HLfkdteR31JLfUUt+Ry35HbXkd9Rc31FzfUfN9R0113fUXN9Rc31H zfUdNdd31CbfUZt8R23yHbXJd+VYOFeOhXPlWDhXjoVz5Vg4V46Fc+VYOFeOhXPlWDhXjoVz5Vg4 Vw5fc+Xwtf1IJ3SmjDOhANGVzf9d2fzflc3/Xdn835XN/13Z/N+Vzf9d2fzflc3/Xdn835XN/13Z /N+Vzf9d2fzflc3/Xdn835XN/13Z/N+Vzf9d2fzflc3/Xdn835XN/13Z/N+Vzf9d2fzflc3/Xdn8 35XN/13Z/N+Vzf9d2fzflf36Xdmv35X9+l3Zr9+V/fpd2a/flf36Xdmv35Ut9l3ZYt+VLfZd2WK/ IRFVQyKqhkRUDYmoGhJRNSSiakhE1ZAcqiFhU0MSpYbERg1REA3xDA2RCQ2RCQ2RCQ2RCQ2RCQ2R CQ2RCdMKVLmnFbvLoMrdEAXREAXREAXREAXREAXREAXREAXREAXREAXREAXREAXREAXREAXREAXR EAXREM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/QEM/Q lEx9UzL1TcnUNyVT35RMfVMy9e0KU7/91x/6/fTm/u6ZeG8zvvvTb/ff7jc94N/+fPfm45snCWI6 We4197mJ2/sCPF208nFLAPiK449unYQcfVOi701JqzcluNGUrEVT4hFNiUc0JR7RlHhEU+IRTYlH NCUesZ8Uhc6kQasspAnBjaYEN5oS3GhKcKMpwY2mBDeaEtxoSnCjKcGNpgQ3mhLcaEpwoynBjaYE N5oS3GhK1qIpWYumZC2akrVoStaiKVmLpmQtmpK1aErWoilZi6ZkLZqStWhK1qIpWYumZC2akrVo StaiKVmLhvQf0wodlIlqpCHVSEOqkYb0Hw3pPxrSfzSk/5hW6C4T1UhDqpGGVCMNqUZaJg2XpxWJ jUwaLk8rEhuZNFyeViQ2Mmm43DJpuNwyabjcMmm43DJpuNwyabjcMmm43DJpuNwyabjc0Jj3hsa8 Tyt0l0nD5YZGyk8rFBuIFcqIFcqIFcqIFcqoWJ5Jw+WWEWGUScPllhGXlEnD5ZYRzZRJw+WWEQO1 TbIkVuguk54uLSNyKiNyKiNyKiNyKiNyCg29b2jofVOi1fuRQuhMeeAVctpNyWk3JVrdlGh1U6LV TYlW70choTNl0Ao57abktJuU087CFrf7oUzoTJgBWdjidj/ZCZ0JMyALW9zux0OhM2EGZGGL2/2M KXSmDFphi9v9oCp0pgxaYYvb/bQrdKYMWmGL2/3ILHSmzAAljpeVOF5W4nhZieNlYYvb/UwvdKbM AGGL270wIHSmzAAl55eFLW73ooPQmTIDhN2e9sqFzpmSQMxKAjErCcSsJBCzkkDMSmgwC6HBgTQn A2lOBtKcDKQ5GUhzMpDmZCDNyUCak4E0JwNpTgbSnAykORlIczKQ5mQgzclAmpOBemgOxFAMxFAM xFAMxFAMxFAM1HlzIPJiIPJiIPJiIPJiIPJiIPJiIPJiIPJiIPJiIPJiZEJeDEReDEReDEReDERe DEReDEReDEReDERejJxQbBBeYyBeYyBeYyBeYyBeYyBeYyBeYyBeYyBeYyBeYyBeYyBeYyBeYyBe YyBeYyBeYyBeYyBeYyBeYyBeYyBeY1yj/39Wnn55+P2PD/dfXhjfvf1w//7j17s/vj789ihgzTaa +S5t2oZrzr/6/tPvd58e/nmeY7kNwHzxEbY/+2k3/3o30zDV5WVPH/TLw/bFvn2+O50Nn1ynqBU7 cUbWaRr9ZPK0Ou++PDw8rY6fqrXctk4hzNCZYd8YG2bIPmrZBvIyw23DTQz35z4zZEdNXV1rXBOo XPpKLS2/0rmP/HZCYoZXbts1w5apYblyv68Z9nolGa4b1sjz7YeLn59vZxdjnqxjz7d5Y395vtVk eXkZeb4trVi9iv8OtLxeJyu9l/DvwPwIz9fJlpehdVpZsQrd4Swty0C0Pj9UbVeeytcNrzyVrxn2 7ezJDDMzHFefC9cMnz8XLkRfWUaf9XlgrjmcpeVF9PnyshdxNM/K/dcAXKb3S0NWWL78XuDiGtty jWd+1mJ2LRyuGl4LhyuG7tdC/qqhhcLBluGwu6j9FA0Hiz20DT2MVlashC/cf1x+R3TxbtXl3dpA meGlUsMrm7hrhvVqKF81zKHAqsvA2l20Gg6s+mtgjdNY/srVW4G1DMeVFXtf84rdQFuu0/z9KNnm ozK4Tu3FOrXlZWidVlbsDdUr1ml5evax5UAeNbpOz07PI6VlPKHT89KKvZN7xTqN9Tr1Pk4bWhBc p/EinpbfeKB1Wlmxt5B8nfpptU51gzm6naLr1E+/rJPN/WJfXnZrnVa7p6UVe+/6inVanupqznNT vbXxCq7Ts1PdGGX1fOroVLe0Ym+aX7FOy1Pd/JWt8/E0oqe6np+vky8jA53qllbs3for1ml5/qhW rRQ7RX/venm+TvW0vAyt08qK0QS6DecVsdWlXVz31S6u1vlve/MrVaTrhlf2jZcNLXe7UmK7bnjl RHzZ0D1dq8VeN7xSKbtiOOxaGfG6IfqO3byi77gZou84DduVE8d1wx56QPjyAbG7aKdogWKmyy8/ zHkelMbyOrIjXloxBuhwUi+PZnWDgMtI15L6quG1pL5oWEotV+oa1w2v1DWuGJ77vzPDUBW7L8+t u4u+HUeD4ffs3GrTfHkZ+n0SnVuvqGQvLnBbL/CwcfJ6LYiuGl4LoiuGV1++XDW89s7smmHP1x5+ Vw1jD79lNeDsYlj44deeR19enkpuVgOW0SeqBlyRVQfWaVkNqL1tNewaXqceW6eb1YDlb4SoGnBF MX4xEJcvb+vop9b7tYLhdcNre5trhv3ao/6q4bW9zRXDcXWLctUwlqXLGsvuYv4Eh6NvvIi+5Zn4 Zo1lGX2iGsuVUXCXFnicVgvcTnme0SxdeWJfNcyht1tjWdU5u/AUPYWPX6s6pXdf/nyPm2WdsBVD pvkDdCzLOi3NT5dKfKGelXXmMq1+MgYq6yytGCSuO4ZfaWxxMayXL21bHimX07X3gtcNS+g2L6st jy5a+DaX57fZljcMVVuWVozPP3xnlu9PW906plq+8uNz3fDKAeWq4TW64bph6FXvWL7qPbuo4Yr3 sFjKo1e9SyumujgcC8vKxVzckzXvV/YT1w1D+4mxLHnsLnoPv9sav5Y8Rul5VTseNyseyzsjqnhc 6ZgTWKfl2bzNLW2aB7Pw0+zZ2Xw+CFe144HO5ksrpuU5HMHL42fbPlNq5crZ/Lph6G3/WJ5bzy66 hyO4xe4MOrcurZhe6hURvDy39nm232I4enIY/fk69eU3Rm+xl1ZMISbbdl1rGnUhqqfJKqp7Sf3k 1i//Rt8wvMzpXDHc6O7LB5+rhuMUOfj85OKXwDq7iO7nt2V+Flg1Larm8zoQWWsrpgfEGTj/f+uF 6rXbqYQX6teDT9r4yeVlaJ00B59r/cwC67R8n92t1hb/rd0+wvN1WsbTzffZy9XVvM9WtmobylZt 40qrtvN1p3+2fjr9dsr+5uP93x9v0umf92/N3qZ378538OG3/3L39dv9t4e791/vIqfG+WeX9767 p3h9a/vwvz5M5jllGe4vt5bp356s/pT+fPf14/2HDw9f7r799f7TjT949nNxxN8rNLfCm/oKXHAa L26Nj03Q1uNZ+es+a/5GLJOSbLPWVkx6LFxy5V4kCXVMyl6A41ovwEtbj5QXW49aT3ba3rdDO6Zd fgVVNI0XaVHn55mbtihEu32CXx5YeRXfiRS51lZMTP6KRVoVgGrL1eavSHiRfq3/lLF6dCRS/Vlb Me38KxZp9dtX+6nMUIrKY7ZP8PMi+QpOmxehRdIUYq71wAws0qoQU7eeANvb/Ogi/VqH8bba4yVS hVlbsc4Ir1ik1U91Hc23PVSw3Lp9gmdy7+VFaJFEv9RXepZe/PXoi1+Pvv3bfv1X55rdlSP9Rbs6 97SXa7vX7Wj/i8OLtXph3bOXOurz4kDYjrXGUO58hD1gh7IH7FD2gB3KHrDjWg/Y28+jvPpl6808 txIVZG2f4Jfn0apAOy8iz6OlFWt08opFWv2yjdPW8yC+kcy//rKldREto5+2pRVr7HL0QZRX7wm2 f2wljytP0at2kRdkP3n4+a7sHiy8KcvPTr3VV7+lGf2WLq1Y4xzh00J56hV2Px7Xuh/fDoayquAO P5VaTuFjTHlGrqQFqTMvIrGwtCKLhBpRkeFQAw2HGmg41LRCjajISKlphTZpZBDVQIOoBhopNdBI qYFGSk0rdJfJIKqBBlFNK3SXDd1lR3fZ0X7bUWw4ig1HseEoNhzFhqPYYMc0R7FRUWxUFBsVxUZF sVFRbFQUGxXFRkWxgdqpZ9ROPaN26hm1U8+onXpG7dQzaqeeUTv1jNqpZ9ROPaN26hm1U8+onXpG 7dQzaqeeUTv1jNqpZ/b6CLVTz6idekbt1DNqp55RO/WM2qln1E49o3bqGbVTz6idunI+zlDOxxnK +ThDOR9nP6UJnQmHoGxnOqEzZY1EOLlnKIftDOWwnaEctrOfLoXOlEGrnNyzHVGFzpRB68qgdeVL HVdmgCszwJUZ4MoMcGUG+Gtef/tSEmDbu+8clrJvHyHQSGFeRgDSpRWrMQgXXZncVZncVZncVZnc VZncVZncVZncVZncVfnzdmUwAiqw8MdOXWvz27Dmo0ZfD9UR4tYr6X+4tmIlJd2iBxvqrxd93fp9 a4hQPUe7COf2QlTRFg0RMmr9vrZitbVXrNNSVLGNfZ7fNYfXKb8E61cYxqKLex71WfftVVgvDFnl 7TVI77pR+Sb2tFHDQp3njcrXcuW86DceiSkR1RvsUn5hnday7l16GZZ15+cdvL2sxglk1MF7bcWq xsIH3mswoXV367NG0MO/Ms+7W18KTgQKibpb5yvdrVFVXehMuVO+0kwYleaFzpQ75Su9W1F9X+hM mdxXGiuilwT8SbHs6Nbz6dTzNnQo9qDoz9G10X0x9SsverP5aVO13jwKLyzZ66VXqOPzsqvbGe8O jybJz5q6pVOfv2XL60jJQNTVLV/p6obeEQmdKZ9dyt5L+UrvJfT+iQfqspVOSr21VE7hSH3WSifZ 1qF/eR2JVFEvnXyll85BZzmRUaOb1fH3rZvV8fet0wqMGt2sjj8sN6vj71s3q+PvWzer4+9bN6vj 71s3q+Onxc0KxQYYNbpZodgAo0Y3KxQbgP7drFBsAPp3s0KxAejfzQrFBqB/NysUG4D+3axQbABm eLNCsQGY4c0KxQZghjcrFBuAGd6sUGwAZnizQrEBmOHNCsUGYIY3KxQbgBnerFBsAGZ4s0KxAZjh zQrFBmCGNysUG4AZ3qxQbABmeLNCsQGY4c0KxQZghjcrFBuAGd6sUGwAZnizQrEBmOHNCsUGYIY3 q/O7xh//+nyc/Hj/+/u3d//57rQdQx87O+3HvIvnnXPjhT/+/u375dPyytX/6Xyq+19/fPrb2eLf Pn2++69380S5ffxf/tJPVts1Ny/6+5fPbz48fLz73++//fWnK95+/nQ+sJ4Vor9+nPOnudS76XwN OQbK6tfnk6jQmawGdD63Cp3JakDnU67QmawGdD4TC50p6yRXNOzAmTIDdArl8zFc50ynUD4f2oXO lBmg48/PJ3+hM2UG6Pjzc/lA6EyZATr+/FyDEDpTZoAOZj8XMoTOlBmgg9nP1RChM2UG6GD2c0lF 50wHs58LMEJnygzQweznKo7QmTIDdDD7uRQkdKbMAB3xfa4nCZ0pM0BHfJ+LUkJnygzQEd/nypbQ mTIDdMT3uTymc6bDos/FNKEzZQZcgWuBM2UG6DDNc/1O6EyZATqW8VwE1DkD/QQ2K1Q3Bv0ENitU Nwb9BDYrVDcG/QQ2K1Q3Bv0ENiv0TgH0E9isUGyAfgKbFYoN0E9gs0KxMVBsDBQbA8XGILFRTiQ2 Cuglu1mR2CgnEhvlRGKjgFERmxWJjXIisVFOJDbKCcVGQrGRUGwkFBsJxUZCsZFQbKAXWAUxkwUx kwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUxkwUx 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 d7miu1zRXa7oLld0lyu6yw3lckOx0VBsNBQbDcVGY2cHnbx4PyoJnenkxfvBSuhMJ7Dfj2FCZzqB /X5o0zkTdrjZj3hCZ8oMyMoMEPbe2Y+PQmfKDBA28tnPoEJnygwQNvLZD7JCZ8oMEDby2U/DQmfK DBB2BdqP1EJnygy43GKIncuFzpQZIGwztB/uhc6UGSBsM7RXCITOlBkgbDO0lxl0zoRthvaihNCZ MmiFnYH2yobQmTJoXRm0rgxavxy099/ut+YMf5sWd18efv/jw9Nk0B+H8dPTxNE/vj78dvfmw+e3 f7tL2fvcXM3fg8fWcO8//X736eGf3x4+ffu6OXzhZH+Z92m3/npXlpf8Ojfo2+e78+vH724PWW3t D/7bY9uJzezH2vz0mf7+5fObDw8f7/73+29//emKt58/nf/is34Vu82N2UT7NaxGpbvhVfkDVpXP gqp8FlTls6AqnwVV+SyoymdBVf6ANeUPWFNmQFNmQFNmQFNmQNNlQEMProaK6w0V1xsqrjdUXG+o uN5Qcb2h4npDxfWGiusNFdcbKq43VFxvqLjeUHG9oeJ620apEysUGw3FRkOx0VFsdBQbHcUGAcTa NkOYWKHY6Cg2OoqNjmKjo9gYKDbIeM+Gxns2NN6zofGeDY33bGi8Z0PjPRsa79nQeM+Gxns2NN6z ofGeDY33bGi8Z0PjPRsa79nQeM+Gxns2NN6zofGeDY33bGi8Z0PjPRsa79nQeM+Gxns2NN6zofGe DY33bGi857RCsUFA4GnFzim603RT1pOasp7UlPWkpqwnNWU9qSnrSU1ZT2rKelJT1pOasp7UlPWk pqwnNWU9qSnrSU1bT2rKDGjKDGjKDGjKDOjKDOjKDOjKDOjKDOjKDOjKDOjKDOjKDOjKDOjKDBjK DBjKDBCOAG7KEcBNOQK4KUcAN+UI4KYcAdyUI4CbcgRwU44AbsoRwE05ArgpRwA35QjgphwB3JQj gJtyBHBTjgBuyhHATTkCuClHADflCOCmHAHclCOAm3IEcFOOAG7KEcBNOQK4KUcAN+UI4L30JXSm zAChQKIZEdI3I0L6aYVqq0RI34wI6ZsRIX0zIqRvRoT0zYiQvhkR0k8rFBtESN+MCOmbESH9tEKx QYT0zYiQvhkR0jcjQvpmREjfjAjpmxEhfTMipG9GhPTNiJC+GRHSNyNC+mZESN+2GbjECsUGkd83 I/L7ZkR+34zI75sR+X0zIr9vhrhCQ1yhIa7QEFdoiCs0xBUa4goNcYWGuEJDXKEhrtAQV2iIKzTE FRriCg1xhYa4QkNcoSGu0BBXaIgrNMQVGuIKDXGFhrhCQ1yhIa7QEFdoQoH6fiwTOlNWIIQC9f1s J3SmrEAIBer7AVHoTFmBEArU91Om0JkyA4QC9f2oKnSmzAChQH0/7wqdKTNAKFDfD81CZ8oMEArU 95O30JkyA4QC9f34rnMmFKjvh32hM2UGCNXue8VA6EyZAUK1+152EDpTZsAVtTuqXQidKTNAyeSa ksk1JZNrSibXlEyuKZlcUzK5pmRyTcnkmpLJNSWTa0om15RMrimZXFMyuaZkck3J5JqSyTUlk2tK JteUTK4pmVxTMrmmZHJNyeSaksk1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMs1pMt1 pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pMt1pLB1pJV1 pJV1pHp1RO05ovYcUXuOqD1H1J4jas8Rf+eIv3PE3zki6RwxcY6YOEdMnCMmzhET54iJc8TEOWLi HDFxjpg4R0ycIybOERPniIlzxsRd0fPdavG5GS9afM4f7XbyPm9OpMXn/gm2v/rU4jMtL3n6jN+b dZ5+bfEZtmIHpVcs0VgtUT6dhs01ii7RuL1EAy3RyoqdCvkSjVWj2Pkz2LdBpy24RON0c4nGy5av gSVaWrEj8CuWKK2WqNTe0qaSCS5Rur1ECS3Ryoqd91+xRHm1RDY3fGO0HF2ifHuJMlqilRUrbrxi icpqibbeur27R5eo3F6igpZoZcUqOa9YIlstUc2n0nKLNa3eP8HNJTK0RCsrVrZ6xRL5aonaybL3 EX4W+e0lcrREKytWo3vFEtXlEvWerJ1O0SWqt5eooiVaWbGC5CuWqK2WqLeZaadgd/j9E9xcooaW aGXFqq+vWKLl7nq4j3zK4Si6vbseaHe9tGKl5lcs0Wp3XWcA9VO3cBTd3l0PtLteWrG6Ol6iabxa opRLHVvHjtASbZ/gxhLNS8ASra3YS4RXLNFqdz1/81stowS3jtsnuLlEZHe9tmJvTF6xRKvddc2j jjZK8Ed/+wQ3l4jsrtdW7PXQK5ZotbuupfdcUwo+i7ZPcHOJyO56bcXehb1iiVa763n6OFXb+gEG l+jm7npegpZIs7v2K11gAku02l1XrzOGeunRJbq5u56XoCXS7K79Sm+bwBKtdte1llPOJZ5oN3fX 8xK0RJrdtV/p2BNYotXuurZsef6ihX/0b+6u5yVoiTS7a7/ShyiwRKvddW3z92zMK6JLdHN3PS9B S6TZXfuV7kqBJVrursfMs1ZOwdr19gluLhHZXa+tGJnAlygtd9djI4ZHjz6L0u3ddUK766UVwzBe sUSr3XU71Zxtw+CCS3R7d53Q7nppxZiTVyzRanfdUjmVvLXQDi7R7d11QrvrpRUDbF6xRKvddcvJ cirRYsj2CW4uEdpdL60YTfSKJVrtrlseo/dRor9o6fbuOqHd9dKKoVOvWKLV7nrrdzx/9lv0GJtu 764T2l0vrRgn9oolWu2uNzlNr71Ff/TT7d11QrvrpRWD4l6xRKut43wOndqpbzPtg2t0e++Y0N5x acUQQL5GeTn9tbXTKbW5wQ6uUb69M8poZ7S0YsDjK9ZotTOa/3x0n/vr6NYo394aZbQ1WloxvPMV a7T63c+j1FOq4d/9fPt3P6Pf/aUVY1lfsUTLd9Y7HOLhw36+/buf0e/+0oqBu69YouU76zMc0sNR dPt3P6Pf/aUVo5RfsUTLd9ZnOKRGd4/59u9+Rr/7SyuGZL9iiZbvrM9wSPgkm29X1TKqqi2tGH/+ iiVavrPe4ZARj6LbO6OMdkZLKwbbv2KJlkToDof0HN4Y3a6qZVRVW1oxZQFforLcGM2TbM6nVqKH kHJ7Y1TQxmhpxXQUr1ijVc0ol+o+fANjgmt0u2hUUNFoacVUI69Yo+XmsWwzPFL1cBzd3j0WtHtc WjGNzCvWaLU1SsVP3v0UfmSX23ujgvZGS6vI11ptZ1L2eUAP48DTye1vhbYzSyumc3rFnV9tZ56y o0V3xeX2fqag/czSiqm6XrFGy1JPGafWah7hJ8jtDU1BG5qlFdOwvWKNVhuauUZjntB7mJ8qt3c0 Be1ollZMscfXyFblsGynNk9Y24v22BrZ7XKYoXLY0orpE1+xRstdnyUfxYZF48hu7/oM7fqWVkyN +Yo1Wu76LNv8WfMaPT3Y7V2foV3f0oppT1+xRstd31yhOvopXHq227s+Q7u+pRVT2r5ijVY1w2yW TqN1i3JmdrtoaKhouLRiuuJXrNFqZzzXaHjKPYef2bd3xoZ2xksrpqJ+xRqtttnZvPUxn9nhOLq9 zza0z15aMc34K9Zouc+2OjeQp5HCcXR7n21on720Ygr5V6zRcp9tW0/IlCz6EsNu77MN7bOXVqwf wCvWaLnPtl5OlkcYWbTb+2xD++ylFet+wNfI1/vskazUTd0bWyO/vc92tM9eWrFeD69Yo/U+e4z5 o3aq0Vzz2/tsR/vsi1Yf739///bu0x8f3zx8uTv987Qt0s+mwx5x3H88fPn6flvB25cGfI64zxH0 +Qh8Rnym6Hd/JCRDPlPUZ477zFGfJe6zRH1a3KdFfXrcp0d91rjPGvXZ4j5b1Gc8j1I0j1I8j1I0 j3I8j3I0j3I8j3I0j3I8j3I0j3I8j3I0j3I8j3I0j3I8j3I0j3I8j3I0j3I8j3I0j3I8j3I0j3I8 j3I0j0o8j0o0j0o8j0o0j0o8j0o0j0o8j0o0j0o8j0o0j0o8j0o0j0o8j0o0j0o8j0o0j0o8j0o0 j0o8j0o0jyyeRxbNI4vnkUXzyOJ5ZNE8sngeWTSPLJ5HFs0ji+eRRfPI4nlk0TyyeB5ZNI8snkcW zSOL55FF88jjeeTRPPJ4Hnk0jzyeRx7NI4/nkUfzyON55NE88ngeeTSPPJ5HHs0jj+eRR/PI43nk 0TzyeB55NI9qPI9qNI9qPI9qNI9qPI9qNI9qPI9qNI9qPI9qNI9qPI9qNI9qPI9qNI9qPI9qNI9q PI9qNI9qPI9qNI9aPI9aNI9aPI/A1OqSyFT4zep4d+TN6nh35M3qeHfkaQWmwm9WaA3BVPjN6njn 7M3qeOfszep45+zNCsUGmAq/WaHYAFPhSyJT4TcrFBtgKvxmhWIDTIXfrFBsgKnwmxWKDTAVfrNC sQGmwm9WKDbAVPjNCsUGmAq/WaHYAFPhNysUG2Cq1WaFYgNMtdqsUGyAqVabFYoNMNVqs0KxAaZa bVYoNsBUq82KxAaZarVZkdggU602KxIbZKrVZkVig0y12qxIbJCpVpsVig0w1WqzQrEBplptVig2 wFSrzQrFBphqtVmh2ACzsDYr9Juim5p9PpYJnckmpp4PcTpnuqnZ5yOf0JlsYur5gCh0JpuYej5O Cp0pM0A3Nft8JhU6U2aAbmr2+WArdKbMAN3U7PPpWOhMmQG6qdnnI7bQmTIDdFOzz+d0oTNlBuim Zp8P+0JnygzQTc0+VwyEzpQZcGXyHSo76JxdmaaGihRCZ8oMuDLLClU6hM6UGXBlkhAqlwidKTPg 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 od5zrxgInSkzQKj33MsOQmfKDBDqPffahdCZMgOEvPFeABE6U2aAkDfeqyhCZ8oMEPLGeylG50zI G++FG6EzZQYIeeO9+iN0pswAIW+8l5CEzpQZIOSN9zqU0JkyA4S88V7MEjpTZoCQN94rYkJnygwg muNphWqrRHM8rVBtlWiOpxWqrRLN8bRCtVWiOZ5WqLZKNMfTisRGQprjhDTHCWmOE9IcJ6Q5Tkhz nJDmOCHNcUKa44Q0xwlpjhPSHCekOU5Ic5yQ5jghzXFCmuOENMcJaY4T0hwnpDlOSHOckOY4Ec3x tEKxgbjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjChLjC hLjChLjChLjChLjChLjChLjChLjChLjCxLhCod5zP5bpnAn1nvshTuhMWYEQ6j33k6DQmbICIdR7 7sdJLjUZbSE1qacyeurVgkqT+Ql+VppYb9mXlxGhydKKnZ+Fay7M7aRUsialkjUplaxJqWRNSiVr UipZk1LJmpRK1qRUsialkjUplaxJqWRNSiVrUipZk1LJmpRK1qRUsialkjUplaxJqWRNSiVrUipZ k3C6zF5+ETpTZoCSNk5K2jgpaeOkpI2TkjZOSto4KWnjpKSNk5I2TkraOClp46SkjZOSNk5K2jgp aeOkpI2TkjZOSto4KWnjpKSNk5I2TkraOClp46SkjZOSNk5K2jgpaeOEFMcJKY4TUhwnpDhOSHGc kOI4IcVxQorjhBTHCSmOE1IcJ6Q4TkhxnJDiOCHFcUKK44QUxwkpjhNSHCekOE5IcZyQ4jghxXFC iuOEFMcJKY4TUhwnpDhOSHGckOI4IcVxQorjhBTHCSmOE1IcJ6Q4ToiYTIiYTIiYTIiYTIiYTIiY TIiYTIiYTIiYTIiYTIiYTIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiYzIiY zIiYzIiYzIyYVKo9k1LtmZRqz6RUeyal2jMp1Z5JqfZMSrVnUqo9k1LtmZRqz6RUeyal2jMp1Z5J qfZMSrVnUqo9k1LtmZRqz6RUeyal2jMp1Z5JqfZMSrVnUqo9k1LtmZRqz6RUeyal2jMp1Z5JqfZM SrVnUqo9k1LtmZRqz6RUeyYlbZyUtHFS0sZJSRsnJW2clLRxUtLGSUkbJyVtnITTZfYKjdCZMAOy ksnNSiY3K5ncrGRys5LJzUomNyuZ3KxkcrOSyc1KJjcrmdysZHKzksnNSiY3K5ncrGRyM1IcZ6Q4 zkhxnJHiOCPFcUaK44wUxxkpjjNSHGekOM5IcZyR4jgjxXFGiuOMFMcZKY4zUhxnpDjOSHGckeI4 I8VxRorjjBTHGSmOM1IcZ6Q4zkhxnJHiOCPFcUaK44wUxxkpjjNSHGekOM5IcZyR4jgjrjAjrjAj rjAjrjAjrjAjrjAjrjAjrjAjrjAjrjD//3j7ux07kiTNEr3ufApHz0030FXj+q96gL45L3CAcwZz O2AwPSJZwSATTkZWTj/9UTNzJyOTTrrslQuT3VXIirBP3N1MZG9T0fWJIq4wI64wI64wI64wI64w I64wI64wI64wI64wI64wI64wI64wI64wI64wI64wI64wI64wI64wm57IbHois+mJzKYnMpueyGx6 IrPpicymJzKbnshseiKz6YnMpicym57IbHois+mJzKYnMpueyGx6IrPpicymJzKbnshseiKz6YnM picym57IbHois+mJzKYnMpueyGx6IrPpicymJzKbnshseiKz6YnMpicym0xuNpncbDK52WRys8nk ZpPJzSaTm00mN5tMbjaZ3GwyudlkcrPJ5GaTyc0mk5tNJjebTG42mdxsMrnZZHKzyeRmk8nNJpOb TSY3m0xuNpncbDK52WRyM/LlZuTLzciXm5EvNyNfbka+3Ix8uRn5cjPy5Wbky83Il5uRLzcjX25G vtyMfLkZ+XIz8uVm5MvNyJebkS+3IF9uQb7cgny5BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5 cgvy5Rbkyy3Il1uQL7cgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAg rrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAgrrAwrtD0RGbTE5lNT2Q2PZHZ9ERm 0xOZTU9kNj2R2fREZtMTmU1PZDY9kdn0RGbTE5lNT2Q2PZHZ9ERm0xOZTU9kNj2RxfREFtMTWUxP ZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUxPZDE9kcVkcovJ5BaTyS0mk1tM JreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ 3GIyucVkcovJ5BaTyS0mk1uQL7cgX25BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5Bfly C/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW5Mst yJdbkC+3IF9uQb7cgny5BXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGFBXGF BXGFBXGFBXGFBXGFBXGFBXGFFXGFFXGFFXGFFXGFFXGFFXGFFXGFlXGFpieymJ7IYnoii+mJLKYn spieyGJ6IovpiSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYnspieyGJ6IovpiSymJ7KYnshi eiKL6YkspieymJ7IYnoii+mJLKYnspieyGJ6IovpiSymJ7KYnshieiKL6YksJpNbTCa3mExuMZnc YjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxqMrnVZHKr yeRWk8mtJpNbTSa3mkxuNZnciny5FflyK/LlVuTLrciXW5EvtyJfbkW+3Ip8uRX5civy5Vbky63I l1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdbkS+3Il9uRb7ciny5FflyK/LlVuTLrciXW5EvtyJf bkW+3Ip8uRX5civy5Vbky62IK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yI K6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6ymJ7KanshqeiKr6Yms pieymp7Ianoiq+mJrKYnspqeyGp6IqvpiaymJ7KanshqeiKr6Ymspieymp7Ianoiq+mJrKYnspqe yGp6IqvpiaymJ7KanshqeiKr6Ymspieymp7Ianoiq+mJrKYnspqeyGp6Iqvpiawmk1tNJreaTG41 mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVk cqvJ5FaTya0mk1tNJreaTG41mdyKfLkV+XIr8uVW5MutyJdbkS+3Il9uRb7ciny5FflyK/LlVuTL rciXW5EvtyJfbkW+3Ip8uRX5civy5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MttyJfbkC+3 IV9uQ77chny5DflyG/LlNuTLbYgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgr bIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIgrbIwrND2R1fREVtMTWU1P ZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1PZDU9kdX0RFbTE1lNT2Q1PZHV 9ERW0xNZTU9kNT2R1fREVtMTWU1PZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9kM5ncZjK5zWRy m8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8lt JpPbTCa3mUxuM5ncZjK5zWRym8nkNuTLbciX25AvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uQL7ch X25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFfbkO+3IZ8 uQ35chvy5Tbky23Il9uQL7chX25DXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFD XGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFjXKHpiWymJ7KZnshm eiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoim+mJ bKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvJ5DaTyW0m k9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT20wmt5lM bjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJrcjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR27DjiiV jiiVjmiOjmiOjmiOjmiOjriMjriMjriMjriMjgiLjgiLjgiLjgiLjgiLjliJjqiHjqiHbnovuum9 6Kb3opvei256L7rpveim96Kb3otuei+6CT53c3Ovm5t73dyo6uZGVTc3qrq5UdXNvaVu7i31H+wt vfn85u7nj4+/bsXd48Mvv79/8/iN+O7t+zfvfvt09/unhz/f/fT+49tf72patdwfboe3Hx+PH/ru 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 Ews7iwPVzqaWGMysAHGg2tkZE4OZFSAOVDvba2IwswLEgWpnj84Lls0KyGYFZLMCslkBGbWMM2oZ Z9QyzqhlnFHLOKOWcUEvGQW1jAtqGRe0nVBQbhSUG8QjulUoN4hHdKtQbhBn6Vah3CDO0q1CT5k4 S7cKPWXiLN0q9JSJs3Rm4izdKvSUibN0q9AnAHGWbhXKDeIs3SqUG8RZulUoNxD4mBH4mBH4mBH4 mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4mBH4 mBH4mBH4mBH4mBH4mBH4eKykxGWZ2UvIZi8hm72EbPYSstlLKGYvoZi9hGL2EorZSyhmBRSzAkSr /rnoFIOZFVDMChB9/+eCVgxmVoBoZz9XxWIwM2lFO/u5tBaDmUkr2tnP9bkYzExa0c5+LvLFYGYF iHb2s1MgBjMrQLSzn+0GMZhZASbnm03ON5ucbzY532xyvtnkfLPJ+WaT880m55tNzjebnG82Od9s cr7Z5Hyzyflmk/PNJuebTc43m5xvNjnfbHK+2eR8s8n5ZpPzzSbnm7/P+R7/9ZqR9uH33356eLy7 //v9Ee2P+nVMZTou/NvD46d3x496/dJAzBKPWaIxazxmjcZs8ZgtGrPHY/ZozBGPOaIxZzzmjMZc 8ZgrGLPfh2M+XRqImeIxUzRmvI56tI56vI56tI56vI56tI56vI56tI56vI56tI56vI56tI56vI56 tI56vI56tI5GvI5GtI5GvI5GtI5GvI5GtI5GvI5GtI5GvI5GtI5GvI5GtI5GvI6eLr3+4c8fH397 8/nu3XcuCvzgeLGNaLGNeLGNaLGNeLGNaLHNeLHNaLHNeLHNaLHNeLHNaLHNeLHNaLHNeLHNaLHN eLHNaLHNeLHNaB3NeB3NaB3NeB3NaB3NeB3NaB2teB2taB2teB2taB2teB2taB2teB2taB2teB2t aB2teB2taB2teB2taB2teB2taB2teB2taB2teB2tUB2V+/v7YB19vTQQM1hHXy8NxAzW0ddLAzGD dfT10kDMYB19vTQQM1hHXy8NxAzW0XXprd2nrz8g8JsEq++6lPwmoZo9LgzW7HUp+U1ClX5cGKz0 61Lym0Q/H1L88wGM2vr6AwK/SfxTBYzv+voDAr9J/LMIjAT7+gMCv0n8EwyMGfv6AwK/SfxzD4wu +/oDAr9J/NMSjEODqnwPhhQeKpA/+R4MDjxU7O8C3w4ZfX5m9FmX0edSRpWbYW6AAXuHCnwbbhW6 82DA3laBAXuHCnx653swKu9QoUoBnthDhZ4y8MQeKvSUgSf2OD4BPWXgiT1UqCqBJ/ZQodwAnthD hXIDeGIPFXrKwKd6qNCdBz7VQ4XuPPCpHip054FP9VCh5wV8qocKPWXgUz1UKDeAT/VQodwAPtVD hXID+FQPFcoN4FM9VCg3gE/1UKHc+MHAK/TqLQbTkKPrRV0MpiFH12u9GEzj5K5FgBjMTA1vltC1 khCDaQjlte4Qg5mp4c0SuhYvYjCNeryWOmIwM2k90+q1XhKDmUnrmVavRZcYzExaz7R6rdzEYGYF eKbVa/knBjMrwPOZXmtIMZiZGp419FqIisHM1PCsoddqVgxm5plnDb2WxGIw88PRs4Ze62oxmFkB njX0WpyLwcwK8Kyh1wpfDGZWgGcNvdoEVrCKunMVdecq6s5V1J2rqDtXUXeuou5cRd25irpzFXXn KurOVdRnq6jPVlGfraI+21ahpwzmwR0q9JTBPLhDxZ4y+gQA8+AOFcoNMA/uUKHcAJPdDhV6ymCy 26FCzwvMaDtU6HmBGW2HCj0vMKPtUKGnDGa0HSr0lMHhtIcK5QY4nPZQodwAh9MeKpQb4HDaQ4Vy AxxOe6hQboDDaUtNhODaKvKUE+G+too85URosa0iTzkRWmyryFNOhDHbKvIJkAhjtlXoE0Dsu1Sz 71LNvks1+y7V7LtUs+9Szb5LNfsu1ey7VLPvUs2+SzVbJdVslVSzVVLdVok3RetaF4rBzKT1pmhd i0sxmPmx7U3RulaoYjCzArwpWtcyVwxmJq03+OpaK3vBvFlV18paDGbmmTer6lqei8HMpPVmVV1r fDGY+UnrnUl7NQrEYGYFeGfSXt0GMZhZAd6ZtFfLQgxmVoB3Ju3V9xCDiUmbRET3bJ6IwcSkTSLv e3ZgxGBi0iYRHj7bOF4wER4+mz58LGPp99EJGF8vDcSMevC/XBqIGXXTf7k0EDPqi/9y6asxU3gC xpdLAzGjXvUvlwZiRl3nXy4NxIz6x79cGogZdYJ/uTQQM+rp/nJpIGa4jlJwlkVP4VkWXy4NxAzX UQrOl+gpPF/iy6WvxwxPivhyaSBmvI6C0xv2hfE6Cs5h2BfG6yg4UWFfGK+j4GyEfWG8jlK0jlK8 jlK0jlK8jlK0jlK8jlK0jlK8jlK0jnK8jnK0jnK8jnK0jnK8jnK0jnK8jnK0jnK8jnK0jnK8jnK0 jnK8jnK0jnK8jnK0jnK8jnK0jnK8jnK0jkq8jkq0jkq8jkq0jkq8jkq0jkq8jkq0jkq8jkq0jkq8 jkq0jkq8jkq0jkq8jkq0jkq8jkq0jkq8jkq0jmq8jmq0jmq8jmq0jmq8jmq0jmq8jmq0jmq8jmq0 jmq8jmq0jmq8jmq0jmq8jmq0jmq8jmq0jmq8jmq0jlq8jlq0jlq8jlq0jqLHfny9NBAzXkexYz+O C+N1FDv247gwXkexYz+OC+N1FDv247gwXkexYz+OC+N1FDv247gwXkdkkslMZFLQTGRS0ExkUtBM ZFLQTMSLNBPxIs1EvEgzES/STMSLNBPxIs1EvEgzES/STMSLNBPxIs1EvEgT1hdxMG0Vyg3iYNoq lBvEwbRVKDeIg2mrUG4QB9NWodwgDqatQrlBHExbhXJjoNwgvqetQrlBfE9bhXKDuKVmIm6prUK5 QdxSW4Vyg7iltgrlBnFLbRXKDeKW2iqUG8QttVUoN4hbaqtQbhC31Fah3CBuqa1CuUHcUltFciMT j9VWkdzIxGO1VSQ3MvFYbRXJjUw8VlvF1ike53Quy8RgHud0LuLEYB7ndC75vGCif+tcIIrBPNLv XE6KwcwKEP1b55pUDGZWgOjfOhe2XjDRDHYug8VgZgWIZrBzLf29YG8+vzmOi/x1K+4eH375/f2b x2/Ed2/fv3n326e73z89/Pnup/cf3/56l9JO3tmOt+23Hx+Pn/ruwy93Hx7+/vnhw+dPR8Rvf4Xj x3445Z/u0ouXPP+Sjw/HH/X5493VZf8SNqxinQPxhpuFLXrczvaDGMwsbNHjdvYwxGBmYYset7MR IgYzK0A0zJ3dFDGYWQGi++5syYjBzAoQ3XdnX0cMZlaA6L47m0NiMLMCRPfd2WHygonuu7Mfxd96 VnrprafUnFbrqwffep4Oof3RW89K5K3nRRXrvok33Cxs0VR4tvDEYGZhi6bCsw8oBhMLO4sOxbOZ KAYTKyCLDsWzIykGEysgiw7Fs60pBiOd8EwmSs1MJkptFeqEk7MOtwp1wsnpn1uFOuHkXMWtIp3w TM5V3CqUG+Rcxa1CuZFRbpDTGLcK5QY5jXGrUG6Q0xi3CuUGOY1xZnIa41ah3CCnMW4Vyg1yGuNW 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 ccaHCtUymR2fyXHGhwrlBpkdn8lxxocK5QbxKmZynPGhQrlB5tRvFcqNgnKDTLfPhzMQqBDrVxDr VxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDrVxDr VxDrVxDrVxDrVxDrVxDrVxDrVxDrJx5Eey2VxGBiV0A8iPZab4nBzK6AdxDttWgTg5ldAe9U22vl JwYzk9Y7O/ZaPnrBvLNjr8WmGMzMM+/s2GvFKgYzP2nFkV1ZPDv2Wg2LwcwK8M6OvZbUYjCzAryz Y691uRjMrIAfzJxBi3sxmFkBxawAk0YtJo1aTBq1mDRqMWnUYtKoxaRRi0mjFpNGLSaNWkwatZg0 ajFp1GLSqMWkUYtJoxaTRi0mjVpMGrWYNGoxadRi0qjFpFGLSaMWk0YtJo1aTBq1iDRqRc6yipxl FTnLKnKWVeQsq8hZVpGzrCJnWUXOsoqcZRU5yypyllXkLKvIWVaRs6wixqUixqUiWqUiWqUi7qQi gqQiFmSr0D0kBMlWoTtPuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKuJOKCJKKWJCKWJCKqI6K +IyKSIuKmImKmImKmImKmImKmImKmImKmImKmImKmImKmImKmImKmIlqcvvV5Parye1Xk9uvJrdf TW6/mtx+Nbn9anL71eT2q8ntV5Pbrya3X01uv5rcfjWxkmpiJdUkQapJglQT3qgmb1FNROJcJ4nB xI+gY1UlBlNTw/wIEuGNasIb1YQ3qglvVBPeqCa8UU14o5rwRjV5i2oiEtVEJKpJNVQTRKgmO1DN 7f5qbvdXc7u/mtv91dzur+Z2fzW3+6u53V/N7f5qbvdXc7u//mC7//ivv7355d3b5wMI7v9+f0T7 o76XpyOq/vbw+Ond8aNevzQQc8RjjmjMGY85ozFXPOYKxnw6qikS8+nSQMwUj5miMXM8Zo7GLPGY JRqzxmPWaMwWj9miMeN1VKN1VON1VKN1VON1VKN1VON1VKN11OJ11KJ11OJ11KJ11OJ11KJ11OJ1 1KJ11OJ11KJ11OJ11KJ11OJ11KJ11OJ11KJ11OJ11KJ11OJ11KJ11ON11KN11ON11KN11ON11KN1 1ON11KN11ON11KN11ON11KN11ON11KN11ON11KN11ON11KN11ON11KN1NOJ1NKJ1NOJ1NKJ1NOJ1 NKJ1NOJ1NKJ1NOJ1NKJ1NOJ1NKJ1NOJ1NKJ1NOJ1NKJ1NOJ1NKJ1NOJ1NKJ1NON1NKN1NON1NKN1 NON1NKN1NON1NKN1NON1NKN1NON1NKN1NON1NKN1NON1NKN1NON1NKN1NON1NKN1tOJ1tKJ1tOJ1 tKJ1tOJ1tKJ1tOJ1tKJ1tOJ1tKJ1tOJ1tKJ1tOJ1tKJ1tOJ1tKJ1tOJ1tKJ1tOJ1tIJ1VO/DdfR8 aSBmuI6eLw3EDNfR86WBmOE6er40EDNcR8+XBmKG6+j50kDMcB09XxqIGa6j50sDMcN19HxpIGa4 jp4vfT1mitdRitZRitdRitZRitdRitZRitdRitZRitdRitZRitdRitZRitdRitZRitdRitZRitdR itZRitdRitZRjtdRjtZRjtdRjtZRjtdRjtZRjtdRjtZRjtdRjtZRjtdRjtZRjtdRjtZRjtdRjtZR jtdRjtZRjtdRjtZRiddRidZRiddRidZRiddRidZRiddRidZRiddRidZRiddRidZRnGeoUZ6hxnmG GuUZapxnqFGeocZ5hhrlGWqcZ6hRnqHGeYYa5RlqnGeoUZ6hxnmGGuUZapxnqFGeocZ5hhrlGWqc Z6hRnqHGeYYa5RlqnGeoUZ6hxnmGGuUZapxnqFGeocZ5hhrlGWqcZ6hRnqHGeYYa5RlqnGeoUZ6h xnmGGuUZapxnqFGeocZ5hhrlGWqcZ6hRnqHGeYYa5RlqnGeoUZ6hxnmGGuUZapxnqFGeocZ5hkqG E89CDhSfhRwoPgs5UHwWcqD4LGTsyyxk7MssZOzLLGTsyyxk7MssZOzLLGSAyyxkgMssZIDLLGSA yyxkgMusZIDLrGSAy6xkgMus5GjwWcnYl1nJ2JdZydFGs5JhMbOSYTGzkmEx56eoxfefH65iMM+t cX4Ui8E8t8b5we0FE0cNnB/zYjDPr3R+KfzAR/JV9dP7j29/fXpX+d/u7neUp390f/fzx8e774av f3r78fHx979+/nL5Vv7g6v9y/S7/8fuHXy/Fnz58vPv3u4cPn4+/6h9+0h9UxzWvXvTXx48/vX/4 7e4/333+yx+uePvxw+et/HT8Yt/8Otdv85c3f3u4e/v+4c3jw5+/vYZ9qYqP0KxucYzC+c0sBhOr u4pjFM6vdzGYWN1VPP7wfEcQg4kVUMWjPs4XDTGYWAH1+wMe7p7+8293b37Zn4X/8+7GAW95pnFf 6o3rpWfVbW/ST6obVyPPKvQb3viuf6naje/6z6rb3vWfVbe96z+ryD1sN77rP6tue2t/VpE8bDe+ fz+r2M8iGdVuHGr4pLpxqOGzCmXUjUMNn1Uoo24cavisum31+KxCeXjjUMNnFcqNG0chPqluPEzz WYVy48YBis8qlBs3jl18VqHcuHFY47MK5caNIx6fVSg3bhwM+axCuXHjYMhnFcqNGwdDPqtQbtw4 GPJZhXLjxsGQzyqUGzcOhnxWkdyoTrfm62ujF8yZmPj1JVMMJv6ZzVm2fn1TFYMpy9av77ViMGXZ +vUtWAymrDS/vjOLwdTfTCyn5kyy+/o+LgYzy8mZZPf1pV4MZpaTM8nu68pADGZWgHMM4dflhRfM OYbw62JEDGZWgHMM4dcVjRjMrABn+t/XZZEYzKwA5xjCr2srMZhZAc5cwq8LNDGYWQHOXMKvqzwx mFkBzlzCr0tFL5gzl/DrwtIKtu8/6EVsFehFbBXoRWwV6EVsFehFbBXoRWwV6EVsFehF7BQHvYit Ar2IrUK5MVFu3MhHPqtQbtzIRz6rUG6Q/b6G9vv2JxbKjRv5yGcVyg2yI7lVKDdupCqfVSg3bqQq n1UoN8hOa0M7rQ3ttDa009rQTmtDO61bRXID7c82tD+7VSQ32j3KDbIXvFUoN2487u9ZhXLjxkMC n1UoN248JPBZhXKD7Kc3tJ/e0H56Q/vpDe2nN7Sf3tB+ekP76Q3tpze0n97QfnpD++kN7ac3tJ/e 0H56Q/vpDe2nN7Sffq6/xMWc14E4V2tiMK8Dca7txGBeB+JcCYrBvA7EuW4Ug5kdiGlWwDQrwHGb fF2qisHMCnDcJl/Xu2IwswIct8nXRbMYzKwAEdM4V95iMLMCHEfG1+W7GMysABFtaSba0ky0pZlo SzPRlmaiLWfbQQwmVoDJyZy9CzGYWQEiwXM2QMRgZgUkswKck0W/NlfEYGYFiDxWM3msZvJYzeSx msljNZPHaiaP1Uweq5k8VjN5rGbyWM3ksZrJYzWTx2omj9VMHquZPFYzeaxm8lgN+VEa8qM05Edp yI/SkB+lIT9KQ36UhvwoDflRGvKjNORHaciP0pAfpSE/SkN+lIb8KFuFcqOh3GgoNxrKjYZyo6Hc aCg3GsqNjnKjo9zoKDdunJ/2rEK50VFudJQbHeVGR7nRUW4MlBsD5QbiChviChviChviChviChvi ChviChviChviChviChviChviChviChviChviChviChviChviChviChviChviChviChviChviChvi ChviChviChvjCkU/TDP9MM30wzTTD9NMP0wz/TDN9MM00w/TTD9MM/0wzfTDNNMP00w/TDP9MM30 wzTVD3Osd8VgZgU0swKaWQHNrIBmVkAzK6CZFdDNCuhmBXSzArpZAf37FfDm85tjKumvW3H3+PDL 7+/fPH4jvnv7/s273z7d/f7p4c9Po1JzKTnV3vfb9DFDdf/Udx9+ufvw8PdrXOkx5/SbX+H4sR9O +ae7vHJK6cXrnn/Tx4fjL/v88W6k/nTs8pf4NaZkDROzwrtZ4d2s8G5WeDcrfJgVPswKN5njZjLH zWSOm8kcN5M5biZz3EzmuJnMcTOZ42Yyx81kjpvJHDeTOW4mc9xM5riZzHEzmeNmMsfNZI6byRw3 kzluJnPcTOa4mcxxM5njZjLHzWSOm8kcd+Q77sh33JHvuCPfcUe+4458xx35jjvyHXfkO+7Id9yR 77gj33FHvuOOfMcd+Y478h135DvuyHfcke+4I99xR77jjnzHHfmOO/Idd+Q77sh33JHvuCPfcUe+ 4458xx35jjvyHXfkO+7Id9yR77gj33FH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH 3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GRH3GQ3PZ/d9Hx2 0/PZTc9nNz2f3fR8dtPz2U3PZzc9n930fHbT89lNz2c3PZ/d9Hx20/PZTc9nNz2f3fR8dtPz2U3P Zzc9n930fHbT89lNz2c3PZ/d9Hx20/PZTc9nNz2f3fR8dtPz2U3PZzc9n930fHbT89lNz2c3meNu MsfdZI67yRx3kznuJnPcTea4m8xxN5njbjLH3WSOu8kcd5M57iZz3E3muJvMcTeZ424yx91kjrvJ HHeTOe4mc9xN5ribzHE3meNuMsfdZI67yRx35DvuyHfcke+4I99xR77jjnzHHfmOO/Idd+Q77sh3 3JHvuCPfcUe+4458xx35jjvyHXfkO+7Id9yR77gj33FHvuOOfMcd+Y478h135DvuyHfcke+4I99x R77jjnzHHfmOO/Idd+Q77sh33JHvuCPf8UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc 4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4UBc4WBc4Q88n2hZ JgYzOxCmJ7KbnshueiK76Ynspieym57Ibnoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK76Yns pieym57Ibnoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK76Ynspieym57Ibnoiu+mJ7KYncphM 7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5 w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO 5MsdyJc7kC93IF/uQL7cgXy5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQ L3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5w IK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5wmJ7I YXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6Iofp iRymJ3KYnshheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6Ykcpidy mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxh MrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2RyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cify 5U7ky53IlzuRL3ciX+5EvtyJfLkT+XIn8uVO5MudyJc7kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciX O5EvdyJf7kS+3Il8uRP5cify5U7ky53IlzuRL3cirnAirnAirnAirnAirnAirnAirnAirnAirnAi rnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAyrtD0 RA7TEzlMT+QwPZHD9EQO0xM5TE/kMD2R0/RETtMTOU1P5DQ9kdP0RE7TEzlNT+Q0PZHT9ERO0xM5 TU/kND2R0/RETtMTOU1P5DQ9kdP0RE7TEzlNT+Q0PZHT9ERO0xM5TU/kND2R0/RETtMTOU1P5DQ9 kdNkcqfJ5E6TyZ0mkztNJneaTO40mdxpMrnTZHKnyeROk8mdJpM7TSZ3mkzuNJncaTK502Ryp8nk TpPJnSaTO00md5pM7jSZ3GkyudNkcqfJ5E6TyZ0mkzuRL3ciX+5EvtyJfLkT+XIn8uVO5MudyJc7 kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciXO5EvdyJf7kS+3Il8uRP5cify5U7ky53IlzuRL3ciX+5E vtyJfLkT+XIn8uVO5MudyJc7kS93Il/uRL7ciXy5E3GFE3GFE3GFE3GFE3GFE3GFE3GFE3GFC3GF C3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFC3GFi3GF pidymp7IaXoip+mJnKYncpqeyGl6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYncpqe yGl6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYncpqeyGl6IqfpiZymJ3KanshpeiKn 6YmcJpM7TSZ3mkzuNJncaTK502Ry5w+Y3Def39z9/PHx1624e3z45ff3bx6/Ed+9ff/m3W+f7n7/ 9PDnu5/ef3z7691+f8xlrx7Hn95+fDx+6LsPv9x9ePj754cPnz8dAb/9DY6f+uFUf7rLNaX+4mXP v+fjw/F3ff54d38Jn0OnqIq1jbR7vkzaeJm08TJp42XSxsukjZdJGy+TNl4mbbxM2niZtPEyaeNl 0sbLpI2XSRsvkzZeJm28TNp4mbTxMmnjZdLGCzmOF3IcL+Q4XshxvJDjeCHH8UKO44Ucxws5jhdy HC/kOF7IcbyQ43ghx/FCjuOFHMcLOY4Xchwv5DheyHG8kON4IcfxQo7jhRzHCzmOF3IcL+Q4Xshx vJDjeCHH8UKO44Ucxws5jhdyHC/kOF7IcbwQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQ MbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMbkQMblMt+cy 3Z7LdHsu0+25TLfnMt2ey3R7LtPtuUy35zLdnst0ey7T7blMt+cy3Z7LdHsu0+25TLfnMt2ey3R7 LtPtuUy35zLdnst0ey7T7blMt+cy3Z7LdHsu0+25TLfnMt2ey3R7LtPtuUy35zLdnst0ey7T7blM 2niZtPH6AW38KmWwxS9QBnnuj+8x7vdbTAgzOH6FP2IGqfbx4lWAMnhZxVo73j03OeplctTL5KiX yVEvk6NeJke9TI56mRz1MjnqZXLUy+Sol8lRL5OjXiZHvUyOepkc9TI56mVy1MvkqJfJUS+To14m R71MjnqZHPVCXuqFvNQLeakX8lIv5KVeyEu9kJd6IS/1Ql7qhbzUC3mpF/JSL+SlXshLvZCXehEv db8nXuqtArmxVSA3tgrkxlaB3NgqkBtbBXJjq0BubBXIja1CuUG81FuFcoN4qbcK5QbxUm8Vyg3i pd4qlBvES71VKDcIMblVKDcIMblVKDcIMblVKDcIMblVKDcIMblVKDcIMblVKDcIMblVKDcIMblV KDcIMblVKDcIMblVKDcIMblVKDcIMblVKDcIMblVKDcIMblVbJ1idiBMH+syfazL9LEu08e6TB/r Mn2sy/SxLtPHukwf6zJ9rMv0sS7Tx7pMH+syz5ZZotvzXO+KwbwKOFfHYjCvAs61tBjMq4Bz5S0G 8yrgXKeLwcwKEN2e52JfDGZWgOj2PDsGYjCzAkS359l2EIOZFSC6Pc/ehRjMrACRNj4bIGIwswJE 2vjsoojBzAoQaeOzFeMFE2njs3EjBjMrQKSNz+6PGMysAJE2PltIYjCzAkTa+OxDicHMChBp47OZ JQYzK0Ckjc+OmBjMrADiON4q1FsljuOtQr1V4jjeKtRbJY7jrUK9VeI43irUdyeO461CuUEcx1uF coM4jrcK5QZxHG8Vyg3iON4qlBvEcbxVKDeI43irUG4Qx/FWodwgjuOtQrlBHMdbhXKDOI63CuUG cRxvFcoN4jjeKpQbhCvcKpQbhCvcKpQbhCvcKpQbhCvcKpQbhCvcKpQbhCvcKpQbhCvcKpQbhCvc KpIbCXGFCXGFCXGFCXGFCXGFCXGFCXGFCXGFCXGFCXGFCXGFiXGFotvzXJZ5wUS357mIE4OZHQjR 7XmuBMVgZgdCdHuey0kxmFkBoifyXJOKwcwKED2R58JWDGZWgOiJPFfHYjCzAkRP5LnE9oKJnshz QS4GMytA9ESeq3oxmFkBoifybA2IwcwKED2RZ39BDGZWgOiJPJsUYjCzAkQm9+x0iMHMChCZ3LNd 4gUTmdyzuSIGMytAZHLPDo0YzKwAkck92zxiMLMCTCY3mUxuMpncZDK5yWRyk8nkJpPJTSaTm0wm N5lMbjKZ3GQyuclkchPy5Sbky03Il5uQLzchX25CvtyEfLkJ+XIT8uUm5MtNyJebkC83IV9uQr7c hHy5CflyE/LlJuTLTciXm5AvNyFfbkK+3IR8uQn5chPy5Sbky03Il5uQLzchX25CvtyEfLkJ+XIT 8uUm5MtNyJebiC93q1BuIK4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4w Ia4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wIa4wmZ7IZHoik+mJTKYnMpmeyGR6 IpPpiUymJzKZnshkeiKT6YlMpicymZ7IZHoik+mJTKYnMpmeyGR6IpPpiUymJzKZnshkeiKT6YlM picymZ7IZHoik+mJTKYnMpmeyGR6IpPpiUymJzKZnshkeiKT6YlMpicymUxuMpncZDK5yWRyk8nk JpPJTSaTm0wmN5lMbjKZ3GQyuclkcpPJ5CaTyU0mk5tMJjeZTG4ymdxkMrnJZHKTyeQmk8lNJpOb TCY3mUxuMpncZDK5yWRyE/LlJuTLTciXm5AvNyFfbkK+3IR8uQn5chPy5Sbky03Il5uQLzchX25C vtyEfLkJ+XIT8uUm5MtNyJebkC83IV9uQr7chHy5CflyM/LlZuTLzciXm5EvNyNfbka+3Ix8uRn5 cjPy5Wbky83Il5uRLzcjrjAjrjAjrjAjrjAjrjAjQjAj1i8j1i8j1i8j1i8j1i8j1i8j1i8j1i8j 1i8j1i8j1i8j1i8j1i8j1i8j1i8j1i8j1i8j1i8j1i8z1s/0KSbTp5hMn2IyfYrJ9Ckm06eYTJ9i Mn2KyfQpJtOnmEyfYjJ9isn0KSbTp5hMn2IyfYrJ9Ckm06eYTJ9iMn2KyfQpJtOnmEyfYjJ9itn0 KWbTp5hNn2I2fYrZ9Clm06eYTZ9iNn2K2fQpZtOnmE2fYjZ9itnkZLPJyWaTk80mJ5tNTjabaGs2 adRs0qjZpFGzSaNmk0bNJo2aTRo1mzRqNmnUbNKo2aRRs0mjZpNGzSaNmk0aNZs0ajZp1GzSqNmk UbNIo45Gutujka7iVoGu4laBruJWga7iVoGu4laBruJWga7iaMRBvFWg47xVoOO8VSg3iIN4q1Bu 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 YUfDDDsaZtjRMMOOhhl2NMywo2GGHQ0z3CqUG8S92tEIxI5GIHY0ArGjEYgdjUDcKpQb5ATCrUK5 Qc4t3CqUG8Rfu1UoN8gZiVuFcoOckbhVKDfIGYlbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKD cIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVbhXKDcIVb xRgQswMhThXs5lTBbk4V7OZUwW5OFezmVMFuThXs5lTBbk4V7OZUwW5OFezmVMFuThXs5lTBbk4V PNe7YjCzAkQjbzdHFHZzRGE3RxR2c0ThuSD3gokHyZ7LdzGYWQGiX/nsAYjBzAoQz8s9GwliMLMC RFv22Y0Qg5kVIDK5Z0tDDGZWgMjknn0RMZhZASKTezZXvGAik3u2YsRgZgWITO7ZzxGDmRUgMrln U0gMZlaAyOSenSUxmFkBIpN7tqfEYGYFiEzu2eMSg5kVIDK5Z6PMC0Z8uVuFeqvEl7tVqLdKfLlb hXqrxJe7Vai3Sny5W4V6q8SXu1UoN4gvd6tQbhBf7lah3CC+3K1CuUF8uVtFciMhX25CvtyEfLkJ +XIT8uUm5MtNyJebkC83IV9uQr7chBy2CTlsE3LYJuSwTcRhu1XoKSNCMCFCMCFCMCFCMCHuKSGC KSGCKSGCKSGCKTEWSfRRna9yYjBz1SL6qM73QTGYuWoRfVTnS6UYzFy1iD6q881UDGZWgOijOl9v xWBmBYg+qvMdWQxmVoDoozpftLVgyfRRJdNHlUwfVTJ9VMn0USXTR5VMH1UyfVTJ9FEl00eVTOtT Mq1PybQ+JdP6lEzrUzLRu2Sid8lE75KJ3iUTvUsm95JMVCWZqEoyUZVkoipJpEsm4pUn4pUn4pUn 4pUn4pUn4pUn4pUn4pUn4pUn2m+ZaL9lov2WifZbJtpvmWi/ZaL9lon2Wybab5lov2Wi/ZaJ9lsm 2m+ZaL9lov2WifZbJtpvmWi/ZaL9lon2Wybab5lov2Wi/ZaJ9lsm6sRP1ImfqBM/USd+ok78RJ34 iTrxW4Vyg3j1twrlBvHqbxXKDeLV3yr2vuG9g04TFJomKDRNUGiaoNA0QaFpgkLTBIWmCQpNc9Np mptO09x0muam0zQ3naa56TTNTadpbjpNc9NpmptO09x0muam0zQ3naa56TTNTadpbjpNc9NpmptO 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 nKdTzHk6xZynU8x5OsWcp1PEWbznelcMJlZANafOVHPqTBVn8Z5LbDGYWAHVHOx7rNPFYGYFmONg qjkOpprjYI7WgBjMrABztkw1Z8tUc7ZMNWfLVHO2TDVny1Rztkw1mf9qMv/VZP6ryfxXc7ZMNWfL VHO2TDWtDdW0NlTT2lBNa0M1rQ3VtDZU09pQTWtDNa0N1bQ2VNPaUE1rQzWtDdW0NlTT2lBNa0M1 rQ3VtDZU09pQkbu+Ili/Ind9Re76itz1FbnrK3LXV+Sur8hdX5G7viJ3fUXu+orc9RW56yty11fk rq/IXV+Ru74id31F7vqK3PUVuesrctdX5K6vyF1fkbu+Ind9Re76itz1FbnrK3LXV+Sur8hdX5G7 viJ3fUXu+oq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woa4 woa4woa4woa4woa4woa4woa4woa4woYIwYYIwcYIQdMkXs1Jn9U0SVdz0mc1J31W025bTbttNe22 1bTb1h/YbdF6UQxmVoBpSq0/MKWitagYzKwA07lZTedmNZ2b1XRuVtO5WU3nZjWdm9V0blbTuVlN 52Y1nZv1B85NtJoXg5kVYLobq+lurKa7sZruxmq6G6vpbqwmXVtNuraadG016dpq0rXVpGurSddW k66tJl1bTbq2mnRtNenaatK11aRrq0nXVpOubSZd20y6tpl0bTPp2mbStc2ka5tJ1zaTrm0mENtM ILaZQGxDptiGTLENmWIbMsU2ZIptyBTbkCm2IVNsQ6bYhkyxDZliGzLFNmSKbcgU25AptiFTbEP2 1obsrQ3ZWxuytzZkb23I3tqQvbUhe2tD9taG7K0N2Vsbsrc2ZG9tyN7akL21IXtrQ/bWhuytDaFK DaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKDaFKzbRZNdNm1UybVTNtVs20 WTXTZtVMm1UzbVbNtFk102bVTJtVM21WzbRZNdNm1UybVTNtVs10RjXTGdVMZ1QznVHNdEa1Hzij Xh2ausUvD02dKd3P+xQbmnr8CseP/TI0tedUXzhyoZ2HhZ+/6Q1jpF9WsbWSeNfNgjRdX810fTXT 9dVM11czXV/NdH010/XVTNdXM11fzXR9NZM6aiZ11EzqqJnUUTOpo2ZSR82kjppJHTWTOmomddRM 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 ArENmaUaMks1ZJZqyCzVkFmqIbNUQ2aphsxSDcEeDcEeDcEeDcEeDcEeDcEeDcEeDcEeDcEeDcEe DcEeDcEeDcEeDcEeDcEeDcEeDcEeDcEeDZx2fKhQbiBEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFE pCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFEpCFE pCNEpCNEpCNEpCNEpCPYoyPYoyPYo5m4fzNx/2bi/s3E/ZuJ+zcT928m7t9M3L+ZkEozIZVmQirN hFSaCak0E1JpJqTSTEilmZBKMyGVZkIqzYRUmgmpNBNSaSak0kxIpZmQSjMhleadknwt28VgZgWY xEsziZdmEi/NJF6aSbw0k3hpJvHSTOKlmcRLM4mXZhIvzSRemkm8NJN4aSbx0kzipZnESzOJl2YS L80kXppJvDSTeGkm8dJM4qWZxEsziZdmEi/dJF66Sbx0k3jpJvHSTUilm5BKFyGVjCbjZjQZN6PJ uBlNxs1oxm1GM24zmnGb0YzbjGbcZjTjNqMZtxnNuM1oxm1GM24zmnGb0YyOjGZ0ZDSjI6MZHRnN 6MhoRkdGMzoymtGR0YyOjGZ0ZDSjI6MZHRnN6MhoRkdGMzoymtGR0YyOjGZ05EKwjYwme2Q02SOj yR4ZTfbIaLJHRpM9MprskdFkj4wme2Q02SOjyR4ZTfbIaLJHRpM9MprskdFkj4wme2Q02SOjyR4Z TfbIaLJHRpM9MprskdFkj4wme2Q02SOjyR4ZTfbIaLJHNmdSZnMmZTZnUmZzJmU2x0hmc4xkNsdI ZnOMZDbHSGZzjGQ2x0hmc4xkNsdIZnOMZDbHSGZz+Ek2h59kc/hJNoefZHP4STaHn2Rz+Ek2h59k c/hJNoefZHP4STaHn2Rz+Ek2h59kc/hJNoefZHP4STaHn5wNBDGYWQEiV5LNSSrZnKSSzUkq2Zyk ks1JKtmcpJLNSSrZnKSSzUkq2Zykks1JKtmcpJLNSSrZnKSSzUkq2Zykks1JKtmcpJLNSSrZnKSS zUkq2Zykks1JKtmcpJLNSSrZnKSSzUkquaJNpYq2hyraHqpoe6ii7aGKtocq2h6qaHuoou2hiraH Ktoeqmh7qKLtoYq2hyraHqpoe6ii7aGKtocq2rKpaMumoi2birZsKtqyqWjLpqItm4q2bCrasqlo y6aiLZuKtmwq2rJpxDO7VeQpN+KZ3SrylBsZq75V5Ck34rTdKvKUGxmrvlXkE6CRsepbhZ4yGZC+ VegpkwHpW4WeckJPOaGnnNBTzugpZ/QJkFFuZJQbGeVGRrmRUW5k9j4vLt6q2XWuZte5ml3nanad q9l1rmbXuZpd52p2navZda5m17maXedqdp2r2XWuZte5ml3nanadq9l1rmZvt5q93Wr2dqvZ261m b7eavd1q9nar2dutZm+3mr3davZ2q9nbrWZvt4k2v3NtLAYTk7aJNr9zgS0GE5O2iZ7Bc5UuBlOT VvzYbuJg67MDIAYzk1acRX22EcRgZtImM2mTmbTJTNpsJm02P7azWQHZrIBsVkA2KyCbFZC9CqjI lFORKaciU05FppyKTDkVmXIqMuVUZMqpyJRTkSmnIlNORaacikw5FZlyKjput6Ljdis6brei43Yr Om63ouN2Kzput6Ljdmsl+wxbRTKqkn2GWsk+w1ahjCL7DFuFMorsM2wVyqiMnldGz6ug51XQ8yro eRX0vAp6XgU9LzIkZqtQLZMhMcfXA1FVlBtkcMv+D7rzZHDL/g97Z/PeXKvJAFeTAa4mA1xNBria DHA1GeBqMsDVZICryQBXkwGuJgNcTQa4mgxwNU9TrOZpitU8TbGapylW8zTFap6mWM3TFKt5muK5 MhCDieVUxWbgubwQg5nlJDYDzzWKGMwsJ7EZeC50xGBmnhUzz4qZZ8XMs2LmWTHzrJh5Js6eOddt YjCzAsTZM+fiTwxmpoY44eVcQYrBvNToqFvSUbeko25JR92SjrolHXVLOuqWdNQt6ahbslWgk7ZV KDfIIN6O+jkd9XM66ud01M/ZKpQbZBBvr2QQ71ah3CCDeLcK5QYZxLtVKDfIIN6tQrlBBvFuFcoN Moh3q1BukEG8W4Vygwzi7cgzvVUoN4jTuiOndUdO646c1h05rTtyWnfktO7Iad2R07ojp3VHTuuO nNYdOa07clp35LTuyGndkdN6q1BukEG8Hbm6O3J1d+Tq7sjV3ZGruyNXd0eu7o5c3R25ujtydXez 0dLNRks3Gy3dbLR0s9HSzUZLNxst3Wy0dLPRci4nxWBmBYgTg7vZT+pmP6mb/aTu9pPEicHnMtgL Jk4MPhfNYjCzAsSJwefKWwxmVoA4MfhcvovBzAoQJwafPQAxmFkB4sTgs5EgBjMrQBy3cHYjxGBm BYizG7o5u6Gbsxu6Obuhm7Mbujm7oZuzG7o5u6Gbsxu6Obuhm7Mbujm7oZuzG7o5u6Gbsxu6Obvh 7BWJwcwKEGnhbk6V6OZUiW5OlejmVIluTpXo5lSJbk6V6OZUiW5OlehoKmJHUxE7moq4VaS3imYp djRLsaNZih3NUuxolmJHsxQ7mqXY0SzFjmYpdjRLsaNZiluFcoNMYOxoAmNHExg7msDY0QTGjiYw djSBsaMJjB1NYOxoAmNHExg7msDY0QTGjiYwdjSBsaMJjFuFcoO4MHsjLsytQrmBuMKGuMKGuMKG uMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKGuMKG uMKGuMKGuMKGuMKGuMLGuELRrdnNqX7dnOp3LuK0YOaIwG6OCOzmiMBujgjs5ojAbo4I7OaIwG6O COzmiMBujgjs5ojAc2ErBjMrQJw32M15g92cN9jNeYPdnDfYzXmD3Zw32M15g92cN9jNeYPdnDfY zXmD3Zw32M15g92cN3j2F8RgZgWI5uezSSEGMyvAZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRy m8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8lt yJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uQL7ch X25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFfbkO+3Ia4 woa4woa4woa4wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64 wo64wo64wo64wo64wo64wo64wo64ws64QtMT2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9k Mz2RzfRENtMT2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30 RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRENpPJbSaT20wmt5lMbjeZ3G4yud1kcrvJ5HaTye0m k9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200mt5tM bke+3I58uR35cjvy5Xbky+3Il9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5 HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5XbkX+3Iv9qRf7Uj/2pH/F1H/F1H/F1H/F1H /F1H/F1H/F1H/F1HjFVHjFVHjFVHjFVHjFVHBFNHBFM33VfddF91033VTfdVN91X3XRfddN91U33 VTfdV910X3XTfdVN91U33VfddF91033VTfdVN91X3XRfddN91U33VTfdV910X3XTfdVN91U33Vfd dF91033VTfdVN51E3XQSddNJ1E0nUTdJtm6SbN0k2bpJsnWTZOsmydZNkq2bJFs3OZ5ucjzd5Hi6 yfF0k+PpJuDSRcBlosMCJzoscKLDAic6LHCiwwInOixwosMCJzoscKLDAic6LHCiwwInOixwosMC JzoscKLDAicaQD7RAPKJRolPNEp8olHiE40Sn2go+ETjvScauT3RyO2JRm5PNHJ7opHbE43cnmjk 9kQjtycauT3RyO2JRm5PNHJ7opHbE43cnmjk9kQjtycauT3RyO2JRm5PNHJ7opHbE43cnmjk9kQj tycanj3RGOyJBlpPNJp6oiHT80eHKr35/Obu54+Pv27F3ePDL7+/f/P4jfju7fs37377dPf7p4c/ 3/30/uPbX+9y2V+Kox4neb39+Hj81Hcffrn78PD3zw8fPn86In77Kxw/9sMp/3SXe061vnjd82/6 +HD8ZZ8/3u2v+tEv9XP8ElOyV3BvYTXNQ6OmeWjUNA+NmuahUdM8NGqah0ZN89CoaR4aNc1Do6Z5 aNQ0D42a5qFR0zw0apqjwac5Gnya07ynOc17mtO8pznNe5oDuKc5M3uak6mnOZl6mpOppzmZepqT qac5mXqak6mnOZl6mpOppzmZepqTqac5mXqak6mnOZl6mpOppzmZepqTqac5mXqak6mnOZl6mpOp pzmZepqTqac5mXqaw6SnOf95miObpzlleZqDkWcnoxi3ivT4EIQ7EYQ7EYQ7EYQ7EYS7VejOoz3F jvYUESY8ESa8VSg30J5iR3uKHe0pdrSn2NGeYkd7ip0MOtwqlBto/7Kj/ctOBh3OgXY9B9r1HGjX c6Bdz0EGHW4VeV6DDB/cKvS80A7rQDusA+2wDrTDOtAO60A7rAPtsA60wzrQDutAO6wD7bAOtMM6 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 NKBgoQEFCw0oWGhAwUIDChYaULDQgIKFBhQsNKBgoQEFCw0oWGhAwUIDChYaULDQgIKFBhQsNKBg oQEFCw0oWGhAwUIDChbiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfi ChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfiChfjCs3BdtMcbDfNwXbTHGy3zMF2 yxxst8zBdsscbLfMMRPLHDOxzDETyxwzscwxE8scM7HMMRPLHDOxzDETyxwzscwxE8scM7HMMRPL HDOxzDETyxwzscwxE8scM7HMMRPLHDOxzDETyxwzscwxE8scM7HMMRPLHDOxzDETyxwzsUwmd5lM 7jKZ3GUyuctkcpfJ5C6TyV0mk7tMJneZTO4ymdxlMrnLZHKXyeQuk8ldJpO7TCZ3mUzuMpncZTK5 y2Ryl8nkLpPJXSaTu37A5L75/Obu54+Pv27F3ePDL7+/f/P4jfju7fs37377dPf7p4c/3/30/uPb X++OCWpzpL5XGG8/Ph4/9d2HX+4+PPz988OHz5+OiN/+CseP/XDKP92lFy95/iUfH44/6vPHu/tL 9Bw2rGIdPfGGm4VtosYL2Y0XshsvZDdeyG68kN14IbvxQnbjhezGC9mNF7IbL2Q3XshuvJDdeCG7 8UJ244XsxgvZjReyGy9kN17IbryQ3Xghu/FCduOF7MYL2Y0XshsvZDdeyG68kN14IbvxQnbjhezG C9mNF7IbL2Q3XshuvBAuuRAuuRAuuQguWe4J+LhV4ClvFXjKWwWe8laBp7xV4ClvFXjKWwWe8lah p0zAx61CuUHAx61CuUHAx61CuUHAx61CuUHAx61CuUHAx61CuUHAx61iKw6zRWKaNpdp2lymaXOZ ps1lmjaXadpcpmlzmabNZZo2l2naXKZpc5mmzWWaNpdp2lymaXOZps1lmjaXadpcpmlzmabNZZo2 l2naXKZpc5mmzWWaNpdp2lymaXOZps1lmjaXadpcpmlzmabNZZo2l2naXKZpc5nQ8DKh4WVCw0uE hs8OhxjMS9qzHyIG85L27J6IwbykPXstYjAvac/OjBdM5HzPPo4YzKwAkfM9m0FiMLMCRM737CiJ wcwKEDnfsy0lBjMrQOR8z97Wd4Id//W3N7+8e3v34ffffnp4vLv/+/0R7Y/62nM9L/zbw+Ond8eP ev3SQMwWj9miMXs8Zo/GHPGYIxpzxmPOaMwVj7mCMct9OObTpYGYKR4zRWPmeMwcjVniMUs0ZryO SrSOSryOSrSOSryOSrSOSryOSrSOSryOSrSOSryOSrSOaryOarSOaryOarSOaryOarSOaryOarSO aryOarSOaryOarSOaryOarSOaryOarSOaryOarSOaryOarSOWryOWrSOWryOWrSOWryOWrSOWryO WrSOWryOWrSOWryOWrSOWryOWrSOWryOWrSOWryOWrSOWryOWrSOeryOerSOeryOerSOeryOerSO eryOerSOeryOerSOeryOerSOeryOerSOeryOerSOeryOerSOeryOerSORryORrSORryORrSORryO RrSORryORrSORryORrSORryORrSORryORrSORryORrSORryORrSORryORrSOZryOZrSOZryOZrSO ZryOZrSOZryOZrSOZryOZrSOZryOZrSOZryOZrSOZryOZrSOZryOZrSOZryOZrSOVryOVrSOVryO VrSOVryOVrSOVryOVrSOVryOVrSOVryOVrSOVryOVrSOVryOVrSOVryOVrSOVryOVrCOxn24jp4v DcQM19HzpYGY4Tp6vjQQM1xHz5cGYobr6PnSQMxwHT1fGogZrqPnSwMxw3X0fGkgZriOni8NxAzX 0fOlr8dM8TpK0TpK8TpK0TpK8TpK0TpK8TpK0TpK8TpK0TpK8TpK0TpK8TpK0TpK8TpK0TpK8TpK 0TpK8TpK0TrK8TrK0TrK8TrK0TrK8TrK0TrK8TrK0TqK8wwjyjOMOM8wojzDiPMMI8ozjDjPMKI8 w4jzDCPKM4w4zzCiPMOI8wwjyjOMOM8wojzDiPMMI8ozjDjPMKI8w4jzDCPKM4w4zzCiPMOI8wwj yjOMOM8wojzDiPMMI8ozjDjPMKI8w4jzDCPKM4w4zzCiPMOI8wwjyjOMOM8wojzDiPMMI8ozjDjP MKI8w4jzDCPKM4w4zzCiPMOI8wwjyjOMOM8wojzDiPMMI8ozjDjPMMgZAL2ToT29k6E9vZOhPb2T 8Tu9k/E7vZPxO72T8Tu9k/E7vZPxO72T8Tu9k0E6vZNBOr2TQTq9k5E4vZOROL2TkTi9k5E4vZOR OL2TkTi9k5E4vZOROL2TkTi9k5E4vZOROL2TkTh9kBME+yCDdPogg3T6IIN0+iCDdPogg3T6IIN0 +iCDdPogI3H6ICNx+iAjcfogI3H6IMNt+iBjavogY2r6IGNq+iBjavogY2r6IGNq+iBjavogY2r6 IOfz9UHO5+uDnM/XBzmfrw9yPl8f5Hy+Psj5fH2Q8/n6IOfz9UHO5+uDnM/XBzmf71w7WK62c0kh BvN8necCRAzmWTHP5YoYzLNinosbMZhnxTyXQmIwM8/EwSfneuoHJtGvqmv299WI+N/u7neUp390 fw7m/m74cQ4J//2vn79cvpU/uPq/XL/Lf/z+4ddL8acPH+/+/e7hw+fjr/qHn/QH1XHNqxf99fHj T+8ffrv7z3ef//KHK95+/HCNGH/34dtf5/pt/vLmbw93b98/vHl8+PO317D1qPgIzYIUh7qci1ox mFmQ4lCXc2UsBjOrWxzqci6vxWBmBYhDXc41uhhMrIAhTog5F/piMLEChjgh5uwWiMHEChjiUJez 5SAGM5NWHOpy9i3EYGZqiKNTzuaHGMzMM3F0ytlBEYOZeSYekXi2YcRg5oejeETi2csRg5kVIB6R eDaExGBmBYhHJJ5dJTGYWQHfPyIxslU+41jljGKVM45VzihWOeNY5YxilTOOVc4oVjnjWOWMYpUz jlXOKFY541jljGKVM45VzihWOeNY5YxilTOOVc4oVjnjWOWMYpUzjlXOKFY541jljGKVM45VzihW OeNY5YxilTOOVc4oVjnjWOWMYpUzjlXOKFY541jljGKVM45VzihWOeNY5YxilTOOVc4oVjnjWOWM YpUzjlXOKFY541jljGKVM45VzihWOeNY5YxilTOOVc4oVjnjWOWMYpUzjlXOKFY541jljGKVM45V frk0EDNeR8ExUfvCeB0Fx0TtC+N1FBwTtS+M11FwTNS+MF5HwTFR+8J4HQXHRO0L43UUHBO1L4zX UXBM1BzhMVFfLg3EjNdRcEzUvjBeR8ExUfvCeB0Fx0TtC+N1FBwTtS+M11FwTNS+MF5HwTFR+8J4 HQXHRO0L43UUHBO1L4zXUXBM1BzhMVFfLg3EjNdRcEzUvjBeR8ExUfvCeB0Fx0TtC+N1FBwTtS+M 11FwTNS+MF5HwTFR+8J4HQXHRO0L43UUHBO1L4zXUXBM1BzhMVFfLg3EjNdRcEzUvjBeR8ExUfvC eB0Fx0TtC+N1FBwTtS+M11FwTNS+MF5HwTFR+8J4HQXHRO0L43UUHBO1L4zXUXBM1BzhMVFfLg3E jNdRcEzUvjBeR8ExUfvCeB0Fx0TtC+N19HTp9Q9//vj425vPd+++c1HgB8eLLThLal8YL7bgLKl9 YbzYgrOk9oXxYgvOktoXxovt6dJXHmSwImd44NSXSwMxwxU5gwOn9oXhipzBgVP7wnBFzuDAqX1h uCJncODUvjBcbDM4cGpfGC62GRw4tS8MF9sMDpzaF4aLbQYHTu0Lw8U2gwOn5gwPnPpyaSBmvI6C A6f2hfE6Cg6c2hfG6yg4cGpfGK+j4MCpfWG8joIDp/aF8ToKDpzaF8brKDhwal8Yr6PgwKl9YbyO ggOn5oyTETNKRsw4GTGjZMSMkxEzSkbMOBkxo2TEjJMRM0pGzDgZMaNkxIyTETNKRsw4GTGjZMSM kxEzSkbMOBkxo2TEjJMRM0pGzDgZMaNkxIyTETNKRsw4GTGjZMSMkxEzSkbMOBkxo2TEjJMRM0pG zDgZMaNkxIyTETNKRsw4GTGjZMSMkxEzSkbMOBkxo2TEjJMRM0pGzDgZMaNkxIyTETNKRsw4GTGj ZMSMkxEzSkbMOBlxXHorltrvj70morrdlL5V43ZT+qG63ZR+qG43pR+q203ph+p2U/qhut2Ufqhu H1hwqFBugHFRhwrlBhgXdahQboBxUYcK5QYYMnWoUG6AIVOHCuUGGE11qFBugNFUhwrlBhhNdahQ boDRVIcK5QYYTXWoUG6A0VSHiuTGBKOpDhXJjQlGUx0qkhsTjKY6VCQ3JhhNdahIbhwdV6JCuQEG Wh0qlBtgoNWhQrkBxmAdKpQbYHjWoUK5AYZnHSqUG2B41qFCuQGGZx0qlBtgeNahQrkBhmcdKpQb YHjWoUK5AYZnHSr0vtE1x+i1LPOCDc0xei3ixGCaY/Ra8onBNMfotUAUg2me6Ws5KQYzK8Cb8nWt ScVgZgV4U76uha0YzKwAb2TYtToWg5kV4I3VupbYXjBvrNa1IBeDmRXgjdW6VvViMLMCvLFaV2tA DGZWgDdW6+oviMHECpjeWK2rSSEGEytgemO1rk6HGEysgKMvIgYzK8Cb0XU1V8RgZgUkswK8gV9X 40YMZlaANz3s6v6IwcwK8KaHXS0kMZhZAd70sKsPJQYzK8CbHnY1s8RgZgV408OujpgYzKwAMHz+ UKHeKhg+f6hQb7Wg3mpBvdWCeqsF9VYr6q1W1HevKDcqyo2KcqOi3KgoNxAfNCvKjYpyo6HcAAfD HSqUGw3lRkO50VBuNJQbDeVGQ7nRUG50lBsd5UZHudFRbnSUGx3lRke50VFuIK5wIq5wIq5wIq5w Iq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5wIq5w Iq5wIq5wIq5wIq5wIq5wetObr2WZGOz7HYg3n98cNvhft+Lu8eGX39+/efxGfPf2/Zt3v326+/3T w5+fDgFK6XiXm/f70/w4HWj/1Hcffrn78PD36yCe4wSfb36F48d+OOWf7tKLlzz/ko8Pxx/1+ePd 5Qn5EjasYmvTf+EetRfvUWp9v5Pvigzeo/b6PWroHr2kYitxMSnNflEx+0XF7BdVs19UzX5RNT+v qvl5Vc2OaTU7ptWsgGpWQDUroJoV0MwKaGYFNLMCmlkBzayAZlZAMyugmRXQzApoZgV0swK6WQHd rIBuVkA3K6CbFdDNCuhmBZgE9TQJ6mkS1NMkqKdJUE+ToJ4mQT1NgnqaBPU0CeppEtTTJKinSVBP k6CeJkE9TYJ6mgT1NAnqaRLU0ySop0lQT5OgniZBPU2CepoE9TQJ6mkS1NMkqCdyUU/kop7IRT2R i3ohF/VCLuqFXNQLuagXclEv5KJeyEW9kIt6IRf1Qi7qhVzUC7moF3JRL+SiXshFvZCLeiEX9UIu 6oVc1Au5qBdyUS/kol7IRb2Qi3ohF/VCLuqFXNQLuagXclEv5KJeyEW9kIt6IQp0IQp0IQp0IQp0 IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0IQp0 IQp0IQp0IQp0IQp0MQrUdLBO08E6TQfrNB2sy3SwLtPBukwH6zIdrMt0sC7TwbpMB+syHazLdLAu 08G6TAfrMh2sy3SwLtPBukwH6zIdrMt0sC7TwbpMB+syHazLdLAu08G6TAfrMh2sy3SwLtPBukwH 6zIdrMt0sC7TwbpMB+syHazLJKiXSVCvHxDUqAEiBjMrwGRyl8nkLpPJXSaTu0wmd5lM7jKZ3GUy uctkcpfJ5C6TyV0mk7tMJneZTO4ymdxlMrnLZHKXyeQuk8ldJpO7TCZ3mUzuMpnchVzUC7moF3JR L+SiXshFvZCLeiEX9UJ+6IX80Av5oRfyQy/kh17ID72QH3ohP/RCfuiF/NAL+aEX8kMv5IdeyA+9 kB96IT/0Qn7ohfzQC/mhF/JDL+SHXsgPvZAfeiE/9EJ+6IX80Av5oRfyQy9ECC5ECC5CCKZ7wvpt FXjKWwWe8laBp7xV4ClvFXjKWwWe8lah50X4u61Cz4vwd1uF7jwh6bYK3XlC0m0Ve17gszfdE5Ju q9DzYkyc6edbpp9vmX6+Zfr5lunnW6afb5l+vmVa8JZpwVumBW+ZFrxlWvCWacFbpgVvmRa8ZVrw lmnBW6YFb5kWvGVa8JZpwVumBW+ZFrxlWvCWacFbpgVvmRa8ZVrwlmnBW6YFb5kWvGVa8JZpwVum BW+ZFrxlIqDLRECXiICeq3QxmJe055peDOYl7dkBEIN5SXv2C8RgZp6JbOTZdBCDmXkm4oxn50IM ZqaGiDOe7Q8xmPeNfjZLxGBmnokEYkZn7x7/C6lAryujU3QzOg83o5NtMzrZNqOTbTM62Tajk20z OqM2ozNqMzpjI6MzNjI6YyOjMzYyOmMjozM2MjpjI6MzNjI6YyOjMzYyOmMjozM2MjpjI6MzNjI6 YyOjMzYyOmMjozM2MjpjI6MzNjI6YyOjMzYyOmMjozM2MjpjI6MzNjI6YyOjMzYyOmMjozM2Mjpj I6MzNjI6YyOjMzYyOmMjozM2MjpjI6MzNjI6YyOj0zIyOvcio3MvMjrBIqMTLLJ59uL5mi8G85Z6 2TwuMZsnHGbzUMJsHkqYzUMJs3koYTYPJczmOYLZPEcwm+dYZPMci/yjcyzQQkkMZiat6MLK5skI 2TwZIZsnI2TzZIRsnoyQzZMRsnkyQjZPRsjmyQjZPBkhmycjZPNkhGyejJDNkxGyeTJCNk9GyObJ CNk8GSGbJyNk82SEbJ6MkM2TEbJ5MkI2T0bI5skI2TwZIZsnI2TzZIRsnoyQzZMRsnkyQjZPRsjm yQjZPMwgm+cPZPP8gWweGZDNIwMyOmMzozM2MzpjM6MzNjM6LTOj0zIzOvcyo3MvMzr3MqNzLzM6 9zKjcy8zOvcyo3MvM5rpntF09oyms2c0nT2j6ewZTWfPaDp7RtPZM5rOntGc9YzmrGc0Zz2jiekZ zT7PaIp5RvPIM5pHntE88ozmkWc0jzyjeeQZzSPPaB55RvPIM5pHntE88ozmkWc0jzyjeeQZzSPP aB55RvPIM5osntGM8IymfWc0tzujud3ZPKcqm+dUZfOcqmyeU5XNo6WyebRUNk+DyuZpUNk8DSqb p0Fl8zSobJ4Glc3ToLJ5GlQ2B4hnc+Z3Nmd+Z3PmdzZnfmdz5nc2Z35nc+Z3Nmd+Z3NMdzbHdGdz THc2J2tncxh2NudXZ3PkdDZHTmdz5HQ2R05nc+R0NkdOZ3PkdDZHTmdz5HQ2R05nc+R0NkdOZ3Pk dDZHTmdz5HQ2R05nc+R0NqdEZ3OwczZnMWdzfHL+wfjk47/+9uaXd2/vPvz+208Pj3f3f78/ov1R X4992uPCvz08fnp3/KjXLw3EbPGYLRqzx2P2aMwRjzmiMWc85ozGXPGYKxhz3IdjPl0aiJniMVM0 Zo7HzNGYJR6zRGPG62hE62jE62hE62jE62hE62jE62hE62jE62hE62jE62hE62jG62hG62jG62hG 62jG62hG62jG62hG62jG62hG62jG62hG62jG62hG62jG62hG62jG62hG62jG62hG62jF62hF62jF 62hF62jF62hF62jF62hF62jF62hF62jF62hF62jF62hF62jF62hF62jF62hF62jF62gF6+joJAdj Pl8aiBmuo+dLAzHDdfR8aSBmuI6eLw3EDNfR86WBmOE6er40EDNcR8+XBmKG6+j50kDMcB09XxqI Ga6j50tfj5nidZSidZTidZSidZTidZSidZTidZSidZTidZSidZTidZSidZTidZSidZTidZSidZTi dZSidZTidZSidZTjdZSjdZTjdZSjdZTjdZSjdZTjdZSjdZTjdZSjdZTjdZSjdZTjdZSjdZTjdZSj dZTjdZSjdZTjdZSjdVTidVSidVTidVSidVTidVSidVTidVSidVTidVSidVTidVSidVTidVSidVTi dVSidVTidVSidVTidVSidVTjdVSjdVTjdVSjdVTjdVSjdVTjdVSjdVTjdVSjdVTjdVSjdVTjdVSj dVTjdVSjdVTjdVSjdVTjdVSjddTiddSiddTiddSiddTiddSiddTiddSiddTiddSiddTiddSiddTi ddSiddTiddSiddTiddSiddTiddSiddTjddSjddTjddSjddTjddSjddTjddSjdRTnGVaUZ1hxnmFF eYYV5xlWlGdYcZ5hRXmGFecZVpRnWHGeYUV5hhXnGVaUZ1hxnmFFeYYV5xlWlGdYcZ5hRXmGFecZ VpRnWHGeYUV5hhXnGVaUZ1hxnmFFeYYV5xlWlGdYcZ5hRXmGFecZVpRnWHGeYUV5hhXnGVaUZ1hx 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 iN/+CseP/XDKP921+5Lyi5c9/6KPD8cf9vnj3XWq+5fQKapi3QPvpjujVr/2GsRgZnE7B9x9bViI wczi/sEBd6+XUOkvlFAefX/+tPt6Hyyh0v+hhPYL4XyxhkonNfSiinV0xLtufnU7h/d9bQuJwczq dkZ0fe0ticHM6jZR6mmi1NNEqaeJUk8TpZ4mSj1NlHqaKPU0UeppotTTRKmniVJPE6WeJko9TZR6 mij1NFHqaaLU00Spp4lSTxOlniZKPU2Uepoo9TRR6mmi1NNEqSeyU09kp57ITj2RnXoiO/VEduqJ 7NQT2aknslNPZKeeyE49kZ16Ijv1RHbqiezUE9mpJ7JTT2SnnshOPZGdeiI79UR26ons1BPZqSey U09kp57ITj2RnXohO/VCduqF7NQL2akXslMvZKdeyE69kJ16IRx0IRx0IRx0IRx0IRx0IRx0IRx0 IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0IRx0 IRx0MRzUtLJO08o6TSvrNK2s07SyTtPKOk0r6zStrNO0sk7TyjpNK+s0razTtLJO08o6TSvrNK2s 07SyTtPKOk0r6zStrNO0sk7TyjpNK+v8gZX1dTRgtRfQgFp6zqnsOo2RAfs3+CMZMHNP9y9eRsCA F1WsAyHe8+/XduCejxfu+Sgzp15alMbYv8Ef7/nYb40v3r2B7vlLKtaJEe+5+Km1TPvxMu3Hy7Qf L9N+vEz78TLtx8u0Hy/TfrxM/H39AH9/9VNni1+CwEpqed4fU7lCHzvHr/APHGWp9cWrwKfOyyrW d/PuuQn2LxPsXybYv0ywf5lg/zLB/mWC/csE+5cJ9i8T7F8m2L9MsH+ZYP8ywf5lgv3LBPuXCfav H4D9qFnqBTPp92XS78uk35dJvy+Tfl8m/b6QuX8hc/9C5v6FzP0LmfsXMvcvZO5fyNy/kLl/IXP/ Qub+hcz9C5n7FzL3L2TuX8jcv5C5fyFz/0Lm/oXM/QuZ+xcy9y9k7l/I3L+QuX8hc/9C5v6FzP0L mfsXMvcvZO5fyNy/kLl/IXP/Qub+hcz9C1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1Gu C1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1GuC1Gui1GuP3Afo2WZ GMzsQJgO3WU6dJfp0F2mQ3eZDt1lOnSX6dBdpkN3mQ7dZTp0l+nQXaZDd5kO3WU6dJfp0F2mQ3eZ Dt1lOnSX6dBdpkN3mQ7dZTp0l+nQXaZDd5kO3WU6dJfp0F2mQ3eZDt1lOnSX6dBdpkN3mQ7dZRLi yyTEl0mIL5MQXyYhvkxCfJmE+DIJ8WUS4sskxJdJiC+TEF8mIb5MQnyZhPgyCfFlEuLLJMSXSYgv kxBfJiG+TEJ8mYT4Mg87WiZHvczDjpZJGy+RNs73xCW+VaC3ulWgt7pVoLe6VaC3ulWgt7pVoLe6 VaC3ulWgt7pVoLea74lLfKtQbhCX+Fah3CAu8a1CuUFc4luFcoO4xLcK5QZxiW8Vyg3iEt8qlBvE Jb5VKDeIS3yrUG4Ql/hWodwgLvGtQrlBXOJbhXKDuMS3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3 CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG4Qq3CuUG 4Qq3iq1TvA7EuSwTg3kdiHMRJwbzOhDnkk8M5nUgzgWiGMzrQJzLSS+Y6Ik8F59iMLMCRE/kuYIV g5kVIHoiz2WwGMysANETea6lxWBmBYieyHNBLgYzK0D0RJ6rejGYWQGiJ/JsDXjBRE/k2UgQg5kV IHoiz26EGMysAJHJPVsaYjCzAkQm9+yLiMHMChCZ3LO5IgYzK0Bkcs8OjRjMrACRyT3bPF4wkck9 m0JiMLMCRCb37CyJwcwKEJncsz0lBjMrQGRyzx6XGMysAJHJPRtlYjDUWyW+3K1CvVXiy90q1Fsl vtx8T3y5W4V6q8SXu1Wot0p8uVuFcoP4crcK5Qbx5W4Vyg3iy90qlBvEl7tVKDeIL3erUG4QX+5W odwgvtytQrlBfLlbhXKD+HK3CuUG8eVuFcoN4svdKpQbxJe7VSQ3EuIKE+IKE+IKE+IKE+IKE+IK E+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IKE+IK E+IKE+IKE+MKRU/kuSwTg5kdCNETea7txGBmB0L0RJ4LRDGY2YEQPZHnKlMMZlaA6Ik8l6piMLMC RE/kud4Vg5kVIHoiz0WzGMysANETea68xWBmBYieyHP57gUTPZHnYl8MZlaA6Ik8OwZiMLMCRE/k 2XYQg5kVYHoik8nkJpPJTSaTm0wmN5lMbjKZ3GQyuclkcpPJ5CaTyU0mk5tMJjeZTG4ymdxkMrnJ ZHKTyeQmk8lNJpObTCY3mUxuMpncZDK5yWRyk8nkJpPJTSaTm0wmNyFfbkK+3IR8uQn5chPy5Sbk y03Il5uQLzchX25CvtyEfLkJ+XIT8uUm5MtNyJebkC83IV9uQr7chHy5CflyE/LlJuTLTciXm5Av NyFfbkK+3IR8uQn5chPy5Sbky03Il5uQLzchX25CvtyEfLkJ+XIT4goT4goT4goT4goT4goT4goT 4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT4goT 4goT4goT4gqT6YlMpicymZ7IZHoik+mJTKYnMpmeyGR6IpPpiUymJzKZnshkeiKT6YlMpicymZ7I ZHoik+mJTKYnMpmeyGR6IpPpiUymJzKZnshkeiKT6YlMpicymZ7IZHoik+mJTKYnMpmeyGR6IpPp iUymJzKZnshkeiKTyeQmk8lNJpObTCY3mUxuMpncZDK5yWRyk8nkJpPJTSaTm0wmN5lMbjKZ3GQy uclkcpPJ5CaTyU0mk5tMJjeZTG4ymdxkMrnJZHKTyeQmk8lNJpObTCY3IV9uQr7chHy5CflyE/Ll JuTLTciXm5AvNyNfbka+3Ix8uRn5cjPy5Wbky83Il5uRLzcjX25GvtyMfLkZ+XIz8uVm5MvNyJeb kS83I19uRr7cjHy5GflyM/LlZuTLzciXm5EvNyNfbka+3Ix8uRn5cjPiCjPiCjPiCjPiCjPiCjPi CjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPiCjPi CjPiCjPiCjPjCk1PZDI9kcn0RCbTE5lMT2QyPZHJ9EQm0xOZTU9kNj2R2fREZtMTmU1PZDY9kdn0 RGbTE5lNT2Q2PZHZ9ERm0xOZTU9kNj2R2fREZtMTmU1PZDY9kdn0RGbTE5lNT2Q2PZHZ9ERm0xOZ TU9kNj2R2fREZtMTmU0mN5tMbjaZ3GwyudlkcrPJ5GaTyc0mk5tNJjebTG42mdxsMrnZZHKzyeRm k8nNJpObTSY3m0xuNpncbDK52WRys8nkZpPJzSaTm00mN5tMbjaZ3GwyuRn5cjPy5Wbky83Il5uR LzcjX25GvtyMfLkZ+XIz8uVm5MvNyJebkS83I19uRr7cjHy5GflyM/LlZuTLzciXm5EvNyNfbka+ 3Ix8uRn5cjPy5Wbky83Il5uRLzcjX25GvtyMfLkZ+XIz8uVm5MvNyJebEVeYEVeYEVeYEVeYEVeY EVeYEVeYEVdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdYEFdY EFdYEFdYEFdYGFdoeiKz6YnMpicym57IbHois+mJzKYnMpueyGx6IrPpicymJzKbnshseiKz6YnM picym57IbHois+mJzKYnMpueyGx6IrPpicymJzKbnshseiKz6YnMpicym57IbHois+mJzKYnMpue yGx6IrPpicymJzKbnshsMrnZZHKzyeRmk8nNJpObTSY3m0xuNpncYjK5xWRyi8nkFpPJLSaTW0wm t5hMbjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktyJdbkC+3IF9uQb7c gny5BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL 8uUW5MstyJdbkC+3IF9uQb7cgny5BflyC/LlFuTLLciXW5AvtyBfbkG+3IK4woK4woK4woK4woK4 woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4woK4 woK4woK4woK4woK4wmJ6IovpiSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYnspieyGJ6Iovp iSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYnspieyGJ6IovpiSymJ7KYnshieiKL6Ykspiey mJ7IYnoii+mJLKYnspieyGIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNb TCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ3GIyucVkcovJ5BaTyS3Il1uQL7cgX25B vtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5BflyC/LlFuTLrciXW5EvtyJfbkW+3Ip8uRX5 civy5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdbkS+3Il9uRb7cirjCirjCirjCirjC irjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjCirjC irjCirjCirjCirjCyrhC0xNZTE9kMT2RxfREFtMTWUxPZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZ TE9kMT2RxfREVtMTWU1PZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1PZDU9 kdX0RFbTE1lNT2Q1PZHV9ERWk8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ 3GoyudVkcqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuRb7ciny5FflX K/KvVuRfrci/WpF/tSL/akX+1Yr8qxX5Vyvyr1bkX63Iv1qRf7Ui/2pF/tWK/KsV+Vcr8q9W5F+t yL9akX+1Iv9qRf7VivyrFflXK/KvVuRfrci/WpF/tSL/akX8XUX8XUV0W0V0W0V0W0WcWkWcWkWc WkWcWkWcWkWcWkWcWkOcWkOcWkPEWWPEmenZqqZnq5r+o2r6j6rpP6qm/6ia/qNq+o+q6T+qpv+o mv6javqPquk/qqb/qJr+o2r6j6rpP6qm/6ia/qNq+o+q6T+qpv+omv6javqPquk/qqb/qJr+o2r6 j6rpP6qm/6ia/qNq+o+qyb9Vk3+rJhhWTTCsmmBYNVmuarJc1WS5qslyVZPlqibLVU2Wq5ksVzNZ rmbiV83ErxrqvzXUf2uo/9ZQ/62h/ltDnbSGOmkN9cQa8qQ25EltyJPaUNeuoa5dQ127hrp2DXXt GuraNdS1a6hr11DXrqGuXUf9t458oh117TpyfHbk3ezIhdmRC7MjF2ZHLsyOXJgduTA7cmF25MLs yIXZkQuzIxdmRy7MjlyYHbkwO3JhduTC7MiF2ZELsyMXZkcuzI5cmB25MDtyYXbkwuzIhdmRC7Mj F2ZHLsyOXJgduTA7cmE2s3vWzO5ZM7tnzeyeNbN71syGVzMbXs3sUTXTo9lMj2YzPZrNbMU1sxXX zFZcM1txzWzFNbMV18xWXDNbcc1sxTWzFdfN7lk3nZDdbMV107zYTb9hNy2C3bQIdtMi2E2LYDct gt20CHbTIthNi2A3LYLdtAh20yLYTYtgNy2C3bQIdtMi2E2LYDctgt20CHbTIthNi2A3LYLdtAh2 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 IBozI8CSSB71BdGYGQGWRPIoUojGzAiwJJJHpUM0ZkaAJZE8yiWeMUtveRRXRGNmBFhT848KjWjM jABrav5R5hGNmRFgTc0/akWiMTECisaX7wUn0ZgYAUXjy/eqlWhMjICi8eV76cszppHve6FMNIZq q+O66g2FaqvjuuoNhWqr42rsDYVqq+Nq7BU1rsbeUKjuPq7G3lDIN8bV2BsK+ca4GntDId8YV2Nv KOQb42rsDYV8Y1yNvaGQb4yrsTcU8o1xNfaGQr4xPPt9RyHfGNdwbyjkG+Ma7g2FfGNcw72hkG+M a7g3FPINxCssiFdYEK+wIF5hQbzCgniFBfEKC+IVFsQrLIhXWBCvsCBeYUG8woJ4hQXxCgviFRbE KyyIV1gQr7AgXmFBvMKCeIUF8QoL4hUWxCssiFdYEK+wIF5hsbaWHWmZaMysQGhK6p7bicbMCoQm y+4JomdMk2X3dFI0ZkaAJsvuOalozIwATZbdE1vRmBkBmiy7Z8eiMTMCNFl2T7FFY2YEaLLsnqeL xswIsPYsHMm+Z0zTePfSgGjMjABN493rC6IxMwI0jXcvUojGzAgwObnF5OQWk5NbTE5uMTm5xeTk FpOTW0xObjE5ucXk5BaTk1tMTm4xObnF5OQWk5NbTE5uMTm5xeTkFpOTW0xObjE5ucXk5BaTk1tM Tm4xObnF5OQWk5NbkC63IF1uQbrcgnS5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rak yy1Il1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkS63Il1uRbrcinS5FelyK9LlVqTLrUiXW5Eu tyJdbkW63Ip0uRXxCiviFVbEK6yIV1gRr7AiXmFFvMKKeIUV8Qor4hVWxCusiFdYEa+wIl5hRbzC iniFFfEKK+IVVsQrrIhXWBGvsCJeYUW8wop4hRXxCiviFVbEK6yMV2hqIoupiSymJrKYmshiaiKL qYkspiaymJrIYmoii6mJLKYmspiayGJqIoupiSymJrKYmshiaiKLqYkspiaymJrIYmoii6mJLKYm spiayGpqIqupiaymJrKamshqaiKrqYmspiaymprIamoiq6mJrKYmspqayGpycqvJya0mJ7eanNxq cnKrycmtJie3mpzcanJyq8nJrSYnt5qc3GpycqvJya0mJ7eanNxqcnKrycmtJie3mpzcanJyq8nJ rSYnt5qc3GpycqvJya0mJ7eanNyKdLkV6XIr0uVWpMutSJdbkS63Il1uRbrcinS5FelyK9LlVqTL rUiXW5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVWpMutSJdbkS63 Il1uRbrcinS5FelyK9LlVqTLrYhXWBGvsCJeYUW8wop4hRXxCiviFVbEK6yIV1gRr7AiXmFFvMKK eIUV8Qor4hVWxCusiFdYEa+wIl5hRbzCiniFFfEKK+IVVsQrnBCvcEK8wgnxCifGKzQ1kdXURFZT E1lNTWQ1NZHV1ERWUxNZTU1kNTWR1dREVlMTWU1NZDU1kdXURFZTE1lNTWQ1NZHV1ERWUxNZTU1k NTWR1dREVlMTWU1NZDU1kdXURFZTE1lNTWQ1NZHV1ERWUxNZTU1kNTWR1dREVlMTWU1NZDU5udXk 5FaTk1tNTm41ObnV5ORWk5NbTU5uNTm51eTkVpOTW01ObjU5udXk5FaTk1tNTm41ObnV5ORWk5Nb TU5uNTm51eTkVpOTW01O7mRycieTkzuZnNzJ5OROSJc7IV3uhHS5E9LlTkiXOyFd7oR0uRPS5U5I lzshXe6EdLkT0uVOSJc7IV3uhHS5E9LlTkiXOyFd7oR0uRPS5U5IlzshXe6EdLkT0uVOSJc7IV3u hHS5E9LlTkiXOyFd7oR0uRPS5U5IlzshXe6EdLkT0uVOiFc4IV7hhHiFE+IVTohXOCFe4YR4hRPi FU6IVzghXuGEeIUT4hVOiFc4IV7hhHiFE+IVTohXOCFe4YR4hRPiFU6IVzghXuGEeIUT4hVOiFc4 IV7hhHiFE+IVTqYmcjI1kZOpiZxMTeRkaiInUxM5mZrIydRETqYmcjI1kZOpiZxMTeRkaiInUxM5 mZrIydRETqYmcjI1kZOpiZxMTeRkaiInUxM5mZrIydRETqYmcjI1kZOpiZxMTeRkaiInUxM5mZrI ydRETqYmcjI1kZOpiZxMTeRkcnInk5M7mZzcyeTkTiYndzI5uZPJyZ1MTu5kcnInk5M7mZzcyeTk TiYndzI5uZPJyZ1MTu5kcnInk5M7mZzcyeTkTiYndzI5uZPJyZ1MTu5kcnInk5M7mZzcyeTkTkiX OyFd7oR0uRPS5U5IlzshXe6EdLkT0uVOSJc7IV3uhJSoE1KiTkiJOiEl6oSUqBNSok5IsTkhxeaE FJsT0kM2pIdsSA/ZkB6yIT1kQ3yuhvhcDfG5GuJzNcTnaojP1RCfqyE+V0N8rob4XA3xuRriczXE 52qIz9UQn6shPldDfK6G+FwN8bka4nM1xOdqiM/VEJ+rIT5XQ3yuhvhcDfG5GuNzmVq0ydSiTaYW bTK1aJOpRZtMLdpkatEmU4s2mVq0ydSiTaYUajKlUJMphZpMKdRkSqEmUwo1mbKeyZT1TKasZzL1 Ls3UuzRT79JMvUsz9S7N5Fs1k2/VTL5VM/lWzeRbNZNv1Uy+VTP5Vs3kWzWTb9VMvlUz+VbN5Fs1 k2/VTL5VM/lWzeRbNZNv1Uy+VTP5Vs3kWzWTb9VMvlUz+VbN5Fs1k2/VTL5VE/lWDW0Ob2hzeEOb wxvaHN7Q5vCGNoc3tDm8oc3hDW0Ob2gHeEM7wBvaAd7QDvCGdoA3tAO8oR3gDe0Ab2gHeEM7wBva Ad7QDvCGdoA3tAO8oR3gDe0Ab2gHeEM7wBvaAd7QDvCGdoA3tAO8oR3gDe0Ab2gHeEM7wBvaAb7+ ziMU8g3Sm2poB3hDO8Ab2gHe0A7whnaAN3N5bzOX9zZzeW8zl/c2c3lvM5f3NnN5bzOX9zZzeW8z 9+02c99uM/ftNnPfbjP37TZz324z9+02c99uM/ftNnPfbjP37TZz324z9+02c99uM/ftNnPfbjP3 7TZz324z9+02c99uM/ftNnPfbjP37TZz324z9+02c99uM/ftbjmIaMyMALHX0cx9u83ct9vMfbvN 3LfbzH27rRJeX6uE19cq4fW1Snh9rRJeX6uE19cq4fW1Snh9rZI5ba2SOW2tkjltrZI5ba2SOW2t kjltrZI5ba2SOW0N7X9taP9rQ/tfG9r/2tD+14b2vza0/7Wh/a8N7X9taP9rQ/tfG9r/2tD+14b2 vza0/7Wh/a8N7X9taP9rQ/tfG9r/2tD+14b2vza0/7Wh/a8N7X9taP9rQ/tfG9r/2tD+14b2vza0 /7Wh/a8N7X9taP9rQ/tfG9r/2tD+14b2vza0/7Wh/a8N7X9taP/rljuIiYiZPYs8qS0BEY2Z2bPI k9qyGNGYmT2Lc6m2VEg0ZkaAOJdqy6dEY2YEiHOptqTMMybOpWrmrthm7opt5q7YZu6Kbeau2Gbu im3mrthm7opt5q7YZu6Kbeau2Gbuim3mrthm7opt5q7YZu6Kbeau2Gbuim3mrthm7opt5q7YZu6K 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 lMOtKCEa8yJgK2GIxrwI2AoeojEvArbyiGjMi4CtmCIaMyNAnGSxVWREY2YEiJzPrawjGjMjQKRp brUh0ZjptCJNcyswicZMpxVpmnkmA+8yksAsKFBVzEjMkpGYJSMxS0aylIxkKRnJUjKSpWQkS8mI C5IRqyMjfsaCQs+LsDoyYnVkxOrIiNWREasjI1ZHRqyOjFgdGbE6MmJ1ZMTqyIjVkRGrIyNWR0as joxYHRmxOjJidWTE6siI1ZERqyMjfkZG/IyM+BkZ8TMy4mdkxM/IiJ+RET8jI35GRvyMjPgZGfEz CuJnFMTPKIifURA/oyB+RkH8jIL4GQXxM7b3eTE58PLG7e3fMyay5LPJks8mSz6bxPZsEtuzSWzP JrE9m8T2bJI4ssm7yCZVYsuIRGOmn4m8i2zyLrLJu8gm7yKbvIts8i6yybvIJu8im7yLbPIussm7 yCbvIpu8i2zyLrLJu8gm7yKbvIts8i6yybvIJu8im1SJbFIlskmVyCZVIptUiWxSJbJJlcgmVSKb VIlsUiWySZXIJlWimFSJYlIlikmVKCZVophUiWJSJYpJlSgmVaKiUZgLCtS8KhqgWdEIwor6rxX1 Xyvqv1Y0uLCiwYUV9Xor6vVW1OutaHBhRR3iijrEFXWIK+oQV9QhrqhDXNG0gIr6yhVNC6ioG11R N7qibnRF3eiKutEVdaMr6kZX1I2uqBtdUTe6om50Rd3oirrRFXWjK+pGV9SNrqgbXVE3uqJudEXd 6Iq60RV1oyvqRlc0Y6CiHnZFPexqjs7bXhs9Y+IcvmqO56pmr7CavcJq9gqrOeurmrO+qtnFrGYX s5pdzGrO+qpmS7SaLdFqtkSr2RKtZku0mi3Rauraq9lfraauvZrN2mo2a6vZrK1ms7aazdpqNmur 2aytZrO2ms3aajZrq9msrWaztprN2mo2a6vZrK1ms7aazdpqNmur2aytZrO2ms3aajZrq9msraZI vpqd32p2fiviMVfEY66Ix1wRj7kiHnNFPOaKeMwV8ZgnxGOeECN5QozkCTGSJ8RInhAjeUKM5AlN jJvQxLgJTYyb0MS4CU2Mm9DEuAlNjJvQxLgFhXyDzJmb0Jy5Cc2Zm9CcuQnNmZvQnLkJzZlbUOjO k376gkJ3nvTTFxS682Qh5YJCd54spFxQKCrJQsoFhXyDLKRcUMg3yELKBYV8gyykXFDINwgbZEEh 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 ojnwJpoDb6I58CaaA2+iOfAmmgNvojnwJpoDb6I58CaaA2+iOfAmmgNvojnwJprDXKI5zCWaw1yi OcwlopG3EY28jWjkbUQjbyMaeRvRyNuIRt5GNPI2opG3EY28jWjkbUQjbyMaeRvRyNuIRt5GNPJ2 QaGnjOStFclbK5K3ViRvrUjeWpG8tSJ5a0Xy1orkrRXJWyuSt1Ykb61I3lqRvLUieWtF8taK5K0V yVsroudVRM+riJ5XET2vInpeRfS8iuh5FdHzKqLnVUTPq4hoVxHRriKiXUVEu4qIdhUR7Soi2lVE mauIMlcRZa4i8ltFNLaKaGyV0dhMCZ45PjKa4yOjOT4ymuMjozk+MprjI6M5PjKa4yOjOT4ymuMj ozk+MprjI6M5PjKa4yOjOj6ymqq5aqrmqqmaq6ZqrpqquWqq5qqpmqumaq6aqrlqquaqqZqrpmqu mqq5aqrmqqmaq6ZqrpqquWqq5qqpmqsm17OaXM9qcj2ryfWsJtezmlzPanI9q8n1rCbXs5pcz2rS M6tJz6wmPbOa9Mxq0jOrSc+sJj2zmozKajIqq8morCYJspq8xWryFutj3uL6P/94+fW3d08f/vzj p9dPT8//+GX5z2rwrybyOjNjvfa/Xj99/m39a3+9+ruI//Hh9deXL7/91+v/fPr82/97ffr38PDS ex8kDX+QdP+DpIEPkoc/SL7/QfLABynDH6Tc/yBl4IPU4Q9S73+QOvBBpuEPMt3/INPAB2nDH6Td /yBt4IPMwx9kvv9B5vsfJD6PfpCOuPNB+qX3PkgY/iDh/gcJAx9k+GSN90/WOHCyxuGTNd4/WePA yRqHT9Z4/2SNAydrHD5Z4/2TNQ6crHH4ZI33T9Y4cLLG4ZM13j9Z48DJGodP1nj/ZI0DJ2scPlnj /ZM1DpysafhkTfdP1jRwsqbhkzXdP1nTwMmahk/WdP9kTQMnaxo+WdP9kzUNnKxp+GRN90/WNHCy puGTNd0/WdPAyZqGT9Z0/2RNAydrGj5Z0/2TNQ2crGn4ZE33T9Y0cLKm4ZM13T9Z08DJmodP1nz/ ZM0DJ2sePlnz/ZM1D5ysefhkzfdP1jxwsubhkzXfP1nzwMmah0/WfP9kzQMnax4+WfP9kzUPnKx5 +GTN90/WPHCy5uGTNd8/WfPAyZqHT9Z8/2TNAydrHj5Z8/2TNQ+crGX4ZC33T9YycLKW4ZO13D9Z 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 eIUB8QoD4hUGxCsMiFcYEK8wIF5hQLzCgHiFAfEKA+IVBsQrDIhXGBCvMCBeYUC8woB4hQHxCgPi FQbEKwyIVxgQrzAgXmFAvMKAeIWB8Qql0UVnWiYaMysQ0uiiM7cTjZkVCFH4tiWIojGzAiEK37Ys UzRmRsB3hiq9fHl5+uXjp98XxNOn11//fP/y6Rvw07v3L7/98fnpz8+vPz/99P7ju9+fQmkll7bq pt59/LT+1d8+/Pr04fUfX14/fPm8Wvz2I6x/9sMG//yUYynp8rLjg356Xb/Yl49PzzvwMB3uolgW Lt50M7ileVFnKi8aM4P7O/OifuyoLV44agw1x5bSksrdc9TlI/zNUZdX2/nyMuKolyhW6hBv+uNz 68ZNz1c3PeYWynI43L7p+W83fXllTPXyMnTTr1Cs5iPedPOl5Dsi3RtPcLp6grnWOMV5eeO/+QSn vz3B9Jzj5ROc0BO8QrGamHjTzSNZ1B9vhTXRmPm+JeqPt+qcaMwMblF/vJX4RGNmBJj642Dy34PJ fw8m/z2Y/Pdg8t+DyX8PJv89mPz3YPLfg8l/Dyb/PZj892Dy34PJfw8m/z2Y/Pdg8t+DyX8PJv89 mPz3YPLfg8l/Dyb/PZj892Dy34PJfw8m/z2Y/PeANPABaeAD0sAHpIEPSAMfkAY+IA18QBr4gDTw AWngA9LAB6SBD0gDH5AGPiANfEAa+IA08AFp4APSwAekgQ9IAx+QBj4gDXxAGviANPABaeAD0sAH pIEPSAMfkAY+IA18QBr4gDTwAWngA9LAB6SBD4jDGxCHNyAOb0Ac3oA4vAFxeAPi8AbE4Q2IwxsQ hzcgDm9AHN6AOLwBcXgD4vAGxOENiMMbEIc3IA5vQBzegDi8AXF4A+LwBsThDYjDGxCHNyAOb0Ac 3mDqj4OpPw6m/jiY+uNg6o+DqT8Opv44mPrjYOqPg6k/Dqb+OJj642Dqj4OpPw6m/jiY+uNg6o+D qT8Opv44mPrjYOqPg6k/Dqb+OJj642Dqj4OpPw6m/jiY+uNg6o+DqT8Opv44mPrjYOqPg6k/Dqb+ OJj642Dy34PJfw8m/z2Y/Pdg8t+DyX8PJv89mPz3YPLfg8l/Dyb/PZj89yAtFT7LPKIxMwJMkngw SeLBJIkHaanwWXASjZkRYNKNg0k3DuJOoK3GJRozI8Dk5AaTkxuQBj4gDXxAGviANPABaeAD0sAH pIEPSAMfkQY+Ig18RBr4iDTwEWngI9LAR6SBj0gDH5EGPiINfEQa+Ig08BFp4CPSwEekgY9IAx+R Bj4iDXxEGviINPARaeAj0sBHpIGPSAMfkQY+Ig18RBr4iDTwEfEKI+IVRsQrjIhXGBGvMCJeYUS8 woh4hRHxCiPiFUbEK4yIVxgRrzAiXmFEvMKIeIUR8Qoj4hVGxCuMiFcYEa8wIl5hRLzCiHiFEfEK I+IVRsQrjIxXaGoig6mJDKYmMpiayGBqIoOpiQymJjKYmshoaiKjqYmMpiYymprIaGoio6mJjKYm MpqayGhqIqOpiYymJjKamshoaiKjqYmMpiYymprIaGoio6mJjKYmMpqayGhqIqOpiYymJjKamsho aiKjqYmMpiYymprIaHJyo8nJjSYnN5qc3GhycqPJyY0mJzeanNxocnKjycmNJic3mpzcaHJyo8nJ jSYnN5qc3GhycqPJyY0mJzeanNz4HU7uD+eILeDLOWLPUym5lnhvjtj6EdY/e06Ce76YIrZcdHzM gSli1yhWd/NuuUk2jibZOJpk42iSjaNJNo4m2TgiwXFEguOIBMcRCY4jEhxHJDiOSHAckeA4IsFx RILjiATHEQmOIxIcRyQ4jkhwHJHgOCLBcUSC44gExxEJjiMSHEckOI5IcByR4DgiwXFEguOIBMcR CY4jEhxHJDiOSHAckeA4IsFxRILjiATHEQmOIyJMRkSYjIgwGRFhMiLCZESEyYgIkxERJhMiTCZE mEyIMJkQYTIhwmRChMmECJMJESYTIkwmRJhMiDCZEGEyIcJkQoTJhAiTCREmEyJMJkSYTIgwmRhh 0hR7RlPsGU2xZzTFntEUe0ZT7BlNsWc0xZ7RFHtGU+wZTbFnNMWe0RR7RlPsGU2xZzTFntEUe0ZT 7BlNsWc0xZ7RFHtGU+wZTbFnNMWe0RR7RlPsGU2xZzTFntEUe0ZT7BlNsWc0xZ7RFHtGU+wZTbFn NMWe0SQbR5NsHE2ycTTJxtEkG0eTbBxNsnE0ycbJJBsnk2ycTLJxMsnGySQbJ5NsnEyycTLJxskk GyeTbJxMsnEyycbJJBsnk2ycTLJxMsnGySQbJ5NsnEyycTLJxgkJjhMSHCckOE5IcJyQ4DghwXFC guOEBMcJCY4TEhwnJDhOSHCckOA4IcFxQoLjhATHCQmOExIcJyQ4TkhwnJDgOCHBcUKC44QExwkJ jhMSHCckOE5IcJyQ4DghwXFCguOEBMcJCY4TEhwnJDhOSHCcEK8wIV5hQrzChHiFCfEKE+IVJsQr TIhXmBCvMCFeYUK8woR4hQnxChPiFSbEK0yIV5gQrzAhXmFCvMKEeIUJ8QoT4hUmxCtMiFeYEK8w IV5hQrzChHiFyRR7JlPsmUyxZzLFnskUeyZT7JlMsWcyxZ7JFHsmU+yZTLFnMsWeyRR7JlPsmUyx ZzLFnskUeyZT7JlMsWcyxZ7JFHsmU+yZTLFnMsWeyRR7JlPsmUyxZzLFnslcwJJMTWQyNZHJ1EQm UxOZTE1kMjWRydREJpOTm0xObjI5ucnk5CaTk5tMTm4yObnJ5OQmk5ObTE5uMjm5yeTkJpOTm0xO bjI5ucnk5CaTk5tMTm4yObnJ5OQmk5ObTE5uMjm5yeTkJpOTm0xObjI5ucnk5Caky01Il5uQLjch XW5CutyEdLkJ6XIT0uUmpMtNSJebkC43IV1uQrrchHS5CelyE9LlZqTLzUiXm5EuNyNdbka63Ix0 uRnpcjPS5Waky81Il5uRLjcjXW5GutyMdLkZ6XIz0uVmpMvNSJebkS43I11uRrzCjHiFGfEKM+IV ZsQrzIhXmBGvMCNeYUa8wox4hRnxCjPiFWbEK8yIV5gRrzAjXmFGvMKMeIUZ8Qoz4hVmxCvMiFeY Ea8wI15hRrzCjHiFGfEKM+MVmprIZGoik6mJTKYmMpmayGRqIpOpiUymJjKZmshkaiKTqYlMpiYy mZrIZGoik6mJTKYmMpuayGxqIrOpicymJjKbmshsaiKzqYnMpiYym5rIbGois6mJzKYmMpuayGxq IrOpicymJjKbmshsaiKzqYnMpiYym5zcbHJys8nJzSYnN5uc3GxycrPJyc0mJzebnNxscnKzycnN Jic3m5zcbHJys8nJzSYnN5uc3GxycrPJyc0mJzebnNxscnKzycnNJic3m5zcbHJys8nJzSYnNyNd bka63Ix0uRnpcjPS5Waky81Il5uRLjcjXW5GutyMdLkZ6XIz0uVmpMvNSJebkS43I11uRrrcjHS5 GelyM9LlZqTLzUiXm5EuNyNdbka63Ix0uRnpcjPS5Waky81Il5uRLjcjXW5GutyMdLkZ6XIz4hVm xCvMiFeYEa8wI15hRrzCjHiFGfEKM+IVZsQrzIhXmBGvMCNeYUa8wox4hRnxCgviFRbEKyyIV1gQ r7AgXmFBvMKCeIUF8QoL4hUWxCssiFdYGK/Q1ERmUxOZTU1kNjWR2dREZlMTmU1NZDY1kdnURGZT E5lNTWQ2NZHZ1ERmUxOZTU1kNjWR2dREZlMTmU1NZDY1kdnURGZTE5lNTWQ2NZHZ1ERmUxOZTU1k NjWR2dREZlMTmU1NZDY1kdnURGZTE5lNTWQ2NZHZ5ORmk5ObTU5uNjm52eTkZpOTm01ObjY5udnk 5GaTk5tNTm42ObnZ5ORmk5ObTU5uNjm5xeTkFpOTW0xObjE5ucXk5BaTk1tMTm4xObnF5OQWk5Nb TE5uMTm5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rakyy1Il1uQLrcgXW5ButyCdLkF 6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rak yy1Il1sQr7AgXmFBvMKCeIUF8QoL4hUWxCssiFdYEK+wIF5hQbzCgniFBfEKC+IVFsQrLIhXWBCv sCBeYUG8woJ4hQXxCgviFRbEKyyIV1gQr7AgXmFBvMKCeIXF1EQWUxNZTE1kMTWRxdREFlMTWUxN ZDE1kcXURBZTE1lMTWQxNZHF1EQWUxNZTE1kMTWRxdREFlMTWUxNZDE1kcXURBZTE1lMTWQxNZHF 1EQWUxNZTE1kMTWRxdREFlMTWUxNZDE1kcXURBZTE1lMTWQxNZHF5OQWk5NbTE5uMTm5xeTkFpOT W0xObjE5ucXk5BaTk1tMTm4xObnF5OQWk5NbTE5uMTm5xeTkFpOTW0xObjE5ucXk5BaTk1tMTm4x ObnF5OQWk5NbTE5uMTm5BelyC9LlFqTLLUiXW5AutyBdbkG63IJ0uQXpcgvS5Rakyy1Il1uQLrcg XW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0 uRXpcivS5Vaky61Il1sRr7AiXmFFvMKKeIUV8Qor4hVWxCusiFdYEa+wIl5hRbzCiniFFfEKK+IV VsQrrIhXWBGvsCJeYUW8wop4hRXxCiviFVbEK6yIV1gRr7AiXmFFvMLKeIWmJrKYmshiaiKLqYks piaymJrIYmoii6mJLKYmspiayGJqIoupiSymJrKYmshiaiKLqYkspiaymJrIYmoii6mJLKYmspia yGJqIoupiaymJrKamshqaiKrqYmspiaymprIamoiq6mJrKYmspqayGpqIqupiawmJ7eanNxqcnKr ycmtJie3mpzcanJyq8nJrSYnt5qc3GpycqvJya0mJ7eanNxqcnKrycmtJie3mpzcanJyq8nJrSYn t5qc3GpycqvJya0mJ7eanNxqcnKrycmtSJdbkS63Il1uRbrcinS5FelyK9LlVqTLrUiXW5EutyJd bkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKFLYVKWwrUthWpJWtSCtbkVa2Iq1sRVrZirSy FWllK9LKVqSVrUgrW5FWtiKuX0Vcv4q4fhVx/Sri+lXE9auI61cR168irl9FXL+KuH4Vcf0q4vpV xPWriElXEZOuIiZdRUy6iph0FTHpKmLSTYhJNyEm3YSYdBNj0pkqwGqqAKupAqymCrCaKsBqqgCr qQKspgqwmirAaqoAq6kCrKYKsJoqwGqqAKupAqymCrCaKsBqqgCrqQKspgqwmsK9agr3qincq6bW rppau2pq7aqptaum1q6aWrtqau2qqbWrptaumlq7amrtqsn1rCbXs5pcz2pyPavJ9awm17OaXM9q cj2ryfWsJtezmlzPanI9q8n1rCbXs5okyGqSIKtJgqwmCbKaJMhqkiCrSYKcTBLkZJIgJ5MEOYkk yHkmjboFBUpFCwqUERcUKCMuKFBGXFCgjLigQBlxQYEy4jyTAboLCpQRFxTyDdLeW1DIN0hTcEEh 3yBNwQWFfIM0BeeZNAUXFPIN0hRcUMg3SFNwQSHfIE3BBYV8gzQFFxTyDdIUXFDIN0hTcEEh3yBN wQWFfIM0BRcU8g3SFFxQyDfIAJAFhXyDDABZUMg3SNtyQSHfIG3LBYV8g7QtF9S4b6TnZ9C2XFHj vrGixn1jRY37xooa940VNe4bK2rcN1bUuG+sqHHfWFHIN8AAkBWFfAMMAFlRLOPwsrUtVRKNefWK LbESjXn1ii0NE4159YotafOMicMztxRPNGZGgNiD2/JE0ZgZAWJDb0s2RWNmBIgNvS1jFY2ZESA2 9La0VzRmRoDY0NtyZ9GYGQFiQ29LwD1jYkNvS9dFY2YEiA29LecXjZkRIDb0tsKBaMyMALGht1Uf RGNmBIjDW7YShmjMjACxb7nVQURjZgSIfcutmCIZ22ssojEtAvaKjGhMi4C9fiMa0yJgr/aIxrQI 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 oepyQ9XlhqrLDVWXG6ouN6Q5bkhz3JDmuCHNcUOa44Y0xw1pjhvSATe0p7Ah9XBD6uGG1MMNqYcb Ug83pB5uSD3ckHq4IfVwM2k6zaTpNJOm00yaTjNpOs2k6TSTptPMeXXNnFfXzIZeMxt6zWzoNbOh 18yGXjMbes1s6DWzodfMhl4zG3rNbOg1s6HXzIZeMxt6zWzoNbOh18yGXjMbes1s6DWzodfMhl4z G3rNbOg1s6HXzIZeMxt6zWzoNbOh18yGXjMbes1s6DWzodfMhl4zG3rNbOg1c6ZBM2caNHOmQTNn GjRzpkEzZxo0c6ZBMycHNHN/bjPHEDRzDEEzxxA0cwxBM8cQNHMMQTPHEDRzDEEzxxDMqKMzo47O jDo6M+rozKijM6OOzow6OjPq6MyoozOjjs6MOjoz6ujMqKMzo47OjDo6M+rozKijM6OOzow6OjPq 6MyoozOjjs6MOjozmiI7oymyM+oezah7NKPu0Yy6RzPqHs2oezSj7tGMukcz6h7NqHs0o+7RjGbP zmj27Iw0TTOaPTsjJdSMlFAzUkLNSAk1ozm3M5pzO6M5tzOaczujObczmnM7ozm3M5pzO6M5tzOa czujObczmnM7ozm3M5pzO6M5tzOaczujObczmnM7ozm3M5pzO5uV+9ms3M9m5X42K/ezWbmfzcr9 bFbuZ7NyP5uV+9ms3M9m5X42K/ezWbmfzcr9bFbuZ7NyP5uV+9ms3M9m5X42K/ezWbmfzcr9bFbu Z3Ma8WxOI57NnsJs9hRms6cwmz2F2ewpzGZPYTZ7CrPZU5jNnsJs9hRmtadgjjaezdHGsykUnc3R xrOpOp1N1elsqk5nU3U6m0OXZ3Po8mwOXZ7NocuzOXR5Nocuz+bQ5dkcujybQ5dnc+jybA5dns2h y7M5dHk2hy7P5tDl2Ry6PJtDl2dz6PJsDl2exaHL8ZnsiVpQoLa6oEBtdUGB2uqCArXVBQVqqwsK 1FYXFKitLihQW11QoLYan8mkiAWFfINMilhQyDfIpIgFhXyDTIpYUMg3yKSI+EwmKiwodA/JRIUF he4hmaiwoNg9RPFFJiosKBRfZKLCgkK+QSYqLCjkG4R/t6CQbxD+3YJCvkH4dwsK+Qbh3y0o5BuE f7egkG8Q/t2CQr5B+HcLCvkG4d8tKOQbhH+3oJBvEP7dgkK+Qfh3Cwr5BuHfLSjkG4R/t6CQbxD+ 3YJi7/Nepr6lL6IxL1Pfkh3R2ONM/eXLy9MvHz/9viCePr3++uf7l0/fgJ/evX/57Y/PT39+fv35 6af3H9/9/hRKDItjrmqxdx8/rX/1tw+/Pn14/ceX1w9fPq8Wv/0I65/9sME/P4XUphDj5YXHR/30 un61Lx+fnnfoYTzcRbG8T7ztXhliyxJFY14ZYsspPWPiSI0tAxWNmeEtjtTY0ljRmBkB4kiNLRcW jZkRII6H2BJq0Zj5NMXxEFtWLhpTn6Z5nonjIbaMXzRmnmfieIitbCAaMyNAJJlutQfRmBkBIsl0 K2CIxswIEEmmWxVENGZGgEgy3UopojEzAkSS6VaP8YyJJNOteiMaMyNAJJluJSDRmBkBIsl0qyOJ xswIEEmmWzFKNGZGgEgy3SpanjEi1FlQqDBJhDoLihQmAyIaBEQ0CIhoEBDRICCiQUBEg4CIBgER DQIiGgRENAiIaBAQ0SAgokFARIOAiAYBEQ0CIhoERDQIiGgQyEqKGMhKigWFfIOspFhQyDcQgSIg AkVABIqAqBABUSECIhoERDQIiGgQENEgIKJBQJSBgCgDAVEGAqIMBEQZCIgyEBBlICDKQECUgYAo AwFRBgKiDAREGQiIMhAQZSAgykBAlIGAKAMBUQYCogwERhkQadNbIiIaMzNbkzYdTDpCMOkIwaQj BJOOEL5DR0AJlGhMjIBgduyD2bEPZsc+mB37YHbsg9mxD2bHPpgd+2B27IPZsQ9mxz6YHfsgLsHY MlPRmBkB4hKMLb0VjZkRYLIcgslyCCYxIZjEhGB27IPZsQ9mxz6YHftgduyD2WQPZpM9mE32YDbZ g9lkD2aTPZhN9mA22YPZZA9mkz2YTfZgNtmD2WQPZpM9mE32YDbZg9lkD2aTPZhN9mA22YPYZE+N TOJcUKBUlBqZqbmgQEFwQYGC4IICBcEFBQqCCwoUBBcUel6k6Z5m0nRfUOQpz6TpvqDIU55J+3xB kec1k/b5giJPeSbt8zST9vmCQk+ZtM8XFHrKpH2+oJBvkPb5gkK+QdrnCwr5BmmfLyjkG6R9vqCQ b5D2+YJCvkHa5wsK+QZpui8o5Btk/sCCQr5B5g8sKOQbhBawoJBvkAZ/Qpt8Etrkk9Amn4Q2+SS0 ySehTT4JbfJJaJNPQpt8Etrkk9Amn4Q2+SS0ySehTT5bniImPWYGJQ5u25Id0ZiX9m+pkWjMS/u3 REo0ZvqZSBrYsjHRmOi0s0ga2FI60ZjoZ7PY59/yQtGY6LSz2OffkkvRmOm0Yp9/y1BFY+JJO4t9 /i3NFY2ZESD2+bdc2TMm9vm3zFo0ZkaA2Off0nPRmBkBYp9/y/FFY2YEiKSBrVAgGjMjQJxmsFUb RGNmBIjciGRuuUrmlqtkbrlK5parZG65SuaWq2RuuUrmlqtkbrlK5parZG65SuaWq2RuuUrmlqtk brlKaKtzQludE9rqnNBW54S2Oie01Tmhrc4JbXVOaKtzQludE9rqnNBW54S2Oie01Tmhrc4JbXVO aKtzQludE9rqnNBW54S2Oie01Tmhrc4JbXVOaKtzQludE9rqnNBW54S2Oie01Tmhrc4JbXVOaKtz QludE9rqnNBW54S2Oie01Tmhrc4JbXVOaKtzQludE9rqnNBW54S2Oie01Tmhrc4ZbYrJaFNMRpti MtoUk9GmmIw2xWS0KSajTTEZbYrJaFNMRptiMtoUk9GmmIw2xWS0KSaZm3+Tufk3mZt/k7n5N5mb f5O5+TeZm3+Tufk3mZt/k7n5N5mbf5O5+TeZm3+Tufk3mZt/k7n5N5mbf5O5+TeZm3+Tufk3mZt/ k7n5N5mbf5O5+TeZm3+Tufk3mZt/k7n5N5mbf5O5+TeZm3+Tufk3mZt/k7n5N5mbf5O5+TeZm3+T ufk3mZt/k7n5N5mbf5O5+TeZm3+Tufk3mZt/k7n5N5mbf7O5tyqbe6uyubcqf29vFSrUiMY8P8vm aqdsrnbK5mqnbK52yuZqp2yudsrmaqdsrnbK5mqnjLZIZrTZMaPNjhltdsxos2NGmx0z2uyY0WbH jDY7ZrTZMaPNjgsK+QbpwS8o5BukB7+gkG+QHnx+Jj34BYV8g/TgFxTyDdKDX1DIN0g3fUGhp0y6 6fmZdNMXFHrKpJu+oNBTJt30BYWeMummLyjkG6SbvqCQb5Bu+oJCvkG66QsK+Qbppi8o5Bukm57R 6pWMVq9ktHolo9UrGa1eyWj1SkarVzJavZLR6pWMVq9ktHolo9UrGa1eyWj1SkarV7K5wyybm8Ky uSksm5vCsrkpLJubwrK5KSybm8KyuSksm5vCsrkpbEucRGNmBIhN6S37Eo2ZESA2pbcUTjRmRoDY lN7yQNGYGQFiU3pLJkVjptOKfeQtIxWNmU4r9pG3tFY0Zjqt2EfecmPRmBkBYh95S7A9Y2IfeUvH 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 X/bP8n/+/PD7jvjXDx+f/tfT64cv67f621/6C2q95ocX/eenjz+9f/3j6f/+9uU//nLFu48f9qlu ywf75uPsn+Y/Xv7r9end+9eXT68/f3sNS9nFR2ieiCZPspk8yWbyJJvJk2wmT7KZPMlm8iSbyZNs Jk+ymTzJZvIkm8mTbCZPspk8yWbyJJvJk2wmT7KZPMlm8iSbyZNsJk+ymTzJZvIkm8mTbCZPspk8 yfaYJ7n+z/2N7sOff/z0+unp+R/Pq7UTn3Keah+y/V+vnz7/tv6pH196w+Z03+Z012a7b7PdtTnf tznftBmfb9vsl96wGe7bDHdtxvs2412b6b7NdNdmvm8z37VZ7tssd23ej6N4N47i/TiKd+Mo3o+j eDeO4v04infjKN2Po3Q3jtL9OEp34yjdj6N0N47S/ThKd+Mo3Y+jdDeO0v04SnfjKN2Po3Q3jtL9 OEp34yjdj6N0N47S/ThKd+Mo34+jfDeO8v04ynfjKN+Po3w3jvL9OMp34yjfj6N8N47y/TjKd+Mo 34+jfDeO8v04ynfjKN+Po3w3jvL9OMp346jcj6NyN47K/Tgqd+Oo3I+jcjeOyv04KnfjqNyPo3I3 jsr9OCp346jcj6NyN47K/Tgqd+Oo3I+jcjeOyv04KnfjqN6Po3o3jur9OKp346jej6N6N47q/Tiq d+Oo3o+jejeO6v04qnfjqN6Po3o3jur9OKp346jej6N6N47q/Tiqd+Nouh9H0904mu7H0XQ3jqb7 cTTdjaPpfhxNd+Nouh9H0904mu7H0XQ3jqb7cTTdjaPpfhxNd+Nouh9H0904mu7H0XQjjqaS8/N8 637+9dIbNm/dz79eesPmrfv510tv2Lx1P/966Q9thudb59JfL71h89a59NdLb9i8dS799dIbNm+d S3+99IbNW+fSXy+9YfPWufTXS2/YvB1Hx6U3bN6Oo+PSGzZvx9Fx6Q2bt+PouPTHNsP9OAp34yjc j6NwN47C/TgKd+Mo3I+jcDeOwv04CnfjKNyPo3A3ju714/566Q2b9+PoTj9uv/B+HN3px+0X3o+j O/247cJ7/bi/XnrD5v04utOP2y+8H0d3+nH7hffj6E4/br/wfhzd6cftF96Pozv9uP3C+3F0px+3 X3g/ju704/YL78fRnX7cfuH9OLrTj9suvNeP++ulN2zej6M7/bj9wvtxdKcft194P47u9OP2C+/H 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 3DOZcs9kyj2TKfdM5oKZZGoik6mJTKYmMpmayGRqIpOpiUymJjKZmshkaiKTqYlMJic3mZzcZHJy k8nJTSYnN5mc3GRycpPJyU0mJzeZnNxkcnKTyclNJic3mZzcZHJyk8nJTSYnN5mc3GRycpPJyU0m JzeZnNxkcnKTyclNJic3mZzcZHJyk8nJTUiXm5AuNyFdbkK63IR0uQnpchPS5Saky01Il5uQLjch XW5CutyEdLkJ6XIT0uUmpMtNSJebkC43IV1uQrrchHS5CelyE9LlJqTLTUiXm5AuNyFdbkK63IR0 uQnpchPS5Saky01Il5uQLjchXW5CutyEeIUJ8QoT4hUmxCtMiFeYEK8wIV5hQrzChHiFCfEKE+IV JsQrzIhXmBGvMCNeYUa8wox4hRnxCjPiFWbEK8yIV5gRrzAjXmFGvMKMeIUZ8Qoz4hVmxis0NZHJ 1EQmUxOZTE1kMjWRydREJlMTmUxNZDI1kcnURCZTE5lMTWQyNZHJ1EQmUxOZTE1kMjWRydREJlMT mUxNZDI1kcnURCZTE5lMTWQyNZHJ1EQmUxOZTE1kMjWRydREJlMTmUxNZDI1kcnURCZTE5lMTWQy ObnJ5OQmk5ObTE5uMjm5yeTkJpOTm0xObjI5ucnk5CaTk5tMTm42ObnZ5ORmk5ObTU5uNjm52eTk ZpOTm01ObjY5udnk5GaTk5tNTm42ObnZ5ORmk5ObTU5uRfXOiuqdFdU7K6p3VlTvrEhvXJHeuCLl cEXK4YqUwxUphytSDlekHK5IOVyRcrgi5XBFyuGKlMMVKYcrUg5XpByuSDlckXK4IuVwRcrhipTD FSmHK1IOV6Qcrkg5XJFyuCLlcEXK4YqUwxUphytSDlekHK5IOVyRcrgi5mNFzMeKmI8VMR8rYj5W xHysiPlYEfOxIuZjRczHipiPFTEfK2I+VsR8rIj5WBHzsSLmY0XMx4qYjxUxH6uZ2VYzs61mZlvN zLaamW01lZPVVE5WU+xYTbFjNcWO1RQ7VlPsWE2xYzXFjtUUO1ZT7FhNsWM1xY7VFDtWU+xYTbFj NcWO1RQ7VlPsWE2xYzXFjtUUO1ZT7FhNsWM1xY7VFDtWU+xYTbFjNcWO1RQ7VlPsWE2xYzXFjtUU O1aTbFtNsm01ybbVJNtWk2xbTbJtNcm21STbVpNsW02ybTXJttUk21aTbFtNsm01ybbVJNtWk2xb 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 5z5f4UC99H24DSdpJM0e7sdEKuNkqVMZKoSk6vP5zb22uyuzFClpjRq3gQIK1WGmSN9Gj02bY05O lEMwUQ7BRDkEE+UQTJRDMFEOwUQ5BBPlEEyUQzBRDsFEOQQT5RBMlEMwUQ7BRDkEE+UQTJRDMFEO wUQ5BBPlEEyUQzBRDsFEOQQT5RBMlEMwUQ7BRDkEE+UQTJRDMFEOwUQ5BBPlEEyUQzBRDsFEOQQT cdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQTcdQT cdRhrm2nuYKc5gpymivIafqwp+nDnqYPe5o+7Gn6sKfpw56mD3uaPuxp+rCn6cOepg97mj7safqw p+nDnqYPe5o+7Gn6sKfpw56mD3uaPuxp+rCn6cOepg97mj7safqwp+nDnqYPe5o+7Gn6sKfpw56m D3uaPuxp+rCn6cOepg97mj7saboipumKmKYrYpquiGm6IqbpipimK2KarohpuiKm6YqYpitimq6I aboipumKmKYrYpquiGm6IqbpipimK2KaroiNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeN tKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeN tKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNtKeNMnw2yvDZKMNnowyfjTJ89kKzgZJ/Nkr+ 2Qi93wi93wi93yj5ZyNgfyNgfyNgfyNgfyNgfyNgf6O3ATdKGdooZWijlKGNUoY2Shnapg6zTR1m mzrMNnWYbeow29RhtqnDbFOH2aYOs00dZps6zDZ1mG3qMNvUYbapw2xTh9mmDrNNHWabOsw2dZht 6jDb1GG2qcNsU4fZpg6zTR1mmzrMNnWYbeow29RhtqnDbFOH2aYOs00dZps6zDZ1mG3qMNvUYbap w2xVhzHTqbaZTrXNdKptplNtM53qsYoRm5knwIy62qYZfZtm9G2a0bcZdbVNZ/s2ne3bdLZv09m+ TWf7Np3t23wjdZshXNsM4dpmCNc2Q7i2GcK1UWjIRqEhG4WGbJTSvRPtVlG290axJrvQbhUlgm+U CL5RIvhGieAbZT9slAi+USL4RongiRLBE2VaJMq0SJRpkSjTIlGmRaJMi0SZFokyLRJlWiTKtEiU aZEo0yJRpkWiTItEmRaJMi0SZVokyrRIlGmRiCtMxBUm4goTcYWJuMJEXGEirjARV5iIK0zEFSbi ChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxhIq4wEVeYiCtMxBUm4gqTcYVmTtw2c+K2 mRO3zRDkx91ObGZuIMw4vMcFUWxmbiDMeOZtxjNvM555mzkf24xn3mY88zbjmdOMZ04zGyXNbJQ0 s1HSzEZJMxslzWyUNLNR0sxGSTMbJc1slDSzUdLMRkkzGyXNbJQ0s1HSzEZJMxslzWyUNLNR0mRy 02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry02Ry 02Ry02Ry02Ry02Ry02Ry02Ry02Ry02RyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/ly E/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/lyE/ly E/lyE/lyE/lyE/lyE/lyE/lyE3GFibjCRFxhIq4wEVeYiCtMxBUm4goTcYWJuMJEXGEirjARV5iI K0zEFSbiCgtxhYW4wkJcYSGusBBXWIgrLMQVFuIKC3GFhbjCQlxhMa7Q9ESm6YlM0xOZpicyTU9k mp7IND2RaXoi0/REpumJTNMTmaYnMk1PZJqeyDQ9kWl6ItP0RKbpiUzTE5mmJzJNT2Sansg0PZFp eiLT9ESm6YlM0xOZpicyTU9kmp7IND2RaXoi0/REpumJTNMTmaYnMk0mN00mN00mN00mN00mN00m N00mN00mN00mN00mN00mN00mN00mN00mN00mN00mt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wm t0wmt0wmt0wmt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Av t5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Av t5AvtxBXWIgrLMQVFuIKC3GFhbjCQlxhIa6wEFdYiCssxBUW4goLcYWFuMJCXGEhrrAQV1iIKyzE FRbiCgtxhYW4wkJcYSGusBBXWIgrLMQVFuIKy/RElumJLNMTWaYnskxPZJmeyDI9kWV6Isv0RJbp iSzTE1mmJ7JMT2SZnsgyPZFleiLL9ESW6Yks0xNZpieyTE9kmZ7IMj2RZXoiy/RElumJLNMTWaYn skxPZJmeyDI9kWV6Isv0RJbpiSzTE1mmJ7JMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdM JrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJreQL7eQ L7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQL7eQ L7eQL7eQL7eIL3e+El/uqQKzcarAbJwqMBunCszGqQKzcarAbJwqMBunCszGqUKzQXy5pwrNBuEK TxWaDcIVnio0G4QrPFVoNghXeKrQbBCu8FSh2SBc4alCs0G4wlOFZoNwhacKzQbhCk8Vmg3CFZ4q NBuEKzxVaDYIV3iq0GwQrvBUodkgXOGpYgyIuYEwPZFleiLL9ESW6Yks0xNZpieyTE9kmZ7IMj2R ZXoiy/RElumJLNMTWaYnskxPZJmeyDI9kWV6Isv0RJbpiSzTE1mmJ7JET+R1TxebeSfgutWLzbwT cO0AxGbeCbg2BmIz7wRc+wWxmXkCRE/ktaQQm5knQGRyr02H2Mw8ASKTe61LxGbmCRCZ3GvnIjYz T4DI5F6LG7GZeQJEJvfa/ojNzBMgMrnXCslrJjK518JJbGaeAJHJvbZWYjPzBIhM7rX6EpuZJ0Bk cucr8eWeKrRbJb7cU4V2q8SXe6rQbpX4ck8V2q0SX+6pQnt34ss9VWg2iC/3VKHZIL7cU4Vmg/hy TxWaDeLLPVVoNogv91Sh2SC+3FOFZoP4ck8Vmg3iyz1VaDaIL/dUodkgvtxThWaD+HJPFZoN4ss9 VWg2CFd4qtBsEK7wVKHZIFzhqUKzQbjCU4Vmg3CFpwrNBuEKTxWaDcIVnio0G4QrPFVoNghXeKrQ bBCu8FSh2SBc4alCs0G4wlNFZqMhrrAhrrAhrrAxrlD0RF7XMrGZuYEQPZHX3U5sZm4gRE/kdUEU m5kbCNETed0yxWbmCRA9kddVVWxmngDRE3ndd8Vm5gkQPZHXpdlrJnoiryu22Mw8AaIn8rqni83M EyB6Iq/LvtjMPAGiJ/LaGIjNzBMgeiKvtYPYzDwBoify2l2IzcwTIDK51wLEayYyude6RGxmngCR yb12LmIz8wSITO61uBGbmSdAZHKv7Y/YzDwBIpN7rZDEZuYJEJncaw8lNjNPgMjkXsssrVkzmdxm MrnNZHKbyeQ25MttyJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFfbkOu14Zcrw35Vxvy rzbkX23Iv9qQf7Uh/2pD/tWG/KsN+Vcb8q825F9tyL/akH+1If9qQ/7VhvyrDflXG/Gvzob4u4b4 u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4u4b4 u4b4u4b4u4b4u4b4u4b4u4b4u4b4u2Z6B5vpHWymd7CZ3sFmegeb6R1spnewmd7BZnoHm+kdbKZ3 sJnewWaa6pppqmumD66ZPrhm+uCa6YNrpg+umT64ZvrgmumDa6YPrpk+uGb64Jrpg2umD66ZPrhm +uCa6YNrpg+umT64ZnKYzeQwm8lhNpPDbCaH2UwOs5kcZjM5zGZymM3kMJvJYTaTw2wmh9lMDrOZ HGYzOcxmcpjN5DCbyWE2k8NsJofZTA6zmRxmMznMZnKYzeQwm8lhNpPD7MjL0pGXpSMvS0delo60 +I60+I60+I60+I60+I60+I60+I60+I60+I60+I60+I60+I4ysjvKyO4oI7sjWqAjWqCjjOyOGIOO GIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOO GIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOOGIOO GIOOGIOOGINuctbd5Ky7yVl3k7PuJr/QTX6hm/xCN/mFbvIL3eQXuskvdJNf6Ca/0E1+oZv8Qjf5 hW5mH3cz+7ib2cfdxDS6iWl0M/u4m8xHN5mPbjIf3WQ+usl8dJP56Cbz0U3mo5vMRzeZj24yH91k PrrJfHST+egm89FN5qObzEc3mY9uMh/dZD66yXx0k/noJvPRTeajm8xHN5mPbjIf3WQ+usl8dJP5 6Cbz0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qObzEc3mY+OPDodeXQ68uh05NHpKCO7o4zs jjKyO8rI7igju6OM7I4ysjvKyO4oI7ujjOyOMrI7ysjuKCO7o4zsjjKyO8rI7igju6OM7I4ysjvK yO4oI7ujjOyOMrI7ysjuKCO7o4zsjjKyO8rI7igju6OM7I4ysjvKyB6IKxyIKxyIKxyIKxyIKxyI KxyIKxyIKxyIKxyIKxyIEByIEByIEByIEByIEByI9RuI9RuI9RuI9RuI9RuI9RuI9RuI9RuI9RuI 9RuM9TM5+G5y8N3k4LvKwZt5xN3MI+5mHnE384i7mUfczTzibuYRdzOPuJt5xN3MI+5mHnE384i7 mUfczTzibuYRdzOPuJt5xN3MI+5mHnE384i7mUfczTzibuYRdzOPuJt5xN3MI+5mHnE384i7mUfc zTzibuYRdzOPeJic7DA52WFyssPkZIfJyQ6Tkx0mJztMTnaYnOwwOdlhoq3DRFuHibYOE20dJto6 TBp1mDTqMGnUYdKow6RRh0mjDpNGHSaNOkwadZg06jBp1IWc0QttSxfali60LV1oW7rQtnShbelC 29KFtqULbUsX2pYutC1dyBm9kDN6IWf0Qs7ohZzRCzmjF3JGL+SMXsgZvZAzeiFn9ELO6IWc0Qs5 oxdyRi/kjF7IGb2QM3ohZ/RCzuiFnNELOaMXckYv5IxeyBm9kDN6IWf0Qs7ohZzRCzmjF3JGL+Rx XsjjvJDHeSGP80KM5kLc5ELc5ELc5ELc5ELc5ELc5ELc5ELc5ELc5ELc5ELc5ELc5DIdrcvcISxz h7DMHcIydwjL3CEsc4ewzB3CMncIy9whLHOHsNQdguloXaajdZmO1mU6WpfpaF2mo3WZjtZlOlqX 6WhdpqN1mY7WZTpal+loXaajdZmO1mU6WpfpaF2mo3X9jqP108+fXv7zx69/PxUvXz//7ZcfPn39 TfHLdz98+v4fP7388tPnv7785Ycfv/v7y359na8zzlfv7378+viPfv/lby9fPv/Xz5+//PzTo+Fv /waP/+qXq/qnl1nne+rr/OYffP+bfv38+F/2848vvUcsBCsv0327TPftMt23y3TfLtN9u0z37TLd t8t03y7TfbtM9+0y3bfLdN8u0zC7TMPsMg2zyzTMLhMOXyaCvUwEe5kI9jIR7GUi2MtEsJeJYC8T wV4mgr1MBHuZCPYyEeyNtl0buYQ3cglv5BLeyCW8kUt4I5fwRi7hjVzCG7mEN3IJb+QS3sglvJFL eCOX8EYu4Y1cwhu5hDfy4CbyxSbyxSbyxSbyxSbyxSbyxSbyxSa6aiZ6byORmzaRmzaRmzaRmzaR mzYR6ZWI9EpEeiUivRKRXolIr0SkVyLSKxHplYj0SkR6JSK9EpFeiUivRKRXItIrEemViKNKxFFt 90u0eI3cpo9xmz7GbfoYt+lj3KaPcZs+xm36GLfpY9ymj3GbPsZt+hi36WPcpo9xmz7GbfoYt+lj 3KbBL00bXZo2ujRtdGna6NK00aVpo0vTRpemjS7N5ybS9OSl6clL05OXpicvTU9emghcmghcmghc mghcmghcmghcmghcmghcmghcmghcmghcmghcmghcmghcmghcmghcmghcmmxYmmxYIpo9Ec2eiGZP RLMnotkT0eyJ9L1E+l4ifS+RvpdI30uk7yXS9xLpe4n0vUT6XiJ9L5G+l0jfS6TvJdL3Eil1iZS6 RHm+ifJ8E+X5JtISC+X5FsrzLaRbFtItC+mWhXTLQrplId2ykG5ZSLcspFsW0i0L6ZaFdMtCumUh 3bJQGkahNIxCGmkhjbSQRlpIIy2kkRbSSAtppIU00kIaaSGNtJBGWkgjLaSRFtJIC2mkhTTSQhpp oTSMNAHQNAHQNAHQNAHQNAHQNAHQNLXrNLXrNLXrNLXrNLXrNLXrNLXrNLXrNLXrNLXrNLXrNLXr NLXrNLXrNLXrNOXmNOXmNGNz04zNTTM2N01VvczY3DJjc8vU+8vU+8vU+8vU+8vU+8vU+8vU+8vU +8vU+8vU+8vU+8vU+8vU+8vU+8sM4ykzjKdMEqFMEqFMEqFMEqFMEqFMEqFMEqFMEqFMEqFMEqFM EqFMEqFMEqFMEqFMEqFMEqFMEqHEMJ71SpZypwqs104VWL2eKrB6vf53iT8k9Sfu/c65fjhas0Zi LE8VmaBGYixPFZm7Rp4aP1Vk7hqJzDxVYOW/GonMPFVg5X+q0GwQyOhUodkgkNGpQrNBIKNThWaD QEarEcjoVKHZIJDRqUKzQSCjU4Vmg0BGpwrNBoGMThWaDQIZnSo0G2J2z/VPjdjM+052/cMkNhO/ ITQxVej6101s5t1Krn8LxWbereT6l1NsZp4AUVS+/vkVm5knQBSVr3/DxWbmCRBF5euLgNjMPAGi qHx9mxCbmSdAFJWvryRiM/MEiKLy9b1GbCaegE4At1NFvrV2AridKvKttRPA7VSRb62dAG6ninxr 7QRwO1XkRtMJ4Haq0GygDVxHG7hOYkpOFZoN8tzTqUKzQZ57OlVoNshzT6cKzQZ57ulUodkgzz2d KjQb5LmnU4Vmgzz3dKrQbJDnnk4Vmg3y3NOpQrNBnns6VWg2yCNRpwrNBtqud7Rd72i73tF2vaPt ekfb9Y626x1t1zvarne0Xe9ou97Rdr2j7XpH2/WOtusdbdc72q53tF3vaLve0Xa9o+16R9v1jrbr HW3XO9qud7Rd7yKBcl3LxGbiPb+LBMp1txObiff8LhIo1wVRbCZuurqJMHSRQLkun2Iz8wSYPEQX Iz+ui63XTHwO6roGi83MEyA+B3XdpcVm5gn4neeg0IVcbGaeAPGJpetWLzYzT4D4xNK1GhCbmSdA fGLp2i+IzcwTID6xdC0pvGbie03XSkNsZp4Ak/noJvPRTeajm8xHN5mPbjIf3WQ+usl8dJP56Cbz 0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qObzEc3mY9uMh/dZD66yXx0k/noiE7tiE7tiE7t iE7tJALvVKHdKgnOO1Vot0qC804V2q2S4LxTRWZjkOC8U0VmY5DgvFNFZmOQ4LxTRWZjkOC8U0Vm Y5DgvFOFZoME550qNBskOO9UodkgwXmnCs0GCc47VWg2SHDeqUKzQYLzThWaDRKcd6rQbCCucCCu cCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCCucCDWbyDWbyDW byDWbyBqbyBqbzBqzyTau0m0d5No7yrRLsakXRcqsZl5vxcz165bmdjMvN+LmWvX1U5rNsTMtesi KDYTT8AQM9eu26TYTDwBQ8xcu66kYjPxBAwxc+2614rNzBMgZq5dl2OxmXkCxMy164YtNjNPgJi5 dl3TvWZi5tp1qRebmSdAzFy7NgNiM/MEmMTrMInXYRKvwyReh0m8DpN4HSbxOkzidZjE6zCJ12ES r8MkXodJvA6TeB0m8TpM4nWYXOkwudJhcqXD5EqHiYIOEwUdJgo6kLFzIGPnQMbOgYydAxk7BzJ2 DmTsHMjYOZCxcyBj50DGzoGMnQMZOweCIwaCIwaCIwaCIwaCIwYCFgIJ+4GE/UDCfiBhP5CwH0jY DyTsBxL2Awn7gYT9QMJ+MGHf9BEM00cwTB/BMH0Ew/QRDNNHMEwfwTB9BMP0EQzTRzBMH8EwfQTD 9BEMU5cbpi43TF1umLrcMHW5YapfYSo5YSo5YSo5YSo5YSo5YSo5YSo5YSo5YSo5YSo5YSo5ISo5 GyVRb5REvVES9UZJ1BslUW+URL1REvVGSdSnCny1P1Xgq/2pQrNBrrOnCs0GYf1PFZoNcnXenbD+ p4rMRies/6kis9HJSuBUkdnoZCVwqshsdLISOFVoNshK4FSh2SCX+1OFPmVyuT9V6FMm1P6pQp8y ofZ3J9T+qUKfMqH2TxWaDULtb5QGvFEa8EZpwBulAW+UBrxRGvBGacAbpQFvlAa8URrwRmnAG6UB b5QGvFEa8EZpwBulAW+UBrxRGvBGacAbpQFvlAa8URrwRmnA20zh32YK/zZT+LeZwr/NFP5tpvBv M4V/myn81w1QbOZtOa77otjMPAHibvS6dIrNzBMgbm2vm6vYTDwBXfQsXNdfsZl4Arq46b7u0GIz 8QR0cdN9XcS9ZuKm+7q2i83MoRWX09fdX2xmDq1oM7gWCGIzc2hFm8G1hRCbmb+2RZvBNoO1txms vc1g7W0Ga28zWHubwdrbDNbeZrD2NoO1txmsvc1g7W0Ga28zWHubwdrbDNbeZrD2NoO1txmsvc1g 7W0Ga28zWHubwdrbDNbeZrD2Rg9gbfQA1kYPYG30ANZGD2Bt9ADWRg9gbfQA1kYPYG30ANZGD2Bt 9ADWRg9gbfQA1kYPYG30ANZGD2Bt9ADWRg9gbfQA1kYPYG30ANZGD2Bt9ADWRg9gbfQA1kYPYG30 ANZGD2Bt9ADWRg9gbfQA1kYPYG30ANapQrNBHsDa6AGsjR7A2ugBrI2ieDcK1d0oVHejUN2NQnU3 isfdKB53o3jcjeJxN4rH3SjodqOg242CbjcKut0osnajyNqNIms3iqzdKLJ2o8jabT7ls82nfLb5 lM82n/LZ5lM+23zKZ5tP+WzzKZ9tPuWzzad8tvmUzzaf8tnmUz7bfMpnm0/5bPMpn20+5bPNp3y2 +ZTPNp/y2eZTPtt8ymebT/ls8ymfbT7ls82nfLb5lM82n/LZ5lM+23zKZ5tP+WzzKZ9tPuWzzad8 rvu32Mw8ASY4aj7ls82nfLaZT73NSOltRkpvM1J6m5HS20yB3mYK9DZToLeZAr3NFOhtBjdvM7h5 m8HN2wxu3mbW8jazlreZtbzNrOVtZi1vM2t5DyQkDCQkDCQkDCQkDCQkDCQkDCQkDCQkDCQkDCQk DCQkDJQOMJD8MFA6wECixUCiBQq72yjsbqOwu43C7jYKuztVaDaQ1IGC9XagdIBAAkkggSSQQIIC AzcKDNwoMHCjwMCNAgM3CgzcKDBwo8DAjQIDNwoM3CgwcKPAwFOFZgNlCgTKFAiUKRAoUyBQpkCg TIFAmQKBMgUCZQoEyhQIlCkQKFMgUKZAoEyBQJkCgTIFAmUKBMoUCJQpEChTIFCmQKBMgUCZAsNc aQ9zpT3MlfYwV9rDXGkPc6U9zJX2MFfaw1xpD3OlPcyV9jCzEIa5Hx9mFsIwl+3DXLabObHbzInd Zk7sNnNit5kTe12xxWbmCTA392FmIYQpA4QpA4QpA5ipv9tM/d1m6u82U3+3mfq7zdTfbab+bjP1 d5upv9tM/d1m6u9WU3/DDFYIM1ghzGCFMIMVwgxWCDNYIcxghTCDFcIMVggzWCHMYIUwgxXCDFYI M1ghzGCFMIMVwgxWCDNYIcxghTCDFcIMVggzWCHMYIUwgxUCZXIGyuQMlMkZKJMzUCZnoEzOQJmc gTI5AwUUBAooCBRQECigIFBAQaCAgkABBYECCgIFFAQKKAgUUBAooCBQQEGggIJAAQWBAgoCBRQE CigIFFAQKKAgUEBBoICCQAEFgQIKAgUUBAooCBRQECigIBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4w EFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4wkBcYSCucCKucCKucCKucDKu 0Ay2CzPYLsxguzCD7cIMtgsz2C7MYLswg+3CjJkIM2YizJiJMGMmwoyZCDNmIsyYiTBjJsKMmQgz ZiLMmIkwYybCjJkIM2YizJiJMGMmwoyZCDNmIsyYiTBjJsKMmQgzZiLMmIkwYybCjJkIM2YizJiJ MGMmwmRyw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ry w2Ryw2Ryw2Ryw2Ryw2Ryw2Ryp8nkTpPJnb/D5H76+dPLf/749e+n4uXr57/98sOnr78pfvnuh0/f /+Onl19++vzXl7/88ON3f39p87Xq/J/znfS7H78+/qvff/nby5fP//Xz5y8///To+Nu/wuM/++Uq /+llrGr5zT/2/hf9+vnxP+znH19en4XvrdufrWI7QPGHTtbGE1mOJ7IcT2Q5nshyPJHleCLL8USW 44ksxxNZjieyHE9kOZ7IcjyR5Xgiy/FEluOJLMcTWY4nshxPZDmeyHI8keV4IsvxRJbjiSzHE1mO J7IcT2Q5nshyPJHleCLL8USW44ksxxNZjieyHE9kOZ4ImZwImZwImZwImZwImZwImZwImZwImZwI mZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwImZwI mZym3XOads9p2j2nafecpt1zmnbPado95+/YPf94H9LaN/Yh/ZHpXzWz/uQ+5PwV/nkfsl+jr2/+ MbIP+WYVuxL/b/ycvrU36nvEfn089PBnf07/ujeKeq1v7Y0a2ht9s4otAcThNH9vmSbdaZp0p2nS naZJd5om3WmadKdp0p2mSXeaJt1pmnSnadKdpkl3mibdaZp0p2nSnaZJd/6OSfeP/0Ua3/yX+7Ue TzWt+WeVjPGv/3K3Mdbrt/5xGeif7m9Wsa2U+FM3T7dpQJ6mAXmaBuRpGpCnaUCepgF5mgD8NAH4 aQLw0wTgpwnATxOAnyYAP00AfpoA/DQB+GkC8NME4KcJwE8TgJ8mAD9NAH6aAPw0AfhpAvDTBOCn CcBPE4CfJgA/TQB+mgD8NAH4aQLw0wTgJzLBT2SCn8gEP5EJfiIT/EQm+IlM8BOZ4CcywU9kgp/I BD+RCX4iE/xEJviJTPATmeAnMsFPZIKfyAQ/kQl+IhP8RCb4iUzwE5ngJzLBT2SCn8gEP5EJfiIT /EQm+IlM8BOZ4BcywS9kgl/IBL+QCX4h0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh 0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUh0nUx0tU0IE/TgDxN A/I0DcjTNCBP04A8TQPyNA3I0zQgT9OAPE0D8jQNyNM0IM/fMSD/scqa31JZa61V1c4A/zmRNf9V ZJ3nbvr6zT9GNNZvVrG7ufgzN8+2aa2eprV6mtbqaVqrp2mtnqa1eprW6mlaq6dprZ6mtXqa1upp Wqunaa2eprV6mtbqaVqrl2mtXqa1epnPHS3Tf7xM/n2Z/Psy+fdl8u/L5N+Xyb8vk39f5nNHy3zu aJkk9TJJ6mWS1MskqZdJUi+TpF4mSb1MknqZJPUySeplktTLJKmXSVIvk6ReJkm9TJJ6mST1Mknq ZT53tJAHfiEP/EIe+IU88At54BfywC/kgV/IA7+QB34hD/xCHviFPPALeeAX8sAv5IFfyAO/kAd+ IQ/8Qh74hTzwC3ngF/LAL+SBX8gDv5AHfiEP/EIe+IU88At54BfywC/kgV/IA7+QB34hD/xCHviF PPALEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZML EZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZMLEZPLdHsu0+25TLfnMt2ey3R7LtPtuUy35zLdnst0 ey7T7blMt+cy3Z7LdHsu0+25TLfnMt2ey3R7LtPtuUy35zLdnst0ey7T7blMt+cy3Z7LdHsu0+25 TLfnMt2ey3R7LtPtuUy35zLdnst0ey7T7blMt+cy3Z7LpI2XSRsvkzZeJm28TNp4mbTxMmnjZdLG y6SNl0kbL5M2XiZtvEzaeJnPHS2TyV0mk7tMJneZTO4ymdz1O0zuH7Ljp/hbb41E9Dzflc8/on8K Hn/8Ff4ZHs/1DQj8/CGAjn+7ii3YxB+5ebRN2HiZsPEyYeNlwsbLhI2XCRsvZKVeyEq9kJV6ISv1 RlbqjazUG1mpN7JSb2Sl3shKvZGVeiMr9UZW6o2s1BtZqTeyUm9kpd7ISr2RlXojK/VGVuqNrNQb Wak3slJvZKXeyEq9kZV6Iyv1RlbqjazUG1mpN7JSb2Sl3shKvZGVeiMr9UbA5EbA5EbA5EbA5EbA 5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA5EbA 5EbA5EbA5EbA5GbApGn2XKbZc5lmz2WaPbdp9tym2XObZs9tmj23afbcptlzm2bPbZo9t2n23KbZ c5tmz22aPbdp9tym2XObZs9tmj23afbcptlzm2bPbZo9t2n23KbZc5tmz22aPbdp9tym2XObZs9t mj23afbcptlzm2bPbZo9twkbbxM23iZsvE3YeJuw8TZh423CxtuEjbcJG28TNt4mbLxN2HibsPE2 YeNtwsbbhI23CRtvEzbeJmy8Tdh4m7DxNmHjbcLG24SNtwkbbxM23iZsvE3YeCPD8UaG440MxxsZ jjcyHG9kON7IcLyR4Xgjw/FGhuONDMcbGY43MhxvZDjeyHC8keF4I8PxRobjjQzHGxmONzIcb2Q4 3shwvJHheCPD8UaG440MxxsZjjcyHG9kON7IcLyR4Xgjw/FGhuONDMcbGY434go34go34go34goT cYWJuMJEXGEirjARV5iIK0zEFSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxhIq4w EVeYiCtMxBUm4wpNs+c2zZ7bNHtu0+y5TbPnNs2e2zR7btPsuU2z5zbNnts0e27T7LlNs+c2zZ7b NHtu0+y5TbPnNs2e2zR7btPsuU2z5zbNnts0e27T7LlNs+c2zZ7bNHtu8wGWbXoit+mJ3KYncpue yG16IrfpidymJ3KbnshtMrnbZHK3yeRuk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lN k8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lNk8lN5MtN5MtN5MtN5MtN5MtN 5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN 5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtN5MtNxBUm4goTcYWJuMJEXGEirjARV5iI K0zEFSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxhIq4wEVeYiCtMxBUm4goTcYWJ uMI0PZFpeiLT9ESm6YlM0xOZpicyTU9kmp7IND2RaXoi0/REpumJTNMTmaYnMk1PZJqeyDQ9kWl6 ItP0RKbpiUzTE5mmJzJNT2Sansg0PZFpeiLT9ESm6YlM0xOZv+OJ/MMY7VP8jRjtil3V5/yTKdqP v8Hjv/qRot1m1Df/2Pvf80aO9rer2C5E/JmbZ9t0e6bp9kzT7Zmm2zNN2jhN2jhN2jhN2jhN2jhN 2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN2jhN 2jhN2jhN2jhN2jiR4ziR4ziR4ziR4ziR4ziR4ziR4ziR4ziR4ziR4ziR4ziR47iQ47iQ47iQ47iQ 47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ47iQ 47iQ47gQMVmImCxETBYiJgsRk4WIyULEZCFishAxWYiYLERMFiImCxGThYjJQsRkIWKyEDFZiJgs REwWIiYLEZOFiMlCxGQhYrIQMVmImCxETBYjJk23Z5puzzTdnmm6PdN0e6bp9kzT7Zmm2zNNt2ea bs803Z5puj3LdHuW6fYs0+1ZptuzTLdnmW7PMt2eZbo9y3R7lun2LNPtWabbs0y3Z5luzzLdnmW6 Pct0e5bp9izT7Vmm27NMt2eZbs8y3Z5luj3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3L pI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI3LpI0LOY4L OY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4L OY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LOY4LcYWFuMJCXGEh rrAQV1iIKyzEFRbiCgtxhYW4wkJcYRGuMF8JV3iqwGycKjAbpwrMxqkCs3GqwGycKjAbpwrMxqkC s3Gq0GwQrvBUodkgXOGpQrNBuMJTxe4p5gbCfAGzTE9kmZ7IMj2RZXoiy/RElumJLNMTWaYnskxP ZJmeyDI9kWV6Isv0RJbpiSzTE1mmJ7JMT2SZnsgyPZFleiLL9ESW6Yks0xNZpieyTE9kmZ7IMj2R ZXoiy/RElumJLNMTWaYnskxPZJmeyDKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3BKZ 3GufIzbzTsC1/RGbeSfg2hWJzbwTcG2WxGbeCbj2UGIz8wSITO61zBKbmSdAZHKvjZjYzDwBxJd7 qtBulfhyTxXarRJf7qlCu1Xiyz1VaLdKfLmnCu3diS/3VKHZIL7cU4Vmg/hyTxWaDeLLPVVoNogv 91Sh2SC+3FOFZoP4ck8Vmg3iyz1VaDaIL/dUodkgvtxThWaD+HJPFZoN4ss9VWg2iC/3VKHZIFzh qUKzQbjCU4Vmg3CFpwrNBuEKTxWaDcIVnio0G4QrPFVoNghXeKrQp0xYv3wlFNj1vVf8Em3e/EQv 2vXl2WsmetGur9piM/PmJ3rRru/rYjPz5id60a4v/WIz8wSIXrTr5iA2M0+A6EW7rh9iM/MEiF60 6w4jNjNPgOhFuy5CXjPRi3Zdm8Rm5gkQvWjX3UtsZp4A0Yt2XeDEZuYJEL1o1y1QbGaeAJGFvK6S YjPzBIgs5HUfFZuZJ0BkIa9LrddMZCGvK7DYzDwBIgt53aPFZubQisThdRmXmvU2gcfgUXV/L/Wo ur+xeFTd30s9qu5vLB5V9/dSpwp4DB5V9/dSj6r7e6lH1f291KMKfcpAt3xUoc8L6JanCuiWjyr0 eQHd8lGFPi+gWz6q0KcMdMtHFZoNoFs+qtBsAN3yUYVmA+iWjyo0G0C3fFSh2QC65aMKzQbQLR9V aDaAbvmoQrMBdMtHFZoNoFs+qtBsAN3yUYVmA+iWjyo0G0C3fFSh2QC65aMKzQbQLR9VaDaAbvmo QrMBdMtHFZoNoFs+qtBsAN3yUYVmA+iWjyo0G0DtfFSxu4N2j3xelcRm2qX0ebESm6mXUm2T8ryd ic20TcrzLic20zYpz5uf2MycM0+5f14fvWaecv+8bIrNzDnzlPvnjVVsZg6tp9w/r71iM/MEeMr9 8+4sNjNPgKfcPy/gYjPzBHjK/fMWLzYzT4Cn3D9XAV4zT7l/Lg7EZuYJ8JT75/ZBbGaeAE+5f64w xGbmCfCU++ceRGxmngBPuX8uU8Rm5gnwlPvnRkZsZp4AT7l/rnW8Zp5y/1wCic3ME+Ap989NktjM PAEeBvBcR2nNFlKPFlKPFlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0 FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FlJ0FnC9 ParQbICE+0cVmg2QcP+oQrMBEu4fVWg2QML9owrNBvA2PqrQbICE+0cVmg2QcP+oQrMBEu4fVWg2 QML9owrNBki4f1Sh2QAJ948qNBsg4f5RhWYDJNw/qtBsmHv+Ze75l7lNX+Y2fZnb9GVu05e5TV/m Nn2Z2/RlbtOXuU1f5jZ9mdv0ZW7Tl7lNX+Y2fZnb9GVu05e5TV/mNn2Z2/RlbtOXuU1f5jZ9mdv0 ZW7Tl7lNX+Y2fZnb9GVu05e5TV/mNn2Z2/SlbtM9h95zceA1894EeK4ZxGbmCfDeBHjuKsRm5gnw 3gR4LjzEZuYJ8N4EeG5NxGbmCfDeBHiuXsRm5gnw3gR47m/EZuYJ8N4EeC6BvGbemwDPlZHYzDwB 3psAz72T2Mw8AeAdxkcV2mCCdxgfVWSDucE7jI8qssHc4B3GRxXZRW6UdrBR2sFGaQcbpR1slHaw UdrBRmkHG6UdbJR2sMGLio8qNBsgEf5RhWYDJStslKywUbLCRskKGyUrbJSssFGywkbJChslK2yU rLBRssJGyQobJStslKywERu3ERu3UbLCRskKG3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4 G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4G3F4m3F43utqzwuW2MzcJXivqz1v aWIzcZewvdfVnlc9sZl4/d9miMM2Qxy2GeKwzRCHbYY4bDPEYZshDtsMcdjeg2jPe67YzDwBZrzE NuMlthkvsc14iW3GS2wzXmKb8RLbjJfYZrzENuMlthkvsc14iW3GS2wzXmKb8RLbxE63iZ1uM15i m/ES2wRitwnEbhOI3SYQu00gdptA7DaB2G0CsdsEYrcJxG4TiN0mELtNIHabQOw2gdhtArHbBGK3 CcRuE4jdJhC7TSB2m0DsNoHYbQKxG1l3NrLubGTd2ci6sxEUsREUsREUsREUkQiKSARFJIIi8pXM RiKUIhFKkQilSIRSJEIpEqEUiVCKRChFIpQiEUqRCKVIhFIkQikSoRSJUIpEKEUilCIRSpEIpUiE UiRCKRKhFIlQikQoRSKUIhFKkQilSIRSJEIpEqEUiVCKRChFIpQiEUqRCKVIhFIkQikSoRSJUIpE KEUilCIRSpEIpUiEUiRCKRKhFIlQikQoRSKUIhFKkQilSIZSmMD7NoH3bQLv2wTet4lpbBPT2Cam sU1MI01MI01MI01M43H5FJuJJyBN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN 5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN 5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN5iNN 5iORFSmRFSmRFSmRFSlRJHiiSPBEkeCJIsETRYInigRPFAmeKBI8USR4okjwRJHgiSLBE0WCJ4oE TxQJnigSPFEkeKJI8ESR4IkiwRNFgieKBE8UCZ4oEjxRJHiiSPBEkeCJIsETRYInigRPFAmeKBI8 EVeYiCtMxBUm4goTcYWJuMJEXGEirrAQV1iIKyzEFRbiCgtxhYW4wkJcYSGusBBXWIgrLMQVFuIK C3GFhbjCQlxhIa6wEFdYiCssxBUW4wpN5j5N5j5N5j5N5j7NEOo0Q6jTDKFOM4Q6zRDqNEOo0wyh TjOEOs0Q6jRDqNMMoU4zhDrNEOo0Q6jTDKFOM4Q6zRDqNEOo0wyhTjOEOs0Q6jRDqNMMoU4zhDrN EOo0Q6jTDKFOM4Q6zRDqNEOo0wyhTjOEOk0mN00mN00mN00mN00mN00mN00mN00mt0wmt0wmt0wm t0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt0wmt5Avt5Av t5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Av t5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5Avt5AvtxBXWIgrLMQVFuIK C3GFhbjCQlxhIa6wEFdYiCssxBUW4goLcYWFuMJCXGEhrrAQV1iIKyzEFRbiCgtxhYW4wkJcYSGu sBBXWIgrLMQVFuIKy/RElumJLNMTWaYnskxPZJmeyDI9kWV6Isv0RJbpiSzTE1mmJ7JMT2SZnsgy PZFleiLL9ESW6Yks0xNZpieyTE9kmZ7IMj2RZXoiy/RElumJLNMTWaYnskxPZJmeyDI9kWV6Isv0 RJbpiSzTE1mmJ7JMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdM JrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdMJrdEJre/El/TqQL7zlMF9p2nCuw7+yvh Mk4V2HeeKrDvPFVg33mqwC78VIFd+KlCs0G4jFOFZoNwGf2VcBmnCs0G4TJOFZoNwmWcKjQbhMs4 VWg2CJdxqtBsEC7jVKHZIFzGqUKzQbiM/krU5lOFfhpEbT5V6KdB1OZThU4KUZtPFTopRG0+Veik ELX5VKHZIGrzqUKzQdTmU4Vmg6jNpwrNBlGbTxWaDZEkvr5sis2828v11dRrJirZ1xdZsZl3e7m+ 9orNvPv79SVZbGaeAFHJvr5pi83MEyAq2dfXdbGZeQJEJfv6zi82M0+AqGRfFwexmXkCRCX7un2I zcwTICrZ1xVGbGaeAFFGuu5BYjPzAxBlpOsyJTYzfwWJMtJ1IxObmb+CRBnputaJzcwTIMpI191Q bGaeAFFGui6YYjPzBIgy0nVL9ZoRVPpUocUGQaVPFVpskAjWU4UWGySC9VShxQaJYD1VaLFBIlhP FZoNEsF6qtBskAjWU4Vmg0Swnio0GySC9VSR2WgkgvVUkdloJIL1VJHZaCSC9VSR2WgkgvVUkdlo JIL1VKHZIBGspwrNBolgPVVoNkgE66lCs4FQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQ hYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhYZQhcZQBRHju65l YjNzA/E7GN+nnz+9/OePX/9+Kl6+fv7bLz98+vqb4pfvfvj0/T9+evnlp89/ffnLDz9+9/eXXn2+ rtdxvoh+9+PXx3/1+y9/e/ny+b9+/vzl558eHX/7V3j8Z79c5T+9jDq/OcY3/9z73/Tr58f/sp9/ fHl9Vr73bn+2it1bxZ/6v9+u/Imf+vzGT33u65nR8/v9T/7Q5//yQ59r7W/+OfRD/1YVu8CLP3Rz cSQmol5bAK+ZmIh67QzEZuYvLjER9Vo8iM3M1amYiHptL8Rm5gkQE1GvFYjYTDwBTUxEvfYoYjPx BDQxEfVaxojNxBPQxETUa6PjNRMTUa/9j9jMPAFiIuq1RBKbmSfA5BibyTE2k2NsJsfYTI6xmRxj MznGZnKMzeQYm8kxNpNjbCbH2EyOsZkcYzM5xmZyjM3kGJvJMTaTY2wmx9hMjrGZHGMzOcZmcozN 5BibyTE2k2NsJsfYkEOrkeTcU4VW4iQ591ShlThJzu2NJOeeKrQSJ8m5pwrJJSQ591Sh2SDJuacK zQZJzj1VaDaQl7EhL2NDXsaGvIwNeRkb8jI25GVsyMvYkJexIS9jQ17GhryMDXkZG/IyNuRlbMjL 2JCXsSEvY0Nexoa8jA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3hoA3h oA3hoA3hoA3hoA3hoA3hoB3hoB3hoB3hoB3hoB3hoB3hoB3hoJ3hoKaPrImJqNdtTWxmbiDERNTr yuc1ExNRrwui2MzcQIiJqNctU2xmngAxEfW6qorNzBMgJqJe912xmXkCTCtrM62szbSyNtPK2kwr azOtrM20sjbTytpMK2szrazNtLI208raTCtrM62szbSyNtPK2kwrazOtrM1EqZuJUjcTpW5mImoz ceP2O7gx2qKIzcwTYDK5zWRym8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTye0mk9tNJreb TG43mdxuMrndZHK7yeR2k8ntyE7dkZ26Izt1R3bqjuzUHdmpO7JTd2Sn7shO3ZGduiM7dUd26o7s 1B3ZqTuyU3dkp+7ITt2RnbojO3VHduqO7NQd2ak7slN3ZKfuyE7dkZ26Izt1R3bqjuzUHdmpO7JT d2Sn7shO3ZGduiM7dUd26o64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64 wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wo64wm56IrvpieymJ7Kbnshu eiK76Ynspieym57Ibnoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK76Ynspieym57Ibnoiu+mJ 7KYnspueyG56IrvpieymJ7KbnshueiK76Ynspieym57Ibnoiu+mJ7KYnspueyG4yud1kcrvJ5HaT ye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200m t5tMbjeZ3G4yud1kcrvJ5HaTye3Il9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77c jny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjty2HbksO3IYduRw7Yjh+1ADtuBHLYDOWwH ctgO5LAdyGE7kMN2IIftQITgQITgQITgQITgQITgQITgQITgQITgQITgQITgQITgQITgQITgQITg QITgQITgQITgQITgQITgQITgQITgQITgQITgQITgQITgQITgYKyf6VPspk+xmz7FbvoUu+lT7KZP sZs+xW76FLvpU+ymT7GbPsVu+hS76VPspk+xmz7FbvoUu+lT7KZPsZs+xW76FLvpU+ymT7Gb1sJu Wgu7aS3sprWwm9bCYVoLh2ktHKa1cJjWwmFaC4dpLRymtXCY1sJhoq3DRFuHibYOE20dJto6TLR1 mGjrMNHWYaKtw0Rbh4m2DhNtHSbaOky0dZho6zDR1mGircNEW4eJtg4TbR0m2jpMtHWYaOsw0dZh oq3DRFuHSaMO5OgZyNEzkKNnIEfPQETCQETCQETCQETCQETCQETCQETCQETCQETCQETCQETCQETC QETCQETCQETCQETCQETCQETCQETCQETCQETCQETCQEnhA3EMA3EMA3EMA3EMA3EMgTiGQBxDII4h EMcQiGMIxDEE4hgCcQyBOIZAHEMgjiEQxxCIYwjEMQTiGAJxDIE4hkAcQyCOIRDHEIhjCMQxBOIY AnEMgTiGQBxDII4hEMcQiGMIxDEE4hiCcQwmbT5M2nyYtPkwafNhkhXDJCuGSVYMk6wYJlkxTLJi mGTFMMmKYZIVwyQrhklWDJOsGCZZMUyyYphkxTDJimGSFcMkK4ZJVgyTrBgmWTFMsmKYCdDDxDSG iWkME9MYJqYxTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwj TEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjTEwjkA8okA8o UFJ4IPdQoKTwQEnhgZLCAyWFB0oKD5QUHigpPFBSeKCk8EBJ4YGSwgMlhQdKCg+UFB4oKTxQUnig pPBASeGBksIDJYUHSgoPlBQeKCk8UFJ4oKTwQEnhgZLCAyWFB0oKD5QUHigpPFBSeCCuMBBXGIgr DMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4 wkBcYSCuMBBXGIgrDMQVhonJh4nJh5kAHSZzH2YCdJgJ0GEmQIeZAB1mAnSYCdBhJkCHmQAdZgJ0 mAnQYSZAh5kAHWYCdJgJ0GEmQIeZAB1mAnSYCdBhJkCHmQAdZgJ0mAnQYSZAh5kAHWYCdJgJ0GEm QIeZAB1mAnSYCdBhJkCHmQAdJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMb JpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbJpMbyJcbyJcbyJcbyJc7 kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciXO5EvdyJf7kS+3Il8uRP5cify5U7ky53IlzuRL3ciX+5E vtyJfLkT+XIn8uVO5MudyJc7kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciXOxFXOBFXOBFXOBFXOBFX OBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBFXOBEhOBEhOBEh OBEhOBEhOBkhaLobw3Q3huluDNPdOE134zTdjdN0N07T3ThNd+M03Y3TdDdO0904TXfjNN2N03Q3 TtPdOE134zTdjdN0N07T3ThNd+M03Y3TdDdO0904TXfjNN2N03Q3TtPdOE134zTdjdN0N07T3ThN d+M03Y3TdDdO0904Tbp2mnTtNOnaadK106Rrp0nXTpOunSZdO026dpp07TTp2mnStdOka6dJ106T rp0mXTtNunaadO006dpp0rXTpGunCcROE4idJhA7TSB2mkDsNIHYiUyxE5liJzLFTmSKncgUO5G9 dSJ760T21onsrRPZWyeyt05kb53I3jqRvXUie+tE9taJ7K0T2VsnsrdOZG+dyN46kb11InvrRPbW ieytE9lbJ7K3TmRvncjeOpG9dSJ760T21onsrRPZWyeyt06E502E502E502E5y2E5y2E5y2E5y2E 5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E5y2E 5y2G55nWwmlaC6dpLZymtXCa1sJpugGn6Qacphtwmm7AaboBp+kGnKYbcJpuwGm6AafpBpymG3Ca bsBpugGn6Qacphtwmm7AaboBp+kGnKYbcJpuwGm6AafpBpymG3CabsBpugGn6Qacphtwmm7AaboB p+kGnCbDOk2GdZoM6zQZ1mUyrMtkWJfJsC6TYV0mw7pMhnWZDOsyGdZlMqzLZFiXybAuk2FdJsO6 TIZ1mQzrMhnWZTKsy2RYl8mwLpNhXSbDukyGdZkM6zIZ1oUcqQs5UhdypC7kSF3IkbqQI3UhR+pC jtSFHKkLOVIX8pYu5C1dyCW6kN9zIefmQh7MhTyYC3kwF/JgLuTBXMiDuZAHcyEP5kIezIXedljI ubmQc3Mh5+ZCzs2FnJsLOTcXwtgWwtgWwtgWwtgWwtgWetthIfhtIfhtIfhtIfhtIfhtIfhtIfht IfhtIfhtIYxtIYxtIYxtIYxtIYxtIYxtIYxtIYxtIYxtIYxtIYxtIYxtmf63Zfrflul/W6b/bZn+ t2X635bpf1um/22Z/rdl+t+WaVlbpmVtmS6zZRrDlunlWqb9apn2q2Xar5Zpv1qm/WqZ9qtl2q+W ab9apv1qmY8bLNPLtUwv1zK9XMv0ci3Ty7VML9cyCcRlEojLJBCXSSAuk0Bc5uMGy8QZl4kzLhNn XCbOuEyccZk44zJxxmXijMvEGZdJIC6TQFwmgbhMAnGZBOIyCcRlEojLJBCXSSAuk0BcJoG4TAIx 0YYs0YYs0YYs0YYs0YYs0YYs0YYs0YYskdEzkdEzkdEzkdEzkdEzkdEzkdEzkfkykfkykfmykPmy kPmykI2ykI2ykI2ykI2ykI2ykI2ykI2ykI2ykCGykCGykCGykCGykCGykEmxkEmxkEmxkEmxkEmx ELFViNgqRGwVIrYKEVuFiK1CxFYhYqsQsVWI2Cr0hkAhzqsQ51XoDYFCdFihNwQKMWWF3hAoRKIV ekMgzTtqmnfUNO+oad5R07yjpnlHTfOOmu4dVdzSpOmSS9Mll6ZLLk2XXJouuTRdcml60dL0oqXp RSvTi1amF61M+1iZ9rEy7WNl2sfKtI+VaR8r0z5Wpn2sTMdXmY6vMh1fZTq+ynR8lemrKtNXVaav qkxfVZm+qjLZyDLZyDLZyDLZyDLZyDLZyDLZyDLZyDLZyDLZyDLfBigTtCwTtCzzbYAyqc0y3wYo EwEt822AMnnSMt8GKOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQY LOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLOQYLBSXX8hnWMhn WMhnWMhnWIiiKkRRFaKoClFUhSiqQhRVIYqqEEVViKIqRFEVoqgKUVSFKKpCFFUhiqpQXH6huPxC xFYhYqsIsTVeCbF1qsBsnCowG6cKzMapArNxqsBsnCowG6eK3VPMDYRpDizTHFimObBMc2CZ5sAy zYFlmgPLNAeWaQ4s0xxYpjmwTHNgmebAMs2BZZoDyzQHlmkOLNMcWKY5sExzYJnmwDLNgWWaA8s0 B5ZpDizTHFimObBMc2CZ5sAyzYFlvnVQptOwTKdhmU7DMp2GZVKcZVKcZVKcZVKcZVKcZVKcZVKc ZVKcZVKcZVKcZVKcZVKcZVKcZVKcZVKcZb51UOZbB2XypWXypSXypdceSmzmnYBrayU2807AteMS m3kn4NqIic28E3Cagd3qqUK7VeKTPFVot0rclacK7VaJu/JUod0qcVeeKrBbPVVoNoiTc7wSJ+ep QrNBnJynCs0GcXKeKjQbxMl5qtBsECfnqUKzQZycpwrNBnFynio0G8TJearQbBAn56lCs0GcnKcK zQZxcp4qNBvEyXmq0GwQrvBUodkgXOGpQp8yIQTHKyEETxX6lAkheKrQp0wIwVOFPmVCCJ4q9BuA EIKnCs0GIQRPFZoNQgieKjQbhBA8VWg2CCF4qtBsEELwVKHZIITgqWI0h7dLuC5YXjPR9nddx8Rm 5i5B9BBedzqxmblLED2E18VQbGaeANHdeN0uxWbmCRDdjdcVVWxmngDR3Xjdc8Vm5gkQ3Y3XZdlr Jrobr6u12Mw8AaK78bqfi83MEyC6G69LvtjMPAGiu/HaFIjNzBMguhuvdYPYzDwBIl177SzEZv9+ aD/9/OnlP3/8+vdT8fL1899++eHT198Uv3z3w6fv//HTyy8/ff7ry19++PG7v7/0PlZvK85F+Lsf vz7+q99/+dvLl8//9fPnLz//9Oj427/C4z/75Sr/6WXkjPH6zT/3/jf9+vnxv+znH1/6jPfq9/79 z1WyLZh5KEXg99r3iM3MQykCv9fSSGxmHkoR+L02T2Iz858lEfi91ldiM/MEiMDvtQMTm5kn4HeA 3z/+5b/mt375r2qv1R7075/75X/+Cv/8yz/WnFXf/HO/+RX++q+/+NufrWJLQvGnbp5uEWa+No1e MxFmvvaSWrOGBMGGBMGGBMGGBMGGBMGGBMGGBMGGBMGGBMGGBMGGBMFGgkZOFZoNJCM2JCM2JCM2 JCM2JCM2JCM2EhhwqtBskMCAU4VmgwQGjEYCA04Vmg0SGHCq0GyQwIBThWaDBAZc/xKJ/6yJ3yua ucxq5jKrmcusZi6zmrnMauYyq5nLrGYus5q5zGqiVfz611lsZp4Ac3PUzM1RMzdHzdwcNXNz1ESb 4PWtQmxmngDRJnh9NfGaiTbB64uM2Mw8AaJN8Po2JDYzT4BoExwd5dF0lEfTUbJMR8kyHSXLdJIs c6rI5aMjZ0xHzpiOnDEdOWM6csZ05IzpyBnTkTOmI2dMR86YjpwxHTljOnLGdOSM6cgZ05EzpiNn TEdulY7cKh25VTpyq3TkVunIrdKRW6Ujt0pHy+mOltMdLac7Wk53tJzuaDnd0Zq5o9VvR6vfjla/ Ha1+O1rHdrSO7Wgd25GroyNXR0eujm7ayLtpI++m87ubzu9uOr+76fzupl+hm36FbvoVuulX6KZf oZt+hW76FbrpV+imX6GbfoVu+hW66Vfopl+hm36FbvoVuulX6KZfoZt+hW66ArrpCuimK6CbroBu ugK66Qropiugm66Abgqp3RRSuymkdlNI7aaQ2k0htZvaZzcVxm4qjN1UGLupMHZTx+umjtdNHa+b BHg3CfBuEuADLfMGWuYNtMwbaJk30FpuoLXcQGu5gdZyA63lBlrLDbSWG2gtNxAzOtAybyBmdCBm dKDF4UCLw4EWhwMtDgdiRgdiRgdaUg60pBxoSTnQknKgJeVAS8qBomcGip4ZKHpmoOiZgaJnBoqe GSh6ZqDomYGiZwaKnhkoemag6JmBomcGip4Z5HG6U4VmgzxOd6rQbCDWfCDWfCDWfCDWfCDWfCDW fCDWfCDWfCDWfCDWfCDWfJDH6U4Vmg3yON35AotmgzxOd92JvAuWuUsc5i5xmLvEYa7/hrn+G+b6 b5jrv2Gu/4a5/hvm+m+Y679h+ijG7+wS/9DjfIq/4XFu/XXXen3snP+Ux/nxV/hnj3P7RrjF+TPA 3/ztKnZbFn/i5sk2t7fD3N4Oc3s7zO3tMP0hw/SHDHOvPH5nr/zHJ3t++2RXy1it7z95suf/crK/ ET5z/gw52d+sYrsO8SdunmxzXz7UfbmZmDLMxJRhJqYMMzFlmIkp43cSU/74ZK9vnuxzDd+jPd7K +nMne/3ryV7f/CPkYH+zii2qxB/4/0YQzPhmEEwb1edrzd7/7A98/vGvUhQC8+0qtq4Tf+LmLywz BGaYITDjd0Jg/niw9uu3BivOt9V9AQd/brD2678O1rdGZL+SwfpmFdt8/m/8kNo3f0jRM9p4/bNf ZM5f4Q9P327oh/StKrboFcdSRBKG+ALptS0Wm/3731h/YrDWNwcrY+eZ/PFnB2v9y2Dtb/4RNFff qmIrc/EHbv4iNh3Tw3RMD9MxPUzH9DAd08N0TA/TMT1Mx/QQH1a99AKxmXkCxIdVL9FBbIZ0qkI6 VSGdqpBOVUinKqRTFdKpiuhU8Ur+oQkUTBAomCBeyWwEijMIFGcQKJggUDBBoGCCQMEEgYIJAgUT BAomCBRMECiYIFAwQaBggkDBBIGCCQIFEwQKJggUTBAomCBQMEGgYIJAT3YGerIzUAhCIG46EDcd iJsOxE0HCkEIRFsHoq0D0daBaOtAtHUg2joQbR2IgA5EQAcioAMR0IEI6EAEdCACOhABHYiADkRA ByKgAxHQwQjoMu/3Zd7vy7zfl3m/L/N+X+b9vsz7fYn3+8etTGwm3u/DzPt4XO3EZuIJCDM8JMy8 jzDzPsLM+wgz7yPMvI8w8z7CzPsIM+8jzLyPMPM+wsz7CDPvI8y8jzDzPsLM+wgz7yPMvI8w8z7C zPsI833SMN8nDTOJJEz3QJjugTDdA2G6B8JMIgnTihCmFSFMK0KYVoQwrQhhWhHCtCKEGR4SJhgf JhgfJhgfJhgfJhgfJhgfJhgfJhgfJhgfZuBKmAB5mAB5IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9 IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9 IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IGt9IJwtEM4WCGcLhLMFwtkC4WyBcLZAONtEONtEONtE ONtEONtEONtEONtEr/NMBMFNBMFNBMFNBMFNBMFNBMFNBMFNBMFNBMFNBMFNBMFNBMFNBsGZBt4w DbxhGnjDNPCGaeAN08AbpoE3fsfAi+6NYjNzA2E6QsN0hIbpCA3TERq/4whFF1uxmXkCTIdhmA7D MB2GYT5eGqYVL0wrXphWvDCteGFa8cK04oVpxQvTihemFS9MK16YVrwwrXhhWvHCtOKFacULE1YN E1YNE1YNE1YNE1YNE1YNE1YNE1adJqw6TVh1mrDqNGHVacKq04RVp/nS3TTJ12mSr9MkX6dJvk6T fJ0m+TpN8nWa5Os0yddpkq/TJF+nSb5OkXwNFP4cKPw5UPhzoPDnQOHPgcKfA4U/BwpcCBS4EChw IVDgQqDAhUCBC4ECFwIFLgQKXAgUuBAocCFQ4EKgwIVAgQuniswGimkIFNMQKKYhUExDoJiGQDEN gWIaAsU0BIppCBTTECimIVBMQ6CYhkDRCYGiEwJFJwSKTggUnRAoOiFQdEKg6IRA0QmBohMCRScE ik4IFJ0QKDohUHRCoOiEQNEJgaITAkUnnCo0G+ShukAxDYFiGgLFNASKaQgU0xBm3l2YeXdh5t2F mXcXZt5dmHl3YebdhZkIEWYiRJiJEGEmQoSZCBFmIkSYiRBhJkKEmQgRZiJEmIkQYSZChJkIEWYi xHWBFZuJJ8CMlwgzXiLMeIkw4yXCjJcIM14ifi9e4o9Csx/F3wrNfq2s153nC/2fCc2+/gqP/+zv RNY//sz73/LPp2b/myq2ZxB/4ubJFsWDMGMzwozNCDOcIsxwijDDKcIMpwgznCLMcIowwynCDKcI M5wizHCKMMMpwgynCDOcIsxwijDDKcIMpwgznCLMcIowwymufZTYzDwBYmxGmLEZYcZmhBmbEWZs RiD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biD7biAjbiAjbiAj biAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAjbiAj biAjbkzyGsWpQrOBkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJkIqJ kIqJkIqJkIqJkIqJkIqJkIrJkArRYBmmwTJMg2WYBsswDZZhGizDNFiGabAM02AZpsEyTINlmAbL MA2WYRoswzRYhmmwDNMTGaYnMkxPZJieyDA9kWF6IsP0RIbpiQzTExmmJzJMT2SYnsgwPZFheiLD 9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiQ/VETvE1kGvDITYzT4AJXEwTuJgmcDFN4GKawMU0gYtp AhfTBC6mCVxME7iYJnAxTeBimsDFNIGLaQIX0wQupglcTBO4mCZwMU3gYprAxUTwwETwwETwwETw wETwwETwwETwwETwwETwwETwwETwwETwwETwwETwwETwwETwwETJChMhBwthAAthAAthAAthAAth AAthAAthAAthAAthAAthAAthAAthAAthAAtJ8wtJ8wtJ8wtJ8wtJ8wtJ8wtJ8wtJ8wtJ8wtJ8wtJ 8wtJ8wtJ8wuJ7AvJ5QvJ5QvJ5QvJ5QvJ5QvJ5QvJ5QvJ5YvJ5aasPE1ZeZqy8jRl5WnKytOUlacp K09TVp6mrDxNWXmasvI0ZeVpysrTlJWnKStPU1aeZqTANDXqZSrBy1SCl6kEL1MJXqYSvEwleJlK 8DKV4GUqwctUgpepBC9TCV6mErxMvXWZeusy9dZl6q3L1FuXqbcuU29dpt66TL11mXrrMvXWZeqt y9RblymRLlPVXKaquUxVc5mq5jJVzWWqmstUNZepai5T1VzkNeVThbY95DXlU4W2PeQ15VOFtj3k XeRYSBtdSBtdSBtdSK9cSK9cSK9cSK9cSK9cSK9cSK9cSK9cSK9cSK9cSK9cSK9cTK9EFumFLNIb aaMbqZwb6ZUbKY8baYgbqYEb6XobGXU30vU2Uug20to2Us020r82UrI2sotupGRtZBfdSP/aSP/a SP/aSP/aTP8S3xG9vgCKzcwbhfiO6PUtUmxm3ijEpz+vr6JiM/MabEqIyxTqlinULVOoW6ZQt0yh bplC3TKFumUKdcsU6pYp1C1TqFumULdUoc40ky7TTLpNCXGbqt82hbptamvblMO2qWBtU3TapmNw m6LTNnWibUo721RjtimgbFPz2KYtbJuaxzZtYdsUULYpoGxTQNmmgLJNAaXQlb7Qlb7Qlb7Qlb7Q lb7Qlb7Qlb7Qlb4Q0loIaS2EtBZCWgslQBVKgCqUAFUoAarQo1qFHtUq9KhWoUe1KtBsBJqNiWZj otmYaDYmmo2JZmOi2ZhoNiaajYlmY6LZWGg2FpqNhWZjodlYaDYWmo2FZmOh2VhoNhaajY1mY6PZ QFBFITyiEOhQCHSojT4vhEcUwiMK4RGF8IhC1vFC1vFCKEYhFKMQilEIxSiEYhRCMQqhGGXevcu8 e5d59y7z7l3m3bvMu3eZd+9S794mvFgmvFgmvFgmvFhmJEuZkSxlRrKUGclS5hs4Zb6BU+YbOGW+ gfO434rNzBMwzRMwzRMwzRMwzRMwzRMwzRMwzRMwzRMwzRMwzROwzBOwzBOwzBOwzBOwzBOwzBOw zBOwzBOwzBOwzBOwzROwzRNgIodlUoJlgn1lgn2PHYvYzJwzkxIskxIskxIsM2ikzKCRMvnFMvnF MvnFMvnFMvnFMvnFEvnF+UrA/1MFtoqnCmwVTxXYKp4qsFU8VWCrOF8JkXCqwFbxVIGN86kCG+dT hWaDEAmnCs0GYQtOFfqUCVtwqtCnTNiCU4U+ZcIWnCr0KRO24FSh3wCELThVaDYIW3Cq0GwQtuBU odkgbMGpQrNB2IJThWaDsAWnCs0GYQtOFZoNwhacKjQbhC04VWg2CFtwqtCnTCiB+UoogVOFPmVC CZwq9CkTtuBUoU+ZEAmnCv0GIETCqUKzQYiEU4VmgxAJpwrNBiESThWaDUIknCp2d/Du3tdVSWzm 3b2vi5XYzLt7X9cwr5lIO1yXNrGZt326rnhiM/MEiLTDdU8Um5lDKwIK12VTbGYOrQgoXDdWsZk5 tCKgcF17xWbmr20RULjuzl4zEVC4btpiM/MEiIDCdV0Xm5knQAQUrju/2Mw8ASKgcC0OxGbmCRAB hWv7IDYzT4AIKFwrDLGZObQiU3DtQcRm5tCKTMG1TBGbmUMrxhhdGxmxmflrW6QdrrWO10ykHa4l kNjMPAEi7XBtksRm5gkQaYdrHaU1ayQe8FSRrWIjoYKnimwVGyISGmILGqIEGqIEGqIEGqIEGqIE GqIEGqIEGqIEGqIEGsktOFVoNhAl0JDe35By35AG35AG35AG35AG35AG35AG35AG35AG35AG35AG 35AG35AG35AG35AG35AG35AG35AG35AG35AG35AG35AG34i//1ShTxmp6Q2p6Q2p6Q2p6Q2p6Q2p 6Q2p6Q2p6Q2p6Q2p6Q2p6Q2p6Q2p6U3Mt7u+5ovNxHtjE58uuu4KYjPxqtdMPbyZengz9fBm6uHN 1MObqYc3Uw9vph7eTD28ie7/6/7kNTP18GZK2M1UnZspFDdTKG6mUNxMobiZQnEzheJmCsXNFIqb KRQ3UyhuplDcTKG4mUJxM4XiZgrFzRSKmykUN1MobqZQ3EyhuJlCcROd7Net3GtmarvN1Habqe02 U9ttprbbTG23mdpuM7XdZmq7zdR2m6ntNlPbbaa228mTaaeK7KE6eWjtVJE9VEf6a0f6a0f6a0f6 a0f6a0eO8I5U244c4R1pvR1pvR1pvR1pvR1pvR1pvR1pvR1pvR1pvR1pvR1pvR35yDtSiDvykXek K3fkI+9Ije7IR96Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2Rht2R ht2Rht2Rht2Rht2Rht2Rht2Rht2R+7wj5bsj93lHenlHenlHenlHenlHenlHenlHenlHenlHenkX X3S7rmVis39/z//086eX//zx699PxcvXz3/75YdPX39T/PLdD5++/8dPL7/89PmvL3/54cfv/v7S xtpjrvP//cd3P359/Fe///K3ly+f/+vnz19+/unR8bd/hcd/9stV/tNL++Yfef9Lfv38+B/1848v r8+i97Z/uordTb0fuIkYdBMx6CZi0E3EoJuIQTfDALrJK3QzDKCb8EM34Yduwg/dhB+6CT90E37o JvzQTfihm/BDN+GHbsIP3UwW6CZJ0c1kgW5iGd1MFugm49HNZIFuAiPdBEa6CYx0ExjpJjDSTWCk m8BIN4GRbgIj3QRGugmMdBMY6SYw0k1gpJvASDeBkW4CI90ERroJjHQTGOkmMNJNYKSbMQXdpE+6 GVPQTZSlmyhLN1GWbqIs3URZuomydBNl6SbK0k2UpSMbTUc2mo5sNB3ZaDoKpewolLKjUMqOQik7 eSbzVKGVMXkm81Sh2Sg0G4Vmo9BsFJqNQrNRaDYKzUaR2RivZDbGK5mN8UpmY7yS2RivZDbGK5mN 8UpmY7yS2RivZDbGK5qNhmajodloaDYamo2GZqOh2UC45EC45EC45EC45EC45EC45EC45EC45EC4 5EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45EC45GC4 pGkl6KaVoJtWgq5aCcyYuG7GxHUzJq6bMXFdfBTvuk56zcRH8a7Lp9jMPAFlnoAyT0CZJ6DME1Dm CSjzBJR4Ah53abGZeAIeN2+xmXgCHvd0sZl4Ah63erGZeAIeOwCxmXkCmnkCmnkCmnkCmnkCmnkC mnkCTNR4mKjx+B3UGC1AvGYmkztMJneYTO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5 w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR3IrjWQXWsgu9ZAdq2BuIyBuIyBuIyB uIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIyBuIxAXEYgLiMQ lxGIywjEZQTiMgJxGYG4jEBcRiAuIxCXEYjLCMRlBOIyAnEZgbiMQFxGIC4jEJcRiMsIxGUE4jIC cRmBuIxAXEYgLiMQlxGIywhEWARiJQJRD4H4hUD8QiB+IRC/EIxfMNn0YbLpw2TTh8mmD5ONGCYb MUw2YphsxDDZiGGyEcNkI4bJRgyTjRgmGzFMNmKYbMQw2YhhshHDZCOGyUYMk40YJhsxTDZimGxE mGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxE mGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmGxEmDhDmARCmNBAmDp/mDp/mDp/mDp/mDp/IC9LIC9L IC9LIC9LoOjvQNHfgaK/A0V/B4r+DhT9HSj6O1D0d6Do70DR34GivwNFfweK/g4U/R0o+jtQ9Heg 6O9A0d+Bor8DRX8Hiv4OFP0dKPo7UPR3oOjvQNHfgaK/A0V/B4r+DhT9HSj6O1D0dyCWLBBLFogl C8SSBaLCAvFdgfiuQHxXIL4rEN8ViO8KxHcF4rsC8V2B+K5AfFcgvisQ3xWI7wrEdwXiuwLxXRPx XRPxXRPxXZPxXSb7HCb7HCb7HCb7HGYecZh5xGHmEYeZRxxmHnGYecRh5hGHmUccZh5xmHnEYeYR h5lHHGYecZh5xGHmEYeZRxxmHnGYecRh5hGHmUccZh5xmHnEYeYRh5lHHGYecZh5xGHmEYeZRxxm HnGYecRh5hGHmUccJvMZJvMZJvMZJvMZJqYZJlkZJlkZJlkZJlkZJlkZJlkZJlkZJlkZJlkZJlkZ JlkZJlkZJlkZJlkZJlkZJlkZJlk5TbJymmTlNMnKaZKVC23fFtq+LbR9W2j7tpC7ciF35ULuyoXc lQu5KxdyVy7krlzIXbmQu3Ihd+VC7sqF3JULuSsXclcu5K5cyF25kLtyIZ/kQo7HhbyLC6VDL+Rd XCgdeiHH40Lp0Av5JBdKh17IXbmQu3Ihd+VC7sqF3JULEXULEXULEXULEXULEXULEXULsXELUW4L UW4LUW4LUW4LUW4LUW4LUW4LUW4LUW4LUW4LUW4LUW4LUW4LUW4LUW7LvG8t8761zPvWcu9b4sZh mU62ZTrZlulkW6aTbZlOtmU62ZbpZFumk22ZTrZlOtmW6WRbppNtmU62ZTrZlulkW6aTbZnms2X6 xZZp8VpmYu0yLV7LTKxdpl9smYm1yzSfLTOxdplOtmU62ZbpZFumk22ZTrZlUpvLpDaXSW0uk9pc JrW5TGpzmaDlMtnIZbKRy2Qjl8lGLpONXCYbuUw2cpls5DLZyGWykctkI5fJRi6TjVwmG7lMNnIj dWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjdWIjv/9G zv2NNI2N1ImN1ImN1ImN1ImN1ImN1ImN1ImN1ImN1ImN1ImN1ImN1ImN1ImNPPgbuek38sVv5Ivf yBe/kS9+I1/8Rr74jXzxG/niN3K4b+RV3+jdk40c7hu9e7KRL34jX/xGvviNfPEb+eI38sVv5Ivf yBe/kS9+m1vnbW6dt7l13ubWeZtb521unbe5dd7m1nmbW+dtbp23uXXe5tZ5m1vnbW6dt7l13ubW eZtb521unbeZFbBNe/82V9jb3Dpvc+u8za3zNrfO29w6b3PrvM2t8za3ztvcOm9z67zNrfM2t85b 3Tqbjvxtmui36Xvfpu99m773bfret+l736bvfZu+92363rdpVd+mu3ybLwpt06q+zReFtul736bv fZu+92363rfpe9+m732bvvdt+t636XtP5FtL9FJfIrdbIj05kTKcSBlOpAwnUoYTKcOJlOFEynAi ZTiRMpxI402k1iZSaxOptYnU2kRqbSK1NpGXLJFam0itTaTWJlJrE6m1idTaRGptIrU2kVqbSK1N pNYmUmsTqbWJ1NpEiemJNN5EiemJlOFEynAiZTiRMpxIGU6kDCdShhMpw4kS0xPpyYkS0xOp0IlU 6EQqdCIVOpEKnUiFTqRCJ1KhE6nQabqX0nztKk0rVJqidJo6cpo6cpo6cpo6cpo6cpo6cpo6cpo6 cpo6cprSb5pqbZpqbZpqbZpqbZpqbZpqbZoeoTTV2jTV2jTV2jTV2jTV2jTV2jTV2jTV2jTV2jTV 2jTV2jTV2jTV2jTV2jTz09OUftPMT09TR05TR05TR05TR05TR05TR05TR05TR04zPz1NUTrN/PQ0 Fe40Fe40Fe40Fe40Fe40Fe40Fe40Fe40Fe5CiabVyYasUA5qdbIhK6RCF1KhC6nQ1cmGrJB2XcgL XUjxLqR4F1K8CynehRTvQop3IcW7kOJdSPEu5IUupJMX8kIXUtcLqeuF1PVCOnkhnbyQq7mQul5I XS+krhdS1wup64XU9ULqeiF1vZC6XkhdL6SuF1LXC6nrhdT1Qup6IXW9kLpeSF0vpK4X0skLKd6F tOtC2nUh7bqQCl1IhS6kQhdSoQup0IVU6DJTMB9XCrGZeEd9XEDEZuIdtUyFu0yF+3G5EZuJW5oy Pdxlau9lau9lau9lau9lau9lau9lau9lau9lau9lerjLFPLL9HCXSQWUSQWUSQWUKeSXKeSXabsu kwookwookwookwookwookwookwookwookwookwookwookwookwookwookwookwookwookwookwoo U8gvU3svUy4vUy4vUy4vU+EuU+EuU+EuU+EuU+EuUeFer+RdzVMFtoynCmzIThXYkK1XokKfKrAh O1VgQ3aqwIbsVIE96KkCe9BThWaDqNCnCs0GUaHXK1GhTxWaDaJCnyo0G0SFPlVoNogKfarQbBAV +lSh2SAq9KlCs0FU6FOFZoOo0KcKzQbRrk8Vmg2ieJ8qNBtE8T5VaDaI4n2q0GwQxftUodkgivep QrNBFO9ThWaDKN6nCs0GUbxPFZoNonifKjQbRPE+VWg2iOJ9qtBsEJ38VKHZIOr6qUKzQTT5U4Vm g2jypwrNBlHyTxWaDfGtzOtaJjbz7vnXJc5rJlIC15VPbObd868LotjMW05d10mxmXkCRErgupOK zcwTIFIC18VWbGaeAJESuG7HYjPzBIiUwHXFFpuZJ0CkBK57utjMPAEiJXBd9sVm5gkQswOujYHY zDwBIr9wrR28ZiK/cC0pxGbmCRD5hWvTITYzT4DIL1zrErGZeQJEfuHauYjNzBMg8gvX4kZsZp4A kV+4tj9iM/MEiPzCtULymokwxLVwEpuZJ0BMNbi2VmIz8wSImMa1+hKbmSdAZD5Wa2Tf2RrZd7ZG 9p2tkX1nQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xG Q1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xG Q1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xGQ1xG Q1xGQ1xGQ1xGQ1xGQ1zG4/4lXubEe/7jtiY2E+/5zWQ+msl8NJP5aCbz0Uzmo5nMRzOZj2YyH81k PprJfDST+Wgm89FM5qOZzEczmY9mMh/NZD6ayXw0k/loJvPRTOajmcxHM5mPZjIfzWQ+msl8NJP5 aCbz0Uzmo5nMRzOZj2YyH81kPprJfDST+Wgm89FM5qOZzEczmY9mMh/NZD6ayXw0k/loJvPRTOaj mcxHM5mPZjIfzWQ+msl8NJP5aCbz0Uzmo5nMRzOZj2YyH81kPprJfDST+Wgm89GQr6khX1NDvqaG fE2NJJSeKrRbJQmlpwrtVsk7macK7VbJO5mnCs1GotlINBuFZqPQbBSajUKzUWg2Cs1GodkoNBuF ZqPIbPRXMhv9lcxGfyWz0V/JbPRXMhv9lcxGfyWz0V/JbPRXMhv9Fc1GQ7PR0GwgrrAjrrAjrrAj rrAjrrAjrrAjQrAj1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j1q8j 1q8j1q8z1s8k2ptJtDeTaG8q0S6mGF4XKrGZeb83Uwyb+E7fdVkTm5knQHyn77rxic3ME1DmCSjz BJR5Aso8AWWegDJPQJknoMwTUOYJKPEEPG7BYjPxBDzuzGIz8QQ8bthiM/EEPO7jYjPxBDxu72Iz 8wQ08wQ08wSYxGs3idduEq/dJF67Sbx2k3jtJqTaTa60m1xpN7nSbnKl3eRKu8mVdpMr7SZX2k2u tJtcaTe50m5ypd3kSrvJlXaTK+0mV9pNrrSbXGlHdpqOjDEdGWM6EvY7EvY7kug7Ets7Ets7Ets7 Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7Ets7EtsHEtsHEtsHks0H EsAHEsAHEsAHEsAHEsAHEsAHEsAHEsAHEsAHEsAHEsAHEsAHEsAHCtYZSDYfKFhnILF9ILF9INl8 IAF8IAF8IAF8IAF8IAF8ICl7IFF6MFHahIC7ye12k9vtprLdTWW7m2J0N/XjburH3dSPu6kfd1M/ 7qZ+3E39uJv6cTf1427qx93Uj7upH3dTP+6mftxN/bib+nE39eNu6sfd1I+HqR8PUz8epuQ7TJV2 mCrtMFXaYaq0w1Rph6nSDlOlHaZKO0yVdpgq7TBV2mGqtMNUaYeZSzRMyXeYuUTD1I+HqR8PU/Id pko7TJV2mCrtMFXaYaq0wxRWh6mFDlMLHShLcKAswYGyBAfKEhxI/BwoS3AgyXQgyXQgyXQgyXQg L/RAQutAXuiB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB5NmB 5NmB5NmB5NlA8mwgeTaQFzqQqBvICx1ICg4kBQeSggNJwYGk4EBScCApOJAUHEgKDiQFB5KCA0nB gaTgQFJwICk4kBQcSAoOJAUH8l0HEpAD+a4Dyc6BZOdAsnMg2TmQ7BzIdz3MDK1hZmgNM0NrmBla w5TPh5mhNUwtfpha/DC1+GFq8cN0mQ9T2B+my3yYlMAwKYFhUgLDpASGSQkMkxIYJiUwTEpgmJTA MCmBYVICw6QEhkkJDJMSGCYlMExKYJiUwDApgWFSAmFSAmFSAmG6zMNEDsJ0mYfJL4TJL4TJL4TJ L4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4TJL4Tpfw8ThgjT/x4mWREm WREmWREmWREmWRGm/z3QG4+B3ngM9MZjoDceA3EZgbiMQFxGIC4jEJcRiMsIxGUE4jICcRmBuIxA XEYgLiMQlxGIywjEZQTiMgJxGYG4jEBcRiAuIxCXEYjLCMRlBOIyAnEZgbiMQFxGIC4jEJcRiMsI xGUE4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm 4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4jIm4zLMd9PCfDctzHfTwnw3LUzmI0zmI0zmI0zm I0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zm I0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmI0zmY5rMxzSZj2kyH9NkPqbJfEyT+Zgm8zFN5mOazMc0 mY9pMh/TZD6myXxMk/mYJvMxTeZjmszHNJmPaTIf02Q+psl8TJP5mCbzMU3mY5rMxzSZj2kyH9Nk PibyNU3ka5rI1zSRr2miEM6J3pOcKLpzoujOid6TnOg9yYnek5wDzUag2Qg0G4FmI9BsBJqNQLMR aDYCzUag2Qg0GxPNxkSzMdFsTDQbE83GRLMx0WxMNBsTzcZEs7HQbCw0GwvNxkKzgbjCibjCibjC ibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjCibjC ibjCiQjBiVi/iVi/aXLw0+Tgp8nBT5ODn2Zc4TTfgZtm9uE0sw+n+Q7cNN+Bm+Y7cI8LodcszBMQ 5gkI8wSEeQLCPAFhnoAwT0CYJyDMExDmCZjmCZjmCZjmCZjmCZjmCZjmCZjmCZjmCZjmCZjmCVjm CVjmCVjmCVjmCTA52WlystPkZKfJyU6Tk50mJztNTnaanOw0OdlpcrLT5GSnyclOk5OdJic7TU52 mpzsNDnZaXKy0+Rkp8nJTpOTnSYnO01Odppo6zRp1GnSqAs5ehZy9Czk6FnI0bMQkbAQkbAQkbAQ kbAQkbAQkbAQW7AQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQJbAQ JbAQJbAQJbAQJbAQJbCQ3r+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Qcr+Q cr+Qcr+QBr+Qmr6Qmr6Qmr6Qmr6Qmr6Qmr6Qmr6Qmr6Qmr5QSs8ySellktLLJKWXSUovkwpYJhWw TCpgmVTAMqmAZVIByxTyl6m9L1N7X6b2vkztfZna+zK192Vq78vU3pepvS9Te1+m9r5M7X2Z2vsy tfdlau/L1N6Xqb0vU3tfpva+TO19mXL5MhXuZSrcy1S4l6lwL1PhXqbCvUyFe5kK9zIV7mUq3MtU uJepcC9T4V6mwr1MhXuZovQydeRl6sjL1JGXqSMvU0depo68TB15mTryMnXkZeYtbaQYbKQYbLT7 32j3v5FDcCPFYCPFYKPd/0Zb/I22+Btt8Tfa4m+0j99oH7/RPn6jffxG+/iN9vEbOek22uJvtMXf aB+/0WZ9o836Rpv1jTbrG23WN9qsb+Ru2yj/fiNP3EaeuI3y7zfKv98o/36j/PuN8u83yr/fKP9+ o/z7RPn3ifLvE+XfJ8q/T5R/nyj/PlH+faL8+0T594ny7xPl3yfKv0+Uf58o/z5R/n2i/Ptt7lu3 uW/d5op0myvSbdqTtrlv3ea+dZsr0m1uNbe51dzmVnObW81tLiK3uYjc5iJym4vIbS4it7mI3KbV ZptbzW1uNbe5iNzm7nCbu8Nt7g63uTvc5u5wq7tD09Cyzaz2bbpjtumO2WZW+zaz2reZ1b7NrPZt ZrVvM6t9m1nt28xqTzOrPc2s9jSz2tPMak8zqz3NrPY0s9rTzGpPM6s9zaz2NLPa08xqTzOrPc2s 9jSz2tPMak/k2Erk2Erk2Erk2EqkvybSXxM5thKptolU20SqbSLVNlGuayKtN5E7LJFCnMgdlkhX TqQrJ9KVE+nKidxhidToRGp0Il05kUKcSCFOpBAnylpNpCsncoclUqMTucMSadiJNOxEGnYiDTuR Gp1IV06kKyfSlRMpxIm03kRabyKtN5HWm0jrLaTaFtJfC+mvhfTXQkpqIU20mLppOlXSdKqk6VRJ 06mSpnKapnKaplMlTRk2TRk2TRk2TRk2zZTINDXdND00aQrEaXpo0lSb01Sb01Sb01Sb0/TQpCld pyldp6k2pykQpykQpykQp5nFmKbanKaHJk3pOk0PTZo6eJo6eJo6eJo6eJrSdZpqc5pqc5pqc5oC cZqabpqabpqabpqabpqabpkybJnKaZnKaZnKaZliZ5n6ZJmSYqHIxUKRi4UiFwsJeIUEvEICXiEB r5CAV0jAKyTgFRLwCgl4hQS8QlJcIVGtkKhWSFQrJKoVEtUKiWqFRLVColohUa2QWbOQ7bKQqFZI VCskqhUS1QqJaoVEtUKiWiFRrZCoVkhUKySqFRLVChlDC0lxhYyhhQS8QgJeIQGvkDG0kOxXyBha SCwsJBYWEgsLiYVFxML9SoyhpwrMxqkCs3GqwGycKjAbpwrMxqkCs3Gq2Pd585ZmZv6VmflXppJa ppJappJappJappJappJappJappJappJappJapvhZpl5Zpl5Zpl5Zpl5Zpl5Zpl5Zpl5Zpl5Zpl5Z pju2TENrmXplmXplmXplmXplmXplmXplmXplmXplmXplmXplmXplmXplmb7dMsXPMn27ZSqpZSqp ZSqpZfp2y5Rly/TtlqnxlqnxlqnxlqnxlqjxXmsQsZl3Aq6lidjMOwHXikVs5p2AayEjNvNOwH4l rqNThVZgRFY5VWgFRmSVUwVWYKcKLTqJQHKq0KKTCCSnCn3KRCA5VehTJgLJqUKfMpE69iuROk4V +ryI/HCq2Pky/xUQ78LXbxmxmfmvgHgXvn5Vic3Mry7i9fX6fSc2M4dWvL5evzTFZubQitfX6zev 2MwcWvHGef36FpuZo+Hc66qP9kjRu/fvzXvVvX9v3qvu/Uv/XnXvX/r3qnty93vVve8Hb1U3EcX3 KvTfuplZ8V517xvne9W9bzDvVfe+cb5XoTm8ide9V6E5vInXvVehObyJ171V3cyseK9Cs3Hzzvle hWbj5p3zvQrNxs0753sVmo2bKN97FZqNmzfV9yo0Gzdvqu9VaDZu3lTfq9Bs3Lypvleh2biJ8r1X odm4eb99r0KzcfNW/F6FZuPmXfq9Cs3GTZTvvQrNxk2U772KzMbdNx7eq8hs3H3j4b2KzMbdNx7e q8hs3H3j4b2Kfe9Vbhq/fs0XmymX0F8vBWIzRUH69QrhNXO4wF8vHF4zJ/ni1+uJ2Ey5uP96mRGb mWfTIcl+vRGJzcyz6ZBkv16rvGZO8sWvlzCxmXkCnL3+rzc5sZl5Apy9/q/XQbGZeQIckeDXO6XY zDwBjkjw68VUbGaeAEck+PV2KzYzT4DDuP16RfaaOYrDrxdqsZl5AhzG7ddbudjMPAEO4/br1V5s Zp4Ah3H7dT8gNhNPgPQ2xa9LBrGZeAKktyl+3VSIzcQTcPftyvcqtPO6+XblexXaed18u/K9Cu28 br5d+V6Fdl4N7bwa2XllQ7PR0Gx0NBsdzUZHs9HRbHQ0Gx3NRkez0dFsdDQbHc3GQLMx0GwMNBsD zcZAszHQbAw0GwPNxkCzMdBsBJqNQLMRaDYCzQbihxLxQ4n4oUT80N03it6r0GwgfujuG0XvVWg2 bkacvVeh2bgZcfZehWbjZsTZexWaDcR73X2j6L0KzQbive6+UfRehWYD8V533yh6r0KzgXivu28U vVUh3isR7yW9Dfjrtcxr5rwN+OslTmxmbiCctwF/vQmKzcwNRDM3EM3cQDTzBDTzBHTzBHTzBHTz BHTzBHTzBHTzBHTzBHTzBHTzBHTzBAzzBAzzBAzzBAzzBAzzBAzzBAzzBAzzBAzzBAzzBIR5AsI8 AWGegDBPgMlKpslKpslKpslKSq/R/bou8ZqZrKT0Gt2vOxexmXkCnAzFXxc3YjPzBDgZir9uf8Rm 5gkwmVzpNbpfN0tiM/MEmEyu9Brdr1srsZl5Akwm9/deo/v086eX//zx699PxcvXz3/75YdPX39T /PLdD5++/8dPL7/89PmvL3/54cfv/v7S4vEy5mzV/uO7H78+/qvff/nby5fP//Xz5y8///To+Nu/ wuM/++Uq/+llrdf5+s0/9v4X/fr58T/s5x9fXp+F763bn61iyz7vh27ixncfPX+rQibBu49ov1eh ZTMyCSYyCd59evu9Ci2bkUnw7oPd71Vo2YxMgnef+X6vQrOBTIJ3Hwd/r0KzgUyCdx8Hf1YVMgne fVL8vYrMxt2HyN+ryGzcfYj8vYrMxt3ny9+ryGzcffT8rQrBdHefSn+vQrOBYLpCMF0hmK4QTFcI pisE0xVC1QqhaoVQtUKoWiFUrRCqVgxVM81e0lu2v35XE5uZ9zTTN5Omb0Z6GPfXr4diM3NTYfpm pFd2f/3qKTYzT4Dpm5He//31a63YzDwBpm9Gev/316/MYjPxBJTpm5FeJv7167jYTDwBZfpmpGeO f/2qLzYzT4DJbUkPMP96jRCbmSfA5LbK5LbK5LbK5LbK5LbKBJrKBJrKBJrKBJrKBJrKBJpKBJqy Eb/LqQIXzFMFLpinClwwsxGHx6lCPw3i8DhV6KdBHB6nCizBshGHx6kCS7BTBVYxpwqsYk4Vmg3i 8DhVaDaIw+NUoU+ZeDVOFfqUiVfjVKFPmXg1ThX6lIlX41ShT5l4NU4Vmg3i1ThVaDaIIJuNJMSe KvQ3JOLvqUKzQaTVU4Vmg0ir2Yi0mo1Iq9e3FPErj/fN7vpOIzYzv9mJnOj1xUhsZn4AIid6fbsS m3l7h+u7mNjM2ztc39zEZt7l8vqeJzYzT4DIiV5fFsVm5tCKaOf1jVNsZg6tiHZeX1vFZubQimjn 9d1XbGb+2hbjVq8v0GIz8wSICvz1LVxsZv7PFNmA66u82Mw8AaJoft0HvGaiaH7dHqxmhR5aKPRk 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 71n0Rt6zOFVotUeM/KcKrfaIkf9UodUeMfKfKrT2JUb+U4Vmgxj5TxWaDWLkP1VoNoiR/1Sh2SBG /lOFZoMY+U8Vmg1i5D9VaDaIkf9UodkgRv5ThWaDGPlPFZoNYuQ/VWg2iJH/VKHZIEb+U4Vmgxj5 TxWaDWLkP1VoNhCghpKUO0pS7ihJuaMk5Y6SlDtKUu4oSflUodkgRv5ThWYDYW0NYW0NYW0NYW0N YW0NYW0NYW0NYW0NYW0om7ujbO7eENbWENbWxIcarmuZ10x8qOG6xInNzA2EGBJw3QTFZuYGQgwJ uK6TYjPzBIghAdedVGxmngAxJOC62IrNzBMghgRct2OxmXkCxJCA64rtNRNDAq4LudjMPAFiSMB1 qxebmSdADAm4VgNiM/MEiCEB135BbGaeADEk4FpSiM3MEyCGBFybDrGZeQJMjNZ8/6Kb71908/2L br5/0c33L7r5/kU337+49jliM/MEmExuM5ncZjK5zWRym8nkNpPJbSaT20wmt5lMbjOZXPM5mW4+ J3NtxMRm5glAttCGbKHo9b2OXt/r6PW9jl7f6+j1vY5e3+vo9b2OXt87VWQ20Jt9p4rMRke2UPQ+ YEfvA3b0PmBH7wN29D5gR+8DdvQ+YEfvA3b0PmBH7wN29D5gR+8DdvQ+YEfvA/aObKEd2UI7soV2 ZAvtyBbakS20I1toR7bQjrjCjrjCjrjCjrhC9EBQRw8EdfRAUEcPBHX0QFBHDwR19EBQRw8EdfRA UEcPBHX0QFBHDwR19EBQRw8EdfRAUEcPBHX0QFBHDwR19EBQRw8EdfRAUEcPBHX0QFBHDwR186HR 61omNjM3EKYn0ny1tJuvlnbz1dJuvlrazVdLu/lq6XXLFJuJJ6CbnshueiLNx1m7+ThrNx9n7ebj rN18nLWbj7N283HWbj7O2s3HWbv5OGs3H2ftv/c466efP738549f/34qXr5+/tsvP3z6+pvil+9+ +PT9P356+eWnz399+csPP37395cWs1avXO0/vvvx6+O/+v2Xv718+fxfP3/+8vNPj46//Ss8/rNf rvKfXvqqfP3mH3v/i379/Pgf9vOPL6/PwvfW7c9WsYWF+EM3D7dp9+y/Y/f843Ho7VvjsFq9tsjs f3Iczl/hn8chxp7xzT9GxuGbVWzPI/7Qzd9bppO1m07WbjpZu+lk7SZJ3U2SupskdTdJavO5tW4+ t9bN59a6+dxa/73n1v74t+tY3/jt2vdrnV+wEftP/nY9f4V//u3aXsf59/abf478ev1mFVsOij/1 f3+6/8RPPb/5U99rzXg9k/Ynf+r5r19x5h7jm3/sNz++eb4h/8uP/U/WsV2z+avLRODNd/K6+U5e N9/J6+Y7ed18J6+b7+R18528br6T18138rr5Tl4338nr5jt53Xwnr5vv5HXznbyO3rPv6D37jt6z 7+g9+47es+/oPfuO3rPv6D37jt6z7+g9+47es+/oPfuO3rPv6D37jt6z7+g9+47es+/oPfuO3rPv 6D37jt6z7+g9+47esz9VaDaQDR69Z9/Re/YdvWff0Xv2Hb1n39F79h29Z9/Re/YdvWff0Xv2Hb1n 39F79h29Z9/Re/anCs0Gwng7wng7wng7wngHwngHwngHwngHwngHwngHwngHwngHwngHwngHwngH wngHwngHwngHwngHwngHwngHwngHwngHwngHw3hNC7L5Tnk33ynv5jvl3XynvJvvlHfznfJuvlPe zXfKu/lOeTffKe/mO+XdfKe8m++Ud/Od8m6+U97Nd8q7+U55N98p7+Y75d18p7yb75R3853y60Lu NTMtyOY75d18p7yb75R3853ybr5T3s13yrv5Tnk33ynv5jvl3XynvJvvlHfznfJuvlPezXfKrwWI 2Mw8ASYC300EvpsI/DAR+GEi8MNE4MfvIPB/SHqc4m+QHhGx2vniPf8c6PH4G/wz6LHP//s3OJnz xwBd8+0qtqkSf+bi2R4m3D9MuH+YcP8w4f5hwv3DhPuHCfeP34H7//hst2+d7Qc60tb5J+D1Tx7u 9r8c7lb7m3+KnO1vVrFNo/gz//dn+0/8zOe3fuYRrb32eb7f/cmf+fzXn3l8C5w7fwr9zL9VxTau 4s/c/K1luhaG6VoYKJRhoFCGgUIZBgplGCiUYaBQhoFCGQYKZRgolGGgUIaBQhkGCmUYKJRhoFCG gUIZBgplGCiUYaBQhoFCGQYKZRgolGGgUIaBQhkGCmUYKJRhoFCGgUIZBgplGCiUYaBQhoFCGQYK ZRgolGGgUIaBQhkGCmUYiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHId iHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdiHIdpmt8mI8ED9NaPUxr9TCt 1cO0Vg/TWj1Ma/UwrdXDtFYP01o9TGv1MK3Vw7RWD9NaPUxr9TAfqRqm/XiYj1QN06E7TIfuMB26 43ccun+8eI7+rcVzVrzutuaftGw//gr/vHieLb/5h8je+ZtVbNMg/sjNo21aj4dpPR6m9XiY1uNh Wo+HaT0epvV4mNbjYVqPh2k9Hqb1eJjo+zDR92Gi78NE34eJvg8TfR8m+j5M9H2Y6Psw0fdhou/D RN+Hib4PE30fJvo+TPR9mOj7MNH3YaLvw0Tfh4m+DxN9Hyb6Pkz0fZjo+zDR92Gi78NE3weyvw9k fx/I/j6Q/X0g+/tA9veB7O8D2d8Hsr8PZH8fyP4+kP19IPv7QPb3gezvA9nfA9nfA9nfA9nfA9nf A9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfA9nfAwGTgYDJQMBk IGAyEDAZCJgMBEwGAiYDAZOBgMlAwGQgYDIQMBkImAwETAYCJgMBk4GAyUDAZCBgMhAwGQiYDARM BgImAwGTgYDJQMBkMGDStB4P03o8TOvxMK3Hw7QeD9N6PEzr8TCtx8O0Hg/TejxM6/EwrcfDtB4P 03o8TOvxMK3HYVqPw7Qeh2k9DvP1rTANumEadMM06IZp0A3ToBumQTdMg26YBt0wDbphvr4Vpo01 zNe3wjR7hmn2DNPsGabZM0zYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzY OEzYOEzYOEzYOEzYOEzYOEzYOEzYOEzYOMzngMJkcsNkcsNkcsNkcsNkchPpq4n01UT6aiJ9NZG+ mkhfTaSvJtJXE+mrifTVRPpqIn01kb6aSF9NpK8m0lcT6auJ9NVE+moifTWRvppIX02krybSVxPp q4n01UT6aiJ9NZHmmUjzTKR5JlIvE6mXidTLROplIvUykXqZSL1MpF4mUi8TRZUkiipJFFWSKKok UcxGopiNRDEbiWI2EsVspKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKli pKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKlipKkVpKkVpKkVpLneT3O9 n+Z6P831fprr/TTX+2mu99Nc76e53k8zpCHNkIY0QxrSDGlI09afpq0/TVt/mrb+FG398UoyWE8V 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 xsPkjYfJGw+TNx4mbzxM3niYvPEweeNh8cZRs90PuX9W3d3lPqvu7nKfVXd3uc+qu7vcZ9XdXe6z 6u4u91l1d5f7rLq7539W3d3zX1W3mZNnFZqN28zJswp9yrfpkWcV+snfJjquqttsxrMK/QxvsxnP KvSTv81mPKvQ+brNZjyr0Kd8m824qm6zGc8qNBu32YxnFZqN22zGswrNxm0241mFZuM2m/GsQrNx m814VqHZuM1mPKvQbNxmM55VaDZusxnPKjQbt9mMZxWajdtsxrMKzcZtNuNZhWbjNpvxrEKzcZvN eFah2bjNZjyr0GzcZjOeVWg2brMZzyr2fV66D79fX8Rm0n34/bIjNpPuw+9XI7GZdB9+v0iJzaSN 0Pu1y2tmcR/vlzSxmXkCLFTj/aYnNjNHw4IG3q+LYjPz07R0/vc7p9jMHA1L53+/uIrNzKG1dP73 26/YzDwBls7/foUWm5knwNL53+/hYjPzBFg6//tl3mtm6fzvV3+xmXkCLJ3/fX8gNjNPgKXzvy8h xGbmCbB0/vdNhtjMPAGWzv++DhGbmSfA0vnfdypiM/MEWDr/+2LGa2bp/O9rHLGZeQIsnb/Ovybr 9q71WXV3n3ZV3d61Pqvu7tOeVXf3ac+qu/u0Z9XdXeuz6u6u9Vl1d9f6rLq7a31Wodm4vWu9qm7v Wp9VaDZu71qfVWg2bvvgnlVoNm774J5VaDZu5+s/q9Bs3M7Xf1ah2bidr/+sQrNxO1//WYVm43a+ /rMKzcbtfP1nFZqN2/n6zyo0G7fz9Z9VaDZu5+s/q9Bs3M7Xf1ah2bidr/+sQrNxO1//WYVm43a+ /rMKzcbtfP1nFZqN2/n6zyo0G7fz9Z9VZDb2bVbzWUVmY99mNZ9VZDb2bVbzWUVmY99mNZ9VZDb2 bVbzWYVm4zar+axCvzesfdL7tcxrZu2T3i9xYjPpNv1+5RObSfuk9wui2EzaJ71fJ8Vm5gmw9knv d1KxmXkCrH3S+8VWbGaeAMs38n47FpuZJ8DKqX+/YnvNrJz69wu52Mw8AVZO/futXmxmngArp/59 NSA2M0+AlVP/vl8Qm5knwMqpf19SiM3ME2Dl1L9vOsRm5gmwcurf1yVeMyun/n25IjYzT4CVU/++ oRGbmSfAyql/X/OIzcwTYOXUv++KxGbiCdgWL/++cBKbiSdgW7z8+9ZKbCaegG3x8u+rL6+Zxcu/ L8rEZmi3ejtf/1mFdqu3HdLPKrRbvZ2v/6xCu9Xbbuyr6na+/rMK7d1ve7ifVWg2bnu4n1VoNm57 uJ9VaDZue7ifVWg2bnu4n1VoNm57uJ9VaDZue7ifVWg2bnu4n1VoNm57uJ9VaDZue7ifVWg2bnu4 n1VoNm57uJ9VaDZue7ifVWg2EFe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4 EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4EVe4Lb/y+7VMbGZuICzz 8/vdTmxmbiAsW/b7BdFrZmW5v18nxWbmCbA83u93UrGZeQIsj/f7xVZsZp4Ay+P9fjsWm5knwPJ4 v1+xxWbmCbA83u/3dLGZeQIsj/f7Zd9rZnm831cDYjPzBFge7/f9gtjMPAGWx/t9SSE2M0+AyeRu k8ndJpO7TSZ3m0zuNpncbTK522Ryt8nkbpPJ3SaTu00md5tM7jaZ3G0yudtkcrfJ5G6Tyd0mk7tN JnebTO42mdxtMrnbZHK3yeRuk8ndJpO7kS93I1/uRr7cjXy5G/lyN/LlbuTL3ciXu5EvdyNf7ka+ 3I18uRv5cjfy5W7ky93Il7uRL3cjX+5GvtyNfLkb+XI38uVu5MvdyJebyJebyJebyJebyJebyJeb yJebyPWayL+aiL9LxN8l4u8S8XeJ+LtE/F0i/i4Rf5eIv0vG7Jh+o236jbbpN9qm32ibfqNt+o22 6Tfapt9om36jbfqNtuk32qbfaJt+o236jbbpN9qm32ibfqNt+o226Tfapt9om36jbfqNtuk32qbf KE2/UZp+ozT9Rmn6jdL0G6XpN0rTiJOmdyZNditNditNditNditNditNditNditNditNdislomA/ 3hh+vUtlvlXdvL2+Vd28vb5V3by9vlXdvL2+Vd28vb5V3by9vlXdvFE+q+5uld+qbm423qrQbNzd Kr9Vodm4u1V+q0KzcXer/FaFZuPuVvlZdXer/FaFZuPuVvmtCs3G3a3yWxWajbtb5bcqNBt3t8pv VWQ22t2t8lsVmY12d6v8VkVmo93dKr9Vkdlod9Me36rIbLS7aY9vVWg27qY9vlWh2bi7LX+rQrNx d1v+VoVm4+62/K0KzcbdbflbFZqNu9vytyo0G3fd6m9VaDbuutXfqtBs3HWrv1Wh2bjrVn+rQrNx 163+VoVm465b/a0KzcZdt/pbFbunOBuIj2uZ2MzZQHxc4sRmzgbi48onNnM2EB8XRK+ZpKp9XCfF ZuYJkFS1jzup2Mw8AZKq9nGxFZuZJ0BS1T5ux2Iz8wRIqtrHFVtsZp4ASVX7uKeLzcwTIKlqH5d9 rVmTVLWP1YDYTDwBTVLVPvYLYjPxBDQpxe9jSSE2E09Ak8TDj02H2Mw8AZIS+bEuEZuZJ0BSIj92 LmIz8wRISuTH4sZrJimRH2sesZl5AqQUiY9dkdjMPAFSisTHwklsZp4AKUXiY2slNjNPgJQi8bH6 EpuZJ0BKkXhrhnard9Me36rQbvVubuNbFdqS3s1tfKtCW9K7uY1vVWiDfje38a0Kfcp3cxvfqtAG /W5u41sVmo27uY1vVWg27uY2vlWh2bib2/hWhWbjbm7jWxWajbu5jW9VaDbu5ja+VaHZuJvb+FaF ZuNubuNbFZqNu7mNb1VoNu7mNr5VodlAhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBD hGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBDhGBjhKCUx/dxwRKb mbsEKULv45YmNjOv/1KE3sdVT2xmXv+lCL2P+6LYTB1acwEmReh93EXFZuYJkCL0Pi60YjPzBEgR eh+3YrGZeQKkCL2Pq7XYzDwBUoTex/1cbGaeAClC7+OSLzYzT4AUofexKfCaSRF6H3sFsZl5Akwg tplAbDOB2GYCsc0EYpsJxDYTiG0mENtMILaZQGwzgdhmArHNBGKbCcQ2E4htJhDbTCC2mUBsM4HY ZgKxzQRimwnENhOIbSYQ20wgtplAbDOB2I5MRR2ZijoyFXVkKuoIiugIiugIiuh34/SeVQil6Ail 6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail 6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail 6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Ail6Cbw3k3gvZvA ezeB925iGt3ENLqJaXQz5LCbzEc3mY9uMh/dZD66yXx0k/noJvPRTeajm8xHN5mPbjIf3WQ+usl8 dJP56Cbz0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qObzEc3mY9uMh/dZD66yXx0k/noJvPR Teajm8xHN5mPbjIf3WQ+usl8dJP56Cbz0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qObzEc3 mY9uMh/dZD66yXx0k/noJvPRTeajIytSR1akjqxIHVmRBgorHyisfKCw8oHCygcKKx8orHygsPKB wsoHCisfKKx8oLDygcLKBworHyisfKCw8oHCygcKKx8orHygsPKBwsoHCisfKKx8oLDygcLKBwor HyisfKCw8oHCygcKKx8orHygsPKBwsoH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH 4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goH4goHIgQHIwRNer6b9Hw36flu 0vPDjJMeZpz0MOOkhxknPcw46WHGSQ8zTnqYcdLDjJMeZpz0MOOkhxknPcw46WHGSQ8zTnqYcdLD jJMeZpz0MOOkhxknPcw46WHGSQ8zTnqYcdLDjJMeZpz0MOOkhxknPcw46WHGSQ8zTnqYcdLDpGuH SdcOk64dJl07TLp2mHTtMOnaYdK1w6Rrh0nXDpOuHSZdO0y6dph07TDp2mHStcOka4dJ1w6Trh0m XTtMunaYdO0w6dph0rXDpGuHCcQOE4gdyFQ0kD1oIORgIOQgEDwQCB4IBA8EggcCwQOB4IFA8EAg eCAQPBAIHggEDwSCBwLBA4EwgEAYQCAMIBAGEAgDCIQBBMIAAmEAgTCAQBhAIAwgEAYQSJoPJM0H EtkDieyBRPZAInsgkT2QyB5IZA8ksgcS2QOJ7IFE9kAieyCRPZDIHkhkDySyBxLZA4nswUR2E/4d Jq87TC13mFpumPJrmPJrmPJrmPJrmPJrmPJrmPJrmPJrmPJrmPJrmPJrmPJrmPJrmIppmIppmIpp mIppmIppmIppmIppmIppmIppmIppmIppmIppmLpkmLpkmFJimFJimFJimFJimFJimFJimFJimFJi mFJimFJimFJimFJimFJimFJimFJimFJimFJimFJimFLiRvvfjfa/G21yN9qubrRd3Wi7upEZaaON 50Ybz43MSBvtSTfak260J91oT7rRnnSjPelGe9KN9qQb7Uk32pNutCfdaE+60Z50oz3pRnvSjfak G+1JN9qTbrQn3ciMtJEZaSMz0kZmpI3MSBuZkTYyI20Ucr6RhWkjC9M210TbXBNtc7Ozzf3JNvcn +9/vTx7/11+r/vLDj9/9/eUfn/72/Xcv/+3l9XR5+396ffnPH7++/Nv26z+++/Hr11/+x88ff/xU /s6f/j+ef5f/+5cvf39W/MeXH1/+r5fPX35+/K/6l//SP1U9/swf/qH/8fXHv/zw+R8v/8/3P//3 f/oT3/345edT+dPjL/abv87zb/PfP/3Pzy/f/fD509fPf/3tn2Ff9sSPULwXbHOds03MfJu7oW3u hra5G9rmbmibu6Ft7oa2uRva5m5om7uh/Tu7oU8/f3r8rvr74/fO189/++WHT19/U3x+6Xz6/h8/ vfzy0/nF8/wF2vb5R3PtR/bX4zfr+a9+/+VvL18+/9fzl9jjt99v/gqP/+yXq/ynl7bWa45v/rn3 v+nXz4//ZT//+PJW+d67/dkqdhUQf+rm6Tb3Xtvce21z77XNvdc2917b3Httde9lIvTbROi3idBv E6HfJkK/TYR+mwj9NgOqt8njb43HjxZ5/7GZq+r23f6qun23v6pu3+2vqtt3+6vq9t3+qrp9hbiq bt/tr6rbd/ur6vbd/lF1/7GZqwrNxn1fyFWFZuO+m+SqQrNxPyzzqkKzcd+5clWR2aj7fperisxG 3fe7XFVkNuq+3+WqIrNR9/0uVxWZjbrvd7mq0Gzc97tcVWg27vtdrio0G/dV0qsKzcZ9l8xVhWbj vkvmqkKzcV/HvarQbNzXca8qNBv3XTJXFZqN+yvLqwrNxn19+qpCs3Ffn76q0Gzc16evKjQb9/Xp qwrNxn19+qpCs3Ffn76q0Gzc16evKjQb9/Xpq4rdU6wNxNu1TGxmbSDeLnFiM2sD8XblE5tZG4i3 C6LYzNpAvF0nvWba4xBvl0+xmXkCtMch3m6wYjPzBGiRpm/XYLGZeQK0SNO3u7TYTDwBpXnq3i7k YjPxBJTmqXu71YvNxBNQmqfubTXgNdM8dW+LBLGZeQK0SNO3bYTYzDwBmkHvbaUhNjNPgGbQe9uL iM3ME6AZ9N6WK2Iz8wRoBr23DY3YzDwBGmv2tubxmmms2dtSSGxmngCNNXvbLInNzBOgsWZv6ymx mXkCNNbsbcclNjNPgMZjvS3KxGZot3rf33FVod3qfX/HVYV2q/f9HY+q+/6OqwrtVu/7O64qtHe/ 7++4qtBs3Pd3XFVoNu77O64qNBsLzcZCs7HQbCw0GwvNxkKzsdBsLDQbC83GQrOx0WxsNBsbzcZG s7HRbGw0GxvNxkazsdFsbDQbiCssxBUW4goLcYWFuMJCXGEhrrAQV1iIKyzEFRbiCgtxhYW4wkJc YSGusBBXWIgrLMQVFuIKi3CF85VwhacKzMapArNxqsBsnCowG6cKzMapArNxqtg9xdxAaH6Yt9ua 2MzcQGh+mLcrn9dM88O8XRDFZuYGQvPDvN0yxWbmCdD8MG9XVbGZeQJMP8zjvis2M0/AMk/AMk/A Mk/AMk/AMk/AMk/AMk/AMk/ANk/ANk/ANk/ANk/ANk/ANk/ANk/ANk/ANk/ANk+AyeSWyeSWyeSW yeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyeSWyOReeyixmXcC rq2V2Mw7AdeOS2zmnYBrIyY2807A6sQ3eKrAXvBUgb3g6sSVd6rARvZUgY3sqQIb2VOFfvLElXeq 2E8ebGRPFdjWnyqwrV+d+OtOFfqUib/uVKFPmfBBpwp9yoQPOlXoUyZ80OqEDzpVaDYIH3Sq0GwQ PuhUodkgfNCpQrNB+KBThWaD8EGnCs0G4YNOFZoNQvqcKvQpE9LnVKFPmZA+qxP65vpuI35R8r4P Xt+EvGYiuH59bxKbeVeF61uW2MwcDRFcv76qic3Mq4IIrl/f97xmImt+fTsUm5lDK7IO11dMsZk5 tCLrcH1PFZuZQyuyDteXXbGZeQJE1uH6xiw2+/cn4PejlZ/F34hWXm1VrUekxx8nK7/9DR7/1fdk 5R6vbc9v/rn3v+hHRnI7R+6qfe/e/2QdvDyIP3bzeIsgx3UD8ZqJIMd1XxGbmcdbBDmuS4/YzBxa kb24bk5iM3No/z3h8P0/Pv2P999453fj18+f/9fS/fL99QTG+X343uPtt+DLVfzpy1+fT2A8C/9E x9Q7lt0xX/WOTe/Y9Y5D7xh6x6l3XHrHu2fm/pFOtMRPtMRPtMRPEq13qsg3mUSr/0Sr/0Sr/0Sr /0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/0Sr/yTW 4FOFZgMJBokEgzxfe//oX8Qc9neVHPZ3lRz2d5Ucd7+rsO8B2j0hzVVwmqvgFDNMru8YYjPx2p3m XjnNvXKae+U098pp7pXT3CunuVdOc6+c5l45zb1ymnvlNPfKKXrori9vYjPzBJir1zRXr2muXtNc vaa5ek1z9Zqih+76Lio2M0+AucfNf7/H/cNvfMveROa2N5G57U1kbv3b/da/3W/92/22N5G57U1k 6tv71Lf3qW/vU9/ep769T317n/r2PvXtferb+9S393l7e//HHfUzk/qZKf3MlD7hpU946RNe///f +aDHsxZ6PGuhx7MWejxrocezFno8a6HHsxZ6PGuhx7MWejxrocezFno8a6HHsxZ6PGuhx7MWejxr ofDfhcJ/Fwr/XSj8d6Hw34XCfxcK/10o/Heh8N+Fwn8XCv9dKPx3ofDfhcJ/Fwr/XSj8d6Hw34XC fxcK/10o/Heh8N+Fwn8XCv9dKPx3ofDfhcJ/V5Hw34XCfxcK/10o/Heh8N+Fwn8XCv9dKPx3ofDf hcJ/Fwr/XSj8d6Hw34XCfxcK/10o/Heh8N+Fwn8XCv9dKPx3ofDfhcJ/l/nYzTIfu1nmYzfLfOxm mY/dLPOxm2U+drPMx26W+djNMh+7WeZjN8t87GaZj90s87GbZT52s8zHbpYZtrzMsOVlhi0vM2x5 mWHLywxbXmbY8jLDlpcZtrzMsOVlhi0vM2x5mWHLywxbXmbY8jLDlpcZtrzMsOVlhi0vM2x5mWHL ywxbXmbY8jLDlpcZtrzMsOVriyI2M0+AGLa8zLDlZYYtLzNseZlhy8sMW15m2PIyw5aXGba8zLDl ZYYtLzNseZlhy8sMW15m2PIyw5aXGba8zLDlZYYtLzNseaHHsxZ6PGuhx7MWejxrocezFno8a6HH sxZ6PGujx7M2egZro2ewNnoGa6NnsDZ6Bmu/NvQzbGA/farQT76hn3xDP/kGZv5UgZk/VWjmO/q8 Ovq8Ovq8Ovq8SDD0qUInpaNPmdBt+5VwaqcKfV6EUztV6PMinNqpQp8X4dROFfqUCad2qtBZJpza 4/+gKjQbhFM7/wd9yoQ4O/8HfcqEODv/B33KhDg7VehTJsTZqUKfMiHOThX7BmveTcVnUJb5DMoy n0FZ5jMoy3wGZZnPoCzzGZRtPoOyzZdLtvlyyTZfLtnmyyXbfLnkutuIzbxNw3UTEpuZo9HM0Wje b43rliU2M39rdHPOujln3Zyzbs6ZGJZ/XQPFZubQikjedZcUm5lzJlJ014VUbGbOmUjRXbdasZk5 tCJFd12NvWYiRXddpMVm5gkQKbrrNi42M4dWBN+uK73YzBxaEXy79gJiM3NoRfDtWi6IzcQTEK9k dRSvZHUUSJwJJM4EEmcCiTOBxJloZK0YjawVAwlBgYSgQEJQICEokBAUSAgKJAQFEoICCUFBXgg9 VWg2kHwUJBxhBxKdAolOgUSnQKJTINEpkOgUSHQKJDoFEp0CiU6BRKdAolMg0SmQ6BQkHOFUodlA UlUgqSqQVBVIqgokVQWSqgJJVYGkqkBSVRCp6lSh2SDhCKcKzQYJR9hBwhFOFZoNEo5wqtBskHCE U4Vmg4QjnCo0GyQc4VSh2SDhCKcKzcareM9/XMu8ZqbcFKbcFKbcFKbcFKbc9Lggis3ETVeYQliY QliYQliYQliYQliYQliYQliYQliYQliIr0Zfl2axmXkCxKCL6+YtNjNPgCnRhSnRhSnRhSnRhSnR hSnRhSnRhSnRhSnRhSnRhSnRhSnRhRh0ca00xGbmCTD1vjD1vjD1vjD1vjD1vjD1vjD1vjD1vlD1 PjHo4lrziM3MEyAGXVy7IrGZeQLEoItr4SQ2M0+AGHRxba3EZuYJEIMurtWX10wMurgWZWIztFsl 4aKnCu1WSbjoqUK7VRIueqrQbpWEi+4g4aKnCu1WSbjoqUKzQcJFTxWaDRIueqrQbJBw0VOFZoOE i54qNBskHOFUodkg4QinCs0GCUc4VWg2SDjCqSKzMVE4wnwlszFRpMJEkQoTRSpMFKkwUaTCfCWz MRFXOBFXOBFXOBFXOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEhOBEh OBEhOBHrNxHrNxHrNxHrNxHrNxnrJ4b/XVclsZm5FRDD/677ltjM3AqI4X/Xpc1rJob/XVc8sZl5 AsTwv+ueKDYzT4AY/nddNsVm5gkQw/+uG6vYzDwBYsTIde0Vm5knQIwYue7OYjPzBIgRI9cFXGs2 zYiRx3VdbCaegGnmlUwzr2SaeSXTzCt5LA7EZuIJmCYnO01Odpqc7DTR1mmirdNEW6eJtk4TbZ0m 2jpNtHWaaOs00dZpoq3TRFunibZOE22dJto6TbR1mmjrNGnUadKo06RRp0mjTpNGnSaNupAvciFf 5EK+yIV8kQv5IhfyRS7ki1zIF7mQL3Ihr+JCXsWFvIoLeRUXch0u5DpcyHW4kOtwIdfhQq7DhVyH C7kOF3IdLuQ6XMh1uJDrcJng9jLB7WWC28sEt5cJbi8T3F4muL1McHuZ4PYy8ehl4tHLxKOXiUcv k2heJtG8TKJ5mUTzMonmZRLNyySal0k0L5NoXibRvEyieZlE80LQ3ULQ3ULQ3ULQ3UbQ3UbQ3UbQ 3UbQ3UbQ3UbQ3UbQ3UbQ3UbQ3UbQ3UbQ3UbQ3UZhfhuhehuhehuhehtBdxtBdxtBdxtBdxtBdxtB dxtBdxtBdxtBdxtBdxtBdxtBdxvF8m2E6m2E6m2E6m2E6m2E6m2E6m0Uy7dRLN9GsXwbxfJtFMu3 USzfRrF8G62fN1o/b7R+3mj9vNH6eaP180br543WzxutnzeK5dsolm+jVfdGq+6NVt0brbo3iuXb bEFuIljLRLCWiWAtE8HaJoK1TQRrmwjWNhGsbSJY20SwtolgbRPB2iaCtU0Ea5sI1jYRrG1GFW6T 59omz7VNnmubCNY2EaxtIljbRLC2iWBtE8HaJoK1TQRrmwjWNhGsbSJY20SwtpkuuE2ea5s81zZ5 rm3yXNvkubbJc20zXXCb6YLbTBfcZrrgNtMFt5kuuM10wW1CKtuEVLYJqWwTUtkmpLJNSGWbkMo2 IZVtQirbTBfcZrrgNvGZbeIz28RntonPbDNdcIssTr4SMTpfiRidr0SMPlVgbXiqwNrwVIG1Yb4S MTpfiRidr0SMzlciRucrEaNP1ZmNTz9/evnPH7/+/fz/evn6+W+//PDp678OcWW9fPfDp+//8dPL Lz99/uvLX3748bu/v7SeI+b17+J3P359tP/+y99evnz+r58/f/n5p0fH33T5j8f4f7nKf3pp7Zt/ 5v20fP38+Ov//OPL67Pqve+frmLnSzys3m/LNF+Hvw6p2Mz7bXkdaa+ZuOq7fgGIzbzvC9evC7GZ eQLEVV++EtkxX4nsmK9EdsxXIjvmK5Ed85XIjvlKZMd8JbLjqULfH4jseKrQbBDZMV+JL+dUodkg vpxThWaD+HJOFZoN4ss5VWg2iC/nVKHZIL6cU4Vmg6QZ5yvJaD1V6KdBMlpPFfppkIzWU4VmnqSt pvlKe5qvtKf5Snuar7Sn+Up7mq+0p/lKe5qvtF//7orNzJuCuFe5/vH2mokep+uferGZeQJEj9P1 fUFsZp4A0eN0fekQm5knQPQ4Xd9cxGbmCRATSq+vP2Iz8wMQ4wGv71Bis3/7ATz+r79WPbeC//j0 t++/e/lvL6+PbeLz/+n12tj92/bjWh/+8j9+/vjjp/J3/vT/8fy7/N+/fPn7s+I/vvz48n+9fP7y 8+N/1b/8l/6p6vFn/vAP/Y+vP/7lh8//ePl/vv/5v//Tn/juxy/P3eP5i/3mr/P82/z3T//z88t3 P3z+9PXzX3/7Z9hXU/EjFH+9TnQBnugCPNEFeKIL8EQX4IkuwBNdSie6lE50KZ3oUjrRpXSSZ29O FVkiTPLszalCnxd59iYnefbmVKHPizx7c6rQ+SLP3pwqNBvkAZtThT5ltByZaGEx0b8lE605Jlpz TOJvP1XkZ7iI5/xUkZOyiOf8VJHPayGZfyGZfyGZfyGZfyGZfyGZfyGZfyGZfyGZfyGZfyGZfxHP +alCs0Gc6qcKzQZxquciTvVThWaDONVPFfsGK94hp7nGmuYaa5prrGmusaa5xprmsmiay6JpLoum uSya5rJoio/GXLcVsZm4lJziozHXlcdrJj4ac12QxGbmnImPxly3LLGZeQLEd16uq5rYzBxa8TWV 674nNjNHQ10pilb+6y6pNVuiYf66eYrNxDlbomH+ur6KzcQ5W79D0f4RBP0o/hYEPaJfbpI/B0Ff f4V/hqD3N//IfQb631Sxq734Axd/TS8TDl4mHLxMOHiZcPAy4eBlwsHLhIOX+K7LtcAQm5knQAwV uLYgYjPzBIihAtcqxWuGoGb0bMCpQhsxBDWjxwYSPTaQ6LGBRI8NJHpsINFjA4keG0j02ECixwYS PTaQ6LGBU4VmA+nHa6PZ2Gg2kFa9kFa9kFa9kFa9kFa9kFa9kOq8kOq8kBK8kBK8kBK8ECa/ECa/ kOq8kOq8kOq8kOqM8tET5aMnykdPlI+eKB89UdL5qSKfF0o6T5R0nijpPFHSeaKk80RJ54mSzhMl nSdKOk+UdJ4o6fxUodlAqjPKR0+Uj57mezFpvhdz3TTEZuYd1VS0zcdn0nx8Js3HZ9J8fCbNx2fS fHwmzcdn0nx8Js3HZ9J8fOa6lInNzBOwzROwzRNgUgDLpACWSQEskwJYJgWwTApgmcL9MoX7Zcrj y5THlymPL9PntEyf0zKF+2UK98sU7pcp3Jux+WnG5qcZm59mbH6asflpJt1fGwCxmThnZtJ9mkn3 aSbdp5l0n2bSfZpJ92km3aeZdJ9m0n2aSffXVkRsZp4AU+E2Y/MTveiT6EWfRC/6JHrRJ9GLPole 9En0ok+iF31yIxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6IxV6 IxV6IxV6IxV6IxV6IxV6I8f0Rtr1Rtr1Ro7pjRzTO9FsIHV9I3V9I3V9I3V9I3V9I3V9I3V9I3V9 I3V9I0/3Rpr8Rpr8Rpp8Ik0+kSafyD+eSMlPpOQnUvITKfmJlPxESn4iJT+Rkp9IyU+k5CdS8hMp +cmUfDO+0XwWI81nMdJ8FiPNZzHSfBYjzWcxUn0WY5uUwDYpgW1SAtukBLZJCWyTEtgmJbBNSmCb lMA2KYFtUgLbpAS2SQlskxLYJiWwTUpgm5TANimBbVIC26QEtkkJbDMrYJvIwTaRg21mBWwzK+Cx jRCbmSfAJCu2SVZsk6zYJlmxTbJim2TFNsmKbZIV24xE2CamsU1MY5uYRpqYRpqYRpphDWkyH2ky H2kyH2kyH2kyH2kyH2kyH2kyH2kyH2kyH2kyH2kyH2kyH4mcMImcMImcMImcMInyFxPlLybKX0yU v5gd7VY72rt3NBsdzUZHs9HRbAw0GwPNxkCzMdBsDDQbA83GQLMx0GwMNBsDzUag2Qg0G4FmI9Bs BJqNQLMRaDYCzQZ6sjPRk52JnuxM9GRnIq4wEVeYiCtMxBUm4goTcYWJuMJEXGEirjARV5iIK0zE FSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxhIq4wEVeYiCtMxBWmydynydynydyn ydynmSqXZqpcmqlyaabKPe6NYjNzA9HNE9DNE9DNE9DNEzDMEzDMEzDMEzDMEzDMEzDMEzDMEzDM EzDMEzDMExDmCQjzBIR5AsI8AWGegDBPQJgnIMwTYD6pnuaT6mk+qZ7mk+ppMrlpMrlpMrlpMrlp MrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlpMrlp MrlpMrlpMrlpMrlpMrmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJfLmJ fLmJfLmJfLmJfLmJfLmJfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmFfLmF fLmFfLmFfLmFuMJCXGEhrrAQV1iIKyzEFRbiCgtxhYW4wkJcYSGusBBXWIgrLMQVFuIKC3GFhbjC QlxhIa6wEFdYiCssxBUW4goLcYWFuMJCXGEhrrAYV2h6ItP0RKbpiUzTE5mmJzJNT2Sansg0PZFp eiLT9ESm6YlM0xOZpicyTU9kmp7IND2RaXoi0/REpumJTNMTWaYnskxPZJmeyDI9kWV6Isv0RJbp iSzTE1mmJ7JMT2SZnsgyPZFleiLL9ESW6Yks0xNZJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNb JpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNb yJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdbyJdb yGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbyGFbiBAsRAgWIgQL EYKFCMFChGAhQrAQIViIECxECBYiBAsRgoUIwUKEYCFCsBAhWIgQLEQIFiIEixCC9UoIwVMFZuNU gdk4VWA2ThWYjVMFZuNUgdk4VezGYe4STHdjme7GMt2NZboby3Q3luluLNPdWKa7sUx3Y5nuxjLd jWW6G8t0N5bpbizT3Vimu7FMd2OZ7sYyDYllGhLLNCSWaUgs05BYpiGxTENimYbEMg2JZRoSyzQk lmlILNOQWKYhsUxDYpmGxDKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB2DKB 2DKB2DKB2DKB2DKB2DKB2BKB2Gt1JDbzTsC1aBKbeSfgWkuJzbwTcC2xxGbeCTjNwDr0VKF1KDHF niq0DiWm2FOF1qHEFHuq0DqUmGJPFViHnio0G8QUW6/EFHuq0GwQU+ypQrNBTLGnCs0GMcWeKjQb xBR7qtBsEFPsqUKzQUyxpwrNBjHFnio0G8QUe6rQbBBT7KlCs0FMsacKzQYxxZ4qNBsE6jtVaDYI 1Heq0GwQqO9UodkgUN+pQrNBoL5ThWaDQH2nCs0GgfpOFZoNAvWdKjQbBOo7VWg2CNR3qtBsEBTw VKHZICjgqUKzQVDAU4Vmg6CAp4phG94G4rqWec1EQ+J1iRObmRsI0ZB43QTFZuYGQjQkXtdJsZl5 AkRD4nUnFZuZJ0A0JF4XW7GZeQJEQ+J1OxabmSdANCReV2yvmWhIvC7kYjPzBIiGxOtWLzYzT4Bo SLxWA2Iz8wSIhsRrvyA2M0+AaEi8lhRiM/MEiBjttekQm5knQMRor3WJ10zEaK/litjMPAEiRntt aMRm5gkQMdprzSM2M0+AiNFeuyKxmXkCRIz2WjiJzcwTIDK519ZKbGaeAJHJvVZfXjORyb0WZWIz tFslVtpThXarxEp7qtBulVhpTxXarRIrbb0SK+2pQrtVYqU9VWg2iJX2VKHZIFbaU4Vmg1hpTxWa DWKlPVVoNoiV9lSh2SBW2lOFZoNYaU8Vmg1ipT1VZDYastI2ZKVtyErbkJW2ISttQ1bahqy0jVhp TxWZjYa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4woa4 woa4woa4woa4woa4woa4woa4woa4woa4wsa4QtETeV3LxGbmBkL0RF53O7GZuYEQPZHXBdFrJnoi r+uk2Mw8AaIn8rqTis3MEyB6Iq+LrdjMPAGiJ/K6HYvNzBMgeiKvK7bYzDwBoifyuqeLzcwTIHoi r8u+1qyZnshmeiKb6YlspieymZ7IZnoim+mJbKYnsplMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZ TG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT20wmt5lMbjOZ3GYy uc1kchvy5Tbky23Il9uQL7chX25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DflyG/Ll NuTLbciX25AvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uQL7chX25DvtyGfLkN+XIb8uU25MttyJfb kC+3Ia6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6w Ia6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wIa6wMa7Q9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30 RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZ TE9kMz2RzfRENtMT2UxPZDM9kc30RDbTE9lMT2QzPZHNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5 zWRym8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2 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 Y6LZIAkapwrNBknQOFVoNkiCxqlCs4HI1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I 1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1o3I1i2GVV7XMrGZuYEQ wyqvu53YzNxAiGGV1wVRbGZuIMSwyuuWKTYzT4AYVnldVcVm5gkQwyqv+67YzDwBYlzNdWn2molx NdcVW2xmngAxrua6p4vNzBMgxtVcl32xmXkCxLiaa2MgNjNPgJh9c60dxGbmCRCzb67dhdjMPAEm Fb5NKnybVPg2qfBtUuFbDNK5di5iM/MEmPz0NvnpbfLT2+Snt8lPb5Of3iY/vU1+epv89Db56W3y 09vkp7fJT2+Tn94mP71Nfnqb/PQ2+elEzrpEzrpEzrpEzrpEXEYiLiMRl5GIy0jEZSTiMhJxGYm4 jERcRiIuIxGXkYjLSERYJCIsEhEWiQiLRIRFIsIiEWGRiLBIRFgkIiwSERaJCItEhEUiwiIRYZGI sEhEWCQiLBIRFokIi0SERSLCIhFhkYiwSERYJCIsEhEWiQiLRIRFIsIiEWGRiLBIRFgkIiwSERaJ CItEhEUiwiIRYZGIsEhEWCQiLBIRFokIi0SERSLCIhFhkSY9nyY9nyY9nyY9nya9kSa9kSa9kSa9 kSa9kSa9kSa9kSa9kSa9kSa9kSa9kSa9kSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZw kSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZw kSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkSZwkchUlMhU lMhUlMhUlCguP1FcfqK4/ERx+Yni8hPF5SeKy08Ul58oLj9RXH6iuPxEcfmJ4vITxeUnistPFJdf KC6/UFx+obj8QnH5heLyC8XlF4rLLxSXXyguv1BcfqG4/EJx+YXi8gvF5ReKyy8Ul18I6isE9RWC +gpBfYWgvkJQXyGorxDUVwjqKwT1FYL6CkF9haC+QlBfIaivENRXKGypEApYCAUshAIWQgELoYCF UMBCKGAhFLAQClgIBSyGAprAe5rAe5rAe6rAuxkYnmZgeJqB4WkGhufvBIaj66TXzAyhTjOEOs0Q 6jRDqNMMoU4zhDrNEOo0Q6jTDKFOM4S6zBDqMkOoywyhLjOEuswQ6jJDqMsMoS4zhLrMEOoyQ6jL DKEuM4S6zBDqMkOoywyhLjOEukyMtkyMtkyMtkyMtkyMtkyMtkyMtkyMtkyMtkyMtkyMtkyMtkyM tkyMtkyMtkyMtswQtDKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3DKZ3EJW2kJW2kJW2kJW 2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW 2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJW2kJcYSGusBBXWIgrLMQVFuIK C3GFhbjCQlxhIa6wEFdYiCssxBUW4goLcYWFuMJCXGEhrrAQV1iEKxyvhCs8VWA2ThWYjVMFZuNU gdk4VWA2ThWYjVPF7inmBsL0RJbpiSzTE1mmJ7JMT2SZnsgyPZFleiLL9ESW6Yks0xNZpieyTE9k mZ7IMj2RZXoiy/RElumJLNMTWaYnskxPZJmeyDI9kWV6Isv0RJbpiSzTE1mmJ7JMT2SZnsgyPZFl eiLL9ESW6Yks0xNZJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNbJpNb JpNbJpNbJpNbJpNbIpN77aHEZt4JuLZWYjPvBFw7LrGZdwKujZjYzDsB45X4mk4V2ncSX9OpQvtO wmWcKrTvJFzGqQL7zlMFduGnCu3CCZdxqtBsEC7jVKHZIFzGqUKzQbiMU4Vmg3AZpwrNBuEyThWa DcJlnCo0G4TLOFVoNgiXcarQbBAu41Sh2SBcxqlCs0G4jFOFZoNwGacKzQbhMk4Vmg3CZZwqNBuE yzhVaDYIl3Gq0GwQLuNUodkgXMapQrNBuIxThWaDcBmnCs0G4TJOFZoNwmWcKjQbhMs4VWg2CJdx qshsNMRlNMRlNMRlNMZliMz9dS0Tm5n3fJG5v+52YjPzni8yH9cFUWzmbbqu66TXTGQ+rsun2Mw8 ASLzcd1gxWbmCRCZj+saLDYzT4DIfFx3abGZeQJE5uO6kIvNzBMgMh/XrV5sZp4Akfm4VgNeM5H5 uBYJYjPzBIjMx7WNEJuZJ0BkPq6VhtjMPAEi83HtRcRm5gkQmY9ruSI2M0+AyHxcGxqxmXkCRObj WvN4zUTm41oKic3MEyAyH9dmSWxmngCR+bjWU2Iz8wSYzEczmY9mMh/NZD6ayXw05GtqyNfUkK+p EV/TqSK71Uby0kcjeemnCu1WSV76qSK71Uby0k8Vmg2Sl36q0GyQvPRThWaD5KWfKjQbJC/9VKHZ IHnppwrNBslLP1VoNkhe+qlCs0Hy0k8Vmg2Sl36q0GyQvPRThWaD5KWfKjQbJC/9VKHZQFxhQ1xh Q1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xh Q1xhQ1xhQ1xhQ1xhQ1xhQ1xhQ1xhM5n7ZjL3zWTum8ncNzEH+7ryec3EHOzrgig2MzcQYg72dcsU m5knQMzBvq6qYjPzBIg52Nd9V2xmngAxB/u6NIvNzBMg5mBfN2+xmXkCxBzs6/ruNRNzsK/LvtjM PAFiDva1MRCbmSdAzMG+1g5iM/MEiDnY1+5CbGaeAJPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaT yW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT25Gv qSNfU0e+po58TR1xGR1xGR1xGR1xGf3/pe3vliS5kjRb7Jr9FCHCG1KEcyTM9p/qxXkJCl8gC5VV AxYKeSQB9Gny6bnN/CfRSA9g25rFFpmRHoyrRqS7qoftT9enG3EZO+IydsRl7IjL2BGXsSMuY0dc xo64jB1xGTviMnbEZeyIy9gRl7EjLmNHXMaOuIwdcRk74jJ2xGXsiMvYEZexIy5jR1zGjriMHXEZ O+IydsRl7IjL2BGXsSMuY0dcxo64jB1xGTviMnbEZeyIy9gRl7EjLmNHXMaOuIwdcRk74jJ2xGXs iMvYEZexIy5jR1zGjriMHXEZO+IydsRl7IjL2BGXsSMuY0dcxo64jN1k7neTud9N5n43mfvdZD52 k/nYTeZjN5mP3WQ+dpP52E3mYzeZj91kPnaT+dhN5mM3mY/dZD52k/nYTeZjN5mP3WQ+dpP52E3m YzeZj91kPnaT+dhN5mM3mY/dZD52k/nYTeZjN5mP3WQ+dpP52E3mYzeZj91kPnaT+dhN5mM3mY/d ZD52k/nYTeZjN5mP3WQ+dpP52E3mYzeZj91kPnaT+dhN5mM3mY/dZD52k/nYTeZjN5mP3WQ+dpP5 2E3mYzeZj91kPnaT+dhN5mM3mY+C5loFzbUKmmsVNNcqaK5V0FyroLlWQXOtguZaBc21CpprFTTX KmiuVdBcq6C5VkFzrYLmWgXNtQqaaxU01yporlXQXKuguVZBc62C5loFzbUKmmsVNNcqaK5V0Fyr oLlWQXOtguZaBc21CpprFTTXKshvXJDfuCC/cUF+44LuMSnoHpOC7jEp6B6Tgu4xKegek4LuMSno HpOC7jEp6B6Tgu4xKegek4LuMSnoHpOC7jEp6B6Tgu4xKegek4LuMSnoHpOC7jEp6B6Tgu4xKege k2LOFIo5UyjmTKGYM4VizhSKOVMo5kyhmDOFYs4UijlTKOZMoZgzhWLOFIo5UyjmTKGYM4VizhSK OVMo5kyhmDOFYs4UijlTKOZMoZgzhWLOFIo5UyjmTKGYM4VizhSKOVMo5kyhmDOFYs4UijlTKOZM oagzBdNHWkwfaTF9pMX0kRbzbpdi3u1SzLtdinm3SzHvdinm3S7FvNulmHe7FPNul2Le7VLMu12K ebdLMe92KebdLsW826WYd7sU826XYt7tUsy7XYp5t0sx73Yp5t0uxbzbpZh3uxR0D3BB9wAXdA9w QfcAF3QPcEH3ABd0D3BB9wBXtC+jon0ZFe3LqGhfRkX7Miral1HRvoyK9mVUtC+jon0ZFe3LqGhf RkX7Miral1HRvoyK9mVUtC+jon0ZFe3LqGhfRkX7Miral1HRvoyK9mVUtC+jon0ZFe3LqGhfRkVc YUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVcYUVc YUVcYUVcYUVcYUVcYUVcYUVcYUVcYWVcoXm3ZjHv1izm3ZrFvFuzmHdrFvNuzWLerVnMuzWrueej mns+qrnno5p7Pqq556Oaez6queejmns+qrnno5p7Pqq556Oaez6queejmns+qrnno5p7Pqq556Oa ez6queejmns+qrnno5p7Pqq556Oaez6queejmns+qrnno5p7PqrJ5FaTya0mk1tNJreaTG41mdxq MrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVkcqvJ 5FaTya0mk1tNJrciX25FvtyKfLkV+XIr8uVW5MutyJdbkS+3Il9uRQ7bihy2FXllK/LKVuSVrcgr W5HrtSL/akVO1IqcqBU5USvylFbkDq3I51mRz7Min2dFPs+KfJ4V+Twr4tQq4tQq4tQq4tQq4tQq 4tQq4tQq4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa4tQa 4tQa4tQa4tQa49RMj101PXbV9NhV02NXTY9dNT121fTYVdNjV02PXTVtcdW0xVXTyVZNJ1s1nWzV dLJV03xWTb9YNS1e1bR4VdPiVU1XVjWNVNX0PlXT+1RN71M1vU/V9D5V0/tUTfaumuxdNdm7arJ3 1WTvqsneVZO9qyZ710z2rpnsXTPZu2ayd81k75rJ3jWTvWsme9dM9q6Z7F0z2btmsnfNZO+ayd41 k71rJnvXTPaumexdM9m7ZrJ3gfS1QPpaIH0tkL4WSF8LpK8F0tcC6WuB9LVA+logfS2QvhbIBxrI BxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrI BxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxrIBxqIYwvEsQXi2AJx bIE4tkAcWyCOLRDHFohjC3S/RCD6LRD9Fuh+iUDMXCBmLhAzF6Y2EqY2EqY2EqY2EqY2EqY2EqY2 EqY2EqY2EqY2EqY2Eqo2YvoSw/QlhulLDNOXGKYvMUxfYpi+xDB9iWH6EsP0JYbpSwzTlximLzFM X2KYvsQwfYlh+hLD9CWG6UsM05cYpi8xTF9imL7EMH2JYfoSw/QlhulLDNOXGKYvMUxfYpi+xDB9 iWH6EsP0JYbpSwzTlxgmxxwmxxwmxxwmxxwmxxwmxxwmxxwmxxwmxxzmXSFhQtFhQtFh3hUSJmEd JmEdJmEdyHMa6H7WQE7VQPezBvK3BrqfNZArNpArNpArNtD9rIG8tIHuZw3kwA10P2sg324g324g 324g324g324g324g324g324g324g324g324g324g324g324i324i324i324i324i324i324i324i 324irjARV5iIK0zEFSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxhIq4wEVeYiCtM xBUm4goTcYWJuMJEXGEirjARV5iIK0zGFZoO1zDvagzTLhvmXY1hem/DvKsxTCNvmEbeMI28Yd7V GKYrOMy7GsO0GId5V2OYfuUw/cph+pXD9CuH6VcO068cpl85TL9ymH7lMP3KYfqVw/Qrh+lXDtOv nKZfOU2/cpp+5TT9ymn6ldP0K6fpV07Tr5wmk5smk5smk5smk5smk5smk5smk5smk5smk5smk5sm k5smk5smk5smk5smk5smk5t/wuR++vXT2z++fP3XjHj7+vmfv/306et3wW8//PTpx3//8vbbL5// /va3n7788K+3rZQS72Xv5T9++PL1+Kk//vzPt58//9evn3/+9Zcj4/e/wvFjfz7Df3nbXr7k8Ut+ /Xz8o3798vZ+C3qkXY5iypj4hpuNbaLG+Seo8UIpxMtS6KO03vtYLYX461IIVAqvopiY6L3hJkGd JkGdJkGdJkGdJkGdJkGdyEWdyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+d yA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+dyA+d yA+dyA+diOdMxHMm4jkT8ZyJeM5EPGcinjMRz5mIzExEZiYiMxORmYnIzERkZiIyMxFjmYixTMRY JmIsE9GSiWjJRLRkIloyES2ZjJY0nZ5pmjPTNGemac5M05yZpjkzTXNmmubMNM2ZaZoz0zRnpmnO TNOcmaY5M01zZprmzDTNmWmaM9M0Z6ZpzkzTnJmmOTNNc2aa5sw0zZlpmjPTNGemac5M05yZpjkz TXNmmubMNM2ZaZoz0zRnpgkHpwkHpwkHpwkHpwkHpwkHpwkHpwkHp8nzpsnzpsnzpsnzpsnzpsnz psnzpongpongpongpongpknNpknNpknNpknNpknNpkjN1kImcTMKaK0zCmh3MwpodzMKaHczCmh3 MwpodzMKaHe1kEncjAIK7YxCtUEmcTMK1QaZxM0oVBtkEjejUG2QSVwtZBI3o1BtkEncjEK1QSZx MwrVBpnEzShUG2QSN6NQbZDNKjMK1QaZ380oVBtkfjejUG2Q+d2MQrVB5ne1kPndjEKfMpnfzSj0 KZOp34xCnzKZ+s0o1Mtkflcr2XYyo8inXMm2kxlFPuVKtp3MKPIpV7LtZEaRXq5k28mMQrVBtp3M KFQbZNvJjEK1QbadnKcb8ajkqTXnWUhM5p2iz5OTmMw7RZ/nLDGZeYoWx0znYU1MZnaAOGY6T3xi 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 6VM1E5OZHSAC0qf0JiYzO0AEpE/9TkxmdoAISJ8i4J/IeTf57uff/v23z1/f3v/r/cj23+LrbMfj hf/5+esvPx4/6q9fupCzrOcsqznres66mrOt52yrOft6zr6ac6znHKs5Yz1nrObM9Zy5mHO28WrO +0sXcm7rObfVnOt9FKt9FOt9FKt9FOt9FKt9FOt9FKt9FOt9FKt9FOt9FKt9FOt9FKt9FOt9FKt9 lOt9lKt9lOt9lKt9lOt9lKt9lOt9lKt9lOt9lKt9lOt9lKt9lOt9lKt9lOt9lKt9lOt9lKt9lOt9 lIt91N6X++jx0oWcy330eOlCzuU+erx0IedyHz1eupBzuY8eL13IudxHj5cu5Fzuo8dLF3Iu99Hj pQs5l/vo8dKFnMt99HjpX+fc1vtoW+2jbb2PttU+2tb7aFvto229j7bVPtrW+2hb7aNtvY+21T7a 1vtoW+2jbb2PttU+2tb7aFvto229j7bVPtrX+2hf7aN9vY/21T7a1/toX+2jfb2P9tU+2tf7aF/t o329j/bVPtrX+2hf7aN9vY/21T7a1/toX+2jfb2P9tU+Kut9VFb7qKz3UVnto7LeR2W1j8p6H5XV PirrfVRW+6is91FZ7aO+Xp99tT77en321foc6/U5VutzrNfnWK3PdT25rerJbV1Pbqt6clvXk9uq ntzW9eS2qie3dT25rerJbV1Pbqt6clvXk9uqntzW9eS2qie3dT25rerJbV1Pbqt6clvXk9uqntzW 9eS2qie3dT25rerJbV1Pbqt6clvXk9uqntzW9eS2qie3dT25rerJbV1Pbqt6clvXk9uqntzW9eS2 qie3dT25rerJbV1Pbqt6clvXk9uqntzW9eS2qie3dT25rerJbV1Pbqt6clvXk9uqntzW9eS2qif3 dT25r+rJfV1P7qt6cl/Xk/uqntzX9eS+qif3dT25r+rJfV1P7qt6cl/Xk/uqntzX9eS+qif3dT25 r+rJfV1P7qt6cl/Xk/uqntzX9eS+qif3dT25r+rJfV1P7qt6cl/Xk/uqntzX9eS+qif3dT25r+rJ fV1P7qt6cl/Xk/uqntzX9eS+qif3dT25r+rJfV1P7qt6cl/Xk/uqntzX9eS+qif3dT25r+rJfV1P 7qt6cl/Xk/uqntzX9eS+qif3dT25r+rJfV1P7qt6cl/Xk/uqntzX9eS+qif3vl6ffbU++3p99tX6 7Ov12Vfrs6/XZ1+tz3U9ua/qyX1dT+6renJf15P7qp7c1/Xkvqon93U9ua/qyX1dT+6renJf15P7 qp7c1/Xkvqon93U9ua/qyX1dT+6renJf15P7qp7c1/Xkvqon93U9ua/qyX1dT+6renJf15P7qp7c 1/Xkvqon93U9ua/qyX1dT+6renJf15P7qp7c1/Xkvqon93U9ua/qyX1dT+6renJf15P7qp7c1/Xk vqon93U9ua/qyX1dT+6renJf15P7qp7c1/Xkvqon93U9ua/qyX1dT+6renJf15P7qp7c1/Xkvqon j3U9eazqyWNdTx6revJY15PHqp481vXksaonj3U9eazqyWNdTx6revJY15PHqp481vXksaonj3U9 eazqyWNdTx6revJY15PHqp481vXksaonj3U9eazqyWNdTx6revJY15PHqp481vXksaonj3U9eazq yWNdTx6revJY15PHqp481vXksaonj3U9eazqyWNdTx6revJY15PHqp481vXksaonj3U9eazqyWNd Tx6revJY15PHqp481vXksaonj3U9eazqyWNdTx6revJY15PHqp481vXksaonj3U+eazyyWOdTx6r fPJY55PHKp881vnksconj7LeR2W1j8p6H5XVPirrfVRW+6is91FZ7aO63kd1tY/qeh/V1T6q631U V/uorvdRXe2jut5HdbWP6nof1dU+qut9VFf7qK73UV3to7reR3W1j+p6H9XVPmrrfdRW+6it91Fb 7aO23kdttY/aeh+11T5q633UVvuorfdRW+2jtt5HbbWP2noftdU+aut91Fb7qK33UVvto77eR321 j/p6H/XVPurrfdRX+6iv91Ff7aN1nmGs8gxjnWcYqzzDWOcZxirPMNZ5hrHKM4x1nmGs8gxjnWcY qzzDWOcZxirPMNZ5hrHKM4x1nmGs8gxjnWcYqzzDWOcZxirPMNZ5hrHKM4x1nmGs8gxjnWcYqzzD WOcZxirPMNZ5hrHKM4x1nmGs8gxjnWcYqzzDWOcZxirPMNZ5hrHKM4x1nmGs8gxjnWcYqzzDWOcZ xirPMNZ5hrHKM4x1nmGs8gxjnWcYqzzDWOcZxirPMNZ5hrHKM+S6Pp+r+nyu6/O5qs/nuj6fq/p8 ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuarP57o+n6v6fK7r87mq z+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5qs/nuj6f q/p8ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuarP57o+n6v6fK7r 87mqz+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5qs/n uj6fq/p8ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuarP57o+n6v6 fK7r87mqz+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5 qs/nuj6fq/p8ruvzuarP57o+n6v6fK7r87mqz+e6Pp+r+nyu6/O5qs/nuj6fq/p8ruvzuajP9/dl 3vv50oWcq/X5fOlCztX6fL50IedqfT5f+tc5l/Xk50sXcq7W5/OlCzlX6/P50oWcq/X5fOlCztXv +edLF3Kufs8/X7qQc72PFvXk+cL1PlrUk+cL1/toUU+eL1zvo0U9ub8v68nPly7kXO+jRT15vnC9 jxb15PnC9T5a1JPnC9f7aFFPni9c76NFPXm+cL2PFvXk+cL1PlrUk+cL1/toUU+eL1zvo0U9ub8v 68nPly7kXO+jRT15vnC9jxb15PnC9T5a1JPnC9f7aFFPni9c76NFPXm+cL2PFvXk+cL1PlrUk+cL 1/toUU+eL1zvo0U9ub8v68nPly7kXO+jRT15vnC9jxb15PnC9T5a1JPnC9f7aFFPni9c76NFPXm+ cL2PFvXk+cL1PlrUk+cL1/toUU+eL1zvo0U9ub8v68nPly7kXO+jRT15vnC9jxb15PnC9T5a1JPn C9f7aFFPni9c76NFPXm+cL2PFvXk+cL1PlrUk+cL1/toUU+eL1zvo0U9ub8v68nPly7kXO+jRT15 vnC9jxb15PnC9T5a1JPnC9f7aFFPni9c76NFPXm+cL2PFvXk+cL1PlrUk+cL1/toUU+eL1zvo0U9 uW/L+0OeL13IuVyf2+L+kPnC5frcFveHzBcu1+e2uD9kvnC5PrdVPXlb15O3VT15W9eTt1U9eVvX k7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eT t1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3 VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dV PXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9 eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15 W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb 15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9eVvXk7dVPXlb15O3VT15W9eTt1U9uSzv 936+dCHn8u9ZFvd7zxcu93tZ3O89X7jc72Vxv/d84XK/l8X93vOFy/1eFvd797K83/v50oWcy/1e Fvd7zxcu93tZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VV ny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r +nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ 1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efL uj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5f VvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5 sq7Pl1V9vqzr82VVny/r+nxZ1efLuj5fVvX5sq7Pl1V9vqzr82VVn1+/H7av3g/b1++H7av3w/b1 +2H76v2wff1+2L56P2xfvx+2r94P29fvh+2r98P29fth++r9sH39fti+ej9sX78ftq/eD9vX74ft q/fD9vX7Yfvq/bB9/X7Yvno/bF+/H7av3g/b1++H7av3w/b1+2H76v2wff1+2L56P+x84XIfjdX5 0fr9sH31fti+fj9sX70ftq/fD9tX74ft6/fD9tX7Yfv6/bB99X7Yvn4/bF+9H7av3w/bV++H7ev3 w/bV+2H7+v2wffV+2L5+P2xfvR+2r98P21fvh+3r98P21fth+/r9sH31fti+fj9sX70ftq/fD9tX 74ft6/fD9tX7Yfv6/bB99X7Yvn4/bF+9H7av3w/bV++H7ev3w/bV+2H7+v2wffV+2L5+P2xfvR+2 r98P21fvh+3r98P21fth+/r9sH31fti+fj9sX70ftq/fD9tX74ft6/fD9tX7Yfv6/bB99X7Yvn4/ bF+9H7av3w/bV++H7ev3w/bV+2H7+v2wffV+2L5+P2xfvR+2r98P21fvh+3r98P21fth+/r9sH31 fti+fj9sX70ftq/fD9tX74ft6/fD9tX7Yfv6/bB99X7Yvn4/bF+9H7av3w/bV++H7ev3w/bV+2H7 +v2wffV+2L5+P2xfvR+2r98P21fvh+25fj7K1fNRrp+PcvV8lOvno1w9H+X6+ShXz0e5fj7K1fNR rp+PcvV8lOvno1w9H+X6+ShXz0fr93P11fu5+vr9XH31fq6+fj9XX72fq6/fz9VX7+fq6/dz9dX7 ufr6/Vx99X6uvn4/V1+9n6uv38/VV+/n6uv3c/XV+7n6+v1cffV+rr5+P1dfvZ+rr9/P1Vfv5+rr 93P11fu5+vr9XH31fq6+fj9XX72fq6/fz9VX7+fq6/dz9dX7ufr6/Vx99X6uvn4/V1+9n6uv38/V V+/n6uv3c/XV+7n6+v1cffV+rr5+P1dfvZ+rr9/P1Vfv5+rr93P11fu5+vr9XH31fq6+fj9XX72f q6/fz9VX7+fq6/dz9dX7ufr6/Vx99X6uvn4/V1+9n6uv38/VV+/n6uv3c/XV+7n6+v1cffV+rr5+ P1dfvZ+rr9/P1Vfv5+rr93P11fu5+vr9XH31fq6+fj9XX72fq6/fz9VX7+fq6/dz9dX7ufr6/Vx9 9X6uvn4/V1+9n6uv38/VV+/n6uv3c/XV+7n6+v1cffV+rr5+P1dfvZ+rr9/P1Vfv5+rr93P11fu5 +vr9XH31fq6e6/73XPW/r9/P1Vfv5+rr93P11fu5+vr9XH31fq6+fj9XX72fq6/fz3W+9O8/fv38 w69fvv5/3v7x06d//vL2y+dfj9f9/OXn//Ht/+sRNRtvi0PhJFEFRbHfsKOogaICRSWJ2t9R1Iai 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 09AVHw1d8dHQop2GFu00tGinoUU7DS3aaWjRTjU1+Gpq8NXU4KupwVdTg68ma19NQb+agn41Bf1q CvrVFPSrqcFXU4OvpgZfrdvIHkdUMZlZtKagX01Bv5qCfjUF/WoK+tUU9Ksp6FdT0K+moF9NQb+a gn41Bf1qCvrVFPSrKehXU9CvpqBfVUE/zA4IswPC7IAwOyDMDgizA9LsgDQ7wNzYVc2NXdXc2FXN jV3V3NhVzY1d1dzYVc2NXc3c2NXMjV3N3NjVzI1dzbwvqpn3RTVzl1gzd4k1c5dYM3eJNXOXWDN3 iSUa9SYa9SYa9SYa9SYa9SYa9SYa9SYa9SYa9SYaAiYaAiYaAiYaAiYaAiYaAiYaAiYaAiYaAiYa AiYa5yUa5yUa5yUa5yUa5yUa5yUa5yUa5yUa5yUa5yUZ55V3Ms6bUaA2ZhSojRkFamNGgdqYUaA2 ZhSojRkFamNGgdqYUag2yDhvRqHPi9xlMaPQ50VuwJhR6PPa0Oe1oc+LrIWaUaiXyVqoGcWeD8Un 8jRnU2nOptKcTaU5m0pzNpXmbCrN2VSas6k0Zf40Zf40Zf40Zf40Zf40Zf40Zf40Zf40Zf40Zf40 lfk0lfk0lfk0lfk0lfk0lfk0lfk0lfk0lfk0lfkUlfnzpCYm8zrgPNeJybwOOE+BYjKvA84zo5jM 64DzhCkmMztAVObPY6qYzKyzzawz8WKO8wgsJjPrbDPrTFwldh6vxWTmN624SqygW0ULulV0RhFN ZUeaCrrBtKAbTAu6wbSgG0wLusG0oBtMC7rBtKAbTAu6wbSgG0wLuov0WPqGotCnTJZmF3QXaUF3 kRZ0F2lBd5EWdBdpQXeRFnQXaUF3kRZ0F2lBd5EWdBdpQXeRFnQXaUF3kRZ0F2lBd5EWdBdpQXeR FnQXaUF3kRZ0F+mMQrVBVizMKFQbZNV22QmtM6NQbRBaZ0ah2iC0zoxCtUFonRmFaoPQOjMK1QZZ zDCjUG2QxQwzCtUGWcwwo1BtkMUMMwrVBmGyZhSqDfPEbl6leZ67xGTiid285LOYl3wW85LPYl7y WcxLPot5yWcxL/ks5iWfxbzks5iXfBbzXs7ziComM4tW3NddzHs5i3kvZzHv5SzmvZzFvJezmPdy FvNezmLey1nMezmLeS9nMe/lLOa9nMW8l7OY93IW817OYt7LWcx7OYt5L2cx7+Us5r2cxbyX85Qy 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 utZPrUhMZnaAiAOdgpOYzOwAkS06VSsxmdkBIlt0Sl9iMrMDRLZoJkPaKoHzZxTSVgmc3zYC588o pK0SOH9GIW2VwPkzCunuBM6fUag2yLalGYVqg2xbmlGoNsi2pRmFaqOh2mioNshmpxmFaqOh2mio NjqqjY5qo6Pa6Kg2OqqNjmqjo9roqDY6qg1yZUHbBqqNgWoDcYUb4go3xBVuiCvcEFe4Ia5wQ1zh hrjCDXGFG+IKN8QVbogr3BBXuCGucENc4Ya4wg1xhRviCjfEFW6IK9wQV7ghrnBDXOGGuMINcYUb 4go3xBVujCsUvR3nsUxMZioQorfjPNuJyUwFQvR2nAdEMZmpQIjejvOUKSYzO0BcQXYeVb1k4gqy 82ArJjM7QFxBdp6OxWRmB4jL0c4jtpjM7IBmdkA3O6CbHdDNDuhmB3SzA7rZAd3sgG52QDc7oJsd MMwOGGYHmEzuZjK5m8nkbiaTu5lM7mYyuZvJ5G4mk7uZTO5mMrmbyeRuJpO7mUzu9idM7l8tFT2C Xy0VHXn8g4/bYVeWip6/wvFjn0tF5397f/myxy/60U7RbTWKCVv/C+9Tf/U+xXjvvY/5tbH4PvX/ 9j5Fr99f8Xu8Cr1Nr6KYkifWpvm1ZYLUmwlSbyZIvZkg9WaC1JsJUm8mSL2ZIPVmgtSbCVJvJki9 IzP1jszUOzJT78hMvSMz9Y7M1DsyU+/ITL0jM/WOzNQ7MlPvyEy9IzP1jszUOzJT78hMvSMz9Y7M 1DsyU+/ITL0jM/WOzNQ7MlPvyEy9IzP1jszUOzJT78hMvSMz9Y7M1DsyU+/ITL0jM/WOzNQ7MlPv yEy9Ixh0RzDojmDQHcGgO4JBdwSD7ggG3REMuiMYdEcw6I5g0B3BoDuCQXcEg+4IBt0RDLojGHRH MOiOYNAdwaA7gkF3BIPuCAbdEQy6Ixh0RzDojmDQHcGgu2lk3U0j624aWXfTyLqbRtbdNLLuppF1 N42su2lk3U0j624aWXfTyLqbRtbdNLLuppF1N42su2lk3U0j624aWXfTyLqbRtbdNLLuppF1/xMj 61+OXmbwi9FLxHu818xYm7wcv8F/m7y8fAkYu7yOYuqD+H6bfW3ac3fTnrub9tzdtOfupj13N+25 u2nP3U177m7ac3fTnrubePhu4uG7iYfvJh6+m3j4buLhu4mH7yYevpt4+G7i4buJh+8mHr6bePhu 4uG7iYfvJh6+m3j4buLhu4mH7yYevpt4+G7i4buJh+8mHr6bePhu4uG7iYfvJh6+I4v4jiziO7KI 78giviOL+I4s4juyiO/IIr4ji/iOLOI7sojvyCK+I4v4jiziO7KI78giviOL+I4s4juyiO/IIr4j i/iOLOI7sojvyCK+I4v4jiziO7KI78giviOL+I4s4juyiO/IIr4ji/iOLOI7sojvyCJeEC1ZEC1Z EC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1ZEC1Z EC1ZEC1ZEC1ZEC1ZEC1ZEC1ZGC1p2nN30567m/bc3bTn7qY9dzftubtpz91Ne+5u2nN30567m/bc 3bTn7qY9dzftubtpz91Ne+5u2nN30567m/bc3bTn7qY9dzevzNnNK3N20+m5m07P3XR67qbTczed nrvp9NxNp+duOj130+m5m07P3XR67qbTczednsUkjYtJGheTNC4maVxM0riYpHExSeNiksbFJI2L SRoXkzQuJmlcTNK4mKRxMUnjYpLGxSSNi0kaF5M0LiZpXEzSuJikcTFJ42JemVNMJreYTG4xmdxi MrkFuY0LchsX5DYuyG1ckNu4ILdxQW7jgtzGBbmNC3IbF+Q2LshtXJDbuCC3cUFu44LcxgW5jQty GxfkNi7IbVyQ27ggt3FBbuOC3MYFuY0LchsX5DYuyG1ckNu4ILdxQW7jgtzGBbmNC3IbF+Q2Lsht XBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBX WBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWBBXWExPZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9k MT2RxfREFtMTWUxPZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUxPZDE9kcX0 RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUwmt5hMbjGZ3GIyucVkcovJ5BaTyS0mk1tM JreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ 3GIyuQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkV+XIr8uVW5MutyJdbkS+3Il9uRb7ciny5Ffly K/LlVuTLrciXW5EvtyJfbkW+3Ip8uRX5civy5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5Mut yJdbEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdY EVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYEVdYGVdoeiKL6YkspieymJ7IYnoii+mJLKYnspieyGp6 IqvpiaymJ7KanshqeiKr6Ymspieymp7Ianoiq+mJrKYnspqeyGp6IuufeCL/8u6JGfzq2u++vfcR x+Fi6fKJ41c4fuzj8olti+09X77u8ZteuIHidRRTFcR33exu0+9ZTb9nNf2e1fR7VtPvWU2/ZzX9 ntX0e1bT71lNv2c1/Z7V9HtWkzeuJm9cTd64mrxxNXnjavLG1eSNq8kbV5M3riZvXE3euJq8cTV5 42ryxtXkjavJG1eTN64mb1xN3riavHE1eeNq8sbV5I2ryRtXkzeuJm9cTd64mrxxRZ7jijzHFXmO K/IcV+Q5rshzXJHnuCLPcUWe44o8xxV5jivyHFfkOa7Ic1yR57giz3FFnuOKPMcVeY4r8hxX5Dmu yHNckee4Is9xRZ7jijzHFXmOK/IcV+Q5rshzXJHnuCLPcUWe44o8xxV5jivyHFfETFbETFbETFbE TFbETFbETFbETFbETDbETDbETDbETDbETDbETDbETDbETDbETDbETDbETDbETDbETDbETDbETDbE TDbETDbETDbETDbETDbGTJp+z2r6Pavp96ym37Oafs9q+j2r6fespt+zmn7Pavo9q+n3rKbfs5p+ z2r6Pavp96ym37Oafs9q+j2r6fespt+zmn7Pavo9q+n3rKbfs5p+z2r6Pavp96ym37Oafs9q+j2r 6fespt+zmn7Pavo9q+n3rKbfs5q8cTV542ryxtXkjavJG1eTN64mb1xN3riZvHEzeeNm8sbN5I2b yRs3kzduJm/cTN64mbxxM3njZvLGzeSNm8kbN/MOlmYyuc1kcpvJ5DaTyW0mk9tMJrchz3FDnuOG PMcNeY4b8hw35DluyHPckOe4Ic9xQ57jhjzHDXmOG/IcN+Q5bshz3JDnuCHPcUOe44Y8xw15jhvy HDfkOW7Ic9yQ57ghz3FDnuOGPMcNeY4b8hw35DluyHPckOe4Ic9xQ57jhjzHDXmOG+IKG+IKG+IK G+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IKG+IK G+IKG+IKG+IKG+IKG+IKG+IKm+mJbKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoi m+mJbKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvpiWym J7KZnshmeiKb6YlspieymZ7IZnoim8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tM JreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT20wmtyFfbkO+ 3IZ8uQ35chvy5Tbky23Il9uQL7chX25DvtyGfLkN+XIb8uU25MttyJfbkC+3I19uR77cjny5Hfly O/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5Xbky+3Il9uRL7cjX25HvtyOfLkd+XI74go74go7 4go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go74go7 4go74go74go74go74go74go74wpNT2QzPZHN9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30RDbT E9lMT2QzPZHN9EQ20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9k Nz2R3fREdtMT2U1PZDc9kd30RHbTE9lNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5nc bjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrkd+XI7 8uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5Xbky+3I l9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL7ciX2xFX2BFX 2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFX2BFXOBBXOBBXOBBXOBBXOBBX OBBXOBBXOBBXOBBXOBBXOBBXOBhXaHoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK76Ynspiey m57Ibnoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK76Ynspieym57Ibnoiu+mJ7KYnspueyG56 IrvpieymJ7KbnshueiK76Ynspieym57IbjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ 5HaTye0mk9tNJrebTG43mdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHciX O5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/u QL7cgXy5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBuMKB uMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKBuMKB uMKBuMKBuMKBuMKBuMKBuMKBuMKBuMJheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRym J3KYnshheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6YkcpidymJ7I YXoih+mJHKYncpieyGF6IofpiRymJ3KYnshhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ry h8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kd yJc7kC93IF/uQL7cgXy5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IKzuQV3Yg r+xAXtmBvLIDeWUDeWUDeWUDeWUDeWUDeWUDeWUDeWUDeWUDeWUDeWUDeWUDeWUDsX6BWL9AdFsg ui0QpxaIUwvEqQXi1AJxaoE4tUCcWiBOLRCnFohTC8SpBeLUAnFqgTi1QJxaIE4tEKcWjFMzPXbD 9NgN02M3TI/dMD12w/TYDdNjN0yP3TA9dsP02A3TYzdMj90wPXbD9NgN02M3TI/dMJ1sw3SyDdPJ Nkwn2zCdbMN0soXpZAvTyRamky1MJ1uYTrYwnWxhOtnCdLKF6WQL08kWppMtTCdbmCRlmCRlmCBf mCBfmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxdmOxd Iq08kVaeSCtPpJUn0soTqd6JVO9Eqncir3oir3oir3oir3oir3oiNT+Rmp/Iq55oBpBIzU+k5idS 8xOp+YnU/ERqfiI1P5Gan0jNT6TmJ1LzE6n5idT8RGp+IjU/kZqfyHWeyHWeyHWeyHWeyHWeyHWe yHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyHWeyD+eyD+e yD+eyD+eplqbplqbplqbplqbplqbpsCapsCapsCaprs8TXd5mu7yNN3labrL0xSl0xSl03SXp6lw pylKpylKpylKpylKpylKpylKpylKpylKpylKpylKpylKpylKpylKpylKpylKpypKm4bwNA3haRrC 0zSEp2kIT9MQnqYhPE1DeJqG8DQN4WkawtM0hKdpCE/TEJ6mITxNQ3iahvA0DeFpGsLTNISnaQhP 0xCepiE8TQ93mh7uND3cKXq4+0amSDMKKH59I1OkGQW0uxkFtLsZBbS7GQW0uxkFtLsZhT4vMtnp G5nszCig0M4o9CmTyc6MQrVBJjszCtUGmezMKFQbZLLTNzLZmVGoNshkZ0ah2iCTnRmFaoNMdmYU qg0y2ZlRqDbIZGdGodogk50ZhWqDzINmFKoNMg+aUag2yD7hGYVqg+wTnlGoNsg+4RmFaoPsE55R qDbIPpQZhWqD7EOZUag2yD6UGYVqg+xDmVHoUybbRmYUeufJtpG+kW0jMwq98+Kw4DyIeMnEYcF5 bBGTeSfb85AjJvNOtueRSExm1pkoyZ/nKjGZJ8ecpzAxmSdInmc2MZnZAaIkfx78xGRmB4iS/Hl6 FJOZHSBK8ucRVExmdoAoyZ/nWDGZ2QGiJH8ehr1koiR/Hp3FZGYHiDtaz/O3mMzsAFHfPw/xYjKz A8QdracSICYzO0Dc0XrKCWIyswPEHa2nJiEmMztA3Ol0ChteMnGn0ymDiMnMDhDXMJ1aipjMLA1x 2dEpyIjJPiyN43/996d//vjD28+//ftvn7++vf9X29qR779lODZ9Hy/9z89ff/nx+GGPF+/jw9fe /uM/vnz996df5//j9Yv+8LO38bcX+fJ86f/t58///PTrj//5+f/+9suP/9/Pb/9jm4WV/b2OcwfZ +3zth7F//CfWf3z+/rXz79HLf2PND1/75//G+4v++G/c3l+8wfPv18sf/v7hS797P8bo+8GotlL3 6FFK/Tj4D7/T/uKF++tf6B/3//kw4rvfq4z3nM80fd/qlr3M/8er32t/+V61fXvx2vJBMfYPX/ui ePZW32Pba90z9/7xj/nDr5Sffnj1b69/9m7Fq2qrKxVUX3fJ9upf2l7/Ci869P7Sv/jZ7dXPnv/6 Fy06//i/fpfLlm02aJm98L7v297rh8F/+EGf//b+qkzGepuM//jjf3j7n59+eft//r/OL7/ze/Nv v/369uv//Pz189uPv8xv0OP/7++f//PHHz5/H/rzl1/fvs6IH3/996f/4+WnUl9+Kh98cW6vPpaV L87x8ovzH59LvEiYf1aVf3v1vZYrv8LLL9URrz6w+OBL9fVL//gfLnxgr36j8uJ7LT74ot1e9Oj9 tX/+bsTLb9Tt84tvifjgO7W9KIb7a//iZ7/81ixZXvRofPCtWV/98LLyw19+P9ZXP/qDb8cXXwb3 l373TbLX9j7/z/zblttp64gXf0Tj5dflXl48GMQH35a31vj06cOIv3hPXn5pbturZ6roH1TDi06O j75g2/H92Wvd4pDI5x/ZD2P/+Du96sAPvl23V2/g+OA3ivk3e8vo8/Gj9xbt1b98vP4O+/TDi9d+ 8AV6fwx51bUrX6PxwdfoP169LX/6Nfr5VcGvfI3Gy6/R3l8lzA++RvuLPzm58myaL59N55+Rv79I +MFX5otPNj94Nm0993l2LpHvs0zb+/zfPwz+w+/0Q3nRjPnBN2l5UUG58k2ar79J59Pqi4QfPVPO NpxfUYfoGftovbRXn87Lb81ZeC86Nz/43nyVduVxMl9+P/7j0/uLp9/84Auyv+i4XPlqzJdfjfMx 89U7/MFX463jXj2A3yP+4ld4+U1Y//bqb1auP2nmH580kz9p5sKT5l5ePYPnB1+Ur35hQpY8fsAf 371Xx+P84Bvz1e+y8lWZL78qt7p//z4c63tffzV8/812vPaP/+HCJ3f9PXz8cn/8mvn7iw48Vgf/ 5TvzeNEfBY4f3r/vkWN98Os/799/LI/X/sUPf/ml+bexvfrhHzx+vnjufrz2L374yy/S7/8mHbuJ X/9NamVso87Hylna7/Mpqn9fyY/gP35l/uPFWe/YW7z4df146Xe/03yOe2977ds+f7u9zb8nrz6b 19+k2+dXRfSn36SfX2Vf+CZ9vOiPX0yvpK1jafLy2zJWfvbLp8f50Pnqn//R8fvj1/7FD3/5Jfi3 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 cb3keaITk5lFm2ZppFkaaZZGiqVxnC3FZGJpHCdRMZlYZ8e5VUwmfjkep1wxmdgBx5lYTGZ2wGZ2 wGYW7WYW7WYW7WYW7WYW7WYW7WYW7WYW7W4W7W5+be9mB+xmB+xmB+xmB+xmB+xmB4i3t536hpdM vL3tVEO0ZMdyQRJFBLRjxx+JIgLaQOOVgcYraGfdGGi8Emi8Emi8Emi8Emi8Emi8Emi8Emi8Emi8 Emi8Emi8Emi8ciypIlGoNtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQJtBQ JtBQJtBQJtBQJtBQJtBQJgqqjYJqo6DaKKg2CqqNgmqjoNooqDYqqo2KaqOi2qioNiqqjYpqo6La qKg2KqqNimqjodpoqDYaqo2GaqOh2mjsnCIqEMMcUBynNTGZqEAMc3QyzNHJMEcnwxydhDk6CXN0 EuboJMzRSZijkzBHJ2GOTsIcnYQ5OglzdBLm6OQ4NIvJzA4w5zBhzmHCnMOEOYcJcw4T5hwmzDlM mHOYMOcwYc5hwpzDhDmHCXMOE+YcJsw5TJhzmDDnMGHOYcKcwxy6iJjM7IBidkAxO6CYHVDMDihm BxSzA6rZAdXsgGp2QDU7oJodUM0OqGYHVLMDqtkB1eyAZnZAMzugmR3QzA5oZgc0swMa0lYb0lYb 0lYb0lY70lY70lY70lY70lY70lY70t07qo2OaqOj2uioNtB6gxioNtBShEBLEQItRQi0FCHQUoRA SxECLUUItBQh0FKEQEsRAi1FCLQUIdBShEBLEQItRQi0FCHQUoRASxECLUUItBQhEFcYiCsMxBUG 4goDcYWBuMJAXGEgrjARV5iIK0zEFSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxh Iq4wEVeYiCtMxBUm4wqbqUA0U4FopgLRTAWimwpENxWIbioQ3VQguqlAdFOB6GYHdLMDutkB3ewA czXHcbAVk5kdYO75CHPPR5h7PsLc8xHmno8w93yEuecjzD0fYe75CHPPR5h7PsLc8xHmno8w93yE uecjzD0fYe75CHPPR5h7PsJkcsNkcsNkcsNkcsNkcsNkcsNkcsNkctNkctNkctNkctNkctNkctNk ctNkctNkctNkctNkctNkctNkctNkctNkctNkctNkctNkctNkctNkctNkchP5mhL5mhL5mhL5mhJx GYm4jERcRiIuIxGXkYjLSMRlJCIsEhEWiQiLRIRFIsIiEWGRiLBIRFgkYiUSsRKJWIlErEQi6iER v5CIX0jELyTiFxLxC4n4hUT8QiJ+IRG/kIhfSMQvJOIXEvELifiFRPxCIn4hEb+QiF9IxC8k4Rfi nfAL8U74hXgn/EK8E34h3gm/EO+EX4h3wi/EO+EX4p3wC/FO+IV4J/xCvBN+Id4JvxDvhF+Id0Yi mJR5mpR5mpR5mpR5mpRDmpRDmpRDmpRDmpRDmpRDmpRDmmBCmmBCmmBCmmBCmmBCmmBCmmBCmmBC mixBmixBmixBmixBmuP/NCf2aU7s05zYpzmxT3Nin+bEPs2JfZoT+zQn9mlO7NOc2Kc5sU9zYp/m xD7NiX2aE/s0J/ZpTuzTnNinOLE/VQYxmdcBpyYhJvM64FQwxGReB5x6h5jM64BTHRGTmR0gTuxP iUVMZnaAOLE/dRotWUGCYEGCYEHSXkHSXkHSXkHSXkHSXkHSXkHSXiHWpBmFPmViTZpRqDaINWlG odogK89nFKoNsvJ8RqHaICvPZxSqDbLyfEah2iArz2cUqg2y8nxGodogK89nFKoNsvJ8RqHaICvP ZxSqDbK8PApZXj6j0KdM1pDPKPR5kTXkMwp9XmQN+YxCvUzWkEcha8hnFPqUCa43o1BtEFxvRqHa ILjejEK1QXC9GYVqg+B6MwrVBsH1ZhSqDQL5zShUGwTym1Hs7CCKBcUUC4p5vi/m+b6Y5/tinu+L eb4v5vm+mOf7IhL55xlOTCYqXEUk8s+DoJjM7ABxS/Z5mhSTmR0gbsk+j6RiMrMDxC3Z57lWTGZ2 gLgl+zwci8nMDhC3ZJ8nbDGZ2QHiluzzmC4mMztAXGx9nvXFZGbRiruoT8FATGbWmbiL+lQdxGTm N624i/qULsRkZtGKlPCpf4jJzA4QKeFTRBGTmR0gUsKnEuMlEynhU7cRk5kdIO5CO8UfMZnZASJy fCpIWrKBhoEDDQMHGgYONAwcaBg40DBwoGHgQMPAgYaBAw0DBxoGDjQMHGgYONAwcKBh4EDDwIGG gQMNAwe5/3hGodpAI8SBRoiD3H88o1BtoMHjQIPHgQaPAw0eBxo8DjR4HGjwONDgcaDB40CDx4EG jwMNHgcaPA40eBxo8DjQ4HGgweNAg8eBBo8DDR4HGjwONHgcaPA40OBxkO0iMwrVBtkuMqNQbZD7 W2YUqg2yk2RGodogO0lmFKoNsslkRqHaIPtPZhSqDbL/ZEaxc4p4zh/mVG2YU7VhTtWGOVUb5lRt mFO1YU7VhjlVG+ZUbZhTtWFO1YY5VRvmVG2YU7VhTtWGOVUb5lRtiHfPnodmL5k5ohvmiG6Id8+e B3IxmdkB5rxvmPO+Yc77hjnvG+a8b5jzvmHO+4Y57xvmvG+Y875hzvuGOe8b5rxvmPO+Yc77hjnv G+a8b5jzvmHO+4Y57xvmvG+Y876hzvvEFUOnzOMlE1cMnaKQmMzsAHFf0aksicnMDhD3FZ3ylJjM 7ADx7qNT4xKTmR0gblI6hTIxGdJWyf7gGYW0VbI/eEYhbZXsD45B9gfPKKStkv3BMwppq2R/8IxC tUH2B88oVBtkf/CMIrURaH9woP3BgfYHB9ofHGhdSKB1IYH2BwdaMhJoyUigJSOBlowEWjISaMlI oCUjgZaMBFoyEmjJSKAlI4GWjARaMhKIKwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GF gbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBCMFAhGAgQjAQIRiIEAzG+onbZc+jkpjMVAXE7bLneUtM ZqoC4nbZ89AmJjNVAXG77HnyE5OZHSBulz2Pj2IyswPM7bJhbpcNc7tsmNtlw9wuG+bCmDAXxoS5 XTbM7TNhbp8Jc/tMmNtnwtw+E+b2mTC3z4S5fSbM7TNhbp8Jc/tMmNtnwtw+EyYnGyYnGyYnGyYn GyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGyYnGybaGibaGiba GibaGibaGiaNGsjRE8jRE8ibE4gtCMQWBKIEAs37A837A837A837A837A837A837A837A837A837 A837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837 E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837E837 E837E837E837E+0RSkQJJKIEklECJssdJssdJn4dJmoQJmoQJh0Q5kA/zIF+mAP9MAf6YQ70wxzo hznQD3OgH+ZAP8yBfpgD/TQH+mkO9NMc6Kc50E9zoJ/mQD/NgX6aA/00B/ppDvTTHOinOdBPc6Cf 5kA/zYF+mgP9NAf6aQ700xzopznQT3Ogn+ZAP82BfpoD/TQH+mkO9NMc6Kc50E9zoJ/mQD/NgX6a A/00B/ppDvTTHOinOdBPc6Cf5kA/zYF+mgP9NBdfpUkHpEkHpEgHzOdjIGLNKCBizSggcM4oIFXO KCBVziggVc4oIFXOwwSQKmcUkCpnFPqUCeYwo9CnTDCHGYVqg8ARMwrVBkEq5tkQfcoEc5hR6J0n wMKMQu88QQ/mkZj010bQgxlF+msj6MGMIv21EfRgRpFPeSPowYwi/bUR9CA3gh7MKFQbBD2YUag2 CHowo1BtEPRgRqHaIOjBjEK1QdCDGYVqg6AHMwrVBkEPZhSqDYIezChUGwQ9mFGoNgh6MKNQbRD0 YEah2iDowYxCTw7i+rvzICIm89SA89giJvMO8OchR0zmHeDPI5GYzDvAnwcoMZlZtCIycZ7CxGRm B4j8xXmUE5OZHSDyF+d5UExmloZIOZyHSjGZ+GluIphwnkzFZOL32SaCCefxVkwmFu0mggnnGVlM Jn6fbSKYcB60xWRmB4hgwnlaF5OZHSCCCeeRX0xmdoAIJpy6gZdMBBNOlUFMZnaACCacUoWYzOwA EUw49Q4xmdkBIphwiiZiMrMDRDDhVF7EZGYHiGBCFiS3FSS3FSS3FSS3FSS3FSS3FSS3FSS3FeL0 mVFEii3E6TOjUG0Qp8+MQrVBnD4zCtUG2Qc6o1BtkBvDZxSqDXJj+IxCtUFuDJ9RqDbIjeEzCtUG uTF8RqHaIDeGzyhUG+TG8BmFaoPcGD6jUG2QG8NnFKoNcmP4jEK1QW4Mn1GoNsiN4TMK1Qa5MXxG odpA4F1B4F1B4F0hN4bPKFQbCNcrCNcrCNcrCNcrCNcrCNcrCNcrCNcrCNcrCNcrCNcrCNcrCNcr ZAPSjEK1YZ7zi3nOL+Y5v5jn/GKe84t5zi/mOb+o53zRgHAeJ8VkZgeIBoTzTComMztANCCcB1sx mdkB4nrC83QsJjM7QLx5+zxie8nEm7fPA7mYzOwA8ebt81QvJjM7QLx5+5QGxGRmB4g3b5/6gpjM 7ADx5u1TpBCTmR0g3rx9Kh1iMrMDxJu3T7nESybevH2KK2IyswNM9LiY6HERb94+9RwxmdkBJsdc TI65mBxzMTnmYnLMxeSYi8kxF5NjLibHXEyOuZgcczE55iIupTuFMjEZ0laRtbaQDeIzCmmryJBb kCG3kA3iM4poqxXZeCuy8VZk463IxluRjbciG29FNt6KbLwVGXIrMuRWZMityJBbkbW2ImttRdba iqy1FVlrK7LWVmStrchaW5G1tiJrbUXW2oqstRVZayui9iqi9iqi9iqi9iqi9iqi9iqi9iqi9iqi 9iqi9iqi9iqi9iri7yoi6Soi6Soi6Soi6Spi4ipi4ipi4ipi4ipi4ipi4ipi4ipj4sSF1ueRQkxm np5Nq2cxrZ7FtHoWcaH1ebjRklXTN1pN32g1faPV9I1W0zdaTd9oNX2j1fSNVtPqWU2rZzWtntW0 elbTnVlNd2Y13ZnVdGdW051ZTXdmNd2Z1XRnVtOdWU13ZjXdmdV0Z1bTnVlN0LKaoGU1QctqgpbV BC2rCVpWE7SsJmhZTdCymqBlNUHLaoKW1WQjq4kzVhNnrCbOWE2csZoEYjUJxGoSiNUkEKtJIFaT QKwmgVhNAnEgDW8gDW8gDW8gN+xAyt9Ayt9Ayt9Ayt9Ayt9Ayt9Ayt9Ayt9AbtiB3LADuWEHcsMO 5IYdyA07kBt2IDfsQG7YgdywA7lhB3LDDuSGHcgNO5AbdiA37EBu2IHcsAO5YQdyww7khh3IDTuQ G3YgN+xAbtiB3LADuWEHcsMO5IYdyA07kBt2IDfsQG7YgdywA7lhB3LDDkTzDUTzDUTzDUTzDUTz DUTzDUTzDUTzBaL5AtF8gWi+QDRfIJovEM0XiOYLRPMNU84YppwxTDljmO7MYWojw9RGhqmNDFMb GaY2MkxtZJjayFC1EdOdOUx35jDdmcN0Zw7TnTlMd+Yw3ZnDdGcO0505THfmMN2Zw3RnDtOdOUx3 5jDdmcN0Zw7TnTlMd+Yw3ZnDdGcO0505THfmMN2Zw3RnDtOdOUx35jDdmcN0Zw7TnTlMd+Yw3ZnD dGcO0505THfmMN2Zw3RnDpOwHiZhPUzCepiE9TAJ62ES1sMkrIdJWIdJWIdJWIdJWIdJWIdJWIdJ WIdJWIdJWAfaUh7IJRVoS3kgb1UgLiMQlxGIywjEZQTiMgJxGYG4jEBcRiAuIxCXEYjLCMRlBOIy AnEZgbiMQFxGIC4jEJcRiMsIxGUE4jICcRmBuIxAXEYgLiMQYRGIlQjESgRiJQJRD4Goh0DUQyDq IRD1EIh6CEQ9BKIeAlEPgaiHQNRDIOohEPUQiF8IxC8EIhECkQiBSIRAJEIgEiEQiZCIKUjEFCRi CpIxBeY26TAdE2Fukw7TfhEmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAm rxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmrxAmYhAmFRAmFRAmFRDmID/MQX6Yg/ww B/lhDvLDHOSHOcgPc5Af5iA/zEF+mIP8MAf58fEg//Yf/+en//z89sOXr0f057+/ff7515nihy+/ /fzrTPT2LeszX7794+uXf7+1t1+/vDHZwKx8c4Af5sw9zJl7mDP3MGfuYc7cw5y5pzkmT3NMnuaY PL0xeX1/BytJj6jrEtERdV0IPKKuC4FH1HUh8Ii6LgQeUdeFwCPquqg/o8CI/oi6/r19RKHaACP6 IwrVBhjRH1GoNsCI/ohCtQFG9DMKjOiPKFQbYER/RKHaACP6IwrVBhjRH1GoNsCI/ohCtQFG9EcU qg0woj+iUG2AEf0RhWoDDNuPKPR5gcUEt7/m4qOB+pyhPRzfHgnEZNrD8e0BQkymPRzfHje8ZN6w 7/ZwIiYzO8Ab9t2ecMRkZgd4w77bY5KYzOwAb9h3e9YSk5kd4A37bg9sYjKzA7xh3+2pT0xmdoA3 7Ls9OnrJvGHf7UFTTGZ2gDfsuz2tisnMDvDmc7dHXi+Z5Nqdqeq4TKPeoy4eTe5RF48m96iLR5N7 1MVj6z3q4oHmHnXx2HqPungMukVdZVjvURcPT/coVBtXGdZ7FKqNqwzrPQrVxlWG9R6FauPq5q5b 1FXy9R6FauPq5q57FKqNq7zsPQrVxlVe9h6FauMqL3uPIrVxmbK9R5HauEzZ3qNIbeTVzV33KFIb eXVz1z2K1Ea+k9rIq7d33qKu3t55j0K1cfX2znsUqo2rd37eo1BtXL3z8x6FauPqnZ/3KFQbV+/8 vEeh2rh65+c9CtXG1Ts/71GoNq7e+XmPQrVx9abQexSqjas3hd6jUG1cHcvfo1BtXB3L36PYOcU5 mj+PZWIy52j+PMSJyRxx6nnkE5M54tTzgOglk2DL53FSTGZ2gARbPs+kYjKzAyTY8nmwFZOZHSBt TXqejsVkZgdIW5OeR2wxmdkBEsH5PKeLycwOkAjO52FfS2bhoE9pQEwmdoCFgz71BTGZ2AEpbU16 ihRiMrEDUrrk9ql0iMnMDpAuuX3KJWIyswOkG3OfmouYzOwA6cbcp3DjJZNuzH3KPGIyswOkG3Of WpGYzOwA6cbcp+AkJjM7QLp+96laicnMDpBg1af0JSYzO0CCVe/JkLZ61dZyj0La6lVbyy3qqq3l HoW01au2lnsU0lav2lruUUh3v2oauUVdNY3co9A7f9U0co9C7/xV08g9Cr3zV00j9yjUlVdNI/co VBtXTSP3KFQbV00j9yhUG1dNI/coVBtX9zreo1BtXN3reI9CtXF1G+Q9CtUGovYSUXuJqL1E1F4i ai8RtZeI2ktE7SWi9hJRe4n4u0T8XSL+LhF/l4i/S8TfJeLvEvF3ifi7RPxdIv4uEX+XiL9LxN8l 4u8S8XfJ+DvJVPc8vojJzJO6ZKp7noHEZOZJXTLVPQ9SYjLzpC6Z6p6nMS+Z5DZ7nt3EZGZpSG6z 5wFQTGaWhuQ2e54ixWTml6PkNnseRcVkZgf8idvs06+f3v7x5eu/ZsTb18///O2nT1+/C3774adP P/77l7fffvn897e//fTlh3+97XXv276/7+0/7nu6fvz5n28/f/6vXz///OsvR8bvf4Xjx/58hv/y tvd9q/Xl6x6/6dfPx7/s1y9v77fIR+5tNYqd1cV33exuyUn3PPCLyczultZmPlUDL5m0g/OpMYjJ zL9vJrCaJrCaJrCaJrCaJrCaJrCaJrCaJrCaJrCaJmOaJmOaJmOaJmOaJmOaJmOaJmOaJmOaJmOa JmOaJmOaJmOaJmOaJmOaJmOaJmOaImMa78RnOqOABjqjgAY6o4AGOqOABjqjgAY6o4AGOqOABjqj gAY6o4AGGu/EZzqjUG0Qn+mMQrVBfKYzCtUG8ZnOKFQbxGc6o1BtEJ/pjEK1QXymMwrVBvGZxjvx mc4oVBvEZzqjUG0Qn2m8E5/pjEK1QXymcXn98z0K1QbxmcblRc73KPQpE+ItLi9yvkehT5kQb3F5 kfM9Cn3KhHiLy4uc71HoUyZ0XVxeDHyPQj+LEFRxee3u87lXfIj2Tn7nU7KYzDv5nc/UYjLv5Hc+ gYvJvJPf+bwuJjNPfqK36nzoF5OZHSB6q86Tg5jM7ADRW3UeP8RkZgeI3qrzDCMmMztA9FadByEx mdkBorfqPE2JycwOEL1V55HMSyZ6q84DnJjM7ADRWxXWRQDPw6GYzCxaETMMa3f/8+ApJjOLVsQM w9rd/zzUisnMopV29z9PxmIys2hFyi2sNejPU7eYzCvaRLsME+0yTLTLMNEuw0T7BRPtF0y0XzDR fsFE+wUT7RdMtF8w0X7BRPsFE+0XTOSPTuSPTuSPTuSPTuSPTuSPTuSPTuSPTuSPTuSPnlHoUyZq cSIvdiIvdiIvdiIvdiIvdiJ/dCJ/dCJ/dCJ/dCKncyKncyKncyKncyKncyKncyKncyLPciLPciLP ciLPciLPciLPciLPciLPciLPciLPciLPciLPcpr7pdLcL5Xmfqk090ulucUpzS1OaW5xSnOLU5pb nNLc4pTmFqc0tzilucUpzS1Oabqj03RHp+mOTtMdnaY7Ok13dJru6DTd0Wm6o9N0R59nMTGZWbSi bJmmbztN33aavu00fdtpuqPTdEen6Y5O0x2dpqE5/8zQjI6tYjLz+0w0/aZp+k3T9JumTzdNn26a Pt00fbpp+nTT9Omm6dNN06ebpk83TZ9umj7dtHy6ZT6CxnbVcXKPuqhv3KKuTgPvUReVpXvURWXp HnVRI7pHoffw6vzrHnVRnbtHoffw6iTrHoXew6szqVvU1ZnUPeqimnqPQp/X1ZnUPQp9XldnUvco 9ClfnWTdo1CnXJ1k3aKuTrLuUag2rs6k7lHoU766H/gehT7lq/OvexT6lK/Ov25RV/cD36PQp3x1 anaPQrVxdWp2i7o6XbpHoX/X1TnRPQr9uyQC/fnw4iWTpi/PRx0xmfOc/nwwEpOZn6Yk/j+frsRk 5qcp6fXPRzQxmdlOksT+fM4Tk5l1Jknsz4dFMZn5rSGRwc8nTjGZ+RUk6fXPx1YxmdkBksT+fPYV k5lFK4n/zwdoMZlZtJL4/3wKF5OZRStNEp6P8mIyswMkVfx5HhCTme+ZJGTXfdtLu3oBwz3q4kH6 HnXxIH2PuniQvkddPEjfoq5epXCPuniQvkddPHDeoy4eOO9R6FO+epXCPQrVxtWrFO5RqDauXqVw RvWrK+buUaQ2+tVFZ7eoq4vO7lGkDvvVlWX3KFKH/erKsnsUqcN+dWXZPYrUYb86QLpFXR0g3aNQ HV61k92jUG1cHXHdo1BtXLWu3aPQp3zVGHaPQu/81cHYPQq981eNYfco9M5fHafdo9jnhbry6hDu HoU+5auDsXsU+ryuDsaeT5XiI6pzFn0+g4rJnLPo84nVSyZthH4+34rJnHPV82lYTGYWrbQR+vlI LSYzO0DaCP18LteSdWkz3vMpXkxm/jOl9WfPo4CYTOzNLm0se54nxGRib3ZpY9nzUCImM4tWmhc/ TzZiMrMDJLfe83gkJjM7QPIRPs9YXjLJYPc8kYnJzNKQZuzPY52YzCwNaWD/PBuKycwvR2n6/zxg isnMOpNm7M9TqpGs9Vlk/aqAfY+6KFHcoy5KFPeoixLFGTWuCtj3qIvy1T3qorBxj7ooX92jLsoh 96iLcsg9itTGuHpHyj2K1Ma4Ojq4RV0dHdyjUG1cHTjco1BtXB043KNQbVwdONyjUG1cHTjco1Bt XB043KNQbVwdONyjUG1cHTjco1BtXB043KNQbVwdU9yjUG1c3ZV3j0K1cXUkco9CtXF1JHKPQrVx dSRyj0K1cXUkco9CtXF1JHKPQrVxdZByj0K1cXX8co9CtXF1/HKPQrVx1Zd0j0K1cdWXdI9CtXF1 w949CtXGVTfTPQrVxlU30z0K1cZVN9M9itRGl6Ydz2OZmMwRDZ6HOC3ZkKYdzyOfmMxRIJ4HRDGZ I2c8j5NiMrEDhnQP0PNMKiYzO0AahD0PtmIyswOkqdrzdCwmMztAmqo9j9hiMrMDpKna85wuJjM7 QJqqPQ/7YjKzA6Sp2lMxEJOZHSCN6J6yg5dM2s75FCnEZGYHSMPDp9IhJjM7QBoePuUSMZnZAdLw 8Km5iMnMDpAmkU/hRkxmdoA01nyqP2IyswMk6/BTQvKSSdbhp+AkJjM7QPIhP1UrMZnZAZIP+Sl9 icnMDpB8yLdkV7cB3aOQtnp1G9A9CmmrV7cB3aOQtnr1Do17FNJWO9JWr968cYu6uhvpHoVq4+pG pXsUqo2rG5XuUag2rt68cY9CtXH15o17FKqNqzdv3KNQbQSqjUC1cdXifo9CtXHVGH+PQrVx1Rh/ j0K1cdUYf49CtXHVGH+PQrVx1Rh/j0K1gbjCgbjCgbjCgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWB uMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFwbhCaQ/U81gmJjMV CGkP1PNsJyYzFQjpRonnAVFMZioQ0vUUz1OmmMzsAGmr1/OoKiYzO0C6nuJ53hWTmR0gXU/xPDR7 yaTrKZ5HbDGZ2QFhdoC0NOR5fBeTmR0gbSB5agBiMrMDpA0kTyFBTGZ2gLSB5KlGiMnMDjCZ3GEy ucNkcofJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ 5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5Aby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby 5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5Qby5QZy2AZy2AZy2AZy 2AZy2AZy2AZy2AZy2AYiBAMRgoEIwUCEYCBCMBAhGIgQDEQIBiIEAxGCgQjBQIRgIEIwECEYiBAM RAgGIgQDEYKBCMFAhGAgQjAQtReI2gtE7QWi9gJRe2E6DsN0HIbpOAzTcRim4zBMx2GYjsMwHYdh Og7DdByG6TgM03EYpuMwTMdhmI7DMB2HYToOw3Qchuk4DNNxGKbjMEzHYZiOwzAdh2E6DsN0HIbp OAzTJBimSTBMk2CYJsEwTYJhmgTDNAmGaRIME1INE1INE1INE1INE1INE1INE1INE1INE1INE1IN E1INE1INE1INE1INE1INE1INE1INE1INE1INE1INE1INEwUNEwUNEwUNEwUNEQVNtJY20VraRGtp E62lTbSWNtFa2kRraROtpU20ljbRWtpEa2kTraVNtJY20VraRGtpE62lTbRWI9FajURrNRKt1Ui0 ViPRWo1EazUSrdVItFYj0VqNRGs1Eq3VSLRWI9FajUQLMhItyEi0ICPRgoxECzISLchItCAj0YKM RAsyEi3ISLQgI9GCjEQLMhItyEi0ICPRgoxEqy4SrbpItOoi0aqLRKsuEq26SLS0ItEiiUQrIRKt hEi0EiLRSog0VyCmuQIxzRWIaa5ATHMFYporENNcgZjmCsQ0VyCmuQIxzRWIaa5ATHMFYporENNc gZjmCsQ0V3CkuYIjzRUcaa7gSHMFR5orONJcwZHmCo40V3CkuYIjzRUcaa7gSHMFR5orONLcmpHm 1ow0t2akuTUjza0ZaW7NSHNrRppbM9LcmpHm1ow0t2akuTUjza0ZaW7NSHNrRppbM9JcdJHmoos0 F12kuegizUUXaS66SHM3RZobINJc2pDm0oY0lzakubQh0RLOREs4Ey3hTLSEM9ESzkRLOBMt4Uy0 hDPROs1E6zQTrdNMtBgz0WLMRIsxExn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7 Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7Exn7ZxSqDUQ2oXUAidYB JFoHkGgdQKJ1AInWASRaB5BoHUAiY38iY38iY38iY38iY38iY38iY38iY38iY38iY3+aK+nSXEmX 5kq6NFfSpbmSLs2VdGmupEtzJV2aW+TS3CKX5ha5NBe/pbn4Lc3Fb2muRkhzNUKaqxHSXI2Q5mqE NFcjpLkaIc3VCGmuRkhzNUKaqxHSXI2Q5mqENFcjpLkaIc3VCGmuRkhzNUKaqxHSXI2Q5mqENFcj pLkaIc3VCGmuRkhzNUKaqxFOMUJMZnaASSKaexbS3LOQ5p6FNPcspLlnIc09C2nuWUhzNUKaqxHS XI2Q5mqENFcjpLkaIc3VCGmuRkhzNUL+yWqEt/v//I+3T//8+cvb//52cUC479u+93LRlPGIuiYO PqKuiYOPqGsy3yPqmsx3j7poOH1EoffwosD6iELv4UWB9VttCJX8rWTEZMr30rcCE5MpXyXfylFM Zn6azl+ZbzUtJlP+yjySoe+eiyOGe9TFEcMjCn1jXbRBP6KujZ8eUejb8aJ5+hGFvh0vmqcfUag2 Lpqn71EXzdOPKFQbF83TjyhUGxfN048oVBsXzdOPKPQpX7RB36Mu2qAfUehTvmiefkShT/miefoR hT7li+bpRxT6BkhUGxct17eo+k5qo140aj+iyOdV0ZmgojNBRWeCehHlfUSh9/AilPuIQu/8RSj3 EYXe+Yso7yOKfV6oU3b0KV8EgB9RqDYuAsCPKFQbFwHgRxSqjYsA8CMK1cZFAPgedREAfkQxVcA8 VjoK1beThpjMPKM69tZvxxUxmXl6dryy3848YjLz9Ox4Zb8dnLxkjlf22zFLTGZ2gOOV/XZWE5OZ HeB4Zb8d+MRkZtE69tZvp0YxmVm0jlf229FTTGYW7Z94ZT/9+untH1++/mtGvH39/M/ffvr09bvg tx9++vTjv395++2Xz39/+9tPX37419vetmjzC6Ts//HDl6/HT/3x53++/fz5v379/POvvxwZv/8V jh/78xn+y9ve963Wl697/KZfPx//sl+/vL3fIh+5t9UodjYX33Wzux1T8bcDvphMbMhqjoGqOQaq 5hiommOg6pDy3xQIMZn49VoduP2bjCEmM0vDIeW/aSFiMvMryLlv/ZugIiYzO8DB7r+pMmIyswMc 7P6btCMmMzvAwe6/6UNiMq8DxvtFe/IjCuiTMwoojTMKKI0zCqh/4/2icfURhX7Di8bVRxTQQmcU ejcuWlAfUUDVnFGooi4aVx9R6FMmXNWMQp8y4apmFPuUgeI93glVMqNQbRCqZEah95BM82cU+1no 8yIMwHgnDMCMQp8XYQBmFOplMs2fUehTJtP8GYU+ZTLNHxuZ5s8o8ilvhAGYUehTdkxb3x5exGTe c/r5qCMm856GzwcjMZn5z/wT/8tf6Z1H8Au985CKRz2MNSty5/kb/F7uLJnbVl6+7jvhctvm8/x/ lzz3xUj48Ci+8WZ9OY6cb0+gYjLz28Kx93x7jBWTmT0pgtfns7CYTC1aTyI4H6jFZGYHiPDE+VTu JRMHtOczvJjMrDNx2nseBMRkZp2J097zNCEmM78cnWXG344kYjKzaMUh5nmuEZOJRbuJE9HzcOQl Q2rQhtSgDalBG1KDNqQGbcRjNKOIurAh5WkjrpoZhf5dSK/akF61Ib1qQ3rVhvSqDelVG9KrNuJZ mVGoDpHKtRMPxPltI351mX87zAfrzXyw3swH602kks/vPTGZ+IyyiVDs+eUpJlP/mWY7meeHzTw/ bOb5YTPPD5t5fthEWvT8WyAmEw8ju0i6jUaMUzOK/FFuxMw0o8if10bMTDOK/FFuxMw0GjEzzSj0 eV28zeARhT7li7cZPKJQbVy8zeARhWrj4m0GjyhUGwgXahdvM3hEodq4eJvBIwrVBkKT2sXbDB5R qDYQBtUu3mZwj7p4m8EjCtXGxdsMHlGoNhAU1hAU1hAU1hAU1hAU1i7eZnCPQihZQyhZQyhZQyhZ QyhZQyhZQyhZQyhZQ+JhQ+JhQ+JhQ+JhQ+JhQ+JhIwuKZhSqDbKgaEah2iALimYUqg2yoGhGodog C4pmFDtxiAffJhoPzrOQmEw8XjbRK3AeqMRkosDSRK/AeSoTk4kCS3NW9H872onJzA5wVvR/Ox+K ycwOcFb0fztkisnMDjDR0eas6P92gBWTmR3grOj/dgoWk5kd4Kzo/3aUFpOZHeCs6P92HheTmR1g IsrNWdH/7awvJjM7wFnR/00wEJOZHWACwc0EgpsJBDcTCG4mENxMILiZ3EIzuYVmcgvN5BaayS00 k1to4ja1U4kRk5kdYBIVTdymdqo8XjJxm9qpCYnJzA6QKJSSZYt2lWW7R10Use5RF+XDe9RF+fAe dVE+PKP6VWfjPYq8h/2qs/EedVEkvkddFInvURdF4nsU+ZT7VYrwHoU+5av7l+9RqDaubm2+R6Ha uLp/+R6FPuWr+5fvUehTvrp/+RZ1df/yPQp9ylf3L9+j0Kd8df/yPQrVxlVk6R6FauMqsnSPQrVx FVm6R6HauIos3aNQbVxFlu5RqDauIkv3KFQbV5GlexSqjavI0j0K1cZVtOcehd7Dq2jPPQq9h1fR nnsUeg+voj33KNRfV9GeexTprybhyc8HdjGZc5x8Pt6LyZzj5PMwICYTP80u+f6eJwoxmaOBPM8f YjKxaLtErj8PMV4yaeHr88gjJjM7QNoe+zw3icnMopUWvj4PX2Iys2ilha/PE5yYzCxaibt6HgPF ZGYHSBDX8ywpJjM7QIK4ngdSMZnZARLE9TzVisnMDpAgrufRWExmdoAEcT3P114yCeJ6nsbFZOan KQFJzyO9mMz8NCUg6akLiMnM7zMJSHqKC2Iy8/vsqsvoHoVkqqsuo3sUkqmuuozuUUimuuoyukch meqqy+gehWTgqy6jexSqjasuo3sUqo2rLqN7FKqNqy6jexSqjasuo3sUqo2rLqN7FKqNqy6jexSq jasuo3sUqo2rLqN7FKqNq9eg36NQbVxdnH6PQrVxdRHVPQrVxtVFVPcoVBsI3ukI3ulXF1Hdo1Bt XF1EdY9CtYHwoo7wonF13fo9itTGQFDSQFDSQFDSQFDSQFDSQFDSQFDSQFDSQFDSQFDSQFDSQFDS uHqV/D0K1QZCmQZCmQZCmQZDmSRDyPNYJiYzFQjJEPI824nJTAVCMoQ8D4hiMlOBkAwhz1OmmMzs AMkQ8jyqeskkQ8jzYCsmMztAMoQ8T8diMrMDJEPI84gtJjM7QDKEPM/pYjKzAyRDyPOwLyYzOyDM DpBub3gKCWIyswOk7atPNUJMZnaAiTd2E2/s0vbVpwAiJjM7wKQ4u0lxdpPiHNJVEE8pRkwmdsAw kdBhIqHDREKHiYQOEwkdJhI6TCR0mEjoMJHQYSKhw0RCD9VKTGZ2gMmXDpMvHSZfOky+dCAr4EBW wIGsgANZAQeyAg5kBRzICjiQFXAgK+BAVsCBrIADWQEHsgIOZAUcyAo4kBVwICvgQFbAgayAA1kB B7ICDmQFHFe3l9+jUG1c3V5+j0K1gSyOA1kcB7I4DmRxHMjiOJDFcSCL40AWx4EsjgNZHAfiCgfi CgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfiCgfi CgfiCgfiCgfiCgfiCgfiCgfiCgfiCofp7xumv2+Y/r5h+vuG6e8bpr9vmP6+Yfr7hunvG6a/b5j+ vmH6+4bp7xumv2+Y/r5h+vuG6e8bpr9vmP6+Yfr7hunvG6a/b0hL2p8HcjGZ2QHSkvbnqV5MZnaA 6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kd JpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJncg X+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/uQL7cgXy5A/lyB/LlDuTLHciXO5AvN5AvN5AvN5Av N5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvN5AvNxBXGIgr DMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4 wkBcYSCuMBBXGIgrDMQVBuMKTU/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMT+QwPZHD9EQO0xM5 TE/kMD2Rw/REDtMTGaYnMkxPZJieyDA9kWF6IsP0RIbpiQzTExmmJzJMT2SYnsgwPZFheiLD9ESG 6YkM0xMZpicyTE9kmJ7IMD2RYTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5 YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5YTK5gXy5gXy5gXy5gXy5 gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5 gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gXy5gQjBQIRgIEIwECEYiBAMRAgG IgQDEYKBCMFAhGAgQjAQIRiIEAxECAYiBBMRgokIwUSEYCJCMBEhmIgQTEQIJiIEExGCiQjBRIRg MkLQdDeG6W4M090YprsxTHdjmO7GMN2NYbobw3Q3huluDNPdGKa7MUx3Y5juxjDdjWG6G8N0N4bp bgzT3RimuzFMd2OY7sYw3Y1huhvDdDeG6W4M090YprsxTHdjmO7GMN2NYbobw3Q3huluDNPdGKa7 MUwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNkwgNk0gNk0gNk0gNk0g Nk0gNk0gNk0gNk0gNk0gNk0gNk0gNk0gNpGpKJHRJxGokAhUSAQqJAIVEoEKiUCFRKBCIlAhEaiQ CFRIBCokAhUSgQqJQIVEoEIiUCERqJAIVEgEKiQCFRKBColAhUSgQiJQIRGokAhUSAQqJAIVEoEK iUCFRKBCIlAhEaiQCFRIBCokAhUSLUBKhDckwhsS4Q2J8IZEeEMivCER3pAIb0iENyTCGxLhDYnw hkR4QyK8IQneMI+/4FOeUeBTnlHgU55R4FOeUeBTnlHgU55R7MRhnqJNaDtN1CBN1CBN1CBN1CBN 1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN 1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CBN1CDNRV5pcgtpcgtpcgtpcgtpcgtp cgtpcgtpcgtpcgtpcgtpcgtpcgtpcgtpcgspcgunbiMm84r2VHnEZF7RnpqQmMwr2lNB8pKR0c2M QuIcGd3MKCTOkdHNjALi3IwCEuyMQhIsGd3MKCTcktHNjEK1QUY3MwrVBhndzChUG2R0M6NQbZDR zYxCtUFGNzMK1QYZ3cwoVBtkdDOjUG2Q0c2MIrWxoRHHRoYVM4r8uzbiqsyNuCpnFKn5jdy7MKNI 9W7kBoUZRap3IzcozCj0KZMbFHIjNyjMKPQpkxsUZhT5ZtvIDQozCtUGuUFhRqHaIDcozChUG+QG hRmFaoPcoDCjUG2QGxRmFHtaNs90ohh9nhnEZOaZThSjz4OHmMwTIs5jipdMFKPPQ42YzOwAUYw+ T0ZiMrMDRDH6PF6JycwOEMXo84wmJjM7QBSjz4OemMzsAFGMPk+LYjKzA0Qx+jxyask2U1jdTC10 E21X53HWSybars7Dr5hM/NbYxKsDzhO0mExs9E28OuA8hovJzKIVrw44z/JiMrNoxasDTkFATGZ2 gHh1wKkqiMnMDhCvDjilCTGZ2QHi1QGnviEmMztAvDogdyT+7Ej82ZH4s5MrLWcUkd12cjnljCKy 204up5xR6J0nPvIZRWS3nVxOOaPQp0w86zMK1QbxrM8oVBvEsz6jUG0Qz/qMQrVBPOszCtUG8azP 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 zfQ2bKa3YTOprc2ktjaT2tpM0Goz2ajNZKM2E2faTJxpM3GmzcSZNhNn2kycaTNxps3EmTYTZ9pM nGkTr9Y4ZRAxmdkBJrW1mdTWZlJbm0ltbeLVGqdOoyWraPBT0eCnosFPRYOfigY/FQ1+Khr8VDT4 qWjwU9Hgp6LBT0WDn4oGPxUNfipaM1fJmrkZhWoDDZkqGjJVZJOtaDRVkU22ooFWRQOtimyyFY3B KhqDVTQGq2gMVtEYrKIxWEVjsIrGYBWNwSoag1U0BqtoDFbRGKyiMVhFY7CKxmAVjcEqGoNVNAar 5JLmGYVqA1mNK7IaV3JJ84xCtYEMyhUZlCsyKFdkUK7IoFyRQbkig3JFBuWKDMoVXb/R0PUbDV2/ 0dD1Gw0Zr6s5Oqnm6KSao5Nqjk6qOTqp5uikmqOTao5Oqjk6qebopJqjk2qOTqo5Oqnm6KSaa6Gq uRaqmkOdag51qjnUqaYVv5oTompa8as5bqrmuKmaVvxqzq6qObuq5uyqmrOras6uqjm7qubsqpqz q2rOrqo5u6rm7Kqas6tqzq6qObuq5uyqmrOras6uqjm7qursSrwW/pRixGRmB5iLFap4Lfwp83jJ zC0N1dzSUM0tDdXc0lDNLQ3V3NJQzS0N1dzSUM0tDdW8KqiZVwU186qgZl4V1MzNFg0tLmxocWFD awEbWgvY0FrAhtYCNnRha0NrARtaC9jQha0NLRNsaIVCQysUGlqh0NAKhYZWKDS0QqGhFQoNrVBo aIVCQysUGlqh0NAKhYZWKDS0QqGhFQoNrVBoaIVCQysUGlqh0NAKhYZIuoZIuoZIuoZIuoZIuoZI uoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZIuoZI uoZIuoZIuoZIumbu0mvmLr1mLplr5pK5Zi6Za+aSuWbejdnMJXPNXDLXzLsxm7mxrpn7I5q5P6KZ +yOauT+imfsjmrk/opn7I5q5P6KZ+yOauT+imfsjmrk/opn7I5q5P6KZ+yOauT+imfsjmrk/opn7 I5q5P6KZEGQzIchmQpDNhCCbCUE2E4JsJgTZTAiymRBkMyHIZkKQzYQgmwlBNhOCbCYE2UwIspkQ ZDMhyGZCkM2EIJsJQTYTgmwmBNlMCLKZEGQzIchmQpBNhCBLJ7LvjALSXulE9p1RQNqbUUDam1FA 2ptRQNqbUUDam1FA2ptRQNqbUag2iOxbOpF9ZxSqDSL7zihUG0T2nVGoNojsO6NQbRAD9YxCtUEM 1DMK1QYxUM8oVBvEQD2jUG0QA/WMQrVBDNQzCtUGMVDPKFQbxEA9o1BtEAP1jEK1QQzUMwrVBjFQ zyhUG8RAPaNQbRAD9YxCtUEM1DMK1QYxUM8oVBvEQD2jSG0MYqCeUaQ2BjFQzyhSG4MAoDOK1MZ4 J7UxyH3XM4rUxiD3XZdBwNYZhb43RA3uPJZ5yUQN7jzEick8BeI88onJPAXiPCCKyTwF4jxOisnM DhA1uPNMKiYzO0DU4M6DrZjM7ABRgztPx2IyswNEI/J5xPaSiUbk80AuJjM7QDQin6d6MZnZAaIR +ZQGxGRmB4hG5FNfEJOZHSAakU+RQkxmdoBoRD6VDjGZ2QGiEfmUS7xkohH5FFfEZGYHiEbkU6ER k5kdIBqRT5lHTGZ2gGhEPrUiMZnYAUM0Ip+Ck5hM7IAh2gJO1UpMJnbAoXGJycwOEK0Up1AmJkPa KjGGzyikrRI7+YxC2iqxk88opK0SO3kZxE4+o5DuTuzkMwrVBrGTzyhUG8ROPqNQbRA7+YxCtUHs 5DMK1Qaxk88oVBvETj6jUG0QO/mMQrVB7OQzCtUGsZPPKFQbxE4+o1BtEDv5jEK1QezkMwrVBuIK B+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IK B+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKh2hlP49lYjJTgRB98efZTkxmKhCiL/48IHrJRF/8eZwU k5kdIPrizzOpmMzsANEXfx5sxWRmB4i++PN0LCYzO0D0xZ9HbDGZ2QGiL/48p4vJzA4QffHnYd9L JvriT2lATGZ2gOiLP/UFMZnZAaIv/hQpxGRmB5hM7jCZ3GEyucNkcofJ5A6TyR1/wuR++vXT2z++ fP3XjHj7+vmfv/306et3wW8//PTpx3//8vbbL5///va3n7788K+3fbSM+VdvPqz98OXr8VN//Pmf bz9//q9fP//86y9Hxu9/hePH/nyG//K2tff5pP3ydY/f9Ovn41/265e391vkI/e2GsX0JPFdN7vb 5I2HyRsPkzceJm88TN54mLzxMHnjYfLGw+SNh8kbD5M3HiZvPEzeeJi88TB542HyxsPkjYfJGw/k OR7IczyQ53ggz/FAnuOBPMcDeY4H8hwP5DkeyHM8kOd4IM/xQJ7jgTzHA3mOB/IcD+Q5HshzPJDn eCDP8UCe44E8xwN5jgfyHAfyHAfyHAfyHAfyHAfyHAfyHAfyHAfyHAfyHAfyHAfyHAfyHAdiJgMx k4GYyUDMZCBmMhAzGYiZDMRMBmImAzGTgZjJQMxkIGYyEDMZiJkMxEwGYiYDMZOBmMlAzGQgZjIQ MxmImQzETAZiJgMxk4GYyWDMpOn3HKbfc5h+z2H6PYfp9xym33OYfs9h+j2H6fccpt9zmH7PYfo9 h+n3HKbfc5h+z2H6PYfp9xym33OYfs9h+j2H6fccpt9zmH7PYfo9w/R7hun3DNPvGabfM0y/Z5h+ zzD9nmH6PcP0e4bp9wzT7xmm3zP+hDf+ywH8DH4xgB+9HK7s+Ti/NH8/foPfz99Lbvv+8mVg/P46 iok14ntu9rZJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJUodJ UodJUodJUodJUodJUodJUodJUodJUodJUgdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdy UwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdyUwdy UwdyUwdyUwdyUwdyUwdyUwdyUwciJgMRk4GIyUDEZCBiMhAxGYiYDERMBiImAxGTgYjJQMRkIGIy EDEZiJgMREwGIiYDEZOBiMlAxGQgYjIQMRmImAxETCYiJhMRk4mIyWTEpOlkDdPJGqaTNUwna5hO 1jCdrGE6WcN0sobpZA3TyRqmkzVMJ2uYTtYwnaxhOlnDvF0mTLdnmG7PMN2eYbo9w3R7hun2DNPt GabbM0y3Z5huzzDdnmG6PcN0e4bp9gzT7Rmm2zNMt2eYbs8w3Z5huj3DpI3DpI3DpI3DpI3DpI3D pI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3DpI3T pI3TpI3TpI3TpI0TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4T OY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4TOY4T OY4TOY4TcYWJuMJEXGEirjARV5iIK0zEFSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjC RFxhIq4wEVeYiCtMxBUm4goTcYWJuMJEXGEirjBNt2eabs803Z5puj3TdHum6fZM0+2Zptszzdtl 0vREpumJTNMTmaYnMk1PZJqeyDQ9kWl6ItP0RKbpiUzTE5mmJzJNT2Sansg0PZFpeiLT9ESm6YlM 0xOZpicyTU9kmp7IND2RaXoi0/REpumJTNMTmSaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaT myaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTmyaTm8iX m8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iX m8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8iXm8SXW9+JL3dGgdqYUaA2ZhSojRkFamNG gdqYUaA2ZhSojRkFamNGodogXOGMQrVBuMIZhWqDcIUzCtUG4QpnFKoNwhXOKFQbhCucUag2CFc4 o1BtEK5wRqHaIFzhjEK1QbjCGYVqg3CFM4oxIKYCYXoi0/REpumJTNMTmaYnMk1PZJqeyDQ9kWl6 ItP0RKbpiUzTE5mmJzJNT2Sansg0PZFpeiLT9ESm6YlM0xOZpicyTU9kmp7IND2RaXoi0/REpumJ TNMTmaYnMk1PZIqeyFNfEJN5HXCqEWIyrwNO7UJM5nXAqXSIybwOOHURMZnZASKTe4orYjKzA0Qm 91RoxGRmB4hM7inziMnMDhCZ3FMrEpOZHSAyuafgJCYzO0Bkck/VSkxmdoDI5J7Sl5dMZHJPoUxM hrRV4sudUUhbJb7cGYW0VeLLnVFIWyW+3PpOfLkzCunuxJc7o1BtEF/ujEK1QXy5MwrVBvHlzihU G8SXO6NQbRBf7oxCtUF8uTMK1Qbx5c4oVBvElzujUG0QX+6MQrVBfLkzCtUG8eXOKFQbxJc7o1Bt EK5wRqHaIFzhjEK1QbjCGYVqg3CFMwrVBuEKZxSqDcIVzihUG4QrnFGoNghXOKNQbRCucEah2iBc 4YxCtUG4whmFaoNwhTMK1QbhCmcUqg3CFc4odk4xFQjRE3me1sRkpgIheiLPI5+YzFQgRE/keW4U k5kKhOiJPA+fYjKzA0RP5HmCFZOZHSB6Is9jsJdM9ESeh2YxmdkBoifyPHmLycwOED2R5/FdTGZ2 gOiJPDUAMZnZAaIn8hQSxGRmB4ieyFONEJOZHSAyuaek4SUTmdxTABGTmR0gMrmniiImMztAZHJP KUZMZnaAyOSeeo6YzOwAkck9RSExmdkBIpN7KktiMrMDRCb3lKe8ZCKTe4pZYjKzA0Qm91TExGRm BxBf7oxC2irx5c4ooq1uyJe7IV/uhny5G/LlbsiXuyFf7oZ8uRvy5W7Il7shX+6GfLkb8uVuyJe7 IV/uhny5G/LlbsiXuyFf7oZ8uRvy5W7Il7shX+6GfLkb8uVuyJe7IV/uhny5G/LlbsiXuyFf7oZ8 uRvx5c4oVBuIK9wQV7ghrnBDXOGGuMINcYUb4go3xBVuiCvcEFe4Ia5wQ1zhhrjCDXGFG+IKN8QV bogr3BBXuCGucENc4Ya4wg1xhRviCjfEFW6IK9wQV7gxrlD0RJ7HMjGZqUCYnsjN9ERupidyMz2R m+mJ3ExP5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ3ExP5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ 3ExP5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ3ExP5GZ6IjfTE7mZnsjNZHI3k8ndTCZ3M5nczWRy N5PJ3UwmdzOZ3M1kcjeTyd1MJnczmdzNZHI3k8ndTCZ3M5nczWRyN5PJ3UwmdzOZ3M1kcjeTyd1M JnczmdzNZHI3k8ndTCZ3M5ncDflyN+TL3ZAvd0O+3A35cjfky92QL3dDvtwN+XI35MvdkC93Q77c DflyN+TL3ZAvd0O+3A35cjfky92QL3dDvtwN+XI35MvdkC93Q77cDflyN+TL3ZAvd0O+3A35cjfk y92QL3dDvtwN+XI35MvdkC93Q77cDXGFG+IKN8QVbogr3BFXuCOucEdc4Y64wh1xhTviCnfEFe6I K9wRV7gjrnBHXOGOuMIdcYU74gp3xBXuiCvcEVe4I65wR1zhjrjCHXGFO+IKd8QV7owrND2Rm+mJ 3ExP5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ3ExP5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ3ExP 5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ3ExP5GZ6IjfTE7mZnsjN9ERupidyMz2Rm+mJ3ExP5GZ6 IjeTyd1MJnczmdzNZHJ3k8ndTSZ3N5nc3WRyd5PJ3U0mdzeZ3N1kcneTyd1NJnc3mdzdZHJ3k8nd TSZ3N5nc3WRyd5PJ3U0mdzeZ3N1kcneTyd1NJnc3mdzdZHJ35MvdkS93R77cHflyd+TL3ZEvd0e+ 3B35cnfky92RL3dHvtwd+XJ35MvdkS93R77cHflyd+TL3ZEvd0e+3B35cnfky92RL3dHvtwd+XJ3 5MvdkS93R77cHflyd+TL3ZEvd0e+3B35cnfky92RL3dHvtwd+XJ3xBXuiCvcEVe4I65wR1zhjrjC HXGFO+IKd8QV7ogr3BFXuCOucEdc4Y64wh1xhTviCnfEFe6IK9wRV7gjrnBHXOGOuMIdcYU74gp3 xBXuiCvcEVe4I65wNz2Ru+mJ3E1P5G56InfTE7mbnsjd9ETupidyNz2Ru+mJ3E1P5G56InfTE7mb nsjd9ETupidyNz2Ru+mJ3E1P5G56InfTE7mbnsjd9ETupidyNz2Ru+mJ3E1P5G56InfTE7mbnsjd 9ETupidyNz2Ru+mJ3E1P5G56IneTyd1NJnc3mdzdZHJ3k8ndTSZ3N5nc3WRyd5PJ3U0mdzeZ3N1k cneTyd1NJnc3mdzdZHJ3k8ndTSZ3N5nc3WRyd5PJ3U0mdzeZ3N1kcneTyd1NJnc3mdzdZHJ35Mvd kS93R77cHflyd+TL3ZEvd0e+3B35cnfky92RL3dHvtwd+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5 BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL4u8K 4u8K4u8KIukKIukKIukKIukKIukKIukKIukKIukKIukKI+lMp9duOr120+m1m06v3XR67abTazed Xrvp9NpNp9duOr120+m1m06vYjq9iun0KqbTq5hOr2I6vYrp9Cqm06uYTq9iOr2K6fQqptOrmE6v Yjq9iun0KqbTq5hOr2I6vcqfOL0+/frp7R9fvv5rRrx9/fzP33769PW74Lcffvr0479/efvtl89/ f/vbT19++Nfb/Ls+Dw69jPIfP3z5evzUH3/+59vPn//r188///rLkfH7X+H4sT+f4b+8zf/S8v3l 6x6/6dfPx7/s1y9v77fIR+5tNYqd8cR33exu08VWTBdbMV1sxXSxFZMILCYRWEwisJgQXzEhvmJC fMWE+IoJ8RUT4ismxFdMiK+YEF8xIb6CMPCCMPCCMPCCMPCCxlgFjbEKGmMVNMYqaIxV0BiroDFW QWOsgsZYBY2xChpjFTTGqmiMVdEYq6IxVkVjrIrGWBWNsSoaY1U0xqpojFXRQKqigVRFA6mKBlIV DaQqGkhVNJCqaCBV0UCqooFURQOpipYZVDSCqWgEU9EIpqIRTEUjmIpGMBWNYCoawVQ0TKloLUFF awkqWktQ0VqCitYSVLSWoJhoWDHRsGKiYcVEw4o5xCvmEK+YQ7xiDvGKOcQr5hCvmEO8Yg7xijnE K+YQr5hDvGIO8ao5xKvmEK+aQ7xqDvGqOcSr5hCvmkO8ag7xqjnEq+bcrZpzt2rO3ao5d6vm3K2a c7dqzt2quWGxmrOpas6mqjmbquZ+g2qORqo5GqnmaKSao5FqjkaqORqp5mikmqORak4zqrmSoJor Caq5kqCaKwmquZKgmisJGlI6G1I6G1I6G1I6G9IsG9IsG9IsG9IsG4LoG4LoG4LoG1rO29Ca3YbW 7DYE7DcE7DekMTekFjekFjekFjekFjekFjekFjekFjcE7DekMTekMTekMTekMTekMTekMTekMTe0 +rah1bcNrb5taPVtQ6tvG1p929Dq24ZW3za0+rah1bcNrb5taPVtQ6tvG1p929Dq24ZW3za0+rah 1bcNrb5taPVtQ6tvG1p929Dq24ZW3za0+rah1bcNrb5taPVtM8XCZoqFzRQLmykWNlPfa6a+10x9 r5n6XjPZ82ay581kz5u5wbeZS3ebuXS3mVR8M6n4ZurIzZR+myn9NlP6bab020zpt5nSbzOl32ZS 8c3UkZupIzdTR26mjtxMHbmZOnJTdWRztW0zV9s2c7VtM1fbNnO1bTNX2zZztW0zV9s2c7VtM1fb NnO1bTNX2zZztW0zV9s2c7VtM1fbNnO1bTNX2zZztW0zV9s2c7VtM1fbNnO1bTNX2zZztW0zV9s2 c7VtM1fbNnQNUkPXIDV0DVJD1yA1dA1SQ9cgNXQNUkPXIDXkf23I/9qQ/7Uh/2tD/teG/K8N+V8b 8r825H9tyP/akP+1If9rQ/7XhvyvDflfG/K/duR/7cj/2pH/tSP/a0f+1478rx35Xzvyv3bkf+1o jWtHrtmOXLMdsWQdsWQdsWQdsWQduWY7ItA6ItA6ItA6ItA6ItA6ItA6ItA6ItA6uh6+I26tI26t o/W0HdFuHdFuHdFuHTmqO6LdOqLdOqLdOqLdOqLdOqPdzEtCmnlJSDMvCWnmJSHNvCSkmZeENPOS kGZeEtJMJ3gzneDNdII30wneTCd4M53gzXSCN9MJ3kwneDOd4M10gjfTCd5MJ3gzneDNdII30wne TSd4N53g3XSCd9MJ3k0neDed4N10gnfTCd5NJ3g31zl301beTVt5N0nRbpKi3SRFu0mKdtNW3k3s tJvYaTex025ip93ETruJnXYTO+0mdnoINmIyswNMhrWba6K7CcR2E4jtJhDbzcUK3QRiuwnEdhOI 7SYQ200gtptAbEcGz45Mlx2ZLjsyXXZkuuzIdNmR6bIj02VHpsuOTJcdmS47Ml12ZLrsyHTZkemy I9NlR6bLjkyXHZkuOzJddmS67Mh02ZHpsiPTZUemy45Mlx2ZLjsyXXZkuuzIdNmR6bIj02VHpsuO TJcdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYdgXYd gXYdgXYdgXYdgXYdgXYDIXMDIXMDIXODIXOm3a+bprpumuq6aarrpqmum6a6bprqummq66aprpum um6a6rppquumqa6bprpumuq6aarrpqmum6a6bprqummq66aprpumum6a6rppquumqa6bprpumuq6 aarrpqmum6a6bprqummq66aprpumum6ioN1EQbuJgnYTBe0mCtpNFLSbKGg3UdBuoqDdREG7iYJ2 EwXtJgraTRS0myhoN1HQbqKg3URBu4mCdhMF7SYK2k0UtJso6DDpzWHSm8OkN4dJbw7kgBnIATOQ A2YgB8xAOMBA+54H2vc8EHowEHowEHowEHowEHowEHowEHowEHowEHowEHowEHowEHowEHowEHow EHowEHowEHowEHowEHowEHowEHowEEQwEEQwEEQwEEQwEEQwEEQwEEQwEEQwEEQwEEQwEEQwEA4w EA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4wEA4w EA4wGA6A9u4ME78eJn49TPx6mPj1MAGFYe4jHuY+4mGiE8NEJ4aJTgwTnRgmOjFMdGKY6MQw0Ylh ohPDRCeGiU4ME50YJjoxTHRimOjEMNGJYaITw0QnholODBOdGCY6MUzaYZi0wzBph2HSDsOkHYZJ OwyTdhgm7TBM2mGYtMMwaYdhAgrDBBSGCSgME1AYJqAwTEBhmIDCMAGFYQIKwwQUhgkoDBNQGCag MExAYZiAwjABhWECCsMEFIYJKAwTUBgmoDBUQMHcVRXIfhLIfhJoY3Ogjc2BNjYH2tgcaGNzoI3N gTY2B9rYHGhjc6CNzYE2Ngfa2BxoY3Ogjc2BNjYH2tgcaGNzoI3NgTY2B9rYHGhjc6CNzYE2Ngfa 2BxoY3Ogjc2BNjYH2tgcaGNzFFQbaM9zoD3PgXi1QLxaIF4tEK8WiFcLxKsF4tUCkWeByLNA5Fkg 8iwQeRaIIQvEkAViyAIxZIEYskAMWSCGLBBDFoghC8SQBWLIAjFkgRiyMCnmMCnmMHfQhrmDNswd tGHuoA1zB22YO2jD3EEb5g7aMHfQhrmDNswdtGHuoA1zB22YO2jD3EEb5g7aMHfQhrmDNswdtGHu oA1zB22YO2jD3EEb5g7aMHfQhrmDNswdtGHuoA1zB+1xdBaTmR1gLrQNE4IME4IME4IME4IME4IM E4IME4IMk1sMk1sMk1sMk1sMk1sMEzUMEzUMEzUMEzUMEzUMEzUMEzUMEzUMEzUMEzUMEzUMEzUM EzUMZLwIZLwIZLxINJxONJxONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBO NDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBONDBOtBYl0Zg50Zg5 0Zg50Zg50Zg50cA40YKTRGPmRGPmRGPmRAPjRKtKEo2ZE42ZE42ZE42ZEw2MEw2MEw2Mkw2MTWI1 TGI1TGI1zZFvmiPfNAeraQ5W0xyspjlYTXOwmuZgNc3BapqD1TQHq2kOVtMcrKY5WE1zsJrmYDXN wWqag9U0B6tpDlbTHKymOVhNc7Ca5mA1zcFqmoPVNAeraQ5W0xyspjlYTXOwmuaqmjSntGlOadOc 0qY5pU1zSpvmYDXN7TJpTmnTnNKmOaVNc7Ca5kKYNKe0aU5p05zSpjmlTXOwmuZgNc3BaoqD1fZO tum1d7JNb0YB6WhGAeloRgGBcEYB6WhGAeloRpF3fiMu4BlF3o2NOHNnFHkPNzJonVHoPSSD1hmF 3nkyMp1RpOY3MjKdUehTJiPTGYU+ZTIybRsZmc4oIKXPKFQbZGQ6o1BtkJHpjEK1QUamMwrVBhmZ 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 ICQwEBIYCAkMhAQGQgIDIYHNvOE2U4bZzOtyM2WYzbx7N/Pu3cy7d3Pv3mJbppnKyWYqJ5upnGym crKZyslmKiebqZxspnKymcrJZionm6mcbKZyspnKyWYqJ5upnGymcrKZyslmKiebqZxspnKymcrJ Zionm6mcbKZyspnKyWYqJ5upnGymcrKZyslmKifDFDuGKXYMU+wYJg4cJg4cJg4cJg4cJg4cJg4c Jg4cJg4cJg4cJg4cJg4cJg4cJg4cJg4cJg4cJg4cJg4cJg4cJg4cJg7ckQyqIxlURzKojmRQHcmg OpJBdSSD6kgG1RFp0RFp0RFp0RFp0RFp0RFp0RFp0RFp0ZFRekd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8 Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8Rkd8 Rkd8Rkd8Rkd8Rkd8Rkd8xkBG6QNRHQNRHQNRHQNRHQNRHQNRHQNRHQNRHQNRHQNRHQNRHQNRHQNR HQNRHQNRHd3UW3RTb9FNvUU39Rbd1Ft0U2/RTb1FN/UW3aRRukmjdJNG6SaN0k0apZs0SjdplG7S KN00Be8m2tJNtKWbaEs30ZZuoi3dRFu6ibZ0E23pJtrSTbSlm2hLN9GWbqIt3URbuom2dBNt6Sba 0k20pZtoSzfRlm6iLd1EW7qJtnQTbekm2tJNtKWbaEs30ZZuoi3dRFu6ibYM0xR8mJzMMDmZYXIy w+RkhsnJDJOTGSYnM0xOZpiczDA5mWFyMsPkZIbJyQyTkxkmJzOQKmogVdRAqqiBVFEDqaIGUkUN pIoaSBU1kFH6QEbpAxmlD2SUPpBR+kBG6QMZpQ9klD6QUfpARukDGaUPZJQ+kFH6QEbpAxmlD2SU PpBR+kBG6QMZpQ9klD6QUfpARukDGaUPZJQ+kFH6QEbpo6PaQPbqA3GFA3GFA3GFA3GFA3GFA3GF A3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GFA3GF A3GFA3GFA3GFw9QpDFOnMEydwjB1CsPUKQxTpzBMncIwdQrDtC0fpm35MG3Lh2lbPkzb8mHalg/T tnyYtuXDtC0fpm35MG3Lh2lbPkzb8mHalg/TtnyYtuXDtC0fpm35MG3Lh2lbPkzb8mHalg/TtnyY tuXDtC0fpm350Y0Qk5knwGRyh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneY TO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO1FfcKK+4ER9wYn6 ghPpjSfSG0+kN55IbzyR3ngivfFEeuOJ9MYT6Y0n0htPpDeeSG88kd54Ir3xRHrjifTGE+mNJ9Ib T6Q3nkhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnEhvnIiX TMRLJiIfE5GPicjHRORjIvIxEfmYiHxMRD4mIh8TkY+JyMdE5GMi8jERw5iIYUzEMCZiGBMxjIkY xmneCKd5I5zmjXCqN0JTpTlNleY0VZrTVGlOU6U5TZXmNFWa01RpTlOlOU2V5jRVmtNUaU5TpTlN leY0VZrTVGlOU6U5TZXmNFWa01RppqnSTFOlmaZKM02VZpoqzTRVmmmqNNNUaaap0kxTpZmmSjNN lWaaKs00VZppqjTTVGmmSQmnSQmnCfamCfamCfamCfamCfamCfamCfamCfamCfamCfamCfamCfam CfamyeKmyeKmyeKmyeKmyeKmyOLu38GgHbWjQNNx/4oGTccdBVrLOwo0HXcUaDruKNB03FGg6bij QNNxR6GnTCTQOwo0iXcUespEzLyj0PMiYuYdhZ4XkSXvL5roeRFZ8o5Cz4vIkncUespElryj0FMm suQdhU4lkSXvewOqDSJL3lGoNogseUeh2iCy5B2FaoPIkncUqg0iS97XQFQbRJa8o1BtEFnyjkK1 QUDCHYWeMgEJdxR6ygQk3FHoeREkcEeh50WQwB2FnjJBAncUesoE7ttR6FSK9+DzcuAlE+/B51VC TObdg8+Lh5jMuwef1xQxmXcPPi81XjJRRnpegcRkZtGKys/zHiUmM+tMVH6elzEvmSjWPK9uYjKz zkSx5nn/E5OZRSuKNc9LpJjM/HAUxZrnTVRMZp4AUax5XmfFZOYJEMWa551YTGaeAFGseV6svWSi WPO8hovJzBMgijXPu7yYzCxakaY9GwJiMrNoRZr27CqIycw6EwHYszUhJjOLVgRgz/6Gl0xkVs9u iJYsiOJnR5GWURCH9B1FGoNBdEI7ijSaguiEdhRpJwbRCe0o0k4MohPaUag20Mg+0PA90PA90PA9 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 OVNY5kxhmTOFZc4UljlTWOZMYZkzhWXOFJY5U1jmTGGZM4WlzhTMTTDL3ASzzE0wS9wEc/ZFxGTe CTi7KGIy7wScPRcxmXcCzg6NmMw7AWc/R0xmngDR6+1sConJzBMger2dnSUxmXkCRK+3sz0lJjNP gOj1dva4xGTmCRC93s5GmZgM9VaJA/qOQr1V4oC+o1BvlTigr0figL6jUG+VmFXsKNR3J2YVOwrV BjGr2FGoNohZxY5CtUHMKnYUqg1iVrGjUG0Qs4odhWqDmFXsKFQbxOJiR6HaIBYXOwrVBrG42FGo NojFxY5CtUEsLnYUqg1icbGjUG0QrnBHodogXOGOQrVBuMIdhWqDcIU7CtUG4Qp3FKoNwhXuKFQb hCvcUag2CFe4o1BtEK5wR6HaIFzhjkK1QbjCHYVqg3CFOwrVBuEKdxSqDcIV7ih2TzE7EKLX9nlb E5OZHQjRa/u88nnJRK/t84IoJjM7EKI1x3nLFJOZJ0C05jivqmIy8wSI1hznfVdMZp4A0ZrjvDSL ycwTIFpznDdvMZl5AkSfj/P67iUTfT7Oy76YzDwBos/H2TEQk5knQPT5ONsOYjLzBIg+H2fvQkxm ngCRyT0bIGIy8wSITO7ZRRGTmSdAZHLPVoyXTGRyz8aNmMw8ASKTe3Z/xGTmCRCZ3LOFJCYzT4DI 5J59KDGZeQJEJvdsZonJzBMgMrlnR0xMJp6AgnRNBemaCtI1FaJr2lGk31kQl1EQl1EQl1EQl1EQ l1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQ l1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQ l1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1EQl1FM5r6YzH0x mftiMvfFZD6KyXwUk/koJvNRTOajmMxHMZmPYjIfxWQ+isl8FJP5KCbzUUzmo5jMRzGZj2IyH8Vk PorJfBST+Sgm81FM5qOYzEcxmY9iMh/FZD6KyXwUk/koJvNRTOajmMxHMZmPYjIfxWQ+isl8FJP5 KCbzUUzmo5jMRzGZj2IyH8VkPorJfBST+Sgm81FM5qOYzEcxmY9iMh/FZD6KyXwUk/koJvNRTOaj mMxHMZmPYjIfxWQ+isl8FJP5KCbzUZCuqSBdU0G6poJ0TYX4pe8o1Fslfuk7CvVWiV/6jkK9VeKX vqNQbRC/9B2FaoP4pe8oUhsV+aVX5JdekV96RX7pFfmlV+SXXpFfekV+6RX5pVfkl16RX3pFfukV +aVX5JdekV96RX7pFfmlV+SXXpFfekV+6RVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVx hRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhZVxhSZzX0zm vpjMfVGZe9EH+7zyeclEH+zzgigmMzsQog/2ecsUk5knQPTBPq+qYjLzBJg+2NX0wa6mD3Y1fbCr 6YNdTR/savpgV9MHu5o+2NX0wa6mD3Y1fbCr6YNdTR/savpgV9MHu5o+2NX0wa6mD3Y1fbCr6YNd TSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVkcqvJ5FaTya0mk1tNJreaTG41 mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK5FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0uRXp civS5Vaky61Il1uRLrcihW1FCtuKFLYVKWwrUthWpLCtSGFbkcK2IoVtRQrbihS2FSlsK1LYVqSw rUhhW5FWtiKtbEVa2Yq0shWpXiui9iqi9iri7yri7yri7yri7yri7yri7yri7yri7yri7yri7yri 7yri7yri7xri7xri7xri7xri7xri7xri7xri7xri7xri7xri7xri7xrj70ztYDW1g9XUDlZTO1hN 7WA1tYPV1A5WUztYTe1gNbWD1dQOVlM7WE3tYDXlftWU+1VT7ldNuV815X7VlPtVU+5XTblfNeV+ 1ZT7VVPuV025XzXlftWU+1VT7ldNhV41FXrVVOhVU6FXTVFdNaHOakKd1eQwq8lhVpPDrCaHWU0O s5ocZjU5zGpymNXkMKvJYVaTw6wmh1lNDrOZHGYzOcxmcpjN5DCbyWE2k8NsJofZTA6zmRxmMznM ZnKYzeQwO+rdddS766h311HvrqPeXUe9u456dx317jrSznakne1IO9uRdrYj7WxH2tmOtLMdaWc7 0s52pJ3tSDvbkXa2I+1sR9rZjrSzHWlnO9LOdqSd7Ug725F2tiPtbEfa2Y60sx1pZzvSznakne1I O9uRdrYj7WxH2tmOtLMdaWc70s52pJ3tSDvbkXa2I/avI/avI/avI/avI/avI/avI/avI/avI/av I/avI/avI/avI/avo50cHRGDHRGDHRGDHRGDHRGDHRGD3bznd/Oe3817fjfv+d2853fznt/Ne35X 7/mm3rKbestu6i27qbfspt6ym3rLbuotu6m37Kbespt6y27qLbupt+ym3rKbestu6i27qbfspt6y m3rLbuotu6m37Kbespt6y27qLbupt+ym3rKbestu6i27qbfspt6ym3rLbuotu6m37Kbespt6y27q Lbupt+wmx9xNjrmbHHM3OeZucszd5Ji7yTF3k2PuJsfcTY65mxxzNznmbnLM3dyB0k0ouptQdDeh 6G5C0d2EorsJRXekuO1IcduR4rYjxW1HituOFLcdKW470s52tJ22I8VtR4rbjhS3HSluO9pO25FO tyOdbkc63Y62a3Sk7u1I3duRurcjnW5HOt2OdLodKW470s52pJ3tSDs7kAp2IBXsQCrYgUi6gUi6 gUi6gUi6gUi6gUi6gUi6gUi6gZi4gZi4gZi4gZi4gZi4gZi4gZi4gZi4gZi4gZi4gZi4gZi4gZi4 gZi4gZi4gZi4gZi4gZi4wZg4U1DZTUFlNwWV3RRUdlNQ2U1BZTcFld3UQHZz5WE3BZXdFFR2U1DZ TUFlN1cedlOd2U11ZjfVmd1cudFNqWc3pZ7dlHp2U53ZTXVmN9WZ3RRUdlMD2U0NZDc1kMOULQ5T tjhM2eIwccZh4ozDxBmHiTMOE2ccJs44TJxxmDjjMAnEYRKIwyQQh0kgDpNAHCaBOEwCcZgE4jAJ xGESiMMkEIdJIA6TQBwmgThMAnGYBOIwCcRhEojDJBATdcgSdcgSdcgSdcgSdcgSdcgSdcgSdcgS qUYTqUYTqUYTqUYTqUYTqUYTqUYTqUYTqUYTqUYTqUYTqUYT6T8TKTkTaTLT/A2a5m/QNH+Dpvkb NM3foGn+Bk3zN2iqv0FNhj9Nhj9Nhj9Nhj9Nhj9Nhj9Nhj9Nhj9Nhj9Nhj9Nhj9Nhj9N7D5NUj4l uH2uGatcHd8/R138uvAcdfHrwnPUxa+Sz1EXv2Q8R138KvkcdfGryXPUxa+Sz1EXv9Dcoq5eM56j Ln6VfI5CtXH1mvEchWrj6jXjOQrVxtVrxnMUqo2r14xb1NVrxnMUqo2r14znKFQbV81pnqNQbVw1 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 mXkCPF3vrc0jJjNPgKfrvfWKxGTmCfDg+1vDSUxmngAPvr91rcRk5gnw4Ptb68tL5u3auTXKxGSo twp01UcU6q0CXfURhXqrQFd9RKHeKtBV7yigqz6iUN8d6KqPKFQbQFd9RKHaALrqIwrVBtBVH1Go NoCu+ohCtQF01UcUqg2gqz6iUG0AXfURhWoD6KqPKFQbQFd9RKHaALrqIwrVBtihckSh2gA7VI4o VBuIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yI K6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yIK6yekvp2LROTmR0IT0l9u9uJycwOhKekvl0QvWSe kvp2nRSTmSfAU1Lf7qRiMvMEeErq28VWTGaeAE9Jfbsdi8nME+ApqW9XbDGZeQI8JfXtni4mM0+A p6S+Xfa9ZJ6S+tYaEJOZJ8BTUt/6C2Iy8wR4u3ZuTQoxmXkCTCa3mkxuNZncajK59XeY3Def3zz8 9OHjX3fEw8enn3999+bjV8EPP7578/aXTw+/fnr688MP7z78+NeH/ZWvr1oPxf2PHz4ef+rb9z8/ vH/6++en958/HRm/fgnHH/v+DP/0UGI8jld/7P5CPz4df7HPHx4eb4H31OV7o1iD6F94n+K196m3 1ub+v/a971P88/u05np89cfQ+/RaFGuJicVpfm6ZJHU1SepqktTVJKmrSVJXk6SuJkldTZK6miR1 NUnqapLU1SSpq0lSV5OkriZJXU2SupokdTVJ6mqS1BWpqStSU1ekpq5ITd2QmrohNXVDauqG1NQN qakbUlM3pKZuSE3dkJq6ITV1Q2rqhtTUDampG1JTN6SmbkhN3ZCauiE1dUNq6obU1A2pqRtSUzek pm5ITd2QmrohNXVDauqG1NQNqakbUlM3pKZuSE3dEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3a EA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aEA3aGA1q KlmrqWStppK1mkrWZipZm6lkbaaStZlK1mYqWZupZG2mkrWZStZmKlmbqWRtppK1mUrWZipZm6lk baaStZlK1mYqWZupZG2mkrWZStZmKlmbqWRtppK1mUrWZipZm6lkbaaStZlK1mYqWZupZG2mkrWZ StZmktTNJKmbSVI3k6RuJkndTJK6mSR1M0nqZpLUzSSpm0lSN5OkbiZJ3UySupkkdTNJ6maS1M0k qZtJUjeTpG4mSd1MkrqZJHUzSepmktTNJKmbSVI3k6RuSE3dkJq6ITV1Q2rqhtTUDampG1JTN6Sm bkhN3ZCauiE1dUNq6obU1A2pqRtSUzekpm5ITd2QmrohNXVDauqG1NQNqakbUlM3pKZuSE3dkJq6 ITV1Q2rqhtTUDampG1JTN6SmbkhN3ZCauiE1dUNq6oa4woa4woa4woa4wkBcYSCuMBBXGIgrDMQV BuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhcG4QlPJ 2kwlazOVrM1UsjZTydpMJWszlazNVLI2U8naTCVrM5WszVSyNlPJ2sztMs3cLtNMTWQzNZHN1EQ2 UxPZTE1kMzWRzdRENlMT2UxNZDM1kc3URDZTE9lMTWQzNZHN1EQ2UxPZTE1kMzWRzdRENlMT2UxN ZDOZ3GYyuc1kcpvJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ5IbJ 5IbJ5IbJ5IbJ5IbJ5MbvMLl/6Luzg1/z3SkxY5XH/Wi/y3fneAnHH3v33YnRXv2h+8u84LrzehRr 3nlvuQkbhwkbhwkbBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIc BxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIcBxIc BxIcBxIcBwImAwGTgYDJQMBkIGAyEDAZCJgMBEwGAiYDAZOBgMlAwGQgYDIQMBkImAwETAYCJgMB k4GAyUDAZCBgMhAwGQiYDARMBgImAwGTgYDJQMBkmGLPMMWeYYo9wxR7hin2DFPsGabYM0yxZ5hi zzDFnmGKPcMUe4Yp9gxT7Bmm2DNMsWeYYs8wxZ5hij3DFHuGKfYMU+wZptgzTLFnmGLPMMWeYYo9 wxR7hin2DFPsGabYM0yxZ5hizzDFnmGKPcMUe4YJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJ G4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJG4cJGwcS HAcSHAcSHAcSHAcSHAcSHAcSHAcSHAcSHAcSHAcSHAcSHHckOO5IcNyR4LgjwXFHguOOBMcdCY47 Ehx3JDjuSHDckeC4I8FxR4LjjgTHHQmOOxIcdyQ47khw3JHguCPBcUeC444Exx0JjjsSHHfEFXbE FXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbEFXbE FXbEFXbEFXbEFXbEFXbEFXbEFXbGFZpizzDFnmGKPcMUe4Yp9gxT7Bmm2DNMsWeYYs8wxZ5hij3D FHt2U+zZTbFnN8We3RR7dlPs2U2xZzfFnt0Ue3ZT7NlNsWc3xZ7dFHt2U+zZTbFnN8We3RR7dlPs 2U2xZzfFnt1cwNJNTWQ3NZHd1ER2UxPZTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ 3G4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK5Hely O9LldqTL7UiX25EutyNdbke63I50uR3pcjvS5Xaky+1Il9uRLrcjXW5HutyOdLkd6XI70uV2pMvt SJfbkS63I11uR7rcjnS5HelyO9LldqTL7UiX25EutyNdbke63I50uR3pcjvS5Xaky+1Il9sRV9gR V9gRV9gRV9gRV9gRV9gRV9gRV9gRV9gRV9gRV9gRVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQ VzgQVzgQVzgQVzgQVzgQVzgQVzgYV2hqIrupieymJrKbmshuaiK7qYnspiaym5rIbmoiu6mJ7KYm spuayG5qIrupieymJrKbmshuaiK7qYnspiaym5rIbmoiu6mJ7KYmspuayG5qIrupieymJrKbmshu aiK7qYnspiaym5rIbmoiu6mJ7KYmspuayG4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7 yeR2k8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR1I lzuQLncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC53IF3uQLrcgXS5A+lyB9LlDqTLHUiXO5AudyBd 7kC63IF0uQPpcgfS5Q6kyx1IlzuQLncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC53IF3uQLrcgbjC gbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjC gbjCgbjCgbjCgbjCgbjCgbjCgbjCgbjCYWoih6mJHKYmcpiayGFqIoepiRymJnKYmshhaiKHqYkc piZymJrIYWoih6mJHKYmcpiayGFqIoepiRymJnKYmshhaiKHqYkcpiZymJrIYWoih6mJHKYmcpia yGFqIoepiRymJnKYmshhaiKHqYkcpiZymJrIYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNk cofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJ HUiXO5AudyBd7kC63IF0uQPpcgfS5Q6kyx1IlzuQLncgXe5AutyBdLkD6XIH0uUOpMsdSJc7kC53 IF3uQLrciXS5E+lyJ9LlTqTLnUiXO5EudyJd7kS63Il0uRPpcifS5U6ky51IlzuRLnciXe5EutyJ uMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJuMKJ uMKJuMKJuMKJuMKJuMKJuMKJuMKJuMLJuEJTEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9REDlMTOUxN 5DA1kcPURA5TEzlMTeQwNZHD1EQOUxM5TE3kMDWRw9RETlMTOU1N5DQ1kdPURE5TEzlNTeQ0NZHT 1EROUxM5TU3kNDWR09RETlMTOU1N5DQ1kdPURE6TyZ0mkztNJneaTO40mdxpMrnTZHKnyeROk8md JpM7TSZ3mkzuNJncaTK502Ryp8nkTpPJnSaTO00md5pM7jSZ3GkyudNkcqfJ5E6TyZ0mkztNJnea TO5EutyJdLkT6XIn0uVOpMudSJc7kS53Il3uRLrciXS5E+lyJ9LlTqTLnUiXO5EudyJd7kS63Il0 uRPpcifS5U6ky51IlzuRLnciXe5EutyJdLkT6XIn0uVOpMudSJc7kS53Il3uRLrciXS5E+lyJ9Ll TsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQVTsQV TsQVJuIKE3GFibjCRFxhIq4wEVeYiCtMxhWamshpaiKnqYmcpiZymprIaWoip6mJnKYmcpqayGlq IqepiZymJnKamshpaiKnqYmcpiZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKamshpaiKnqYmc piZymprIaWoip6mJnKYmcpqayGlqIqepiZymJnKaTO40mdxpMrnTZHKnyeROk8mdJpM7TSZ3mkzu NJncaTK502Ryp8nkTpPJnSaTO00md5pM7jSZ3GkyudNkctNkctNkctNkctNkctNkctNkctNkctNk chPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPp chPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchPpchNxhYm4 wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjCRFxhIq4wEVeYiCtMxBUm4goTcYWJuMJEXGEirjARV5iI K0zEFSbiChNxhYm4wkRcYSKuME1NZJqayDQ1kWlqItPURKapiUxTE5mmJjJNTWSamsg0NZFpaiLT 1ESmqYlMUxOZpiYyTU1kmprINDWRaWoi09REpqmJTFMTmaYmMk1NZJqayDQ1kWlqItPURKapiUxT E5mmJjJNTWSamsg0NZFpaiLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLT ZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHLTZHIT6XIT6XIT6XIT6XIT 6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT6XIT 6XIT6XIT6XIT6XIT6XIX0uUupMtdSJe7kC53IV3uQrrchXS5C+lyF+IKF+IKF+IKF+IKF+IKF+IK F+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IKF+IK F+IKF+IKF+MKTU1kmprINDWRaWoi09REpqmJTFMTmaYmMk1NZJqayDQ1kWlqItPURKapiUxTE5mm JjJNTWSamsg0NZFpaiLT1ESmqYlMUxOZpiYyTU1kmprINDWRaWoil6mJXKYmcpmayGVqIpepiVym JnKZmshlaiKXyeQuk8ldJpO7TCZ3mUzuMpncZTK5y2Ryl8nkLpPJXSaTu0wmd5lM7jKZ3GUyuctk cpfJ5C6TyV0mk7tMJneZTO4ymdxlMrnLZHKXyeQuk8ldJpO7RCa3NtKf3lGgB7mjQA9yR4Ee5I4C PcgdBXqQOwr0p3cU6E/vKNCf3lGgP10b6U/vKFQbpD+9o1BtkP70jkK1QXTvOwrVBtG97yhUG0T3 vqNQbRAt+o5Cz4to0XcUel5Ei76j0PMiWvQdhZ4X0aLvKHSWiRZ9R6HaIFr0HYVqg2jRdxSqDaJF 31GoNogWfUeh2iBa9B2FaoNo0XcUespEVV4bUZXvKPSUCRW7o9BTJlTsjkJPmVCxOwo9L0Kq7ij0 vAipuqPYN3Pv/nheRMRk3v3xvLaIybz743nJEZN5HZTzSiQm8zoo5wXKSyZ2UM7rlpjMPAFiB+W8 s4nJzBMgqprPi5+YzDwBoqr5vD2KycwTIGqHzyuomMysM1E7fN5jxWRmnYna4fMyLCYzP2lF7fB5 oxaTmSdA1A6f13IxmXkCRO3webf/VrI3n988/PTh4193xMPHp59/fffm41fBDz++e/P2l08Pv356 +vPDD+8+/PjXh9LG3P829g3qxw8fjz/17fufH94//f3z0/vPn46MX7+E4499f4Z/eoj56s/cX+XH p+Nv9fnDw3PUPW/53ijWyhDfcfNki5rosx8iJjNPtqiJPpsqYjLzMIoy5rMzIyYzi1bE6M/2jpjM LFoRoz97RF4yEVY/O0piMrPORFi9BhGg7SjSwA0iJauBRvWBRvWBRvWBRvWBRvWBRvWBRvWBRvWB RvWBRvWBRvWBRvWBhu6Bhu6BxueBxueBBuGBBuGBBuFBDOB3FHpeaOgeaOgeaOgeaOgeaOgeaOge aOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgeaOgexAB+R6Ha QKP6QKP6QKP6QKP6QKP6QKP6QKP6QKP6IAZWOwrVBsICQhRtnNcXMZl4hQ2TEgiTEgiTEgiTEgiT EgiTEgiTEgiTEgiTEgiTEgiTEgiTEghzsB/mYD/MWXyYs/gwx+dhjs/DHJ+HaAp+XlzFZGadmYP9 MAf7YQ72wxzshznYD3OwH+ZgP8zBfpiD/TAH+2EO9sMc7Ic52A9zsB/mYD9EU/CzrSAmM0+AOQAP cwAe5gA8zAF4iKbgZ99DTGaeAHOaHuY0PcxpepjT9DCn6WFO08OcpodoSnd2d8Rk4gnoxNZ1R5Eu XCe2rjuKdOE6sXXdUaQL19EsvqNZfEez+I5m8R3N4juaxXc0i+9oFt/RLL6jWXxHs/iOZvEdzeI7 msV3NIvvSADf0QS/owl+RwL4jub+Hc39O5r7dzT372ju39Hcv6O5f0dz/47m/h3N/Tua+3c09+9o 7t/R3L+juX9Hc/+O5v4dzf07mvt3NPfvaO7f0dy/o7l/R3P/jub+Hc39O5r7dzT372ju39Hcv6O5 f0dz/47m/h3N/Tua+3c09+9o7t9F78bzqiQmE6/L3cQAuujdeF7DxGTmddlkCrrJFHSTKegmU9BN pqCbTEE3mYJuMgXdZAq6yRR0kynoJlPQTaagm0xBN80CugkodBNQ6KZZQDdph27SDt2kHbpJO3ST dugm7dBN2qGbtEM3aYdu0g7dpB26STt0k3boJu3QTdqhm7RDN2mHbtIO3aQdukk7dJN26Cbt0E3a oZu0Qzdph27SDt2kHbpJO3STdugm7dBN2qGbtEM3aYdu0g7dpB26STt0k3YYZD1tHWRl7I4inb6B KIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBKIGBzPUH YgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGYgsGogQGogQG ogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogQGogSG uIryvL6IycRb5zDn/MOc8w9zzj/MOf8w5/zDnPMPc84/zDn/MOf8w5zzD3POP8w5/zDn/MOc8w9z zj/MOf8w5/zDnPMPc8PAMKGBYUIDw4QGhgkNDBMaGCY0MExoYJjQwDChgWFCA8OEBoYJDQwTGhgm NDBMaGCY0MAwoYFhzvmHOecf5px/mHP+Yc75hznnH+acf5hz/mHO+Yc55x/mnH+Yc/5hzvmHOecf 5px/mHP+Yc75hznnH+acf5hz/mHO+ecj6cLNR9KFm4+kCzfRVH0+ki7cLKQLN9EEf6IJ/kTuABPN /SeaxU80i59oPj7RfHyi+fhEk+6JJt0TTbonmnRPNOmeaNI90aR7okn38ckmfkyKv/SOz0ExmfhL 7/jU9JIV8ZfeNMcM0xwzTFObOM2ZxTQnA9OcDEyz/z7N/vs0++/TbJlPs2U+zZb5/J2W+R+uo9vB r66j2//68VBcfN86uuMlHH/sfR3devVH7i/ywja616PYb1nvDTcnAfN3JgF//PRaefXp9Vw91qrf +fT2S/ijp9cKeXqvRrFvIP/Ce1S/tXCxj6MF9J3vUf3j96ii9+i1qLe/vPnb/VXvv9/Hp6ffRrWH t5+Ov/P+O93jn/8iD2fwm/f7H7x7ur8b35Ex9Ixdzzj0jFPPmHrGZWeMRz1j0TNWPaN+ZkI/M6Gf mdDPTOhnJvQzE/qZ6fqZ6fqZ6fqZ6fqZ6fqZ6fqZ6fqZ6fqZ6fqZ6fqZGfqZGfqZGfqZGfqZGfqZ GfqZGfqZGVfPzPWbRSJ2OhE7nYidTsROJ2KnE7HTidjpROx0ItezRLvEMknfO5NMNzJRRSWqqEQV lew9RBW1UEUtVFELPeWFnvJC1btQbSxUGwvVxkK1sUhtrEdSG+uR1MZ6JLWxHkltrEdSGwvxAwvx AwvxAwvxAwvxAwvxAwvxAwvxAwvxAwvxAwv5BizkG7AQq7AQq7CQb8BCvgELcRELcRELcREL+QYs RFMsRFMsRFOkSeClSeClSeClSeClSeClSeClSeClSeCl6WeT5lqb4/4hJhMH68dtRUxmHqc0j1Oq T9M8Tss8Tss8Tsss2mUW7TIP+jJPwDJPwDJPwDJPwBJPwHENFJOJJ+C4NIrJxBNwXDHFZOIJWCbf uUy+c5l85zL5zmXyncvkO5fJdy6T71wm37lMT4plelIskzxdJnm6TE+KZXpSLJOJXSYTu0wmdpme FMsEbJcJ2C4RsB2LiC12FGgd7SjQOtpRoAm0o0A7Z0eBds6OAq2+HQVafWMRq78d1U5Y89+fPn56 e/zor7/88PTx4fHv7Qj8zY/G+aO3f/jTh4+/vPl8zKm/+iHyKkBjbkehJ0mM+XYUepLEmG8ssvRv R6GT12+E7y9vfn7748vT/2H8UL4uAGLih6NQHRHrvx2FKoKY+O0oVBHExG9HoYogJn47Cj1lAqLs KPSUCYiyo1BtEBBlR6HaICDKjkJPmSzt21HoKZOlfTtqfMcvqYkeKuFpdhR6qIkeaqIDT4ifHYVK IVEpEE5oR6EDTzihHYVqgxA/O4p9xfaujee3fDGZd2087wRiMu9ydt4gxGRee+K8b3jJRLu083by jWTff2n5Z6HZP8d834XmFv+XN//+dANvn/789c+wS4/4TpmlKvqanTcnMZlZquIytPP6JSb75kfi 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 GR1xGR1xGR1xGR1xGR1xGR1xGR1xGR1xGR0RFh0RFh2xEh2xEh2xEh2xEh2xEh2xEh2xEh2xEh2x Eh2xEh1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx1RDx3xCx3xCx3xCx2R CB0xBR0xBR3RAR3N+Qea8w805x9ozj/QnH+gif1gs3eTq+4mV91NrrqbXHU35/rdnOt3c67fzbl+ N+f63Zzrd3Ou3825fjfn+t2c63dzFN/NUXw3p+fdnJ53c3rezel5N6fn3Zyed3N63s3peTen592c nndz4N3NgXc3B97dHHh3c+DdzYF3Nwfe3Rx4d3Pg3c2BdzcH3t0ceHdz4N3NgXc3Z9TdnFF3c0bd zbFyNyfB3ZwEd3N428156zDnrcOctw5z3jrMeeswR6TDnGom6s+n9eV15Hpsl0URt6irL/wWdbWt eIu62pi5RV1tRt6irjbSzqjLoohb1NVG2i3qaiPtFnW1kXaLQk/5sm3yLQo95cu2ybco9JQv2ybf otBTvmybfItCT/mybfItCtXGZdvkWxSqjcu2ybcoVBuXbZNvUag2Ltsm36JQbVy2Tb5Fodq4bJt8 i0K1cdk2+Yy6bGV8i0LP67KV8S0KPa/LyM8tCj2vy8jPLYo9L3SWLyM/tyhUG5eRn1sUqo3LyM8t CtXGZeTnFoVq47IVyy0K1cZlUOgWhWrjMl50i0K1cRkvukWh2riMF92i2C1AajHcLz1iMqn7dL8i icmkVtb9QuUls1Db+/VLTCY1P+6XNTGZWbSWY+39xicmM4vWcqy9XxvFZGbRWo6197unmMz82LYc a+8XWDGZeQIsx9r7LdhLZjnW3u/MYjLzBFiOtfeLt5jMPAGWY+399i4mM0+A5Qt7bwGIycw6s/jF ex9BTGbWmcUv3psRYjLzk9biF+8dDTGZeQIsfvHeFhGTmSfA4hfvvRUxmXkCLBjy3qARk5knwCIr 710eMZl5AtThtEVW3jtIYjLUdLysQLtFofbhZbfeWxRqH17Wrd2iUPvwsm7tFoXah5d1a7co1Fq+ rFu7RaHauKxbu0Wh2risW7tFodq4rFu7RaHauKx2u0Wh2risdrtFodq4rJG7RaHauKysu0Wh2rjs 1nuLQrVx2a33FkVqIy6r+G5RpDbisorvFkVqIxCYFghMCwSmBQLTAoFpgcC0QGBaIDAtEJgWCEw7 dvqRKFQbCGcLhLMFwtkC4WyBcLZAOFsgnC0QzhYIZwuEswXC2QLhbIFwtkA4WyCcLRjOZmnU7hcs MZl5/bdMWe+3NDGZef23NGr3q56YzLz+Wxq1+33RS2Zp1O63SzGZeQIsjdr9iiomM0+ApVG733PF ZOYJsARv98uymMw8AZZ67n7jFpOZJ8CS4t2v7WIy8wRYpqz3u7+WLCyR4L1TICYTT0BYIsF7u0FM Jp6AMEnRMEnRMEnRMEnRMEnRMEnRMEnRMEnRo6kiJjNPgImdhomdhomdhomdhomdhomdhomdhomd homdhomdhomdhomdhomdhomdhomdhoid1kpGhzsKtPJqJaPDHQVaeTsKtHl3FGi97ijQet1RoPW6 o9DzIuO82sg4b0eR59XIOG9HgbZ8RT4TFflMVOQzUZHPREU+ExX5TFTkM1GRz0RFPhMV+UzsKFQb ZJxXkTtFRe4UFblTVOROUZE7RUXuFBW5U1TkTlGRO0VF7hQVuVNU5E5RkTtFRe4UFblTVOROUZE7 RUXuFBW5U1TkTlGRO0VF7hQ7CtVGQ7URqDaIE0ZFThgVOWFU5IRRkRNGRU4YFXlaVORpUZGnRUWe FuftRrwqeTfC8y4kJjNvhOJk6LxQicm8zsN5/RKTmXX2O/OXN5/fPPz04eNfd8TDx6eff3335uNX wQ8/vnvz9pdPD79+evrzww/vPvz414daSx89HvcXzh8/fDz+1Lfvf354//T3z0/vP386Mn79Eo4/ 9v0Z/umhvPoj9xf58en4S33+8PB4C7qn/e4odjXV3vAmjpXOi6yYzGspVtOApJoGJNU0IKmmAUk1 DUiqaUBSTQOSahqQVNOApJoGJOflXkxmngBxrFRNN5NquplU082kmm4m1XQzqaabSTXdTKrpZlJN N5NquplU082kmm4m1XQzqaabSTXdTKrpZlJNN5NquplU082kmm4m1XQzOZtAYjLzBIR5AkSflWr6 rFTTZ6WaPivV9Fmpps9KNa1RqmmNUk1rlGpao1Tky1qRL2tFvqwV+bJW5MtakS9rRb6sFfmyVuTL WpEva0W+rBX5slbky1qRL2tF9hk7CtUGMd2oyHSjItONikw3KjLdqMh0oyLTjYpMNyoy3ajIdKMi 042KTDcqMt2oyHSjItONikw3dhSqDWK6UZHpRkWmGxWZblRkulGR6UZF9hkV2WdUZJ9RkX1GRfYZ FRlhVGSEUZERRkVGGBUZYVRkhFGREUZFRhgVGWFUZIRRkRFGRUYYFRlhVGSEUZERRkVGGNU0Sqym UWI1jRKraZRYTaPEaholVtMosZpGidU0SqymUWI1jRKraZRYTaPEaholVtPe47wAeslEr5BqeoVU 0yukml4h1fQKqaZXSDW9QqrpFVJNr5BqeoVU0yukml4h1fQKqaZXSDW9QqrpFXLew8Vk5gkwiVDT K6SaXiHV9AqppldINe09qmnvUU17j2rae1TT3qOajhzVdOSopiNHNR05qunIUU1Hjmo6clTTkaOa jhzVdOSopiNHNR05qunIUU1Hjmo6clTTkSOQGiqQGmpHgT5hIDVUIDVUIDVUIDVUIDVUIDVUIDVU IDVUoL3AgTRUgTRUgTRUgTRUgfYCB9oLHIg/CcSfBOJPAvEngfiTQPxJIP4kEH8SiD8JxJ8E4k8C 8SeB+JNA/Ekg/iQQfxKIPwnEnwTiTwLxJ4H4k0D8SSD+JBB/Eog/CUR3BKI7AtEdgeiOaITuCER3 BKI7AtEdgeiOQHRHILoj0EqVQExIICYkEBMSaM1JmKB+mKD+eT8Rk3l37jBB/TBB/TBB/TBB/TBB /TBB/TBB/TAXooZJ/YdJ/YdJ/YdJ/Ye5EDXMhahhcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5h cj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hcj5hAjBhAjBhAjBh AjBnq0JMZpaGCMCECcCECcCECcCECcCEuSwnTJomTJomTJomzJU0gcQ5gcQ5gcQ5gcQ5gcQ5gcQ5 gcQ5gcQ5gcQ5gcQ5gcQ5gcQ5gcQ5gcQ5gWQ2gfbNBto3G2hzbKDNsYE2xwbaHBtoc2ygzbGBNscG 2hwbaHNsoM2xgTbHBtocG2hz7I5CtUGspncUqg1iNb2jUG0g4CkQ8BQIeAoEPAUCngIBT4GAp0DA UyDgKRDwFAh4CgQhBYKQAkFIgSCkQCiMiXCHiXCHiXCHiXCHiXCHiXCHiXCHiXCHiXCHiXCHiXCH iXCHiXCHiXCHSl2bexDD3IMY5urCMFcXhrm6MMzVhWGuLgxzdWGYqwvDXF0Y5urCMFcXhrm6MMzV hWGuLjzvXGIy8wSIHrPnxU1MZp4AExALExALExALExALExALExALExALExALExALExALExALE8MK E8MKE8MKE8MKh7WJXGPnujhouEdda2g8R10cNNyjrjW77lHXmif3qGutiXvUtebJPepa2+oeda1t dY9CT/nieOI56uJ44h6FnvLF8cQ9Cj3li+OJe9S1Ftk9CtXGxZHBc9TFkcE9Cj2viyODexR6XhdH Bvco9LwujgzuUegsX9Rj36NQbVwcT9yjUG1cHE/co1BtXBxP3KNQbVwcT9yjUG1cHE/co1BtXNRj 36NQbVwchdyjUG1cHIXco1BtXNRj36NQbTiN7ZcvgF4yp7H98nVRTKZcT16+XIrJlOvJy1dRMZly c3354iomM4vW6ZK/fPsVk5lF63TJX75Ci8mUO/XLF24xmVlnTi/65Vu7mMysM6cX/fLVX0xm1pnT i365P4jJzE9ap0v+cgkRk5knwOmSv9xkxGTmCXC65C/XITGZeQKcLvnLncpL5sioX25gYjLzBDj9 +5drnJjMPAGOjPrlLuglu2jl8hx10crlHoUaARetXO5R6HJ+0V7lHkUu5/Oi0uYeRd6NeVFpc48i bZF5UWlzjyLv/LyotLlHkZbZRAOwiQZgEw2l5kX1yz0KvfNoKDXRUGqiodREQ6mJhlITDaUmGkpN NJSaaLw0L6pf7lHoKaNR1kSjrIlGWRONsiYaZU00yppslOXIm1++GojJzC+ujrz55fuFmMz8euhY 8r98SRGTiQ9gOqqJl286YjKxNKajmnj5uiQmE+/O0xwuTXO4NM0RznS0CS9f3MRkZmmYI5xpjnCm OcKZ5ghnmiOcaY5wpjnCmebUZTrahJdvrWIys2jNedA050HTnAdNcx40zXnQNOdBE4FjE4FjE4Fj E4FjE4FjE4FjE4FjE4FjE4FjEyFgEyFgEyFgEyFgEyFgEyFgEyFgEyFgEyFgEyFgEyFgEyFg8+JK jnsUqo2LKznuUag2Lq7kuEeh2ri4kuMehZ7yxeUa9yj0lC8u13iOurhc4x6FnvLF5Rr3KPSULy7X uEehT4CLyzXuUegpT/SUEz3lRE/54iKPexR6yhcXedyj0FO+uMjjHoU+AS4u8rhHodpA09+Jpr8T TX/nxUUe9yhUG2jSPNGkebJJ80K1cXFpyMvtRrwqmfd7k3abJu02TdptmrTbNGm3adJu06Tdpgmo TRNQmyagNk1AbZqA2jQBtWkCatME1KYJqE0TUJsmoDZNQG06ez5e7rVeMmfPx8stWExmngDTe2A6 ez5ebthiMrNondUcL9d0L5mzmuPlUi8mM4vWWc3x0hkQk5kf285qjpf2gpjMLNo0izbNonWWhrx0 NMRkZtE6S0Ne2iJiMvNj21ka8tJb8ZKZVN00qbppUnXTWRry0s4Rk5knwOT9psr7LfMEOOtMbsny 4jqTexRpHyaSSySSSySSSyRCxxOh44n8jBIB54mA80TAeSLgPBFwngg4TwScJwLOEwHniYDzRAhM IgQmEQKTCIFJhMAkQmASITCJEJhECEwi76RE4EwicCYROJMInEkEziQCZxKBM4nAmUTgTCJwJhE4 kwicSQTOJAJnEoEziRCYRAhMOqs4Xr6UicnEK0OaOpA0dSBpEt1pEt1pmvKkiYeniYeniYeniYen iYeniYeniYeniYeniYeniYenCVCkCVCkCVCkCVCkCVCkCVCkCVCkCVCkCVCkaReUJo2RJo2RJo2R Jo2RJo2RJo2RJo2RJo2RJo2RJo2RJo2RJo2RJo2RJo2RJo2RJkCRJkCRSIuQA123kYIhkYIhkYIh kYIhkYIhkYIhkYIhkYIhkYIhkYIhkYIhJ6oNpHtIpHtIxGUn4rITEdYLDcIWchtbaHy20PhsofHZ QuOzhdzGFnIbW8htbCG3sYXcxhZat7PQup2FnM0WWrezkB/aQn5oC/mhLeSHtpAf2kJ+aAv5oS3k h7bQUHuhofZCQ+2FhtqLDbVNVPb4AigmM68nJnebJnebJnebJnebJnebJnebJnebJnebJnebJnd7 fCkWk5knwIR404Te0oTe0uTUljkpXab93jLHrsscuy5z7LrMsesy7feWab+3TPu9ZdrvLdN+b5m7 nZa522mZxoDL3O20TJfBZboMLtNlcJkug8t0GVymy+AyXQaX6TK4TCZlmUzKMpmUZTIpS2RSRifm GDsKXLN3FLhm7yhw9d1RoC2yo0BbZAzSTt1RoC2yo8jzGqSduqPI8xqknTrQrumBdk0PtK13oG29 A23QHWiD7kBbbXcUesqEzB5oP+1A+2kH2k870H7agfbTDrSfdqD9tAPtpx1oP+35O0X8BeV9Qzh/ A4nJ1N/D3jfR89eYlmyI3Yjzl56YTKyzIXYjzt+cYjLvm+gwV+MOczXuMDdmDnNj5jD3Ug5zL+Uw tz+eXwTEZObTFAnMYS5sHObCxmEubBzmwsZhLmwc5sLGYS5sHObCxjGI0mwMojTbUegbMlGajUGU ZjsKfUMm+rQdhb7rEsBxR6GnTADHHYWeMgEc9wtET5kAjjsKPWUCOO4oVBsEcNxRqDYI4LijUG0Q wHGXIaoNYuy8o1BtEGPnHYVqgxg77yhUG8SieaAFvQMt6B1oQe9AC3p3FHrKqAuNlgEPtAx4oGXA OwrVBup4T9TxRuuKB1pXPNC64oHWFQ+0rnigdcUDrSseaF3xQOuKB1pXvKNQbRCAeKDVyDsK1QYB iAdaqDzQQuWBFioPtFB5mEvsh7nE/rxBicnMroCoSjuvYWIysysgssrnXU5MZhatyCqfF0IxmVm0 Iqt83irFZGbRiqzyeTUVk5knQGSVz/utmMw8ASKrfF6SxWTmCRANh8+btpjMPAGi4fB5XReTmUUr egSfd34xmVm0JlMwTKZgmEzBED2Cz+7Dt5K9+fzm4acPH/+6Ix4+Pv3867s3H78Kfvjx3Zu3v3x6 +PXT058ffnj34ce/PmSfa61o/U8/fvh4/KFv3//88P7p75+f3n/+dCT8+hUcf+r7M/rTQx21RLz6 c/cX+vHp+It9/vDweIu85y7fG8X6Lf/C+zRfe5/Wavl4uFN85/s0v/N9ml/9jetj5D+/VfX7Almj zvzoMjGVaWIq08RUpompTBNTmSamMk1MZYqimbNnJiYTT8AURTNn401MZp4AUTRzdu/EZOYJEEUz ZwtQTGaeABMhmyJClgib3lHgN2Ei2DoRbJ0Itt5RoImcCGVOhBcnwosTgTWJwJpEYE0isCYRWJMI rEkE1uwoVPMEx0mE4yTCcRLhOIlwnEQ4TiIcJxGOkwjHSYTjJMJxEuE4iXCcRDhOIhwnEY6TCKxJ BNYkAmsSgTWJwJpEYM2OQk+Z4DiJcJxEOE4iHCcRjpMIx0mE4yTCcRLhOIlwnETYSprqgPOLrZjM u3alKTVIU2pwfmn2kokMfpqke5qke5pUR5pUR5pUR5pUR5pUR5pUR5pUx3ljEJOZJ0BERNJERNJE RNJERNJERNJERNJERNJERNJERNJERNJERNJERNJERNJERNJERNKkOtKkOtKkOtKkOtKkOtKkOs4r pJjMLFoREUkTEUkTEUkTEUkTEUkTEUkTEcnfQ0TQRVlLJk7N++METitH1PWGxhF1vaFxRF1vaBxR 11sTR9T1BtSOAuOJI+p6A+qIQs8LjCeOKPS8wHjiiLregDqi0FMG44kjCtUGGE8cUag2wHjiiEK1 AcYTRxSqDTCeOKJQbYDxxBGFagOohY8oVBtgqHFEodoAQ40jCj1lMJ44otBTBoOGIwo9L9D8P6LQ +QLN/yMKvfNAi3tEkfOVQFV7RJGTkkBVe0SRp5xAVXtEkaecQFV7RJGnnEBVu6OAqvaIQrUBVLVH FKoNoKo9oti3ZfVKoV0Qb3cGMZl2QbzdMMRkWiPidh8Rk2mNiNvtRUxm1pk3QbldgcRkWiPidmES k2mtuNv1ykvmTVBulzExmXkCvAnK7UYnJjNPgDdBuV0LxWTmCfAmKLe7pZjMPAHeOOZ2QRWTmSfA m6DcbrliMrNovaHH7aosJjOfpjdauN23xWRmaXgixtulXUuWnu7wdsUXk4kfQenpDm99AjGZWLTp 6Q5vzQYxmVm0nu7w1rEQk5knwNMd3toeYjLvBNQJ1pwcUaCBtqNAA21HgQZanUAbeESBBtqOAg20 HQUaaDsKNNB2FGig7ShUG2DpyxGFagMsfdlRYOnLEYVqg6AIFaEIFaEIFaEIOwrVBgEYKgIYKgIY KgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIYKgIY KgIYKgIYKgIYKgIYKgIYdhSqDYI9VAQw7Cj0lAn2UBH2sKPQUwb6yiMKPWWCWFSEWFSEWFSEWFSE WJx3IvGC5XUFzhuUmMzrCpz3LTGZ1xU4b2diMq8rcN7lxGRmV8CTxd4uhGIy8wR467xut0oxmXkC RBCmmiBMNUGYaoIw5/1WTGaeAJGqqSZVU02qpppUTTWpmmpSNdWkaqpJ1VSTqqkmVVNNqqaaVE01 qZpqUjXVpGqqSdVUk6qpJlVTTaqmmlRNNamaalI11aRqqknVVJOqqSZVc/ZYxGTmCRCpmrNR4yUT EZ1qIjpnt0dMZhatCA9VEx6qJjxUTXiomvBQNeGhmo10FbORrmI20lXMRrqKiYiERERCIiIhEZGQ iEhIRCQkIhISEQmJiIREREIiIiERkZCISEjEFiRiCxKxBYnYgkRsQSK2IIEL8xGFTiWiBBLN+/OY 9//BhpH9U7W/smFk1EMatNZ3bRg5k/zThpH+6o/cfxd99xKWb0Wx317ir0LxW9Lxu05MJn5LSnMu leZcKs25VJpzqTTnUmnOpdKcS6U5l0pzLpXmXCrNuVSac6k051JpjpLSHCWlOUpKc5SU5igpzVFS eq60t285XjJz+pPmwCbNgU0iYjIRMZmImExETCYiJhMRk4mIyUTEZCJiMhExmYiYTERMJiImExGT iYjJRMRkImIyETGZiJhMREwmIiYTEZOJiMkkRlE7CtUG4iwTcZaJOMtEnGUizjIRZ5mIs0zEWSbi LBNxlok4y/VIamMRA6wdRWpjEQOsHUVqYxEDrB1FamMRA6wdRWpjEQOsuogB1o5CtUEMsHYUesrE ympHoadc0FMu6CkX9JQresoVPeWKnnJFnwAV1UZFtVFRbVR24zAv2Sb6lib6lib6lib6lib6lib6 lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lib6lqI71XnjFpOZ J8Dk6NLk6NLk6NLk6NLk6NLk6NLk6NLk6NLk6NLk6I4uhJhMPAFLdPQ6WxliMvEELNHR6+yHiMnE E7BER6+zqeIlEx29zhaMmMw8AaIJ19nHEZOZRVvMoi1m0RazaKtZtNUs2moWbTU/tqt5Aqp5Aqp5 Aqp5AhpqNiI4fyE4fyHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHMfiHj v4WA+YWA+YWA+YWA+YXM+BYy41sIzl8Izl8Izl/Iwm8hpH8hC7+FgLSFgLSFgLSFgLSFgLSFgLSF gLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSFgLSF 0LKF0LLjFiBeKcwLoql9WqZcaZlypWXKlZYpV1qmXGmZcqVlypWWKVdaplxpmXKlZcqVlilXWqZc aZlypWXa6C1TYbRMhdEyFUbLVBgt06xumWZ1y9Q+LVP7tEzt0zKd75YppFqmkGqZ+N8y8b9l4n/L xP+Wif8tE/9bJv63TPxvmfjfMvG/ZeJ/y8T/lon/LRP/Wyb+t0z8b5n43zLxv2Xif8vE/5aJ/y0T /1sm/rdM/G+Z+N8yib1lEnsL6e8W0d+1R6IC21HgFe4o9gpBU2tHgYZneyRqqR2F3kOiltpR6D0k GqsdBRqeOwo0PHcUaHjuKFQbRGPVHonGakeh2iAaqx2FaoNorHYUqg2isdpRqDYqqo2KaqOh2iBI zI5CtUGQmB2FaoOBNCanvkRO/fwdKSbz/prnb1Qxmfft6vz96yUTwdrzt7WYzHya4qrc81e+mMy7 X5xfEMRk3v3i/DohJjNPgEjpnt9JxGTmCRAp3fOLjZjMPAEipXt+OxKTmSegfvsE/JF96xH8in1r bdmOt2+f+u/xbz1fwvHH3v1b66gl4tWfu7/S7zdx/UYU+/rovesiYnF+2RSTmadbtJc9v7FayQIt 7Qy0BDLQEshASyADLYGMJOZEOwpcjXYUuBrtKHA12lHgkrOjyFNOYjO0o8hTTtI4iyQtsB2Fnhdp ge0ocJXdUegpkxbYjkJPmbTAdhR6yqQFtqNQbZAW2I5CtUFaYJGkBbajUG2QFtiOQrVBWmCRpAW2 o1BtkBZYoJUtgVa2BFrZEmhlS6CVLYFWtgRa2RJoZUuglS2BVrYEWtkSaGVLoJUtgVa2BFrZEubu szB3UoW5kyrMnVRh7qQ6vzSLybwL4fkVW0zmXQjPL+RiMrFoU7S/OL/Vi8nMohUb6+fVQExm1pnY WD/vF2Iys2jFxvp5SRGTmUUrNtbPm46YzDwBYmP9vC6JycwTIDbWzzuXmMw8Ab/TWEcXNzGZeQLE 5nOYu83C3G0W5m6zMHebhbnbLMzdZmHuNgtzt1mYu83C3G0W5m6zMHebhbnbLMzdZmHuNgu0CXVH oZYL2Z8aaH9qoP2pgfanBtqfGmh/6o5CLRdiBxNoV2ugXa2BdrXuKFQbxA4mktjBBNpPFmg/WaD9 ZIH2kwXaTxZoP1mg/WSB9pMF2k8WaD9ZoP1kgfaTBdpPFmg/WaD9ZIH2kwXaTxZoP1mg/WSBdoYF 2hkWaGdYoJ1hgXaGBdoZFmhnWKCdYYF2hgXaGRZoZ9jx/1AUqg2E5aCdYYF2hgXaGRZoZ1ignWGB doYF2hkWaGdYoJ1hgXaGBdoZFmhnWKCdYWHuez6vSl4ycXl0mMujw1weHeby6DCXR4e5PPq8y4nJ zK6AaO0S5lrrMNdan9dHMZl5AkRrlzA3u4W52S3MzW5hbnYLc7NbmJvdwtzsFuZmtzA3u4W52S3M zW5hbnYLc7NbmJvdwtzsFuZmtzA3u4W52S3MzW5h7k8Lc39amPvTwtyfFub+tDD3p4W5Py3M/Wlh 7k8Lc39amPvTzq6JmMw8ASbzae5PC3N/Wpj708Lcnxbm/rQw96eFuT8tzP1pYe5PC3N/Wpj708Lc nxbm/rRAm+13FOpgIqHaQkK1hYRqCwnVFhKqLSRUW0iotpBQbSGh2kJCtYWEagsJ1RYSqi0kVFtI qLaQUG0hoRpaXxZofVmg9WU7CtUGEqqhpWeBlp4FWnoWaOlZoKVngdaXBVpfFmh9WaD1ZYHWlwVa XxZofVmg9WWxEBu3EBuHVqUFWpUWaFVaoFVpgValBVqVFmhVWqBVaYFWpQValRZoVVqgVWmBVqXt KFQbiI1Dq9ICrUoLtCot0Kq0QKvSAq1KC7QqLdCqtECr0sLcRH1esMRkZi/B1PWZa63DXGsd5lrr MNdah7nWOsy11mGutQ5zrXWYa63DXGsd5lrrMNdanzdXMZl5Akxdn7m3L8y9fWHu7Tvv0GIy8wSY uj5zCWCYSwDDXAIY5hLAMPf2hbm3L8y9fWHu7Qtzb1+Ye/vC3NsX5t6+szkhJjM/tk3s1NwoGOZG wTA3Coa5UTDMjYJhbhQMc6NgmBsFw9woGOZGwTA3Coa5UfDs+ojJzBNgYqfmRsEwNwqGuVEwzI2C YW4UDHOjYJgbBcPcKDiQW+VAbpUDuVUO5FY5kFvlQG6VA7lVDuRWOZBb5UBulQO5VQ7kVjmQW+VA bpUDuVUO5FY5kK3GQLYaA9lqDGSrMZCtxkC2GgPZagxkqzGQrcZAthoD2WoMZKsxkK3GQLYaA9lq DGSrMZCtxkC2GgPZagxkqzGQrcZAthoD2WoMZKsxkK3GQLYaA9lqDGSQMZBpxUCmFQOZVgxkWrGj 0DtPrC4GsroYyOpiIKuLgYwkBrKEGKbB4DANBodpMDhMg8FhGgwO02BwmAaDwzQYHKbB4DANBodp MDhMg8FhGgwO02BwmAaDwzQYHKaZxjDNNIZppjFMM41hmmkM00xjmGYawzTTGKaZxjDNNIZppjFM M41hmmkM00xjmGYawzTTGKaZxjDNNIZppjFMM41hmmkM00xjmGYawzTTGKaZxjDNNIZppjFM/4th ukwM02VimC4Tw3SZOG/6YjLz80y0rBimZcUwLSuG6eUwTPuFgbwfB3JxHMjFcSAXx4FcHAdycRzI xXEgP8aB/BgH8mMcyI9xID/GgZTuA2nWB9KsD6RZH0izPpBmfSDN+kCa9YE06wNp1gfSrA+kWR9I sz6QZn0gzfpAmvWBNOsDadYH0qwPpFkfSLM+kGZ9IM36QJr1gTTrA2nWB9KsD6RZ31GoNhCugpTu AyndB1K6D6R0H0jpPpDSfSCl+0BK94GU7gMp3QdSug+kdB9I6T6Q0n0gpftASveBlO7DdEIbpnnZ MM3LhmleNkzzsmGalw3TvGyYfmPD9Bsbpt/YMP3Ghuk3NkyV/DCF7cMUtg9T2D5MYfswhe3DFLYP U9g+TGH7MIXtwxS2D1PYPkxh+zCF7cMUtg9T2D5MYfswhe3DFLYPU9g+TGH7MIXtwxS2D1PYPkxh +zCF7cMUtg9T2H52AsRk5gkweTJTJT9MlfwwVfLDVMkPUyU/TJX8MFXyw1TJD1MlP0yV/DBV8sNU yQ9TJT9MlfwwVfLDVMkPZFQ4kFHhjkKNM6TlQTaAA9kADmQDOJAN4EA2gGMh9cpC6pWFdCgrUSsW qVcWUq8spF5ZSL2yyKLWscii1h2FnjLS1yyyqHVHodogi1p3FKoNht2QlavzkcA6Owo85R0FnvKO Ak95R4GnvKPAU95R4CnvKPAJsKPQUybYzY5C7zwBaHYUejcI1DIfCZ6yo9BnlEnYm75B5/cnMZn5 ZdlEz01DnWEa6gzTUGeYhjrnFzwxmfrKzLtnmndPk3xeJvm8TPJ5meTzEpf1nd9XxWRm0ZqA9xKX 9Z3fhcVk5gkQl/WdX6jFZF7Rnl+/xWRe0Z5f1sVkXtGeX+3FZF7RnhcBMZn3sX1eG7xkIlVyXjLE ZObTFNmN86biJRMJifNe841kD8//+beHNz+///Dwfz1cJNl7iWOR/cU26D3q2tXuOepiG/Qede1C eI+6diG8R127VN+jrrUz7lHoec1rV/F7FHrKF+2TnqMuNqDvUegpX7RPukehp3yxbX2PutZwuUeh 2rjYtr5Hodq42LZ+jrrYtr5Hoad8sQF9j0JP+WID+h6FnvJCT/li2/oeRZ5yXGxb36PIJ0BcbFvf o0htxMW29T2K1EZcbFvfo0htxEVl6j0K1cZFZeo9CtXGRWXqPQrVxkU96z0K1cZFPes9CtXGRT3r PQrVxkU96z0K1cbFgcE9CtXGRT3rPQrVBroFxEVl6j0KPeWLytR7FPp+6MwXXi49XjJnvvByRRKT Kb2llwuVmEzpLb1cv8RkSjfi5bImJjOL1hk9vdz4xGRm0TpzrJdro5hMaaG9XDLFZOYJcOZYLzdV L5kzx3q514rJzKJ1Rk8vl2MxmVm0yyxaZ471cvHWkoUzx3q5povJxBMQzhzr5a4vJhNPQDhzrJeG gZhMPAHhDMVeug5iMvMEOLrtl9aFmMw8Ac7s76X/ISYzT4AjAn9ponjJHBH4S8tFTGaeAEcE/tK3 EZOZJ8ARgb80f8RkZtE6uu2XDpKWbKLx10Tjr3lRtXGPIg3OiYZmEw3NJhqaTTQ0m2hoNtHQbKKh WaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKh WaKhWaKhWaKhWaKhWaKhWaKhWaKhWaKhWV40gb1HodpAo7ZEo7ZEo7arO4vvUag2LprA3qNQbVw0 gb1Hodq4aAJ7j0K1cdEE9h6FauOiCew9CtXGRRPYexSqjYsmsPco9F3UHGNMc4wxHTnOy7VFTCZ2 A6Y5E5nmTGSaM5FpzkSmOROZ5kwkzZlImjORNGciac5E0pyJpDkTSXMmkuZMJM2ZSJozkTRnImnO RNKciaQ5E0lzJpLmTCTNmUiaM5E0ZyJpzkTSnImkORNJcyaS5kwkzZlImjORNGci6Rjjvlz5xWTm CTAHLGkOWKRF6y9dBjGZeQIcY9yXVoWYzDwBjjHuS7/DS+YY4750R8Rk5glwjHFfWixiMvMEOMa4 L30aK9msZGy5o0CraEeBNuKOAm3E2cjYckeBNuKOAm3EHQXaiDsKtBF3FGgj7ihSG42MLXcUqY1G xpazkbHljkK1QcaWOwrVBhlb7ihUG2RsuaNQbZCx5Y5CtUHGljsK1QYZW+4oVBtkbLmjUG2QseWO QrVBxpY7CtUGGVvuKFQbZGy5o1BtkLHljkK1QcaWOwrVBhlb7ihUG2RsuaNQbZCx5Y5CtUHGljsK 1QYZW+4oVBsXd1feo1BtXNxdeY9CtXFxd+U9CtXGxd2V9yhUGxd3V96jUG1c3F15jyK1UcUZ6Xkt E5N5vZHzEqcla+KM9Lzyicm83sh5QRSTeb2R8zopJhNPQBNnpOedVExmngBxRnpebMVk5gkQZ6Tn 7VhMZp4AcUZ6XrHFZOYJEGek5z1dTGaeAHFGel72xWTmCRBnpGfHQExmngBxRnq2Hbxk4oz0bFKI ycwTIM5Iz06HmMw8AeKM9GyXiMnMEyDOSM+ei5jMPAHijPRs3IjJzBMgzkjP7o+YzDwBzvLQlxaS l8xZHvrScBKTmSfAWR760rUSk5knwFke+tL6EpOZJ8BZHvqc7OLy0HsU6q0O1FsdqLc6UG/14nrT exTqrV5cb3qPQr1V4us/ka//RL7+E/n6T+TrP5Gv/45CtUG2AUy0DWCibQATbQOYaBvARNsAJtoG MNE2gIm2AUy0DWCibQATbQOYaBvARNsAJtoGsKNQbRA7lIl2CEy0Q2CiHQIT7RCYaIfARDsEJtoh MNEOgYl2CEy0Q2CiHQIT7RCYaIfARDsEJtohMNEOgYl2CEy0Q2CiHQIT7RCYaIfARDsEJtohMNEO gYl2CEy0Q2CiHQIT7RCYaIfARDsEJtohcN6/xMuc2YEYZgdimB2IYXYgnI3MLzdBMZnZgRA3Jkxz Y8I0NyZMc2PCNDcmTHNjwjQ3JpwXWzGZeQLE9QvTXL8wzfUL01y/MM31C9NcvzDN9QvTXL8wzfUL 01y/MM31C9NcvzDN9QvTXL9wNhLEZOYJEH2LprnLYZq7HKa5y2GauxymucthmrscprnLYZq7HKa5 y2GauxymucthmrscprnLYZq7HKa5y2GauxymucthmrscprnLYZq7HKa5y2GauxymucthmrscprnL YZq7HKa5y2GauxymucthmrscJtrBOdEOzol2cO4o1FtFuly0uXOizZ0Tbe7cUai3inS5gXS5gXS5 gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5gXS5 gXS5gXS5gXS5gXS5gXS5gbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbi CgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4wEFdo7tKb5i69ae7SOy9xYjKzA2Fq Is3FfNNczHfeG8VkZgfC1ESGqYkMUxMZpiYyTE1kmJrIMDWRYWoiw9REhqmJDFMTGaYmMkxNZJia yDA1kWFqIsPURIapiQxTExmmJjJMTWSYmsgwNZFhaiLD1ESGqYkMk8kNk8kNk8kNk8kNk8kNk8kN k8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kNk8kN k8kNk8kNk8kNpMsNpMsNpMsNpMsNpMsNpMsNpMsNpMsNpMsNpMsNpMsNpMvtSJfbkS63I11uR7rc jnS5HelyO9LldqTL7UiX25EutyNdbke63I50uR3pcjvS5Xaky+1Il9uRLrcjXW5HutyOdLkd6XI7 0uV2pMvtiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvs iCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvsjCs0NZFhaiLD1ESGqYkMUxMZpiYyTE1kmJrI MDWRYWoiw9REhqmJ7KYmspuayG5qIrupieymJrKbmshuaiK7qYnspiaym5rIbmoiu6mJ7KYmspua yG5qIrupieymJrKbmshuaiK7qYnspiaym5rIbmoiu6mJ7CaT200mt5tMbjeZ3G4yud1kcrvJ5HaT ye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200m t5tMbjeZ3IH0WgPptQbSaw2k1xpIrzWQXmsgvdZAeq2BeJOBeJOBeJOBeJOBeJOBeJOBeJOBeJOB eJOBeJOBeJOBeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJ eJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJ eJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJOJeJNh6hSGqVMYpk5hmDqFYeoUhqlTGKZOYZg6hWFy MsPkZIbJyQyTkxkmJzNMTmaYnMwwOZlhcjLD5GSGyckMk5OZJiczTU5mmpzMNDmZaXIy0+RkpsnJ TJOTmSYnM01OZpqczDQ5mWlyMtPkZKbJyUyTk5kmJzNNTmaanMw0OZlpcjLT5GSmyclMk5OZJicz TU5mmpzMNDmZaXIy0+RkpsnJTJOTmSYnM01OZpqczDQ5mWlyMtPkZKbJyUyTk5kmJzNNTmaanMw0 OZmJ9FoT6bUm0mtNpNeaSK81kV5rIr3WRHqtiXzgJ/KBn8gHfiIf+Il84CfygZ/IB34iH/iJfOAn 8oGfyAd+Ih/4iXzgJ/KBn8gHfiIf+Il84CfygZ/IB34iH/iJfOAn8oGfyAd+Ih/4iXzgJ/KBn8gH fiIf+Im4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4wom4 wom4wom4wkRcYSKuMBFXmIgrTMQVJuIKE3GFybhCU6cwTZ3CNHUK09QpTFOnME2dwjR1CtPUKUzT O3ya3uHT9A6fpnf4NL3Dp+kdPk3v8Gl6h0/TO3ya3uHT9A6fpnf4NL3Dp+kdPk3v8Gl6h0/TO3ya 3uHT9A6fpnf4NL3Dp+kdPk3v8Gl6h0/TO3ya3uHT9A6fpnf4NJncaTK502Ryp8nkTpPJnSaTO00m d5pM7jSZ3GkyudNkcqfJ5E6TyZ0mkztNJneaTO40mdxpMrnTZHKnyeSmyeSmyeSmyeSmyeSmyeSm yeSmyeSmyeQm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm 0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm0uUm 0uUm4goTcYWJuMJEXGEirjARV5iIK0zEFSbiChNxhYm4wkRcYSKuMBFXmIgrTMQVJuIKE3GFibjC RFxhIq4wEVeYiCtMxBUm4goTcYWJuMJEXGGamsg0NZFpaiLT1ESmqYlMUxOZpiYyTU1kmprINDWR aWoi09REpqmJTFMTmaYmMk1NZJqayDQ1kWlqItPURKapiUxTE5mmJjJNTWSamsg0NZFpaiLT1ESm qYlMUxOZpiYyTU1kmprINDWRaWoi09REpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnk psnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkpsnkJtLlJtLl JtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLlJtLl JtLlJtLlJtLlJtLlJtLlJtLlJtLlLqTLXUiXu5AudyFd7kK63IV0uQvpchfS5S7EFS7EFS7EFS7E FS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7EFS7E FS7EFS7EFS7EFS7EFS7GFZqayDQ1kWlqItPURKapiUxTE5mmJjJNTWSamsg0NZFpaiLT1ESmqYlM UxOZpiYyTU1kmprINDWRaWoi09REpqmJTFMTmaYmMk1NZJqayDQ1kWlqItPURC5TE7lMTeQyNZHL 1EQuUxO5TE3kMjWRy9RELpPJXSaTu0wmd5lM7jKZ3GUyuctkcpfJ5C6TyV0mk7tMJneZTO4ymdxl MrnLZHKXyeQuk8ldJpO7TCZ3mUzuMpncZTK5y2Ryl8nkLpPJXSaTu0wmd5lM7kK63IV0uQvpchfS 5S6ky11Il7uQLnchXe5CutyFdLkL6XIX0uUupMtdSJe7kC53IV3uQrrchXS5C+lyF9LlLqTLXUiX u5AudyFd7kK63IV0uQvpchfS5S6ky11Il7uQLnchXe5CutyFdLkL6XIX0uUuxBUuxBUuxBUuxBUu xBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUu xBUuxBUuxBUuxBUuxhWamshlaiKXqYlcpiZymZrIZWoil6mJXKYmcpmayGVqIpepiVymJnKZmshl aiKXqYlcpiZymZrIZWoil6mJXKYmcpmayGVqIpepiVymJnKZmshlaiKXqYlcpiZymZrIZWoil6mJ XKYmcpmayGVqIpepiVymJnKZTO4ymdxlMrnLZHKXyeQuk8ldJpO7TCZ3mUzuMpncZTK5y2Ryl8nk LpPJXSaTu0wmd5lM7jKZ3GUyuctkcpfJ5C6TyV0mk7tMJneZTO4ymdxlMrlLZHLzkehydxTore4o 0FvdUaC3uqNAb3VHgd7qjgK91R0Feqs7CvRWdxToreYj0eXuKFQbRJe7o1BtEF3ujkK1QXS5OwrV BtHl7ihUG0SXu6NQbRBd7o5CtUF0uTsK1QbR5e4oVBtEl7ujUG0QXe6OQrVBdLk7CtUG0eXuKFQb hCvcUag2CFe4o1BtEK5wR6HaIFzhjkK1QbjCHYVqg3CFOwrVBuEKdxSqDcIV7ihUG4Qr3FGoNghX uKNQbRCucEeh2iBc4Y5CtUG4wh2FaoNwhTuK3VO8DsR5LROTeR2I8xInJvM6EOeVT0zmdSDOC6KY zOtAnNdJL5moiTwvn2Iy8wSImsjzBismM0+AqIk8r8FiMvMEiJrI8y4tJjNPgKiJPC/kYjLzBIia yPNWLyYzT4CoiTxbA14yURN5NhLEZOYJEDWRZzdCTGaeAJHJPVsaYjLzBIhM7tkXEZOZJ0Bkcs/m ipjMPAEik3t2aMRk5gkQmdyzzeMlE5ncsykkJjNPgMjknp0lMZl5AkQm92xPicnMEyAyuWePS0xm ngCRyT0bZWIy1FslutwdhXqrRJe7o1Bvlehy85HocncU6q0SXe6OQr1VosvdUag2iC53R6HaILrc HYVqg+hydxSqDaLL3VGoNogud0eh2iC63B2FaoPocncUqg2iy91RqDaILndHodogutwdhWqD6HJ3 FKoNosvdUaQ2CuIKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IK C+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+MKRU3keS0Tk5kdCFETed7txGRmB0LU RJ4XRDGZ2YEQNZHnLVNMZp4AURN5XlXFZOYJEDWR531XTGaeAFETeV6axWTmCRA1kefNW0xmngBR E3le371koibyvOyLycwTIGoiz46BmMw8AaIm8mw7iMnME2BqIovJ5BaTyS0mk1tMJreYTG4xmdxi MrnFZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ3GIyucVkcovJ 5BaTyS0mk1tMJrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1uQbrcgnS5BelyC9LlFqTLLUiX W5AutyBdbkG63IJ0uQXpcgvS5Rakyy1Il1uQLrcgXW5ButyCdLkF6XIL0uUWpMstSJdbkC63IF1u QbrcgnS5BelyC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IK C+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKi6mJLKYmspiayGJqIoupiSymJrKY mshiaiKLqYkspiaymJrIYmoii6mJLKYmspiayGJqIoupiSymJrKYmshiaiKLqYkspiaymJrIYmoi i6mJLKYmspiayGJqIoupiSymJrKYmshiaiKLqYkspiaymJrIYmoii8nkFpPJLSaTW0wmt5hMbjGZ 3GIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRy i8nkFpPJLSaTW0wmtyBdbkG63IJ0uQXpcgvS5Rakyy1Il1uQLrciXW5FutyKdLkV6XIr0uVWpMut SJdbkS63Il1uRbrcinS5FelyK9LlVqTLrUiXW5EutyJdbkW63Ip0uRXpcivS5Vaky61Il1uRLrci XW5FutyKdLkV6XIr4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor 4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4gor4wpNTWQxNZHF1EQWUxNZTE1kMTWR xdREFlMTWU1NZDU1kdXURFZTE1lNTWQ1NZHV1ERWUxNZTU1kNTWR1dREVlMTWU1NZDU1kdXURFZT E1lNTWQ1NZHV1ERWUxNZTU1kNTWR1dREVlMTWU1NZDU1kdXURFZTE1lNJreaTG41mdxqMrnVZHKr yeRWk8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVkcqvJ5FaTya0m k1tNJreaTG41mdxqMrkV6XIr0uVWpMutSJdbkS63Il1uRbrcinS5FelyK9LlVqTLrUiXW5EutyJd bkW63Ip0uRXpcivS5Vaky61Il1uRLrciXW5FutyKdLkV6XIr0uVWpMutSJdbkS63Il1uRbrcinS5 FelyK9LlVqTLrUiXWxFXWBFXWBFXWBFXWBFXWBFXWBFXWBFX2BBX2BBX2BBX2BBX2BBX2BBX2BBX 2BBX2BBX2BBX2BBX2BBX2BBX2BBX2BBX2BBX2BBX2BBX2BBX2BhXaGoiq6mJrKYmspqayGpqIqup iaymJrKamshqaiKrqYmspiaymprIamoiq6mJrKYmspqayGpqIqupiaymJrKamshqaiKrqYmspiay mprIamoiq6mJrKYmspqayGpqIqupiaymJrKamshqaiKrqYmspiaymprIajK51WRyq8nkVpPJrSaT W00mt5pMbjWZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxu M5ncZjK5zWRym8nkNpPJbUiX25AutyFdbkO63IZ0uQ3pchvS5Taky21Il9uQLrchXW5DutyGdLkN 6XIb0uU2pLBtSGHbkMK2IYVtQwrbhlSvDaleG1K9NqR6bUj12pDqtSHVa0NK1IaUqA0pURtSojZE 0jVE0jVE0jVE0jVE0jVE0jVE0jXExDXExDXExDXExDXExDXExDXExDXExDXExDXExDXExDXExDXE xDXExDXExDXExDXExDXExDXExDXExDVTz9dMPV8z9XzN1PM1U8/XTD1fM/V8zdTzNVPP10w9XzP1 fM3U8zVTz9dMPV8z9XzNlOA1U4LXTAleMyV4zZTgNVPo1kyhWzOFbs0UujVT6NZMoVszhW7NlJM1 U07WTDlZM+VkzcQZm4kzNhNnbCbO2EycsZk4YzNxxmYSiM0kEJtJIDaTQGwmgdhMArGZBGIzCcRm EojNJBCbSSA2k0BsJoHYTAKxmQRiMwnEZhKIzSQQm0kgNpNATDQlSzQlSzQlS+Rem2i2lmi2lmi2 lmi2lmi2lsi9NpF7baI5XqI5XqI5XqI5XqI5XqI5XqI5XiL32kTutYlmholmholmholmholmholm holmholmholmholmholmhoncNxJNGhNNGhNNGhNNGhNNGhNNGhNNGhNNGhNNGhNNGhNNGhNNGhNN GhNNGhNNGhNNGhNNGhNNGhNNGhNNGhO5byRy30jkvpHIfSOR+0Yi941E7huJ3DcSuW8kct9I5L6R yH0jzalamlO1NKdqabpkpjmiS3NEl+aILs0RXZojujRdMtN0yUxzeJjm8DDN4WGaw8M0h4dpDg/T HB6m6ZKZpktmmmPNNMeaaY410xxrpjnWTHOsmeZYM82xZppjzTTHmmmONdN0aUlzRprmjDTNGWma M9I0Z6RpzkjTnJGmOSNNc0aa5ow0zRlpmjPSNGekac5I05yRpjkjTXNGmuaMNM0ZaaozUtOlJU2X ljRdWtJ0aUnTpSVNl5Y0XVrSdGlJ06UlTZeWNF1a0nRpSeRem8i9NpF7bSL32oXcaxdyr13IvXYh 99qF3GsXcq9dyL12IffahdxrF3KvXci9diH32oXcaxdyr13IvXYh99qF3GsXcq9dyL12Iffahdw3 FnLfWMh9YyH3jYXcNxZy31jIfWMh942F3DcWct9YyH1jIfeNhbjChbjChbjChbjChbjChbjChbjC hbjChbjChbjChbjCFe1Px1fFX978/PbHh/e//vLD08eHx7+3jKcj8jc/iyoCRqE6QgziQgziQgzi QgziQgziQgziQgziQgziQgziQgziQgziQgziQgziYgyi6aiZv+Oo+ebzm4efPnz86454+Pj086/v 3nz8Kvjhx3dv3v7y6eHXT09/fvjh3Ycf//rQZ2bpZb+PP374ePyhb9///PD+6e+fn95//nQk/PoV HH/q+zP600MZq736U/eX+fHp+Gt9/vDweIu7Zy7fG8WurOJbLrZhlmkVukyr0GVahS7TKnSZVqHL tApdplXoMq1Cl2kVukyr0GVahS7TKnSZVqHLtApdplXoMq1C1+9Yhf7h76Md/Mrvoxr7N9J+kbN8 3y+k4yX84y+k9phtvfpj4DfS61GshfIvvE+v/d6u/THrY8ny3e/Tb35xz9lffZ/Ib+7Xo1jT6F94 n/LV9+kQCbeV+b3vU/7z+/TY91v96s+hN+q1KNYn+xfeqPXaGzVqn7UclN13vlHrn96o2mLW/urP ffVXbpH3Y3vPH98ZCduD3keeabC1TIOtZRpsLdNga5kGW8s02FqmwdYyDbaWabC1TIOtZRpsLVMK sEwpwDKlAMuUAixTCrBMKcAypQDLlAIsUwqwTCnAMqUA69tSgAtt5H/+rfuPQbDB/Dsv6Yj8j6eP Hx5uXwQePr39j6f95XSNGfuDpp7fCo6f+fj05t3nt788/Z/7586f+f0Xvb8qHFn/+RvK/oITrfaY bT0+zte+/b6SZvzp9g/+8ubfn/bXpqc3H/dXJqmFLj538yPB1EYsUxuxTG3EMrURy9RGLFMbsUxt xDK1EcvURixTG7FMbcQytRHL1EYs5I+wkD/CQv4IC/kjLOSPsJA/wkL+CAv5Iyzkj7CQP8JC/ggL +SMs5I+wkD/CQv4IC/kjLOSPsJA/wkL+CAv5Iyzkj7CQP8JC/ggL+SMs5I+wkD/CQv4IC/kjLOSP sJA/wkL+CAv5Iyzkj7CQP8JC/ggL+SMsxHcvxHcvxHcvwnfvSxeojR0FamNHgdrYUaA2dhSojR0F amNHgdo4rrsoCtTGjkK1QfjuHYVqg/DdOwrVBuG7dxSqDcJ37yhUG4Tv3lGoNgjfvaNQbRC+e0ex e4rZgTC16cvUpi9Tm75MbfoytenL1KYvU5u+TG36MrXpy9SmL1Obvkxt+jK16cvUpi9Tm75Mbfoy tenL1KYvU5u+TG36MrXpy9SmL1Obvkxt+jK16cvUpi9Tm75MbfoytenL1KYvU5u+TG36MrXpy9Sm L1Obvky9w/odvQPqdIjJvBNw9kXEZN8+AX+EBh7Br6GBLWub0ev3oYHnS/jHwXufq776U9cJym9E sf6Q+J57Z/vsJonJvLN99p7EZN7ZPjtVYjLzbIuCh7PdJSYzT4AoeDh7ZmIy8wT8juABNd7EZOYJ +B28HHXvxGTmCRDx67MFKCZDXWPi/LCjUNeYOD/sKNQ1Js4P65E4P+wo1DUmzg87Ck0UiPPDjkK1 QZwfdhSqDeL8sKNQbRDnhx2FaoM4P+woVBsERd1RqDaIm8OOQrVB3Bx2FKoN4uawo1BtEDeHHYVq g7g57ChUG8TNYUeh2iBuDjsK1QYhJncUqg1CTO4oVBuEmNxRqDYIMbmjUG0QYnJHodogxOSOQrVB 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 TW1+NbX51dTmV1ObX01tfjW1+dXU5ldTm19NbX79tjb/wg39d8a1//92d//+Ac7xJ/6rAxzeLRCf sHn4zeVj1Vw+Vk35djXl29WUb1dTvl1N+XY15dvVlG9XU75dTfl2NeXb9dvy7QttGJW8qd8WgX9z gFyy9R5j1PjeAfJvX/SrA+TR2yyP4zEy4nF/U8hX5sevJNpfEP/wMx53obxHb0raqylpr6YGopoa iGpqIKqpgaimBqKaGohqaiCqqYGopgaimhqIamogqqmBqKYGopoaiGpqIKq5kK2aC9mqqYOopg6i mjqIauogqqmDqOZCtmoqB6qpHKimcqCayoFqKgcq8lmoiVrtCNmviVrtCMSviVrtCHivyDGhIseE ihwTKnJMqMgxoSLHhIocEypyTKjIMaEix4SKHBMqWmxW0WKzhuDohnwQGvJBaMgHoSEfhIZ8EBry QWjIB6EhH4SGfBAa8kFoyAehIR+EhnwQGvJBaMgHoSEwtiEwtiEwtiEwtiEwtiEwtiEwtiEwtiEw tiEwtiEwtiEwtiEwtiEwtiEwtqFNZw0NmRpCUhtCUhtCUhtCUhtCUhtCUhtCUhtCUhtCUhtCUhtD Uk3ldjUXYldzIXY1F2JXcyF2NRdiV3MhdjUV0dVURFdTEV1NRXQ1FdHVVERXUxFdTUV0NRXR1VRE V1MRXc3VadVcndbM1WnNXJ3WTFFvM0W9zRT1NlPU20xRbzNFvc0U9TZT1NtMUW8zRb3NFPU2U9Tb TFFvM0W9zUS0m4loNxPRbiai3UxEu5mIdjMR7WYi2s1EtJuJaDcT0W4mot1MRLuZiHYzEe1mrk9r 5vq0ZnLKzeSUm8kpN5NTbian3ExOuZmccjM55WZyys3klJvJKTck6W5I0t2QpLsF6q0iQLYhmXZD Mu2GZNoNybQbkmk3JNNuSKbdkEy7IZl2QzLthmTaDcm0G5JpNyTTbkim3ZBMuyGZdkMy7YZk2g3J tBuSaTck025Ipt2QTLshmXZDMu2GZNoNybQbkmk3JNNuSKbdEFfYEFfYEFfYEFfYEFfYEFfYEFfY EFfYEFfYEFfYEFfYEFfYEFfYEFfYEFfYEFfYEFfYEFfYEFfYEFcYiCsMxBUG4goDcYWBuMJAXGEg rjAYV2jqRJupE22mTrSZa36buea3mZrIZmoim6mJbKYmspmayGZqIpupiWymJrKZmshmaiKbqYls piaymZrIZmoim6mJbKYmspmayGZqIpupiWymJrKZmshmaiKbqYlspiaymZrIZmoim6mJbKYmspma yGZqIpupiWwmk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJ bSaT20wmt5lMbjOZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3EC63EC63EC63EC63EC63EC63EC6 3EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EC6 3EC63EC63EC63EC63EC63EC63EC63EC63EC63EC63EBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxh IK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDFMT GaYmMkxNZJiayDA1kWFqIsPURIapiQxTExmmJjJMTWSYmsgwNZFhaiLD1ESGqYkMUxMZpiYyTE1k mJrIMDWRYWoiw9REhqmJDFMTGaYmMkxNZJiayDA1kWFqIsPURIapiQxTExmmJjJMTWSYmsgwmdww mdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdww mdwwmdwwmdwwmdwwmdwwmdwwmdwwmdxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxA utxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutxAutyOdLkd6XI7 0uV2pMvtSJfbkS63I11uR7rcjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjC jrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCjrjCzrhCUxMZpiYyTE1kmJrI MDWRYWoiw9REhqmJDFMTGaYmMkxNZJiayDA1kWFqIsPURIapiQxTExmmJjJMTWSYmsgwNZFhaiLD 1ESGqYkMUxMZpiYyTE1kmJrIbmoiu6mJ7KYmspuayG5qIrupieymJrKbmshuMrndZHK7yeR2k8nt JpPbTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJreb 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 KlqnqWidpqJ1morWaSpapyn1nKbUc5pSz2m6+E3TxW+aLn7TxLCmiRRNEymaJlI0TaRomkjRNJGi aSJF00SKpokUTRMpmiZSNE2kaJpI0TRl2NPkk6bJJ02TT5omnzRNPmmafFIiY7NE7dNE7dNE7dNE 7dNE7dNE7dNEMtJETddEMtJEMtJEMtJEMtJEzeREzeREzeREzeREzeREzeREzeREzeREzeREzeRE zeREzeREzeREzeREzeREzeREzeREzeREzeREzeRExoGJJKuJJKuJJKuJjAMTCUITCUITCUITCUIT iTQTiTQTiTQTiTQTiTQTiTQTyS0TyS0TCScTCScTCScTCScTCSfTdI9LswuYZhcwzS5gml3ANLuA aXYB01R2ptlSTFPZmaayM01lZ5rKzjTbsGm2YdNsw6bZhk2zDZtmGzbNNmyabdg027BptmHTbMOm 2YZNsw2bZhs2zTZsmm3YNNuwabZh02zDptqGNd0w09Scpqk5TVNzmr/jGInuwGIy82maYsw0xZhp Sh7TlDymKXlMU/KYpuQxTcljmirFNFWKaQoL0xQWpiksTFNYmKawMJGHUyIPp0QeTok8nBJ5OOVE bSrk/JRIt5dIt5eJnnKip5zoKSNlYSJlYSJlYSJlYSJlYSJlYSJlYSJlYSJlYSJlYSJlYSJlYSJl YSJlYSJl4ULKwoWUhQspCxdSFi6kLFxIWbiQsnCh/YILYTgL7RdcCN5ZCN5ZCN5ZCN5ZCN5ZCN5Z CN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5ZCN5Z DN4xLVrStGhJ06IlTYuWNC1ajsubmMzsJZgC1zQFrsfFUExmFm2aRWvqeNPU8aap401Tx5umjjdN HW+aOt40dbxp6njT1PGmqeNNU8ebpo43TR1vmjreZep4l6njXaaOd5k63mXqeJep412mjneZm2mX yRYuczPtMkHFZYKKywQVlwkqLhNUXCaouExQcZmg4jJBxWWCissEFZcJKi4TVFwmqLhMUHGZoOIy QcVlgorLBBWXCSouE1RcJqi4TFBxmaDiMkHFJYKK9ZGMonYUaBvuKNA23FGgbbijQNtwR4G24Y4C LeUdBVrK9ZGMh3YUel5k0LOj0DtPBj07Cr3zZNCzo0Azf0eBZn59JIOeHYWeMhn07ChUG2TQs6NQ bZBBz45CtUEGPTsK1QYZ9OwoVBtk0LOjUG2QQc+OQrVBVNo7CtUGUWnvKFQbRKW9o1BtEJX2jkK1 QVTaOwrVBlFp7yhUG2Qd8Y5CtUF05DsKPWWiI99R6CmTxcI7Cj1lolnfUeh5EfX5jkJPmajPdxT7 Zu7dH8+LiJjMuz+e1xYxmXd/PC85YjKvg3JeibxkYq/6vECJyczSENvL5y1MTGaWhthePq9yYjKv uXZe/MRkZtGK7eXz9igmM0+A2F4+r6BiMvMEiO3l8x7rJRPby+etV0xmngCxvXxencVk5gkQdfDn /VtMZp4AUQd/XuLFZOYJEHXwZydATGaeAFEHf7YTxGTmCRAXOZ89CS+ZKPc/OxhiMrNoRbn/2QYR k5lFKxoRnL0UL5noHXB2XsRkZtGK65LrI9Fk7ijUOCOazB1F2m0FDcILGoQXNAgvaBBe0CC8oEF4 QYPwggbhhWgydxSqDTR0L2joXogmc0eh2kCj+oJG9QWN6gsa1Rc0qi9oVF/QqL6gUX1Bo/qCRvUF jeoLGtUXNKovaFRf0Ki+oFF9QaP6gkb1BY3qCxrVFzSqL2hUX9CovqBRfUGj+oJG9QWN6gsa1Rc0 qi9oVF/QqL6gUX1Bo/qCRvUFjeoLGtWXjmoDDfgLGvAXNOAvaMBf0IC/oAF/QQP+QkzpdxTCAkTh 3nktE5OZ/SRRuHfe7cRk4j2/mMhBMZGDYiIHxUQOiokcFBM5KKJw77yqeslMGKKYMEQRhXvnNVhM Zp4Ak6woJllRTLKimGRFMcmKYpIVxSQriklWFJOsKCZZUUyyophkRTHJimKSFcUkK4pJVhSTrCgm WVFMsqKYZEUxyYpikhXFJCuKSVYUk6woJllRTLKimGRFMcmKYpIVxSQriklWFJOsKCZZUUyy4ugs icnME2BiGsXENIqJaRQT0ygmplFMTKOI+yLORpmXDMlqCpLVFCSrKUhWU8gqyB2FeqsD9VbJAskd hXqrZIFkLWSB5I5CtUG2NuwoVBtka8OOQrVBtjbsKFQbZGvDjkK1QXY97ChUG2TXw45CtUF2Pewo VBtk18OOQrVBdj3sKFQbZNfDjkK1QXY97ChUG2TXw45CtYG4woK4woK4woK4woq4woq4woq4woq4 woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4woq4 wsq4QpO5LyZzX0zmvpjMfRGX/51XPjGZ2YEQNwme90YxmdmBEDcJnpdPMZl5AsT9F+cNVkxmngBx /8V5DRaTmSdgmidAXKZxXrHFZOYJEJdpnPd0MZl5AsRlGudlX0xmngBxmcbZMRCTmSdAXKZxth3E ZOYJEJdpnL0LMZl5Akwmt5hMbjWZ3GoyudVkcqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHKryeRW k8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbkW6pop0TRXpmirSNVXEZVTEZVTE ZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTEZVTE ZVREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWFREWDREWDRE WDREWDREWDREWDREWDREWDREWDREWDREWDREWDREWDREWDREWDREWDREWDREWDRGWJhEezWJ9moS 7dUk2qtJVFSTqKgmUVFNoqKaREU1iYpqEhXVJCqqSVRUk6ioJlFRTaKimkRFNYmKahIV1SQqqklU VJOoqCZRUU2ioppERTWJimpCENWEIKoJQVQTgqgmBFFNCKKaEET9HQjizec3Dz99+PjXHfHw8enn X9+9+fhV8MOP7968/eXTw6+fnv788MO7Dz/+9WH/Kq7H27e/6P744ePxp759//PD+6e/f356//nT kfHrl3D8se/P8E8PJWPM8urP3V/px6fjb/b5w0M/LEXO4Hv6+n2BrClhnkmT8agm41FNxqOajEc1 GY9qMh7VZDyqyXg0k/FoJuPRTMajmYxHMxmPZjIezWQ8msl4NJPxaCbj0UzGo5mMRzMZj2YyHs1k PJrJeDST8Wgm49GQWqghtVBDaqGG1EINuZA35ELekAt5Qy7kDbmQN+RC3pALeUMu5A25kDfkQt6Q C3lDLuQNuZA35ELekAt5Qy7kDbmQN+RC3pALeUMu5A25kDfkQt6QC3lDzuANOYM35AzekDN4Q87g DTmDN+QM3hBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB 1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB1xBB15CzUUPcXTPp8mbS5c2ky5tJlzfT8bmZjs/NdHxu puNzMx2fm+n43EzH52Y6PjfT8bmZjs/NdHxupuNzMx2fm+n43EzH52Y6PjfT8bmZjs/NdHxupuNz Mx2fm+n43EzH52b6KjfTV7mZvsrN9FVupq9yM32Vm+mr3EwKtZkUajMp1GZSqM2kUJtJoTaTQm0m hdpMCrWZFGozKdRmUqjNpFCbSaE2k0JtJoXaTAq1mRRqMynUZlKozaRQm0mhNpNCbSaF2n6HQv1D oG8HvwL0lcc552PM8vh9QN/xEv4R6OuP8zHj1Z/7isv7Dc33Cgb4ehRrnonvunm6TVw30M7cQJOx QJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOx QJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQJOxQI4UgRwpAjlSBHKk CORIEciRIpAjRSBHikCOFIEcKQI5UgRypAjkSBHIkSKQI0UgR4qOHCk6cqToyJGiI0eKjhwpOnKk 6MiRoiNHio4cKTpypOjIkaIjR4ow91CGOS8Jc14S5rwkzHlJmPOSMOclYc5LwpyXhDkvCXNeEua8 JMx5SZjzkjDnJWHOS8Kcl4Q5LwlzXhLmvCTMeUmY85Iw5yVhzkvCnJeEOS8Jc14S5rwkzHlJmPOS MOclYc5LwnTtCHOmEOZMIdSZgmkBEqYFSJgWIGFagIRpARKmBUiYe1DC9MgI0yMjTI+MMD0ywvTI CNMjI0yPjDA9MsL0yOimR0Y3PTK66ZHRTY+MbnpkdNMjo5seGd30yOimR0Y3PTK66ZHRTY+Mjhxd O3J07cjRtSNH144cXTtydO1oZ25HO3M7csHoyAWjIxeMjlwwOnLB6MgFoyMXjI5cMDpywejIBaMj F4yOXDA6csHoyAWjIxeMjlwwOnLB6MgFoyMXjI5cMDpywejIBaMjF4yOXDA6csHoyAWjIxeMHqg2 EFfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEVfYEd3WEd3WEd3W Ed3WEd3WTae8bjrlddMpr5tOed10yuumU143tyF2cxtiN/0quulX0U2/im76VXTTr6KbfhXd9Kvo pl9FN/0quulX0U2/im76VXTTr6KbfhXd9Kvopl9FN/0quulX0U2/im76VXTTr6KbfhXd9Kvopl9F N/0quulX0U2/iuOqLCYzT4BJhnaTDO0mGdpNMrSbZGg3ydBukqHdJEO7SYZ2kwztJhnaTTK0m2Ro N8nQbpKh3cT/uon/dRP/6yb+1038ryMJYEcSwI4kgB1JADsS83Uk5utIzNeRmK8jMV9HYr6OxHwd ifk6EvN1JObrSMzXkZivI4FdRwK7jgR2HQnsOhLYDSSwG0hgN5DAbiCB3UACu4EEdgMJ7AYS2A0k sBtIYDeQwG4ggd1AgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBA gNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBAgNBggJApbuqmuKmb4qZuipu6qUfqph6p m3qkbuqRuqlH6qYeqZt6pG7qkbqpR+qmHqmbeqRu6pG6qfrppuqnm6qfbqp+uqn6GabqZ5iqn2Gq foap+hmm6meYqp9hqn6GqfoZpupnmKqfYap+hqn6GSbvN0zeb5i83zB5v2HyfsPk/YbJ+w2T9xsm 7zdM3m+YvN8web9h8n7D5P2GyfsNk/cbJu83TN5vmLzfMHm/YfJ+w+T9hsn7DZP3GybvN0zeb5i8 3zB5v4kaZhM1zCZqmE3UMJtIUTeRom4iRd1EirqJFHUTKeomUtRNpHKbSOU2kcptIpXbRHq1ifRq E+nVJtKrTaRXm0ivNpFebSK92kR6tYn0ahP54E/kgz+RD/5EPvgT+eBP5IM/kQ/+RErBiZSCEykF J1IKTqQUnAiCmwiCmwhnm8jRfiIIbiIIbiIIbiIwbSIwbSIwbZrfjqf57Xia346n+u3YVMNMUw0z TTXMNNUw01TDTFMNM001zDQ1J9PUnExTczJNzck0ZSLTlIlMUyYyTZnINGUi05SJTFMmMk2ZyDRl ItOUiUzTQHyaBuLTNBCfpoH4NA3Ep2kgPk0D8WkqiKapIJqmgmiaCqJpKoimydhNk7GbJhY3Tc/v aTJ202TspsnYTZNkmybJNk2SLREVnIgKTkQFJ6KCEw05Eg05Eg05Eg05Eg05Eg05Eg05Eg05Eg05 Eg05Eg05EtkGJrINTDRQSTRQSTRQSTRQSWQbmGgMk2gMk2gMk2gMk2gMk2igkmigkmigkmigkmig kmigkmigkmigkmigkmigkmigkmigkmigkmigkmigkmigkmigkmigkshVINEYJtEYJtEYJtFAJZGr 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 9pppF3vNtIu9ZtpFXzNJXzPp7Jo5v91qyJXUkCupIVdSQ66khlxJDbmSGnIlNeRKasiV1JArqSFX UkOupIZcSQ25khpyJTXkL2rIX9SQU6ghnbMhnbMhnbMhnbMhnbMhnbMhnbMhnbMhnbMhnbMhnbMh nbMhnbMhnbMhnbMhnbMhnbMhnbMhnbMhnbMFqo1AtRGoNgLVRrAnB1HoaCaj3UxGu5mMdjMZ7WYy 2s1ktJvJaDeT0W4mo91MRruZjHYzGe1mMtrNZLSbiVU3E6tuJgndTEKjmYRGMwmNZhIazSQ0mklo NJPQaCah0UxCo5mERjMJjWYSGs0kNJpJaDST0GgmodFMQqOZhEYzCY1mHgTfzIPgm3kQfDMPgt82 MGIycQUMtO0eaNs90LZ7oG33QNvugbbdA227B9p2j1XjbwkHo9jS2Ci2NDaKLY2NYktjo9jS2Ci2 NDaKLY2NYktjo9rS2Ki2nDyqvmaqvmaqvmaqvmaqvmaqvmaqvmaqvmaavmaavmaavmaavmaavmaa vmaavmaavmaavmaavma6vma6vma6vmb62TXDdgm3thxvWuFW8PP7/xcrXJuXWWuvdzrhtnfwr064 cviS5/d4wgl3HMW2RD/wFbXDr2isr2gTpO78itpbZsH1EvQVHUWx/d8PfEX94Cvql4jSLvdXUf+3 r+jww3b0FR1Fsc2uuLcXe0jjlR7SHRdvHl28kldxpzzuvXjz3y/eYYFPdPWOolgjgH9HcTn6jupl vbtV4Xd+R3H5t+8oH76EfEWHUazr4dXk7Ybfm7+auhFr6EasoRuxhm7EGroRa+hGrKEbsYZuxBq6 EWvoRqyhG7GGbsQauhFr6EasoRuxhm7EGroRa+hGrKEbsYZuxBq6EWvoRqxx2oh1/qd6IhB6ooMW JsKnJzr8YKLDDyY6/GCiYwwmOsZgomMMJjrGYKJjDCY6xmCiYwwmOsZgomMMJjrGYKIxbBONYZvI aDCR0WAio8FERoOJjAYTGQ0msgxMZBmYyDIwkWVgIsvARJaBidiFidiFidiFidiFidiFidiFidiF idiFiSwDE1kGJrIMTGQZmIFqI1BtBKqNQLUxUG0MVBsD1cZAtYGOXJ3oyNWJjlyd6MjViY5cnejI 1YmOXJ3oyNVpIuzTnAw+TR5+mvO3pzl/e5rzt6c5MnuaI7OnOTJ7miOzpzkye5ojs6c5MnuaI7On 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 uyqmdlVM7aqY2lUxtatialdFHMWzt2LEZOYKEEfx7P0cMZm5AsS5PntTSExmrgBxrs/eWRKTmStA nOuzt6e8ZOJcn72ZJSYzV4A412fviInJzBVAbK8rCvU7ie11RaF+J+IyCiIsCiIsCiIsCiIsCmIl CmIlCmIlCqIeCuIXCuIXCiIRCiIRCiIRCiIRCiIRCiIRCiIRCiIRCiIRCiIRCiIRCiIRKiIRKiIR KiIRKiIRKiIRKiIRKiIRKiIR0KEPKwrVBiIRKiIR0AETKwrVBiIRKiIR0GEWGR1mkdFhFhkdZpEr IhHQERgZHYGR0REYGR2BkdERGBkdgZHRERgZHYGR0REYGR2BkdERGPuOQ9y+mDtb0SC6b1vEZObO 1gQTigkmFBNMKCaYUEyWoJgsQTFZgmLK/8VU7Iup2BdTZC+myF5Mkb2YInsxRfZiiuzFFNmLKbIX U2QvpsheTJG9mCJ7NUX2aors1RTZqymyV1Nkr6bIXk2RvZoiu3l2y75b95KZIns1RXbzVJm9EyAm M1eAKbKb591k87ybbJ53k83zbvZWhZjMXAGmyG4enpPNw3OyeXhONg/PyebhOdk8PCebh+dk8/Cc bB6ekzuSwTqSwTqSwTqSwTqSwTqSwTqSwTqSwTqSwTqSwTqSwTqSwQLJYIFksEAyWCAZLJAMFkgG CySDBZLBAslggWSwQDJYIBkskAwWSAYLJIMFksECyWCBZLBAMlggGSyQDBZIBgskgwWSwQLJYIFk sEAyWCAZLJAMFkgGCySDBZLBAhlyAxlyAxlyAxlyg5wEv6JQbZCT4FcUqg1yEvyKQrVBToJfUag2 yEnwKwrVBjkJfkWh2iDnx68oVBvk/PgVhfYppnbVTe2qm9pVN7WrbmpX3dSuuqlddVO76qZ21U3t qpvaVTe1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1 qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzC1qzANomEaRMM0iIZp EN36OWIycwUUcwUUcwVUcwVUcwVUcwVUcwVUcwVUcwVUcwVUcwVUcwVUcwU0cwU0cwWQs81XFOqt krPNVxTqrZKzzVcU6q2Ss81XFOqtkrPNVxTqu5OzzVcUqg1yIvqKQrVBTkRfUag20ECJQAMlAg2U CDRQItBAiUAHfQQaQxFoDEWgMRSBxlAEOugj0PCKQMMrAg2vCHTQR6CRF4EO+gg0KCPQoIxAB30E 4goDcYWBuMJAXGEgQjAQIRiIEAxECAYiBAMRggOxfgOxfgOxfgOxfgOxfgOxfgOxfgOxfgOxfgOx fgOxfgOxfgOxfgNRe4NRe+KZ7fumR0xm7u/FM9v3nZOYzNzfi2e279svL5l4Zvu+WROTmSugmytA PAB+3wiKycwV0M0VYA4LCXNYSJjDQsIcFhLmsJAwj0QJc/JImJNHwpw8EubkkTCPRAlzjEmYY0zC HGMS5pEoYc5ECfNIlDAHrIQ5YCXMI1HCJF7DJF7DJF7DJF7DhFTDhFTDhFTDhFTDhFTDhFSHyZUO kysdJlc6TK50mFzpMLnSYXKlw+RKh8mVDpMrHSZXOkyudJhc6TBR0GGioBO1viayuU7UMJuoYTaR zXUim+tENteJbK4T2VwnsrlOZHOdyOY6kWF1IsPqRIbViaynE1lPJ7KeTmQ9nch6OpH1dCLr6UQm 0olMpBPZQScydk5k0ZzIojmRRXMis+VEtslp/uBO08gxzV/v6f56i4+c0zRyTNPIMU0jxzSNHNM0 ckzTyDFNI8c0vRfT9F5M03sxTbvENO0S07RLTNMuMU27xDTtEtO0S0zT4TBNh8M0TQnT9BFME/2f Jvo/TfR/mrT+lAD73KKO0zNbrlEnH7evUScfFa9RJzdVT1FnH9KvUSc3Vdeok4/216iTm6pr1MkN wTXq5IbgGoVq4+zMlmsUqo2zM1ueos5uPq5RqDbOukeuUegqn3WPXKPQVT7rHrlGoat81j3yFHXW PXKNQlf5rHvkGoVq46wP5CnqrF/iGoXq8Kwb4RqF6vCsG+EaherwrBvhKeqsG+EaherwrBvhGoXq 8Kwb4RqFauOsr+Aaha7yWV/BU9RZX8E1Cl3ls/OKr1HoKp91I1yj0FU+60a4RqHaOOtGuEah2pB8 9C+P3mIyZ1/y8qDuJZO2rC+P9WIyZ//7sgkQkzmb6Zctg5jMXAGSj/5l3yEmM1eAus2XfPQvexox mVm0kjnkZWMkJjOLVjKHvOyuvGSSOeRlLyYmM2/bkjnkZUPnJZO8CS/bPzGZ+jHNtSlB+y9bSzGZ uTYlaP9lfyomM9emBO2/bHLFZOYKkDj7l52ymMwsWomzf9lui8nMopWg/Zc9u5jMLFoJ2n/Z+IvJ zBUgTZYel8u81LPw3TXqZN/mGnWyb3ONOtm3uUad7Ntco072ba5RJ/s2T1FnNcRr1Mme3jUKXeWz auA1Cl3ls2rgNQpd5bNq4DUKXeWzauA1Cl3lsxPorlGoNs4qdNco9M2fVeieos4qdNco9M2fVeiu UeibPzvf7RqF1tfZmWvXKHS9zmqI1yh0vc7OXLtGoet1VuW8RqG76FmV8xqF1vJZlfMahWrjrMp5 jUK1cVZDvEahz3VW17tGoc91Vte7RqGaP6vrXaPY86GzuXl5sBWTOZubl8dgMZmzuXl5aBaTmZsb SeZ7efIWk5lFKylzL4/vYjKzaCVl7mUPcCvZuy/vHn7+9PlvK+Lh8+Mvf/727vN3wQ8ffnv36+9/ PPz5x+NPD+9/+/Thbw+pXC6l5nSpf/nw6fP2V3/9+MvDx8d/fnn8+OWPLeP3b2H7sx/38D8ecs+p 1sPXPb/Tz4/bJ/vy6eHyFPmcO90bxbY93rcuqY4vmyQxmdNve9lSicnMspe0vZd9mZdM0vZednFi MrM0JG3vZSsoJjPv1dJ4tZf9pJdMkjBfdp9iMrPOpPFqL1tYMZn5gCEptS/7YDGZuQIkpfZlMy0m M1eAJGG+7Mi9ZJJQ+LJ/F5OZdw1JKHxpAojJvNLI9exslmsUaJOtKNAmW1GgnZTr2dks1yjQTlpR oMWzokCLZ0Wh63V2yso1Cl2vs7NZnqLOzma5RqHrdXY2yzUKtP8ykoczkoczkoczkoczkoczkocz EtgyEtgyEtj2u6h4S/aevfZ7Lm3ubMFHzZ21CbmMuIxxV3Nnfwv/1txZj3D9cvi6882dG1HsZ8b7 1qW5Ji8/SmIy70lk/wkTk5lrSBpF8vI7KCYz60yaa/LyYyom857Fs6lrZVPXyqaulU1dK5u6VjZ1 rWzqWtlsCWezJZxfaQk/XP/zHw/vfvn46eG/PZx8PO/10lucHT/5HHXukfk56twj83PUuYff56hz D7/PUecefp+j2Dd/7tHyOerco+U16uTG6DkKXeWTG6PnqHMbo+coVBsnN0bPUag2Tm6MnqNQbZzc GF2jTnKzz1GoNk7O3nmOQrVxkrZ9jkK1cZK2fY5CtXGStn2OQrVxkrZ9jkK1cZK2fY5CtXFyYs9z FKqNkxN7nqNQbZxsVzxHodo4yQM/R6HaOMkDP0eh2jjJAz9Hodo4SRE/R6HaOMkeP0eh2jjJHj9H odo4yR4/R6HaOMkeP0eh2jjJHj9Hodo4yR4/R6HaOMkeP0eh2jg5Yek5CtWG0677usESkyltlK/b MTGZ0vn4unkTkyktga9bPTGZ0vn4ujEUk5lF6/T+vu4uxWTmCnB6f1+3qGIycwU4vb+v+1wvmcO0 f90Vi8nMFeAA8l+31mIycwU4gPzX/bmYzFwBDkT+dZMvJjNXgAORf+0UiMnMFeDMwfrabhCTmSvA EUa+9iy8ZA4r/7XDISYzV4DDyn9tk4jJzBXggPdfey1iMnMFOBT/14aNmMxcAQ7F/7XrIyYzV4BD 8X9tHYnJzBXgUPxf+09eMofi/9qtEpOZK8CZt/acDLVDTw4EeI5C7dCTo8ifo1A79OTIgmvUyZEF z1GoHXpyZMFzFGqHnhxZ8ByFauPkKPLnKFQbJ0eRP0eB2hiXC6iNFQVqY0WB2lhRoDZWFKiNFQVq Y0WB2lhRoDZWFKiNjfMiUQnVRkK1cfJM6ecoVBsnz5R+jkK1cdK39ByFauOkb+k5CtUGgfpWFKoN AvWtKFQbBAVcUag2CAq4olBtEBRwRaHaICjgikK1QVDAFYVqg6CAKwrVBkEBVxSqDYICrihUGwQF XFGoNggKuKJQbRAUcEWh2iAo4Ipi+xSzA+GYxb/u1sRkZgfCGZ79dcvnJXM88V83iGIyswPheOK/ 7jLFZOYKcIZnf92qisnMFeAMz/663xWTeStg3x2LybwVsO+lxWTeCth33mIybwXs+3QxmbkCkrkC krkCkrkCkrkCkrkCkrkCHEf/17aDmMxcAY7r/WvvQkxmrgARo90bIGIycwWITO7eRRGTmStAZHL3 VoyXTGRy98aNmMxcASKTu3d/xGTmChCZ3L2FJCYzV4DI5O59KDGZuQJEJndvZonJzBUgMrl7R0xM Zq4AYqVdUai3Sqy0Kwr1VomVdkWh3iqx0q4o1FslVtoVhfruxEq7olBtECvtikK1Qay0KwrVBrHS rihUG8RKu6JQbRAr7YpCtUGstCsK1Qax0q4oVBvESruiUG0QK+2KQrVBrLQrCtUGsdKuKFQbxEq7 olBtEK5wRaHaIFzhikK1QbjCFYVqg3CFKwrVBuEKVxSqDcIVrihUG4QrXFGoNghXuKJIbSTEFSbE FSbEFSbEFSbEFSbEFSbEFSbEFSbEFSbEFSbEFSbGFYqeyH1b5iUTPZH7Jk5MZnYgRE/kvhMUk5kd iFc8ka/ML34JPphfnLcxAHltwdJb84u/voXtzz7PL163xdnz4eue3+ld84tfi2JbZfFbN1e36Pfc 99tiMnN1i37PfdMuJjNXt+j33Hf+YjJzBYh+z7194CUT/Z57s0FMZq4A0e+5dyzEZOYKEP2ee9tD TGauANHvufdOxGTmChD9nnsDRkxmrgCRN967OGIycwWIvPHeCvKSibzx3jgSk5krQOSN9+6TmMxc ASJvvLewxGTmCjB542TyxsnkjZPJGyeTN04mb5xM3jiZvHEyeeNk8sbJ5I2TyRsnkzdOyHOckOc4 Ic9xQp7jhDzHCXmOE/IcJ+Q5TshznJDnOCHPcUKe44Q8xwl5jhPyHCfkOU7Ic5yQ5zghz3FCnuOE PMcJeY4T8hwn5DlOyHOckOc4Ic9xQp7jhDzHCXmOE/IcJ+Q5TshznJDnOCHPcSKe4xWFagMxkwkx kwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkxkwkx kwkxkwkxkwkxkwkxkwkxkwkxk8n0eybT75lMv2cy/Z7J9HumV/yeb0ILK/gAWmilz0vaZibcxSxs 7+BfmYVW5jhAFtbLALJwHMX2uOJ3bvZWTCdrMp2syXSyJtPJmkwnazKdrMl0sibTyZpMJ2synazJ dLIm08maTCdresXJ+vadupQjvKxG7ZvfNu68Va+38K+36jrXE8bhy8it+jCKtUvEL91c3KZJN5km 3WSadJNp0k2mSTeZJt1kmnSTadJNpkk3mSbdZJp0k2nSTSYknkxIPJmQeDIh8WRC4smExJMJiScT Ek/iwTl7/0xMZq4AE6ROJkidTJA6mSB1MkHqZILUyQSpkwlSJxOkTiZInUyQOpkgdTJB6mSC1MkE qZMJUicTpE7IKJ6QUTwho3hCRvGEjOIJGcUTMoonZBRPyCiekFE8IaN4QkbxhIziCRnFEzKKJ2QU T8gonpBRPCGjeEJG8YSM4gkZxRMyiidkFM/IKJ6RUTwjo3hGRvGMjOIZGcUzMopnZBTPyCiekVE8 I6N4RkbxjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQ jGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQjGDQzGBQ08iaTCNrMo2syTSyJtPImkwjazKNrMk0 sibTyJpMI2syjazJNLIm08iaTCNrMo2syTSyJtPImkwjazKNrMk0sibTyJpMI2syjazJNLJm08ia TSNrNo2s2TSyZtPImk0jazaNrNk0smbTyJpNI2s2jazZNLJmE6TOJkidTZA6myB1NkHqbB6ck03c OJu4cTZx42zixtnEjbOJG2cTN84mbpxN3DibuHE2ceNs4sbZxI2ziRtnEzfO5sE52WRys8nkZpPJ zSaTm00mN5tMbkZm6ozM1BmZqTMyU2dkps7ITJ2RmTojM3VGZuqMzNQZmakzMlNnZKbOyEydkZk6 IzN1RmbqjMzUGZmpMzJTZ2SmzshMnZGZOiMzdUZm6ozM1BmZqTMyU2dkps7ITJ2RmTojM3VGZuqM zNQZmakzMlNnxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVmxBVm xBVmxBVmxBVmxBVmxBVmxBVmxBVmxBUWxBUWxBUWxBUWxhWanshseiKz6YnMpicym57IbHois+mJ zKYnMpueyGx6IrPpicymJzKbnshseiKz6YnMpicym57IbHois+mJzKYnMpueyGx6IrPpicymJzKb nshseiKz6YnMpicym57IbHois+mJzKYnMpueyGx6IrPpicymJzKbTG42mdxsMrnZZHKzyeRmk8nN JpObTSY3m0xuNpncbDK52WRys8nkZpPJzSaTm00mN5tMbjaZ3GwyudlkcrPJ5GaTyc0mk5tNJreY TG4xmdxiMrnFZHIL8uUW5MstyJdbkC+3IF9uQb7cgny5BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8 uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5BflyC/Ll FuTLLciXW5AvtyCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCu sCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusCCusJieyGJ6IovpiSymJ7KYnshieiKL 6YkspieymJ7IYnoii+mJLKYnspieyGJ6IovpiSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYn spieyGJ6IovpiSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYnsphMbjGZ3GIyucVkcovJ5BaT yS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wm t5hMbjGZ3GIyucVkcgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7c gny5BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIr 8uVW5MutyJdbkS+3Iq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6w Iq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wMq7Q9EQW0xNZTE9kMT2RxfREFtMT WUxPZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUxPZDE9kcX0RBbTE1lMT2Qx PZHF9EQW0xNZTE9kMT2RxfREFtMTWUxPZDE9kdX0RFbTE1lNT2Q1PZHVZHKryeRWk8mtJpNbTSa3 mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVkcqvJ5FaTya0mk1tNJreaTG41mdxq MrnVZHKryeRWk8mtJpNbkS+3Il9uRb7ciny5FflyK/LlVuTLrciXW5EvtyJfbkW+3Ip8uRX5civy 5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdbkS+3Il9uRb7ciny5FflyK/LlVuTLrciX W5EvtyJfbkW+3Ip8uRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVx hRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhRVxhdX0RFbTE1lNT2Q1PZHV9ERW 0xNZTU9kNT2R1fREVtMTWU1PZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1P ZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1PZDU9kdVkcqvJ5FaTya0mk1tN JreaTG41mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ 3GoyudVkcqvJ5FaTya0mk1uRL7ciX25FvtyKfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5Dfly G/LlNuTLbciX25AvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uQL7chX25DvtyGfLkN+XIb8uU25Mtt yJfbkC+3IV9uQ77chny5DXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGF DXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFjXGFpieymp7Ianoiq+mJbKYn spmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvpiWymJ7KZnshm eiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlsJpPbTCa3mUxuM5nc ZjK5zWRym8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKb yeQ2k8ltJpPbTCa3mUxuM5nchny5DflyG/LlNuTLbciX25AvtyFfbkO+3IZ8uQ35chvy5Tbky23I l9uQL7chX25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFf bkO+3IZ8uQ35chvy5Tbky22IK2yIK2yIK2yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yI K+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yMKzQ9kc30RDbTE9lMT2Qz PZHN9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRE NtMT2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRENtMT2UxPZDOZ3GYyuc1kcpvJ 5HaTye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT 200mt5tMbjeZ3G4yud1kcrvJ5Hbky+3Il9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19u R17ZjryyHbleO3K9duRE7ciJ2pETtSMnakdO1I6cqB05UTvylHbkKe2IAuuIAuuIAuuI5+qI5+qI 5+qI5+qIzOqIzOqIzOqIzOqIzOqIzOqIzOqIzOqIzOqIzOqIzOqIzOqIzOqIseqIseqIe+qmZ6ub nq1uera66dnqpmerm56tbnq2uunZ6qZnq5uerW56trrp2eqmM6qbzqhumpm6aWbqpmWom5ahblqG umkZ6qZlqJuWoW5ahrrp8ummy6ebkFM3IaduQk7d5JK6ySV1k0vqJpfUTZSomyhRN1GibqJE3USJ uokSdRMl6iZK1E2UqJsoUTdRom6iRN1EibpJ/3ST/ukiYzORf2gi/9BsxD80kX9oIv/QRP6hifxD E/mHJvIPTeQfmsg/NJF/aCL/0ET+oYn8QxP5hybyD03kH5rIPzSRf2gi/9BE/qGJ/EMT+Ycm8g9N 5B+ayD80kX9oIv/QRP6hifxDE/mHJvIPTeQfmsg/NJF/aCL/0ET+oYn8QxP5hybiHybiHybiHybi HybiHybiHybiHybiHybiHybiHybiHybiH1YUqg0yl3wi1mIi1mJ2Mpd8IkJjIkJjRaHaIHPJJ6JB JqJBJqJBpukLmaYvZJq+kGn6QqbpC5mmL2SavpBp+kKm6QuZpi9kmr6QafpCpukLmaYvZJq+kGn6 QqbpC5mmL2SavpBp+kKm6QuZpi9kmr6QafpCpukLmaYvZJq+kGn6QqbpC5mmL2SavpBp+kKm6QuZ pi9kmr6QafpCpukLmaYvZJq+kGn6QqbJ/U2T+5sm9zdN7m+a3N80ub9pcn/T5P6myf1Nk/ubJvc3 Te5v7xWJycwVIBKJ0yQS9z6UmMxcASLeuDezxGTmChDBy2mCl9MELydyU03kpprITTWRm2pFod4q 8WBN5MFaUai3Ss71W1Go707O9VtRqDaII20iR9pEjrQVhWqD+Ngm8rFN5GObyMe2olBtEPfbRO63 idxvE7nfJnK/TeR+m8j9NpH7bSL320Tut4ncbxO53yZyv60oVBvEMzeRZ25FodpAXCHy560oVBuI K+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIKwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDMQV BuIKA3GFwbhC0fg2TePbNI1v0zS+7Xs7MZnZgRBddPsGUUxmdiDEs7L2XaaYzFwBoo1xmjbGadoY 942tmMxcAaIncpqeyGl6Ive9tJjMXAGiwXKaBstpGiynabCcpsFymgbLaRosp2mwnKbBcpoGy2ka LKdpsNy7EWIycwWYTG43mdxuMrmqj7SbTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK5 3WRyw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2Ryw2RyA/lyA/lyA/lyA/lyA/lyA/ly A/lyA/lyA/lyA/lyA/lyA3kvA3kvA7koA7koA7koA7koAzkbAzkbAzkbAzkbAzkbAzkbA5FZgcis QIxVIMYqEGMViBwJRI4EIkcCkSOByJFA5EggciRM10uYrpcwXS9hul7CdL2E6XoJ0/USpuslTNdL mK6XMF0vYTL/YTL/YWL6YWL6YWL6YWL6YcLwYcLwYcLwYcLwYcLwYcLwYcIYYcIYYfITYfITYfIT YYqXYYqXYYqXYYqXYYqXYYqX4YmXPQUALLeo84/XW9T5x+st6vzj9RZ1fku5RZ3fUm5R57eUW9T5 rVdPAwCWW9T5rdcWRWpjAMByiyK1MQBguUWR2hgAsNyiSG0MAFiuKABYblGoNkCDeItCtQEaxFsU qg3QIN6iUG2ABvEWhWoDNIi3KFQboEG8RaHaAIMbtyhUG2Bw4xaFagMMbtyiUG2AwY1bFKoNMLhx i0K1AcSDLQrVBpActihUG2As4haFvkPQ0N+i2OdC1Qvsz1sUqg1gLn56xhYf2LV9ydMTuZhM3Zdo 3Yynx3oxmdbNeNoEaMmGB9Q8bRnEZOIKGB5Q87TvEJOJK2B4QM3T5kVMJq6A4QE1TzsgMZm5Ajy5 72kbJSYzV4An9z3txcRk5grw5L6nDZ2XzJP7nrZ/YjJzBXhD7p72kGIycwV4Q+6eNqJiMnMFeEPu nnazYjJzBXhD7p62xGIycwV4Q+6e9tViMnMFeNPfnjbnYjLzAnhK8NMO30vmOemf+gFiMvMCgNEu WxTqpYDRLlsU6kch5XEg5XEg5XEg5XEg5XEg5XEg5XEg5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi 5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi 5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XEi5XECs9MWhWoDHBm3RaHaAMaqLQrVBjBW bVGoNoCxaotCtQGMVVsUqg2k+U5gx3raf4mbOXMD7I2QeNrEicnMTpepeI9XFO93X949/Pzp899W xMPnx1/+/O3d5++CHz789u7X3/94+POPx58e3v/26cPfHvL6V3M9Ka5N/4dPn7e/+uvHXx4+Pv7z y+PHL39sGb9/C9uf/biH//FQI5c5Dl/3/E4/P26f7Munh8tT5HPudG8U2/yK37rZxTPV/GGq+cNU 86ep5k9TzZ+mmj9NNX+aav401fxpqvnTVPOnqeZPU82fppo/TTV/mmr+NNX8aar501Tzp6nmT1PN n6aaP001f5pq/jTV/Gmq+dNU86ep5k9TzZ+mmj9NNX+aav401fxpqvnTVPOnqeZPU82fppo/TTV/ mmr+NNX86XnhnxpeXjLvyLqn9piYzFwBJgExPZf+U+tNTGauAJPNmJ5L/6mt5yUzQY/pWf5XMjDS aItC3WYw0miLQt1mMNJoi0LdZnAY1haFus3gMKwVBQ7D2qJQbYDDsLYoVBvgMKwtCtUGOAxri0K1 gYipiYipiYipiYipiYipiYipiYipiYipiYipiYipiYipSYipfCHE1IoCtbGiQG2sKFAbKwrUxooC tbGiQG2sKFAbKwrUxopCtUGIqRWFaoMQUysK1QYhplYUe95QH+XMzYw3POjpEU5MZm5mvJNPnp4D xWTmZsY7+eTpYVJMZq4A7+STpydSMZm5AryTT54ea8Vk5gowsZVpYivTxFamia1ME1uZJrYyzUEN 00Q7pol2TBPtmCbaMUW0Y98YiMm8FbBvI8Rk3grYNx1iMm8F7FsUMZm3AvYNjZjMXAEi2rHvisRk 5goQ0Y59ayUm81ZAyR1s+lYU2PStKNAQWFGgIbCiQENgRYGGQMngTIUtCjQEVhRoCKwo0BBYUag2 iACxolBtEClhRaGrTKSEFYWuMhEFVhT65kl7f0WhVUka9SWTRv2KQt88adSvKHS9SKN+RaGrTBr1 KwpdZdKoX1GkNgpp1K8oUhuFNOpXFKmNQhr1K4rURiGN+hVFaqOQRv2KQrVBGvUrCtUGadSvKFQb pFG/olBtEGvzikK1QazNKwrVBrE2ryhUG8TavKJQbRBr84pCtUGszSuKPc97O6h9+yIm83oI+2ZH TOb1EPatkZfMO4jkaSMlJrvdQ3jLZLgFH5gMe9SxFnOed3kM93fwrx7DVaxl5T163XduwVTj312G 98bBPaX4tZvLWxRK942pmMxckaK2ue9uxWTmihTlyH2LLCYzS+O2grj9z69RTzeV39/98uuHh//j 4fLPNmpdv/p5uys9/bvLvuhv/p2x34f+/PuXl5evyFde/Z+e3tR///Pj354i/vLx08N/fVj3l+3j /dtf+peo7TVvvujvnz+9/+3x94f/8euXv/7LKz58+vh0+1pv7Lu38/Ru/vruH4/rXvv47vO6z373 GtaZ8K6lKJPufQwxmdci37seYjLzF0CUSffWiZjMfMATZdK9/6IlK6JMundrxGTiCiiiTLq3fMRk 4goooky6943EZOIKKKJMujefxGTmChBl0r2DJSYzV4ApkxbRAb93x8Rk5goQHfB7i01MZq4A0QG/ 9+nEZOYKEB3we7NPTCaugIpanhW1PCtqeVbU8qxkmuOKIu3wSqY5rijSOKpkmuOKIu3wSqY5rihU G2Sa44pCtUGmOa4oVBtkmuOKQrVBpjmuKPTNk1mJKwp982RWYqlkVuKKQt98Q998Q6uSnOBXKjnB b0Whq9zQVW7oKnd0lTu6yh1d5Y6uMkILK0ILK0ILK0ILK4IEK8L9KsL9KgLBKgLBKgLBqvmcW83n 3Go+51b3OVfc6VVx0tP+9CgmE3d6VZz0tD+CisnMFSBOetqfY8Vk5goQJz3tD8NeMnHS0/7oLCYz V4A4Aml//haTmaUhjkDaH+LFZGZpNLM0mnlzFI/02vcNYjKzaJtZtM0s2m4WbTeLtptF282iNRHF aiKK1UQUq4koVpMqrCYIWMWhIvuGTExmXk1xcEFpCKpuCKpuCKpuCKpuSGFoSGFoSGFoSGFoSGFo SGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFoSGFo5LyoFYVqg5wXtaJQbSAN pCENpCENpCENpCENpCENpCENpCENpCENpDVUG0g5aUg5aUg5aUg5aUg5aUg5aUg5aUg5aUg5aUg5 aUg5aWgoQ0N6S0NDGRpSaRpSaRoaytDQUIaGhjI0NJShkanQKwrVBhrl0NAoh4ZGOTQyFXpFsX2K 2LVpJnHXTOKumcRdM5XIZiqRzVQim6lENlOJbKYS2UwlsplKZDOVyGYqkc1UIpupRDZTiWymEtlM JbKZSmQzlchmKpHNVCKbeObMvk8Xk5krwBRcmym4NlNwbabg2kzBtZmCazMF12YKrs0UXJspuG69 CzGZuQJM9baZ6m0z1dtmqrfNVG+bqd42U71tpnrbTPW2meptMwfMNFMKbuaAmWbqys3UlZs5g6WZ M1iaOYOlmTNYmnhYxd61EpOZK8Ac6NLMgS5NPKxib5RpyToadtfRsLuOht11NOyuIy6jIy6jIy6j Iy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6j Iy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6j Iy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6jIy6j m1OWujllqZtTlro5ZambzEc3mY9uMh/dZD66yXx0k/noJvPRTeajm8xHN5mPbjIf3WQ+usl8dJP5 6Cbz0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qObzEc3mY9uMh/dZD66yXx0k/noJvPRTeaj m8xHN5mPbjIf3WQ+usl8dJP56Cbz0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qObzEc3mY9u Mh/dZD66yXx0k/noJvPRTeajm8xHN5mPbjIf3WQ+OvI1deRr6sjX1JGvqQ/UW0VTEDuagtjRFMSO jqrp6BDdjg7R7egQ3Y4O0e3oEN2ODtHt6BDdjg7R7egQ3Y4O0e3oEN1Ah+gGOkQ30CG6gQ7RDXSI bqBDdAMdohvoEN1Ah+gGOkQ30CG6gQ7RDXSIbqBDdAMdohvoEN1AXGEgrjAQVxiIKwzEFQbiCgNx hYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQ VxiMKzSZ+24y991k7rvK3A+zA2HOWezmnMVuzlnc9o1iMrMDYZ582s2TT7t58mk3Tz7t5smn3Tz5 tJsnn3bz5NNunnzazZNPwzz5NMyTT8M8+TTMk0/DPPk0zJNPwzz5NMyTT8M8+TTMk0/DPPk0zJNP wzz5NMyTT8M8+TTMk0/DZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLD ZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHLDZHID+XID+XID+XID+XID+XID +XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID +XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XID+XIDcYWBuMJAXGEgrjAQVxiIKwzEFQbi CgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK5wIK5wIK5wIK5wIK5wIK5wIK5wIK5w MK7Q9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhumJDNMTGaYnMkxPZJieyDA9kWF6IsP0RIbp iQzTExmmJzJMT2SYnsgwPZFheiLD9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhumJDNMTGaYn MkwmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wmN0wm N0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJncgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/u QL7cgXy5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD +XIH8uUO5MsdyJc7kC93IF/uQL7cgXy5A/lyB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IK B+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKh+mJ HKYncpieyGF6IofpiRymJ3KYnshheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KY nshheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6YkcpidymJ7IYXoi h8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kd JpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmdyJf00S+pol8TRP5mibiMibiMibiMibiMibi MibiMibiMibiMibiMibiMibiMiYiLKbJVE2TqZomUzVNpmqaPf1p9vSn2dOfZk9/mj39afb0p9nT n2ZPf5o9/Wn29KfZ059iG75eyC9kvZBfyBUFfiFXFPiFXFHgF3JFgV/IFQV+IVcU+IVcUeAXckWB X8gVhWqD/K6uKFQbhFxcUag2CLm4olBtEC6wXggXuKLQN0+4wBWFvnnCBa4o9M0TLnBFoVVJuMAV hWqDcIErCtUG4QJXFKoNQvitKHSVCeG3otBVJoRfvRDCb0Whq0wIvxWFrjJh9VYUusqE1VtR6CoT Vm/9F11lwuqt/6KrTFi9/VnUe7AVt3b7k6uYzNva7c+5YjJva7c/FYvJvK3d/gwtJvO2dvsTt5dM 3SeKuNb+2C4mM1eAiGvtz/5iMrM0RI5p30CIyczSEDmmfRciJjNLQ+SY9q2MmMy8OYoc074fEpOZ K0DkmPZNlZjMLFoRPdp3ZmIys2hF9Gjf3onJzKIV0aN9jygmM4tWpIX2jaaYzCxakRbad6tiMrNo RVpo3/JqyQqZar2iSJekkEnTK4p0LgqZNL2iSOeikEnTK4p0LgqZNL2i0PUik6ZXFOlqFTJpulak XlSkXlSkXlSkXlSkXlSkQ1SkKFSkKFSkKFSkKFSkKFSkKFSkKFQyaWAFoauMdIiKdIgiTgTcf2rE ZOKzSxHn7u2/V2Iy8dmliHP39h89MZlZZ+Lcvf2XU0wmPr0Xce7e/vPrJTM7hdXsFFazU1jNTmE1 m3vV7MdVsx9XzX5cNftx1ezHVbMfV81+XBV9hfsDjJhMvNNWs7lXyTlYKwo9tZJzsFYUempFHYOK OgaVnIO1otCOBnUnKupOVNSdqKg7UVF3oqLuREXdiYq6ExV1JyrqTlTWnSDnYNVGzsFaUaQ2GjkH a0WR2mjEL7aiSG004hdbUaQ2GvGLrShUG4iGb4iGb4iGb4iGb4iGb4iGb4iGb4iGb4iGb4iGb4iG b4hQb4hQb4hQb2S27opC1wt1hhvqDDfUGW6oM9wQ195QP7khrr2hLnRDXeiGutANdaEb6kI31IVu rAstnnmzb1/EZOZ+WDzzZt8DicnM/bB45s2+kRKTmR0hs/dezd57NXvv1ey9V7P3Xl/pvb/78u7h 50+f/7YiHj4//vLnb+8+fxf88OG3d7/+/sfDn388/vTw/rdPH/72sB5FSh5l/cB9+PR5+6O/fvzl 4ePjP788fvzyx5bw+3ew/dWPe/QfDynXGnkevvD5nX5+3D7Zl08Pl6fQ5+Tp3ii2uRW/dXN1m7pC VXUF8TyffT+NK3UFH1XqmGM99K0HgrsqdXsH/1qppeeSyuHrQKEeR7EOgvilizeuJh5VtLchxGTi 4m7iWI29lyEmExd3M71XzfReNdN71UzvVTO9V830XjXTe9VM71UzvVfN9F4103vVTO9VMx1OzXQ4 NdPh1MSB1HunyUtmQhDNhCCaCUE0E4Jopl2qmURFM+1SzcQzmolnNBPPaCae0Uw8o5l4RjPxjEAt 10At10At10At10At10At10At10At10DgbyDwNxD4Gwj8DTSAJNAAkkADSAINIAk0gCTQAJIgR4yt KFQbaGxJoLElgcaWBBpbEmhsSaCxJYHGlgQaWxLkiLEVhWqDHDG2olBtkCPGVhSqDXLE2IpCtRHo Kge6yoGucqCrHOgqB7rKga4ygi8DwZeBgMhAaGMgtDEQpBgIUgwEKQaCFANBioHAwUDgYCBwMBA4 GOZuM8zdZpi7zTB3m2HuNsPcbYa52wx1t2maAcI0A4RpBgjTDBDmpI8wJ32EOekjzEkfYU76CHPS R4iHDO1bNzGZuQLMsSFhjg0Jc2xImGNDwhwbEubYkDDHhoR4yNC+QRWTmStAPGRo3+WKycwVIB4y tG+VxWRm0YZZtGEWbZhFG2bRhlm0YRatyS2HyS2HSQeHCfSGCfSGyeCGyeCGyeCGyeCGyeCGSYOG SYOGSYOGSYMO1EIfqIU+UAt9oBb6QC30gVroA7XQB2qhjyCNwYEa7wM13gdqvA/UeB+o8T5Q432g xvtAjfeBGu8DTT0YaOrBQE3+gaYeDCQNDCQNDDT1YCBBYSBBYSBpYCBpYKD5BQPNLxhIhhhIUBhI UJhoEsFEkwgmmimAzqCt6Azais6gregM2orOoK3oDNqKzqCt6Azais6gregM2orOoK3oDNqKzqCt 6Azais6gXVGoNtBMgYlO2JvohL2J5hdMNL9gokkEE00iME9xr+Yp7tU8xb2ap7hX8xT3ap7iXs1T 3Kt5ivu+vxKTid2NYXZrh9mtHWa3dpjd2mF2a4fZrR1mt3aY3dphTpkY5pSJYfaRhzllYphN6WE2 pYc5ZWKYHe5hdriH2ZQeZlN6mEOZhzk8YZjt8mF2uIfZ4Z6vzDtAm3kxmVhn0/TxT9PHP00f/zR9 /NP08U/Txz9NH/80ffzT9PFP08c/TR//NH380/TxT9PHP00f/zR9/NP08U/zDNVpnqE6zQkD05ww MM2hANMcCjCRnW0iO9tEdraJ7GwTafETafETafETafETafETafETafETafETafETafETafETafET afETafETafETafETafETafETafETafETafETafETafETqeoTqeoTqeoT2fQm0uInUtUn0scnsulN pKpPoqq3C1HVVxS4XisKXK8VBVbligJXeUWBVbmiQG2sKFAbKwrUxopCtUG0+BWFaoNo8SsK1QbR 4lcUqg2ixa8oVBtEi19RqDaIFr+iUG0QLX5FsV2AufE17VfTtF9N0341TTpgmnTANOmAadIB06QD pkkHTJMOmCYdME06YJp0wDTpgGnSAdOkA6ZJB0yTDpgmHTBNOmCadMA06YBp0gHTpAOmSQdMkw6Y pqA/TUF/moL+NC1r06QDpinoT1ODn6ZlbZqC/hQF/b1hICbz6mxvL4jJvJvj3owQk3k3x711ISbz VsDe6BCTmStApAP2bomYzFwBIh2wt1zEZOYKEOmAvW8jJjNXgEgH7M0fMZm5AkQ6YO8gecnInNoV hVp6ZE5tuxBhf0Whlh4R9lcUavcSYX9FoXYvEfZXFKoNIuyvKFQbRNhfUag2iLC/olBtEGF/RaHa IML+ikK1QYT9FYVqgwj7KwrVBhH2VxSqDSLsryhUG0TYX1GoNggOsKJQbRAcYEWh2iA4wIpCtUEg ghWFaoOgBysK1QZBD1YUqY2E0IOE0IOE0IOE0IOE0IOE0IOE0IOE0IOE0IOE0IOE0IOE0IOE0IOE 0IOE0IOE0IOE0IOE0IOE0IPE0ANxEOy+wRKTmZtskUTYd2liMnOTLZII+1ZPTGa2mUQSYd8visnM FSCSCPumU0xmrgCRRNh3rmIycwWIJMK+/RWTmStAJBH2PbSXTCQR9h23mMxcASKJsG/bxWTmChBJ hH3vLyYzV4CINewNBDGZuQJErGHvQojJzBUgDj3YWxliMnMFiMDF3g/RkiUTuEgmcJFM4CKZwEUy gYtkAhfJBC6SCVwkE7hIJnCRTOAimcBFMoGLZAIXyQQukglcJBO4SCZwkUzgIpnARSJH/q4o1KIk R/6uKNSiJEf+rijUokQoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIo RUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIoRUIo RUJ4Q0J4Q0J4Q0J4Q0J4Q0J4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4Q0Z4 Q0Z4Q0Z4Q2Z4g3gg775VEpOZe2/xQN59vyUmM/feJoeRTA4jmRxGMjmMZHIYyeQwkslhJJPDSCaH kUwOI5kcRjI5jGRyGMnkMJLJYSSTw0gmh5FMDiOZHEYyOYxkchjJ5DCSyWEkk8NIJoeRTA4jmRxG MjmMZHIYyeQwkslhJJPDSCaHkUwOI5m0QzJph2TSDsmkHZJJOySTdsgm7ZBN2iGbtEM2aYds0g7Z pB2ySTtkk3bIJu2QTdohm7RDNmmHbNIO2aQdskk7ZJN2yEi5z0i5z0i5z0i5z0i5z0i5z0i5z0i5 z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0i5z0idzUidzUidzUid zUidzUidzUidzcjonpHRPSMlOCMlOCMlOCMlOCMlOCMluCAluCAluCAluCAluCAluCAluCAluCAl uCAluCAluCAluDAl2FRMs6mYZlMxzaZimk3FNJuKaTYV02wqptlUTLOpmGZTMc2mYppNxTSbimk2 FdNsKqbZVEyzqZhmUzHNpmKaTcU0m4ppNhXTbOpF2dSLsqkXZVMvyqZelE29KJt6UTZ9u9n07WZT ycqmkpVNJSubSlY2laxsKlnFVLKKqWQVU8kqppJVTCWrmEpWMZWsYipZxVSyiqlkFVPJKqaSVVA3 vKBueEF97YL62gX1tQvqaxfU1y7r+fPX39/9/eHDb+9+/f2Ph3cPP39+fPzmNbU+/PrH+mcPf/7x +HzNP3z6vCV82IPffVz/4LfHd5+fAu/I2PSM3c7Y88mMrO7FRWTeX82NYTE3hsXcGBZzY1jMjWG5 vTF8s3JDX12hr64IPePQM04747joGZOe8ex97+2MRc+o/yINfc0Mfc0Mfc0Mfc0Mfc1Mfc1Mfc1M fc1Mfc1Mfc1Mfc1Mfc1Mfc1Mfc1Me83Ui71m6sVeM/Vir5l6sddMvdhrpl7sNbP+j57x7Jo5/3hb kc5ekc5ekeO6Isd1RY7rihzXFY2Gr2g0fEWj4Ss6lb6iU+krOpW+mj2xavbEqkl3V5PuribdXU26 u5rj5+or4+fefVk3zk+f/7bdJD8//vLnb8+3wn8Jfr7FrpvoTw/vf/v04W8Puces89LH+Mv1fvrr x18ePj7+88vjxy9/bBm/fwvbn/24h//xkA5f8vwmPz9uH+rLp4fLU9Bz2ruj2G3B+8JfOcbw7S88 Xw6/8DkuMUa99wvPl3/7wks7fA35xg+j2M1R/MZxk6lm/dEo649GWX80yvZ2omZ7O1Gzvp0o+nai 6NuJom8nir6dKPqaKfqaKfqaKfqaKfqaKfqaqfqaqfqaqfqaqfqa0cXHqkuFteoVXvUKr3qFN73C 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 sXnqp5GPvoVb/YKD54B54z46ItXtUaPX7YlnbYOPfgCP7VR9/nT0pl5t3j4elOy852567MF6d8Sf 3bJgXVfswUP7HU6slxd98w6OPs/9D6LH1qqjF964Qd5+6R05b9zZbr/0jpw3blW3X/pmznTLu3T7 pXfkvHEDuf3SO3LeuCPcfukdOW8s8dsvvSPn3TvKdOzmOXrhjTV3+6V35Lx7HaVjl83RC+9eR+nY NnP0wrvXUTr2wRy98O51lI4NLAcvvOVeuf3SO3Lev47IbN2eKph3u6LAvNsVBc4cXlFgSu6KAlNy VxSYkrsRSSgKXa8GpuSuKDALeUWh2mioNhqqjYZqo6HaaKg2OqqNjmqjo9roqDbIiV8rCtVGR7VB zglbUag2yDlhPZFzwlYUqo1AtRGoNgLVRqDaCFQbgWojUG0Eqo2BamOg2hioNgaqjYFqY6DaGKg2 BqqNgWpjoNqYqDYmqo2JamOi2pioNiaqjYlqY6LamKg2JqmNfCG1kS+kNvKF1Ea+kNrIF1Ib+UJq I19IbeQL26d4ZzHs2zIxmXdC776JE5N5x1HuWz4vWfNOI9k3iGIy7zSSfTspJjNXQDNXQDNXQDNX QDNXQDNXQDdXQDdXQDdXQDdXgHiK8L7FFpOZK0A8knjfp4vJzBUgHkm8b/bFZOYKCHMFhLkCwlwB Ya6AMFdAmCsgzBUwzBUwzBUwzBUwzBUwzBUwzBUwzBUwzBUwzBUwzBUwzRUwzRUwzRUwzRUwzRUw zRUwzRUwzRUwzRUwxRWw9aHEZOIK2LpWYjJxBWw9LjGZuAK2jpiYTFwB+UJ6q/mCeqvkzOMVhXqr 5MzjbUohikK9VXLm8TZKEUWR3momJyWvKFQb5KTkFYVqg5yUvKJQbWRUGxnVRka1kVFtZFQbGdVG QbVRUG0UVBsF1UZBtVFQbRRUGwXVRkG1UVBtVHSVK7rKFV1lRAhmRAhmRAhmRAhmRAhmRAhmRAhm RAhmRAhmRAhmRAhmxPplxPplxPplxPplRO1lxN9lRNJlRNJlRNJlRNJlRNJlRNJlRNJtOw5x+2Lu uZO5507mnjuZe+5k7rmTuedO5p47mXvuZO65k7kCkrkCsrkCsrkCsrkCsrkCsrkCsrkCsrkCsrkC srkCsrkCirkCirkCirkCirkCirkCirkCirkCirkCirkCirkCqlm01SzaahatCY5mExzNJjiaTXA0 m+BoNsHRbIKj2QRHswmOZhMczSY4mk3WM5usZzZZz2yyntnEM7NJVGYTgswmBJlNCDKbEGQ2Ichs QpDZhCAbMjQ1ZGhqyNDUkDWpIWtSQyajjkxGHZmMOjIZdWQy6shk1JHJqCOTUUcmo44giY4giY4g iY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY4giY5wh45w h45wh45wh47AhY7AhY7AhY4QhPV/URT65hGC0BGC0BGC0BGC0BGC0BFM0BFM0BFM0BEW0BEW0BEW 0NHgoGYC7c0E2psJtDeTQW8mg95MbLyb2Hg3sfFuYuPdxMa7iY13ExvvJjbeTWy8mxBHNyGObkIc 3YQ4uglxdBPi6CbE0U2Io5sQRzchjm5CHN2EOLoJcXQT4ugmxNFNiKObEEc3IY5uQhzdhDi6yV10 k7voJnfRTe6im6hEN1GJbqIS3aQbtl25mMwsDZNu6Cbd0E26oZt0Qzfphm4CCd0EEroJJHSTIegm Q9BNhqCLw6cCGbkCGbkCGbkCGbkCGbkCGbkCGbkCGbkik95rIPtXIPtXIPtXIPtXIPtXIPtXIPtX IPtXIPtXIPtXIPtXICNXICPXikJXmdi/Atm/Atm/Atm/IpNR74FMYysK3QGI1WxFodogBrVABrVA BrVABrVABrVABrVABrUVhWqDjHpfUag2yKj3FYVqg4x6X1GoNsio98hk1PuKQrVBRr2vKFQbZNT7 ikK1QUa9ryhUG2TU+4pCtUFGva8oVBuEjFxRqDYIGbmi2I7D232GaTwK03gUpvEoTONRmMajMI1H YRqP9h2gmMzr84XpYgrTxRSmiylMF1OYLqYwXUxhupjCdDGF6WIK08UUpvEoTOPRvocWk5lFK7qY wnQxheli2rftYjKzaMWJ9WH6q/aWgJjMXAGiWStMs1aYZq0wzVphmrXCNGvtrQwxmbkCxIn1ez9E TGauAHFi/d5UEZOZK0CcWL93ZsRk5goQJ9bv7R0xmbkCxIn1e49ITGauAHFi/d5oEpOZK0AE/Pdu lZjMXAHixPooZLrtiiItykLsXiuKtCgLgiIKgiIKgiIKgiIKgiIKgiIKgiIKgiIKgiIKgiIKgiIK giIKgiIKgiIKgiIKgiIKgiIKgiIKgiIKgiIKMb+tKFQbCKUoCKUoCKUoCKUoCKUoCKUoCKUoCKUo CKUoCKUoCKUoCKUoCKUoCKUoCKUoCKUoCIooCIooCIooCG8oCFQoCFQoCFQoCDkoCDkoCDkoCDko CDkoCDkoCDkoCDkoCDkoCDkoCDko4hzVffviJRP9PPtmR0wm7oeLiTMUE2coJs5QTJyhmDhDMXGG YuIMxcQZiokzFBNnKCbOUEycoZg4QzFxhmLiDMXEGYqJMxQTZygmzlBEQ9W+zRWTmSvAZCOKyUYU k40oJhtRTDaimGxEMdmIYrIRxWQjislGFJONKCYbUUw2ophsRDHZiGLiDMXEGYqJMxSTQCgmNFBM aKCY0EAxdf5i6vzF1PmLqfMXU+cvps5fTJ2/mDp/MXX+Yur8xdT5GxkOu6JI36mR4bArivQkGxkO u6JIT7KR4bArivQkG2IMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIM GmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIM GmIMGmIMGmIMGmIMGmIMGmIMGmIMGmIMGhrX0BCZ0BCZ0BCZ0NC4hoZ4hobGNTREQTREQTREQTQ0 rqEhdqIhdqIhdqKJY1f3bZmYTOyNNHHs6r63E5OJvZEmjl3dN4hiMrE30kzmo5nMRzOZj2YyH81k PprJfDST+Wgm89FM5qOZzEczmY9mMh/NZD6ayXw0k/loJvPRTOajmcxHM5mPZjIfzWQ+msl8NJP5 aCbz0Uzmo5nMRzOZj2YyH81kPprJfDST+Wgm89FM5qOZzEczmY9mMh/NZD6ayXw0k/loJvPRTOaj mfMwmgmQNBMgaSZA0sx5GM2kUZo5D6OZaEsz0ZZmoi3NnIfRTE6mmZxMMzkZdGhvoEN7Ax3aG+jQ 3kCH9gY6tDfQob2BDu0NdGhvoEN7Ax3aG+jQ3hWFagNxGeio30BH/QY66ndFodpAXAY6IDjQAcEr CtUG4jI64jI64jLQYcSBDiMOdBhxoMOIAx1GHOgw4hWFagNxGegI40BHGK8oVBuIy0AHHwc6+DjQ wccrCtUG4jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI64jI6 4jI64jI64jI64jI64jI64jLMo3bDPGo3zKN2wzxqN8yjdsM8ajfMo3bDPGo3zKN2wzxqN8yjdsM8 anffk4rJzBVgMh/mub1hntu7b4PFZOYKMJkP8xDgfYstJjNXgMl8dJP5MI8nDvN44jCPJw7zeOIw jycO83jivZEgJjNXgMl8mGcd700KMZm5Akzmwzw4OdSDk7vJfHST+egm89FN5qObzEc3mY9uMh/d ZD66yXx0k/noJvPRTeajm8xHN5mPbjIf3WQ+usl8dJP56Cbz0U3mo5vMRzeZj24yH91kPiKRfmck 0u+MRPqdkUi/MxCXEYjLCMRlBOIyAnEZgbiMQFxGIC4jEGERiLAIRFgEIiwCERaBWIlArEQgViIQ 9RCIeghEPQSiHgJRD4Goh0DUQyDqIRD1EIhfCMQvBOIXAvELgfiFQPxCIH4hEL8QiF8IxC8EIhEC MQWBmIJATEEgpiAQHRCIDghEBwSiAwLRAYHogEB0QCA6IJDOH0jnD6TzB9L5t+d5cXMg7hu3p38x mbhvDJMhCJMhCJMhCJMhCJMhCJMhCJMhCJMhCFP2D1P2D1P2D1P2D1P2D1OpD1OpD1OpD1NcD1Nc D1NcD1NcD1NcD1NcD1NcD1NcD1NcD1MPD1MPD1MPD1MPD1MPD1MPD1MPD1MPD1MPD1MPD1PCDlN1 DlN1DlN1DlN1DlMoDlMoDlMoDlMoDlMoDlMoDlMoDlMoDlPbDVPbDVPbDVHbHZl0G1cU6F6tKNC9 Gpl0G1cU6EOtKNCHWlGgD7WiQB9qRaHrRbqNK4pdL9BtHJl0G1cU6CmvKFQbpEe5olBtkB7likK1 QbxIKwrVBvEijUxmxK4oVBtkRuyKQrVBztddUag2yPm6KwrVBjlfd0Wh2iDn664oVBsT1cZEtTFR bUxUGxPVxkS1MVFtTFIb5UJqo1xIbZQLqY1yIbVRLqQ2yoXURrmQ2igXUhvlQmqjXFBtJFQbCdUG YQFXFKoNwgKuKFQbhAVcUag2CAu4otBvitgw2rdKYjJvI79vrG4k2/7n16j3v3368LeH39/98uuH h//j4fLPlC4/51rbSnf9d5eHnz99frj5d9JfPnz6/PnPv395efmKfOXV/+npTf33Pz/+7SniLx8/ PfzXh8ePX7aP929/6V+itte8+aK/f/70/rfH3x/+x69f/vovr/jw6eOXFfnH9sa+eztP7+av7/7x +PDht8d3nx9/+v415Ov3uhX7xlVM5nUr9m2umMxcmWKLbd8ri8m8Ftu+sxaTeX3hfR8uJjNXgNiv 2zfzYjJzBYhejL0jICYzV4A4f3NvK4jJzBUgzt/cexNiMnMFiOfU7g0OMZm5AsRzavcuiZjMXAHT XAHTXAHTXAHTXAHTXAHTXAHTXAFTXAFbL0hMJq6ArXMkJhNXwNZnEpOJK2DrSonJxBWw9bDEZOYK SOYKSOYKENn6vW0mJjNXgMjW7703MZm5AkS2fm/gackq8bStKNJDrMTTtqJIJ6kST9uKIv3lSjxt K4r0lytiUypiUypiUyrxz42KiJaKuowVcTAVcTAVcTAVcTAVcTAVcTAVcTAVcTAVcTAVcTAVcTAV cTAVcTAVcTAVcTAVcTAVES0VES0VES0VES0VES0VES0VES0VES0VES0VES0VES0VES0VsSkVsSkV sSkVUSYVUSYVUSYVUSYNUSYNUSYNUSYNUSYNUSYNUSYNUSYNUSYNUSYNUSYNUSYNUSZVdEDtmx4v meiA2rdIYjKx81BFB9S+zxKTiZ2HatIx1aRjqknHVNGbte/4xGTmCjAplGpSKNWkUKpJoVSTQqkm hVJNCqWaFEo1KZRqUijVpFCqSaFUk0KpJoVSTQql3qZQ7scGawyADW5Rb2KD24vOYoNbzFvYYEUW mmqSMdUkY6pJxtTbZMy3r3v4j/3fPv5zuxQPf3x59/nLrx9/udbMxz9/f//4+SH1tp7703ZK8+z/ 58Onn3/e3kKqlyixNveltVLqXm7rzWzRH5/S/bGXxHfvbOdj3315t/3bv31/8dcr3rz4uCsjfsXm 7cVEfKqJ+FQT8akm4lNNxKeaiE81qZxqUjn1NpXzOrTe1p625Jof7oPW62xnfn3Wq7//9fn3+Hw6 /s1frxX19q8XsoRVEzGqJmJUTcSomohRMxGjZiJGzUSMmokYNRMxaiZi1EzEqJmIUTMRo2YiRs1E jJqJGKHjRwc6fnSg40cHOn50oONHBzp+dKDjRwc6fnR0JJB2JJB29CjekUDakUDakUDakUDakUDa kUDakUDakUDakeW/I1m1I1m1I1m1o+e7jsTYjsTYjsTYjsTYQGJsIDE2kBgbSIwNJMYGEmMDibGB xNhAYmwgMTaQGBtIjEXH/wx0/M9Ax/8MdPzPQMf/DHT8z0DH/wx0/M9Ax/8MdPzPQMf/DHT8z4pC tUEODRro0KCBDg0a6NCggQ4NGlFQbZCjhgY6amigo4ZWFKoNckDRMI/dG+axe8M8dm+Yx+4N89i9 YR67N8xj94Z57N6+bxSTmR0I0+rdTR2omzpQN3WgbupA3dSBuqkDdVMH6qYO1E2rdzdFpW6KSt20 enfT6t1NHaabOkw3dZhu6jBh6jBh6jBh6jBh6jBh6jBh6jBh6jBh6jBh6jBh6jBh6jBh6jDmMWrD PEZtmMeoDfMYtWEeozbMY9SGeYzaMI9RG+YxasM8Rm2Yx6gN8xi1vVckJjNXgHgm2zDPZBvmmWzD PJNt71qJycwVIB7wNswD3vaOmJjMXAHIgo4Ofh3o4NcVhfqdiMtAx8UOdFzsQMfFrijUC0dcRiAu IxCXEYjLCMRlBOIyAnEZgbiMQFxGIC4jEJcRiMsIxGUE4jICcRmBuIxAXEYgLiMQlxGIywjEZQTi MgJxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNx GQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGQNxGYNxGaax2jxBc5gnaO6bODGZ uc83mQ/zOM6hHscZJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMR JvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMRJvMxTOZjmMzHMJmPYTIfw2Q+hsl8DJP5GCbzMUzmY5jM xzCZj2EyH8NkPobJfAyT+Rgm8zFM5mOYzMcwmY9hMh/DZD6GyXwMk/kYJvMxTOZjmMzHMJmPYTIf w2Q+hsl8DJP5GCbzMdDRAAMdDTDQ0QADHQ0wEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcx EJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcxEJcx EJcxEJcxEJcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcx EZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxGZdhDtMf5jD9YQ7TH+Yw/WEyH8NkPobJ fAyT+Rgm8zFM5mOYzMcwmY9hMh/DZD6GyXwMk/kYJvMxTOZjmMzHMJmPYTIfw2Q+hsl8DJP5GCbz MUzmY5jMxzCZj2EyH8NkPobJfAyT+Rgm8zFM5mOYzMcwmY9pMh/TZD6myXxMk/mYJvMxTeZjmszH NJmPaTIf02Q+psl8TJP5mCbzMU3mY5rMxzSZj2kyH9NkPqbJfEyT+Zgm8zFN5mOazMc0mY9pMh/T ZD6myXzM28zH9j+fTga6Hg/2dDzQlvCbFGN/7T8eP//x6/bXnl99+6VP//DnT59/f/fl4duDwZ5f 9M3fvhxkm8d/+Of9Pz/Nw4hv/8HDX9/98fB//z/7p96/sPd/fnn48tfHz48Pv/6xvrrt3/30+I9f Pzx+H/rx05eHzyvi1y+/v/s7+vbn0UftH+Lg05bLX779ByfeO3hz6w8evLl35ei9peMrUQ6uwfW1 r9fA9UVv10DJx3853X7tG3853/uXy/FfPn4p+f7L0Tt5TB9+PvgL9bWl8HO+GfHGl1GP3sKHUj8c JGz3JGz3frv9+APlnw5fS77efvRW4uiTxf1XOu75EuLeL+HGnfX2S//zx8df3n359R+P/+Xhj1// 1+PDf4xe23ZIbYs8W++1pnQz+Js3VI9e+eot9+ejypz3fCOH98Gay0Hh1svdX0r99pZZ/zffMuvh LfPond24Yd5+6etfYL33fllv3C+PX/p/PT8O7B/++796eK9c30I5yHbjdvlUN48HtXaNeOODo1tr RQJmRQJmRXenisTtisTtisTthsTthsTthsTthmqjodpoqDYaqo2GaqOh2mioNjqqjY5qo6Pa6Kg2 EKA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA9 EaA9EaA9EaA9EaA9EaA9EaA9EaA9EaA95+GD8a1G1nMr7PPjlvpfg060uP49yb/H3Nf+eor/67t/ PD58+O3x3efHn75/zb0tsrMf6bXm2auf7P/fGms32po/f/rz43df51zf87tff//14y8PXz49vH98 eLc+47vf/uPLr7+vC/Xrb493XJJTrbxXrsr/602+V/q/T6/98j///vhwSf2y/vN9+JvfzKk+4tly Pe4w/uASLOmOT3V/h/LsZzruXf7oZ8p3fKb7e59nP9MdSb75SKxj+koxb5H/6/Hzp4fHf355/Pjl qUFWStsHl23f2/6Kbd1vy/7/u161v+L1N71uF1vOv/z07su7Lcfftm/+8+Mvf/727vN3oU93mT8e /vxjffXvf/v04W8PaeQ0Lpc0818+fPq8faztJvTx6S3+sb+rw67wxz38j4c6yqVHi7qeWmvajnWZ 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 aIiGaIiGaIiGaIiGaIiGuIaGuIaGuIaGuIaGuIaGuIYVxXYB3n54376Iybz98L7ZEZN5++F9ayQm 8/bD+0ZKTOZ1hPZtl5jMXAGiJXLfu4nJzBUgWiKbCac0E05pJpzSTDilmTxJM3mSZvIkzeRJmsmT NJMnaSZP0kyepJk8STN5kmbyJM3kSfYNt5jMLFqRJ2kmT9JMnqSZPEkzeZJm8iTN5EmayZM0kydp Jk/STJ6kmTzJ3rIQk5krQLTeNpN0aSbp0kzSpZmkSzNJl2bCKc2EU5oJpzQTTmkmnNJMOGVv+ljJ AnVNA3VNA3VNA3VNA3VNA3VNA3VNA3VNA3nIAvVaA/VaA3VNA3VNA3VNA3VNA3nIVhS5ysh5Fsh5 Fsh5Fsh5Fsh5Fsh5Fsh5Fsh5Fsh5Fsh5Fsh5Fsh5Fsh5Fimj65XR9croemX0zWf0zWf0zWf2zaNV WdCqLOgqF3SVC7rKBa3KgmqDHGQQ6CCDQCPuAw2rDzSsPsyNbZgb2zA3tmFubMPc2Ia5sQ1zYxvm xjZMC0eYu+Qwd8lhbmzD3NiGubENdWNrWjj2p3gxmVi0ph8kTD9ImH6QMP0gYfpBwvSDhOkHCdMP EqYfJEw/SJh+kDD9IPs+SExm1lk26yybpZHN0shmaWS1NMybYzFvjsUs2mIWbTGLtpg3x2KuAPGQ jzAP+QjzvIQwjzgI84iDibbyE23lJzqTcKIzCSc6k3BFgQbARGcSTnQm4URnEk50JuFEZxKuKFQb pGEz0Sl8E52nN9F5ehOdpzcTsTRNdD7bRGdwTXQG10RncE10Btc0f1qm+dMyzfOjpnl+1DTPj9pv pmIy7+FqmudHTfP8qGmeHzXN86P227qXTHwemubxRdM8cWiaJw5N88Sh/QdGTGZeAFGzmOY5GNM8 B2Oa52DMTCiUFUV+wjOhUFYU+QnPhEJZUeQxKBMKZUWRR8lMKJQVRR4lM6FQVhSqDUKhrChUG4RC WVGoNgiFsqJQbRAKZUWh2sioNgjxsqJQbRDiZUWh2iCczIpCtUE4mRWFaoNwMjMTTmZFodognMyK QrVBOJkVhWoDNdcyaq5l1FzLqLmWUXMto+ZaRs21jJprGTXXMmquZdRcy6i5lglDtaJQbaBGXibk 1YpCtUEmhq0oVBuoQZnJxLAVhWoDtTUzamtmchLaikK1QeaMrSi2TxH3rFlElvbdmphM3bOKHYgs Ikv7TlBMJvaTsogs7dtJL5mILO2bTzGZuQJEZGnfwYrJzBUgIkv7NlhMZq6AZK6AbK4AEabad95i MnMFZHMFiGTWvqsXk5krQCSz9taAl0wks/ZGgpjMXAEimbV3I8Rk5gow5fNsyufZlM+zKZ9nUz7P pnyeTfk8m/J5NuXzbMrn2ZTPsymfZ5FN3Ns8XjJT2M8m6JjFwYV7C0lMZq4AE4bI4uDCvT0lJjNX gElWZPFUzb31JSYzV4A4BXElQ71VMqd/RaHeKpnTv6JQb5XM6Z+ZzOlfUai3Sub0ryjUW0UobEYo bCbT/VcUqg0y3X9Fodog0/1XFKoNMt1/RaHaINP9VxSqDTLdf0Wh2iBzqlYUqg2Ef2eEf2eEf2eE f2cyp2pFodogc6pWFKoNMqdqRZHaKIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgr LIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIgrLIwrFKfQ79syMZnZ gRCn0O97OzGZ2YEQp9DvG0QxmdmBCLMDYfphsumHyeJI+32rKiYzV4A40n7f74rJzBUgjrTfN81i MnMFiCPt9523mMxcAeLkv3377iUzXXTZdNFl00WXVRedOPlvbySIycwVIE7+27sRYjJxBRSTyS0m k1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hM bjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG5BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5 BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW 5MstyJdbkC+3IF9uQb7cgny5BflyC/LlFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQV FsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFtMTWUxP ZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUxPZDE9kcX0RBbTE1lMT2QxPZHF 9EQW0xNZTE9kMT2RxfREFtMTWUxPZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFpPJ LSaTW0wmt5hMbjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3 mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25FvtyK fLkV+XIr8uVW5MutyJdbkS+3Il9uRb7ciny5FflyK/LlVuTLrciXW5EvtyJfbkW+3Ip8uRX5civy 5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVW xBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxBVWxhWanshi eiKL6YkspieymJ7IYnoii+mJLKYnspqeyGp6IqvpiaymJ7KanshqeiKr6Ymspieymp7Ianoiq+mJ rKYnspqeyGp6IqvpiaymJ7KanshqeiKr6Ymspieymp7Ianoiq+mJrKYnspqeyGp6IqvpiaymJ7Ka TG41mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3Goy udVkcqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHIr8uVW5MutyJdbkS+3Il9uRb7ciny5FflyK/Ll VuTLrciXW5EvtyJfbkW+3Ip8uRX5civy5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdb kS+3Il9uRb7ciny5FflyK/LlVuTLrciXW5EvtyKusCKusCKusCKusCKusCKusCKusCKusCGusCGu sCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusCGusDGu0PRE VtMTWU1PZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1PZDU9kdX0RFbTE1lN T2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1PZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R 1WRyq8nkVpPJrSaTW00mt5pMbjWZ3Goyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2 k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT25AvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uQ L7chX25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFfbkO+ 3IZ8uQ35chvy5Tbky23Il9uQL7chX25DvtyGfLkNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUN cYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYUNcYXN 9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRENtMT 2UxPZDM9kc30RDbTE9lMT2QzPZHN9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc30RDbTE9lMT2Qz PZHNZHKbyeQ2k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ 5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbkC+3IV9uQ77chny5DflyG/LlNuTLbciX 25AvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19u R77cjny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1x hR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhR1xhZ1x haYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvpieymJ7Kb nshueiK76Ynspieym57Ibnoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK76Ynspieym57Ibnoi u+mJ7CaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPb TSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3I58uR35cjvy5Xbky+3Il9uRL7cjX25H vtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35 cjvy5Xbky+3Il9uRL7cjX25HvtyOfLkd+XI78uV25MvtiCvsiCvsiCvsiCvsiCvsiCvsiCvsiCvs iCvsiCvsiCvsiCvsiCvsiCvsiCvsiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhcG4 QtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lN T2Q3PZHd9ER20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9kNz2R 3fREdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7yeSGyeSG yeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeQG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG 8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG 8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG8uUG4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4 wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGGYnsgwPZFh eiLD9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhumJDNMTGaYnMkxPZJieyDA9kWF6IsP0RIbp iQzTExmmJzJMT2SYnsgwPZFheiLD9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhsnkhsnkhsnk hsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnkhsnk hsnkhsnkhsnkhsnkhsnkhsnkBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLl BvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlBvLlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy 5Q7kyx3IlzuQL3cgX+5AXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFA XOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFgXKHpiQzTExmmJzJMT2SYnsgw PZFheiLD9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhumJDNMTGaYnMkxPZJieyDA9kWF6IsP0 RA7TEzlMT+QwPZHD9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA6TyR0mkztMJneYTO4wmdxh MrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ 5A6TyR0mkztMJneYTO5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/uQL7cgXy5A/lyB/LlDuTLHciX O5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/u QL7cgXy5A/lyB/LlDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQV DsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVDsQVTsQVTsQVTsQVTsYVmp7IYXoih+mJHKYncpieyGF6 IofpiRymJ3KYnshheiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6Ykc pidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6YkcpidymEzuMJncYTK5w2Ryh8nk DpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kdJpM7 TCZ3mkzuNJncaTK502RyJ/LlTuTLnciXO5EvdyJf7kS+3Il8uRP5cify5U7ky53IlzuRL3ciX+5E vtyJfLkT+XIn8uVO5MudyJc7kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciXO5EvdyJf7kS+3Il8uRP5 cify5U7ky53IlzuRL3cirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAi rnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnAirnCanshpeiKn6Ymcpidymp7I aXoip+mJnKYncpqeyGl6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYncpqeyGl6Iqfp iZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYncpqeyGl6IqfpiZymJ3KaTO40mdxpMrnTZHKn yeROk8mdJpM7TSZ3mkzuNJncaTK502Ryp8nkTpPJnSaTO00md5pM7jSZ3GkyudNkcqfJ5E6TyZ0m kztNJneaTO40mdxpMrnTZHIn8uVO5MudyJc7kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciXO5EvdyJf 7kS+3Il8uRP5cify5U7ky53IlzuRL3ciX+5EvtyJfLkT+XIn8uVO5MudyJc7kS93Il/uRL7ciXy5 E/hy8+UCfLlb1Pna2KLO18YWdb42tqjztbFFna+NLep8bWxR52tjizpfG1sUqg3AFW5RqDYAV7hF odoAXOEWhWoDcIVbFKoNwBVuUag2AFe4RaHaAFzhFoVqA3CFWxSqDcAVblGoNgBXuEWh2gBc4RbF GBCzA2F6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYncpqeyGl6IqfpiZymJ3Kanshp eiKn6Ymcpidymp7IaXoip+mJnKYncpqeyGl6IqfpiZymJ3KanshpeiKn6Ymcnifyqb8gJtNWwFM3 QkymrYCn3oWYTFsBT50OMZm2Ap76ImIycwV4TO5Tc0VMZq4Aj8l96tCIycwV4DG5T20eMZm5Ajwm 96lXJCYzV4DH5D41nMRk5grwmNynrpWYzFwBHpP71PryknlM7lOjTEyGeqvAl7tFod4q8OVuUai3 Cny5WxTqrQJf7ooCvtwtCvXdgS93i0K1AXy5WxSqDeDL3aJQbQBf7haFagP4crcoVBvAl7tFodoA vtwtCtUG8OVuUag2gC93i0K1AXy5WxSqDeDL3aJQbQBf7haFagP4crcoVBuAK9yiUG0ArnCLQrUB uMItCtUG4Aq3KFQbgCvcolBtAK5wi0K1AbjCLQrVBuAKtyhUG4Ar3KJQbQCucItCtQG4wi0K1Qbg CrcoVBuAK9yiUG0ArnCLYvsUswPheSKfdmtiMrMD4Xkin7Z8YjKzA+F5Ip/2jWIyswPheSKfNp9i MnMFeJ7Ipx2smMxcAZ4n8mkb7CXzPJFPm2YxmbkCPE/k085bTGauAM8T+bR9F5OZK8DzRD71AMRk 5grwPJFPjQQxmbkCPE/kUzdCTGauAI/JfWppeMk8JvepASImM1eAx+Q+dVHEZOYK8Jjcp1aMmMxc AR6T+9TPEZOZK8Bjcp+aQmIycwV4TO5TZ0lMZq4Aj8l9ak95yTwm96mZJSYzV4DH5D51xMRk5goA vtwtCvVWgS93iyK91YR8uQn5chPy5Sbky03Il5uQLzchX25CvtyEfLkJOWwTctgm5LBNyGGbkMM2 IYdtQg7bhBy2CTlsE3LYJuSVTcgrm5BXNiGvbEJe2YS8sgl5ZRPyyibklU3IK5uAV3aLQrWBWL+E WL+EWL+EWL+EqL2EqL2E+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE+LuE +LuE+LuE+LvE+DvPBfi0ERGTmXtu0wWYTBdgMl2AyXQBJtMFmEwXYDJdgMl0ASbTBZhMF2AyjXvJ NO4l07iXTONeMo17yTTuJdO4l0zjXjKNe8k07iXTa5dMr10yvXbJ9Nol02uXTK9dMr12yfTaJdNr l0yvXTK9dslkPZPJeiaT9Uwm65lM1jOZeGYy8cxkEpXJJCqTSVQmk6hMJlGZTKIymURlMonKZBKV ySQqk0lUJpOoTCZRmUyiMplEZTKJymQSlUkiKtu4zEs5O7j0GnWySXeNOtmku0adbNJdo0426a5R J5t016iTTbpr1Mkm3TXqZJPuGnWygfsUdVaMuUah2jgrxlyjUG2cFWOuUag2zg4ouEah7/CsQHKN Qt/hWYHkGsW+Q7S+zgok1yi0vs4KJE9RZwWSaxSqjbMCyTUKXeWzUsc1Cl2vs6LFNQpdr7NDA65R 6HqdHRpwjUJr+az9/xqFVuVZ+//LU4r4yOM8Wr8804jJnEfrlycgMZnzaP3yvCQmcx6tX56uxGTO 5vLlWUxMZq4AqY338kAnJjNXgNTGe3kqFJOZV1Nqlr08WorJzKspNctenk/FZOb9TGqWvTzkesmk ZtnLI7GYzFwBUn/r5blaTGbWmdqSkky+L8/sYjKzziST78uDv5jMrDPJl/uye7CS5Xx2ys9T1Nkp P9cosAlcUWATuKLAJnBFga3+igJbxxUFto4rCmwdVxRoEKwoUhvlrEvpGkVqo5z1G12jyFUuZ/1G 1yhylctZv9E1ilzlcvYcwKeosy6laxS6ymddStcoVBtnXUrXKFQbZ11K1yhUG2ddStcoVBtETstI TstITstITstITstITstITstITstITstITstITstITstITstITstITstITltRqDbOzjG/RqHaOOuI eooiMmFGMmFGMmFGMmFGMmFGMmFGMmFGMmFGMmFGMmFGMmFGMuG+J/I2WNJoiZcdlJjM23vv+y0x mdcw2ndnYjJvI7/v5cRkXvdp3/lpyYpk9HrZJ4rJxKItkjfrZbMpJhOLtkjerJcdq5jMLFrJ6PWy 7RWTibftIhm9XvbOYjJzBUhGr5cNuJjMXAGS0etlFy8mM1eAiJtkEzfJJm6STdwkm7hJNnGTbOIm 2cRNsombZBM3ySZukk3cJJu4STZxk71rIiYzV4BkQXtpvXjJREQnm4hONhGdbCI62UR0sonoZBPR ySaik01EJ5uITjYRnWwiOhnB7CsKdTAJAp8RAp8RzJ4RzJ4RzJ4RzJ4RzJ4RzL6i0PUiCHxGCHxG CPyKQrVx9gS8p6iz58tdo9A3f/Z8uWsU+g7Pnvn2FHX2zLdrFFopZ898u0ah63X2zLdrFLpeZ898 u0ahq3z2zLdrFKoNRIMVRIMVRIMVRIMVRIMVRIMVRIMVRIMVRIMVRINVRINVRIPVszOrr1GkNipi yCpiyCpiyCpiyCpiyCpiyCpiyCpiyCpiyCpiyCpiyCpjyERQf98ciMnMfbBI/WcT1M8mqJ9NUD+b oH42Qf1sgvr7XkdMZtaZSP1nlfov0mlcL9srL5l0TNXLZkxMZpaGdLLUy47OSyYdBvWy/xOTmbcg 6TCol02kmMysM+kwqJedqJjMvAWZxF4xib1iEnvFJPaKSewVk9grJrFXTGKvmMReMYm9YhJ71ST2 qknsVWk0+8vOX0wmroBq4n/VxP+qif9VE/+rJv5XTfyvmvhfNfG/auJ/1cT/6m387+H6n/94ePfL x08P/+3hrH2pz0tu9WwL/xp1shV3jTrZirtGsc91shX3FHW2hX+NOtmKu0adbMVdo0624q5RJ1tx 1yhUG2db+NcoVBtnW/jXKFIb7WwL/xpFaqOdbeFfo8hVbmeb8dcocpXb2Wb8NYpc5Xa2Gf8UdbYZ f41CV/lsM/4aha7XWZP1NQpdr7Mm62sUul5nTdYvv3rGb/TLj6GYzHmwfPnpFJM5D5YvP7RiMufB 8uVnWUzmPFi+/IiLycwVIDUXXp4ExGTmCpCaCy+PE2IycQU0qbnw8kwiJhOLtkn9gJcHGzGZWLRN 6ge8PB2JycyilfoBL49YYjKzziTT3ctzmpjMrDPJdBctUpw+D/YadXKjfY06uQW7Rp18pL9GnXyk v0adfKS/Rp18pL9GnXykf4o6S6Nfo05uwa5RqDbO0ujXKFQbZ7nyp6hA32Gg7/As632NQjUf7NtA NR+o5s9y5U9RZ7nyaxS6Xme58msUqvmzXPk1CtXG2ab0NQrVxtmm9DUK1cbZpvQ1CtXG2ab0NQrV xtmm9DUK1cbZpvQ1CtXG2ab0NYrURj7blL5GkdrIZ5vS1yhSG/lsK/saRWojn21lX6NIbeSzrexr FKqNs63saxSqjbOt7GsUqo2zXPk1ij1jO9vKly2FmMxprLxsQMRkzob3ZbsiJnM2vC+bGy+ZRLy/ bIXEZOYKkIj3l/2UmMws2jCvZphXU0LBX7ZwYjL1Aph3jTDvGhKk/rJrFJOZdSZB6i9bTzGZuQIk Hfll/yomM1eApCO/bIK9ZJKO/LJlFpOZK0DSkV/23WIycwVIOvLL5l1MZq4ASUd+6QCIycQVkCUd +aWNICYTV0CWROmXXoSYTFwBWRKlXxoaXjJJlH5pf4jJzBUgQeovPRQxmbgCTk/zuUaRDtnpaT7X KNIhOz3N5xpFOmSnp/lco0gf9PRcnmsU6YOensvzFIX0k9MTdq5R6HohJeT0hJ1rFLnKp+e8XKPY 3yIVdXpiyzWKVNTpiS3XKHLfOD2x5RpF6vD0xJZrFKnDehZIv0ah2jiLlj9FnUXLr1HoKp89v+sa ha7y2fO7rlHoep01pV2j0PU6ezrWNQp982dPx7pGoW/+7OlY1yh0vc6ejnWNQlf57OlYL8+H4sOm uA+xRoa8PGSKycR9iDUy5OVJVUwmbp6tKR8vj7tiMrNozQaqNZjj5VFaTGbWmdnztAZzvDymi8nU dyYuJ2tgwssWwEtm9qKsgQkv+wgxmbg2rYEJL5sRMZm5AiTrxsuOxktmui2qdMTRy7ZITGYWrXTE 0cveSkxm3hylg4ReNmhiMrM0pLN/XnZ5YjLzfiad/fOyVRSTmUUrnf2zJzs9VOMaRfbsp4dqXKPI nv30UI1rFNmznx6qcY0i/ZzTQzWeos6eGP8UdfYU92sU+lyoT9VQn6qhPlVDfaqG+lQN9aka6lM1 1KdqZ09xv0ah2jh7ivs1CtXG2VPcr1GoNs6e4n6NQrVx9hT3axSqjbOnuF+jUG0g93ND7ueG3M8N uZ8bcj835H5uyP3ckPu5IfdzQz7mhnzMDfmY29lTta5R6CqfPVXr5UlPfGwUn9utUSUvj4tiMvG5 3RpV8vLMKSYTd67WqJKXB1cvmXTS78tjrpjM/M7M3X4zd/vN3O03c7ffzN1+M3f7Td3tSyf9vjzM i8nMFSCd9PuyIxCTmStAOun3ZVshJjNXgHTS78veRExmrgDTi91ML3YzvdjN9GI304vdTC92M73Y zfRiN9OL3Uz7dDPt0820TzfpwLCXTZ+YzCzaswcvP0WhYVwNDeNqgRoBZw95vkahzTkyeDQ0jKsh W0hDtpCGbCEN2UIasoU0ZAtpaBhXQ2aShswkDdlCGrKFNDRWqyEzSUNmkobMJA2ZSRoykzQ0Vquh sVoNjdXqaKxWR2O1Ohqr1dFYrY7E7I7E7I7E7I7E7I7E7I7E7I7E7I7E7I7E7I7MPx2Zfzoy/3Rk /ulnz5W4RqGrjMw/HZl/OrLx9Iy+eQQ6dGTI6Qx0kA7lfXn0FpOZ3YwwN4bSccEvj/ViMnP7ZU5i aqb3p5nen2Z6f5rp/Wmm96eZ3p9mTmJqppGomUaiZnp/mun9aebwpGYaiZppJGqmkaiZRqJmGoma OTypmcOTmjk8qZvDk7o5PKmbw5O6OTypm5hMNzGZbmIy3cRkuonJdBOT6SYm001MppuYTDcNa900 rHXTsNZNw1qXjgd62YV7yUzDWjcNa930mG07fDGZeT8zbWHdBMUmAkYnAkYnUgNnJ72UiTTEidTA idTAiY4BmugYoImUx4mUx4mUx4mUx4mUx4mUx4mUx4mUx4mUx4mUx4k0xIkG0k2kPE6kPE6kPE6k PE6kPE6kPE6kPE6kPE6kPE6iPI4L0RBXFLjKKwpc5RUFrteKAtdrRYHrtaLA9VpR7HqBtTwuRA1c UegqEzVwRYG1vKJQbSA1cJq81zR5r2lqUduDn5fMFLamqUVNU4ua5nkl0zyvZJoq2TRVsmmqZNNU yaapkk1TJZumSjZNlWyaKtk0VbJpClvTnJA3TZVsmirZNFWyaapk01TJpqmSTVMlm6ZKNk2VbIoq 2b75EJN5RbtvVcRkXp3tGxsxmVdn+zZITKbWmXen3fdSYjKzaEUtat+QicnMFSBqUeNCBqqMCxly sqLQzpgMOVlRaGdMhpysKNQ1IUNOVhS7Xqhr0tFVJkNOVhS6ymTIyYpCV5loVisKXWWiWa0odJWJ ZrWiUG0QpWtFodogSteKQrVBlK4VhWqDKF0rCtUGUbpWFKoNonStKFQbROlaUag2iMduRaHaIPrY ikK1QfSxFYVqg+hjKwrVBtHHVhSqDaKPrShUG0wfI868kZCqlpCqlpCqlogzb0WR2khIi0tIi0tI i0tIi0tIi0tMixNHsezbFzGZuesUB57seyAxmbnrFAee7BspMZlaZ2bfpZtFKw482fduYjKzaMWB J/sGUExmFq0ogO+7SC+ZKIDve04xmbkCRDV937iKycwVIKrp++5XTGauAFFN37fQYjJzBYhq+r4P F5OZK0BU0/fNvJjMXAGiNL93BLxkojS/9w/EZOYKEKX5vQkhJjNXgCjN750MMZm5AkQD694OEZOJ KyCZOn8SDax7q0VMJq6AZEIDyYQGkgkNJBMaSCY0kMmhLSuKdBczObRlRZHuYiaHtqwo0l3M5NCW FUW6ixkxBpkc2jIyObRlRaGrjMiEjMiEjGiBjGiBjGiBTI5EWVFoVSLGICPGICPGICPGICPGICPG ICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICPGICNaICNaICNa ICNaICNaICNaICNaICNaICNaICNaICNaICNaICNaICNaICNaoCBaoCBaoCBaoCBaIIvH1OzbFzGZ uO3P4jE1+x5ITCZu+7N4TM2+kRKTidv+LB5Ts+/GxGRm0ZqgRTZBi2ziDNnEGbKJM2Tx/JZ9Fykm M+vMZCOyyUZkk43IJhuRTTYim2xENtmIbLIR2WQjsslGZJONyCYbkU02IptsRDbZiGyyEdlkI7LJ RmSTjcgmG5FNNiKbOEM2cYZs4gzZxBmyiTNkE2fIJs6QTZwhmzhDNnGGbOIM2cQZsokzZBNnyCbO UEycoZg4QzFxhmLiDKWgzhhSugvSrAvSrAvSrAvSrAvSrAvSrAvSrAvSrAvSrAvy4BekdBekdBek dBfkwS/Ig1+Qql6Qql6Qql6Qql6Qql6Qql6Qql6Qql6Qql6QPl6QPl6QPl6QPl6QPl6QPl6QPl6Q Pl6Q0l2Q0l2Q0l2Q0l2Q0l2Q0l2Q0l2Q0l2Qm74gfbwgfbwgfbwgfbwgfbwgfbwgfbwgfbwgfbwg fbwgfbwgfbwwzbqYGypTKC6mtltMbbeY2m4xtd1iarvF1HaLqe0WU9stprZbTEd+MYXiYgrFxRSK i+nIL6Yjv5gSdjEl7GJK2MWUsIspYRdTwi6mhF1MCbuYEnYxVediqs7FVJ2LqToXU3UupupcTNW5 mKpzMYXiYgrFxRSKiykUF1MoLqZQXEyhuJhCcTFN9MVUnYupOhdTdS6m6lxM1bmYqnMxVediqs7F VJ2LqToXU3UupupcTG23FtLlqUinrMiRW5F2WJF2WJEKWJEKWJEKWJEKWJEKWJEKWJEKWJEKWJEK WJEKWJEKWJEKWJEKWJEKWJEKWJEKWJEKWJEKWJG3tiLtsCLtsCLtsCLtsCLtsCLtsCLtsCLtsCJv bUWKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WKY0WK Y0WK4/a0fOPRe/ufX6Pe//bpw98efn/3y68fHv6Ph8vKcv1Hl4efP31+uJl+/uXDp8+f//z7l5eX r8hXXv2fnt7Lf//z49+eIv7y8dPDf314/Phl+1T/9pf+JWp7zZsv+vvnT+9/e/z94X/8+uWv//KK D58+flmRf2xv7Lu38/Ru/vruH48PH357fPf58afvX8N2G96Gx/TVVlOUrKYoWU0dsZo6YjV1xGrq iNXUEaupI1ZTR6ymjlhNHbGaOmI1dcRq6ojV1BGrqSNWU0espo5YTR2xmjpiNa2w1RQlqylKVlOU rKYoWU1RspqiZDVFyWqKktW0wlZT4aymwllNhbOaCmc1Fc5qKpzVVDirqXBWU+GspsJZTYWzmgpn NRXOaiqc1VQ4q6lwVlPhrKbCWU2Fs5oKZ8ukk9Uy6Qe0QjpZrZBOViukk9WQqtoK6WS1QjpZrZAu Zyuky9kKqg3UK2pImW5ImW7Id9uQ77Yh321D2nlD2nlDvtuGFPeGFPeGFPeGFPeGFPeGFPeGFPeG FPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeG FPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPeGFPdt/yVu 5sR9/rZbE5OJ+/xtbycmE/f5205QTGbu84vY6dq2k2IycwWYdu9m8gvN5Bea6R1vpne8md7xZmIa zcQ0mukdbybz0Uzmo5nMRzOZj2YyH81kPprJfDST+Wgm89FM5qOZzEczmY9mMh/NZD6ayXw0k/lo JvPRTOajmcxHM5mPZjIfzWQ+msl8NJP5aCbz0Uzmo5nMRzOZj2YyH81kPprJfDST+Wgm89FM5qOZ zEczmY9mMh/NZD6ayXw0k/loJvPRTOajmcxHM5mPhhwrDTlWGnKsNORYaWhGXkNnyDV0hlxD8/g6 OkOuozPkOjpDrqMz5PqF1Ea/kNroF1Ib/UJqo19IbfQLqo2EaiOh2kioNhKqjYRqI6HaSKg2EqqN hGojo6uc0VXO6CpndJUzusoZXeWMrnJGVxkRgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0R gh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgh0Rgp0RgiY930x6 vpn0fFPpeXM+WDNPpWrmqVTNnFzWzVOpunkqVTdPpermqVTb7lJMJq6AbS8qJhNXwLZzFZOZKyCZ KyCZKyCZKyCZKyCZKyCZKyCZKyCZKyCZKyCbRZvNos1m0WazaLNZtNks2mwWbTaL1gRiuwnEdhOI 7SYQ200gtptAbDeB2G4Csd0EYrsJxHYTiO0mENtNILabQGw3gdhuArHdBGK7CcR2E4jtJhDbTSC2 m0BsN4HYbgKx3QRiuwnEdhOI7SYQ25GpqCNTUUemoo5MRR1BER1BER1BER1BER1BER1BER1BER1B EYGgiEBQRCAoIhAUEQiKCARFBIIiAkERgaCIQFBEICgiEBQRCIoIBEUEgiICQRGBoIhAUEQgKCIS qg2EUgRCKQKhFIFQikAoRSCUIhBKEQilCIRSBEIpAqEUgVCKQChFIJQiEEoRCKUIhFIEQikCoRSB UIpAKEUglCIQShEIpQiEUgRCKQKhFIFQikAoRSCUIhBKEQylMIH3bgLv3QTeuwm8dxPT6Cam0U1M o5uYRjcxjW5iGt3ENLqJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJaYSJ aYSJaYSJaYSJaYSJaYSJaWyNBC+ZyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyE yXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyEyXyE yXwEsiIFsiIFsiIFsiIFGlYeaFh5oGHlgYaVBxpWHmhYeaBh5YGGlQcaVh5oWHmgYeWBhpUHGlYe aFh5oGHlgYaVBxpWHmhYeaBh5YGGlQcaVh5oWHmgYeWBhpUHGlYeaFh5oGHlgYaVBxpWHmhYeaBh 5YGGlQfiCgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFzhQFzhQFzhQFzhQFzhQFzhQFzh QFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhYFyhydyHydyHydyHydyHOYQ6zCHUYQ6hDnMIdZhD qMMcQh3mEOowh1CHOYQ6zCHUYQ6hDnMIdZhDqMMcQh3mEOowh1CHOYQ6zCHUYQ6hDnMIdZhDqMMc Qh3mEOowh1CHOYQ6zCHUYQ6hDnMIdZhDqMMcQh3mEOowh1CHyeSGyeSGyeSGyeSGyeSGyeSGyeSG yeSGyeSGyeSGyeSGyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEy ucNkcofJ5A7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/uQL7cgXy5A/lyB/Ll DuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7 kC93IF/uQFzhQFzhQFzhQFzhQFzhQLTUQLTUQLTUQLTUQLTUQLTUQNzTMD1bw/RsDdOzNUzP1jA9 W8P0bA3TszVMz9YwPVvD9GwN07M1TM/WMD1bw/RsDdOzNUzP1jA9W8P0bA3TszVMz9YwPVvD9GwN 07M1TM/WMD1bw/RsDdOzNUzP1jA9W8P0bA3TszVMz9YwPVvD9GwN07M1TM/WMJnBYTKDw2QGh8kM DpMZHCawM0xgZ5jAzjCBnWECO8MEdobJ2EzEKU/EKU/EKU+kmEykmEykmEykmEykmEykfUykfUyk YkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkyk YkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkykYkw0HWGi6QgTTUeYaDrCRNMRJpqO MNF0hImmI0w0HWGi6QgTTUeYaDrCRNMRJpqOMNF0hIn0von0von0von0vmkSatMk1KZJqE1TNJym aDhN0XCaouF8RTR89+Xdw8+fPv9tRTx8fvzlz9/eff4u+OHDb+9+/f2Phz//ePzp4f1vnz787SFa XWW6PdV9+PR5+6O/fvzl4ePjP788fvzyx5bw+3ew/dWPe/QfDyn1wxc9v8vPj9un+vLp4Rr2nDjd G8V2m+I3bq4fU3KcpuQ4TclxmpLjNCXHaUqO05Qcpyk5TlNynKbkOE3JcZqS4zQlx2lKjtOUHKcp OU5Tcpym5DhNyXGakuM0JcdpSo7TlBynKTlOU3KcpuQ4TclxmpLjNCXHaUqO05Qcpyk5TnNMyTTH lExzTMk0x5RMc0zJNMeUTHNMyTTHlExzTMk0x5RMc0zJNMeUTHNMyTTHlExzTMk0qYdpUg/TpB6m SD3MCxnHtqJAg3NeyDi2FQUanCsKNDhXFGhwrijQ4FxRoMG5okDze0WB5veKQrVB4Ih5IXDEikK1 QZCKFYVqg9hJVxSqDQJirChUGwTEWFGoNgiIsaJQbRAQY0Wh2iAgxopCtUFAjBWFaoOAGCsK1QYB MVYUqg0CYqwoVBsExFhRqDYIiLGiUG0QEGNFodogIMaKQrVBQIwVhWqDgBgrCtUGATFWFKoNAmKs KFQbBMRYUag2CIixolBtEBBjRaHaICDGikK1QUCMFYVqg4AYKwrVhjiGaN+WecnEMUT7Jk5M5u3z 9y2fmMzb5+8bRDGZ1+nat5NiMnMFiMTIvicVk5krQMQ09o2tmMxcASLzse+OxWTmChCZj32L7SUT mY99Qy4mM1eAyHzsu3oxmbkCROZjbw2IycwVIDIfe39BTGauAJH52JsUYjJzBYjMx97pEJOZK0Bk PvZ2iZdMZD725oqYzFwBIvOxd2jEZOYKEJmPvc0jJjNXgMh87L0iMZm5AkTmY284icnMFSAyH3vX SkxmrgCR+dhbX14ykfnYG2ViMtRbJUamFYV6q8TItKJQb5UMLlxRqLdKxh3OCznmdUWh3io55nVF odogx7yuKFQb5JjXFYVqgxzzuqJQbZBjXlcUqg1yzOuKQrVBjnldUag2yDGvKwrVBjnmdUWR2kjk mNcVRWojkWNeVxSpjUSOeV1RpDYSOeZ1RZHaSIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgr TIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIgrTIwrFJn7 fVsmJjM7ECpzL04a3Ld8YjKzAyGOLdz3jWIyswMhHg26bz7FZOYKEI8G3XewYjJzBYhHg+7bYC+Z eDTovmkWk5krQDwadN95i8nMFSAeDbpv38Vk5goQjwbdewBiMnEFJPFo0L2RICYTV0ASjwbduxFi MnEFJJPJTSaTm0wmN5lMbjKZ3GQyuclkcpPJ5CaTyU0mk5tMJjeZTG4ymdxkMrnJZHKTyeQmk8lN JpObTCY3mUxuMpncZDK5yWRyk8nkJpPJTSaTm0wmN5lMbkK+poR8TQn5mhLyNSXEZSTEZSTEZSTE ZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTEZSTE ZSTEZSTEZSTEZSTEZSTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTE ZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTEZWTGZZjM fTKZ+2Qy98lk7pPJfCST+Ugm85FM5iOZzEcymY9kMh/JZD6SyXwkk/lIJvORTOYjmcxHMpmPZDIf yWQ+ksl8JJP5SCbzkUzmI5nMRzKZj2QyH8lkPpLJfCST+Ugm85FM5iObzEc2mY9sMh/ZZD6yyXxk k/nIJvORTeYjm8xHNpmPbDIf2WQ+ssl8ZJP5yCbzkU3mI5vMRzaZj2wyH9lkPrLJfGST+cgm85FN 5iObzEc2mY9sMh/ZZD6yyXxkk/nIJvORTeYjI19TRr6mjHxNGfmaMpqXntG89IzmpWc0Lz2jeekZ zUvPaF56RvPSM5qXntG89IzmpWc0Lz2jeekZzUvPaF56RvPSM5qXntG89IzmpWc0Lz2jeekZzUvP aF56RvPSM5qXntG89IzmpWc0Lz2jeekZzUvPaF56RvPSM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IK M+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IKM+IK M+IKs8ncZ5O5zyZzn03mPptzsLM5Bzubc7CzOQc7m3OwszkHO5tzsLM5Bzubc7CzOQc7m3OwszkH O5tzsLM5Bzubc7CzOQc7m3OwszkHO5tzsLM5Bzubc7CzOQc7m3OwszkHO5tzsLM5Bzubc7CzOQc7 m3OwszkHO5tzsLM5BzubTG42mdxsMrnZZHKzyeRmk8nNJpObTSY3m0xuNpncbDK52WRys8nkZpPJ zSaTm00mN5tMbjaZ3GwyudlkcrPJ5GaTyc0mk5tNJjebTG42mdxsMrnZZHIz8uVm5MvNyJebkS+3 IF9uQb7cgny5BflyC3KiFsSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSb FMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMSbFMabmF6ZbHplsumVyaZXpphemWJ6 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 JvPRTeajm8xHN5mPbjIf3WQ+usl8dJP56Cbz0U3mo5vMRzeZj24yH91kPrrJfHST+egm89FN5qOb zEc3mY9uMh/dZD66yXx0k/noJvPRTeajm8xHN5mPbjIf3WQ+usl8dJP56Cbz0U3mo5vMRzeZj24y H91kPrrJfHST+egm89FfYT7ePGZhBR8cs5DSTGnkmed9xyxsb2H7s8/HLBwcmLBe8vwmTxyzcBzF 2lTiF24ubBNl6SbK0k2UpZsoSzdRlm6iLN1EWbqJsnQTZekmyhImyhImyhKvoCxv3llX8NGdtaT1 FtMs/b476/YW3rizrpeAO+txFGtril846YQHMo4FMo4FMo4Fmh8eaH54oPnhgeaHB5ofHmh+eKD5 4YHmhweaHx5ofnig+eGB5ocHmh8eaH54oPnhgeaHB5ofHmh+eKD54YHmhweaHx5ofnig+eGB5ocH mh8eaH54oPnhgeaHB5ofHmh+eKD54YHmhweiQANRoIEo0EAUaCAKNBAFGogCDUSBBqJAA1GggSjQ QBRoIAo0EAUaiAINRIEGokADUaCBKNBAFGggCjQQBRqIAg1EgQaiQANRoIEo0EAUaJgOiTAdEmE6 JMJ0SIQ5MjzMkeFhjgwPc2R4mCPD45WR4W93aVI56tLUy8yj97Whu69Ls97CW12aVEiX5jCKbZ7F L9xc2OYk9DAnoYc5CT3MSehhTkIPcxJ6mJPQw5yEHv8/2v5uybLjSLMEr4tP4S11MyPSVeL2b3rR LzEyLwCCQSaKYCAlAGSx5+nHzj7uHplJgKF75eq6oGSRWzXc/ai6b/t0fWrmJvRlbkJf5ib0ZW5C X+Ym9GVuQl/mJvRlbkJf5ib0ZW5CX+Ym9GVuQl/mJvRlbkJf5ib0ZW5CXyYYvkwwfJlg+DLB8GWC 4csEw5cJhi8TDF8mGL5MMHyZYPgywfBlguHLBMOXCYYvEwxfJhi+TDB8mWD4MsHwZYLhywTDlwmG LxMMXyYYvkwwfJlg+DLB8I3MdRuZ6zYy121krtsIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kI N9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kI N9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kI N9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9kIN9mmQ2KbDoltLvvcppVgmyjLNlGW baIs20RZtomybBNl2SbKsk2UZZsoy/4nKAs6wYrJzA4wmY9tMh/bZD62yXxsk/nYJvOxTeZjm8zH NpmPbTIf22Q+tsl8bJP52CbzsU3mY5vMxzaZj20yH9tkPrbJfGyT+dgm87FN5mObzMc2mY9tMh/b ZD62yXxsk/nYJvOxTeZjm8zHNpmPbTIf22Q+tsl8bJP52CbzsU3mY5vMxzaZj20yH9tkPrbJfGyT +dgm87FN5mObzMdGdq2N7Fob2bU2smtttLR/o6X9Gy3t32hp/0ZL+zda2r/R0v6NlvZvtLR/o6X9 Gy3t32hp/0ZL+zda2r/R0v6NlvZvtLR/o6X9Gy3t32hp/0ZL+zda2r/R0v6NlvZvtLR/o6X9Gy3t 32hp/0ZL+zda2r/R0v6NlvYH4goDcYWBuMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4wkBcYSCuMBBX GIgrDMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJgXKHJ3G+Tud8mc79V5t5cxr7N ZezbXMa+zWXs21zGvs1l7Ntcxr7NZezbXMa+zWXs21zGvs1l7Ntcxr7NZezbXMa+zWXs21zGvs1l 7Ntcxr7/yTJ2dE4Xk5kdYG4t3+bW8m1uLd/m1vJtbi3f5tbybW4t3+bW8m1uLd/m1vIwmdwwmdww mdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdwwmdww mdwwmdwwmdwwmdwwmdwwmdwwmdxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxA vtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxAvtxA vtxAvtxAvtxAvtxAvtxAXGEgrjAQVxiIKwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GF gbjCQFxhIK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiIKwzTExmmJzJMT2SYnsgwPZFheiLD 9ESG6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhumJDNMTGaYnMkxPZJieyDA9kWF6IsP0RIbpiQzT ExmmJzJMT2SYnsgwPZFheiLD9ESG6YkM0xMZpicyTE9kmJ7IMJncMJncMJncMJncMJncMJncMJnc MJncMJncMJncMJncMJncMJncMJncMJncMJncMJncMJncMJncMJncMJncMJncMJnc+CdM7jcviDzB v3VBZIlSdn3IL6kLIh9fwuOf/ScXRJ5H3r/IGxdE/nYUk+7+Cz+j/ds/o/P+Wcb5o5n8Ge1v/4w2 +hn9VhQTKr2iNAnqMAnqQC7qQC7qQC7qQC7qQC7qQC7qQC7qIC7q8kpc1CcKKOEnCtTGiQK1caJA bZwoUBsnCnzKJwp9XsSjfKLQT554lE8U+skTj/KJAl15otDnRTzKJwp9ysSjfKJQbRCP8olCtUE8 yicK1QbxKJ8oVBuEsTxRqDYIY3miUG0QWvJEoc+LcI8nCn1ehHs8UejzItzjiUKfF+EeTxT6lAn3 eKJQbRDu8USh2iDc44lCtUG4xxOFaoNwjycK1QbhHk8UezM3FRLTsxmmZzNMz2aYns0wPZthejZD 9GxeJyUxmXfmvs5VYjKvA65TmJjM64DrzCYmM+tMNDNeBz8xmVkaopnxOj2KybxfjtdZU0zm/XK8 TqZeMtHMeJ1jxWRmB4hmxuswLCYzO0A0M14najGZ2QEiTHsdy8VkZgeI/Ot1theTmXUmIquXQCAm M+tMRFYvlUFMZv6mFZHVS6oQk5kdICKrl94hJjM7QERWL9FETGZ2gIisXsqLmMzsABFZLQUJTAUJ TIUITCeKiI+FWGRPFJERC7HInigiIxZikT1R6FMmFtkThT5lYpE9UURiLsQie6JQbRCL7IlCtUHM ricKfcrE7Hqi0KdMzK4nCn3KxOxaCjG7nij0KROz64lCtUHMricK1QYxu54oVBvE7HqiUG0Qs+uD UURRqDYI/nWiUG0Q/OtEodog+NeJQrWB8K+K8K+K8K+KQK6KQK6KQK5KrsM4UeTzqgj/quRiixOF Pi8EjVUEjVUEjVUEjRXzYFXMg1VxD1aitFBE+951yPGSifa960gkJhPVgCLa965zlZjMLFrRvncd zsRkZgeI9r3rhCcmMztAdNxdx0QxmVm0ouPuOmuKycyiFR1314FVTGYWrei4u069YjKzA0TH3XV0 FpOZHSDegnGdv71koofrOq2LycwOEInK68gvJjM7QCQqL91ATGZ2gElUVpOorCZRWU0IspoQZDUh yPr7F1c8/s+vUU9P7t+++8sP37/895fXk+Xtv3q9DLO/m35d5t1f//WXj8dP5D95+r89v5b/9evn vz4j/vD5p5f/+fLp8y+P7+o//Ev/LurxzDcf+tcvP/3xx09/e/nfP/zyL//uie9/+vy0/p4v7B++ nOdX8y/f/dunl+9//PTdl09/+sdnmF4kfoRmQ4qXclyik5hM/JNUTY61mhxr/X2O9fF/Phvw869/ ++OnLy+vf399ZPsP8fvNBf9vn778/MPjn/r2o4mckc8ZyZzxms759mgiZ8nnLNmcNZ+zZnO2fM6W zdnzOXs258jnHNmcM59zZnOufM6VzZnvo8j2UeT7KJJ99LhHLJnz/dFEznQfvT+ayJnuo/dHEznT ffT+aCJnuo/eH03kTPfR+6OJnOk+en80kTPdR++PJnKm++j90UTOdB+9P/rtnCXfRyXbRyXfRyXb RyXfRyXbRyXfRyXbRyXfRyXbRyXfRyXbRyXfRyXbRyXfRyXbRyXfRyXbRyXfRyXbRzXfRzXbRzXf RzXbRzXfRzXbRzXfRzXbRzXfRzXbRzXfRzXbRzXfRzXbRzXfRzXbRzXfRzXbRzXfRzXbRy3fRy3b Ry3fRy3bRy3fRy3bRy3fRy3bRy3fRy3bRy3fRy3bRy3fRy3bRy3fRy3bRy3fRy3bRy3fRy3bRz3f Rz3bRz3fRz3bRz3fRz3bRz3fRz3bRz3fRz3bRz3fRz3bRz3fRz3bRz3fRz3bRz3fRz3bRz3fRz3b RyPfRyPbRyPfRyPXR7WubB99PJrIme2jj0cTObN99PFoIme2jz4eTeTM9tHHo4mc2T76eDSRM9tH H48mcmb76OPRb+fc2T76eDSRM9tHH48mcub7aGf7aOf7aGf7aOf7aGf7aOf7aGf7aOf7aGf7aOf7 aGf7KD0/+ng0kTPfR8n5Ua3p+dHHo4mc+T5Kzo/Og/k+Ss6PzoP5PkrOj86D+T5Kzo/Og/k+Ss6P zoP5PkrOj86D+T5Kzo/Og/k+Ss6PzoP5PkrOj2pLz48+Hk3kTPdRS86PzoPpPmrJ+dF5MN1HLTk/ Og+m+6gl50fnwXQfteT86DyY7qOWnB+dB9N91JLzo/Nguo9acn50Hkz3UUvOj2pLz48+Hk3kzPdR cn50Hsz3UXJ+dB7M91FyfnQezPdRcn50Hsz3UXJ+dB7M91FyfnQezPdRcn50Hsz3UXJ+dB7M91Fy flRben708WgiZ76PkvOj82C+j5Lzo/Ngvo+S86PzYL6PkvOj82C+j5Lzo/Ngvo+S86PzYL6PkvOj 82C+j5Lzo/Ngvo+S86Pa0vOjj0cTOfN9lJwfnQfzfZScH50H832UnB+dB/N9lJwfnQfzfZScH9We /3n27M+z53+ePfvz7PmfZ8/+PHv+59nzP8/076WenMedB9O/l3pyHnceTP9e6sl53Hkw/XupJ+dx tafncR+PJnKmfy/15DzuPJjvo+Q87jyY76PkPO48mO+j5DzuPJjvo+Q87jyY76PkPO48mO+j5Dzu PJjvo+Q87jyY76PkPK729Dzu49FEznwfZedxfeT7aGT7aOT7aGT7aOT7aGT7aOT7aGT7aOT7aGT7 aOT7aGT7aOT7aGT7aOT7aGT7aOb7aGb7aOb7aGb7aOb7aGb7aOb7aGb7aOb7aGb7aOb7aGb7aOb7 aGb7aOb7aGb7aOb7aGb7aOb7aGb7aOX7aGX7aOX7aGX7KM+H9Cwf0vN8SM/yIT3Ph/QsH9LzfEjP 8iE9z4f0LB/S83xIz/IhPc+H9Cwf0vN8SM/yIT3Ph/QsH9LzfEjP8iE9z4f0LB/S83xIz/IhPc+H 9Cwf0vN8SM/yIT3Ph/QsH9LzfEjP8iE9z4f0LB/S83xIz/IhPc+H9Cwf0vN8SM/yIT3Ph/QsH9Lz fEjP8iE9z4f0LB/S83xIz/IhI6/Pj6w+P/L6/Mjq8yOvz4+sPj/y+vzI6vMjryePrJ488nryyOrJ I68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ68sjqySOvJ4+s njzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryePrJ488nry yOrJI68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ68sjqySOv J4+snjzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryePrJ48 8nryyOrJI68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ68sjq ySOvJ4+snjzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryeP rJ488nryyOrJI68nj6yePPJ68sjqySOvJ4+snjzyevLI6skjryePrJ488nryyOrJI68nj6yePPJ6 8kjryXm/4cj6DUfebziyfsOR9xuOrN9w5P2GI+s3nHm/4cz6DWfebzizfsOZ9xvOrN9w5v2GM+s3 nHm/4cz6DWfebzizfsOZ9xvOrN9w5v2GM+s3nHm/4cz6DWfebzizfsOZ9xvOrN9w5v2GM+s3nHm/ 4cz6DWfebzizfsOZ9xvOrN9w5v2GM+s3nHm/4cz6DWfebzizfsOZ9xvOrN9w5v2GM+s3nHm/4cz6 DWfebzizfsOZ9xvOrN9w5v2GM+s3nHm/4cz6DWfebzizfsOZ9xvOrN9w5v2GM+s3nHmeYWZ5hpnn GWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeY eZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5 hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlm lmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHme YWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ 5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZn mHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFm eYaZ5xlmlmeYeZ5hZnmGmecZZpZnmHmeYWZ5hpnnGWaWZ5h5nmFmeYaZ5xlmlmeYeZ5hZnmGmecZ ZpZnWHmeYWV5hpXnGVaWZ1h5nmFleYaV5xlWlmdYeZ5hZXmGlecZVpZnWHmeYWV5hpXnGVaWZ1h5 nmFleYaV5xlWlmdYeZ5hZXmGlecZVpZnWHmeYWV5hpXnGVaWZ1h5nmFleYaV5xlWlmdYeZ5hZXmG lecZVpZnWHmeYWV5hpXnGVaWZ1h5PXll9eSV15NXVk9eeT15ZfXkldeTV1ZPXnk9eWX15JXXk1dW T155PXll9eSV15NXVk9eeT15ZfXkldeTV1ZPXnk9eWX15JXXk1dWT155PXll9eSV15NXVk9eeT15 ZfXkldeTV1ZPXnk9eWX15JXXk1dWT155PXll9eSV15NXVk9eeT15ZfXkldeTV1ZPXnk9eWX15JXX k1dWT155PXll9eSV15NXVk9eeT15ZfXkldeTV1ZPXnk9eWX15JXXk1dWT155PXll9eSV15NXVk9e eT15ZfXkldeTV1ZPXnk9eWX15JXXk1dWT155PXll9eSV15NXVk9eeT15ZfXkldeTV1ZPXnk9eWX1 5JXXk1dWT155PXll9eSV15NXVk9eeT15ZfXkldeTV1ZPXnk9eWX15JXXk1dWT955PXln9eSd15N3 Vk/eeT15Z/XkndeTd1ZP3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/XkndeTd1ZP3nk9 eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/XkndeTd1ZP3nk+eWf55J3nk3eWT955Pnln+eSd 55N3lk/eeT15Z/XkndeTd1ZP3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/XkndeTd1ZP 3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/XkndeTd1ZP3nk9eWf15J3Xk3dWT955PXln 9eSd15N3Vk/eeT15Z/XkndeTd1ZP3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/XkndeT d1ZP3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/XkndeTd1ZP3nk9eWf15J3Xk3dWT955 PXln9eSd15N3Vk/eeT15Z/XkndeTd1ZP3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk/eeT15Z/Xk ndeTd1ZP3nk9eWf15J3Xk3dWT955PXln9eSd15N3Vk+OvJ4cWT058npyZPXkyOvJkdWTI68nR1ZP jryeHFk9OfJ6cmT15MjryZHVkyOvJ0dWT468nhxZPTnyenJk9eTI68mR1ZMjrydHVk+OvJ4cWT05 8npyZPXkyOvJkdWTI68nR1ZPjjyfHFk+OfJ8cmT55MjzyZHlkyPPJ0eWT478vrXI7luL/L61yO5b i/y+tcjuW4v8vrXI7luL/L61yO5bi/y+tcjuW4v8vrXI7luL/L61yO5bi/y+tcjuW4v8vrXI7luL /L61yO5bi/y+tcjuW4v8vrXI7luL/L61yO5bi/y+tcjuW4v8vrXI7luL/L61yO5bi/y+tcjuW4v8 vrXI7luL/L61yO5bi/y+tcjuW4v8vrXI7luL/L61yO5bi/y+tcjuW4v8vrXI7luL/L61yO5bi/y+ tcjuW4v8vrXI7luLPM8QWZ4h8jxDZHmGyPMMkeUZIs8zRJZniDzPEFmeIfI8Q2R5hsjzDJHlGSLP M0SWZ4g8zxBZniHyPENkeYbI8wyR5RkizzNElmeIPM8QWZ4h8jxDZHmGyPMMkeUZIs8zRJZniDzP EFmeIfI8Q2R5hsjzDJHlGSLPM0SWZ4g8zxBZniHyPENkeYbI8wyR5RkizzNElmeIPM8QWZ4h8jxD ZHmGyPMMkeUZIs8zRJZniDzPEFmeIfI8Q2R5hsjzDJHlGSLPM0SWZ4g8zxBZniHyPENkeYbI8wyR 5RkizzNElmeIPM8QWZ4h8jxDZHmGyPMMkeUZIs8zRJZniDzPEFmeIfI8Q2R5hsjzDJHlGSLPM0SW Z4g8zxBZniHyPENkeYbI8wyR5RkizzNElmeIPM8QWZ4h8jxDZHmGyPMMkeUZIs8zRJJnaK9pnuHj 0UTObB99PJrIme2jj0cTObN99PFoIme2jz4eTeTM9tHHo4mc2T76eDSRM9tHH48mcmb76OPRRM5s H308+u2caZ7h49FEznwfJXmG82C+j5I8w3kw30dJnuE8mO+jJM9wHsz3UZJnOA/m+yjJM5wH832U 5BnOg/k+SvIM58F8HyV5hvaa5hk+Hk3kzPdRkmc4D+b7KMkznAfzfZTkGc6D+T5K8gznwXwfJXmG 82C+j5I8w3kw30dJnuE8mO+jJM9wHsz3UZJnaK9pnuHj0UTOfB8leYbzYL6PkjzDeTDfR0me4TyY 76Mkz3AezPdRkmc4D+b7KMkznAfzfZTkGc6D+T5K8gznwXwfJXmGVvLv8yX7Pl/y7/Ml+z5f8u/z Jfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml +z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7 Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+ X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f8u/zJfs+X/Lv8yX7Pl/y7/Ml+z5f 8u/zJf0+n+aTPx5N5Mz3UZJPPg/m+yjJJ58H832U5JPPg/k+SvLJ58F8HyX55PNgvo+SfPJ5MN9H ST75PJjvoySffB7M91GST24lzSd/PJrIme+jJJ98Hsz3UZJPPg/m+yjJJ58H832U5JPPg/k+SvLJ 58F8HyX55PNgvo+SfPJ5MN9HST75PJjvoySf3EqaT/54NJEz30dJPvk8mO+jJJ98Hsz3UZJPPg/m +yjJJ58H832U5JPPg/k+SvLJ58F8HyX55FbzfEjN8iE1z4fULB9S83xIzfIhNc+H1CwfUvN6cs3q yTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n16yeXPN6cs3qyTWvJ9esnlzzenLN6sk1ryfX rJ5c83pyzerJNa8n16yeXPN6cs3qyTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n16yeXPN6 cs3qyTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n16yeXPN6cs3qyTWvJ9esnlzzenLN6sk1 ryfXrJ5c83pyzerJNa8n16yeXPN6cs3qyTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n16ye XPN6cs3qyTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n16yeXPN6cs3qyTWvJ9esnlzzenLN 6sk1ryfXrJ5c83pyzerJNa8n16yeXPN6cs3qyTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n 16yeXPN6cs3qyTWvJ9esnlzzenLN6sk1ryfXrJ5c83pyzerJNa8n16yeXNN+w49HEznz9Zn0G54H 8/WZ9BueB/P1mfUbtrye3LJ6csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJLasnt7ye3LJ6 csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJLasnt7ye3LJ6csvryS2rJ7e8ntyyenLL68kt qye3vJ7csnpyy+vJLasnt7ye3LJ6csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJLasnt7ye 3LJ6csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJLasnt7ye3LJ6csvryS2rJ7e8ntyyenLL 68ktqye3vJ7csnpyy+vJLasnt7ye3LJ6csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJLasn t7ye3LJ6csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJLasnt7ye3LJ6csvryS2rJ7e8ntyy enLL68ktqye3vJ7csnpyy+vJLasnt7ye3LJ6csvryS2rJ7e8ntyyenLL68ktqye3vJ7csnpyy+vJ Lasnt/T+uo9HEznz9ZncX3cezNdncn/deTBfn8n9defBfH1m9eSW15NbVk9ueT25ZfXklteTW1ZP 7nk9uWf15J7Xk3tWT+55Pbln9eSe15N7Vk/ueT25Z/XknteTe1ZP7nk9uWf15J7Xk3tWT+55Pbln 9eSe15N7Vk/ueT25Z/XknteTe1ZP7nk9uWf15J7Xk3tWT+55Pbln9eSe15N7Vk/ueT25Z/XknteT e1ZP7nk9uWf15J7Xk3tWT+55Pbln9eSe15N7Vk/ueT25Z/XknteTe1ZP7nk9uWf15J7Xk3tWT+55 Pbln9eSe15N7Vk/ueT25Z/XknteTe1ZP7nk9uWf15J7Xk3tWT+55Pbln9eSe15N7Vk/ueT25Z/Xk nteTe1ZP7nk9uWf15J7Xk3tWT+55Pbln9eSe15N7Vk/ueT25Z/XknteTe1ZP7nk9uWf15J7Xk3tW T+55Pbln9eSe15N7Vk/ueT25Z/XknteTe1ZP7nk9uWf15J7Xk3tWT+55Pbln9eSe15N7Vk/ueT25 Z/XknteTe1ZP7nk9uWf15J7Xkx+P/umHL5++/+WnL//3y59//O4vP7/8/OmXx3Off/r8P77+T/8h au5XFFVQVEVRDUV1FMV+hhNFLRS1UVSQqEC1Eag2AtVGoNoIVBuBaiNQbQSqjUC1EaQ21iupjfVK amO9ktpYr6Q21iupjfVKamO9ktpYr6Q21iupjfWKaqOg2iioNgqqjYJqo6DaKKg2CqqNgmqjoNoo qDYqqo2KaqOi2qioNiqqjYpqo6LaqKg2KqqNimqjodpoqDYaqo2GaqOh2mioNhqqjYZqo6HaaKg2 OqqNjmqjo9ro7Jzy+of/8+V///Trj396+fMPf395HPau2P8Jj2Vismoma2aybiYbZrJpJltmsm0m CzFZmB0QZgeE2QFhdkCYHRBmB4TZAWF2QJgdEGIHPM7SYjKxAx4nbzGZ2AGPc7qYTOyAx6leTCZ2 wEMDEJOZHVDMDihmBxSzA4rZAcXsgGJ2QDE7oJgdUMwOKGYHVLMDqtkB1eyAanZANTugmh1QzQ6o ZgdUswOq2QHN7IBmdkAzO6CZHdDMDmhmBzSzA5rZAc3sgGZ2QDc7oJsd0M0O6GYHdKStdqStdqSt dqStdqStdqStDqStDqStDqStDqS7D1QbiKNZA9XGQLUxUG0MVBsT1cZEtTFRbUxUGxPVxkS1MVFt TFQbE9XGRLWxUG0sVBsL1cZCtbFQbSxUGwvVxkK1sVBtLFQbiCtciCtciCtciCtciCtciCtciCtc iCtciCtciCtciCtciCtciCtciCtciCtciCtciCtciCtciCtciCvciCvciCvciCvciCvciCvciCvc iCvcjCvspgLRTQWimwpENxWIbioQ3VQghqlADFOBGKYCMUwFYpgdMMwOGGYHDLMDhtkBw+yAaXbA NDtgmh0wzQ6YZgdMswOm2QHT7IBpdsA0O2CZHbDMDlhmByyzA5bZAcvsgGV2wDI7YJkdsMwOMJnc ZTK5y2Ryl8nkLpPJXSaTu0wmd5lM7jKZ3GUyuctkcpfJ5C6TyV0mk7tMJneZTO4ymdxlMrnLZHKX yeRuk8ndJpO7TSZ3m0zuNpncbTK522Ryt8nkbuTL3ciXu5EvdyNf7ka+3I18uRv5cjfy5W7ky93I l7uRw3Yjh+1GDtuNvLIbeWU38spu5JXdyCu7kVd2I6/sRq7XjVyvG7leN3K9buR63cj1upHrdSPX 60au141crxu5XjdyvW7ket2I2tuI2tuI2tuIv9uIv9uIv9uIpNuIpNuIpNuIpNuIpNuIpNuIpNuI pNuIpNuIpNuIpNuIpNuIpNuIpNuIpNuIpNuIpNuIpNuIpNuIpNumC3CbLsBtugC36QLcpgtwmy7A bboAt+kC3KYLcJsuwG0a97Zp3NumcW+bXrtteu226bXbptdum167bXrttum126Y9bpv2uG3a47Zp j9umPW6b9rht2uO2aY/bpj1um/a4bdrjtmmP26Y9bpt45jbxzG3imdskKrdJVG6TqNwmBLlNCHKb EOQ2IchtQpDbhCC3CUFuE4LcJgS5TQhymxDkNiHIbUKQ24QgtwlBbhOC3CYEuU0IcpsQ5BYhyF6I oelEAWnvRAFp70QBae9EAWnvRAFp70QBae9EAWmvV2JoOlFA2jtRpDYqMTSdKFIblRiaThSpjUoM TSeK1EYlQEavBMg4Uag2CFpxotCnTNCKE4U+L7K8/EShz4ugFScKfV5kefmJQp8yATJOFOpKglac KPR5EUjiRKGfPIEkThT6yRNI4kShz4tAEicKdSWBJHolkMSJQrVBIIkThWqDQBInCtUGgSROFKoN glacKFQbBK04Uag2CJBxolBtECDjRLE3c+/MfR1ExGTemfs6tojJvDP3dcgRk3ln7utIpCWrInJ/ HaDEZGIHVBG5v05hYjKxA6qI3F9HOTGZ2AFVBGCu86CYzOwAkVm5DpViMrNoRczkOpmKycw6E5mV 63grJjN/04oAzHVGFpOZvxxFZuU6aHvJRMzkOpaLyczSEDGT62wvJjPrTMRMLoFATGYWrYiZXCqD mMzsABEzuaQKMZnZASJmcukdYjKzA0Rm5RJNxGRmB4gAzKW8iMnMDhABmN6R3NaR3NaR3NaR3NaR 3NaR3NaR3NaR3NaJ/+lEESm2E//TiUK1QfxPJwrVBvE/nShUG8T/dKJQbRD/04lCtUH8TycK1Qbx P50oVBtkk/iJQrVBNomfKFQbZJP4iUKfMtkJfv4QoU+Z7AQ/UejzItu9TxT6vMh27xOFepls9z5R 6FMm271PFPqUEQzXEQzXEQzXEQzXEQzXEQzXEQzXEQw3EAw3EAw3EAw3EAw3EAw3EAw3EAw3EAw3 EAw3EAw3EAw3EAzXzbN3N8/e3Tx7d/Ps3c2zdzfP3t08e3f17C2aT64jnpjM7ADRfHKdE8VkZgeI 5pPrsCkmMztANJ9cJ1YxmdkBovnkOvZ6yUTzyXVIFpOZHSBu4L5O2mIyswPEDdzXcV1MZhatuDT7 OvOLycw6E/dcX8KBmMysM3HP9aU+iMnMohX3XF8ShpjM/E1rQrfdhG67Cd12E7rtJnTbTei2m9Dt MKHbYUK3w4RuhwndDhO6HSZ0O0zodpjQ7TCh22FCt8OEbocJ3U6kvk2kvk2kvk2kvk2yG/xEEWV2 IgPrRAbWSXaDnyiizE5ke53I9jqR7XUi2+tEtteJbK8T2V4n2UN+olBtILPsJHvITxSqjYZqAxlz JzLmTmTMnciYO5ExdyJj7kTG3ImMuRMZcycy5k5kzJ3ImDuRMXciY+5ExtyJjLkTGXMnIgUnIgUn IgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUnIgUn IgUnIgUnIgWneWad5pl1mmfWqZ5ZxU3p15FPTCaqNtN0nU5xU/p1nBSTmR1gWlinaWGdpoV1mhbW aVpYp2lhneIO9+t0LCYzO0Dc4X4dsb1kzewA06k7TafuNJ2603TqTtOpO02n7jSdutN06k7TqTtN p+40nbrTdOpO06k7TafuNJ2603TqTtOpO01aeJq08DRp4WnSwtOkhadJC0+TFp4mLTxNWniatPA0 aeFp0sLTpIWnSQtPkxaeJi08TVp4mrTwNGnhadLC06SFp0kLT5MWniYtPJHTdiKn7URO24mcthM5 bedC2iry507kz53InzuRP3duVBvI1TuRq3ciV+9Ert6JXL0TuXoncvVO5OqdyNU7kat3IlfvRK7e iVy9E7l6J3L1TuTqncjVu5CrdyFX70Ku3oVcvQu5ehdy9S7k6l3I1bsQV7gQIbgQIbgQIbgQIbgQ IbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQIbgQ IbgQIbgYIWj6Lqfpu5ym73Kavstp+i4fhzcxmaklmCbOaZo4p2nifJwXxWRmB5iO0Gk6QqfpCJ2m I3SajtBpOkKn6QidpiN0mo7QaTpCp+kInaYjdJqO0Gk6QqfpCJ2mI3SZjtBlOkKX6QhdpiN0mY7Q ZTpCl+kIXaYjdJl07TKB2GUCscsEYpcJxC4TiF0mELtMIHaZQOwygdhlArHLBGKXCcQuE4hdJhC7 TCB2mUDsMoHYZQKxywRilwnELhOIXSYQu0wgdplA7DKB2GUCsRuZpTYyS21kltrILLWRWWojs9RG ZqmNzFIbwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4b wR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR4bwR6BYI9AsEcg2CMQ7BEI9ggEewSCPQLBHoFg j0BLpAIhIoEQkUCISCBEJBAiEggRCYSIBEJEAiEigRCRQIhIIEQkECISCBEJhIgEQkQCISKBEJFt mgS2aRLYpklgmyaBbZoEtmkS2KZJYJsmgW2iLdtEW7aJtmwTbdkm2rJNtGWbaMs20ZZtoi3bRFu2 ibZsE23ZJtqyTbRlm2jLNtGWbaIt20Rbtom2bBNt2Sbask20ZZtoyzbRlm2iLdtEW7aJtmwTbQkT bQkTbQkTbQkTbQkTbQkTbQkTbQkTbQkTbQlzcVyYnEyYnEyYnEyYnEyYnEyYnEyYnEyYnEyYnEyY nEyYnEyYnEyYnEyYnEyYnEyYnEyYnEyYnEwgi1Ugi1Ugi1Ugi1Ugi1Ugi1Ugi1Ugi1WgJeyBlrAH WsIeaAl7oCXsgZawB1rCHmgJe6Al7IGWsAdawh5oCXugJeyBlrAHWsIeaAl7oCXsgZawB1rCHmgJ e6Al7IGWsAdawh5oCXugJeyBlrAHWsIeaAl7IK4wEFcYiCsMxBUG4goDcYWBuMJAXGEgrjAQVxiI KwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBWG6VMI06cQ pk8hTJ9CmD6FMH0KYfoUwvQphLm4O8zF3WEu7g5zcXeYi7vDXNwd5uLuMBd3h7m4O8zF3WEu7g5z cXeYi7vDXNwd5uLuMBd3h7m4O8zF3WEu7g5zcXeYi7vDXNwd5uLuMBd3h7m4O8zF3WEu7g5zcXeY TG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6Y TG6YTG6YTG6YTG6YTG6YTG6YTG6YTG6ITO54Jb6mEwX0zhMF9M4TBfTOEwX0zhMF9M7xSriMEwX0 zhMFtPATBbTwE4Vqg3AZJwrVBuEyThSqDcJljFfCZZwoVBuEyzhRqDYIl3GiUG0QLuNEodogXMaJ QrVBuIwThWqDcBknCtUG4TJOFKoNwmWcKFQbhMs4Uag2CJdxolBtEC7jRKHaIFzGiUK1QbiME4Vq g3AZJwrVBuEyThSqDcJlnChUG4TLOFGoNgiXcaJQbRAu40Sh2iBcxolCtUG4jBOFaoNwGScK1Qbh Mk4UO6d45/zrWCYm88751yFOTOad868jn5dMZD6uA6KYzFO6ruOkmMzsAJH5uM6kYjKzA0Tm4zrY eslE5uM6BovJzA4QmY/rLC0mMztAZD6uA7mYzOwAkfm4TvViMrMDRObjkgbEZGYHiMzHpS+IycwO EJmPS6TwkonMxyVpiMnMDhCZj0sXEZOZHSAyH5e4IiYzO0BkPi6FRkxmdoDIfFwyj5jM7ACR+bi0 IjGZ2QEi83EJTl4ykfm45CkxmdkBIvNxaVxiMrMDRObjEsq0ZIXsmz1RRO8sZN/siSJ6Z0FcRkFc RkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFc RkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFc RkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFcRkFc RkFcRhH3LF7HMjGZeM4v4p7F62wnJhPP+cVkPorJfBST+Sgm81FM5qOYzEcxmY9iMh/FZD6KyXwU k/koJvNRTOajmMxHMZmPYjIfxWQ+isl8FJP5KCbzUUzmo5jMRzGZj2IyH8VkPorJfBST+Sgm81FM 5qOYzEcxmY9iMh/FZD6KyXwUk/koJvNRTOajmMxHMZmPYjIfxWQ+isl8FJP5KCbzUUzmo5jMRzGZ j2IyH8VkPorJfBST+Sgm81FM5qOYzEcxmY9iMh/FZD6KyXwU5GsqyNdUkK+pIF9TIftmTxTSVsm+ 2ROFtFVyj/2JQtoqucf+RKHaIPfYnyhUG+Qe+xNFaqOSe+xPFKmNSu6xP1GkNiq5x/5Ekdqo5B77 E0Vqo5J77E8Uqg1yj/2JQrVB7rE/Uag2yD32JwrVBrnH/kSh2iD32I+KCMGKWL+KqL2KqL2KqL2K qL2KqL2K+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LuK+LvK +DuTTS8mm15MNr2obLq4j/A6GnnJxH2E10FKTGae1MU7wq/TmJjM7ADxjvDrSCcmMztAvCP8OheK ycQOqOId4dfhUkwmdkAV7wi/TqhiMrEDqnhH+HXM9ZKJd4Rfh2IxmdkB4h3h18laTGZ2gHhH+HU8 F5OZHWDiptUkRKsJdVYT6qwm1FlNqLOaUGc1OcxqcpjV5DCryWFWk8OsJodZTQ6zmhxmNTnManKY 1eQwq8lhVpPDrCaHWU0Os5ocZjU5zGpymA1pXA1pXA1pXA25RRtyizbkFm3ILdqQW7Qht2hDvs+G fJ8N+T4bcnA25MVsyIvZkBezIS9mQ17MhryYDXkxG/JiNuTFbMiL2ZAXsyFXZUOuyoZclQ35Ixvy RzbkdGzI6diQ07Ehp2NDzFVD9FRD9FQz32Wa+S7TzHeZZtpAmmkDaaYNpJk2kGbaQJppA2mmc6OZ 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 b1GoNu5u8XyLQrVxd4vnWxSqjbtbPN+iUG3c3eL5FoVq4+4Wz7coVBt3t3i+RaHauLvF8y0K1Qbi CjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfi CjfiCjfiCjfiCjfiCjfiCjfiCjfiCjfiCi2fwsexTExmKhCST+HjbCcmMxUIyafwcUAUk5kKhLSy +uOUKSYzO0BaWf1xVBWTmR0graz+OO+KycwOkFZWfxyaxWRmB0grqz9O3mIyswOkldUfx3cvmbSy +uOwLyYzO0BaWf2hGIjJzA6QVlZ/yA5iMrMDpJXVH9qFmMzsAJPJ3SaTu00md5tM7jaZ3G0yudtk crfJ5G6Tyd0mk7tNJnebTO42mdxtMrnbZHK3yeRuk8ndJpO7TSZ3m0zuNpncbTK522Ryt8nkbpPJ 3SaTu5EvdyNf7ka+3I18uRv5cjfy5W7ky93Il7uRL3cjX+5GvtyNfLmBfLmBfLmBfLmBfLmBfLmB fLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmBfLmB uMJAXGEgrjAQVxiIKwzEFQbiCgNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4wEFcY iCsMxBUG4goDcYWBuMJAXGEgrjAYV2h6IrfpidymJ3KbnshteiK36Yncpidym57IbXoit+mJ3KYn cpueyDA9kWF6IsP0RIbpiQzTExmmJzJMT2SYnsgwPZFheiLD9ESG6YkM0xMZpicyTE9kmJ7IMD2R YXoiw/REhumJDNMTGaYnMkxPZJieyDCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ 3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3DCZ3EC+3EC+3EC+ 3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+ 3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EC+3EBcYSCuMBBXGIgrDMQV BuIKA3GFgbjCQFxhIK4wEFcYhCvsr4QrPFGgNk4UqI0TBWrjRIHaOFGgNk4UqI0TBWrjRIHaOFGo NghXeKJQbRCu8ESh2iBc4Yli5xRTgTA9kWF6IsP0RIbpiQzTExmmJzJMT2SYnsgwPZFheiLD9ESG 6YkM0xMZpicyTE9kmJ7IMD2RYXoiw/REhumJDNMTGaYnMkxPZJieyDA9kWF6IsP0RIbpiQzTExmm JzJMT2SYnsgwPZFheiLD9ESGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyeSGyOReeo6Y zOuAS/0Rk3kdcGlFYjKvAy5lSUzmdcClQ4nJzA4QmdxLzBKTmR0gMrmXIiYmMzuA+HJPFNJWiS/3 RCFtlfhyTxTSVokv90QhbZX4ck8U0t2JL/dEodogvtwThWqD+HJPFKoN4ss9Uag2iC/3RKHaIL7c E4Vqg/hyTxSqDeLLPVGoNogv90Sh2iC+3BOFaoP4ck8Uqg3iyz1RqDaIL/dEodogXOGJQrVBuMIT hWqDcIUnCtUG4QpPFKoNwhWeKFQbhCs8Uag2CFd4olBtEK7wRKHaIFzhiUK1QbjCE4Vqg3CFJwrV BuEKTxSqDcIVnihUG4QrPFGMATEVCNETeZ3WxGSmAiF6Iq8jn5jMVCBET+R1bhSTmQqE6Im8Dp9i MrMDRE/kdYIVk5kdIHoir2OwmMzsANETeZ2lxWRmB4ieyOtA7iUTPZHX8V1MZnaA6Im8NAAxmdkB oifyEhLEZGYHiJ7IS40Qk5kdIDK5l6QhJjM7QGRyL11ETGZ2gMjkXuKKl0xkci8pRkxmdoDI5F56 jpjM7ACRyb1EITGZ2QEik3spS2IyswNEJveSp8RkZgeITO6lcYnJzA4QmdxLKPOSEV/uiULaKvHl niikrRJf7olC2irx5Z4opK0SX+6JQtoq8eWeKFQbxJd7olBtEF/uiUK1QXy5JwrVBvHlnihSGwX5 cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cQny5JwrVBuIKC+IK C+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IKC+IK C+IKC+IKC+IKC+IKC+IKC+MKRU/kdSwTk5kKhOiJvM52YjJTgRA9kdcBUUxmKhCiJ/I6ZYrJzA4Q PZHXUVVMZnaA6Im8zrtiMrMDRE/kdWjWkhXTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUxP ZDE9kcX0RBbTE1lMT2QxPZHF9EQWk8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hM bjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExuQb7cgny5 BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW 5MstyJdbkC+3IF9uQb7cgny5BflyC/LlFuTLLciXW5AvtyBfbkG+3IJ8uQX5cgvy5RbEFRbEFRbE FRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFRbEFVbEFVbE FVbEFVbEFVbEFVbEFVbEFVbGFZqeyGJ6IovpiSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYn spieyGJ6IovpiSymJ7KYnshieiKL6YkspieymJ7IYnoii+mJLKYnspieyGJ6IovpiSymJ7KYnshi eiKL6YkspieymJ7IYnoii+mJLKYnsphMbjGZ3GIyucVkcovJ5BaTyS0mk1tMJreYTG4xmdxiMrnF ZHKLyeQWk8ktJpNbTCa3mExuMZncYjK5xWRyq8nkVpPJrSaTW00mt5pMbjWZ3GoyudVkcivy5Vbk y63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdbkS+3Il9uRb7ciny5FflyK/LlVuTLrciXW5Ev tyJfbkW+3Ip8uRX5civy5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdbkS+3Iq6wIq6w Iq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6wIq6w Iq6wIq6wIq6wIq6wIq6wIq6wIq6wmp7Ianoiq+mJrKYnspqeyGp6IqvpiaymJ7KanshqeiKr6Yms pieymp7Ianoiq+mJrKYnspqeyGp6IqvpiaymJ7KanshqeiKr6Ymspieymp7Ianoiq+mJrKYnspqe yGp6IqvpiaymJ7KanshqeiKr6YmspieymkxuNZncajK51WRyq8nkVpPJrSaTW00mt5pMbjWZ3Goy udVkcqvJ5FaTya0mk1tNJreaTG41mdxqMrnVZHKryeRWk8mtJpNbTSa3mkxuNZncajK51WRyK/Ll VuTLrciXW5EvtyJfbkW+3Ip8uRX5civy5Vbky63Il1uRL7ciX25FvtyKfLkV+XIr8uVW5MutyJdb kS+3Il9uRb7ciny5FflyK/LlVuTLrciXW5EvtyFfbkO+3IZ8uQ35chvy5Tbky23Il9uQL7chrrAh rrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAhrrAh rrAhrrAhrrAhrrAhrrAhrrAhrrAxrtD0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1P ZDU9kdX0RFbTE1lNT2Q1PZHV9ERW0xNZTU9kNT2R1fREVtMTWU1PZDU9kdX0RFbTE1lNT2Q1PZHN 9EQ20xPZTE9kMz2RzfRENtMT2UxPZDM9kc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2 k8ltJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT20wmt5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9uQ L7chX25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DflyG/LlNuTLbciX25AvtyFfbkO+ 3IZ8uQ35chvy5Tbky23Il9uQL7chX25DvtyGfLkN+XIb8uU25MttyJfbkC+3IV9uQ77chny5DXGF DXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGFDXGF DXGFDXGFDXGFDXGFDXGFDXGFDXGFjXGFpieymZ7IZnoim+mJbKYnspmeyGZ6IpvpiWymJ7KZnshm eiKb6YlspieymZ7IZnoim+mJbKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlspieymZ7IZnoim+mJ bKYnspmeyGZ6IpvpiWymJ7KZnshmeiKb6YlsJpPbTCa3mUxuM5ncZjK5zWRym8nkNpPJbSaT20wm t5lMbjOZ3GYyuc1kcpvJ5DaTyW0mk9tMJreZTG4zmdxmMrnNZHKbyeQ2k8ltJpPbTCa3mUxuM5nc jny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5Xbky+3Il9uRL7cjX25HvtyOfLkd+XI7 8uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5Xbky+2I K+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yI K+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+ymJ7KbnshueiK76Ynspieym57Ibnoiu+mJ7KYnspue yG56IrvpieymJ7KbnshueiK76Ynspieym57Ibnoiu+mJ7KYnspueyG56IrvpieymJ7KbnshueiK7 6Ynspieym57Ibnoiu+mJ7KYnspueyG56Irvpiewmk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPb TSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJrebTG43 mdyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35 cjvy5Xbky+3Il9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL HYgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgr HIgrHIgrHIgrHIgrHIgrHIgrHIgrHIgrHIwrND2R3fREdtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd 9ER20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9kNz2R3fREdtMT 2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU/kMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ 3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ry h8nkDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5Msd yJc7kC93IF/uQL7cgXy5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cg X+5AXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFA XOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOFAXOEwPZHD9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9 kcP0RA7TEzlMT+QwPZHD9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMT+QwPZHD9EQO 0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMT+QwmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzu MJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnD ZHKHyeQO5MsdyJc7kC93IF/uQL7cgXy5A/lyB/LlTuTLnciXO5EvdyJf7kS+3Il8uRP5cify5U7k y53IlzuRL3ciX+5EvtyJfLkT+XIn8uVO5MudyJc7kS93Il/uRL7ciXy5E/lyJ/LlTuTLnciXO5Ev dyJf7kRc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc4URc 4URc4URc4URc4URc4URc4URc4URc4URc4URc4WRcoemJHKYncpieyGF6IofpiRymJ3KYnshheiKn 6Ymcpidymp7IaXoip+mJnKYncpqeyGl6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYn cpqeyGl6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip8nkTpPJnSaTO00md5pM7jSZ3GkyudNk cqfJ5E6TyZ0mkztNJneaTO40mdxpMrnTZHKnyeROk8mdJpM7TSZ3mkzuNJncaTK502Ryp8nkTpPJ nSaTO00mdyJf7kS+3Il8uRP5cify5U7ky53IlzuRL3ciX+5EvtyJfLkT+XIn8uVO5MudyJc7kS93 Il/uRL7ciXy5E/lyJ3LYTuSwnchhO5HDdiKH7UQO24kcthM5bCdy2E7klZ3IKzuRV3Yi1+tE1N5E 1N5E1N5E1N5E1N5E1N5E1N5E1N5C1N5C/N1C/N1CZNZCZNZCZNZCZNZCZNZCZNZiZJbpKpumq2ya rrJpusqm6Sqbpqtsmq6yabrKpukqm6arbJqusmm6yqbpKpumq2yarrJpusqm6Sqbpqtsmq6yabrK pmkEm6YRbJpGsGkawaZpBJumEWyaRrBpGsGmaQSbpndrmt6taXq3pmm3mibuN03cb5q43zRxv2ni ftPE/aaJ+00T91sm7rdMQm+ZhN4yYadlwk7LhJ2WCTstE3ZaJuy0RNhpbGK8O1HgCD82Md6dKCD9 nSggCp0oIO+cKCDvnCgg75woIO+cKCDvnCj0KRML3YlCnzKx0J0o9CkTC92JQp8ysdCdKPQpEwvd iUK1QSx0JwrVBrHQnShUG8RCd6JQbRAL3YlCtUEsdCcK1Qax0J0oVBvEQneiUG0QC92JQrVBLHQn CtUGsdCdKFQbxEJ3otCnTMxwJwp9ysQMd6LQp0xgnhOFPmUC84xNYJ4ThX4DEJjnRKHaIDDPiUK1 QWCeE4Vqg8A8JwrVBoF5ThSqDdGcdR2VvGSiOes6WInJPPHjOoaJyTy94jq0ick8veI64onJzKIV /VTXOVFMZhat6Ke6DptiMrNoRT/VdWIVk5m/tkU/1XXsFZOZHSD6qa6zs5jM7ADRT3UdwMVkZgeI fqrrFO8lE/1U15lfTGZ2gOinuoQDMZnZAaKf6lIfxGRmB4h+qkvCEJOZRStaoC4dRExmFq0IkF5i ipjMLFoRIL0UGTGZ+WtbBEgvWUdMZnaACJBe2pCYzOwAESC9BKbfS/bdL9+9/PmnL389ES9fPv3l 1x+/+/IPwS/f//jdD3/7+eXXnz/96eWPP/70/V9fSl3zdba6X//w/U9fHv/qD5//8vL5099/+fT5 l58fGf/xS3j8s5+v8J9f2mvM9puPvX+hXz49vrFffnp5fQa+py7ZKCap8Z/Tev2tn1N7fVybVl9r 8ue0Xv/Dz+n0Tu3x+psP/sP3PF9XqTH/489r5GKRjCvivwtp+Atp+Atp+Atp+Atp+Atp+Atp+Atp +Atp+Atp+Atp+Atp+Atp+Atp+Atp+Atp+CcK1QYx5J4oVBvEkHuiUG0QG++JQrVBbLxrExvviUK1 QWy8JwrVBrHxnihUG+Si3BOFaoOYf08Uqg1yUe6JQrVBLMMnCtUGsQyfKFQbxDJ8olBtEMvwiSK1 EcQyfKJIbQQxGp8oUhtBLvo4UaQ2glz0caJIbQThjU8Uqg3CG58oVBuENz5RqDYIb3yiUG0Q3vhE odogdvIThf6miGrgMtXAZaqBy1QDl6kGLlMNXKYauEw1cJlq4DLVwGWqgctUA5epBq5/pgaiE6yY zOwA0U5+HYPFZGYHiHby6ywtJjM7QPSmXwdyL5noTb+O72IyswNEb/qlAYjJzA4QLym9hAQxmdkB otH9UiPEZGYHiK75S9IQk5kdILrmL11ETGZ2gOiav8QVLVmIrvlLihGTiR0QogX/0nPEZGIHhHhJ ziUKicnEDgjRh3EpS2IyswNEH8YlT4nJzA4QfRiXxiUmMztA3BtxCWVeMuLyP1FIWyUu/xOFtFXi 8j9RSFslLv8ThbRV4vI/UUh3Jy7/E4Vqg7j8TxSqDeLyP1GoNojL/0Sh2iAu/xOFaoO4/M9/oNog Lv/zH6g2iMv//AeqDeLXP/+BPmXi119B/PonCn3KxOV/otDnRfz6Jwr1MmL9ArF+gVi/QKxfINYv EOsXiPULxPoFYv0CsX6BWL9ArF8g1i8Q6xeI9QvE+gVi/QKxfoFYv0CsXyDWLxDrF4j1C8T6BWL9 ArF+gVi/EI3u11FJTGaqAqLR/TpviclMVUA0ul+HNjGZqQqIRvfr5CcmMztANLpfx0cxmdkBotH9 OoOKycwOEI3u10HWSyYa3a9jr5jM7ADR6H6dncVkZgeI3vTrAC4mM4tW9KZfp3gxmVm0ojf9kgLE ZOZvWpNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNG DZNGDZNGDZNGDZNGDZNGDZNGDZNGDZNGDYtGjbJbu63aP6Puqm/PqLvq2zPqrvr2jLqrzD6j7iqz z6i7yuwz6q4y+4y6q8w+o+4qs1fUbdX+GYVq47Zq/4xCtXFbtX9Godq4rdo/o1Bt3Fbtn1GoNm6r 9s8oVBu3VftnFKqN2w79ZxSqjdsO/WcUqo3bDv1nFKqN2w79ZxSqjdsO/WcUqo3bDv1nFKqN2w79 ZxSqjdsO/WcUqY1+26H/jCK10W879J9RpDb6bYf+M4rURr/t0H9Gkdrotx36zyhUG7cd+s8oVBu3 HfrPKFQbtx36zyhUG7cd+s8oVBu3HfrPKFQbtwnjZxSqjduE8TOKnVOkM+v7sUxMJp1Z3w9xYjJJ tXk/8onJJNXm/YAoJpNUm/fjpJfM0i3fD59iMrMDLN3y/QQrJjM7wNIt34/BYjKzAyzd8v0sLSYz O8DSLd8P5GIyswMsF/37qV5MZnaA5aJ/lwa8ZJaL/l1IEJOZHWC56N/VCDGZ2QGWi/5d0hCTmR1g uejfdRExmdgB3XLRv4srYjKxA7rlon9XaMRkYgd0y0X/LvN4ySwX/bsoJCYzO8By0b8rS2IyswMs F/27PCUmMzvActG/a1xiMrMDLMfIu1AmJYtYt522z6j72uoj6r62+oi6r60+ou5rq4+o+9rqibrt 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 uMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMKCuMLCuELRE3kdy8RkpgIheiKvs52YzFQgRE/kdUAU k5kKhOiJvE6ZYjKzA0RP5HVUFZOZHSB6Iq/zrpjM7ADRE3kdmsVkZgeInsjr5C0mMztA9ERex3cv meiJvA77YjKzA0RP5KUYiMnMDhA9kZfsICYzO8D0RBaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQW k8ktJpNbTCa3mExuMZncYjK5xWRyi8nkFpPJLSaTW0wmt5hMbjGZ3GIyucVkcovJ5BaTyS0mk1tM JreYTG5BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5BflyC/LlFuTLLciXW5AvtyBfbkG+ 3IJ8uQX5cgvy5Rbkyy3Il1uQL7cgX25BvtyCfLkF+XIL8uUW5MstyJdbkC+3IF9uQb7cgny5Bfly C/LlFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQV FsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFsQVFtMTWUxPZDE9kcX0RBbTE1lMT2QxPZHF9EQW 0xNZTE9kMT2RxfREFtMTWUxPZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFtMTWUxP ZDE9kcX0RBbTE1lMT2QxPZHF9EQW0xNZTE9kMT2RxfREFpPJLSaTW0wmt5hMbjGZ3GIyucVkcovJ 5BaTyS0mk1tMJreYTG4xmdxiMrnFZHKLyeQWk8ktJpNbTCa3mExu+SdM7ne/fPfy55++/PVEvHz5 9Jdff/zuyz8Ev3z/43c//O3nl19//vSnlz/++NP3f305J/W29o4y/vD9T18e/+oPn//y8vnT33/5 9PmXnx8Z//FLePyzn6/wn1/iNx95/yK/fHp8U7/89PL6DHpPW7JRTHUTf+BmY5uocTFR42KixsVE jYuJGhdkNy7IblyQ3bggu3FBduOC7MYF2Y0LshtXZDeuyG5ckd24IrtxRXbjiuzGFdmNK7IbV2Q3 rshuXJHduCK7cUV244rsxhXZjSuyG1dkN67IblyR3bgiu3FFduOK7MYV2Y0rshtXZDeuyG5ckd24 IrtxRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhk RbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkRbhkZbikafUsptWzmFbPYlo9i2n1LKbVs5hWz2JaPatp 9aym1bOaVs9qWj2rafWsptWzmlbPalo9q2n1rKbVs5pWz2paPatp9aym1bOaVs9qWj2rafWsptWz mlbPalo9q2n1rKbVs5pWz2paPatp9aym1bOaVs9qWj2riRpXEzWuJmpcTdS4mqhxNVHjaqLG1USN q4kaVxM1riZqXE3UuJqocTVR42qixtVEjauJGlcTNa7/BDX+Jvxwgn8Lftij7V33XDn44fEl/Hv4 Yf3mIwB++O0opqOJP3CzsU2CupoEdTUJ6moS1NUkqKtJUFeToK7IRV2Ri7oiF3VFLuqKXNQVuagr clFX5KKuyEVdkYu6Ihd1RS7qilzUFbmoK3JRV+SirshFXZGLuiIXdUUu6opc1BW5qCtyUVfkoq7I RV2Ri7oiF3VFLuqKXNQVuagrclFX5KKuyEVdkYu6Ihd1RS7qinDJinDJinDJinDJinDJinDJinDJ inDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJhnDJ hnDJxnBJ08FaTQdrNR2s1XSwVtPBWk0HazUdrNV0sFbTwVpNB2s1HazVdLBW08FaTQdrNR2s1XSw VtPBWk0HazUdrNV0sFbTwVpNB2s1HazVdLBW08FaTQdrNR2s1XSwVvNWmWpaPatp9aym1bOaVs9q Wj2rafWsptWzmqhxNVHjaqLG1USNq4kaVxM1riZqXE3UuJmocTNR42aixs1EjZuJGjcTNW4matxM 1LiZqHEzUeNmosbNRI2biRo3EzVu/wQ1/ibKcoJ/A2WpvfZTJA9WO4WyPL6Eb6As5xGAsvx2FNPo xB+42dgmQd1MgrqZBHVDLuqGXNQNuagbclE35KJuyEXdkIu6IRd1Qy7qhlzUDbmoG3JRN+SibshF 3ZCLuiEXdUMu6oZc1A25qBtyUTfkom7IRd2Qi7ohF3VDLuqGXNQNuagbclE35KJuyEXdkIu6IRd1 Qy7qhlzUDbmoG3JRN4RLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRL NoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNoRLNtPB2kwHazMdrM10sDbTwdpM B2szHazNdLA208HaTAdrMx2szXSwNtPB2kwHazMdrM10sDbTwdpMB2szHazNdLA208HaTAdrMx2s zXSwNtPB2kwHazMvy2mm1bOZVs9mWj2bafVsptWzmVbPZlo9m2n1bKbVs5mocTNR42aixs1EjZuJ GjcTNW4matxM1LiZqHEzUeNmosbNRI2biRo3EzVuJmrcTNS4mahxM1HjZqLGzUSNm4kaNxM1biZq 3EzUuJmocTNR42aixs1EjRuyGzdkN27IbtyQ3bghu3FDduOG7MYN2Y0bshs3ZDduyG7ckN24Ibtx Q3bjhuzGDdmNO7Ibd2Q37shu3JHduCO7cUd2447sxh3ZjTuyG3dkN+7IbtyR3bgju3FHduOO7MYd 2Y07sht3ZDfuyG7ckd24I66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66w I66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66wI66wM67QtHo20+rZTKtnM62ezbR6 NtPq2UyrZzOtns20ejbT6tlMq2czrZ7NtHo20+rZTKtnM62e3bR6dtPq2U2rZzetnt20enbT6tlN q2c3rZ7dtHp20+rZTatnN62e3bR6dtPq2c1bZbrpieymJ7KbnshueiK76YnsJpPbTSa3m0xuN5nc bjK53WRyu8nkdpPJ7SaT200mt5tMbjeZ3G4yud1kcrvJ5HaTye0mk9tNJrebTG43mdxuMrndZHK7 yeR2k8ntJpPbTSa3m0xuN5ncjny5HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5Xbky+3I l9uRL7cjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5HflyO/LlduTL7ciX25EvtyNf bke+3I58uR35cjvy5Xbky+2IK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yIK+yI K+yIK+yIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyIKxyMKzQ9kd30RHbTE9lNT2Q3 PZHd9ER20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9kNz2R3fRE dtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9kNz2R3fREdtMT2U1PZDeZ3G4yud1kcrvJ 5HaTye0mk9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0zuMJncYTK5w2Ryh8nkDpPJHSaT O0wmd5hM7jCZ3GEyucNkcofJ5A7kyx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/u QL7cgXy5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cgX+5AvtyBfLkD +XIH8uUO5MsdyJc7kC93IF/uQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzh QFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhQFzhMD2Rw/REDtMTOUxP 5DA9kcP0RA7TEzlMT+QwPZHD9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMT+QwPZHD 9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMT+QwPZHD9EQO0xM5TE/kMJncYTK5w2Ry h8nkDpPJHSaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnDZHKHyeQOk8kd JpM7TCZ3mEzuMJncYTK5w2Ryh8nkDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzuQL3cg X+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/uQL7cgXy5A/lyB/LlTuTLnciXO5EvdyJf7kS+3Il8 uRP5cify5U7ky53IlzuRL3ciX+5EXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFE XOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFEXOFkXKHpiRymJ3KYnshh eiKH6YkcpidymJ7IYXoih+mJHKYncpieyGF6IofpiRymJ3KYnshheiKH6YkcpidymJ7IYXoih+mJ HKYncpieyGF6IqfpiZymJ3KanshpeiKn6Ymcpidymp7IaXoip+mJnKYncpqeyGl6IqfJ5E6TyZ0m kztNJneaTO40mdxpMrnTZHKnyeROk8mdJpM7TSZ3mkzuNJncaTK502Ryp8nkTpPJnSaTO00md5pM 7jSZ3GkyudNkcqfJ5E6TyZ0mkztNJnchv9ZCfq2F/FoL+bUW8mst5NdayK+1kF9rId5kId5kId5k Id5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5kId5k Id5kId5kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95k I95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kI95kmT6FZfoUlulTWKZP YZk+hWX6FJbpU1imT2GZnMwyOZllcjLL5GSWycksk5NZJiezTE5mmZzMMjmZZXIyy+RklsnJLJOT WSYns0xOZpmczDI5mWVyMsvkZJbJySyTk1kmJ7NMTmabnMw2OZltcjLb5GS2yclsk5PZJiezTU5m m5zMNjmZbXIy2+RktsnJbJOT2SYns01OZpuczDY5mW1yMtvkZLbJyWyTk9kmJ7NNTmabnMw2OZlt cjLb5GS2yclsk5PZJiezTU5mI7/WRn6tjfxaG/m1NvJrbeTX2sivtZFfa6M98Bvtgd9oD/xGe+A3 2gO/0R74jfbAb7QHfqM98Bvtgd9oD/xGe+A32gO/0R74jfbAb7QHfqM98Bvtgd9oD/xGe+A32gO/ 0R74jfbAb7QHfqM98Bvtgd9oD/xGe+A34go34go34go34go34go34go34go34go34go34go34go3 4go34go34go34go34go34go34go34go34go34go34go34go34go34go34go34go34gq36VPYpk9h mz6FbfoUtulT2KZPYZs+hW36FLa5O3ybu8O3uTt8m7vDt7k7fJu7w7e5O3ybu8O3uTt8m7vDt7k7 fJu7w7e5O3ybu8O3uTt8m7vDt7k7fJu7w7e5O3ybu8O3uTt8m7vDt7k7fJu7w7e5O3ybu8O3uTt8 m7vDt8nkbpPJ3SaTu00md5tM7jaZ3G0yudtkcrfJ5G6Tyd0mk7tNJnebTO42mdxtMrnbZHK3yeRu k8ndJpO7TSZ3m0zuNpncbTK522Ryt8nkbpPJ3SaTu0Umd70Sv9aJAlrdiQI67okCOu6JAjruiQI6 7nolfq0TBXTcEwV03BMFdNwThWqD8CYnCtUG4U1OFKoNwpusV8KbnChUG4Q3OVGoNghvcqJQbRDe 5ESh2iC8yYlCtUF4kxOFaoPwJicK1QbhTU4Uqg3Cm5woVBuENzlRqDYIb3KiUG0Q3uREodogvMmJ QrVBeJMThWqD8CYnCtUG4U1OFKoNwpucKFQbhDc5Uag2CG9yolBtEN7kRKHaILzJiUK1QciRE4U+ ZUKOnCj0KRNy5DpJiccy9YznqRzXcUxM5qkc1+HNSyY6Dq6jnpjMUzmug6GYzOwAkXi5TpdiMrMD ROLlOqJ6yUTi5TrQisnMDhCJl+tULCYzO0AkXq6jtZjM7ACReLnO52IyswNE4uU65IvJzA4QiZdL KRCTmR0gEi+X3OAlE4mXS5wQk5kdIBIvl8IhJjM7QCReLplETGZ2gEi8XFqLmMzsAJF4uQQbMZnZ ASLxcqk+YjKzA0Ti5ZKOvGQi8XIJTWIys2hFSOVSq8RkZtGKkMpCl9UudO3sQtfOLnTt7ELXzi50 geyaaEA80YB4ogHxRAPiiQbEEw2IJxoQTzQgnmhAPNGAeKIB8UQD4okGxBMNiCcaEE80IJ5oQDzR qHeiUe9Eo96JRr0TjXonGvVONOqdaNQ70ah3olHvREPbiYa2Ew1tJxqkTjRInWiQOtEgdaJB6kSD 1IkGqRMNUicx7p8o1JVo/DrR+HWi8eskFvwThT5lYsE/UehTJhb8E4U+L2KmX+alf8u8p2+Z9/Qt 856+Zd7Tt8yr9a6ThZhMPLhPc4A3zQHeNAd40xzgTXOAN80B3jQHeNMc4E1zgDfNAd40B3jTHOBN c4A3zQHe/CcDvO9++e7lzz99+euJePny6S+//vjdl38Ifvn+x+9++NvPL7/+/OlPL3/88afv//oS Y7fX9hAlv//py+Mf/eHzX14+f/r7L58+//LzI+E/fgWPf/XzFf3zS5219P6bz71/oV8+Pb6xX356 eX1Gvucu2Sh2dhV/6GY/muPEaY4TpzlOnOY4cZrjxGmOE6c5TpzmOHGaE8BpTgCnOQGc5pxtmnO2 ac7Zpjlnm+acbZpztmnO2aY5Z5uis/xSLcRkZgeYQ7tpDu2maAa/hBIvmWgGv2QVMZlZtKJ/+9Jm tGTo5ueFbn5e6ObnhW5+Xujm54Vufl7o5ueFbn5e6ObnhW5+Xujm54Vufl7o5ueFbn5e6ObnhW5+ XugO54XucF7oDueF7nBe6A7nhe5wXug25oVuY17oNuaFbmNe6DbmhW5jXug25oVuY17oNuaFbmNe 6DbmhW5jXug25oVuY17oNuaFbpNZ6DaZhW6TWeg2mYVuk1noNpmFbpNZ6DaZhW6TWeg2mYVuk1no NpmFbpNZ6DaZhW6TWeg2mYVuk1noNpmFbpNZ6DaZhW6TWeg2mYVuk1noNpllXoy7zItxl3kx7jIv xl3mxbjLvBh3mRfjLvNi3GVejLvMi3GXeTHuMi/GXebFuMu8GHeZF+Mu82LcZd5lu8y7bJd5l+0y 77Jd5l22y7zLdpnXzy7z+tllXj+7zOtnl3n97DKvn13m9bPLvH52mdfPLvP62WVeP7vM62eXef3s Mq+fXeb1s8u8/miZ1x8t8/qjZV5/tMzrj5Z5/dEyrz9a5vVHy7z+aJnXHy3z+qNlXn+0zOuPlnn9 0TKvP1rm9UfLvP5omdcfLfP6o2Vef7TM64+Wef3RMq8/Wub1RwtdU7zQNcULXVO80DXFC11TvNA1 xQtdU7zQNcULXVO80DXFC11TvNA1xQtdU7zQNcULXVO80DXFC11TvNA1xQtdU7zQNcULXVO80DXF C11TvNA1xQtdU7zQNcULXVO80DXFC11TvNA1xQtdU7zQNcULXVO80DXFC11TvNA1xQtdU7zQNcUL XVO80DXFJwrVBoLgNoLgNoLgAkFwgSC4QBBcIAguEAQXCIILBMEFguACQXDnP0kUQucCoXOB0LlA 6FwgdC4QOhcF1QYC7gIBd8GAO3MZp3n97DKvn13m9bPLvH52mdfPLvP62WVeP7vM62eXef3sMq+f Xeb1s8u8fnaZ188u8/rZZV4/u8zrZ5d5/ewyr59d5vWzy7x+dpnXzy7z+tllXj+7zOtnl3n97DKv n13m9bPLvH52mdfPLvP62WVeP7vM62eXef3sMq+fXeb1s8u8fnaZ188u8/rZpV4/u03ydZvk6zbJ 122Sr2GSr2GSr2GSr2GSr2GSr2GSr2GSr2GSr2GSrw8JyUtmYrRhYrRhYrRhYrRhYrRhYrQPjUtM ZnaAyeSGyeQGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwG MqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwGMqwG MqwG4goDcYWBuMJA/F0g/i4QfxeIvwvE3wXi7wLxd4H4u0D8XSD+LhB/F4i/C8TfBeLvAvF3gfi7 QCRdIJIuEEkXpp8vTD9fmH6+MP18Yfr5wvTzhennC9PPF6afL0w/X5h+vjD9fGH6+cL084Xp5wvT zxemny9MP1+Yfr4w/Xxh+vnC9POF6ecL088Xpp8vTD9fmH6+MP18Yfr5wvTzhennC9PPF6afL0w/ X5h+vjD9fGHypGHypGHypGGykWGykWGykWGykWGykWGykWGykWGykWGykWGykWGykWGykWGykWGy kWGykWGykWHijGHijCHijPuVaEL7lWhCJwpoQvuVuCv3K3FX7lfirtyvxF25X4m7cr8Sx+OJQj8N 4ic8UeSnUYg/7UQBtXsX4v46UaTmC3F/nShS84W4v04U+skT99eJIjVfiPvrRKHaIPTKiUK1QeiV E4Vqg9ArJwrVBqFXThSqDUKvnChUG4ReOVHsb6X3+nH9uRaTqa8f3jvz9TdfTOa9M19vCGIy7535 ep8Qk5kfgAjzXy8lWrIiQtbXK4yXTKSPrxceMZn4W6OI9PH11iQmM0tDpI+vVy8xmXfSvl7UvGQi QXC91onJzA4QCYLr3VBMZnaASBBcL5hiMrMDRILgeksVk5kdQEjYE4XOIISEPVHoDEJI2BOFziCE hD1R6HxKSNgThc6nhIQ9Uag2CAl7olBtEBJ2F0LCnij0MyR06i6E/TxR6PsiPOaJQp8y4TFPFPqU yT7EXZD2XpD2XpCKXpCKXpCKXpCKXsiOwhOFPi+k2Beyo/BEoU+Z7Cg8Uag20EyhsJkC2VF4olBt kB2Fu5IdhSeK1EYlOwpPFKmNSnYUnihSG5XsKDxR7E3PPCmJnN31vismM09KImd3vTR7yUTO7nrF FpOZWoHI2V3v6WIyswNEzu562ReTmR0gcnbXiUFMZv7MRMzrOnaIycyiFWGq6+wiJjOLVlw0dx2A xGTmb1pzAFnMAWQxB5DFHEAWcZ3bdULzkpmj0SKuc7uOeWIy85ejOQEu5gS4qBNgcZ3bdeAUk4kd UMV1btepVUwmdkAV17ldR18xmdgBVVzndp2fvWRk9cuJQjIIWf1yopAMggZeFQ28Khp4VTTwqmjg VdHAq6KBV0UDr4oGXhUNvCoaeFU08Kpo4FXRwKuigVclV8rtSq6UO1GoNsiVcicK1QYa5FWy0uZE odpAQ8NKVtqcKFQbZKXNiUK1QVbanChUG2SlzYlCtYFGqBWNUCsaoVY0Qq3I9FTR4LWiwWtFpqeK xrUVjWsrGtdWNK6taFxb0bi2onFtRePaisa1FY1rKxrXVjSurWhcW9G4tqJxbUXj2obGtQ2Naxsa 1zY2rhVXrlzHMjGZec4XV65cZzsxmXnON0fB1RwFV3MUXM1RcDVHwdUcBVdzFFzNUXA1R8HVHAVX cxRczVFwNUfBVbzC7zpLi8nMDhCv8LsO5GIyswPENTXXqV5MZnaAuKbmkga8ZOKamktIEJOZHWDC EFVcU3OJFGIyswNMsqKaZEU1yYpqms6riWlUE9Oopum8msxHNZmPajIf1WQ+qsl8VJP5qCbzUU3m o5rMRzWZj2oyH9VkPqrJfFST+agm81FN5qOZzEczmY9mMh/NZD4asjs0ZHdoyO7QkN2hvRJttaGl XA0t5WpoKVdDS7kaWsrV0FKuhpZyNbSUq6H1Wg2t12povVZD67UaWq/V0HqthtZrNbReq6H1Wg2t 12povVZD67UaWq/V0HqtRi6HO1GoNsjlcCcK1Qa5HO5Eodogl8OdKFQbiPVriPVriPVriPVriPVr iPVriNpriNpriNpriJZqiJZqiJZqiJZqJhPcTCa4mUxwM5ngJl7xfL2SesnMJWvNXLLWzCVrzVyy 1swla81cstbMJWvN3IvWzL1ozdyL1sy9aM3ci9bMvWjN3IvWzL1ozdyL1sy9aM3ci9bMvWjN3IvW zL1oTbxZ7TqjiMnMDhBvVrsOOmIyswPEm9Wu05KXzCTzmknmNZPMayaZ10wyr5lkXjNhumbCdM2E 6ZoJ7DQT2GkmsNNMYKcjTrkjTrkjTrkjTrmjOUtHc5aO5iwdzVk6mrN0NGfpaM7S0cSko4lJRxOT jiYmHU1MOrrGpKM5S0dzlo7mLB3NWTqas3Q0Z+loztLRxKSjiUlHE5OOJiYdTUw6mph0NDHpaGLS 0cSko4lJRxOTjiYmHU1MOpqYdLRToaM5S0dzlo7mLB3NWTqas3Q0Z+lop0JH05mOpjMdTWc62qnQ 0U6FjnYqdLRToaOdCh3tVOhop0JHOxU62qnQ0U6FjnYqdLRToaMpYTe5tm5ybd3k2rrJtXVzbtnN uWU355bdnFt2c27ZzbllN+eW3Rw1dnPU2M1RYzdHjd0cNXbzPqduzi27Obfs5tyym3PLbs4tuzm3 7Obcspujxm6OGrs5auzmqLGbo8Zujhq7OWrs5qixm6PGbo4auzlq7OaosZujxm6OGru5UaSbc8tu zi27Obfs5tyym3PLbs4tu7lRpJtD0G4OQbs5BO3mRpFubhTp5kaRbm4U6eZGkW5uFOnmRpFubhTp 5kaRbm4U6eZGkW5uFOkmoDCQ+jaQ+jaQ+jaQ+jYQoz8Qoz8Qoz/QRtOBNpoOtNF0oI2mA200HWij 6UAbTQfaaDrQRtOBNpoOtNF0oI2mA200HWij6UAbTQfaaDrQRtOBNpoOtNF0oI2mA200HWij6UAb TQfaaDrQRtOBNpoOtJt0oN2kA+0mHWg36UC7SQfaTToR8zcR8zcR8zcR8zcRhzcRhzcRhzcRhzcR hzfRvoOJ6L2J6L2J6L2J6L2J6L2J6L2J6L2JOLyJOLyJOLyJOLxhnu2GebYb5tluuGc7Ud0YJnw+ TPh8mNsih7ktcpjbIoe5LXKY2yKHuS1ymNsih7ktcpjbIoe5LXKY2yKHuS1ymNsih7ktcpjbIoe5 LXKY2yKHuS1ymNsih7ktcpjbIoe5LXKY2yKHuS1ymNsih7ktcpgLHoe54HGYCx6HueBxmAseh7ng cZog7DRB2GmCsNMEYaeJm04TN50mbjpN3HSauOk01+RMk12dJrs6TXZ1muzqNNnVabKr02RXp4mb ThM3nSZuOk3cdCInzEROmImcMBM5YSaaxU80i59oFj/RLH6iWfxEs/iJ5uMTzccnmo9PNB+faD4+ 0Xx8ovn4RPPxiebjE83HJ5qPTzQfn2g+PtF8fKLp80TT54mmzxNNnyeaPk80fZ5o+jzR9Hmi+zQn mllPNLOeaGY90cx6opn1RDPrhWbWC82sF5pZLzSzXmhPzUJ7ahaajy80H19oPr7QfHyh+fhC8/GF 5uMLzccXmo8vNB9faD6+0Hx8ofn4QtttpkljT5PGniaNPU0ae5oT+2lO7Kc5sZ/mxH6aE/tpTuyn ORef5lx8mnPxac7FpzkXn+ZcfJpz8WnOxac5F5/mXHyac/H5T+bi3/3y3cuff/ry1xPx8uXTX379 8bsv/xD88v2P3/3wt59ffv35059e/vjjT9//9aWO2sdas5U/fP/Tl8e/+sPnv7x8/vT3Xz59/uXn R8Z//BIe/+znK/znlx0ten39zQffv9Qvnx7f2i8/vfRaXh+HuivB+z+xcrHo8GOO/qc5+p/mTHya M/FpzsSnOROf5kx8mjPxac7EpzkTn+YNitMcsE9zwD7NAfs0B+zTHLBPc8C+zAH7MgfsyxywL3PA vsxNU8vcNLXM0f8yR//LHP0vc/S/zNH/Mkf/yxz9L3P0v8zR/zJH/8sc/S9z9L/M0f8y11YttPVy oa2XC83fF5q/LzR/X2j+vtD8faH5+0Lz94Xm7wvN3xeavy/khV/IC7/QrH+hWf9Cs/6FZv0LzfoX mvUvNOtfaNa/0Kx/oVn/QrP+hWb9C836F5r1L+SFX8jVvhBXsBBXsBBXsBBXsBBXsBBXsBBXsBBX sBBXsBBXsBBXsBBXsBBXsBBXsBBXsBFXsBFXsBFXsBFXsBFXsBFXsBEhsBEhsBEhsBEhsBEhsBEh sBEhsBEhsBkhYO6CW+YuuGXO+Jc541/mjH+ZM/5lzviXOeNf5ox/mTP+Zc74lznjX6Yrf5mu/GXS B8ukD5ZJHyyTPlgmfbBM+mCZ9MEy6YNl0gfLpA+WSR8s05W/zNH8Mkfzy3TlL9NIv0xoYJnQwDKh gWVCA8uEBpYJDSwTGlgmNLBMaGCZ0MAyoYFlQgPLhAaWCQ0sExrYJjSwTWhgm9DANqGBbUID24QG tjnn3+acf5tz/m3O+bc559/mnH+bc/5tzvm3OeffaG6y0dxko7nJRjuEN5q2bDRt2WjastFUYqP5 wkbzhY3mCxvNFzaaFATS/ANp/oE0/0CafyDNP5DmH8hLGGhSEGhSEGhSEGhSEGhSEGhSEGhSEGhS EGhSEOg+6UD3SQe6TzrQfdLb1Eu2qZdsUy/Z5hbDbYov2xRftim+bFNI2ObZf5tn/22e/bd59t/m cT3ME3aYJ+wwT9hhnrDDPGGHecIOE8sP87ge5nE9zON6mMf1MI/rYR7Xwzyuh3lcD/O4HuYVm2Fe sRnmFZthXrEZCHkNhLwGQl4DIa+BpJtA0k0g6SaQdBNIugkk3QSSbgKBsoFA2UCgbCBQNpAkFQiU DSRkBRKyAglZgYSsQKBsMPmLgLLnlRjUxokCtXGiQG2cKFAbJwrUxokCtXGiQG2cKFAbJwrUxolC tUFEsxOFaoOIZicK1QYRzU4Uqg2ygOtEodogC7hOFKoNcq3ViUK1Qa61OlHoU67oU67oU67oU67o U67oU27oU27oU27oU27oN0BDtdFQbTRUGw3VRkO10dBbpYlmholmholmholmhjlqCHPUEOaoIcxR Q5ijhjBHDWGOGsLkPMPkPMPkPMPkPMMcz4TJeYY56wlz1hPmrCfMWU+YnGeogyOR87xO3GIyrwOu 87mYzOuA6zQvJvM64Dr7i8m8DriUAjGZ2QHiFOqSG8RkZgeIU6hLsxCTmR0gLoe6hA8xmdkB4nKo Sz0Rk5kdIF4ydUkwYjKzaKtZtNUs2moWbTWLtplF28yibWbRNvPXdjM7oJkd0MwOaGYHNLMDmtkB ZKPXiUJiI9nodaKQ2EjwhhOFxEYCKpwoJCkTUOFEoU+ZgAonCn3KBB44UWgEQOCB8x/oJ08wgPMf 6CdPMIDzH6i/CAZw/gN9yggDKAgDKAgDKAgDKAgDKAgDKAgDKAgDKAgDKAgDKAgDKAgDKAgDKAgD KAgDKAgDKGigX9BAv6CBfkED/YIG+gUN9Asa6JeKPmWEARSEARSEARSEARQ00C9oNF/QaL6g0Xxh Q3ZxHdL1wi4mMw9t4sz9eusXk5mHNnFMfh0dxGSm0iCOya/zh5jMLFpxGH0dYrxk4jD6OvKIyczS EOfH17lJTGb+PhPnx9fhS0wmFm0x58fFnB8Xc35czPlxMefHxZwfF3N+XMz5cTHnx8WcHxdzflzM +XEx58fFnB8Xc35czJFvMUe+xRz5FnPkW8yRbzFHvsUc+T4O6WIys2jN+XEx58fFnB8Xc+RbzClt Mae0xZzSFnOwWhDvXxDvXxDvXwjvH4Ws/zlRSHAi639OFBKcOhIIOxIIO6qNjmqjo9roqDYGqo2B aoNcrHeiUG0MVBsD1Qa5xO9Eodogl/idKFQb5BK/E4Vqg1zid6JQbZBL/E4Uqg1yid+JQrVBLvE7 Uag2yCV+JwrVBrnE70Sh2kDIT0HIT0HIT0HIT0HITyEbTaIgUKggUKggUKggUKggUKggUKiQjSYn CtUGgpIKgpIKgpIK2WhyolBtIJSpIJSpIJSpIJSpIJSpIJSpMJTJBFuLCbYWE2wtJthaxE1i15FP TGaKBuImsevcKCYzFYhudkA3O6CbHdDNDhhmBwyzA8QLGq9jsJjM7IBhdoB4deR1xBaTmR0gXh15 ndPFZGYHiFdHXod9MZnZAeLVkZdiICYzO0C8OvKSHbxk4tWRl0ghJjM7wGQli8lKFpOVLCYrWUxW spisZBH3E12ai5jM7AATvCwmeFlM8LKY4GUR9xNdopCYzOwAEwktJhJaxP1Elw4lJjM7wORLi8mX FpMvLSZfWky+tJh86UDz1YHmqwPNPAeaeQ408xxo5jnQzHOgmedAM8+BZp4DzTwHmnkONPMcaOY5 0MxzoJnnQDPPgWaeA808B5p5DjTzHGjmOdDMc6CZ50Azz4FmngPNIQeaQw40hxxoDjnQHHKgOeRA c8iBZoMDzQYHmvINNOUbaMo30JRvoCnfQFO+iRYWTLSwYKKFBROtHpho9cBEqwcmWj0w0eqBiVYP TLR6YKLVAxOtHpho9cBEqwcmuoFgmPOjYc6PhjmlGeaUZphTmmFOaYY5pRnmlGaYU5phTmmGOaUZ 5pRmmFOaYU5phjmlGeaUZphTmmFOaYY5pRnmlGaYU5phTmmGOaUZ5pRmmFOaYU5phjkLGeYsZJiz kGHOQoY5CxnmLGSYs5BhThyGOXEY5pBgmEOCYQ4JhjkkGOaQYJhDgmkuoZjmEoppLqGY5t6Iae6N mObeiGnujZjm3ohp7o2Y5t6Iae6NmObeiGnujZjm3ohp3jswkb91In/rRP7WifytE81fJ5q/TuRv ncjfOtGsd6JZ70Sz3olmvRPNeiea9U40651o1jvRrHeiWe9Es96JZr0TzXonmvVONOudaNY70ax3 olnvRLPeiWa9E816J5r1TjTrnWjWO5G/dSJ/60Rz5YnmyhPNlSeaK080V55orjzRXHkif+tE/taJ ZtgTzbAn8rdONPmeaPI90eR7osn3RJPviSbfC02+F5p8LzT5XmhV/0Lz8oXm5QvNyxealy80L19o Xr7QvHyxebnp5Zyml3OaXs5pejmnOYuf5ix+ml7OaXo5p0kJTJMSmCYlME1KYJqUwDQpgWlSAtOk BKZJCUyTEpgmJTBNSmCalMA0KYFpUgLTpASmSQlMkxKYJiUwTUpgmpTANCmBaVIC06QEpunlnKaX c5r8wjT5hWnyC9PkF6bJL0yTX5gmvzBNL+c0vZzTJCumSVZM08s5TUxjmpjGNDGNaWIa08Q0polp LBPTWCamsUxMY5l3hSyT+Vgm87FM5mOZzMcymY9lMh/LZD6WyXwstHd8ob3jC+0dX2jv+EJcxkJc xkJcxkJcxkJcxkJcxkKExUKExUKExUKExUKExUKExUKExUKExUKExUKExUKExUKExUKExUKExUKs xEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEKsxEL8 wkL8wkL8wkL8wkL8wkL8wkL8wkL8wkL8wkb8wkb8wkb8wkb8wkb8wkb8wmYkgrmxepkbq5e5sXqZ G6uXSTksk3JYJuWwTMphmZTDMimHZYIJywQTlgkmLBNMWCaYsEwwYZlgwjLBhGWCCcsEE5YJJiwT TFgmmLBMMGGZLMEyWYJlsgTLZAmWyRIskyVYJkuwTJZgmSzBMlmCZbIEy2QJlskSLJMlWCZLsEyW YJkswTJZgmWyBMuc2C9zYr/Mif0yJ/bLnNgvc2K/zIn9Mif2y5zYb3Niv82J/TYn9tuc2G9zYr/N if02h+wbXcC90QXcG13AvdEF3BsNwjcahG80CN9oEL7RIHyjQfhGg/CNBuEbDcI3GoRvtKBgo/H5 RuPzjcbnG43PNxqfbzQ+32h8vtH4fKPx+Ubj843G5xuNzzcan280Pt9oQcFGQ/eNhu4bDd03Grpv NHTfaOi+0dB9o6H7RkP3jYbuGw3dNxq6bzR032jovtHQfaOh+0ZD942G7hsN3TdaULDRgoKNBvwb Dfg3GvBvNODfaMC/0YB/owH/RgP+jQb8gQb8gQb8gQb8wQb85iXZ27wke5uXZG/zkuxtIgfbRA62 iRxsEznYJnKwTeRgm8jBNpGDbSIH20QOtrlYYZv8wjb5hW3yC9vkF7bJL2yTX9gmv7BNfmGb/MI2 +YVt8gvb5Be2yS9sk1/Y5mKFbcIQ24QhtglDbBOG2CYMsU0YYpswxDZhiG3CENuEIbYJQ2wThtgm DLFNGGKbMMQ2YYhtwhDbhCG2CUNsc7HCNhcrbBPT2CamsU1MY5uYxjYxjW1iGtvENLaJaWwT0wgT 0wgT0wgT0wgT0whkkAlkkAm04DOQrSbQgs9ACz4DLfgMtOAz0IWYgS7EDHQhZqALMaOg2iioNgqq jYJqo6LaqKg2KqqNimqjotqoqDYqqo2KaqOi2qioNhqqjYZqo6HaaKg2GqqNhmqjodpoqDYaqo2G agNxhYG4wkBcYSCuMBBXGIgrDMQVBuIKA3GFgbjCQFxhIK4wEFcYiCsMxBUG4goDcYWB2LEwUegw Uegwl5eFyVWHubwszOVlYS4vC3N5WZgX1oV5YV2YF9aFeWHd49whJjM7oJgdUMwOqGYHVLMDqtkB 1eyAanZANTugmh1QzQ6oZgdUswOa2QHN7IBmdkAzO6CZHdDMDmhmBzSzA5rZAc3sAJO7DJO7DJO7 DJO7DJO7DJO7DJO7DJO7DJO7DJO7DJO7DJO7DJO7DJO7DJO7DJO7jN/nLn/423f/+vL9j9/98Lef X757+fOXT5/+syhQXn74+fx3L7/+/Ok9x/c/fXn8Oy9X8Hefz3/x46fvvjwDExmrnrHpGbuecdzM yAQcr2aQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQ JzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCQJzCAJ7C/vgJP4CPqfm08ou7X xiPqfm08ou7XxiPqfm08ou7XxiPqfm08ou7XxiMK1QZgmh5RqDYA0/SIQrUBmKZHFKoNwDQ9olBt AKbpEYVqAzBNjyhUG4BpekSh2gBM0yMK1QZgmh5RqDYA0/SIQrUBmKZHFHrfMP1YYfqxwvRjhenH CtOPFaYfK0w/Vph+rDD9WGH6scL0Y4XpxwrTjxWmHytMP1aYfqww/Vhh+rHC9GOF6ccK048Vph8r TD9WmH6sMP1YYfqxwvRjhenHCtOPFaYfK0w/Vnh+rKe+ICbTOuCpRojJtA54ahdiMq0DnkqHmEzr gKcuIiYzO8BjRZ/iipjM7ACPFX0qNGIyswM8VvQp84jJzA7wWNGnViQmMzvAY0WfgpOYzOwAjxV9 qlZiMrMDPFb0KX15yTxW9CmUackKmskUpLsXpLsXpLsXpLsXpLsXpLsXpLsXpLsXpLsXpLsXpLsX pLsXpLsXpLsXpLsXpLsXpLsXpLsXoLs/olBtAC/xIwrVBvASP6JQbQAv8SMK1QbwEp8o4CV+RKHa AF7iRxSqDeAlfkSh2gBe4kcUqo2+vwFLnheBCBW/fLwNvP4/jF8+3zgQZfv4k3mXsmWvNt7blXmO LeY5tpjn2GKeY4t5ji3mObaY59hinmOLeY4t5jm2mOfYYp5ji3mOLeY5tpjn2GKeY4t5ji3qOdbz PD5fU8VkZgd4nsfnu66YzOwAz/P4fGH2knmex+frtZjM7ADP8/h8RxeTmR3geR6fL/pist/tgG++ JXf9WDDuHgu+ndH1yz0yun65R0bXL/fI6PrlHhnv+uW+nXHqGZeecesZ7/YMaGlw3eMjCkkw4LrH RxQSU8DFjY8oJKaA5VuPKCS0AZPm81P2/gp4F5E8a0JMZv5N9+4OeRaWmMz8m+6x6s/qpC8IS/9z vvQ/50v/c770P+dL/3O+9D/nS/9zvvQ/50v/c770V+Ct98zWe2brPbP1ntl6z2y9Z7beM1vvma33 zNZ7JvSeCb1nQu+Z0Hsm9J4JvWdC75nQeyb0ntEnsPX2BPbbGe2eqa92z9RXu2fqq90z9dXumfpq 90x9tXumvto9U1/1nil6z9wGDb6dUe+ZovdM0Xum6D1T9J4pes8UvWeK3jNV75mq90zVe6be7Zn7 wkxFTGpFTGpFTGpFTGpFnGg1kY1qIhvVRDaqiWzU3wcjvlngTW+Zpv+Zafqfmab/mWn6n5mm/5lp +p+Zpv+Z6fqfma7/mel6z3S9Z7reM13vma73TNcrXGcjqs5GVJ2NqDobUXU2oupsRNXZiKqzEVVn I6rORtTbbMQ3M069Z+T924+Mes/I+7cfGfWeub1/+9sZ9Z6Zes9MvWem3jP60L7qQ/uqD+2rPrSv +tC+6kP7qg/tqz60r/rQvupD+6oP7as+tK/60L7qQ/uqD+2rPrSv+tC+3h7a35d6Grju9BFFJMYG rjt9RBGJsQ0iMbZBiMuGuNqGuNqGuNo2ibW5IRq3IRq3Ia62Ia62Ia62gctPHlHoUwaXnzyi0KcM Lj95RKFPGVx+8ohCtQEuP3lEodoAl588olBtgMtPHlGoNsDlJ48oVBvgGpNHFPqUwTUmJwpcY/KI Qp8yuMbkEYU+ZXCNySMKfcrgGpNHFKoNcI3JI4rURkfXmHR0jUlHK7M6usako2tMOrrGpKNrTDq6 xqSja0w6usako2tMOrrGpKNrTDpap9bROrWO1qk179LG5/FFTCYyAY/DjphMZAIeRyMvmelRa6ZH rZketcexS0xmdoBpeGumR62ZHrXm3afyPACKycyi9e5TeZ4ixWRm0Xr3qTyPomIyswO8+1Se51kv mXefyvP0KyYzO8C7T+V5hBaTmR3gXYHyPIeLycyi9a5AeR7mxWRm0XpXoDwVATGZWbTeFShPWUFM ZnaAeQVKN69A6eYVKN28AqWbV6B08wqUbl6B0s0rULp5BUo3r0Dp5hUo3bwCpZtXoHTzCpRuro7t 5urY/vurY781BR+6cW3oxrWhG9eGblwbunFt6Ma1oRvXhm5cG7pxbejGtaEb18Zt49q3M+o9U/We qXrPVL1nqt4zVe8Z3RU2dFfY0F1hQ3eFDd0VNnRX2NBdYUN3hQ3dFTZ0V9jQXWFDd4UN3RU2dFfY 0F1ho+s9o/vMhu4zG7rPbOg+s6H7zIbuMxu6z2zoPrOh+8yG7jMbus9s6D6zofvMhu4zG7rPbOg+ s6H7zIbuMxu6z2zoPrOh+8yG7jMbus9s6D6zofvMhu4zG7rPbNz2md0XCgeiLyeiLyeiLyeiLyei LyeiLyeiLyeiLyeiLyeiLyeiLyeiLyeiLyeiLyeiLyeiLyeiLye6zHaiy2wnusx2ostsJ7rMdqLL bCe6zHaiy2wnusx2osVhEy0Om2hx2ESLwya6zHaiy2wnWlI20WW2E11mO9FlthNdZjvRZbYTXWY7 0WW2s0XivUd/s9fd8EN3ww/dDT90N/zQ3fBDd8MP3Q0/dDf80N3wQ3fDD32F/dBX2A99hf3QV9gP fYX90FfYD32F/dBX2A99hf3QV9iP2yvs2Yld44SmiSpOE1WcJqo4TVRxmqjiNFHFaaKK00QVp4kq ThNVnCaqOE1UcZqo4jRRxWmiitO85X6at9xP85b7ad5yP81b7qd5y/00b7mf5i3307zlfpq33E9z Zfo0V6ZPc2X6NFemT/OW+2necj/NW+6necv9NG+5n+Yt99O85X6at9xP85b7ad5yP3//lvvH//m3 7/7yw/cvn3/92x8/fXl5/fvrI9u/jy+vY14P/tunLz//8Pinvv1oIufK51zZnDufc2dzRj5nJHPO 13TOt0cTOUs+Z8nmrPmcNZuz5XO2bM6ez9mzOUc+58jmzPfRzPbRzPfRzPbRzPfRzPbRzPfRzPbR yvfRyvbRyvfRyvbRyvfRyvbRyvfRyvbRyvfRyvbRyvfRyvbRyvfRyvbRyvfRyvbRyvfRyvbRyvfR yvbRzvfRzvbRzvfRzvbRzvfRzvbRzvfRzvbRzvfRzvbRzvfRzvbRzvfRzvbRzvfRzvbRzvfRzvbR zvfRzvZR5Psosn0U+T6KbB9Fvo8i20eR76PI9lHk+yiyfRT5PopsH0W+jyLbR5Hvo8j2UeT7KLJ9 FPk+imQfldd0H70/msiZ7qP3RxM50330/mgiZ7qP3h9N5Ez30fujiZzpPnp/NJEz3UfvjyZypvvo /dFEznQfvT+ayJnuo/dHv52z5PuoZPuo5PuoZPuo5PuoZPuo5PuoZPuo5PuoZPuo5PuoZPuo5Puo ZPuo5PuoZPuo5PuoZPuo5PuIgMmldwCfnigAn54oAJ+eKACfnigAn54oAJ+eKACfnigAn54oAJ+e KFQbA9XGQLUxUG0MVBvkKpoThWqDXEVzolBtkEtlSieXypwo9CmTS2VOFPqUyaUyJwp9yhN9yuQq mhOFfgOQq2hKJ1fRnChUG+QqmhOFaoNcRXOiUG2Qq2hOFKoNchXNiUK1Qa6iOVGoNshVNCcK1Qa5 iuZEodrYqDbIBTYnCtUGuYrmRKFPmVxFc6LQp0yuojlR6FMmV9GcKPQpk6toThT5DTCIGfpEkdoY xAx9otjZwaOirqOSmMyjoq6DlZjMo6KuY5iYzKOirkObmMyjoq4jnpdsmB0wzA4YZgcMswPEi4Ou w6aYzOwA8eKg68TqJRPv+rnOt2Iys2jFu36uQ7KYzCzaaRateHHQdQAXk5kdIF4cdJ3ixWRmB4gX B11SgJjM7ADx4qBLTxCTmR0gXhx0iRJiMrMDxIuDLmVDTGZ2gHhx0CWPiMnMDhBvIbo0FjGZWbTi xUGXUCMmM4tWvDjoUnvEZGbRihcHXZKRlmyIbvxLYBKTiR0wRDd+mWi+NdF8a6L51kTzrYnmWxPN tyaab00035povjXRfGui+dZE862J5lsTzbcmmm9NNN+aaL410XxrovnWRPOtieZbE823JppvTTTf mmi+NTeqDTQVm2gqNtFUbKKp2ERTsYmmYhNNxSaaik00FZtoKrbQVGyhqdhCU7GFpmKLrAg+UaQ2 FlkRfKJIbSyyIvhEodogK4JPFKoNsiL4RKHaICuCTxSqDbIi+ESh2iArgk8Uqg2yIvhEodogK4JP FKoNsiL4RKHaICuCTxQ7p4gKxDRHJ9McnUxzdDLN0ck0RyfTHJ1Mc3QyzdHJNEcn0xydTHN0Ms3R yTRHJ9McnUxzdDLN0ck0RyfTHJ1Mc3QyzdHJNEcn0xydTHN0Ms3RyeP47iUz5zDTnMNMcw4zzTnM NOcw05zDTHMOM805zDTnMNOcwyxzDrPMOcwy5zDLnMMscSvyJZeIycQOWOJW5EtzEZOZHSBuRb6E GzGZ2QHiVuRL/RGTmR0gbkW+JCQxmdkB4lbkS4cSk5kdIG5FvsQsMZnZAeJW5EsRE5OZHUCu2DpR SFslV2ydKKStkiu2ThTSVskVWycKaavkiq0ThXR3csXWiUK1gTZgLLQBY6ENGAttwFhoA8ZCGzAW 2oCx0AaMhTZgLLQBY6ENGAttwFhoA8ZCGzAW2oCx0AaMhTZgLLQBYw1UG2hvxkJ7Mxbam7HQ3oyF 9mYsxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUu xBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUuxBUu8Vaa61jmJRNvpbkOcWIyU4EQb6W5ToJiMlOB EG+luY6TYjKzA37/Vhp2JhWTmR1gbiBZ5gaSZW4gWeYGkmVuIFnmBpJlbiBZ5gaSZW4gWeYGkmVu IFnmBpJlbiBZ5gaSZW4gWeYGkodiICYzO8BcZ7LMdSbLXGeyzHUmy2Ryl8nkLpPJXSaTu0wmd5lM 7jKZ3GUyuctkcpfJ5C6TyV0mk7tMJneZTO4ymdxlMrnLZHKXyeQuk8ldJpO7TCZ3mUzuMpncZTK5 y2Ryl8nkLpPJXSaTu5GvaSNf00a+po18TRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtx GRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRtxGRsRFhsRFhsRFhsR FhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsR FhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFhsRFtuk57dJz2+Tnt8mPb9NemOb9MY26Y1t0hvb pDe2SW9sk97YJr2xTXpjm/TGNumNbdIb26Q3tklvbJPe2Ca9sU16Y5v0xjbpjW3SG9ukN7ZJb2yT 3tgmvbFNemOb9MY2gYttAhfbBC62CVxsE7jYJnCxTeBim8DFNoGLbQIX2wQutglcbBO42CZwsU3g YpvAxTaBi20CF9sELrYJXGwTuNgmcLFN4GKbwMU2gYttAhfbBC62CVxsE7jYJnCxTeBim8DFNoGL QEOlQEOlQGbfQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOo QKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQKOoQGbfQGbf QGbfQGbfQJeIBLpEJNAlIoEuEQl0iUigS0QCXSIS5BKR+kouETlRoDZOFKiNEwVq40SB2jhRoDZO FKiNEwVq40SB2jhRqDbIJSInCtUGuUTkRKHaIJeInCh2ThFP02GOAcI0cYY5UwhzphDmTCHMmUKY M4UwZwphzhTCnCmEOVMIc6YQ5kwhzJlCmDOFMGcKYc4UwpwphDlTCHOmEOZMIcyZQpgzhTBnCmHO FMKcKYQ5UwhzphDmTCHMmUKYM4UwZwphzhTCnCmEOlMwTZxhmjjDNHGGaeIM82KVMC9WCfNilTAv VgnzYpUwL1YJ82KVEC9WufQcMZnXAZf6IybzOuDSisRkXgdcypKYzOuAS4cSk5kdIF6scolZYjKz A8SLVS5FTExmdgC5hPdEIW2VXMJ7opC2Si7hPVFIWyWX8J4opK2SZRUnCunuZFnFiUK1QZZVnChU G2RZxYlCtUGWVZwoVBtkWcWJQrVBllWcKFQbZFnFiUK1QZZVnChUG2RZxYlCtUGWVZwoVBtkWcWJ QrVBllWcKFQbZFnFiUK1QbjCE4Vqg3CFJwrVBuEKTxSqDcIVnihUG4QrPFGoNghXeKJQbRCu8ESh 2iBc4YlCtUG4whOFaoNwhScK1QbhCk8Uqg3CFZ4oVBuEKzxRqDYIV3iiGANiKhDixZbXaU1MZioQ 4sWW15FPTGYqEOLFlte5UUxmKhDiao7r8CkmMztAXM1xnWDFZGYHiKs5rmOwmMzsAHE1x3WWFpOZ HSCu5rgO5F4ycTXHdXwXk5kdIK7muDQAMZnZAeJqjktIEJOZHSCu5rjUCDGZ2QEik3tJGmIyswNE JvfSRcRkZgeITO4lrnjJRCb3kmLEZGYHiEzupeeIycwOEJncSxQSk5kdIDK5l7IkJvv9Dvjul+9e /vzTl7+eiJcvn/7y64/fffmH4Jfvf/zuh7/9/PLrz5/+9PLHH3/6/q8vpZQx9yh7/OH7n748/tUf Pv/l5fOnv//y6fMvPz8y/uOX8PhnP1/hP7+U33zk/Yv88unxTf3y08vrM+g9bTqKyWviD9xsbBE1 vjQ6MZnZ2CJqfAl9YjKxsQuyaxVk1yrIrlWIXetEERm3INykINykINykINykINykINykIHCkIHCk IHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIHCkIASkIASkIASkIJijIJij IJijIJijIJijIJijIJijICyjICyjICyjICyjICyjICyjICyjICyjICyjICyjICyjICyjICyjICyj ICyjICyjICyjICyjICyjICyjICyjICyjICyjmMh9MZH7YiL3xUTui4l8FBP5KCbyUUzko5jIRzGR j2IiH8WkNIpJaRST0igmpVFMSqOYlEYxKY1iUhrFpDSKSWkUk9IoJqVRTEqjmJRGMSmNYlIaxQQr iglWFBOsKCYLUUwWopgsRDFZiGKyEMVkIYrJQhQTXygmvlBMfKGY+EIx8YVi4gvFxBeKiS8UE18o Jr5QTHyhmPhCMfGFYuILxcQXiokvFBNfKCa+UMSVYpdeIyYzO8Cc8xdzzt/QStiGVsI2tBK2oZWw Da2EbWglbEMrYRuiBRqiBRqiBRqiBRqiBRqiBRqiBRqiBRqiBRqiBRqiBRpaTtEQY9AQY9AQY9AQ Y9AQY9AQY9AQY9AQY9AQY9AQY9AQY9AQY9AQY9AQY9AQY9AQY9DQcoqGyISGyISGyISGllM0xDM0 xDM0xDM0xDM0xDM0xDM0xDM0tJyiIQqiIQqiIQqiIQqiIQqiIQqiIQqiIQqiIQqiIQqiIQqiIQqi IQqiIQqiIQqimQsTm7kwsZkLE5u5MLGZCxObuTCxmQsTmwlcNBO4aCZw0UzgopnARTOBi2YCF80E LpoJXDQTuGgmcNHMHRvNpDeaSW80k95oJr3RTHqjmfRGM+mNZtIbzaQ3mklvNJPeaCa90Ux6o5n0 RjPpjWbSG83csdFMFKSZKEgzUZBm7thoJlfSTK6kmVxJM7mSZnIlzeRKmsmVNHPHRjMhlWZCKs2E VJoJqTQTUmkmpNJMSKWZkEozIZVmQirNhFSaCak0E1JpJqTSTEilk/t/TxSR1zq5//dEEel1oPt/ B7r/d6D7fwe6/3cg2GMg2GMg2GMg2GMg2GMg2GMg2GOg+38HQkQGQkQGQkQGQkQGQkQGQkQGQkQG QkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQG QkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQGQkQG QkQGQkQGQkS6eBfodSwTk4naSDfvAh3mXaDDvAt0mHeBDvMu0GGiLcNEW4aJtgwTbRkm2jJMtGWY aMsw7wIdJiczTE5mmJzMMDmZYXIyw+RkhsnJDJOTGSYnM0xOZpiczDA5mWFyMsPkZIbJyQyTkxkm JzNMTmaYnMwwOZlhcjLD5GSGyckMk5MZJiczTE5mmJzMMDmZYXIyw+RkhsnJDJOTGSYnM0xOZpic zDA5mWFyMsPkZIbJyQyTkxkmJzNMTmaYnMwwOZlhcjLD5GSGyckMk5MZgfTOQHpnIL0zkN6JuIyB uIyBuIyBuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJ uIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJ uIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJuIyJ uIzJuIwwz/lhnvPDPOeHec43mY9hMh/DZD6GyXxMk/mYJvMxTeZjmszHNJmPaTIf02Q+psl8TJP5 mCbzMU3mY5rMxzSZj2kyH9NkPqbJfEyT+Zgm8zFN5mOazMc0mY9pMh/TZD6myXxMk/mYJvMxTeZj mszHNJmPaTIf02Q+psl8TJP5mCbzMU3mY5rMxzSZj2kyH9NkPqbJfEyT+Zgm8zFN5mOazMc0mY9p Mh/TZD6myXxMk/mYJvMxTeZjmszHNJmPaTIf02Q+psl8TORrmsjXNJGvaSJf00SrbydafTvR6tuJ Vt9OtPp2otW3E62+nWj17UQXAE90AfBEFwBPdAHwRBcAT3QB8EQXAE90AfBcqDYWqo2FamOh2tio NjaqjY1qY6Pa2Kg2NqqNjWpjo9rYqDY2qo1AtRGoNhBXOBFXOBFXOBFXOBFXOBFXOBFXOBFXuBBX uBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBBXuBhX aDL302Tup8ncT5O5n+Zuymnuppzmbspp7qac5m7Kae6mnOZuymnuppzmBarTvEB1mheoTvMC1Wle oDrNC1SneYHqNC9QfZylxWRmByyzA5bZAdvsgG12wDY7YJsdsM0O2GYHbLMDttkB2+yAbXZAmB0Q ZgeYTO40mdxpMrnTZHKnyeROk8mdJpM7TSZ3mUzuMpncZTK5y2Ryl8nkLpPJXSaTu0wmd5lM7jKZ 3GUyuctkcpfJ5C6TyV0mk7tMJneZTO4ymdxlMrnLZHIX8jUt5GtayNe0kK9pIS5jIS5jIS5jIS5j IS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5j IS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5jIS5j IS5jIS5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jIy5jMy7DZO6X ydwvk7lfJnO/TOZjmczHMpmPZTIfy2Q+lsl8LJP5WCbzsUzmY5nMxzKZj2UyH8tkPpbJfCyT+Vgm 87FM5mOZzMcymY9lMh/LZD6WyXwsk/lYJvOxTOZjmczHMpmPZTIfy2Q+lsl8LJP5WCbzsUzmY5nM xzKZj2UyH8tkPpbJfCyT+Vgm87FM5mOZzMcymY9lMh/bZD62yXxsk/nYJvOxTeZjm8zHNpmPbTIf 22Q+tsl8bJP52CbzsU3mY5vMxzaZj20yHxv5mjbyNW3ka9rI17TRvvSN9qVvtC99o33pG+1L32hf +kb70jfal77RvvSN9qVvtC99o33pG+1L32hf+kb70jfal77RvvSN9qVvtC99o33pG+1L32hf+kb7 0jfal77RvvSN9qVvtC99o33pG+1L32hf+kb70jfal74RV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gR V7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gRV7gR V7hN5n6bzP02mfttMvfb3IO9zT3Y29yDvc092Nvcg73NPdjb3IO9zT3Y29yDvc092Nvcg73NPdjb 3IO9zT3Y29yDvc092Nvcg73NPdjb3IO9zT3Y29yDvc092Nvcg73NPdjb3IO9zT3Y29yDvc092Nvc g73NPdjb3IO9zT3Y22Ryt8nkbpPJ3SaTu00md5tM7jaZ3G0yudtkcrfJ5G6Tyd0mk7tNJnebTO42 mdxtMrnbZHK3yeRuk8ndJpO7TSZ3m0zuNpncbTK522Ryt8nkbpPJ3SaTG8jXFMjXFMjXFMjXFIjL CMRlBOIyAnEZgbiMQFxGIC4jEJcRiMsIxGUE4jICcRmBuIxAXEYgLiMQlxGIywjEZQTiMgJxGYG4 jEBcRiAuIxCXEYjLCMRlBOIyAnEZgbiMQFxGIC4jEJcRiMsIxGUE4jICcRmBuIxAXEYgLiMQlxGI ywjEZQTiMgJxGYG4jEBcRiAuIxCXEYjLCMRlBOIyAnEZgbiMQFxGIC4jEJcRiMsIxGUE4jICcRlh MvdhMvdhMvdhMvdhMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9h Mh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9h Mh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9hMh9h Mh9hMh9hMh9hMh9hMh9hMh9hMh+BfE2BfE2BfE2BfE2B9qUH2pceaF96oH3pgfalB9qXHmhfeqB9 6YH2pQfalx5oX3qgfemB9qUH2pceaF96oH3pgfalB9qXHmhfepB96e2V7Es/UaA2ThSojRMFauNE gdo4UaA2ThSojRMFauNEgdo4Uag2yL70E4Vqg3CFJwrVBuEKTxSqDcIVnihUG4QrPFGoNghXeKJQ bRCu8ESh2iBc4YlCtUG4whOFaoNwhScK1QbhCk8Uqg3CFZ4oVBuEKzxRqDYIV3iiUG0QrvBEMQbE VCBM5j5M5j5U5t7cgx3mHuww92CHuQc7zD3YYe7BDnMPdph7sMPcgx3mHuww92CHuQc7zD3YYe7B DnMPdph7sMPcgx3mHuww92CHuAf7OqeLybwOuE71YjKvAy4NQEzmdcClGIjJvA649AUxmdkB4h7s S6QQk5kdIDK5l9IhJjM7QGRyL7lETGZ2gMjkXpqLmMzsAJHJvYQbMZnZASKTe6k/YjKzA0Qm95KQ vGQik3sJTmIyswNEJvdSrcRkZgeITO4lfYnJzA4Qmdz2Sny5Jwppq8SXe6KQtkp8uScKaavEl3ui kLZKfLknCunuxJd7olBtEF/uiUK1QXy5JwrVBvHlnihUG8SXe6JQbRBf7olCtUF8uScK1Qbx5Z4o VBvEl3uiUG0QX+6JQrVBfLknCtUG8eWeKFQbxJd7olBtEK7wRKHaIFzhiUK1QbjCE4Vqg3CFJwrV BuEKTxSqDcIVnihUG4QrPFGoNghXeKJQbRCu8ESh2iBc4YlCtUG4whOFaoNwhSeK1EZBXGFBXGFB XGFhXKHoibyOZWIyU4EQPZHX2U5MZioQoifyOiCKyUwFQvREXqdMMZnZAaIn8jqqisnMDhA9kdd5 V0xmdoDoibwOzV4y0RN5HbHFZGYHiJ7I65wuJjM7QPREXod9MZnZAaIn8lIMxGRmB4ieyEt2EJOZ HSB6Ii/tQkxmdoDI5F4CiJdMZHIvuURMZnaAyORemouYzOwAkcm9hBsxmdkBIpN7qT9iMrMDRCb3 kpDEZGYHiEzupUOJycwOEJncS8zSkhWTyS0mk1tMJreYTG5Bc62C5loFzbUKmmsVNNcqaK5V0Fyr oLlWQXOtguZaBc21CpprFTTXKmiuVdBcq6C5VkFzrYLmWgXNtQqaaxU01yporlXQXKuguVZBc62C 5loFzbUKmmsVNNcqaK5V0FyroLlWRXOtiuZaFc21KpprVbQvo6J9GRXty6hoX0ZF+zIq2pdR0b6M ivZlVLQvo6J9GRXty6hoX0ZF+zIq2pdR0b6MivZlVLQvo6J9GRXty6hoX0ZF+zIq2pdR0b6MivZl VLQvo6J9GRXty6hoX0YxZwrFnCkUc6ZQzJlCMWcKxZwpFHOmUMyZQjFnCsWcKRRzplDMmUIxZwrF nCkUc6ZQzJlCMWcKxZwpFHOmUMyZQjFnCsWcKRRzplDMmUIxZwrFnCkUc6ZQzJlCMWcKxZwpFHOm UMyZQjVnCtWcKVRzplDNmUI193xUc89HNfd8VHPPRzX3fFRzz0c193xUc89HNfd8VHPPRzX3fFRz z0c193xUc89HNfd8VHPPRzX3fFRzz0c193xUc89HNfd8VHPPRzX3fFRzz0c193xUc89HNfd8VHPP R0O6YEO6YEO6YEO6YEN7dBvao9vQHt2G9ug2tEe3oT26De3RbWSP7vkRotpAe0Aa2gPS0B6QhvaA NLQHpKE9IA3tAWloD0hDe0Aa2gPS0B6QhvaANLQHpKE9IA3tAWloD0hDe0Aa2gPS0B6QhvaANLQH pKE9IA3tAWloD0hDe0Aa2gPS0B6QhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJ hnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJhnjJZp5Zm3lmbeaZtalnVnM3ZTN3UzZz N2Uzd1M2czdlM3dTNnM3ZTN3UzZzN0ozd6M0czdKM3ejNHM3SjN3ozRzN0ozd6M0czdKM3ejNHM3 SjN3ozRzN0ozd6M0czdKM3ejNHM3SjN3ozRzN0ozd6M0czdKM3ejNHM3SjN3ozRzN0ozd6M0czdK M3ejNJNjbibH3EyOuZkcczM55mZyzM3kmJvJMTeTY24mx9xMjrmZHHMzOeZmcszN5JibyTE3k2Nu JsfcTI65mRxzMznmZnLMzeSYm8kxN+Q3bshv3JDfuCG/cUN+44b8xg35jRvyG3fkN+7Ib9yR37gj v3FHfuOO/MYd+Y078ht35DfuyG/ckd+4I79xR37jjvzGHfmNO/Ibd+Q37shv3JHfuCO/cUd+4478 xh35jTvyG3fkN+7Ib9yR37gjv3FHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFH XGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFHXGFnXKHpI22mj7SZPtJm +kib6SNtpo+0mT7SZvpIu+kj7aaPtJs+0m76SLvpI+2mj7SbPtJu+ki76SPtpo+0mz7SbvpIu+kj 7aaPtJs+0m76SLvpI+2mj7SbPtJu+ki76SPtpo+0mz7SbvpIu+kj7aaPtJs+0m76SLvJ5HaTye0m k9tNJrebTG43mdxuMrndZHK7yeR2k8ntJpPbTSa3m0xuN5ncbjK53WRyu8nkdpPJ7SaT200mt5tM bjeZ3G4yud1kcrvJ5HaTye0mk9tNJrcjX25HvtyOfLkd+XI78uV25MvtyJfbkS+3I19uR77cjny5 HflyO/LlduTL7ciX25EvtyNfbke+3I58uR35cjvy5Xbky+3Il9uRL7cjX25HvtyOfLkd+XI78uV2 5MvtyJfbkS+3I19uR77cjny5HflyO+IKO+IKO+IKO+IKO+IKO+IKO+IKO+IKB+IKB+IKB+IKB+IK B+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+IKB+MKTU9kNz2R3fRE dtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lN T2Q3PZHd9ER20xPZTU9kNz2R3fREdtMT2U1PZDc9kd30RHbTE9lNT2Q3PZHd9ER20xPZTSa3m0xu N5ncbjK53WRyu8nkdpPJ7SaTO0wmd5hM7jCZ3GEyucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrnD ZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5A/lyB/LlDuTLHciXO5AvdyBf7kC+3IF8uQP5cgfy5Q7k yx3IlzuQL3cgX+5AvtyBfLkD+XIH8uUO5MsdyJc7kC93IF/uQL7cgXy5A/lyB/LlDuTLHciXO5Av dyBf7kC+3IF8uQP5cgfy5Q7kyx3IlzsQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQ VzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzgQVzhMT+QwPZHD 9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMT+QwPZHD9EQO0xM5TE/kMD2Rw/REDtMT OUxP5DA9kcP0RA7TEzlMT+QwPZHD9EQO0xM5TE/kMD2Rw/REDtMTOUxP5DA9kcP0RA7TEzlMJneY TO4wmdxhMrnDZHKHyeQOk8kdJpM7TCZ3mEzuMJncYTK5w2Ryh8nkDpPJHSaTO0wmd5hM7jCZ3GEy ucNkcofJ5A6TyR0mkztMJneYTO4wmdxhMrkT+Zom8jVN5GuayNc0EZcxEZcxEZcxEZcxEZcxEZcx EZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcx EZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcx EZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxEZcxTeZ+msz9NJn7 aTL302Q+psl8TJP5mCbzMU3mY5rMxzSZj2kyH9NkPqbJfEyT+Zgm8zFN5mOazMc0mY9pMh/TZD6m yXxMk/mYJvMxTeZjmszHNJmPaTIf02Q+psl8TJP5mCbzMU3mY5rMxzSZj2kyH9NkPqbJfEyT+Zgm 8zFN5mOazMc0mY9pMh/TZD6myXxMk/mYJvMxTeZjmszHNJmPaTIf02Q+psl8TJP5mCbzMU3mY5rM xzSZj2kyH9NkPqbJfEyT+Zgm8zGRr2kiX9NEvqaJfE0T7UufaF/6RPvSJ9qXPtG+9Ik2n0+0+Xyi zecTbT6faPP5RJvPJ9p8PtHm84k2n0+0+XyhzecLbT5faPP5QpvPF9p8vtDm84U2ny+0+XyhzecL bT5faPP5QpvPF9p8vtDm84U2ny+0+XwhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAh QnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAhQnAxQtCk56dJz0+T np8qPW9utJ7mRutpbrSe5kbraW60nuYS6mkuoZ7mEuppLqGe5hLqaS6hnuYS6mkuoZ7mEuppLqFe 5hLqZS6hXuYS6mUuoV7mEuplLqFe5hLqZS6hXuYS6mUuoV7mEuplLqFe5hLqZS6hXuYS6mUuoV4m ELtMIHaZQOwygdhlArHLBGKXCcQuE4hdJhC7TCB2mUDsMoHYZQKxywRilwnELhOIXSYQu0wgdplA 7DKB2GUCscsEYpcJxC4TiF0mELtMIHaZQOwygdhAJrBAJrBAJrBAJrBAJrBAJrBAJrBAJrBAJrBA JrBAJrBAJrBAEEsgiCUQxBIIYgkEsQSCWAJBLIEglkAQS2xUGwh9CYS+BEJfAqEvgdCXQOhLIPQl EPoSCH0Jgr70V4K+nChQGycK1MaJArVxokBtnChQGycK1MaJArVxokBtnChUGwR9OVGoNgj6cqJQ bRD05USh2iDoy4lCtUHQlxOFaoOgLycK1QZBX04Uqg2CvpwoVBsEfTlRqDYI+nKiUG0Q9OVEofcN 01gRprEiTGNFmMaKMI0VYRorwjRWhGmsCNNYEaaxIkxjRZjGijBxoDBxoDBxoDBxoDBxoDBxoDBx oDBxoDBxoDAvuA+TLQqTLQqTLQqTLQqTLQqTLQqTLQqTLQqTLQqRLbr0BTGZ1wGXGiEm8zrg0i7E ZF4HXEqHmMzrgEsXEZOZHSCyRZe4IiYzO0Bkiy6FRkxmdoDIFl0yj5jM7ACRLbq0IjGZ2QEiW3QJ TmIyswNEtuhSrcRkZgeIbNElfXnJRLboEsrEZEhbJdaxE4W0VWIdO1FIWyXWsROFtFViHeuvxDp2 opDuTqxjJwrVBlkuf6JQbZDl8icK1QZZLn+iUG2Q5fInCtUGWS5/olBtkOXyJwrVxph/ePxCff6X f/7py9++++X8f/7zQyvzEPoMyWL2E4V+rmQx+4lCP1eymP1EoZ4jTN6JQp8XYfJOFPqUCV13otCn TOi6E4U+ZULXnSj0KRO6rr8Suu5Eod+shK47Uag2CF13olBtELruRKHaIHTdiUK1Qei6E4Vqg9B1 JwrVBqHrThR7WzfP4aLD4TqziMnMc7jocLgOPmIy8xwuOhyu05OYzDyHiw6H6wgmJjM7QFz5fZ3j xGRmB4grv6/DoJdMXPl9HR3FZGYHiCu/r/OnmMzsgN9f+f2fn3v5H9f/+unvv3z6/MvLz7989+WX Hz7/5eWPP/70/V9fPv/6tz9++vJS5li7jhGjlvJ/vvz05z8/voTyOHisvncbo50/h9//9OXxxTyi Pz/T/fw4A//2OfpP3/3y3eN//etvnI/nH55f+b9892+fXr7/8dN3Xz796bezfPM0/u1E//7E/sv/ /a+fXl7/8xM7kWXnzv3fThTf+nLm67eznGe+laUksqA3UXE9+SVfiMnMbhXXk18aiJjM/HslUrSX kOIl+32K9vr18hH1/EX2t+/+8sP3L//95fXvY/feau+P/nz+b6/Xb6nf/XfK9Yvt13/95ePxE/lP nv5vzy/qf/36+a/PiD98/unlf76cX4ePb+8//Ev/LurxzDcf+tcvP/3xx09/e/nfP/zyL//uie9/ +vz8bfsPv3JWos2JDfQSqsTP0mxzERW+1C4xmdnmIip8SWZiMrPNRVT40t3EZGYHiKjwJd6JycwO EFHhSwEUk5kdIKLCl4woJjM7QESFLy1STGZ2gIgK90Lucj5R5G90QSPDgkaGBY0MCxoZFjQyLGhk WNDIsKDhX0FvYgWNDAsaGRY0/Cto+FfQ8K+g4V9Bw7+Chn8FDf8KGv4VNPwraPhX0PCvoOFfQcO/ goZ/BQ3/Chr+FTT8K2j4V9Dwr6DhXyHrLk4U+rzQuouK1l1UtO6ionUXFa27qGjdRUXrLipad1HR 4oqKFldUtLiiosUVFS2uqGhxRUWLKypaXFHR4oqKFldUtLiiosUVFS2uqGgFRUUrKIp4J+l1pBCT iSfBYor+xRT9iyn6F1P0L6boX0zRv4jbLq4TkpjMLNrfl7C/PY74Y/tzdhxRVr8xjng8fX8c8Yj6 5jji8dDdccQj5lvjiIKo1GLq9MXU6Yup0xdTpy+mTl9Mnb6YOn0xdfpi6vTF1OmLqdMXU6cvpk5f TJ2+mDp9MXX6Yur0xdTpi6nTl9/X6f85v1JifPsvyXnmW1m+TRoVst/zEjzEn5JZ8+YSj2ou8ajm Eo9qLvGo5hKPai7xqOYSj/r7Szz+eR/V12+DdhVtNa3m9o5qbu+o5vaOam7vqOb2jmpu76jm9o5q bu+o5vaOam7vqOb2jmpu76i/v73jnx95e/RPu/x5Jo+8td4h8B5P3z/yPqK+eeR9PHT3yPuI+eav RrT8tporSqq5oqQhJbWhn0JD+mtD+mtDK4AbWgHc0ArgVhP+84Z2PrTeMqkz/z7CAZq5K6iZu4Ka 2YjNbUTx7237/V1B//m5pKXk4bqL1uvc/zVLyeMr++eWkscT3/otzPtU/BH/7ovDD3/77l/P1/3d D3/7+eV8k18+ffrPofvlh+vPz68/f3rP8fbTe7mCv/v8p+c3/gxMZAw7Y3vVMxY9Y9UzNj1j1zMO PePUMy49o94zTe+ZfrdnUn//v/nL8Dzz7S/tbquwtw76G7HrXdL1Lul3uyT1CvbtT3clvjS9Obre HEP/gzL0PyhD/4My9D8oQ2+VobfK0P+gDP0PytB7Zug9M/WemXrPTL1npt4zU++ZqffM1Htm6j0z 9Z6Zes8svWeW3jNL75ml98zSe2bd7ZmUPPXNF6jzzLe/NL1Vlt4qS2+VrbfK1ltl662y77bKowyf E5E3Pez17+NxFvoPaXt5bjn5t09ffv7hcVB6f/T1dx/9p6X9/tB/+od/K9vK/8Mrm3Pnc+5szsjn jGTO+prO+fZoImfJ5yzZnDWfsyaK4+2hxD/c8v9wy+bs+Zw9m3Pkc45sznxH1myz1Xyz1Wyz1Xyz 1Wyz1Xyz1WyztXyztWyztXyzvT36zxsDbcLvaBN+R5vwO9qE39Em/I424Xe0Cb+jTfgdbcLvaCra 0Sb8jjbhd7QJv6NN+L3/5i+v/qfv//SPTfRQE//Tf3HenX9++f/8f69/7/rn/vjrLy+//MunL58e 70mff3r8b3/69G8/fP/pD3/+4cdP//h1Xf/tP/wz5BtBhYfW7He0Zr+jNfsdrdnvaM1+R2v2O1qz 3wf6pTRQbQxUG2h9f0d7Pzra+9HR3o+O9n50tPejo70fHe396GjvR0d7Pzq6KqCjbSEdbQvpaFtI R9tCOrJydbRjpCOoqKMdIx3tGOnrN9+Jf/PU/y4hfPn0yPvvI27oAf8xyX+MyWkF35LB7ugJxre0 kt/SbzHqD53i299PXsswvp/9X/p+vr2W9o6OYnw/8V/6fr69HfeOhiN8P/85yb3vp357T+8d/cj4 fsp/6fv5NjVyR7syvp/6X/wVV2viW8qrYsa31P5LH1FLfD95Rc74fvp/6fv5tl38jhpofD/jv/T9 fJtCvaNEGt9P9i3ht7+fxCvCDRXU+H7+S68INfGKcEOBNb6f/9IrQk28ItxQf43v55+/Ivz8w//v 08tPf375+afv//rpl3+Iffk//q/zPf6/6n7Qzn/8v3/59PP/O/EN5qVo4Rv8z0nufWAt8c5wQwY3 vp//0jtDS7wzZCX4byeiMr3G73fzTqhu3gnVzTuhunknVDfvhOrmnVDdvBOqm3dCdfNOqG7eCdXN O6G6eSdU//07oW4MOv7Jb9T//Oj/QyOQb/5AfvPreDx5/XHdZcxxei7itb6OEY9d8d/8zYonL+Kn Zza2edVVN6+66uZVV9286qqbV11186qr/vtXXbFBkpjM7IBhdoC5SbKbmyS7uUmym5sku7lJspub JLu5SbKbmyS7uUmym9dHdXMtZTfXUnZzLWU3b1bq5s1K3dzY2M2Njd3c2NjNjY399zc2fvMIPV8T VxROtLN6ol0VM7OrYraReSiTqffMQ5lMI/M1vX5be3s88y2yfL7ahP4sNqE/y11CP1WI3/zxnWe+ /aXZHpZZbA/LLLbvaxbb9zWLbWaZxTazzKK3StVbpdpmllltM8uses9UvWfq3Z5hf9a0P92Tr3aZ +mqXqa92mfpql6mvdpn6apepr3aZt1e7pF6hvvmn9Dzz7S9N31XxeHH79pf27V0VU1/kMvVFLvP2 IpdvZ9Q75PZGl29nJMbIb77If7NozjPf/tL01y5/m8tMbHOZiW0uU9/mMvVtLlPf5jL1bS5T3+Yy 9W0u8/Y2l9SR95tlOBJ/Q/QlLlNf4jL1JS5TX+Iy9SUuU1/iMvUlLlNf4jL1JS5TX+Iy9SUuU1/i MvUlLlNf4jL1JS7z9hKX++fGje6l3Oheyo3updzoXsqN7qXc6F7Kje6l3OjCgo1us9zoNsuNbrPc 6DbLjSYDG91mudFtlhvdZrnRbZYb3Wa50W2WG91mudEO9o12sG+0g32jHewb7WDfaLfzRnOtXVFt VFQbFdVGQ58y4ms3WoOx0RqMjdZgbLQGY6M1GButwdhoDcZGazA2WoOx0RqMjdZgbLQGY6M1GLuj 2kC85EabKjbaVLHRpoqNNlVstKlio00VG22q2GhTxUabKjbaVLHRpoqNNlVstKlio00VG22q2GhT xTbvqtv/f+r+r0mOJcnuBJ9ZT/sRcjkiI6TIdm/Yf7OR5cNSZr7AyDzOSyKRqAbrXqAEF7dZwk+/ ZuYeAVSGeqTbwW9kd4vkdA/Kj2aEm6qFqeo5auRddZW8q66Sd9VV8q66St5VV4/vqtNSPdAYyPiq 5JV1lbyyrpJX1lXyyrpKXllXySvrKnllXSWvrKvklXWVvLKuklfWVfISqUpeIlXJS6QqeYlUJS+R qseXSGn5OWiMjABPRoB/yPr9gXpzz+IoTJ+4XrGGy8L1iuPp9esVB+rd6xXHQ6vXK9YTiunxjJJ0 k9EdyOgmJcuVlCxXUrJcSclyJSXLlZQsV1KyXEnJciUly5WULFdSslxJyXIlJcv1WLKsGCMjgNT2 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 HXuRBzRGRgA2pmOvFIHGyAjAxnTs5SbQGBkB2JiOvWYFGiMjACOb74Uv0BgZARjZfK+eccYwsvle awONSeXZdVXrREnl2XVV60RJ5dl1VetESeXZdVVrR+V1VetEKeXZvK5qnSjFN/K6qnWiFN/I61rY iVJ8I68PIp0oyTfWFbQTJfnGuoJ2oiTfWFfQTpTkG+sK2omSfGNddztRkm+s624nSvKNdbXuREm+ sa7xnSjJN9Y1vhMl+YZEF8zrGt+BkkiGWSIZZolkmCWSYZZIhlkiGWaJZJglkmGWSIZZIhlmiWSY JZJhlkiGWSIZ5vUbgidK8g2JmpglamKWqIlZoiZmiZqYJWpilqiJWaImZomamDVqIib23dMy0BhZ gcDEvntuBxojKxCY2HdPEDFjGRP77ukkaAyMgIyJffecFDQGRkDGlMN7YgsaAyMgYzLkPTsGjZER gMmQ9xQbNEZGACZD3vN00BgZAZimeU/2OWOYpnkvDYDGyAjwZARgauu97AAaIyMAU1vvtQvQGBkB JEc4kxzhTHKEM8kRziRHOJMc4UxyhDPJEc4kRziTHOFMcoQzyRHOJEc4kxzhUSsCjZERQBKOM0k4 ziThOJOE40wSjjNJOM4k4TiThONMEo4zSTjOkrQ3S9LeLEl7syTtzZK0N0vS3ixJe7Mk7c2StDdL 0t4sSXuzJO3NkrQ3S9LeLEl7syTtzZK0N0vS3ixJe7Mk7c2StDdL0t4sSXuzJO3NkrQ3S9LeLEl7 syTtzZK0N0vS3ixJe7Mk7c2StDdL0t4sSXuzJO3NEkMwSwzBLDEEs8QQzBJDMEsMwSwxBIvE2isS a69IrL0isfaKxNorEmuvSKy9IrH2isTaKxJrr0isvSKx9orE2isS/65I/Lui8e+wy7r3RAQ0Rubc pAowkyrATKoAM6kCzKQKMJMqwEyqADOpAsykCjCTKsBMqgAzqQLMpAowkyrATKoAM6kCzKQKMJMq wEyqADOpAsykCjCTKsBMqgAzqQLMpAowkyrATKoAM6kCzKQKMJMqwEyqADOpAsykCjCTxNFMEkcz SRzNJHE0k8TRTBJHM0kcLSQ9s5D0zELSMwtJzywkPbOQ9MxC0jMLSc8sJD2zkPTMQtIzC0nPLCQ9 s5CMykIyKgvDqHQhZO/KYmP1ilort11RayWwK2qtPHpFrRXOrqi1wtkVtVY4u6LWyqM7arHZeUVJ 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 ARhPZi9ScMYwnsxe0gCNkRGA8WT2ughojIwAjCezF1dAY2QEYDyZvUIDGiMjAOPJ7GUe0BgZARhP Zq8VgcbICMB4MnvBCTOWMZ7MXp4CjYERkDGezF7jAo2BEZAxnsxeKAONKbXVvK7XGqh1vdZESbXV db3WREm11XW91kRJtVUn1VadUlvNTvINJ/mGl3zDS77hJd/wkm94yTe85Bte8g0v+YaXfMNLvhEk 31ifRzNRkm8EyTeC5BtB8o0g+UaQfCNIvhEk34iSb0TJN6LkG1HyDYlXmCVeYZZ4hVniFWaJV5gl XmGWeIVZ4hVmiVeYJV5hlniFWeIVZolXmCVeYZZ4hVniFWaJV5glXmGWeIVZ4hVmiVeYJV5hlniF WeIVZolXmCVeYZZ4hVniFWZMp7CnZZwxTKewJ3GgMbICgekU9kwQNEZWIBxZgXBkBcKREeDICPBk BHgyAjwZAZ6MAE9GgCcjwJMR4MkI8GQEeDICAhkBgYyAQEZAICMgkBEQyAgIZAQEMgICGQGBjIBI RkAkIyCSERDJCCA5uZnk5GaSk5tJTm4mObmZ5ORmkpObSU5uJjm5meTkZpKTm0lObiY5uZnk5GaS k5tJTm4mObmZ5ORmkpObSU5uJjm5meTkZpKTm0lObiY5uZnk5GaSk5tJTm6WdLlZ0uVmSZebJV1u lnS5WdLlZkmXmyVdbpZ0uVnS5WZJl5slXW6WFLZZUthmSWGbJYVtlhS2WVLYZklhmyWFbZYUtllS 2GZJYZslhW2WFLZZUthmSWFbJIVtkRS2RVLYFklhWySFbZEUtkVS2BZJYVskhmCRGIJFYggWiSFY JIZgkRiCRWIIFokhWCSGYJEYgkViCBaJIVgkhmCRGIJFYggWiSFYJIZgkRiCRWIIFokhWCSGYJEY gkViCBaJIVgkhmCRGIJFYggWjSFIqhszqW7MpLoxk+rGTKobM6luzKS6MZPqxkyqGzOpbsykujGT 6sZMChIzKUjMpCAxk4LETAoSMylIzKQgMZOCxPxAkPj8/Xlc3/u3jnj69vrXP397/nYHfnr57fnz 7388/fnH68enD799ffnbkwvRu5ZGXvry9dv4q5+//PXpy+s/vr9++f7HsHj/Ecaf/TLhfzw585Hr h/z2Or7U969P2624N7OnUVoNAHzhZGCTOstM6iwzqbPMpM6ykDrLQuosC6mzLKTOspA6y0LqLAup syykzrKQPN9C8nwLyfMtJM+3kDzfQvJ8C8nzLSTPt5A830LyfAvJ8y0kz7eQPN9C8nwLyfMtJM+3 kDzfQvJ8C8nzLSTPt5A830LyfAvJ8y0kz7eQPN9C8nwLyfMtIM+3SjOHqzRzuEozh6s0c7hKM4er NHO4SjOHqzRzuEozh6s0c7hKM4erNHO4SjOHqzRzuEozh6s0c7hKM1OqNDOlSjNTqjQzpUozU6o0 M6VKM1OqNDOlSjNTqjQzpUozU6o0M6VKM1OqNDOlSjNTqjQzpUozU6o0M6VKM1OqNDOlSjNTqjQz pUozU6o0M6VKM1OqNDOlSjNTqjQzpUozU6o0M6VKM1OqNDOlSjNTqjQzpUozU6o0M6VKM1OqNDOl SjNTqjQzpUozU6o0M6VKM1OqNDOlSjNTqjQzpUozU6o0M6WSM0IrOSO0kjNCKzkjtJIzQis5I7SS M0IrOSO0kjNCKzkjtJIzQis5I7SSM0IrOSO0kjNCKzkjtJIzaio5o6aSM2oqOaOmkjNqKjmjppIz aio5o6aSM2oqOaOmkjNqKjmjppIzaio5o6aSM2oqOaOmkjNqKjmjppIzaio5o6aSM2oqOaOmkjNq KjmjppIzaio5o6aSM2oqOaOmkjNqKjmjppIzaio5o6aSM2oqOaOmkjNqKjmjppIzaio5o6aSM2oq OaOmkjNqKjmjppIzaio5o6aSM2oqOaOmkjNqKjmjpkozh6s0c7hKM4erNHO4SjOHqzRzuEozh6s0 c7hKM4erNHO4SjOHqzRzuEozh6s0c7hKM4erNHO4SjNTqjQzpUozU6o0M6VKM1OqNDOlSjNTqjQz pUozU6o0M6VKM1OqNDOloyTfUCatVGnSSpUmrVRp0kqVJq1UaWZKlaafVGn6SZWmn1Rp+kmVpp9U afpJlaafVGn6SZWmn1Rp+kmVpp9UafpJlaafVGn6SZWmn1Rp+kmVpp9UafpJlaafVGn6SZWmn1Rp +kmVpp9UafpJlaafVGn6SZWmn1Rybmcl53ZWcm5nJed2VnJuZyXndlZybmcl53ZWcm5nJed2VnJu ZyXndlZybmcl53ZWcm5nJed2VnLaTCWnzVRy2kwlp81UctpMJafNVHLaTCWnzVRy2kwlp81UctpM JafNzLwcNEZGADi6ppKjayo5uqaSo2sqOW2mPhoQI9UTQGOkn5FsVHKSSiUnqVRykkolJ6lUcpJK JSepVHKSSiUnqVRykkolJ6lUcpJKJSepVHKSSiUnqVRykkolJ6lUcpJKJSepVHKSSiUnqVRykkol J6lUcJJKvCjKsoFar2AO1HoFc6DWK5gDtV6LHKj1WuRArdciB2q9FjlQ67XIjhI0YgMlrbKgERso aZUFjdhASb4hcFwGSvINgeMyUJJvCByXgZJWWWCrDJS0ygJbZaCk9RJ4JwMlrZfAOxkoKZYF3slA Sass8E4GSlplgXcyUJJvCLyTgZJ8Q+CdDJTkGwLvZKAk3xB4JwMl+YbAOxkoyTcE3slASb4h3PAz UJJvCPOsBkryDYHjMlCSbwgcl4GSfEPguAyU4hsKx2WgFN9QOC4DpWUBWH6/JT2gMSy/31Ik0BiW km8JFWgMS8m39As0RqbknDRiy+FAY6TTctKILREEjZERwNGAtmwSNEZGAEcD2lJS0BjptBxzZ8tr QWOk03Jkmy05Bo2RfsaRbbYMGzRGOi1HttnSdNAY6bQc2WbL9UFjZARwZJutYAAaIyOAI9tsVQfQ GBkBHNlmK12AxsgI4Mg2W/2DM8bdE7VVS0BjZARwNKCt5AIaIyOAowFtdRvQGBkBHA1oK/6AxsAI AGlAWwUJNKYUHRXx1EApRUdFPDVQStFREU91lCCeGiip6CiIpwZKKToq4qmBknxDEE8NlOQbgnhq oCTfEAalD5TkG8Kg9IGSfEMYlD5Qkm8Ig9IHSvINYVD6QEm+IQxKHyjJN4RB6QMl+YYwKH2gJN8Q BqUPlOQbwqD0gZJ8Q6KzFYnOViQ6W5HobEUYlD5Qkm9IJLgikeCKRIIrEgmuSCS4IpHgikSCKxIJ rkgkuCKR4IpEgisSCa5IJLgikeCKRIIrwqCngZJ8Q6LOFYk6VyTqXBEGPQ2UlqeAFQhQhrFla6Ax sAIByjC2lI8zxskwtgQRNEZWIDgZxpZlgsbICOBkGFuqChojI4CUYYAX2m5pMGiMjABuKPiWS4PG yAjghoJvCTlojIwAbij4ltWDxsgI4IaCb6UB0BgZAdxQ8K2+ABojI4AbCr4VKThjJFm1kGTVQpJV C0lWLdxQ8K1cAhojI4BkvhaS+VpI5mshma+FZL4WkvlaSOZrIZmvhWS+FpL5WkjmayGZr4VkvhaS +Vq4AXhb1Qo0RkYASaMtJI22cAPwtkIZaEyqrUqC1SIJVoskWC2SYLVIgtUiCVaLJFgtkmC1SILV IglWiyRYLZJgtUiC1SIJVoskWC2SYLVIgtUiCVaLJFgtkmC1SILVIglWiyRYLZJgtUiC1SIJVosk WC2SYLVIgtUiCVaLJFitkmC1SoLVKglWqyRYrRKvsEq8wirxCqvEK6wSr7BKvMIq8QqrxCusEq+w SrzCKvEKq8QrrBKvsEq8wirxCqvEK6wSr7BKvMIq8QqrxCusEq+wSrzCKvEKq8QrrBKvsEq8wirx CqvGKyQ1kYXURBZSE1lITWQhNZGF1EQWUhNZSE1kITWRhdREFlITWUhNZCE1kYXURBZSE1lITWQh NZGF1EQWUhNZSE1kITWRhdREFlITWUhNZCE1kYXURBZSE1lITWQhNZGF1EQWUhNZSE1kJTWRldRE VlITWUlNZCU5uZXk5FaSk1tJTm4lObmV5ORWkpNbSU5uJTm5leTkVpKTW0lObiU5uZXk5FaSk1tJ Tm4lObmV5ORWkpNbSU5uJTm5leTkVpKTW0lObiU5uZXk5FaSk1tJTm6VdLlV0uVWSZdbJV1ulXS5 VdLlVkmXWyVdbpV0uVXS5VZJl1slXW6VdLlV0uVWSZdbJV1ulXS5VdLlVkmXWyVdbpV0uVXS5VZJ l1slXW6VdLlV0uVWSZdbJV1ulXS5VdLlVkmXWyVdbpV0uVXS5VZJl1slXW6VeIVV4hVWiVdYJV5h lXiFVeIVVolXWCVeYZV4hVXiFVaJV1glXmGVeIVV4hVWiVdYJV5hlXiFVeIVVolXWCVeYZV4hVXi FVaJV1glXmGVeIVV4hVWiVdYJV5hJTWRldREVlITWUlNZCU1kZXURFZSE1lJTWQlNZGV1ERWUhNZ SU1kJTWRldREVlITWUlNZCU1kZXURFZSE1lJTWQlNZGV1ERWUhNZSU1kJTWRldREVlITWUlNZCU1 kZXURFZSE1lJTWQlNZGV1ERWUhNZSU1kJTm5leTkVpKTW0lObiU5uZXk5FaSk1tJTm4lObmV5ORW kpNbSU5uJTm5leTkVpKTW0lObiU5uZXk5FaSk1tJTm4lObmV5ORWkpNbSU5uJTm5leTkVpKTW0lO bpV0uVXS5VZJl1slXW6TdLlN0uU2SZfbJF1uk3S5TdLlNkmX2yRdbpN0uU3S5TZJl9skXW6TdLlN 0uU2SZfbJF1uk3S5TdLlNkmX2yRdbpN0uU3S5TZJl9skXW6TdLlN0uU2SZfbJF1uk3S5TdLlNkmX 2yRdbpN4hU3iFTaJV9gkXmGTeIVN4hU2iVfYJF5hk3iFTeIVNolX2CReYZN4hU3iFTaJV9gkXmGT eIVN4hU2iVfYJF5hk3iFTeIVNolX2CReYZN4hU3iFTaJV9g0XiGpiaykJrKSmshKaiIbqYlspCay kZrIRmoiG6mJbKQmspGayEZqIhupiWykJrKRmshGaiIbqYlspCaykZrIRmoiG6mJbKQmspGayEZq IhupiWykJrKRmshGaiIbqYlspCaykZrIRmoiG6mJbKQmspGayEZqIhvJyW0kJ7eRnNxGcnIbyclt JCe3kZzcRnJyG8nJbSQnt5Gc3EZychvJyW0kJ7eRnNxGcnIbycltJCe3kZzcRnJyG8nJbSQnt5Gc 3EZychvJyW0kJ7eRnNxGcnKbpMttki63SbrcJulym6TLbZIut0m63Cbpcpuky22SLrdJutwm6XKb pMttki63SbrcJulym6TLbZIut0m63Cbpcpuky22SLrdJutwm6XKbpMttki63SbrcJulym6TLbZIu t0m63Cbpcpuky22SLrdJutwm6XKbxCtsEq+wSbzCpvAK3UXhFXaU4BsdJfhGRwm+0VGCb3SU4Bsd JfhGRwm+0VGCb3SU5BsKr7CjJN9QeIUdJfmGwivsKMk3FF5hR0m+ofAKO0ryDYVX2FGSbyi8wo7S 8hSyAkFqIhupiWykJrKRmshGaiIbqYlspCaykZrIRmoiG6mJbKQmspGayEZqIhupiWykJrKRmshG aiIbqYlspCaykZrIRmoiG6mJbKQmspGayEZqIhupiWykJrKRmshGaiIbqYlspCaykZrIRmoiG6mJ bKQmspGc3EZychvJyW0gJ3fWRUBjXATMKgpojIuAWXMBjXERMCs0oDEuAmY9BzRGRgDIyZ1FIdAY GQEgJ3dWlkBjZASAnNxZngKNkREAcnJnjQs0RkYAyMmdhTLQmFRbVXS5HSXVVhVdbkdJtVVFl+su ii63o6TaqqLL7Sip7q7ocjtK8g1Fl9tRkm8outyOknxD0eV2lOQbii63oyTfUHS5HSX5hqLL7SjJ NxRdbkdJvqHocjtK8g1Fl9tRkm8outyOknxD0eV2lOQbii63oyTfUHiFHSX5hsIr7CjJNxReYUdJ vqHwCjtK8g2FV9hRkm8ovMKOknxD4RV2lOQbCq+woyTfUHiFHSX5hsIr7CjJNxReYUdJvqHwCjtK 8g2FV9hRkm8ovMKO0vIUsgIBaiJntgYaIysQoCZypnycMVATORNE0BhZgQA1kTPLBI2REQBqImeq ChojIwDURM58FzRGRgCoiZxJM2iMjABQEzkzb9AYGQGgJnKm75wxUBM5k33QGBkBoCZyVgxAY2QE gJrIWXYAjZERAGoiZ+0CNEZGAMjJnQUQ0BgZASAnd1ZRQGNkBICc3FmK4YyBnNxZuAGNkREAcnJn 9Qc0RkYAyMmdJSTQGBkBICd31qFAY2QEgJzcWcwCjZERAHJyZ0UMNEZGgKLL7SiptqrocjtKqq0q utyOkmqrii63o6TaqqLL7SiptqrocjtK8Q0n6XKdpMt1ki7XSbpcJ+lynaTLdZIu10m6XCfpcp2k y3WSLtdJulwn6XKdpMt1ki7XSbpcJ+lynaTLdZIu10m6XCfpcp2ky3WSLtcputyOknxD4hU6iVfo JF6hk3iFTuIVOolX6CReoZN4hU7iFTqJV+gkXqGTeIVO4hU6iVfoJF6hk3iFTuIVOolX6CReoZN4 hU7iFTqJV+gkXqGTeIVO4hU6iVfoNF4hqImcaRlnDNREziQONEZWIEBN5MwEQWNkBQLURM50EjRG RgCpiXSkJtKRmkhHaiIdqYl0pCbSkZpIR2oiHamJdKQm0pGaSEdqIh2piXSkJtKRmkhHaiIdqYl0 pCbSkZpIR2oiHamJdKQm0pGaSEdqIh2piXQkJ9eRnFxHcnIdycl1JCfXkZxcR3JyHcnJdSQn15Gc XEdych3JyXUkJ9eRnFxHcnIdycl1JCfXkZxcR3JyHcnJdSQn15GcXEdych3JyXUkJ9eRnFxHcnId ycl1ki7XSbpcJ+lynaTLdZIu10m6XCfpcp2ky3WSLtdJulwn6XKdpMt1ki7XSbpcJ+lynaTLdZIu 10m6XCfpcp2ky3WSLtdJulwn6XKdpMt1ki7XSbpcJ+lynaTLdZIu10m6XCfpcp2ky3WSLtdJulwn 6XKdpMt1Eq/QSbxCJ/EKncQrdBKv0Em8QifxCp3EK3QSr9BJvEIn8QqdxCv0Eq/QS7xCL/EKvcQr 9BKv0Eu8Qi/xCr3EK/QSr9BLvEIv8Qq9xCv0Eq/QS7xCL/EKvcYrJDWRjtREOlIT6UhNpCM1kY7U RDpSE+lITaQjNZGO1EQ6UhPpSE2kIzWRjtREOlIT6UhNpCM1kY7URDpSE+lITaQjNZGO1EQ6UhPp SE2kIzWRjtREOlIT6UhNpCM1kY7URDpSE+lITaQjNZGO1EQ6UhPpSE2kIzm5juTkOpKT60hOriM5 uY7k5DqSk+tITq4jObmO5OQ6kpPrSE6uJzm5nuTkepKT60lOric5uZ7k5HqSk+tJTq4nObme5OR6 kpPrSU6uJzm5nuTkepKT60lOrpd0uV7S5XpJl+slXa6XdLle0uV6SZfrJV2ul3S5XtLlekmX6yVd rpd0uV7S5XpJl+slXa6XdLle0uV6SZfrJV2ul3S5XtLlekmX6yVdrpd0uV7S5XpJl+slXa6XdLle 0uV6SZfrJV2ul3S5XtLlekmX6yVdrpd4hV7iFXqJV+glXqGXeIVe4hV6iVfoJV6hl3iFXuIVeolX 6CVeoZd4hV7iFXqJV+glXqGXeIVe4hV6iVfoJV6hl3iFXuIVeolX6CVeoZd4hV7iFXqJV+glXqEn NZGe1ER6UhPpSU2kJzWRntREelIT6UlNpCc1kZ7URHpSE+lJTaQnNZGe1ER6UhPpSU2kJzWRntRE elIT6UlNpCc1kZ7URHpSE+lJTaQnNZGe1ER6UhPpSU2kJzWRntREelIT6UlNpCc1kZ7URHpSE+lJ TaQnObme5OR6kpPrSU6uJzm5nuTkepKT60lOric5uZ7k5HqSk+tJTq4nObme5OR6kpPrSU6uJzm5 nuTkepKT60lOric5uZ7k5HqSk+tJTq4nObme5OR6kpPrSU6ul3S5XtLlekmX6yVdrpd0uV7S5XpJ l+slXa6XdLle0uV6SZfrJV2ul3S5XtLlekmX6yVdrpd0uV7S5XpJl+slXW6QdLlB0uUGSZcbJF1u kHS5QdLlBkmXGyRdbpB0uUHS5QZJlxskXW6QdLlB0uUGSZcbJF1ukHiFQeIVBolXGCReYZB4hUHi FQaJVxgkXmGQeIVB4hUGiVcYJF5hkHiFQeIVBolXGCReYZB4hUHiFQaJVxgkXmGQeIVB4hUGiVcY JF5hkHiFQeIVBolXGDReIamJ9KQm0pOaSE9qIj2pifSkJtKTmkhPaiI9qYn0pCbSk5pIT2oiPamJ 9KQm0pOaSE9qIj2pifSkJtKTmkhPaiIDqYkMpCYykJrIQGoiA6mJDKQmMpCayEBqIgOpiQykJjKQ mshAaiIDqYkMpCYykJrIQGoiA8nJDSQnN5Cc3EBycgPJyQ0kJzeQnNxAcnIDyckNJCc3kJzcQHJy A8nJDSQnN5Cc3EBycgPJyQ0kJzeQnNxAcnIDyckNJCc3kJzcQHJyA8nJDSQnN5Cc3EBycoOkyw2S LjdIutwg6XKDpMsNki43SLrcIOlyg6TLDZIuN0i63CDpcoOkyw2SLjdIutwg6XKDpMsNki43SLrc IOlyg6TLDZIuN0i63CDpcoOkyw2SLjdIutwg6XKDpMsNki43SLrcIOlyg6TLDZIuN0i63CDpcoPE KwwSrzBIvMIg8QqDxCsMEq8wSLzCIPEKg8QrDBKvMEi8wiDxCoPEKwwSrzBIvMIg8QqDxCsMEq8w SLzCIPEKo8QrjBKvMEq8wijxCqPEK4wSrzBKvMKo8QpJTWQgNZGB1EQGUhMZSE1kIDWRgdREBlIT GUhNZCA1kYHURAZSExlITWQgNZGB1EQGUhMZSE1kIDWRgdREBlITGUhNZCA1kYHURAZSExlITWQg NZGB1EQGUhMZSE1kIDWRgdREBlITGUhNZCA1kYHURAZSExlITm4gObmB5OQGkpMbSE5uIDm5geTk BpKTG0hObiA5uYHk5AaSkxtITm4gObmB5OQGkpMbSE5uIDm5geTkBpKTG0lObiQ5uZHk5EaSkxtJ Tm4kObmR5ORGkpMbJV1ulHS5UdLlRkmXGyVdbpR0uVHS5UZJlxslXW6UdLlR0uVGSZcbJV1ulHS5 UdLlRkmXGyVdbpR0uVHS5UZJlxslXW6UdLlR0uVGSZcbJV1ulHS5UdLlRkmXGyVdbpR0uVHS5UZJ lxslXW6UdLlR0uVGSZcbJV5hlHiFUeIVRolXGCVeYZR4hVHiFUaJVxglXmGUeIVR4hVGiVcYJV5h lHiFUeIVRolXGCVeYZR4hVHiFUaJVxglXmGUeIVR4hVGiVcYJV5hlHiFUeIVRolXGElNZCQ1kZHU REZSExlJTWQkNZGR1ERGUhMZSU1kJDWRkdRERlITGUlNZCQ1kZHUREZSExlJTWQkNZGR1ERGUhMZ SU1kJDWRkdRERlITGUlNZCQ1kZHUREZSExlJTWQkNZGR1ERGUhMZSU1kJDWRkdRERlITGUlObiQ5 uZHk5EaSkxtJTm4kObmR5ORGkpMbSU5uJDm5keTkRpKTG0lObiQ5uZHk5EaSkxtJTm4kObmR5ORG kpMbSU5uJDm5keTkRpKTG0lObiQ5uZHk5EaSkxslXW6UdLlR0uVGSZcbJV1ulHS5UdLlRkmXGyVd bpR0uVHS5UZJlxslXW6UdLlR0uVGSZcbJV1ulHS5UdLlRkmXGyVdbpR0uVHS5UZJlxslXW6UdLlR 0uVGSZebJF1uknS5SdLlJkmXmyRdbpJ0uUnS5SZJl5skXmGSeIVJ4hUmiVeYJF5hkniFSeIVJolX mCReYZJ4hUniFSaJV5gkXmGSeIVJ4hUmiVeYJF5hkniFSeIVJolXmCReYZJ4hUniFSaJV5gkXmGS eIVJ4hUmjVdIaiIjqYmMpCYykprISGoiI6mJjKQmMpKayEhqIiOpiYykJjKSmshIaiIjqYmMpCYy kprISGoiI6mJjKQmMpKayEhqIiOpiYykJjKSmshIaiIjqYmMpCYykprIRGoiE6mJTKQmMpGayERq IhOpiUykJjKRmshEcnITyclNJCc3kZzcRHJyE8nJTSQnN5Gc3ERychPJyU0kJzeRnNxEcnITyclN JCc3kZzcRHJyE8nJTSQnN5Gc3ERychPJyU0kJzeRnNxEcnITyclNJCc3kZzcJOlyk6TLTZIuN0m6 3CTpcpOky02SLjdJutwk6XKTpMtNki43SbrcJOlyk6TLTZIuN0m63CTpcpOky02SLjdJutwk6XKT pMtNki43SbrcJOlyk6TLTZIuN0m63CTpcpOky02SLjdJutwk6XKTpMtNki43SbrcJPEKk8QrTBKv MEm8wiTxCpPEK0wSrzBJvMIk8QqTxCtMEq8wSbzCJPEKk8QrTBKvMEm8wiTxCpPEK0wSrzBJvMIk 8QqTxCtMEq8wSbzCJPEKk8QrTBKvMGm8QlITmUhNZCI1kYnURCZSE5lITWQiNZGJ1EQmUhOZSE1k IjWRidREJlITmUhNZCI1kYnURCZSE5lITWQiNZGJ1EQmUhOZSE1kIjWRidREJlITmUhNZCI1kYnU RCZSE5lITWQiNZGJ1EQmUhOZSE1kIjWRidREJpKTm0hObiI5uYnk5CaSk5tITm4iObmJ5OQmkpOb SE5uIjm5ieTkJpKTm0hObiI5uYnk5CaSk5tITm4iObmJ5OQmkpObSE5uIjm5ieTkJpKTm0hObiI5 uYnk5GZJl5slXW6WdLlZ0uVmSZebJV1ulnS5WdLlZkmXmyVdbpZ0uVnS5WZJl5slXW6WdLlZ0uVm SZebJV1ulnS5WdLlZkmXmyVdbpZ0uVnS5WZJl5slXW6WdLlZ0uVmSWGbJYVtlhS2WVLYZkkrmyWt bJa4flni+mWJ65clrl+WuH5Z4vplieuXJa5flrh+WeL6ZYnrlyWuX5a4flni+mWJ65clrl+WuH5Z 4vplieuXJa5flrh+WeL6ZYnrlyWuX5ZYe1li7WWJtZdJxWEmFYeZVBxmUnGYScVhJhWHmVQcZlJx mEnFYSYVh5lUHGZScZhJxWEmFYeZVBxmUnGYScVhJhWHmVQcZlJxmEnFYSYVh5lUHGZScZhJxWEm FYeZVBxmUnGYSZFgJkWCmRQJZlIkmEldXyZ1fZnklWaSV5pJXmkmeaWZ5JVmkleaSV5pJnmlmeSV ZpJXmkleaSZ5pZnklWaSV5pJXmkmeaWZ5JVmkleaSV5pJnmlmeSVZpJXmkleaSZ5pZmkgmaSCpqP qaDjf/39+a+fX56+/Pn7h9dvT5d/XIa1n/E+1zof/PfXb398Hn/q+miMh8/+py+vf33+/vnfX//z 0x+f/8fr07/k1qO671/Bx9Ca85caDsFvPtHLxb8azzb7Q6Xnw2fvPpS/lFDcZVQxvHfe1Wp9o2Z9 qFJLu3+2XewP5T4ePnv3oZIvoeVLian2j1XdJRsfage/+VCxZetDOftDfZr/eTHe7Y64+2ixhUsL pae8l0Fkv/R1PAS/+WgfcnkxnvWPPtrrp0PE/Vu7hEusLaSxnKW5EAxH3sFv/SsU69lgfzRfD581 /OtSk0/9rFkvrQfAJZRD8JsP9enywXpf8dH7erZWIx69r+5itSUffL64koq3vCxaHy29vlofLT38 aJb1ZH+0cQ/eJbeanE8+XkJL1vKkk5tXy+c3r/3Z7R8/ff32+/P3/v9jP/TmL7/2lNowWB76t/UR ypErpdC/dMyXmEsKqe8Oh+A3H81dmrEntqNN3bJ7sKnH/t94X1ypIed5TaP1DuxN/dXaqQ729GC9 qIM9ve+XodZwSb5HWw79TblD8NsX5S/3EVQuB3v6toYf71/XFfHQja4P3W2Tr/c+XC4Pd/B2/yav COPtJNdqD+xQSkihv55D7JtP9vHF8LhyebiBf7j3uyvi7pP1NSvpkvrPrfethL4HWGthbuD95/Le QcrlYAPP+fDZ+9dV+y45jga15tz/ejA88Qp+dysql4Pd29iKrs/e79sxxJT62vVjQu6/di1br8nc t9uHi/WHDvZt43fu+uw7jm3uzB8vH60PerA5G7+T12fvN6HuMZfxUPBtjLgqwfrk5qZdP1wsDz3Y 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 Kjk3RbraUdJ6KcLQjpLevCIM9U0RhnaU9OYVsWZHSW9eEWt2lLReilhzzFxXUIpYs6Ok9VLEmh0l 7aKKWLOjJN9QxJodJTXTyOJmBedtzTMoZqyRxc1GFjcbWY9sZD2ykfXIRtYjG1mPbGRtrZG1tUbW 1hpZW2tkOayR5bBGlsMaWcFqZAWrkRWsRlawGlnBamQFq5EVrEZWsBpZwWpkBas9qGA9f3/ernP6 /OXp2+tf//zt+dsd+Onlt+fPv//x9Ocfrx+fPvz29eVvT+5SfBjXl5a/vHz9Nv7q5y9/ffqyXTv1 x7xo6u4jjD/7ZcL/eGrFX1KN5oPXj3q7fCpd3CWG7VKh25/I57DSMRFU9M6cDjRGej8odZ2JIWcM lLrONBI0Ru6yoKB05qKgMdLPQEHpTGg5Y6CgdKa/oDFyCwIFpTOHBo2REQAKSmcizhmTRChNEqE0 5WKdjpJqHFI3q0nSlSb1wJrSAwsXpQfWUUL9q6ME3+gowTc6SvCNjhJ8o6ME3+gowTc6SvCNjpJ8 QxG8dJTkG0pHsKMk31A6gh0l+YYieOkoyTeUPmJHSb6hCF46SvINpfvYUZJvKN3HjpJ8Q+kjdpS0 ykofMVyUPmJHSaus9BE7SlplZQRuR0mrrIzA7SjJN5ROZ0dJvqF0OjtK8g1lBG5HSb6hdFU7SvIN pas67m+WUJJvKF3VcFG6qh0lvXmtZ0lqQRqpBWng9UQz2QGNkVknKSxpZCO3gY3cmV+Bxri6y8zG QGNcBMzcDTTGRcDM9EBjXATMvBA0RkYAqFKZySVojIwAsJM+M1TQGBkBoEplprmgMTICwLb8zJVB Y2QEgD3+mXCDxsgIAHv8M2sHjZFOC7blZ+oPGiOdFuxZz/oBaIx0WrCbPosQoDEyAsDW/KxkcMbA 1vyse4DGyAgAp1DP4glojIwAkDQwKzCgMTICQNLALOOAxkjXALvp4aL0rDtKqi4qPeuOkqqLSs+6 o6TqotKz7iiluuiknrWTetZO6lk7qWftpJ61k3rWTupZO6ln7aSetZN61k7qWTupZ+2knrWTetZO 6lk7qWftpJ61k3rWTupZO6ln7aSetZN61k7qWTupZ+2knrWTetZO6lk7qWftpI6wkzrCTurSOqlL 66R+q5P6rU7qtzqp3+qkfquT+q1O6rc6qd/qpH6rk/qtTuq3Oqnf6hQV6zwtg0dvMvkEO6fzyA0a I5NPsHM6z+2gMTD5dGTn1JGdU0d2Th3ZOXVk59SRnVNHdk4d2Tl1ZOfUkZ1TR3ZOHdk5dWTn1JGd U0d2Th3ZOXVk59SRnVNHdk4d2Tl1ZOfUkZ1TR3ZOHdk5dWTn1JGdU0d2Th3ZOXVkS9GRLUVHNu4c 2bhzZK/Nkb02R/baHNlrc2SvzZG9Nkf22hzZa3Nkr82RvTZH9toc2WtzoEA3eEk64qXinZeKd14q 3nmpeOcliYWXSn5eKt55qXjnpeKdl4p3Xireeal456XinZeKd14q3nmpeOeVYXIdJa2yIrHoKGm9 krReSVovZQRd8FlaryzFcpZWOUurnKVVztIqZ2mVlXtnO0paZeXe2Y6SVrlIq1ykVS7Sjl0k31Du 0+0oyTeUW3g7SvINkmjrydzTk7mnJ3NPT+aeniSNejKR9WTu6cnc05O5pydzT0/mnp7MPT2Ze3oy 9/Rk7unJ3NOD85zmeRU0RvoZOIJpHnpBY6SfgcOh5skZNEbutJl02kw6bSadNpNOm0mnBS+unSd+ zhh4ce3MD0BjpNMW0mkLeTwoZASAl/3OTAU0RkZAASMgSvztKPG3o8TfjhJvNkq82SjxZqPEgI1S 6T1KU5uiNLUpSgX7KM1fitL8pSg1B6LUHIhScyBKzYEo8YGj1FKIUpk/SmX+KJXeo8RljVIRPUpF 9ChNN4pS6T1Kpfcold6jVESPUhE9SkX0KBXRo1REj1laZan0HqXSe5RK71EqvUep9B6l0nuUSu+R ZH9Gkv0ZSfZnJBlmkWSYRZJhFklSWCSr/JEcpxHJcRqRbBlEcgJGJCdgRLKZEclmRiSbGZFsZkSS lRfJzkgk+w+R7D9EssofSR5XJAvzkSzMR3I0RCSr/JGs8keyyh/JwnwkC/ORLMxHsjAfycL8OOmD xkinJav8kazyR7LKH8kqfySr/JGs8temZEO1KdlQlSbhVGkSTpUm4VRpEk6VJuFUaRJOk6bTNGk6 TZOm0zRpzkyTZr80qXfQpN5Bk6a4NGmySpMmqzRpskqTJqs0abJKkyarNGmySpMmqzRpskqTOkRN 6hA1qUM07g5VUJJvSN2oJnWjmtSNalI3qkmikyb1sJrUw2pSD6tJPawm9bCa1MNqUg+rST2sJvWw miSLaZIspkn9sib1y5oki2mSLKZJvbkmCVya1NEbp2Xw6I2e48FMtpJzcyo5N6eSc3MqOTenknNz GjmdppHTaRo5naaRA2UaObalkY27RjbuGjlppZHzTBo5z6SR80waOc+kkfNMGjnPpJHzTBo5z6SR 80wa2W1uZLe5kd3mkbGBxsgIIPvgjeyDN7IP3sg+eCN1eI1sqjeyqd7Ipnojm+qNbKo3sqneyKZ6 I5vqjWyqN1Ju2Ei5YSPb/Y1s9zdSbthIuWEjiQiNVAg2kNUQnaIW7yihkNFRQpEruiqUPzpKKH90 lFDk6iihyNVRQpGro4QiV0cJRa6OknyjSr5RJd9QmrsdJfmG0tztKMk3lOZuR0m+oTR3O0paZeXC kuiV5m5HKevllatHOkpZL69cPdJRynp5pf3cUcoqe6X9HL0iXesoyTeUq0c6SvINpdXdUdIqK+3n 6JX2c0dJvqE0QaNXmqAdJfmG0gSN0uS9jpL2DaUJGqUZevN8CB42uTP1PE1yxip3QJ9nT9AYl1XO kypojMsq57kWNMZllfMUDBojI6CSEQB2fucJGzRGRgDY+Z3HdNAYGQFg53ee9UFjoNN6sPM7EwbQ GOhnHmwjz6wDNAb6mQcb3DN1AY2RTgsqU2f+AxojIwC8l2QmUaAx0mnBBvfMxEBjZASAXcyZzoHG yAgAu5iRnCY6U0XQGBlOYHsvBmXkQQzKyIOOUuoDQZk23FFKfSAo04Y7SqkPBGXacEcpdcUg9Y+C 1D8KUv8oSP2jIPWPgtQ/ClL/KEj9oyD1j4LUnQlSdyZI3ZkgdWeC1J0JUncmSN2ZoEjvOkqKSqmn ExWZX0cpvhGlTlCUOkFR6gRFqRMUpU5QlDpB0hDDKA0xjNIQw46SfEPqBEWpExQVqWRHSb4h9Y+i IpXsKMk3pF5VlHpVUZFKdpTkG4pUMkrDNKM0TLOjJN+QOnfSMM0oDdOcuQOXiIATDWamARoDc9QA zi2e6QpoDMxRAzi3eOY8oDGwShPInmgge6KB7IkGsicayJ5oIHuigeyJBrInGshmYSCbhYFsFgay WRjIZmEgm4WBbBYGUCY6M1LQGLg5RlDAOtNa0BgYAZFsY0ayjRnJNmYk25iRbGOSA3YjOWA3kgN2 Z/IOGiMjgGxjRlCOPAsDoDEyAkA58qwugMbICCC7tRGUI8/KBWiMjABQjhzJ4dezKgIaI/2MbJeT w69jk6qnTaqeSoPmojRoLkqD5qI0aC5Kg+aiNGguSoPmojRoLkqD5qI0aC5Kg+aiNGguSoPmojRo LkqD5qI0aC5Kg+aiNGguSoPmojRoLkqD5qI0aC5Kg+aiNGguSoPmojRoLkqD5qI0aC5Kg+aiNGgu SoPmojRoLkqD5qI0aC5Kg+Y6SvINZTxdlMbTdZTkG8qFUx0l+YZy4VRHSb6hXDjVUZJvKNdUxaZc U9VRkm8o11R1lOQbyjVVHSX5hnJNVUdJvqFcU9VRkm9InM0mcTabxNlsEmezSZzNJnE2G1npamSl ixy8F8nBe5EcvBfJwXuRHLwXycF7kRy8F8nBe5EcvBfJwXuRHLwXycF7kRy8F8nBe5EcvBfJwXuR HLwXycF7kRy8F8nBe5EcvBfJwXuRHLwXycF7kRy8F8nBe5EcvBfJwXuRHLwXycF7kRy8F8nBe5Ec vBfJwXuRHLw3SxqcMXCKX0Sn+DXwbsJZLgGNkREA3k04ay6gMTICEhkB4EWHs54DGiMjALzocBaF QGNkBIAXHc7KEmiMjADwosNZnuKMkbKARsoCGikLaKQsoJGygEbKApqkeW6S5rlJmucmaZ6bpHlu kua5SZrnJmmem6RebpJ6uUnTb5s0/bZJ02+bpK9ukr66SfrqJumrm6SvbpK+ukn66ibpq5ukr26K vjpdFH11Rwm+0VGCb3SU4BsdJfhGRwm+0VGCb3SU4BsdJfhGR0m+oeirO0ryDYUh2FGSbygMwY6S fENhCHaUtMoK1y9dFK5fR0mrrHD9OkpaZYXr11HSKitcv46SdgCF69dRkm8oXL+OknxD4fp1lOQb CtevoyTfULh+HSX5hsL16yiNl0FWBUipdCOl0o2USjdSKt1IqXQjpdKNlEo3Ut3cSHVzIyc+N3Li cyMnPjdSxN1IEXcjRdyNFHE3UsTdSBF3I0XcjRRxN1LE3UAR90ySQWNcBMyUGjTGRcBMwEFjXATM dB00xkXATO5BY2QEgCLuWSEAjZERAFJbZ5kBNEZGAEhtnbUK0BjptCAbdRY8QGOk04Js1Fk1AY2R TguyUWfpBTRGRgDIRp31G9AYGQEgG3UWgUBjZASAbNRZSQKNkREAslFnOQoz5pW+XUcp1Tev9O06 SqnMBqlvF6S+XZD6dkHq2wWpbxekvl2QOnBB6sAFqQMXpA5ckHppQeqlBamXFqSuWFDmZnSU9Oal rliQumJB6ooFqb8VpP5WkPpbQepvBam/FaT+VpD6W0HqbwWpvxWk/laQ+ltB6m8Fqb8VpP5WkPpb QelvpaDMsugoaZWVqRQdJa2yMpWio6RVVqZSdJS0yspUihSUqRQdJa2yMl+io6RVVuZLdJS0ysp8 iY6SVlmZLzGzADClADMnDzY9ZiqBGQtk0yOQTY9ANj0C2fQIZNMjkE2PQPYpAtmnCGSfIpB9ikC2 FgLZWghkayGQ3YAADrqYqRtnjOwGBLIbEMhuQCAL+IEs4AeygB/IAn4gC/iBLOAHsoAfyAJ+IAv4 gSzgB7KAH8gCfiAL+IEs4AeygB/IAn4Ax0nM7Bw0RjotOAFipvigMdJpwQkQs04AGiOdFpwAMYsN oDHSacGhDbNiARojnRYc2jDLHqAx0GmlocRJGkqcpKHESRpKnKShxEkaSpykocRJGkqcpPHCSRoU nKRBwUkaFJykQcFJGhScpEHBSRoUnKRBwUkaFJykQcFJGhScpEHBSRoUnKRBwUkaFJykQcFJGhSc pEHBSRoUnKRBwUkaFJykQcFJGhScpEHBSRoUnKRBwUkaFJykQcFJGhScpEEnSRp0kqRBJ0kadJKk QSdJGnSSpEEnSRp00lGSbyjjUZI0HiVJ41GSNB4lSeNRkjQeJUnjUZI0HiVJ41GSNB4lSeNRkjQe JUnjUZI0HiVp41HIAbCJHACbyAGwiRwAm8gBsIkcAJvIAbCJHACbyJmtiRyzmsgxq4kcs5rIMauJ HLOayDGriRyzmsgxq4kcs5rIMauJHLOayDGriRyzmsgxq4kcs5rIMauJHLOayDGriRyzmsgxq4kc s5rIMauJHLOayDGriRyzmsgxq4kcs5rIMauJHLOayJFCiRwplMiRQokcKZTIkUKJHCmUyJFCiRwp NKsmoDEyAsD5RImcT5TI+USJnE+UyPlEiZxPlMj5RImcT5TI+USJnE+UyPlEiZxPlMj5RImcT5Sd UlXsKKGq2FFCVbGjhKpiRwlVxY4SqoodJVQVO0qoKmaviLc7Sqg4d5TiG14Rb3eU4hteEW93lOIb XpF8d5TiG16RfGevSL47SvINRSjeUZJvKELxjpJ8Q5GXd5TkG8qo5o6SfEMRpXeU5BuKKL2jJN9Q pOwdJfmGImXvKMk3FCl7R0m+oUjZO0ryDUXK3lGSbyhS9o6SfENhQHaU5BsKA7KjJN9QGJAdJfmG woDsKMk3FAF8R0m+oQjgO0ryDYVt2VGSbyhsy46SfENhW3aU5BsK27KjtDyFy/NnWgYa4/L8mcSB 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 nI9Ecj4SyflIJOcjkZyPRHI+Esn5SCTnI5Gcj0RyPjLJ+cgk5yOTnI9Mcj4yyfnIJOcjk5yPTHI+ sqRrypKuKUu6pizpmrI0bzZL82azNG82S/Nms3SPfZbusc/SPfZZusc+S/fYZ+ke+yzdY5+le+yz dI99lu6xz9I99lm6xz5L99hn6R77LN1jn6V77LN0j32W7rHP0j32WbrHPkv32GfpHvss3WOfpXvs s3SPfZbusc/SPfZZusc+S7zCLPEKs8QrzBKvMEu8wizxCrPEK8wSrzBLvMIs8QqzxCvMEq8wS7zC LPEKs8QrzBKvMEu8wizxCrPEK8wSrzBLvMIs8QqzxCvMEq8wS7zCLPEKs8QrzBKvMJOc+0xy7jPJ uc8k5z6TcxYzOWcxk3MWMzlnMZN3n2fy7vNM3n2eybvPM3n3eSbvPs/k3eeZvPs8k3efZ/Lu80ze fZ7Ju88zefd5Ju8+z+Td55m8+zyTd59n8u7zTN59nsm7zzN593km7z7P5N3nmbz7PJN3n2fy7vNM 3n2eybvPM8nJzSQnN5Oc3ExycjPJyc0kJzeTnNxMcnIzycnNJCc3k5zcTHJyM8nJzSQnN5Oc3Exy cjPJyc0kJzeTnNxMcnIzycnNJCc3k5zcTHJyM8nJzSQnN5Oc3ExycoukayqSrqlIuqYi6ZqKxMso Ei+jSLyMIvEyisTLKBIvo0i8jCLxMorEyygSL6NIvIwi8TKKxMsoEi+jSLyMIvEyisTLKBIvo0i8 jCLxMorEyygSL6NIvIwi8TKKxMsoEi+jSLyMIvEyisTLKBIvo0i8jCLxMorEyygSL6NIvIwi8TKK xMsoEi+jSLyMIvEyisTLKBIvo0i8jCLxMorEyygSL6NIvIwi8TKKxMsoEi+jSLyMIvEyisTLKBIv o0i8jCLxMorEyygSL6NIvIwi8TIKybkvJOe+kJz7QnLuC8n5KCTno5Ccj0JyPgrJ+Sgk56OQnI9C cj4KyfkoJOejkJyPQnI+Csn5KCTno5Ccj0JyPgrJ+Sgk56OQnI9Ccj4KyfkoJOejkJyPQnI+Csn5 KCTno5Ccj0JyPgrJ+Sgk56OQnI9Ccj4KyfkoJOejkJyPQnI+Csn5KCTno5Ccj0JyPgrJ+Sgk56OQ nI9Ccj4KyfkoJOejkJyPQnI+Csn5KCTno5Ccj0JyPgrJ+Sgk56OQnI9Ccj4KyfkoJOejkJyPQnI+ iqRrKpKuqUi6piLpmoo0L71I89KLNC+9SPPSizQvvUjz0os0L71I89KLNC+9SPPSizQvvUjz0os0 L71I89KLNC+9SPPSizQvvUjz0os0L71I89KLNC+9SPPSizQvvUjz0os0L71I89KLNC+9SPPSqzQv vUrz0qs0L71K89KrxCusEq+wSrzCKvEKq8QrrBKvsEq8wirxCqvEK6wSr7BKvMIq8QqrxCusEq+w SrzCKvEKq8QrrBKvsEq8wirxCqvEK6wSr7BKvMIq8QqrxCusEq+wSrzCqvEKSc59ITn3heTcF5Rz T87BLuQc7ELOwS7kHOxCzsEu5BzsQs7BLuQc7ELOwS7kHOxCzsEu5BzsQs7BLuQc7ELOwS7kHOxC zsEu5BzsQs7BLuQc7ELOwS7kHOxCzsEu5BzsQs7BLuQc7ELOwS7kHOxKzsGu5BzsSs7BruQc7Epy civJya0kJ7eSnNxKcnIrycmtJCe3kpzcSnJyK8nJrSQnt5Kc3EpycivJya0kJ7eSnNxKcnIrycmt JCe3kpzcSnJyK8nJrSQnt5Kc3EpycivJya0kJ7eSnNwq9bWq1NeqUl+rSn2tJvW1mtTXalJfq0l9 rSb1tZrU12pSX6tJfa0m9bWa1NdqUl+rSX2tJvW1mtTXalJfq0l9rSb1tZrU12pSX6tJfa0m9bWa 1NdqUl+rSX2tJvW1mtTXalJfq0l9rSb1tZrU12pSX6tJfa0mzcto0ryMJs3LaNK8jCbNy2jSvIwm zcto0ryMJs3LaNK8jCbNy2jSvIwmzcto0ryMJs3LaNK8jCbNy2jSvIwmzcto0ryMJs3LaNK8jCbN y2jSvIwmzcto0ryMJs3LaNK8jEr2FCrZU6hkT6GSPYVG9hQa2VNoZE+hkT2FRvYUGtlTaGRPoZE9 hUb2FBrZU2hkT6GRPYVG9hQa2VNoZE+hkT2FRvYUGtlTaGRPoZE9hUb2FBrZU2hkT6GRPYVG9hQa 2VNoZE+hkT2FRvYUGtlTaGRPoZE9hUbO+WjknI9Gzvlo5JyPRs75aOScj0bO+WjknI9Gzvlo5JyP Rs75aOScj0bO+WjknI9Gzvlo5JyPRs75aOScj0bO+WjknI9Gzvlo5JyPRs75aOScj0bO+WjknI9G zvlo5JyPJs2bbdK82SbNm23SvNkmzZtt0rzZJs2bbdK82SbNy2jSvIwmzcto0ryMJs3LaNK8jCbN y2jSvIwmzcto0ryMJs3LaNK8jCbNy2jSvIwmzcto0ryMJs3LaNK8jCbNy2jSvIwmzcto0ryMJs3L aNK8jCbNy2jSvIwmzcto0ryMJvEKm8QrbBKvsCm8wnJReIUdJfhGRwm+0VGCb3SU4BsdJfhGRwm+ 0VGCb3SU4BsdJfmGwivsKMk3FF5hR0m+ofAKO0ryDYVX2FGSbyi8wo6SfEPhFXaU5BsKr7CjtDyF rECQcxYbOWexkXMWGzlnsZFzFhs5Z7GRcxYbOeejkXM+Gjnno5FzPho556ORcz4aOeejkXM+Gjnn o5FzPho556ORcz4aOeejkXM+Gjnno5FzPho556ORcz4aOeejkXM+Gjnno5FzPho556ORcz4aOeej kXM+Gjnno5FzPhrJyW0kJ7eRnNwGcnJnXQQ0xkXArKKAxrgImDUX0BgXAbNCAxrjImDWc0BjZASA nNxZFAKNkREAcnJnZQk0RkYAyMmd5SnQGBkBICd31rhAY2QEgJzcWSjjjCm6po6S6p2KrqmjpHqn wsvoKKneqfAyOkqqhSu8jI6SauEKL6OjJN9QeBkdJfmGwsvoKMk3FF5GR0m+ofAyOkryDYWX0VGS byi8jI6SfEPhZXSU5BsKL6OjJN9QeBkdJfmGwsvoKMk3FF5GR0m+ofAyOkryDYWX0VGSbyi8jI6S fEPhZXSU5BsKL6OjFN9wEi/DSbwMJ/EynMTLcBIvw0m8DCfxMpzEy3ASL8NJvAwn8TKcxMtwEi/D SbwMJ/EynMTLcBIvw0m8DCfxMpzGywA59zMtA42ReT7IuZ+5HWiMzPNBzsdMEEFjZKUL5HzMLBM0 RkYAyPmYqSpnDOR8zMQWNEZGAMj5mNkxaIyMAJDzMVNs0BgZASDnY+bpoDEyAkDOx0z2QWNkBICc j1kxAI2REQByPmbZgTMGcj5mkQI0RkYAyPmYlQ7QGBkBIOdjlktAY2QEkJwPR3I+HMn5cCTnw5Gc D0dyPhzJ+XAk58ORnA9Hcj4cyflwJOfDkZwPR3I+HMn5cCTnw5GcD0dyPhzJ+XAk58ORnA8n6Zqc pGtykq7JKbqmjpJqq8q89I6SaqvKvPSOkmqryrz04pR56R0l+YYyL72jJN9Q5qV3lOQbyrz0jpJ8 Q5mX3lGSbyjz0jtK8g1lXnpHSb6hzEvvKMk3lHnpHSX5hjIvvaMk31DmpXeU5BvKvPSOknxDmZfe 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 B/OefjDvKQjznoYw76kI856OMO8pCfOeljDvqQnznp4w7ykK856mMO+pCvOerjDvKQvznrYw76kL 856+MO8pDPOexjDvqQzzns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezp DGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFP Zwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7 OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY 0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnC ns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q9nSGsKczhD2dIezpDGFPZwh7OkPY0xnCns4Q 9nSGsKczhD2dIezpDHFPZ4h7OkPc0xnins4Q93SGuKczxD2dIe7pDHFPZ4h7OkPc0xnins4Q93SG uKczxD2dIe7pDHFPZ4h7OkPc0xnins4Q93SGuKczxD2dIe7pDHFPZ4h7OkPc0xnins4Q93SGuKcz xD2dIe7pDHE/sLCHaDe0sBtb2A0u7EYXdsMLezpD3NMZ4p7OEPd0hrinM8Q9nSHu6QxxT2eIezpD 3NMZ4hc6w8eH+7e3nz4d7m7/48N/Hn58/+nt/V9vH25/fAoOfXrz5s1367tNjKLbH+Japv/78Meb H+/qA+/vDr/c/ufhw/39L58/Hv72w+3dT48//913P3z8+7/9QejIpRnS9wf550ORpw8//Ofj7ae/ q4989fc0bfn0dzOtOs58RKv9/dtplVzKiNbL37+ZlkiSNNrDs78TtPJoD8/+/s208nps+DuC9uVP IIpDgF/+BKG45S1foPjyk2+mOIsI2CZ5TQOSr35D0dzCZZrtNwzNRdTNSzRffsPQXEWFuETz5TcU zTCSNq9+Q9EcfpqvfvPtEnWaS86iRo6k6pe/QWiuYqUPJfmXv6Fo5ks4z37D0FyXi3t79huKZhje yF/+hqIZR7Lv1W8omstIJrz6DaDplK3UZnpDbeeL30A00zT8Vr78DUPz0t5++RuKZr6I8+U3CM1t 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 3M8gvPCuTcS6QvDiuTGRw+znbKre9J/SvdUp3d2Du1x5cLeyxDlNurt/uXRAlssvVe9vzIvexu5t T75qe0ToLmFetlWpG+VL+5Mv748+iyMPHD2ngOKb/yWU7h73oolpN5bYTtpyHkusHNz+9v5ThX/2 uzLXHG5VTDE9RRR7b2m97i2JgibneNa+pfXSW1ovvyW9RyYP3F4t7DtP0zQI4hMvatXG8ocvqlz5 opZlWuM2LboXVS69qHL5RendSnnp+2nOXlQ/22LLxIsquhe15eGL2q58UXEKOW1b1L2o7dKL2i6/ KH28Og98nC8JI3P/Rc37aTHaN6XMp5hP6TGdV7Ve53aSV7UscZOfq16V7Nj4VckPLr0qg7swD3zF L68qhP6rSgl4VWFSvqqUhq/qOkfLLMusW1k33T21XvK0rJc9LavF09L3qr+8qqV/T82Z0CjCrHxV eahSrNc5fWa5quI6hy3rXlW49KrC5VelL7PMg+jE2U01+Ko2QqcIyvxAoTp8Vdf5RuRVbbHkElbd q7rk0FgvOzQMnVzzIGBz9qr6yY2iYhOvKupelVAdvqrr3CRzPKYihynoXlW69KrS5VelT7vJg9DW 2V3VVytCItQKbTqqUB2+quscA3MU9SRtcmHpXtUlz8B62TMgP3ne3jCwg0RBJbZ3UW5vTsok2Abr imTfeYC2ILep0j4XqsPDdKUbJc7rcQ6P8jBdcqOsl90ohmaieenHDV9e1dZ/VfLpEK9KaaEL1eGr utKXEkU+h5jLpntVl3wp62Vfiq7XTnvooi9FdNS+iI4RuU2VNrpQHb6qK70pMa5hmnNOuld1yZuy XvamGFrO5kGbn7NX1ddRY0ZuU23RQx7fpgN/ypym2gi/lGqgh3L24sI85VzSrPOurJe8K+tl78pq 8a70myedvbi+xhoLcU9HpckuVEcvrlzpXYkxbWUqWWcHlkvelXLZu1Is3pV+psHZq0rdV5UmQsmI SpNdqNpUqn6OwxnapY82Evd0VFq9QrWifQVEzlpl/+lEPR2/esSeOD4tJgTjvG05b+v3L56pMyEj rFx3PC+5KcplN4WhK3Re+nkiZy8s91/YQtzWUWn7CtWhJLnOTRGDyMgcsk4FLpe8FOWyl0LXM609 dEWh6bL231QhLuuoNH2F6vBNXemlmKewpliKLkpVLnkpymUvha71W3voCi/FUrqvapmQ61lpRgvV 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 2n2ImdJknNHzR24dSznWl2jMB226Yae+86Qt+ydt/8hv/3vz/T2qbs/4j3cPD/dPkdSvkcKXnPpR /f7ur/9x3T9y+2K/+e91MXD79i8/fHw43fc/ePvw/u4TwFxvHxr/cfzhv5/vP15i1KfPb//9fOpW Ia8pbutj6Hl85P589+7h7fvz/9Q/9viRb5b47evy8PE0nqlsbXqxtePvD25tZ/Pb/77CW7t+/9aq d483H798+Bb5+pQSGKH9vkE/nk93p7Gtfxj72v/+3Xmf/E1PI7yOL3/B1exp5Ne7D7GagbrvadRw m9INY10jwXn69iFmSvvuit5odvSyVLffA5cx1eMw7tqNl2n7zk3bd2cuyg/fvgfpho9X0/dfJb99 xjeMvvms68mkS08c8RTrvotXb7p4W7xxAaxmFy/e+J1+p4tX9128mm+jWW/84L/TO6v73lm97Z3d fHcJYZBvnzF9d6vvu6vGqw69u/teYr0Zj7n97prjMfFlPObbh5jflgMeTDv87rbvDKW0/VBKWw6/ u239/nf322fM3t1mce3s767egnjk3W37caF201u7+e42s7cWX97Pv32I+W3Z99aaEhe69e5+p6PV 9h2tdjMudPvdncWFjr67cy8IeAO/K0bU9p2qdtOpuv0Gmp2qeGOH5l7V/ne+78y0dPwN/E4/pO37 Ie1mqOn2GzgLNX3zSV+7pya5Dr11++5Qu+kO3X7rzO7QjYTDtw8xf8/7bkirx9+67/Qg2r4HYVOR kevh9Jrx9x/OP989vP3L+R+eIkB/CKnm0spS2rb0NYcs1bdUN2Qg7US6boc2uNz0bf/mHW0plZcs 99ye23s3IpxhrWXZlrC+CBr3p+7zvek/3Ma45z/cxtjB1a3lGtq6hRvf765DMD5yGONe+OYmxhBa yan//1Lbhkf48qn7GG+6CR3jjW9lz024iXHt0Jac1o6xrS3feOo+xpsndcf4wtz1nyOAMY0ilZDC ELzvftONfdw9esdHbmO88bRZHOGbT3oedv3xvxuR1Zeff/xfv/3owXOxvDgWxx/vbp/iK5xf3EK3 ZeYrAJvALGtRb/zfLHn6w+M/SlphFLyPyPdTAe2F/pqWbY0hLLXUksf9Rfq1wlJSt055px7+meBY 60Y9/PMHdr+em15LPwBv/J7NXkt+4fq8eIjRT+h/v0/JrrDU/8iWKFvji3ROf8TRdM5Y7daut/Ki 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 tfnBmzJt35Tp4k2ZP9Tja23MN2W8AOkHb8q0fVOmizflZUjmm/ISpB+8KdP2TZku3pSXIZlvykuQ fvCmTNs3ZfuILRBaph4I7Q0nkvl2fX0TvXyG+RS2L9d08XLtEdZrbcyXa73wxY4v1xefbYrfHf75 Xx8Cx4eQ8923+8P9ry3uO3zqYV//dx+Of//0/qjFms9ndP8/vx4PUwse2/+81Gn7mC5f2McLx5TN F/aFY3r5kNEx5emPOaa87QTki+F2fX/pmGbGMY09iRef/YOOads7yfPFY7q6dEzmrMSlYxq7ONbc Tn/gD53QtseU93tM+Qc9prztMeX9HlP+QY8pb3tMOe3X5gednbzt7OS8X5sf9FPytp+S9/spmeGn vHyIGdK2n5IvRvSXIZl9jkuQftDpyNtOR77odFyGZHY6LkH6wYg+bzsI+aKDkNL8OqIvZgfhQpLi 5UOskMr2ZV4uXuYX8y7FfJlfgvSDaYGyffGWixfvZUjmi/cSpB/MLZTtm7LsrwcURj3g5UPMkLav 23KxHnAxyiqjeoDdr9FnWl75NfG1X1O2725bI4n80Z5KWlEraX0TK6GSNtvC5SYVqRs2tGqt+gxt 1tGGhYE2GNGGBUSrNpecoY062syops/RiDZD1fSGVu1zeUY7D97kyqimz8mItkIV8IZWbao5+26D irZMlAp4tqFtUjG0+szQGdpZRxsoVqoY0QbQSumD2Gdvsv67LYlipYwpzCYVRLun52fS0VaKlTL2 /DSpINodPT+z3uFUVoqVWo1oV9BK6X1Cz2hrUtHWwLBSYbKhbVJBtDt8qVnv56qJYaWC0ZdqUkG0 O3ypWe/BqoVhpYLRl2pSQbQ7fKl58CavDCsVjL5Ukwqi3eNL6X7yMjOsVDD6Uk0qiHaHL1V1X2pJ FCtl9KWaVKVkmNb3r3Ndy1ZiaBhYL9sZneVyN2QLp17rMsrovPikoa7y8i+vb+4Pt+0PPt1/ufoK vBb6/p6PN9+uX8I/LU3sOyzubw7vjoerhu7q88/3n760Y/30+bh9ghcTSOF9Ka9PcJRAevFJwwkC ZxT+1LG9/vzDf/vyoz9Q11m2s1XLxWxVO7/6+vxG2aoXn/Q9v7j//FTPcdf5bafGloupsXZ+6fX5 jVJjLz7pe35p//ntz79dOr/t/Ntysduond8FCzjqNnrxSd/zU13WXYeyXcJbLvYrtUN5XUlZRv1K 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 jwAHwfvRFsqCYXkW70dbKEuBT88iFhaLXiMEnkX80fKIjgOHkECexbusOMP68izie88j7g2DWXn7 s4jFmkIssBTKsk95FvG955G0hsFcNPAs4ntPTIAP5o+BZxHfe8oyRnkW8b2nLFCUZxHfex7BZOAM lcqziO89pVlGnkV87ykNLqdnURbcybOI7z1lGFGeRXzvKQvb5FnE955H2hc4A3HyLOJ7T2lAOD2L RxwXil6zB55FfO+JhdjBLA3wLOI7QSzEcgZd5FnEd4JYiOUMlMiziLaQWIglDm4E4uBGIA5uBOaA RCEWPAux4FmIBc9CLHgWYsGzEAuehVjwLMSCZyEWPAux4FmIBc9CLHgWYsGzEAuehVjwLMSCZyEW PAux4FmIBc9CLHgWYpGyEIuUhVikLMQiZSEWKQuxSFmIRcpKLFJWYpGyEouUlVikrMQiZR0UKe3P 4r33lVjnq8Q6XyXW+SqxzleJdb5KrPNVYp2vEut8lVjnq8Q6XyXW+Sqxzld5db5EbNpMxKbNRGza TMSmzURs2kzEps1EbNpMxKbNRGzaTMSmzURs2kzEps1EbNpMxKbNRGzaTMSmzURs2kzEps1EbNpM xKbNRGzaTMSmzURs2kzEps1EbNpMxKbNRGzaTMSmzURs2kyjpk37s3jvPbHvMRH7HhOx7zER+x4T se8xEfseE7HvMRH7HhOx7zER+x4Tse8xEfseE7HvMRH7HhOx7zER+x4Tse8xEfseE7HvMRH7HhOx 7zER+x4Tse8xEfseE7HvMRH7HhOx7zER+x4Tse8xEfseE7HvMRH7HhOx7zER+x4Tse8xEfseE7Hv MRH7HhOx7zER+x4Tse8xEfseE7HvMRH7HhOx7zER+x4Th0BenkV87ymk7/Is4nvP6+1MxN7OROzt TMTezkTs7UzE3s5E7O1MxN7OROztTMTezkTs7UzE3s5EJOVORFLuROw5TcSe00TsOU3EntNE7DlN xJ7TROw5TcSe00TsOU3EntNE7DlNxJ7TROw5TcSe00TsOU3EntM06Dk9Xt+3D/8U1g8fjtO7q/Lx +C6t7+cwLe+vlvDueDVdXb0/fvjpcHV/ePf55v1vh6lTQnSRa2lCDhclNkOeD7fHj8fb4/X7493h 4+3xePr3c6otbJx7mfwfHjV6oHo4/dvrb1/eHft/ODwq1qQ+SXv71g69ENvVCrH9qhDbrwqx/aoQ 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 j45wEc27fP1mm5ZcuO0wCz1zRbiczJWPy1jxvjTbVORibYdK6JnxT9FBPkV3q1jbwQ965opY9Z64 v8LQltvznVj22jv3CitajYilyIAPgSJF1aheIzwg7lW3ylgfrtATe1bHnZev7by+f3VV6LjYXKgO N1fpc/2fcdcIDwh91bthPl2xd3P10932a74T19WzwqTscgqLyy5ee8MD3o656u28jm/sFXpib+fa QXZJRb5PB7wdc9Xbycu164kRezudI0Ph82STgg3OFLe4ymCK8druGvB5zFWfh/lwxT7P1Q9X4e3E kIqru7MeEcl6l2249qkNeDvmurdjlofv6Vmxt3PFeFwSGdqmi/FlWaoZjtaVmM1yxQG1A06QveoE vTPuyj3JKp2gd9eE3naCvhPahhyraUp5yd7npX7YV16xHXCO7FXn6HV4fU1osXN07RS7pDIibvC5 7rEYXf2sbVoOTX2uEB4Q97rT5K9tYCt2mk736muvYtt1+v4d1ytLvZ+5GEKglJx6YbtGeEDoqy5V iu/eXaEndqmu2dJLKkP72GVTzFKNlXFpCVX2a3tlwKWyV12q+klfE1fsUl39pLedqf6BawecJnvd adpfOySt2GmyV64xl1TkYg24R/Z6MKi8uWaA5MGga2/rVvdooH1Vslfdo3f+quFSukcPV/yFS1pj 7pGLsaRYfbpUPQeamHiF7oDMV70j//aquyD2juKVq9slFfmrHPCC7HUvyD1c2XhO7AUdX+V+gJZY ODfg9LirTg+1K73CkNLpebhyJbikJRduwLlxV50b83AtIuvEzs21g++SilysASfGXXdiHt5cY0jp xLweoCUXbsBZcVedlXcP1xxSJ3ZWzDWxNM5K9iYUU32VTF5LddGuOJADza+Su+qshDfXogNOGf95 eyWKe0lrROhEM/YMRYFiiLkeE+6Kh+YGXBkXGHavkLvVBxlokpXcVR/EBncl5ujkIZpr39ytPshA r6vkrvog9ZO7JpYckLr28hXeB/XfTXUT1dtODCku8epXNeB+uKvuRw77K46DUwJSbwdojQhdTFqq pIGii/WFFHMtjjfQryq5q86Ji+UKo17pnOQr+/KSlvgD9gPOib/qnJh4LVDmtbDUFV/gktbQbd2U UqjNC41GWYypd/ZrhAeEvuq0BJeuCS12Wq6AvZdE5K9ywGfxV30W695c8TO9HK26YmIvqcjFGvBW /FVv5fWbdMXEerG34q5tYoW3Yny1sCFWbyWmQgPq7RXvwg94K/56aCUu175Nsbdy7bi9pCJ/iwP+ iL8aWnnjrwVFvDLbplzxXy9pyYUbcG78VecmPFy16mLn5iTcNUVtuzjfe5guUYemEqqNL864mK8c i37A9fFXXZ+3y7sr92yvDL/kK6GcS1pjsXyTUvGeks2rg138tfjLQOuz5K86QMWna5+e2AG6loB0 SWUMOjeuxHpQOp+tJc/nmvEecH38ddfHXcsUCGLXJ14JWl1SEe/XgQZlKVx1enzxV/ZrEDs916DA SyrdXMtgBLmWimxYvtPau8evn75T1qnWi6oxnh93r/e7hyrEw4ffP7//WF/D+w/7AYVryrBSpxma ghgwCT4h23AlZBuuhGzDlTptuBTE2CT4gU09YKtOHZiOf3g1K3ig41A69S3qURm4YESzSWXAoT+1 +elRGfCfT81xelQG3NLoB15THHAEY9hkZ8DjOvWR6VEZcGFO3Vd6VAZ8glPPkh6Vgc83bn6+A40t Utr8fNPA55s2P9808PkmO/DJpIEvOG1+wQPNH5Kq+UPqNH9QEEMa507nBAUxYIVS4psObLzGgRr3 lDe/8IG68JQ3v/CBUuqUNw30QC1yypuf90Axb8p+k8qAdc6b1jkPWOe8aZ0Hqk3pmS0qA9Y5b1rn PGCd86Z1LgPfbtn8dsvAt1s2v90y8O2WzW+3DHy7ZfPbLQPfbhlxLsrA51s2P98y8PkWTXu5xFeM brE08BWXPKKhgQ+5bH3Iedn+kOmZLSrbHzI9s0Vl+0OmZ7aobH/I9MymgvNAEWdetuxwHihOzEsY YWf7W87LlinOA3V3edkyxXmgnC0vAx9xHigRy8vmRzxQkZXNMsDOQPVTNpvf8UCxET1ziN49vtt9 eXzzy/758u/d7n/8faX8W++d3b3+r+f9l98NUN0y0HmghCabzY96oCaFnhHb1YhslBeRjfJir1Ge ghjuohGRLdpir0WbghjuohF73c3kxDqNwRTEcK0QYq8dlYIYcgfwDZE0xJA7ANigJ3Ya9GiIIXcA sB1ORLbDich2OBHZDici2+FEZDuciGyHE5HtcCKyHU5EtsOJyHY4EdkOJyLb4URkO5zYaYejIQbc AdS3BEgM+NFSLw4gMeRHa5AfrUF+tAb50RrkR2uQH60Bmm2qZQcSQ360BvnRWuRHa5EfrUV+tBb5 0VrkR2uRH61FfrQWabYtcgdY5A5wyB3gkDvAIXeAQ+4Ah9sBGWmCMtIEZaQJykirkZFWIyOtRkZa jYy0GhlpNTLSamSk1chIq5GRViNjrYZD7gCH3AEOuQMccgc45A7wyB3gkTvAI3eAR+4Aj9wBHrkD OiPoFcSQO6Azv11BDLkD+PxtDTHkRwtMss7IJOuMTLLOyCTrjEyyzqkzGldODDhHNafO3FAFMeSn ARy6mVNn6KaCGPLT6Ix7VBBDfmfAuXo5AdMFqG4cSQz5nQFB+YzM/s2d7F8FMSCOnhMQR88JiKPn BIS+cwJC3zkBoe+cgNB3TkC0OicgWp0TEK3OCQgw5wQEmHMCAsy5kz2rIQb9zoD2LAMB5pyBAHPO QIA5ZyDAnDMQYM6ZHymiIQbcARmIVucMRKtzBqLVOQPR6pyBaHXOQLQ6ZyBanTMQrc4ZiFZXYsgd YJA7AAh9U/85IDEk7pSRuFNG4k4ZCH1XYsgdgASxMo877T8916d/CItx5tVH+/zlh91DG8u4tGGX YfGV4I6lnndP+3f7p/2nN/svBz72v77/cpinuXrQL3S7/7sjF4fc+9PfnnpS1AWOzNT1X9Z99eob Hi3PY+UCwmMR8mjzBY+O5zFYCI9pEfIY7IrHZXHLwvOYIoZHI+QxxQsePctjXBYMj1bGY133Gx4X w+sxWsyeSU7Io/Xf8rjweyZ6zJ5JXsijz9/ymDvvOoH2TBDymOwFj4HnsYD2TBTyWOI3tmcJPI/J gvZMkvFY173gMfI8etCeEZ4zdd1vbXjHPtZDDMOj8Jyp617wyJ/XqWD2TBaeM3XdCx5521O9cgyP wnOmrnvBI39eZ4/ZM1l4ztR1L3jk7WOOmD2ThedMXfeCR9725IzZM1l4ztR1v7HhpnNeFwPaM8Jz pq57wWPmeXSgPSM8Z+q6FzwWnscI2jPCc6au+y2PlrePJYP2jPCcqete8Mjbx3oGgTaN8KChhS+4 5C1ktZ6YbVOERw0t/K39sbxfUW0TZuMU4WFDC1/oMnW4zJitU4THDS184aPx+7vaUMzmKcIDhxb+ lsvIW3NjQOGAIjxyaOGLc7HzXRpQQKAIDx1a+ILLzndpQCGBIjx2aOELLvmz0VhQUKAIDx5a+ILL zu6xoLBAER49tPC3XHZ8IWNBgYEiPXusv9g9tqdLTGiA8E4hl8fYgCYQi4zRI9PsMzLNPiPT7DMy zT4j0+wzMs0+I9PsMzLNPiPT7DMyzT4j0+wzMs0+I9PsMzLNPiPT7DMyzT4j0+wzLs3eWyCCTMSg nMH2JhGD7c1KDIcgEzHY3iRisL1JxGB7k4jB9iYRg+1NIobcAbgySCKG3AE4/6wSw/lnRAy5A3D+ GRFD7gCcf0bEkDsA558RMeQOwPlnRAy5A3D+GRFD7gCcf0bEkDsA558RMeQOwPlnRAy5A3BlkEQM uQMCcgfgaiqJGHIH4GoqiRhyB+BqKokY8qPFlUFWYrgySCKGfJu4MkgihjRBuMpFIoY0QbjKxUos IU0QrgySiCFNEK4MkoghP1pcTSURQ+4AXIEmEUPuAL5Ac3f65/e7h58+Pe7+fmesaIFolmg8qGaw EYPs1xMxTC3XkRiolqsRg2z+Rgyy+RsxyBZrxCBbrBEDfmegiqlGDPmdYSqmGjHkd4apmGrEIIdM IwY5ZBox5A7AxLsbMeQOwMS7GzHkDsDEuxsx5A7AxLsbMeQOwMS7GzHkDsDEuxsx5A7AxLsbMeQO wMS7GzHkDsDEuxsx5A7AxLsbMeQOwMS7GzHkDsDEuxsx5A7AxLsbMeQOwMS7GzHkDsDEuxsx5A7A xLsbMeQOwMS7GzHkDsDEuxsx5A7AxLsbMeQOwMS7GzHkDsD0EGzEkDuAH9SuIYbcARG5AzBh/UYM uQMwGEEjhtwBmFaJjRhyB2AAh0YMuQMwgMOJGAZwaMSQOwADODRiyB2AARwaMeQOwAAOjRhyB2AA h0YMuQMwYxobMeQOwLSXbMSQOwAzprERQ+4ATK/KRgy5AzC9Khsx5A7ANL5sxJA7ANP4shFD7gBM F81GDLkDMF00GzHkDsB00WzEgDugIJHXgkReCxJ5LZgumo0YcAcUJCZckJhwQWLCBYkJFyQmXJCY cEFiwgWJCRckJlyQmHBBYsIFiQkXJCZckJhwQWLCBYkJFyQmXJCYcEFiwgWJCRckJlyQmHBBYsIF iQkXJCZckJhwQWLCBYkJFyQmXJCYcEFiwgWJCRckJlyQmHBBYsIFiQkXJCZckJhwQWLCBYkJFyQm XJCYcEFiwgWJCRckJlyQmHBBYsIFiQkXJCZckJhwQWLCBYkJFyQmXJCYcEFiwgWJCRckJlyQmHBB YsKlgwk/PD/s3j0+/VJ/QT9a/WT35sPD+49fdm+/ft7tf6VeTz9S16bd73fLj7svzw9Pz/VfbbC+ JFOW8OPuzafnnalXK/ObN49PxMj7Tz/tPh1/+oUW+Z4r4uSShW+fOHL988Pf9seOUvu33z+j0Qhy GyOB7YIEtgsS2C5IYLsgge2CBLYLEtguSGC7IIHtggS2CxLYLkhguyCB7YIEtgsS2C5IYLsgge2C BLYLEtguSGC7IIHtggS2CxLYLkhguyCB7YIEtgsS2C5IYLsgge2CBLYLEtguSGC7IIHtAgS2wwIE tisx3A6oxHA7oBLD7YBKDLcDqD03khhuB1RiuB1QieF2QCWG3AFAYJsaMSOJIXcAENiuxJA7AAhs V2LIHQAEtisx5A4AAtthAQLblRhyBwCB7UoMuQOAwHYlhtwBQGC7EkPuACCwXYkhdwAQ2K7EkDsA CGxXYsgdAAS2KzF+B1yPD9NPhuLDOQZj6007HsPDZQneDoWHD0x1w8OHJzbCw4dnNApB7mIgOF+J IXcxEJwPCxCcr8SQuxgIzldiyF0MBOcrMeQ5BgTnKzHkDgCC85UYcgcAwflKDLkDgOB8JYbcAUBw vhJD7gAgOF+JIXcAEJyvxJA7AAjOV2LIHQAE5ysx5A4AFmxXYsgdAMS1KzHkDgDi2pUYcgcAce1K DLkDgLh2JYbcAUBcuxJD7gAgrl2JIXcAENeuxJA7AIhrV2LIHQDEtSsx5A4A4tqVGHIHAHHtSgy5 A4C4diWG3AFAXLsSQ+4AIK5diSF3ABDXrsSQOwCIa1diyB0AxLUrMeAOMEhc2yBxbYPEtQ0S1zZI XNsgcW2DxLUNEtc2SFzbIHFtg8S1DRLXNkhc2yBxbYPEtQ0S1zZIXNsgcW2DxLUNEtc2SFzbIHFt g8S1DRLXNkhc2yBxbYPEtQ0S1zZIXNsgcW2DxLUNEtc2SFzbIHFtg8S1DbBguxJD7gAkJmyQmLBB YsIGiQkbJCZskJiwQWLCBokJGyQmbJCYsEFiwgaJCRskJmyQmLBBYsIGiQkbJCZskJiwQWLCBokJ GyQmbJCYsEFiwgaJCRskJmyQmLBBYsIGiQkbJCZskJiwQWLCBokJGyQmbJCYsEFiwgaJCRskJmyQ mLBBYsIGiQkbJCZskJiwQWLCBokJGyQmbJCYsEFiwgaJCRskJmyQmLBBYsIGiQkbJCZskJiwQWLC BokJGyQmbJCYsEFiwgaJCRskJmyQmLBBYsIWiQlbJCZskZiwRWLCFokJWyQmbJGYsEViwhaJCVsk JmyRmLBFYsIWiQlbJCZskZiwRWLCFokJWyQmbJGYsEViwhaJCVskJmyRmLBFYsIWiQlbJCZskZiw RWLCFokJWyQmbJGYsEViwhaJCVskJmyRmLBFYsIWiQlbJCZskZiwRWLCFokJWyQmbJGYsEViwhaJ CVskJmyRmLBFYsIWiQlbJCZskZiwRWLCFokJWyQmbJGYsEViwhaJCVskJmyRmLBFYsIWiQlbJCZs kZiwRWLCFokJWyQmbJGYsEViwhaJCVskJmyRmLBFYsIWiQlbJCZskZiwRWLCFokJWyQmbJGYsEVi whaJCVskJmyRmLBFYsIWiQlbJCZskZiwRWLCFokJWyQmbJGYsEViwhaJCVskJmyRmLBFYsIWiQlb JCZskZiwRWLCDokJOyQm7JCYsENiwg6JCTskJuyQmLBDYsIOiQk7JCbskJiwQ2LCDokJOyQm7JCY sENiwg6JCTskJuyQmLBDYsIOiQk7JCbskJiwQ2LCDokJOyQm7JCYsENiwg6JCTskJuyQmLBDYsIO iQk7JCbskJiwQ2LCDokJOyQm7JCYsENiwg6JCTskJuyQmLBDYsIOiQk7JCbskJiwQ2LCDokJOyQm 7JCYsENiwg6JCTskJuyQmLBDYsIOiQk7JCbskJiwQ2LCDokJOyQm7JCYsENiwg6JCTskJuyQmLBD YsIOiQk7JCbskJiwQ2LCDokJOyQm7JCYsENiwg6JCTskJuyQmLBDYsIOiQk7JCbskJiwQ2LCDokJ OyQm7JCYsENiwg6JCTskJuyQmLBDYsIOiQk7JCbskJiwQ2LCDokJOyQm7JCYsENiwh6JCXskJuyR mLBHYsIeiQl7JCbskZiwR2LCHokJeyQm7JGYsEdiwh6JCXskJuyRmLBHYsIeiQl7JCbskZiwR2LC HokJeyQm7JGYsEdiwh6JCXskJuyRmLBHYsIeiQl7JCbskZiwR2LCHokJeyQm7JGYsEdiwh6JCXsk JuyRmLBHYsIeiQl7JCbskZiwR2LCHokJeyQm7JGYsEdiwh6JCXskJuyRmLBHYsIeiQl7JCbskZiw R2LCHokJeyQm7JGYsEdiwh6JCXskJuyRmLBHYsIeiQl7JCbskZiwR2LCHokJeyQm7JGYsEdiwh6J CXskJuyRmLBHYsIeiQl7JCbskZiwR2LCHokJeyQm7JGYsEdiwh6JCXskJuyRmLBHYsIeiQl7JCbs kZiwR2LCHokJeyQm7JGYsEdiwh6JCXskJuyRmLBHYsIBiQkHJCYckJhwQGLCAYkJByQmHJCYcEBi wgGJCQckJhyQmHBAYsIBiQkHJCYckJhwQGLCAYkJByQmHJCYcEBiwgGJCQckJhyQmHBAYsIBiQkH JCYckJhwQGLCAYkJByQmHJCYcEBiwgGJCQckJhyQmHBAYsIBiQkHJCYckJhwQGLCAYkJByQmHJCY cEBiwgGJCQckJhyQmHBAYsIBiQkHJCYckJhwQGLCAYkJByQmHJCYcEBiwgGJCQckjBuQMG5AwrgB ibwGJPIakMhrQIKlAQmWBiRYGpCQZECiiAGJIgYkihiQKGJAoogBiSIGJIoYkChiQKKIAYkiBiSK GJAoYkCiiAGJIgYkihiQKGJAoogBiSIGJIoYkChiQKKIAYkiBiSKGJAoYkCiiAGJIgYkihiRKGJE oogRiSJGJIoYkShiRKKIEYkiRiSKGJEoYkSiiBGJIkYkvBaB8FrMwHB0JYbbTpUYTmeVGFRnuO1U ieG2UyWG206VGG47xQwMR1diuAOlEkPuAD4cvf/0XJ/+4dUfPn/+sP/j49fXH/Y/1B/vvvz8+PT8 7vHp4+6F5pma3z3t3+2f9p/e7L/s3j3t96flXFlK8Yup977jYj8//G2/++vXT7/s3+64lVievUpS 5CYARqQrMeQmAEakYwZGpCsx5HcLjPtWYuyn0T7NP/77X/69/nB7B4S03gG06P7X91+eK531mhQA MZ2d8M1yLNepsfeHf/7nP+z+P3/4t3/85z/98x9+axdjf/fq148fgMxantne4jrWP+6fH55//vrx NVAAJxPgWxY6Ymi+NuR2B4bfKzEkZ8CwaCWGNN7AsGglBtUZ0ngDw6KVGNKDAYZFKzGkDw8Mi1Zi yB0ADItWYsgdAAyLVmLIHQAMi1ZiyB0ADItWYsgdAAyLVmK4HZAWYMJjJQblDLc3KzHc3qzEcHuz EsPtzbQAEx4rMdzerMRw26kSQ360wKBQJYb8aIFBoUoM+dECg0JpAQaFKjHkRwsMClViyB0AzFGs xJA7ABgRqsSQOwAYEarEkDsAGBGqxJA7ABheqsSQOwAYq6rEkDsAmKNYiSF3ADBIUokhdwAw4vL/ 5+1/nitJkjtP8LC7B9Zl97Bzf5N9IUeyot1+mx54KLK6ZyhDblNILndWZlpKEBEvMlEZAcQCiGKS l/3XVxXACwCOZ+Zmjk8tJaW7qtLxdXN79jVV06+aqoKRDACzJxWMXLRgPREFI7kJZgIqGLlowVhQ WcBYkIKRixaMBSkYuTTAWJCCkds2GL6pZJiwkmHCSoYJq4BpOArGrTMF49aZgnHrTME490DBwEUr YBqOgnE7bRUwDUfBQDoJeJlfwUgGgNlGCkYyALzMr2AkA8D791XA+/cKRi5a8P69gpGLFgxHKxi5 aMFwtIK1F+3F3cXh0/XNLyaR6x89+5PDh88Xl19uDx+/fT0cfzU9/sfD9adPh98elh8Pt3cXN3f6 H121ngcSU/7x8OHq7uCzdzH+5sP1jY3k8uqnw9XD397aW14Py4ayHsPLJ55J/h8+Hy9ujh9fP7Nn SkjjAwbVq4BBdQUjeQyGrhWMXOBg6FrByF8TjDYrGPlrctFmv4B0MjDsB1Awjk4Ghv0ABkb+AJzg ZWCYWTQwbNcwMGzXMDBy0XISiYFh+5mBoZ9JcpMTIgyM5CYnRBgYyU1OiDCwNjfPOob3fzLkGCbn Uw11qbN+4cOoen7hwxN9v/DhmT0zQm4wnJpiYCSNOTVFwTg1RcG48K+BkWThwr8GRq4zLpZsYOQ6 41IBFYxLBTQwzlx44VKbDYz7NRWM+zU9uTQ8uTQ8uTQ8uzS4LFED4zZHBeM2RwXjNkcFI+nEXZ43 MJIB3OV5Hxbu8ryBcQxQMI4BCsYxQME4BigYxwAF4xigYBwDFIxjgIKRDOBUOwMjGcCpdgZGMoAr J21g5K/JyVkGRv6anJxlYOSvyclZBkbuZ5ycZWDkfgZGrgN4u0LBwMh1AG9XGBg3Z4lcGolcGolc GolcGolcGolcGgrGbY4JvMVjYNzmmMBbPAZGMoCTQg2MZACnqyoYqF4m8K6MgZHrjLsrY2DkOgMl qgTelTEwcp2BElUC78oYGMkAUKJK4F0ZAyMZAIoL5IUIT16I8OSFCAPjfgAF47YgBeO2IPLehyfv fXjy3ocn73148t6HJ+99ePLehyfvfRgYyQBQ+FMwkgGgulMWUN1RMJIBoLqjYCQDQHVHwUgGgOqO gpEMANUdBQMZ4EB1R8FABjhQ3VEwkAEOVHcUDGSAa6s793lP3//q/efrD78cvlz8dPnh8J8Oi+VB PfxPy33WVBO+3Cdafft69/3xVgG8h6f/4mEsVlLv4S9+c3V9ePdYW+/lm579lT2z+dDXm+v3n49f Dv92effzsyc+XF89ZH+tUrvu/2Yjtev+mT2zDrLbgcpVcaBypWAkh7iLWAYGbvyOu4hlYOTSAGWw 4kAZTMHIjR+UwRSMXLSgDKZgJANArUPBSAaAWoeCkQwAtQ4FIxkAah0KRjIA1DoUjGOAkPuZkPuZ kPuZkPuZkPuZkPuZkPuZkPuZkPuZkPuZkPuZkPuZkPuZkPuZkPuZsPsZqN0qGLnOuJunBkauM1C7 VTBynYHarYKR6wzUbhWM3GlB7VbBSAaA2q2CkQwAtVsFIxkAarcKRjIAvJmnYCQDwJt5CkYyALyZ p2AkA7g6hwZGMoArmmhgJAO4ltMGRjKAazpiYCQDCskArhm2gZEMANNHFIxkAJg+omAkA8D0EQUj GQCmj4gD00cUjGQAmD6iYCQDwPQRBSMZAKaPKBjJADB9RMFIBrTTR6b7Ixqa2+hX5nOJSwxh6fQr G+uTeP+2XV9MMgtMS1EwkllgJomCkesXTP4QDyZ/KBi4g3sw+UPBwHXmwXwNBQPXmQdv4yoYuGg9 mNMgHsxpUDBy0YK3cRWMXLRcDV0DI9cZmCAhntQAPakBelID9KQG6EkN0JMaoCc1QE9qgJ7UAD2p AXpSA/SkBuhJDdCTGqAnZTtPynYevHKpYOSiJQVFTwqKnhQUPSkoelJQ9KSg6ElB0ZOCoucExeDA YLKBYQxQMC6YbGAYAwwMY4CBYQwwMIwBBoYxwMAwBhgYyQAumGxgJAO4YLKBkQzggskGRjKACyYb GMkALphsYCQDuGCygZEM4O4iGhjJAC5Oa2DkouWuDxoYuWi564MGRi5aLoIcHBhBNjBw0YIRZAMD GeC564MGBjIADEcbGMgAMBxtYCQDuHC0gZEM4MLRBkYygAtHGxjJAO4moYGRDOAC5QZGMoCLuhsY yQAu6m5gJAO4qLuBkQzgou4GRjKAi7obGMkALupuYCADEpcPbmAgAxKXD25gIAMSlw9uYOCiTVwK t4JxKdwGRi5aLoXbwMhFy6VwGxi5aLkUbgMDt+1ERt0TGUFOZGg1tUOr07mAhiYbuYBxCSU7u4fx 8M7dqYD3L9vzwWTENpER20RGbBMZsU1kkDWRQdZEBlkTGWRNZJA1kUHWRAZZE5dZa2DkoiUjtomM 2CYyYpvIiG0iI7aJjNhmMmKbyYhtJiO2mYzYZjJim8mIbSYjtpmM2GYyYpvJiG0mI7aZjNhmMmKb yYhtJiO2GYzYBjJiG8iIbSAjtoGM2AYyYhvIiG0gI7aBjNgGMmIbyIhtICO2gYzYBjJiG8iIbSAj toGM2AYwT9rASAZwtZIMjGQAl3RtYCQDuKRrAyMZ0E66no9XKZrfiFdlq9Lqo7w9XmUv2/PBYLhV wcgVB4ZbFYxccWCSc/BgKrGCkTsbmEqsYOQ6AxN2FYz8NcHwr4KRFhQM/yoYuc7AhF0FI9cZGEtW MHI/A8O/wYPhXwUjFy0Y/lUwctGC4V8FIxctGP5VMHLRtsO/O5yrsCzPnatPN8fjSQQM1qztzQ6V vmDHRwYw+Ktg4PoPYPBXwcD1H8Dgr4KB6z+AwV8FA92WAAZ/QwCDvwpGMgAM/ioYyQAw+KtgJAPI 4G8gg7+BDP4GMvgbyOBvIIO/gQz+BjL4G8jgbyDjtYGM1wYyXhvIeG0g47WBjNcGMl4byHhtIOO1 gYzXBjJeG8h4bSDjtYGM1wauSIaBkQzgimQYGMeA5MF03UTGjxMZP05k/DiR8eNExo+TB4tkKBjH gERGthMZ2U5kZDuRkW0FIxkAZnInMuaeyJh7ImPuiYy5JzLmnsiYeyJj7omMuScy5p7ImLuCkQwA A/iJDOAnMoCfyAB+IgP4iQzgJzKAn8gAfiID+AoGLtoAplwnMuqeyKh7IqPuiYy6JzLqnsioeyKj 7omMuicyUJ7IQHkiA+WJDJQnMlCeyEB5IgPliQyUJzJQnshAeSID5YmMbScytp3I2HYiY9uJjG2X AB4RFYxbtCWApzoF43ZaBeMWrYJxi1bBuHWmYOTSAI87JYDHHQUjlwZ4QlEwbgtSMM5uKhi5zsAT ioKRWxB43CkRPO4oGLhoI3jcUTCQARE87igYyIAIHncUDGRABI87CkYyADw7KRjJAPDspGAkA8Cz k4KRDADPTgpGMgA8OykYyQDw7KRgJAPAg5iCkQwAD2IKRjKAPIhFMMlIwchFCyYZKRi5aMEkIwUj Fy2YZKRg5KIFk4wUjGQAmGSkYBwDhNyCFIz7AYTcgoTcgoTcgoTcgoTcgoQkupBEF5LoQhJdSKIL S3QwAVDBOOukYJx1UjBy0XJdsgyMXLRglywFIxdtJBdtIjfHRDIALLOsYCQDwDLLCkYyACyzrGAk A8CazQpGMgCs2axgJAPAms0KRjKgnQT+4frm5tvXu8P7z9cffjksh+YNWQVJv/mLBwy7YvvwF7+5 uj68e7xr++n65tXF3fu/smc2H/p6c/3+8/HL4d8u735+9sSH6yuroHJrA3s1nIfR3N/6/fD5eHFz /Pj6mT2zRbISTExXMJKVYGK6RDAxXcFIVoKJ6QpGshJMTFcw0i6BiekKRjIAzDpQMJIBYAqDgpEM AFMYFIxkAJiYrmAkA8DkCgXDGBAdKPkZGMYABWtLfqNehoGEaS/j4a82vIyHh+a8jIe/6XsZD8/s mS1s7RsYtvYNDFv7BkaufU7sMzBy7XNin4Fhu7+BYbu/gZHrjAtBGxj5a3IhaAMjf01OBTMwzJYb GLmfccFxAyP3My44bmAkA7jguIJxV+0NjGQAF2k3MJIBXKTdwEgGcJF2AyMZwEXaDYxkABdpNzCS AVyk3cBIBnCRdgMjGcBF2g2MZAAXaTcwkgFcpN3ASAZwkXYDIxnAlVsxMJIBXFTbwEgGcFFtAyMZ wEW1DYxkABfVNjCSAVxU28BIBnBRbQMjGcBFtQ2MZAAX1TYwkgFcVNvASAZwUW0DIxnARbUNjGQA V27FwEgGcPcPDYxkAFduxcBIBnCXGQ2MZAB3mdHASAZwlxkNDGRA4i4zGhjIgMRdZjQwcNEm7v6h gYGLNnH3Dw0MXLSJFCMTd//QwMhFy90/NDBw206kJJlISTKRkmQiJclESpKJlCQTKUkmUpJMpCSZ uPuHBkYygBRLE3eTyMBIBpAybiJl3ETKuImUcRMp4yZSxk2kjJtAGTeQIfxAhvADGcIPZAg/kCH8 QIbwAxnCD2QIP5Ah/ECG8AMZwg9kCD+QIfxAhvADGcIPZAg/kCH8QIbwAxnCD2QIP5Ah/ECG8AMZ wg9kCD+QIfxAxrYDGdsOZGw7kLHtQMa2AxnbDmRsO5Cx7UDGtgMZ2w5kbDuQse1AxrYDGdsOZGw7 kLHtQMa2AxnbDmRsW8FABpCB8kAGygMZKA9koDyQgfJABsoDGY4OZDg6kJG9QEb2AhnZC2RkL5CR vUBG9gIZ2QtkZC+Qkb1ARvYCGYwLaDAugXcqFIxctOCdCgUjFy14p0LByEUL3qlQMHLbBu9UKBjJ APBOhYKRDADvVCgYyQDwToWCkQwA71QoGMkA8E6FgpEMIAWZRAoyiRRkEinIJFKQSaQgk0hBJpGC TCIFmUQKMokUZBIpyCRSkEmkIJNIQSaRgkwiBZlECjKJFGQSKcgkUkNJpIaSSNkjgTcXFIxcZ+DN hUQG4xIZjEtkMC6RwbhEBuMSmbWayKzVRIYJExkmTGTWaiKzVhOZtZrIrNVEZq0mMms1dbJWH0o7 /fDu3Q+Hi6dSUtefPhlq8IdmUSkFdYeb46fjzfHqw/H28OnmeDw9EKL3PpoO91h16r7E0+O/vfr2 5f3R/stjWSl97ffXvXv3fUTL4pfl3Zevn2/Pjazkum9o9w9I9jI3NH2fjW3P1JMUB0PkiQyRJzJ0 mcjQZSJDl4kMXSYydJnI0GUiQ5eJDF0mMnSZyNBlIkOXiQxdJjJ0mcjQZSJDl4kMXSYydJnI0GUi Q5eJDF0mMnSZyNBlIkOXiQxdJjJ0mcjQZSJDl4kMXSYydJnI0GUiQ5epE7p8dJH/8e9/9//++7/7 53/5wTzW25+vb+4+Xd98eVWjNVUfG+5wXZJJ2LU+r8dqJWKPHw/nXtIYqr5gxwdW0putpDdbwbSK VMG0CgUDKV7BtAoFAylewRwNBSPXGXnQqeRBp5IHnUoedCp50KnkQaeSB51KHnQqedCp5NmkkmeT Sp5NKnk2qeTZpJJnk0qeACp5AqjkCaCSJ4BKOu2VdNor6bRX0mmvpNNeSae9kk57JZ32CuYbKBi5 OYL5BqmC+QYKRjIAzDdQMJIBYL6BgpEMAC+AKhjJADB5QcFIBoCZEApGMgDMhFAwkgHgPVcFIxkA 3nNVMI4BhQxEFzIQXchAdCED0YUMRBcyEF3IQHQhA9GFDEQXMhBdyEB0IQPRhQxEFzIQXchAdCFz aAuZQ1vIHNpC5tAWMoe2kDm0hcyhLWQObSFzaBWMZADo0xYyIVfBSAaAPm0hs3sLmd1byOxeBSMZ APq0CkYyAPVpwdotCkYyAKzdomAkA8DaLQpGMgCs3aJgJAPA2i0KRjIArN2iYCADMli7RcFABmSw douCgQzIYO0WBQMZkMHrIgoGMiCD10UUjGQAeF1EwUgGgNdFFIxkAHhdRMFIBoDXRRSMZAB4XUTB SAaARc4VjGQAeJtCwUgGgKWQFIxkAJgZp2AkA8BSSCWDOXslgzl7CkYyAMzZUzCSAWDOnoKRDABz 9hSMZACYs6dgJAPAnD0FIxkA5uwpGMkAMGdPwUgGgAmACkYyAEwAVDCSAWACoIKRDCA14UxqwpnU hDOpCWdSE86kJpxJTTiTmnAmNeFMasKZ1IQzqQlnUhPOpCacSU04k5pwJjXhTGrCmdSEM6kJZ1IT zqQmnElNOJOacCY14UxqwpnUhDOpCWdSE86kJpxJTTiTmnAmNeFMasKZ1IQzqQlnUhPOpCacSU04 k5pwJjXhTGrCmdSEM6kJZ1ITzqQmnElNOJOacCE14UJqwoXUhAupCRdSEy6kJlxITbiQmnAhNeFC asKF1IQLqQkXUhMupCZcSE24kJpwITXhQmrChdSEC6kJF1ITLqQmXEhNuJCacCE14UJqwoXUhAup CRdSEy6kJlxITbiQmnAhNeFCasKF1IQLqQkXUhMupCZcSE24kJpwITXhQmrChdSEC6kJF1ITLqQm XEhNuJCacCE14UJqwoXUhAupCRdSEy6kJlxITbiQmnAhNeFCasKF1IQLqQkXUhMupCZcSE24kJpw ITXhQmrChdSEC6kJF1ITLqQmXEhNuJCacCE14UJqwoXUhAupCRdSEy6kJlxITbiQmnAhNeFCasKF 1IQLqQkXUhMupCZcSE24kJpwITXhQmrChdSEC6kJF1ITLqQmXEhNuJCacCE14UJqwoXUhAupCVdS E66kJlxJTbiSmnAlNeFKasKV1IQrqQlXUhOupCZcSU24kppwJTXhSmrCldSEK6kJV1ITrqQmXElN uJKacCU14UpqwpXUhCupCVdSEyY7aBSyg4aCkQwgNWGyt0che3sUsrdHIXt7FLK3RyF7exSyt0ch e3sUsrdHIXt7FLK3RyF7exSyt0che3sUsrdHIXt7KBjJAFITJhuFFLJRSCEbhRSyUUghG4UoGMkA UhMmW5gUsoVJIVuYFLKFiYKRDCA1YbIfSiH7oRSyH0oh+6EUsh9KIfuhFLIfSiH7oRSyH0oh+6EU sh9KIfuhFLIfSiH7oRSyH0oh+6EUsh9KIfuhFLIfSiH7oRSyH0oh+6EUsh9KIfuhFLIfSiH7oRSy H0pB+6FUUhOupCZcSU24kppwJTXhSmrCldSEK6kJV1ITrqQmXElNuJKasJCasJCasJCasJCasJCa sJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCa sJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCa sJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCasJCa 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 rWAkA8BcbQUjGQDmaisYyQAwV1vBSAaAudoKRjIAzNVWMJIBYK62gpEMAHO1FYxkAJirrWAkA0hN uJKacCU14UpqwpXUhCupCVdSE66kJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiyk JiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiyk JiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiyk JiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiykJiyk JiykJiykJkzeVS7kXeXSuau8B4xkAKkJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJ C6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6kJC6gJ1wXUhBWMY4CCcQxQMI4BCsYx QME4BigYxwAF4xigYBwDFIxkAKgJKxjJAFDGVTBynYHKq4KR6wwUS+sCiqUKRi6Ntlj61BomLO8+ fP56ea5yeu512VH0zdLp9w+K3S6bKp2eV012luDaY+z12JkZ42SHqrxusRN8e4y9DjszY5zsT5VX DXaWENpj7PXXmRnjZHeqvGqvs4TYHGPpddeZGeNkb6qyaq6zhNQeY6+3zswYJztTlbjmTG6PsdeP d2aMk32pSl5zprTH2OvGOzPGya5URdacqc0x1l4v3pkxTraWqG7NGWmPsdeJd2aMkx2p6qoR7xLb dqb2+vBOjDFN2pm6asO7xLadqb0uvDNjnLQzddWEd4ltOyO9HrwzY5y0M7JqwbvEtp2RXgfemTFO 2hlZNeBdYtvOSK//7swYJ+2M5DVn2nZGet13Z8Y4aWekrjnTtjNu6TXfnRnkpKGxF69G2bY0bul1 CJoZ5aSpsRevRtnex93Sa747M8pJY2MvftV8tz3KXvPdmVFOmht78auWl81Rul7z3YlR5kmDYy9e jbK9mzvXa747M8pJk2MvXo2yvZ8712u+OzPKSaNjL16Nsr2jO9drvjszykmzYy9ejbK9pzvfa747 M8pJw2MvXo2ysxN5KCyQJ02PvfjlKHNnJ/JQYCDP2h6/jgzkzk7kodBAnrU9fh0byB2Oeyg4kGdt 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 +0TeQ1GDMntJx69zDXo3sjwUNSiTtsde/NLb6JwovIeiBmXW9vh1rkHntqX3UNSgzNoev8416NzV 8QGKGpRZ2xPWUYPOzSxdHRB7Zm1PWOca9O5cBihqUGZtT3h1+6A3SihqUGZtT1hFDZaOWuojFDUo 85dDV+ee2uF4hKIGZdb2xFXUYKm9e7ZQ1KDO2p4Y1zd32nF1H6GoQZ21PXGda+A63kaEogZ11vbE da6B73A8QVGDOmt70vouQuz84gmKGswWJLAXr3b1ju1JUNRgtiSBvXg1ys55PEFRg9miBPbi1brs 7OoZihpMlyXI66hBpwaFz1DUYLowQV5HDXq3/jMUNZgvTbCOGnTu/fsMRQ2mixPkddTAdbzgAkUN ZssT2ItXUdbOTlSgqMFsgQJ78WqUHY4XKGowW6LAXrz6xXujhKIGs0UK7MWrUXY8twpFDWbLFNiL V6Ps7JcVihrMFiqwF69UqV6VFChqMFuqwF78UpXqRawrFDWYLVZgL16NsrMTCRQ1mC1XYC9+Ocpe LFiYqIGbLVhgL16NsnOGFCZq4GZLFtiLV6Ps7JfCRA3cbNECe/FqlO39MixM1MDNli2wF69G2d4v w8JEDdxs4QJ78WqU7f0yLEzUwM2WLrAXr0bZqSu1MFEDN1u8wF68GmU7ahAWJmrgZssX2ItXo+zU bXJM1MDNFjCwF69G2anSxZQxzG62hEF4rGO4p3AjWdOTbGXmyFZmDmxlVsm29pVsa1/JtvaVbGtf ybb2lWxrX8m29pVsa1/JtvaVbGtfybb2lWxrX8m29pVsa1/JtvaVbGtfybb2lWxrX8m29pVsa1/J tvaVbGtfybb2lWxrX8m29pVsa1/JtvaVbGtfybb2lWxrX8m29pVsa1/JtvaVbGtfF7AhRSXb2ley rX0l29pXsq19JdvaV7KtfSXb2leyrX0l29pXsq19JdvaV7KtfSXb2leyrX0l29pXsq19JdvaV7Kt fSXb2leyrX0l29pXsq19JdvaV7KtfSXb2leyrX0l29pXsq19JdvaV7KtfSXb2leyrX0l29pXsq19 JdvaV7KtfSXb2leyrX0l29pXB7a1r2Rb+0q2ta9kW/tKtrVXMJIBjmSAIxngSAY4kgGOZIAjGeBI BjiSAZ5kgCcZ4EkGeJIBnmSAJxngSQZ4kgGeZIAnGRBIBgSSAaQm7EhN2JGasCM1YUdqwo7UhB2p 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 kqp2JVXtSqralVS1K6lqV1LVrqSqXUlVu5KqdiVV7Uqq2pVUtSupaldS1a6kql1JVbuSqnYlVe1K qtqVVLUrqWpXUtWupKpdSVW7kqp2JVXtSqralVS1K6lqV1LVrqSqXUlVu5KqdiVV7Uqq2pVUtSup aldS1a6kql1JVbuSqnYlVe1KqtqVVLUrqWpXUtWupKpdSVW7kqp2JVXtSqralVS1K6lqV1LVrqSq XUlVu5KqdiVV7Uqq2pVUtSupaldS1a6kql1JVbuSV84rqQlXUhOupCZcSU24kppwJTXhSmrCldSE K6kJV1ITrqQmXElNuJKacCU14UpqwpXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXU hIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXU hIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXU hIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXU hIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXU hIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhIXUhAXUhMMCasIKxjFAwTgGKBjHAAXj GKBgHAMUjGOAgnEMUDCOAQpGMgDUhBWMZACoCSsYyQBQE1YwkgGgJqxgJANATVjBSAaAmrCCkQwA NWEFIxkAasIKRjIA1IQVjGQAqAkrGMkAUBNWMJIBoCasYCQDQE1YwUgGgJqwgpEMADVhBSMZAGrC CkYyANSEFYxkAKgJKxjJAFATVjCSAaAmHBZQEw4LqAkrGMkAUBNWMJIBoCasYCQDQE1YwUgGgJqw gpEMADVhBSMZAGrCCkYyANSEFYxkAKgJKxjJAFATVjCSAaAmrGAkA0BNWMFIBoCasIKRDAA1YQUj GQBqwgpGMgDUhBWMZACoCSsYyQBQE1YwkgGgJqxgJANATVjBSAaAmrCCkQwANWEFIxkAasIKRjIA 1IQVjGQAqAkrGMgAR2rCjtSEHakJO1ITdqQm7EhN2JGasCM1YUdqwo7UhB2pCTtSE3akJuxITdiR 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 0hkYyQDwuKNgJAO4ex4GRjKAu+dhYCQDwCOigpEM4GRSAyMZwN3zMDCSAdw9DwMjGcDd81AwTlo2 MHKdcZ0YDIxcZ1xZOgMj1xknxxsYus7InZbT9g2MZACn7RsYyQBO2zcwkgFcWToDIxnA9dUwMJAB juurYWAgA9wCMsBxVfIMrMmAU8m/dz8cLu4O7z9ff/jlsNhNd0MNvpk6YqC5VRwiRO+9PiS/+YuH l97fXX/8t1ffvrw/2n95zFPR135/3bt3+z4PXPkOFOMVjFz5XNaNgZErn0vhMTBy5XMpPAYG7v2O S+ExMJIBYAaJgpEMaF//fMM+5v3GPqYm//8/+xiYbaNg5MonxVFHiqOOK2RnYOTKJ5VWRyqtjlRa Ham0OlJpdaTS6kClNVbQh1Uw7tdUMO7XVDDu11Qw7tdUMPTX5PYzBeP2MwXj9jMF4/azWEFfVsFI BoC+rIKRDAB9WQUjGQD6smTV4khWLY5k1WL9hytlYmAkA7i6KJGsp2xgJAPaPu105wVDyxudF3LR U5q3y1kP79zdeOH+Zbs+mCQW6CqTNZ/1HzC5giwFGslSoJGs3hnJ6p2xW3BzBxi4f0hbo3hk4BKW ZTkXQsgudwgpEhoxhBBqiCFLcXMxBH3friCCDgVc/gKqHQrWXP47NlyRsrHh3odvTObt3JEc3XH1 bbu+GOSogCpKWsATqIJxhFcwzvtQMG73UDCOWQrGMUvBOMOiYJyboGAcAxSMZAB4AlUwkgHgCVTB SAaAJ1AFIxkAnkAVjGQAeAJVMJIB4AlUwUgGgCdQBSMZAJ5AE3nlLJFXzhSMZAB4VEzk/bVE3l9L 5P21RN5fS+T9tUTeX0vk/bVE3l9L5P21RN5fS+T9tUTeX0vk/bVE3l9L5P21RN5fS+T9tUTeX0vk /bVE3l9L5P21RN5fS+T9tUTeX0vk/bVE3l9L5P21RN5fS+T9tUTeX0vk/bVE3l9L5P21RN7FSuRd rEReUkrkJaVEXlJK5CWlRF5SSuQlpUReUkrkJSUFI4nOVeY0MJIB4PWpRF6fSuT1qURen0rk9alE Xp9K5PWpRF6fSuT1qURen0rk9alEXp9K5PWpRF6fSuT1qURen0rk9alEXp9K5PWpRF6fSuT1qURe n0qd61N7wEAGOFL4I28+JfLmUyJvPiXy5lMibz4l8rJSIi8rpc5lpc/XHy4+v3g615Sft7W9Pdxd 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 rcbWtgupvJELk3ZB37caW9su5OVtXEiTdkHftxpb2y5k/zYupEm7oO/b0+cuke3sE9nOPpWebH+2 pOn9nwyVNA3e7sHExT1UNJXq9SQ3UND0YVA2kFZB04cnHgbdKmj68MyeCWmfqpsTIkMTEkvxruqk PEzIwwgHJ0Q2J0QGJkT2TAiYPqFg5NoFL2EXMrFDwZqxsfVzui7s3z789A9LxdbCw073uBUFsaS8 XGL68bQVLYMLR/qlgR+e2Fw4Ml8a2P6qGR5ZPzc2CVUd+eqcn5+EtDkJaWAS5nsn2l+1wzqt7UTy 0HbiXKnV6xa7POwncdG9dnRG8uaM5IEZybtmpB2bas5IGZuRJftco7hHk+PU6Ro1OTqqrRkpAzNS Oh8xZjal1CXF6tLpG9QjGv2GTbMpA2ZTdpnNdlrW+rkhsqtpLEsIqc6TfdNUyoCplD2msuPmrZ97 OQnXfzrefPp8/W+3+j8/rAPLDQwpemuVdbz6eP/fY8kxT5sAG1R/QuyJrQk5oTz8j3f//vV4WNZP uAEUt4niB1D8JkoYQAmbKNum0Z7ZQtm2LfbMFsr2fmzPbKFs72H2zBbK9i5iz2yhbNPQntlAcQNr 122uXTewdt3m2nUDa9dtrl03sHbd5tp1A2vXba5dN7B23ebadQNr122uXTewdt3m2nUDa9dtrl03 sHbd5tr1A2tXn7m9/I+jbvqHWzWQx7v1v3eH//GvFfkvYw3l8P7f7463fzWAurmW/cBa9ptr2Q+s Zb+5lv3AWvaba9kPrGW/uZb9wFr2m2vZD6xlv7mWNxtePjyzhTKwlv3mWg4Dazls7sNhYB8Om2s3 DKzdsLl2w8DaDZtrNwys3bC5dsPA2g2bazcMrN2wuXbDwNoNm2s3DKzdsLl2w8DaDZtrNw6s3bi5 duPA2o2bazcOrN24uXbjwNqNm2s3DqzduLl248DajZtrNw6s3bi5duPA2o2bazcOrN24uXbjwNqN m2s3DazdtLl208Da1Wemj8TiQbFCwbiAr4JxAV8F45IhFYzLK1MwLhVMwbhUMAXj8hfFg/eYFGwr r+zdu7N5Kh2JWUH9cznSXn/89fL2Pv7z+KD+VlJzmE5B8rtUSR0RyQDwUpSCkQwAL0UpGEkn8FKU gpF0AitIKhhpA8CijwpGLlqw6KOCkYsWLPqoYOSiBYs+igeLPioYuWjBoo8KRjIALPqoYCQDwKKP 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 k7FMxOWhOORcJqINaCPS4QdcLD8X7jlVQAGT26OfvmepfzI2s04PnEuYvEpnA9qa2QGvye9RHeN8 45M42PgkVZNhfZxL2I2bfU/iQN+TuKvvSZzpe/J9ZbYnw9v/hWfVh6w6Ra3fS74ty2aZ1Kf135qU pyfak/L0zB7u7VghY7cfUvGuen16coVsSbNxoBdM3NULJs70gvk+f526vRLzswmpxVt19u9Z0Yvf JZ22W7QMrrY2BZ+e2F5tcxQ8/dX0XZs42F5GV1usIc+avc3uMnGgu0zc1V0mzneXiYPdZWxzLlX8 XLH0uNlcJg40l4m7msvE+eYycbC5TJIcdD9wsytjUw4e6C0Td/WWifO9ZeJgb5m81GXRTWjSbG+2 lokDrWXirtYycb61TBxsLaNbUiixptmVsSkPD3SWibs6y8T5zjJxsLNMdlksyXLudl7cbCwTBxrL xF2NZWKnscwOsHlHaLAviz5Zgw+zjtBmW5Y40JYl7mrLEufbssTBtiy5uuJcmebcplc40JXlhLIt rcXpqOgAyHbA6RzIdORxAGTfSKajcAMg+0ZChODWIPtGMq1VDoDsG8l0xGwAZN9IphXBAZB9I5kW 8QZA9o2EyOpZg+wbCSE9rUF2jSQRe+waZN9IiD12DbJvJMQeuwbZNxJij12D7BsJsceuQfaNhNhj 1yADMpRbLl7hpE3htittpAGFNJ1XSP1H/1pASl2FdN4DVbzhdIU0Lla6/FqtTANqZWqolVZy6PVU TJM4vJYrX6HMilcKMPBZvpF6dG7B9cm8fvjPms2i+L2f/OLu7ubhmPCY75vymfnR7/ly8etfu+2D Q3qUUl/N06f7/zuem63tDecvr44/Xdxd/un4V4fby/84Hn5brChM1dOiqCeWlxCWc+tiO9CSzkut PoXXqRtpXmrNr/OlXqH0F0f6My+OZsTo0/W3q1eT9RgsshPo3fXh/fFwoR9x8fm3d5dflF263QxM +J5gTmqLwPYf7S//43hz/T253daIC5JcDN7l+0OyPWNjtaH+Z33u/pn1S17+MvqJhnqeJ965M0TJ E0Q5m2OXJL7OZUx+2j1/oJucMz/bXvrGbrmtwaZdGmxqa7DNX9nnpQ7/vnXi93WK+/rT68TvezbL LYp7f+Y36R019kzk2O1RfW7kVkiJJWcJSyk1+2dXSPV/3m4b8zSiflQqDWiVaZdWmdpa5dlfPp6x gGEZ/+HDMkCiAa0sPSpur7h9xqiEt7pAA3JVmpSrHoXMdpm8vzn9x3uY10NqOi7nbNNJ4nqLbdol QaV5CSoNSlAuRl+jtfw86eB5ERcGKbepRKUBJeqEstrG5GN+nbaZwpaD9MqPCy7VkqQUn6pkXWHl 9TWHNKARpV0aUZrXiNKgRuRikuzqbAnHtCkSpQGRKO0SiVJHJGrOxmDd/ZjrshQ/WY3bRrQ1GwPO SNjljMyrXGlQ5XrYGVNyczJX2pS50oDMlXbJXGle5kqDMpeLloERwzKnc6VNnSsN6Fz2zI7ZiNOl X/VPBmdDgivq1U7ORtyqUGFPbM5G3JNmleJ06Vf9k7HZSItLOdQ0V3/aRrQ1GwP+V9yTq5TidK6S /snobIhUE6onZ2MrWcme2J6NPclKKU4nK+mfDM6Gq0GXRpornWoj2pqN7Wwle2bPbMy7inHQVUw+ F/We8ixTNp3EOOAkxj3pSilOpyvpnwzORkiuOD+ZomMj2pqNAV807vJF47wvGgd9UV2tSXezaaZs +qJxwBeNu3zROO+LxkFfVB2vKuG+AtLUbGz6onHAF427fNE474vGQV/0IXqe/Vz3DxvR1mwM+KJx ly8a533ROOiLpqxPL7PF1W1EW7Mx4IvGXb5omvdF06AvmkpZkixlLjk6bfajTwP96NOufvSp3Y++ PRujvmhVO1fKZHZ02mxMnwYa06ddjelTuzF9ezZGfVHdQkP2eZIpmx3q00CH+rSrQ31qd6hvz8ag L5oX731ykz2U0mar+jTQqj7talWf2q3q27Mx6Itmt2QXZjvRpc327GmgPXva1Z49tduzt2dj0BfN ThZrbjrpfW32aU8DfdrTrj7tqd2nvT0bg75o9lYD0k22PUqbDdvTQMP2tKthe2o3bG/Pxmg/0qA2 VpxMnto2O7engc7taVfn9tTu3N6ejdF+pDG6IpJn/Y1NX3SghXva1cI9zbdwT4Mt3O/bdKfs4ixT Nn3RgRbuaVcL9zTfwj0Nt3DXI0rMqcx17k2bLdzTQAv3tKuFe5pv4Z6GW7hnKT6UWc98s4V7Gmjh bs/smY15XzQP+qK5FKuu7Cd90bzpi+YBX3RXZ/k031k+jXaWz7WkupRZ5XGzs3wa6CyfdnWWT/Od 5dNgZ3mXRdlby2SDrbTZWj4NtJZPu1rLp/nW8mm4tfwS/JLTZGv5tNlaPg20lk+7WsunTmv55mwM +qLFBRd9lclTW970RfOAL5p3+aJ53hfNg75o8UvJOU/blE1fNA/4onmXL5rnfdE86IsWX12KMUxG e/KmL5oHfNG8yxfN875oHvRFrVFzKLlOnlPypi+aB3zRvMsXLfO+aBn0Re1xiX6yK7KNaGM2yoAv Wnb5omXeFy2DvqiJod7JbDZL2fRFy4AvWnb5omXeFy2DvqjlxLookx3PbERbszHgi5ZdvmiZ90XL oC9asuh5Xtyk91U2fdEy4IuWXb5omfdFy6AvWkq1hIXZc0rZ9EXLgC9advmiZd4XLaO+qD4sFg6c nI1NX7QM+KJlly9a5n3RMuqLSnI5uDDpi5ZNX7QM+KJlly/aKUbYnI1BX7QuISUX66Qv2ikP9/TE 9mzs8kXny8OlXkW0F7PhnESrHjs5G5u+aLd82dMze2Zj3hctg75o9bo4cvGTnnnZ9EXLgC9advmi 7TsQzdmog75o9dU6nc5Ge+qmL1oHfNG6yxet875oHfRF1b5axEcmo8R10xetA76oPtP+gEH3cZEl RTfL9LrpPdYB77Hu8h7rvPdYx7xHX9QE5Bhmvce66T3WAe+x7vAeJXQ8hB1gXNUuBWvbpx1g7e19 HqyzO+4Aa28uO8Da58QdYG2i7ABrn1J2gLWd/B1gJAMqyYBKMqDd8X4HWLtz/B4wkgFCMqDdhXwP GMmAdgvuPWAkA9otofeAkQxotyieB+u0+t0DBjKg03p2DxjIgE4r1D1gIAM6rTn3gIEMsFaMIBjJ AEcywJEMcCQDHMkARzLAkQxwJAPaTcb2gJEMcCQDPMmAdqWzPWAkA9oFufaAkQxoV4PaA0YyoNOq ZgcYyYBOq5R5sE5XjR1gJAM6HRh2gJEM6JRf2QFGMqBTXWQHGMmATm2LHWAkAzqVFXaAkQzo3Ovf AUYyoHOrfAcYyYDOneYdYCQDOjdqd4CRDOjc59wBRjKgc5twBxjJgM5dth1gJAM6N6l2gJEM6Nzj 2QFGMqBzi2QHGMmAzh2GHWAkAzoZ9DvASAZ08rd3gJEM6GQP7wAjGdDJXd0BRjKgkzm5A4xkQCdv bwcYyQBSE46kJhxJTTiSmnAkNeFIasKR1IQjqQlHUhOOpCYcSU04kppwJDXhSGrCkdSEI6kJR1IT jqQmHElNOJKacCQ14UhqwpHUhCOpCSdSE06kJpxITTiRmnAiNeFEasKJ1IQTqQknUhNOpCacSE04 kZpwIjXhRGrCidSEE6kJJ1ITTqQmnEhNOJGacCI14U73qz1gJANITTiRmnCnQ9AeMJIBpCbcaT2z B4xkAKkJJ1ITTqQm3On2sQeMZACpCfc6TuwAIxlAasK9dgHzYKQm3CtWvwOMXLSkjNurrb0DjFy0 pIzbK4y8A4xctKSM26tquwOM3LZJGbdXknQHGMkAUsbt1ZPcAUYygJRxe8UAd4CRDCBl3F4ltx1g JANIGbdXhmsHGMaA4sAUWAPD5szAsDkzMHTOsF3DwLBdQ8G4446BYbuGgWG7hoFhu4aBkQzgjjsG Ri5a7oRiYOSi5U4oBkYuWi5r1cDIdcadUAyM3Gm5E4qBkYuWO6EoGHdCMTBy0XInFAMjd1ruhGJg JAO4E4qBkQzgDhUKxh0qDIxctNyhwsDIRcsdKgxssiDc/Z+M1b5xS02xLmWm+M3DiGwUrXIvD088 jLhV7uXhmT2zQRKFy0c1MJJ1XD6qgZGs4/JRDYxkHZePamCkqeDyUQ2MZACXj6pgXAqpgZGLlksh NTBy0XIppAZGLtp2CqmaBX36h3f/qLv61d0Ph4u7w/vP1x9+OSxmYww6VrMJTeRyuDl+Ouoffzje 3o/h+OvlrVmbFw8G22v+4mEE9ybk8d8+tLe3FzwMRF///bXv3n0f3j/8r3/zh3/6b+8urz6dG2Hx zAjD3AiLX4/w/9UaoWRmhHFuhJKfjfBvr68M8p+Of7r+cHF3eX317vPt2R/c+YUZbZobrb732XD/ n1eXd3/4X4//3vndXYJ++Dw50ORfz+uyLO8+HG/OjrNGZpxlcpw1nhuna43TO2iZ1rlx6nufj/Mf /9l+e51PG+mHy7MjpTYlmRzpi13py4cvn979+uXz2RFWhkRqh+dGWJfXv/n/cnH7s83m3fuzYw0L sz7VzE+NVd/bGuvSHGtg1midNEf6XhvrtO1NYBKegXGeVAKT8AyM86QSmIRnYJwnlcAkPAPj3P8E JuEZGHcATmASnoGRDABVqQQm4RkYyQBQlUpgEp6BkQwAJa4EJuFZV12SAaDEpWAkA7iMPgMjGQBK XAlMwjMwctGCElcCk/AMjFy0bYnr0ZdUBzLLuy9fP9+ejRfkzukhWdvyER/yvtHYXMAgPz896BjL 0h6jdM62M2OcPOHoe1djdM0x1t55cWKMZfKMU1+cF22Mvj3G2DmHzYxx8myj712NMbTHmDvnr5kx Tp5p9L2rMcb2GCvDmdkgm753NcbUHKM4hjPTYTa35kxuj7F3fp0Z42RwTcKaM6U9xgxxZjKupu9d jbG2x9iLqc2McTKmJnXNmbadccsCkWbS0NiLX46yti2NWwJEm0lTYy9ejbJta9ySGOLMBtTsxatR tq2NW3phv5lRTpobe/FqlG1741wv4DczykmDYy9ejbJtcZzzDHvqpMmxF69G2bY5ritCzIxy0ui4 lyqEjbJtdZwrEHtmNR198WqUbbvj/AKxZ1bQ0RevRtm2PM57iD2zco6+eDXKju3pSiQzo5y1PS81 Eh2ldGyP72m3M6OctT2+rNgjHdvje/rtxChl1vZ4WbFHOrYn9HTbmVHO2p7gV+yRju0JkWGPzNoe ffFqlB3bE6AQgczanrCOEUjH9gQoSCCztiesowTSsT0RChPIrO2J6ziBdGxPhAIFMmt74jpSIB3b E6FQgczanriOFSydXT1CwQKZtT1xFS2ovVEmKFwgs7YnreIFdenYnsQEDPIya3vSKmJQl47tSUzI IC+ztietYgZ16diexAQN8jJre9IqalCXju3JTNQgL7O2Jy9r9nRsT2aiBnmZtT05rNnTsT2ZiRrk Zdb25LRmT8f2ZCZqkJdZ25Prmj0d21OYqEFeZm1PWdbs6Zx7ChM1UC7MjnIVNaiuY3sKEzXIy6zt KauoQXUd21OYqEF2s7anrKIG1XVsT2WiBtnN2p66ihpU17E9lYkaZDdre+oqalBdx/ZUJmqQ3azt qXHNno7tqUzUILtZ21PLmj0d21OZqEF2s7anypo9HdsjTNQgu1nbI37Nno7tESZqkN2s7ZG4Zk/H 9ggTNchu1vbIKmpQfcf2CBM1yG7W9sgqalB92/b4hYkaZD+bQL2sogbVt22PX5ioQfaTtsdevBpl 2/b4hYkaZD9pe+zFq1G2bY9fmKhB9pO2x168GmXb9njHRA2yn7Q99uLVKNu2xzsoauAnbY+9eDXK tu3xDooa+EnbYy9ejbJte3z3+s7MKCdtj3frqIFv2x7voaiBn72849dRg9C2Pd5DUQM/e3HHr6MG oWN7PBQ1CLO2x6+jBqFje7pXjGZGOWt7/DpqEDq2p3u5aGaUs7YnrKMGoWN7AhQ1CLO2J6yjBqFj ewIUNQiztiesowahY3sCFDUIs7YnrKMGoWN7IhQ1CLO2J66jBqFjeyIUNQiztieuowahY3siFDUI s7YnrqMGsWN7IhQ1CNOXRtdRg9ixPRGKGsRZ2xPXUYPYsT0JihrEWduT1lGD2LE9CYoaxFnbk9ZR g9ixPQmKGsRZ25PWUYPYsT0JihrEWduTVlEDy5BojjJDUYM4a3vyKmoQcsf2ZChqEGdtT15FDULn lozPUNQgztqevIoahM49GZ+hqEGctT15FTUInZsyvkBRgzhre8oqahA6d2V8gaIGadb2lFXUIHRu y/gCRQ3SrO0pq6hB6NyX8QWKGqRZ21Pqmj2dXb1CUYM0a3vqsmZP50RRoahBmrU9NazZ09nVKxQ1 SLO2p6Y1ezoWskJRgzRre2pds6djewSKGqRZ2yOrqEHo3JzxAkUN0qztkVXUIHRuzniBogZp1vbI KmoQOjdnvEBRgzxre2QVNQidmzNhgaIGebpUzipqEDo3Z8ICRQ3ybJGcZRU1CJ0c67BAUYM8aXvs xatRti1kWKCoQZ60PfbiF6N0nUydsEBRgzxpe+zFq1G2OR66leVmRjlpe4Jb31Do6OPBQVGDPGl7 7MWrTPC2hQwOihrMFjGwF7/8xTs51sFBUYPZMgb24pcc742yW/huYpSzhQyCfxU16I0SihrMljKw F69G2dmJPBQ1mC1mYC9ejbKzE3koajBbzsBevBplx9sIUNRgtqCBvXg1yo4d75bkmxnlrO0J66hB 7tjxAEUNZosa2ItXo2yfdEOAogazZQ3sxatYcPukGyIUNZita2AvXnnBnV88QlGD2boG9uLVKDu/ eISiBrN1DezFq1H2fnEoajBdIjSuowadm9khQVGD6eKg6VXUoOO5JShqMFvXwF68Ovd0vI0ERQ1m 6xrYi1ej7HgbCYoazNY1sBevRtnxNjIUNZita2AvXo2y421kKGowW9fAXryyPZ39MkNRg9m6Bvbi nRWAwb5HCerMGi2NoSy6He8ZQrOYIviZ7RqLrzrlfP+Yw0inHL84PSsUHx8a5cRktzN3DbFZuXGj 9c7bJr9Z4rHVx+dNr2u3jHr4H881BXrbC5FCkachkNVNOz2qmkvSt5ekuWzPl6VbnN1trY/9m3y1 O/ajS8lv/vp+4Afzu+aYLPoKtu5KYD9gAyNrKHP9gA2MLEcLttFKCWyjlRLYRislsI1WSmAbrZTA NlopgW20UgLbaKUEttFKCWyjlRLYRitZTcS2cQht4+CWUn3Jz82DuKo24tE8FP3Xw8YhbBqHMGAc wi7j0FyA3ByDrcpSAluVpYS6H4ydPf0uOxo2it3x/TP/mmI3dEEwjsti9105MLArjGSwK4xksCuM ZLArjGSwK4xksCuMZLArjGSwK4xksCuMZLArjGSwK4xksCuM5E5XmKYt73TpdYuImutntjwkqYss jxEIPfjVUVPe7tb79MS2KZ/b/E9/Ra5xsFeOZLBXjmSwV45ksFeOZLBXjmSwV45ksFeOZLBXjmSw V45ksFeOZLBXjmSwV47Y3RcQjGQA2HhHMth4RzLYeEcy2HhHMth4R3K78c4eMJIBoMYimdFYTmAk AzqyyA4wkgFtXWIHWFt12ANGMqAjAuwAIxkARrslg9FuyWC0WzIY7ZYMRrslg9FuyWC0WzIY7ZYM Rrslg9FuyWC0WzIY7ZYMRrslg9FuyWC0WzIYiZUMRmIlg5FYyaDiKbkdId8DRi5a9MBfyUVb0UVL bttCMkDIRSvkohVy0Qq5aIVctEIuWiEXrYCLtizgoi0LuG2XBWRAWUAGlAVkQFlABpQFZEBZQAaU BWRAWUgGOJIBjmSAIxngSAY4kgGOZEBbpt4DRjKA1KMLqUcXUo8upB5dSD26kHp0IfXoQurRhZSQ CykhF1JCLqTqW0hJspCSZCElyUJKkoWUJAspSRZSkiykJFlISbKQkmThJMnqwHC0gWEMMDCMAQaG McDAMAYYGMYABePC0QaGMcDAMAYYGMkALhxtYCQDuHC0gZEM4MLRBkYygIttGxjJAC62bWAkA7jY toGRDOBi2wZGMoCLbRsYyQAutm1gJAO4QLmBkQzgAuUGRjKAC5QbGMkALlBuYCADoED5KZ8WnDMw 6m5gIJ3AqLuBgXQCo+4GBtIJjLobGEgnMOquYFzU3cBIBnBRdwMjGcBF3Q0MrSVBrjMuhG9gJJ24 EL6BkXTiQvgGRtKJC+EbGEknLoRvYKRB4a6UGRjJAE4PMDCSAdyVMgMjGdC5UrYDjGQAp1QYGMkA TqkwMJIBnFJhYCQDOKXCwEgGcEqFgZEM4C5PGRjJAO7ylIGRDOAuTykYd9/JwMh1xl1RMjBynXFX lAyMXGfcrSIDIzdH7laRgZGbI3eryMDIRUvKuIWUcQsp4xZSxi2k8lpIsbSQYmkh9c1CSpKFlCQL KUkWUpIspCRZSEmykJJkISXJQkqShZQkCylJFjQYRwp/pS38HR7/77eHi5+urg9/fXBzZVmrDjQt gYmQnsCQX/gEhvzCJzBkjzuBIcvlBIbscY9gTFDzBIbscScwZI87gSF73AmMZAAT1DyBkQxggpon MJIBTFDzEYwJap7ASAYwQc0TGMkAJqh5AiMZwAQ1T2AkA5ig5gmMZAAT1DyBkQxggponMJIBTFDz BEYygAlqnsBIBjBBzRMYyQAmQnoCIxnAhFtPYCQDmHDrCYxkABNuPYGRDGBitycwkgFM7PYERjKA id2ewEgGMLHbExjJACZ2ewIjGcBcwTmBkQxgruCcwEgGMFHlExjJACZEfQIjGcDEu09gJAOYePcJ jGQAE+8+gZEMYOLdJzCSAUy8+wRGMoCJd5/ASAYwwfMTGMkAJhJ/AiMZwFzBOYGRDGCu4JzASAYw V3BOYCQDmCs4JzCQAZG5gnMCAxkQmVszJzCQAZG5NXMCAxkQmVszJzCQAZG5NXMCIxnA3Jo5gZEM YG7NnMBIBpCacCQ14UhqwpHUhCOpCUdSE46kJhxJTTiSmnAkNeFIasKR1IQjqQlHUhOOpCYcSU04 kppwJDXhSGrCkdSEI6kJR1ITjqQmHElNOJKacCQ14UhqwpHUhCOpCUdSE46kJhxJTTiSmnAkNeFI asKR1IQjqQlHUhOOpCYcSU04kppwJDXhSGrCkdSEI6kJR1ITjqQmHDua8Kumj9//pN30cXlq92ip 3aUoKx57N/v7MmcbDR+fRmUjOdfw8emJh1Gfa/j49MyeGSFp3BG2m9Pb6Y/9fHqtrrWPcppeuzgc R6e33Rr76Ynt6Z1rjX36K3IvItX5SKrzsaPON3/40v7hk3veSFWPtWGp+oM//vRil98Gf/qy+dOX gZ++7JoTckvtJBk0J1iGmOWT+KW6xT82qhWproxOr2xOrwxMr+yZETJTIpKZEpHMlIhkpkQkMyUi mSkRyUyJSGZKRDJTIpKZEpHMlIhkpkQkMyViJ1OitfXVMafCOxck6P9zsix+WfT0Nrb31U2vog54 FXWXV0Hme0Qy3yOS+R6RzPeIZL5HJPM9IpnvEcl8j0jme0Qy3yOS+R6RzPeIZL5HJPM9IpnvEcl8 j0TmeyQy3yOR+R6JzPdIZL5HIvM9Epnvkch8j0TmeyQy3yOR+R6JzPdIZL5HIvM9Epnvkch8j0Tm eyQy3yOR+R6JzPdIZL5HIvM9Epnvkch8j0TmeyQy3yOR+R6pk+/ROAHqnwydAEtdXHSSl4cDYEoW Vho6/9mg+uc/e2Lr/GfP7JmQNoubE1KHJqRWcRJqejwReyuSPTgfdXM+6sB81F3zQW5EZNpNItNu Epl2k8i0m0Sm3SQy7SaRaTeJTLtJZNpNItNuEpl2k8i0m0Sm3SQy7SaRaTeJTLtJZNpNItNuEpl2 k8i0m0Sm3SQy7SaRaTeJTLtJZNpNItNuEpl2k8i0m0Sm3SQy7SaRaTeJLMWQyIyVRJZiSGSyRyKT PRKZ7JHIUgyJzJJIZCmGRCYYpE6CQevEVsYSz7x68qHWujyeYa2z2tiJrWylndkTmye2siftLJE5 EonMkUhkjkQicyQSmSORyByJROZIJDJHIpE5EonMkUhkjkQiq0kkMrsgkdkFicwuSGR2QSKzCxKZ XZDI7IJEZhckMrsgkdkFicwuSGR2QSKzCxKZXZDI7IJEZhdkMrsgk9kFmcwuyGR2QSazCzKZXZDJ 7IJMZhdkMrsgk9kFmcwuyGR2QSazCzKZXZDJ7IJMZhdkMrsgk9kFmcwuyJ3sgsaRWf9k8MgcrbVT zo9XHszhGjoy25j6R2Z7YuvIbM/smA8yQSKTCRKZTJDIZIJEJhMkMpkgkckEiUwWxMhkQYxMKvOZ VOYzqcxnUpnPpDKfSWU+k8p8JpX5TCrzmVTmM6nMZ1KZz6Qyn0llPpPKfCaV+Uwq85lU5jOpzGdS mc+kMp9JZT6TynzuKPMtfzX5scvv0evhsnh5zMoLObtBh1UHteGw6hObDqs+s2dCSBaT2QWZzC7I ZHZBJrMLMpldkMnsgkxmF2QyuyCT2QWZzC7IZHZBJrMLMpldkMnsgkxmF2QyuyCT2QWZLF+QSWk+ k9J8JqX5TErzmZTmMynNZ1Kaz6Q0n0lpPpPSfCal+UxK85mU5jMpzWdSms+kNJ9JaT6T0nwmpflM SvOZlOYzKc1nUprPpDSfSWk+k9J8JqX5TErzhZTmCynNF1KaL6Q0X0hpvpDSfCGl+UJK84WU5gsp zRdSmi+kNF9Iab6Q0nwhpflCSvOFlOYLKc0XUpov5MX/QurahdS1C6lrF1LXLqSuXUhdu5C6diF1 7ULq2oXUtQupaxdS1y6krl1IXbuQunYhde1C6tqF1LULqWsXUtcupK5dSF27kLp2IXXtwujaseQg 6h+jv2abTq+U0O/vH8zcq6E6F76XAZdk5Yt3DbJJ0w1l9WnG9ry1yeeWTPu21zUZ39Z83/ZCZB09 DkF2/bDtDAFuhTOJA6fPJPcrsj5A6Sj4LSJL59aq8+6+stB3Nlfnfc05nticBrkn7ZurT09srnCZ u7l6+it0guOuITR/lulfq1Mo2cUQX/5YNUn2IT38WNUvflcic2lnXwz++ntqJpd2msbWUtr3uuZG v70u970Qce5OQ5hbl6chNDd/jjFM5sjpM9OuITT3a/AzkV3m9Jl51xCmd5kd7yBPcWROSyFzWgqZ 01LInJZC5rQUMqelkDkthcxpKWROSyFzWgqZ01LInJZC5rQUMqelkDkthcxpKWROSyFzWgqZ01LI nJZC5rQUMqelkDkthcxpKWjsh8xpKejJGD24kTkthcxpKWROSyFzWgqZ01LInJZC5rRUMqelkjkt lcxpqWROSyVzWiqZ01LJnJZK5rRUMqelkjktlcxpqWROSyVzWiqZ01LJnJZK5rRUMqelkjktlcxp qWROSyVzWiqZ01LJnJZK5rRUMqelkjktlcxpqWROSyVzWiqZ01LJnJZK5rRUMqelkjktlcxpqWRO SyVzWiqZ01LJnJZK5rRUMqelkjktlcxpqWROSyVrNVSyVkMlazVUslZDJWs1VLJWQyVrNVSyVkMl syQqWeegknUOKlnnoJJ1DipZ56CSdQ4qWeegknUOKlnnoJJ1DipZ56CSmnAlNeFKasKV1IQrqQlX UhOupCZcSU24kppwJTXhSmrCldSEK6kJV1ITrqQmXElNuJKacCU14UpqwpXUhCupCVdSE66kJlxJ TbiSmnAlNeFKasKV1IQrqQlXUhOupCZcSU24kppwJTXhSmrCldSEhdSEhdSEhdSEhdSEhdSEhdSE hdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSEhdSE hdSEhdGETxc0SAaQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQ ArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQ ArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQ ArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOQArOgoVVSYBZQ YHYLKDArGMcABeMYoGAcAxSMY4CCcQxQMI4BCsYxQME4BigYyQBQYFYwkgGgwKxgJANAgVnBSAaA ArOCkQwABWYFIxkACswKRjIAFJgVjGQAKDArGMkA8NKxgpEMaEtFx6s7ffqHf/2Xf/7D4v6wvPvX //Y3726Px19+UITD7c/XN3efrm++HJ6AT5A5H26On443x6sPx9vDp5vj8cU7Y1T/5uGN93Uz//jt 6pfjx0P3da3R5x3FEL0Hzz4KxrHee/Dso2Ac6xWMY72CcaxXMI71CsaxXsE41isYx3ofQMdDwcAf IICOh4KBP0AAHQ8FA7egADoePoCOh4KBW1AAHQ8FIxkAOh4KRjIAdDwUjGQAmIymYCQDwGQ0BSMZ ACajKRjJADAZTcFIBoDJaApGMgBMRlMwkgFgMpqCkQwAk9EUjGQAmIymYCQDwGQ0BSMZACajKRjJ ADAZTcGaDLD/+PCsnaUv7g5PDSvOnpVXPSaenjGgq/efrz/8cqv/c4w5Fh+TSCkl+VTK884bp79K p0HdHO0j7q4P7vmh38U/uGencB3cPf5hsZYi9gdhie2zueJvhQHU1f+LhwHcf9bjv7369uX90f7L Y0RA3/v0vnfvHubMZvs/jjfXj11ODreX/3E8+FCrfnD0cv+19szN8eLz3eWX43/W5+6fWY0gvpoC Q536jU9Z/82l/P7LxVfF/3C4/mafcri++Xi8+fHVSB4/1x3+9+vD7eHDfz/874tO9fLff9T/V/+j D0Vfk51zB//ft3qrfAdttkN5emJzdekz699NZ+LucKML4vJOP26eEve/PcCv09w3mf9q4L+9/7en VWPdcGwOHxb248oLNdxL2nFxafGp/nhaf8mXGlPxO4bo2pLe4E+ZNn/KNPBT7miREiNoJhWMM5OK xZlJBePMpIJxlk2/kjNGCsa5YwrGuWMKRq4zMDNawch1BmZGKxjnjikYumg5d0ypSTIAzIxWMJIB YGZ0DmBWnIJxDFAwjgEKxjFAwbhFq2afW7QKxi1aBeMWrYKRixYUcxSMXLSgmGMeIQnGbdsKBjIg golsCgYyIIKJbAoGMiCCiWwKBi7aCKaLKRi5zsB0MQUj1xmYLqZg5DoDVdsMHedPYOSiBVVbBSMZ AKq2OYKqrYKRDABVWwUjGQCqtgpGMgBUbRWMZACo2ioYyQBQtVUwkgGgaqtgJANA1VbBSAaAqq2C kQwAVVsFIxkAqrYKRjIAVG0zGY7OZDg6k+HoTIajFYxjQPGgf6Zg6Mg4bioYx83iQf9MwThuKhjH TQXjuKlgHDcVjOOmgpEMaPtnj2L8u3dn1XffFt8VtLbE9+yW7ItbyqT47k17P43od1+/fj7+/vrb +8/Hc2OLKY8Pzubm+Ovl7b0k+/Cgz6GEVHP2c4PU99oo9/wIJNlBV1TBSLKDrqiCkWQHXVEFI8kO uqIKRpo70BVVMJIBoCuqYCQDQFdUwUgGgK6o5X6RYOSiBTMjFIxctGBmhIKRSwPMP1Awcj8D8w8U jFwaYP5B8WD+gYKR6wzMP1AwctGCldkUrM2AVUrcsz9Rr/Hi8svt4eO3r48pf/e5fIffHpYfH5L/ 9D+m7JcUXYw/Hj6oA6o/9SJ5KCvvflTdrLz7Jzay8u6f2TMjJI3B8nIKRtIYLC9XPFheTsFIGoPl 5RSMpDFYXk7BSEMGlpdTMJIBYHm5SsoHlZQPKikfVFI+qKR8UEn5oJLyQSXlg0rKB5WUDyopH1RS PqikfFBJ+aCSad6VTPOuZJp3JTOzK5mZXcnM7EpmZlcyM7uSydSVTKauZDK1gpHrDHTdFYxcZ6Dr rmDkOgNddwUjFy3ouisYuWhBb1vByHWGOshg/eUawesECkZ+Jng3oUbwboKCkQzgbgDkJXLVtA0M +0wDQz8TMygGhjHAwDAGKBi3aA2M/DW5OzAGRi4N7g6MgZHrjLsDY2DoOsN22rwk7g6MgWGOi4GB DEjcHRgDAxmQuGLOBgYyIHHFnA0MZEDibudkK9NJgpEM4G7nGBjJAO52joGRDOCyPw2MZACX/Wlg JAO47E8DIxctl7BpYOSi5RI2DYxctNyFGgMjFy2XxahgXBajgZHbNqeIGRjJAE4RMzCSAZwiZmAk AzhFzMBIBnCKmIGRDOAUMQPjGODJ/cyT+5kn9zNP7mee3M88uZ95cj/z5H7myf3Mk/uZJ/czT+5n ntzPfG8/O5uRd/8nQxl5zgpYemu39pCS55I4PcIMpOQ9DMuG0krJe3jiYditlLyHZ/ZMCcljdFfm 8hQMjOQxlw5uYCRbuKp7BkbaCy4dw8DIdcZV3TMwcp1xuR0GRtoLLrfDwEgGcFnvBkYygEsUMTCS AVzWu4GRDOCyTgyMZACXdWJgJAO4rBMDIxnAZZ0YGMkALmHcwEgGcAnjBkYygMuHMTCSAWAGhYKR DADTMRSMZACY26FgJAPARBEFIxkAJoooGMkAMOtEwUgGgCksCkYyAExhUTCSAWAKi4KRDABTWBQM ZEAGU1gUDGRABlNYFAxkQAZTWBQMZEAGU1gUDGRAZlJYTh030HUmu4bQXJ3cyNxyJt76/f3teKv6 /Mk/xVx9TSHrebPkx5irNe3eiLg+fWUr4vr0RDviujlXeyY+7JrK5ooBfy7f+bnCWHg8hFDdIqcb 6y7WKmH41wqbv1YY+LWQrfIEFnfNZHMI4K+FbOKnz5y/5m9DaG794Ge2LUJDytE/GVur3np0l3La VorO6JCOY2Pq6zj2xJaOY8/smQ/SqIFZaQpGunVgVpqCkeYWTHFTMNKtA1PcFIx068AUNwUjGUCm hGQyJSSTKSGZTAnJZEpIJlNCMpkSksmUkEymhGQyJSSTKSGZTAnJZEpIBlPcFIxkAJlMkclkikwm U2SuZrSBkQwg0zwymeaRyTSPTKZ5ZDLNI5NpHplM88hkmkcm0zwymeaRyTSPTMrvmdSlMynxZVKV y6SQlkkhLZPaVya1r0xqX5kUhTIpCmVSFMqkKJRJUSiTolAhRaFCBusLKQoVUhQqpChUSFGokKJQ Aa8iKxi5aMGryApGLlrwKrKCkYsWvIqsYOSiBa8iKxi4bRcy6FvAoG8kc+AimQMXyUyzSGaaRTLT LJKZZpHMNItkplkkM80imWkWyUyzSGaaRTLTLJKZZpHMNItkplkkM80imWkWyUyzSGaaxV6m2Xm9 1/5kTO8t1lkq+Lqcqul7F8ck3/thdSXf+yc2JN/7Z/ZMCchjMl8ukvlykcyXi2S+XCTz5SKZLxfJ fLlI5stFKF/uEQw8GsVOKtUeMHKdsSk95NIATzORTGGJvRSWZi5bJz/IhyUu7lnuYSjepVjDKfXQ h9FktnaS0NMT28lsc0lCp79CZ3hffmnzd5n+uQbNe1CHt7ocTjfzrbpe3ZG+FzvJR4M/fdtZeHpi +6efcxZOf0U6C2BGUSQziiKZURTJjKJIZhRFMqMokhlFkcwoimRGUSSTgCKZBBTJJKBIJgFFMgko kklAmdyCMrkFZXILyuQWlMktKJNbUCZ3jUzuGpnMQ8zkFpTJLSiTW1Amt6BMbkGZ3YLAPMRMpg5m MnUwk6mDmUwdzGTqYCZTBzOZOpjJ1MFMpg5mMnUwk6mDmUwdzGTqYCZTBzOZOpjJ1EFDI8HIzwTz EPX/SKKDZYD0K0mig+mWCkYSHSwDpGAk0cEyQApGMgBMgVAwkgFgGSClJskAMDlDwUgGgMkZCkYy AEzOyGT2soJxDKjkflbJ/aySW1Ald41K0qmSDKgkAyrJgEoyoLIMANOTKnkZoGYwo0jBSKKDSUCV vFlQyZsFlbxZUMmbBZW8WVDJywCVvAxQycsAlbwMUMnLAJW8DKBg4KIlbxZU8mZBJW8WVPJmQSVv FlTyZkElbxZU8mZBJW8WVPJmQSVvFlTyZkEtYDkZBSMZAJaTUTCSAaDyqmAkA0DlVcFIBoDKq4KR DACTPxSMZAAo4yoYyQBQxlUwkAFCnlAEvPOgYOCcCXncEfK4I+RxR8Djjixggr+CkbUUrRzojiE0 FxT4mamdfuqWofRTX8p93kE4FSm123RltPKlTo19QSdjVJ94+NpOxujkBJ/+6s9eWlQnmOOegnHc UzCUe5zFlgU8tSkYZ7EVjLM+CsZZHwXjrI+CkesMPBvJAh4aZAEPDQpG/gDgoUHByC0IPDQoGLo0 yC0IPDQoGLkFgYcGBSMZAB4aFIxkAJj7qWAkA8DcTwUjGQDmfioYyQAwkVTBSAaAiaQKRjIATCRV MJIBYCKpgpEMABNJFYxkAJhIqmAkA8BEUgVrMkAPk/r0D+9+9/Xr5+Pvr7+9/3z84XBxd3j/+frD L4fFDqmGH12282QTPx9ujp+ON8erD0c9m94cj48PhBwXyxQq9Td/8fD++2Pn47+9+vbl/dH+y+Fh GPrep/e9e7fvU0lKgUUtFYykFNi7VP8hKQX2LtV/SEqBvUv1H9KogEnL+k+TAaNkD75DdufSc7Lb SI6/Xt5aWOrxQQmSarF6S3OcD34f5x0oZyoYuIE48sjuODmzLKBoaGAYswzszcZq6Sxge0FtWCu/ uBC887qe5lbusm/p2ljI35Q7axsYZhQMjFxt3FnbwMily521DQzb1QwM29UMDNvVDIxkAHfWNjCS AdxZ28BIBnBnbQMjGcAdjw2MXLTc8VjBuOOxgZGLljseGxi5aLnjsYGRi5a7Z2lgJAO406yBkQzg TrMGRjKAO80aGMkA7jRrYCQDuNOsgZEM4K7gGhjJAO4KroGRDOCurBlYmwFnS7Pe/8lY8kz2xQrt 5VNp1sVu9PiR2qwP42olzzw90U6eeXpmz5yQROau8RkYSWTuTqCBkUTmbhIrGHeT2MBIInM3iQ2M NGXMPcpTLhr6mW06NZP9Ol3JX9SarNHFHL/XmqyLiPrbewbZpOlg5uC+tzb5vJWGuO91Tca3t+W3 vRDZFU5D2GUZ2gXzuRXO3Xo1MJJ7XE65gZFGlsspNzDSyHI55QZGGlnuCm1ZKpegbmAgAyp3H9fA QAZU7j6ugYEMqFxmt4GBDKhcZreBkQzgMrsNjGQA6X9VLrPbwEgGcPdxDYxkACdgGxjJAFLArtx9 XAMjGUBK65VLrTcwkgFcar2BkQzgUusNjGQAKfdXUu6vpNxfSbm/knJ/JeX+Ssr9lZT7Kyn3V1Lu r6TcX0m5v5JyfyXl/krK/ZWU+ysp91cutd7ASAaQuQOVzB2oZO5AJXMHKpk7UMncgUrmDlQyd6CS uQOVzB2oZO5AJXMHKpk7UMncgUrmDlQyd6CSuQOVzB2oZO5AJRX6Sir0lVToK6nQV66orIGR64yU tispbVdS2q6ktF1JabuS0nYlpe1KStuVlLYrVyLYwEgGcCWCDYxctG3l9XQB5N25ax/dSx9Vlsal Dxei9z5GfevUpY+9Vz4qqbhWUnGtpOJaScW1koprJRXXSiqulVRcK6m4Cqm4Cqm4Cqm4Cqm4Cqm4 Cqm4CilFCilFCihFejLd15Ppvp5M9/Vkuq8n0319L913BxhHJ0/myXoyT9aTebKezJP1ZJ6sJ/Nk PZkn68k8WU/myXooT/YERjIAPEz4TmbpHjCSAVy/EQVrZ3fuAWsy4OyleT3P3P58fXP36frmy7Mj 03e0sFHiwQ5N1cWYnmff/vHb1S/Hj4fWC5tD35Eb68kcTE/mYHoyB9OTOZiezMH0ZA6mJ3MwPZmD 6ckcTE/mYHoyB9OTOZiezMH0ZNqkJ9MmPZk26cm0SU+mTXoybdKTaZOeTJv0ZNqkJ9MmPZk26cm0 SU+mTXoybdKTaZOeTJv0ZNqkJ9MmPZk26cm0SU+mTXoybdKTaZOeDEx7MjDtycC0JwPTngxMezIw 7cnAtCcD054MTHsyMK1gIAOEdEMFvArkyfi7J+PvHo2/C+nTCunTCunTCunTCunTCunTCunTCunT CunTCunTCunTCunTCunTCunTCunTCunTCunTCunTCunTCunTCnh7R8HIRQve3lEwctGCt3cUjFy0 4O0dL+DtHQUjFy14e0fBSAaAt3cUjGQAeHtHwUgGgLd3FIxkAHh7R8FICVCS35AAfQ4lpJpTfbsG uKvwkf4VySzwVpCCkcwCbwUpGMks8FZQWEClXsE4moYFVOoVjDNUCsYZKgXj6KRgHJ0UjKOTgnF0 UjCOTgpGMgCMsgYHRlkVDGSAA6OsCgYywIFRVgUDGeDAKKuCgQxwYJRVwUgGgFHW0OmXvAeMZAAY ZVUwkgFglDWAHYMMjGQAGGUNZMeg4MDAqIKRixYMjCoYuWjBwKiCkYsWDIwqGLlowcBocGBgVMFI BoCBUQUjFy0YGFUwctGCgVEFIxctGBgNDgyMKhi5aMHAqIKRDAADowpGMgAMjCoYyQAwMKpgJAPA wKiCgQzwpOfoSc/Rk56jJz1HD+rzCkb+mqQb6kk31JNuqCfdUE+6oZ50Qz3phnrSDfWkG+pJN9SD pToVjGQA6dN60qf1pE/rSZ/Wkz6tJ31aT/q0nvRpPenTetKn9aRP60mf1pM+rSd9Wk/6tJ70aT3p 03rUpwVLdSoYyQBQlFcwkgGgKK9gJANIUd6DpTqDB0t1KhjJALBUp4KRDABLdSoYyQCwVKeCkQwA 6/4oGMkAsO6PgpEMAOv+KBjJALDuj4KRDADr/igYyQCw7o+CkQwA6/4oGMkAsO6PgpEMAOv+KBjJ ALDuj4KRDCCzCT2ZTeiZbMJTY8m4awhN3oCf2aZTs3VqbLdODbmW8qzdsyx6oJK4pMf2qYtzo+1O 42aH0jjQVHRu4k9/RZJvsnDSaQhNyoIjIzcsMvnTk8mfnkz+9GTyp2eSP08rBvzMQGaSBjKTNJCZ pKGTSdrc/Up797Pbt3HJz/Y/vyx2OHzsdp9dDHF0/yub+18Z2P/KrqUELvJAJtgGMsE2kDmxgcyJ DWRObCBzYgOZExvInNhAqlqBFKICKUQFUogKpBAVSCEqkEJUIIWoQApRARSiIlloLZKF1iJZaC2S hdYiWWgtkoXWIlloLZKF1iJZaC2ShdYiWWgtkoXWIlloLZKF1iJZaC2ShdYi2Z82kv1pI9mfNpL9 aSPZnzaS/Wkj2Z82kv1pI9mfNpL9aSPZnzaS/Wkj2Z82kv1pI9mfNpL9aSPZUjaSLWUj2VI2ki1l I9lSNpItZSPZUjaSLWUj2VI2ki1lI9lSNpItZSPZUjaSLWUj2VI2ki1lI9lSNpItZRWMZACYpxLJ ZreRbHYbyWa3kWx2G8lmt5FsdhvJZreRbHYbyWa3kWx2q2AcAzK5n2VyP8vkfpbJ/SyT+1km97NM 7meZ3M8yuZ9lcj/L5H6Wyf0sk/tZJvezTO5nmd3PwLy7TDbvzmTz7kw2785k8+5MNu/Ovebdr9IL vv9JO71geZZYUK3P+CIxPiZWiXdVtlILnobVSi14eqKdWvD0zJ4pIXkMZg/mTj/zHWCd7MHWLy9L +5fPZVGz/SyxJFTnrQS0P+XV2TXAsV9fh7bx6+sTm7++PrNnWsgdCayqmMmm6plsqp7JpuqZ7F2T yd41mexdk8neNZnsXZPJ3jWZ7F2Tyd41mexdk8neNZnsXaNgIAPI3jWZ7F2Tyd41mexdk8neNZns XZPJ3jWZ7F2Tyd41mexdk8neNZnsXZPJ3jWZ7F2Tyd41mexdk8neNZnsXZPJ3jWZ7F1TFtA6KRjH gLIwNuCUYC67hvBnvw+l7+DopGAcnRSMo5OCcXRSMHLRggZFwTiDomAknUCDomCcQVEwkgEdg9K8 YCPtOEitpS7y/H6hX6xMdJGnOMiuYTa5NXhZZ9d+1rZprQDN217XpGk72vO2FyJUvh+CWJ3+PUNo bgDgGif3BTAbV8HIfYHJxj39mmnXEJq7CfiZpJkFU3sVjDSzYGqvgpFmFkztLQuY2qtgJJ3A1F4F Ix1NMLVXwUgGgKm9CkYyAKxnp2AkA8A8YQUjGQDmCSsYyQAwT1jBOAZUMt5ZyXhnJeOdlYx3VjLe Wcl4ZyXjnZWMd1Yy3lnJeGcl452VjHdWMt5ZyXhnJeOdlYx3VrJXdyV7dVeyV3cle3UrGMkA8Fpk JRt/V7LxdyUbf1ey8XclG39XsvF3JRt/V7LxdyUbf1ey8XclG39XsvF3JRt/V7LxdyUbf1ey8Xcl G3/XTuPvPWAkA8CzUyUbdFeyQXclG3RXskF3JRt0KxhXVE7IHrRVwAubCkbSCbywqWAkncALTgpG 0gm84KRgJJ3AC04KRhoU8IKTgpEMAC84KRjJAPCCk4KRDAAvOCkYyQDwgpOCkQwALzgpGMkA8IKT gpEMAC84KRjJALCwuIKRDACvBikYyQCmsPgJjGQAeKFGwUgGgBdqFIxkAHihRsFIBoAXahSMY4As 4IUaBeMYoGAcAxSMY4CCcQxQMI4BQqYsKxjHAAXjGCBkMrVAydQnMJIBoMAsZP6zQPnPp7jGXF30 0xCavAE/E6HT6TPrriE0SQh+JslNUPoWMjNbyMxsITOzpZeZvQOMtE6g9C2dpOc9YKR1AqVvIXOQ hcxBFjIHWaAc5BMYyQBQ+pZO2vDx6k6f/uGf/+Wf/svv/uGHw8Xd4f3n6w+/HBa7IGHIPlYFOzSR 8+Hm+Ol4c7z6cLw9fLo5Hk8PhOi9i67G3/zFw5vvbwI8/turb1/eH+2/HB4GoO99et+7d/s+kiQT qKILmecrZGqukKm5QuasCpmzKmT+pZD5lwpGmhNGQzy5ejuu6OgQ/uz3Y/Qd5NIAZT8FI80JKPsp GMkAUPZTMJIBoOynYOR+Bsp++g/pUIGyn/5DMgCU/fQfkgGg7Kf/kAwAZT8L1JJgJANA2U/BSAaA sp+CkQwAZT8FIxkAyn4KRjIAlP0UjGQAKPspGMkAUPZTMJIBoOynYCQDQNlPwUgGgLKfgoEMcKRS 50ilznFKXV3ALEcDw+bMwLA5MzB0zjCiGxhGdAPDiG5gGNENDCO6gWFEVzDuuGNgJAO4446BkQzg jjsGRjKAO+4YGMkA7rhjYCQDuOOOgZEM4I47BkYygDvuGBjJAO64Y2AkA7jjjoGRDOCOOwZGMoA7 7hgYyQDuhGJg5KLlTigGRi5a7oRSHZiYaGDconVgYqKBcYvWgYmJBsYxwIGJiQbGMcCBiYkGRjKA S0w0MJIBXGKigZEM4CrfGBjJAK7yjYGRDODS/wyMZACX/mdgJAO49L/qOul/jylGf/v3f/ePf/f/ +K8/WNLP7c/XN3efrm++PMsregAKupc1Moq8i5Kdnvhe9BL647erX44fD2decn6k9oL57wvkrhg6 u+Ljd7z73devn4+/v/72/vNxc8acfz5j9t7jr5e3Vlr28bVxCSU5k1ObE/fqhc2h+z0fzCXtGRi3 bgOYtGdg3M4dwFqfBsbt3AHMtDMwbucOYK1PBePq1RgYyQCuXo2BkQzgqsIYGLnOuOxEAyPXGVcV xsDIdcZVhTEwcp1xGZ0GRu60XEangZEM4KrCGBjJAFDiDGBGp4GRSwPU/kIn1fHRpVsWH+O7L18/ 357L6w+1thP7Db7lhj88kKzi+lRiv73QMvufRpf8enTu9LDLbxqbHsenxubynjsHNhKSBaDMGcCs zprIPS2Re1oi97RE7mmJ3NMSuaclMEvdwDirnsAsdQPjtu5Ebt0JzFI3MJIB4H6WyP0ssfsZmLaR wCx1AyMZAKZtJDBL3cBIBoBpGwnMUlcwMG0jgVnqBkYyAEzbSGCWuoGRDADTNhKYpW5gJAPAtI0E ZqkbGMkAMG0jgVnqBkYyAMwBSWCWuoGRDABzQBKYpW7nZJABYMq7gYEMIFPekwNzQO4DFQ2w9XOH 397/24e2jA89Ia1P40Ns4jF64HKKLoacavblx+8BhKhuYIm1hpRCiFtdHp9GZu8715jx6Ylnkt2q l+LTM3tmBaSyA5NZkgOTWZIDZdvkwGQWBSOpDCaz3EfPhgjjwihhvC8lO1/DGwmjI9sgjAvbhHHz LV3tr8g9CczKUTCSym6ukNljsYg2M4CRnd6BEobcZMB8oeTAfCEFI+cMzBdSMNJf4MqFGRjJTa5c mIGRZpYrF2ZgJAO4cmEGRjIAzDxSMJIBYOaRgpEMADOPFIxkAJh5pGAkA8DMIwUjGQBmHikYyQCu lJmBkQwAc6IUjGQAmBOlYCQDwJwoBSMZAOZEKRjJADAnSsFIBpD5A47MH3Bk/oAj8wccmT/gyPwB R+YPODJ/wJH5A47MH3Bk/oAj8wccmT/gyPwBR+YPODJ/wJH5A47MH3Bk/oAj8wccmT/gyPwBR+YP ODJ/wJH5A47MH3Bk/oAj8wccmT/gyPwBR+YPODJ/wJH5A47MH3Bk/oAj8wccmT/gyPwBR+YPODJ/ wJH5A47MH3Bk/oAj8wc8mT/gyfwBT+YPeDJ/wJP5Ax6sIaFgIAM8Kbt7Unb3pOzuSdndkyqiJ2V3 D9aQUDCSAaRa7Um12oM1JBSMZACpCXtSE/akJuxJTdiTmrAnNWFPasKe1IQ9qQl7UhP2pCbsSU3Y k5qwJzVhT2rCntSEPakJe1IT9qQm7ElN2JOasCc1YU9qwp7UhD2pCXtSE/akJuxJTdiTmrAnNWFP asKe1IQ9qQl7UhP2pCbsSU3Yk5qwJzVhT2rCntSEPakJe1IT9qQm7ElN2JOasCc1YU9qwp7UhD2p CXtSE/akJuxJTdiTmrAnNWFPasKe1IQ9qQl7UhP2pCbsSU3Yk5qwJzVhT2rCntSEPakJe1IT9qQm 7ElN2JOasCc1YU9qwp7UhD2pCXtGEz7ddyLpRArMnhSYPSkwe1Jg9qTA7EmB2ZMCcyAF5kAKzIEU mAMpMAdSEw6kJhxITTiQmnAgNeFAasKB1IQDuW0HUhMOpCYcSE04kJpwIDXhQGrCgdSEA6kJB1IT DqQmHEhNOJCacCA14UBqwoHUhAOpCQdSEw6kjBtIGTeQMm4gZdxAiqWBFEsDKZYGUiwNpFgaSLE0 tMXSZ1WW87sv/u5sDWif46FZZlnRY6/Mcsm15rkyy/q+FxWg67I0xxby8qaxyTJZnjovu2pA61BI O0DqwoHUhQOpCwdSFw6kLhxIXTiQunBoq6+nHj7vzhLJ93iUfYNHoZRUXI26Lc/xyO+kESn6BVL0 C6ToF0jRL5CiXyBFv0CKfoEU/QIp+gVS9Auk6BdI0S+Aol8hizuWTnHHPWAcNwtZE7GQNRELWROx kDURC1nirZD6SenURNwDRjIADMQVspRgcWAgrpAF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+Q BfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF +wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7 Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsK WbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsUjGQAeDmjkAX7Clmwr5AF +wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5AF+wpZsK+QBfsKWbCvkAX7 Clmwr5AF+wpZsK+QBfsKWbCvkAX7Clmwr5A19gpZY6+QNfYKWWOvkDX2Clljr5A19gpZY6+QNfYK WWOvkDX2Clljr0A19k53hHe0siydynzcZ4blN+s2nc9Gffjw+eLyy+3h47evj91D7zuDHn57WH58 6COq/9HZxf0aS8g/Hj5c3R1cKSGFvNUr9Glq7AvO9Qp9euLha8/1Ct03wae/avICnGBuixFSIxFS IxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFS IxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFS IxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFSIxFS IxFSIxFSIxFSIxFSIxGyqZGQgouQgouQgouQgouQgouQgouQgouQgouQgouQgouQgouQgouQTY2E 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 L/hWo+i7MSsvfZzCinWTtoyJyksf146R9NQv2mGCpFUT5GY6ri2xLRPksUG6DTL+Vh2WTFq1ZI7m uPLJ8rAlY1c+1hKlZ4V6/ZnLdkrZ633SmrRmTOQOEyevmjjhu+9WVnweNnHu1HLFxl1iDX/L3GHo 5FVD52hfvFoRaNjQ8SsmzhJl/LU6TJm8aso492JlK807TZmblcN1iTX+ch2mTF41ZY721dps7zRl blbO/CVWjxaK9daFKWfRw8Jlsavq3WHi5FUT5+bly5VdMA+bOHf225oWbhs6G1+0w6DJY9F2519x 4R2eTN/zZPqej2B5Uk/mAnoyF9CTuYCezAX0ZPqeJ9P3PJm+58n0PU9m3HkySc6TSXKeTJLzZJKc J5PkfCNJbg8Yuc7AQHlPBsp7MlDek4HyngyU9xGs2+kbMeh7wDgNiGTPg0j2PIhkz4NI9jyIZM+D SPY8iGTPg0j2PIhkz4NI9jyIZM+DSPY8iGTPg0j2PIhkz4NI9jyIZM+DSPY8iGTPg0j2PIhkz4NI 9jyIZM+DSPY8iGTPg0j2PIhkz4NI9jyIZM+DSPY8iGTPg0j2PIhkz4NI9jyIZM+DSPY8iGSbgki2 KYhkm4JItimIZJuCSLYpiGSbgkh2FohkZ4FIdhaIZGeBSHYWiGRngUh2FohkZ4FIdhaIZGeBSHYW iGRngUg2A4hkM4BINgOIZDOASDYDiGQzgEzuGpncNTK5a2Ry18jkrpHJXSOTu0Ymd41M9iPJ5BaU yS0ok1tQJregTG5Bmd2CwH4kmexHksl+JJnsR5LJfiSZ7EeSyX4kmexHksl+JJnsR5LJfiSZ7EeS yX4kmexHksl+JJnsR5LJfiSZ7EeSyRYimWwhkskWIplsIZLJFiKZbCGSyRYimWwhkskWIplsIZLJ FiKZbCGSyRYimWwhkskWIplsIZKhFiLncjZmlwhVvQFf09eLDDnTWWRIpsmJKQmqczVAEWM7awy5 epWC+xGnd23UGBqc3vOvqsulNr3VibL1ifLOlkziq8lKLgX930vpxKl3ruzmXLXC5+/H7Jkr8jwA I3Fyo23N4e6v3x1uvteP9fuDGQrFPtXOShOy313AkP3u/FHcLhGGl/2OZxDL5QJGmA8XMMR8OH8A AuwiWWhsML5zJw7ic/TnuqzZmt5ib85vbi6tZAdyQi5gQ0VeL9NY3VzAT4UYZ+fXJMAukhGW3hkM CSW8gBE73wWMsPQuYORmhYQSXsCw/SVOExJGcgEjjvALGKYBBQzTAAVDQvAvYJgGFDBMAwoYpgEF DNOAAkZqABKTcgEjNQCpGn4BIzUACXC5gJEagAS4XMBIDUCo6gsYqQEIVX0BIzUAoaovYKQGIFT1 BYzUAISqvoCRGoBQ1RcwUgMQqvoCRmoAdw8oYKQGIFT1BYzUAISqvoCRGoBQ1RcwUgMQqvoCRmoA QlVfwEgNQKjqCxipAQhVfQEjNQChqi9gpAYEUgMQ3vsCRmoAwnufwRDe+wJGagDCe1/ASA1AeO8L GKkBCO99ASM1AOG9L2CkBnA80FyVmwQjNYCjbgoYqQEIdXMBIzUAITQvYKQGcHyAgnF8QAEjNYDj AwoYqQEcH1DASA1ASgtcwEgNQEoLXMBADTBIaYELGKgBBiktcAEDNcAgpQUuYKAGGKS0wAUM1ACD lBa4gJEagJQWuICRGoCUFriAkRqAlBa4gJEaQHLChuSEDckJG5ITNiQnbEhO2JCcsCE5YUNywobk hA3JCRuSEzYkJ2xITtiQnLAhOWFDcsKG5IQNyQkbkhM2JCfMdKu/gJEaQHLCjfa0e8BIDSA5YSbq +wJGagDJCRuSEzYNTngZ3Xv/k67oXr3jiVMzd5pO0b3ifPAb4b1XUhVJVsJ7r0acpF4J770as2dG SDUmiW3D5GCf43hRyUwjGLzR+9s6X/pM3QeEu5hD9vacmmODLxnBnTHhmw3AXUcDcLerAXj903Bf bG2S7z9An0568XqLMuFOJ0unLunUSV/NfboasamTfij36fKrXzoJpDyjfnrUlnbvrAfxJTpawnlZ y+Sm3jyq+rxfjdhc1jvnHUmFPYswlMp1EaF6dIKfnjxRyRgT04gxqS7KRnafUeW3+XrD9V5i9N6e VqZzJSC9c13u+5zVY2drke96XD0SZltj9j2QzJjTLWmPCE9OFL1H6svjKj3lTenBdlpFNoZS7rfv WAnVNNGrEZvHStj3scgLAxlAZMgAIkMGEBkygMg0AoiqazJ1rclo9W6pl7g7Q8f13jxC2lyOjW57 V2P2zAZpkpMRUIaMgDJkBJQhI6AMGQFlyAgoQ0ZAGTICypARUIaMgDJkBJQhI6AMGQFlyAgoQ0ZA GTICypARUIaMgDJkBJQhI6AMGQFlyAgoQ0ZAGTICypARUIaMgDJMc5Xz1WK8GEcR4ZeuVlCesePK 6+o2oYQUH9x4o51E1Ww6F7SZui+8bvOO2uoeumviL79CF1J9j6nOcG9FjzQ5sdNk7vyLLqWwZ6XZ euha58caL55Tnlrd47a+/L7HVXfB7WW074FklTAfdonwC1YJuzwD1BZLht1ZMuzOMh19zl8TlQy0 YiwZw2fJGD5LxvBZMobPkjF8lozhs2QMnyVj+CwZw2fJGD5LxvBZMobPkjF8lozhs2QMnyVj+CwZ w2fJGD5LxvBZMobPkjF8lozhs2QMnyVj+CwZw2fJGD5LxvBZMobPkjF8lozhs2QMnyVj+CwZw2fJ GD5LxvBZMobPkjF8lqzrYsnwN0sGmVmyrosl67pYsq6LJeu6WLKuiyWdUJaMubHo5XUg5ub+J33u seCzvvgU3Nn5mNNW6fErqdrEdBmxRUyXMXtmpN9heP+TzhlJTkIKZ54+xpC34j2vpNqakUa859WY HTNCVtixZIUdS1bYsWSAjCUDZCwZIGPJABlLBshYssKOJeNLLBlfYsn4EkvGl1gyvsSS8SWWjC+x ZHyJJeNLLBlfYsn4EkvGl1gyvsSS8SWWjC+xZHyJJeNLLBlfYsn4EkvGl1gyvsSS8SWWjC+xZHyJ JeNLLBlfYsn4EktW2LFkhR1LVtixZIUdISvsCFlhR8gKO0JW2BGywo6QVL+QVL+QVL+QFXaEZOeF ZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeF ZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOeF ZOeFZOeFZOeFZOeFZOeFZOeFZOeFZOdlLLb/EkNeXZ2gZKQ6kS1chGzhIiTBLCTBLCTBLCTBLCTB LCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTB LCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTBLCTB7EiC2ZEEsyMJ ZkcSzI4kmB1JMDuSYHYkweymocDwy4W/utRByUh1ItlqR7LVjmSrHclWO5KtdiRb7Ui22pFstSPZ akey1Y5kqx3CVp83E9Ll5aytF7MJU6tCrg3pKj/FWCvOu5jOGTu2t26zvk55hUbRGB1xet1GnRcd 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 qRxZnMqRxakcWZzKkcWpHFmcypHFqRxZnMqRxakcWZzKkcWpHFOc6nJBJpcGGEPhyEpXjqx0pWDo nJHqBMZQOLJsliPLZjmybJYjy2Y5smyWI8tmObJsliPLZjmybJYjy2Y5smyWI8tmObJsliPLZjmy bJYjy2Y5smyWI8tmObJsliPLZjmybJYjy2Y5smyWI8tmOaZs1sU+29HD0DWKbYGvSajT5TXzLhGq Sgi+JqGb59cEiXLHVAe7SLYjecA1aopxrwnGnTiy1JgjS405stSYY0qNXZbGUBn9iwi/OPPqyLpl jqxb5si6ZY6sW+bIumWOrFvmyLpljqxb5si6ZY6pW3bRTXTOSHUCi6A5sgiaI4ugObIImiOLoLlG EbQ9YKA6kYXQHFkIzZGF0BxZCM2RhdAcWQjNkYXQHFkIzZGF0BxZCM2RhdAcWQjNkYXQHFkIzZGF 0BxZCM2RhdAcWQjNkYXQHFkIzZGF0BxZCM01CqHtASM1AAxLcY06XXvASA0gwwUyGS6QyXCBRj2f PWCkBpDhApkMF2iUHNkBRoYLZDJcoFGTYw8YqQEkw09WSXBklQRHVklwZJUER1ZJcGSVBEdWSXBk lQRHVklwZJUER1ZJcGSVBEdWSXBklQRHVklwZJUER1ZJcGSVBEdWSXBklQRHVklwZJUER1ZJcGSV BEdWSXBklQRHVklwZJUER1ZJcGSVBEdWSXBklQRHVklwZGEDRxY2cGRhA0cWNlAwctGSBDNZJcGR VRIUjFy0JCdMllxwZMkFR5ZccGTJBUeWXHBkyQVHllxwZMkFR5ZcUDBSA0Aa15P1GzxTv+ECxmmA JwsCeLIggCcLAniyIIAnCwJ4siCAJwsCeLIggCcLAigYt217Moffkzn8nszh92TavSfT7j2Zdu/J tHtPpt17Mu3ek2n3nky790za/SX+DJ0zctsGyVJP5vB7Moffkzn8nszh92QOvydz+D2Zw+9bOfy1 slvZ1ctuJevE2vu6WzlkM0W9iJ7LbtmtPilXqlmEaZTdyo1eNVdj9mwL6OcitwWQQfYTwiBf5oxc lSAdrWDEHnN5zbhLhOrOBL4muWGB3LaCoUuDNFpBblvBSN0EuW0FI9UJ5LYVjDyyQW5bwUgNALlt BSM1AOS2FYzUAJDbVjBSA0BuW8FIDQC5bQUjNQDkthWM1ACQ21YwUgNAblvBSA0AuW0FIzUA5LYV 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 ofYEj1uS+Lck8W9Jrt6SXL0l6XVL0uuWpNctSa9bkl63JL1uSXrdkvS6Jel1S9LrlqTXLVl12Daq Du8AIzWAZMQtyYhbkhG3JCNuSUbckoy4JRlx22DEd4CRGkByv5bkfi3J/VqS+7Uk92tJ7teS3K8l uV9LlmmzJMlpSZLTkiSnJUlOS5KcliQ5LUlyWpLktCTJaUmS05IkpyVJTkuSnJYkOS1JclqS5LR1 knMOSrn86pTH/fbm+9cvD//rMP1j7vJ7bv5bglrWH+BLbaMSB/PzT/e9gquOhnn0XV/d4qU4/eJX 794fnt25Kx4+6epXZczmoJ8+vH/x5vj28F+vb3+4GvHy/btTcM4ia3j+TTXy5mrMnSvlm2+//uz5 n9baIqvl2nzrmgOnFJuxeky4wV7h+rxd7YZ9o3DSHjBOh3yjkM8eME6HfKOwzA4wMFDANwqd7AHj Nn4/gdy+b1Sp2ANGLlqQ2/dkpQFPVhrwZKUBT1Ya8I1KA2fH/LO1DVtsa7/OUtuvU8z6p1ZfYWi/ FrtzuwYDBDxZrsCT5Qp8o1zBgG2R0x7bQn+1bVvooGHbIm8WOpvH7JktULXJEgqeLKHgyRIKniyh 4MkSCp4soeDJEgqeLKHgyRIKniyh4MmqB56seuDJqgeerHrgyaoHnqx64MmqB56seuDJqgeerHrg yaoHnqx64MmqB56seuDJqgeerHrgyaoHnqx64MmqB56seuDJqgeerHqgYKQGgGEZnqx64MmqB56p enDJoSM1AIzx8GQJBU+WUPBkCQXPlFC4gJHqBMZ4eLLqgSerHniytoAnawt4sraAb9UW2AFGrjMw ksKTWfSezKL3ZBa9J7PoPZlF78ksek9m0ftWFv0OMFIDwEgKT6aLezJd3JPp4p5MF/dkurgn08U9 mS7uyXRxT6aLezJd3JPp4p5MF/dkurgn08U9mS7uyXRxT6aLezJd3JPp4p5MF/dkurgnM7w9meHt yQxvT2Z4ezLD25MZ3p7M8PZkhrcnk7I9mZTtyaRsTyZlR9JRHklHeSQd5ZF0lEfSUR5JR3lsOMrL P96HL5oXN0tGvvz48JtLGa7fHl68fXGOKzCTs6l05dnoMzILsMHqz2P2vBqnQpF0jkfSnx1JF3Qk vcaR9M1G0p0aSXdqJN2pkXSnRtKdGkl3aiTdqZEsIhvJIrKRdPRG0tEbSUdvJB29kXT0RtLRG0lH byQdvZF09EbS0RtJR28kHb2RdPRG0tEbSUdvbDh6xyt7KJrfqOwRxLtG8YzOqh7lQbtellQq0Hcc Sd9xJH3HkfQdR9J3HEnfcSR9x5H0HUfSdxxJ33EkfceR9B1H0nccSd9xJH3HkfQdR9J3HEl3bySr g0bSdxxJ33EkfceRdPdG0t0bSXdvJN29kSzoGUnfcSR9x5H0HUfUd0wW9FQwUAPIgp6RLOgZyYKe kSzoGcmCnpEs6BnJENNIFvSMZA3OSNbgjGQNzkjW4IxkDc5I1uCMZA1OBSMXLZgbExvVQfeAkRpA Un6WpPwsSfmRhUFjqzDosrXP/U/qrX2mq25fwUh2hUU6tfWJLsi00dXnSqo2U2g7mEK7iym0YIJP JEulRrJUarQkh0nWXY1k3dVI1l2NZN3VSNZdjWSp1EhWN41kddNIVjeNZHXTSFY3jY3qpnee80n/ ss9evvnp9Vr5jRwaznTrfK3edRmgCmPTWPmNHEr5jSvJpCqZsY0aEz2i5THR9HkL2VxdNueeJJsM VpnS5y1k83XZQqMCVo9sgxVV9HkL2UJdttyo9tIjmx2ULduFbLEqmxr4T5NNBiuHmaUupLps7mm6 oIfRYFWzpS7kumzhibrgB2ULC10wU1229ERdCIOypYUuGFOVTcwTdSEOVj4yC10w9VNBX/xpsg0e C/q8hWz1c0HCE3Vh8FzQ5y1kq58Lkp6mC6PVB/V5C9nq54KbnqYLbvBc0OctZKufC65VBaxHtsFz wclSF+rngvNP0wU3eC7o8xay1c8Fl56mC27wXNDnLWSrnwt+eqIuDJ4L+ryHstn6ueDtE3Vh8FzQ 5y1kq58L3j9RFwbPBX3eQrb6ueDjE3Vh8FzQ5y1kq58LYXqiLgyeC/q8hWz1cyHYp+mCHzwX9HkL 2ernQmhVzO2RbfBcCG6pC/VzIcSn6YIfPBf0eQvZ6udCeOLV2Q+eC2F5d7b1cyE+8e7sB8+FuLw7 2/q5EJ94d/aD50Jc3p2lfi7EJ96d/eC5EJd3Z6mfC/GJd2c/eC7E5d1Z6udCeuLd2Q+eC2l5d5b6 uZCeeHf2g+dCWt6dpX4upCfencPguZCWd2epnwvpiXfnMHgupOXdWernQn7i3TkMngt5eXeW+rmQ n3h3DoPnQl7enaV+LuQn3p3D4LmQl3dnqZ8L+Yl35zB4LuTl3dnVzwUzPfHyHAYPhvLAhXT1k8FM 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 yQ1JkhuSJDckSW5IktyQJLkhSXJDkuSGJMkNSZIbkiQ3JEluSJLckCS5IUlyQ5LkhiTJDUmSG5Ik NyRJbkiS3JAkuSFJckOS5IYkyQ1JkhuSJDckSW5IktyQJLkhSXJDkuSGJMkNSZIbkiQ3JEluSJLc kCS5IUlyQ5LkhiTJDUmSG5IkNyRJbkiS3JAkuSFJckOS5IYkyQ1Ckl+IOHKdkYy7IRl3QzLuhmTc Dcm4G5JxNyTjbkjG3ZCMuyEZd0My7gbMJVcwUgNIktyQJLkhSXJDkuSGJMkNSZIbkiQ3JEluwFxy BSM1gCSYLUkwW5JgtiTBbEmC2ZIEsyUJZksSzJYkmC1JMFuSYLYkwWxJgtmSBLMlCWZLEsyWJJgt STBbkmBGrzuWJJgtSTBbkmC2JMFsSYLZkgSzJQlmSxLMliSYLUkwW5JgtiTBbEmC2ZIEsyUJZksS zJYkmC1JMFuSYLYkwWxJgtmSBLMlCWZLEsyWJJgtSTBbkmC2JMFsSYLZkgSzJQlmSxLMliSYLUkw W5JgtiTBbEmC2ZIEsyUJZksSzJYkmC1JMFuSYLYkwWxJgtmSBLMlCWZLEsyWJJgtSTBbkmC2JMFs SYLZkgSzJQlmSxLMlszCtiQnbElO2JKcsCU5YUtywpbkhC3JCVuSE7YkJ2xJTtiSnLAlOWFLcsKW 5IQtyQlbkhO2JCdsSU7YkpywJTlhS3LCluSELckJW5ITFpITFpITFpITFpITFpITFpITFpITFpIT FpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpIT FpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpIT FpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpIT FpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpIT FpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITFpITdiQn7EhO2JGc sCM5YUdywo7khB3JCTuSE3YkJ+xITtiRnLAjOWFHcsKO5IQdyQk7khN2JCfsSE7YkZywIzlhR3LC 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 7CRRkaLWKew04iRxrVPYacye2SBVGPQTk+17hWzfK2T7XiHb9wrZvlfI9r1Ctu8Vsn2vkO17hWzf K2T7XiHb9wrZvlfI9r1Ctu8Vsn2vkO17hWzfK2T7XiHb9wrZvlfI9r1Ctu8Vsn2vNNv31uybbPrs G3HWZB9yGLNvVKIN+0ZHbNo3OmbPbJAqDDq8yf7DQvYfFrL/sJD9h4XsPyxk/2Fp9h/eAQYeYmD7 XiHb9wrZvlfI9r1Ctu8Vsn2vkO17hWzfK2T7XiHb9wrZvlfI9r1Ctu8Vsn2vkO17hWzfK2T7XiHb 9wrZvlfI9r1Ctu8Vsn2vkO17hWzfK2T7XiHb9wrZvlfI9r1Ctu8Vsn2vkO17hWzfK2T7XiHb9wrZ vlfI9r1Ctu8Vsn2vkO17hWzfK632vXvASA0gWXmw6qiQVUeFrDoqZNVRIauOClR19AJGagDJyoPl OIUsxylkOU4hy3EKWY5TyHKcQpbjFLIcp5DlOIUsxylkOU4hy3EKWY5TyHKcQpbjFLIcp5AVNIWs UylknUoh61QKWadSyDqVQtapFLJOpZB1KoWsUylknUpp1qncAUZqAEkdNwpA7gEjNYCkji1JHVuS OrZgdpCCkYuWJEstSZZakiy1JFlqSbLUkmSpJclSIclSIclSIflNIflNIflNIflNIflNIflNIflN IflNqfObd1lxf/rT3z7+1+vblz88++nl27XEODM1WtuVJ9hKcvk8wE1mtIlheeBV2t43n33x2R++ rUvXaGnXJd1gA6nywGvpvtmaPtPoZtcl4GDvqPLAawF/frEpYaOTXZeEg32jzF3f+z3Lmdw2SVJc SFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJcSFJc SFJcOFL8ZDZVwJbjDr+b//QUF30Koi6B0qdj/u4YllBSxqaY5JPzMTz1RFWfBCnwtajq04iToLWo 6tOYPZNQ/dbLcV2T4PMkPupvxidBNidBOiZBdk1CdY0ux/VNQoiTsxLC+CS08wdPI7YnYTx/8GRk 9k2C71OHKZrJhsmOT4LfnATfMQl+1yRUT8XluL6VYLzPegbtWAlhcxJCxySMt/osv6qe5stxXZPg 8jSl5Mw0PglxcxJixyQMFQW//Kpuhawm38w/6Uq+iWkyyUwpDuTenATamozUMRlp12TUrajqZDR6 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 kR7AlPlZwUgP2Cnz891FePUn7QLR0Ui6vgzPOWu8SKkZXQpEWzt5d/NGvGfTijkv3Yj3/MRs+ktK /udnRl4L6ctMwaIVjPRl5jKeFYz0ZeYynhWM9GWS3Q4kux1IdjuQ7HYg2e1AstuBZLcDyW4Hkt0O JLsdSHY7kOx2INntQLLbgWS3A8luB5LdDiS7HUh2O5DsdiDZ7UCy24FktwPJbgeS3Q4kux1IdjuQ 7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ 7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ 7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ 7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LaQ7LYwl9isYKQHkJywkJywkJywkJywkJywkJywkJywkJywkJyw kJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJywkJyw kJywkJywkJywkJywkJywkJxwJDnhSHLCkeSEI8kJR5ITjiQnHElOOJKccCQ54UhywpHkhCPJCUeS E44kJxxJTjiSnHAkOeFIcsIR4YSNj+JytuQZPZIEcyQJ5kgSzJEkmCNJMEeSYI4kwRxJgjmSBHMk CeZIEsyRJJgjSTBHkmCOzg1NXM3PBlpGuhPJVkeSrY4kWx1JtjqSbHUk2epIstWRZKsjyVZHkq2O JFsdSbY6kmx1JNnqSLLVkWSrI8lWR5KtjiRbHUm2OpJsdSTZ6kiy1ZFkqyPJVkeSrY4kWx1JtjqS bHUk2epIstWRZKsjehIm2epIstWRZKsjyVZHkq2OJFsdSbY6kmx1JNnqSLLVkWSrI8lWR5KtjiRb HUm2OpJsdSTZ6kiy1ZFkqyPJVkeSrY4kWx1JtjqSbHUk2epIstWRZKsjyVZHkq2OJFsdSbY6kmx1 ItnqRLLViWSrE8lWJ5KtTiRbnUi2OpFsdSLZ6kSy1YlkqxPJVieSrU4kW51ItjqRbHUi2epEstWJ zGBOJMGcSII5kQRzIgnmRBLMiSSYE0kwJ5JgTiTBnEiCOZEEcyIJ5kQSzIkkmBOZwZxITjiRnHAi OeFEcsKJ5IQTyQknkhNOJCecSE44kZxwIjnhRHLCieSEE8kJJ5ITTiQnnEhOOJGccCI54URywonk hBPJCSeSE04kJ5xITjiRnHAiOeFEcsKJ5IQTyQknkhNOJCecSE44kZxwIjnhRHLCieSEE8kJJ5IT TiQnnEhOOJGccCI54URywonkhBPJCSeSE04kJ5wQTriKptF3RroTSTAnkmBOJMGcSII5kQRzIgnm RBLMiSSYE0kwJ5JgTiTBnEiCOZEEcyIJ5rRDMDeuidGftK+JuboiRjel1vo4+eWGGG+MHLsgphhV DGlfEFOemI1uXxBTnhl5IaAXZ5IkzyRJnkmSPJMkeSZJ8kyS5JkkyTNJkmeSJM8kSZ5JkjyTJHkm SfJMkuSZJMkzSZJnkiTPJEmeSZI8kyR5JknyTJLkmSTJM0mSZ5IkzyRJnkmSPJMkeSZJ8kyS5Jkk yTNJkmeSJM8kSZ5JkjyTJHkmSfJMkuSZJMkzSZJnkiTPJEmeSZI8kyR5JknyTJLkmSTJM0mSZ5Ik zyRJnkmSPJMkeSZJ8kyS5JkkyTNJkmeSJM8kSZ53SPJGPEt/ciieZZNO41HseuWx8RKPxbOKUfvx rPLErXhWeWbkhZBeTBL9mST6M0n0Z5LozyTRn0miP5NEfyaJ/kwS/Zmk7DJJ9GeS6M8k0Z9Joj+T RH8mif5MEv2ZJPozSfRnkujPJNGfSaI/k8nfmeTmM8nNZ5KbzyQ3n0luPpPcfCa5+Uxy85nk5jPJ zWeSm88kN59Jbj6T3HwmuflMJn9nkNeWCeS1FYzzAAXjPEDBOA9QMM4DFIzzAAXjPEDBOA9QMM4D FIz0AJDXVjDSA0BeW8FIDwB5bQUjPQDktRWM9ACQ11Yw0gNAXlvBSA8AeW0FIz0A5LUVjPQAkNdW MNIDQF5bwUgPAHltBSM9AOS1FYz0AJDXVjDSA0BeW8FIDwB5bQUjPQDktRWM9ACQ11Yw0gNAXlvB SA8AeW0FIz0A5LUVjPQAkNdWMNIDQF5bwUgPAHltBSM9AOS1FYz0ADD5W8FIDwA5YQUjPQDkhBWM 9ACQE1Yw0gNATljBSA8AOWEFIz0A5IQVjPQAkBNWMNIDQE5YwUgPADlhBSM9AOSEFYz0AJATVjDS A0BOWMFIDwA5YQUjPQDkhBWM9ACQE1Yw0gNATljBSA8AOWEFIz0A5IQVjPQAkBNWMNIDQE5YwUAP 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 9LJZh+1aFUAnsYNVAW7eXZ8P3F2fh+6ubwcpwDdMzsukWIG8CC3tXOczAoZaRk4LJO+7d79LPxjJ ++7dZDIARgZoSN6XvAQkkZeAJPDeDj+BkfUChg1aBeMi6wUMG7QFDBu0BQwbtAUMG7QFDBu0BQyb tgsY6QFcqnQBAz3AcanSBQz0ADCuXsBAD3BcqnQBAz0AjK0XMNADwNh6ASM9gMu7LmCkB3B51wWM 9AAu77qAkR7AxX4LGOkBXOy3gJEewOVdFzDSA7i86wJGegAXoSxgpAdwEcoCRnoAF6EsYKQHcBHK AkZ6AJceXcBID+CqnRcw0gO4xOICRnoAF9UtYKQHcKlbBYz0AC51q4CRHsBFQwsY6QFcaLWAkR7A pW4VMNIDuNStAkZ6AJe6VcBID+BStwoY6QFcCL+AkR7AhfALGOkBXAi/gJEewIXwCxjpAVwIv4CR HsClbhUw0gO4cgQFjPQALjmqgJGDlkuOKmDkoOWSowoYOWi55KgCRg5aLjlKwbjkqAJGegBX8bqA kR7AJUgVMNIDuASpAkZ6AEnjgpdWKxhJ44KXVhcw0gNIGhe8tLqAkR5A0rjgpdUFjPQAksYFL60u YKAHgJdWFzDQA8BLqwsY6AHgpdUFDPQA8NLqAkZ6AEnjgpdWFzDSA0gaF7y0uoCBHgDWbCxgqGWg bwYytBrI0GogQ6uBDK0GMrQayNBqIEOrgQytBjK0GsjQaiBDq4EMrQYytBrI0CpY6bWAkR5AhlbB Sq8FjPQAMrQKVnotYKQHSO75VU1qab5pzjKuIlYBI92JDPqCZWMLGOlOZNA3kEHfQAZ9Axn0DWTQ N5BB30AGfQMZ9A1k0DeQQd9ABn0DGfQNZNA3kEHfQAZ9Axn0DWTQN5BB30AGfQMZ9A1k0DeQQd9A Bn0DGfQNZNBXyKCvkEFfIYO+0g76Hrz7yU4pPbRqdJQG/I3Ln4wiTJMtI76rQllpeKREWbEJdC4h 48kCxpMtKdW1pFTXklJdS0p1LamutaS61pLqWkuqay2prrWkutaS6lpLqmstqa61pLrWkupaS6pr LamutaS61pLqWkuqay2prrWkutaS6lpLqmstqa61pLrWkupaS6prLamutaS61pLqWkuqay2prrUO jNpaUqprSamuJaW6lpTqWlKqa0mpriWlupaU6lpSqmtJqa4lpbqWlOpaUqprSamuJaW6lpTqWlKq a0mpriWlupaU6lpSqmtJqa4lpbqWlOpaUqprSamuJaW6lpTqWlKqa317G/piOHOvnndBkxuxyzQF 3cVl59plvb9rsGm6DHUY/K6e3N16cnfryd2tJ3e3ntzdenJ368ndrSd3t57c3Xpyd+vJ3a0nd7ee 3N16cnfryd2tJ3e3ntxDenIP6ck9pCf3kJ7cQ3pyD+nJPaQn95Ce3EN6cg/pyT2kJ/eQntxDBpCs VzBw0AaQrFcwcNAGMENLwcBBG0BGXcHAQRvADC0FA6ftAGZoKRg5aMGkKgUjBy2YVKVg5KAFa2Mq GDlowdqYNoC1MRWMnLbB2pgKRnoAWBtTwUgPAGtjKhjnAZ6MJXsyluzJWLInY8mejCV7MpbsmVhy Taghh0a5qKZ54Y60L9yxPiRzdWNk9mJN8M8X7uise/DCHbl54Y4cuHCnKxRZf9V0DPANc7OfJ6P1 nozWezJa78lovSej9Z4srOHJwhqeLKzhycIaniys4cnCGp4srOHJwhreg9tpBQPdyYPbae/B7bSC ke4EbqcVjHQncDutYKQ7gQXdFYwcZ2BBdwUjxxlY0F3ByHEGFnRXMHKcgVkiCkbOtGCWSNm5gGDt gu4L6//nv/y3f7khLyizf+u68BikXN+p80lTV1BbaNpoqubh1UuJW87u/to1bDPFLusL6dSVruXs ULJW+Y/8cKTngKkq+h/nOULOg0LOg0LOg0LOg0LOg0LOg0LOg0LOg7IzD46AcTsBBSM9AEy9E3I+ E3I+E3I+E3Y+A1PvFIz0ADD1TsFIDwBT7xRs7Aru5mcDLSPdCczjUzDSncA8PgUj3QnM4xMP5vEp GOlOYB6fgpELCpjHJzsC6hEw0gNApbOQSmchlc5CKp2FVDoLqXQWUukspNJZSKWzkEpnIZXOQiqd hVQ6C6l0FlLpLKTSWUils4KRHgDm8QmpwRZSgy2kBltIDbaQGmwhNdhCarCF1GALqcEWUoMtpAZb SA22kBpsBQM9gBR0CynoFlLQLaSgW0hBt5CCbiEF3UIKuoUUdAsp6BZS0K1gpAeA6nAh1eFCqsOF VIcLqQ4XUh0upDpcSHW4kOpwIdXhQqrDhVSHC6MOr+Fb9GuS7gRKzYWUmisY6U6gakcCqNpRMNKd SLY6kGx1INnqQLLVgWSrA8lWB5KtDiRbHUi2OpBsdSDZ6kCy1eRdYULeFSbkXWFC3hUm5F1hQt4V JuRdYULeFSbkXWFC3hUm5F1hQt4VJuRdYULeFSbkXWFC3hUm5F1hQt4VJuRdYULeFSbkXWFC3hUm 5F1hQt4VJuRdYRJIgpm83kvI672EvN5LyOu9hLzeS8jrvYS83kvI672Eud5rCUU4lA8g2WryrjBh 7gqr74z0TZL6Ji8eE/LiMSEvHhPy4jEhLx4T8uIxIS8eE/LiMSEvHhPm4rHqm6Q7ITx6taxL6VtN aDoh2E3SN0lSnrwSTcgr0YS8Ek3IK9GEvBJNyCvRZOdKtBEwcHUi7y0T8t4yIe8tUzDQA4Qk5YUk 5YUk5YUk5YUk5YUk5YUk5YUk5YUk5YUk5YUk5YUk5YUk5YUk5YUk5QWsMaFgpAeQPLqQPLqQPLqQ PLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQPLqQ PLqQPLqQPLq0efT+O2sU7eZ92ylmM5nC6s2Njl9aU1ob6jE55EjiWkjiWkjiWkjiWkjiWkjiWkji WkjiWkjiWkjiWkjiWsi8UCGZNiGZNiHzQoUkx4RkjQRkjdJeYu626vHzT9pVj8NkojxXPS7XmLs4 BZnmqsfWmCzpRt3jK9OKOS/UPb564mq5+7bu8dUzI6+FG0qJTDFOZIpxIlOME5linMgU40SmGCcy xTiRKcaJTDFOZIpxIlOME5linMgU40Qm8iYykTeRubeJzL1NZO5tInNvE5kum8gM10TmkSYyjzSR eaSJzCNNZB5pIvNIE5lHmsg80kTmkSYyjzSReaSJzCNNZB5pIvNIE3nLUCJTPxOZ+pnI1M9Epn4m MvUzkamfiUz9TGTqZyJTPxOZrZnIBMtE5kQmMo0xkZmHSUABv4KB8xkZIktkiCyRIbJEhsgSGSJT MHJokHENQeIaVYqLWgaum2hYUXaCJI3L1PTN7FymphNkuIorOpOSM1Oyc1jRi0m6Izx0nVr5Ao2w 4tUTzbDi1TMjXx9cgCTlnZcZ2i/TGzM9v0qfpsk5IzK/SudivBWgverNrTcZDrzJMPQmm0Ofe8Fk PE3IeJqQ8TQh42lCxtMEzA5QsPZk2fSinfsdY/Qm2OspKaeQkrX1fseuCxerlc1Z+KBPjrXanK5v OfhYc8390e3ZYqTBiIQ/qwlxyISm/2NDPJKx1EjGUiO57YlkLDWCiQkKBm78IxnljWSUN5JR3khG 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 csIKRnoAyAkrGOkBICesYKQHgJywgpEeAHLCCkZ6AMgJKxjpASAnrGCkB4CcsIKRHgBywgpGegDI CSsY6QEgJ6xgpAeAnLCCkR4AcsKl1gAJRnoAyAkrGOkBICesYKQHgJywgpEeQHLChuSEDckJG5IT NiQnbEhO2JCcsCE5YUNywobkhA3JCRuSEzYkJ2xITtiQnLAhOWFDcsKG5IQNyQkbkhM2JCdsSE7Y kJywITlhQ3LChuSEDckJG5ITNiQnbEhO2JCcsCE5YUNywobkhA3JCRuSEzYkJ2wQTrjm8KOWke5E EsyGJJgNSTAbkmA2JMFsSILZkASzIQlmQxLMhiSYDUkwG5JgNiTBbEiC2ZAEsyEJZkMSzIYkmA1J MBuSYDYkwWxIgtmQBLMhCWZDEsyGJJgNSTAbkmA2JMFsSILZkASzIQlmQxLMhiSYDUkwG5JgNiTB bEiC2ZAEsyEJZkMSzIYkmA1JMBuSYDYkwWxIgtmQBLMhCWZDEsyGJJgNSTAbkmA2JMFsSILZkASz IQlmQxLMhiSYDUkwG5JgNiTBbEiC2ZIEsyUJZksSzJYkmC1JMFuSYLYkwWxJgtmSBLMlCWZLEsyW JJgtSTBbkmC2JMFsSYLZkgSzJQlmSxLMliSYLUkwW5JgtiTBbEmC2ZIEsyUJZksSzJYkmC1JMFuS YLYkwWxJgtmSBLMlCWZLEsyWpHEtmXRsSU7YkpywJTlhS3LCluSELckJW5ITtiQnbElO2JKcsCU5 YUtywpbkhC3JCVuSE7YkJ2xJTtiSnLAlOWFLcsKW5IQtyQlbkhO2JCdsSU7YkpywRTjhqj8jxxlJ MFuSYLYkwWx3CObmbUSyc0uZC8HGq9uIclFYyeRCvaVs4DJSNbPpqAevNpKhVpseXf64d0+SHLgn qcuk+ity+iNpd0vS7pak3S1Ju1uSdrck7W5J2t2StLslaXdL0u6WpN0tSbtbkna3JO1uSdrdkrS7 JWl3S9LulqTdLUm7W5J2tyTtbkna3ZK0uyVpd0vS7pak3S1Ju1uSdrck7e5I2t2RtLsjaXdH0u6O pN0dSbs7knZ3JO3uSNrdkbS7I2l3R9LujqTdHUm7O5J2dyTt7kja3ZG0uyNpd0fS7o6k3R1JuzuS dnck7e5I2t2RtLsjaXdH0u6OpN0dSbs7knZ3JO3uSNrdkbR7ubS841c1hNccA6BlpDuRcXU0gLnz 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 +RkM2mtcwKjw/AxGjjMqPD+DEYO25nOQUxAV65/BSA+gYv0zGOlOVKx/BiPdiYr1z2CkO0G1eRYw cg2gAuUzGOkBVNR9BiM9gAqUX8CgJKQFjBy0VAh/BiMHLcUHzGDkoIWSkBYwctBCSUgLGOkBUEbT AkZ6AJTRtICRHkDxTjMY6QHo/ozinWYw0gMQ3qnuacluUiTWDEa4U+1mGjLh1CT8pQ3KN8WIx2ba Cxg10xYwbKa9gFEz7QWMmmkvYOTXxGbaCxg1017AqJn2AkZNQRcw0gMohv8Chk2OFzDSAyiGfwYj PYBi+Gcw0gMohn8GIz2AYvhnMNIDKIZ/BiM9gGL4ZzDSAyiGfwYjPYBi+Gcw0gMohn8GIz2AYvhn MNIDKIZ/BiM9gGL4ZzDSAyiGfwYjPYBi+Gcw0gMoucAMRnoAlRw7g5EeQCXHzmCkB1DJsTMY6QFU cuwMBnpAwGQpFzDQAwImS7mAgR4QMFnKBQz0gIDJUi5goAcETJZyASM9ANO4XMBID6CSY2cw0gMw wcwFjPQAKjl2BiM9AFPfXMBID8DUNxcw0gMw9c0FjPQATDBzASM9ABPMXMBID8AEMxcw0gMwwcwF jPQATDBzASM9ABPMXMBID8AEMxcw0gOoNNUZjPQATH1zASM9AFPfXMBID8DUNxcw0gMw9c0FjPQA khMOJCccSE44kJxwIDnhQHLCgeSEA8kJB5ITDiQnHEhOOJCccCA54UBywoHkhAPJCQeSEw4kJxxI TjiQnHAgOeFAcsKB5IQDyQkHkhMOJCccSE44kJxwIDnhQHLCgeSEA8kJB5ITDiQnHEhOOJCccCA5 4UBywoHkhAPJCQeSEw4kJxxITjiQnHAgOeFAcsKB5IQDyQkHkhMOJCccSE44kJywkJywkJywkJyw kJywkJywkJywkJywkJywkJywIJxwTdAg3YkkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUk mIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUk mIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUkmIUk mAU9CZMEs5AEs5AEs5AEM3b77QxGegBJMGO3385gpAeQBDN2++0MRnoASTBjV+nOYKQHkAQzdi/v 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 ndAO8ib0ggoE9w5ysUF2XLbzPeGHm1/e3RoZ/fj7NB3f7r/5jeFgdh9O+6O//qWnp/z99PDp3W7Q nvPm5Yf8+XeeHnP+hbf3Dx9uHr+9t9wf8NK95dPPPOPVHJfTM4Bir1dvn/5z+/rlZ/U7F69wLj7n XFjW55xLvc4t4eWn9Lv14vz4089ceNtvlmdgrT8Ka70C1trxUdq0j9JNfvlZ/c69OMv79DPXf5Ry 90cpvfyUfrdenL59+pnOj1I+/iCs/OLo6tPPXP1RypP2UcrHl5/V79yLVJGnn7n6o5Tn7o/S9PJT +t16cdry6Wd6P0rLj8JaroC1dHyUuo/t5eblp/S7dcW5nZ89txsfou5ze1lffkq/W1ec2Dl2f4h+ 9MTNV5y4OXV8iNYLb/vbHy1GPx3+639/ykKfktDXnx8Pj7+eHk6Hd59KOrr/b29Of393e1Ly37a8 4ZfX8vjvH0+H45SO5T/f//rLb+bZQ7/xOew+9J/9ev3ocZ+vOO7z1v05/NHjOl9xXGewCNxFFsHq iKOr5V5dRIMwgHLdJgQpbpItSoZGZMikOy9XGpHZAC82LggsKsgEtZ98QW0RdJPkpbapSgoysnnK EJwMmTQO4UpwMhtopCWvqTJ4fbArRCoQ3MUUig0y0k7KUbe01w5hbi6MdI25CR51S1vRRkGmHHVL WyIFdJP8ord1ORVkvbJeu/2rZnjmGLZppy/MPUM8T+7tKJpDPE8/8VJ6vf+M8mrBi85lebauf/aW IU3dLevvO9bfPaS3btklPl9+sdfXz2m6VD9f7dUPNrx3CdGXvbq+9k1Tf+37fSPvu6f0u/Vy7bv/ TF/tm6YfrH13QdOXYeXrP0Pzsfdtx+87Xt89pdut+eVW9/4zV3+I5u5W9zONvO+e0u/Wy03u/Wee cet1ev3Mp3rubnJP3/eFvnvKM279093pl5vHd38//fPh07v/dTr8PKdylh1jnpYpl9xxiuGZT/f8 cvN7/5nn/opv5+f+ikuvu/Nz7v5g83zX5nzZraURcb+/r0rzD7a9d0nLlwE93/aebp77nIvX1W+/ v4v/7lnXfLhiCvE4TfvnK+Xj/v9/FuQVTj97jT2/nZ97XndOMG8vP6X/b3lFUjA/mxS8mZ7zqjsn SFc85Zo/YjpO6zYddx3pPKX1uD5zVbsLc77s7bPJwpJvn8leZvF2fHsO24+mDPMVKcP87O34lt88 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 oj2dJ1xbQRDtaU4oXzJeMCDU72ktmexnTZ5DbQVBtKcZSQYtO0UZSYY4rk6CUL+n43w6CUL9no4z XiQI9Xs6DnWRINTv6Th1QYJQv6fjoAUJQv2ejmMWJAgrAU9iWsLKb0XbkJFkiBMNJAiMja5E25CR ZNCSnLLlJBnCX4gQGBtdibYhI8kQWUklCIyNrkTbkFHpryV5+IDA2OhadLQaxuGtRXuaUdivJRUC AYGxpyUVAgGBsaclFQIBgbGntWhPMwr5taTcICAw9rSk3CAgMPa0pNwgIHB23NohaVZyG7GzbOU/ rqQjtCR1bg2jEF00QS8gMN6tJHUeEBjvVpI6DwgMey1JnccB1gwE0ffZM+y1pEkxjmuuR5B0KQYE hr2WtCkGBIa9lvQpBgSGvZY0KgYExp6WdCoGBMaelrQqBgTGnpb0KgYExp62oj3tGHt6rXhErxWP aEmLoTWMXF/s35IgML5rSVlLQGB816KyFsMo2NCishazliHkNGuJ5hUEWMbHLqpEMYwqDi2qRDF5 gqUVBNEBxigJ0ZLOxYDA2IZuzfWTtBsGWMbOkfQbBgTGJyyqkTGMGhkRZ3NAWEnUa85BtNbAqEVl LYZROKNFZS2GUTijRWUthlE4I6I/DQiM7SRhNw0IjFNNVCNjGDUyWlQjYxg1MlpUI2MYNTJa0pca EBgHmKQxNSAwDjBR9Y5h1NZoSfWOY6W7JNU7jpXuklTvOFa6y68FQiS9ro6VP5LUqjhW/khSq+JY +SNJrYpj5Y8ktSqO04+iJbUqjpUqktSqOFaqSFKr4lipIkmtimOlisa1bSgpL3Gs3Mu40sSh1/pe 9Vrjq17rfNVrra96rffVrPW+GkkNgTMMiiRRJZ7jBKeNpIYgIDBI3CQ1BM4weGuMpIbAcfpmjKSG ICDU71sjqSEICPX7NlbtZUpT4zp1paludH0/jHGS6lSa6nRsrqqpTZ1kJWtTp18UalOn30ieE4NZ UlIJ4TiJj1h7KEFgcEtKyiocJ/FhJGUVjpP4MJKyCsdJfMTaw5X/uHKkGEnxguOkF4ykeMFx0gtG UrzgOOkFIylecJz0gpEULzhOesFIihccJ70Qrzwr/1H0sTNyDkZSbxAQ1pwhDo2upETAGQYxlZGU CAQExukvKRFwnCSMkTASOE4SxkgYCRwnCWMkjAQuJmFWlmI8OkklhDOMVtpY5bbyH1flXrl5GEmJ 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 kS2gljNAEdkCajkDFJEtoJYzQBHZAmo5AxSRLaCWM0AR2QJqOQMUkS2gljNAEdkCajkDFJEtoJYz bG6JbAG1nAGKyBZQyxmgiGwBtZwBisgWUMsZoIhsAbWcAYrIFlDLGaCIbAG1nAGKyBZQyxmgiGwB tZwBisgWUMsZzqdEtoBazgBFZAus5ZSWyBZYyyktkS2wljOmwuBBYbawRLbAWk5piWyBtZzSEtkC azmlJbIF1nJKS2QLrOWUqJ5RMRRmi4bIFljLKRsiW2Atp2yIbIG1nLIhsgXWcsqGyBZYyykbIltg LadsiGyBtZyyIbIF1nJKoupRYS2nJKoeFdZySqLqUWEtpySqHhXWckqi6lFhLackqh4V1nJKoupR YS2nJKoeFdZySmIUtMJaTtkS2QJrOSVRy6mwllMStZwKazklUcupsJZTErWcCms5JVHLqbCWUxK1 nAprOSVRy6mwllMStZwKazklUcupsJZTErWcCms5JVHLqbCWUxK1nAprOSVRy6mwllMStZwKazkl UcupsJZTErWcCms5JVHL2Z95+QUUjy001nJKopZTYy2nJGo5NdZySqKWU2MtpyJqOTXWciqillNj Laciajk11nIqopZTYy2nImo5NdZyKqKWU2MtpyJqOTXWciqillNjLaciajk11nIqopYT1rUIUEQt p8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F 1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRyaqzl VEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafG Wk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRy aqzlVEQtZ381whdQRLbAWk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F 1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRyaqzl VEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafG Wk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRy aqzlVEQtp8ZaTkXUcmqs5VRELafGWk5F1HJqrOVURC2nxlpORdRyaqzlVEQtp8ZaTkXUcmqs5VRE LafGWk5F1HJqrOVURC2nxlpOzdTGYC2nZgpWsJZTMwUrWMupiSoSg7WcmqgiMVjLqYkqEoO1nJqo IjFYy6mJKhKDtZyaqCIxWMupiSoSg7WcmqgiMVjLqYkqEoO1nJoo7TBYy6mJ0g6DtZyaKO0wWMup idIOg7WcmijtMFjLqYnSDoO1nJoo7TBYy6mJ0g6DtZyaKO0wWMupidIOg7WcmijtMFjLqYnSDoO1 nJoo7TBYy6mJ0g6DtZyaKO0wWMupidIOg7WcmijtMFjLqYnSDoO1nJoo7TC9Ws7Mgu07nLyC7Yfv 1/fhn91DP/x6d/8Yev0y0G2jhX7x+J/uN5tXvzulzJ+GBujwcGBgGtFa1XrX37PyrdDWt71jnzUg T/3nVrB3Qhx+UY8P4HnDhsEMjUSH53sFntnP2/Wf97yf1/BBjRX9DypbY5xtZS/X5T9o7D9zpk2/ fv28Wdx9Cz0OTrdtrzENeGj+aROm5tXmoc9QpGmb8AJhszA442aLtx+T83oH1w7MvsZbZYVqBkH+ bXoKhj/myMYGH+OIvGtgsNFsOv/xw/t8mJdfWcfUz8b0Oryyv3LX/3/AV1Yy8ZV1jNXVTduKYV75 I+DAK+hmYIh23NZfwil/iGL/eUP08fzsQsgLcfjxZNb/xEraVsfQ4oEn3v7eH2Oa88TP/Rc9sUw8 caNNg5646RdxZT9x1z9zGipvYn5X7fKmoVOyeHnbQZjB5SK8lXcOXcqlZ3gfSM9rNG1MwmV6xbBZ H+EJ5j/gI9gUF8TqhE5YbdvvP8LV3f39t6+PB5ef767+fiD6Bkm78Anj2t7868u371rsOry636wf Nwdfbh4ebm5/Cc//P2+733UXO3rRTRZoY0TTOONtD+jThkN5dfjl6+f+dfy5i/4ZtPvdw5CcAKEJ ELCMffiO4yFgCE6AsAQIWLZe+YYAAcvVB94lQMAy9co7AgQsT6+8J0DAsvQ6bsRHQ6BDW4CQBAjk 2gkQBOuGITQBgmDdMHQmQBCsG4bMBAiCdcNQmQBBsG4YIhMgCNbdGxrzer1RxetNwSL31E3WImdl OIl562UP6Ov2cmT7/pfOb29Gtm9HtnfF7Qs+2lM3OR8t7qQaHQ6eozCfevnTwe7/TQ4e79e/be4f 1p8PPt3c3jz8urk+ODw8fPEHX+5+ix1e3zxc3d3ehqcKf9E9VGcNn+8eHv8/n+6+3W6bvfqrHWx3 MG+f7y9Dh5vXTYeaGfmiiH1Bs/ZFoZyiZja72baJtS9yV+U3KUZ5kQopv4kqb6LLm2R/1ucmtrxJ 8SC/SN2T38SVN/HFTWT2jH5uUv71ZfnXl+VfX5Z/fVn+9WX515flX1+Wf31Z/vVV+ddX5V9flX99 Vf71VfnXV+VfX5V//Xz2f25S/vVV+dfX5V9fl399Xf71dfnX1+VfX5d/fV3+9XX519flX1+Xf31T /vVN+dc35V/flH99U/71TfnXN+Vf35R/fVP+9U3517flX9+Wf31b/vVt+de35V/fln99W/71yzfw L0KS85uUf/2m/Os35V+/Kf/6TfnXb8q/flP+9Zvyr9+Uf/2m/Os35V8//xT73KT867flX78t//pt +ddvy79+W/712/Kv35Z//bb867vyr+/Kv74r//qu/Ou78q/vyr++K//6rvzru/Kv78q/vi//+r78 6/vyr+/Lv74v//q+/OuXu9R0hUvNl399X/z1X4TY5Dcp/vqm3Ndnyn19ptzXZ8p9fabc12fKfX2m 3Ndnyn19ptzXZ8p9fabc12fKfX2m3Ndnyn19ptzXZ8p9fabc12fKfX2m3Ndnyn19ptzXZ8p9fabc 12fKfX2m3Ndnyn19ptzXZ/J9fc/3SaFZ/uniVbPiLbYvX/99+frvy9d/X77++/L135ev/758/ffl 678vX/99+frvy9d/X77++/L135ev/758/ffl678vX/99+frvy9d/X77++/L135ev/758/ffl678v X/99+frvy9d/X77++/L135ev/758/ffl678vX/99+frvy9d/X77++/L13xes/09Niu/6QpPyr198 1xealH/94ru+0KT86xff9YUm5V+/+K4vNCn/+sV3faFJ+dcvvusLTcq/fvFdX2hS/vWL7/pCk/Kv X3zXF5qUf/3iu77QpPzrF9/1hSblX7/4ri80Kf/6xXd9oUn51y++6wtNyr9+8V1faFL+9Yvv+kKT 8q9ffNcXmpR//eK7vtCk/OsX3/WFJuVfv/iuLzQp//rFd32hSfnXL3dEmOK7vtCk/OsX3/WFJuVf v/iuz5viu77QpPzrF9/1hSblX7/4ri80Kf/6xXd9oUn51y++6wtNyr9+8V1faFL+9ct9fabc12fK fX2m3Ndnyn19ptzXZ8p9fabc12fLfX223Ndny319ttzXZ8t9fbbc12fLfX223Ndny319ttzXZ8t9 fbbc12fLfX223Ndny319ttzXZ8t9fbbc12fLfX223Ndny319ttzXZ8t9fbbc12fLfX223Ndny319 ttzXZ8t9fbbU19dETWB5k8J3iU0K3yU2KX+XUs9VbFI4k2OTwpkcmxTO5NikcCbHJuWfstQNFZuU f8pSN1RoUuqGik3KP2WpGyo2Kf+UpW6o2KSQlGKTwq8fEzYZU3zJvW9WiVY43/bNCufcvlnhvNs2 K7743jfLnn/PionYtAmHwopQ4a5p4/NdI981zT+9f990BGr2hPtDUy9KHWexWatF6aZg36zCMmKz CsuIzSrfrcIyYrMKywjNSi8G980KmXnfrJCd980KGXrfrG6WlF4W7pvVzZLSrde+Wd0sKd2C7ZqV bsP2zepmSel2bN+sbpaUbsv2zepmSemObt+sbpaU7uz2zepmSekOb9+sbpaU7vT2zepmSemOb9+s bpbU7Pxis7pZUnoRuW9WN0tKLyT3zepmSenF5L5Z3SwpvaDcN6ubJaUXlftmdbOk9MJy36xulpRe XO6b1c2S0gvMfbO6WVJ6kblvVjdLSi80983qZknpxea+Wd0sKb3g3DermyWlF537ZnWzpPTCc9+s bpaUXnzum9XNktIL0H2zullSehG6b1Y3S0ovRPfN6mZJ6cXovlndLKnxEcVmdbOkxkcUm1XNElnj I4rNqmaJLL043TermiWy9AJ136xqlsjSi9R9s6pZIksvVPfN6mZJ6cXqvlndLCm9YN03q5slpRet +2Z1s6T0wnXfrG6WlF687pvVzZLSC9h9s7pZUnoRu29WN0vqfK+yzvcq63yvss73Kut8r7LO9yrr fK+yzvcq63yvss73Kut8r7LO9yrrfK+yzvcq63yvss73Kut8r7LO9yrrfK+yzvcq63yvss73Kut8 r7LO9yrrfK+yzvcq63yvss73Kut8r7LO9yrrfK+yzvcq63yvssr32tbtFNq6nUJbsFN4fVPbtgUp Wb9vWmMJXuX78v6AGJrWvmdoWvH5Xay5VtesYo7GZhWTLTar+BCxWQUlhWY1LtzYrGJqx2YVlBSb VVBSbFb3uWtcuLFZ3ZysceHGZnWzpMaFG5rVuHBjs0pyiE3rZkqNYzU2q/t2NY7V2Kzu29U4VkOz GsdqbFZn4TWO1diszsJrHKuxWd0sqXGsxmZ1s6TGsRqbVc0SXeNYjc2qZklxpYl9s6pZUlxxYt+s apYUV57YN6uaJcUVKPbN6mZJjWM1NqubJTWO1disbpbUOFZjs7pZUuNYjc3qZkmNYzU2q5slNcel 2KxultQel0LTfCfdd03zBTLfNc3f8f2haUldk++bFk6BcKAwzhU7W/fNCmfOrlmps3XfrHDm7JsV 8su+WSG/7JsV8su+WSG/7JsV8su+WSG/7JvVzZJSZ+uuWamzdd+sbpaUOlv3zepmSamzdd+sbpaU Olv3zepmSamzdd+sbpaUOlv3zepmSamzdd+sbpaUOlv3zepmSamzdd+sbpaUCl33zepmSaliddes 1Ee0b1Y3kqU+ol2zUvdEbOaFLD1BbpsVn0S2zYoz2HXNTLEncd+swt5iswp7i80qZklsVjFLYrOa z22KPYn7ZjWzxBR7EvfN6mZJqRdx36xulpSKQffN6mZJqc9y36xulpR6EffN6r5bqRdx36zuu5V6 EffN6r5bqRdx26y4El7XrCk+i++b1Xy3priK5L5ZzXdriqtJ7ptVjmTNd2uKy97tm9U9ZM2GPjar IYWmuAzevlnN0tEUl8PbN6ubyjUb+tisbirXbOhjs7pZUrOhj83qZknNhj42q5slpZFrXTNXXAxq 36zm3VxxUahds6pF2BUXh9o3q7EAV1wkYt+sxgJccR6NfbMaC3DFeTT2zepmSdVBzBXn0dg3q/pu xaUEds2q9iWhWfkHsEIVpxvaNasg865Z+Zy0wtiKHZ4VTVvhxe6a1bxbaFZupl2zyncrN9PYrMJl 2zUrN9OuWbmZxmYV25muWc1UdnUjGZrV2FtoVjOSoVnNSLq24j6ga1Y3klWTKzSrsbfQrMbeQrMa ewvN6mZJxfGha1Y3S6rszdXZm6u1t4rjQ9esbpZUHB+6ZnWzpOL40DWrmyUVx4euWd0sqTg+dM3q Zklp4ot9s7pZUip/3jermyWliS/2zepmSalqet+sbpaUqqb3zepmScVdR9esbpZU3HV0zepmScVd R9esbpZU3HV0zepmScVdR9esbpZU3HV0zepmScVdR9esbpZU3HV0zepmSYVTp2tWN0sqnDpds7pZ UuHU6ZrVzZIKp07XrG6WVDh1umZ1s6TCqdM1q5olrsKp0zWrmiWuVJ+9b1Y1S1ypPnvfrGqWuFJ9 9r5Z1SxxFaqIrlndLCnVZ++b1c2SCtdf16xulpTqs/fN6mZJqT5736xullSIc7tmdbOkwvfaNaub JRV3wl2zullScSfcNaubJRV3wl2zullSocXumtXNkgotdtesbpZUebFDs7pZUuXFDs3qZkmd79XV +V5dne/V1fleXZ3v1dX5Xl2d79XV+V5dne/V1fleXZ3v1dX5Xl2d79XV+V5dne/V1fleXZ3v1dX5 Xl2d79XV+V5dne/V1fleXZ3v1dX5Xl2d79XV+V5dne/V1fleXZ3v1dX5Xl2d79XV+V5dne/V1fle C4p2vG5WN0vqfK+uzvfq6nyvrs736up8r67O9+rqfK+uzvfq6nyvrs736up8r67O9+rqfK+uzvfq 6nyvrs736up8r67O9+rqfK+uzvfq6nyvrs736up8r67O9+rqfK+uzvfq6nyvrs736ut8r77O9+rr fK++zvfq63yvvs736ut8r77O9+rrfK++zvfq63yvvs736ut8r77O9+rrfK++zvfq63yvvs736ut8 r77O9+rrfK++zvfq63yvvs736ut8r77O9+rrfK++zvfq63yvvs736ut8r77O9+rrfK++zvfq63yv vs736ut8r77O9+rrfK++zvfq63yvvs736ut8r77O9+rrfK++zvfq63yvvs736ut8r77O9+rrfK++ zvfq63yvvs736ut8r77O9+rrfK++zvfq63yvvs736ut8r77O9+rrfK++zvfq63yvvs736ut8r77O 9+rrfK++zvfq63yvvs736ut8rwWlmV83q5sldb5XX+d79XW+V1/ne/V1vldf53stqIv9ulndLKnz vfo632tB9e3XzepmSZ3v1df5Xn2d79XX+V59ne/V1/lefZ3v1df5Xn2d79XX+V59ne/V1/lefZXv 1Ysq32toVjNLQrOaWRKa1cyS0KxmloRmNbMkNKuZJaFZzSwJzWpmSWhWN0uqfK+hWd0sqfK9hmZ1 s6TK9xqa1c2SKt9raFY3S6p8rzFFXVWzKt9raFY3S6p8r6FZ3Syp8r2GZnWzpMr3GprVzZIq32to VjdLqnyvoVndLKnyvYZmdbOkyvcamtXNkirfa2hWN0uqfK+hWd0sqfK9hmZ1s6TK9xqTa9Y1q5sl Vb7X0KxullT5XkOzullS5Xv1osr3GprVzZIq32toVjdLqnyvoVndLKnyvYZmdbOkyvcamtXNkirf a2hWN0uqfK+hWd0sqfK9hmZ1s6TK9xqa1c2SKt9raFY3S6p8r6FZ3Syp8r2GZnWzpMr3GprVzZIq 32toVjdLqnyvoVndLKnyvYZmdbOkyvcamtXNkirfa2hWN0uqfK+hWd0sqfK9hmZ1s6TK9xqa1c2S Kt9raFY3S6p8r6FZ3Syp8r2GZnWzpMr3GppVzRJZ53uVdb5XWed7lXW+V1nne5V1vldZ53uVdb5X Wed7lXW+V1nne5V1vldZ53uVdb5XWed7lXW+V1nne5V1vldZ53uVdb7X4hLa+2Z1s6TO9yrrfK+y zvcq63yvss73Kut8rzX137pmdbOkzvdaU/+ta1Y3S+p8rzX137pmdbOkzvdaU/+ta1Y3S+p8rzX1 37pmdbOkzvdaU/+ta1Y3S+p8rzX137pmdbOkzvdaU/8tNqvzvdbUf+ua1c2SOt9rTf23rlndLKnz vdbUf+ua1c2SOt+rrPO91pSN65rVzZI636us873KOt+rrPO9yjrfq6zzvco636us873KOt+rrPO9 yjrfq6zzvdZUQOya1c2SOt+rrPO9yjrfq6zzvco636us873KOt+rrPO9yjrfq6zzvdYUvOya1c2S Ot+rrPO9yjrfq6zzvco636us873KOt+rrPO9yjrfq6zzvdZUUw3NVJ3vVdX5XlWd71XV+V5Vne9V 1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV +V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5 XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fle VZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5V ne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd 71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V5Vne9V1fleVZ3vVdX5XlWd71XV+V51ne9V1/ledZ3v Vdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V 1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX +V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5 XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/le dZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51 ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5XnWd71XX+V51ne9V1/ledZ3vVdf5Xk2d 79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v 1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V 1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU +V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5 Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1Ple TZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5Nne/V1PleTZ3v1dT5Xk2d79XU+V5N ne/V1PlebZ3v1db5Xm2d79XW+V5tne/V1vlebZ3v1db5Xm2d79XW+V5tne/V1vlebZ3v1db5Xm2d 79XW+V5tne/V1vlebZ3v1db5Xm2d79XW+V5tne/V1vlebZ3v1db5Xm2d79XW+V5tne/V1vlebZ3v 1db5Xm2d79XW+V5tne/V1vlebZ3v1db5Xm2d79XW+V5tne/V1vlebZ3v1db5Xm2d79XW+V5tne/V 1vlebZ3v1db5Xm2d79XW+V5tne/V1vlebZ3v1db5Xm2d79XW+V7t/5+6v9uRZdnOM81zXcU6awmo FtLd7bcAnfQV1B0UKHKrREgihU1Wdamvvm1EuIX2jJxrzRhPgcAm/044352Zbp+7m71jmLm512ru tZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWa e63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mXtt 5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZe m7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu5 12butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm 7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61 mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWbe+3mXru5127utZt7 7eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3m Xru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67 uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nX bu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127u tZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127udZh7HeZeh7nXYe51mHsd5l6Huddh7nWY ex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd 5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZe h7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe5 12HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh 7nWYex3mXoe512HudZh7HeZeh7nXYe51mnud5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51 mnud5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7 neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51mg2dpjWnac1pWnOaaJwm GqeJxmmicZponCYap4nGaaJxmmicJhqnicZponGaaJwmGqeJxmmicZponCYap4nGaaJxmmicJhqn icZponGaaJwmGqeJxmnqb5r6m6b+pqm/aepvmsOb5vCmObxpDm+aw5vm8KY4vOPrS2RcYHC/BQbD HRgMd2Aw3IHBcAcGwx0YDHdgONxwdy9MZFxglhKRcYFZSkTGBWYpERkXmKVEZFxglhKRcYFZSkTG BWYpERkXmKVEZFxglhKRcYFZSkTGBWbDLeYpMLskYp4WJuYpMLtxxDwFZjeOmKfA7MYR8xSYpUS6 /gKzlIjnCsxSInosMEuJ6LHALCXS9ReYpURkXGCWEpFxgVlKRMYFZikRGReYpURkXGA2bqLHArNx Ez0WmI2b6LHAbNxEjwVmd7foscAsJaLHArOUiB4LzFIifXiBWUrEzgRmKUE7Ix1Wx1qtU0oOkzqH SZ3DpM5hUucwqXOY1DlM6hwmdQ6TOofZGToTdWEiiAOzX1K8cmCUSToTNTDKJJ2JGhhlks5EDYxS QmeiBkYpoTNRA6OU0JmogVFK6EzUwCgldCZqYJYS09F0JmpglhLT0XS4aWA23OaV6XDTwGi4aXNl YPbTTLPQ5srAKFy0uTIwegTR5srAKJO0uTIwS4lpFtpcGZilxDQLba4MzFJimoU2VwZmKZGep4WZ naFdkoHZcJudoV2Sgdlwm52hXZKB4XDbQ8HsDO2SDMxSYnaGdkkGZimRVqnALCXSKhWYpcRWwrRL MjBLia2EaZdkYJYSWwnTdsfAaLhpu2NgNNy03TEwGm7a7hgYDTdtdwyMHgq03TEwS4ktaWm748Ks LYX2iAVmA2BtKbRHbGHWlkJ7xAKz21T2iAVmt6nsEQvMUmKdOrRHLDBLiXXq0B6xwCwl1qlDe8QC s5RYpw7tEQvMUmIuaJoLoh1pgdlwmwua5oKmuSDa/xYYDrc9FMwF0f63wCwl5oJo/1tglhJzQbT/ LTBLiTX40P63wGy4zQXRRrbAZLhPq4idVhE7rSJ2WkXstIrYaRWx0ypip1XETquInVYRO+krgYHZ uFFp67TS1knf7QvMxo22TJz03b7AbNxobXrSB/gCs+GmReZJH+ALzIabFpknfYAvMBtuWmSe9AG+ wCwltMg86QN8C6NF5kkf4AvMUkKLzJM+wBeYpYQWmSd9gC8wSwn1KZz0Ab7ALCW0Nj3pA3yBWUpo bXrSB/gCk+EudHp6YHJJCp2eHphckkKnpweGV1JunGINPsUafIo1+BRr8CnW4FOswadYg0+xBp9i DT7FGnyKNfgUa/Ap1uBTrMGnWINPsQafYg0+xRp8ijX4FDo9fWEkdYr1BRXrCyrW4FOsU6dYp06x Tp1inTrFOnWKdeoU69Qp1qlTrFOnWKdOsU6dYp06xTp1inXqFOvUKdapU6xTp1inTrFOnWKdOsU6 dQqdZx6YpYQafIo1+BRr8CnW4FOswadYg0+xBp9iDT7FGnyKNfgUa/Ap1uBTrMGn0HnmgVlKyNAX Os88MEsJ1QMKnWcemKWE6gGFzjMPzFJC9YBC55kHZimhXrVivWrFetWK9aoV61Ur1qtWrFetWK9a sV61Yr1qxXrVivWqFetVK9arVqxXrVivWrFetWK9ao2+3x2Y/G2Nvt8dGP5tcgc0+n53YHIHNPp+ d2ByBzT6fvfCaM7V6PvdgVlKaM7V6PvdgVlKaM7V6PvdgVlKaM7V6PvdgVlKaM7V6PvdgVlKaM7V 6PvdgVlKaM7V6PvdC6M5V6PvdwdmKaE5V6PvdwdmKaE5V6PvdwdmKaE5V6PvdwdmKaE5V7MKdLPi brPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrPibrMqbbMqbbMq bbMqbbMqbbMqbbMqbbMqbbPTG5oVd5ud3tCsJtysJtysJtysJtysJtysJtysJtysJtysJtysJtys JtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtys JtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtysJtys JtysJtysJtysJjxMfAwTH8PExzDxMUx8DBMfw8THMPExTHwMEx/DxMcw8TFMfAwTH8PExzDxMayr fZgvGeZLhvmSYb5kmC8Z5kuGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGG rXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGrXGGLVaG tV0Oa7sc1nY5rO1yWNvlsLbLYW2Xw9ouh7VdDmu7HNZ2Oaztcljb5bC2y2FHBA47InDYEYHDjggc dkTgwiwltlyftly3kwWHnSw47GTBYScLDjtZcNjJgsNOFhx2suCgIwJPOxc7MLgkpx2nfdpx2qcd p33acdqnHad92nHapx2nfdpx2qcdp33acdqnHad92nHapx2nfdpx2oFZSmTVEZilRFYdgVlKZNUR mKVEVh0Lk1VHYJYSqawEZimRysppJ8OfdjL8aUe8n3bA9WlHTp/npPfbwiST1xe93xYmmVyYZHJh MgALk0wuTDK5MBnuhcmTq0yx2IHJlVyYXMmFyZVcmFzJYjdOsRun2o1T7capduNUu3Gq3TjVbpxq N061G2dhkpKFWUpoYrgwSwlNDBdmKaGJ4cIsJTQxXJilhCaGC7OU0MRwYZYSmhguzFJCE8OFWUqk dyYwG27Z27cwEfuB2XCL2A/MhlvEfmA23CL2A7OUiNgPzFIiYj8wS4mI/cAsJSL2A7OU0EJsYZYS EfuBWUpE7AdmKRGxH5ilRMR+YJYSEfuBWUpE7AdmKSGxH59QN4z+tsOm2IdNsQ+bYh82xT5sin3Y FPuwKfZhU+zDptiHTbEPm2IfsiMtMLuSsiNtYeRLFoY/zcaNNMvCaNxO0yynaZbTNMtpmuU0zXKa ZjlNs5z2DjjtHXDaO+C0d8Bp74DT3gGnPV5Pe7ye9ng97fF6msE4zWCcZjBOUxGnqYiTalQLs+E2 g3GawTjNYJxmME4zGKcZjNMMxmkG4zSDcZrBOM1gnGYwTjMYpxmM0wzGaQbjNINxmsE4zWCcZDC6 madu5qmbeepmnrqZp27mqZt56maeupmnbiqim4roX7IlMDALl2wJDMzCJXv7ArOUyN6+wGy4ZW9f fM3WhlvOQgrMhlvOQgrMniVyFlJglhI5CykwS4mchRQfL7aUyFlIgVlK5CykwCwlZJ4WZimRs5AC s5TIWUjxrWobbup5WpiNGzm8hdm4kcNbmI0bObx+kMNbGA33QQ5vYZSSgxzewiglBzm8bnWcbnWc bnWcbnWcbnWcbnWcbnWcbnWcbnWcbnWcbnWcbnWcbnWcfpAvWZj9beRLFmZ/m627D1t3H7buPmzd fdi6+7B192Hr7sPW3Yetuw/q+OgHdXwszFJCHR8Ls5RQx8fCLCXU8bEwS4lplsM0y2Ga5TBfcthK +LCV8GEr4cNWwoethA9bCR+2Ej5sJXzYSviwlbD1YHTrwejWg7EwS4mthA9bCR9yKnBglhLaa7Qw S4mtu613plvvTLfemW69M916Z7r1znTrnenWO9Otd6ZbE0y3JphuTTDdmmC6NcF0a4Lp1gTTrQlm YTbctoA+bQFtnTrdWm66tdx0a7np1nLTreVmYTbc1KnTrVOnW6dOt06dbp063Tp1unXqdOvUmSb2 5xdNZ6bVAxYmUZ5WRphWRphWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hW D5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5hWD5gHzYIWZimhWdDCLCU0C1qYpYRmQQuzlNAs aGGWEpoFLcxSQv3KC7OUUL/ywiwlVH+bVn+bVn+bVn+bVhGbVhGbVhGbVhGbVhGbVhGbVhGbVhGb VhGbVhGbVhGbVhGbVhGbVhGbVhGbVhGbVhGbVtqaBzV5TittTSttTSttTSttTSttTSttTSttTStt TSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTSttTStt TSttTatRTdvfPa20Na20Na20Na20Na20Na20Na20Na20Na20Na20Nam0dR20fgsMUhIYpCQwSMnC pBEyMBjuwGC4A4PhDsyGW5Z9gdlwy7IvMBtuWfYFZimRZV9glhJZ9gVmwy3b5gKzv01WVIHZHSAr qsDsDpAVVWB2B8iKKjC7A2RFFZilRFZUgVlKZEUVmKVEVlSBWUpkRRWYpURWVIFZSmRFFZilRFZU gVlKZEUVGKWEVlSBUUqoWTAwSgktxAKjlNBCLDBKCS3EArOUyEIsMBtuWVEFZsNtKypqFgzMhluq 64HZcEt1PTB7KEh1PTBLiVTXA7OUSHU9MEuJVNcDs5RIdT0wS4lU1wOzlEh1PTBLiWkWOtYrMBtu 2aYamA232Rk61iswG26zM3SsV2CWErMzp9mZ0+zMaXbmNDtzmp05zc6cUpQPzFIiRfnALCWyTXVh UssPzFIiu1sDs5TIaWCB2XDLaWCB2XDLaWALk9PAArPhNj95mp88zU+e5idP85On+cnT/ORpfvI0 P3manzzNT57mJ08TjaeJxtNE42mi8TTReJpoPE00niYaTxONp4nG00TjaaLxNNF4mmi8TDReJhov E42XicbLRONlovEy0XiZaLxMNF4mGi8TjZd0fARmKTE/eZmfvMxPXuYnL/OTl/nJy/zkZX7yMj95 mZ+8zE9e5icv85OX+cnL/ORlfvIyP3mZn7zMT14mGi8TjZeJxsvawC7zk5f5yctE42Wi8TLReJlo vEw0XiYaLxONl4nGy0TjZaLxMtF4mWi8TDReJhovE42XicbLRONlovEy0XiZMbzMGF5mDC8zhlez 4Tb1d5n6u0z9Xab+LlN/l3U0XqT+LpuZXzYzv2xmftnM/LKZ+WUz88tm5pfNzC+bmV82M79sZn7Z zPyymfllM/PLZuaXzcwvm5nHb2mYpYQm9JdN6C+b0F82ob9sQr/+y1JC64DL1gGXrQMum9Cv6y/D bZ/Eu+yTeJd9Eu+yT+Jd9km8yz6Jd9kn8S77JN5ln8S77JN4l30S77JP4l32SbzLPol32SfxLvsk XmCWElrSVuudqdY7U613plrvTLXemWq9M9V6Z6r1zlRrgqlWga5WgV6YXUkqXFcrXFcrXFcrXFcr XFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcrXFcr XFcrXFcrXNdE4frv/v7Pb6glhYrX1aRVNWlVTVpVk1bVpFU1aVVNWlWTVtWkVTVpVU1aVZNW1aRV NWlVTVpVk1bVpFU1aVVNWlWTVtWkVTVpVU1aVZNW1aRVNWlVrXhdzXVVK15Xq0JXq0JXq0JXq0JX q0JXq0JXq0JXq0JXq0JXq0JXq0JXq0Kv/7aUUPG6WvG6WvG6WvG6WvF6YZYS2iVTrVRerVRerVRe rVRerVRerVS+MEsJVdgrlkku2lyzMBtu2u6yMBs32u6yMBs3k42XycbLZONlsvEy2XiZbLxMNl4m Gy+TjZfJxstk42XW8DJreJk1LKb/ium/YkKumJArJuSKCbliQq6YkCsm5IoJuUI7SRZG91sxGVeo X21hlhJTf8XUXzH1V0z9FVN/hdRft/203fbTditLditLditLditLditLditLditLditLditLditL ditLditLditLditLditLditLditLditLditLditLditLditLditLditLditLditLditLditLditL dttP260k2a0k2a1rv1vXfrcCaLcCaLcCaLcCaLcCaLcCaLeSZLeSZLeSZLeSZLeSZLeSZLeSZLeS ZLeSZLeSZLeSZLeSZLeSZLeSZLeSZLeSZLeSZLeSZLeS5Pyit+nC5ErOL3qbLkyu5MLkSi7MriS9 TRcm99vC5H5bmNxvC7OU0Nt0ftHbdGGWEnqbLsxSQu1EC7OU0Lt7YZYSencvzFJC7+6FWUro3b0w Swm9uxdmw00v4YXZcNNLeH7RS3hhdiWp5WZhNgDUqbMwGwDq1Jlf1KmzMLvfqFNnYXa/UafOwiwl 1KmzMEsJdeoszFJCnToLs5RQp87CLCXUqbMwSwl16izMUkKdOguzlFCnzsIsJdSpszBLCXXqLMxS Qp06C7OUUIPPwiwlVLZbmKWE+oIWZimhat/CLCVU7VuYpYSqfQuzlFC1b2GWEqr2LcxSQtW+hVlK qNq3MEsJVfsWRik5qNq3MErJQdW+hVFKDqr2LYxSclC1b2GUksP85GF+8jA/eZifPMxPHuYnD/OT h/nJw/zkYX7yMD95mJ88zE8e5icP85OH+cnD/ORhfvIwP3mYnzzMTx7mJw/zk4f5ycP85GF+8jA/ aR+9nPbRy2kfvZz20ctpH72c9tHLaR+9nPbRy2kfvZz20cuFWUrsbWrfypz2rcxp38qc9tHLad9c nPbNxWnfXJz2zcVp31yc9s3Fad9cnHbc3LTj5qYdNzftuLlpx81NO25u2nFz046bm3bc3LTj5qYd NzftuLlpx81NO25u2nFz046bm3bc3LTj5qYdNzftuLlpx81NO25u2nFz046bm3bc3LTj5qZ9qnHa KXXTPtU47VON0z7VOO1TjQuzlFhFzL7wOO0Lj9O+8LgwS4lVxOwLjwuzlFhFzD4MOe3DkNM+DDnt w5DTPgw57cOQ0zayTdvINu3DkNP2v03b/zZt/9u0/W/T9r9N2/82bf/btP1v0/a/Tdv/Nm3/27T9 b9P2v03b/zZt/9u0/W/T9r9N2/82bf/btP1v0/a/Tdv/Nm3/27T9b9P2v03b/zZt/9u0/W/T9r9N 2/82bf/btP1v0/a/Tdv/Nm3/27T9b9P2v03b/zZt/9u0/W/TDgCddgDotN1203bbTdttN2233bTd dtN2203bbTdtt9203XbTdttN2203bbfdtN1203bbTdttN2233bTddtN2203cbWcHgE47AHTa1yun nRs67dzQaeeGTjvJc9pJntNO8px2kue0kzynneQ57STPaSd5TjvJc9pJntNO8px2kue0kzynneQ5 7STPaSd5TjvJc9pJntNO8px2kue0kzynneQ57STPaSd5TjvJc2GWEhONdiTntCM5px3JOe1IzmlH ck47knPakZzTjuScdiTnpCM5y0FRDgyuZGBwJQODK7kwEfuB2ZWU+y0wuN8Cg/stMLjfArOUyP0W mKVE7reFyf0WmKVExH5glhIR+4HZcIuhD8yGWwx9Oejk3MBouIsY+sBouOmc3sDooUDn9AZGKaFz egOzlIihD8xSIoY+MEuJGPrALCVi6AOzlIihD8xSIoY+MBtuUe2B2XCLag/MhltUe2A23KLaFyaq PTB7KIhqD8xSIqo9MEuJqPbALCWi2gOzlIhqD8xSIqo9MEuJqPaFiWgMzP42EY2B4d9md4CIxsDs DhDRGJjdASIaA7OUiGgMzFIiojEwS4nZmWJ2ppidKWZnitmZYnammJ0pZmeK2ZlCdqbaHVDtDqh2 B1S7A6pFuVpKqqWkWkqqpaRqSsjhLQwHQJ4lC5NnSS3k8BZmKSGHtzBLCTm8hVlKSP0tzFJC6m9h lJJK6m9hlJJK6m9hlJJK6m9hlJJK6m9hlJJK6m9hlhJSfwuT4e6VxMfC5JIsTC5JryQ+FiY3zsLs SpL4WJjcOAuTG2dhcuMszFJC4mNhlhISHwuzlJD4WJilhMTHwiwl0mMYmKVEegwDs5TI/u7ALCXS 0RiYpUQ6GgOzlEhHY2A23OTwFmYDQA5vYTYA5PAWZgNADm9hOG52m5LDW5ilhAzGwiwlZDAWZikh h7cwSwk5vIVZSsjhLcxSQnZmYZYS0iwLs+EmzbIwGzfyJQuzcSPxsTC7JOQUeiM5sDDKZKNV/sLo ydVolb8winKjVf7CcNzoDmi0yl8Y3QHN5ECjBp+FWUqowWdhlhJq8FmYpYQafHqjBp+FWUqoL2hh lhLqC1qYpYT6ghZmKTE91kyPNdNjzfRYMz3WTI8102PN9FgzPdZMjzXTY830WDM91kyPNdNjzfRY Mz3WTI8102PN9FgzPdZMjzXTY830WDM91kyPNdNjzfRYMz3WZMNvYJYS2fC7MNnwG5ilxBxeMxnX TMY1k3HNZFwzGddMxjWTcc1kXDMZ10zGNZNxzWRcMxnXTMY1k3HNZFwzGddMxjWTcc1kXKNWqYVZ SszhNXN4jVqlFmYpMfXXTP01apVamKWEWqUWZilB0UjNS72bn+zUvLQwGrduWrOb1uymNbtpzW5a s5vW7KY1u2nNTlpzVrq7p9UDFiYpWZikZGGSkmlFi2lFi4VJSqbVOhZGKbESybQSybQSybQSybQS ybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybQSybRax7SixbSi xbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSixbSi xbSixbSixbTqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw7Tqw8IsJVS0mFa0mFa0 mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFa0mFZ9mN3Grdu4dRu3buPW bdy6jVun6sPsVH1YGD0UuvnJYavFQZ1xC6OUDFtkDltkDltkDltkDltkDltkDltkDltkDltkDltk DltkDltkDltkDltkDltkDltkDlstDpu9Dpu9Dpu9Dpu9Dpu9Dpu9Dpu9Dpu9Dpu9Dpu9Dpu9DpvO DJvODJvODJvODJvODJvODJuGDuqdWZgNN/XOLMxSQr0zC7OUSO9MPaiyEhj+NMhkYJDJhUllJTDI ZGCQycAgk4FBJgODTAZmKZEpdmCWEpn0BmbjJpPewGzcZNIbmI2bTHoDw3Gzu1smvYFZSmTSG5il RObKgVlKpLISmKVEKiuBWUqkIBOYpUQKMoFZSqQgE5ilRAoygdlwS2VlYVJZCUyG+6Je7MBk3C7q xQ5Mxu2iXuzAZLgv6sVemNjQwOQ2vag7ul6dJoYLo3B1mhgujMLVaWK4MApXp4nh1WliuDAbN5oY LszGjSaGC7Nxo4nhwnDc6KHQaWK4MEsJTQwXZimhieHCLCU0MVyYpYQmhguzlNDEcGGWEpoYLsxS QhPDhVlKpOWmVrtNq92m1W7Tardptdu02m1a7TatdptWu02r3abVbtNqt2m127TabVrtNq12my7M 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 L/OTl/nJy/zkZX7yMj95mZ+8zE9e5icv85OX+cnLRONlovEy0XiZaLxMNF4mGi8TjZeJxstE42Wi 8TLReJlovEw0XtRwsDBLifnJy/zkZX7yMj95mZ+8zE9e5icv85OXbGYLzFJiWvMyrXmZ1rxMa16m NS/ZzBaYpcRs6GU29DIbepkNvcyGXmZDL7Ohl9nQy2zoZTb0Mht6mQ29aNPQwiwlJlEvk6iXSdTL JOplEvUyiXqZRL1Mol4mUS+TqJdJ1Msk6mUS9TKJeplEvUyiXiZRL5Ool0nUyyTqZRL1Mol6mUS9 zIZeZkMvs6GXac3LtOZlWvMyrVlMaxbTmsWkTjGpU0zqFJM6xaROsaazYi6omAsq5oKKuaBiLqiY Cyrmgoq5oGIuqJgLKuaCirmgYi6omAsq5oKKuaBiUqeY1CkmdYpJnWJSp5jUKSZ1ikmdYnammJ0p ZmeK2ZlidqaYnSlmZ4rZmWJ2ppidKWZnitmZYnammJ0pZmeK2ZlidqaYnSlmZ4rZmWJ2ppidKWZn itmZYnammGYpplmKaZZimqWYZimmWYpplmKapZhmKaZZimmWYpqlmGYpplmKaZZimqWYZinWq1bM zhTzJcV8STFfUsyXVPMl1XxJtTawam1g1drAqrWBVWsDq9YGVq0NrFobWLU2sGptYNXawKq1gVVr A6vWBlbNGFYzhtWMYTVjWM0YVjOG1YxhNWNYzRhWM4bVHF41h1fN4VVzeNUcXjWHV83hVXN41Rxe NYdXrZ+rmvqrpv6qqb9q6q+a+mv2Nm32Nm32Nm32Nm32Nm32Nm32Nm32Nm32Wmz2Wmz2Wmz2Wmz2 Wmz2Wmz2Wmz2Wmz2WmxWSGtWSGv2Em72Em72Em72Em72Em72Em72Em72Em72Em72fmv2fmv2fmv4 frPSVrPSVrPSVrN+5WYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYVsWYV sWYVsWYVsWYVsWYVsWYVsWYVsWYVsWalrWalrWalrWalrWalrWY1qmY1qmY1qmY1qmY1qmY1qmY1 qmY1qmY1qmY1qmY1qmY1qmY1qmY1qmY1qmYdxM06iJudp9CskNaskNaskNaskNatkNatkNatkNat kNatkNatkNatkNbN4XVzeN0cXjeH183hdXN43RxeN4fXrSLWTf11U3/dHF43h9fN4XVzeN0cXjeH 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 99rMvTZzr83cazP32sy9NnOvzdxrM/fazL02c6/N3Gsz99rMvTZzr83cazP32sy9NnOvzdxrM/fa zL02c6/N3Gsz99rMvTZzr83cazP32sy9NnOvzdxrM/fazL02c6/N3Gsz99rMvTZzr83cazP32sy9 NnOvzdxrM/fazL02c6/N3Gsz99rMvXZzr93cazf32s29dnOv3dxrN/fazb12c6/d3Gs399rNvXZz r93cazf32s29dnOv3dxrN/fazb32z93rjy2zgWK37TwT1aPv6MeJ+Y7KgJwm+k8T/aep99PU+2nq /TT1fpp6P029n6beT1Pvp6n309T7aer9NPV+mno/Tb2fpt5PU++nqffT1Ptp6v009X6aej9NvZ+m 3k9T76ep99PU+2nq/TT1fpp6P029n6beT3PoZ8Khf3t/k0c/TYifJuhOE3SnCbrTBN1pgu40QXea oDtN0J0m6E4TdKcJutME3WmC7jRBd5qgO03QnSboThN0pwm60wTdaYLuNEF3mqA7TdCdJuhOE3Sn CbrTBN1pgu40QXcmBN37q9EkXbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOX VbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbOXVbNqUrOyULOy ULOyULOyULOyULOyULOyULOyULOyULOyULOyULOyULOyULOyULOyULOyULOyUEuUhX7ELCVUF1iY pYTqAguzlFBdYGGWEqoLLMxSQnWBhVlKqC6wMEsJ1QUWZimhusDCLCVUF1iYpYTqAguzlFBdYGGW EqoLLMxSQnWBhVlKqC6wMEsJlRMWZimhUsLCLCVUgViYpYRa8hdmKaGW/NapSX5hNm7UJL8wu5LU tr4wvJJ2v1Hb+sJs3Ew0dhON3URjN9HYTTR2E43dRGM30dhNNHYTjd1EYzfR2E00dhON3URjN9HY TTR2E43dRGM30dhNNHYTjd1EYzf11039dVN/w9TfMPU3rEY1zBgOM4bDjOEwYzjMGA4zhsOM4TBj OMwYDjOGw4zhMGM4zBgOM4bDjOEwYzjMGA4zhsOM4TBjOMwYDjOGw4zhMGM4zBgOM4bDHN4whzfM 4Q1zeMMc3jCHN8yqDbNqw6zaMKs2zKoNs2rDrNowqzbMqg2zasOs2jCrNsyqDbNqw6zaMKs2zKoN s2rDrNowqzbooIs26KCLhVlKPnd4b21uC7Wk0KkVC7MhN/03TP8N03/D9N8w/TdM/w3Tf8P03zD9 N0z/DdN/w/TfMP03TP8N03/D9N8w/TdM/w3Tf8P03zD9N0z/DdN/w/TfMP03TP8N03/D9N+wPsNh fYbDZOMw2ThN/03Tf9P03zT9N03/TdN/03zQNB80zQdN80HTfNA0HzTNB03zQdN80DQfNM0HTfJB w6orw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw0oJw+T+MEs/ zNIPs/TDLP0wSz/M0g+z9MMs/TBLvzC7TUnuD5P7w+T+MLk/TO4Pk/sLs+GmBt1hpYRhpYRhpYRh pYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRhpYRh pYSRKCX8iFlK6MzsYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWH YdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWHYdWH hVFKpvlJq3UMq3UMq3UMq3UMq3UMq3UsjFIyzU9O85PT/OQ0PznNT07zk9P85DQ/aaWtYaWtYaWt YaWtYaWtYaWtYaWtYaWtYaWtYaWtYaWtgaWtaRJ1mkSddDjCwiwl5l6nuddp7nWae53mXqe512nu dZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7neZep9nQaTZ0mg2dn9vQ/9l8XL6u fpSvz6XVj+hZyudT7R/Rq6U/Rr6x5GBsLDkYgZV+ZB3zxpJ3w41lHfPGknfDxpJ3w8aSz8yNwXAH BsMdmA131jFvzFKSdcw3lnXMG7OUZB3zxiwlWce8MUtJ1jFvzFKSdcwbs5RkHfPGLCVZx7wxS0nW MW/MUpJ1zBuzlGQd88YsJVnHvDFLSdYxb8xSknXMG7OUZB3zxiwlWce8MUrJmXXMG6OUnFnHvDFK ySnT0MAoJadNQ8+sY94YpeTMOuYbyzrmjVlKso55Y5aSrGPemKUk65g3ZinJOuaNWUqyjnljlpKs Y96YpSTrmDdmKck65o1ZSrKOeWOWkqws3pgNd1YWb8yGOyuLN2bDnZXFG7PhzsriG8vK4o1ZSrKy eGOWkqws3pilJCuLN2YpycrijVlKsrJ4Y5aSrCzemKUk26i7MUtJVk1vzFJiEvU0iXqaRD1Nop4m UU+TqKdJ1NMk6mkS9TSJeppEPU2iniZRT5Oop0nU0yTqaRL1NIl6mkQ9TaKeJlFPkaj1nPIsCQxS EhikJDBISWCQksAgJYFBSgKDlAQGKQnMUiLPksAsJfIsCcxSIs+SwCwl8iwJzFIiz5LALCVSkAnM UiIFmcAsJVKQCcxSIgWZwCwlUpAJzFIiBZnALCVSkAnMUiIFmcAsJVKQCcxSIgWZwCQl15cUZAKT lCxMUrIwScnCJCULk5QsTFKyMEnJwiQlC7OUSEEmMEuJFGQCs5RIQSYwS4kUZAKzlEhBJjBLiRRk ArPhlspKYDbcUlkJzIZbKiuB2XBLZWVh2e79jdlDQQoygVlKpCATmKVECjKBWUqkIBOYpUQKMoFZ SqQgE5ilRAoygVlKpCATmKVECjKBWUqkIBOYpUQKMoFZSqQgE5ilRAoygVlKpCATmKWEJOrCLCUk URdmKSGJujBLCUnUhVlKSKIuzFJCEnVhlhKSqAuzlJBEXZilhCTqwiwlJFEXZikhibowSwlJ1IVZ SkiiLsxSQhJ1YZYSkqgLs5SQRF2YpYQk6sIsJSRRF2YpIYm6MEsJSdSFUUoOk6iHSdTDJOphEvUw iXqYRD1Moh4mUQ+TqIdJ1MMk6mES9TCJephEPUyiHiZRD5Ooh0nUwyTqYRL1MIl6SFd7YJYSc6+H udfD3Oth7vUw93qYez3MvR7kXit12S6M7EyldtnAJJOV2mUDk0xWapcNTDJZqV02MBxuyWSldtnA LCVkZyq1y9ZuVq2bVetm1bpZtW5WrZtV62bVulm1blatm1XrZtW6WbVuVq2bVetm1bpZtW5WrZtV 62bVulm1blatm1XrZtW6WbVuVq2bVetm1bpZtW5WrZtV62bVulm1blatm1XrZtW6WbVuVq2bVetm 1bpZtW5WrZtV62bVulm1blatm1XrZtW6WbVuVq2bVetm1bpZtW5WrZtV62bVulm1blatm1XrZtW6 WbVuVq2bVetm1bpZtW5WrZtV62bVulm1blatm1XrZtW6WbVuVq2bVetm1RZmKaGOxoVZSqijcWGW EupoXJilhDoaF2YpoY7GhVlKqKNxYZYS6mhcmKWEOhoXZikh+b0wSwk584VZSsiZL8xSQs58YZYS c6+HuVc6p7faOb3Vzumtdk5vtXN6q53TW+2c3mrn9FY7p7faOb3Vzumtdk5vtXN6q53TW+2c3mrn 9FY7p7faOb3Vzumtdk5vtXN6q53TW+2c3mrn9FY7p7faOb3Vzumtdk5vtXN6q53TW+2c3mrn9FY7 p7faOb3Vzumtdk5vtXN6qx24W+3A3WoH7lY7cLfagbvVDtytduButQN3qx24W+3A3WoH7lY7cLfa gbvVDtytduButQN3qx24W+3A3WoH7lY7cLfagbvVDtytduButQN3qx24W+3A3WoH7lY7cLfagbvV DtytduButQN3qx24W+3A3YWZRKVzequd01vtnN6aOaf3x48U1cxZvW/oTJzV+A39fLr9HYWwtYsm HIHB8AcGwx8YDH9g8JAIDB4SgcFDIjAcN3hIBAYPiYXJhCMwS4lMOAKzlMiEIzBLiUw4ArOUyIQj MEuJTDgCs5TIhCMwS4lMOAKzlMiEIzBLiUw4ArOUyIQjMEuJTDgCs5RI1TYwS4lUbQOzlEjVNjBL iVRtA7OUSNU2MEuJVG0Ds5RI1TYwS4lUbQOzlEjVNjBLiVRtA7OUSNU2MEuJVG0Ds5RI1TYwS4lU bQOzlEjVNjBLiVRtA7OUSNU2MEuJVG0Ds5RI1TYwS4lUbQOzlEjVNjBLiVRtA7OUSNU2MEuJVG0D s5RI1TYwS4lUbQOzlEjVNjBLiVRtA7OUSNU2MEuJVG0Ds5RI1TYwS4kUewOzlEixNzBKyWXu9TL3 epl7vcy9XuZeL3Ovl7nXy9zrZe71Mvd6mXu9zL1e5l4vc6+XudfL3Otl7vUy93qZe73MvV7mXi9z r5e518vc62Xu9TL3epl7vcy9XuZeL3Ovl7nXy9zrZe71Mvd6mXu9tNDbevn8Rfw/0Xr1uZ4ony9a 3tA+s4kJrJzpk55vLKvKNpYc+o0lh35jyaHfWPIBsbHkA2JjyQfExmS4S3oH5cZkuEt6B+XGZLhL egflxuBOv9HPHfqPaPtqnz/N3tCzyr0XZ7FAYhaUdQ0bgzEMDMYwMLhlF5ZdRW7s41v2x7HrZWYr E4GNL3q4BwYP94VlpwMbg1wGBgELDAIWGAQsMAhYYBCwwOCdEJilJFuKvbFsKXZjlpJsKXZjlpJs KXZjlpJsKXZjlpJsKXZjlhJ84Mk7LjBLicwvA7OUyPwyMEuJzC8Ds5RkS7E3li3FbsxSki3FbsxS ki3FbsxSki3FbsxSki3FbsxSki3FbsxSki3FbsxSki3FbsxSki3FbsxSki3FbsxSki3FbsxSIsuj wCwlsjwKzFKSLcVuzFKSLcVuzFKSLcVuzFKSLcVuzFKSLcVuzFIii+jALCXZUuzGJCVH+rvKG5OU HOnvKm9MUnKkv6u8MUnJkf6u8sYkJUf6u8obs5RkS7Ebs5RkS7Ebs5RkS7Ebs5RkS7Ebs5RkS7Eb s5SIeg/MUiLqPTBLiaj3wCwl2VLsxiwl5F6P9OeYb4zc65H+HPPGLCXkXo/055g3Zikh97owSwm5 1yP9OeYbI/d6pD/HvDFLCbnXI/055o1ZSsi9HunPMW/MUkLu9Uh/jnljlhJyrwfV9gOzlJB7Pai2 H5ilhNzrkf5wzI2Rez3SH47ZmKWE3OuR/nDMxiwl5F6P9IdjNmYpIfd6pD8cszFLCbnXI/3hmI1Z Ssi9HukPx2zMUkLu9Uh/OObGyL0e6Q/HbMxSQu71SH84ZmOWEnKvR/rDMRuzlJB7PdIfjtmYpYTc 65H+cMzGLCXkXo/0h2M2Zikh93qkPxzzxNIfjtkYpST94ZiNUUrSH47ZGKUk/eGYjVFK0h+O2Zil xNxr+sMxG7OUmHtNfzhmY5YSc6/pD8dszFJi7pXangOzlJh7pbbnwCwl5l7TH47ZmKXE3Gv6wzE3 Zu41/eGYjVlKzL2mPxyzMUuJudf0h2M2Zikx95r+cMzGLCXmXtMfjtmYpcTca/rDMRuzlJh7TX84 5sbMvaY/HLMxS4m51/SHYzZmKTH3mv5wzMYsJeZe0x+O2ZilxNxr+sMxG7OUmHtNfzhmY5YSc6/p D8fcmLnX9IdjNmYpMfea/nDMxiwl5l7TH47ZmKXE3Gv6wzEbs5SYe01/OGZjlhJzr+kPx2zMUmLu Nf3hmBsz95r+cMzGLCXmXtMfjtmYpcTca/p7MxuzlJh7TR//vjFKSfr4941RStLHv2+MUpI+/n1j lJL08e8bs5SYe00f/74xS4m51/Tx7xuzlJh7TR//vjFLibnX9PHvG7OUmHtNH/++MUuJudf08e8b s5SYe00f/35jJlHT57hvzIbbJGr6HPeN2XCbRE2f474xG26TqOlz3DdmKTGJmj7HfWOWEpOo6XPc N2YpMYmaPsd9Y5YSk6jpc9w3ZikxiZo+x31jlhKTqOlz3G/MJGr6HPeNWUpMoqbPcd+YpcQkavoc 941ZSkyips9x35ilxCRq+hz3jVlKTKKmz3HfmKXEJGr6HPcbM4maPsd9Y5YSk6jpc9w3ZikxiZo+ x31jlhKTqOlz3DdmKTGJmj7HfWOWEpOo6XPcN2YpMYmaPsf9iaXPcd8YpSR9jvvGKCXpc9w3RilJ n+O+MUpJ+hz3jVlKTKKmz3HfmKXEJGr6HPeNWUpMoqbPcd+YpcQkavoc941ZSkyips9x35ilxCRq +hz3jVlKTKKmz3G/MZOo6QPZN2bDbRI1cSD7j5gNt0nUyyTqZRL1Mol6mUS9TKJeJlEvk6iXSdTL JOplEvUyiXqZRL1Mol4mUS+TqJdJ1Msk6mUS9TKJeplEvUyiXiZRL5Ool0nUyyTqZRL1Mol6mUS9 TKJeJlEvk6iXSdTLJOplEvUyiXqZRL1Mol4mUS+TqJdJ1Msk6mUS9TKJeplEvUyiXiZRL5Ool0nU yyTqZRL1Mol6mUS9TKJeJlEvk6iXSdTLJOplEvUyiXqZRL1Mol4mUYtJ1MQ3uH7EKCXFJGoxiVpM ohaTqMUkajGJWkyiFpOoxSRqMYlaTKIWk6jFJGoxiVpMohaTqMUkajGJWkyiFpOoxSRqMYlaTKIW k6jFJGoxiVpMohY7BaCYey3mXou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512Lu tZh7LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWY ey3mXou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512LutZh7LeZei7nXYu61mHst 5l6Luddi7rWYey3mXou512LutZh7LeZei7nXYu61mHut5l6ruddq7rWae63mXqu512rutZp7reZe q7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu5 12rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq 7rWae63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61 mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7 reZeq7nXau61mnut5l6ruddq7rWae23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23m Xpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6b uddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nX Zu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512bu tZl7beZem7nXZu61mXtt5l6buddm7rWZe23mXpu512butZl7beZem7nXZu61mXtt5l6buddm7rWZ e23mXpu512butZl77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt 5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZe u7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5 127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu 7rWbe+3mXru5127utZt77eZeu7nXbu61m3vt5l67uddu7rWbe+3mXru5127utZt77eZeu7nXbu61 m3sd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7 HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3m Xoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6H uddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nX Ye51mHsd5l6Huddh7nWYex3mXoe512HudZh7HeZeh7nXYe51mHsd5l6Huddh7nWYe53mXqe512nu dZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51mnud5l6nuddp7nWa e53mXqe512nudZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51mnud 5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7neZe p7nXae51mnud5l6nuddp7nWae53mXqe512nudZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe5 12nudZp7neZep7nXae51mnud5l6nuddp7nWae53mXqe512nudZJ7Pb/IvS5MUrIwScnCJCULk5Qs TFKyMEnJwiQlC5OULMxSQu51YZYScq8Ls5SQe12YpYTc68IsJeReF2YpIfe6MEsJudeFWUrIvS7M UkLudWGWEnKvC7OUkHtdmKWE3OvCLCXkXhdmKSH3ujBLCbnXhVlKyL0uzFJC7nVhlhJyrwuzlJB7 XZilhNzrwiwl5F4XZikh97owSwm514VZSsi9LsxSQu51YZYScq8Ls5SQe12YpYTc68IsJeReF2Yp Ife6MEsJudeFWUrIvS7MUkLudWGWEnKvC7OUkHtdmKWE3OvCLCXkXhdmKSH3ujBLCbnXhVlKyL0u zFJC7nVhlhJyrwuzlJB7XZilhNzrwiwl5F4XRik5zL0e5l4Pc6+HudfD3Oth7vUw93qYez3MvR7m Xg9zr4e518Pc62Hu9TD3eph7Pcy9HuZeD3Ovh7nXw9zrYe71MPd6mHs9zL0e5l4Pc6+HudfD3Oth 7vUw93qYez3MvR7mXg9zr4e518Pc62Hu9TD3eph7Pcy9HuZeD3Ovh7nXw9zrYe71MPd6mHs9zL0e 5l4Pc6+HudfD3Oth7vUw93qYez3MvR7mXg9zr4e518Pc62Hu9TD3eph7Pcy9HuZeD3Ovh7nXw9zr Ye71MPd6mHs9zL0e5l4Pc6+HudfD3Oth7vUw93qYez3MvR7mXg9zr4e518Pc62Hu9TD3eph7Pcy9 HuZeD3Ovh7nXw9zrYe71MPd6mHs9zL0e5l4Pc6+HudfT3Otp7vU093qaez3NvZ7mXk9zr6e519Pc 62nu9TT3epp7Pc29nuZeT3Ovp7nX09zrae71NPd6mns9zb2e5l5Pc6+nudfT3OtpEvU0iXqaRD1N op4mUU+TqKdJ1NMk6mkS9TSJeppEPU2iniZRT5Oop0nU0yTqaRL1NIl6mkQ9TaKeJlFPk6in2dDT bOhpNvQ0G3qaDT3Nhp5mQ0+zoafZ0NNs6Gk29DQbepoNPc2GnmZDT7Ohp9nQ02zoaTb0NBt6mg09 zYaeZkNPs6Gn2dDTbOhpNvQ0G3qaDT3Nhp5mQ0+zoafZ0NNs6Gk29DQbepoNPc2GnmZDT7Ohp9nQ 02zoaTb0NBt6mg09zYaeZkNPs6Gn2dDTbOhpNvQyG3qZDb3Mhl5mQy+zoZfZ0Mts6GU29DIbepkN vcyGXmZDL7Ohl9nQy2zoZTb0Mht6mQ29zIZeZkMvs6GX2dDLbOhlNvQyG3pZJ+plEvUyiXqZRL1M ol4mUS+TqJdJ1Msk6mUS9TKJeplEvUyiXiZRL5Ool0nUyyTqZRL1Mol6mUS9TKJeJlEvk6iXdaJe 5l4vc6+XudfL3Otl7vUy93qZe73MvV7mXi9zr5e518vc62Xu9TL3epl7vcy9XuZeL3Ovl7nXy9zr Ze71Mvd6mXu9zL1e5l4vc6+XudfL3Otl7vUy93qZe73MvV7mXi9zr5e518vc62Xu9TL3epl7vcy9 XuZeL3Ovl7nXy9zrZe71Mvd6mXu9zL1e5l4vc6+Xuddi7rWYey3mXou512LutZh7LeZei7nXYu61 mHst5l6Luddi7rWYey3mXou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512LutZh7 LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWYey3m Xou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512LutZh7LeZei7nXYu61mHst5l6L uddi7rWYey3mXou512LutZh7LeZei7nXYu61mHst5l6Luddi7rWYey3mXou512LutZh7LeZei7nX Yu61mHst5l6Luddi7rWYey3mXou512rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512ru tZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWa e63mXqu512rutZp7reZeq7nXau61mnut5l6ruddq7rWae63mXqu512rutZp7reZeq7nXau61mnut 5l6ruddqErWaRK0mUatJ1GoStZpErSZRq0nUahK1mkStJlGrSdRqErWaRK0mUatJ1GoStZpErSZR q0nUahK1mkStJlGrSdRqErWaRK0mUatJ1GoStZpErSZRq0nUahK1mkStJlGrSdRqErWaRK0mUatJ 1GoStZpErSZRm0nUZhK1mURtJlGbSdRmErWZRG0mUZtJ1GYStZlEbSZRm0nUZhK1mURtJlGbSdRm ErWZRG0mUZtJ1GYStZlEbSZRm0nUZhK1mURtJlGbSdRmErWZRG0mUZtJ1GYStZlEbSZRm0nUZhK1 mURtJlGbSdRmErWZRG0mUZtJ1GYStZlEbSZRm0nUZhK1mURtJlGbSdRmErWZRG0mUZs1sDZzr83c azP32sy9NnOvzdxrM/fazL02c6/N3Gsz99rMvTZzr83cazP32sy9NnOvzdxrM/fazL02c6/N3Gsz 99rMvTZzr83cazP32sy9NnOvzdxrM/fazL02c6/N3Gsz99rMvTZzr83cazP32sy9NnOvzdxrM/fa zb12c6/d3Gs399rNvXZzr93cazf32s29dnOv3dxrN/fazb12c6/d3Gs399rNvXZzr93cazf32s29 dnOv3dxrN/fazb12c6/d3Gs399rNvXZzr93cazf32s29dnOv3dxrN/fazb12c6/d3Gs399rNvXZz r93cazf32s29dnOv3dxrN/fazb12c6/d3Gs399rNvXZzr93cazf32s29dnOv3dxrN/fazb12c6/d 3Gs399rNvXZzr93cazf32s29dnOv3dxrN/fazb12c6/d3Gs399rNvXZzr93cazf32s29dnOv3dxr N/fazb12c6/d3Gs399rNvXZzr93cazf32s29dnOv3dxrN/fazb12c6/d3Gs39zrMvQ5zr8Pc6zD3 Osy9DnOvw9zrMPc6zL0Oc6/D3Osw9zrMvQ5zr8Pc6zD3Osy9DnOvw9zrMPc6zL0Oc6/D3Osw9zrM vQ5zr8Pc6zD3Osy9DnOvw9zrMPc6zL0Oc6/D3Osw9zrMvQ5zr8Pc6zD3Osy9DnOvw9zrMPc6zL0O c6/D3Osw9zrMvQ5zr8Pc6zD3Osy9DnOvw9zrMPc6zL0Oc6/D3Osw9zrMvQ5zr8Pc6zD3Osy9DnOv w9zrMPc6zL0Oc6/D3Osw9zrMvQ5zr8Pc6zD3Osy9DnOvw9zrMPc6zL0Oc6/D3Osw9zrMvQ5zr8Pc 6zCJOkyiDpOowyTqMIk6TKIOk6jDJOowiTpMog6TqMMk6jSJOk2iTpOo0yTqNIk6TaJOk6jTJOo0 iTpNok6TqNMk6jSJOk2iTpOo0yTqNIk6TaJOk6jTJOo0iTpNok6TqNMk6jSJOk2iTpOo0yTqNIk6 TaJOk6jTJOo0iTpNok6TqNMk6jSJOk2iTpOo0yTqNIk6TaJOk6jTJOo0iTpNok6TqNMk6jSJOk2i TpOo0yTqNIk6TaJOk6jTJOo0iTpNok6TqNMk6jSJOk2iTpOo0yTqNIk6TaJOk6jTJOo0iTpNok6T qNMk6jSJOk2iTpOokyTqdVK4FibhWpiEa2ESroVJuK6TwrUwCdfCJFwLk3AtTMK1MEsJGfqFWUrI 0C9MUlK/aJG5MLmSC5MruTC5kguTK7kwu5K0yFyY3G8Lk/ttYXK/LcxSQovMhVlKaJG5MEsJLTLr Fy0yF2YpoUXmwiwltMhcmKWEFpkLs5TQInNhlhJaZC7MUkKLzIVZSmiRuTBLCS0yF2YpoUXmwiwl tMhcmKWEFpkLs5TQInNhlhJaByzMUkLrgIVZSmgdsDBLCa0DFmYpoXXAwiwltA5YmKWE1gELs5RQ p87CLCXUqbMwSwl16izMUkKdOguzlFCDz8IsJdTgszBLCTX4LMxSQg0+C7OUUIPPwiwl1OCzMErJ QQ0+C6OUHNTgszBKyUENPgujlBzU4LMwSslBDT4Ls5RQg8/CLCXU4LMwSwk1+CzMUkINPguzlFCD z8IsJdTgszBLCTX4LMxSYu71MPd6mHs9zL0e5l4Pc6+HudfD3Oth7vUw93qYez3MvR7mXg9zr4e5 18Pc62Hu9TD3eph7Pcy9HuZeD3Ovh7nXw9zrYe71MPd6mHs9zL0e5l4Pc6+HudfD3Oth7vUw93qY ez3MvR7mXg9zr4e518Pc62Hu9TD3eph7Pcy9HuZeD3Ovh7nXw9zrYe71MPd6mHs9zL0e5l4Pc6+H udfD3Oth7vUw93qYez3MvR7mXg9zr4e518Pc62Hu9TD3eph7Pcy9HuZeD3Ovh7nXw9zrYe71MPd6 mHs9zL2e5l5Pc6+nudfzc/f6d3//579EOy1r50Gv/cBgEBYmr/3AYBACg0EIDG7VwOBWDczGTV77 gcGtGpilRF77C5PXfmCWEnntB2Ypkdd+YJYSee0HZimR135glhJ57QdmKZHXfmCWEnntB2Ypkdd+ YJYSee0HRimh135glBJ67QdGKTml5BoYpeSUkmtglJJTSq6BWUqk5BqYpURKroFZSqTkGpil5POS 648z2EAlKfUUKReY/H2VNkYFhn+b3AWVNkYtjGbnlTZGBSZ3QaWNUYFZSmh2XmljVGCWEpqdV9oY tTCanS/MUkKz84VZSmh2vjBLCc3OF2Ypodn5wiwlNDtfmKWEZucLs5TQ7HxhlhKanS/MUkKz84VR Si6anS+MUnLR7HxhlJKLZucLo5RcNDtfGKXkotn5wiwlNDtfmKWEZucLs5TQ7HxhlhJpiAzMUiIN kYFZSqQhMjBLiTREBmYpkYbIwCwl0hAZmKVEGiIDs5RIQ2RglhJpiAzMUiINkYFZSqQhMrCPU/Im COr1eSPTN/RzSfCG9uvzdep3FH5q68fx1dPNdoGdV/p01gdWW3ZCtTH8acmcbiyZ040lc7qx5NNs Y8mn2caST7Mby86MNmbDnZ0ZbcxSkp0ZbcyGOzvF2ZgNd3aKc2PZKc7GbLizU5yN2XBnpzgbs4dC doqzMUtJdoqzMUtJdoqzMUlJr9k+7Y1JShYmKVmYpGRhkpKFSUoWJilZmKSk12yf9sYsJdk+7Y1Z SrIloY1ZSrIloY1ZSrIloY1ZSrIloY1ZSrIloY3ZcGdrOxuz4c7WdjZmw52t7dxYtrazMRvubG1n Y/ZQyNZ2NmYpydZ2Ngar40DXsvrzfVY/oqVQ0f6JdnnXrXVjdsfhxiBoa7kpr//AYAzXKjVbZnhg pcjCJTAZgIXBcyUweK4sTBYugclwL8wGQBYugcFzJTDJ5MIsJbJwCcxSIguXhcnCJTAb7qxk3ZgN d1aybsyGO7vrfGM23Nld5zdG74CF2UMhu+t8Y5aS7K7zjX2ckh9fxIFaUujVWOzVuDDLpayMA7Nc yso4MMulrIwDs1zKyjgwS4msjAOzlMjKODBLiayMA7OUyMo4MEuJLKgDs5TIgjowS4ksqAOTlLTE ALw90JtdzVY+X8J/+4mfL3W/odmWuCdWpe4YmAx9q1ItC4wGotIKq1WaqccBUYbJAyKOkDFMrmQc MmEYXkkZt9iXTBitjBcmN87CLCW0Ml4Ytj8Eakmh1fHQe45WxwuzpNDqeGGWFFpUL8ySQovqhVlK aFG9MEsJLaoXZimhRfXCLCW0qF6YpYQW1QuzlNCCemGWkuxRbhuzlEh3WWBYYuhfiYrgdxTGr68l K4xfYDB+gcH4BQbjtzBRFIHBXR4Y3OWBwV0eGNzlgVlKRFEEZikRRRGYpUQURWCWElEUgVlKRFEE ZikRRRGYpUQURWCWEqn5B2YpkZp/YJYSqfkHZimRmn9glpLsfs6NWUqy+zk3ZinJ7ufcmKVE5FVg lpLsfs6NWUqy+zk3Rinp2f2cG6OUdGm0CIxS0mXXQmCUki67FgKjlHTZtRCYpGR0aRkOTMZtYTJu C5NxW5iM26A2qsBk3Bb28bi9LcZG/3zl8R2FjVTjK/anJb4n9yNa8nvpHti8sjO+jSXHcWPJcdxY 8v67seyMb2PJp/TGknf7xmzcsjO+jSXv9o1ZSrIzvo1ZSrIzvhvLzvg2ZinJzvg2ZinJzvg2ZinJ zvg2ZinJzvg2Rikp2RnfxiglJTvj2xilpGRnfBujlJTsjG9jlJKSnfFtzFKSrbxvzFKSrYVvzFKS rYVvzFKSrYVvzFKSrYVvzFKSrYVvzFKSrYVvzFKS7RLfmKUkWwffmKUkWwffmKUkWwffmKUkWwff mKUkWwffmKUkWwffmKUkWwffmKUkWwffmKUkWwffmKUkWwffmKUkWwffmKUkWwffmKUkWwffmKUk 6702ZinJeq+NWUqy3mtjlpKs99qYpSRbbd+YpSRbbd+YpSRbbd+YpSRbbd+YpSRbbd+YpSRbbd+Y pSRbbd+YpSRbbd+YpcTca3pDwMYsJeZeE+35P2KWEnOvxdxrMfea2HbwI2YpMfdazL0Wc6/F3Gsx 91rMvRZzr+mtIhuzlJh7LeZei7nXYu61mntNb7rZGKWkinuNb0RDSgKDlAQGKQkMUhIYpCQwSEl8 NhtSEhikJDBISWCWEvElgVlKxJcEZikRXxKYpUR8SWCWEvElgVlKxJfEd5TlSl5VXvnrv+WVH5gM wMJkABYmA7AwGYCFyW26MLlNFya36cLkNl0YpKRdQ5brgcGVDAyuZGBwJQODKxmYXUlZrgcG91tg cL8FBvdbYJYSWa4HZimR5XpglhJ5mC9MluuBWUpkuR6YpUSW64FZSmS5HpilRJbrgVlK5N0dmKVE 3t2BWUrk3R2YpUTe3YFZSuTdHRilZMpyPTBKyZTlest/QOCB1URb8I+Y/G010Un8I4Z/m9wBC5M7 YGFyByxM7oCFyR2wMLkDaqc518IsJTTnWpilhOZcC7OU0JxrYZYSmnMtzFJCc66FWUpozrUwSwnN uRZmKaE518IsJTTnWpilhOZcC7OU0JxrYZYSmnMtzFJCc66FWUpozrUwSsmgOdfCKCWD5lwLo5QM aU8PjFIypD09MErJkPb0wCwl0p4emKVE2tMDs5RIe3pglhJpTw/MUiLt6YFZSqQ9PTBLibSnB2Yp kXJrYJYSKbcGZimRcmtglhIptwZmKZFya2CWEim3BmYpkXJrYJYSKbcGZimRcmtglhIptwZmKZFy a2CWEmlPD8xSIu3pgVlKpD09MEuJtKcHZimR9vTALCXSnh6YpUTa0wOzlJh7HSZRh0lUK1xXK1xX K1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXK1xXq0BXq0BX q0BXq0D3+fkj6Mcjaxb6eS6/oTIQ/ZiikgKDgQgMBiIwGIjA4L4LDO67hYlKCgzuu8DgMRuYDbc4 ocBsuMUJBWbDLU5oYeKEArPhFicUmKVEnFBglhJxQoFZSj53Qj8+YgOFw9NuVJYTC5NJcGB2RWUS HJjddzIJXphMggOz+04mwYHZfSeT4MAsJTIJDsxSIpPgwCwlMgkOzFKCcy/pJAjMUiJz58AsJTJ3 DsxSIp0EC5NOgsAsJdJJ0NuXFLIDk19yYfhLSpQXJlFemER5YRLlhUmUFyZRXphEuX3R6mNhlhIp ZAdmKaFFy8IsJbRoWZilhBYtC7OU0KJlYZYSWrQszFJCi5aFWUpo0bIwS4kUsgOzlEghOzBLiRSy A7OUSCE7MEuJFLIDs5RIITswS4kUsgOzlEghOzBLiRSyA7OUSCE7MEuJFLIDs5RIITswS4kUsgOz lEghOzBLiRSyA7OUSCE7MEuJFLIDs5RI/TswS4nUvwOz4SaHtzAbbnJ47Ysc3sJsuMnhLcyGmxze wuyhQA5vYZYScngLs5SQw1uYpYQc3sIsJeTwFmYpIYe3MPz2ykI/31nyjh6fr/bf0PElYm6ch8z2 AoPBCAwGIzC4ZQODWzYwuGUXJrO9wGzcZLYXGNyygVlKZLYXmKVEZnuBWUpktrcwme0FZimR2V5g lhKZ7QVmKZFJYmCWEpkkBmYpkUliYJYSmSQGZimRSWJglhKZJAZmKZFJYmCWEpkkBmYpkUliYJYS mSQGZimRSWJglpLPK7Y/zvIWKlXbUQ7ZkR2YDMLCZBAWJoOwMBmEhcmtujC5VcsphezA5FZdmNyq C6OUnFLIDoxSckohOzBKyfl5IfvtVi3n50uk/4nGx/bqSLerBLbWndnXyI1lXyMbS2ZzY8lsbiyZ zY0ls7kxG4Dsa2RjyWxuLPkE25ilJPvm2Zil5PN+oR9vntaPbLUssEV9vuj88Scu9PNJ/jtaP3+a vaHX+fnd/g39/GZ6R6/PW3Te0Hp93lzyDc2uLB9Y/vOqG4NnTc9/XnVj8Kzp+c+rbgyeNT3/edWN wbOm5z+vujF41vT851U3RilJf151Y5SS9OdVN0YpSX9edWOWkmzb38YsJdm2v41ZSrJtfxuzlGTb /jZmKcm2/W3MUpJt+9uYpSTb9rcxS0m27W9jlpJs29/GLCXZtr+NWUqybX8bs5Rk2/42ZinJtv1t zFKSbfvbmKUk2/a3MUtJtu1vY5YSWsjkP6+6MUtJthC8MUtJthC8MUtJthB8Y9lC8MYsJdlC8MYs JdlC8MYsJdlC8MYsJdlC8MYsJdlC8MYsJdlC8MYsJbZcT39edWOWkmwheGOWkmwh+MayheCNWUqy heCNWUqyheCNWUqyheCNWUqyheCNWUrE4Pf851U3hm62Zz6x+h1F8TiORGK+o/5TP7+631G8TONI fB3zOwp3/7jS34jdGER9YVKGCAyiHphdEhHIgcEDMTB4IAYGD8TA4IEYmKVEBPK40t+I3RilBG+c 9DdiN0YpqSKQA6OUVBHIgVFKqgjkhYlADsxSIgI5MEuJCOTALCUikAOzlIhADsxSIgI5MEuJCOTA LCUikAOzlIhADsxSIgI5MEuJCOTALCUikAOzlIhADsxSIgI5MEuJCOTALCUikAOzlIhADsxSIgI5 MEuJCOTALCUikAOzlIhADsxSIgI5MEuJCOTALCUikAOzlIhADsxSIgI5MEuJCOTALCUikAOzlIhA DsxSIgI5MEuJCOTALCUikAOzlIhADsxSIgI5MEuJCOTALCUikAOzlKhADjSZlOOrX72NtDR5ccms vLhkWF5cMi0vLhmXF5fMy+ay6uTFgRR/sP0rMQl7Z1vLzjIf3CjpL029ODD4D3YeifPtvrOfL+i/ s58v876xZ3bDxIvTMZ3HJb3zL1bul9mPrAx6cckn5YuT/AUnz8ng5DkZHI3/4uQ5GZw8J4PDcafn QHA4Dlnl8uJwHLLS5cXhOGS1y4uT99XisuLlxeF9m1UvLw7zkpUvLw7zktUvLw7zkhUwLw7zklUw Lw7zkpUwLw7zktUwLw7zkhUxLw7zklUxLw7zkpUxLw7zktUxwY2vNQ2BcXhwMA4PDsbhwcE4BCfz swcH4/DgcBxkfvbg4L59cHDfPjjMi8zPHhzmJVu121y2bPfiMC8yj3xwmBeZRz44zIvMIx8cHLf3 ZK/zc8X5jb0+9xg/Yf13TrcDP7l+yXvmwVFeF0d5XRzltac3er84yuviKK+Lo+fb4uj5tjjMS1b/ vzjMS7YA8OIwL9kSwIvDvGSLAC8O85ItA7w4zEu2EPDiMC/Z02BeHOYlex7Mi8O8fH4izPs7Yv0v v1/W/4pDPr/6bHEqCbK9mEMONg5Mkr/3ZtPr2c1l7+fNZe/nzWXv581l7+ebS88XNpe9nzeXvZ83 l72fN4fjnp4vbA7zkp4vbA7zkp4v3Fx6vrA5zEt6vrA5zEt6vrA5zEt6vrA5zEt6vrA5zEt6vrA5 zEt6vrA5zEt6vrA5zEv2BLkXh3nJbt56cZiX7PatF4d5yW7genEyb9uszr3m15XdW/LkSn5duTkZ xzitQ8YxOPz76D0RnNz3wcl9H5zc98HJfR+c3PfBYV7oPRHHtGBe6D0RHOaF3hPBYV7oPREc5oXe E8FhXug9EefzYF7oPREc5iW70/fFYV6ye31fHOYlu9v3xWFesvt9by59YuSLs7ykz4x8cZaX9KmR L87ykj438sVZXtInR744zEu6f3VzmJfs5t8Xh3nJbv99cZiXdF/B5jAv6b6CzWFe0n0Fm8O8pPsK Nod5SfcVbA7zku4r2BzmJd1XsDnMS7qvYHOYl3RfweYwL+m+gs1hXtJ9BZvDvKT7UzeHeUn3p24O 85LuT90c5iXdn7o5zEu6P3VzmJd0f+rmMC/p/tTNYV7S/ambw7xQPS84zAvVAYPDvFAdMDjMC9UB g8O8UB0wOMwL1QGDw7xQHTA4zAv63Xyf2c2h300fPPniMC/od9NnT744zAv63fTxky8O84J+N30C 5YvDvKDfTZys+MZhXtDvFvS7Bf1u+hDHF4d5Qb+bPsfxxWFe0O+mj3J8cZgX9Lvp0xxfHOYF/W76 QMcXZ3lJH+n44iwv+fMJNmd5yZ9PsDnLS/58gs1hXtDvps92fHGYF/S76eMdXxzmBf1u+oTHF4d5 obMTHmxLuI2fsP8Pfu7na92fsNqnEqycvXCzn6/TfsL+P/idaa/PZuHYmc3K9yhvFrPc0keBvjh6 Zrb0oZJPbuDae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Da e+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Dae+Da e+Dae+Dae+Dae+DaG84G3JzlBdfecDbg5iwvuPaGswE3h3mxtffAtffAtffAtffAtffAtffA9cpI f19hc9ZbNdJfWHhxmBfrrRrpjyy8OMyL9VaN9HcWXhzmxdapI/2phReHecF1cfprCy8O82K9VSP9 wYUXh3mx3qqR/ubC5qy3aqS/uvDiMC/WWzXSH154cZgX660a6W8vvDjMi/VWjfTnF14c5sV6q0b6 CwwvDvNivVUj/RGGF4d5sd6qkf4Ow+ast2qkv8Tw4jAv1ls10h9jeHGYF/S76e8xvDjMC/rd9CcZ XhzmBf1u+qsMLw7zgn43/WGGF4d5Qb+b/jbD5tDvpr/O8OIwL+h3K/rdin63ot+t6Hcr+t2Kfrei 363odyv63Yp+t6Lfreh3K/rdin63ot+t6Hcb+t2Gfreh323odxv63YZ+t6Hfbeh3G/rdhn63od9t 6Hcb+t2Gfreh323odxv63YZ+t6Hfbeh3G/rdhn63od9t6Hcb+t2Gfreh323odxv63YZ+t6Hfbeh3 G/rdhn63od9t6Hcb+t2Gfrd97nffe+UWy32Uo38+H/nOfv6O+Qlr/Zvj6+sr4WC/s9hH+WRtjB4s fbPryebfrVc5A00/mzenPy97r20ue69tLnuvbS77bN5c9tl8c+ln8+ayz+bNZZ/Nm8O8pJ/Nm8O8 pJ/Nm8O8pGtvm8O8pGtvm8O8pGtvm8O8pGtvm8O8pGtvm8O8pGtvwR1f+e9ZbU7GITgZh+BkHIKT cQhOxiE4HQe5bxeXrmltTu7b4DAv6ZrW5jAv6ZrW5jAv6ZrW5nDc07WpzeG4p2tTm8NxT9emNkfj vh6h9PMWpz+PcrY4ylm8IpCjfMZQIEf5jP9BjvK5/gfzknaPm8O8pN3j5jAvafd4c2n3uDnMS9o9 bo7yUvLffd0c5aXkv/u6OcpLyX/3dXOUl5L/7uvmKC8F58kF58kF58kF58kF58kF58kF58kF58kF 58kF58kF58kF58kF58kF58kF58klMU/+Cyd5szYnLEe6/2Rz+Dem+082h/dEuv/k5tL9J5vDeyLd f7I5vCfS/Sebw7yk+082h3lJ959szvJypvtPNmd5OdP9J5uzvCTWgO/PpnYxe575cxJu7vO1/Pef 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 oN8d6HcH+t2Bfnei353odyf63Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2Jfnei353odyf63Yl+d6Lf neh3J/rdiX53ot+d6Hcn+t2Jfnei353odyf63Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2Jfnei353o dyf63Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2Jfjfx/Y43DvOCfnei353odyf63Yl+d6Lfneh3J/rd iX53ot+d6Hcn+t2Jfnei353odyf63Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2Jfnei353odyf63Yl+ d6Lfneh3J/rdiX53ot+d6HcT36p64zAv6Hcn+t2Jfnei353odyf63Yl+d6Lfneh3J/rdiX53ot+d 5nfHl/ndxVFeRuKbem8c5WVxlJfFUV4WR3lZHOVlcZSXxWFezO8uTvLSVswkL8FJXoKTvAQneQlO 8hKc5CU4yUtwkpfFkd8NDvNCfjc4zAv53eAwL+R3g8O8kN8NDvNCfjc4ysth9ffg6O87rP4eHP59 ND8Lju6Hw+rvwdH9cFj9PTi6Hw6rvwdnebH6e3CWF6u/B2d5sfp7cJYXq78HZ3mx+ntwmBeanwWH ebH52WH19+AwLzY/O6z+HhzmxeZnh9XfF2fzs8Pq78FhXmx+dlj9PTjMi83PDqu/B4d5sfnZYfX3 4DAvVH8PDvNC9ffgMC9Ufw8O80L19+AwL1R/Dw7zQvX34DAvVH8PDvNC9ffgMC9Ufw8O80L19+Aw L1R/Dw7zQvX34DAvVH8PDvNC9ffgMC9Ufw8O80L19+AwL1R/Dw7zQvX34DAvVH8PDvNC9ffgMC9U fw8O80L19+AwL1R/Dw7zQvX34DAvVH8PDvNC9ffgMC9Ufw8O80L19+AwL+h3rf6+OPS7Vn8PDvOC ftfq78FhXtDvWv09OMyL+d3T6u/BUV5Oq78HR3k5rf4eHOXltPp7cJSX0+rvwWFezO+eWH8/sf5+ Yv39xPr7ifX3E+vvJ9bfT6y/n1h/P7H+fmL9/cT6+4n19xPr7yfW30+sv59Yfz+x/n5i/f3E+vuJ 9ffFYV7M756Jc1nfOMyL+d3FYV7M7y4O82J+d3GYF/O7i8O8mN9dHObF/O7iMC/mdxeHeTG/uzjM i/ndxWFezO8uDvNifndxmBfzu4vDvHzud9/OpG7l4PO7g9XzuxdrLmbgu3DguzBzRvkbR1kd+C4c +C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c+C4c +C4c+C4c+C4c+C4ciXfhG4d5sVrn4jAvVutcHObFap2Lw7xYrXNxmBerdS4O82K1zsVhXqzWuTjM i9U6F4d5sVrn4jAvVutcHObFap2Lw7xYrXNxmBerdS4O82K1zsVhXqzWuTjMi9U6F4d5sVrn4jAv VutcHObFap2Ls7wcVutcnOXlsFrn4iwvh9U6F2d5OazWuTjLi33nNTjMi9U6F4d5sVrn4jAvVutc HObFap2Lw7xYrXNxmBerdS4O82K1zsVhXqzWuTjMi9U6F4d5sVrn4jAvVutcHOYF/e6BfvdAv3ug 3z3Q7x7odw/0uwf63QP97oF+90C/e6DfPdDvHuh3D/S7B/rdA/3ugX73QL97oN890O8e6HcP9LsH +t0D/e6BfvdAv3ug3z3Q7x7odw/0uwf63eNzv/teU12sfhN5sZ970G/s+flc+43tZ+L+/86SC+jn +fma8C9+Zi9lXKN97qff2HIl1qLfWfo2+Gble+YPtibqFO9sy39/7ObSNY7NZZ+Zm8vmaHP692Wf mZuTb8sHW2vCd7+z8/x8zf+NvT6fv3xnP3fRb2xby2pnS9qFPrmadncPrp5pF7o5yW1wktvgJLfB Zd/1T+7C63mlXejmsu/6zVFeFifPueAsL1fahW7O8nKlXejmMC9pF7o5zEvahW4O85J2oZvDvKRd 6OYwL2kXujnMS9qFbg7zknahm8O8pF3o5jAvaRe6OcxL2oVuDvOSdqGbw7ykXejmMC9pF7o5zEva hW4O85J2oZvDvKRd6OYwL2kXujnMS9qFbg7zknahm8O8pF3o5jAvaRe6OcxL2oVuDvOSdqGbw7yk XejmMC9pF7o5zEvahW4O85J2oZvDvJAHCg7zQh4oOMwLeaDgMC/pXtfNYV7Sva6bw7yke103h3lJ 97puDvOS7nXdHOYl3eu6OcxLutd1c5iXdK/r5jAv6V7XzWFe0r2um8O8pHtdN4d5Sfe6bg7zku51 3RzmBf3uhX73Qr97od8t6HcL+t2Cfreg3y3odwv63YJ+t6DfLeh3C/rdgn63oN8t6HcL+t2Cfreg 3y3odwv63YJ+t6DfLeh3C/rdgn63oN8t6HcL+t2Cfreg3y3odwv63YJ+t6DfLeh3C/rdgn63oN8t 6HcL+t2Cfreg3y3odwv63YJ+t6DfLeh3C/rdgn63oN8t6HcL+t2Cfreg3y3odwv63YJ+t6DfLeh3 C/rdgn63oN8t6HcL+t2Cfreg3y3odwv63YJ+t6DfLeh3C/rdgn63oN8t6HcL+t2Cfreg3y3odwv6 3YJ+t6DfLeh3C/rdgn63oN8t6HcL+t2Cfreg3604v644v644v644v644v644v644v644v644v644 v644v644v644v644v644v644v644v644v644v644v644v644v644v644v644v644v644v644v644 v644v644v644v644v668j6Z17Onr2GPXff/MYi1vHftgOvY1dPSuHT3hxL6NiX/fxL6NiX0bE/s2 JvZtTOzbmNi3kdkX9sbRc21i38bEvo2JfRsT+zYm9m1M7NuY2LcxsW9jYt/GxL6NiX0bE/s2JvZt TOzbmNi3MbFvY2LfxsS+jYl9GxP7Nib2bUzs25jYtzGxb2Ni38bEvo2JfRsT+zYm9m1M7NuY2Lcx sW9jYt/GxL6NiX0bE/s2JvZtTOzbmNi3MbFvY2LfxsS+jYl9GxP7NiauHyb2bUzs25jYtzGxb2Ni 38bEvo2p6zHs25jYtzGxb2Ni38bEvo2JfRsT+zYm9m1M7NuY2LexOMyLeeWJfRsT+zYm9m1M7NuY 2LcxsW9jYt/GxL6NiX0bE/s2JvZtTOzbmNi3MbFvY2LfxsS+jYl9GxP7Nib2bUzs25jYtzGxb2Ni 38bEvo2JfRsT+zYm9m1M7NuY2LcxsW9jYt/GxL6NiX0bE/s2JvZtTOzbWBzmBf1uQb9b0O8W9LsF /W5Bv4vnri0O84J+t6DfLeh3C/rdgn4Xz7FbnOWlot+t6Hcr+t2Kfrei363odyv63Yp+t6Lfreh3 K/rdin63ot+t6Hcr+t2Kfrei363odyv63Yp+t6Lfreh3K/rdin63ot+t6Hcr+t2Kfrei363odyv6 3Yp+t6Lfreh3sW94Yt/wxL7hiX3DE/uGZ6Jv+K3Xqh/manu1Z2Fwku3gJNvB6d8n2Q5Osh2cZDs4 yXZwku3gJNuLo2dhcJgXehYGh3mhZ2FwmBd6FnbcQ9FxD0XHPRQd91B03EPRcQ9Fxz0UPbOH4v2Z jX34fTaanwdHmVkcZWZxlJnZ7J20OMrM4igzi8Pxs3fS4ugZszjMi72TFod5sXfSbPZOWhzmxd5J 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 FweHeaF1cXCYF1oXB4d5oXVxcJgXWk8Hh3mh9XRwmBdaTweHeaH1dHCYF1pPB4d5ofV0cJgXWocH h3mh3vHgMC/UOx4c5oV6x4PDvJCfCA7zQn4iOMwL+YngMC/kJ4LDvJCfCA7zQv0MwWFeyIcEh3kh HxIc5iV7buWLw7xkz618cZiX7LmVL87ykv6e74uzvKS/5/viLC/p7/m+OMtL+nu+L87ykv6e74vD vFB/SHCYF+orCQ7zQn34wWFeqA8/OMwL+t3094M3h343/f3gF4d5Qb+b/n7wi8O8oN9Nfz/4xWFe 0O+mvx/84jAv6HfT3w9+cZgX9LsX+t0L/e6FfvdCv3uh373Q717ody/0uxf63Qv97oV+90K/e6Hf vdDvXuh3L/S76W9ZvzgcP/St6W9LvzgcP/St6W9LvzgcP/St6W9Lvzi839G3Jr4P/cbhuKM3vdCb Xug/L/SfF/rPC33khV7xQq94oVdMf0v8xeE4oFe80Cte6BUv9IoXesULveKFXvFCz3eh57vQ813o +S70fBd6vgs9X0HPV9DzFfR8BT1fQc9X0PMV9HzFPB+eqXXiGVcnnh114plMi7P3w4W+/EKPeaF3 uxJe6m3P77mWnLpPOVg9NzVY3ZO92M89x09YGtOKrriiK67oiiu64oquuGJmK7riiq64oiuu6Ior uuKKrriiK67oiiu64oquuKIrruiKK7riiq64oiuu6IoruuKKrriiK67oiiu64oquuKIrruiKK7ri iq64oiuu6IoruuKKrriiK67oiiu64oquuKKjrOgoKzrKio6yoqNcHObM3GZFt1nRbVZ0m4vDvJgT rehEKzrRxVFeOtYIOt5/He+/jvdfx/uv4/3X8f7reP91vP863n8d77+O91/H+6/j/dfx/ut8/1lP dscayOIwL1Y76Vg76Vg76Vg76Vg76Vg76Vg76Vg76Vg76Vg76Vg76Vg7WRzmxXqyO9ZqOtZqOtZq OtZqOtZqOtZqOtZqOtZqOtZqOtZqOtZqOtZqOtZqOtZqOtZqFmd5KdaT3YvVMhaHeTHPvjjMi3n2 xWFezLMvDvNinn1xmBfz7D1Rh3rjMC/m2ReHeTHP3hN1sjcO82KefXGYF/Psi8O8mGdfHObFPPvi MC/m2ReHeTHPvjjMi3n2xWFezLMvDvNinn1xmBfz7IvDvJhnXxzmxTz74jAv1pO9OMyLnbmxOMyL 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 hXoKgrO8XNRTEJzl5TJnsjjLy0U9BcFZXi7qKQjO8nJRT0FwmBfqKQgO82JubnGYl897Ct6dSElk 9Dv7+fX5zlK9sYzL3r2L059H98bi6N5YHN0bi6N7Y1z27l0c3RuLo3tjcXRvLA7H3d6hi8Nxt3fo 4mzci71DF2fjXuwdujgb92Lv0MVZXoq9QxdneSnpd+gZPf49/23JzWXHfXPZcd9cdtw3lx33zWXH fXPZcd9cdtw3p+OefU7cXNr9bA7zknY/m8O8pN3P5jAvafezOcxL2v1sDvOSdj+bw7yk3c/mKC8T 77+J99/E+28m7r+/mJsHex758zaDW6tyujbBybVZHF2b4CRri0vPzTeHf196br45/PvSc/PNyb0U nDx7g5Nnb3Dy7A0O74f0nH5zlpfEeY1v9/zV8n3DD25c6b72zenPo7FfHI394mjsF0djvzga+3Gl +9o3p++JsiKjeSvrv8Q7PdhR6Rt5wdavxHz9G9s+f169s2f+21yb49/3yp8r9eBaozl4cPIsCI6v a2s0jwtO7s/g5P5cHL3Lg6PcLA7HkN7lwcnzPDh5ngcnz/Pg5HkeHOaF3uW1dbx3e9rPbc7y0tN+ bnOWl572c5uzvPTP/dy3Z1NP9wIH177y3w/cnGRtcbSOCk6yFpxkLTjJWnCSteBw/MjxBCfPpuAw L+R4FkeOJzjMCzme4DAv6Rrj5jAv6Rrj5jAvNPcJDvNCc5/gMC809wkO80Jzn+AwLzT3CQ7zQnOf 4Cwv+e84bs7ykv+O4+YsL/nvOG7O8pL/juPmLC/57zhuDvOS7u/ZHOYl3d+zOcxL+syQzWFe0meG bA7zkj4zZHOYl/SZIZvDvKTPDNkc5oXcanCYF3KrwWFeyK0Gh3khtxoc5iV9ZsjmMC/pMzw2h+OX PsNjczh+6f2Um8PxS++n3ByOX3o/5ebwfk/vp9wc5iW9n3JzmJf0fsrNYV7S+yk3h3lJ76fcHOYl vZ9yc5iX9H7KzWFeqKcuOMwL9dQFh3mhnrrgMC/UUxcc5gV960DfOtC3DvStA33rQN860LcO9K0D fetA3zrQtw70rQN960DfOtC3DvStA33rQN860LcO9K0DfetA3zrQtw70rQN960DfOtC3DvStA33r QN860LcO9K0TfetE3zrRt070rRN960TfOtG3TvStE33rRN860bdO9K0TfetE3zrRt070rRN960Tf OtG3TvStE33rRN860bdO9K0TfetE3zrRt1pff3CYF/StE33rRN860bdO9K2Teq2Dw7yg353odyf6 3Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2Jfnei353odyf63Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2J fnei353odyf63Yl+d6Lfneh3J+9paEfiG83fWTrX98GeiVr8NzYxT//Ofv6O+gu2Hl+9nvVzL/ON bZ+vmX/CyrnND3Yk9oL+JXuOdoz6uWd7Y8/WP382vLFXm597szd2Zs7me2db4kybb2z5fE7/jU3s mX9n4VyVxfWv9X+zz8TNZZ+Jm8s+EzeXfSZuTq9L9h26uew7dHPZd+jNpdd0m8u+QzeHeUmv6TaH eUmv6TaHeUmv6TaHeUmv6W4uvabbHOYlvabbHOYlvabbHOYlvabbHOYlvabbHOYlvabbHOYlvabb HOYlvabbHOYlvabbHOYlvabbHOYlvabbHOYlvabbHOYlvabbHOYl3bOzOcxLumdnc5iXdM/O5jAv 6Z6dzWFe0j07m8O8pHt2Nod5SffsbA7zku7Z2RzmJd2zsznMS7pnZ3OYl3TPzprJX73lz8DYXHoc bi49DjeXHoebS4/DzaXH4eZ0HNL37c2l79ubS9+3Ty7d27A5zEu6t2FzmJd0b8PmMC/p3obNYV7S vQ2bw7ykexs2h3nJe7Cbw7zkPdjNYV7yHuzmMC95D3ZzmJe8B7s5zEveg90c5iXvwW4O85L3YDeH ecl7sJvDvOQ92M1hXvIe7OYwL3kPdnOYl7wHuznMS96D3RzmJe/Bbg7zkvdgN4d5yXuwm8O85D3Y zWFe8h7s5jAveQ92c5iXvAe7OcxL3oPdHOYl78FuDvOS92A3h3nJe7Cbw7zkPdjNYV7yHuzmMC95 D3ZzmJe8B7s5zEveg90c5iXvwW4O85L3YDeHeVEPlt67tjnMS3rv2s2l965tDvOS3ru2OcxLeu/a 5jAv+X6bm8O8pPeubc7ykjjz/I2zvBzodw/0uwf63QP97oF+90C/e6DfPdDvHuh3D/S7B/rdA/3u gX73QL97oN890O8e6HcP9LsH+t0D/e6BfvdAv3ug3z3Q7x7odw/0uwf63QP97oF+90C/e6DfPdDv Huh3D/S7B/rdA/3ugX73QL97oN890O8e6HcP9LsH+t0D/e6BfvdAv3ug3z3Q7x7odw/0uwf63QP9 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 fAbcXPr7iy8u+Qx4cZaX9PcXX5zlJf39xRdneUl/f/HFWV7S31/cXLYH9MVhXrI9oC8O85LtAX1x mJdsD+iLw7xke0BfHOYl2wP64jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAv WQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf7 4jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAv WQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAvWQf74jAv2f7vF4d5ye7xf3GYl+we/xeHecnu 8X9xmBf0u+lvqL44zAv63YF+d6DfHeh3B/rdRN/qG2d5meh3J/rdiX53ot+d6Hcn+t2Jfnei353o dyf63Yl+d6Lfneh3J/rdiX53ot+d6Hcn+t2J69uJ69uJ69uJ69uJ69uJ69tEv/8bh+OH69uJ69v5 +fr2vUbdaT/Dkx2Jee87ux6l0Et+s+Xz59R3VvZQbVb2Qd0srn1nYo759jPLV+Lbun/BxlaVs13p 7K9f9jpm+vuzLy777Npc9tm1ueyza3PZZ9fmss+uzWWfXZvD8UuvnTeXfXZtDvOSXjtvDvOSXjtv DvOSXjtvDvOSXjvfXHrtvDnMS3rtvDnMS3rtvDnMS3rtvDnMS3rtvDnY53qziTPL39g4sUF/7nlU 6j18sPWQvapPtl2y12+zND/brGRpcfRMDk7mZZvlsWnl87rzT1jOk+19frI9sW/lG1s8i5nejJ+w fK1GYj/fd1bOWXmxfO+NRE/2O7uWgDxGM9+fcNVarp7ec/Disvf75rLv1M3p35d9pz64md4T8+L0 52Wfu5vLvsPXE7fEwwS5dL/c5tJ/383p75mdm94c9f0/2XyN7cG1vDO6ubQz2lz63r259L17c3hd 8vfSzVFmFped124Oxy/do7A5HL/8s/fmcPzyz96bo2fF4nD80t7j5tLeY3Ppd+7N4binvcfmcNzT /mJzeN+m/cXNpT3E5mSO92BHYo/1d/bz59p3Vs5bu9lCzv7J1s/ru9/Zz+cM72yUKZyVc6Juls48 3KycqfVi/VolvmP8xpavxN747yznKlgdo/JV5UzXzcp5mFcZaw5U+ue1+Xe2tc/7wd/Yes70XPjB wfvtwfWvz3ss3n/X/vV5H8JP2Oz7Ko5WGT39fZEXl31fbS77vtpcdhyfXPr7Ii8uO0/ZXHaesrns PGVzNu7p74u8OMtL+vsiL87ykv6+yObSvUebw7yke482h3nB50T6+yIvDvOSdjSbw7yke49uLr23 dHOYl/Te0s1hXtJ7SzeHeUm7ss1hXtJ7SzeHeUnvLd0c5iW9t3RzmJf03tLNYV7Se0s3h3lJ7y3d HOYlvbd0c5iX9N7SzWFe0rWbzWFe0ntLN4d5Se8t3RzmJb23dHOYl3Tv7eYwL+ne281hXtK9t5vD vKR7bzeHeUnXUTaHeUnXXzaHeUnXXzaHeUnXMjeHeUnXbTaHeUnXbTaHeUnXezaHeUnXezaHeUnX ezaHeUnXiTaHeUl7tM1hXtJ1os1hXtJ1os1hXtL1pc1hXtL1pc1hXtJ1qc1hXtL9sZvDvKT7YzeH eUG/m/7+wIvDvKDfTfT2vXGWl4J+t6DfTXwL742zvBT0uwX9bkG/W9DvFvS7Bf1uQb+b2LP1xmFe 0O8W9LsF/W7i+45vHOYF/W5Bv1vQ7xb0uwX9bkG/W9DvJvYhvnGYF/S7Bf1uQb9b0O8W9LuJ7w++ cZgX9Lv5s6Q3h3lBv1vQ7yb2cLxxmBf0uwX9bkG/W9DvJvYqv3GYF/S7Bf1uQb9b0O8W9LsF/W5B v1vQ7xb0uwX9bkG/W9DvFvS7Bf1uQb9b0O8W9LsF/W5Bv5v47uEbh3lBv1vQ7xb0uwX9bkG/W9Dv FvS7iW9WvnGYF/S7iW9Kv3GYF/S7Bf1uQb9b0O8W9LsF/W5Bv1vQ7xb0uwX9bkG/W9DvFvS7Bf1u Qb9b0O8W9LsF/W5Fv9vRg3X0YB09WH4v6uZsHDp6sI4erKMH6+jBOnqwjh4svyd4c5gX9GCJb5u/ cZgX9GAdPVhHD9bRg3X0YB09WEcP1tGDdfRgHT1YRw/W0YN19GAdPVhHD9bRg3X0YB09WEcP1tGD dfRgHT1YRw/W0YN19GAdPVhHD9bRg3X0YB09WEcP1tGDdfRgiX2wbxzmBT1YYs/tG4d5QQ+W2N/7 I4cerKMH6+jBOnqwjh6sowfr6ME6erCOHqyjB+vowTp6sI4erKMH6+jBOnqwjh6sowfr6ME6erCO HqyjB8t/I3lzmBf0YPlvJG8O84IeLP+N5CeXP7N8czZ++XOrNmfjlz+3anM2fvnzrjan42f3e/68 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 51Rc51Rc51Rc51Rc51Rc51Rc51Rc51Rc51Rc51Rc51Rc51Rc5+TPmNmc5SV/xszmLC/5s2k2Z3nJ n02zOctLw/dtw/dtQ0/b8D3d8D3d8D3d8D3d8D3d8D3d8D3d8D3d0NM29LQNPW1DT9vQ0zacvzSc vzScvzScv3Scv3Scv3Scv3Scv3Scv3Scv3Scv3Scv3Scv3Scv3Scv3Scv3T0tB09bUdP29HTJs7V f+MwL+hpO3rabr2Qi8O8WC/kwDNDFod5sV7IxWFerBdycZgX64Ucid6nNw7zYr2Qi8O8WC/k4jAv 6DHzZ7rdHHrM/Jlum8Pxw/Vt/hykzeH44fo2fxbc5jAvuL7NnwW3OcwLrm87rm87rm87rm87rm87 rm87rm87rm87rm87rm87rm87rm87rm87rm87rm87rm87rm87rm8Hrm8Hrm8Hrm8Hrm8Hrm8Hrm8H rm8Hrm8Hrm8Hrm8Hrm8Hrm8Hrm8TZ0C+cZgXXN8OXN8OXN8OXN8OXN8OXN8OXN8OXN8OXN8OXN8O XN8OXN8OXN8OXN8OXN8OXN8OXN8O7NMZ2KczsE9nYJ/OwPXtwPXtwPXtwPXtwPXtwPXtwPXtwPXt wPXtwPXtwPXtwPXtwPXtwPXtwPXtwPXtwPXtwPXtwPXtsPXt/LK+0cVRXuaX9Y0ujvKyOMrL4igv i6O8LI7ysjjKy+IwL/Y+Whzmxd5Hi8O82PtocZgXex8tDvNi76PFYV7sfbQ4Pjtgfn3+TvrGJvYr fmNxT9G8bI6+OLunLpujL87uqctqUIuze+qyGtTi7J667DyOxdk9ddl5HIvDvHx+Fscbx2dTLBYz U7KZ6b32Y5T037g5+Rsf7Kyf5+0nbDYDN/f5GdFvP/P8Kp+7+5+wco72k63p87Af3PH1+fPq/Wce ibOKv7H58/A2J2MaXPa+vrm0C95c9j2wObwuaRe8OctN/ty3B3fle5k3R9fzyvcyb46u55XvZd6c Xs/se3Vz2ffq5uj+u/K9zDeXrvVuDvOSrvVuDvOSrvVuDvOSrvVuDvOSrvVuzvKS72XenOUl38u8 OctLvpd5c5aXfC/z5iwv+V7mzWFe7P1+5XuZN4d5sff7le9l3hzmJV3r3RzmJV3r3RzmJV3r3Rzm JV3r3RzmJV3r3RzmJV3r3RzmJe2RNod5SXukzWFe0h5pc5iXtEfaHOYl7ZE2h3khhxAc5oUcS3CY l7RD2hzmxTzF4jAv6e92bQ7zkj6TaHOYl/SZRJvDvKTPJNoc5iV9JtHmMC/pM4k2h3lJ15Y3h3lJ 15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3h3lJ15Y3 h3lBv5vfy7M5zAv63fxens1hXtDv5vfybA7zgn43v5dnc5gX9Lv5vTybw7yg383v5dkc5gX9bn4v z5PL7+XZnOUlv5dnc5aX/F6ezVle8nt5Nmd5ye/l2RzmBf1ufi/P5jAv6Hfze3k2h3lBv5vYy/Pe K3Al9kt8Z+nbLw+2JL5V9ROWezlq4ptcP2GlJ/DJXp+vtb+z9D2hm83P+cd11mPm33U3l3523Vz6 2XVz6WdXcOdX/l13c+ln183ROCwu/ey6ufSz6+bSz66bo7wsjvKyOMrL4jAv+XfdzWFe8u+64FrN r2Vvjq7n4uh6tppfy94cXc/F4fXMr2Vvju6/xdH9tzi6/xaHecmvZW8O85Jfy94c5iW/lr05zEt+ LXtzmBd7vy8O82Lv98VZXpq93xdneWn2fl+c5aXZ+31xlheoYd+c/Z5Qw745yzXUsG/Ocg017CeX r2HfnOUaatg3h3nJ17BvDvOSr2HfHOYlX8O+OcxLvoZ9c5iXfA375jAv+Rr2zWFe8jXsm8O85GvY N4d5ydewbw7zkq9h3xzmJV/DvjnMS76GfXOYl3wN++YwL/ka9s1hXsxnNahh3xzmJV/DvjnMC677 oYZ9c5gXXPdDDfvm0tdzlnmV/PcrNpe+njeXvp5PLn89by59PW8uff/dXPr+u7n0/XdzVF+4WcxM 3m08ONivElzNn3G2ORrDmj/jbHM0hjV/xtnmaPxq/oyzzdE9X/NnnN1cvu/95nDc82v/m8Nxz6/9 bw7HPb/2vzkc9/za/8nl1/43h8+J/Nr/5jAv+bX/zWFe8mv/m8O85Nf+N5fPy4wT1fIO9OayeRnz 6OXMu7DNZf++m0vfD5vDvy99P2wuez9sLns/bC57P2wuez9sLns/bA7zkr4fbi7twjaHeUm7sM1h XtIubHOYl7QL2xzmJe3CNod5SbuwMc/ra+R7GjaX//ueXP7ve3DpnobN5e+HJ5e/H55c/n54cvn7 4cnl74cnl78fnhzmJb0/e3OYl/T+7M1hXtLr1M1hXtLr1M1hXtLr1M1hXtLr1M1hXtLr1M1JX+n8 mjNakqXP8sHimY/Blq8r7fkf3JE/921z2Xtqc9l7anPZe2pz2Xtqc9l7anM6Dtl7anPZe2pz2Xvq 5tJz2M1hXtJz2M1hXtJz2M1hXtJz2M1Jz/2DPQ+7J0r+LOnN0ViU/FnSm6OxKPmzpDdH927JnyW9 Obp3S/4s6c3huKdrnpvDcU/XPDeH456u0W0Oxz1do7u5dI1uc/TMXhzmJV2j2xzmJd3rvDnMS7rX eXOYl3Q98ObSvc6bw7yke503h3lJ9zpvzvJypD3O5ux6HviePvA9feB7+sD39IHv6QPf0we+pw98 Hx34PjrwfXTg++jA99GB76MD30cHvo8OfB8d+D468H104PvowPfRge+jA99HB76PDnwfHfg+OvB9 dOD76Ejvhdkcjl96L8yTO9N14M3Z+OXPn9+cjd+Z3guzObvfz/Re183ZuOfP17+5dH1nczju6frO 5nDc0/WdzeG4p+s7m7PnxJmu72wO85Ku72wOxz1dp3lyF/6eV7oOtTn7+y7++yzXV7qetDnLZ/5b N0+upPsJN2fXpaT7CTdn17Ok+wk3Z/d7SfdP3ZzVngrWngrWngrWngrWngrWngrWngrWkArWkArW kArWkArWkArWkArWkArWkArWkEqihvTGYV7SfVA3h/6soD8r6M8K+rOC/qygPyvozwr6s4L+rGCd q2Cdq6T3BG4O84L1sYL1sYI+sqCPLOgjC/rIgj6y4by14bw1f87l5iyf+XMuN2f5zJ9zuTnLZ/6c y83p+Fk+8+dc3hx6lPw5l5vDvKBHyZ9zuTnMC3qUxDmXbxzmBT3KQD+R38+5OcwL+on8fs7NYV7w /ZDfz7k5zEu6T/bm0t8j2hyOO/qX/H7OzeG4o3/J7+fcHI47+pf8fs7NYV7Qv+T3c24O84L+Jb+f c3OYF/Q2+f2cN4feJnFO8xuHeUFvM9DbDPQ2A73NQG8z0NsM9DYDvc1AbzPQ2wz0NgPr7wPr7wPr 7/l92JuzcZi43py43py43py43py43py43py43py43py43py43py4bpy4bpy4bpy4bpy4bpy4bpy4 bpy4bpy4bpy4bpy4bpy4bpy4bpy4bpy4bpy4/pvpfZKbw3HHdePEdePEdePEdePEdePEdePEdePE dePEdePEdePEdePEdePE9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E9d/E 9d/EddzEddzEddzE+vvE+vvE+vvE+vvE+vvE+vvE+vvE+vvE+vvE+vvE+vvE+vvEOvrEOvrEOvrE fT0T9/VM3NczcV/PxH09E/f1TNzXM3Ffz8T9ORP350zcnzNxn83EfTYT933mv2G3ORw/9Ir5b9g9 uJr/ht3maNxr/lt0m6Nxr/lv0W2Oxq+e9hxcHD0HF2fX87Tn4OLsep72HFycjgPdR4uz++i05+fi MC+2v3FxmBd77i4O82LPz8XhuOPz88Ln54XPz8vqMouz8bvw+XlZfWVxNn6X1UnqZXWSxeH4md+t l/ndxeHvaX53cZgz87SLw5yZb10cjp/51sXhOJg3rRWfExWfExWfExXnZxWfLxWfLxWfLxWfL9X6 fheHebH67eIwL5/Xb9/PzFtsegyPsR6giRrZ//yZ5ets9eyJb2L9BXtctZUrcQbQj2w/vtL99A+u j8Q35t+45Hi+OP09k/f/i0ve/y8umZ3NZfunXlzy/n9xyfv/xSXv/xeHecl69xcH4z7Kle6TfXEw Dg8O791gP18r/8C28vU1PvdVP2Hz90Zw6R6zF5fP6pPLZ/XJ5bP65PJZfXL5Z9uTy2f8yen45Z9t Dy47t3lxmJfs3ObFYV6yc5sXh3nJ9qa9OMxLtjftxWFesr1pLw7zku1Ne3GYl2xv2ovDvGR7014c 5iW7p+nFYV6yzuPFYV6yzuPFYV6yruTFYV6yruTFYV6yjuXFYV5gjvfkMC9ZN/PiMC+f74X6NrdL 9289uFYKvcuC03losLZmXmxLn7e0uL7+68j2qb24/Fg+ufy9/+Ty4/Hk9Lrk7/0nl7/3n1z+3n9w sM5+cvn74slhXmCd/eQwL7DOfnKYF1ifPznMS7a/bXPZ/rYXh3nJ9re9OMxLtr/txWFesufLvDjM S7Yv7sVhXrJ9cS8O85LtB3lxmJdsP8iLw7xk+0FeHOYl2w/y4jAv2X6QF4d5yfaDvDjMS7Yf5MVh XrJ9eC8O8wIu9MlZXtLna784y0v6fO0XZ3lJn6/94iwv6fO1X5zlJX0u94vDvIB7fXKYF3CvTw7z Au71yUFeohqVPWfkxenPg3w+OMjng4N8PjjIZ3DZfWYvDvL54CCfDw7y+eAwL7J+f3CYF1m/PzjM i6zfg5P1+4PDvMj6/cFhXmT9/uAwL7J+f3CYF1m/PzjMi6zfHxzmRdbvDw7zIuv3B4d5kfX7g8O8 yPr9wWFeZP3+4DAvsn5/cJgXWb8/OMyLrN8fHOZF1u8PDvMi6/cHh3mR9fuDw7zI+v3BYV5k/f7g MC+yfn9wlpcm6/cHZ3lpsn5/cJaXJuv3B2d5abJ+f3CWlybr9weHeZH1+4PDvMj6/cFhXmT9/uAw L9A79eQwL9A79eQwL9A79eQwL9A79eQwL9A79eQwL9A79eQwL9A79eQwL9A79eQwL9A79eQwL9A7 9eQwL9JX8uAwL9A79eQwL9A79eQwL9A79eQwL+h3G/rdhn63od9t6Hcb+t2Gfreh323odxv63YZ+ t6Hfbeh3G/rdhn63od9t6Hcb+t2Gfreh323odxv63YZ+t6Hfbeh3G/rdhn63od9t6Hcb+t2Gfreh 323odxv63YZ+t6Hfbeh3G/rdhn63fe53f+ht7qN8JeYw7+xBz9/5dX7JdX1wsmf6Zj93od/YRP/b T1i4t+ZXo97HBwf31oODe+vBwb0VnGWgUe/jg4N768Hx2Dfqf3xwOBZSlwhO6hIPDsdC6hIPDt6L Dw7HQeoSDw7vXalLPDjMi9QlFkd9hQ/O8kJ9hQ/O8kJ9hQ/O8kJ9hQ/Oxp36A4OT+sKDw3GX+sKD w3GX+sKDw3GX+sKDs+fEKfWFB4d5kfrCg+N5Xrs+v+f/km1fvZ798+foO1sS2XlnM+fafWc/z953 9nNv9o3FfaPB9vJ5feWNbV+JvW7f2c/7RL6ztn54sOXzedk3NlHb+87SeTHnLMdxJXqXv7O0Ttus jO/N0jk1m/2je/9/+89/809/+q3/9v/+7f/605///j/9j9/+69//w3/57W/X/++f/+nf//t//2+e 4H/+mwX++U//9Kd/vv+z10Ri/PYP8W//6bf/9Od//G+/HV/xHzx/79+3le4f/v3jnx+//89Hzfzz s/74n37Vr1pbv9r4Q26ctf/IxT8/f++fr1XP1RL//oy6zQ///ox/f/3Bv28j8WfHv5+5f9+/fvj3 7Vf/fnyl/vP7V8mk4hzj/HEAavz78nv/fo3nzOQi/n3L/Pv5NY/EAJd+fGX+8+PfZwZs/fvjTAzY cZXzCuHxA1P+MHQ3MzPBfjDjOlM3z4Mp15n83co5evZ3W0++rzORqwez7u2v7M8p1ziBydzkT6a8 5eyRg/qHTCtHzV6DVq70NRh1/Pi79WDaHzG11Hkmr0EwmXttMz15/9QofievQW3jyuagjveM/ppZ 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 xteZWowHdJxH+oi1tXw/cpPsB9TOkXq7B3SW6804fXAh1tRjZtTwDdWvbIweUGrhsKHsSWsPKLUY 2lD+QrTSMpXaB7TuwfqTlP/xTwooNfW9oZ7SC6W38nW8H/D3i5vwAV1XTwX2AUXnf26+HFg0K6bW GzfUU8P7hGpLpe+GUoe/3lDuVLgNHanbMKD1bGmpdeEN5YN0xmk+6Z9U+9sC+Y/r8S8oZfluqKR/ vet4bzX5xav6AZ1fqT6LJ9SO/tOXTf9P85jnn/7jmjN8/a+//X/+5u/+4U//9E+L/O2//Ol//PZf //Ef/8v/+d9/+7f/9U//8H/883/+d//mP/73//Bv/+M//ONv/VqL0zHi8xDr//XbuvXab//xf/zz n/7p3wX2038zovH4+W/+8Bdd9/DPT6T4a/xFfzrf/Cv8RX9+9sZf4y/603n1X+Mv+lMd8df4i/50 cfjX+Iv+dEH61/iL/nRF9tf4i/504f3X+Iv+a3ng//y8m7/CX/TnXvav8Rf91/LA/7l//mv8Rf+1 PPB/7tn/Gn/Rn3q7v8Zf9F/Lm+nnhY+/xl/0X8ub6ecFnr/CX/Tn2w7/Gn/Rfy1vpp9vsPxr/EX/ tbyZfn6U21/jL/qv5c3081rtX+Mv+q/lzfTzmvRf4y+aKsreUK54vqFUUXZDqb6SDaUq7gHVryt1 AO4LSv9NAaX/poDob0p1EWwoVQffUKoOvqFU48YDihMyAEqdxP6C8oO7oPzgfisrfgjlx6m9tzp/ CKVaRDaUH9wF5Qe3vTc5/AJqx1eL8uBPdhz8fmHnAbXxtib+RcX9AY2Ra6DdUKoSGdC5Xi2pUl9A 13qjpvoVHtB1pk5buaHrK9UL+4BmOX+yB/uPL8SCct83u6GaqnkGVI6S+6rgA6rv52r94gshT2p8 nalulAc0349Z+OSPmu/7qn9R9Lyh3DcZA6rXeOsI+OAn1Xa8H9PxweWr8RH6n/2ov/2bv/3Pf/rf 4x/+7//9//zz//Gn/3Wx/+nxQdnf/r9/80+/Hf/Lb//wj//82//vT3/+x9/+bfyr//D1f1/RaHF+ /bt/87fxA//h//XPv/23v/nvP/ywOa/yv/z2pz//+bf/8NsRHwn/27+Jf/a3//jf/vvf/PlPf/nR Wv358xc/v1z/sj//P/7q5/8L//1/+3e/+Pn1X/bn/2n84ue3f9GfP76uX/z8/i/7848//eLnj3/Z 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 BOcDAABQSwUGAAAAAAEAAQBNAAAAllcbAAAA --_ac84ba17-d0a6-4978-b5ed-906ef566b17d_-- From root@krios.tbi.univie.ac.at Sat Nov 15 23:25:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B71B07F3F for ; Sat, 15 Nov 2014 23:25:10 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4648EAC002 for ; Sat, 15 Nov 2014 21:25:09 -0800 (PST) X-ASG-Debug-ID: 1416115505-04cb6c05707bce0001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id 7knd5YX4IthHSxtJ for ; Sat, 15 Nov 2014 21:25:05 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id E8A335EF71; Sun, 16 Nov 2014 06:25:02 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id D28B05F2C8; Sun, 16 Nov 2014 06:25:02 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20141116052502.D28B05F2C8@krios.tbi.univie.ac.at> Date: Sun, 16 Nov 2014 06:25:02 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1416115505 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11644 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From markus.rhonheimer@web.de Sun Nov 16 13:35:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ACE8A29DF7 for ; Sun, 16 Nov 2014 13:35:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 836D78F8037 for ; Sun, 16 Nov 2014 11:35:06 -0800 (PST) X-ASG-Debug-ID: 1416166499-04bdf06160b0c80001-NocioJ Received: from mout.web.de (mout.web.de [212.227.17.11]) by cuda.sgi.com with ESMTP id vw53FhGlLhA7WXrG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 16 Nov 2014 11:35:01 -0800 (PST) X-Barracuda-Envelope-From: markus.rhonheimer@web.de X-Barracuda-Apparent-Source-IP: 212.227.17.11 Received: from [192.168.64.62] ([79.210.59.39]) by smtp.web.de (mrweb102) with ESMTPSA (Nemesis) id 0LuuS5-1XyvMx3ABd-0105JZ for ; Sun, 16 Nov 2014 20:34:59 +0100 Message-ID: <5468FC60.10901@web.de> Disposition-Notification-To: Markus Rhonheimer Date: Sun, 16 Nov 2014 20:34:56 +0100 From: Markus Rhonheimer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Virtual Block device resize corrupts XFS Content-Type: multipart/alternative; boundary="------------060309030503090409030408" X-ASG-Orig-Subj: Virtual Block device resize corrupts XFS X-Provags-ID: V03:K0:ghTpIg4hOZQrIR6cC5PD+HXbSnkU2W3l28R24/eGd88hq/IPDQd B8AlogTmEEYxpJNFqxJFsohchHGwzZAs7Q0eiCmCRBBNLL+nknLRbKlEi0lzC+RvrrABa8o gx/F0TDorIJtEBahIhJ7hDRzVOPR53ZNU0K2h8yZt9BZQ618vLfh3R8zQJ7VdfDlAJddCct 5buJF9TPbLPpOzHisvBzA== X-UI-Out-Filterresults: notjunk:1; X-Barracuda-Connect: mout.web.de[212.227.17.11] X-Barracuda-Start-Time: 1416166500 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------060309030503090409030408 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Hi, I am running Centos 7 and have created a virtual block device with ZFS (ZVOL). I put XFS onto the block device without partitioning it. This worked very well as storage disk for a VM. A few days ago I wanted to increase the size of the block device, but accidently decreased it by 1 TB (from 7 to 6). I found out about it and immediately increased the size of the drive to 8 TB afterward. The XFS partition can still be mounted and I can list the files on it, but xfs_repair -n says: "/Sorry/, /could not find valid secondary superblock" /Is there the possibility to rescue some files? kind regards Markus --------------060309030503090409030408 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit Hi,

I am running Centos 7 and have created a virtual block device with ZFS (ZVOL). I put XFS onto the block device without partitioning it.

This worked very well as storage disk for a VM.

A few days ago I wanted to increase the size of the block device, but accidently decreased it by 1 TB (from 7 to 6). I found out about it and immediately increased the size of the drive to 8 TB afterward.

The XFS partition can still be mounted and I can list the files on it, but xfs_repair -n says: "Sorry, could not find valid secondary superblock"

Is there the possibility to rescue some files?

kind regards

Markus
--------------060309030503090409030408-- From david@fromorbit.com Sun Nov 16 16:36:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 53CEE29DF7 for ; Sun, 16 Nov 2014 16:36:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2AB458F8033 for ; Sun, 16 Nov 2014 14:36:39 -0800 (PST) X-ASG-Debug-ID: 1416177393-04bdf06161b3fc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 3ICrdNOCnIx5Tdx6 for ; Sun, 16 Nov 2014 14:36:33 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuOKAGEmaVR5LbBUPGdsb2JhbABBFAaDDlVZgjaLS6pMBpM+gVuFawQCAoELFwEBAQEBBgEBAQEfGQ0uhAIBAQEDATocIwULCAMYCSUPBSUDBxoTiDgIDjjPewELIBiGJoobBkMHhEsFlyKHKYE1g1SWAikwAYEGgUQBAQE Received: from ppp121-45-176-84.lns20.syd7.internode.on.net (HELO dastard) ([121.45.176.84]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Nov 2014 09:06:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xq8Qo-0007pE-ID; Mon, 17 Nov 2014 09:36:30 +1100 Date: Mon, 17 Nov 2014 09:36:30 +1100 From: Dave Chinner To: Markus Rhonheimer Cc: xfs@oss.sgi.com Subject: Re: Virtual Block device resize corrupts XFS Message-ID: <20141116223630.GH23575@dastard> X-ASG-Orig-Subj: Re: Virtual Block device resize corrupts XFS References: <5468FC60.10901@web.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5468FC60.10901@web.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1416177393 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11668 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Sun, Nov 16, 2014 at 08:34:56PM +0100, Markus Rhonheimer wrote: > Hi, > > I am running Centos 7 and have created a virtual block device with > ZFS (ZVOL). I put XFS onto the block device without partitioning it. > > This worked very well as storage disk for a VM. > > A few days ago I wanted to increase the size of the block device, > but accidently decreased it by 1 TB (from 7 to 6). I found out about > it and immediately increased the size of the drive to 8 TB > afterward. If that was a normal LVM block device, there would have been no trouble. But you're using something special, unusual and completely untested, so the most likely outcome is going to be that you still have a pile of broken bits. > The XFS partition can still be mounted and I can list the files on > it, but xfs_repair -n says: "/Sorry/, /could not find valid > secondary superblock" Full output, please, as well as the version of xfs_repair you are using... http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F Cheers, Dave. -- Dave Chinner david@fromorbit.com From spelic@shiftmail.org Sun Nov 16 17:08:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 418AF29DF7 for ; Sun, 16 Nov 2014 17:08:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 18B1B8F8039 for ; Sun, 16 Nov 2014 15:07:56 -0800 (PST) X-ASG-Debug-ID: 1416179275-04cb6c0572d7260001-NocioJ Received: from srv2.trombetti.net (srv2.trombetti.net [65.254.53.252]) by cuda.sgi.com with ESMTP id ls4YhMHsE1K1YLkF for ; Sun, 16 Nov 2014 15:07:55 -0800 (PST) X-Barracuda-Envelope-From: spelic@shiftmail.org X-Barracuda-Apparent-Source-IP: 65.254.53.252 Received: from localhost (localhost [127.0.0.1]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: SASL) by srv2.trombetti.net (Postfix) with ESMTPSA id 16F5F31324 for ; Sun, 16 Nov 2014 18:12:36 -0500 (EST) Message-ID: <54692E48.80708@shiftmail.org> Date: Mon, 17 Nov 2014 00:07:52 +0100 From: Spelic User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Virtual Block device resize corrupts XFS References: <5468FC60.10901@web.de> <20141116223630.GH23575@dastard> X-ASG-Orig-Subj: Re: Virtual Block device resize corrupts XFS In-Reply-To: <20141116223630.GH23575@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: srv2.trombetti.net[65.254.53.252] X-Barracuda-Start-Time: 1416179275 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 16/11/2014 23:36, Dave Chinner wrote: > On Sun, Nov 16, 2014 at 08:34:56PM +0100, Markus Rhonheimer wrote: >> A few days ago I wanted to increase the size of the block device, >> but accidently decreased it by 1 TB (from 7 to 6). I found out about >> it and immediately increased the size of the drive to 8 TB >> afterward. > If that was a normal LVM block device, there would have been no > trouble. But you're using something special, unusual and completely > untested, so the most likely outcome is going to be that you still > have a pile of broken bits. > Not true! Depends on the allocation strategy chosen for LVM and the position of free space. Probably recovering LVM conf from backups (which usually is automatically made) can recover the exact LVM layout of prior to the shrink. From spelic@shiftmail.org Mon Nov 17 03:42:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EDB977F5E for ; Mon, 17 Nov 2014 03:42:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6DF67AC001 for ; Mon, 17 Nov 2014 01:42:09 -0800 (PST) X-ASG-Debug-ID: 1416217327-04cbb01e59e6750001-NocioJ Received: from srv2.trombetti.net (srv2.trombetti.net [65.254.53.252]) by cuda.sgi.com with ESMTP id sGGey8cac1XZTPnG for ; Mon, 17 Nov 2014 01:42:07 -0800 (PST) X-Barracuda-Envelope-From: spelic@shiftmail.org X-Barracuda-Apparent-Source-IP: 65.254.53.252 Received: from localhost (localhost [127.0.0.1]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: SASL) by srv2.trombetti.net (Postfix) with ESMTPSA id CD0783134A for ; Mon, 17 Nov 2014 04:46:51 -0500 (EST) Message-ID: <5469C2E8.2080407@shiftmail.org> Date: Mon, 17 Nov 2014 10:42:00 +0100 From: Spelic User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Virtual Block device resize corrupts XFS References: <5468FC60.10901@web.de> <20141116223630.GH23575@dastard> <54692E48.80708@shiftmail.org> X-ASG-Orig-Subj: Re: Virtual Block device resize corrupts XFS In-Reply-To: <54692E48.80708@shiftmail.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: srv2.trombetti.net[65.254.53.252] X-Barracuda-Start-Time: 1416217327 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 17/11/2014 00:07, Spelic wrote: > > Not true! Depends on the allocation strategy chosen for LVM and the > position of free space. > Probably recovering LVM conf from backups (which usually is > automatically made) can recover the exact LVM layout of prior to the > shrink. Sorry by bad... he is not using LVM. From david@fromorbit.com Mon Nov 17 16:45:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 119947F51 for ; Mon, 17 Nov 2014 16:45:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C90F7304039 for ; Mon, 17 Nov 2014 14:45:09 -0800 (PST) X-ASG-Debug-ID: 1416264303-04bdf06160dfad0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id D3NuAHLcF7D2zKXd for ; Mon, 17 Nov 2014 14:45:04 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: As1cAMN5alR5LLEQPGdsb2JhbABbgw6BLoI2hQexMwaVGYVrAgIBAQKBEBcBAQEBAQYBAQEBODuEAwEBBCcTHCMQCAMOCgklDwUlAwcaCgmIQNJjAQEBAQYBAQEBHhiGJol5aweDLYEeBZAfjiyBNYcKhFSCLItMKTCCSwEBAQ Received: from ppp121-44-177-16.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.16]) by ipmail06.adl2.internode.on.net with ESMTP; 18 Nov 2014 09:14:24 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XqV1y-0002f1-Gt; Tue, 18 Nov 2014 09:44:22 +1100 Date: Tue, 18 Nov 2014 09:44:22 +1100 From: Dave Chinner To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 Message-ID: <20141117224422.GE29950@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V7 References: <1415989940-20004-1-git-send-email-cmaiolino@redhat.com> <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415989940-20004-3-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1416264303 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11703 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 14, 2014 at 04:32:20PM -0200, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. > > Changelog: > > V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() > > V3: - fix indentation to avoid 80 column crossing, decrease the amount of > arguments passed to xfs_cross_rename() > - Rebase patches over the latest linux code > > v4: - use a label/goto statement instead of an if conditional after > xfs_cross_rename() return, to finish the rename operation > - Make xfs_cross_rename() static > - Fix some comments > > V5: - Keep all the code under 80 columns > > V6: - Ensure i_mode of both files are updated during exchange > > V7: - Use struct names instead of typedefs in the xfs_cross_rename() > definition > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_inode.h | 2 +- > fs/xfs/xfs_iops.c | 15 +++++-- > 3 files changed, 124 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8ed049d..3a77254 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2668,6 +2668,103 @@ xfs_sort_for_rename( > } > } > > +/* xfs_cross_rename() > + * > + * responsible to handle RENAME_EXCHANGE flag > + * in renameat2() sytemcall > + */ > +STATIC int > +xfs_cross_rename( > + struct xfs_trans *tp, > + struct xfs_inode *src_dp, > + struct xfs_name *src_name, > + struct xfs_inode *src_ip, > + struct xfs_inode *target_dp, > + struct xfs_name *target_name, > + struct xfs_inode *target_ip, > + struct xfs_bmap_free *free_list, > + xfs_fsblock_t *first_block, > + int spaceres) > +{ > + int error = 0; > + int new_parent; > + int src_is_directory; > + int tgt_is_directory; > + > + new_parent = (src_dp != target_dp); > + src_is_directory = S_ISDIR(src_ip->i_d.di_mode); > + tgt_is_directory = S_ISDIR(target_ip->i_d.di_mode); As I read the code below, I read src_is_directory and wonder "is that the src_dp or the src_ip it refers to?" None of these local variables are really needed - they don't actually clarify or simplify the code. Can you just use the S_ISDIR() macros directly, and kill the new_parent variable, too? Also, I find the src/target names to be very hard to follow as this is an exchange and so there isn't any source/target difference in the logic. I'd actually prefer something like "dp1, ip1, name1, dp2, ip2, name2" because it implies (correctly) that the inodes/name parameters could be swapped and the result would be the same. > + > + /* Replace source inode */ > + error = xfs_dir_replace(tp, src_dp, src_name, > + target_ip->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + /* Replace target inode */ > + error = xfs_dir_replace(tp, target_dp, target_name, > + src_ip->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + xfs_trans_ichgtime(tp, src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); Timestamp updates are usually done at the same time we log the inode cores, so it's obvious that we are logging the inodes we are modifying, otherwise mistakes are made..... > + > + /* > + * If we're renaming one or more directories across different parents, > + * update the respective ".." entries (and link counts) to match the new > + * parents. > + */ > + if (new_parent) { > + xfs_trans_ichgtime(tp, target_dp, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + > + if (tgt_is_directory) { > + error = xfs_dir_replace(tp, target_ip, &xfs_name_dotdot, > + src_dp->i_ino, first_block, > + free_list, spaceres); Here is the only place we modify target_ip, hence the core should be logged here and not unconditionally a the end of the function. However, we should also bump the ctime of this inode (and the src_ip, too), because as per the comment in the rename code proper: /* * We always want to hit the ctime on the source inode. * * This isn't strictly required by the standards since the source * inode isn't really being changed, but old unix file systems did * it and some incremental backup programs won't work without it. */ So while we strictly aren't touching either inode, we really should be unconditionally bumping the ctimes on them so that userspace can see that some change to the inode has actually taken place. > + if (error) > + goto out; > + > + /* transfer target ".." reference to src_dp */ > + if (!src_is_directory) { > + error = xfs_droplink(tp, target_dp); > + if (error) > + goto out; > + error = xfs_bumplink(tp, src_dp); > + if (error) > + goto out; > + } > + } > + > + if (src_is_directory) { > + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot, > + target_dp->i_ino, first_block, > + free_list, spaceres); Same here. > + if (error) > + goto out; > + > + /* transfer src ".." reference to target_dp */ > + if (!tgt_is_directory) { > + error = xfs_droplink(tp, src_dp); > + if (error) > + goto out; > + error = xfs_bumplink(tp, target_dp); > + if (error) > + goto out; > + } > + } > + xfs_trans_log_inode(tp, src_dp, XFS_ILOG_CORE); That's wrong (see my comment above about pairing timestamp/inode logging together) as it should be the target_dp that is logged here to match the timestamp update done in this branch. > + } > + xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); And this should be src_dp. > + xfs_trans_log_inode(tp, src_ip, XFS_ILOG_CORE); > + xfs_trans_log_inode(tp, target_ip, XFS_ILOG_CORE); And those aren't modified unless we update the dotdot entries and update timestamps, and hence need to be moved to where we modify those. Cheers, Dave. -- Dave Chinner david@fromorbit.com From smilemukul2005@gmail.com Tue Nov 18 06:36:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D8B157F3F for ; Tue, 18 Nov 2014 06:36:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68159AC007 for ; Tue, 18 Nov 2014 04:36:03 -0800 (PST) X-ASG-Debug-ID: 1416314159-04cb6c0571114450001-NocioJ Received: from mail-ig0-f177.google.com (mail-ig0-f177.google.com [209.85.213.177]) by cuda.sgi.com with ESMTP id BeOcV6UUQGLlRPdH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Nov 2014 04:35:59 -0800 (PST) X-Barracuda-Envelope-From: smilemukul2005@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.177] Received: by mail-ig0-f177.google.com with SMTP id uq10so5688663igb.16 for ; Tue, 18 Nov 2014 04:35:58 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=HVEJsEF7JxLBFcS+JJGmW9HGlJqjylkl9deu4KbX5tM=; b=r7jk+Yxiz0103cKQyQ6rhX2grasDJAe7IvWCHirumYSH8bKBwy4JfyrwwnJtMalPyT BeHZbinUbpBcXjmqIhmUXBPwkf7qIlwgvtJnqN+z5rwCB8JFQQF5NLt7xG7waOSurjyS Oyk3OKxs+4EzZCSclVdQvMLYsO4BVYD7PfJMetcBv8CLa4OY3PP3apGlbTuiYNqDVTht OiOUruN0qsAYZ5qyRKXOnfKq+BZ4g5Q/UjBBGmYGvYn6zk0Vz0gTvaVf4Fd1f40swr7/ 1oSWmwi7xuYv2q6Hqe8oPQr5yC/Lu69/TVTHkFNjDvdnHgBRHAfMnKn9vtcncAyu2UB4 r11Q== MIME-Version: 1.0 X-Received: by 10.50.79.166 with SMTP id k6mr2903241igx.0.1416314158815; Tue, 18 Nov 2014 04:35:58 -0800 (PST) Received: by 10.64.227.147 with HTTP; Tue, 18 Nov 2014 04:35:58 -0800 (PST) Date: Tue, 18 Nov 2014 18:05:58 +0530 Message-ID: Subject: How to determine the reserved blocks in xfs filesystem ? From: Mukul Malhotra X-ASG-Orig-Subj: How to determine the reserved blocks in xfs filesystem ? To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e013a114e53a1d00508215631 X-Barracuda-Connect: mail-ig0-f177.google.com[209.85.213.177] X-Barracuda-Start-Time: 1416314159 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --089e013a114e53a1d00508215631 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =E2=80=8BHello, Does xfs have reserved blocks too, like ext* ? if yes, how can they be determined ?=E2=80=8B Can you provide the specific command. Thanks Mukul --089e013a114e53a1d00508215631 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
<= div class=3D"gmail_default" style=3D"font-size:small">=E2=80=8BHello,
Does xfs have reserved blocks too, like ext* ? if yes, how can they be de= termined ?=E2=80=8B

Can you provide the specific command.

Thanks
Mukul

--089e013a114e53a1d00508215631-- From bfoster@redhat.com Tue Nov 18 07:32:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3CC8E7F3F for ; Tue, 18 Nov 2014 07:32:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CEDD6AC00A for ; Tue, 18 Nov 2014 05:32:14 -0800 (PST) X-ASG-Debug-ID: 1416317532-04cbb01e5911a300001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jB2CJ3N6DEUhxC9n (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Nov 2014 05:32:13 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAIDW9eU028253 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 18 Nov 2014 08:32:09 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAIDW96U007844; Tue, 18 Nov 2014 08:32:09 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 651C8122F87; Tue, 18 Nov 2014 08:32:08 -0500 (EST) Date: Tue, 18 Nov 2014 08:32:07 -0500 From: Brian Foster To: Mukul Malhotra Cc: xfs@oss.sgi.com Subject: Re: How to determine the reserved blocks in xfs filesystem ? Message-ID: <20141118133206.GA5226@bfoster.bfoster> X-ASG-Orig-Subj: Re: How to determine the reserved blocks in xfs filesystem ? References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416317533 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 18, 2014 at 06:05:58PM +0530, Mukul Malhotra wrote: > ​Hello, > > Does xfs have reserved blocks too, like ext* ? if yes, how can they be > determined ?​ > XFS reserves blocks internally such that it can perform operations when all free space is consumed, etc. It looks like 5% is the default. I don't think it's "like ext4," however, which reserves blocks for the root user. I don't believe the reserved blocks in XFS are accessible for file allocation by any user unless the reserve pool is modified as such. > Can you provide the specific command. > The following command can get/set the reserved block count on an active mount: xfs_io -x -c "resblks" Note that this can lead to problems if reduced too much and all space is consumed, as sometimes block allocation is required to perform space freeing operations (removing a file, etc.). This is probably a reason the resblks command is only available in xfs_io expert mode. ;) Brian > Thanks > Mukul > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Nov 18 08:08:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 611847F3F for ; Tue, 18 Nov 2014 08:08:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 004DAAC007 for ; Tue, 18 Nov 2014 06:08:13 -0800 (PST) X-ASG-Debug-ID: 1416319692-04bdf06160f9940001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ENEjkdCiLPTkN2J5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Nov 2014 06:08:13 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAIE8BkJ024155 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 18 Nov 2014 09:08:12 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAIE8BUg024007 for ; Tue, 18 Nov 2014 09:08:11 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 35B19122F87; Tue, 18 Nov 2014 09:08:10 -0500 (EST) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfsprogs/repair: fix crash on zero record finobt reconstruction Date: Tue, 18 Nov 2014 09:08:10 -0500 X-ASG-Orig-Subj: [PATCH] xfsprogs/repair: fix crash on zero record finobt reconstruction Message-Id: <1416319690-27776-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416319692 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The inode btrees are reconstructed in phase 5. init_ino_cursor() helps determine the block requirements of the tree based on the number of records. If the finobt is empty, we can crash in the btree blocks calculation code due to a divide-by-zero error in the following line: lptr->modulo = num_recs % lptr->num_blocks; This occurs if num_recs and in-turn lptr->num_blocks evaluate to zero. We already have an execution path for the zero record btree scenario. However, it is only invoked when no records are found in the in-core tree. The finobt zero-record scenario can occur with a populated in-core tree provided that none of the existing records contain free inodes. Move the zero-record handling code after the loop and use the record count to trigger it. This is safe because the loop iterator checks for ino_rec != NULL. This allows reuse of the same code regardless of whether the in-core tree is empty or non-empty but contains no records that meet the requirements for the particular on-disk tree under reconstruction (e.g., finobt). Signed-off-by: Brian Foster --- repair/phase5.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/repair/phase5.c b/repair/phase5.c index 3d58936..3a2cdbb 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -914,26 +914,10 @@ init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, lptr = &btree_curs->level[0]; btree_curs->init = 1; - if ((ino_rec = findfirst_inode_rec(agno)) == NULL) { - /* - * easy corner-case -- no inode records - */ - lptr->num_blocks = 1; - lptr->modulo = 0; - lptr->num_recs_pb = 0; - lptr->num_recs_tot = 0; - - btree_curs->num_levels = 1; - btree_curs->num_tot_blocks = btree_curs->num_free_blocks = 1; - - setup_cursor(mp, agno, btree_curs); - - return; - } - /* * build up statistics */ + ino_rec = findfirst_inode_rec(agno); for (num_recs = 0; ino_rec != NULL; ino_rec = next_ino_rec(ino_rec)) { rec_nfinos = 0; for (i = 0; i < XFS_INODES_PER_CHUNK; i++) { @@ -953,6 +937,23 @@ init_ino_cursor(xfs_mount_t *mp, xfs_agnumber_t agno, bt_status_t *btree_curs, num_recs++; } + if (num_recs == 0) { + /* + * easy corner-case -- no inode records + */ + lptr->num_blocks = 1; + lptr->modulo = 0; + lptr->num_recs_pb = 0; + lptr->num_recs_tot = 0; + + btree_curs->num_levels = 1; + btree_curs->num_tot_blocks = btree_curs->num_free_blocks = 1; + + setup_cursor(mp, agno, btree_curs); + + return; + } + blocks_allocated = lptr->num_blocks = howmany(num_recs, XR_INOBT_BLOCK_MAXRECS(mp, 0)); -- 1.8.3.1 From jack@suse.cz Tue Nov 18 10:05:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E279E7F3F for ; Tue, 18 Nov 2014 10:05:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8069CAC00A for ; Tue, 18 Nov 2014 08:05:13 -0800 (PST) X-ASG-Debug-ID: 1416326711-04bdf06161ffbb0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id daYjABdBs1RhconF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Nov 2014 08:05:12 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B23C0AAF1; Tue, 18 Nov 2014 16:05:10 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id F3E4681C69; Tue, 18 Nov 2014 17:05:09 +0100 (CET) Date: Tue, 18 Nov 2014 17:05:09 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 04/11] quota: Split ->set_xstate callback into two Message-ID: <20141118160509.GA29472@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 04/11] quota: Split ->set_xstate callback into two References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-5-git-send-email-jack@suse.cz> <20141113173416.GA31481@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141113173416.GA31481@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416326711 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 13-11-14 09:34:16, Christoph Hellwig wrote: > On Tue, Nov 11, 2014 at 10:04:18PM +0100, Jan Kara wrote: > > Split ->set_xstate callback into two callbacks - one for turning quotas > > on (->sysquota_on) and one for turning quotas off (->sysquota_off). That > > way we don't have to pass quotactl command into the callback which seems > > cleaner. > > Yes, I much prefer these to be split. But the names seem a little odd, > why not enable_quota/disable_quota? I wanted to clearly separate this from quota_on() / quota_off() callbacks which are for userspace visible quota files. However enable_quota / disable_quota sound fine as well. > > +static unsigned int generic_to_xfs_flags(unsigned int uflags) > > xfs_quota_flags() ? OK. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Tue Nov 18 10:07:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3FD5F7F4E for ; Tue, 18 Nov 2014 10:07:35 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2013E304048 for ; Tue, 18 Nov 2014 08:07:31 -0800 (PST) X-ASG-Debug-ID: 1416326847-04bdf06160ffda0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 2mpMl4go0slmwNyn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Nov 2014 08:07:28 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E33ADAAF1; Tue, 18 Nov 2014 16:07:26 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3A90B81C69; Tue, 18 Nov 2014 17:07:26 +0100 (CET) Date: Tue, 18 Nov 2014 17:07:26 +0100 From: Jan Kara To: Christoph Hellwig Cc: Jan Kara , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 07/11] ext4: Use generic helpers for quotaon and quotaoff Message-ID: <20141118160726.GB29472@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 07/11] ext4: Use generic helpers for quotaon and quotaoff References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-8-git-send-email-jack@suse.cz> <20141113173600.GB31481@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141113173600.GB31481@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416326847 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu 13-11-14 09:36:00, Christoph Hellwig wrote: > > static const struct quotactl_ops ext4_qctl_sysfile_operations = { > > - .quota_on_meta = ext4_quota_on_sysfile, > > - .quota_off = ext4_quota_off_sysfile, > > + .sysquota_on = dquot_sysquota_on, > > + .sysquota_off = dquot_sysquota_off, > > .quota_sync = dquot_quota_sync, > > .get_info = dquot_get_dqinfo, > > .set_info = dquot_set_dqinfo, > > This vector now only has generic dquot_ methods. Maybe move the > vector to fs/quota/dquot.c and allow multiple filesystems to share it? Right. ocfs2 actually has the same vector now. I'll unify it. Honza -- Jan Kara SUSE Labs, CR From markus.rhonheimer@web.de Tue Nov 18 12:24:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D1C8F7F3F for ; Tue, 18 Nov 2014 12:24:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5250BAC007 for ; Tue, 18 Nov 2014 10:24:46 -0800 (PST) X-ASG-Debug-ID: 1416335083-04cbb01e5b125de0001-NocioJ Received: from mout.web.de (mout.web.de [212.227.17.12]) by cuda.sgi.com with ESMTP id hQMNVQfzKHKn2wPB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Nov 2014 10:24:44 -0800 (PST) X-Barracuda-Envelope-From: markus.rhonheimer@web.de X-Barracuda-Apparent-Source-IP: 212.227.17.12 Received: from [10.11.166.169] ([131.188.6.12]) by smtp.web.de (mrweb101) with ESMTPSA (Nemesis) id 0Ma2YF-1XXKMQ1hdv-00Lm9O for ; Tue, 18 Nov 2014 19:24:41 +0100 Message-ID: <546B8EE8.4040903@web.de> Date: Tue, 18 Nov 2014 19:24:40 +0100 From: Markus User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Virtual Block device resize corrupts XFS References: <5468FC60.10901@web.de> X-ASG-Orig-Subj: Re: Virtual Block device resize corrupts XFS In-Reply-To: <5468FC60.10901@web.de> Content-Type: multipart/alternative; boundary="------------000501090300030804080705" X-Provags-ID: V03:K0:bYerJ+n9rFlDpJGk6CBlknNPn/+e6ZVBlCvvoebqVQqGKdmrKVx mxs3+Ly6G9dBiWJG+HCPEZZoZSbN//sKiLQRrDQWSxAmy6Xq0IgbLrT+ajGwxymRan8wUxf LrWHjDx/EPL2XI+Sg91iLzqPw4IbKmaXjBx4sxFIQ+7RbIreNtpwdtONF372q99MiHAyjdf ipZk3PjfPtg39BQlLt1+Q== X-UI-Out-Filterresults: notjunk:1; X-Barracuda-Connect: mout.web.de[212.227.17.12] X-Barracuda-Start-Time: 1416335083 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------000501090300030804080705 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Hi, I am in a foreign country right now, but I will be back next week, will write all information down as soon as I am back. kind regards Markus Am 16.11.2014 um 20:34 schrieb Markus Rhonheimer: > Hi, > > I am running Centos 7 and have created a virtual block device with ZFS > (ZVOL). I put XFS onto the block device without partitioning it. > > This worked very well as storage disk for a VM. > > A few days ago I wanted to increase the size of the block device, but > accidently decreased it by 1 TB (from 7 to 6). I found out about it > and immediately increased the size of the drive to 8 TB afterward. > > The XFS partition can still be mounted and I can list the files on it, > but xfs_repair -n says: "/Sorry/, /could not find valid secondary > superblock" > > /Is there the possibility to rescue some files? > > kind regards > > Markus > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs --------------000501090300030804080705 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: 7bit
Hi,

I am in a foreign country right now, but I will be back next week, will write all information down as soon as I am back.

kind regards

Markus

Am 16.11.2014 um 20:34 schrieb Markus Rhonheimer:
Hi,

I am running Centos 7 and have created a virtual block device with ZFS (ZVOL). I put XFS onto the block device without partitioning it.

This worked very well as storage disk for a VM.

A few days ago I wanted to increase the size of the block device, but accidently decreased it by 1 TB (from 7 to 6). I found out about it and immediately increased the size of the drive to 8 TB afterward.

The XFS partition can still be mounted and I can list the files on it, but xfs_repair -n says: "Sorry, could not find valid secondary superblock"

Is there the possibility to rescue some files?

kind regards

Markus


_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

--------------000501090300030804080705-- From david@fromorbit.com Tue Nov 18 16:30:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2F3D67F3F for ; Tue, 18 Nov 2014 16:30:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 012108F8037 for ; Tue, 18 Nov 2014 14:30:14 -0800 (PST) X-ASG-Debug-ID: 1416349800-04bdf0615f1104d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WOAR8nI525Z4A0OI for ; Tue, 18 Nov 2014 14:30:01 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ajc6AMTHa1R5LLEQPGdsb2JhbABbgw6BLoI2hQexGwaVJoVnBAICgRIXAQEBAQEGAQEBATg7hAMBAQQnExwjEAgDDgoJJQ8FJQMHGhOIQNF9AQEBBwIgGIYhigJNB4RLBZ5VjQ+LayAWgVkpMIEHgUQBAQE Received: from ppp121-44-177-16.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.16]) by ipmail06.adl6.internode.on.net with ESMTP; 19 Nov 2014 08:59:54 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XqrHU-0006Ph-OT; Wed, 19 Nov 2014 09:29:52 +1100 Date: Wed, 19 Nov 2014 09:29:52 +1100 From: Dave Chinner To: Jan Kara Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 10/11] quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units Message-ID: <20141118222952.GQ23575@dastard> X-ASG-Orig-Subj: Re: [PATCH 10/11] quota: Switch ->get_dqblk() and ->set_dqblk() to use bytes as space units References: <1415739865-2438-1-git-send-email-jack@suse.cz> <1415739865-2438-11-git-send-email-jack@suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415739865-2438-11-git-send-email-jack@suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1416349800 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 11, 2014 at 10:04:24PM +0100, Jan Kara wrote: > Currently ->get_dqblk() and ->set_dqblk() use struct fs_disk_quota which > tracks space limits and usage in 512-byte blocks. However VFS quotas > track usage in bytes (as some filesystems require that) and we need to > somehow pass this information. Upto now it wasn't a problem because we > didn't do any unit conversion (thus VFS quota routines happily stuck > number of bytes into d_bcount field of struct fd_disk_quota). Only if > you tried to use Q_XGETQUOTA or Q_XSETQLIM for VFS quotas (or Q_GETQUOTA > / Q_SETQUOTA for XFS quotas), you got bogus results but noone really > tried that. But when we want interfaces compatible we need to fix this. > > So we bite the bullet and define another quota structure used for > passing information from/to ->get_dqblk()/->set_dqblk. It's somewhat > sad we have to have more conversion routines in fs/quota/quota.c but > it seems cleaner than overloading e.g. units of d_bcount to bytes. I don't really like the idea of having to copy the dquot information an extra time. We now: - copy from internal dquot to the new qc_dqblk - copy from the new qc_dqblk to if_dqblk/xfs_dqblk - copy if_dqblk/xfs_dqblk to the user buffer. That's now three copies, and when we are having to deal with quota reports containing hundreds of thousands of dquots that's going to hrut performance. We could probably get away with just one copy by passing a filldir()-like context down into the filesystems to format their internal dquot information directly into the user buffer in the appropriate format. That way fs/quota/quota.c doesn't need conversion routines, filesystems can optimise the formating to minimise copying, and we can still provide generic routines for filesystems using the generic quota infrastructure.... [...] > @@ -277,10 +287,73 @@ static int quota_getxstatev(struct super_block *sb, void __user *addr) > return ret; > } > > +/* XFS blocks to space conversion */ > +static u64 xfs_btos(u64 blocks) > +{ > + return blocks << 9; > +} > + > +/* Space to XFS blocks conversion */ > +static u64 xfs_stob(u64 space) > +{ > + return (space + 511) >> 9; > +} Which is just redefining BBTOB() [Basic Blocks to Bytes] and BTOBB() with magic numbers and no explanation of what a "block" actually is. We already export those macros to userspace, and they are used by xfs_quota to convert the block counts to bytes.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 18 16:35:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 13CD87F47 for ; Tue, 18 Nov 2014 16:35:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F32588F8037 for ; Tue, 18 Nov 2014 14:35:31 -0800 (PST) X-ASG-Debug-ID: 1416350128-04cbb01e5912ea40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yBBEbDK3FRh7vmDb for ; Tue, 18 Nov 2014 14:35:29 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Akg6ACHJa1R5LLEQPGdsb2JhbABbgw6BLoI2UIQ3sRsGlSaFZwQCAoERFwEBAQEBBgEBAQE4O4QCAQEBAwEjDwEjIwULCAMOCgICBSECAg8FJQMHGhOIOAi6dZcLAQsgGIEVhQyKTweCd4FUBZAnji6bCSkwgksBAQE Received: from ppp121-44-177-16.lns20.syd7.internode.on.net (HELO dastard) ([121.44.177.16]) by ipmail06.adl6.internode.on.net with ESMTP; 19 Nov 2014 09:05:19 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XqrMk-0006Qc-8J; Wed, 19 Nov 2014 09:35:18 +1100 Date: Wed, 19 Nov 2014 09:35:18 +1100 From: Dave Chinner To: Brian Foster Cc: Mukul Malhotra , xfs@oss.sgi.com Subject: Re: How to determine the reserved blocks in xfs filesystem ? Message-ID: <20141118223518.GR23575@dastard> X-ASG-Orig-Subj: Re: How to determine the reserved blocks in xfs filesystem ? References: <20141118133206.GA5226@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20141118133206.GA5226@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1416350128 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 18, 2014 at 08:32:07AM -0500, Brian Foster wrote: > On Tue, Nov 18, 2014 at 06:05:58PM +0530, Mukul Malhotra wrote: > > ​Hello, > > > > Does xfs have reserved blocks too, like ext* ? if yes, how can they be > > determined ?​ > > > > XFS reserves blocks internally such that it can perform operations when > all free space is consumed, etc. It looks like 5% is the default. Not quite. /* * We default to 5% or 8192 fsbs of space reserved, whichever is * smaller. This is intended to cover concurrent allocation * transactions when we initially hit enospc. These each require a 4 * block reservation. Hence by default we cover roughly 2000 concurrent * allocation reservations. */ So, in most cases, there are 32MB of reserved blocks available for internal emergency use. > I don't think it's "like ext4," however, which reserves blocks for the > root user. I don't believe the reserved blocks in XFS are accessible for > file allocation by any user unless the reserve pool is modified as such. Most definitely not "like ext4". The reserved blocks are considered "used space" (i.e. not available to any user) and are reported as such in statfs() output (e.g. via df). Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue Nov 18 18:19:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F60E7F3F for ; Tue, 18 Nov 2014 18:19:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D8DE8F8035 for ; Tue, 18 Nov 2014 16:19:55 -0800 (PST) X-ASG-Debug-ID: 1416356393-04bdf0615f113790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v0nsteM9J527uwzP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Nov 2014 16:19:54 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAJ0JiVf013018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 18 Nov 2014 19:19:44 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAJ0Jhij016386; Tue, 18 Nov 2014 19:19:43 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D0070122F87; Tue, 18 Nov 2014 19:19:41 -0500 (EST) Date: Tue, 18 Nov 2014 19:19:41 -0500 From: Brian Foster To: Dave Chinner Cc: Mukul Malhotra , xfs@oss.sgi.com Subject: Re: How to determine the reserved blocks in xfs filesystem ? Message-ID: <20141119001941.GA37095@bfoster.bfoster> X-ASG-Orig-Subj: Re: How to determine the reserved blocks in xfs filesystem ? References: <20141118133206.GA5226@bfoster.bfoster> <20141118223518.GR23575@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20141118223518.GR23575@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416356393 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Nov 19, 2014 at 09:35:18AM +1100, Dave Chinner wrote: > On Tue, Nov 18, 2014 at 08:32:07AM -0500, Brian Foster wrote: > > On Tue, Nov 18, 2014 at 06:05:58PM +0530, Mukul Malhotra wrote: > > > ​Hello, > > > > > > Does xfs have reserved blocks too, like ext* ? if yes, how can they be > > > determined ?​ > > > > > > > XFS reserves blocks internally such that it can perform operations when > > all free space is consumed, etc. It looks like 5% is the default. > > Not quite. > > /* > * We default to 5% or 8192 fsbs of space reserved, whichever is > * smaller. This is intended to cover concurrent allocation > * transactions when we initially hit enospc. These each require a 4 > * block reservation. Hence by default we cover roughly 2000 concurrent > * allocation reservations. > */ > > So, in most cases, there are 32MB of reserved blocks available for > internal emergency use. > Yep, I glossed right over the hard cap... thanks. ;) Brian > > I don't think it's "like ext4," however, which reserves blocks for the > > root user. I don't believe the reserved blocks in XFS are accessible for > > file allocation by any user unless the reserve pool is modified as such. > > Most definitely not "like ext4". The reserved blocks are considered > "used space" (i.e. not available to any user) and are reported as > such in statfs() output (e.g. via df). > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From sandeen@redhat.com Wed Nov 19 16:12:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26C637F3F for ; Wed, 19 Nov 2014 16:12:58 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AACABAC001 for ; Wed, 19 Nov 2014 14:12:54 -0800 (PST) X-ASG-Debug-ID: 1416435173-04cb6c0573184040001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kwnBBm5dhjthbYfW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 19 Nov 2014 14:12:53 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAJMCq9X025043 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 19 Nov 2014 17:12:52 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAJMCpnB000656 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Wed, 19 Nov 2014 17:12:52 -0500 Message-ID: <546D15E3.5000200@redhat.com> Date: Wed, 19 Nov 2014 16:12:51 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416435173 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Here blkno is a daddr_t, which is a __s64; it's possible to hold a value which is negative, and thus pass the (blkno >= eofs) test. Then we try to do a xfs_perag_get() for a ridiculous agno via xfs_daddr_to_agno(), and bad things happen when that fails, and returns a null pag which is dereferenced shortly thereafter. Found via a user-supplied fuzzed image... Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 24b4ebe..f54a497 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -463,7 +463,7 @@ _xfs_buf_find( * have to check that the buffer falls within the filesystem bounds. */ eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); - if (blkno >= eofs) { + if (blkno < 0 || blkno >= eofs) { /* * XXX (dgc): we should really be returning -EFSCORRUPTED here, * but none of the higher level infrastructure supports From sandeen@sandeen.net Wed Nov 19 16:27:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5E6CC7F3F for ; Wed, 19 Nov 2014 16:27:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2CDE8304032 for ; Wed, 19 Nov 2014 14:27:28 -0800 (PST) X-ASG-Debug-ID: 1416436046-04bdf0616016afd0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Ju6zF31FmBKESLdR for ; Wed, 19 Nov 2014 14:27:27 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7F53263C3BCF; Wed, 19 Nov 2014 16:27:26 -0600 (CST) Message-ID: <546D194D.2010600@sandeen.net> Date: Wed, 19 Nov 2014 16:27:25 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() References: <546D15E3.5000200@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() In-Reply-To: <546D15E3.5000200@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1416436047 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/19/14 4:12 PM, Eric Sandeen wrote: > Here blkno is a daddr_t, which is a __s64; it's possible to hold > a value which is negative, and thus pass the (blkno >= eofs) > test. Then we try to do a xfs_perag_get() for a ridiculous > agno via xfs_daddr_to_agno(), and bad things happen when that > fails, and returns a null pag which is dereferenced shortly > thereafter. > > Found via a user-supplied fuzzed image... NAK - this needs a bit more love; if we catch this and fail, the caller may still do something crazy with this data. V2 coming in a bit. -Eric From jnsiswa@servermm.ardetamedia.com Thu Nov 20 08:52:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5DB567F3F for ; Thu, 20 Nov 2014 08:52:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4A8088F8039 for ; Thu, 20 Nov 2014 06:52:07 -0800 (PST) X-ASG-Debug-ID: 1416495124-04cb6c057019adf0001-NocioJ Received: from servermm.ardetamedia.com (servermm.ardetamedia.com [38.68.15.27]) by cuda.sgi.com with ESMTP id VL3p3WoGMji9mzRC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 20 Nov 2014 06:52:05 -0800 (PST) X-Barracuda-Envelope-From: jnsiswa@servermm.ardetamedia.com X-Barracuda-Apparent-Source-IP: 38.68.15.27 Received: from jnsiswa by servermm.ardetamedia.com with local (Exim 4.82) (envelope-from ) id 1XrT5X-0000SV-Ce for xfs@oss.sgi.com; Thu, 20 Nov 2014 21:52:03 +0700 To: xfs@oss.sgi.com Subject: I'm interested in your product X-PHP-Script: siswa.jendela.co.id/feeds/okonmailer.php for 41.138.182.15 X-ASG-Orig-Subj: I'm interested in your product From: ALIBABA.COM Reply-To: MIME-Version: 1.0 Content-Type: text/html Content-Transfer-Encoding: 8bit Message-Id: Sender: Date: Thu, 20 Nov 2014 21:52:03 +0700 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - servermm.ardetamedia.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [515 526] / [47 12] X-AntiAbuse: Sender Address Domain - servermm.ardetamedia.com X-Get-Message-Sender-Via: servermm.ardetamedia.com: authenticated_id: jnsiswa/only user confirmed/virtual account not confirmed X-Barracuda-Connect: servermm.ardetamedia.com[38.68.15.27] X-Barracuda-Start-Time: 1416495124 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: kriegerheim.de X-Barracuda-Spam-Score: 1.05 X-Barracuda-Spam-Status: No, SCORE=1.05 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11818 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag
logo The following message was generated before november,19 2014. 8:16(CST)

Kim Chi-hung has sent you a new message

Dear Supply,

Our customer's have request on your products. Kindly View secure AliExpress E-Catalogue for our requirements
Free Member
This message was sent to you only
China
RE: Inquiry about your product
Required Product View E-Catalogue - AliExpress Secure Login.

E-Catalogue
Report Spam

Forgot password?
This email was sent to you only.
You are receiving this email because you are a registered member of Alibaba.com website.
To unsubscribe from future service emails, click here .

Read out Privacy Policy and Terms of Use
Alibaba.com Hong Kong Limited,
26/F Tower One,Times Square,1 Matheson Street,Causeway Bay,Hong Kong
If you encounter problems replying to this inquiry, please find help at or contact our service team immediately.
Free Member Service Center:alibaba@service.alibaba.com

X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EEA547F3F for ; Fri, 21 Nov 2014 10:36:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6EEE0AC005 for ; Fri, 21 Nov 2014 08:36:37 -0800 (PST) X-ASG-Debug-ID: 1416587795-04cb6c05721ee3e0001-NocioJ Received: from mail-ig0-f169.google.com (mail-ig0-f169.google.com [209.85.213.169]) by cuda.sgi.com with ESMTP id jE7YtoVKONgQ1NWR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 08:36:35 -0800 (PST) X-Barracuda-Envelope-From: smilemukul2005@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.169] Received: by mail-ig0-f169.google.com with SMTP id hl2so1852108igb.4 for ; Fri, 21 Nov 2014 08:36:35 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=vafajissB7YeAwEVD53wFLAcIFy7W4W4+e/G4muor5I=; b=RsP50J5nGCNkX7WKcuZImPDjfK/+2WNPhn+HrcRwUVdkiqghpVhJKNeojRB/fBqLor 8gXr7Fzsm2/CnkilKOrB3L3r+jXWAfL+edhdYpjf3ramw170jVZfKOqPZUAaNQcw68z5 M7kHoMVHRBJEBgVBbjEHIef+x+2It0rylhL3u7/scdrwDDyGrvmKGsu1kC76eN+h9fQ9 KHs9h6w/wlxSDqLzWyCUceKGlLoqioDIXq2Zy7tFt6acS4femziT+fT8ycAocmfsqzg+ we+7X+y+6OgX0cxqkneiZgCYdddtwH+3Nid04LRSfCtAFcsWMELHo8OFvabCx2S7i/7W 0bTA== MIME-Version: 1.0 X-Received: by 10.50.171.193 with SMTP id aw1mr16631203igc.2.1416587795272; Fri, 21 Nov 2014 08:36:35 -0800 (PST) Received: by 10.64.227.147 with HTTP; Fri, 21 Nov 2014 08:36:35 -0800 (PST) In-Reply-To: <20141119001941.GA37095@bfoster.bfoster> References: <20141118133206.GA5226@bfoster.bfoster> <20141118223518.GR23575@dastard> <20141119001941.GA37095@bfoster.bfoster> Date: Fri, 21 Nov 2014 22:06:35 +0530 Message-ID: Subject: Re: How to determine the reserved blocks in xfs filesystem ? From: Mukul Malhotra X-ASG-Orig-Subj: Re: How to determine the reserved blocks in xfs filesystem ? To: Brian Foster Cc: Dave Chinner , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e0112ccea5499cb0508610c89 X-Barracuda-Connect: mail-ig0-f169.google.com[209.85.213.169] X-Barracuda-Start-Time: 1416587795 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --089e0112ccea5499cb0508610c89 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Thanks a lot for the solution. =E2=80=8BMukul On Wed, Nov 19, 2014 at 5:49 AM, Brian Foster wrote: > On Wed, Nov 19, 2014 at 09:35:18AM +1100, Dave Chinner wrote: > > On Tue, Nov 18, 2014 at 08:32:07AM -0500, Brian Foster wrote: > > > On Tue, Nov 18, 2014 at 06:05:58PM +0530, Mukul Malhotra wrote: > > > > =E2=80=8BHello, > > > > > > > > Does xfs have reserved blocks too, like ext* ? if yes, how can they > be > > > > determined ?=E2=80=8B > > > > > > > > > > XFS reserves blocks internally such that it can perform operations wh= en > > > all free space is consumed, etc. It looks like 5% is the default. > > > > Not quite. > > > > /* > > * We default to 5% or 8192 fsbs of space reserved, whichever i= s > > * smaller. This is intended to cover concurrent allocation > > * transactions when we initially hit enospc. These each requir= e > a 4 > > * block reservation. Hence by default we cover roughly 2000 > concurrent > > * allocation reservations. > > */ > > > > So, in most cases, there are 32MB of reserved blocks available for > > internal emergency use. > > > > Yep, I glossed right over the hard cap... thanks. ;) > > Brian > > > > I don't think it's "like ext4," however, which reserves blocks for th= e > > > root user. I don't believe the reserved blocks in XFS are accessible > for > > > file allocation by any user unless the reserve pool is modified as > such. > > > > Most definitely not "like ext4". The reserved blocks are considered > > "used space" (i.e. not available to any user) and are reported as > > such in statfs() output (e.g. via df). > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > --089e0112ccea5499cb0508610c89 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Tha= nks a lot for the solution.

=E2=80=8BMukul
=

On Wed, Nov 19, 2014 at 5:49 AM, Brian Foste= r <bfoster@redhat.com> wrote:
On Wed, Nov 19, 2014 at 09:35:18AM +1100, Dave Chinne= r wrote:
> On Tue, Nov 18, 2014 at 08:32:07AM -0500, Brian Foster wrote:
> > On Tue, Nov 18, 2014 at 06:05:58PM +0530, Mukul Malhotra wrote: > > > =E2=80=8BHello,
> > >
> > > Does xfs have reserved blocks too, like ext* ? if yes, how c= an they be
> > > determined ?=E2=80=8B
> > >
> >
> > XFS reserves blocks internally such that it can perform operation= s when
> > all free space is consumed, etc. It looks like 5% is the default.=
>
> Not quite.
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * We default to 5% or 8192 fsbs of s= pace reserved, whichever is
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * smaller.=C2=A0 This is intended to= cover concurrent allocation
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * transactions when we initially hit= enospc. These each require a 4
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * block reservation. Hence by defaul= t we cover roughly 2000 concurrent
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * allocation reservations.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
>
> So, in most cases, there are 32MB of reserved blocks available for
> internal emergency use.
>

Yep, I glossed right over the hard cap... thanks. ;)

Brian

> > I don't think it's "like ext4," however, which = reserves blocks for the
> > root user. I don't believe the reserved blocks in XFS are acc= essible for
> > file allocation by any user unless the reserve pool is modified a= s such.
>
> Most definitely not "like ext4". The reserved blocks are con= sidered
> "used space" (i.e. not available to any user) and are report= ed as
> such in statfs() output (e.g. via df).
>
> Cheers,
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com

--089e0112ccea5499cb0508610c89-- From tytso@thunk.org Fri Nov 21 13:59:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1437C7F3F for ; Fri, 21 Nov 2014 13:59:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01372304053 for ; Fri, 21 Nov 2014 11:59:45 -0800 (PST) X-ASG-Debug-ID: 1416599983-04cbb01e5c20a3a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id zBJuJELzEGVqsHMf (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 11:59:43 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=6epR2VS03WKMYesoY21FoaywPMYD7c8f/A95vpgbm0s=; b=OsgpqtFiO2/cCseztddr3aI2A/pHzj+accFKTohHBk6wA7ods617O37UTsCC1lZr5V6oMBPOzrb/8kZ9pNOxIYxjTRgQSGHZwWaNfOAka1yoLFbX3t+oJVtTESWEGae5b8VlQWwMvZslirZVAkLSMFAFqdBbsD4O9BmVU9bpRYQ=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XruMm-0004O1-DG; Fri, 21 Nov 2014 19:59:40 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 8BC5A5802FA; Fri, 21 Nov 2014 14:59:40 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH 2/4] vfs: add support for a lazytime mount option Date: Fri, 21 Nov 2014 14:59:22 -0500 X-ASG-Orig-Subj: [PATCH 2/4] vfs: add support for a lazytime mount option Message-Id: <1416599964-21892-3-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416599964-21892-1-git-send-email-tytso@mit.edu> References: <1416599964-21892-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416599983 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add a new mount option which enables a new "lazytime" mode. This mode causes atime, mtime, and ctime updates to only be made to the in-memory version of the inode. The on-disk times will only get updated when (a) if the inode needs to be updated for some non-time related change, (b) if userspace calls fsync(), syncfs() or sync(), or (c) just before an undeleted inode is evicted from memory. This is OK according to POSIX because there are no guarantees after a crash unless userspace explicitly requests via a fsync(2) call. For workloads which feature a large number of random write to a preallocated file, the lazytime mount option significantly reduces writes to the inode table. The repeated 4k writes to a single block will result in undesirable stress on flash devices and SMR disk drives. Even on conventional HDD's, the repeated writes to the inode table block will trigger Adjacent Track Interference (ATI) remediation latencies, which very negatively impact 99.9 percentile latencies --- which is a very big deal for web serving tiers (for example). Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 38 +++++++++++++++++++++++++++++++++++++- fs/inode.c | 18 ++++++++++++++++++ fs/proc_namespace.c | 1 + fs/sync.c | 7 +++++++ include/linux/fs.h | 1 + include/uapi/linux/fs.h | 1 + 6 files changed, 65 insertions(+), 1 deletion(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ef9bef1..ce7de22 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -483,7 +483,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) inode->i_state &= ~I_DIRTY_PAGES; dirty = inode->i_state & I_DIRTY; - inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); + inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_TIME); spin_unlock(&inode->i_lock); /* Don't write the inode if only I_DIRTY_PAGES was set */ if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { @@ -1277,6 +1277,41 @@ static void wait_sb_inodes(struct super_block *sb) iput(old_inode); } +/* + * This works like wait_sb_inodes(), but it is called *before* we kick + * the bdi so the inodes can get written out. + */ +static void flush_sb_dirty_time(struct super_block *sb) +{ + struct inode *inode, *old_inode = NULL; + + WARN_ON(!rwsem_is_locked(&sb->s_umount)); + spin_lock(&inode_sb_list_lock); + list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { + int dirty_time; + + spin_lock(&inode->i_lock); + if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { + spin_unlock(&inode->i_lock); + continue; + } + dirty_time = inode->i_state & I_DIRTY_TIME; + __iget(inode); + spin_unlock(&inode->i_lock); + spin_unlock(&inode_sb_list_lock); + + iput(old_inode); + old_inode = inode; + + if (dirty_time) + mark_inode_dirty(inode); + cond_resched(); + spin_lock(&inode_sb_list_lock); + } + spin_unlock(&inode_sb_list_lock); + iput(old_inode); +} + /** * writeback_inodes_sb_nr - writeback dirty inodes from given super_block * @sb: the superblock @@ -1388,6 +1423,7 @@ void sync_inodes_sb(struct super_block *sb) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); + flush_sb_dirty_time(sb); bdi_queue_work(sb->s_bdi, &work); wait_for_completion(&done); diff --git a/fs/inode.c b/fs/inode.c index 8f5c4b5..6e91aca 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -534,6 +534,18 @@ static void evict(struct inode *inode) BUG_ON(!(inode->i_state & I_FREEING)); BUG_ON(!list_empty(&inode->i_lru)); + if (inode->i_nlink && inode->i_state & I_DIRTY_TIME) { + if (inode->i_op->write_time) + inode->i_op->write_time(inode); + else if (inode->i_sb->s_op->write_inode) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_NONE, + }; + mark_inode_dirty(inode); + inode->i_sb->s_op->write_inode(inode, &wbc); + } + } + if (!list_empty(&inode->i_wb_list)) inode_wb_list_del(inode); @@ -1515,6 +1527,12 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } + if (inode->i_sb->s_flags & MS_LAZYTIME) { + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + return 0; + } if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 73ca174..f98234a 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c @@ -44,6 +44,7 @@ static int show_sb_opts(struct seq_file *m, struct super_block *sb) { MS_SYNCHRONOUS, ",sync" }, { MS_DIRSYNC, ",dirsync" }, { MS_MANDLOCK, ",mand" }, + { MS_LAZYTIME, ",lazytime" }, { 0, NULL } }; const struct proc_fs_info *fs_infop; diff --git a/fs/sync.c b/fs/sync.c index bdc729d..db7930e 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -177,8 +177,15 @@ SYSCALL_DEFINE1(syncfs, int, fd) */ int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) { + struct inode *inode = file->f_mapping->host; + if (!file->f_op->fsync) return -EINVAL; + if (!datasync && inode->i_state & I_DIRTY_TIME) { + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_SYNC; + spin_unlock(&inode->i_lock); + } return file->f_op->fsync(file, start, end, datasync); } EXPORT_SYMBOL(vfs_fsync_range); diff --git a/include/linux/fs.h b/include/linux/fs.h index 3633239..489b2f2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1721,6 +1721,7 @@ struct super_operations { #define __I_DIO_WAKEUP 9 #define I_DIO_WAKEUP (1 << I_DIO_WAKEUP) #define I_LINKABLE (1 << 10) +#define I_DIRTY_TIME (1 << 11) #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3735fa0..cc9713a 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -90,6 +90,7 @@ struct inodes_stat_t { #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ +#define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.1.0 From tytso@thunk.org Fri Nov 21 13:59:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 25A797F50 for ; Fri, 21 Nov 2014 13:59:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0162F8F8037 for ; Fri, 21 Nov 2014 11:59:45 -0800 (PST) X-ASG-Debug-ID: 1416599983-04cbb01e5b20a3a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id JJNvRDoHYG1nJpci (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 11:59:43 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=13y99vOsd4HI5b3Kc35Sgyquprs23epvvaEgONvqCYY=; b=MBYIku/UxePy9/sc4+aYXDIxqJyanRX8GRW2dfq7QE6K0avEc6utG64J05LpXEaS54SmtaS/QhkouDizwO+zMk6umZGkLdmmxce3ES+Z1K/EXCN43DPRv/vRddvuJcmJ8WWhn5vAM+vdKS03G+i4PGl0VCls3ZNtXCX26cMgofI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XruMm-0004O0-EO; Fri, 21 Nov 2014 19:59:40 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 596AE580248; Fri, 21 Nov 2014 14:59:40 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Date: Fri, 21 Nov 2014 14:59:21 -0500 X-ASG-Orig-Subj: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-Id: <1416599964-21892-2-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416599964-21892-1-git-send-email-tytso@mit.edu> References: <1416599964-21892-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416599983 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature In preparation for adding support for the lazytime mount option, we need to be able to separate out the update_time() and write_time() inode operations. Currently, only btrfs and xfs uses update_time(). We needed to preserve update_time() because btrfs wants to have a special btrfs_root_readonly() check; otherwise we could drop the update_time() inode operation entirely. Signed-off-by: Theodore Ts'o Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org --- fs/btrfs/inode.c | 10 ++++++++++ fs/inode.c | 29 ++++++++++++++++++----------- fs/xfs/xfs_iops.c | 39 ++++++++++++++++----------------------- include/linux/fs.h | 1 + 4 files changed, 45 insertions(+), 34 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d23362f..a5e0d0d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5574,6 +5574,11 @@ static int btrfs_update_time(struct inode *inode, struct timespec *now, inode->i_mtime = *now; if (flags & S_ATIME) inode->i_atime = *now; + return 0; +} + +static int btrfs_write_time(struct inode *inode) +{ return btrfs_dirty_inode(inode); } @@ -9462,6 +9467,7 @@ static const struct inode_operations btrfs_dir_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9470,6 +9476,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9540,6 +9547,7 @@ static const struct inode_operations btrfs_file_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9552,6 +9560,7 @@ static const struct inode_operations btrfs_special_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9565,6 +9574,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; const struct dentry_operations btrfs_dentry_operations = { diff --git a/fs/inode.c b/fs/inode.c index 26753ba..8f5c4b5 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1499,17 +1499,24 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { - if (inode->i_op->update_time) - return inode->i_op->update_time(inode, time, flags); - - if (flags & S_ATIME) - inode->i_atime = *time; - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *time; - if (flags & S_MTIME) - inode->i_mtime = *time; + int ret; + + if (inode->i_op->update_time) { + ret = inode->i_op->update_time(inode, time, flags); + if (ret) + return ret; + } else { + if (flags & S_ATIME) + inode->i_atime = *time; + if (flags & S_VERSION) + inode_inc_iversion(inode); + if (flags & S_CTIME) + inode->i_ctime = *time; + if (flags & S_MTIME) + inode->i_mtime = *time; + } + if (inode->i_op->write_time) + return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0e9653c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -984,10 +984,8 @@ xfs_vn_setattr( } STATIC int -xfs_vn_update_time( - struct inode *inode, - struct timespec *now, - int flags) +xfs_vn_write_time( + struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; @@ -1004,21 +1002,16 @@ xfs_vn_update_time( } xfs_ilock(ip, XFS_ILOCK_EXCL); - if (flags & S_CTIME) { - inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_MTIME) { - inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_ATIME) { - inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec; - } + + ip->i_d.di_ctime.t_sec = (__int32_t) inode->i_ctime.tv_sec; + ip->i_d.di_ctime.t_nsec = (__int32_t) inode->i_ctime.tv_nsec; + + ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec; + ip->i_d.di_mtime.t_nsec = (__int32_t) inode->i_mtime.tv_nsec; + + ip->i_d.di_atime.t_sec = (__int32_t) inode->i_atime.tv_sec; + ip->i_d.di_atime.t_nsec = (__int32_t) inode->i_atime.tv_nsec; + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); return xfs_trans_commit(tp, 0); @@ -1129,7 +1122,7 @@ static const struct inode_operations xfs_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .fiemap = xfs_vn_fiemap, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; static const struct inode_operations xfs_dir_inode_operations = { @@ -1156,7 +1149,7 @@ static const struct inode_operations xfs_dir_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1184,7 +1177,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1198,7 +1191,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; STATIC void diff --git a/include/linux/fs.h b/include/linux/fs.h index 9ab779e..3633239 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,6 +1545,7 @@ struct inode_operations { int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*update_time)(struct inode *, struct timespec *, int); + int (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); -- 2.1.0 From tytso@thunk.org Fri Nov 21 13:59:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 205D57F47 for ; Fri, 21 Nov 2014 13:59:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0EAF4304062 for ; Fri, 21 Nov 2014 11:59:45 -0800 (PST) X-ASG-Debug-ID: 1416599984-04cbb01e5a20a3a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id owNCDA6KcHgYFzgk (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 11:59:44 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=Message-Id:Date:Subject:Cc:To:From; bh=sDHJyYASAo2c/1k2tWjW7dPaSCImOFk87ano0iQoqIM=; b=wtlggqqt48lnOUCemrMlfLGa6HFz7nzyEFdU2egmeeXwr3T129kvxLGaV6ueXjyO9l9YJk76OUkorgcXif/MCaYza0QZue4xLxPl9+80RTgmD59d3ULrzlX12VsKgE8RLkJMntqQPmqfAnLmBFS2ARXwpfNVumuLNMlhsTjXL4s=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XruMm-0004OC-Kv; Fri, 21 Nov 2014 19:59:40 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 314EA5801DE; Fri, 21 Nov 2014 14:59:40 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH 0/4] add support for a lazytime mount option Date: Fri, 21 Nov 2014 14:59:20 -0500 X-ASG-Orig-Subj: [PATCH 0/4] add support for a lazytime mount option Message-Id: <1416599964-21892-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416599984 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is an updated version of what had originally been an ext4-specific patch which significantly improves performance by lazily writing timestamp updates (and in particular, mtime updates) to disk. The in-memory timestamps are always correct, but they are only written to disk when required for correctness. This provides a huge performance boost for ext4 due to how it handles journalling, but it's valuable for all file systems running on flash storage or drive-managed SMR disks by reducing the metadata write load. So upon request, I've moved the functionality to the VFS layer. Once the /sbin/mount program adds support for MS_LAZYTIME, all file systems should be able to benefit from this optimization. There is still an ext4-specific optimization, which may be applicable for other file systems which store more than one inode in a block, but it will require file system specific code. It is purely optional, however. Please note the changes to update_time() and the new write_time() inode operations functions, which impact btrfs and xfs. The changes are fairly simple, but I would appreciate confirmation from the btrfs and xfs teams that I got things right. Thanks!! Theodore Ts'o (4): fs: split update_time() into update_time() and write_time() vfs: add support for a lazytime mount option vfs: don't let the dirty time inodes get more than a day stale ext4: add support for a lazytime mount option fs/btrfs/inode.c | 10 ++++++ fs/ext4/inode.c | 46 +++++++++++++++++++++++++- fs/ext4/super.c | 9 +++++ fs/fs-writeback.c | 39 +++++++++++++++++++++- fs/inode.c | 88 ++++++++++++++++++++++++++++++++++++++++++------- fs/proc_namespace.c | 1 + fs/sync.c | 7 ++++ fs/xfs/xfs_iops.c | 39 +++++++++------------- include/linux/fs.h | 5 +++ include/uapi/linux/fs.h | 1 + 10 files changed, 209 insertions(+), 36 deletions(-) -- 2.1.0 From tytso@thunk.org Fri Nov 21 13:59:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2C8177F3F for ; Fri, 21 Nov 2014 13:59:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BDA1DAC005 for ; Fri, 21 Nov 2014 11:59:46 -0800 (PST) X-ASG-Debug-ID: 1416599983-04bdf0615f1f46a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id iN5bqBoD9AEYJ49y (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 11:59:43 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=LB+y2TtUKb8BYWR2G0uErOApQbABdKv4MF4Ytn3gS/w=; b=Ky2y9MYJU5ON70UiA3fiJc4Zmpn5kaOf8Rtjci/avvPhpf4LN8ef2SHybY1PxU1g5tcW1/YGz05oHvccoo1WZCeotZ5FqPFTpvuY85YiBObLrNsO6VZw9jhz3k62+30I+jLWePu5AfJpZI6JkYqUwKmYTsVLwh6KSAhruHeTvXc=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XruMm-0004O8-HR; Fri, 21 Nov 2014 19:59:40 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C59E5580395; Fri, 21 Nov 2014 14:59:40 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Date: Fri, 21 Nov 2014 14:59:23 -0500 X-ASG-Orig-Subj: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-Id: <1416599964-21892-4-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416599964-21892-1-git-send-email-tytso@mit.edu> References: <1416599964-21892-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416599983 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Guarantee that the on-disk timestamps will be no more than 24 hours stale. Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 1 + fs/inode.c | 7 ++++++- include/linux/fs.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ce7de22..eb04277 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1141,6 +1141,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { trace_writeback_dirty_inode_start(inode, flags); + inode->i_ts_dirty_day = 0; if (sb->s_op->dirty_inode) sb->s_op->dirty_inode(inode, flags); diff --git a/fs/inode.c b/fs/inode.c index 6e91aca..f0d6232 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1511,6 +1511,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { + int days_since_boot = jiffies / (HZ * 86400); int ret; if (inode->i_op->update_time) { @@ -1527,12 +1528,16 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } - if (inode->i_sb->s_flags & MS_LAZYTIME) { + if ((inode->i_sb->s_flags & MS_LAZYTIME) && + (!inode->i_ts_dirty_day || + inode->i_ts_dirty_day == days_since_boot)) { spin_lock(&inode->i_lock); inode->i_state |= I_DIRTY_TIME; spin_unlock(&inode->i_lock); + inode->i_ts_dirty_day = days_since_boot; return 0; } + inode->i_ts_dirty_day = 0; if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/include/linux/fs.h b/include/linux/fs.h index 489b2f2..e3574cd 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -575,6 +575,7 @@ struct inode { struct timespec i_ctime; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ unsigned short i_bytes; + unsigned short i_ts_dirty_day; unsigned int i_blkbits; blkcnt_t i_blocks; -- 2.1.0 From tytso@thunk.org Fri Nov 21 13:59:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 24B137F4E for ; Fri, 21 Nov 2014 13:59:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 018D78F8039 for ; Fri, 21 Nov 2014 11:59:45 -0800 (PST) X-ASG-Debug-ID: 1416599983-04cbb01e5920a390001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id ocBqjua5nDBS2niH (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 11:59:43 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=kYbcAJVzuQvmtXa2+GJH0V6bpJ2VFFZXU2L1qnZppis=; b=kTOKPEwvG+7zd6YNmt0+Ni768R8VG4LXXr40BKT22JAIGJt98vJV8rtIfglIpCCYLTYqxGGHGmHs4nB1PQI0se3Jzj5V9FSUM5GtA8tPYI1h3OMih8PeWIkeYSNg4GbDtWiR6EXBoM4wUkdqIdOL8mLsd/hjeH5YfEOVvk8Orjs=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XruMm-0004OI-VM; Fri, 21 Nov 2014 19:59:41 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 098C45803BD; Fri, 21 Nov 2014 14:59:41 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH 4/4] ext4: add support for a lazytime mount option Date: Fri, 21 Nov 2014 14:59:24 -0500 X-ASG-Orig-Subj: [PATCH 4/4] ext4: add support for a lazytime mount option Message-Id: <1416599964-21892-5-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416599964-21892-1-git-send-email-tytso@mit.edu> References: <1416599964-21892-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416599983 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add an optimization for the MS_LAZYTIME mount option so that we will opportunistically write out any inodes with the I_DIRTY_TIME flag set in a particular inode table block when we need to update some inode in that inode table block anyway. Also add some temporary code so that we can set the lazytime mount option without needing a modified /sbin/mount program which can set MS_LAZYTIME. We can eventually make this go away once util-linux has added support. Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/ext4/inode.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- fs/ext4/super.c | 9 +++++++++ fs/inode.c | 36 ++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 2 ++ 4 files changed, 92 insertions(+), 1 deletion(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3356ab5..07ceafb 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4163,6 +4163,49 @@ static int ext4_inode_blocks_set(handle_t *handle, } /* + * Opportunistically update the other time fields for other inodes in + * the same inode table block. + */ +static void ext4_update_other_inodes_time(struct super_block *sb, + unsigned long orig_ino, char *buf) +{ + struct ext4_inode_info *ei; + struct ext4_inode *raw_inode; + unsigned long ino; + struct inode *inode; + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; + int inode_size = EXT4_INODE_SIZE(sb); + + ino = orig_ino & ~(inodes_per_block - 1); + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { + if (ino == orig_ino) + continue; + inode = find_active_inode_nowait(sb, ino); + if (!inode || + (inode->i_state & I_DIRTY_TIME) == 0) { + iput(inode); + continue; + } + raw_inode = (struct ext4_inode *) buf; + ei = EXT4_I(inode); + + spin_lock(&inode->i_lock); + inode->i_state &= ~I_DIRTY_TIME; + inode->i_ts_dirty_day = 0; + spin_unlock(&inode->i_lock); + + spin_lock(&ei->i_raw_lock); + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); + ext4_inode_csum_set(inode, raw_inode, ei); + spin_unlock(&ei->i_raw_lock); + iput(inode); + } +} + + +/* * Post the struct inode info into an on-disk inode location in the * buffer-cache. This gobbles the caller's reference to the * buffer_head in the inode location struct. @@ -4273,9 +4316,10 @@ static int ext4_do_update_inode(handle_t *handle, } ext4_inode_csum_set(inode, raw_inode, ei); - spin_unlock(&ei->i_raw_lock); + ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, bh->b_data); + BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); rc = ext4_handle_dirty_metadata(handle, NULL, bh); if (!err) diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 4b79f39..1ac1914 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1133,6 +1133,7 @@ enum { Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err, Opt_usrquota, Opt_grpquota, Opt_i_version, Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_mblk_io_submit, + Opt_lazytime, Opt_nolazytime, Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, Opt_inode_readahead_blks, Opt_journal_ioprio, Opt_dioread_nolock, Opt_dioread_lock, @@ -1195,6 +1196,8 @@ static const match_table_t tokens = { {Opt_i_version, "i_version"}, {Opt_stripe, "stripe=%u"}, {Opt_delalloc, "delalloc"}, + {Opt_lazytime, "lazytime"}, + {Opt_nolazytime, "nolazytime"}, {Opt_nodelalloc, "nodelalloc"}, {Opt_removed, "mblk_io_submit"}, {Opt_removed, "nomblk_io_submit"}, @@ -1450,6 +1453,12 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, case Opt_i_version: sb->s_flags |= MS_I_VERSION; return 1; + case Opt_lazytime: + sb->s_flags |= MS_LAZYTIME; + return 1; + case Opt_nolazytime: + sb->s_flags &= ~MS_LAZYTIME; + return 1; } for (m = ext4_mount_opts; m->token != Opt_err; m++) diff --git a/fs/inode.c b/fs/inode.c index f0d6232..89cfca7 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1292,6 +1292,42 @@ struct inode *ilookup(struct super_block *sb, unsigned long ino) } EXPORT_SYMBOL(ilookup); +/** + * find_active_inode_nowait - find an active inode in the inode cache + * @sb: super block of file system to search + * @ino: inode number to search for + * + * Search for an active inode @ino in the inode cache, and if the + * inode is in the cache, the inode is returned with an incremented + * reference count. If the inode is being freed or is newly + * initialized, return nothing instead of trying to wait for the inode + * initialization or destruction to be complete. + */ +struct inode *find_active_inode_nowait(struct super_block *sb, + unsigned long ino) +{ + struct hlist_head *head = inode_hashtable + hash(sb, ino); + struct inode *inode, *ret_inode = NULL; + + spin_lock(&inode_hash_lock); + hlist_for_each_entry(inode, head, i_hash) { + if ((inode->i_ino != ino) || + (inode->i_sb != sb)) + continue; + spin_lock(&inode->i_lock); + if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) { + __iget(inode); + ret_inode = inode; + } + spin_unlock(&inode->i_lock); + goto out; + } +out: + spin_unlock(&inode_hash_lock); + return ret_inode; +} +EXPORT_SYMBOL(find_active_inode_nowait); + int insert_inode_locked(struct inode *inode) { struct super_block *sb = inode->i_sb; diff --git a/include/linux/fs.h b/include/linux/fs.h index e3574cd..dbbd642 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2413,6 +2413,8 @@ extern struct inode *ilookup(struct super_block *sb, unsigned long ino); extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); extern struct inode * iget_locked(struct super_block *, unsigned long); +extern struct inode *find_active_inode_nowait(struct super_block *, + unsigned long); extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); extern int insert_inode_locked(struct inode *); #ifdef CONFIG_DEBUG_LOCK_ALLOC -- 2.1.0 From prvs=6402eaddf5=clm@fb.com Fri Nov 21 14:09:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA6157F3F for ; Fri, 21 Nov 2014 14:09:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A8E8AC008 for ; Fri, 21 Nov 2014 12:09:13 -0800 (PST) X-ASG-Debug-ID: 1416600551-04cb6c0571205970001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id 8oV2rxfLTH9TAgf9 for ; Fri, 21 Nov 2014 12:09:11 -0800 (PST) X-Barracuda-Envelope-From: prvs=6402eaddf5=clm@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044008 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id sALK0UXG020375; Fri, 21 Nov 2014 12:09:10 -0800 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=date : from : subject : to : cc : message-id : in-reply-to : references : mime-version : content-type; s=facebook; bh=bkQ+mqbyLygyH9yYYhz2fXaU9oNSfUUAcb4Z8RZBldU=; b=HUNtDo1yofhxk2t3/frWOXZb8OhanKynjV94KAFW+TMj27/g9MUv5mH43In2u8hzIqg4 AIYaNQlJecxRSBm8CjZnZ0pOxS3P8UhXQRrP5EviuL3C4azrI6Rde/69sfphfDGATXZZ 1nlvdFUjWZ/6QKO3jI+dBhayv3dmSveFlEw= Received: from mail.thefacebook.com ([199.201.64.23]) by mx0a-00082601.pphosted.com with ESMTP id 1qswcdtj19-4 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 21 Nov 2014 12:09:10 -0800 Received: from [172.23.2.80] (192.168.16.4) by mail.thefacebook.com (192.168.16.14) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 21 Nov 2014 12:08:52 -0800 Date: Fri, 21 Nov 2014 15:08:48 -0500 From: Chris Mason Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() To: "Theodore Ts'o" X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() CC: , Ext4 Developers List , , , "Theodore Ts'o" Message-ID: <1416600528.24312.10@mail.thefacebook.com> In-Reply-To: <1416599964-21892-2-git-send-email-tytso@mit.edu> References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> X-Mailer: geary/0.8.2 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed X-Originating-IP: [192.168.16.4] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.13.68,1.0.28,0.0.0000 definitions=2014-11-21_07:2014-11-21,2014-11-21,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=5.55111512312578e-16 kscore.compositescore=0 circleOfTrustscore=236.927015194206 compositescore=0.993793232039588 urlsuspect_oldscore=0.993793232039588 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.993793232039588 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1411210162 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1416600551 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Nov 21, 2014 at 2:59 PM, Theodore Ts'o wrote: > In preparation for adding support for the lazytime mount option, we > need to be able to separate out the update_time() and write_time() > inode operations. Currently, only btrfs and xfs uses update_time(). > > We needed to preserve update_time() because btrfs wants to have a > special btrfs_root_readonly() check; otherwise we could drop the > update_time() inode operation entirely. No objections here, I'll give the queue a whirl. You can add my acked-by-or-Ill-fix-whatever-breaks I look forward to the patch that makes us all lazy by default. -chris From adilger@dilger.ca Fri Nov 21 14:18:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B1E077F3F for ; Fri, 21 Nov 2014 14:18:46 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D177AC005 for ; Fri, 21 Nov 2014 12:18:45 -0800 (PST) X-ASG-Debug-ID: 1416601123-04cbb01e5c20adf0001-NocioJ Received: from mail-pa0-f51.google.com (mail-pa0-f51.google.com [209.85.220.51]) by cuda.sgi.com with ESMTP id CANzBSfk6Gijr9Xc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 12:18:44 -0800 (PST) X-Barracuda-Envelope-From: adilger@dilger.ca X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.51 Received: by mail-pa0-f51.google.com with SMTP id ey11so5607713pad.10 for ; Fri, 21 Nov 2014 12:18:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:content-type:mime-version:subject:from :in-reply-to:date:cc:message-id:references:to; bh=4+lLynr5jdPMH+W2LJquOWP8RdGK869XsdkUK5sLCdU=; b=CqNwOzBZf/fY+2wQJtp6s8zLL0YMIdRQTusOrI2Meo14PGUdnVXPbxGThtSCRimoE+ RDzc1MOc54n867Y29sSWmXXmf5L3AC76cmIrK8A+3+YM+oCpmRhxmfh9ifFMOvLaaxhB Y1ofEYv0J/4segj1qrIhVlaJjfKdFCihfXzFUzxnyvHSh01eYcaz4vZhqqXso/uXl5c5 zwIjDJtgCu8eNyP1kZD9yESd8rqz6VPxSReuokp88kbxVPwR903/wwZKE76kuYbfuDG9 Ww+4MJ861OSz13zk96ReTKW+BBq/IeIIkWwVwlDg9xgnLV2RaOC/Prss6ov2r9jbfFC5 g2hQ== X-Barracuda-BBL-IP: nil X-Gm-Message-State: ALoCoQk3NoWaeAss1EXvWLROTDjfpXqV5/nEdmhASuSpJ8H0h/aXPv9NTDgTkZQThE/gY3A+7/pV X-Received: by 10.68.93.132 with SMTP id cu4mr10854599pbb.36.1416601123593; Fri, 21 Nov 2014 12:18:43 -0800 (PST) Received: from cabot-100.adilger.int (S0106002191d9348b.cg.shawcable.net. [96.51.76.157]) by mx.google.com with ESMTPSA id v15sm5549227pdj.96.2014.11.21.12.18.41 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 21 Nov 2014 12:18:42 -0800 (PST) Content-Type: multipart/signed; boundary="Apple-Mail=_06028ECC-11AE-4F7C-A8E7-651B3EF92124"; protocol="application/pgp-signature"; micalg=pgp-sha1 X-Barracuda-Apparent-Source-IP: 96.51.76.157 Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale From: Andreas Dilger X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale In-Reply-To: <1416599964-21892-4-git-send-email-tytso@mit.edu> Date: Fri, 21 Nov 2014 14:19:07 -0600 Cc: linux-fsdevel , Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Message-Id: References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> To: Theodore Ts'o X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: mail-pa0-f51.google.com[209.85.220.51] X-Barracuda-Start-Time: 1416601124 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11870 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Apple-Mail=_06028ECC-11AE-4F7C-A8E7-651B3EF92124 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii On Nov 21, 2014, at 1:59 PM, Theodore Ts'o wrote: > Guarantee that the on-disk timestamps will be no more than 24 hours > stale. >=20 > Signed-off-by: Theodore Ts'o > --- > fs/fs-writeback.c | 1 + > fs/inode.c | 7 ++++++- > include/linux/fs.h | 1 + > 3 files changed, 8 insertions(+), 1 deletion(-) >=20 > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c > index ce7de22..eb04277 100644 > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -1141,6 +1141,7 @@ void __mark_inode_dirty(struct inode *inode, int = flags) > if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { > trace_writeback_dirty_inode_start(inode, flags); >=20 > + inode->i_ts_dirty_day =3D 0; > if (sb->s_op->dirty_inode) > sb->s_op->dirty_inode(inode, flags); >=20 > diff --git a/fs/inode.c b/fs/inode.c > index 6e91aca..f0d6232 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -1511,6 +1511,7 @@ static int relatime_need_update(struct vfsmount = *mnt, struct inode *inode, > */ > static int update_time(struct inode *inode, struct timespec *time, int = flags) > { > + int days_since_boot =3D jiffies / (HZ * 86400); > int ret; >=20 > if (inode->i_op->update_time) { > @@ -1527,12 +1528,16 @@ static int update_time(struct inode *inode, = struct timespec *time, int flags) > if (flags & S_MTIME) > inode->i_mtime =3D *time; > } > - if (inode->i_sb->s_flags & MS_LAZYTIME) { > + if ((inode->i_sb->s_flags & MS_LAZYTIME) && > + (!inode->i_ts_dirty_day || > + inode->i_ts_dirty_day =3D=3D days_since_boot)) { > spin_lock(&inode->i_lock); > inode->i_state |=3D I_DIRTY_TIME; > spin_unlock(&inode->i_lock); > + inode->i_ts_dirty_day =3D days_since_boot; It isn't clear if this is correct. It looks like the condition will only be entered if i_ts_dirty_day =3D=3D days_since_boot, but that is = only set inside the condition? Shouldn't this be: inode->i_ts_dirty_day =3D ~0U; if ((inode->i_sb->s_flags & MS_LAZYTIME) && inode->i_ts_dirty_day !=3D days_since_boot)) { spin_lock(&inode->i_lock); inode->i_state |=3D I_DIRTY_TIME; spin_unlock(&inode->i_lock); inode->i_ts_dirty_day =3D days_since_boot; } and "days_since_boot" should be declared unsigned short so it wraps in the same way as i_ts_dirty_day, maybe using typeof(i_ts_dirty_day) so that there isn't any need to update this in the future if the type changes. Conceivably this could be an unsigned char, if that packed into struct inode better, at the risk of losing a timestamp update on an inode in cache for 256+ days and only modifying it 256 days later. Cheers, Andreas > return 0; > } > + inode->i_ts_dirty_day =3D 0; > if (inode->i_op->write_time) > return inode->i_op->write_time(inode); > mark_inode_dirty_sync(inode); > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 489b2f2..e3574cd 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -575,6 +575,7 @@ struct inode { > struct timespec i_ctime; > spinlock_t i_lock; /* i_blocks, i_bytes, maybe = i_size */ > unsigned short i_bytes; > + unsigned short i_ts_dirty_day; > unsigned int i_blkbits; > blkcnt_t i_blocks; >=20 > --=20 > 2.1.0 >=20 > -- > To unsubscribe from this list: send the line "unsubscribe = linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Cheers, Andreas --Apple-Mail=_06028ECC-11AE-4F7C-A8E7-651B3EF92124 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename=signature.asc Content-Type: application/pgp-signature; name=signature.asc Content-Description: Message signed with OpenPGP using GPGMail -----BEGIN PGP SIGNATURE----- Comment: GPGTools - http://gpgtools.org iQIVAwUBVG+ePHKl2rkXzB/gAQJXBw/8CHtl3zs0AtBCmVU6RpM2oVHlpYdo++a4 hBKVloH3VD/OIl2WBaDm5e5m8ZVQri5o12nTmJM8Tz4JWJzPd3Sqyd/gFJy94aZW EnyWxPKr5yjKb6hsJmmyzRY9xthmRM3IY+5EFQBHs1TH9zf4ii54qPmnAyaZ+kfJ tMWyBg+yeln2+Kf+YqQTk+LNj3jvj7dNd3+f14O6T3Omm/ubMJptuUnTj+bXEIPh Kn5sBSBY1f4qOAXyJg1jYDIKkWYZyop4q51WBNV75dsKGq1vJ0NYlHseZ2A6UEC5 GdMhcZIijG6774AA9CzqPEvqRnUcuCeGO0khQu6Z9/p3jggqbTsKS9+RgVq/YjUH uzCeJBEj2k+0koG18bK3idxqYZue6ctMFhls95PjzE6tX6jPaYLl8FPMx/LvxAKh 67lub9Yxjqo8/c+WFVZQJoQdKffZTnTpD0aHAa/o5k5yxe7lxTBgq5ccpm9K52Gf u4lNShxGC/Ikq4MRF5mOWLo4415Jme86SbVuhsJLW5ccC33LNuZVb/aBFZL0Ha6N U/nUz+RGs06aFkBNBwMXrRelgdXY/tdtOFjpubqpsgpvs50rzEtDSLh9xHcpot1U QLGnWS/BPcJ/b51j0GMB9fSM2S0BeBOJyzNeDZqHokOVvB7UyF4nSFZuxi8kB6Uh PPmK59Tsi6c= =1NRD -----END PGP SIGNATURE----- --Apple-Mail=_06028ECC-11AE-4F7C-A8E7-651B3EF92124-- From tytso@thunk.org Fri Nov 21 15:37:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0BB0D7F3F for ; Fri, 21 Nov 2014 15:37:02 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EDFDB304051 for ; Fri, 21 Nov 2014 13:37:01 -0800 (PST) X-ASG-Debug-ID: 1416605817-04cb6c0571208180001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id bVkkGCCPJW2AM4FT (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 13:36:57 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=jLkg6Y+VM6kb8iJXiNT8ZWGU/1/VDilZj5qKyeLo6PY=; b=P8AaKldkH0ruDhgyi9cl3I2iHh26VQsg1LD640liaLpy9/nmehpvea4OXTSZmWgXk2oxvd3QMW4Gqy099Q4OBow6exO9V3MlbOP+XgD0G4VCXPvfgjuqyEkm+c4HFjBnsbZfHmOXOHpfUnOmR8So/qoOqLwi71gSf0yXIPYY7Qw=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xrvsq-0005F4-VR; Fri, 21 Nov 2014 21:36:53 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 0045B5801DE; Fri, 21 Nov 2014 16:36:51 -0500 (EST) Date: Fri, 21 Nov 2014 16:36:51 -0500 From: Theodore Ts'o To: Andreas Dilger Cc: linux-fsdevel , Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141121213651.GF7112@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416605817 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Nov 21, 2014 at 02:19:07PM -0600, Andreas Dilger wrote: > > - if (inode->i_sb->s_flags & MS_LAZYTIME) { > > + if ((inode->i_sb->s_flags & MS_LAZYTIME) && > > + (!inode->i_ts_dirty_day || > > + inode->i_ts_dirty_day == days_since_boot)) { > > spin_lock(&inode->i_lock); > > inode->i_state |= I_DIRTY_TIME; > > spin_unlock(&inode->i_lock); > > + inode->i_ts_dirty_day = days_since_boot; > > It isn't clear if this is correct. It looks like the condition will > only be entered if i_ts_dirty_day == days_since_boot, but that is only > set inside the condition? If i_ts_dirty_day is zero, the timestamps don't have to written to disk. This is either because the inode has been written to disk, or the system has been up for less than a day, such that when we last a lazy mtime update (i.e., we skipped the call to mark_inode_dirty) since jiffies / (HZ * 86400) was zero. If it is non-zero, then the timestamps were updated but were not sent to disk N days since the system was booted. So long as it remains N days since the system was booted, we can skip calling mark_inode_dirty(). But once it becomes N+1 days since the system was booted, then we will call mark_inode_dirty() and set i_ts_dirty_day to zero. I'll add a comment so it's a bit more obvious what we're doing here, but I'm pretty sure we currently have is in fact correct. > and "days_since_boot" should be declared unsigned short so it wraps > in the same way as i_ts_dirty_day Good point, thanks. This will only be an issue after the system has been up for almost 90 years, but we might as well get it right, - Ted From tytso@thunk.org Fri Nov 21 15:42:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CAC157F3F for ; Fri, 21 Nov 2014 15:42:51 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A91778F8039 for ; Fri, 21 Nov 2014 13:42:48 -0800 (PST) X-ASG-Debug-ID: 1416606167-04bdf0615e1f7c10001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id PORx0I7jW83ch1Ql (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Nov 2014 13:42:47 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=h83B1VNBulViBYHWhxEbj8rRdNNlwnqdkA9tlDc2FOg=; b=hZ7mfD7+fzIWk6vsz27qrbcXi/kK2zsUuxmxOMrTV29269ZmVBO3GYhE6rEZAFRh6ZRKlSofr4Bp1hRClLavWMMtkOlAag9ivmtlxwcx3g9e7/JO2fUh4HK3Ch3EQOTFik4KaZwoayiFU5vb6aYNfeAbr/HQ8zFH2r96mzLNB4M=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XrvyY-0005Gf-5F; Fri, 21 Nov 2014 21:42:46 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id EFC1D5801DE; Fri, 21 Nov 2014 16:42:45 -0500 (EST) Date: Fri, 21 Nov 2014 16:42:45 -0500 From: Theodore Ts'o To: Chris Mason Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141121214245.GG7112@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <1416600528.24312.10@mail.thefacebook.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416600528.24312.10@mail.thefacebook.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416606167 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11872 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Out of curiosity, why does btrfs_update_time() need to call btrfs_root_readonly()? Why can't it just depend on the __mnt_want_write() call in touch_atime()? Surely if there are times when it's not OK to write into a btrfs file system and mnt_is_readonly() returns false, the VFS is going to get very confused abyway. If the btrfs_update_time() is not necessary, then we could drop btrfs_update_time() and update_time() from the inode operations entirely, and depend on the VFS-level code in update_time(). - Ted From debbugs@buxtehude.debian.org Sat Nov 22 05:09:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 35D8F7F3F for ; Sat, 22 Nov 2014 05:09:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1325F30404E for ; Sat, 22 Nov 2014 03:09:41 -0800 (PST) X-ASG-Debug-ID: 1416654576-04cb6c0570249320001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id EmCKLUPP58ZDgRsx (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 03:09:37 -0800 (PST) X-Barracuda-Envelope-From: debbugs@buxtehude.debian.org X-Barracuda-Apparent-Source-IP: 140.211.166.26 Received: from debbugs by buxtehude.debian.org with local (Exim 4.80) (envelope-from ) id 1Xs8ZI-0008T2-JA; Sat, 22 Nov 2014 11:09:32 +0000 MIME-Version: 1.0 X-Mailer: MIME-tools 5.503 (Entity 5.503) X-Loop: owner@bugs.debian.org From: owner@bugs.debian.org (Debian Bug Tracking System) To: Tobias Frost Subject: Bug#751511: marked as done (xfslibs-dev: Incorrect licensing information in debian/copyright) Message-ID: X-ASG-Orig-Subj: Bug#751511: marked as done (xfslibs-dev: Incorrect licensing information in debian/copyright) References: <1416654489.6319.1.camel@debian.org> <20140613142534.8854.10300.reportbug@sibsagar.btc.netapp.com> X-Debian-PR-Message: closed 751511 X-Debian-PR-Package: xfslibs-dev X-Debian-PR-Keywords: wheezy-ignore X-Debian-PR-Source: xfsprogs Date: Sat, 22 Nov 2014 11:09:32 +0000 Content-Type: multipart/mixed; boundary="----------=_1416654572-32541-0" X-Barracuda-Connect: buxtehude.debian.org[140.211.166.26] X-Barracuda-Start-Time: 1416654577 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format... ------------=_1416654572-32541-0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Your message dated Sat, 22 Nov 2014 12:08:09 +0100 with message-id <1416654489.6319.1.camel@debian.org> and subject line xfslibs-dev: Incorrect licensing information in debian/cop= yright has caused the Debian Bug report #751511, regarding xfslibs-dev: Incorrect licensing information in debian/copyright to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the Bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what this message is talking about, this may indicate a serious mail system misconfiguration somewhere. Please contact owner@bugs.debian.org immediately.) --=20 751511: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=3D751511 Debian Bug Tracking System Contact owner@bugs.debian.org with problems ------------=_1416654572-32541-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by bugs.debian.org; 13 Jun 2014 14:35:15 +0000 X-Spam-Checker-Version: SpamAssassin 3.3.2-bugs.debian.org_2005_01_02 (2011-06-06) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-14.9 required=4.0 tests=BAYES_00,DIGITS_LETTERS, FOURLA,FROMDEVELOPER,FVGT_m_MULTI_ODD,PGPSIGNATURE,RCVD_IN_SBLXBL, RCVD_IN_SBLXBL_CBL,XMAILER_REPORTBUG,X_DEBBUGS_CC,X_DEBBUGS_NO_ACK autolearn=ham version=3.3.2-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 61; hammy, 151; neutral, 45; spammy, 0. spammytokens: hammytokens:0.000-+--H*M:reportbug, 0.000-+--H*MI:reportbug, 0.000-+--H*x:reportbug, 0.000-+--H*UA:reportbug, 0.000-+--sha256 Return-path: Received: from aries.treap.in ([178.79.148.28]) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1WvSZW-0004Y0-U2 for submit@bugs.debian.org; Fri, 13 Jun 2014 14:35:15 +0000 Received: from localhost (localhost [127.0.0.1]) by aries.treap.in (Postfix) with ESMTP id 1E59A836D for ; Fri, 13 Jun 2014 14:38:12 +0000 (UTC) Received: from aries.treap.in ([127.0.0.1]) by localhost (aries.treap.in [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8jTNjk26kJnj for ; Fri, 13 Jun 2014 14:38:11 +0000 (UTC) Received: from sibsagar.treap.in (unknown [202.3.120.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: appaji) by aries.treap.in (Postfix) with ESMTPSA id 944688316 for ; Fri, 13 Jun 2014 14:38:11 +0000 (UTC) Received: by sibsagar.treap.in (Postfix, from userid 1000) id 6022DE48; Fri, 13 Jun 2014 19:55:34 +0530 (IST) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Y Giridhar Appaji Nag To: Debian Bug Tracking System X-Debbugs-No-Ack: true X-Website: http://appaji.net/ Subject: xfslibs-dev: Incorrect licensing information in debian/copyright Reply-To: Y Giridhar Appaji Nag Message-ID: <20140613142534.8854.10300.reportbug@sibsagar.btc.netapp.com> X-Mailer: reportbug 6.5.0 Date: Fri, 13 Jun 2014 19:55:34 +0530 X-Debbugs-Cc: Y Giridhar Appaji Nag X-Greylist: delayed 483 seconds by postgrey-1.34 at buxtehude; Fri, 13 Jun 2014 14:35:14 UTC Delivered-To: submit@bugs.debian.org Source: xfslibs-dev Severity: serious Justification: Policy 4.5 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 It looks like the xfslibs-dev package source files are licensed under LGPL v2.1, however the debian/copyright file indicates that only the libhandle package is under LGPL and that the rest of the package is licensed under GPL. Giridhar - -- System Information: Debian Release: jessie/sid APT prefers testing-updates APT policy: (500, 'testing-updates'), (500, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 3.13-1-amd64 (SMP w/2 CPU cores) Locale: LANG=en_IN, LC_CTYPE=en_IN (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBCAAGBQJTmwnSAAoJEKjSzROqVEqhm4wQAIVHEEsJ1+YkbxQOx8ubKHov hW4HJK1h6PoBudiyK+RSBIekl8WV08qvwaUJHg6xPodH3N/WhfDw7vduQv97s5Hr DJ92DWA5j06XUOKNPsRFGi6mGL2VVPgOkb+3xGPWgTLpAeUfbkukOStp7Gi8tOEI 6REM2z3uh8krCzuIsB1RS4j8SWXFVy3OE0ROKfL92JsWyVgUpRmDdU0nwEmhjrfn 7Bk4ecEaZA3nXeT5FY2yAEtk0hIat/rtCYe66lJw6k7FmogD5W46tb6U2bgtmqt1 I1JGDivQgbBd1pogxUdgNyK4lizSkTOdg24WuaGHMhI7sH6+DHMPOiC81INsf1qY 6q8OB7naez3x8BFGMH03BL6wpn1yVAd+m0nEXJLluu3niLlOHjSTLAbqiX8h+n2b PyXFnTViaGI8oYGHbTnOC+t/o+mbnbIE7hnsfdDhVXqDhZo5dJtWl4VxNuOBTOV8 7ZiNH4y8kHwU8yT6dW/dGLCYxWvE+RvTGhgL/V0tO2ipkuVUmZaMyvvUuk6xSfER wSf1AUWhhgJBJzGRZj4UglWJ99MaZMxYzLMJq20uQmTSzlnN//vLsmjMcfFcx61f 33AaniHi0fbOwPHV5lecxjyxKgjo5CSd0EqaCV7fenAB1Tr6mKXB3frrOJMxbhlr c69uwhjzVNZRP8tudDtC =yzqb -----END PGP SIGNATURE----- ------------=_1416654572-32541-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 751511-done) by bugs.debian.org; 22 Nov 2014 11:08:28 +0000 X-Spam-Checker-Version: SpamAssassin 3.3.2-bugs.debian.org_2005_01_02 (2011-06-06) on buxtehude.debian.org X-Spam-Level: X-Spam-Status: No, score=-10.9 required=4.0 tests=BAYES_00,FOURLA, FROMDEVELOPER,PGPSIGNATURE autolearn=ham version=3.3.2-bugs.debian.org_2005_01_02 X-Spam-Bayes: score:0.0000 Tokens: new, 15; hammy, 97; neutral, 22; spammy, 0. spammytokens: hammytokens:0.000-+--H*c:pgp-sha256, 0.000-+--gpl2, 0.000-+--GPL2, 0.000-+--gpl-2, 0.000-+--GPL-2 Return-path: Received: from sv13.net-housting.de ([178.248.244.23]) by buxtehude.debian.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1Xs8YG-0008ON-FS for 751511-done@bugs.debian.org; Sat, 22 Nov 2014 11:08:28 +0000 Received: from localhost (mailscan.hofmeirmedia.net [172.30.129.51]) by sv13.net-housting.de (Postfix) with ESMTP id C2396280EDA06 for <751511-done@bugs.debian.org>; Sat, 22 Nov 2014 12:08:19 +0100 (CET) X-Virus-Scanned: by amavisd-new using ClamAV at mailscan.hofmeirmedia.net Received: from sv13.net-housting.de ([172.30.129.23]) by localhost (mailscan.hofmeirmedia.net [172.30.129.51]) (amavisd-new, port 10024) with ESMTP id xGrk3m11jIbQ for <751511-done@bugs.debian.org>; Sat, 22 Nov 2014 12:08:11 +0100 (CET) Received: from edoras (lhm246.muenchen.de [194.113.41.246]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sv13.net-housting.de (Postfix) with ESMTPSA id 16998280ED981 for <751511-done@bugs.debian.org>; Sat, 22 Nov 2014 12:08:10 +0100 (CET) Received: from tobi by edoras with local (Exim 4.84) (envelope-from ) id 1Xs8Xx-0001ij-QB for 751511-done@bugs.debian.org; Sat, 22 Nov 2014 12:08:09 +0100 Message-ID: <1416654489.6319.1.camel@debian.org> Subject: xfslibs-dev: Incorrect licensing information in debian/copyright From: Tobias Frost To: 751511-done@bugs.debian.org Date: Sat, 22 Nov 2014 12:08:09 +0100 Content-Type: multipart/signed; micalg="pgp-sha256"; protocol="application/pgp-signature"; boundary="=-QXXAg7ljAptlwfsdYX8C" X-Mailer: Evolution 3.12.6-1 Mime-Version: 1.0 --=-QXXAg7ljAptlwfsdYX8C Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable As analyzed by Christoph already, d/copyright is actually fine: libhandle -> LGPL 2.1 remaining-> GPL-2 =20 (see doc/COPYING) Therefore closing.=20 --=20 tobi=09 --=-QXXAg7ljAptlwfsdYX8C Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJUcG6ZAAoJEJFk+h0XvV02gFUQAJ3NW3B2y5VoURUWCSB1zJVV rSSUEDWRrYbnOcKlYLs1Zb0zZIU4Q1MEM2MG5h+etwLzBbfg0+a8Z71+GGz1k1ia llyfc5+7MFxKvY612LYUpFNfnY9GpiZlMjgwLmSyAEwqHBSLroXhIHI+idnFc8Hl 1/EAR+m9pPoIeMhkigiPevXqKc+t/hGZ+5PpCkwGk4Yx99iTtzCxFiGc0j3Gm4Se aHlM/GKvVza87LfGznoEzgXsPI5X0SnyeCO/6QtP6arH95qyNC+xZRVmhWStPEoZ 89z2cfY2CE6fIPf3AXddmAHSknisIGLdWB4PnatsTTG3HLuQURMEMq7z08djOmbR H8wqbOGqbON3y8L1FsfiNP0lB7c29KAiAXBQTggM8bWZ0mi92ANZboxSLxXCUkkS CqyeYRE7dIe60VXWOd5WlvDMxCf2Wt2R9cjAf11wGFe3HmM1NLDmUPLGVfc3C7uI TQnauDvNMBBBSGL7346CtNkW5VD56CxPMlMvVfN47zMbIVcPcrw4rRQSkyBHYSKy Ub0N1/ZXJJUgc2Aqj1CwiNLupudQO64rQObL5r16cc599oss5k0mq21lQ+ZsyVgq rwlfERmP953sX3hotTICI9/OFXvrxV8nLwXt101QNkTha+tbyxSMwYObi4U5SYfQ +ALsRuqhfwARovzqvHp0 =2qjV -----END PGP SIGNATURE----- --=-QXXAg7ljAptlwfsdYX8C-- ------------=_1416654572-32541-0-- From tytso@thunk.org Sat Nov 22 10:54:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 00A1B7F3F for ; Sat, 22 Nov 2014 10:54:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B802230405F for ; Sat, 22 Nov 2014 08:54:38 -0800 (PST) X-ASG-Debug-ID: 1416675275-04bdf06161233fd0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 0N3G1yKLppWgLj6N (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 08:54:36 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=SiUmpVQ+sDnmlv41N6eXd4H1JvPaZSEphJF/nh5+zzk=; b=pVJoRmIlIMurQSg7ZM+dfuGTebw3IMY6RH52nh2gaGcDcz5QTzbrqvv/qczpdYNL1P0NUa0kvEgG1CsqoJAtUsv+jeFNBDa1mpEWuzbEHwdk13f0yZkoIDDTjEevsGwUfyiEny+j8wBG7r3eCzehr2HS3Nppqxp+DtJnEVixtXI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsDxB-0004DZ-Lt; Sat, 22 Nov 2014 16:54:33 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id CFBE4580419; Sat, 22 Nov 2014 11:54:31 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH-v2 2/5] vfs: add support for a lazytime mount option Date: Sat, 22 Nov 2014 11:54:24 -0500 X-ASG-Orig-Subj: [PATCH-v2 2/5] vfs: add support for a lazytime mount option Message-Id: <1416675267-2191-3-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416675267-2191-1-git-send-email-tytso@mit.edu> References: <1416675267-2191-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416675276 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add a new mount option which enables a new "lazytime" mode. This mode causes atime, mtime, and ctime updates to only be made to the in-memory version of the inode. The on-disk times will only get updated when (a) if the inode needs to be updated for some non-time related change, (b) if userspace calls fsync(), syncfs() or sync(), or (c) just before an undeleted inode is evicted from memory. This is OK according to POSIX because there are no guarantees after a crash unless userspace explicitly requests via a fsync(2) call. For workloads which feature a large number of random write to a preallocated file, the lazytime mount option significantly reduces writes to the inode table. The repeated 4k writes to a single block will result in undesirable stress on flash devices and SMR disk drives. Even on conventional HDD's, the repeated writes to the inode table block will trigger Adjacent Track Interference (ATI) remediation latencies, which very negatively impact 99.9 percentile latencies --- which is a very big deal for web serving tiers (for example). Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 38 +++++++++++++++++++++++++++++++++++++- fs/inode.c | 20 ++++++++++++++++++++ fs/proc_namespace.c | 1 + fs/sync.c | 7 +++++++ include/linux/fs.h | 1 + include/uapi/linux/fs.h | 1 + 6 files changed, 67 insertions(+), 1 deletion(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ef9bef1..ce7de22 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -483,7 +483,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) inode->i_state &= ~I_DIRTY_PAGES; dirty = inode->i_state & I_DIRTY; - inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); + inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_TIME); spin_unlock(&inode->i_lock); /* Don't write the inode if only I_DIRTY_PAGES was set */ if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { @@ -1277,6 +1277,41 @@ static void wait_sb_inodes(struct super_block *sb) iput(old_inode); } +/* + * This works like wait_sb_inodes(), but it is called *before* we kick + * the bdi so the inodes can get written out. + */ +static void flush_sb_dirty_time(struct super_block *sb) +{ + struct inode *inode, *old_inode = NULL; + + WARN_ON(!rwsem_is_locked(&sb->s_umount)); + spin_lock(&inode_sb_list_lock); + list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { + int dirty_time; + + spin_lock(&inode->i_lock); + if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { + spin_unlock(&inode->i_lock); + continue; + } + dirty_time = inode->i_state & I_DIRTY_TIME; + __iget(inode); + spin_unlock(&inode->i_lock); + spin_unlock(&inode_sb_list_lock); + + iput(old_inode); + old_inode = inode; + + if (dirty_time) + mark_inode_dirty(inode); + cond_resched(); + spin_lock(&inode_sb_list_lock); + } + spin_unlock(&inode_sb_list_lock); + iput(old_inode); +} + /** * writeback_inodes_sb_nr - writeback dirty inodes from given super_block * @sb: the superblock @@ -1388,6 +1423,7 @@ void sync_inodes_sb(struct super_block *sb) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); + flush_sb_dirty_time(sb); bdi_queue_work(sb->s_bdi, &work); wait_for_completion(&done); diff --git a/fs/inode.c b/fs/inode.c index 8f5c4b5..11fe81b 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -534,6 +534,18 @@ static void evict(struct inode *inode) BUG_ON(!(inode->i_state & I_FREEING)); BUG_ON(!list_empty(&inode->i_lru)); + if (inode->i_nlink && inode->i_state & I_DIRTY_TIME) { + if (inode->i_op->write_time) + inode->i_op->write_time(inode); + else if (inode->i_sb->s_op->write_inode) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_NONE, + }; + mark_inode_dirty(inode); + inode->i_sb->s_op->write_inode(inode, &wbc); + } + } + if (!list_empty(&inode->i_wb_list)) inode_wb_list_del(inode); @@ -1515,6 +1527,14 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } + if (inode->i_sb->s_flags & MS_LAZYTIME) { + if (inode->i_state & I_DIRTY_TIME) + return 0; + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + return 0; + } if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 73ca174..f98234a 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c @@ -44,6 +44,7 @@ static int show_sb_opts(struct seq_file *m, struct super_block *sb) { MS_SYNCHRONOUS, ",sync" }, { MS_DIRSYNC, ",dirsync" }, { MS_MANDLOCK, ",mand" }, + { MS_LAZYTIME, ",lazytime" }, { 0, NULL } }; const struct proc_fs_info *fs_infop; diff --git a/fs/sync.c b/fs/sync.c index bdc729d..db7930e 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -177,8 +177,15 @@ SYSCALL_DEFINE1(syncfs, int, fd) */ int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) { + struct inode *inode = file->f_mapping->host; + if (!file->f_op->fsync) return -EINVAL; + if (!datasync && inode->i_state & I_DIRTY_TIME) { + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_SYNC; + spin_unlock(&inode->i_lock); + } return file->f_op->fsync(file, start, end, datasync); } EXPORT_SYMBOL(vfs_fsync_range); diff --git a/include/linux/fs.h b/include/linux/fs.h index 3633239..489b2f2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1721,6 +1721,7 @@ struct super_operations { #define __I_DIO_WAKEUP 9 #define I_DIO_WAKEUP (1 << I_DIO_WAKEUP) #define I_LINKABLE (1 << 10) +#define I_DIRTY_TIME (1 << 11) #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3735fa0..cc9713a 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -90,6 +90,7 @@ struct inodes_stat_t { #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ +#define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.1.0 From tytso@thunk.org Sat Nov 22 10:54:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C7E929DF7 for ; Sat, 22 Nov 2014 10:54:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E1B88F8040 for ; Sat, 22 Nov 2014 08:54:38 -0800 (PST) X-ASG-Debug-ID: 1416675276-04bdf06160233fd0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id TPqDexFSikDbCZRJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 08:54:37 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=Message-Id:Date:Subject:Cc:To:From; bh=/drAWev2RVUcAJZthFfoJIps+uW1/f4meBKTRSfmoII=; b=CSAXa5zBGqNJqRGB1SBzrP3C1kzSd/xXkIuknsxqt7obVMvxP2CGJ87vgf+zaVUzaVYh3xEME3rVvdDNLY3FDQCq0a0ZwtpI5irQ0OXUUQQJVAsIf6VwLqkxirC3ek7ksdccAKCbuPzyVJy6Z3VMxpDYM3pBhthqUcmMoqQtYms=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsDxE-0004EA-Nb; Sat, 22 Nov 2014 16:54:36 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C6DB9580248; Sat, 22 Nov 2014 11:54:31 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH-v2 0/5] add support for a lazytime mount option Date: Sat, 22 Nov 2014 11:54:22 -0500 X-ASG-Orig-Subj: [PATCH-v2 0/5] add support for a lazytime mount option Message-Id: <1416675267-2191-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416675277 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is an updated version of what had originally been an ext4-specific patch which significantly improves performance by lazily writing timestamp updates (and in particular, mtime updates) to disk. The in-memory timestamps are always correct, but they are only written to disk when required for correctness. This provides a huge performance boost for ext4 due to how it handles journalling, but it's valuable for all file systems running on flash storage or drive-managed SMR disks by reducing the metadata write load. So upon request, I've moved the functionality to the VFS layer. Once the /sbin/mount program adds support for MS_LAZYTIME, all file systems should be able to benefit from this optimization. There is still an ext4-specific optimization, which may be applicable for other file systems which store more than one inode in a block, but it will require file system specific code. It is purely optional, however. Please note the changes to update_time() and the new write_time() inode operations functions, which impact btrfs and xfs. The changes are fairly simple, but I would appreciate confirmation from the btrfs and xfs teams that I got things right. Thanks!! Any objections to my carrying these patches in the ext4 git tree? Changes since -v1: - Added explanatory comments in update_time() regarding i_ts_dirty_days - Fix type used for days_since_boot - Improve SMP scalability in update_time and ext4_update_other_inodes_time - Added tracepoints to help test and characterize how often and under what circumstances inodes have their timestamps lazily updated Theodore Ts'o (5): fs: split update_time() into update_time() and write_time() vfs: add support for a lazytime mount option vfs: don't let the dirty time inodes get more than a day stale vfs: add lazytime tracepoints for better debugging ext4: add support for a lazytime mount option fs/btrfs/inode.c | 10 +++++ fs/ext4/inode.c | 48 ++++++++++++++++++-- fs/ext4/super.c | 9 ++++ fs/fs-writeback.c | 42 +++++++++++++++++- fs/inode.c | 104 +++++++++++++++++++++++++++++++++++++++----- fs/proc_namespace.c | 1 + fs/sync.c | 7 +++ fs/xfs/xfs_iops.c | 39 +++++++---------- include/linux/fs.h | 5 +++ include/trace/events/ext4.h | 29 ++++++++++++ include/trace/events/fs.h | 56 ++++++++++++++++++++++++ include/uapi/linux/fs.h | 1 + 12 files changed, 313 insertions(+), 38 deletions(-) create mode 100644 include/trace/events/fs.h -- 2.1.0 From tytso@thunk.org Sat Nov 22 10:54:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C0067F47 for ; Sat, 22 Nov 2014 10:54:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E38A8F8052 for ; Sat, 22 Nov 2014 08:54:38 -0800 (PST) X-ASG-Debug-ID: 1416675275-04bdf0615e233fc0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id KDhhYy1P871FwAnR (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 08:54:36 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=iCnZzmIQOxNt8mKhMQJtfrFiwO7CqzJs0UG7/7XK/1s=; b=sPi64CzG2n/56VvuRa8wipoRkHSEkhCBzE1pOKTejCoMAerCXtvw7Z1BGn0o5In2cFbpzb8ohjI1taepgdFDpGpxtIOn9uo5rKW0zfCqgYpZEezgj9k96njX4bl6+qA4bM/TQ/DMa0xEZh98QruIFcYVL433NJRGMFMM4uZtGjk=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsDxB-0004Da-M2; Sat, 22 Nov 2014 16:54:33 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id D36675804CD; Sat, 22 Nov 2014 11:54:31 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH-v2 3/5] vfs: don't let the dirty time inodes get more than a day stale Date: Sat, 22 Nov 2014 11:54:25 -0500 X-ASG-Orig-Subj: [PATCH-v2 3/5] vfs: don't let the dirty time inodes get more than a day stale Message-Id: <1416675267-2191-4-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416675267-2191-1-git-send-email-tytso@mit.edu> References: <1416675267-2191-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416675276 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Guarantee that the on-disk timestamps will be no more than 24 hours stale. Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 1 + fs/inode.c | 16 +++++++++++++++- include/linux/fs.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ce7de22..eb04277 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1141,6 +1141,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { trace_writeback_dirty_inode_start(inode, flags); + inode->i_ts_dirty_day = 0; if (sb->s_op->dirty_inode) sb->s_op->dirty_inode(inode, flags); diff --git a/fs/inode.c b/fs/inode.c index 11fe81b..0d939a8 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1511,6 +1511,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { + unsigned short days_since_boot = jiffies / (HZ * 86400); int ret; if (inode->i_op->update_time) { @@ -1527,14 +1528,27 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } - if (inode->i_sb->s_flags & MS_LAZYTIME) { + /* + * If i_ts_dirty_day is zero, then either we have not deferred + * timestamp updates, or the system has been up for less than + * a day (so days_since_boot is zero), so we defer timestamp + * updates in that case and set the I_DIRTY_TIME flag. If a + * day or more has passed, then i_ts_dirty_day will be + * different from days_since_boot, and then we should update + * the on-disk inode and then we can clear i_ts_dirty_day. + */ + if ((inode->i_sb->s_flags & MS_LAZYTIME) && + (!inode->i_ts_dirty_day || + inode->i_ts_dirty_day == days_since_boot)) { if (inode->i_state & I_DIRTY_TIME) return 0; spin_lock(&inode->i_lock); inode->i_state |= I_DIRTY_TIME; spin_unlock(&inode->i_lock); + inode->i_ts_dirty_day = days_since_boot; return 0; } + inode->i_ts_dirty_day = 0; if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/include/linux/fs.h b/include/linux/fs.h index 489b2f2..e3574cd 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -575,6 +575,7 @@ struct inode { struct timespec i_ctime; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ unsigned short i_bytes; + unsigned short i_ts_dirty_day; unsigned int i_blkbits; blkcnt_t i_blocks; -- 2.1.0 From tytso@thunk.org Sat Nov 22 10:54:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5D1F929DF9 for ; Sat, 22 Nov 2014 10:54:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E072CAC005 for ; Sat, 22 Nov 2014 08:54:38 -0800 (PST) X-ASG-Debug-ID: 1416675275-04cb6c0571258b10001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id mgD6232aPY7VDUUD (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 08:54:35 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=13y99vOsd4HI5b3Kc35Sgyquprs23epvvaEgONvqCYY=; b=WO5pQ58yWhW9DKaUYa+Yi7soP2YO0eYRx8hcKFdYoapbHZAquY2PGSgWtwZKZeLX38KVz7NLvtCNcsUz2FtTjH96jXLnQ/JtYt/DTGuulBi2BAag/EQE6QpdOKz40jmLazua+SNIW63sdAfIj7+hjv8Kt0zHSX25QufNSQ33t3M=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsDxD-0004Dr-Dz; Sat, 22 Nov 2014 16:54:35 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id CA572580100; Sat, 22 Nov 2014 11:54:31 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH-v2 1/5] fs: split update_time() into update_time() and write_time() Date: Sat, 22 Nov 2014 11:54:23 -0500 X-ASG-Orig-Subj: [PATCH-v2 1/5] fs: split update_time() into update_time() and write_time() Message-Id: <1416675267-2191-2-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416675267-2191-1-git-send-email-tytso@mit.edu> References: <1416675267-2191-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416675275 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature In preparation for adding support for the lazytime mount option, we need to be able to separate out the update_time() and write_time() inode operations. Currently, only btrfs and xfs uses update_time(). We needed to preserve update_time() because btrfs wants to have a special btrfs_root_readonly() check; otherwise we could drop the update_time() inode operation entirely. Signed-off-by: Theodore Ts'o Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org --- fs/btrfs/inode.c | 10 ++++++++++ fs/inode.c | 29 ++++++++++++++++++----------- fs/xfs/xfs_iops.c | 39 ++++++++++++++++----------------------- include/linux/fs.h | 1 + 4 files changed, 45 insertions(+), 34 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d23362f..a5e0d0d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5574,6 +5574,11 @@ static int btrfs_update_time(struct inode *inode, struct timespec *now, inode->i_mtime = *now; if (flags & S_ATIME) inode->i_atime = *now; + return 0; +} + +static int btrfs_write_time(struct inode *inode) +{ return btrfs_dirty_inode(inode); } @@ -9462,6 +9467,7 @@ static const struct inode_operations btrfs_dir_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9470,6 +9476,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9540,6 +9547,7 @@ static const struct inode_operations btrfs_file_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9552,6 +9560,7 @@ static const struct inode_operations btrfs_special_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9565,6 +9574,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; const struct dentry_operations btrfs_dentry_operations = { diff --git a/fs/inode.c b/fs/inode.c index 26753ba..8f5c4b5 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1499,17 +1499,24 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { - if (inode->i_op->update_time) - return inode->i_op->update_time(inode, time, flags); - - if (flags & S_ATIME) - inode->i_atime = *time; - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *time; - if (flags & S_MTIME) - inode->i_mtime = *time; + int ret; + + if (inode->i_op->update_time) { + ret = inode->i_op->update_time(inode, time, flags); + if (ret) + return ret; + } else { + if (flags & S_ATIME) + inode->i_atime = *time; + if (flags & S_VERSION) + inode_inc_iversion(inode); + if (flags & S_CTIME) + inode->i_ctime = *time; + if (flags & S_MTIME) + inode->i_mtime = *time; + } + if (inode->i_op->write_time) + return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0e9653c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -984,10 +984,8 @@ xfs_vn_setattr( } STATIC int -xfs_vn_update_time( - struct inode *inode, - struct timespec *now, - int flags) +xfs_vn_write_time( + struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; @@ -1004,21 +1002,16 @@ xfs_vn_update_time( } xfs_ilock(ip, XFS_ILOCK_EXCL); - if (flags & S_CTIME) { - inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_MTIME) { - inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_ATIME) { - inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec; - } + + ip->i_d.di_ctime.t_sec = (__int32_t) inode->i_ctime.tv_sec; + ip->i_d.di_ctime.t_nsec = (__int32_t) inode->i_ctime.tv_nsec; + + ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec; + ip->i_d.di_mtime.t_nsec = (__int32_t) inode->i_mtime.tv_nsec; + + ip->i_d.di_atime.t_sec = (__int32_t) inode->i_atime.tv_sec; + ip->i_d.di_atime.t_nsec = (__int32_t) inode->i_atime.tv_nsec; + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); return xfs_trans_commit(tp, 0); @@ -1129,7 +1122,7 @@ static const struct inode_operations xfs_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .fiemap = xfs_vn_fiemap, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; static const struct inode_operations xfs_dir_inode_operations = { @@ -1156,7 +1149,7 @@ static const struct inode_operations xfs_dir_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1184,7 +1177,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1198,7 +1191,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; STATIC void diff --git a/include/linux/fs.h b/include/linux/fs.h index 9ab779e..3633239 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,6 +1545,7 @@ struct inode_operations { int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*update_time)(struct inode *, struct timespec *, int); + int (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); -- 2.1.0 From tytso@thunk.org Sat Nov 22 10:54:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A64F37F47 for ; Sat, 22 Nov 2014 10:54:41 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9599930405F for ; Sat, 22 Nov 2014 08:54:38 -0800 (PST) X-ASG-Debug-ID: 1416675275-04cb6c0573258b20001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id vjwOlqfp3buijshJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 08:54:36 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=ukZqbYXWG+md+26EXIfMCn6R1sbKJOXr5DmaE8KES3c=; b=nxWudqf+s9X2q7huH4gzTjdoVXV3ZB8IZzkD2nMNJ0Y+SH6xLTXq9UhJake+olJXimIhwYwqmB60K56yyD1rodtd7HtCGchazIt+QMqv03s52T1z7oEWzlZ8t8wJiVGfqOm/wb/E1xhOLEANT0nKjO3cnwmQYQ6KgCPz9fMTYc0=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsDxC-0004Dn-Dv; Sat, 22 Nov 2014 16:54:34 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id DC63B58064F; Sat, 22 Nov 2014 11:54:31 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH-v2 5/5] ext4: add support for a lazytime mount option Date: Sat, 22 Nov 2014 11:54:27 -0500 X-ASG-Orig-Subj: [PATCH-v2 5/5] ext4: add support for a lazytime mount option Message-Id: <1416675267-2191-6-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416675267-2191-1-git-send-email-tytso@mit.edu> References: <1416675267-2191-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416675275 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add an optimization for the MS_LAZYTIME mount option so that we will opportunistically write out any inodes with the I_DIRTY_TIME flag set in a particular inode table block when we need to update some inode in that inode table block anyway. Also add some temporary code so that we can set the lazytime mount option without needing a modified /sbin/mount program which can set MS_LAZYTIME. We can eventually make this go away once util-linux has added support. Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/ext4/inode.c | 48 ++++++++++++++++++++++++++++++++++++++++++--- fs/ext4/super.c | 9 +++++++++ fs/inode.c | 36 ++++++++++++++++++++++++++++++++++ include/linux/fs.h | 2 ++ include/trace/events/ext4.h | 29 +++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 3 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3356ab5..03149b4 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4163,6 +4163,50 @@ static int ext4_inode_blocks_set(handle_t *handle, } /* + * Opportunistically update the other time fields for other inodes in + * the same inode table block. + */ +static void ext4_update_other_inodes_time(struct super_block *sb, + unsigned long orig_ino, char *buf) +{ + struct ext4_inode_info *ei; + struct ext4_inode *raw_inode; + unsigned long ino; + struct inode *inode; + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; + int inode_size = EXT4_INODE_SIZE(sb); + + ino = orig_ino & ~(inodes_per_block - 1); + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { + if (ino == orig_ino) + continue; + inode = find_active_inode_nowait(sb, ino); + if (!inode || + (inode->i_state & I_DIRTY_TIME) == 0 || + !spin_trylock(&inode->i_lock)) { + iput(inode); + continue; + } + inode->i_state &= ~I_DIRTY_TIME; + inode->i_ts_dirty_day = 0; + spin_unlock(&inode->i_lock); + + ei = EXT4_I(inode); + raw_inode = (struct ext4_inode *) buf; + + spin_lock(&ei->i_raw_lock); + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); + ext4_inode_csum_set(inode, raw_inode, ei); + spin_unlock(&ei->i_raw_lock); + trace_ext4_other_inode_update_time(inode, orig_ino); + iput(inode); + } +} + + +/* * Post the struct inode info into an on-disk inode location in the * buffer-cache. This gobbles the caller's reference to the * buffer_head in the inode location struct. @@ -4260,7 +4304,6 @@ static int ext4_do_update_inode(handle_t *handle, for (block = 0; block < EXT4_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; } - if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { raw_inode->i_disk_version = cpu_to_le32(inode->i_version); if (ei->i_extra_isize) { @@ -4271,10 +4314,9 @@ static int ext4_do_update_inode(handle_t *handle, cpu_to_le16(ei->i_extra_isize); } } - ext4_inode_csum_set(inode, raw_inode, ei); - spin_unlock(&ei->i_raw_lock); + ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, bh->b_data); BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); rc = ext4_handle_dirty_metadata(handle, NULL, bh); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 4b79f39..1ac1914 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1133,6 +1133,7 @@ enum { Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err, Opt_usrquota, Opt_grpquota, Opt_i_version, Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_mblk_io_submit, + Opt_lazytime, Opt_nolazytime, Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, Opt_inode_readahead_blks, Opt_journal_ioprio, Opt_dioread_nolock, Opt_dioread_lock, @@ -1195,6 +1196,8 @@ static const match_table_t tokens = { {Opt_i_version, "i_version"}, {Opt_stripe, "stripe=%u"}, {Opt_delalloc, "delalloc"}, + {Opt_lazytime, "lazytime"}, + {Opt_nolazytime, "nolazytime"}, {Opt_nodelalloc, "nodelalloc"}, {Opt_removed, "mblk_io_submit"}, {Opt_removed, "nomblk_io_submit"}, @@ -1450,6 +1453,12 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, case Opt_i_version: sb->s_flags |= MS_I_VERSION; return 1; + case Opt_lazytime: + sb->s_flags |= MS_LAZYTIME; + return 1; + case Opt_nolazytime: + sb->s_flags &= ~MS_LAZYTIME; + return 1; } for (m = ext4_mount_opts; m->token != Opt_err; m++) diff --git a/fs/inode.c b/fs/inode.c index 5a9a7b0..17eb1c0 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1296,6 +1296,42 @@ struct inode *ilookup(struct super_block *sb, unsigned long ino) } EXPORT_SYMBOL(ilookup); +/** + * find_active_inode_nowait - find an active inode in the inode cache + * @sb: super block of file system to search + * @ino: inode number to search for + * + * Search for an active inode @ino in the inode cache, and if the + * inode is in the cache, the inode is returned with an incremented + * reference count. If the inode is being freed or is newly + * initialized, return nothing instead of trying to wait for the inode + * initialization or destruction to be complete. + */ +struct inode *find_active_inode_nowait(struct super_block *sb, + unsigned long ino) +{ + struct hlist_head *head = inode_hashtable + hash(sb, ino); + struct inode *inode, *ret_inode = NULL; + + spin_lock(&inode_hash_lock); + hlist_for_each_entry(inode, head, i_hash) { + if ((inode->i_ino != ino) || + (inode->i_sb != sb)) + continue; + spin_lock(&inode->i_lock); + if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) { + __iget(inode); + ret_inode = inode; + } + spin_unlock(&inode->i_lock); + goto out; + } +out: + spin_unlock(&inode_hash_lock); + return ret_inode; +} +EXPORT_SYMBOL(find_active_inode_nowait); + int insert_inode_locked(struct inode *inode) { struct super_block *sb = inode->i_sb; diff --git a/include/linux/fs.h b/include/linux/fs.h index e3574cd..dbbd642 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2413,6 +2413,8 @@ extern struct inode *ilookup(struct super_block *sb, unsigned long ino); extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); extern struct inode * iget_locked(struct super_block *, unsigned long); +extern struct inode *find_active_inode_nowait(struct super_block *, + unsigned long); extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); extern int insert_inode_locked(struct inode *); #ifdef CONFIG_DEBUG_LOCK_ALLOC diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index ff4bd1b..aca53c0 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -75,6 +75,35 @@ struct extent_status; { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}) +TRACE_EVENT(ext4_other_inode_update_time, + TP_PROTO(struct inode *inode, ino_t orig_ino), + + TP_ARGS(inode, orig_ino), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( ino_t, ino ) + __field( ino_t, orig_ino ) + __field( uid_t, uid ) + __field( gid_t, gid ) + __field( __u16, mode ) + ), + + TP_fast_assign( + __entry->orig_ino = orig_ino; + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->uid = i_uid_read(inode); + __entry->gid = i_gid_read(inode); + __entry->mode = inode->i_mode; + ), + + TP_printk("dev %d,%d orig_ino %lu ino %lu mode 0%o uid %u gid %u", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->orig_ino, __entry->ino, + __entry->mode, __entry->uid, __entry->gid) +); + TRACE_EVENT(ext4_free_inode, TP_PROTO(struct inode *inode), -- 2.1.0 From tytso@thunk.org Sat Nov 22 10:54:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7795C29DFB for ; Sat, 22 Nov 2014 10:54:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07294AC006 for ; Sat, 22 Nov 2014 08:54:38 -0800 (PST) X-ASG-Debug-ID: 1416675275-04cb6c0570258b10001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id HaypRj1Pvfs5c8G2 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 22 Nov 2014 08:54:35 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=eCbIGTttQhJzF2s0qMQbhiYbzYUJcahTbVClhtOTQro=; b=WxORGa9jJQlT8Cv9ZroZGvCkonJjEDQSN+5aDt9dZQKQ/zrEThL1gckhBsgJj3m0cets4KxY7UxDwy4CyDzKUvDB8A8/t9Da5vi4RB4yu2krS5axAPiNIptiRBudFp4sexvXxM649lcJR9TMWsmVblgXHezVhV0iZdvWYD9wc9U=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsDxB-0004Db-MA; Sat, 22 Nov 2014 16:54:33 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id D63205803BD; Sat, 22 Nov 2014 11:54:31 -0500 (EST) From: Theodore Ts'o To: linux-fsdevel@vger.kernel.org Cc: Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, Theodore Ts'o Subject: [PATCH-v2 4/5] vfs: add lazytime tracepoints for better debugging Date: Sat, 22 Nov 2014 11:54:26 -0500 X-ASG-Orig-Subj: [PATCH-v2 4/5] vfs: add lazytime tracepoints for better debugging Message-Id: <1416675267-2191-5-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416675267-2191-1-git-send-email-tytso@mit.edu> References: <1416675267-2191-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416675275 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 5 ++++- fs/inode.c | 5 +++++ include/trace/events/fs.h | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 include/trace/events/fs.h diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index eb04277..cab2d6d 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "internal.h" /* @@ -1304,8 +1305,10 @@ static void flush_sb_dirty_time(struct super_block *sb) iput(old_inode); old_inode = inode; - if (dirty_time) + if (dirty_time) { + trace_fs_lazytime_flush(inode); mark_inode_dirty(inode); + } cond_resched(); spin_lock(&inode_sb_list_lock); } diff --git a/fs/inode.c b/fs/inode.c index 0d939a8..5a9a7b0 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -20,6 +20,9 @@ #include #include "internal.h" +#define CREATE_TRACE_POINTS +#include + /* * Inode locking rules: * @@ -544,6 +547,7 @@ static void evict(struct inode *inode) mark_inode_dirty(inode); inode->i_sb->s_op->write_inode(inode, &wbc); } + trace_fs_lazytime_evict(inode); } if (!list_empty(&inode->i_wb_list)) @@ -1546,6 +1550,7 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) inode->i_state |= I_DIRTY_TIME; spin_unlock(&inode->i_lock); inode->i_ts_dirty_day = days_since_boot; + trace_fs_lazytime_defer(inode); return 0; } inode->i_ts_dirty_day = 0; diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h new file mode 100644 index 0000000..ca06d5c --- /dev/null +++ b/include/trace/events/fs.h @@ -0,0 +1,56 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM fs + +#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_FS_H + +#include + +DECLARE_EVENT_CLASS(fs__inode, + TP_PROTO(struct inode *inode), + + TP_ARGS(inode), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( ino_t, ino ) + __field( uid_t, uid ) + __field( gid_t, gid ) + __field( __u16, mode ) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->uid = i_uid_read(inode); + __entry->gid = i_gid_read(inode); + __entry->mode = inode->i_mode; + ), + + TP_printk("dev %d,%d ino %lu mode 0%o uid %u gid %u", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, __entry->mode, + __entry->uid, __entry->gid) +); + +DEFINE_EVENT(fs__inode, fs_lazytime_defer, + TP_PROTO(struct inode *inode), + + TP_ARGS(inode) +); + +DEFINE_EVENT(fs__inode, fs_lazytime_evict, + TP_PROTO(struct inode *inode), + + TP_ARGS(inode) +); + +DEFINE_EVENT(fs__inode, fs_lazytime_flush, + TP_PROTO(struct inode *inode), + + TP_ARGS(inode) +); +#endif /* _TRACE_FS_H */ + +/* This part must be outside protection */ +#include -- 2.1.0 From root@krios.tbi.univie.ac.at Sat Nov 22 23:25:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41ADA7F3F for ; Sat, 22 Nov 2014 23:25:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E2B9304043 for ; Sat, 22 Nov 2014 21:25:07 -0800 (PST) X-ASG-Debug-ID: 1416720305-04cbb01e5a273340001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id vu6DACs8dWjDux0U for ; Sat, 22 Nov 2014 21:25:06 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 334665F257; Sun, 23 Nov 2014 06:25:03 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 22CE45F25F; Sun, 23 Nov 2014 06:25:03 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20141123052503.22CE45F25F@krios.tbi.univie.ac.at> Date: Sun, 23 Nov 2014 06:25:03 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1416720306 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11925 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From markus.rhonheimer@web.de Sun Nov 23 05:37:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C61CF7F4E for ; Sun, 23 Nov 2014 05:37:49 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B15C830404E for ; Sun, 23 Nov 2014 03:37:49 -0800 (PST) X-ASG-Debug-ID: 1416742662-04cb6c05732a8040001-NocioJ Received: from mout.web.de (mout.web.de [212.227.17.12]) by cuda.sgi.com with ESMTP id Vrn0g8YhxIlXodlw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 23 Nov 2014 03:37:43 -0800 (PST) X-Barracuda-Envelope-From: markus.rhonheimer@web.de X-Barracuda-Apparent-Source-IP: 212.227.17.12 Received: from [192.168.64.62] ([79.210.5.207]) by smtp.web.de (mrweb101) with ESMTPSA (Nemesis) id 0MXYeQ-1XPKra0juo-00WZW8; Sun, 23 Nov 2014 12:37:41 +0100 Message-ID: <5471C703.2090109@web.de> Disposition-Notification-To: Markus Rhonheimer Date: Sun, 23 Nov 2014 12:37:39 +0100 From: Markus Rhonheimer User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: Virtual Block device resize corrupts XFS References: <5468FC60.10901@web.de> <20141116223630.GH23575@dastard> X-ASG-Orig-Subj: Re: Virtual Block device resize corrupts XFS In-Reply-To: <20141116223630.GH23575@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:4mFk7/0xAV6+aoCcV0DTBrUjQotdBDR6fxTT4a77hbppBx49OdT IsaQzbVip3dMF26RBRTddFskhxDQHH6NydK17VFVw/nJISEzGHRr/T7dqtkEqB5CB+EhNbJ WYQleFYzBr3W3VdCzBnshSR8D1UHH0l9RmGfhrBJKm/3wTXwxat/oztXFbaISxngmwSkwwY 7XJ/F4n4MyZVpkaGMC2jg== X-UI-Out-Filterresults: notjunk:1; X-Barracuda-Connect: mout.web.de[212.227.17.12] X-Barracuda-Start-Time: 1416742663 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 I am back at the PC now and here is more information: [root@localhost ~]# uname -a Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux [root@localhost ~]# xfs_repair -V xfs_repair Version 3.2.0-alpha2 [root@localhost ~]# cat /proc/meminfo MemTotal: 16307660 kB MemFree: 257876 kB MemAvailable: 475640 kB Buffers: 0 kB Cached: 757256 kB SwapCached: 946432 kB Active: 4082924 kB Inactive: 1807204 kB Active(anon): 4009728 kB Inactive(anon): 1689444 kB Active(file): 73196 kB Inactive(file): 117760 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 4095932 kB SwapFree: 1980064 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 4210260 kB Mapped: 23340 kB Shmem: 566300 kB Slab: 452760 kB SReclaimable: 280224 kB SUnreclaim: 172536 kB KernelStack: 3632 kB PageTables: 23704 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 12249760 kB Committed_AS: 8874152 kB VmallocTotal: 34359738367 kB VmallocUsed: 9586152 kB VmallocChunk: 34345555948 kB HardwareCorrupted: 0 kB AnonHugePages: 419840 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 776724 kB DirectMap2M: 15972352 kB [root@localhost ~]# cat /proc/mounts rootfs / rootfs rw 0 0 proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0 sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0 devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=8114764k,nr_inodes=2028691,mode=755 0 0 securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0 tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0 devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0 tmpfs /run tmpfs rw,seclabel,nosuid,nodev,mode=755 0 0 tmpfs /sys/fs/cgroup tmpfs rw,seclabel,nosuid,nodev,noexec,mode=755 0 0 cgroup /sys/fs/cgroup/systemd cgroup rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0 pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0 cgroup /sys/fs/cgroup/cpuset cgroup rw,nosuid,nodev,noexec,relatime,cpuset 0 0 cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0 cgroup /sys/fs/cgroup/memory cgroup rw,nosuid,nodev,noexec,relatime,memory 0 0 cgroup /sys/fs/cgroup/devices cgroup rw,nosuid,nodev,noexec,relatime,devices 0 0 cgroup /sys/fs/cgroup/freezer cgroup rw,nosuid,nodev,noexec,relatime,freezer 0 0 cgroup /sys/fs/cgroup/net_cls cgroup rw,nosuid,nodev,noexec,relatime,net_cls 0 0 cgroup /sys/fs/cgroup/blkio cgroup rw,nosuid,nodev,noexec,relatime,blkio 0 0 cgroup /sys/fs/cgroup/perf_event cgroup rw,nosuid,nodev,noexec,relatime,perf_event 0 0 cgroup /sys/fs/cgroup/hugetlb cgroup rw,nosuid,nodev,noexec,relatime,hugetlb 0 0 configfs /sys/kernel/config configfs rw,relatime 0 0 /dev/md125 / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 selinuxfs /sys/fs/selinux selinuxfs rw,relatime 0 0 systemd-1 /proc/sys/fs/binfmt_misc autofs rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0 hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 sunrpc /proc/fs/nfsd nfsd rw,relatime 0 0 /dev/md126 /boot xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 littleraid /littleraid zfs rw,seclabel,relatime,xattr,noacl 0 0 /dev/zd256 /mnt xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0 [root@localhost ~]# cat /proc/partitions major minor #blocks name 8 144 156290904 sdj 8 145 4098048 sdj1 8 146 1024000 sdj2 8 147 151166976 sdj3 8 128 156290904 sdi 8 129 4098048 sdi1 8 130 1024000 sdi2 8 131 151166976 sdi3 8 160 2930266584 sdk 8 161 2930256896 sdk1 8 169 8192 sdk9 8 176 2930266584 sdl 8 177 2930256896 sdl1 8 185 8192 sdl9 8 192 2930266584 sdm 8 193 2930256896 sdm1 8 201 8192 sdm9 8 208 2930266584 sdn 8 209 2930256896 sdn1 8 217 8192 sdn9 8 48 2930266584 sdd 8 49 2930256896 sdd1 8 57 8192 sdd9 8 32 1465138584 sdc 8 33 1465128960 sdc1 8 41 8192 sdc9 8 16 1465138584 sdb 8 17 1465128960 sdb1 8 25 8192 sdb9 8 112 1465138584 sdh 8 113 1465128960 sdh1 8 121 8192 sdh9 8 96 1465138584 sdg 8 97 1465128960 sdg1 8 105 8192 sdg9 8 80 1465138584 sdf 8 81 1465128960 sdf1 8 89 8192 sdf9 8 64 1465138584 sde 8 65 1465128960 sde1 8 73 8192 sde9 9 127 4095936 md127 9 126 1023936 md126 9 125 151035776 md125 8 0 2930266584 sda 8 1 2930256896 sda1 8 9 8192 sda9 230 16 524288000 zd16 230 17 524286959 zd16p1 230 48 10485760 zd48 230 64 576716800 zd64 230 65 576715759 zd64p1 230 80 209715200 zd80 230 81 209714159 zd80p1 230 96 1048576000 zd96 230 97 1048574959 zd96p1 230 112 524288000 zd112 230 113 524286959 zd112p1 230 128 104857600 zd128 230 129 131072 zd128p1 230 130 104724480 zd128p2 230 144 104857600 zd144 230 145 104856559 zd144p1 230 160 524288000 zd160 230 161 524286959 zd160p1 230 176 104857600 zd176 230 177 104856559 zd176p1 230 192 209715200 zd192 230 193 209714159 zd192p1 230 208 10485760 zd208 230 224 209715200 zd224 230 225 209714159 zd224p1 8 224 1953514584 sdo 8 225 1953505280 sdo1 8 233 8192 sdo9 8 240 1953514584 sdp 8 241 1953505280 sdp1 8 249 8192 sdp9 230 240 2044723200 zd240 230 256 8388608000 zd256 65 0 1953514584 sdq 65 1 1953505280 sdq1 65 9 8192 sdq9 65 16 1953514584 sdr 65 17 1953505280 sdr1 65 25 8192 sdr9 [root@localhost ~]# xfs_info /mnt meta-data=/dev/zd256 isize=256 agcount=144, agsize=13107200 blks = sectsz=4096 attr=2, projid32bit=0 = crc=0 data = bsize=4096 blocks=1887436800, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =Intern bsize=4096 blocks=25600, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =keine extsz=4096 blocks=0, rtextents=0 dmesg shows no errors I tried to save as much as I can: [root@localhost ~]# rsync -ave ssh /mnt/* me@192.168.64.58:/speicher/ 1>>/root/fehler1.log 2>/root/fehler2.log me@192.168.64.58's password: Message from syslogd@localhost at Nov 23 11:51:44 ... kernel:BUG: soft lockup - CPU#0 stuck for 23s! [kworker/0:3:6285] journald outputs these massages, as I do the rsync: Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): metadata I/O error: block 0x33f215488 ("xfs_trans_read_buf_map") error 117 numblks 8 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Metadata corruption detected at xfs_bmbt_read_verify+0x79/0xc0 [xfs], block 0x33f215488 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Unmount and run xfs_repair Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): First 64 bytes of corrupted metadata buffer: Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): metadata I/O error: block 0x33f215488 ("xfs_trans_read_buf_map") error 117 numblks 8 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Metadata corruption detected at xfs_bmbt_read_verify+0x79/0xc0 [xfs], block 0x33f215488 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Unmount and run xfs_repair Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): First 64 bytes of corrupted metadata buffer: Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): metadata I/O error: block 0x33f215488 ("xfs_trans_read_buf_map") error 117 numblks 8 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Metadata corruption detected at xfs_bmbt_read_verify+0x79/0xc0 [xfs], block 0x33f215488 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Unmount and run xfs_repair Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): First 64 bytes of corrupted metadata buffer: Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): metadata I/O error: block 0x33f215488 ("xfs_trans_read_buf_map") error 117 numblks 8 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Metadata corruption detected at xfs_bmbt_read_verify+0x79/0xc0 [xfs], block 0x33f215488 Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): Unmount and run xfs_repair Nov 21 20:17:15 localhost.localdomain kernel: XFS (zd256): First 64 bytes of corrupted metadata buffer: Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Nov 21 20:17:15 localhost.localdomain kernel: ffff88014cc65030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ I hope this is the right way to post the output. Would appreciate any ideas how to find out which files are broken. kind regards, Markus Am 16.11.2014 um 23:36 schrieb Dave Chinner: > On Sun, Nov 16, 2014 at 08:34:56PM +0100, Markus Rhonheimer wrote: >> Hi, >> >> I am running Centos 7 and have created a virtual block device with >> ZFS (ZVOL). I put XFS onto the block device without partitioning it. >> >> This worked very well as storage disk for a VM. >> >> A few days ago I wanted to increase the size of the block device, >> but accidently decreased it by 1 TB (from 7 to 6). I found out about >> it and immediately increased the size of the drive to 8 TB >> afterward. > If that was a normal LVM block device, there would have been no > trouble. But you're using something special, unusual and completely > untested, so the most likely outcome is going to be that you still > have a pile of broken bits. > >> The XFS partition can still be mounted and I can list the files on >> it, but xfs_repair -n says: "/Sorry/, /could not find valid >> secondary superblock" > Full output, please, as well as the version of xfs_repair you are > using... > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > Cheers, > > Dave. From namjae.jeon@samsung.com Mon Nov 24 00:16:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D11667F50 for ; Mon, 24 Nov 2014 00:16:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5FA55AC002 for ; Sun, 23 Nov 2014 22:16:28 -0800 (PST) X-ASG-Debug-ID: 1416809785-04cbb01e5b2c63a0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id dNAUvflg1tdbwNck (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:26 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00FOI5FCG590@mailout4.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:24 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.113]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id FB.57.18167.83DC2745; Mon, 24 Nov 2014 15:16:24 +0900 (KST) X-AuditID: cbfee690-f79ab6d0000046f7-96-5472cd38bd47 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 65.54.09430.83DC2745; Mon, 24 Nov 2014 15:16:24 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ007US5FCC1W0@mmp1.samsung.com>; Mon, 24 Nov 2014 15:16:24 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 24 Nov 2014 15:16:23 +0900 X-ASG-Orig-Subj: [PATCH v6 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-id: <002901d007ae$2c279580$8476c080$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHq+0B9RR8g/eTQfamwv0ozVUA5A== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrLIsWRmVeSWpSXmKPExsWyRsSkUNfibFGIwcaf0hZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr48myecwFd/gqdh5ewdrA+I27i5GTQ0LARGLD73uMELaYxIV769m6 GLk4hASWMkqc2HyWDabo6cz7LBCJRYwS7Y8vs4AkhAT+Mkqs3VXXxcjBwSagLfFniyhIWETA VWLe3e+MIPXMIIMuPn4CtkFYwFti0/IrjCD1LAKqEn27xUDCvAKWEkuaprBA2IISPybfA7OZ BbQk1u88zgRhy0tsXvOWGeIeBYkdZ18zQuzSk/i5dw5UvYjEvhfvwPZKCJxjl/j07BNYM4uA gMS3yYdYQPZKCMhKbDoANUdS4uCKGywTGMVmIVk9C8nqWUhWz0KyYgEjyypG0dSC5ILipPQi E73ixNzi0rx0veT83E2MwFg8/e/ZhB2M9w5YH2IU4GBU4uH9sLEoRIg1say4MvcQoynQRROZ pUST84ERn1cSb2hsZmRhamJqbGRuaaYkzvta6mewkEB6YklqdmpqQWpRfFFpTmrxIUYmDk6p BsblK/69vv9U5XbgmruTmHlsFol2TW898eTxGvvmlRci5jzK4f632OTp7e/KB25f/s9l5Wxa 25vyLXh5q7P5yullLfwdWj4h+Y8PvYq6u7G/fM+EW1+jT//9li3ZWKszOzJhrVZgtn2dxefF 3OWcicU1jItfn8piv7N0W+I2Tj/vqxqfZzP8cAtSYinOSDTUYi4qTgQAMJA/cMACAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrOIsWRmVeSWpSXmKPExsVy+t9jAV2Ls0UhBstbRSyWTrzEbLHl2D1G i5nz7rBZ7Nl7ksXi8q45bBatPT/ZLRb13WJ0YPc4tUjCo+nMUWaP1Re2Mnr0bVnF6PF5k1wA a1QDo01GamJKapFCal5yfkpmXrqtkndwvHO8qZmBoa6hpYW5kkJeYm6qrZKLT4CuW2YO0BlK CmWJOaVAoYDE4mIlfTtME0JD3HQtYBojdH1DguB6jAzQQMIaxowny+YxF9zhq9h5eAVrA+M3 7i5GTg4JAROJpzPvs0DYYhIX7q1n62Lk4hASWMQo0f74MlhCSOAvo8TaXXVdjBwcbALaEn+2 iIKERQRcJebd/c4IUs8ssJRR4uLjJ4wgCWEBb4lNy68wgtSzCKhK9O0WAwnzClhKLGmawgJh C0r8mHwPzGYW0JJYv/M4E4QtL7F5zVtmiHsUJHacfc0IsUtP4ufeOVD1IhL7XrxjnMAoMAvJ qFlIRs1CMmoWkpYFjCyrGEVTC5ILipPSc430ihNzi0vz0vWS83M3MYIj/Zn0DsZVDRaHGAU4 GJV4eGesLwoRYk0sK67MPcQowcGsJMJ79l9hiBBvSmJlVWpRfnxRaU5q8SFGU6BHJzJLiSbn A5NQXkm8obGJmZGlkbmhhZGxuZI4742buSFCAumJJanZqakFqUUwfUwcnFINjLpfTSOOMW5O WaC6r/zl5dQrJx7NUdgwYbfQA+53Wyq2XA4rPOzr8Utuwr3A/DlXnsmuVw3b/rDjrNqJBalr Tdxqw95WOv0Q/GnQt1f/gbipo9/D3PObJwq73a/T8DTpW5PeLZPX/r3Gl/XWDav6z/H2m/N+ p650emLDHBve9NXcTsv+eQR3txJLcUaioRZzUXEiAOt2tfIKAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1416809786 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 In continuation of the work of making the process of non linear editing of media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE for fallocate. This flag will work opposite to the FALLOC_FL_COLLAPSE_RANGE flag. As such, specifying FALLOC_FL_INSERT_RANGE flag will create new space inside file by inserting a hole within the range specified by offset and len. User can write new data in this space. e.g. ads. Like collapse range, currently we have the limitation that offset and len should be block size aligned for both XFS and Ext4. The semantics of the flag are : 1) It creates space within file by inserting a hole of len bytes starting at offset byte without overwriting any existing data. All the data blocks from offset to EOF are shifted towards right to make hole space. 2) It should be used exclusively. No other fallocate flag in combination. 3) Offset and length supplied to fallocate should be fs block size aligned in case of xfs and ext4. 4) Insert range does not work for the case when offset is overlapping/beyond i_size. If the user wants to insert space at the end of file they are advised to use either ftruncate(2) or fallocate(2) with mode 0. 5) It increses the size of file by len bytes. Namjae Jeon (10): fs: Add support FALLOC_FL_INSERT_RANGE for fallocate xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate xfsprogs: xfs_io: add finsert command for insert range via fallocate xfstests: generic/038: Standard insert range tests xfstests: generic/039: Delayed allocation insert range xfstests: generic/040: Multi insert range tests xfstests: generic/041: Delayed allocation multi insert xfstests: fsstress: Add fallocate insert range operation xfstests: fsx: Add fallocate insert range operation -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:16:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 085C47F57 for ; Mon, 24 Nov 2014 00:16:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDA4830404E for ; Sun, 23 Nov 2014 22:16:36 -0800 (PST) X-ASG-Debug-ID: 1416809790-04bdf0615f29ece0001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id zSpIGecnpO6vEjEb (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:31 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00KE35FIOXA0@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:30 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.113]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 6B.60.18484.E3DC2745; Mon, 24 Nov 2014 15:16:30 +0900 (KST) X-AuditID: cbfee68f-f791c6d000004834-1d-5472cd3eb7c9 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 8C.64.09430.D3DC2745; Mon, 24 Nov 2014 15:16:30 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ007WK5FHC1W0@mmp1.samsung.com>; Mon, 24 Nov 2014 15:16:29 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 1/10] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 24 Nov 2014 15:16:29 +0900 X-ASG-Orig-Subj: [PATCH v6 1/10] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <002a01d007ae$2f6b9cf0$8e42d6d0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrBeG8J/bMgPHSEiPWkEfCIHn8g== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrLIsWRmVeSWpSXmKPExsWyRsSkUNfubFGIwZ2XHBZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr4+PayYwFV0Ur1rQcZ2xgPCDYxcjJISFgIvHjzksmCFtM4sK99Wxd jFwcQgJLGSWOTr7A0sXIAVb0en0CRHwRo0Tr+sksEM5fRomONzOZQIrYBLQl/mwRBRkkIuAq Me/ud0aQGmaQQRcfP2EESQgL+Er8ajzFDlLPIqAq8aDTByTMK2ApsfD/SzYIW1Dix+R7LCA2 s4CWxPqdx5kgbHmJzWveMkMcqiCx4+xrRohdehL9V84zQ9SISOx78Q5sr4TAJXaJY6e/gjWz CAhIfJt8COoZWYlNB6DmSEocXHGDZQKj2Cwkq2chWT0LyepZSFYsYGRZxSiaWpBcUJyUXmSs V5yYW1yal66XnJ+7iREYi6f/PevfwXj3gPUhRgEORiUe3hnri0KEWBPLiitzDzGaAl00kVlK NDkfGPF5JfGGxmZGFqYmpsZG5pZmSuK8C6V+BgsJpCeWpGanphakFsUXleakFh9iZOLglGpg 3KO060P9rb1GG/nCeif+WyPi5NRcO8FZJSVd7kxTeyzzifzfdjfNqi05BS+EnW+oCan6daF0 4fcPO/ZcELK4Z3btS1jao2m2kXk8omaNe67X/8uxlov2sFAT3PK9f7UJk2tHhbDC1+2n+3fu 0ZwtJnRy/WanH2wfXTfwvH8tcFabwbJoVo6ZEktxRqKhFnNRcSIA8nnWP8ACAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrOIsWRmVeSWpSXmKPExsVy+t9jAV27s0UhBu1tjBZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NaqB0SYjNTEltUghNS85PyUzL91WyTs43jne1MzAUNfQ0sJcSSEvMTfVVsnFJ0DXLTMH6Awl hbLEnFKgUEBicbGSvh2mCaEhbroWMI0Rur4hQXA9RgZoIGENY8bHtZMZC66KVqxpOc7YwHhA sIuRg0NCwETi9fqELkZOIFNM4sK99WxdjFwcQgKLGCVa109mgXD+Mkp0vJnJBNLAJqAt8WeL KEiDiICrxLy73xlBapgFljJKXHz8hBEkISzgK/Gr8RQ7SD2LgKrEg04fkDCvgKXEwv8v2SBs QYkfk++xgNjMAloS63ceZ4Kw5SU2r3nLDHGQgsSOs68ZIXbpSfRfOc8MUSMise/FO8YJjAKz kIyahWTULCSjZiFpWcDIsopRNLUguaA4KT3XSK84Mbe4NC9dLzk/dxMjONKfSe9gXNVgcYhR gINRiYd3xvqiECHWxLLiytxDjBIczEoivGf/FYYI8aYkVlalFuXHF5XmpBYfYjQFenQis5Ro cj4wCeWVxBsam5gZWRqZG1oYGZsrifPeuJkbIiSQnliSmp2aWpBaBNPHxMEp1cBoKP219psM E1fayZ8LcuLntuzL3lH3/c+iGobyPOUHFj9zM9cfLUh9Yv6qQjHnrcOhrY/lz2p8vSzz+ua/ G3mFkpz1mp/+7079VXx9Cu+SC1NO2HxYJCTqlDbVIt06ec5k+wjvfUp+J/WWChwJzBYT8jzP 5cp2sUhQyqqf2TW0QnD/n/KshTOVWIozEg21mIuKEwHN7b0gCgMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1416809791 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will create space for writing new data within a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, that is block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 8 +++++++- include/uapi/linux/falloc.h | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/fs/open.c b/fs/open.c index 36662d0..74ed498 100644 --- a/fs/open.c +++ b/fs/open.c @@ -232,7 +232,8 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; /* Punch hole and zero range are mutually exclusive */ @@ -250,6 +251,11 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE)) return -EINVAL; + /* Insert range should only be used exclusively. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && + (mode & ~FALLOC_FL_INSERT_RANGE)) + return -EINVAL; + if (!(file->f_mode & FMODE_WRITE)) return -EBADF; diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index d1197ae..1f20723 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,19 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to insert space within the file size without + * overwriting any existing data. The contents of the file beyond offset are + * shifted towards right by len bytes to create a hole. As such, this + * operation will increase the size of the file by len bytes. + * Different filesystems may implement different limitations on the granularity + * of the operation. Most will limit operations to filesystem block size + * boundaries, but this boundary may be larger or smaller depending on + * the filesystem and/or the configuration of the filesystem or file. + * Attempting to insert space using this flag at OR beyond the end of + * the file is considered an illegal operation - just use ftruncate(2) or + * fallocate(2) with mode 0 for such type of operations. + */ +#define FALLOC_FL_INSERT_RANGE 0x20 + #endif /* _UAPI_FALLOC_H_ */ -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:16:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D2CA47F5D for ; Mon, 24 Nov 2014 00:16:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 70122AC002 for ; Sun, 23 Nov 2014 22:16:38 -0800 (PST) X-ASG-Debug-ID: 1416809790-04bdf0615f29ece0002-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id ZjQxWAfDOQKO4gUm (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:35 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00LQD5FMH990@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:34 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 83.70.18484.14DC2745; Mon, 24 Nov 2014 15:16:33 +0900 (KST) X-AuditID: cbfee68f-f791c6d000004834-51-5472cd41750b Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id F9.23.20081.14DC2745; Mon, 24 Nov 2014 15:16:33 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ00J8X5FLE300@mmp1.samsung.com>; Mon, 24 Nov 2014 15:16:33 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 24 Nov 2014 15:16:33 +0900 X-ASG-Orig-Subj: [PATCH v6 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <002b01d007ae$319ed0a0$94dc71e0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrEZszhaFJYlAQo+LEnZ1dtOt3Q== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrHIsWRmVeSWpSXmKPExsWyRsSkRNfxbFGIweet1hZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr4+QnyYKbZxgrfj75y9rA2LKQsYuRg0NCwETixFLHLkZOIFNM4sK9 9WxdjFwcQgJLGSV+b+1hh0iYSBxv2MwIYgsJLGKU2N5XDFH0l1Fi2fPnLCCD2AS0Jf5sEQWp ERFwlZh39zsjSA0zyKB7PRvYQBLCAn4Sl5beZAGxWQRUJe78PQg2lFfAUmLL42VQtqDEj8n3 wGqYBbQk1u88zgRhy0tsXvOWGeIgBYkdZ18zQizTk3h05QQ7RI2IxL4X78AWSwicY5fonziT EWKZgMS3yYdYID6Wldh0AGqOpMTBFTdYJjCKzUKyehaS1bOQrJ6FZMUCRpZVjKKpBckFxUnp RcZ6xYm5xaV56XrJ+bmbGIHRePrfs/4djHcPWB9iFOBgVOLhnbG+KESINbGsuDL3EKMp0EUT maVEk/OBMZ9XEm9obGZkYWpiamxkbmmmJM67UOpnsJBAemJJanZqakFqUXxRaU5q8SFGJg5O qQZGfcuUzxUqlQVnNv4qrnhex8c1a928+JVaRQ5Wx4Li9lZ/2pAVx7XLecHHX62Zu1u+uuUX dNv1b4i3+ZBj0Hoh4vQH8wxvcS03vVef33Tf+R0/b5GUUqbo/v/X59tti849VJf428d3zsHm o/N0v19Svfz8Y7Xpq1uOT97X3n2cu35i0oPfS1VclViKMxINtZiLihMBNri+f8ECAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAV3Hs0UhBi/v6losnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBknP0kW3DzDWPHzyV/WBsaW hYxdjJwcEgImEscbNkPZYhIX7q1nA7GFBBYxSmzvK+5i5AKy/zJKLHv+nKWLkYODTUBb4s8W UZAaEQFXiXl3vzOC1DALLGWUuNezAaxZWMBP4tLSmywgNouAqsSdvwfBFvAKWEpsebwMyhaU +DH5HlgNs4CWxPqdx5kgbHmJzWveMkMcpCCx4+xrRohlehKPrpxgh6gRkdj34h3jBEaBWUhG zUIyahaSUbOQtCxgZFnFKJpakFxQnJSea6hXnJhbXJqXrpecn7uJERztz6R2MK5ssDjEKMDB qMTD+2FjUYgQa2JZcWXuIUYJDmYlEd6z/wpDhHhTEiurUovy44tKc1KLDzGaAn06kVlKNDkf mIjySuINjU3MjCyNzA0tjIzNlcR5b9zMDRESSE8sSc1OTS1ILYLpY+LglGpgXPKHrfhv4DL3 6TM2TDd0uvXwQ93Lb0yPy/vvaSopJzJ/PbU4LGbrcv2n67csDVty8uCW2J2J2VVX3oR97q/Y 8Xype/mCeT++HjunkejnYTbNKra1PL8r9LLt5RVKHh+E7dpm97yf83JnYc/aSNPfe3jKNsey GagqT7tvKpYk6HDhj26v2P73X5RYijMSDbWYi4oTAbzVHWMMAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1416809795 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- Changelog v6: - This version is based upon Brian's changes to collapse paths. - Instead of having seperate functions for shifting extents left/right, the current extent shift function is made generic to shift in both directions. v5: - remove allocation part. v4: - set cur->bc_private.b.allocated to zero before calling xfs_btree_del_cursor. v3: - remove XFS_TRANS_RESERVE and assert. - update the comment of blockcount calculation. - use 'if(blockcount)' instead of 'if (got.br_blockcount < blockcount)'. - move insert_file_space() calling under xfs_setattr_size to avoid code duplicate. v2: - remove reserved enable. - add xfs_qm_dqattach. - reset blockcount in xfs_bmap_shift_extents_right. - update i_size to avoid data loss before insert_file_space() is called. - use in-memory extent array size that delayed allocation extents fs/xfs/libxfs/xfs_bmap.c | 368 +++++++++++++++++++++++++++++++++++++++++------ fs/xfs/libxfs/xfs_bmap.h | 14 +- fs/xfs/xfs_bmap_util.c | 118 +++++++++++---- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 38 ++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 463 insertions(+), 78 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 79c9819..da01890 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5528,56 +5528,87 @@ xfs_bmse_shift_one( int *current_ext, struct xfs_bmbt_rec_host *gotp, struct xfs_btree_cur *cur, - int *logflags) + int *logflags, + enum SHIFT_DIRECTION SHIFT) { struct xfs_ifork *ifp; xfs_fileoff_t startoff; - struct xfs_bmbt_rec_host *leftp; + struct xfs_bmbt_rec_host *contp; struct xfs_bmbt_irec got; - struct xfs_bmbt_irec left; + struct xfs_bmbt_irec cont; int error; int i; + int total_extents; ifp = XFS_IFORK_PTR(ip, whichfork); + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); xfs_bmbt_get_all(gotp, &got); - startoff = got.br_startoff - offset_shift_fsb; /* delalloc extents should be prevented by caller */ XFS_WANT_CORRUPTED_GOTO(!isnullstartblock(got.br_startblock), out_error); - /* - * If this is the first extent in the file, make sure there's enough - * room at the start of the file and jump right to the shift as there's - * no left extent to merge. - */ - if (*current_ext == 0) { - if (got.br_startoff < offset_shift_fsb) + if (SHIFT == SHIFT_LEFT) { + startoff = got.br_startoff - offset_shift_fsb; + /* + * If this is the first extent in the file, make sure there's + * enough room at the start of the file and jump right to the + * shift as there's no left extent to merge. + */ + if (*current_ext == 0) { + if (got.br_startoff < offset_shift_fsb) + return -EINVAL; + goto shift_extent; + } + + /* grab the left extent and check for a large enough hole */ + contp = xfs_iext_get_ext(ifp, *current_ext - 1); + xfs_bmbt_get_all(contp, &cont); + + if (startoff < cont.br_startoff + cont.br_blockcount) return -EINVAL; - goto shift_extent; - } - /* grab the left extent and check for a large enough hole */ - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); - xfs_bmbt_get_all(leftp, &left); + /* check whether to merge the extent or shift it down */ + if (!xfs_bmse_can_merge(&cont, &got, offset_shift_fsb)) + goto shift_extent; - if (startoff < left.br_startoff + left.br_blockcount) - return -EINVAL; + return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, + *current_ext, gotp, contp, cur, logflags); + } else { + startoff = got.br_startoff + offset_shift_fsb; + /* + * If this is the last extent in the file, make sure there's + * enough room at the end of the file and jump right to the + * shift as there's no right extent to merge. + */ + if (*current_ext == (total_extents - 1)) + goto shift_extent; - /* check whether to merge the extent or shift it down */ - if (!xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) - goto shift_extent; + /* grab the right extent and check for a large enough hole */ + contp = xfs_iext_get_ext(ifp, *current_ext + 1); + xfs_bmbt_get_all(contp, &cont); - return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, *current_ext, - gotp, leftp, cur, logflags); + if (startoff > cont.br_startoff) + return -EINVAL; + + if (!xfs_bmse_can_merge(&got, &cont, offset_shift_fsb)) + goto shift_extent; + + return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, + *current_ext + 1, contp, gotp, cur, + logflags); + } shift_extent: /* * Increment the extent index for the next iteration, update the start * offset of the in-core extent and update the btree if applicable. */ - (*current_ext)++; + if (SHIFT == SHIFT_LEFT) + (*current_ext)++; + else + (*current_ext)--; xfs_bmbt_set_startoff(gotp, startoff); *logflags |= XFS_ILOG_CORE; if (!cur) { @@ -5604,10 +5635,10 @@ out_error: } /* - * Shift extent records to the left to cover a hole. + * Shift extent records to the left/right to cover/create a hole. * * The maximum number of extents to be shifted in a single operation is - * @num_exts. @start_fsb specifies the file offset to start the shift and the + * @num_exts. @stop_fsb specifies the file offset at which to stop shift and the * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb * is the length by which each extent is shifted. If there is no hole to shift * the extents into, this will be considered invalid operation and we abort @@ -5617,12 +5648,13 @@ int xfs_bmap_shift_extents( struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t start_fsb, + xfs_fileoff_t stop_fsb, xfs_fileoff_t offset_shift_fsb, int *done, xfs_fileoff_t *next_fsb, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + enum SHIFT_DIRECTION SHIFT, int num_exts) { struct xfs_btree_cur *cur = NULL; @@ -5636,6 +5668,7 @@ xfs_bmap_shift_extents( int whichfork = XFS_DATA_FORK; int logflags = 0; int total_extents; + int stop_extent; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5651,6 +5684,7 @@ xfs_bmap_shift_extents( ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + ASSERT(SHIFT == SHIFT_LEFT || SHIFT == SHIFT_RIGHT); ifp = XFS_IFORK_PTR(ip, whichfork); if (!(ifp->if_flags & XFS_IFEXTENTS)) { @@ -5668,43 +5702,87 @@ xfs_bmap_shift_extents( } /* + * There may be delalloc extents in the data fork before the range we + * are collapsing out, so we cannot use the count of real extents here. + * Instead we have to calculate it from the incore fork. + */ + total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (total_extents == 0) { + *done = 1; + goto del_cursor; + } + + /* + * In case of first right shift, we need to initialize next_fsb + */ + if (*next_fsb == NULLFSBLOCK) { + ASSERT(SHIFT == SHIFT_RIGHT); + gotp = xfs_iext_get_ext(ifp, total_extents - 1); + xfs_bmbt_get_all(gotp, &got); + *next_fsb = got.br_startoff; + if (stop_fsb > *next_fsb) { + *done = 1; + goto del_cursor; + } + } + + /* Lookup the extent index at which we have to stop */ + if (SHIFT == SHIFT_RIGHT) + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); + else + stop_extent = total_extents; + + /* * Look up the extent index for the fsb where we start shifting. We can * henceforth iterate with current_ext as extent list changes are locked * out via ilock. * * gotp can be null in 2 cases: 1) if there are no extents or 2) - * start_fsb lies in a hole beyond which there are no extents. Either + * *next_fsb lies in a hole beyond which there are no extents. Either * way, we are done. */ - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); + gotp = xfs_iext_bno_to_ext(ifp, *next_fsb, ¤t_ext); if (!gotp) { *done = 1; goto del_cursor; } - /* - * There may be delalloc extents in the data fork before the range we - * are collapsing out, so we cannot use the count of real extents here. - * Instead we have to calculate it from the incore fork. - */ - total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - while (nexts++ < num_exts && current_ext < total_extents) { + /* some sanity checking before we finally start shifting extents */ + if ((SHIFT == SHIFT_LEFT && current_ext >= stop_extent) || + (SHIFT == SHIFT_RIGHT && current_ext < stop_extent)) { + error = EIO; + goto del_cursor; + } + + while (nexts++ < num_exts) { error = xfs_bmse_shift_one(ip, whichfork, offset_shift_fsb, - ¤t_ext, gotp, cur, &logflags); + ¤t_ext, gotp, cur, &logflags, + SHIFT); if (error) goto del_cursor; - - /* update total extent count and grab the next record */ + /* + * In case there was an extent merge after shifting extent, + * extent numbers would change. + * Update total extent count and grab the next record. + */ total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - if (current_ext >= total_extents) - break; + if (SHIFT == SHIFT_RIGHT) { + gotp = xfs_iext_bno_to_ext(ifp, stop_fsb, &stop_extent); + if (current_ext < stop_extent) { + *done = 1; + break; + } + } else { + stop_extent = total_extents; + if (current_ext == stop_extent) { + *done = 1; + break; + } + } gotp = xfs_iext_get_ext(ifp, current_ext); } - /* Check if we are done */ - if (current_ext == total_extents) { - *done = 1; - } else if (next_fsb) { + if (!*done) { xfs_bmbt_get_all(gotp, &got); *next_fsb = got.br_startoff; } @@ -5719,3 +5797,203 @@ del_cursor: return error; } + +/* + * Splits an extent into two extents at split_fsb block that it is + * the first block of the current_ext. @current_ext is a target extent + * to be split. @split_fsb is a block where the extents is split. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* split extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + xfs_extnum_t current_ext; + int error = 0; + int logflags; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return -EFSCORRUPTED; + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, ¤t_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + /* Add new extent */ + current_ext++; + xfs_iext_insert(ip, current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) { + cur->bc_private.b.allocated = 0; + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + } + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto out; + + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, + &firstfsb, &free_list); + if (error) + goto out; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto out; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + return error; + +out: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index 44db6db..94c80aa 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -135,6 +135,11 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) */ #define XFS_BMAP_MAX_SHIFT_EXTENTS 1 +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + #ifdef DEBUG void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int whichfork, unsigned long caller_ip); @@ -180,6 +185,13 @@ uint xfs_default_attroffset(struct xfs_inode *ip); int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, int *done, xfs_fileoff_t *next_fsb, xfs_fsblock_t *firstblock, - struct xfs_bmap_free *flist, int num_exts); + struct xfs_bmap_free *flist, enum SHIFT_DIRECTION SHIFT, + int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset); +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, + xfs_fileoff_t *start_fsb, xfs_fileoff_t *next_fsb, + xfs_fileoff_t offset_shift_fsb, int *done, + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + int num_exts); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 2810026..4ce7f92 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1379,22 +1379,21 @@ out: } /* - * xfs_collapse_file_space() - * This routine frees disk space and shift extent for the given file. - * The first thing we do is to free data blocks in the specified range - * by calling xfs_free_file_space(). It would also sync dirty data - * and invalidate page cache over the region on which collapse range - * is working. And Shift extent records to the left to cover a hole. - * RETURNS: - * 0 on success - * errno on error - * + * @next_fsb will keep track of the extent currently undergoing shift. + * @stop_fsb will keep track of the extent at which we have to stop. + * If we are shifting left, we will start with block (offset + len) and + * shift each extent till last extent. + * If we are shifting right, we will start with last extent inside file space + * and continue until we reach the block corresponding to offset. + * If right shift, delegate the work of + * initialization of next_fsb to xfs_bmap_shift_extent as it has ilock held. */ int -xfs_collapse_file_space( - struct xfs_inode *ip, - xfs_off_t offset, - xfs_off_t len) +xfs_shift_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len, + enum SHIFT_DIRECTION SHIFT) { int done = 0; struct xfs_mount *mp = ip->i_mount; @@ -1403,21 +1402,22 @@ xfs_collapse_file_space( struct xfs_bmap_free free_list; xfs_fsblock_t first_block; int committed; - xfs_fileoff_t start_fsb; + xfs_fileoff_t stop_fsb; xfs_fileoff_t next_fsb; xfs_fileoff_t shift_fsb; - ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(SHIFT == SHIFT_LEFT || SHIFT == SHIFT_RIGHT); - trace_xfs_collapse_file_space(ip); + if (SHIFT == SHIFT_LEFT) { + next_fsb = XFS_B_TO_FSB(mp, offset + len); + stop_fsb = XFS_B_TO_FSB(mp, VFS_I(ip)->i_size); + } else { + next_fsb = NULLFSBLOCK; + stop_fsb = XFS_B_TO_FSB(mp, offset); + } - next_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); - error = xfs_free_file_space(ip, offset, len); - if (error) - return error; - /* * Trim eofblocks to avoid shifting uninitialized post-eof preallocation * into the accessible region of the file. @@ -1430,20 +1430,23 @@ xfs_collapse_file_space( /* * Writeback and invalidate cache for the remainder of the file as we're - * about to shift down every extent from the collapse range to EOF. The - * free of the collapse range above might have already done some of - * this, but we shouldn't rely on it to do anything outside of the range - * that was freed. + * about to shift down every extent from offset to EOF. */ error = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - offset + len, -1); + offset, -1); if (error) return error; error = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - (offset + len) >> PAGE_CACHE_SHIFT, -1); + offset >> PAGE_CACHE_SHIFT, -1); if (error) return error; + if (SHIFT == SHIFT_RIGHT) { + error = xfs_bmap_split_extent(ip, stop_fsb); + if (error) + return error; + } + while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); /* @@ -1475,10 +1478,9 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - start_fsb = next_fsb; - error = xfs_bmap_shift_extents(tp, ip, start_fsb, shift_fsb, + error = xfs_bmap_shift_extents(tp, ip, stop_fsb, shift_fsb, &done, &next_fsb, &first_block, &free_list, - XFS_BMAP_MAX_SHIFT_EXTENTS); + SHIFT, XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; @@ -1499,6 +1501,60 @@ out: } /* + * xfs_collapse_file_space() + * This routine frees disk space and shift extent for the given file. + * The first thing we do is to free data blocks in the specified range + * by calling xfs_free_file_space(). It would also sync dirty data + * and invalidate page cache over the region on which collapse range + * is working. And Shift extent records to the left to cover a hole. + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_collapse_file_space( + struct xfs_inode *ip, + xfs_off_t offset, + xfs_off_t len) +{ + int error; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_collapse_file_space(ip); + + error = xfs_free_file_space(ip, offset, len); + if (error) + return error; + + return xfs_shift_file_space(ip, offset, len, SHIFT_LEFT); +} + +/* + * xfs_insert_file_space() + * This routine create hole space by shifting extents for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. + * RETURNS: + * 0 on success + * errno on error + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + return xfs_shift_file_space(ip, offset, len, SHIFT_RIGHT); +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 2fdb72d..6cb116c 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -98,6 +98,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index eb596b4..93b568d 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -790,11 +790,13 @@ xfs_file_fallocate( struct xfs_trans *tp; long error; loff_t new_size = 0; + int do_file_insert = 0; if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -824,6 +826,28 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + error = -EFBIG; + goto out_unlock; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + error = -EINVAL; + goto out_unlock; + } + + new_size = i_size_read(inode) + len; + do_file_insert = 1; } else { if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > i_size_read(inode)) { @@ -874,8 +898,20 @@ xfs_file_fallocate( iattr.ia_valid = ATTR_SIZE; iattr.ia_size = new_size; error = xfs_setattr_size(ip, &iattr); + if (error) + goto out_unlock; } + /* + * Some operations are performed after the inode size is updated. For + * example, insert range expands the address space of the file, shifts + * all subsequent extents to create a hole inside the file. Updating + * the size first ensures that shifted extents aren't left hanging + * past EOF in the event of a crash or failure. + */ + if (do_file_insert) + error = xfs_insert_file_space(ip, offset, len); + out_unlock: xfs_iunlock(ip, XFS_IOLOCK_EXCL); return error; diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..7e45fa1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -664,6 +664,7 @@ DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:16:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C88BC7F5F for ; Mon, 24 Nov 2014 00:16:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 821E7304051 for ; Sun, 23 Nov 2014 22:16:39 -0800 (PST) X-ASG-Debug-ID: 1416809790-04bdf0615f29ece0003-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id yKQctHokjzTpR180 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:37 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00KBJ5FPS4A0@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:37 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.115]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id AA.06.11124.44DC2745; Mon, 24 Nov 2014 15:16:37 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-e5-5472cd44e3ef Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 50.33.20081.44DC2745; Mon, 24 Nov 2014 15:16:36 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ00J9K5FOE300@mmp1.samsung.com>; Mon, 24 Nov 2014 15:16:36 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 3/10] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 24 Nov 2014 15:16:36 +0900 X-ASG-Orig-Subj: [PATCH v6 3/10] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <002c01d007ae$3395e5b0$9ac1b110$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrG3YCrdc3xXeQBWqz5EsoMIIjA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrHIsWRmVeSWpSXmKPExsWyRsSkWNf1bFGIwXRji6UTLzFbbDl2j9Fi 5rw7bBZ79p5ksbi8aw6bRWvPT3aLRX23GB3YPU4tkvBoOnOU2WP1ha2MHn1bVjF6fN4kF8Aa xWWTkpqTWZZapG+XwJXRNnEJc8Gsqoqbv3+wNjAuS+hi5OSQEDCRmDxlHTuELSZx4d56ti5G Lg4hgaWMEpP/9TDDFN1o28YMkVjEKNHw+BArhPOXUeLr1E9AGQ4ONgFtiT9bREEaRARcJebd /c4IUsMMMuni4yeMIAlhAX+Jdd9Pgk1lEVCVOLl3PyuIzStgKdG75RkLhC0o8WPyPTCbWUBL Yv3O40wQtrzE5jVvoS5SkNhx9jUjxDI9ibc7L7JC1IhI7HvxDmyxhMA5domNCz+xQCwTkPg2 +RALyKESArISmw5AzZGUOLjiBssERrFZSFbPQrJ6FpLVs5CsWMDIsopRNLUguaA4Kb3ISK84 Mbe4NC9dLzk/dxMjMBpP/3vWt4Px5gHrQ4wCHIxKPLwfNhaFCLEmlhVX5h5iNAW6aCKzlGhy PjDm80riDY3NjCxMTUyNjcwtzZTEeROkfgYLCaQnlqRmp6YWpBbFF5XmpBYfYmTi4JRqYJy4 LsV9H/szPZGtIYFXLgqz//68bO6+6Qo3/FfvfxUrw7Atz8pd8X7eTEkWx48nerb+feUY2aq3 QHQCb/biQt5W0yLLH7vq+1b1O6/yXRvIJjnRKLSO3fWkvo7KEQmjtefncjNl/vjg9nlOUf+L 1m0d145fkio6JBuo3xxUnB5bzsl97smUFUosxRmJhlrMRcWJAOYRiPnBAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAV2Xs0UhBhenG1ssnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBltE5cwF8yqqrj5+wdrA+Oy hC5GTg4JAROJG23bmCFsMYkL99azdTFycQgJLGKUaHh8iBXC+cso8XXqJ6AqDg42AW2JP1tE QRpEBFwl5t39zghSwyywlFHi4uMnjCAJYQF/iXXfT4JNZRFQlTi5dz8riM0rYCnRu+UZC4Qt KPFj8j0wm1lAS2L9zuNMELa8xOY1b6EuUpDYcfY1I8QyPYm3Oy+yQtSISOx78Y5xAqPALCSj ZiEZNQvJqFlIWhYwsqxiFE0tSC4oTkrPNdQrTswtLs1L10vOz93ECI72Z1I7GFc2WBxiFOBg VOLh/bCxKESINbGsuDL3EKMEB7OSCO/Zf4UhQrwpiZVVqUX58UWlOanFhxhNgT6dyCwlmpwP TER5JfGGxiZmRpZG5oYWRsbmSuK8N27mhggJpCeWpGanphakFsH0MXFwSjUw8hv9mv8+c2Nf 0/a+Hzrh1T2Wl3beCovb+vJURNHEB2uLXrX/u7GZd4VCqnmC/bZ9nvG7tp4rtw7zE3sz5/08 8Ze7djzkj03wUpD4NfPYIivrA+I79/tJmh39eUJFom/WP8Mpph3JBTwaSufj/m+ILyvXO7r1 r/GfsKerPf0bYkO1ylh0F0/QU2Ipzkg01GIuKk4EABoB+38MAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1416809797 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== This patch implements fallocate's FALLOC_FL_INSERT_RANGE for Ext4. 1) Make sure that both offset and len are block size aligned. 2) Update the i_size of inode by len bytes. 3) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 4) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- Changelog v6: - Instead of having seperate functions for shifting extents left/right, the current extent shift function is made generic to shift in both directions. v5: - remove allocation part. fs/ext4/ext4.h | 6 + fs/ext4/extents.c | 302 ++++++++++++++++++++++++++++++++++++-------- include/trace/events/ext4.h | 25 ++++ 3 files changed, 282 insertions(+), 51 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index db3f772..0cf212a 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -90,6 +90,11 @@ typedef __u32 ext4_lblk_t; /* data type for block group number */ typedef unsigned int ext4_group_t; +enum SHIFT_DIRECTION { + SHIFT_LEFT = 0, + SHIFT_RIGHT, +}; + /* * Flags used in mballoc's allocation_context flags field. * @@ -2760,6 +2765,7 @@ extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); +extern int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len); extern int ext4_swap_extents(handle_t *handle, struct inode *inode1, struct inode *inode2, ext4_lblk_t lblk1, ext4_lblk_t lblk2, ext4_lblk_t count, diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 0b16fb4..0baebc5 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4913,7 +4913,8 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) @@ -4933,6 +4934,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (mode & FALLOC_FL_COLLAPSE_RANGE) return ext4_collapse_range(inode, offset, len); + if (mode & FALLOC_FL_INSERT_RANGE) + return ext4_insert_range(inode, offset, len); + if (mode & FALLOC_FL_ZERO_RANGE) return ext4_zero_range(file, offset, len, mode); @@ -5219,13 +5223,13 @@ ext4_access_path(handle_t *handle, struct inode *inode, /* * ext4_ext_shift_path_extents: * Shift the extents of a path structure lying between path[depth].p_ext - * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift - * from starting block for each extent. + * and EXT_LAST_EXTENT(path[depth].p_hdr), by @shift blocks. @SHIFT tells + * if it is right shift or left shift operation. */ static int ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, struct inode *inode, handle_t *handle, - ext4_lblk_t *start) + enum SHIFT_DIRECTION SHIFT) { int depth, err = 0; struct ext4_extent *ex_start, *ex_last; @@ -5249,19 +5253,25 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) update = 1; - *start = le32_to_cpu(ex_last->ee_block) + - ext4_ext_get_actual_len(ex_last); - while (ex_start <= ex_last) { - le32_add_cpu(&ex_start->ee_block, -shift); - /* Try to merge to the left. */ - if ((ex_start > - EXT_FIRST_EXTENT(path[depth].p_hdr)) && - ext4_ext_try_to_merge_right(inode, - path, ex_start - 1)) + if (SHIFT == SHIFT_LEFT) { + le32_add_cpu(&ex_start->ee_block, + -shift); + /* Try to merge to the left. */ + if ((ex_start > + EXT_FIRST_EXTENT(path[depth].p_hdr)) + && + ext4_ext_try_to_merge_right(inode, + path, ex_start - 1)) + ex_last--; + else + ex_start++; + } else { + le32_add_cpu(&ex_last->ee_block, shift); + ext4_ext_try_to_merge_right(inode, path, + ex_last); ex_last--; - else - ex_start++; + } } err = ext4_ext_dirty(handle, inode, path + depth); if (err) @@ -5276,7 +5286,10 @@ ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, if (err) goto out; - le32_add_cpu(&path[depth].p_idx->ei_block, -shift); + if (SHIFT == SHIFT_LEFT) + le32_add_cpu(&path[depth].p_idx->ei_block, -shift); + else + le32_add_cpu(&path[depth].p_idx->ei_block, shift); err = ext4_ext_dirty(handle, inode, path + depth); if (err) goto out; @@ -5294,19 +5307,20 @@ out: /* * ext4_ext_shift_extents: - * All the extents which lies in the range from start to the last allocated - * block for the file are shifted downwards by shift blocks. + * All the extents which lies in the range from @start to the last allocated + * block for the @inode are shifted either towards left or right (depending + * upon @SHIFT) by @shift blocks. * On success, 0 is returned, error otherwise. */ static int ext4_ext_shift_extents(struct inode *inode, handle_t *handle, - ext4_lblk_t start, ext4_lblk_t shift) + ext4_lblk_t start, ext4_lblk_t shift, + enum SHIFT_DIRECTION SHIFT) { struct ext4_ext_path *path; int ret = 0, depth; struct ext4_extent *extent; - ext4_lblk_t stop_block; - ext4_lblk_t ex_start, ex_end; + ext4_lblk_t stop, *iterator, ex_start, ex_end; /* Let path point to the last extent */ path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); @@ -5318,58 +5332,84 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, if (!extent) goto out; - stop_block = le32_to_cpu(extent->ee_block) + + stop = le32_to_cpu(extent->ee_block) + ext4_ext_get_actual_len(extent); - /* Nothing to shift, if hole is at the end of file */ - if (start >= stop_block) - goto out; + /* + * In case of left shift, Don't start shifting extents until we make + * sure the hole is big enough to accommodate the shift. + */ + if (SHIFT == SHIFT_LEFT) { + path = ext4_find_extent(inode, start - 1, &path, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + depth = path->p_depth; + extent = path[depth].p_ext; + if (extent) { + ex_start = le32_to_cpu(extent->ee_block); + ex_end = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + } else { + ex_start = 0; + ex_end = 0; + } - /* - * Don't start shifting extents until we make sure the hole is big - * enough to accomodate the shift. - */ - path = ext4_find_extent(inode, start - 1, &path, 0); - if (IS_ERR(path)) - return PTR_ERR(path); - depth = path->p_depth; - extent = path[depth].p_ext; - if (extent) { - ex_start = le32_to_cpu(extent->ee_block); - ex_end = le32_to_cpu(extent->ee_block) + - ext4_ext_get_actual_len(extent); - } else { - ex_start = 0; - ex_end = 0; + if ((start == ex_start && shift > ex_start) || + (shift > start - ex_end)) { + ext4_ext_drop_refs(path); + kfree(path); + return -EINVAL; + } } - if ((start == ex_start && shift > ex_start) || - (shift > start - ex_end)) - return -EINVAL; + /* + * In case of left shift, iterator points to start and it is increased + * till we reach stop. In case of right shift, iterator points to stop + * and it is decreased till we reach start. + */ + if (SHIFT == SHIFT_LEFT) + iterator = &start; + else + iterator = &stop; /* Its safe to start updating extents */ - while (start < stop_block) { - path = ext4_find_extent(inode, start, &path, 0); + while (start < stop) { + path = ext4_find_extent(inode, *iterator, &path, 0); if (IS_ERR(path)) return PTR_ERR(path); depth = path->p_depth; extent = path[depth].p_ext; if (!extent) { EXT4_ERROR_INODE(inode, "unexpected hole at %lu", - (unsigned long) start); + (unsigned long) *iterator); return -EIO; } - if (start > le32_to_cpu(extent->ee_block)) { + if (SHIFT == SHIFT_LEFT && *iterator > + le32_to_cpu(extent->ee_block)) { /* Hole, move to the next extent */ if (extent < EXT_LAST_EXTENT(path[depth].p_hdr)) { path[depth].p_ext++; } else { - start = ext4_ext_next_allocated_block(path); + *iterator = ext4_ext_next_allocated_block(path); continue; } } + + if (SHIFT == SHIFT_LEFT) { + extent = EXT_LAST_EXTENT(path[depth].p_hdr); + *iterator = le32_to_cpu(extent->ee_block) + + ext4_ext_get_actual_len(extent); + } else { + extent = EXT_FIRST_EXTENT(path[depth].p_hdr); + *iterator = le32_to_cpu(extent->ee_block) > 0 ? + le32_to_cpu(extent->ee_block) - 1 : 0; + /* Update path extent in case we need to stop */ + while (le32_to_cpu(extent->ee_block) < start) + extent++; + path[depth].p_ext = extent; + } ret = ext4_ext_shift_path_extents(path, shift, inode, - handle, &start); + handle, SHIFT); if (ret) break; } @@ -5474,7 +5514,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) ext4_discard_preallocations(inode); ret = ext4_ext_shift_extents(inode, handle, punch_stop, - punch_stop - punch_start); + punch_stop - punch_start, SHIFT_LEFT); if (ret) { up_write(&EXT4_I(inode)->i_data_sem); goto out_stop; @@ -5499,6 +5539,166 @@ out_mutex: return ret; } +/* + * ext4_insert_range: + * This function implements the FALLOC_FL_INSERT_RANGE flag of fallocate. + * The data blocks starting from @offset to the EOF are shifted by @len + * towards right to create a hole in the @inode. Inode size is increased + * by len bytes. + * Returns 0 on success, error otherwise. + */ +int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + handle_t *handle; + struct ext4_ext_path *path; + struct ext4_extent *extent; + ext4_lblk_t offset_lblk, len_lblk, ee_start_lblk = 0; + unsigned int credits, ee_len; + int ret = 0, depth, split_flag = 0; + loff_t ioffset; + + /* Insert range works only on fs block size aligned offsets. */ + if (offset & (EXT4_CLUSTER_SIZE(sb) - 1) || + len & (EXT4_CLUSTER_SIZE(sb) - 1)) + return -EINVAL; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + trace_ext4_insert_range(inode, offset, len); + + offset_lblk = offset >> EXT4_BLOCK_SIZE_BITS(sb); + len_lblk = len >> EXT4_BLOCK_SIZE_BITS(sb); + + /* Call ext4_force_commit to flush all data in case of data=journal */ + if (ext4_should_journal_data(inode)) { + ret = ext4_force_commit(inode->i_sb); + if (ret) + return ret; + } + + /* + * Need to round down to align start offset to page size boundary + * for page size > block size. + */ + ioffset = round_down(offset, PAGE_SIZE); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, + LLONG_MAX); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { + ret = -EOPNOTSUPP; + goto out_mutex; + } + + /* Check for wrap through zero */ + if (inode->i_size + len > inode->i_sb->s_maxbytes) { + ret = -EFBIG; + goto out_mutex; + } + + /* Offset should be less than i_size */ + if (offset >= i_size_read(inode)) { + ret = -EINVAL; + goto out_mutex; + } + + truncate_pagecache(inode, ioffset); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + /* Expand file to avoid data loss if there is error while shifting */ + inode->i_size += len; + EXT4_I(inode)->i_disksize += len; + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ret = ext4_mark_inode_dirty(handle, inode); + if (ret) + goto out_stop; + + down_write(&EXT4_I(inode)->i_data_sem); + ext4_discard_preallocations(inode); + + path = ext4_find_extent(inode, offset_lblk, NULL, 0); + if (IS_ERR(path)) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + depth = ext_depth(inode); + extent = path[depth].p_ext; + if (extent) { + ee_start_lblk = le32_to_cpu(extent->ee_block); + ee_len = ext4_ext_get_actual_len(extent); + + /* + * If offset_lblk is not the starting block of extent, split + * the extent @offset_lblk + */ + if ((offset_lblk > ee_start_lblk) && + (offset_lblk < (ee_start_lblk + ee_len))) { + if (ext4_ext_is_unwritten(extent)) + split_flag = EXT4_EXT_MARK_UNWRIT1 | + EXT4_EXT_MARK_UNWRIT2; + ret = ext4_split_extent_at(handle, inode, &path, + offset_lblk, split_flag, + EXT4_EX_NOCACHE | + EXT4_GET_BLOCKS_PRE_IO | + EXT4_GET_BLOCKS_METADATA_NOFAIL); + } + + ext4_ext_drop_refs(path); + kfree(path); + if (ret < 0) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + } + + ret = ext4_es_remove_extent(inode, offset_lblk, + EXT_MAX_BLOCKS - offset_lblk); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + /* + * if offset_lblk lies in a hole which is at start of file, use + * ee_start_lblk to shift extents + */ + ret = ext4_ext_shift_extents(inode, handle, + ee_start_lblk > offset_lblk ? ee_start_lblk : offset_lblk, + len_lblk, SHIFT_RIGHT); + + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + +out_stop: + ext4_journal_stop(handle); +out_dio: + ext4_inode_resume_unlocked_dio(inode); +out_mutex: + mutex_unlock(&inode->i_mutex); + return ret; +} + /** * ext4_swap_extents - Swap extents between two inodes * diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index ff4bd1b..1a88c8b 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2450,6 +2450,31 @@ TRACE_EVENT(ext4_collapse_range, __entry->offset, __entry->len) ); +TRACE_EVENT(ext4_insert_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + TRACE_EVENT(ext4_es_shrink, TP_PROTO(struct super_block *sb, int nr_shrunk, u64 scan_time, int skip_precached, int nr_skipped, int retried), -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:16:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0D63D7F50 for ; Mon, 24 Nov 2014 00:16:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D2D6B8F8037 for ; Sun, 23 Nov 2014 22:16:45 -0800 (PST) X-ASG-Debug-ID: 1416809803-04bdf0615f29ed00001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id 9SGEY7OSp6RlHbsx (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:44 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00K7Y5FVSEA0@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:43 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.112]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id D3.87.18167.B4DC2745; Mon, 24 Nov 2014 15:16:43 +0900 (KST) X-AuditID: cbfee690-f79ab6d0000046f7-7d-5472cd4b68d4 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 99.33.20081.A4DC2745; Mon, 24 Nov 2014 15:16:43 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ0046W5FUL5M0@mmp2.samsung.com>; Mon, 24 Nov 2014 15:16:42 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 4/10] xfsprogs: xfs_io: add finsert command for insert range via fallocate Date: Mon, 24 Nov 2014 15:16:42 +0900 X-ASG-Orig-Subj: [PATCH v6 4/10] xfsprogs: xfs_io: add finsert command for insert range via fallocate Message-id: <002d01d007ae$374e80e0$a5eb82a0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrMy8LNEDdO5mTqa623W1G8zaIQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrPIsWRmVeSWpSXmKPExsWyRsSkQNf7bFGIwZQDnBZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr49eB1ywFdwUrnk1YxdbAOIOvi5GTQ0LAROLHtF/MELaYxIV769m6 GLk4hASWMkq03mlmhinas+svE0RiOqPEm9lrmCGcv4wSe9vOMXYxcnCwCWhL/NkiCtIgIuAq Me/ud0aQGmaQSRcfP2EESQgLxEscmP8OzGYRUJWY9HAZE4jNK2ApsWzxBjYIW1Dix+R7LCA2 s4CWxPqdx5kgbHmJzWveQl2kILHj7GtGiGV6Ejf2dEDVi0jse/EObLGEwCV2iYsNr5gglglI fJt8iAXkUAkBWYlNB6DmSEocXHGDZQKj2Cwkq2chWT0LyepZSFYsYGRZxSiaWpBcUJyUXmSi V5yYW1yal66XnJ+7iREYj6f/PZuwg/HeAetDjAIcjEo8vB82FoUIsSaWFVfmHmI0BbpoIrOU aHI+MOrzSuINjc2MLExNTI2NzC3NlMR5X0v9DBYSSE8sSc1OTS1ILYovKs1JLT7EyMTBKdXA WMZ27fP6skcvUxtOp8lwztFkiox0Wlo5cYca97yvVSsqmqZF1Db9jgya0xYk+MnyLp/7Wus5 ldULZ37fmsTJNHlD3dPk6xf5F2bVnVR4mrHvnpvLqaU6gmvjv534cVzQrZh988+ALXq+5p37 UhyE9llcXb9W32ffnpx/+2MfbEmdZb8x1kNDTYmlOCPRUIu5qDgRAHjpAfbCAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jQV3vs0UhBqsPMFksnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBm/DrxmKbgrWPFswiq2BsYZ fF2MnBwSAiYSe3b9ZYKwxSQu3FvP1sXIxSEkMJ1R4s3sNcwQzl9Gib1t5xi7GDk42AS0Jf5s EQVpEBFwlZh39zsjSA2zwFJGiYuPnzCCJIQF4iUOzH8HZrMIqEpMergMbAOvgKXEssUb2CBs QYkfk++xgNjMAloS63ceZ4Kw5SU2r3nLDHGRgsSOs68ZIZbpSdzY0wFVLyKx78U7xgmMArOQ jJqFZNQsJKNmIWlZwMiyilE0tSC5oDgpPddQrzgxt7g0L10vOT93EyM42p9J7WBc2WBxiFGA g1GJh/fDxqIQIdbEsuLK3EOMEhzMSiK8Z/8VhgjxpiRWVqUW5ccXleakFh9iNAX6dCKzlGhy PjAR5ZXEGxqbmBlZGpkbWhgZmyuJ8964mRsiJJCeWJKanZpakFoE08fEwSnVwBi61aV3Go+7 R6tB9JybDRkSmxzTv0ebfrodfrl1V0vmLuf9rp9s5iTP+/V5l2/IqZfP1ilqpZ4IyEn5MVVx 1qKiNVsOp90/uDlv7qYKDZ9H8Wl3OBh1J9guSvD65r/twtKLkp9qBdj9GPeWmTo0V4X2Fs94 ZX99DmNxquiWWvE7NZU1Hxv3zVNiKc5INNRiLipOBABhA9lUDAMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1416809804 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== Add finsert command for fallocate FALLOC_FL_INSERT_RANGE flag. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- io/prealloc.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/io/prealloc.c b/io/prealloc.c index aba6b44..11b1e12 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -37,6 +37,10 @@ #define FALLOC_FL_ZERO_RANGE 0x10 #endif +#ifndef FALLOC_FL_INSERT_RANGE +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif + static cmdinfo_t allocsp_cmd; static cmdinfo_t freesp_cmd; static cmdinfo_t resvsp_cmd; @@ -46,6 +50,7 @@ static cmdinfo_t zero_cmd; static cmdinfo_t falloc_cmd; static cmdinfo_t fpunch_cmd; static cmdinfo_t fcollapse_cmd; +static cmdinfo_t finsert_cmd; static cmdinfo_t fzero_cmd; #endif @@ -169,11 +174,14 @@ fallocate_f( int mode = 0; int c; - while ((c = getopt(argc, argv, "ckp")) != EOF) { + while ((c = getopt(argc, argv, "cikp")) != EOF) { switch (c) { case 'c': mode = FALLOC_FL_COLLAPSE_RANGE; break; + case 'i': + mode = FALLOC_FL_INSERT_RANGE; + break; case 'k': mode = FALLOC_FL_KEEP_SIZE; break; @@ -237,6 +245,25 @@ fcollapse_f( } static int +finsert_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + int mode = FALLOC_FL_INSERT_RANGE; + + if (!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (fallocate(file->fd, mode, + segment.l_start, segment.l_len)) { + perror("fallocate"); + return 0; + } + return 0; +} + +static int fzero_f( int argc, char **argv) @@ -345,6 +372,16 @@ prealloc_init(void) _("de-allocates space and eliminates the hole by shifting extents"); add_command(&fcollapse_cmd); + finsert_cmd.name = "finsert"; + finsert_cmd.cfunc = finsert_f; + finsert_cmd.argmin = 2; + finsert_cmd.argmax = 2; + finsert_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + finsert_cmd.args = _("off len"); + finsert_cmd.oneline = + _("creates new space for writing within file by shifting extents"); + add_command(&finsert_cmd); + fzero_cmd.name = "fzero"; fzero_cmd.cfunc = fzero_f; fzero_cmd.argmin = 2; -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:16:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 55FAE7F6C for ; Mon, 24 Nov 2014 00:16:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 197518F8052 for ; Sun, 23 Nov 2014 22:16:51 -0800 (PST) X-ASG-Debug-ID: 1416809808-04bdf0615e29ed10001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id ALfnRCEgau8o3tFl (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:49 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00LRG5G0H990@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:48 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.113]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id AF.96.17016.05DC2745; Mon, 24 Nov 2014 15:16:48 +0900 (KST) X-AuditID: cbfee68d-f79296d000004278-67-5472cd509b94 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id DC.33.20081.05DC2745; Mon, 24 Nov 2014 15:16:48 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ007095G0C1X0@mmp1.samsung.com>; Mon, 24 Nov 2014 15:16:48 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 5/10] xfstests: generic/038: Standard insert range tests Date: Mon, 24 Nov 2014 15:16:48 +0900 X-ASG-Orig-Subj: [PATCH v6 5/10] xfstests: generic/038: Standard insert range tests Message-id: <002e01d007ae$3a8f7b10$afae7130$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrOimcfpjb+/xQxKJHnDXlcDGyw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrLIsWRmVeSWpSXmKPExsWyRsSkUDfgbFGIweomDYulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVMbfrI1vBTf2K41OmsTUwdqh3MXJySAiYSEy+u4IVwhaTuHBvPVsX IxeHkMBSRon5Mw8xwxRdfbSUESKxiFHi0NcrzBDOX0aJLVdPsHcxcnCwCWhL/NkiCtIgIuAq Me/ud7AGZpBJFx8/YQSpERbwlnjxTxekhkVAVeLc5E6wzbwClhJ/l71lgrAFJX5MvscCYjML aEms33mcCcKWl9i85i3UQQoSO86+BhspIqAn8eauBkSJiMS+F+/A1koIXGKXuHDrDxPELgGJ b5MPsYDUSwjISmw6ADVGUuLgihssExjFZiHZPAvJ5llINs9CsmIBI8sqRtHUguSC4qT0IkO9 4sTc4tK8dL3k/NxNjMBYPP3vWe8OxtsHrA8xCnAwKvHwfthYFCLEmlhWXJl7iNEU6KKJzFKi yfnAiM8riTc0NjOyMDUxNTYytzRTEudVlPoZLCSQnliSmp2aWpBaFF9UmpNafIiRiYNTqoFR 8eS15fd603qk7kafSI7jmOhw/nOXQACvJ6/d4nL+1e0F91l+Fh2UlCq4urejPCApYcnJLf13 BWXYV54rTiqeG3hW/6LC4SKpwPBsz13qrbrdN05UJ5sLrHjA/76+cPXNzkcrRLUXLWrWWyoT qlvAv3nSkaLcLqf9Kt1OVxqmvYxnt/zn1qvEUpyRaKjFXFScCAAIwNaRwAIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrOIsWRmVeSWpSXmKPExsVy+t9jAd2As0UhBnP/y1ksnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBlzuz6yFdzUrzg+ZRpbA2OH ehcjJ4eEgInE1UdLGSFsMYkL99azdTFycQgJLGKUOPT1CjOE85dRYsvVE+xdjBwcbALaEn+2 iII0iAi4Ssy7+50RpIZZYCmjxMXHTxhBaoQFvCVe/NMFqWERUJU4N7mTFcTmFbCU+LvsLROE LSjxY/I9FhCbWUBLYv3O40wQtrzE5jVvmSEOUpDYcfY12EgRAT2JN3c1IEpEJPa9eMc4gVFg FpJJs5BMmoVk0iwkLQsYWVYxiqYWJBcUJ6XnGuoVJ+YWl+al6yXn525iBEf6M6kdjCsbLA4x CnAwKvHwfthYFCLEmlhWXJl7iFGCg1lJhPfsv8IQId6UxMqq1KL8+KLSnNTiQ4ymQI9OZJYS Tc4HJqG8knhDYxMzI0sjc0MLI2NzJXHeGzdzQ4QE0hNLUrNTUwtSi2D6mDg4pRoYGQ4umuUu +aWxqODRlNkK827ezGJjse2693Ld+yy+j8ZXpT9zH6wyPt6spPKkIv12kMcZMenHU7qO1Oqe aem4XxmuX96jHKe346j87YDwIl6LL/G7Z1U/in9ese3gEc/ffy6cTHC80qwin3zbq8O0UN8u tcfj2KysOgehvmsvm0OOXQuYmblSiaU4I9FQi7moOBEAq9F8jQoDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1416809809 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.60 MARKETING_SUBJECT Subject contains popular marketing words This testcase(038) tries to test various corner cases for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- common/punch | 5 ++++ common/rc | 2 +- tests/generic/038 | 65 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/038.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 tests/generic/038 create mode 100644 tests/generic/038.out diff --git a/common/punch b/common/punch index 237b4d8..a75f4cf 100644 --- a/common/punch +++ b/common/punch @@ -527,6 +527,11 @@ _test_generic_punch() return fi + # If zero_cmd is finsert, don't check unaligned offsets + if [ "$zero_cmd" == "finsert" ]; then + return + fi + echo " 16. data -> cache cold ->hole" if [ "$remove_testfile" ]; then rm -f $testfile diff --git a/common/rc b/common/rc index d5e3aff..ca4177f 100644 --- a/common/rc +++ b/common/rc @@ -1486,7 +1486,7 @@ _require_xfs_io_command() "falloc" ) testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` ;; - "fpunch" | "fcollapse" | "zero" | "fzero" ) + "fpunch" | "fcollapse" | "zero" | "fzero" | "finsert" ) testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ -c "$command 4k 8k" $testfile 2>&1` ;; diff --git a/tests/generic/038 b/tests/generic/038 new file mode 100644 index 0000000..0ce0e61 --- /dev/null +++ b/tests/generic/038 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/038 +# +# Standard insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/038.out b/tests/generic/038.out new file mode 100644 index 0000000..3ebdb43 --- /dev/null +++ b/tests/generic/038.out @@ -0,0 +1,78 @@ +QA output created by 038 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 9f355fc..7d6f227 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -40,6 +40,7 @@ 035 auto quick 036 auto aio rw stress 037 metadata auto quick +038 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:16:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E0AD7F75 for ; Mon, 24 Nov 2014 00:16:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F139DAC002 for ; Sun, 23 Nov 2014 22:16:56 -0800 (PST) X-ASG-Debug-ID: 1416809814-04cbb01e5b2c63e0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id l9vARUtu7b5gO8qI (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:16:55 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.34 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00FPT5G5G590@mailout4.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:53 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.34] Received: from epcpsbgm2.samsung.com ( [172.20.52.112]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id DE.97.18167.55DC2745; Mon, 24 Nov 2014 15:16:53 +0900 (KST) X-AuditID: cbfee690-f79ab6d0000046f7-18-5472cd550dc4 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 46.94.09430.55DC2745; Mon, 24 Nov 2014 15:16:53 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ009DX5G5HWQ0@mmp1.samsung.com>; Mon, 24 Nov 2014 15:16:53 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, Ashish Sangwan Subject: [PATCH v6 6/10] xfstests: generic/039: Delayed allocation insert range Date: Mon, 24 Nov 2014 15:16:53 +0900 X-ASG-Orig-Subj: [PATCH v6 6/10] xfstests: generic/039: Delayed allocation insert range Message-id: <002f01d007ae$3d94cbd0$b8be6370$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrUqXoFhx1EAzR/GqkF6lIa9eNA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrPIsWRmVeSWpSXmKPExsWyRsSkQDf0bFGIwaFlxhZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoEr49O5jWwFzzUq7p2ewNLA+Faxi5GTQ0LARGLry11MELaYxIV769m6 GLk4hASWMkrcWrWBCaZo5dl+VojEIkaJy896oKr+Mkq07//E2MXIwcEmoC3xZ4soSIOIgKvE vLvfGUFqmEEmPf76BGySsIC/xL+VvSwgNouAqsShZ12MIDavgKXEzUntLBC2oMSPyffAbGYB LYn1O48zQdjyEpvXvGWGuEhBYsfZ14wQy/QkTi65CVUvIrHvxTuwxRIC59glGm79Y4NYJiDx bfIhFpBDJQRkJTYdgJojKXFwxQ2WCYxis5CsnoVk9Swkq2chWbGAkWUVo2hqQXJBcVJ6kYle cWJucWleul5yfu4mRmA8nv73bMIOxnsHrA8xCnAwKvHwfthYFCLEmlhWXJl7iNEU6KKJzFKi yfnAqM8riTc0NjOyMDUxNTYytzRTEud9LfUzWEggPbEkNTs1tSC1KL6oNCe1+BAjEwenVAOj dInsB11lhYcHkgVsnz3+8cTt9PX+pK8zl5xa/njDs2gu2YtOpxd+dD208YbqlqtRDhFSttMY L9TVqXMmL6u+t6otvb6t7u+mi4dC5z8pWH2uq7rIfuopr5cf5fZsOCns9ORnsXpZxGTn7CZZ p+YZzcHSnZyb1gjtPPLbaFEs74fjX2oYBNOClViKMxINtZiLihMBxlgL0cICAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAd3Qs0UhBn/naFssnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBmfzm1kK3iuUXHv9ASWBsa3 il2MnBwSAiYSK8/2s0LYYhIX7q1n62Lk4hASWMQocflZD5Tzl1Giff8nxi5GDg42AW2JP1tE QRpEBFwl5t39zghSwyywlFHi8dcnTCAJYQF/iX8re1lAbBYBVYlDz7oYQWxeAUuJm5PaWSBs QYkfk++B2cwCWhLrdx5ngrDlJTavecsMcZGCxI6zrxkhlulJnFxyE6peRGLfi3eMExgFZiEZ NQvJqFlIRs1C0rKAkWUVo2hqQXJBcVJ6rpFecWJucWleul5yfu4mRnC0P5PewbiqweIQowAH oxIP74z1RSFCrIllxZW5hxglOJiVRHjP/isMEeJNSaysSi3Kjy8qzUktPsRoCvTpRGYp0eR8 YCLKK4k3NDYxM7I0Mje0MDI2VxLnvXEzN0RIID2xJDU7NbUgtQimj4mDU6qBUc2/Ujp69sGb GofKzsV8PHLSj88rV+kg24nsj+VqEl/730Q8NBLsXqvySudTk+SWx08j9rRYdARyc4sU7djL vXdaySXV+RGMJWn3Vi+95y1uHS/6snr5eWdxe4XkfdHb9UT+7Q5Mss/Z81mr8uuefxXP0366 hmXUibOGJHActFyt/C3q6+8/SizFGYmGWsxFxYkAOIrFDwwDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout4.samsung.com[203.254.224.34] X-Barracuda-Start-Time: 1416809815 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This testcase(039) tries to test various corner cases with delayed extents for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/039 | 65 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/039.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 144 insertions(+) create mode 100644 tests/generic/039 create mode 100644 tests/generic/039.out diff --git a/tests/generic/039 b/tests/generic/039 new file mode 100644 index 0000000..3421f93 --- /dev/null +++ b/tests/generic/039 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/039 +# +# Delayed allocation insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/039.out b/tests/generic/039.out new file mode 100644 index 0000000..d1e8320 --- /dev/null +++ b/tests/generic/039.out @@ -0,0 +1,78 @@ +QA output created by 039 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 7d6f227..4beb27f 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -41,6 +41,7 @@ 036 auto aio rw stress 037 metadata auto quick 038 auto quick prealloc +039 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:17:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 760B37F80 for ; Mon, 24 Nov 2014 00:17:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55D788F8037 for ; Sun, 23 Nov 2014 22:17:03 -0800 (PST) X-ASG-Debug-ID: 1416809819-04cb6c05732dba00001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id sYEEXSGu5hYjC3vO (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:17:00 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ007CW5GAYNA0@mailout2.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:16:58 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm1.samsung.com ( [172.20.52.112]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 41.36.11124.A5DC2745; Mon, 24 Nov 2014 15:16:58 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-fd-5472cd5a791b Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id B6.43.20081.A5DC2745; Mon, 24 Nov 2014 15:16:58 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ004BM5GAL5M0@mmp2.samsung.com>; Mon, 24 Nov 2014 15:16:58 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 7/10] xfstests: generic/040: Multi insert range tests Date: Mon, 24 Nov 2014 15:16:58 +0900 X-ASG-Orig-Subj: [PATCH v6 7/10] xfstests: generic/040: Multi insert range tests Message-id: <003001d007ae$40a985e0$c1fc91a0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrWlDd02mItFvT7OM72yMz49CTA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrDIsWRmVeSWpSXmKPExsWyRsSkQDfqbFGIwYaVZhZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoErY/8TkYJOzYrniyUaGDuVuhg5OSQETCR+rHjABGGLSVy4t56ti5GL Q0hgKaPEmik9rF2MHGBFS95GQcSnM0o8u7SYEcL5yyjxcf0jsCI2AW2JP1tEQQaJCLhKzLv7 HayGGWTQxcdPGEESwgIeEhd3bGYDsVkEVCWePFzECmLzClhKtBxfB2ULSvyYfI8FxGYW0JJY v/M4E4QtL7F5zVtmiEsVJHacfc0IsUxP4uXUV6wQNSIS+168A1ssIXCOXWLWqgmsEMsEJL5N PsQC8Y2sxKYDUHMkJQ6uuMEygVFsFpLVs5CsnoVk9SwkKxYwsqxiFE0tSC4oTkovMtIrTswt Ls1L10vOz93ECIzE0/+e9e1gvHnA+hCjAAejEg/vh41FIUKsiWXFlbmHGE2BLprILCWanA+M 97ySeENjMyMLUxNTYyNzSzMlcd4EqZ/BQgLpiSWp2ampBalF8UWlOanFhxiZODilGhgNNmgZ qn2ven0t3zHH2zFGz992yqPqpk8WhW85hC+fl/0t8nfupC8R8+psLnjtfS8huGdnZugZHdbV WuXTz6YEX1bW6JP6VSbuUNl1cG5qaGvXQtH8AOUe/pl//j7ZJLJHjDW+NFlH+OJTwaZ0zj/c OaV/DHskSi+qnJ4tEj9TZqq/0PVwQSWW4oxEQy3mouJEAKXzKTW/AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrGIsWRmVeSWpSXmKPExsVy+t9jQd2os0UhBjdf6losnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBn7n4gUdGpWPF8s0cDYqdTF yMEhIWAiseRtVBcjJ5ApJnHh3nq2LkYuDiGB6YwSzy4tZoRw/jJKfFz/iBWkgU1AW+LPFlGQ BhEBV4l5d7+D1TALLGWUuPj4CSNIQljAQ+Lijs1sIDaLgKrEk4eLWEFsXgFLiZbj66BsQYkf k++xgNjMAloS63ceZ4Kw5SU2r3nLDHGRgsSOs68ZIZbpSbyc+ooVokZEYt+Ld4wTGAVmIRk1 C8moWUhGzULSsoCRZRWjaGpBckFxUnquoV5xYm5xaV66XnJ+7iZGcJw/k9rBuLLB4hCjAAej Eg/vh41FIUKsiWXFlbmHGCU4mJVEeM/+KwwR4k1JrKxKLcqPLyrNSS0+xGgK9OlEZinR5Hxg CsoriTc0NjEzsjQyN7QwMjZXEue9cTM3REggPbEkNTs1tSC1CKaPiYNTqoFxSfwlZ6dbdafu FC5NbzF68qpN4ov+rxB/y5mm+XeDN6QsSwiKjy380C23pL3yRFpey7bKf28fh1jUm0eFxWRt PZyXu90/tzsk/fXTbaeY7p4/WMftHyJ7vPphpORRRcO3QSzKHze9V/pxU8B9A3eaf1z2Gyet VqnfuUH/T858usVBKj6cQ1OJpTgj0VCLuag4EQBVAKZfCQMAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1416809820 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This testcase(040) tries to test various corner cases with pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/040 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/040.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/040 create mode 100644 tests/generic/040.out diff --git a/tests/generic/040 b/tests/generic/040 new file mode 100644 index 0000000..df1c92f --- /dev/null +++ b/tests/generic/040 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/040 +# +# Multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/040.out b/tests/generic/040.out new file mode 100644 index 0000000..c901e10 --- /dev/null +++ b/tests/generic/040.out @@ -0,0 +1,80 @@ +QA output created by 040 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 4beb27f..9d5f72d 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -42,6 +42,7 @@ 037 metadata auto quick 038 auto quick prealloc 039 auto quick prealloc +040 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:17:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 288877F84 for ; Mon, 24 Nov 2014 00:17:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 167FF8F804B for ; Sun, 23 Nov 2014 22:17:07 -0800 (PST) X-ASG-Debug-ID: 1416809824-04cb6c05712dba00001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id du7EJEme8NlZHqWG (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:17:05 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ007YL5GGCNA0@mailout2.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:17:04 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm1.samsung.com ( [172.20.52.112]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 6A.B6.17016.06DC2745; Mon, 24 Nov 2014 15:17:04 +0900 (KST) X-AuditID: cbfee68d-f79296d000004278-32-5472cd605b25 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 9C.43.20081.F5DC2745; Mon, 24 Nov 2014 15:17:04 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ000TN5GFMMU0@mmp2.samsung.com>; Mon, 24 Nov 2014 15:17:03 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 8/10] xfstests: generic/041: Delayed allocation multi insert Date: Mon, 24 Nov 2014 15:17:03 +0900 X-ASG-Orig-Subj: [PATCH v6 8/10] xfstests: generic/041: Delayed allocation multi insert Message-id: <003101d007ae$43db3dd0$cb91b970$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrYBh9OZ4pxRDR0y7jADD+YLUvA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrHIsWRmVeSWpSXmKPExsWyRsSkQDfhbFGIwfX7PBZLJ15itthy7B6j xcx5d9gs9uw9yWJxedccNovWnp/sFov6bjE6sHucWiTh0XTmKLPH6gtbGT36tqxi9Pi8SS6A NYrLJiU1J7MstUjfLoErY21jI1PBFs2K3dPWsTQwrlXqYuTkkBAwkXhy5AAThC0mceHeerYu Ri4OIYGljBIvzpxmhym6fWImE0RiOqPExkdroar+AjnzrjJ3MXJwsAloS/zZIgrSICLgKjHv 7ndGkBpmkEkXHz9hBEkIC/hL9D9ZyAxiswioSux4cg1sNa+ApcTxWcdZIWxBiR+T77GA2MwC WhLrdx5ngrDlJTavecsMcZGCxI6zrxkhlulJHNjxlRmiRkRi34t3jBA159glvnWnQewSkPg2 +RALyJ0SArISmw5AjZGUOLjiBssERrFZSDbPQrJ5FpLNs5BsWMDIsopRNLUguaA4Kb3IUK84 Mbe4NC9dLzk/dxMjMBpP/3vWu4Px9gHrQ4wCHIxKPLwfNhaFCLEmlhVX5h5iNAW6aCKzlGhy PjDm80riDY3NjCxMTUyNjcwtzZTEeRWlfgYLCaQnlqRmp6YWpBbFF5XmpBYfYmTi4JRqYJTY wH3O9bjNn5wVk5KbCpZ5yjvtlBJLP6109OX3bM3u9jmXFhXPkxOSLe+zsS2vdNxVHXllW1X4 +7DTkpZbD9+am8Fzo2+WR1LVSfWDeUVHt17IOWAXELG3f6N2okeXUdxkzSLbPxY1W7ZI/3nb JxXmkRyXerzzx9ldjLfzd2pvdLvv/T+hQYmlOCPRUIu5qDgRAKboBD/BAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jQd2Es0UhBo9/sFgsnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBlrGxuZCrZoVuyeto6lgXGt UhcjJ4eEgInE7RMzmSBsMYkL99azdTFycQgJTGeU2PhoLZTzF8iZd5W5i5GDg01AW+LPFlGQ BhEBV4l5d78zgtQwCyxllLj4+AkjSEJYwF+i/8lCZhCbRUBVYseTa2AbeAUsJY7POs4KYQtK /Jh8jwXEZhbQkli/8zgThC0vsXnNW2aIixQkdpx9zQixTE/iwI6vzBA1IhL7XrxjnMAoMAvJ qFlIRs1CMmoWkpYFjCyrGEVTC5ILipPScw31ihNzi0vz0vWS83M3MYKj/ZnUDsaVDRaHGAU4 GJV4eD9sLAoRYk0sK67MPcQowcGsJMJ79l9hiBBvSmJlVWpRfnxRaU5q8SFGU6BPJzJLiSbn AxNRXkm8obGJmZGlkbmhhZGxuZI4742buSFCAumJJanZqakFqUUwfUwcnFINjFo8SjZfm2yP 1Wop3FyU9Xa7R9JhNc5rW7fuyH0f38z/6riFm4T9X4Ycx0MeW+87G39dUFi072NuzoSMpxaH c45wFJnditQR+fKdt0b9VcRM3rOfEnREg0oyHNa1ny6z+JGXdMkyuuzwRc4J+b//5jHY9HN6 74l5+kwvgutG1rq5976Lq76XUGIpzkg01GIuKk4EABQnOlUMAwAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1416809825 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This testcase(041) tries to test various corner cases with delayed extents and pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/041 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/041.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/041 create mode 100644 tests/generic/041.out diff --git a/tests/generic/041 b/tests/generic/041 new file mode 100644 index 0000000..abaa2f4 --- /dev/null +++ b/tests/generic/041 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/041 +# +# Delayed allocation multi insert range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for finsert range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_command "fpunch" +_require_xfs_io_command "falloc" +_require_xfs_io_command "fiemap" +_require_xfs_io_command "finsert" + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d -k falloc fpunch finsert fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/041.out b/tests/generic/041.out new file mode 100644 index 0000000..5fe3c5e --- /dev/null +++ b/tests/generic/041.out @@ -0,0 +1,80 @@ +QA output created by 041 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 9d5f72d..34e223d 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -43,6 +43,7 @@ 038 auto quick prealloc 039 auto quick prealloc 040 auto quick prealloc +041 auto quick prealloc 053 acl repair auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:17:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 49E7E7F75 for ; Mon, 24 Nov 2014 00:17:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1637630404E for ; Sun, 23 Nov 2014 22:17:21 -0800 (PST) X-ASG-Debug-ID: 1416809838-04bdf0616029ed60001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id 9M4z46A8GCKbQKIZ (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:17:19 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ00LSE5GJH990@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:17:07 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id D3.C7.18167.36DC2745; Mon, 24 Nov 2014 15:17:07 +0900 (KST) X-AuditID: cbfee690-f79ab6d0000046f7-dd-5472cd630256 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id D3.53.20081.36DC2745; Mon, 24 Nov 2014 15:17:07 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ000U55GIMMU0@mmp2.samsung.com>; Mon, 24 Nov 2014 15:17:06 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 9/10] xfstests: fsstress: Add fallocate insert range Date: Mon, 24 Nov 2014 15:17:06 +0900 X-ASG-Orig-Subj: [PATCH v6 9/10] xfstests: fsstress: Add fallocate insert range Message-id: <003201d007ae$45a8d1e0$d0fa75a0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrZ0lJ+i1goQUT7i/zI5/Uk3QJw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrHIsWRmVeSWpSXmKPExsWyRsSkRDf5bFGIQWOrhMXSiZeYLbYcu8do MXPeHTaLPXtPslhc3jWHzaK15ye7xaK+W4wO7B6nFkl4NJ05yuyx+sJWRo++LasYPT5vkgtg jeKySUnNySxLLdK3S+DK+HFoLnPBLNGKq4s6GBsYfwp0MXJySAiYSPQceMYCYYtJXLi3nq2L kYtDSGApo8Sst88YYYom74RJTGeUuN73mgXC+cso8ernNqYuRg4ONgFtiT9bREEaRARcJebd /c4IUsMMMuni4ydgk4QFPCQ2PbvPCmKzCKhKTF54mw3E5hWwlPg7axIzhC0o8WPyPbCTmAW0 JNbvPM4EYctLbF7zlhniIgWJHWdfM0Is05No7nzNBlEjIrHvxTuoqy+xS6w9GAuxS0Di2+RD LCB3SgjISmw6ADVGUuLgihssExjFZiHZPAvJ5llINs9CsmEBI8sqRtHUguSC4qT0IhO94sTc 4tK8dL3k/NxNjMBoPP3v2YQdjPcOWB9iFOBgVOLh/bCxKESINbGsuDL3EKMp0EUTmaVEk/OB MZ9XEm9obGZkYWpiamxkbmmmJM77WupnsJBAemJJanZqakFqUXxRaU5q8SFGJg5OqQZGczPG iPCTgjetz36fHLMza0e9yYRpYjbd6a9O8G00XnVml1LufttTctMitj7+MOdKab12wkvjc7G7 fJ/tPiR+wvlK95ezPPs/rK51vTf/fdOU7ZWXGldvYnNeG9d7wGvTh68XmLp/Zq5Rlfj2yf5T 8pILvm5fEr8tDK6+9DSwc5lHG5eqSP/B5UosxRmJhlrMRcWJAB689SvBAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jQd3ks0UhBrMOC1gsnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBk/Ds1lLpglWnF1UQdjA+NP gS5GTg4JAROJyTvXs0HYYhIX7oHYXBxCAtMZJa73vWaBcP4ySrz6uY2pi5GDg01AW+LPFlGQ BhEBV4l5d78zgtQwCyxllLj4+AkjSEJYwENi07P7rCA2i4CqxOSFt8E28ApYSvydNYkZwhaU +DH5HguIzSygJbF+53EmCFteYvOat8wQFylI7Dj7mhFimZ5Ec+drNogaEYl9L94xTmAUmIVk 1Cwko2YhGTULScsCRpZVjKKpBckFxUnpuYZ6xYm5xaV56XrJ+bmbGMHR/kxqB+PKBotDjAIc jEo8vB82FoUIsSaWFVfmHmKU4GBWEuE9+68wRIg3JbGyKrUoP76oNCe1+BCjKdCnE5mlRJPz gYkoryTe0NjEzMjSyNzQwsjYXEmc98bN3BAhgfTEktTs1NSC1CKYPiYOTqkGxsPSB7m/vH6p 3bP3Y9zTUzf2nrDYHcngdu6XSHP1GtvMA/vi7jkWXf8oojHPw/XLF43jbzJ+p14wmzT54Lx/ XG8jZPfs43F36eQvYWpWe+EQ0ijjf6B/yquLrqlrlt+999h+xsK6b1M3WbCL9/ndk/ydcujB PL3jSvs3lEg8iF+7//uThM2rpgspsRRnJBpqMRcVJwIAyqi04QwDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout3.samsung.com[203.254.224.33] X-Barracuda-Start-Time: 1416809839 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11966 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== This commit adds insert operation support for fsstress, which is meant to exercise fallocate FALLOC_FL_INSERT_RANGE support. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- ltp/fsstress.c | 19 ++++++++++++++++--- src/global.h | 4 ++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index b56fe5c..aa3e0c3 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -72,6 +72,7 @@ typedef enum { OP_PUNCH, OP_ZERO, OP_COLLAPSE, + OP_INSERT, OP_READ, OP_READLINK, OP_RENAME, @@ -170,6 +171,7 @@ void mknod_f(int, long); void punch_f(int, long); void zero_f(int, long); void collapse_f(int, long); +void insert_f(int, long); void read_f(int, long); void readlink_f(int, long); void rename_f(int, long); @@ -209,6 +211,7 @@ opdesc_t ops[] = { { OP_PUNCH, "punch", punch_f, 1, 1 }, { OP_ZERO, "zero", zero_f, 1, 1 }, { OP_COLLAPSE, "collapse", collapse_f, 1, 1 }, + { OP_INSERT, "insert", insert_f, 1, 1 }, { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_RENAME, "rename", rename_f, 2, 1 }, @@ -2176,6 +2179,7 @@ struct print_flags falloc_flags [] = { { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, + { FALLOC_FL_INSERT_RANGE, "INSERT_RANGE"}, { -1, NULL} }; @@ -2227,10 +2231,11 @@ do_fallocate(int opno, long r, int mode) off %= maxfsize; len = (off64_t)(random() % (1024 * 1024)); /* - * Collapse range requires off and len to be block aligned, make it - * more likely to be the case. + * Collapse/insert range requires off and len to be block aligned, + * make it more likely to be the case. */ - if ((mode & FALLOC_FL_COLLAPSE_RANGE) && (opno % 2)) { + if ((mode & (FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_INSERT_RANGE)) && + (opno % 2)) { off = ((off + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); len = ((len + stb.st_blksize - 1) & ~(stb.st_blksize - 1)); } @@ -2656,6 +2661,14 @@ collapse_f(int opno, long r) } void +insert_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, FALLOC_FL_INSERT_RANGE); +#endif +} + +void read_f(int opno, long r) { char *buf; diff --git a/src/global.h b/src/global.h index 8180f66..f63246b 100644 --- a/src/global.h +++ b/src/global.h @@ -172,6 +172,10 @@ #define FALLOC_FL_ZERO_RANGE 0x10 #endif +#ifndef FALLOC_FL_INSERT_RANGE +#define FALLOC_FL_INSERT_RANGE 0x20 +#endif + #endif /* HAVE_LINUX_FALLOC_H */ #endif /* GLOBAL_H */ -- 1.7.11-rc0 From namjae.jeon@samsung.com Mon Nov 24 00:17:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=HDRS_LCASE,T_MANY_HDRS_LCASE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7A09B7F92 for ; Mon, 24 Nov 2014 00:17:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 685428F8039 for ; Sun, 23 Nov 2014 22:17:39 -0800 (PST) X-ASG-Debug-ID: 1416809830-04cb6c05712dba20001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id 3pkNw6S5QGlzahCS (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 23 Nov 2014 22:17:11 -0800 (PST) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.25 X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFJ0076V5GM38B0@mailout2.samsung.com> for xfs@oss.sgi.com; Mon, 24 Nov 2014 15:17:10 +0900 (KST) X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] X-Barracuda-IPDD: Level2 [samsung.com/203.254.224.25] Received: from epcpsbgm1.samsung.com ( [172.20.52.114]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 36.62.19034.66DC2745; Mon, 24 Nov 2014 15:17:10 +0900 (KST) X-AuditID: cbfee691-f79b86d000004a5a-f9-5472cd666c3c Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 66.53.20081.66DC2745; Mon, 24 Nov 2014 15:17:10 +0900 (KST) Received: from DONAMJAEJEO06 ([10.88.104.63]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NFJ002RO5GLCPR0@mmp2.samsung.com>; Mon, 24 Nov 2014 15:17:09 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, linux-ext4 , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Ashish Sangwan Subject: [PATCH v6 10/10] xfstests: fsx: Add fallocate insert range operation Date: Mon, 24 Nov 2014 15:17:09 +0900 X-ASG-Orig-Subj: [PATCH v6 10/10] xfstests: fsx: Add fallocate insert range operation Message-id: <003301d007ae$47576c40$d60644c0$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdAHrbXtAwPrUjQgQEy4cykl3FBoKg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrLIsWRmVeSWpSXmKPExsWyRsSkSDftbFGIwZd+IYulEy8xW2w5do/R Yua8O2wWe/aeZLG4vGsOm0Vrz092i0V9txgd2D1OLZLwaDpzlNlj9YWtjB59W1YxenzeJBfA GsVlk5Kak1mWWqRvl8CVceHcHraCJ5oVnT3ZDYwnFLoYOTgkBEwkmjdpdjFyApliEhfurWfr YuTiEBJYyigxub+PDSJhInFhahsrRGI6o0TvpKnsEM5fRomn5+8xgUxiE9CW+LNFFKRBRMBV Yt7d74wgNcwgky4+fsIIkhAW8JV4t3MTmM0ioCrxZuIqdhCbV8BSomXffSYIW1Dix+R7LCA2 s4CWxPqdx5kgbHmJzWveMkNcpCCx4+xrRohlehLNN6czQtSISOx78Q5ssYTAJXaJTVdboJYJ SHybfIgF4mVZiU0HoOZIShxccYNlAqPYLCSrZyFZPQvJ6llIVixgZFnFKJpakFxQnJReZKpX nJhbXJqXrpecn7uJERiLp/89m7iD8f4B60OMAhyMSjy8M9YXhQixJpYVV+YeYjQFumgis5Ro cj4w4vNK4g2NzYwsTE1MjY3MLc2UxHl1pH8GCwmkJ5akZqemFqQWxReV5qQWH2Jk4uCUamDk VHtvnyCokqzxNeoqx8UrThcPalT5Fq/cf/WkHOOKF9Y1R+yF53QsMqrS2Hel+lEnl5f+Q7sy brHjNy4u+VsQpWbqwGnbrsq1RHfJRWbGsoW751i/iSqYMvf2uZe7i0T0Nx7PXpG1+mOes02h X8P/gzpe5t8uyJ+KfmDX0PP1ilFVm2MAX40SS3FGoqEWc1FxIgA6b7KqwAIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrBIsWRmVeSWpSXmKPExsVy+t9jQd20s0UhBmc/closnXiJ2WLLsXuM FjPn3WGz2LP3JIvF5V1z2Cxae36yWyzqu8XowO5xapGER9OZo8weqy9sZfTo27KK0ePzJrkA 1qgGRpuM1MSU1CKF1Lzk/JTMvHRbJe/geOd4UzMDQ11DSwtzJYW8xNxUWyUXnwBdt8wcoDOU FMoSc0qBQgGJxcVK+naYJoSGuOlawDRG6PqGBMH1GBmggYQ1jBkXzu1hK3iiWdHZk93AeEKh i5GTQ0LAROLC1DZWCFtM4sK99WxdjFwcQgLTGSV6J01lh3D+Mko8PX+PqYuRg4NNQFvizxZR kAYRAVeJeXe/M4LUMAssZZS4+PgJI0hCWMBX4t3OTWA2i4CqxJuJq9hBbF4BS4mWffeZIGxB iR+T77GA2MwCWhLrdx5ngrDlJTavecsMcZGCxI6zrxkhlulJNN+czghRIyKx78U7xgmMArOQ jJqFZNQsJKNmIWlZwMiyilE0tSC5oDgpPddQrzgxt7g0L10vOT93EyM41p9J7WBc2WBxiFGA g1GJh/fDxqIQIdbEsuLK3EOMEhzMSiK8Z/8VhgjxpiRWVqUW5ccXleakFh9iNAX6dCKzlGhy PjAN5ZXEGxqbmBlZGpkbWhgZmyuJ8964mRsiJJCeWJKanZpakFoE08fEwSnVwJi5d55U9z2J w/MPd+iU3ziTdkqum91U+MzHvae2nfDKfX+V32jTav7C0J0T36suOTRHr9Pul/BWOeddh2Wc v97O6nq297rg4itsMtdnLlG/pz3/zMurmhf3V/B4Rrtttev7/ZdVPF95h5b4Zokjj6rqf5iV fnfIOvljqUa9uq7zqYnff9eGFMkpsRRnJBpqMRcVJwIAPLdlKgsDAAA= DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Barracuda-Connect: mailout2.samsung.com[203.254.224.25] X-Barracuda-Start-Time: 1416809831 X-Barracuda-Encrypted: RC4-MD5 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- ltp/fsx.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 47d3ee8..9dc1655 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -95,7 +95,8 @@ int logcount = 0; /* total ops */ #define OP_PUNCH_HOLE 6 #define OP_ZERO_RANGE 7 #define OP_COLLAPSE_RANGE 8 -#define OP_MAX_FULL 9 +#define OP_INSERT_RANGE 9 +#define OP_MAX_FULL 10 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -145,6 +146,7 @@ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disables */ int zero_range_calls = 1; /* -z flag disables */ int collapse_range_calls = 1; /* -C flag disables */ +int insert_range_calls = 1; /* -i flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -339,6 +341,14 @@ logdump(void) lp->args[0] + lp->args[1]) prt("\t******CCCC"); break; + case OP_INSERT_RANGE: + prt("INSERT 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******CCCC"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -1012,6 +1022,59 @@ do_collapse_range(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_INSERT_RANGE +void +do_insert_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_INSERT_RANGE; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length insert range\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + if ((loff_t)offset >= file_size) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping insert range behind EOF\n"); + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, length); + return; + } + + log4(OP_INSERT_RANGE, offset, length, 0); + + if (testcalls <= simulatedopcount) + return; + + end_offset = offset + length; + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu insert\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("insert range: %x to %x\n", offset, length); + prterr("do_insert_range: fallocate"); + report_failure(161); + } + + memmove(good_buf + end_offset, good_buf + offset, + file_size - offset); + memset(good_buf + offset, '\0', length); + file_size += length; +} + +#else +void +do_insert_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1192,6 +1255,12 @@ test(void) goto out; } break; + case OP_INSERT_RANGE: + if (!insert_range_calls) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1244,6 +1313,21 @@ test(void) } do_collapse_range(offset, size); break; + case OP_INSERT_RANGE: + TRIM_OFF_LEN(offset, size, (maxfilelen - 1) - file_size); + offset = offset & ~(block_size - 1); + size = size & ~(block_size - 1); + if (size == 0) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + if (file_size + size > maxfilelen) { + log4(OP_SKIPPED, OP_INSERT_RANGE, offset, size); + goto out; + } + + do_insert_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1307,6 +1391,9 @@ usage(void) #ifdef FALLOC_FL_COLLAPSE_RANGE " -C: Do not use collapse range calls\n" #endif +#ifdef FALLOC_FL_INSERT_RANGE +" -i: Do not use insert range calls\n" +#endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ -O: use oplen (see -o flag) for every op (default random)\n\ @@ -1493,7 +1580,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzCiLN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1599,6 +1686,9 @@ main(int argc, char **argv) case 'C': collapse_range_calls = 0; break; + case 'i': + insert_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1758,6 +1848,8 @@ main(int argc, char **argv) zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); if (collapse_range_calls) collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE); + if (insert_range_calls) + insert_range_calls = test_fallocate(FALLOC_FL_INSERT_RANGE); while (numops == -1 || numops--) test(); -- 1.7.11-rc0 From BATV+a9eccae6aa98c8848127+4110+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 24 03:08:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E7D677F66 for ; Mon, 24 Nov 2014 03:08:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B8947304053 for ; Mon, 24 Nov 2014 01:07:57 -0800 (PST) X-ASG-Debug-ID: 1416820076-04bdf0615f2e1ed0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id eCLaUDGU5EYlMIq3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Nov 2014 01:07:56 -0800 (PST) X-Barracuda-Envelope-From: BATV+a9eccae6aa98c8848127+4110+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xspch-0002W8-BP; Mon, 24 Nov 2014 09:07:55 +0000 Date: Mon, 24 Nov 2014 01:07:55 -0800 From: Christoph Hellwig To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH-v2 0/5] add support for a lazytime mount option Message-ID: <20141124090755.GA28534@infradead.org> X-ASG-Orig-Subj: Re: [PATCH-v2 0/5] add support for a lazytime mount option References: <1416675267-2191-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416675267-2191-1-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1416820076 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11972 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS What's the test coverage for this? xfstest generic/192 tests that atime is persisted over remounts, which we had a bug with when XFS used to have a lazy atime implementation somewhat similar to the proposal. We should have something similar for c/mtime as well. Also a test to ensure timestamps are persisted afer a fsync, although right now I can't imagine how to do that genericly as no other filesystem seems to have an equivaent to XFS_IOC_GOINGDOWN. It seems you also handle i_version updates lazily. although that's not mentioned anywhere. I actually have a clarification request out on the IETF NFSv4 list about the persistance requirements for the change counter but I've not seen an answer to it yet. From tytso@thunk.org Mon Nov 24 05:57:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C898F7F69 for ; Mon, 24 Nov 2014 05:57:45 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A3F58F8037 for ; Mon, 24 Nov 2014 03:57:42 -0800 (PST) X-ASG-Debug-ID: 1416830259-04bdf0615f2f92b0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id U23wJaji4KxkaTzA (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 03:57:40 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=6upFyz5IME+6r1+IekErpQexQj5LFq+staH6b6YaWs4=; b=SByhyVhSo0HQAYLSP6hZoo0vcxNu2x8/NXlyLVPmXsubAsHp8OHXbb4oEW/XoyUB//PFcKRpN3WeDaiH8zF1KM13LPhQHfsIbaxdIgCEl9LROXmcPst1AcOnSgBUau3fKDrA9oc2Qyqo2fNTqWCx5Bllii7t22sZUmayJRwVK14=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XssGm-0005py-D8; Mon, 24 Nov 2014 11:57:28 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id DCFAC58018F; Mon, 24 Nov 2014 06:57:27 -0500 (EST) Date: Mon, 24 Nov 2014 06:57:27 -0500 From: Theodore Ts'o To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH-v2 0/5] add support for a lazytime mount option Message-ID: <20141124115727.GA19918@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v2 0/5] add support for a lazytime mount option References: <1416675267-2191-1-git-send-email-tytso@mit.edu> <20141124090755.GA28534@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124090755.GA28534@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416830260 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Nov 24, 2014 at 01:07:55AM -0800, Christoph Hellwig wrote: > What's the test coverage for this? xfstest generic/192 tests that > atime is persisted over remounts, which we had a bug with when XFS > used to have a lazy atime implementation somewhat similar to the > proposal. > > We should have something similar for c/mtime as well. Also a test to > ensure timestamps are persisted afer a fsync, although right now I can't > imagine how to do that genericly as no other filesystem seems to have > an equivaent to XFS_IOC_GOINGDOWN. generic/003 will show up problems if there are any [acm]time persistences across remounts, so we have it already. An earlier (buggy) version of this patch actually tripped generic/003, so I can attest that it works. As far as testing to make sure timestamps are persisted after an fsync, we should be able to do something genericly using dm_flaky, I would imagine. We'll need to suppress this in some circumstances where we know that the file system doesn't have a journal enabled (and thus has no such guarantees) but I have that issue today with the various dm_flaky tests, and what I would probably suggest doing is putting all of the dm_flaky tests in a separate xfstests group, so that when I test file system configurations in nojournal mode, I can suppress all of the dm_flakey tests very easily. > It seems you also handle i_version updates lazily. although that's > not mentioned anywhere. I actually have a clarification request out on > the IETF NFSv4 list about the persistance requirements for the change > counter but I've not seen an answer to it yet. If we want to be paranoid, we handle i_version updates non-lazily; I can see arguments in favor of that. Ext4 only enables MS_I_VERSION if the user asks for it explicitly, so it wouldn't cause me any problems. However, xfs and btrfs enables it by default, so that means xfs and btrfs wouldn't see the benefits of lazytime (if you're going to have to push I_VERSION to disk, you might as well update the [acm]time while you're at it). I've always thought that we *should* do is to only enable it if nfsv4 is serving the file system, and not otherwise, though, which would also give us consistency across all the file systems. What do folks think? - Ted From linux@rasmusvillemoes.dk Mon Nov 24 06:27:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 523397F6B for ; Mon, 24 Nov 2014 06:27:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2EDFAC003 for ; Mon, 24 Nov 2014 04:27:25 -0800 (PST) X-ASG-Debug-ID: 1416832042-04bdf061612ff9d0001-NocioJ Received: from mail-lb0-f176.google.com (mail-lb0-f176.google.com [209.85.217.176]) by cuda.sgi.com with ESMTP id kbGheNEFMmyao68Y (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 04:27:23 -0800 (PST) X-Barracuda-Envelope-From: linux@rasmusvillemoes.dk X-Barracuda-Apparent-Source-IP: 209.85.217.176 Received: by mail-lb0-f176.google.com with SMTP id p9so6133449lbv.21 for ; Mon, 24 Nov 2014 04:27:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rasmusvillemoes.dk; s=google; h=from:to:cc:subject:organization:references:date:in-reply-to :message-id:user-agent:mime-version:content-type; bh=bH05vdaYW5T6/s0oAGHXLccM9dyxRJVXyQ0YIQl6PLA=; b=QAIdqT290ysNJf8VEWlxd/EMXIFL+ZSdTh+FOJ3B7esewXcFsRfEvDlFt2toVMcn09 D8vvwCEm5yu2lirQFvxTBQ3mDFHxe4VGiiuW6uHC88ZNTGrm5iAPHYl834CjKyd9xaqQ YLNsxLyGU6Q+trcLi1eLbxMxHYarPnYNCifg8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:organization:references:date :in-reply-to:message-id:user-agent:mime-version:content-type; bh=bH05vdaYW5T6/s0oAGHXLccM9dyxRJVXyQ0YIQl6PLA=; b=O//o7SCHtdpk3Lmg2w+PgRTd2THy5vNxEMRJ4kRvQqE4GPN0FM/3hmxfroqaa0KLq+ 8PI1ecA9Ro9kqN048f04IykR2sTD+w3ZStLCPQ0HXdHA2ejHwuq5xYv73cJMdJPEjHBk e/G3mlkNQ6tLRAgyG0ZK/2XWBLhnpBUiOJacXBaO7Pu0HXpwq1rt9nYqcz5lfwU8IeSd D0FTU0cAgea6x7EOlaOCBMi8TLUKg8xv6DrLgoo8VbOwpfkWDyvIb7zZFAwAXeTuMVLN JBspqZSDQkndLoAT6YYEkwK6vyjldAldnTCXq9M00/YUvRbdNNpAif4qbdaR+0Gpkv9M P5Ig== X-Gm-Message-State: ALoCoQlyga20l4fRLgzSLMMQpj8aezkaMRLkuJnFEwvsCc5vjPKueDObgYHkKn3CC5kipAs1VwhW X-Received: by 10.112.73.102 with SMTP id k6mr7134276lbv.75.1416832042240; Mon, 24 Nov 2014 04:27:22 -0800 (PST) Received: from morgan.rasmusvillemoes.dk ([130.225.20.51]) by mx.google.com with ESMTPSA id 10sm343215lao.0.2014.11.24.04.27.21 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 24 Nov 2014 04:27:21 -0800 (PST) From: Rasmus Villemoes To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH-v2 3/5] vfs: don't let the dirty time inodes get more than a day stale Organization: D03 X-ASG-Orig-Subj: Re: [PATCH-v2 3/5] vfs: don't let the dirty time inodes get more than a day stale References: <1416675267-2191-1-git-send-email-tytso@mit.edu> <1416675267-2191-4-git-send-email-tytso@mit.edu> X-Hashcash: 1:20:141124:xfs@oss.sgi.com::kGnF5jz8OcAt71x1:002MuB X-Hashcash: 1:20:141124:tytso@mit.edu::ThyrKR8V1iimPEtt:00004XAB X-Hashcash: 1:20:141124:linux-fsdevel@vger.kernel.org::R3bxMQadq2MFUFE3:0000000000000000000000000000000049mY X-Hashcash: 1:20:141124:linux-btrfs@vger.kernel.org::YIwWGwEwjVn5LSZj:00000000000000000000000000000000008ve+ X-Hashcash: 1:20:141124:linux-ext4@vger.kernel.org::zWdpEa4JMdrDypm/:00000000000000000000000000000000000CMmz Date: Mon, 24 Nov 2014 13:27:21 +0100 In-Reply-To: <1416675267-2191-4-git-send-email-tytso@mit.edu> (Theodore Ts'o's message of "Sat, 22 Nov 2014 11:54:25 -0500") Message-ID: <87egss3hsm.fsf@rasmusvillemoes.dk> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Barracuda-Connect: mail-lb0-f176.google.com[209.85.217.176] X-Barracuda-Start-Time: 1416832043 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11978 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sat, Nov 22 2014, Theodore Ts'o wrote: > Guarantee that the on-disk timestamps will be no more than 24 hours > stale. > > static int update_time(struct inode *inode, struct timespec *time, int flags) > { > + unsigned short days_since_boot = jiffies / (HZ * 86400); > int ret; > This seems to wrap every 49 days (assuming 32 bit jiffies and HZ==1000), so on-disk updates can be delayed indefinitely, assuming just the right delays between writes. > if (inode->i_op->update_time) { > @@ -1527,14 +1528,27 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) > if (flags & S_MTIME) > inode->i_mtime = *time; > } > - if (inode->i_sb->s_flags & MS_LAZYTIME) { > + /* > + * If i_ts_dirty_day is zero, then either we have not deferred > + * timestamp updates, or the system has been up for less than > + * a day (so days_since_boot is zero), so we defer timestamp > + * updates in that case and set the I_DIRTY_TIME flag. If a > + * day or more has passed, then i_ts_dirty_day will be > + * different from days_since_boot, and then we should update > + * the on-disk inode and then we can clear i_ts_dirty_day. > + */ AFAICT days_since_boot is not actually 0 immediately after boot due to #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ)) On 32 bit platforms, days_since_boot will be 0 shortly after, while on 64 bit it will always be >= 49. Not exactly sure how this affects the above logic. Would it make sense to introduce days_since_boot as a global variable and avoid these issues? This would presumably also make update_time a few cycles faster (avoiding a division-by-constant), but not sure if that's important. And something of course needs to update days_since_boot, but that should be doable. Rasmus From BATV+a9eccae6aa98c8848127+4110+infradead.org+hch@bombadil.srs.infradead.org Mon Nov 24 09:21:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 893807F6D for ; Mon, 24 Nov 2014 09:21:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7870930407F for ; Mon, 24 Nov 2014 07:21:04 -0800 (PST) X-ASG-Debug-ID: 1416842462-04cb6c0570347bd0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id eWaLYP5vR0nxIktL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Nov 2014 07:21:03 -0800 (PST) X-Barracuda-Envelope-From: BATV+a9eccae6aa98c8848127+4110+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XsvRl-0005oK-Fo; Mon, 24 Nov 2014 15:21:01 +0000 Date: Mon, 24 Nov 2014 07:21:01 -0800 From: Christoph Hellwig To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141124152101.GA12575@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416599964-21892-2-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1416842463 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 21, 2014 at 02:59:21PM -0500, Theodore Ts'o wrote: > We needed to preserve update_time() because btrfs wants to have a > special btrfs_root_readonly() check; otherwise we could drop the > update_time() inode operation entirely. Can't btrfs just set the immutable flag on every inode that is read when the root has the BTRFS_ROOT_SUBVOL_RDONLY flag? That would cut down the places that need this check to the ioctl path so that we prevent users from clearling the immutable flag. From tytso@thunk.org Mon Nov 24 09:57:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EEABF7F72 for ; Mon, 24 Nov 2014 09:57:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE80130407E for ; Mon, 24 Nov 2014 07:57:30 -0800 (PST) X-ASG-Debug-ID: 1416844648-04bdf0615f31fa80001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id RIgJqOXitk3qG0oD (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 07:57:29 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=wEqZ+rB4Q0pk9UbwBfmbbp8qHjVOAUcisxLa/Eixbbs=; b=GC0cdBhEnJ52wUPezjVNUWDUHFDfcZD8Kg21oaszfvcjTgy64eca/Dydkyo+YSWVhzY0X6CePraCSFIeYkuNnI9Pr0PrXDJaxVLAEUEbAVa6NLEcV6nEVm4Ye7tyRZ8nzjCTJbzJvuwE7qKDZLe7P3jmI7tMlEp9aN+DK9ovWrI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xsw0w-0007oB-9T; Mon, 24 Nov 2014 15:57:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5AD225801CD; Mon, 24 Nov 2014 10:56:58 -0500 (EST) Date: Mon, 24 Nov 2014 10:56:58 -0500 From: Theodore Ts'o To: Christoph Hellwig Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141124155658.GA31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <20141124152101.GA12575@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124152101.GA12575@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416844648 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Nov 24, 2014 at 07:21:01AM -0800, Christoph Hellwig wrote: > On Fri, Nov 21, 2014 at 02:59:21PM -0500, Theodore Ts'o wrote: > > We needed to preserve update_time() because btrfs wants to have a > > special btrfs_root_readonly() check; otherwise we could drop the > > update_time() inode operation entirely. > > Can't btrfs just set the immutable flag on every inode that is read > when the root has the BTRFS_ROOT_SUBVOL_RDONLY flag? That would > cut down the places that need this check to the ioctl path so that > we prevent users from clearling the immutable flag. Sounds like a good plan to me, although I'm not sure I understand how BTRFS_ROOT_SUBVOL_RDONLY flag works, since I would have thought there are all sorts of places in the VFS layer where it is currently checking MS_RDONLY and MNT_READONLY and _not_ checking BTRFS_ROOT_SUBVOL_RDONLY isn't causing other problems. But unless there's something more subtle going on, it would seem to me that setting the immutable flag on each inode would be a better way to go in any case. - Ted From dsterba@suse.cz Mon Nov 24 10:38:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 130B07F66 for ; Mon, 24 Nov 2014 10:38:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01523304032 for ; Mon, 24 Nov 2014 08:38:31 -0800 (PST) X-ASG-Debug-ID: 1416847109-04cb6c0573350170001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id CnTe4z3fXFCaXhir (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Nov 2014 08:38:30 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C0643ACDE; Mon, 24 Nov 2014 16:38:29 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 4CEC5DA93F; Mon, 24 Nov 2014 17:38:30 +0100 (CET) Date: Mon, 24 Nov 2014 17:38:30 +0100 From: David Sterba To: Theodore Ts'o Cc: Chris Mason , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141124163830.GA26471@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Theodore Ts'o , Chris Mason , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <1416600528.24312.10@mail.thefacebook.com> <20141121214245.GG7112@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141121214245.GG7112@thunk.org> User-Agent: Mutt/1.5.23.1-rc1 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416847110 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11983 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 21, 2014 at 04:42:45PM -0500, Theodore Ts'o wrote: > Out of curiosity, why does btrfs_update_time() need to call > btrfs_root_readonly()? Why can't it just depend on the > __mnt_want_write() call in touch_atime()? mnt_want_write looks only at the mountpoint flags, the readonly subvolume status is external to that. > Surely if there are times when it's not OK to write into a btrfs file > system and mnt_is_readonly() returns false, the VFS is going to get > very confused abyway. > > If the btrfs_update_time() is not necessary, then we could drop > btrfs_update_time() and update_time() from the inode operations > entirely, and depend on the VFS-level code in update_time(). It is necessary and the whole .update_time callback was added intentionally, see commits c3b2da314834499f34cba94f7053e55f6d6f92d8 fs: introduce inode operation ->update_time e41f941a23115e84a8550b3d901a13a14b2edc2f Btrfs: move over to use ->update_time 2bc5565286121d2a77ccd728eb3484dff2035b58 Btrfs: don't update atime on RO subvolumes From tytso@thunk.org Mon Nov 24 11:18:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 503D67F69 for ; Mon, 24 Nov 2014 11:18:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E1BC0AC006 for ; Mon, 24 Nov 2014 09:18:27 -0800 (PST) X-ASG-Debug-ID: 1416849503-04bdf061603272a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 5j1fwPvhgCGWYncu (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 09:18:24 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=sKieOi904OntYwG9TX2fzgjAkRmhc0ntwr9KxxWjGR0=; b=Uh7DVmz3BTggvKAA8h92UgI5ahpbJaVRzaH62sAkKMFQfSCcA8aVIeUiNfqXmI27mOoz3Kv6b98KTd6Ku+UtNIQ6m0cPy4++u5AIVu+dJG64SX21prCqa8lLGlY8FSwS4Uq2rEy06gjRqDFgvF6Dbx6ketgVbbMQDmcIsqqBvbQ=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsxHK-000085-HF; Mon, 24 Nov 2014 17:18:22 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C20735801CD; Mon, 24 Nov 2014 12:10:54 -0500 (EST) Date: Mon, 24 Nov 2014 12:10:54 -0500 From: Theodore Ts'o To: Rasmus Villemoes Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH-v2 3/5] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141124171054.GB31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v2 3/5] vfs: don't let the dirty time inodes get more than a day stale References: <1416675267-2191-1-git-send-email-tytso@mit.edu> <1416675267-2191-4-git-send-email-tytso@mit.edu> <87egss3hsm.fsf@rasmusvillemoes.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87egss3hsm.fsf@rasmusvillemoes.dk> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416849504 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11984 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Nov 24, 2014 at 01:27:21PM +0100, Rasmus Villemoes wrote: > On Sat, Nov 22 2014, Theodore Ts'o wrote: > > > Guarantee that the on-disk timestamps will be no more than 24 hours > > stale. > > > > + unsigned short days_since_boot = jiffies / (HZ * 86400); > > This seems to wrap every 49 days (assuming 32 bit jiffies and HZ==1000), > so on-disk updates can be delayed indefinitely, assuming just the right > delays between writes. Good point, I'll fix this. > Would it make sense to introduce days_since_boot as a global variable > and avoid these issues? This would presumably also make update_time a > few cycles faster (avoiding a division-by-constant), but not sure if > that's important. And something of course needs to update > days_since_boot, but that should be doable. I can do this fairly simply like this: get_monotonic_boottime(&uptime); daycode = uptime.tv_sec / (HZ * 86400); and we only need to do this if lazytime is set, and the inode isn't marked as I_DIRTY_TIME: if ((inode->i_sb->s_flags & MS_LAZYTIME) && !(flags & S_VERSION)) { if (inode->i_state & I_DIRTY_TIME) return 0; get_monotonic_boottime(&uptime); daycode = do_div64(uptime.tv_sec do_div, (HZ * 86400)); if (!inode->i_ts_dirty_day || inode->i_ts_dirty_day == daycode) { spin_lock(&inode->i_lock); inode->i_state |= I_DIRTY_TIME; spin_unlock(&inode->i_lock); inode->i_ts_dirty_day = daycode; return 0; } } So I'm not entirely sure it's worth it to create a global variable for days since boot; I've been runnin with this patch in my laptop, we wouldn't be triggering the get_monotonic_bootime() function all that often. (Since once the dirty_time flg is set, we don't need to check about whether we need to set it again.) And if we *did* care, it would be simple enough to use a static counter which only recalculates daycode every 30 or 60 minutes. Cheers, - Ted From tytso@thunk.org Mon Nov 24 11:22:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03E007F75 for ; Mon, 24 Nov 2014 11:22:23 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D7D6F304053 for ; Mon, 24 Nov 2014 09:22:19 -0800 (PST) X-ASG-Debug-ID: 1416849738-04cb6c0570353330001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id zn9xMZP7cFHlSNqX (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 09:22:18 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:To:From:Date; bh=gxqpshWIt5Hsqw2C4lA4wUadqs/028f73IaMgzrRnmI=; b=oBg90FCBGnxNdkzZaIJpA4TmKHigDu3Tx2f/Mmp0VtVfkP4Iuznq7EShrkQGHc1z7duTY9vT3L777kAp2jOA88fQS+jd0QxEOejP8jkS0/NxO31RDahkMFItRBV6BG8a82Rp7ODKhIcApPvUHOZnP7cjPEf2lz+88zqQbEF8MVU=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XsxL6-00009I-Ux; Mon, 24 Nov 2014 17:22:17 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id EEBE458018B; Mon, 24 Nov 2014 12:22:16 -0500 (EST) Date: Mon, 24 Nov 2014 12:22:16 -0500 From: Theodore Ts'o To: dsterba@suse.cz, Chris Mason , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141124172216.GC31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <1416600528.24312.10@mail.thefacebook.com> <20141121214245.GG7112@thunk.org> <20141124163830.GA26471@twin.jikos.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124163830.GA26471@twin.jikos.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416849738 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11985 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Nov 24, 2014 at 05:38:30PM +0100, David Sterba wrote: > > It is necessary and the whole .update_time callback was added > intentionally, see commits > > c3b2da314834499f34cba94f7053e55f6d6f92d8 > fs: introduce inode operation ->update_time > > e41f941a23115e84a8550b3d901a13a14b2edc2f > Btrfs: move over to use ->update_time Being able to signal an error if the time update fails is still possible even if we drop update_time(), because the new write_time() function will return an error. > 2bc5565286121d2a77ccd728eb3484dff2035b58 > Btrfs: don't update atime on RO subvolumes Yes, but this doesn't answer my question about other places where the VFS is only checking MS_RDONLY and MNT_READONLY besides just update_atime(). Maybe we should be exposing an "is_readonly(inode)" inode operations function to address this? - Ted From dsterba@suse.cz Mon Nov 24 11:34:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 509717F6B for ; Mon, 24 Nov 2014 11:34:33 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D3519AC001 for ; Mon, 24 Nov 2014 09:34:32 -0800 (PST) X-ASG-Debug-ID: 1416850470-04cb6c057035a900001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id OsG6g5c3zatObCw0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Nov 2014 09:34:30 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id D31AEACDE; Mon, 24 Nov 2014 17:34:29 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 87882DA93F; Mon, 24 Nov 2014 18:34:30 +0100 (CET) Date: Mon, 24 Nov 2014 18:34:30 +0100 From: David Sterba To: Christoph Hellwig Cc: Theodore Ts'o , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141124173430.GB26471@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Christoph Hellwig , Theodore Ts'o , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <20141124152101.GA12575@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124152101.GA12575@infradead.org> User-Agent: Mutt/1.5.23.1-rc1 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416850470 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11985 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 07:21:01AM -0800, Christoph Hellwig wrote: > On Fri, Nov 21, 2014 at 02:59:21PM -0500, Theodore Ts'o wrote: > > We needed to preserve update_time() because btrfs wants to have a > > special btrfs_root_readonly() check; otherwise we could drop the > > update_time() inode operation entirely. > > Can't btrfs just set the immutable flag on every inode that is read > when the root has the BTRFS_ROOT_SUBVOL_RDONLY flag? This would lead to change in return code from EROFS to EPERM/EACCESS for all syscalls that do not pass through permissions() callback. Also, now each file from a readonly subvol will show the 'i' attribute and there's now way to determine if the file had had the 'i' attribute before it was snapshotted. > That would > cut down the places that need this check to the ioctl path so that > we prevent users from clearling the immutable flag. This means that even the root or capable user are not able to clear the flag. Even though the extra btrfs_root_readonly checks are not all great, the number of surprises that the immutable bit could bring is IMO not great either. These callbacks that now implement the extra check: - update_time - setattr - setflags (ioctl) - setxattr - removexattr The btrfs_root_readonly checks in setxattr and removexattr are unnecessary because they're done through xattr_permisssion. I'll send a patch to remove them. 'setflags' is an ioctl and all the checks have to be done there. The generic permission() callback cannot be used here because it would fail to clear eg. the immutable flag. 'setattr' does limited permission checks (IMMUTABLE and APPEND), nothing that calls to the filesystem directly or indirectly. The remaining one is 'update_time'. I'm not sure if the amount of work the switch to IMUUTABLE bit would need is justified, compared to this one instance of extra btrfs_root_readonly test. As the VFS layer has no notion of subvolume it's not able to determine the RO/RW status without asking the filesystem anyway. From webmaster@srv5.proxmarket.com Mon Nov 24 11:52:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 219D47F5A for ; Mon, 24 Nov 2014 11:52:09 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F34558F804B for ; Mon, 24 Nov 2014 09:52:08 -0800 (PST) X-ASG-Debug-ID: 1416851522-04cbb01e5936a300001-NocioJ Received: from srv5.proxmarket.com (srv5.proxmarket.com [185.31.162.85]) by cuda.sgi.com with ESMTP id fiKxmnVDRoF7kPdH (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 09:52:05 -0800 (PST) X-Barracuda-Envelope-From: webmaster@srv5.proxmarket.com X-Barracuda-Apparent-Source-IP: 185.31.162.85 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=srv5.proxmarket.com; s=dkim; h=Content-Type:MIME-Version:Date:From:Message-ID:Subject:To; bh=lMDdxXS3yQdfkKX2xcejWemSTPkLbSMhnciaAMFfcNE=; b=PUWVCIrc+W6AhjpyQQxCkJN1jPsgmcZFqIUQryNCde3MrARn/ZKPJv/8wJBAD9JbsvYYbPsFwGgxd5K0+6Qteg+/1mPPDmojpiyesuaxSMfWRwX6YG5ADVmBEx4daTn+klibjosWvaibh4Ju4XqoKwn9re48y9HmVwmTRBVk8hU=; Received: from puxas by srv5.proxmarket.com with local (Exim 4.80) (envelope-from ) id 1XsxnU-0004rf-8P; Mon, 24 Nov 2014 20:51:38 +0300 To: , , , , , , , , , , , , , , Subject: =?windows-1251?B?0OXg6/zt4P8g4u7n7O7m7e7x8vwg5+Dw4OHu?= =?windows-1251?B?8uDy/CAkMTIzNSDn4CDk5e38?= X-PHP-Originating-Script: 500:rumail.php X-ASG-Orig-Subj: =?windows-1251?B?0OXg6/zt4P8g4u7n7O7m7e7x8vwg5+Dw4OHu?= =?windows-1251?B?8uDy/CAkMTIzNSDn4CDk5e38?= Message-ID: <3F3A8CDFD4002E9D41440DB541AB420A@ojrzciqsz> From: =?windows-1251?B?zODq8SDV6OPj5fA=?= Date: Mon, 24 Nov 2014 17:51:32 +0000 Organization: BinBot MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_04DB_01D0080F.4813C050" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157 X-Barracuda-Connect: srv5.proxmarket.com[185.31.162.85] X-Barracuda-Start-Time: 1416851524 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_04DB_01D0080F.4813C050 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C7=E4=F0=E0=E2=F1=F2=E2=F3=E9=F2=E5, =C2=FB =ED=E5 =F5=F3=E6=E5 =EC=E5=ED=FF =E7=ED=E0=E5=F2=E5, =F7=F2=EE =D1= =E5=F2=FC =EA=E8=F8=E8=F2 =F0=E5=EA=EB=E0=EC=EE=E9 =EF=F0=EE=E3=F0=E0=EC=EC= =E8 =F1=F2=F0=E0=F2=E5=E3=E8=E9, =EA=EE=F2=EE=F0=FB=E5 =FF=EA=EE=E1=FB =EF= =F0=E8=ED=E5=F1=F3=F2 =E2=E0=EC =EA=F3=F7=F3 =E4=E5=ED=E5=E3 =E7=E0 =E4=E5= =ED=FC-=E4=F0=F3=E3=EE=E9. =D0=E0=E7=F3=EC=E5=E5=F2=F1=FF, =E1=EE=EB=FC=F8=E0=FF =E8=F5 =F7=E0=F1=F2= =FC =E2 =EB=F3=F7=F8=E5=EC =F1=EB=F3=F7=E0=E5 =E1=E5=F1=EF=EE=EB=E5=E7=ED= =E0... =C8=E7=F3=F7=E8=E2 =EE=E3=F0=EE=EC=ED=EE=E5 =EA=EE=EB=E8=F7=E5=F1=F2=E2=EE= =F0=E0=E7=ED=EE=EE=E1=F0=E0=E7=ED=FB=F5 =F1=E8=F1=F2=E5=EC =E7=E0=F0=E0=E1= =EE=F2=EA=E0, =E2 =EA=EE=ED=F6=E5 =EA=EE=ED=F6=EE=E2 =FF =ED=E0=F8=E5=EB = =CE=C4=CD=D3, =EA=EE=F2=EE=F0=E0=FF =E2 =F1=E0=EC=EE=EC =E4=E5=EB=E5 =D0=C0= =C1=CE=D2=C0=C5=D2 . http://dimension-invest.ru =C4=F3=EC=E0=FE, =E2=E0=EC =EE=ED=E0 =EF=F0=E8=E3=EE=E4=E8=F2=F1=FF. =D3=F1=EF=E5=F5=EE=E2! =CC=E0=EA=F1 ------=_NextPart_000_04DB_01D0080F.4813C050 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C7=E4=F0=E0=E2=F1=F2=E2=F3=E9=F2=E5,
 
=C2=FB =ED=E5 =F5=F3=E6=E5 =EC=E5=ED=FF =E7=ED=E0=E5=F2=E5, =F7=F2=EE= =D1=E5=F2=FC =EA=E8=F8=E8=F2 =F0=E5=EA=EB=E0=EC=EE=E9 =EF=F0=EE=E3=F0=E0= =EC=EC =E8 =F1=F2=F0=E0=F2=E5=E3=E8=E9,=20 =EA=EE=F2=EE=F0=FB=E5 =FF=EA=EE=E1=FB =EF=F0=E8=ED=E5=F1=F3=F2 =E2=E0=EC = =EA=F3=F7=F3 =E4=E5=ED=E5=E3 =E7=E0 =E4=E5=ED=FC-=E4=F0=F3=E3=EE=E9.
 
=D0=E0=E7=F3=EC=E5=E5=F2=F1=FF, =E1=EE=EB=FC=F8=E0=FF =E8=F5 =F7=E0=F1= =F2=FC =E2 =EB=F3=F7=F8=E5=EC =F1=EB=F3=F7=E0=E5 =E1=E5=F1=EF=EE=EB=E5=E7= =ED=E0...
 
=C8=E7=F3=F7=E8=E2 =EE=E3=F0=EE=EC=ED=EE=E5 =EA=EE=EB=E8=F7=E5=F1=F2= =E2=EE =F0=E0=E7=ED=EE=EE=E1=F0=E0=E7=ED=FB=F5 =F1=E8=F1=F2=E5=EC =E7=E0=F0= =E0=E1=EE=F2=EA=E0, =E2 =EA=EE=ED=F6=E5 =EA=EE=ED=F6=EE=E2 =FF=20 =ED=E0=F8=E5=EB =CE=C4=CD=D3, =EA=EE=F2=EE=F0=E0=FF =E2 =F1=E0=EC=EE=EC =E4= =E5=EB=E5 =D0=C0=C1=CE=D2=C0=C5=D2 .
 
 
=C4=F3=EC=E0=FE, =E2=E0=EC =EE=ED=E0 =EF=F0=E8=E3=EE=E4=E8=F2=F1=FF.=
 
=D3=F1=EF=E5=F5=EE=E2!
=CC=E0=EA=F1
------=_NextPart_000_04DB_01D0080F.4813C050-- From dsterba@suse.cz Mon Nov 24 12:09:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D20917F60 for ; Mon, 24 Nov 2014 12:09:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0888304066 for ; Mon, 24 Nov 2014 10:09:52 -0800 (PST) X-ASG-Debug-ID: 1416852590-04cbb01e5c36b280001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id BIE7ytGivRCsEeJO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Nov 2014 10:09:51 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C6606AC24; Mon, 24 Nov 2014 18:09:50 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 434E5DA93F; Mon, 24 Nov 2014 19:09:51 +0100 (CET) Date: Mon, 24 Nov 2014 19:09:51 +0100 From: David Sterba To: Theodore Ts'o Cc: dsterba@suse.cz, Chris Mason , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141124180951.GD26471@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Theodore Ts'o , Chris Mason , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <1416600528.24312.10@mail.thefacebook.com> <20141121214245.GG7112@thunk.org> <20141124163830.GA26471@twin.jikos.cz> <20141124172216.GC31339@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124172216.GC31339@thunk.org> User-Agent: Mutt/1.5.23.1-rc1 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416852591 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11987 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 12:22:16PM -0500, Theodore Ts'o wrote: > On Mon, Nov 24, 2014 at 05:38:30PM +0100, David Sterba wrote: > > > > It is necessary and the whole .update_time callback was added > > intentionally, see commits > > > > c3b2da314834499f34cba94f7053e55f6d6f92d8 > > fs: introduce inode operation ->update_time > > > > e41f941a23115e84a8550b3d901a13a14b2edc2f > > Btrfs: move over to use ->update_time > > Being able to signal an error if the time update fails is still > possible even if we drop update_time(), because the new write_time() > function will return an error. Fine, means your change does not break the current status. I was providing the more complete list of related commits. > > 2bc5565286121d2a77ccd728eb3484dff2035b58 > > Btrfs: don't update atime on RO subvolumes > > Yes, but this doesn't answer my question about other places where the > VFS is only checking MS_RDONLY and MNT_READONLY besides just > update_atime(). Maybe we should be exposing an "is_readonly(inode)" > inode operations function to address this? Yes, if this is a lightweight check then it'd would allow to remove the filesystem-specific checks. From treestem@gmail.com Mon Nov 24 13:06:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6BFD07F88 for ; Mon, 24 Nov 2014 13:06:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D3868F8050 for ; Mon, 24 Nov 2014 11:06:27 -0800 (PST) X-ASG-Debug-ID: 1416855985-04cbb01e5b380eb0001-NocioJ Received: from mail-qg0-f46.google.com (mail-qg0-f46.google.com [209.85.192.46]) by cuda.sgi.com with ESMTP id OaqhSp6FZClsHEnI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 11:06:26 -0800 (PST) X-Barracuda-Envelope-From: treestem@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.46] Received: by mail-qg0-f46.google.com with SMTP id z107so5649026qgd.33 for ; Mon, 24 Nov 2014 11:06:25 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=to30t8OZr/QwuwaHfr+0RbvByOZzOOEyum3FzRWtj2g=; b=KfaAslnuFJrmVXMWMsnShAgIOisXHfQV7UU4OhrURJJn2VPwMwDdBW6hxMpLqj2zzh S0DfZNIA3s0WhnItMzJ87nk1Airbe603iq08TXjXCmrCaMdMkfoEui6dfxo1wkFJcm58 uslE/QLmm7h1XOn0mPGdV3Qh26W9W9aGzKHOVUvSpUFgKAmnl6HzWXS/HbqvwOGXw02h sLOLj4g1hsK15FenGltWp7yiOZo1pcQCr4Ih4t8BTfxXTRjylNxFMTDdS8oDvoDiMUfX aKOg7XV2q7tTnRLlUdgmFQdd+SL/ukXLKdyW3E+M5fcoNuJcR4VXDVXHl2obzawjpoPX 3GIw== X-Received: by 10.224.92.81 with SMTP id q17mr31063336qam.66.1416855980151; Mon, 24 Nov 2014 11:06:20 -0800 (PST) Received: from bb64-50.eng.local ([69.84.133.248]) by mx.google.com with ESMTPSA id g12sm1509214qay.44.2014.11.24.11.06.19 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 24 Nov 2014 11:06:19 -0800 (PST) From: Peter Watkins To: xfs@oss.sgi.com Cc: Peter Watkins Subject: [PATCH] xfs: overflow in xfs_iomap_eof_align_last_fsb Date: Mon, 24 Nov 2014 14:06:13 -0500 X-ASG-Orig-Subj: [PATCH] xfs: overflow in xfs_iomap_eof_align_last_fsb Message-Id: <1416855973-6359-1-git-send-email-treestem@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-qg0-f46.google.com[209.85.192.46] X-Barracuda-Start-Time: 1416855986 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11989 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Someone else may have run into this already, if not please take a look. Peter If extsize is set and new_last_fsb is larger than 32 bits, the roundup to extsize will overflow the align variable. Instead, combine alignments by rounding extsize hint up to stripe size. Signed-off-by: Peter Watkins Reviewed-by: Nathaniel W. Turner --- fs/xfs/xfs_iomap.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index afcf3c9..0c4abfe 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -52,7 +52,7 @@ xfs_iomap_eof_align_last_fsb( xfs_extlen_t extsize, xfs_fileoff_t *last_fsb) { - xfs_fileoff_t new_last_fsb = 0; + xfs_fileoff_t new_last_fsb; xfs_extlen_t align = 0; int eof, error; @@ -70,23 +70,24 @@ xfs_iomap_eof_align_last_fsb( else if (mp->m_dalign) align = mp->m_dalign; - if (align && XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, align)) - new_last_fsb = roundup_64(*last_fsb, align); + if (align && XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, align)) + align = 0; } /* - * Always round up the allocation request to an extent boundary - * (when file on a real-time subvolume or has di_extsize hint). + * Round up the allocation request to an extent boundary. If + * already aligned to a stripe, round extsize up to a stripe + * boundary. */ if (extsize) { - if (new_last_fsb) - align = roundup_64(new_last_fsb, extsize); + if (align) + align = roundup_64(extsize, align); else align = extsize; - new_last_fsb = roundup_64(*last_fsb, align); } - if (new_last_fsb) { + if (align) { + new_last_fsb = roundup_64(*last_fsb, align); error = xfs_bmap_eof(ip, new_last_fsb, XFS_DATA_FORK, &eof); if (error) return error; -- 1.7.9.5 From bfields@fieldses.org Mon Nov 24 16:13:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 595D57F4E for ; Mon, 24 Nov 2014 16:13:58 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB4DCAC009 for ; Mon, 24 Nov 2014 14:13:54 -0800 (PST) X-ASG-Debug-ID: 1416867107-04bdf0615e36c540001-NocioJ Received: from fieldses.org (fieldses.org [174.143.236.118]) by cuda.sgi.com with ESMTP id M4h0i0Ji4zONsUqg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Nov 2014 14:11:47 -0800 (PST) X-Barracuda-Envelope-From: bfields@fieldses.org X-Barracuda-Apparent-Source-IP: 174.143.236.118 Received: from bfields by fieldses.org with local (Exim 4.76) (envelope-from ) id 1Xt1rF-0006j9-GQ; Mon, 24 Nov 2014 17:11:45 -0500 Date: Mon, 24 Nov 2014 17:11:45 -0500 To: Theodore Ts'o Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH-v2 0/5] add support for a lazytime mount option Message-ID: <20141124221145.GB24003@fieldses.org> X-ASG-Orig-Subj: Re: [PATCH-v2 0/5] add support for a lazytime mount option References: <1416675267-2191-1-git-send-email-tytso@mit.edu> <20141124090755.GA28534@infradead.org> <20141124115727.GA19918@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124115727.GA19918@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) From: "J. Bruce Fields" X-Barracuda-Connect: fieldses.org[174.143.236.118] X-Barracuda-Start-Time: 1416867107 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.11996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 06:57:27AM -0500, Theodore Ts'o wrote: > If we want to be paranoid, we handle i_version updates non-lazily; I > can see arguments in favor of that. > > Ext4 only enables MS_I_VERSION if the user asks for it explicitly, so > it wouldn't cause me any problems. However, xfs and btrfs enables it > by default, so that means xfs and btrfs wouldn't see the benefits of > lazytime (if you're going to have to push I_VERSION to disk, you might > as well update the [acm]time while you're at it). I've always thought > that we *should* do is to only enable it if nfsv4 is serving the file > system, and not otherwise, though, which would also give us > consistency across all the file systems. I guess you need to worry about the case where you shutdown nfsd, modify a file, then restart nfsd--you don't want a client to miss the modification in that case. --b. From bounces@absolu-wood.com Mon Nov 24 18:02:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 12E057F4E for ; Mon, 24 Nov 2014 18:02:20 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6E96304062 for ; Mon, 24 Nov 2014 16:02:16 -0800 (PST) X-ASG-Debug-ID: 1416873731-04cb6c05723ea3a0001-NocioJ Received: from fr326.leads-marketing.fr (fr326.absolu-wood.com [5.39.53.126]) by cuda.sgi.com with ESMTP id 5OQGV9H0JDb1IfPp for ; Mon, 24 Nov 2014 16:02:11 -0800 (PST) X-Barracuda-Envelope-From: bounces@absolu-wood.com X-Barracuda-Apparent-Source-IP: 5.39.53.126 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=k3; d=absolu-wood.com; h=To:Subject:Message-ID:Date:From:Reply-To:MIME-Version:List-Unsubscribe:Content-Type:Content-Transfer-Encoding; i=lucie@absolu-wood.com; bh=0e30ijxeJDYZ/3GxBXtovoeN7lA=; b=Qgchb7Q7kBXM7z2IPLN8SeH1YfOBEDzGzpyQsiyltryzB+pDlGJbGxXqfge6vE2vUWMlTRa2IpR/ nGZrzYNlVRAzUcbtUdxoTV4qXXXrdIqUsO1tY8HOx7/nKI66ymPpXIRvKvSkF4aPDtgyVsJxubNO jmQb25HaBxKzPnMaJsg= Received: by fr326.leads-marketing.fr for ; Tue, 25 Nov 2014 01:02:54 +0100 (envelope-from ) To: xfs@oss.sgi.com Subject: =?UTF-8?B?Q2FkZWF1eCBkZSBmaW4gZCdhbm7DqWU=?= Message-ID: <167072c44bf27b63fc385f1b7c08a0ec@app.absolu-wood.com> X-ASG-Orig-Subj: =?UTF-8?B?Q2FkZWF1eCBkZSBmaW4gZCdhbm7DqWU=?= Date: Tue, 25 Nov 2014 00:03:56 +0000 From: "Absolu WooD" Reply-To: lucie@absolu-wood.com MIME-Version: 1.0 X-Mailer-LID: 3 List-Unsubscribe: X-Mailer-RecptId: 3960673 X-Mailer-SID: 604 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_5e0c395fc965d5b10f37dae57448fc71" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: fr326.absolu-wood.com[5.39.53.126] X-Barracuda-Start-Time: 1416873731 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.31 X-Barracuda-Spam-Status: No, SCORE=0.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12001 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different --b1_5e0c395fc965d5b10f37dae57448fc71 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Your email client cannot read this email. To view it online, please go here: http://app.absolu-wood.com/display.php?M=3960673&C=50e8450ffa8ed6817a0f2fd6bc54433a&S=604&L=3&N=110 To stop receiving these emails:http://app.absolu-wood.com/unsubscribe.php?M=3960673&C=50e8450ffa8ed6817a0f2fd6bc54433a&L=3&N=604 --b1_5e0c395fc965d5b10f37dae57448fc71 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Absolu Wood - Communiquez avec le bois !
  logo.png   Communication par l'objet
&
papeterie bois
 
Absolu Wood - Le Bruel - 48230 ESCLANEDES - 09.72.44.69.41
 
 
post--it.png

Carnet Post'It couverture en bois véritable

Pour une communication 100 % naturelle !

  • Dimension 155 x 80 mm
  • Couverture en bois de cerisier ou d'érable.
  • Carnet original et élégant, vous permettant de toujours avoir à portée de mains de quoi noter un message.
  • 4 blocs de 50 notes repositionnables.
  • Personnsalisation du support bois par gravure laser.
bouton.png
 

A partir de 4,21 € H.T

Communiquez avec le bois !

Absolu Wood propose une gamme d’objets originaux et esthétiques réalisés en bois.  Résolument engagée  dans une démarche de développement durable, Absolu Wood travaille en étroite collaboration avec une entreprise adaptée pour la fabrication de ses produits. En savoir plus

slide-2-1.png
--b1_5e0c395fc965d5b10f37dae57448fc71-- From longqin@mail.chinaums.com Mon Nov 24 18:26:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 90C807F4E for ; Mon, 24 Nov 2014 18:26:52 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7DCAF304067 for ; Mon, 24 Nov 2014 16:26:50 -0800 (PST) X-ASG-Debug-ID: 1416875206-04cbb01e5a3da500001-NocioJ Received: from mail.chinaums.com (mail.chinaums.com [116.228.21.166]) by cuda.sgi.com with ESMTP id 3uPMK8oWE0n4TSOf for ; Mon, 24 Nov 2014 16:26:47 -0800 (PST) X-Barracuda-Envelope-From: longqin@mail.chinaums.com X-Barracuda-Apparent-Source-IP: 116.228.21.166 Received: from 58.221.58.13 (EHLO kcuejthii) ([58.221.58.13]) by mail.chinaums.com (MOS 4.3.5-GA FastPath queued) with ESMTP id AJA74851 (AUTH longqin); Tue, 25 Nov 2014 05:08:42 +0800 (CST) Message-ID: <20141125050858715207@chinaums.com> From: To: Subject: Date: Tue, 25 Nov 2014 05:08:44 +0800 X-ASG-Orig-Subj: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0CB1_01ADFF33.1A5E5080" X-Priority: 5 X-mailer: Utkb 9 X-Mira-CT-PreScan: COMMTOUCHD\r\nScore: 4 / 0\r\nRef-id: str=0001.0A150206.54739E5A.0096,ss=1,re=0.000,recu=0.000,reip=0.000,pt=F_32766219,cl=4,cld=1,fgs=0\r\nIP: 0.0.0.0\r\nVirus: 0\r\nIWF: false\r\nEX_OK\r\n X-Barracuda-Connect: mail.chinaums.com[116.228.21.166] X-Barracuda-Start-Time: 1416875206 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.90 X-Barracuda-Spam-Status: No, SCORE=1.90 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_FONT_FACE_BAD, HTML_MESSAGE, MISSING_SUBJECT, MISSING_SUBJECT_2, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12002 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header This is a multi-part message in MIME format. ------=_NextPart_000_0CB1_01ADFF33.1A5E5080 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 5Ye65ZSu5bel44CB5Yac44CB5bu644CB6YKu44CB5Lit44CB5oub5ZWG44CB5rCR55Sf6ZO26KGM 5Y2hDQrlkKvvvJrouqvku73or4HjgIHpk7booYzljaHjgIHnvZHpk7bnm77jgIHnu5HlrprmiYvm nLrljaENCuS4gOaJi+WNoea6kCzpm7bkuqTmmJPorrDlvZUNCg0KIOacieaEj+iAhSDor7fliqBR IDExMzA2MzI0MyAg5oiW6Ie055S1MTUwMDIwOTkwODkgICDkvZXnu4/nkIYNCg0KDQrvvIzogIzl hbbmupDmgLvnlLHmsLTmsJTkvKTlv4PmiYDoh7Q= ------=_NextPart_000_0CB1_01ADFF33.1A5E5080 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0 Zi04IiBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZT4NCjxNRVRBIG5hbWU9R0VORVJBVE9SIGNvbnRl bnQ9Ik1TSFRNTCA4LjAwLjYwMDEuMjM1MDciPjwvSEVBRD4NCjxCT0RZPg0KPERJVj4NCjxESVYg aWQ9bWFpbENvbnRlbnRDb250YWluZXIgY2xhc3M9InFtYm94IHFtX2Nvbl9ib2R5X2NvbnRlbnQi PjxGT05UIGNvbG9yPXJlZCANCnNpemU9NCBmYWNlPealt+S9kz4NCjxESVY+DQo8RElWPjwhLS1T dGFydEZyYWdtZW50IC0tPg0KPERJVj7lh7rllK7lt6XjgIHlhpzjgIHlu7rjgIHpgq7jgIHkuK3j gIHmi5vllYbjgIHmsJHnlJ/pk7booYzljaE8QlI+5ZCr77ya6Lqr5Lu96K+B44CB6ZO26KGM5Y2h 44CB572R6ZO255u+44CB57uR5a6a5omL5py65Y2hPEJSPuS4gOaJi+WNoea6kCzpm7bkuqTmmJPo rrDlvZU8QlI+PC9ESVY+DQo8RElWPiZuYnNwO+acieaEj+iAhSZuYnNwO+ivt+WKoFEgMTEzMDYz MjQzJm5ic3A7Jm5ic3A75oiW6Ie055S1MTUwMDIwOTkwODkmbmJzcDsmbmJzcDsgDQrkvZXnu4/n kIY8L0RJVj4NCjxESVY+Jm5ic3A7PC9ESVY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJVj48Rk9O VCANCmNvbG9yPXdoaXRlPu+8jOiAjOWFtua6kOaAu+eUseawtOawlOS8pOW/g+aJgOiHtDwvRk9O VD48L0RJVj48L0RJVj48L0RJVj48L0ZPTlQ+PC9ESVY+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_000_0CB1_01ADFF33.1A5E5080-- From tytso@thunk.org Mon Nov 24 18:32:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 962A97F51 for ; Mon, 24 Nov 2014 18:32:31 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 14CE8AC002 for ; Mon, 24 Nov 2014 16:32:30 -0800 (PST) X-ASG-Debug-ID: 1416875549-04cbb01e5c3db0a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 7hV1tkmXU8zqKJmp (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 16:32:29 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=BtpuIarwk3h/dNMnb7OnOCpJ+XgJDP0gqjn2ka36GeU=; b=ZjZJ6YPoZPVp4S1vvx6jMUXxzLtmeKhLtTvnDTR7/ovWEFm2//7BqIgLhZOfOZ/Df6El/UtN0NJ2tjrEQBUhEEYg5SPIiuzdy4pphcZG3VPZwUXH/6gRT2VUzkXN4FGwGJg0Lm8Xr3SA9Oi8pNAgSMbqELqzby/xHyHuCC1M844=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt43F-0003cu-EQ; Tue, 25 Nov 2014 00:32:17 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id CC0175801CD; Mon, 24 Nov 2014 19:32:15 -0500 (EST) Date: Mon, 24 Nov 2014 19:32:15 -0500 From: Theodore Ts'o To: "J. Bruce Fields" Cc: Christoph Hellwig , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH-v2 0/5] add support for a lazytime mount option Message-ID: <20141125003215.GD31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v2 0/5] add support for a lazytime mount option References: <1416675267-2191-1-git-send-email-tytso@mit.edu> <20141124090755.GA28534@infradead.org> <20141124115727.GA19918@thunk.org> <20141124221145.GB24003@fieldses.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124221145.GB24003@fieldses.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416875549 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12002 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Nov 24, 2014 at 05:11:45PM -0500, J. Bruce Fields wrote: > On Mon, Nov 24, 2014 at 06:57:27AM -0500, Theodore Ts'o wrote: > > If we want to be paranoid, we handle i_version updates non-lazily; I > > can see arguments in favor of that. > > > > Ext4 only enables MS_I_VERSION if the user asks for it explicitly, so > > it wouldn't cause me any problems. However, xfs and btrfs enables it > > by default, so that means xfs and btrfs wouldn't see the benefits of > > lazytime (if you're going to have to push I_VERSION to disk, you might > > as well update the [acm]time while you're at it). I've always thought > > that we *should* do is to only enable it if nfsv4 is serving the file > > system, and not otherwise, though, which would also give us > > consistency across all the file systems. > > I guess you need to worry about the case where you shutdown nfsd, modify > a file, then restart nfsd--you don't want a client to miss the > modification in that case. Hmmm, is there a way we can determine whether the file system is being exported via nfsv4 is running, without using MS_I_VERSION? Maybe a new flag? We could just disable lazytime if nfsd is running but otherwise always increment i_version if lazytime is enabled. My main concern with i_version updates was not the in-memry update of i_version, but rather the unnecessary extra metadata write "tax" that would be inflicted on all users, including the many that aren't serving files via NFSv4. That way, if you shutdown the nfsv4 server, i_version would still be updated, but we wouldn't be forcing the writes to disk, but then when nfs v4 server is updated again, the i_version tax would be paid again. - Ted From david@fromorbit.com Mon Nov 24 19:52:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AA09A7F51 for ; Mon, 24 Nov 2014 19:52:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6CE838F8035 for ; Mon, 24 Nov 2014 17:52:45 -0800 (PST) X-ASG-Debug-ID: 1416880362-04bdf061613a72b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fOOHgY0Rr39OjSfB for ; Mon, 24 Nov 2014 17:52:43 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtUhAE/gc1R5LEkvPGdsb2JhbABbDoJ4gSmCNYQErlgBAQEBAQEGlTOFJAICAQECgQ8XAQEBAQEGAQEBATg7hAIBAQEDAScTHCMFCwgDGAklDwUlAwcaE4g3CNBrAQEBAQEFAQEBAR4Yhh6JYGQHgy6BHwEEhS4CmUmBNYNYlUhUMzCBBoFEAQEB Received: from ppp121-44-73-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.73.47]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Nov 2014 12:22:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xt5J1-0005oI-Ja; Tue, 25 Nov 2014 12:52:39 +1100 Date: Tue, 25 Nov 2014 12:52:39 +1100 From: Dave Chinner To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125015239.GD27262@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416599964-21892-3-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1416880362 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 21, 2014 at 02:59:22PM -0500, Theodore Ts'o wrote: > Add a new mount option which enables a new "lazytime" mode. This mode > causes atime, mtime, and ctime updates to only be made to the > in-memory version of the inode. The on-disk times will only get > updated when (a) if the inode needs to be updated for some non-time > related change, (b) if userspace calls fsync(), syncfs() or sync(), or > (c) just before an undeleted inode is evicted from memory. > > This is OK according to POSIX because there are no guarantees after a > crash unless userspace explicitly requests via a fsync(2) call. > > For workloads which feature a large number of random write to a > preallocated file, the lazytime mount option significantly reduces > writes to the inode table. The repeated 4k writes to a single block > will result in undesirable stress on flash devices and SMR disk > drives. Even on conventional HDD's, the repeated writes to the inode > table block will trigger Adjacent Track Interference (ATI) remediation > latencies, which very negatively impact 99.9 percentile latencies --- > which is a very big deal for web serving tiers (for example). > > Google-Bug-Id: 18297052 > > Signed-off-by: Theodore Ts'o > --- > fs/fs-writeback.c | 38 +++++++++++++++++++++++++++++++++++++- > fs/inode.c | 18 ++++++++++++++++++ > fs/proc_namespace.c | 1 + > fs/sync.c | 7 +++++++ > include/linux/fs.h | 1 + > include/uapi/linux/fs.h | 1 + > 6 files changed, 65 insertions(+), 1 deletion(-) > > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c > index ef9bef1..ce7de22 100644 > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -483,7 +483,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) > if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) > inode->i_state &= ~I_DIRTY_PAGES; > dirty = inode->i_state & I_DIRTY; > - inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); > + inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_TIME); > spin_unlock(&inode->i_lock); > /* Don't write the inode if only I_DIRTY_PAGES was set */ > if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { > @@ -1277,6 +1277,41 @@ static void wait_sb_inodes(struct super_block *sb) > iput(old_inode); > } > > +/* > + * This works like wait_sb_inodes(), but it is called *before* we kick > + * the bdi so the inodes can get written out. > + */ > +static void flush_sb_dirty_time(struct super_block *sb) > +{ > + struct inode *inode, *old_inode = NULL; > + > + WARN_ON(!rwsem_is_locked(&sb->s_umount)); > + spin_lock(&inode_sb_list_lock); > + list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { > + int dirty_time; > + > + spin_lock(&inode->i_lock); > + if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { > + spin_unlock(&inode->i_lock); > + continue; > + } > + dirty_time = inode->i_state & I_DIRTY_TIME; > + __iget(inode); > + spin_unlock(&inode->i_lock); > + spin_unlock(&inode_sb_list_lock); > + > + iput(old_inode); > + old_inode = inode; > + > + if (dirty_time) > + mark_inode_dirty(inode); > + cond_resched(); > + spin_lock(&inode_sb_list_lock); > + } > + spin_unlock(&inode_sb_list_lock); > + iput(old_inode); > +} This just seems wrong to me, not to mention extremely expensive when we have millions of cached inodes on the superblock. Why can't we just add a function like mark_inode_dirty_time() which puts the inode on the dirty inode list with a writeback time 24 hours in the future rather than 30s in the future? > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -534,6 +534,18 @@ static void evict(struct inode *inode) > BUG_ON(!(inode->i_state & I_FREEING)); > BUG_ON(!list_empty(&inode->i_lru)); > > + if (inode->i_nlink && inode->i_state & I_DIRTY_TIME) { > + if (inode->i_op->write_time) > + inode->i_op->write_time(inode); > + else if (inode->i_sb->s_op->write_inode) { > + struct writeback_control wbc = { > + .sync_mode = WB_SYNC_NONE, > + }; > + mark_inode_dirty(inode); > + inode->i_sb->s_op->write_inode(inode, &wbc); > + } > + } > + Eviction is too late for this. I'm pretty sure that it won't get this far as iput_final() should catch the I_DIRTY_TIME in the !drop case via write_inode_now(). > int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) > { > + struct inode *inode = file->f_mapping->host; > + > if (!file->f_op->fsync) > return -EINVAL; > + if (!datasync && inode->i_state & I_DIRTY_TIME) { FWIW, I'm surprised gcc isn't throwing warnings about that. Please make sure there isn't any ambiguity in the code by writing those checks like this: if (!datasync && (inode->i_state & I_DIRTY_TIME)) { > + spin_lock(&inode->i_lock); > + inode->i_state |= I_DIRTY_SYNC; > + spin_unlock(&inode->i_lock); > + } > return file->f_op->fsync(file, start, end, datasync); When we mark the inode I_DIRTY_TIME, we should also be marking it I_DIRTY_SYNC so that all the sync operations know that they should be writing this inode. That's partly why I also think these inodes should be tracked on the dirty inode list.... > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 3633239..489b2f2 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -1721,6 +1721,7 @@ struct super_operations { > #define __I_DIO_WAKEUP 9 > #define I_DIO_WAKEUP (1 << I_DIO_WAKEUP) > #define I_LINKABLE (1 << 10) > +#define I_DIRTY_TIME (1 << 11) > > #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) Shouldn't I_DIRTY also include I_DIRTY_TIME now? -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Nov 24 19:53:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 581667F51 for ; Mon, 24 Nov 2014 19:53:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E98F0AC002 for ; Mon, 24 Nov 2014 17:53:34 -0800 (PST) X-ASG-Debug-ID: 1416880413-04bdf061603a73a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XZGMjOwPDZklB3IH for ; Mon, 24 Nov 2014 17:53:33 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtMhAE/gc1R5LEkvPGdsb2JhbABbDoJ4gSmCNYQErlgBAQEBAQEGlTOFJAICAQECgQ8XAQEBAQEGAQEBATg7hAMBAQQ6HCMQCAMYCSUPBSUDBxoTiD/QawEBAQcCAR8Yhh6KRAeDLoEfAQSeeZpVVDMwgkoBAQE Received: from ppp121-44-73-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.73.47]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Nov 2014 12:23:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xt5Js-0005oX-5j; Tue, 25 Nov 2014 12:53:32 +1100 Date: Tue, 25 Nov 2014 12:53:32 +1100 From: Dave Chinner To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141125015332.GE27262@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416599964-21892-4-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1416880413 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Nov 21, 2014 at 02:59:23PM -0500, Theodore Ts'o wrote: > Guarantee that the on-disk timestamps will be no more than 24 hours > stale. > > Signed-off-by: Theodore Ts'o If we put these inodes on the dirty inode list with at writeback time of 24 hours, this is completely unnecessary. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Mon Nov 24 22:33:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 195BC7F50 for ; Mon, 24 Nov 2014 22:33:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D98CAC004 for ; Mon, 24 Nov 2014 20:33:41 -0800 (PST) X-ASG-Debug-ID: 1416890019-04cbb01e5c3f6a80001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id I7uv5RLasboFq5fB (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 20:33:39 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=4sUmkVe++wKJu02wN7LsZxT5lGk6DPteLIGqvfJ8mp4=; b=emE86HQhhMENkAaCKLnEkCHg/tsbfA3BXQwiZdgc+qKWZkIe+uy92AL5vubZ1BbUdSsrFkQ7NfEsIK99jcvolXYeN+Dvwi51n57itgw2utdpTek2Sf0D4hNIUaawBzOz6T5N4Ush4sAYuWkvl7ZPTzwrVYeGqGwQQXdUQ4r8bE8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt7om-0005Ig-Ey; Tue, 25 Nov 2014 04:33:36 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 6F3B75801CD; Mon, 24 Nov 2014 23:33:35 -0500 (EST) Date: Mon, 24 Nov 2014 23:33:35 -0500 From: Theodore Ts'o To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125043335.GF31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125015239.GD27262@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416890019 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12011 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 25, 2014 at 12:52:39PM +1100, Dave Chinner wrote: > > +static void flush_sb_dirty_time(struct super_block *sb) > > +{ ... > > +} > > This just seems wrong to me, not to mention extremely expensive when we have > millions of cached inodes on the superblock. #1, It only gets called on a sync(2) or syncfs(2), which can be pretty expensive as it is, so I didn't really worry about it. #2, We're already iterating over all of the inodes in the sync(2) or syncfs(2) path, so the code path in question is already O(N) in the number of inodes. > Why can't we just add a function like mark_inode_dirty_time() which > puts the inode on the dirty inode list with a writeback time 24 > hours in the future rather than 30s in the future? I was concerned about putting them on the dirty inode list because it would be extra inodes for the writeback threads would have to skip over and ignore (since they would not be dirty in the inde or data pages sense). Another solution would be to use a separate linked list for dirtytime inodes, but that means adding some extra fields to the inode structure, which some might view as bloat. Given #1 and #2 above, yes, we're doubling the CPU cost for sync(2) and syncfs(2), since we're not iterating over all of the inodes twice, but I believe that is a better trade-off than bloating the inode structure with an extra set of linked lists or increasing the CPU cost to the writeback path (which gets executed way more often than the sync or syncfs paths). > Eviction is too late for this. I'm pretty sure that it won't get > this far as iput_final() should catch the I_DIRTY_TIME in the !drop > case via write_inode_now(). Actually, the tracepoint for fs_lazytime_evict() does get triggered from time to time; but only when the inode is evicted due to memory pressure, i.e., via the evict_inodes() path. I thought about possibly doing this in iput_final(), but that would mean that whenever we closed the last fd on the file, we would push the inode out to disk. For files that we are writing, that's not so bad; but if we enable strictatime with lazytime, then we would be updating the atime for inodes that had been only been read on every close --- which in the case of say, all of the files in the kernel tree, would be a little unfortunate. Of course, the combination of strict atime and lazytime would result in a pretty heavy write load on a umount or sync(2), so I suspect keeping the relatime mode would make sense for most people, but I for those people who need strict Posix compliance, it seemed like doing something that worked well for strictatime plus lazytime would be a good thing, which is why I tried to defer things as much as possible. > if (!datasync && (inode->i_state & I_DIRTY_TIME)) { > > > + spin_lock(&inode->i_lock); > > + inode->i_state |= I_DIRTY_SYNC; > > + spin_unlock(&inode->i_lock); > > + } > > return file->f_op->fsync(file, start, end, datasync); > > When we mark the inode I_DIRTY_TIME, we should also be marking it > I_DIRTY_SYNC so that all the sync operations know that they should > be writing this inode. That's partly why I also think these inodes > should be tracked on the dirty inode list.... The whole point of what I was doing is that I_DIRTY_TIME was not part of I_DIRTY, and that when in update_time() we set I_DIRTY_TIME instead of I_DIRTY_SYNC. The goal is that these inodes would not end up on the dirty list, because that way they wouldn't be forced out to disk until either (a) the inode is written out for other reasons (i.e., a change in i_size or i_blocks, etc.), (b) the inode is explicitly fsync'ed, or (c) the the umount(2), sync(2), or syncfs(2) of the file system. That way, the timestamps are in the memory copy inode, but *not* written on disk until they are opportunistically written out due to some other modification of the inode which sets I_DIRTY_SYNC. If we were to set I_DIRTY_SYNC alongside I_DIRTY_TIME, and put these inodes on the dirty inode list, then I_DIRTY_TIME would effectively be a no-op, and there would be no point to this whole exercise. It may be that lazytime will never be the default, because it is so different from what we are currently doing. But I think it is worth doing, even if it is an optional mount option which is only used under special circumstances. For myself, we will be using it in Google and I will be using it on my laptop because it definitely reduces the write load to the SSD. This I've measured it via the tracepoints. If there is significant objections to doing this in the VFS layer, I'm happy to go back to doing this as in ext4-specific code. There were a few bits that were a bit more dodgy, and I can't make sync(2) and syncfs(2) flush the dirty timestamps if I do it as an ext4-specific hack, but for my use cases, I don't really care about those things. The main reason why I redid this patch set as a VFS specific change was because Cristoph and others specifically requested it. But if you strongly object, I can always go back to doing this in the ext4 code.... Cheers, - Ted From tytso@thunk.org Mon Nov 24 22:45:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 867E47F50 for ; Mon, 24 Nov 2014 22:45:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 661EF8F8035 for ; Mon, 24 Nov 2014 20:45:15 -0800 (PST) X-ASG-Debug-ID: 1416890713-04bdf0615e3c4be0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id aEKlWSALWtwfpngx (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 20:45:13 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=SkO8X9pzctBAoyWQaGxRi3XrMLT2lSX8WyvfJWDC9Bs=; b=nwFrFCUmUBFqfEDWZZCjh1ZhHEer4XFgrMNlkqRKGNtj1+7ca9OFST82pmv9UsNl4qxUKnnqRd+FPlGANhKBWq63Q6I/3EmV+uagb5uZSJ68Qn7sxD+hk+CgMz7r7oP7BkjeX8K7h5QuHsOjX6OyoQd4c8lzgWXB0haF0r35pm4=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt7zw-0005KE-T2; Tue, 25 Nov 2014 04:45:08 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 357245801CD; Mon, 24 Nov 2014 23:45:08 -0500 (EST) Date: Mon, 24 Nov 2014 23:45:08 -0500 From: Theodore Ts'o To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141125044508.GG31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> <20141125015332.GE27262@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125015332.GE27262@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416890713 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12011 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 25, 2014 at 12:53:32PM +1100, Dave Chinner wrote: > On Fri, Nov 21, 2014 at 02:59:23PM -0500, Theodore Ts'o wrote: > > Guarantee that the on-disk timestamps will be no more than 24 hours > > stale. > > > > Signed-off-by: Theodore Ts'o > > If we put these inodes on the dirty inode list with at writeback > time of 24 hours, this is completely unnecessary. What do you mean by "a writeback time of 24 hours"? Do you mean creating a new field in the inode which specifies when the writeback should happen? I still worry about the dirty inode list getting somewhat long large in the strictatime && lazytime case, and the inode bloat nazi's coming after us for adding a new field to struct inode structure. Or do you mean trying to abuse the dirtied_when field in some way? - Ted From tytso@thunk.org Mon Nov 24 23:34:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E93A67F51 for ; Mon, 24 Nov 2014 23:34:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C973B304032 for ; Mon, 24 Nov 2014 21:34:50 -0800 (PST) X-ASG-Debug-ID: 1416893689-04cb6c05714116a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id JQIFr0ZSuAfejd1s (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:49 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=Message-Id:Date:Subject:Cc:To:From; bh=GdKJLfzY8KjSpmxjKzMcdqx+G6HPHLmi7GKGuO0IO1c=; b=LKih/cRZof5Jd3tqZpDr2Vwx7mmnsw9fNGxLi06O09XE6/OaWoz/lGmIkIZU+vKRSZzDyPIcDgFAecv0wV3kXO1sXzW4eN52LFU0n58r+R115tuY4wEkvtQpOSfDB4QOkjfWtjNCiAob8l/Lg8EDpGWpx4jaQqrbfqZpNb2ni+s=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8lz-0005eX-Vz; Tue, 25 Nov 2014 05:34:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 50D965801CD; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 0/6] add support for a lazytime mount option Date: Tue, 25 Nov 2014 00:34:28 -0500 X-ASG-Orig-Subj: [PATCH-v3 0/6] add support for a lazytime mount option Message-Id: <1416893674-419-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893689 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is an updated version of what had originally been an ext4-specific patch which significantly improves performance by lazily writing timestamp updates (and in particular, mtime updates) to disk. The in-memory timestamps are always correct, but they are only written to disk when required for correctness. This provides a huge performance boost for ext4 due to how it handles journalling, but it's valuable for all file systems running on flash storage or drive-managed SMR disks by reducing the metadata write load. So upon request, I've moved the functionality to the VFS layer. Once the /sbin/mount program adds support for MS_LAZYTIME, all file systems should be able to benefit from this optimization. There is still an ext4-specific optimization, which may be applicable for other file systems which store more than one inode in a block, but it will require file system specific code. It is purely optional, however. Please note the changes to update_time() and the new write_time() inode operations functions, which impact btrfs and xfs. The changes are fairly simple, but I would appreciate confirmation from the btrfs and xfs teams that I got things right. Thanks!! Any objections to my carrying these patches in the ext4 git tree? Changes since -v2: - If update_time() updates i_version, it will not use lazytime (i..e, the inode will be marked dirty so the change will be persisted on to disk sooner rather than later). Yes, this eliminates the benefits of lazytime if the user is experting the file system via NFSv4. Sad, but NFS's requirements seem to mandate this. - Fix time wrapping bug 49 days after the system boots (on a system with a 32-bit jiffies). Use get_monotonic_boottime() instead. - Clean up type warning in include/tracing/ext4.h - Added explicit parenthesis for stylistic reasons - Added an is_readonly() inode operations method so btrfs doesn't have to duplicate code in update_time(). Changes since -v1: - Added explanatory comments in update_time() regarding i_ts_dirty_days - Fix type used for days_since_boot - Improve SMP scalability in update_time and ext4_update_other_inodes_time - Added tracepoints to help test and characterize how often and under what circumstances inodes have their timestamps lazily updated Theodore Ts'o (6): fs: split update_time() into update_time() and write_time() vfs: add support for a lazytime mount option vfs: don't let the dirty time inodes get more than a day stale vfs: add lazytime tracepoints for better debugging ext4: add support for a lazytime mount option btrfs: add an is_readonly() so btrfs can use common code for update_time() Documentation/filesystems/Locking | 2 + fs/btrfs/inode.c | 34 +++++++-------- fs/ext4/inode.c | 48 +++++++++++++++++++-- fs/ext4/super.c | 9 ++++ fs/fs-writeback.c | 42 +++++++++++++++++- fs/inode.c | 91 ++++++++++++++++++++++++++++++++++++++- fs/proc_namespace.c | 1 + fs/sync.c | 7 +++ fs/xfs/xfs_iops.c | 39 +++++++---------- include/linux/fs.h | 7 ++- include/trace/events/ext4.h | 30 +++++++++++++ include/uapi/linux/fs.h | 1 + 12 files changed, 262 insertions(+), 49 deletions(-) -- 2.1.0 From tytso@thunk.org Mon Nov 24 23:34:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E6C4F7F51 for ; Mon, 24 Nov 2014 23:34:51 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5BE98F804B for ; Mon, 24 Nov 2014 21:34:51 -0800 (PST) X-ASG-Debug-ID: 1416893688-04cbb01e5b3fd040001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id lH8KniS2zno08ZMu (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:48 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=XRpkP0DU55YrK1stKgYI3ZcuoG6SXSuTIncy48oYgQg=; b=lOoOTT0oIKIbuIW/My0xFjwEJEy0j3A8rli+3dfHD2MtnS7bYpJoCFcCRBtqHkeNhBTUlEpyZSfY+f+PMx4j1RofEdP8JRmAkFfdlk87fO3/Y6CTrPBBCoP0pA0rMCzokpp7U8xPbGJYAFLJD79Fv4K6+tbsP48b+3bbtMm75Nw=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8lz-0005eb-W9; Tue, 25 Nov 2014 05:34:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5385A58011B; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 1/6] fs: split update_time() into update_time() and write_time() Date: Tue, 25 Nov 2014 00:34:29 -0500 X-ASG-Orig-Subj: [PATCH-v3 1/6] fs: split update_time() into update_time() and write_time() Message-Id: <1416893674-419-2-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416893674-419-1-git-send-email-tytso@mit.edu> References: <1416893674-419-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893688 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature In preparation for adding support for the lazytime mount option, we need to be able to separate out the update_time() and write_time() inode operations. Currently, only btrfs and xfs uses update_time(). We needed to preserve update_time() because btrfs wants to have a special btrfs_root_readonly() check; otherwise we could drop the update_time() inode operation entirely. Signed-off-by: Theodore Ts'o Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org --- Documentation/filesystems/Locking | 2 ++ fs/btrfs/inode.c | 10 ++++++++++ fs/inode.c | 29 ++++++++++++++++++----------- fs/xfs/xfs_iops.c | 39 ++++++++++++++++----------------------- include/linux/fs.h | 1 + 5 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index b30753c..e49861d 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -63,6 +63,7 @@ prototypes: int (*removexattr) (struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); void (*update_time)(struct inode *, struct timespec *, int); + void (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); @@ -95,6 +96,7 @@ listxattr: no removexattr: yes fiemap: no update_time: no +write_time: no atomic_open: yes tmpfile: no dentry_open: no diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d23362f..a5e0d0d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5574,6 +5574,11 @@ static int btrfs_update_time(struct inode *inode, struct timespec *now, inode->i_mtime = *now; if (flags & S_ATIME) inode->i_atime = *now; + return 0; +} + +static int btrfs_write_time(struct inode *inode) +{ return btrfs_dirty_inode(inode); } @@ -9462,6 +9467,7 @@ static const struct inode_operations btrfs_dir_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9470,6 +9476,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9540,6 +9547,7 @@ static const struct inode_operations btrfs_file_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9552,6 +9560,7 @@ static const struct inode_operations btrfs_special_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9565,6 +9574,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; const struct dentry_operations btrfs_dentry_operations = { diff --git a/fs/inode.c b/fs/inode.c index 26753ba..8f5c4b5 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1499,17 +1499,24 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { - if (inode->i_op->update_time) - return inode->i_op->update_time(inode, time, flags); - - if (flags & S_ATIME) - inode->i_atime = *time; - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *time; - if (flags & S_MTIME) - inode->i_mtime = *time; + int ret; + + if (inode->i_op->update_time) { + ret = inode->i_op->update_time(inode, time, flags); + if (ret) + return ret; + } else { + if (flags & S_ATIME) + inode->i_atime = *time; + if (flags & S_VERSION) + inode_inc_iversion(inode); + if (flags & S_CTIME) + inode->i_ctime = *time; + if (flags & S_MTIME) + inode->i_mtime = *time; + } + if (inode->i_op->write_time) + return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0e9653c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -984,10 +984,8 @@ xfs_vn_setattr( } STATIC int -xfs_vn_update_time( - struct inode *inode, - struct timespec *now, - int flags) +xfs_vn_write_time( + struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; @@ -1004,21 +1002,16 @@ xfs_vn_update_time( } xfs_ilock(ip, XFS_ILOCK_EXCL); - if (flags & S_CTIME) { - inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_MTIME) { - inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_ATIME) { - inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec; - } + + ip->i_d.di_ctime.t_sec = (__int32_t) inode->i_ctime.tv_sec; + ip->i_d.di_ctime.t_nsec = (__int32_t) inode->i_ctime.tv_nsec; + + ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec; + ip->i_d.di_mtime.t_nsec = (__int32_t) inode->i_mtime.tv_nsec; + + ip->i_d.di_atime.t_sec = (__int32_t) inode->i_atime.tv_sec; + ip->i_d.di_atime.t_nsec = (__int32_t) inode->i_atime.tv_nsec; + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); return xfs_trans_commit(tp, 0); @@ -1129,7 +1122,7 @@ static const struct inode_operations xfs_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .fiemap = xfs_vn_fiemap, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; static const struct inode_operations xfs_dir_inode_operations = { @@ -1156,7 +1149,7 @@ static const struct inode_operations xfs_dir_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1184,7 +1177,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1198,7 +1191,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; STATIC void diff --git a/include/linux/fs.h b/include/linux/fs.h index 9ab779e..3633239 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,6 +1545,7 @@ struct inode_operations { int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*update_time)(struct inode *, struct timespec *, int); + int (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); -- 2.1.0 From tytso@thunk.org Mon Nov 24 23:34:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 268F77F54 for ; Mon, 24 Nov 2014 23:34:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E31D18F8050 for ; Mon, 24 Nov 2014 21:34:51 -0800 (PST) X-ASG-Debug-ID: 1416893688-04bdf0615f3cdbd0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id RGKVYHpqvRQk1sKU (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:49 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=flECDwlgMD1+CIypAeeoIIjNDCgUqcT8QH3Ifrl0Rs4=; b=Z5eKIliM/TU74JgT45jpuPemE691hch2SkfdioQnZAw361fzrbUhz814HyjyiFdW2xmTaLM9XFUcteHrgU1z1dxoPjcCsXcHb6G7pZouCj3Lj3WzXonBIA26lhGycC3Eh6PuPG4X2rLFSu73YVOsdZL0L7O9LZ2c95sAmEtHsKk=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8lz-0005eW-VR; Tue, 25 Nov 2014 05:34:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5F86958028E; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 4/6] vfs: add lazytime tracepoints for better debugging Date: Tue, 25 Nov 2014 00:34:32 -0500 X-ASG-Orig-Subj: [PATCH-v3 4/6] vfs: add lazytime tracepoints for better debugging Message-Id: <1416893674-419-5-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416893674-419-1-git-send-email-tytso@mit.edu> References: <1416893674-419-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893689 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 5 ++++- fs/inode.c | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index eb04277..cab2d6d 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "internal.h" /* @@ -1304,8 +1305,10 @@ static void flush_sb_dirty_time(struct super_block *sb) iput(old_inode); old_inode = inode; - if (dirty_time) + if (dirty_time) { + trace_fs_lazytime_flush(inode); mark_inode_dirty(inode); + } cond_resched(); spin_lock(&inode_sb_list_lock); } diff --git a/fs/inode.c b/fs/inode.c index 34a443f..6319ead 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -20,6 +20,9 @@ #include #include "internal.h" +#define CREATE_TRACE_POINTS +#include + /* * Inode locking rules: * @@ -544,6 +547,7 @@ static void evict(struct inode *inode) mark_inode_dirty(inode); inode->i_sb->s_op->write_inode(inode, &wbc); } + trace_fs_lazytime_evict(inode); } if (!list_empty(&inode->i_wb_list)) @@ -1550,6 +1554,7 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) inode->i_state |= I_DIRTY_TIME; spin_unlock(&inode->i_lock); inode->i_ts_dirty_day = daycode; + trace_fs_lazytime_defer(inode); return 0; } } -- 2.1.0 From tytso@thunk.org Mon Nov 24 23:34:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DACA57F4E for ; Mon, 24 Nov 2014 23:34:50 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C97568F8040 for ; Mon, 24 Nov 2014 21:34:50 -0800 (PST) X-ASG-Debug-ID: 1416893688-04cbb01e5a3fd040001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id rw9kCBmWubwngIdK (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:48 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=FQJsPR6ZQZJQWil3c0iAgb02h4axXF9voxCrBf3gO6c=; b=aWxXe58bL8Qfyp6svqFWfl+4dl7FiD6ksnXrkEFyv7MenvDnjA/GMD5HeRHjuY2i0x7ozXw7/1VcRTzfnrvEMgPa//7q1FGNpvVIEkdnLLL5IJFIDvFPJ66Q7VpQbXVqngdQhpqkdDv1QUFa3JtON+Mp2KkF/j90ZhhAhZKi3RI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8lz-0005eO-Dd; Tue, 25 Nov 2014 05:34:47 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 584C2580213; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 2/6] vfs: add support for a lazytime mount option Date: Tue, 25 Nov 2014 00:34:30 -0500 X-ASG-Orig-Subj: [PATCH-v3 2/6] vfs: add support for a lazytime mount option Message-Id: <1416893674-419-3-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416893674-419-1-git-send-email-tytso@mit.edu> References: <1416893674-419-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893688 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add a new mount option which enables a new "lazytime" mode. This mode causes atime, mtime, and ctime updates to only be made to the in-memory version of the inode. The on-disk times will only get updated when (a) if the inode needs to be updated for some non-time related change, (b) if userspace calls fsync(), syncfs() or sync(), or (c) just before an undeleted inode is evicted from memory. This is OK according to POSIX because there are no guarantees after a crash unless userspace explicitly requests via a fsync(2) call. For workloads which feature a large number of random write to a preallocated file, the lazytime mount option significantly reduces writes to the inode table. The repeated 4k writes to a single block will result in undesirable stress on flash devices and SMR disk drives. Even on conventional HDD's, the repeated writes to the inode table block will trigger Adjacent Track Interference (ATI) remediation latencies, which very negatively impact 99.9 percentile latencies --- which is a very big deal for web serving tiers (for example). Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 38 +++++++++++++++++++++++++++++++++++++- fs/inode.c | 21 +++++++++++++++++++++ fs/proc_namespace.c | 1 + fs/sync.c | 7 +++++++ include/linux/fs.h | 1 + include/uapi/linux/fs.h | 1 + 6 files changed, 68 insertions(+), 1 deletion(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ef9bef1..ce7de22 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -483,7 +483,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) inode->i_state &= ~I_DIRTY_PAGES; dirty = inode->i_state & I_DIRTY; - inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); + inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_TIME); spin_unlock(&inode->i_lock); /* Don't write the inode if only I_DIRTY_PAGES was set */ if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { @@ -1277,6 +1277,41 @@ static void wait_sb_inodes(struct super_block *sb) iput(old_inode); } +/* + * This works like wait_sb_inodes(), but it is called *before* we kick + * the bdi so the inodes can get written out. + */ +static void flush_sb_dirty_time(struct super_block *sb) +{ + struct inode *inode, *old_inode = NULL; + + WARN_ON(!rwsem_is_locked(&sb->s_umount)); + spin_lock(&inode_sb_list_lock); + list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { + int dirty_time; + + spin_lock(&inode->i_lock); + if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) { + spin_unlock(&inode->i_lock); + continue; + } + dirty_time = inode->i_state & I_DIRTY_TIME; + __iget(inode); + spin_unlock(&inode->i_lock); + spin_unlock(&inode_sb_list_lock); + + iput(old_inode); + old_inode = inode; + + if (dirty_time) + mark_inode_dirty(inode); + cond_resched(); + spin_lock(&inode_sb_list_lock); + } + spin_unlock(&inode_sb_list_lock); + iput(old_inode); +} + /** * writeback_inodes_sb_nr - writeback dirty inodes from given super_block * @sb: the superblock @@ -1388,6 +1423,7 @@ void sync_inodes_sb(struct super_block *sb) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); + flush_sb_dirty_time(sb); bdi_queue_work(sb->s_bdi, &work); wait_for_completion(&done); diff --git a/fs/inode.c b/fs/inode.c index 8f5c4b5..2093a84 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -534,6 +534,18 @@ static void evict(struct inode *inode) BUG_ON(!(inode->i_state & I_FREEING)); BUG_ON(!list_empty(&inode->i_lru)); + if (inode->i_nlink && inode->i_state & I_DIRTY_TIME) { + if (inode->i_op->write_time) + inode->i_op->write_time(inode); + else if (inode->i_sb->s_op->write_inode) { + struct writeback_control wbc = { + .sync_mode = WB_SYNC_NONE, + }; + mark_inode_dirty(inode); + inode->i_sb->s_op->write_inode(inode, &wbc); + } + } + if (!list_empty(&inode->i_wb_list)) inode_wb_list_del(inode); @@ -1515,6 +1527,15 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } + if ((inode->i_sb->s_flags & MS_LAZYTIME) && + !(flags & S_VERSION)) { + if (inode->i_state & I_DIRTY_TIME) + return 0; + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + return 0; + } if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 73ca174..f98234a 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c @@ -44,6 +44,7 @@ static int show_sb_opts(struct seq_file *m, struct super_block *sb) { MS_SYNCHRONOUS, ",sync" }, { MS_DIRSYNC, ",dirsync" }, { MS_MANDLOCK, ",mand" }, + { MS_LAZYTIME, ",lazytime" }, { 0, NULL } }; const struct proc_fs_info *fs_infop; diff --git a/fs/sync.c b/fs/sync.c index bdc729d..3a35506a 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -177,8 +177,15 @@ SYSCALL_DEFINE1(syncfs, int, fd) */ int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) { + struct inode *inode = file->f_mapping->host; + if (!file->f_op->fsync) return -EINVAL; + if (!datasync && (inode->i_state & I_DIRTY_TIME)) { + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_SYNC; + spin_unlock(&inode->i_lock); + } return file->f_op->fsync(file, start, end, datasync); } EXPORT_SYMBOL(vfs_fsync_range); diff --git a/include/linux/fs.h b/include/linux/fs.h index 3633239..489b2f2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1721,6 +1721,7 @@ struct super_operations { #define __I_DIO_WAKEUP 9 #define I_DIO_WAKEUP (1 << I_DIO_WAKEUP) #define I_LINKABLE (1 << 10) +#define I_DIRTY_TIME (1 << 11) #define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3735fa0..cc9713a 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -90,6 +90,7 @@ struct inodes_stat_t { #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ +#define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) -- 2.1.0 From tytso@thunk.org Mon Nov 24 23:34:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B0B947F5E for ; Mon, 24 Nov 2014 23:34:53 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9FB05304032 for ; Mon, 24 Nov 2014 21:34:50 -0800 (PST) X-ASG-Debug-ID: 1416893689-04cb6c05724116a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id FoVPHhaAlYPUfRBt (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:49 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=I4zahLjQOKqKiyZBYmUn7vbsUAdNG8hSFQDB/hsNcfQ=; b=S/YBEMqwNm874JcQllt2I6pBT+bVWa+oQqUUvwVqaSXgC6zgcAGWZUhldESI9SpQLO8spv+1kTtADJn1++xaENO2FEhbrOWkxudi2+pc7RYDTGTgHyUXBZezPt7dr4pWQwzEtM1NrKljJtyuoNh+pScfjAUrv5YFnih78ktX+HI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8m0-0005eg-48; Tue, 25 Nov 2014 05:34:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 696AE5802D0; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 6/6] btrfs: add an is_readonly() so btrfs can use common code for update_time() Date: Tue, 25 Nov 2014 00:34:34 -0500 X-ASG-Orig-Subj: [PATCH-v3 6/6] btrfs: add an is_readonly() so btrfs can use common code for update_time() Message-Id: <1416893674-419-7-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416893674-419-1-git-send-email-tytso@mit.edu> References: <1416893674-419-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893689 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature The only reason btrfs cloned code from the VFS layer was so it could add a check to see if a subvolume is read-ony. Instead of doing that, let's add a new inode operation which allows a file system to return an error if the inode is read-only, and use that in update_time(). There may be other places where the VFS layer may want to know that btrfs would want to treat an inode is read-only. With this commit, there are no remaining users of update_time() in the inode operations structure, so we can remove it and simply things further. Signed-off-by: Theodore Ts'o Cc: linux-btrfs@vger.kernel.org --- fs/btrfs/inode.c | 26 ++++++-------------------- fs/inode.c | 22 +++++++++++----------- include/linux/fs.h | 2 +- 3 files changed, 18 insertions(+), 32 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a5e0d0d..0bfe3a4 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5554,26 +5554,12 @@ static int btrfs_dirty_inode(struct inode *inode) return ret; } -/* - * This is a copy of file_update_time. We need this so we can return error on - * ENOSPC for updating the inode in the case of file write and mmap writes. - */ -static int btrfs_update_time(struct inode *inode, struct timespec *now, - int flags) +static int btrfs_is_readonly(struct inode *inode) { struct btrfs_root *root = BTRFS_I(inode)->root; if (btrfs_root_readonly(root)) return -EROFS; - - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *now; - if (flags & S_MTIME) - inode->i_mtime = *now; - if (flags & S_ATIME) - inode->i_atime = *now; return 0; } @@ -9466,8 +9452,8 @@ static const struct inode_operations btrfs_dir_inode_operations = { .permission = btrfs_permission, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9475,8 +9461,8 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .permission = btrfs_permission, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9546,8 +9532,8 @@ static const struct inode_operations btrfs_file_inode_operations = { .fiemap = btrfs_fiemap, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9559,8 +9545,8 @@ static const struct inode_operations btrfs_special_inode_operations = { .removexattr = btrfs_removexattr, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9573,8 +9559,8 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .getxattr = btrfs_getxattr, .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; const struct dentry_operations btrfs_dentry_operations = { diff --git a/fs/inode.c b/fs/inode.c index 1f90591..e83c6d2 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1555,20 +1555,20 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) unsigned short daycode; int ret; - if (inode->i_op->update_time) { - ret = inode->i_op->update_time(inode, time, flags); + if (inode->i_op->is_readonly) { + ret = inode->i_op->is_readonly(inode); if (ret) return ret; - } else { - if (flags & S_ATIME) - inode->i_atime = *time; - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *time; - if (flags & S_MTIME) - inode->i_mtime = *time; } + if (flags & S_ATIME) + inode->i_atime = *time; + if (flags & S_VERSION) + inode_inc_iversion(inode); + if (flags & S_CTIME) + inode->i_ctime = *time; + if (flags & S_MTIME) + inode->i_mtime = *time; + /* * If i_ts_dirty_day is zero, then either we have not deferred * timestamp updates, or the system has been up for less than diff --git a/include/linux/fs.h b/include/linux/fs.h index dbbd642..70711c8 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,8 +1545,8 @@ struct inode_operations { int (*removexattr) (struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); - int (*update_time)(struct inode *, struct timespec *, int); int (*write_time)(struct inode *); + int (*is_readonly)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); -- 2.1.0 From tytso@thunk.org Mon Nov 24 23:34:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CDAC47F60 for ; Mon, 24 Nov 2014 23:34:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 90C9D8F8040 for ; Mon, 24 Nov 2014 21:34:50 -0800 (PST) X-ASG-Debug-ID: 1416893688-04bdf061613cdbd0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id DWE0IYsjRMigbScs (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:49 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=kpDooJZEi9RGt1huQplEgoAMJQT2POFXlFeP7ilP2Iw=; b=nKhEqjVALwwk/7awOIO7RpMeTpqXTFxOmq6qyxJUfQ1lRwnk68aoavLzMHDtcPb/Jt7LH2miXxj7WC/BAoP3qjdEhG7iDZgRMwoy7YQHkjSzi77EvqYX7l2FyDNmeCeyfoTEFRZ5ZqftkmUuOI3PrX+JsDBpagV2Tjn8X2pvB60=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8lz-0005eZ-W9; Tue, 25 Nov 2014 05:34:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5B0965801CF; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 3/6] vfs: don't let the dirty time inodes get more than a day stale Date: Tue, 25 Nov 2014 00:34:31 -0500 X-ASG-Orig-Subj: [PATCH-v3 3/6] vfs: don't let the dirty time inodes get more than a day stale Message-Id: <1416893674-419-4-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416893674-419-1-git-send-email-tytso@mit.edu> References: <1416893674-419-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893689 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Guarantee that the on-disk timestamps will be no more than 24 hours stale. Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 1 + fs/inode.c | 28 +++++++++++++++++++++++----- include/linux/fs.h | 1 + 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ce7de22..eb04277 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1141,6 +1141,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { trace_writeback_dirty_inode_start(inode, flags); + inode->i_ts_dirty_day = 0; if (sb->s_op->dirty_inode) sb->s_op->dirty_inode(inode, flags); diff --git a/fs/inode.c b/fs/inode.c index 2093a84..34a443f 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1511,6 +1511,8 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { + struct timespec uptime; + unsigned short daycode; int ret; if (inode->i_op->update_time) { @@ -1525,17 +1527,33 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_CTIME) inode->i_ctime = *time; if (flags & S_MTIME) - inode->i_mtime = *time; + inode->i_mtime = *time; } + /* + * If i_ts_dirty_day is zero, then either we have not deferred + * timestamp updates, or the system has been up for less than + * a day (so days_since_boot is zero), so we defer timestamp + * updates in that case and set the I_DIRTY_TIME flag. If a + * day or more has passed, then i_ts_dirty_day will be + * different from days_since_boot, and then we should update + * the on-disk inode and then we can clear i_ts_dirty_day. + */ if ((inode->i_sb->s_flags & MS_LAZYTIME) && !(flags & S_VERSION)) { if (inode->i_state & I_DIRTY_TIME) return 0; - spin_lock(&inode->i_lock); - inode->i_state |= I_DIRTY_TIME; - spin_unlock(&inode->i_lock); - return 0; + get_monotonic_boottime(&uptime); + daycode = div_u64(uptime.tv_sec, (HZ * 86400)); + if (!inode->i_ts_dirty_day || + inode->i_ts_dirty_day == daycode) { + spin_lock(&inode->i_lock); + inode->i_state |= I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + inode->i_ts_dirty_day = daycode; + return 0; + } } + inode->i_ts_dirty_day = 0; if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/include/linux/fs.h b/include/linux/fs.h index 489b2f2..e3574cd 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -575,6 +575,7 @@ struct inode { struct timespec i_ctime; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ unsigned short i_bytes; + unsigned short i_ts_dirty_day; unsigned int i_blkbits; blkcnt_t i_blocks; -- 2.1.0 From tytso@thunk.org Mon Nov 24 23:34:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ECEA17F60 for ; Mon, 24 Nov 2014 23:34:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99132AC004 for ; Mon, 24 Nov 2014 21:34:52 -0800 (PST) X-ASG-Debug-ID: 1416893689-04bdf061613cdbe0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id QAEgfqZyMqZetD6z (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Nov 2014 21:34:49 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=roDoQzTTShqMWSG/+BH3RCQ4007XlPvl1V5+gPiBFn0=; b=tQJBIzfFFgdJsczSLm6GEwQUHfmgZg7UJh4tC0kqMrtHa0kel9N3V7Y0VW+zFmrC82FywYg/UkFNmQFhtMS7Jnae5WS+KdYc2se2P3EIv61rkZXhwH9ft2urb8FeBry72Kch/7GFNDYoSuVrt1ct57jvX7fzacKum0NqhYpHqzo=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xt8m0-0005eo-5u; Tue, 25 Nov 2014 05:34:48 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 64A4C58029C; Tue, 25 Nov 2014 00:34:45 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v3 5/6] ext4: add support for a lazytime mount option Date: Tue, 25 Nov 2014 00:34:33 -0500 X-ASG-Orig-Subj: [PATCH-v3 5/6] ext4: add support for a lazytime mount option Message-Id: <1416893674-419-6-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416893674-419-1-git-send-email-tytso@mit.edu> References: <1416893674-419-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416893689 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add an optimization for the MS_LAZYTIME mount option so that we will opportunistically write out any inodes with the I_DIRTY_TIME flag set in a particular inode table block when we need to update some inode in that inode table block anyway. Also add some temporary code so that we can set the lazytime mount option without needing a modified /sbin/mount program which can set MS_LAZYTIME. We can eventually make this go away once util-linux has added support. Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/ext4/inode.c | 48 ++++++++++++++++++++++++++++++++++++++++++--- fs/ext4/super.c | 9 +++++++++ fs/inode.c | 36 ++++++++++++++++++++++++++++++++++ include/linux/fs.h | 2 ++ include/trace/events/ext4.h | 30 ++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 3 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 3356ab5..03149b4 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4163,6 +4163,50 @@ static int ext4_inode_blocks_set(handle_t *handle, } /* + * Opportunistically update the other time fields for other inodes in + * the same inode table block. + */ +static void ext4_update_other_inodes_time(struct super_block *sb, + unsigned long orig_ino, char *buf) +{ + struct ext4_inode_info *ei; + struct ext4_inode *raw_inode; + unsigned long ino; + struct inode *inode; + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; + int inode_size = EXT4_INODE_SIZE(sb); + + ino = orig_ino & ~(inodes_per_block - 1); + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { + if (ino == orig_ino) + continue; + inode = find_active_inode_nowait(sb, ino); + if (!inode || + (inode->i_state & I_DIRTY_TIME) == 0 || + !spin_trylock(&inode->i_lock)) { + iput(inode); + continue; + } + inode->i_state &= ~I_DIRTY_TIME; + inode->i_ts_dirty_day = 0; + spin_unlock(&inode->i_lock); + + ei = EXT4_I(inode); + raw_inode = (struct ext4_inode *) buf; + + spin_lock(&ei->i_raw_lock); + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); + ext4_inode_csum_set(inode, raw_inode, ei); + spin_unlock(&ei->i_raw_lock); + trace_ext4_other_inode_update_time(inode, orig_ino); + iput(inode); + } +} + + +/* * Post the struct inode info into an on-disk inode location in the * buffer-cache. This gobbles the caller's reference to the * buffer_head in the inode location struct. @@ -4260,7 +4304,6 @@ static int ext4_do_update_inode(handle_t *handle, for (block = 0; block < EXT4_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; } - if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { raw_inode->i_disk_version = cpu_to_le32(inode->i_version); if (ei->i_extra_isize) { @@ -4271,10 +4314,9 @@ static int ext4_do_update_inode(handle_t *handle, cpu_to_le16(ei->i_extra_isize); } } - ext4_inode_csum_set(inode, raw_inode, ei); - spin_unlock(&ei->i_raw_lock); + ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, bh->b_data); BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); rc = ext4_handle_dirty_metadata(handle, NULL, bh); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 4b79f39..1ac1914 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1133,6 +1133,7 @@ enum { Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err, Opt_usrquota, Opt_grpquota, Opt_i_version, Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_mblk_io_submit, + Opt_lazytime, Opt_nolazytime, Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, Opt_inode_readahead_blks, Opt_journal_ioprio, Opt_dioread_nolock, Opt_dioread_lock, @@ -1195,6 +1196,8 @@ static const match_table_t tokens = { {Opt_i_version, "i_version"}, {Opt_stripe, "stripe=%u"}, {Opt_delalloc, "delalloc"}, + {Opt_lazytime, "lazytime"}, + {Opt_nolazytime, "nolazytime"}, {Opt_nodelalloc, "nodelalloc"}, {Opt_removed, "mblk_io_submit"}, {Opt_removed, "nomblk_io_submit"}, @@ -1450,6 +1453,12 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, case Opt_i_version: sb->s_flags |= MS_I_VERSION; return 1; + case Opt_lazytime: + sb->s_flags |= MS_LAZYTIME; + return 1; + case Opt_nolazytime: + sb->s_flags &= ~MS_LAZYTIME; + return 1; } for (m = ext4_mount_opts; m->token != Opt_err; m++) diff --git a/fs/inode.c b/fs/inode.c index 6319ead..1f90591 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1296,6 +1296,42 @@ struct inode *ilookup(struct super_block *sb, unsigned long ino) } EXPORT_SYMBOL(ilookup); +/** + * find_active_inode_nowait - find an active inode in the inode cache + * @sb: super block of file system to search + * @ino: inode number to search for + * + * Search for an active inode @ino in the inode cache, and if the + * inode is in the cache, the inode is returned with an incremented + * reference count. If the inode is being freed or is newly + * initialized, return nothing instead of trying to wait for the inode + * initialization or destruction to be complete. + */ +struct inode *find_active_inode_nowait(struct super_block *sb, + unsigned long ino) +{ + struct hlist_head *head = inode_hashtable + hash(sb, ino); + struct inode *inode, *ret_inode = NULL; + + spin_lock(&inode_hash_lock); + hlist_for_each_entry(inode, head, i_hash) { + if ((inode->i_ino != ino) || + (inode->i_sb != sb)) + continue; + spin_lock(&inode->i_lock); + if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) { + __iget(inode); + ret_inode = inode; + } + spin_unlock(&inode->i_lock); + goto out; + } +out: + spin_unlock(&inode_hash_lock); + return ret_inode; +} +EXPORT_SYMBOL(find_active_inode_nowait); + int insert_inode_locked(struct inode *inode) { struct super_block *sb = inode->i_sb; diff --git a/include/linux/fs.h b/include/linux/fs.h index e3574cd..dbbd642 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2413,6 +2413,8 @@ extern struct inode *ilookup(struct super_block *sb, unsigned long ino); extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); extern struct inode * iget_locked(struct super_block *, unsigned long); +extern struct inode *find_active_inode_nowait(struct super_block *, + unsigned long); extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); extern int insert_inode_locked(struct inode *); #ifdef CONFIG_DEBUG_LOCK_ALLOC diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index ff4bd1b..ba649cb 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -75,6 +75,36 @@ struct extent_status; { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}) +TRACE_EVENT(ext4_other_inode_update_time, + TP_PROTO(struct inode *inode, ino_t orig_ino), + + TP_ARGS(inode, orig_ino), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( ino_t, ino ) + __field( ino_t, orig_ino ) + __field( uid_t, uid ) + __field( gid_t, gid ) + __field( __u16, mode ) + ), + + TP_fast_assign( + __entry->orig_ino = orig_ino; + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->uid = i_uid_read(inode); + __entry->gid = i_gid_read(inode); + __entry->mode = inode->i_mode; + ), + + TP_printk("dev %d,%d orig_ino %lu ino %lu mode 0%o uid %u gid %u", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->orig_ino, + (unsigned long) __entry->ino, __entry->mode, + __entry->uid, __entry->gid) +); + TRACE_EVENT(ext4_free_inode, TP_PROTO(struct inode *inode), -- 2.1.0 From laughingkingmold2@qq.com Tue Nov 25 00:33:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=DEAR_SOMETHING, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,FREEMAIL_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3AFB97F3F for ; Tue, 25 Nov 2014 00:33:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B35B30405F for ; Mon, 24 Nov 2014 22:32:58 -0800 (PST) X-ASG-Debug-ID: 1416897144-04bdf0615f3d06d0001-NocioJ Received: from qq.com ([183.239.152.22]) by cuda.sgi.com with ESMTP id UShoYWK49LTrxwws for ; Mon, 24 Nov 2014 22:32:56 -0800 (PST) X-Barracuda-Envelope-From: laughingkingmold2@qq.com X-Barracuda-Apparent-Source-IP: 183.239.152.22 Received: from PCOS-08201037[192.168.1.109] by qq.com with SMTP id 2FDE5640; Tue, 25 Nov 2014 14:32:29 +0800 From: "laughing" Subject: Re:Mould Maker To: "xfs" X-ASG-Orig-Subj: Re:Mould Maker Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit Reply-To: laughingkingmold1@qq.com Date: Tue, 25 Nov 2014 14:33:03 +0800 X-Mailer: Foxmail 5.0 beta2 X-Barracuda-Connect: UNKNOWN[183.239.152.22] X-Barracuda-Start-Time: 1416897175 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.24 X-Barracuda-Spam-Status: No, SCORE=0.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12014 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20141125063258.B2427A42181@cuda.sgi.com> Dear Sir/Madam, Good day. We are a professional mouldmaker from Shenzhen in China. Our factory specializes in design and manufacture various of plastic moulds over eleven years. B&H King Mould Limited have rich experience in making the following molds for our clients, -Plastic auto parts mould -Plastic home appliance mould -Plastic medical device mould -industry plastic mould -electronic products mould -etc I hope we can team up with you and your company. Any questions ,pls feel easy to contact with me. If you do not wish to receive email from us, please let us know. Yours sincerely Laughing Wang --------------------------------------------------- Business Development B&H King Mold Limited Tel: +86-755-29779915 Fax: +86-755-29779215 From cmaiolino@redhat.com Tue Nov 25 07:49:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C89797F3F for ; Tue, 25 Nov 2014 07:49:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 675B1AC004 for ; Tue, 25 Nov 2014 05:49:37 -0800 (PST) X-ASG-Debug-ID: 1416923375-04bdf06161771410001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ngsfjP3PlWq5Ukbv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 05:49:35 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnYLT015972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 25 Nov 2014 08:49:35 -0500 Received: from hades.localdomain.com (ovpn-113-126.phx2.redhat.com [10.3.113.126]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnWJ1010509 for ; Tue, 25 Nov 2014 08:49:34 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Date: Tue, 25 Nov 2014 11:49:27 -0200 X-ASG-Orig-Subj: [PATCH 1/2] Make xfs_vn_rename compliant with renameat2() syscall Message-Id: <1416923368-28322-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> References: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416923375 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 To be able to support RENAME_EXCHANGE flag from renameat2() system call, XFS must have its inode_operations updated, exporting .rename2 method, instead of .rename. This patch just replaces the (now old) .rename method by .rename2, using the same infra-structure, but checking rename flags. calls to .rename2 using RENAME_EXCHANGE flag, although now handled inside XFS, still returns -EINVAL. RENAME_NOREPLACE is handled via VFS and we don't need to care about it inside xfs_vn_rename. Changelog: V2: Use xfs_vn_rename as-is, instead of rename it to xfs_vn_rename2 Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_iops.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0b8704c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -383,18 +383,23 @@ xfs_vn_rename( struct inode *odir, struct dentry *odentry, struct inode *ndir, - struct dentry *ndentry) + struct dentry *ndentry, + unsigned int flags) { struct inode *new_inode = ndentry->d_inode; struct xfs_name oname; struct xfs_name nname; + /* XFS does not support RENAME_EXCHANGE yet */ + if (flags & ~RENAME_NOREPLACE) + return -EINVAL; + xfs_dentry_to_name(&oname, odentry, 0); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), - XFS_I(ndir), &nname, new_inode ? - XFS_I(new_inode) : NULL); + XFS_I(ndir), &nname, + new_inode ? XFS_I(new_inode) : NULL); } /* @@ -1147,7 +1152,7 @@ static const struct inode_operations xfs_dir_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, @@ -1175,7 +1180,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { */ .rmdir = xfs_vn_unlink, .mknod = xfs_vn_mknod, - .rename = xfs_vn_rename, + .rename2 = xfs_vn_rename, .get_acl = xfs_get_acl, .set_acl = xfs_set_acl, .getattr = xfs_vn_getattr, -- 2.1.0 From cmaiolino@redhat.com Tue Nov 25 07:49:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 832697F54 for ; Tue, 25 Nov 2014 07:49:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 555B430404E for ; Tue, 25 Nov 2014 05:49:37 -0800 (PST) X-ASG-Debug-ID: 1416923374-04bdf0615e771400001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2IrH5Mfc30PGLUxL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 05:49:34 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnYRi010371 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 25 Nov 2014 08:49:34 -0500 Received: from hades.localdomain.com (ovpn-113-126.phx2.redhat.com [10.3.113.126]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnWJ0010509 for ; Tue, 25 Nov 2014 08:49:33 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V8 Date: Tue, 25 Nov 2014 11:49:26 -0200 X-ASG-Orig-Subj: [PATCH 0/2] Add support to RENAME_EXCHANGE flag to XFS V8 Message-Id: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416923374 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patchset aims to implement RENAME_EXCHANGE support (from sys_renameat2) to XFS. For this to be achieved, XFS need to export a rename2() method, which I included in the first patch. The second patch is the real implementation of the RENAME_EXCHANGE flags, which most of the work I based on xfs_rename(). This patchset passed the xfstests 23, 24 and 25 (specifically for RENAME_EXCHANGE), and I also tested the projectID inheritance problem, where both paths must be under the same projectID to be able to change (I'm going to implement this test into the xfstests too). In this version of the patch, I tried to use xfs_rename for everything in common between a usual rename and the RENAME_EXCHANGE, using xfs_cross_rename() just for the needed stuff to accomplish RENAME_EXCHANGE requirements (as suggested by Brian). Also, this new version contains a fix to ensure both files will have their i_mode updated, so that d_type object (in superblock V5) will contain the proper information after the exchange happens Refer to specific patch descriptions for more information regarding new patch versions Carlos Maiolino (2): Make xfs_vn_rename compliant with renameat2() syscall Add support to RENAME_EXCHANGE flag V8 fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 24 +++++++++--- 3 files changed, 130 insertions(+), 8 deletions(-) -- 2.1.0 From cmaiolino@redhat.com Tue Nov 25 07:49:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3D9A37F55 for ; Tue, 25 Nov 2014 07:49:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1D78AC004 for ; Tue, 25 Nov 2014 05:49:40 -0800 (PST) X-ASG-Debug-ID: 1416923377-04cbb01e5a5fbcd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VBmF8qjkWc0zeSxb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 05:49:38 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnaJo003825 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 25 Nov 2014 08:49:37 -0500 Received: from hades.localdomain.com (ovpn-113-126.phx2.redhat.com [10.3.113.126]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnWJ2010509 for ; Tue, 25 Nov 2014 08:49:35 -0500 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V8 Date: Tue, 25 Nov 2014 11:49:28 -0200 X-ASG-Orig-Subj: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V8 Message-Id: <1416923368-28322-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> References: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416923377 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Adds a new function named xfs_cross_rename(), responsible to handle requests from sys_renameat2() using RENAME_EXCHANGE flag. Changelog: V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() V3: - fix indentation to avoid 80 column crossing, decrease the amount of arguments passed to xfs_cross_rename() - Rebase patches over the latest linux code v4: - use a label/goto statement instead of an if conditional after xfs_cross_rename() return, to finish the rename operation - Make xfs_cross_rename() static - Fix some comments V5: - Keep all the code under 80 columns V6: - Ensure i_mode of both files are updated during exchange V7: - Use struct names instead of typedefs in the xfs_cross_rename() definition V8: - Replace src/target names for better variable names - Log and timestamp updates done in different places - Fix missing space in comments - get rid of {src,tgt}_is_directory and new_parent variables Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_iops.c | 15 +++++-- 3 files changed, 123 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..5c5ed99 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2668,6 +2668,102 @@ xfs_sort_for_rename( } } +/* xfs_cross_rename() + * + * responsible to handle RENAME_EXCHANGE flag + * in renameat2() sytemcall + */ +STATIC int +xfs_cross_rename( + struct xfs_trans *tp, + struct xfs_inode *dp1, + struct xfs_name *name1, + struct xfs_inode *ip1, + struct xfs_inode *dp2, + struct xfs_name *name2, + struct xfs_inode *ip2, + struct xfs_bmap_free *free_list, + xfs_fsblock_t *first_block, + int spaceres) +{ + int error = 0; + + /* Replace source inode */ + error = xfs_dir_replace(tp, dp1, name1, + ip2->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + /* Replace target inode */ + error = xfs_dir_replace(tp, dp2, name2, + ip1->i_ino, + first_block, free_list, spaceres); + if (error) + goto out; + + + /* + * If we're renaming one or more directories across different parents, + * update the respective ".." entries (and link counts) to match the new + * parents. + */ + if (dp1 != dp2) { + + if (S_ISDIR(ip2->i_d.di_mode)) { + error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot, + dp1->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer target ".." reference to dp1 */ + if (!S_ISDIR(ip1->i_d.di_mode)) { + error = xfs_droplink(tp, dp2); + if (error) + goto out; + error = xfs_bumplink(tp, dp1); + if (error) + goto out; + } + xfs_trans_ichgtime(tp, ip1, XFS_ICHGTIME_CHG); + xfs_trans_ichgtime(tp, ip2, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, ip2, XFS_ILOG_CORE); + } + + if (S_ISDIR(ip1->i_d.di_mode)) { + error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot, + dp2->i_ino, first_block, + free_list, spaceres); + if (error) + goto out; + + /* transfer src ".." reference to dp2 */ + if (!S_ISDIR(ip2->i_d.di_mode)) { + error = xfs_droplink(tp, dp1); + if (error) + goto out; + error = xfs_bumplink(tp, dp2); + if (error) + goto out; + } + xfs_trans_ichgtime(tp, ip1, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_ichgtime(tp, ip2, XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, ip1, XFS_ILOG_CORE); + } + xfs_trans_ichgtime(tp, dp2, + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, dp2, XFS_ILOG_CORE); + } + xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); + xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE); + +out: + return error; +} + /* * xfs_rename */ @@ -2678,7 +2774,8 @@ xfs_rename( xfs_inode_t *src_ip, xfs_inode_t *target_dp, struct xfs_name *target_name, - xfs_inode_t *target_ip) + xfs_inode_t *target_ip, + unsigned int flags) { xfs_trans_t *tp = NULL; xfs_mount_t *mp = src_dp->i_mount; @@ -2706,6 +2803,7 @@ xfs_rename( cancel_flags = XFS_TRANS_RELEASE_LOG_RES; spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); + if (error == -ENOSPC) { spaceres = 0; error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); @@ -2756,6 +2854,17 @@ xfs_rename( } /* + * Handle RENAME_EXCHANGE flags + */ + if (flags & RENAME_EXCHANGE) { + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, + target_dp, target_name, target_ip, + &free_list, &first_block, spaceres); + if (error) + goto abort_return; + goto finish_rename; + } + /* * Set up the target. */ if (target_ip == NULL) { @@ -2894,6 +3003,7 @@ xfs_rename( if (new_parent) xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); +finish_rename: /* * If this is a synchronous mount, make sure that the * rename transaction goes to disk before returning to diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..051d9f0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, struct xfs_inode *src_ip, struct xfs_inode *target_dp, struct xfs_name *target_name, - struct xfs_inode *target_ip); + struct xfs_inode *target_ip, unsigned int flags); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 0b8704c..4e5d8ce 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -387,19 +387,26 @@ xfs_vn_rename( unsigned int flags) { struct inode *new_inode = ndentry->d_inode; + int omode = 0; struct xfs_name oname; struct xfs_name nname; - /* XFS does not support RENAME_EXCHANGE yet */ - if (flags & ~RENAME_NOREPLACE) + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) return -EINVAL; - xfs_dentry_to_name(&oname, odentry, 0); + /* + * if we are exchanging files, we should set + * i_mode of both files + */ + if (flags & RENAME_EXCHANGE) + omode = ndentry->d_inode->i_mode; + + xfs_dentry_to_name(&oname, odentry, omode); xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), XFS_I(ndir), &nname, - new_inode ? XFS_I(new_inode) : NULL); + new_inode ? XFS_I(new_inode) : NULL, flags); } /* -- 2.1.0 From bfoster@redhat.com Tue Nov 25 07:50:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D31737F54 for ; Tue, 25 Nov 2014 07:50:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A430B30404E for ; Tue, 25 Nov 2014 05:50:10 -0800 (PST) X-ASG-Debug-ID: 1416923382-04bdf06161771430001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AWafxRgNn5WsBF3e (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 05:49:42 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDnfDl016004 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 25 Nov 2014 08:49:41 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDneMw024905; Tue, 25 Nov 2014 08:49:40 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id D5F5B12388E; Tue, 25 Nov 2014 08:49:39 -0500 (EST) Date: Tue, 25 Nov 2014 08:49:39 -0500 From: Brian Foster To: Peter Watkins Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: overflow in xfs_iomap_eof_align_last_fsb Message-ID: <20141125134939.GB8132@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: overflow in xfs_iomap_eof_align_last_fsb References: <1416855973-6359-1-git-send-email-treestem@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416855973-6359-1-git-send-email-treestem@gmail.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416923382 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Nov 24, 2014 at 02:06:13PM -0500, Peter Watkins wrote: > Someone else may have run into this already, if not please take > a look. > > Peter > > If extsize is set and new_last_fsb is larger than 32 bits, the > roundup to extsize will overflow the align variable. Instead, > combine alignments by rounding extsize hint up to stripe size. > > Signed-off-by: Peter Watkins > Reviewed-by: Nathaniel W. Turner > --- So we basically assign a file offset value to an extent length variable. Nice spot... > fs/xfs/xfs_iomap.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index afcf3c9..0c4abfe 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -52,7 +52,7 @@ xfs_iomap_eof_align_last_fsb( > xfs_extlen_t extsize, > xfs_fileoff_t *last_fsb) > { > - xfs_fileoff_t new_last_fsb = 0; > + xfs_fileoff_t new_last_fsb; > xfs_extlen_t align = 0; > int eof, error; > > @@ -70,23 +70,24 @@ xfs_iomap_eof_align_last_fsb( > else if (mp->m_dalign) > align = mp->m_dalign; > > - if (align && XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, align)) > - new_last_fsb = roundup_64(*last_fsb, align); > + if (align && XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, align)) > + align = 0; > } > > /* > - * Always round up the allocation request to an extent boundary > - * (when file on a real-time subvolume or has di_extsize hint). > + * Round up the allocation request to an extent boundary. If > + * already aligned to a stripe, round extsize up to a stripe > + * boundary. > */ > if (extsize) { > - if (new_last_fsb) > - align = roundup_64(new_last_fsb, extsize); > + if (align) > + align = roundup_64(extsize, align); I think the previous behavior would swap this around and round up the alignment to the extsize. Because we aligned from the actual fsb, we'd effectively use the stripe alignment as a min. alloc and always align to the hint. Here we simply round up extsize to the stripe alignment. IOW, the alignment was previously always to the hint, even if smaller than the stripe alignment, and now we align to the larger of the hint or stripe. That said, it's kind of a weird scenario and it's not clear to me whether it's important or even intended. If not, the patch seems Ok to me... Brian > else > align = extsize; > - new_last_fsb = roundup_64(*last_fsb, align); > } > > - if (new_last_fsb) { > + if (align) { > + new_last_fsb = roundup_64(*last_fsb, align); > error = xfs_bmap_eof(ip, new_last_fsb, XFS_DATA_FORK, &eof); > if (error) > return error; > -- > 1.7.9.5 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From cmaiolino@redhat.com Tue Nov 25 07:51:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4D47E7F47 for ; Tue, 25 Nov 2014 07:51:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D98030404E for ; Tue, 25 Nov 2014 05:51:30 -0800 (PST) X-ASG-Debug-ID: 1416923488-04bdf06161771550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id U42XAtGAYLuU6JCy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 05:51:29 -0800 (PST) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDpSrM011866 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 25 Nov 2014 08:51:28 -0500 Received: from hades.localdomain (ovpn-113-126.phx2.redhat.com [10.3.113.126]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAPDpO5M025870 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 08:51:27 -0500 Date: Tue, 25 Nov 2014 11:51:24 -0200 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V8 Message-ID: <20141125135123.GA21219@hades.localdomain> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V8 Mail-Followup-To: xfs@oss.sgi.com References: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> <1416923368-28322-3-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416923368-28322-3-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416923488 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Dave, can you please take a look at the places where I logged inodes and did the timestamp updates? Although the places where I added them makes sense to me, I'm not sure if they are correct. Thanks On Tue, Nov 25, 2014 at 11:49:28AM -0200, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. > > Changelog: > > V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() > > V3: - fix indentation to avoid 80 column crossing, decrease the amount of > arguments passed to xfs_cross_rename() > - Rebase patches over the latest linux code > > v4: - use a label/goto statement instead of an if conditional after > xfs_cross_rename() return, to finish the rename operation > - Make xfs_cross_rename() static > - Fix some comments > > V5: - Keep all the code under 80 columns > > V6: - Ensure i_mode of both files are updated during exchange > > V7: - Use struct names instead of typedefs in the xfs_cross_rename() > definition > > V8: - Replace src/target names for better variable names > - Log and timestamp updates done in different places > - Fix missing space in comments > - get rid of {src,tgt}_is_directory and new_parent variables > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_inode.h | 2 +- > fs/xfs/xfs_iops.c | 15 +++++-- > 3 files changed, 123 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8ed049d..5c5ed99 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2668,6 +2668,102 @@ xfs_sort_for_rename( > } > } > > +/* xfs_cross_rename() > + * > + * responsible to handle RENAME_EXCHANGE flag > + * in renameat2() sytemcall > + */ > +STATIC int > +xfs_cross_rename( > + struct xfs_trans *tp, > + struct xfs_inode *dp1, > + struct xfs_name *name1, > + struct xfs_inode *ip1, > + struct xfs_inode *dp2, > + struct xfs_name *name2, > + struct xfs_inode *ip2, > + struct xfs_bmap_free *free_list, > + xfs_fsblock_t *first_block, > + int spaceres) > +{ > + int error = 0; > + > + /* Replace source inode */ > + error = xfs_dir_replace(tp, dp1, name1, > + ip2->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + /* Replace target inode */ > + error = xfs_dir_replace(tp, dp2, name2, > + ip1->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + > + /* > + * If we're renaming one or more directories across different parents, > + * update the respective ".." entries (and link counts) to match the new > + * parents. > + */ > + if (dp1 != dp2) { > + > + if (S_ISDIR(ip2->i_d.di_mode)) { > + error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot, > + dp1->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out; > + > + /* transfer target ".." reference to dp1 */ > + if (!S_ISDIR(ip1->i_d.di_mode)) { > + error = xfs_droplink(tp, dp2); > + if (error) > + goto out; > + error = xfs_bumplink(tp, dp1); > + if (error) > + goto out; > + } > + xfs_trans_ichgtime(tp, ip1, XFS_ICHGTIME_CHG); > + xfs_trans_ichgtime(tp, ip2, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, ip2, XFS_ILOG_CORE); > + } > + > + if (S_ISDIR(ip1->i_d.di_mode)) { > + error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot, > + dp2->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out; > + > + /* transfer src ".." reference to dp2 */ > + if (!S_ISDIR(ip2->i_d.di_mode)) { > + error = xfs_droplink(tp, dp1); > + if (error) > + goto out; > + error = xfs_bumplink(tp, dp2); > + if (error) > + goto out; > + } > + xfs_trans_ichgtime(tp, ip1, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_ichgtime(tp, ip2, XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, ip1, XFS_ILOG_CORE); > + } > + xfs_trans_ichgtime(tp, dp2, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, dp2, XFS_ILOG_CORE); > + } > + xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE); > + > +out: > + return error; > +} > + > /* > * xfs_rename > */ > @@ -2678,7 +2774,8 @@ xfs_rename( > xfs_inode_t *src_ip, > xfs_inode_t *target_dp, > struct xfs_name *target_name, > - xfs_inode_t *target_ip) > + xfs_inode_t *target_ip, > + unsigned int flags) > { > xfs_trans_t *tp = NULL; > xfs_mount_t *mp = src_dp->i_mount; > @@ -2706,6 +2803,7 @@ xfs_rename( > cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > + > if (error == -ENOSPC) { > spaceres = 0; > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > @@ -2756,6 +2854,17 @@ xfs_rename( > } > > /* > + * Handle RENAME_EXCHANGE flags > + */ > + if (flags & RENAME_EXCHANGE) { > + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > + target_dp, target_name, target_ip, > + &free_list, &first_block, spaceres); > + if (error) > + goto abort_return; > + goto finish_rename; > + } > + /* > * Set up the target. > */ > if (target_ip == NULL) { > @@ -2894,6 +3003,7 @@ xfs_rename( > if (new_parent) > xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > > +finish_rename: > /* > * If this is a synchronous mount, make sure that the > * rename transaction goes to disk before returning to > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 9af2882..051d9f0 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, > int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, > struct xfs_inode *src_ip, struct xfs_inode *target_dp, > struct xfs_name *target_name, > - struct xfs_inode *target_ip); > + struct xfs_inode *target_ip, unsigned int flags); > > void xfs_ilock(xfs_inode_t *, uint); > int xfs_ilock_nowait(xfs_inode_t *, uint); > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 0b8704c..4e5d8ce 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -387,19 +387,26 @@ xfs_vn_rename( > unsigned int flags) > { > struct inode *new_inode = ndentry->d_inode; > + int omode = 0; > struct xfs_name oname; > struct xfs_name nname; > > - /* XFS does not support RENAME_EXCHANGE yet */ > - if (flags & ~RENAME_NOREPLACE) > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > return -EINVAL; > > - xfs_dentry_to_name(&oname, odentry, 0); > + /* > + * if we are exchanging files, we should set > + * i_mode of both files > + */ > + if (flags & RENAME_EXCHANGE) > + omode = ndentry->d_inode->i_mode; > + > + xfs_dentry_to_name(&oname, odentry, omode); > xfs_dentry_to_name(&nname, ndentry, odentry->d_inode->i_mode); > > return xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode), > XFS_I(ndir), &nname, > - new_inode ? XFS_I(new_inode) : NULL); > + new_inode ? XFS_I(new_inode) : NULL, flags); > } > > /* > -- > 2.1.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From linux@rasmusvillemoes.dk Tue Nov 25 08:58:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 730D37F3F for ; Tue, 25 Nov 2014 08:58:07 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 509628F8052 for ; Tue, 25 Nov 2014 06:58:06 -0800 (PST) X-ASG-Debug-ID: 1416927484-04cbb01e5b604790001-NocioJ Received: from mail-lb0-f178.google.com (mail-lb0-f178.google.com [209.85.217.178]) by cuda.sgi.com with ESMTP id C8MaPAZ8RVyBuq8t (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 06:58:05 -0800 (PST) X-Barracuda-Envelope-From: linux@rasmusvillemoes.dk X-Barracuda-Apparent-Source-IP: 209.85.217.178 Received: by mail-lb0-f178.google.com with SMTP id f15so731537lbj.23 for ; Tue, 25 Nov 2014 06:58:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rasmusvillemoes.dk; s=google; h=from:to:cc:subject:organization:references:date:in-reply-to :message-id:user-agent:mime-version:content-type; bh=6e8xiUjJXhRxGqoVpm97XhpME/Dr5Bx8hLXTv5YMCW4=; b=OPy3X+/kJFzaOLFBfU8orI5kyCruo9s4sGUGlUPIorgLMZzQGOBraNgL46WMi5TI2o ZkEHDHk+UnOGlsYpUjuTuM95kAO4FdUweoCKZr7fBukLDh9u2ydFThvvf+VOapxRzq9Z iSMRWGDBhn1o/il0aQfRegb3uQKp5LErGvDtY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:organization:references:date :in-reply-to:message-id:user-agent:mime-version:content-type; bh=6e8xiUjJXhRxGqoVpm97XhpME/Dr5Bx8hLXTv5YMCW4=; b=DLklSG8irvBRc39sKjAFtMdoEoIjGFUSinablDnNn3zTITf+118PlEX23xAoOKNxUY NoCV32UIIHBn/WLxRSOeFr9oTnf4LHpJ6SR00trCmpX0dVnjyLJ4YvWF7QmuZF9wgvzw gMckROLUHiJtaDRurzLObGKpPGgvjpzWOeWIoq6priYB/V1yqg+a1PuuAacwtlBIzOhZ m/jtCmx/8vLh9173MhsBpAGi7LXA8oFS4ZGYHGB++FnNyW+hFrmvqdx/IA+0SZPEh7AD UL326Lp+/SNx65dIEQBKxPYl0v+0lFDt2Fz5spJFAJzBRA4PFx/TBOjdHOYe8b4LocSc TfpQ== X-Gm-Message-State: ALoCoQkHep8F3w+rwCfSCKO+5H3wf/cdduBI8RhlihV/bk+N4GfJnzYI1vC4jokc9oDL7hRco8CE X-Received: by 10.112.185.68 with SMTP id fa4mr27850875lbc.84.1416927483533; Tue, 25 Nov 2014 06:58:03 -0800 (PST) Received: from morgan.rasmusvillemoes.dk ([130.225.20.51]) by mx.google.com with ESMTPSA id px7sm405622lac.17.2014.11.25.06.58.02 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 25 Nov 2014 06:58:02 -0800 (PST) From: Rasmus Villemoes To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v3 3/6] vfs: don't let the dirty time inodes get more than a day stale Organization: D03 X-ASG-Orig-Subj: Re: [PATCH-v3 3/6] vfs: don't let the dirty time inodes get more than a day stale References: <1416893674-419-1-git-send-email-tytso@mit.edu> <1416893674-419-4-git-send-email-tytso@mit.edu> X-Hashcash: 1:20:141125:linux-ext4@vger.kernel.org::k0V6Bq6VxYwxqpg3:000000000000000000000000000000000001hyn X-Hashcash: 1:20:141125:linux-fsdevel@vger.kernel.org::iwBj9yL3avRRXZoK:000000000000000000000000000000002J/U X-Hashcash: 1:20:141125:xfs@oss.sgi.com::4zDr9IewKjPWuyRo:002xJ0 X-Hashcash: 1:20:141125:tytso@mit.edu::jFqOaekqsZZj7jaK:000038PU X-Hashcash: 1:20:141125:linux-btrfs@vger.kernel.org::IDHfxVLaE4ZjBNG+:00000000000000000000000000000000004mjD Date: Tue, 25 Nov 2014 15:58:01 +0100 In-Reply-To: <1416893674-419-4-git-send-email-tytso@mit.edu> (Theodore Ts'o's message of "Tue, 25 Nov 2014 00:34:31 -0500") Message-ID: <87ioi3iayu.fsf@rasmusvillemoes.dk> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Barracuda-Connect: mail-lb0-f178.google.com[209.85.217.178] X-Barracuda-Start-Time: 1416927484 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12027 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 25 2014, Theodore Ts'o wrote: > static int update_time(struct inode *inode, struct timespec *time, int flags) > { > + struct timespec uptime; > + unsigned short daycode; > int ret; > > if (inode->i_op->update_time) { > @@ -1525,17 +1527,33 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) > if (flags & S_CTIME) > inode->i_ctime = *time; > if (flags & S_MTIME) > - inode->i_mtime = *time; > + inode->i_mtime = *time; > } > + /* > + * If i_ts_dirty_day is zero, then either we have not deferred > + * timestamp updates, or the system has been up for less than > + * a day (so days_since_boot is zero), so we defer timestamp > + * updates in that case and set the I_DIRTY_TIME flag. If a > + * day or more has passed, then i_ts_dirty_day will be > + * different from days_since_boot, and then we should update > + * the on-disk inode and then we can clear i_ts_dirty_day. > + */ I think days_since_boot was a lot clearer than daycode. In any case, please make the comment and the code consistent. > if ((inode->i_sb->s_flags & MS_LAZYTIME) && > !(flags & S_VERSION)) { > if (inode->i_state & I_DIRTY_TIME) > return 0; > - spin_lock(&inode->i_lock); > - inode->i_state |= I_DIRTY_TIME; > - spin_unlock(&inode->i_lock); > - return 0; > + get_monotonic_boottime(&uptime); > + daycode = div_u64(uptime.tv_sec, (HZ * 86400)); You should probably divide by the number of seconds in a day, not the number of jiffies in a day. Isn't div_u64 mostly for when the divisor is not known at compile time? Technically, "(u64)uptime.tv_sec / 86400" is of course a u64/u64 division, but the compiler should see that the divisor is only 32 bits and hence should be able to generate code which is at least as efficient as whatever inline asm the arch provides for u64/u32 divisions. Rasmus From openosd@gmail.com Tue Nov 25 09:32:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 802BC7F3F for ; Tue, 25 Nov 2014 09:32:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 43191304067 for ; Tue, 25 Nov 2014 07:32:17 -0800 (PST) X-ASG-Debug-ID: 1416929534-04bdf0615e77c770001-NocioJ Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com [209.85.212.175]) by cuda.sgi.com with ESMTP id 6pZdU42f6G17C2oP (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 07:32:15 -0800 (PST) X-Barracuda-Envelope-From: openosd@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.175] Received: by mail-wi0-f175.google.com with SMTP id l15so9549910wiw.2 for ; Tue, 25 Nov 2014 07:32:14 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=OsTzyJGkVo+c/yUys39aSi7ch9tG2xutxOfDcdkuByg=; b=xGpzxBXd5Eb5llUktB79vV6WvXnrfiMvftl0B8j9S6vUuPGkqSLXY45ZNxi/EhThNz TpuGM5UxIrOsOUexsdpNFTrJW7dmTuRFErVbtlHeU8SZpsCuM2wSusS+PtRTexNX8eWt OGoI3fXnFitprPsxvjCEYQdAUCUS3+3q19bHLFkIzBJXJ0aVu+/q8/nDluJBZ502ZGpf GhBjRVkwDjQKPGHzd8xAaBSgOz6VCMDS23k97EtQ6XKyZFF2+MFY454/GS0xdy5nF9t/ JNXnOCjlPwEqSiNqVo/BH0FP8+JmrhxzlnDckydtdwRU4Tl6//0MGo0BtNY+mKs3tFsV Nohg== X-Received: by 10.180.95.74 with SMTP id di10mr33139423wib.54.1416929534472; Tue, 25 Nov 2014 07:32:14 -0800 (PST) Received: from [10.0.0.5] ([207.232.55.62]) by mx.google.com with ESMTPSA id a8sm16905820wiz.21.2014.11.25.07.32.12 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Nov 2014 07:32:13 -0800 (PST) Message-ID: <5474A0FB.1000504@gmail.com> Date: Tue, 25 Nov 2014 17:32:11 +0200 From: Boaz Harrosh User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Theodore Ts'o , Dave Chinner CC: linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option In-Reply-To: <20141125043335.GF31339@thunk.org> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-wi0-f175.google.com[209.85.212.175] X-Barracuda-Start-Time: 1416929535 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 11/25/2014 06:33 AM, Theodore Ts'o wrote: <> > > I was concerned about putting them on the dirty inode list because it > would be extra inodes for the writeback threads would have to skip > over and ignore (since they would not be dirty in the inde or data > pages sense). > > Another solution would be to use a separate linked list for dirtytime > inodes, but that means adding some extra fields to the inode > structure, which some might view as bloat. You could use the same list-head for both lists. If the inode is on the dirty-inode-list then no need to add it to the list-for-dirtytime, it will be written soon anyway. else you add it to the list-for-dirtytime. If you (real)dirty an inode then you first remove it from the list-for-dirtytime first, and then add it to the dirty-inode-list. So at each given time it is only on one list <> Cheers Boaz From dsterba@suse.cz Tue Nov 25 09:51:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4847D7F3F for ; Tue, 25 Nov 2014 09:51:47 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 28DF98F8071 for ; Tue, 25 Nov 2014 07:51:43 -0800 (PST) X-ASG-Debug-ID: 1416930701-04cb6c0571617f00001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Y9PnCCmw9JSJqH03 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 07:51:42 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 69E91ADBA; Tue, 25 Nov 2014 15:51:41 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id EE3B0DA93C; Tue, 25 Nov 2014 16:51:41 +0100 (CET) Date: Tue, 25 Nov 2014 16:51:41 +0100 From: David Sterba To: dsterba@suse.cz, Christoph Hellwig , Theodore Ts'o , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Message-ID: <20141125155141.GF26471@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH 1/4] fs: split update_time() into update_time() and write_time() Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Christoph Hellwig , Theodore Ts'o , linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-2-git-send-email-tytso@mit.edu> <20141124152101.GA12575@infradead.org> <20141124173430.GB26471@twin.jikos.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141124173430.GB26471@twin.jikos.cz> User-Agent: Mutt/1.5.23.1-rc1 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416930702 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 06:34:30PM +0100, David Sterba wrote: > The btrfs_root_readonly checks in setxattr and removexattr are > unnecessary because they're done through xattr_permisssion. I'll send a > patch to remove them. Does not work because the security.* and system.* namespaces do not call the permission() hook, so no patch. However, if the proposed inode_is_readonly callback is merged, we can replace the btrfs-specific checks with is_readonly check in xattr_permission(). From tytso@thunk.org Tue Nov 25 09:55:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3A4DA7F3F for ; Tue, 25 Nov 2014 09:55:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id F08B28F8066 for ; Tue, 25 Nov 2014 07:55:26 -0800 (PST) X-ASG-Debug-ID: 1416930924-04bdf0615f77f3f0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id vFSUCA1dvSXPaF6D (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 07:55:24 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=W3/QWuJtzDpqvI1RDdMxS62EgEGVYSL1lE+d+W30V/k=; b=MpGA+A9wzQmbGypWSy0uDbQASFNINGKG9dYxOspTwThMFd/PrC7sggNWODJ/NgZKBTo3Bz5Xl7Eog2HLDmBLW576zh+wtvJ42HZPq5/7w5trh6IzEO2ivn7g4hBLSg0hPtYgLrGAPeNK6d/MQJs+InNU2S6DP6EcrGWrI+qh5cw=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtISZ-0002vY-OQ; Tue, 25 Nov 2014 15:55:23 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 64F3E580213; Tue, 25 Nov 2014 10:55:22 -0500 (EST) Date: Tue, 25 Nov 2014 10:55:22 -0500 From: Theodore Ts'o To: Rasmus Villemoes Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v3 3/6] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141125155522.GH31339@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v3 3/6] vfs: don't let the dirty time inodes get more than a day stale References: <1416893674-419-1-git-send-email-tytso@mit.edu> <1416893674-419-4-git-send-email-tytso@mit.edu> <87ioi3iayu.fsf@rasmusvillemoes.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87ioi3iayu.fsf@rasmusvillemoes.dk> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416930924 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 25, 2014 at 03:58:01PM +0100, Rasmus Villemoes wrote: > > I think days_since_boot was a lot clearer than daycode. In any case, > please make the comment and the code consistent. Yeah, I was going back and forth between days since the epoch and days since boot, but found it was more efficient to calculate the days since boot. Sure, I'll go back to days_since_boot. > You should probably divide by the number of seconds in a day, not the > number of jiffies in a day. Right, brain hiccup on my part, will fix. > Isn't div_u64 mostly for when the divisor is not known at compile time? > Technically, "(u64)uptime.tv_sec / 86400" is of course a u64/u64 division, > but the compiler should see that the divisor is only 32 bits and hence > should be able to generate code which is at least as efficient as > whatever inline asm the arch provides for u64/u32 divisions. The problem with doing u64/u64 divisions is that the compiler will call out to a (non-existent) library function on some architectures. For example, try compiling the following using: with "gcc -S -m32 foo.c" int main(int argc, char **argv) { unsigned long long t = time(0); printf("%llu\n", t / 86400); } You will find in the .S file the following: ... pushl $0 pushl $86400 pushl %edx pushl %eax call __udivdi3 ... It will work finn compiling for x86_64, but if you do this and push out a git branch, you will soon get a very nice e-mail from the ktest bot explaining how you've broken the build on the i386 architecture since the kernel doesn't provide __udivdi3. Hence if you are doing any kind of divisions involving u64, you have to use the functions in include/linux/math64.h, and div_u64 is, per math64.h: /** * div_u64 - unsigned 64bit divide with 32bit divisor * * This is the most common 64bit divide and should be used if possible, * as many 32bit archs can optimize this variant better than a full 64bit * divide. */ Cheers, - Ted From dsterba@suse.cz Tue Nov 25 10:00:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E15737F3F for ; Tue, 25 Nov 2014 10:00:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C06BE8F8065 for ; Tue, 25 Nov 2014 08:00:20 -0800 (PST) X-ASG-Debug-ID: 1416931218-04bdf0616177f7c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id R2NiMT4uvMYLK5zw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 08:00:19 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CDFE3ACDE; Tue, 25 Nov 2014 16:00:17 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 82EC1DA93C; Tue, 25 Nov 2014 17:00:18 +0100 (CET) Date: Tue, 25 Nov 2014 17:00:18 +0100 From: David Sterba To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v3 1/6] fs: split update_time() into update_time() and write_time() Message-ID: <20141125160018.GG26471@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH-v3 1/6] fs: split update_time() into update_time() and write_time() Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers References: <1416893674-419-1-git-send-email-tytso@mit.edu> <1416893674-419-2-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416893674-419-2-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23.1-rc1 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416931218 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 25, 2014 at 12:34:29AM -0500, Theodore Ts'o wrote: > In preparation for adding support for the lazytime mount option, we > need to be able to separate out the update_time() and write_time() > inode operations. Currently, only btrfs and xfs uses update_time(). > > We needed to preserve update_time() because btrfs wants to have a > special btrfs_root_readonly() check; otherwise we could drop the > update_time() inode operation entirely. > > Signed-off-by: Theodore Ts'o > Cc: xfs@oss.sgi.com > Cc: linux-btrfs@vger.kernel.org For the btrfs changes Acked-by: David Sterba From dsterba@suse.cz Tue Nov 25 10:03:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ADB777F3F for ; Tue, 25 Nov 2014 10:03:01 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7F1088F8064 for ; Tue, 25 Nov 2014 08:02:58 -0800 (PST) X-ASG-Debug-ID: 1416931376-04bdf0615e77fa60001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 4jU4cEJcRBXEIEUg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 08:02:57 -0800 (PST) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C1942ADC4; Tue, 25 Nov 2014 16:02:55 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 74BC1DA93C; Tue, 25 Nov 2014 17:02:56 +0100 (CET) Date: Tue, 25 Nov 2014 17:02:56 +0100 From: David Sterba To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v3 6/6] btrfs: add an is_readonly() so btrfs can use common code for update_time() Message-ID: <20141125160256.GH26471@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH-v3 6/6] btrfs: add an is_readonly() so btrfs can use common code for update_time() Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers References: <1416893674-419-1-git-send-email-tytso@mit.edu> <1416893674-419-7-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416893674-419-7-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23.1-rc1 (2014-03-12) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416931376 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12029 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 25, 2014 at 12:34:34AM -0500, Theodore Ts'o wrote: > The only reason btrfs cloned code from the VFS layer was so it could > add a check to see if a subvolume is read-ony. Instead of doing that, > let's add a new inode operation which allows a file system to return > an error if the inode is read-only, and use that in update_time(). > There may be other places where the VFS layer may want to know that > btrfs would want to treat an inode is read-only. > > With this commit, there are no remaining users of update_time() in the > inode operations structure, so we can remove it and simply things > further. > > Signed-off-by: Theodore Ts'o > Cc: linux-btrfs@vger.kernel.org Reviewed-by: David Sterba From jack@suse.cz Tue Nov 25 11:19:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5DFD57F3F for ; Tue, 25 Nov 2014 11:19:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3D34E8F8052 for ; Tue, 25 Nov 2014 09:19:33 -0800 (PST) X-ASG-Debug-ID: 1416935971-04cbb01e5c61ba10001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id er7euhl4r5zy7d4n (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 09:19:31 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E10E1ADFC; Tue, 25 Nov 2014 17:19:30 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 515BA81C69; Tue, 25 Nov 2014 18:19:27 +0100 (CET) Date: Tue, 25 Nov 2014 18:19:27 +0100 From: Jan Kara To: Theodore Ts'o Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125171927.GC3228@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125043335.GF31339@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416935971 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12033 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon 24-11-14 23:33:35, Ted Tso wrote: > On Tue, Nov 25, 2014 at 12:52:39PM +1100, Dave Chinner wrote: > > Eviction is too late for this. I'm pretty sure that it won't get > > this far as iput_final() should catch the I_DIRTY_TIME in the !drop > > case via write_inode_now(). > > Actually, the tracepoint for fs_lazytime_evict() does get triggered > from time to time; but only when the inode is evicted due to memory > pressure, i.e., via the evict_inodes() path. > > I thought about possibly doing this in iput_final(), but that would > mean that whenever we closed the last fd on the file, we would push > the inode out to disk. For files that we are writing, that's not so > bad; but if we enable strictatime with lazytime, then we would be > updating the atime for inodes that had been only been read on every > close --- which in the case of say, all of the files in the kernel > tree, would be a little unfortunate. Actually, I'd also prefer to do the writing from iput_final(). My main reason is that shrinker starts behaving very differently when you put inodes with I_DIRTY_TIME to the LRU. See inode_lru_isolate() and in particular: /* * Referenced or dirty inodes are still in use. Give them another * pass * through the LRU as we canot reclaim them now. */ if (atomic_read(&inode->i_count) || (inode->i_state & ~I_REFERENCED)) { list_del_init(&inode->i_lru); spin_unlock(&inode->i_lock); this_cpu_dec(nr_unused); return LRU_REMOVED; } Regarding your concern that we'd write the inode when file is closed - that's not true. We'll write the inode only after corresponding dentry is evicted and thus drops inode reference. That doesn't seem too bad to me. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Tue Nov 25 11:30:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DE16E7F4E for ; Tue, 25 Nov 2014 11:30:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CAF4830404E for ; Tue, 25 Nov 2014 09:30:46 -0800 (PST) X-ASG-Debug-ID: 1416936644-04cbb01e5961c3e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id z8jKMOKppFLViTJK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 09:30:45 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 639D2AE19; Tue, 25 Nov 2014 17:30:44 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id D8F0981C69; Tue, 25 Nov 2014 18:30:40 +0100 (CET) Date: Tue, 25 Nov 2014 18:30:40 +0100 From: Jan Kara To: Theodore Ts'o Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125173040.GD3228@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125043335.GF31339@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416936645 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12033 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon 24-11-14 23:33:35, Ted Tso wrote: > On Tue, Nov 25, 2014 at 12:52:39PM +1100, Dave Chinner wrote: > > > +static void flush_sb_dirty_time(struct super_block *sb) > > > +{ > ... > > > +} > > > > This just seems wrong to me, not to mention extremely expensive when we have > > millions of cached inodes on the superblock. > > #1, It only gets called on a sync(2) or syncfs(2), which can be pretty > expensive as it is, so I didn't really worry about it. > > #2, We're already iterating over all of the inodes in the sync(2) or > syncfs(2) path, so the code path in question is already O(N) in the > number of inodes. > > > Why can't we just add a function like mark_inode_dirty_time() which > > puts the inode on the dirty inode list with a writeback time 24 > > hours in the future rather than 30s in the future? > > I was concerned about putting them on the dirty inode list because it > would be extra inodes for the writeback threads would have to skip > over and ignore (since they would not be dirty in the inde or data > pages sense). I agree this isn't going to work easily. Currently flusher relies on dirty list being sorted by i_dirtied_when and that gets harder to maintain if we ever have inodes with i_dirtied_when in future (we'd have to sort-in newly dirtied inodes). > Another solution would be to use a separate linked list for dirtytime > inodes, but that means adding some extra fields to the inode > structure, which some might view as bloat. Given #1 and #2 above, > yes, we're doubling the CPU cost for sync(2) and syncfs(2), since > we're not iterating over all of the inodes twice, but I believe that > is a better trade-off than bloating the inode structure with an extra > set of linked lists or increasing the CPU cost to the writeback path > (which gets executed way more often than the sync or syncfs paths). This would be possible and as Boaz says, it might be possible to reuse the same list_head in the inode for this. Getting rid of the full scan of all superblock inodes would be nice (as the scan gets really expensive for large numbers of inodes (think of i_sb_lock contention) and this makes it twice as bad) so I'd prefer to do this if possible. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Tue Nov 25 11:31:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BD63F7F56 for ; Tue, 25 Nov 2014 11:31:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A59DAC001 for ; Tue, 25 Nov 2014 09:31:33 -0800 (PST) X-ASG-Debug-ID: 1416936690-04bdf06161790c80001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id IpqcOBGwfqAlwzD5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 09:31:31 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 6973FAE19; Tue, 25 Nov 2014 17:31:30 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id DC6D681C69; Tue, 25 Nov 2014 18:31:26 +0100 (CET) Date: Tue, 25 Nov 2014 18:31:26 +0100 From: Jan Kara To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141125173126.GE3228@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416599964-21892-4-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416936691 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12033 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 21-11-14 14:59:23, Ted Tso wrote: > Guarantee that the on-disk timestamps will be no more than 24 hours > stale. Hum, how about reusing i_dirtied_when for this. Using that field even makes a good sence to me... Honza > Signed-off-by: Theodore Ts'o > --- > fs/fs-writeback.c | 1 + > fs/inode.c | 7 ++++++- > include/linux/fs.h | 1 + > 3 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c > index ce7de22..eb04277 100644 > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -1141,6 +1141,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) > if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { > trace_writeback_dirty_inode_start(inode, flags); > > + inode->i_ts_dirty_day = 0; > if (sb->s_op->dirty_inode) > sb->s_op->dirty_inode(inode, flags); > > diff --git a/fs/inode.c b/fs/inode.c > index 6e91aca..f0d6232 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -1511,6 +1511,7 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, > */ > static int update_time(struct inode *inode, struct timespec *time, int flags) > { > + int days_since_boot = jiffies / (HZ * 86400); > int ret; > > if (inode->i_op->update_time) { > @@ -1527,12 +1528,16 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) > if (flags & S_MTIME) > inode->i_mtime = *time; > } > - if (inode->i_sb->s_flags & MS_LAZYTIME) { > + if ((inode->i_sb->s_flags & MS_LAZYTIME) && > + (!inode->i_ts_dirty_day || > + inode->i_ts_dirty_day == days_since_boot)) { > spin_lock(&inode->i_lock); > inode->i_state |= I_DIRTY_TIME; > spin_unlock(&inode->i_lock); > + inode->i_ts_dirty_day = days_since_boot; > return 0; > } > + inode->i_ts_dirty_day = 0; > if (inode->i_op->write_time) > return inode->i_op->write_time(inode); > mark_inode_dirty_sync(inode); > diff --git a/include/linux/fs.h b/include/linux/fs.h > index 489b2f2..e3574cd 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -575,6 +575,7 @@ struct inode { > struct timespec i_ctime; > spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ > unsigned short i_bytes; > + unsigned short i_ts_dirty_day; > unsigned int i_blkbits; > blkcnt_t i_blocks; > > -- > 2.1.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Jan Kara SUSE Labs, CR From jack@suse.cz Tue Nov 25 11:34:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC5747F51 for ; Tue, 25 Nov 2014 11:34:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B067930404E for ; Tue, 25 Nov 2014 09:34:32 -0800 (PST) X-ASG-Debug-ID: 1416936870-04cb6c0570624950001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id hNHnE9ewYicGRFt9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 09:34:31 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 72F44ACDE; Tue, 25 Nov 2014 17:34:30 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id EC62281C69; Tue, 25 Nov 2014 18:34:26 +0100 (CET) Date: Tue, 25 Nov 2014 18:34:26 +0100 From: Jan Kara To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 4/4] ext4: add support for a lazytime mount option Message-ID: <20141125173426.GF3228@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 4/4] ext4: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-5-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416599964-21892-5-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416936871 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12032 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 21-11-14 14:59:24, Ted Tso wrote: > Add an optimization for the MS_LAZYTIME mount option so that we will > opportunistically write out any inodes with the I_DIRTY_TIME flag set > in a particular inode table block when we need to update some inode in > that inode table block anyway. > > Also add some temporary code so that we can set the lazytime mount > option without needing a modified /sbin/mount program which can set > MS_LAZYTIME. We can eventually make this go away once util-linux has > added support. ... > diff --git a/fs/inode.c b/fs/inode.c > index f0d6232..89cfca7 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -1292,6 +1292,42 @@ struct inode *ilookup(struct super_block *sb, unsigned long ino) > } > EXPORT_SYMBOL(ilookup); > > +/** > + * find_active_inode_nowait - find an active inode in the inode cache > + * @sb: super block of file system to search > + * @ino: inode number to search for > + * > + * Search for an active inode @ino in the inode cache, and if the > + * inode is in the cache, the inode is returned with an incremented > + * reference count. If the inode is being freed or is newly > + * initialized, return nothing instead of trying to wait for the inode > + * initialization or destruction to be complete. > + */ > +struct inode *find_active_inode_nowait(struct super_block *sb, > + unsigned long ino) > +{ > + struct hlist_head *head = inode_hashtable + hash(sb, ino); > + struct inode *inode, *ret_inode = NULL; > + > + spin_lock(&inode_hash_lock); > + hlist_for_each_entry(inode, head, i_hash) { > + if ((inode->i_ino != ino) || > + (inode->i_sb != sb)) > + continue; > + spin_lock(&inode->i_lock); > + if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) { > + __iget(inode); > + ret_inode = inode; > + } > + spin_unlock(&inode->i_lock); > + goto out; > + } > +out: > + spin_unlock(&inode_hash_lock); > + return ret_inode; > +} > +EXPORT_SYMBOL(find_active_inode_nowait); > + Please move this function definition into a separate patch so that it isn't hidden in an ext4-specific patch. Otherwise it looks good. Honza -- Jan Kara SUSE Labs, CR From gmc@esilibrary.com Tue Nov 25 11:57:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C49E27F3F for ; Tue, 25 Nov 2014 11:57:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A34138F8052 for ; Tue, 25 Nov 2014 09:57:08 -0800 (PST) X-ASG-Debug-ID: 1416938223-04cbb01e5b61e610001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id yAPV4FqUReKWTNTC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 09:57:04 -0800 (PST) X-Barracuda-Envelope-From: gmc@esilibrary.com X-Barracuda-Apparent-Source-IP: 209.85.220.177 Received: by mail-vc0-f177.google.com with SMTP id ij19so502615vcb.8 for ; Tue, 25 Nov 2014 09:57:03 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=gPV2BsajpkOEkEED9uOYup76J4cS+dCUiDhvtTekg/w=; b=mwImiWJlEWtBxe6tmgxLtuU4BZn8eC/XHI0JJmYvNQ6xtOECo2dn7G1r2Z1Q3qjfaf iWLXcGmfS2+IVeN+xac5PpITGDHSLfO3x0PYoGKnhP3dqll0cSwL3w/1/GEd8xFPnQav E/PVHmWte4zGyP29HiCQZfy4nt1WneIuN6rjdojRf5tTaLATskLnb47+aC4duqrGqWN4 QD0O/gwD+ZW1QAqpyJiex0b3999ebltR2zpyEv+qzPlRXxGENFwH4+G0HPhRB1rU9/Sb KY2E7sjmuyYYqoKNs0oC5hO3BOkobC/T+EM8KtdYmvvDqrNdwkLUzS82bAzEX/1EXwCM 3e2g== X-Gm-Message-State: ALoCoQmVjBdzn+oQ8HlrjD6e7OcrnCsVyKb0pztmp1o+HVtGZ70i8+3pAPwP1DbGyIx4A98fJT1H MIME-Version: 1.0 X-Received: by 10.220.77.196 with SMTP id h4mr15750834vck.14.1416938223099; Tue, 25 Nov 2014 09:57:03 -0800 (PST) Received: by 10.53.5.193 with HTTP; Tue, 25 Nov 2014 09:57:03 -0800 (PST) Date: Tue, 25 Nov 2014 09:57:03 -0800 Message-ID: Subject: Insight into soft lockup related to XFS? From: Galen Charlton X-ASG-Orig-Subj: Insight into soft lockup related to XFS? To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1416938224 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12033 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, Yesterday a Linux PostgreSQL server spontaneously rebooted after a few minutes of high I/O wait. The kernel log reported a number of errors related to the XFS filesystem backing the databases. Here is the uname -a: Linux pg01 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1+deb7u1 x86_64 GNU/Linux The filesystem in question is XFS running on top of an LVM2 logical volume over SSDs. There was no indication of a hardware failure. Relevant kernel error messages are below. I would appreciate thoughts on whether this is a known bug, and whether it would be advisable to upgrade to a newer kernel version. TIA, Galen Nov 24 16:16:30 pg01 kernel: [14140257.012068] BUG: soft lockup - CPU#8 stuck for 22s! [xfsaild/dm-1:2225] Nov 24 16:16:30 pg01 kernel: [14140257.012081] Modules linked in: mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power k10temp i2c_core hpilo container processor thermal_sys acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod usb_common [last unloaded: scsi_wait_scan] Nov 24 16:16:30 pg01 kernel: [14140257.012156] CPU 8 Nov 24 16:16:30 pg01 kernel: [14140257.012158] Modules linked in: mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power k10temp i2c_core hpilo container processor thermal_sys acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod usb_common [last unloaded: scsi_wait_scan] Nov 24 16:16:30 pg01 kernel: [14140257.012209] Nov 24 16:16:30 pg01 kernel: [14140257.012213] Pid: 2225, comm: xfsaild/dm-1 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.46-1+deb7u1 HP ProLiant DL385p Gen8 Nov 24 16:16:30 pg01 kernel: [14140257.012219] RIP: 0010:[] [] do_raw_spin_lock+0x15/0x1b Nov 24 16:16:30 pg01 kernel: [14140257.012230] RSP: 0000:ffff880ffbc79d68 EFLAGS: 00000297 Nov 24 16:16:30 pg01 kernel: [14140257.012233] RAX: 00000000cc7acc79 RBX: 0000000000000001 RCX: 0000000000051a00 Nov 24 16:16:30 pg01 kernel: [14140257.012236] RDX: 000000000000cc7a RSI: ffff880ffd112ea8 RDI: ffff880fff979ef8 Nov 24 16:16:30 pg01 kernel: [14140257.012240] RBP: ffff88103839fcc0 R08: 0000000000000000 R09: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012243] R10: 0000000000000000 R11: ffff880ffc0e4800 R12: 0000000000000100 Nov 24 16:16:30 pg01 kernel: [14140257.012246] R13: ffff8810396a7618 R14: ffff8810396a75d8 R15: 0000000000000058 Nov 24 16:16:30 pg01 kernel: [14140257.012251] FS: 00007f03d4d3b720(0000) GS:ffff88103fd00000(0000) knlGS:0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012254] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Nov 24 16:16:30 pg01 kernel: [14140257.012257] CR2: 00007f03d5005240 CR3: 0000000001605000 CR4: 00000000000406e0 Nov 24 16:16:30 pg01 kernel: [14140257.012261] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012265] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Nov 24 16:16:30 pg01 kernel: [14140257.012269] Process xfsaild/dm-1 (pid: 2225, threadinfo ffff880ffbc78000, task ffff880ffc184f20) Nov 24 16:16:30 pg01 kernel: [14140257.012272] Stack: Nov 24 16:16:30 pg01 kernel: [14140257.012277] ffffffffa03decb8 ffff880ffd112e00 ffffffffa03db42c ffff880ffd112e00 Nov 24 16:16:30 pg01 kernel: [14140257.012303] ffffffffa03db48f ffff88103839fcc0 ffff880ffd112e00 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012315] ffffffffa03dbf54 0000000000000000 ffff880ffc0e4800 ffff8830527b16d8 Nov 24 16:16:30 pg01 kernel: [14140257.012326] Call Trace: Nov 24 16:16:30 pg01 kernel: [14140257.012363] [] ? xfs_ail_min_lsn+0xd/0x2b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012388] [] ? xlog_assign_tail_lsn+0x11/0x26 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012413] [] ? xlog_state_release_iclog+0x4e/0x8f [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012438] [] ? _xfs_log_force+0xe7/0x1ae [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012463] [] ? xfs_log_force+0xb/0x2c [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012480] [] ? xfs_buf_trylock+0x41/0x80 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012504] [] ? xfs_buf_item_trylock+0x22/0x73 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012528] [] ? xfsaild+0x197/0x46b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012552] [] ? xfs_trans_ail_cursor_first+0x79/0x79 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012561] [] ? kthread+0x76/0x7e Nov 24 16:16:30 pg01 kernel: [14140257.012569] [] ? kernel_thread_helper+0x4/0x10 Nov 24 16:16:30 pg01 kernel: [14140257.012575] [] ? kthread_worker_fn+0x139/0x139 Nov 24 16:16:30 pg01 kernel: [14140257.012581] [] ? gs_change+0x13/0x13 Nov 24 16:16:30 pg01 kernel: [14140257.012584] Code: 05 e8 9b 2c 14 00 c3 f0 81 2f 00 00 10 00 74 05 e8 6c 2c 14 00 c3 b8 00 00 01 00 f0 0f c1 07 89 c2 c1 ea 10 66 39 d0 74 07 f3 90 <66> 8b 07 eb f4 c3 8b 17 31 c0 89 d1 c1 e9 10 66 39 ca 75 14 8d Nov 24 16:16:30 pg01 kernel: [14140257.012784] Call Trace: Nov 24 16:16:30 pg01 kernel: [14140257.012808] [] ? xfs_ail_min_lsn+0xd/0x2b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012833] [] ? xlog_assign_tail_lsn+0x11/0x26 [xfs] root@pg01:/var/log# less kern.log.1 Nov 24 16:16:30 pg01 kernel: [14140257.012068] BUG: soft lockup - CPU#8 stuck for 22s! [xfsaild/dm-1:2225] Nov 24 16:16:30 pg01 kernel: [14140257.012081] Modules linked in: mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power k10temp i2c_core hpilo container processor thermal_sys acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod usb_common [last unloaded: scsi_wait_scan] Nov 24 16:16:30 pg01 kernel: [14140257.012156] CPU 8 Nov 24 16:16:30 pg01 kernel: [14140257.012158] Modules linked in: mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power k10temp i2c_core hpilo container processor thermal_sys acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod usb_common [last unloaded: scsi_wait_scan] Nov 24 16:16:30 pg01 kernel: [14140257.012209] Nov 24 16:16:30 pg01 kernel: [14140257.012213] Pid: 2225, comm: xfsaild/dm-1 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.46-1+deb7u1 HP ProLiant DL385p Gen8 Nov 24 16:16:30 pg01 kernel: [14140257.012219] RIP: 0010:[] [] do_raw_spin_lock+0x15/0x1b Nov 24 16:16:30 pg01 kernel: [14140257.012230] RSP: 0000:ffff880ffbc79d68 EFLAGS: 00000297 Nov 24 16:16:30 pg01 kernel: [14140257.012233] RAX: 00000000cc7acc79 RBX: 0000000000000001 RCX: 0000000000051a00 Nov 24 16:16:30 pg01 kernel: [14140257.012236] RDX: 000000000000cc7a RSI: ffff880ffd112ea8 RDI: ffff880fff979ef8 Nov 24 16:16:30 pg01 kernel: [14140257.012240] RBP: ffff88103839fcc0 R08: 0000000000000000 R09: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012243] R10: 0000000000000000 R11: ffff880ffc0e4800 R12: 0000000000000100 Nov 24 16:16:30 pg01 kernel: [14140257.012246] R13: ffff8810396a7618 R14: ffff8810396a75d8 R15: 0000000000000058 Nov 24 16:16:30 pg01 kernel: [14140257.012251] FS: 00007f03d4d3b720(0000) GS:ffff88103fd00000(0000) knlGS:0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012254] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Nov 24 16:16:30 pg01 kernel: [14140257.012257] CR2: 00007f03d5005240 CR3: 0000000001605000 CR4: 00000000000406e0 Nov 24 16:16:30 pg01 kernel: [14140257.012261] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012265] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Nov 24 16:16:30 pg01 kernel: [14140257.012269] Process xfsaild/dm-1 (pid: 2225, threadinfo ffff880ffbc78000, task ffff880ffc184f20) Nov 24 16:16:30 pg01 kernel: [14140257.012272] Stack: Nov 24 16:16:30 pg01 kernel: [14140257.012277] ffffffffa03decb8 ffff880ffd112e00 ffffffffa03db42c ffff880ffd112e00 Nov 24 16:16:30 pg01 kernel: [14140257.012303] ffffffffa03db48f ffff88103839fcc0 ffff880ffd112e00 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.012315] ffffffffa03dbf54 0000000000000000 ffff880ffc0e4800 ffff8830527b16d8 Nov 24 16:16:30 pg01 kernel: [14140257.012326] Call Trace: Nov 24 16:16:30 pg01 kernel: [14140257.012363] [] ? xfs_ail_min_lsn+0xd/0x2b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012388] [] ? xlog_assign_tail_lsn+0x11/0x26 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012413] [] ? xlog_state_release_iclog+0x4e/0x8f [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012438] [] ? _xfs_log_force+0xe7/0x1ae [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012463] [] ? xfs_log_force+0xb/0x2c [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012480] [] ? xfs_buf_trylock+0x41/0x80 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012504] [] ? xfs_buf_item_trylock+0x22/0x73 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012528] [] ? xfsaild+0x197/0x46b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012552] [] ? xfs_trans_ail_cursor_first+0x79/0x79 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012561] [] ? kthread+0x76/0x7e Nov 24 16:16:30 pg01 kernel: [14140257.012569] [] ? kernel_thread_helper+0x4/0x10 Nov 24 16:16:30 pg01 kernel: [14140257.012575] [] ? kthread_worker_fn+0x139/0x139 Nov 24 16:16:30 pg01 kernel: [14140257.012581] [] ? gs_change+0x13/0x13 Nov 24 16:16:30 pg01 kernel: [14140257.012584] Code: 05 e8 9b 2c 14 00 c3 f0 81 2f 00 00 10 00 74 05 e8 6c 2c 14 00 c3 b8 00 00 01 00 f0 0f c1 07 89 c2 c1 ea 10 66 39 d0 74 07 f3 90 <66> 8b 07 eb f4 c3 8b 17 31 c0 89 d1 c1 e9 10 66 39 ca 75 14 8d Nov 24 16:16:30 pg01 kernel: [14140257.012784] Call Trace: Nov 24 16:16:30 pg01 kernel: [14140257.012808] [] ? xfs_ail_min_lsn+0xd/0x2b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012833] [] ? xlog_assign_tail_lsn+0x11/0x26 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012858] [] ? xlog_state_release_iclog+0x4e/0x8f [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012882] [] ? _xfs_log_force+0xe7/0x1ae [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012908] [] ? xfs_log_force+0xb/0x2c [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012924] [] ? xfs_buf_trylock+0x41/0x80 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012948] [] ? xfs_buf_item_trylock+0x22/0x73 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012971] [] ? xfsaild+0x197/0x46b [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.012996] [] ? xfs_trans_ail_cursor_first+0x79/0x79 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.013002] [] ? kthread+0x76/0x7e Nov 24 16:16:30 pg01 kernel: [14140257.013009] [] ? kernel_thread_helper+0x4/0x10 Nov 24 16:16:30 pg01 kernel: [14140257.013016] [] ? kthread_worker_fn+0x139/0x139 Nov 24 16:16:30 pg01 kernel: [14140257.013022] [] ? gs_change+0x13/0x13 Nov 24 16:16:30 pg01 kernel: [14140257.772117] BUG: soft lockup - CPU#16 stuck for 23s! [kworker/16:0:22897] Nov 24 16:16:30 pg01 kernel: [14140257.772135] Modules linked in: mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power k10temp i2c_core hpilo container processor thermal_sys acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod usb_common [last unloaded: scsi_wait_scan] Nov 24 16:16:30 pg01 kernel: [14140257.772221] CPU 16 Nov 24 16:16:30 pg01 kernel: [14140257.772223] Modules linked in: mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power k10temp i2c_core hpilo container processor thermal_sys acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod usb_common [last unloaded: scsi_wait_scan] Nov 24 16:16:30 pg01 kernel: [14140257.772291] Nov 24 16:16:30 pg01 kernel: [14140257.772296] Pid: 22897, comm: kworker/16:0 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.46-1+deb7u1 HP ProLiant DL385p Gen8 Nov 24 16:16:30 pg01 kernel: [14140257.772303] RIP: 0010:[] [] do_raw_spin_lock+0x15/0x1b Nov 24 16:16:30 pg01 kernel: [14140257.772315] RSP: 0000:ffff88089c3c5de8 EFLAGS: 00000293 Nov 24 16:16:30 pg01 kernel: [14140257.772319] RAX: 00000000cc7bcc79 RBX: 0000000000000000 RCX: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.772322] RDX: 000000000000cc7b RSI: 0000000000000000 RDI: ffff880fff979ef8 Nov 24 16:16:30 pg01 kernel: [14140257.772326] RBP: ffff88089c3c5e40 R08: 00007daa00040400 R09: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.772330] R10: 0000000000000000 R11: ffff88106a7ff9f8 R12: ffff88303fdd3780 Nov 24 16:16:30 pg01 kernel: [14140257.772333] R13: ffffffff81036e18 R14: 00000001d2b38ed8 R15: ffff882039a5e080 Nov 24 16:16:30 pg01 kernel: [14140257.772338] FS: 00007f03d4d3b720(0000) GS:ffff88203fc00000(0000) knlGS:0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.772342] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Nov 24 16:16:30 pg01 kernel: [14140257.772345] CR2: 00007efdb86cf057 CR3: 0000000001605000 CR4: 00000000000406e0 Nov 24 16:16:30 pg01 kernel: [14140257.772349] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Nov 24 16:16:30 pg01 kernel: [14140257.772353] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Nov 24 16:16:30 pg01 kernel: [14140257.772358] Process kworker/16:0 (pid: 22897, threadinfo ffff88089c3c4000, task ffff881c1cde90e0) Nov 24 16:16:30 pg01 kernel: [14140257.772361] Stack: Nov 24 16:16:30 pg01 kernel: [14140257.772368] ffffffffa03de40d ffff881c1cde94a0 000000103fc13780 ffff881c1cde90e0 Nov 24 16:16:30 pg01 kernel: [14140257.772385] ffff88203fc13780 ffff881c1cde90e0 000000002956d538 ffff88208a3afac0 Nov 24 16:16:30 pg01 kernel: [14140257.772398] ffffe8e000c00a00 0000000000000000 ffffe8e000c00a55 ffff88203fc0e640 Nov 24 16:16:30 pg01 kernel: [14140257.772411] Call Trace: Nov 24 16:16:30 pg01 kernel: [14140257.772446] [] ? xfs_iflush_done+0xc7/0x160 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.772471] [] ? xfs_buf_do_callbacks+0x22/0x30 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.772496] [] ? xfs_buf_iodone_callbacks+0x172/0x196 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.772505] [] ? process_one_work+0x161/0x264 Nov 24 16:16:30 pg01 kernel: [14140257.772512] [] ? worker_thread+0xc2/0x145 Nov 24 16:16:30 pg01 kernel: [14140257.772519] [] ? manage_workers.isra.25+0x15b/0x15b Nov 24 16:16:30 pg01 kernel: [14140257.772527] [] ? kthread+0x76/0x7e Nov 24 16:16:30 pg01 kernel: [14140257.772535] [] ? kernel_thread_helper+0x4/0x10 Nov 24 16:16:30 pg01 kernel: [14140257.772543] [] ? kthread_worker_fn+0x139/0x139 Nov 24 16:16:30 pg01 kernel: [14140257.772549] [] ? gs_change+0x13/0x13 Nov 24 16:16:30 pg01 kernel: [14140257.772552] Code: 05 e8 9b 2c 14 00 c3 f0 81 2f 00 00 10 00 74 05 e8 6c 2c 14 00 c3 b8 00 00 01 00 f0 0f c1 07 89 c2 c1 ea 10 66 39 d0 74 07 f3 90 <66> 8b 07 eb f4 c3 8b 17 31 c0 89 d1 c1 e9 10 66 39 ca 75 14 8d Nov 24 16:16:30 pg01 kernel: [14140257.772786] Call Trace: Nov 24 16:16:30 pg01 kernel: [14140257.772810] [] ? xfs_iflush_done+0xc7/0x160 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.772835] [] ? xfs_buf_do_callbacks+0x22/0x30 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.772860] [] ? xfs_buf_iodone_callbacks+0x172/0x196 [xfs] Nov 24 16:16:30 pg01 kernel: [14140257.772867] [] ? process_one_work+0x161/0x264 Nov 24 16:16:30 pg01 kernel: [14140257.772873] [] ? worker_thread+0xc2/0x145 Nov 24 16:16:30 pg01 kernel: [14140257.772880] [] ? manage_workers.isra.25+0x15b/0x15b Nov 24 16:16:30 pg01 kernel: [14140257.772887] [] ? kthread+0x76/0x7e Nov 24 16:16:30 pg01 kernel: [14140257.772894] [] ? kernel_thread_helper+0x4/0x10 Nov 24 16:16:30 pg01 kernel: [14140257.772901] [] ? kthread_worker_fn+0x139/0x139 Nov 24 16:16:30 pg01 kernel: [14140257.772907] [] ? gs_change+0x13/0x13 -- Galen Charlton Manager of Implementation Equinox Software, Inc. / The Open Source Experts email: gmc@esilibrary.com direct: +1 770-709-5581 cell: +1 404-984-4366 skype: gmcharlt web: http://www.esilibrary.com/ Supporting Koha and Evergreen: http://koha-community.org & http://evergreen-ils.org From tytso@thunk.org Tue Nov 25 11:57:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 197167F3F for ; Tue, 25 Nov 2014 11:57:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D165E30404E for ; Tue, 25 Nov 2014 09:57:26 -0800 (PST) X-ASG-Debug-ID: 1416938243-04bdf0615f792900001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id bbpUZzZJbSTMyb5C (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 09:57:24 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=MXj4V0Xjp6O988CMYcud/EI2V1bPlblG69Pt7rCdalc=; b=haQlGvjgKC6YdmoGQsk2BI4VMbV6x1CUgxhIhZlm415RJhONGpcGyNZvuo95UcJJpOHWpjrrt/Rd6IZcKKd3CPC8qJEdBIEEAiYK3lb3qKTJ3jpB78jAU9AZskqWX+33eZ/dn6YirGNCOJbL8I3tOFol5efZ/9eNfE4ZVm0jf/Q=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtKMb-000458-JB; Tue, 25 Nov 2014 17:57:21 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id A1431580213; Tue, 25 Nov 2014 12:57:16 -0500 (EST) Date: Tue, 25 Nov 2014 12:57:16 -0500 From: Theodore Ts'o To: Jan Kara Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125175716.GC11648@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> <20141125171927.GC3228@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125171927.GC3228@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416938244 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12033 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 25, 2014 at 06:19:27PM +0100, Jan Kara wrote: > Actually, I'd also prefer to do the writing from iput_final(). My main > reason is that shrinker starts behaving very differently when you put > inodes with I_DIRTY_TIME to the LRU. See inode_lru_isolate() and in > particular: > /* > * Referenced or dirty inodes are still in use. Give them another > * pass > * through the LRU as we canot reclaim them now. > */ > if (atomic_read(&inode->i_count) || > (inode->i_state & ~I_REFERENCED)) { > list_del_init(&inode->i_lru); > spin_unlock(&inode->i_lock); > this_cpu_dec(nr_unused); > return LRU_REMOVED; > } I must be missing something; how would the shirnker behave differently? I_DIRTY_TIME shouldn't have any effect on the shrinker; note that I_DIRTY_TIME is *not* part of I_DIRTY, and this was quite deliberate, because I didn't want I_DIRTY_TIME to have any affect on any of the other parts of the writeback or inode management parts. > Regarding your concern that we'd write the inode when file is closed - > that's not true. We'll write the inode only after corresponding dentry is > evicted and thus drops inode reference. That doesn't seem too bad to me. True, fair enough. It's not quite so lazy, but it should be close enough. I'm still not seeing the benefit in waiting until the last possible minute to write out the timestamps; evict() can block as it is if there are any writeback that needs to be completed, and if the writeback happens to pages subject to delalloc, the timestamp update could happen for free at that point. - Ted From tytso@thunk.org Tue Nov 25 13:26:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8528B7F3F for ; Tue, 25 Nov 2014 13:26:16 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 743828F8052 for ; Tue, 25 Nov 2014 11:26:13 -0800 (PST) X-ASG-Debug-ID: 1416943572-04cb6c057162f830001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id D7E1yUMpAjA8PRTZ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 11:26:12 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=S9VHJkVZAJy7yudlur8a8JedGwUglxMrulr6xGU6EEM=; b=FSt34HrSjW9/kt4zm8fpzxdngRz1FAphrRfOgRBJlOdCypE6POfWutmVz0FZ5nYXsMTjg3IQ5gN8xILhRiO30hP4ScbfsrkFtjxm1X2+FazJz7yrZKmIUBp4coF3+68k67RehePmi9REnFW79dvsD6g+UXmp2bDnMNHbcW/eoX8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtLkX-00050f-DQ; Tue, 25 Nov 2014 19:26:09 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id F2F70580213; Tue, 25 Nov 2014 14:26:09 -0500 (EST) Date: Tue, 25 Nov 2014 14:26:09 -0500 From: Theodore Ts'o To: Jan Kara Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125192609.GA28449@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> <20141125173040.GD3228@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125173040.GD3228@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416943572 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12036 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Nov 25, 2014 at 06:30:40PM +0100, Jan Kara wrote: > This would be possible and as Boaz says, it might be possible to reuse > the same list_head in the inode for this. Getting rid of the full scan of > all superblock inodes would be nice (as the scan gets really expensive for > large numbers of inodes (think of i_sb_lock contention) and this makes it > twice as bad) so I'd prefer to do this if possible. Fair enough, I'll give this a try. Personally, I've never been that solicitous towards the efficiency of sync, since if you ever use it, you tend to destroy performance just because of contention of the disk drive head caused by the writeback, never mind the i_sb_lock contention. ("I am sync(2), the destroyer of tail latency SLO's...") In fact there has sometimes been discussion about disabling sync(2) from non-root users, because the opportunity for mischief when a developer logs and types sync out of reflex is too high. Of course, if we ever did this, I'm sure such a patch would never be accepted upstream, but that's OK, most people don't seem to care about tail latency outside of Facebook and Google anyway.... - Ted From bfoster@redhat.com Tue Nov 25 13:27:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D5E787F3F for ; Tue, 25 Nov 2014 13:27:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C28DE8F8059 for ; Tue, 25 Nov 2014 11:27:43 -0800 (PST) X-ASG-Debug-ID: 1416943661-04cbb01e5b6269e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yA2pEaMLTPEhw6cM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 11:27:42 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sAPJRdRA031579 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Tue, 25 Nov 2014 14:27:40 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sAPJRcrv013274; Tue, 25 Nov 2014 14:27:39 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 89F6A12388E; Tue, 25 Nov 2014 14:27:37 -0500 (EST) Date: Tue, 25 Nov 2014 14:27:37 -0500 From: Brian Foster To: Galen Charlton Cc: xfs@oss.sgi.com Subject: Re: Insight into soft lockup related to XFS? Message-ID: <20141125192737.GC8132@bfoster.bfoster> X-ASG-Orig-Subj: Re: Insight into soft lockup related to XFS? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1416943662 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Nov 25, 2014 at 09:57:03AM -0800, Galen Charlton wrote: > Hi, > > Yesterday a Linux PostgreSQL server spontaneously rebooted after a few > minutes of high I/O wait. The kernel log reported a number of errors > related to the XFS filesystem backing the databases. > Do you reproduce this often or is this a one-off occurrence? > Here is the uname -a: Linux pg01 3.2.0-4-amd64 #1 SMP Debian > 3.2.46-1+deb7u1 x86_64 GNU/Linux > Fairly old and a distro kernel, though it looks like this could be a stable variant (I'm not familiar with Debian kernels). > The filesystem in question is XFS running on top of an LVM2 logical > volume over SSDs. There was no indication of a hardware failure. > > Relevant kernel error messages are below. I would appreciate thoughts > on whether this is a known bug, and whether it would be advisable to > upgrade to a newer kernel version. > FYI, the output below is line-wrapped and difficult to read. It's best to try and post log content so your mailer doesn't munge it (or also attach it unformatted so it's easier to parse). Anyways, this looks like it could be the lock recursion problem fixed by the following commits: 5337fe9b xfs: recheck buffer pinned status after push trylock failure fa5566e4 xfs: remove log force from xfs_buf_trylock() ... which were introduced around v3.9. On a quick search, I don't see these commits in stable trees before that so the v3.10 stable tree would be the first where they are available. Brian > TIA, > > Galen > > Nov 24 16:16:30 pg01 kernel: [14140257.012068] BUG: soft lockup - > CPU#8 stuck for 22s! [xfsaild/dm-1:2225] > Nov 24 16:16:30 pg01 kernel: [14140257.012081] Modules linked in: > mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs > drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd > amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel > ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore > cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power > k10temp i2c_core hpilo container processor thermal_sys > acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid > ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd > pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod > usb_common [last unloaded: scsi_wait_scan] > Nov 24 16:16:30 pg01 kernel: [14140257.012156] CPU 8 > Nov 24 16:16:30 pg01 kernel: [14140257.012158] Modules linked in: > mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs > drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd > amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel > ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore > cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power > k10temp i2c_core hpilo container processor thermal_sys > acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid > ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd > pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod > usb_common [last unloaded: scsi_wait_scan] > Nov 24 16:16:30 pg01 kernel: [14140257.012209] > Nov 24 16:16:30 pg01 kernel: [14140257.012213] Pid: 2225, comm: > xfsaild/dm-1 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.46-1+deb7u1 HP > ProLiant DL385p Gen8 > Nov 24 16:16:30 pg01 kernel: [14140257.012219] RIP: > 0010:[] [] > do_raw_spin_lock+0x15/0x1b > Nov 24 16:16:30 pg01 kernel: [14140257.012230] RSP: > 0000:ffff880ffbc79d68 EFLAGS: 00000297 > Nov 24 16:16:30 pg01 kernel: [14140257.012233] RAX: 00000000cc7acc79 > RBX: 0000000000000001 RCX: 0000000000051a00 > Nov 24 16:16:30 pg01 kernel: [14140257.012236] RDX: 000000000000cc7a > RSI: ffff880ffd112ea8 RDI: ffff880fff979ef8 > Nov 24 16:16:30 pg01 kernel: [14140257.012240] RBP: ffff88103839fcc0 > R08: 0000000000000000 R09: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012243] R10: 0000000000000000 > R11: ffff880ffc0e4800 R12: 0000000000000100 > Nov 24 16:16:30 pg01 kernel: [14140257.012246] R13: ffff8810396a7618 > R14: ffff8810396a75d8 R15: 0000000000000058 > Nov 24 16:16:30 pg01 kernel: [14140257.012251] FS: > 00007f03d4d3b720(0000) GS:ffff88103fd00000(0000) > knlGS:0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012254] CS: 0010 DS: 0000 ES: > 0000 CR0: 000000008005003b > Nov 24 16:16:30 pg01 kernel: [14140257.012257] CR2: 00007f03d5005240 > CR3: 0000000001605000 CR4: 00000000000406e0 > Nov 24 16:16:30 pg01 kernel: [14140257.012261] DR0: 0000000000000000 > DR1: 0000000000000000 DR2: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012265] DR3: 0000000000000000 > DR6: 00000000ffff0ff0 DR7: 0000000000000400 > Nov 24 16:16:30 pg01 kernel: [14140257.012269] Process xfsaild/dm-1 > (pid: 2225, threadinfo ffff880ffbc78000, task ffff880ffc184f20) > Nov 24 16:16:30 pg01 kernel: [14140257.012272] Stack: > Nov 24 16:16:30 pg01 kernel: [14140257.012277] ffffffffa03decb8 > ffff880ffd112e00 ffffffffa03db42c ffff880ffd112e00 > Nov 24 16:16:30 pg01 kernel: [14140257.012303] ffffffffa03db48f > ffff88103839fcc0 ffff880ffd112e00 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012315] ffffffffa03dbf54 > 0000000000000000 ffff880ffc0e4800 ffff8830527b16d8 > Nov 24 16:16:30 pg01 kernel: [14140257.012326] Call Trace: > Nov 24 16:16:30 pg01 kernel: [14140257.012363] [] ? > xfs_ail_min_lsn+0xd/0x2b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012388] [] ? > xlog_assign_tail_lsn+0x11/0x26 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012413] [] ? > xlog_state_release_iclog+0x4e/0x8f [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012438] [] ? > _xfs_log_force+0xe7/0x1ae [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012463] [] ? > xfs_log_force+0xb/0x2c [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012480] [] ? > xfs_buf_trylock+0x41/0x80 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012504] [] ? > xfs_buf_item_trylock+0x22/0x73 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012528] [] ? > xfsaild+0x197/0x46b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012552] [] ? > xfs_trans_ail_cursor_first+0x79/0x79 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012561] [] ? > kthread+0x76/0x7e > Nov 24 16:16:30 pg01 kernel: [14140257.012569] [] ? > kernel_thread_helper+0x4/0x10 > Nov 24 16:16:30 pg01 kernel: [14140257.012575] [] ? > kthread_worker_fn+0x139/0x139 > Nov 24 16:16:30 pg01 kernel: [14140257.012581] [] ? > gs_change+0x13/0x13 > Nov 24 16:16:30 pg01 kernel: [14140257.012584] Code: 05 e8 9b 2c 14 00 > c3 f0 81 2f 00 00 10 00 74 05 e8 6c 2c 14 00 c3 b8 00 00 01 00 f0 0f > c1 07 89 c2 c1 ea 10 66 39 d0 74 07 f3 90 <66> 8b 07 eb f4 c3 8b 17 31 > c0 89 d1 c1 e9 10 66 39 ca 75 14 8d > Nov 24 16:16:30 pg01 kernel: [14140257.012784] Call Trace: > Nov 24 16:16:30 pg01 kernel: [14140257.012808] [] ? > xfs_ail_min_lsn+0xd/0x2b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012833] [] ? > xlog_assign_tail_lsn+0x11/0x26 [xfs] > root@pg01:/var/log# less kern.log.1 > Nov 24 16:16:30 pg01 kernel: [14140257.012068] BUG: soft lockup - > CPU#8 stuck for 22s! [xfsaild/dm-1:2225] > Nov 24 16:16:30 pg01 kernel: [14140257.012081] Modules linked in: > mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs > drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd > amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel > ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore > cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power > k10temp i2c_core hpilo container processor thermal_sys > acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid > ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd > pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod > usb_common [last unloaded: scsi_wait_scan] > Nov 24 16:16:30 pg01 kernel: [14140257.012156] CPU 8 > Nov 24 16:16:30 pg01 kernel: [14140257.012158] Modules linked in: > mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs > drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd > amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel > ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore > cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power > k10temp i2c_core hpilo container processor thermal_sys > acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid > ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd > pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod > usb_common [last unloaded: scsi_wait_scan] > Nov 24 16:16:30 pg01 kernel: [14140257.012209] > Nov 24 16:16:30 pg01 kernel: [14140257.012213] Pid: 2225, comm: > xfsaild/dm-1 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.46-1+deb7u1 HP > ProLiant DL385p Gen8 > Nov 24 16:16:30 pg01 kernel: [14140257.012219] RIP: > 0010:[] [] > do_raw_spin_lock+0x15/0x1b > Nov 24 16:16:30 pg01 kernel: [14140257.012230] RSP: > 0000:ffff880ffbc79d68 EFLAGS: 00000297 > Nov 24 16:16:30 pg01 kernel: [14140257.012233] RAX: 00000000cc7acc79 > RBX: 0000000000000001 RCX: 0000000000051a00 > Nov 24 16:16:30 pg01 kernel: [14140257.012236] RDX: 000000000000cc7a > RSI: ffff880ffd112ea8 RDI: ffff880fff979ef8 > Nov 24 16:16:30 pg01 kernel: [14140257.012240] RBP: ffff88103839fcc0 > R08: 0000000000000000 R09: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012243] R10: 0000000000000000 > R11: ffff880ffc0e4800 R12: 0000000000000100 > Nov 24 16:16:30 pg01 kernel: [14140257.012246] R13: ffff8810396a7618 > R14: ffff8810396a75d8 R15: 0000000000000058 > Nov 24 16:16:30 pg01 kernel: [14140257.012251] FS: > 00007f03d4d3b720(0000) GS:ffff88103fd00000(0000) > knlGS:0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012254] CS: 0010 DS: 0000 ES: > 0000 CR0: 000000008005003b > Nov 24 16:16:30 pg01 kernel: [14140257.012257] CR2: 00007f03d5005240 > CR3: 0000000001605000 CR4: 00000000000406e0 > Nov 24 16:16:30 pg01 kernel: [14140257.012261] DR0: 0000000000000000 > DR1: 0000000000000000 DR2: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012265] DR3: 0000000000000000 > DR6: 00000000ffff0ff0 DR7: 0000000000000400 > Nov 24 16:16:30 pg01 kernel: [14140257.012269] Process xfsaild/dm-1 > (pid: 2225, threadinfo ffff880ffbc78000, task ffff880ffc184f20) > Nov 24 16:16:30 pg01 kernel: [14140257.012272] Stack: > Nov 24 16:16:30 pg01 kernel: [14140257.012277] ffffffffa03decb8 > ffff880ffd112e00 ffffffffa03db42c ffff880ffd112e00 > Nov 24 16:16:30 pg01 kernel: [14140257.012303] ffffffffa03db48f > ffff88103839fcc0 ffff880ffd112e00 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.012315] ffffffffa03dbf54 > 0000000000000000 ffff880ffc0e4800 ffff8830527b16d8 > Nov 24 16:16:30 pg01 kernel: [14140257.012326] Call Trace: > Nov 24 16:16:30 pg01 kernel: [14140257.012363] [] ? > xfs_ail_min_lsn+0xd/0x2b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012388] [] ? > xlog_assign_tail_lsn+0x11/0x26 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012413] [] ? > xlog_state_release_iclog+0x4e/0x8f [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012438] [] ? > _xfs_log_force+0xe7/0x1ae [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012463] [] ? > xfs_log_force+0xb/0x2c [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012480] [] ? > xfs_buf_trylock+0x41/0x80 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012504] [] ? > xfs_buf_item_trylock+0x22/0x73 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012528] [] ? > xfsaild+0x197/0x46b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012552] [] ? > xfs_trans_ail_cursor_first+0x79/0x79 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012561] [] ? > kthread+0x76/0x7e > Nov 24 16:16:30 pg01 kernel: [14140257.012569] [] ? > kernel_thread_helper+0x4/0x10 > Nov 24 16:16:30 pg01 kernel: [14140257.012575] [] ? > kthread_worker_fn+0x139/0x139 > Nov 24 16:16:30 pg01 kernel: [14140257.012581] [] ? > gs_change+0x13/0x13 > Nov 24 16:16:30 pg01 kernel: [14140257.012584] Code: 05 e8 9b 2c 14 00 > c3 f0 81 2f 00 00 10 00 74 05 e8 6c 2c 14 00 c3 b8 00 00 01 00 f0 0f > c1 07 89 c2 c1 ea 10 66 39 d0 74 07 f3 90 <66> 8b 07 eb f4 c3 8b 17 31 > c0 89 d1 c1 e9 10 66 39 ca 75 14 8d > Nov 24 16:16:30 pg01 kernel: [14140257.012784] Call Trace: > Nov 24 16:16:30 pg01 kernel: [14140257.012808] [] ? > xfs_ail_min_lsn+0xd/0x2b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012833] [] ? > xlog_assign_tail_lsn+0x11/0x26 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012858] [] ? > xlog_state_release_iclog+0x4e/0x8f [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012882] [] ? > _xfs_log_force+0xe7/0x1ae [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012908] [] ? > xfs_log_force+0xb/0x2c [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012924] [] ? > xfs_buf_trylock+0x41/0x80 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012948] [] ? > xfs_buf_item_trylock+0x22/0x73 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012971] [] ? > xfsaild+0x197/0x46b [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.012996] [] ? > xfs_trans_ail_cursor_first+0x79/0x79 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.013002] [] ? > kthread+0x76/0x7e > Nov 24 16:16:30 pg01 kernel: [14140257.013009] [] ? > kernel_thread_helper+0x4/0x10 > Nov 24 16:16:30 pg01 kernel: [14140257.013016] [] ? > kthread_worker_fn+0x139/0x139 > Nov 24 16:16:30 pg01 kernel: [14140257.013022] [] ? > gs_change+0x13/0x13 > Nov 24 16:16:30 pg01 kernel: [14140257.772117] BUG: soft lockup - > CPU#16 stuck for 23s! [kworker/16:0:22897] > Nov 24 16:16:30 pg01 kernel: [14140257.772135] Modules linked in: > mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs > drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd > amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel > ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore > cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power > k10temp i2c_core hpilo container processor thermal_sys > acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid > ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd > pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod > usb_common [last unloaded: scsi_wait_scan] > Nov 24 16:16:30 pg01 kernel: [14140257.772221] CPU 16 > Nov 24 16:16:30 pg01 kernel: [14140257.772223] Modules linked in: > mptctl mptbase nfsd nfs nfs_acl auth_rpcgss fscache lockd sunrpc xfs > drbd lru_cache loop snd_pcm mperf snd_page_alloc snd_timer snd > amd64_edac_mod edac_mce_amd sp5100_tco hpwdt joydev evdev crc32c_intel > ghash_clmulni_intel aesni_intel aes_x86_64 aes_generic soundcore > cryptd edac_core pcspkr psmouse serio_raw i2c_piix4 fam15h_power > k10temp i2c_core hpilo container processor thermal_sys > acpi_power_meter button ext4 crc16 jbd2 mbcache dm_mod usbhid hid > ata_generic ahci sd_mod sg crc_t10dif libahci uhci_hcd ohci_hcd > pata_atiixp libata ehci_hcd usbcore tg3 hpsa libphy scsi_mod > usb_common [last unloaded: scsi_wait_scan] > Nov 24 16:16:30 pg01 kernel: [14140257.772291] > Nov 24 16:16:30 pg01 kernel: [14140257.772296] Pid: 22897, comm: > kworker/16:0 Not tainted 3.2.0-4-amd64 #1 Debian 3.2.46-1+deb7u1 HP > ProLiant DL385p Gen8 > Nov 24 16:16:30 pg01 kernel: [14140257.772303] RIP: > 0010:[] [] > do_raw_spin_lock+0x15/0x1b > Nov 24 16:16:30 pg01 kernel: [14140257.772315] RSP: > 0000:ffff88089c3c5de8 EFLAGS: 00000293 > Nov 24 16:16:30 pg01 kernel: [14140257.772319] RAX: 00000000cc7bcc79 > RBX: 0000000000000000 RCX: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.772322] RDX: 000000000000cc7b > RSI: 0000000000000000 RDI: ffff880fff979ef8 > Nov 24 16:16:30 pg01 kernel: [14140257.772326] RBP: ffff88089c3c5e40 > R08: 00007daa00040400 R09: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.772330] R10: 0000000000000000 > R11: ffff88106a7ff9f8 R12: ffff88303fdd3780 > Nov 24 16:16:30 pg01 kernel: [14140257.772333] R13: ffffffff81036e18 > R14: 00000001d2b38ed8 R15: ffff882039a5e080 > Nov 24 16:16:30 pg01 kernel: [14140257.772338] FS: > 00007f03d4d3b720(0000) GS:ffff88203fc00000(0000) > knlGS:0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.772342] CS: 0010 DS: 0000 ES: > 0000 CR0: 000000008005003b > Nov 24 16:16:30 pg01 kernel: [14140257.772345] CR2: 00007efdb86cf057 > CR3: 0000000001605000 CR4: 00000000000406e0 > Nov 24 16:16:30 pg01 kernel: [14140257.772349] DR0: 0000000000000000 > DR1: 0000000000000000 DR2: 0000000000000000 > Nov 24 16:16:30 pg01 kernel: [14140257.772353] DR3: 0000000000000000 > DR6: 00000000ffff0ff0 DR7: 0000000000000400 > Nov 24 16:16:30 pg01 kernel: [14140257.772358] Process kworker/16:0 > (pid: 22897, threadinfo ffff88089c3c4000, task ffff881c1cde90e0) > Nov 24 16:16:30 pg01 kernel: [14140257.772361] Stack: > Nov 24 16:16:30 pg01 kernel: [14140257.772368] ffffffffa03de40d > ffff881c1cde94a0 000000103fc13780 ffff881c1cde90e0 > Nov 24 16:16:30 pg01 kernel: [14140257.772385] ffff88203fc13780 > ffff881c1cde90e0 000000002956d538 ffff88208a3afac0 > Nov 24 16:16:30 pg01 kernel: [14140257.772398] ffffe8e000c00a00 > 0000000000000000 ffffe8e000c00a55 ffff88203fc0e640 > Nov 24 16:16:30 pg01 kernel: [14140257.772411] Call Trace: > Nov 24 16:16:30 pg01 kernel: [14140257.772446] [] ? > xfs_iflush_done+0xc7/0x160 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.772471] [] ? > xfs_buf_do_callbacks+0x22/0x30 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.772496] [] ? > xfs_buf_iodone_callbacks+0x172/0x196 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.772505] [] ? > process_one_work+0x161/0x264 > Nov 24 16:16:30 pg01 kernel: [14140257.772512] [] ? > worker_thread+0xc2/0x145 > Nov 24 16:16:30 pg01 kernel: [14140257.772519] [] ? > manage_workers.isra.25+0x15b/0x15b > Nov 24 16:16:30 pg01 kernel: [14140257.772527] [] ? > kthread+0x76/0x7e > Nov 24 16:16:30 pg01 kernel: [14140257.772535] [] ? > kernel_thread_helper+0x4/0x10 > Nov 24 16:16:30 pg01 kernel: [14140257.772543] [] ? > kthread_worker_fn+0x139/0x139 > Nov 24 16:16:30 pg01 kernel: [14140257.772549] [] ? > gs_change+0x13/0x13 > Nov 24 16:16:30 pg01 kernel: [14140257.772552] Code: 05 e8 9b 2c 14 00 > c3 f0 81 2f 00 00 10 00 74 05 e8 6c 2c 14 00 c3 b8 00 00 01 00 f0 0f > c1 07 89 c2 c1 ea 10 66 39 d0 74 07 f3 90 <66> 8b 07 eb f4 c3 8b 17 31 > c0 89 d1 c1 e9 10 66 39 ca 75 14 8d > Nov 24 16:16:30 pg01 kernel: [14140257.772786] Call Trace: > Nov 24 16:16:30 pg01 kernel: [14140257.772810] [] ? > xfs_iflush_done+0xc7/0x160 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.772835] [] ? > xfs_buf_do_callbacks+0x22/0x30 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.772860] [] ? > xfs_buf_iodone_callbacks+0x172/0x196 [xfs] > Nov 24 16:16:30 pg01 kernel: [14140257.772867] [] ? > process_one_work+0x161/0x264 > Nov 24 16:16:30 pg01 kernel: [14140257.772873] [] ? > worker_thread+0xc2/0x145 > Nov 24 16:16:30 pg01 kernel: [14140257.772880] [] ? > manage_workers.isra.25+0x15b/0x15b > Nov 24 16:16:30 pg01 kernel: [14140257.772887] [] ? > kthread+0x76/0x7e > Nov 24 16:16:30 pg01 kernel: [14140257.772894] [] ? > kernel_thread_helper+0x4/0x10 > Nov 24 16:16:30 pg01 kernel: [14140257.772901] [] ? > kthread_worker_fn+0x139/0x139 > Nov 24 16:16:30 pg01 kernel: [14140257.772907] [] ? > gs_change+0x13/0x13 > > -- > Galen Charlton > Manager of Implementation > Equinox Software, Inc. / The Open Source Experts > email: gmc@esilibrary.com > direct: +1 770-709-5581 > cell: +1 404-984-4366 > skype: gmcharlt > web: http://www.esilibrary.com/ > Supporting Koha and Evergreen: http://koha-community.org & > http://evergreen-ils.org > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From gmc@esilibrary.com Tue Nov 25 13:57:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F4F47F56 for ; Tue, 25 Nov 2014 13:57:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D279304062 for ; Tue, 25 Nov 2014 11:57:27 -0800 (PST) X-ASG-Debug-ID: 1416945446-04cb6c0571637b10001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id kZwDAlTqAzEQNGhE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Nov 2014 11:57:26 -0800 (PST) X-Barracuda-Envelope-From: gmc@esilibrary.com X-Barracuda-Apparent-Source-IP: 209.85.220.177 Received: by mail-vc0-f177.google.com with SMTP id ij19so607491vcb.8 for ; Tue, 25 Nov 2014 11:57:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=Zp8DGOEc+teCRbADVdI/0qD6EKq3RsE/147/cCOoxXg=; b=fuZjFt/yWdtDjLtiTN5Cns3zNLkzcDA+RtgXoiZmGgErxqomkeJVifnIb3BkCTPHYE TpHh4C3Xe6JDKhgJVsP7vXEeRPE7QODQt//6u6NJdcaGI2CZWHGKjW9VMFVQrRNWp1qI 0dPxgWKp3a8YmPICv7dBXPNEQwPO7b9NiaG2qMGj1SZhgMF6+IlQivhNaLB4DYbgr6Oq hPTBH5d32/d76vRXdhiuMPohjCM7Z50+o55Y05NKrzSg1QbeysT3q9IWraQtw+gf8FiD NLie2FCkMW7vVlP35mm6A2aIN/lym+2vOyyCrgw38G9nrECGDwd1ZHaAvU0t+JVewt34 eD9A== X-Gm-Message-State: ALoCoQk6f2ZIjHTXTOmDcfWTVbqcwIq5YH0+aKgnS5JAHpt51UfNfZoCZ3KxjvAw67oSRwyuvnvh MIME-Version: 1.0 X-Received: by 10.220.182.136 with SMTP id cc8mr15906212vcb.45.1416945445585; Tue, 25 Nov 2014 11:57:25 -0800 (PST) Received: by 10.53.5.193 with HTTP; Tue, 25 Nov 2014 11:57:25 -0800 (PST) In-Reply-To: <20141125192737.GC8132@bfoster.bfoster> References: <20141125192737.GC8132@bfoster.bfoster> Date: Tue, 25 Nov 2014 11:57:25 -0800 Message-ID: Subject: Re: Insight into soft lockup related to XFS? From: Galen Charlton X-ASG-Orig-Subj: Re: Insight into soft lockup related to XFS? To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1416945446 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12038 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, On Tue, Nov 25, 2014 at 11:27 AM, Brian Foster wrote: > Do you reproduce this often or is this a one-off occurrence? So far, just a one-off after a couple hundred days of uptime. > FYI, the output below is line-wrapped and difficult to read. It's best > to try and post log content so your mailer doesn't munge it (or also > attach it unformatted so it's easier to parse). Gah, sorry about that. > Anyways, this looks like it could be the lock recursion problem fixed by > the following commits: > > 5337fe9b xfs: recheck buffer pinned status after push trylock failure > fa5566e4 xfs: remove log force from xfs_buf_trylock() > > ... which were introduced around v3.9. On a quick search, I don't see > these commits in stable trees before that so the v3.10 stable tree would > be the first where they are available. Thanks! Regards, Galen -- Galen Charlton Manager of Implementation Equinox Software, Inc. / The Open Source Experts email: gmc@esilibrary.com direct: +1 770-709-5581 cell: +1 404-984-4366 skype: gmcharlt web: http://www.esilibrary.com/ Supporting Koha and Evergreen: http://koha-community.org & http://evergreen-ils.org From jack@suse.cz Tue Nov 25 14:18:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BC6147F47 for ; Tue, 25 Nov 2014 14:18:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7FB4530404E for ; Tue, 25 Nov 2014 12:18:17 -0800 (PST) X-ASG-Debug-ID: 1416946694-04bdf061607a51c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id FbAMwQfuoENZkOn6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Nov 2014 12:18:15 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 3E525ACD3; Tue, 25 Nov 2014 20:18:14 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 75E8A81C69; Tue, 25 Nov 2014 21:18:10 +0100 (CET) Date: Tue, 25 Nov 2014 21:18:10 +0100 From: Jan Kara To: Theodore Ts'o Cc: Jan Kara , Dave Chinner , linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141125201810.GA18592@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> <20141125171927.GC3228@quack.suse.cz> <20141125175716.GC11648@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125175716.GC11648@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1416946695 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue 25-11-14 12:57:16, Ted Tso wrote: > On Tue, Nov 25, 2014 at 06:19:27PM +0100, Jan Kara wrote: > > Actually, I'd also prefer to do the writing from iput_final(). My main > > reason is that shrinker starts behaving very differently when you put > > inodes with I_DIRTY_TIME to the LRU. See inode_lru_isolate() and in > > particular: > > /* > > * Referenced or dirty inodes are still in use. Give them another > > * pass > > * through the LRU as we canot reclaim them now. > > */ > > if (atomic_read(&inode->i_count) || > > (inode->i_state & ~I_REFERENCED)) { > > list_del_init(&inode->i_lru); > > spin_unlock(&inode->i_lock); > > this_cpu_dec(nr_unused); > > return LRU_REMOVED; > > } > > I must be missing something; how would the shirnker behave > differently? I_DIRTY_TIME shouldn't have any effect on the shrinker; > note that I_DIRTY_TIME is *not* part of I_DIRTY, and this was quite > deliberate, because I didn't want I_DIRTY_TIME to have any affect on > any of the other parts of the writeback or inode management parts. Sure, but the test tests whether the inode has *any other* bit than I_REFERENCED set. So I_DIRTY_TIME will trigger the test and we just remove the inode from lru list. You could exclude I_DIRTY_TIME from this test to avoid this problem but then the shrinker latency would get much larger because it will suddently do IO in evict(). So I still think doing the write in iput_final() is the best solution. > > Regarding your concern that we'd write the inode when file is closed - > > that's not true. We'll write the inode only after corresponding dentry is > > evicted and thus drops inode reference. That doesn't seem too bad to me. > > True, fair enough. It's not quite so lazy, but it should be close > enough. > > I'm still not seeing the benefit in waiting until the last possible > minute to write out the timestamps; evict() can block as it is if > there are any writeback that needs to be completed, and if the > writeback happens to pages subject to delalloc, the timestamp update > could happen for free at that point. Yeah, doing IO from evict is OK in princible but the change in shrinker success rate / latency worries me... It would certainly need careful testing under memory pressure & IO load with lots of outstanding timestamp updates and see how shrinker behaves (change in CPU consumption, numbers of evicted inodes, etc.). Honza -- Jan Kara SUSE Labs, CR From david@fromorbit.com Tue Nov 25 17:32:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C06D37F3F for ; Tue, 25 Nov 2014 17:32:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5DED0AC00B for ; Tue, 25 Nov 2014 15:32:12 -0800 (PST) X-ASG-Debug-ID: 1416958328-04bdf0615f7f4a70001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 50DH89Z4LANzo0KF for ; Tue, 25 Nov 2014 15:32:08 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al0rAAIRdVR5LEkvPGdsb2JhbABbgwaBKYY5rX8BAQEBAQEGlTODbYE0BAICgQ8XAQEBAQEGAQEBATg7hAIBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOINwjRUQEBAQcCAR8Yhh+KRAeDLoEfBZ57gTaDWYgajgQzMIJKAQEB Received: from ppp121-44-73-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.73.47]) by ipmail05.adl6.internode.on.net with ESMTP; 26 Nov 2014 09:48:30 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XtPNM-0007Ip-Pg; Wed, 26 Nov 2014 10:18:28 +1100 Date: Wed, 26 Nov 2014 10:18:28 +1100 From: Dave Chinner To: Peter Watkins Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: overflow in xfs_iomap_eof_align_last_fsb Message-ID: <20141125231828.GA9561@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: overflow in xfs_iomap_eof_align_last_fsb References: <1416855973-6359-1-git-send-email-treestem@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416855973-6359-1-git-send-email-treestem@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1416958328 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12047 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 02:06:13PM -0500, Peter Watkins wrote: > Someone else may have run into this already, if not please take > a look. > > Peter > > If extsize is set and new_last_fsb is larger than 32 bits, the > roundup to extsize will overflow the align variable. Instead, > combine alignments by rounding extsize hint up to stripe size. Change of allocator behaviour that will cause significant problems for applications that depend on deterministic behaviour from the extent size hint. i.e. The extsize hint is supposed to override all other alignments that are made - extent size hints are effectively a "unit of allocation". Hence we round up to stripe unit/width, then apply the extent size hint alignment so that extent sizes are always aligned to the extent size hint.... .... > @@ -52,7 +52,7 @@ xfs_iomap_eof_align_last_fsb( > xfs_extlen_t extsize, > xfs_fileoff_t *last_fsb) > { > - xfs_fileoff_t new_last_fsb = 0; > + xfs_fileoff_t new_last_fsb; That can be declared in the context that uses it now. > xfs_extlen_t align = 0; > int eof, error; > > @@ -70,23 +70,24 @@ xfs_iomap_eof_align_last_fsb( > else if (mp->m_dalign) > align = mp->m_dalign; > > - if (align && XFS_ISIZE(ip) >= XFS_FSB_TO_B(mp, align)) > - new_last_fsb = roundup_64(*last_fsb, align); > + if (align && XFS_ISIZE(ip) < XFS_FSB_TO_B(mp, align)) > + align = 0; > } > > /* > - * Always round up the allocation request to an extent boundary > - * (when file on a real-time subvolume or has di_extsize hint). > + * Round up the allocation request to an extent boundary. If > + * already aligned to a stripe, round extsize up to a stripe > + * boundary. > */ Drop the comment change... > if (extsize) { > - if (new_last_fsb) > - align = roundup_64(new_last_fsb, extsize); > + if (align) > + align = roundup_64(extsize, align); align = roundup(align, extsize); > else > align = extsize; > - new_last_fsb = roundup_64(*last_fsb, align); > } > > - if (new_last_fsb) { > + if (align) { > + new_last_fsb = roundup_64(*last_fsb, align); xfs_fileoff_t new_last_fsb = roundup_64(*last_fsb, align); > error = xfs_bmap_eof(ip, new_last_fsb, XFS_DATA_FORK, &eof); > if (error) > return error; Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 25 17:49:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DECCA7F3F for ; Tue, 25 Nov 2014 17:49:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7B38BAC001 for ; Tue, 25 Nov 2014 15:49:52 -0800 (PST) X-ASG-Debug-ID: 1416959374-04bdf0615f7f5340001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id z7oqjLvGEqVh6imS for ; Tue, 25 Nov 2014 15:49:34 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ah0tAIMUdVR5LEkvPGdsb2JhbABbDoJ4gSmGOa1/AQEBAQEBBpUzhSECAgEBAoEPFwEBAQEBBgEBAQE4O4QCAQEBAwE6HCMFCwgDGAklDwUlAwcaE4g3CNFVAQEBAQYCAR8Yhh+KRAeDLoEfAQSee5pZVDMwgkoBAQE Received: from ppp121-44-73-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.73.47]) by ipmail05.adl6.internode.on.net with ESMTP; 26 Nov 2014 10:18:52 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XtPql-0007LV-L6; Wed, 26 Nov 2014 10:48:51 +1100 Date: Wed, 26 Nov 2014 10:48:51 +1100 From: Dave Chinner To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141125234851.GB9561@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> <20141125015332.GE27262@dastard> <20141125044508.GG31339@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125044508.GG31339@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1416959374 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12049 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 11:45:08PM -0500, Theodore Ts'o wrote: > On Tue, Nov 25, 2014 at 12:53:32PM +1100, Dave Chinner wrote: > > On Fri, Nov 21, 2014 at 02:59:23PM -0500, Theodore Ts'o wrote: > > > Guarantee that the on-disk timestamps will be no more than 24 hours > > > stale. > > > > > > Signed-off-by: Theodore Ts'o > > > > If we put these inodes on the dirty inode list with at writeback > > time of 24 hours, this is completely unnecessary. > > What do you mean by "a writeback time of 24 hours"? Do you mean > creating a new field in the inode which specifies when the writeback > should happen? No. > I still worry about the dirty inode list getting > somewhat long large in the strictatime && lazytime case, and the inode > bloat nazi's coming after us for adding a new field to struct inode > structure. Use another pure inode time dirty list, and move the inode to the existing dirty list when it gets marked I_DIRTY. > Or do you mean trying to abuse the dirtied_when field in some way? No abuse necessary at all. Just a different inode_dirtied_after() check is requires if the inode is on the time dirty list in move_expired_inodes(). Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Nov 25 18:24:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D3D3D7F3F for ; Tue, 25 Nov 2014 18:24:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 80805AC004 for ; Tue, 25 Nov 2014 16:24:35 -0800 (PST) X-ASG-Debug-ID: 1416961472-04bdf0615e7fad50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id zRjafxMC4OlsLW0G for ; Tue, 25 Nov 2014 16:24:32 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvQZAIQcdVR5LEkvPGdsb2JhbABbDoJ4gSmGOa1+AQEBAQEBBpUzhSEEAgKBEBcBAQEBAQYBAQEBODuEAgEBAQMBJxMcIwULCAMYCSUPBSUDBxoTG4gcCNFQAQEBAQYCAR8Yhh+KRAeDLoEfBZ57gTaHEopLh0ZUMzCCSgEBAQ Received: from ppp121-44-73-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.73.47]) by ipmail05.adl6.internode.on.net with ESMTP; 26 Nov 2014 10:54:16 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XtQP0-0007PE-JF; Wed, 26 Nov 2014 11:24:14 +1100 Date: Wed, 26 Nov 2014 11:24:14 +1100 From: Dave Chinner To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/4] vfs: add support for a lazytime mount option Message-ID: <20141126002414.GC9561@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] vfs: add support for a lazytime mount option References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-3-git-send-email-tytso@mit.edu> <20141125015239.GD27262@dastard> <20141125043335.GF31339@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125043335.GF31339@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1416961472 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12051 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Nov 24, 2014 at 11:33:35PM -0500, Theodore Ts'o wrote: > On Tue, Nov 25, 2014 at 12:52:39PM +1100, Dave Chinner wrote: > > > +static void flush_sb_dirty_time(struct super_block *sb) > > > +{ > ... > > > +} > > > > This just seems wrong to me, not to mention extremely expensive when we have > > millions of cached inodes on the superblock. > > #1, It only gets called on a sync(2) or syncfs(2), which can be pretty > expensive as it is, so I didn't really worry about it. > > #2, We're already iterating over all of the inodes in the sync(2) or > syncfs(2) path, so the code path in question is already O(N) in the > number of inodes. > > > Why can't we just add a function like mark_inode_dirty_time() which > > puts the inode on the dirty inode list with a writeback time 24 > > hours in the future rather than 30s in the future? > > I was concerned about putting them on the dirty inode list because it > would be extra inodes for the writeback threads would have to skip > over and ignore (since they would not be dirty in the inde or data > pages sense). Create another list - we already have multiple dirty inode lists in the struct bdi_writeback.... > Another solution would be to use a separate linked list for dirtytime > inodes, but that means adding some extra fields to the inode > structure, which some might view as bloat. We already have an i_wb_list in the inode for tracking the dirty list the inode belongs to. > Given #1 and #2 above, > yes, we're doubling the CPU cost for sync(2) and syncfs(2), since > we're not iterating over all of the inodes twice, but I believe that > is a better trade-off than bloating the inode structure with an extra > set of linked lists or increasing the CPU cost to the writeback path > (which gets executed way more often than the sync or syncfs paths). There is no need to bloat the inode at all, therefore we shouldn't be causing sync/syncfs regressions by enabling lazytime... > > Eviction is too late for this. I'm pretty sure that it won't get > > this far as iput_final() should catch the I_DIRTY_TIME in the !drop > > case via write_inode_now(). > > Actually, the tracepoint for fs_lazytime_evict() does get triggered > from time to time; but only when the inode is evicted due to memory > pressure, i.e., via the evict_inodes() path. That's indicative of a bug - if it's dirty then you shouldn't be evicting it. The LRU shrinker explicitly avoids reclaiming dirty inodes. Also, evict_inodes() is only called in the unmount path, and that happens after a sync_filesystem() call so that shouldn't be finding dirty inodes, either.... > I thought about possibly doing this in iput_final(), but that would > mean that whenever we closed the last fd on the file, we would push > the inode out to disk. I get the feeling from your responses that you really don't understand the VFS inode lifecycle or the writeback code works. Inodes don't get dropped form the inode cache when the last open FD on them is closed unless they are an unlinked file. The dentry cache still holds a reference to the inode.... > For files that we are writing, that's not so > bad; but if we enable strictatime with lazytime, then we would be > updating the atime for inodes that had been only been read on every > close --- which in the case of say, all of the files in the kernel > tree, would be a little unfortunate. > > Of course, the combination of strict atime and lazytime would result > in a pretty heavy write load on a umount or sync(2), so I suspect > keeping the relatime mode would make sense for most people, but I for > those people who need strict Posix compliance, it seemed like doing > something that worked well for strictatime plus lazytime would be a > good thing, which is why I tried to defer things as much as possible. > > > if (!datasync && (inode->i_state & I_DIRTY_TIME)) { > > > > > + spin_lock(&inode->i_lock); > > > + inode->i_state |= I_DIRTY_SYNC; > > > + spin_unlock(&inode->i_lock); > > > + } > > > return file->f_op->fsync(file, start, end, datasync); > > > > When we mark the inode I_DIRTY_TIME, we should also be marking it > > I_DIRTY_SYNC so that all the sync operations know that they should > > be writing this inode. That's partly why I also think these inodes > > should be tracked on the dirty inode list.... > > The whole point of what I was doing is that I_DIRTY_TIME was not part > of I_DIRTY, and that when in update_time() we set I_DIRTY_TIME instead > of I_DIRTY_SYNC. I_DIRTY_SYNC only matters once you get the inode into the fsync code or deep into the inode writeback code (i.e. __writeback_single_inode()). if we don't expire the inode at the high level writeback code, then the only time we'll get into __writeback_single_inode() is through specific foreground attempts to write the inode. In which case, we should be writing the inode if it is I_DIRTY_TIME, and so I_DIRTY_SYNC will trigger all the correct code paths to be taken to get us to writing it. And then we don't need hacks like the above to get fsync to write the inode.... > The goal is that these inodes would not end up on > the dirty list, because that way they wouldn't be forced out to disk > until either (a) the inode is written out for other reasons (i.e., a > change in i_size or i_blocks, etc.), (b) the inode is explicitly > fsync'ed, or (c) the the umount(2), sync(2), or syncfs(2) of the file > system. Precisely. If we don't expire the inode from the dirty list, and it will only get written back when inode writeback is explicitly asked for. > That way, the timestamps are in the memory copy inode, but *not* > written on disk until they are opportunistically written out due to > some other modification of the inode which sets I_DIRTY_SYNC. > > If we were to set I_DIRTY_SYNC alongside I_DIRTY_TIME, and put these > inodes on the dirty inode list, then I_DIRTY_TIME would effectively be > a no-op, and there would be no point to this whole exercise. Except for the fact that I_DIRTY_TIME would result in the inode being put on a different dirty list, and then when it's marked dirty properly it can be moved onto the dirty inode list that will trigger background writeback in 30s.... > If there is significant objections to doing this in the VFS layer, I'm > happy to go back to doing this as in ext4-specific code. > The main reason why I redid this patch set as a VFS specific change > was because Cristoph and others specifically requested it. But if you > strongly object, I can always go back to doing this in the ext4 code.... Don't be a drama queen, Ted. lazytime is something that needs to be done at the VFS but it needs to be done efficiently. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Wed Nov 26 04:20:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 60ADB7F4E for ; Wed, 26 Nov 2014 04:20:29 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4F19530404E for ; Wed, 26 Nov 2014 02:20:25 -0800 (PST) X-ASG-Debug-ID: 1416997220-04cb6c05736fd860001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id lUKfD2ZxvMP3WwR9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:20:20 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=jDRmmrCvZ/czo8kDav6OMpk5TJXaEzivdmpqOTLzmWc=; b=f6KgXFYp6qBhHRigmWUHJI8wXUm1AWBnvErPFZXRDkIPBAyVVml5CjjppRSXHTXtwn45Tz4M4GJ61+sIsNMTCIKKd0CHx8ncByZ0ODA4oMkNoNubjqwMxW1TIh773xrrXjhH2+bGP/NczyrRsnakOIDn90Js+7B+8/0xWggQU1k=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZhq-0003PI-LF; Wed, 26 Nov 2014 10:20:18 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 161DF580213; Wed, 26 Nov 2014 05:20:17 -0500 (EST) Date: Wed, 26 Nov 2014 05:20:17 -0500 From: Theodore Ts'o To: Dave Chinner Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141126102017.GJ28449@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> <20141125015332.GE27262@dastard> <20141125044508.GG31339@thunk.org> <20141125234851.GB9561@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141125234851.GB9561@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997220 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Nov 26, 2014 at 10:48:51AM +1100, Dave Chinner wrote: > No abuse necessary at all. Just a different inode_dirtied_after() > check is requires if the inode is on the time dirty list in > move_expired_inodes(). I'm still not sure what you have in mind here. When would this be checked? It sounds like you want to set a timeout such that when an inode which had its timestamps updated lazily 24 hours earlier, the inode would get written out. Yes? But that implies something is going to have to scan the list of inodes on the dirty time list periodically. When are you proposing that this take place? The various approaches that come to mind all seem more complex than what I have in this patch 3 of 4, and I'm not sure it's worth the complexity. - Ted From tytso@thunk.org Wed Nov 26 04:24:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 29C017F51 for ; Wed, 26 Nov 2014 04:24:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 185448F8033 for ; Wed, 26 Nov 2014 02:24:06 -0800 (PST) X-ASG-Debug-ID: 1416997444-04cbb01e5b6e1340001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id MNgxWvQaf0LTo6lN (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:04 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=iqBO+nJocdLcbYhs+zSUprij26uHqa3IaOrvL/L1sm4=; b=sQ/U4O6dnGxmdZ1rtOi9PmvNjiJ//C6peK/4ZkmymOQqXIvKg3oUuio3L8slfK4NGFftJ45MmcHhM7wd/p/TBOUu/Z9zDSVUNDhoh9CmpRPzPxsAR6WSt2bmr7Mb6j13BV7W6Vukv0T8komveDxy8pmvCRz5dZzlCReeToRZsHE=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlT-0003QK-VH; Wed, 26 Nov 2014 10:24:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5CE2D5801A8; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Date: Wed, 26 Nov 2014 05:23:51 -0500 X-ASG-Orig-Subj: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-Id: <1416997437-26092-2-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997444 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature In preparation for adding support for the lazytime mount option, we need to be able to separate out the update_time() and write_time() inode operations. Currently, only btrfs and xfs uses update_time(). We needed to preserve update_time() because btrfs wants to have a special btrfs_root_readonly() check; otherwise we could drop the update_time() inode operation entirely. Signed-off-by: Theodore Ts'o Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Acked-by: David Sterba --- Documentation/filesystems/Locking | 2 ++ fs/btrfs/inode.c | 10 ++++++++++ fs/inode.c | 29 ++++++++++++++++++----------- fs/xfs/xfs_iops.c | 39 ++++++++++++++++----------------------- include/linux/fs.h | 1 + 5 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index b30753c..e49861d 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -63,6 +63,7 @@ prototypes: int (*removexattr) (struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); void (*update_time)(struct inode *, struct timespec *, int); + void (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); @@ -95,6 +96,7 @@ listxattr: no removexattr: yes fiemap: no update_time: no +write_time: no atomic_open: yes tmpfile: no dentry_open: no diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d23362f..a5e0d0d 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5574,6 +5574,11 @@ static int btrfs_update_time(struct inode *inode, struct timespec *now, inode->i_mtime = *now; if (flags & S_ATIME) inode->i_atime = *now; + return 0; +} + +static int btrfs_write_time(struct inode *inode) +{ return btrfs_dirty_inode(inode); } @@ -9462,6 +9467,7 @@ static const struct inode_operations btrfs_dir_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9470,6 +9476,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9540,6 +9547,7 @@ static const struct inode_operations btrfs_file_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9552,6 +9560,7 @@ static const struct inode_operations btrfs_special_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9565,6 +9574,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; const struct dentry_operations btrfs_dentry_operations = { diff --git a/fs/inode.c b/fs/inode.c index 26753ba..8f5c4b5 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1499,17 +1499,24 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { - if (inode->i_op->update_time) - return inode->i_op->update_time(inode, time, flags); - - if (flags & S_ATIME) - inode->i_atime = *time; - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *time; - if (flags & S_MTIME) - inode->i_mtime = *time; + int ret; + + if (inode->i_op->update_time) { + ret = inode->i_op->update_time(inode, time, flags); + if (ret) + return ret; + } else { + if (flags & S_ATIME) + inode->i_atime = *time; + if (flags & S_VERSION) + inode_inc_iversion(inode); + if (flags & S_CTIME) + inode->i_ctime = *time; + if (flags & S_MTIME) + inode->i_mtime = *time; + } + if (inode->i_op->write_time) + return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..0e9653c 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -984,10 +984,8 @@ xfs_vn_setattr( } STATIC int -xfs_vn_update_time( - struct inode *inode, - struct timespec *now, - int flags) +xfs_vn_write_time( + struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; @@ -1004,21 +1002,16 @@ xfs_vn_update_time( } xfs_ilock(ip, XFS_ILOCK_EXCL); - if (flags & S_CTIME) { - inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_MTIME) { - inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_ATIME) { - inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec; - } + + ip->i_d.di_ctime.t_sec = (__int32_t) inode->i_ctime.tv_sec; + ip->i_d.di_ctime.t_nsec = (__int32_t) inode->i_ctime.tv_nsec; + + ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec; + ip->i_d.di_mtime.t_nsec = (__int32_t) inode->i_mtime.tv_nsec; + + ip->i_d.di_atime.t_sec = (__int32_t) inode->i_atime.tv_sec; + ip->i_d.di_atime.t_nsec = (__int32_t) inode->i_atime.tv_nsec; + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); return xfs_trans_commit(tp, 0); @@ -1129,7 +1122,7 @@ static const struct inode_operations xfs_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .fiemap = xfs_vn_fiemap, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; static const struct inode_operations xfs_dir_inode_operations = { @@ -1156,7 +1149,7 @@ static const struct inode_operations xfs_dir_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1184,7 +1177,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1198,7 +1191,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { .getxattr = generic_getxattr, .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, - .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; STATIC void diff --git a/include/linux/fs.h b/include/linux/fs.h index 9ab779e..3633239 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,6 +1545,7 @@ struct inode_operations { int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*update_time)(struct inode *, struct timespec *, int); + int (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 87CC77F57 for ; Wed, 26 Nov 2014 04:24:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41DA330404E for ; Wed, 26 Nov 2014 02:24:06 -0800 (PST) X-ASG-Debug-ID: 1416997444-04bdf0615f8690a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 6bPiLOiHRUrmhPQh (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:04 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=9DBTw49VRyNZBE3cqhMxqy5iGnKIouhyJzVyb5aDi6s=; b=MMebIisriM9VzlNw+6NxkZM4uaLNu2f/OvUmgk9wFu+5VkukaBFXT59kI+Tbs14J54+a9NM58+LumDu/DZWTY/uugUrTS1rZPrysoiEB0923b2tnlYjNOvTNJ3ZAwxQqVlEgFaRsqm1UFVpVwRot6lmBQX3gQVIjBrhh5GW+H/M=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlT-0003QL-VF; Wed, 26 Nov 2014 10:24:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 64E5158028E; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 3/7] vfs: don't let the dirty time inodes get more than a day stale Date: Wed, 26 Nov 2014 05:23:53 -0500 X-ASG-Orig-Subj: [PATCH-v4 3/7] vfs: don't let the dirty time inodes get more than a day stale Message-Id: <1416997437-26092-4-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997444 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Guarantee that the on-disk timestamps will be no more than 24 hours stale. Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 1 + fs/inode.c | 18 ++++++++++++++++++ include/linux/fs.h | 1 + 3 files changed, 20 insertions(+) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ef8c5d8..529480a 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -1143,6 +1143,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { trace_writeback_dirty_inode_start(inode, flags); + inode->i_ts_dirty_day = 0; if (sb->s_op->dirty_inode) sb->s_op->dirty_inode(inode, flags); diff --git a/fs/inode.c b/fs/inode.c index 9e464cc..37c0429 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1510,6 +1510,8 @@ static int relatime_need_update(struct vfsmount *mnt, struct inode *inode, */ static int update_time(struct inode *inode, struct timespec *time, int flags) { + struct timespec uptime; + unsigned short days_since_boot; int ret; if (inode->i_op->update_time) { @@ -1526,11 +1528,26 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } + /* + * If i_ts_dirty_day is zero, then either we have not deferred + * timestamp updates, or the system has been up for less than + * a day (so days_since_boot is zero), so we defer timestamp + * updates in that case and set the I_DIRTY_TIME flag. If a + * day or more has passed, then i_ts_dirty_day will be + * different from days_since_boot, and then we should update + * the on-disk inode and then we can clear i_ts_dirty_day. + */ if ((inode->i_sb->s_flags & MS_LAZYTIME) && !(flags & S_VERSION) && !(inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC))) { if (inode->i_state & I_DIRTY_TIME) return 0; + get_monotonic_boottime(&uptime); + days_since_boot = div_u64(uptime.tv_sec, 86400); + if (inode->i_ts_dirty_day && + (inode->i_ts_dirty_day != days_since_boot)) + goto force_dirty; + spin_lock(&inode->i_lock); if (inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { spin_unlock(&inode->i_lock); @@ -1541,6 +1558,7 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) return 0; } inode->i_state |= I_DIRTY_TIME; + inode->i_ts_dirty_day = days_since_boot; spin_unlock(&inode->i_lock); inode_requeue_dirtytime(inode); return 0; diff --git a/include/linux/fs.h b/include/linux/fs.h index 55cf34d..d0a2181 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -575,6 +575,7 @@ struct inode { struct timespec i_ctime; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ unsigned short i_bytes; + unsigned short i_ts_dirty_day; unsigned int i_blkbits; blkcnt_t i_blocks; -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6EEAF7F56 for ; Wed, 26 Nov 2014 04:24:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 092BAAC006 for ; Wed, 26 Nov 2014 02:24:05 -0800 (PST) X-ASG-Debug-ID: 1416997444-04bdf061608690a0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 0vLzrCQo3VvwN5oB (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:04 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=Message-Id:Date:Subject:Cc:To:From; bh=ixTtqKFWIlXtENQc2bXLV+cShhwHkw3wFM6ybKlNMMU=; b=NxCmj3aH/MD5EauT6AH51qJWQm1IqLQepGyH0uwaMVBveXkBgfvgDxj/n9vAcrqTC7cLOkJpCNjrFS+lKH+mNgKWZAbD0Q9Fk4eXMNJAT4PH79XBKTwIQOAuvBCRnG2YQ4Xo8wX0+dt8ctZgVJNcYU5AucWPX5vKr5Lu9dPksiM=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlT-0003QH-Uy; Wed, 26 Nov 2014 10:24:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 5A841580213; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 0/7] add support for a lazytime mount option Date: Wed, 26 Nov 2014 05:23:50 -0500 X-ASG-Orig-Subj: [PATCH-v4 0/7] add support for a lazytime mount option Message-Id: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997444 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is an updated version of what had originally been an ext4-specific patch which significantly improves performance by lazily writing timestamp updates (and in particular, mtime updates) to disk. The in-memory timestamps are always correct, but they are only written to disk when required for correctness. This provides a huge performance boost for ext4 due to how it handles journalling, but it's valuable for all file systems running on flash storage or drive-managed SMR disks by reducing the metadata write load. So upon request, I've moved the functionality to the VFS layer. Once the /sbin/mount program adds support for MS_LAZYTIME, all file systems should be able to benefit from this optimization. There is still an ext4-specific optimization, which may be applicable for other file systems which store more than one inode in a block, but it will require file system specific code. It is purely optional, however. Please note the changes to update_time() and the new write_time() inode operations functions, which impact btrfs and xfs. The changes are fairly simple, but I would appreciate confirmation from the btrfs and xfs teams that I got things right. Thanks!! Any objections to my carrying these patches in the ext4 git tree? Changes since -v3: - inodes with I_DIRTY_TIME set are placed on a new bdi list, b_dirty_time. This allows filesystem-level syncs to more easily iterate over those inodes that need to have their timestamps written to disk. - dirty timestamps will be written out asynchronously on the final iput, instead of when the inode gets evicted. - separate the definition of the new function find_active_inode_nowait() to a separate patch - create separate flag masks: I_DIRTY_WB and I_DIRTY_INODE, which indicate whether the inode needs to be on the write back lists, or whether the inode itself is dirty, while I_DIRTY means any one of the inode dirty flags are set. This simplifies the fs writeback logic which needs to test for different combinations of the inode dirty flags in different places. Changes since -v2: - If update_time() updates i_version, it will not use lazytime (i..e, the inode will be marked dirty so the change will be persisted on to disk sooner rather than later). Yes, this eliminates the benefits of lazytime if the user is experting the file system via NFSv4. Sad, but NFS's requirements seem to mandate this. - Fix time wrapping bug 49 days after the system boots (on a system with a 32-bit jiffies). Use get_monotonic_boottime() instead. - Clean up type warning in include/tracing/ext4.h - Added explicit parenthesis for stylistic reasons - Added an is_readonly() inode operations method so btrfs doesn't have to duplicate code in update_time(). Changes since -v1: - Added explanatory comments in update_time() regarding i_ts_dirty_days - Fix type used for days_since_boot - Improve SMP scalability in update_time and ext4_update_other_inodes_time - Added tracepoints to help test and characterize how often and under what circumstances inodes have their timestamps lazily updated Theodore Ts'o (7): vfs: split update_time() into update_time() and write_time() vfs: add support for a lazytime mount option vfs: don't let the dirty time inodes get more than a day stale vfs: add lazytime tracepoints for better debugging vfs: add find_active_inode_nowait() function ext4: add support for a lazytime mount option btrfs: add an is_readonly() so btrfs can use common code for update_time() Documentation/filesystems/Locking | 2 + fs/btrfs/inode.c | 34 +++++------- fs/ext4/inode.c | 49 ++++++++++++++++- fs/ext4/super.c | 9 +++ fs/fs-writeback.c | 57 +++++++++++++++++-- fs/inode.c | 113 +++++++++++++++++++++++++++++++++++--- fs/proc_namespace.c | 1 + fs/sync.c | 8 +++ fs/xfs/xfs_iops.c | 39 ++++++------- include/linux/backing-dev.h | 1 + include/linux/fs.h | 17 +++++- include/trace/events/ext4.h | 30 ++++++++++ include/uapi/linux/fs.h | 1 + mm/backing-dev.c | 9 ++- 14 files changed, 306 insertions(+), 64 deletions(-) -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4986A7F54 for ; Wed, 26 Nov 2014 04:24:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 37A938F8050 for ; Wed, 26 Nov 2014 02:24:06 -0800 (PST) X-ASG-Debug-ID: 1416997444-04cbb01e5a6e1340001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id GctEqQG2mwKppzd5 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:04 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=tCRbEEOVi6HPUHFylZBOcKVCuIYxKPIGsEYOh6WqEB0=; b=VeGMFpbpyLU5IzaDqnsLDsOFcF9hvCHrqQlZ/WzzmJDX/0qZaTAGeqhT6cdDbQkTT1NuhJJo9Vf3SAQ827WqziYdNRIWN4oafC6RjNgK/VymDCBqi/RmcKx6OqfRT/ivcwx4Jnl6U3NfjmY1Bl22T61zg/oEWy+82smMm9Zo0xc=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlT-0003QF-UV; Wed, 26 Nov 2014 10:24:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 606E4580248; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Date: Wed, 26 Nov 2014 05:23:52 -0500 X-ASG-Orig-Subj: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-Id: <1416997437-26092-3-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997444 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add a new mount option which enables a new "lazytime" mode. This mode causes atime, mtime, and ctime updates to only be made to the in-memory version of the inode. The on-disk times will only get updated when (a) if the inode needs to be updated for some non-time related change, (b) if userspace calls fsync(), syncfs() or sync(), or (c) just before an undeleted inode is evicted from memory. This is OK according to POSIX because there are no guarantees after a crash unless userspace explicitly requests via a fsync(2) call. For workloads which feature a large number of random write to a preallocated file, the lazytime mount option significantly reduces writes to the inode table. The repeated 4k writes to a single block will result in undesirable stress on flash devices and SMR disk drives. Even on conventional HDD's, the repeated writes to the inode table block will trigger Adjacent Track Interference (ATI) remediation latencies, which very negatively impact 99.9 percentile latencies --- which is a very big deal for web serving tiers (for example). Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 55 ++++++++++++++++++++++++++++++++++++++++----- fs/inode.c | 43 ++++++++++++++++++++++++++++++----- fs/proc_namespace.c | 1 + fs/sync.c | 8 +++++++ include/linux/backing-dev.h | 1 + include/linux/fs.h | 11 +++++++-- include/uapi/linux/fs.h | 1 + mm/backing-dev.c | 9 ++++++-- 8 files changed, 113 insertions(+), 16 deletions(-) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index ef9bef1..ef8c5d8 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -397,7 +397,7 @@ static void requeue_inode(struct inode *inode, struct bdi_writeback *wb, * shot. If still dirty, it will be redirty_tail()'ed below. Update * the dirty time to prevent enqueue and sync it again. */ - if ((inode->i_state & I_DIRTY) && + if ((inode->i_state & I_DIRTY_WB) && (wbc->sync_mode == WB_SYNC_ALL || wbc->tagged_writepages)) inode->dirtied_when = jiffies; @@ -428,13 +428,15 @@ static void requeue_inode(struct inode *inode, struct bdi_writeback *wb, */ redirty_tail(inode, wb); } - } else if (inode->i_state & I_DIRTY) { + } else if (inode->i_state & I_DIRTY_WB) { /* * Filesystems can dirty the inode during writeback operations, * such as delayed allocation during submission or metadata * updates after data IO completion. */ redirty_tail(inode, wb); + } else if (inode->i_state & I_DIRTY_TIME) { + list_move(&inode->i_wb_list, &wb->b_dirty_time); } else { /* The inode is clean. Remove from writeback lists. */ list_del_init(&inode->i_wb_list); @@ -482,11 +484,11 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc) /* Clear I_DIRTY_PAGES if we've written out all dirty pages */ if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) inode->i_state &= ~I_DIRTY_PAGES; - dirty = inode->i_state & I_DIRTY; - inode->i_state &= ~(I_DIRTY_SYNC | I_DIRTY_DATASYNC); + dirty = inode->i_state & I_DIRTY_INODE; + inode->i_state &= ~I_DIRTY_INODE; spin_unlock(&inode->i_lock); /* Don't write the inode if only I_DIRTY_PAGES was set */ - if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { + if (dirty) { int err = write_inode(inode, wbc); if (ret == 0) ret = err; @@ -1162,7 +1164,7 @@ void __mark_inode_dirty(struct inode *inode, int flags) spin_lock(&inode->i_lock); if ((inode->i_state & flags) != flags) { - const int was_dirty = inode->i_state & I_DIRTY; + const int was_dirty = inode->i_state & I_DIRTY_WB; inode->i_state |= flags; @@ -1224,6 +1226,24 @@ out_unlock_inode: } EXPORT_SYMBOL(__mark_inode_dirty); +void inode_requeue_dirtytime(struct inode *inode) +{ + struct backing_dev_info *bdi = inode_to_bdi(inode); + + spin_lock(&bdi->wb.list_lock); + spin_lock(&inode->i_lock); + if ((inode->i_state & I_DIRTY_WB) == 0) { + if (inode->i_state & I_DIRTY_TIME) + list_move(&inode->i_wb_list, &bdi->wb.b_dirty_time); + else + list_del_init(&inode->i_wb_list); + } + spin_unlock(&inode->i_lock); + spin_unlock(&bdi->wb.list_lock); + +} +EXPORT_SYMBOL(inode_requeue_dirtytime); + static void wait_sb_inodes(struct super_block *sb) { struct inode *inode, *old_inode = NULL; @@ -1277,6 +1297,28 @@ static void wait_sb_inodes(struct super_block *sb) iput(old_inode); } +/* + * Take all of the indoes on the dirty_time list, and mark them as + * dirty, so they will be written out. + */ +static void flush_sb_dirty_time(struct super_block *sb) +{ + struct bdi_writeback *wb = &sb->s_bdi->wb; + LIST_HEAD(tmp); + + spin_lock(&wb->list_lock); + list_cut_position(&tmp, &wb->b_dirty_time, wb->b_dirty_time.prev); + while (!list_empty(&tmp)) { + struct inode *inode = wb_inode(tmp.prev); + + list_del_init(&inode->i_wb_list); + spin_unlock(&wb->list_lock); + mark_inode_dirty_sync(inode); + spin_lock(&wb->list_lock); + } + spin_unlock(&wb->list_lock); +} + /** * writeback_inodes_sb_nr - writeback dirty inodes from given super_block * @sb: the superblock @@ -1388,6 +1430,7 @@ void sync_inodes_sb(struct super_block *sb) return; WARN_ON(!rwsem_is_locked(&sb->s_umount)); + flush_sb_dirty_time(sb); bdi_queue_work(sb->s_bdi, &work); wait_for_completion(&done); diff --git a/fs/inode.c b/fs/inode.c index 8f5c4b5..9e464cc 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -30,7 +30,7 @@ * inode_sb_list_lock protects: * sb->s_inodes, inode->i_sb_list * bdi->wb.list_lock protects: - * bdi->wb.b_{dirty,io,more_io}, inode->i_wb_list + * bdi->wb.b_{dirty,io,more_io,dirty_time}, inode->i_wb_list * inode_hash_lock protects: * inode_hashtable, inode->i_hash * @@ -1430,11 +1430,22 @@ static void iput_final(struct inode *inode) */ void iput(struct inode *inode) { - if (inode) { - BUG_ON(inode->i_state & I_CLEAR); - - if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock)) - iput_final(inode); + if (!inode) + return; + BUG_ON(inode->i_state & I_CLEAR); +retry: + if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock)) { + if (inode->i_nlink && (inode->i_state & I_DIRTY_TIME)) { + atomic_inc(&inode->i_count); + inode->i_state &= ~I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + if (inode->i_op->write_time) + inode->i_op->write_time(inode); + else if (inode->i_sb->s_op->write_inode) + mark_inode_dirty_sync(inode); + goto retry; + } + iput_final(inode); } } EXPORT_SYMBOL(iput); @@ -1515,6 +1526,26 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (flags & S_MTIME) inode->i_mtime = *time; } + if ((inode->i_sb->s_flags & MS_LAZYTIME) && + !(flags & S_VERSION) && + !(inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC))) { + if (inode->i_state & I_DIRTY_TIME) + return 0; + spin_lock(&inode->i_lock); + if (inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { + spin_unlock(&inode->i_lock); + goto force_dirty; + } + if (inode->i_state & I_DIRTY_TIME) { + spin_unlock(&inode->i_lock); + return 0; + } + inode->i_state |= I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + inode_requeue_dirtytime(inode); + return 0; + } +force_dirty: if (inode->i_op->write_time) return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 73ca174..f98234a 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c @@ -44,6 +44,7 @@ static int show_sb_opts(struct seq_file *m, struct super_block *sb) { MS_SYNCHRONOUS, ",sync" }, { MS_DIRSYNC, ",dirsync" }, { MS_MANDLOCK, ",mand" }, + { MS_LAZYTIME, ",lazytime" }, { 0, NULL } }; const struct proc_fs_info *fs_infop; diff --git a/fs/sync.c b/fs/sync.c index bdc729d..6ac7bf0 100644 --- a/fs/sync.c +++ b/fs/sync.c @@ -177,8 +177,16 @@ SYSCALL_DEFINE1(syncfs, int, fd) */ int vfs_fsync_range(struct file *file, loff_t start, loff_t end, int datasync) { + struct inode *inode = file->f_mapping->host; + if (!file->f_op->fsync) return -EINVAL; + if (!datasync && (inode->i_state & I_DIRTY_TIME)) { + spin_lock(&inode->i_lock); + inode->i_state &= ~I_DIRTY_TIME; + spin_unlock(&inode->i_lock); + mark_inode_dirty_sync(inode); + } return file->f_op->fsync(file, start, end, datasync); } EXPORT_SYMBOL(vfs_fsync_range); diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 5da6012..4cdf733 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -55,6 +55,7 @@ struct bdi_writeback { struct list_head b_dirty; /* dirty inodes */ struct list_head b_io; /* parked for writeback */ struct list_head b_more_io; /* parked for more writeback */ + struct list_head b_dirty_time; /* time stamps are dirty */ spinlock_t list_lock; /* protects the b_* lists */ }; diff --git a/include/linux/fs.h b/include/linux/fs.h index 3633239..55cf34d 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1721,19 +1721,26 @@ struct super_operations { #define __I_DIO_WAKEUP 9 #define I_DIO_WAKEUP (1 << I_DIO_WAKEUP) #define I_LINKABLE (1 << 10) +#define I_DIRTY_TIME (1 << 11) -#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) +/* Inode should be on the b_dirty/b_io/b_more_io lists */ +#define I_DIRTY_WB (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES) +/* Inode should be on the b_dirty/b_io/b_more_io/b_dirty_time lists */ +#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES | I_DIRTY_TIME) +/* The inode itself is dirty */ +#define I_DIRTY_INODE (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_TIME) extern void __mark_inode_dirty(struct inode *, int); static inline void mark_inode_dirty(struct inode *inode) { - __mark_inode_dirty(inode, I_DIRTY); + __mark_inode_dirty(inode, I_DIRTY_WB); } static inline void mark_inode_dirty_sync(struct inode *inode) { __mark_inode_dirty(inode, I_DIRTY_SYNC); } +extern void inode_requeue_dirtytime(struct inode *); extern void inc_nlink(struct inode *inode); extern void drop_nlink(struct inode *inode); diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h index 3735fa0..cc9713a 100644 --- a/include/uapi/linux/fs.h +++ b/include/uapi/linux/fs.h @@ -90,6 +90,7 @@ struct inodes_stat_t { #define MS_KERNMOUNT (1<<22) /* this is a kern_mount call */ #define MS_I_VERSION (1<<23) /* Update inode I_version field */ #define MS_STRICTATIME (1<<24) /* Always perform atime updates */ +#define MS_LAZYTIME (1<<25) /* Update the on-disk [acm]times lazily */ /* These sb flags are internal to the kernel */ #define MS_NOSEC (1<<28) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 0ae0df5..14851fe 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -69,10 +69,10 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) unsigned long background_thresh; unsigned long dirty_thresh; unsigned long bdi_thresh; - unsigned long nr_dirty, nr_io, nr_more_io; + unsigned long nr_dirty, nr_io, nr_more_io, nr_dirty_time; struct inode *inode; - nr_dirty = nr_io = nr_more_io = 0; + nr_dirty = nr_io = nr_more_io = nr_dirty_time = 0; spin_lock(&wb->list_lock); list_for_each_entry(inode, &wb->b_dirty, i_wb_list) nr_dirty++; @@ -80,6 +80,8 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) nr_io++; list_for_each_entry(inode, &wb->b_more_io, i_wb_list) nr_more_io++; + list_for_each_entry(inode, &wb->b_dirty_time, i_wb_list) + nr_dirty_time++; spin_unlock(&wb->list_lock); global_dirty_limits(&background_thresh, &dirty_thresh); @@ -98,6 +100,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) "b_dirty: %10lu\n" "b_io: %10lu\n" "b_more_io: %10lu\n" + "b_dirty_time: %10lu\n" "bdi_list: %10u\n" "state: %10lx\n", (unsigned long) K(bdi_stat(bdi, BDI_WRITEBACK)), @@ -111,6 +114,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) nr_dirty, nr_io, nr_more_io, + nr_dirty_time, !list_empty(&bdi->bdi_list), bdi->state); #undef K @@ -418,6 +422,7 @@ static void bdi_wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi) INIT_LIST_HEAD(&wb->b_dirty); INIT_LIST_HEAD(&wb->b_io); INIT_LIST_HEAD(&wb->b_more_io); + INIT_LIST_HEAD(&wb->b_dirty_time); spin_lock_init(&wb->list_lock); INIT_DELAYED_WORK(&wb->dwork, bdi_writeback_workfn); } -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 573037F57 for ; Wed, 26 Nov 2014 04:24:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 368FF8F8033 for ; Wed, 26 Nov 2014 02:24:08 -0800 (PST) X-ASG-Debug-ID: 1416997447-04cb6c05726fda80001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id YkCqv6otAunSIqJd (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:07 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=DGdlOoWIV0Zt8tTmxwEGsGq+lMMN6XjORKBIj0QwLWM=; b=GiuaPetunMCXib1NYFXZOwFx17ZlcFgwU+IXojiW7z7ZbZezlgtsr9Is5aTg7Rgm95+f8aKL6UheRfq9bVVFcphnVA91NDjw4HnTrgA/JAa9HGR7ja7A5QYolX135Gd3TjEwWdkyO7CqfwFMIzMyjkZ4pHzjMM6E6YpETXoD7o8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlW-0003Qz-TU; Wed, 26 Nov 2014 10:24:07 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 6F56B580276; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Date: Wed, 26 Nov 2014 05:23:56 -0500 X-ASG-Orig-Subj: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-Id: <1416997437-26092-7-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997447 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add an optimization for the MS_LAZYTIME mount option so that we will opportunistically write out any inodes with the I_DIRTY_TIME flag set in a particular inode table block when we need to update some inode in that inode table block anyway. Also add some temporary code so that we can set the lazytime mount option without needing a modified /sbin/mount program which can set MS_LAZYTIME. We can eventually make this go away once util-linux has added support. Google-Bug-Id: 18297052 Signed-off-by: Theodore Ts'o --- fs/ext4/inode.c | 49 ++++++++++++++++++++++++++++++++++++++++++--- fs/ext4/super.c | 9 +++++++++ include/trace/events/ext4.h | 30 +++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 3 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 5653fa4..8308c82 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4140,6 +4140,51 @@ static int ext4_inode_blocks_set(handle_t *handle, } /* + * Opportunistically update the other time fields for other inodes in + * the same inode table block. + */ +static void ext4_update_other_inodes_time(struct super_block *sb, + unsigned long orig_ino, char *buf) +{ + struct ext4_inode_info *ei; + struct ext4_inode *raw_inode; + unsigned long ino; + struct inode *inode; + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; + int inode_size = EXT4_INODE_SIZE(sb); + + ino = orig_ino & ~(inodes_per_block - 1); + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { + if (ino == orig_ino) + continue; + inode = find_active_inode_nowait(sb, ino); + if (!inode || + (inode->i_state & I_DIRTY_TIME) == 0 || + !spin_trylock(&inode->i_lock)) { + iput(inode); + continue; + } + inode->i_state &= ~I_DIRTY_TIME; + inode->i_ts_dirty_day = 0; + spin_unlock(&inode->i_lock); + inode_requeue_dirtytime(inode); + + ei = EXT4_I(inode); + raw_inode = (struct ext4_inode *) buf; + + spin_lock(&ei->i_raw_lock); + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); + ext4_inode_csum_set(inode, raw_inode, ei); + spin_unlock(&ei->i_raw_lock); + trace_ext4_other_inode_update_time(inode, orig_ino); + iput(inode); + } +} + + +/* * Post the struct inode info into an on-disk inode location in the * buffer-cache. This gobbles the caller's reference to the * buffer_head in the inode location struct. @@ -4237,7 +4282,6 @@ static int ext4_do_update_inode(handle_t *handle, for (block = 0; block < EXT4_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; } - if (likely(!test_opt2(inode->i_sb, HURD_COMPAT))) { raw_inode->i_disk_version = cpu_to_le32(inode->i_version); if (ei->i_extra_isize) { @@ -4248,10 +4292,9 @@ static int ext4_do_update_inode(handle_t *handle, cpu_to_le16(ei->i_extra_isize); } } - ext4_inode_csum_set(inode, raw_inode, ei); - spin_unlock(&ei->i_raw_lock); + ext4_update_other_inodes_time(inode->i_sb, inode->i_ino, bh->b_data); BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata"); rc = ext4_handle_dirty_metadata(handle, NULL, bh); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 58859bc..93a2b7a 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -1132,6 +1132,7 @@ enum { Opt_noquota, Opt_barrier, Opt_nobarrier, Opt_err, Opt_usrquota, Opt_grpquota, Opt_i_version, Opt_stripe, Opt_delalloc, Opt_nodelalloc, Opt_mblk_io_submit, + Opt_lazytime, Opt_nolazytime, Opt_nomblk_io_submit, Opt_block_validity, Opt_noblock_validity, Opt_inode_readahead_blks, Opt_journal_ioprio, Opt_dioread_nolock, Opt_dioread_lock, @@ -1195,6 +1196,8 @@ static const match_table_t tokens = { {Opt_i_version, "i_version"}, {Opt_stripe, "stripe=%u"}, {Opt_delalloc, "delalloc"}, + {Opt_lazytime, "lazytime"}, + {Opt_nolazytime, "nolazytime"}, {Opt_nodelalloc, "nodelalloc"}, {Opt_removed, "mblk_io_submit"}, {Opt_removed, "nomblk_io_submit"}, @@ -1452,6 +1455,12 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, case Opt_i_version: sb->s_flags |= MS_I_VERSION; return 1; + case Opt_lazytime: + sb->s_flags |= MS_LAZYTIME; + return 1; + case Opt_nolazytime: + sb->s_flags &= ~MS_LAZYTIME; + return 1; } for (m = ext4_mount_opts; m->token != Opt_err; m++) diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 6cfb841..6e5abd6 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -73,6 +73,36 @@ struct extent_status; { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}) +TRACE_EVENT(ext4_other_inode_update_time, + TP_PROTO(struct inode *inode, ino_t orig_ino), + + TP_ARGS(inode, orig_ino), + + TP_STRUCT__entry( + __field( dev_t, dev ) + __field( ino_t, ino ) + __field( ino_t, orig_ino ) + __field( uid_t, uid ) + __field( gid_t, gid ) + __field( __u16, mode ) + ), + + TP_fast_assign( + __entry->orig_ino = orig_ino; + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->uid = i_uid_read(inode); + __entry->gid = i_gid_read(inode); + __entry->mode = inode->i_mode; + ), + + TP_printk("dev %d,%d orig_ino %lu ino %lu mode 0%o uid %u gid %u", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->orig_ino, + (unsigned long) __entry->ino, __entry->mode, + __entry->uid, __entry->gid) +); + TRACE_EVENT(ext4_free_inode, TP_PROTO(struct inode *inode), -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7B1217F5E for ; Wed, 26 Nov 2014 04:24:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A8608F8033 for ; Wed, 26 Nov 2014 02:24:05 -0800 (PST) X-ASG-Debug-ID: 1416997444-04cb6c05736fda70001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id mX0onk8hHQ8vZMz0 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:04 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=EbWjG5wpSb4tSD+FXyCRhFiDyObusS3j92QGMKfuP+Q=; b=EpsqF/2VGH2aYC7kFvWlE1DHejMH7z2ocuxqgWoJCFlGadR43wBcBC8fMC47rtxKyAiYSR4mTfYMiP/2oTNtPrEUzFHFxHaCpThGDLBcV2aiURWeas0YcMaZgkg0Ex1H09VnFQJStoUET4PgAYEwSSRb0EcaZe0TENcYbAFWU/w=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlT-0003QG-Ub; Wed, 26 Nov 2014 10:24:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 6886F58029C; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 4/7] vfs: add lazytime tracepoints for better debugging Date: Wed, 26 Nov 2014 05:23:54 -0500 X-ASG-Orig-Subj: [PATCH-v4 4/7] vfs: add lazytime tracepoints for better debugging Message-Id: <1416997437-26092-5-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997444 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Signed-off-by: Theodore Ts'o --- fs/fs-writeback.c | 1 + fs/inode.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 529480a..3d87174 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "internal.h" /* diff --git a/fs/inode.c b/fs/inode.c index 37c0429..b2fea60 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -20,6 +20,9 @@ #include #include "internal.h" +#define CREATE_TRACE_POINTS +#include + /* * Inode locking rules: * @@ -1443,6 +1446,7 @@ retry: inode->i_op->write_time(inode); else if (inode->i_sb->s_op->write_inode) mark_inode_dirty_sync(inode); + trace_fs_lazytime_iput(inode); goto retry; } iput_final(inode); @@ -1561,6 +1565,7 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) inode->i_ts_dirty_day = days_since_boot; spin_unlock(&inode->i_lock); inode_requeue_dirtytime(inode); + trace_fs_lazytime_defer(inode); return 0; } force_dirty: -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 285C17F62 for ; Wed, 26 Nov 2014 04:24:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ECFCA8F8050 for ; Wed, 26 Nov 2014 02:24:08 -0800 (PST) X-ASG-Debug-ID: 1416997447-04bdf061618690b0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 6EZiAGjJi4uVBWoJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:07 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=+zKHg6iUR55SOqfDHMrWBRdxIcdGTfshRfCJO90dUpw=; b=rMn4wbdpJZ899HRjCkr31YgF/B7H5UTZfwsc14vRNUU9yD8lfw4mC8qjOXSGMb/AKow+ubohGQ474xsNaePj+2Ubrxl0H62FrrwCl+vB1cYPbFNkWv9TUsL4nI8F9ViO/XjW37s1ZELJMiqQbCMTdtDLy7d/0MU72LxTll+190s=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlW-0003R0-Tf; Wed, 26 Nov 2014 10:24:07 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 7400F5802F4; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 7/7] btrfs: add an is_readonly() so btrfs can use common code for update_time() Date: Wed, 26 Nov 2014 05:23:57 -0500 X-ASG-Orig-Subj: [PATCH-v4 7/7] btrfs: add an is_readonly() so btrfs can use common code for update_time() Message-Id: <1416997437-26092-8-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997447 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature The only reason btrfs cloned code from the VFS layer was so it could add a check to see if a subvolume is read-ony. Instead of doing that, let's add a new inode operation which allows a file system to return an error if the inode is read-only, and use that in update_time(). There may be other places where the VFS layer may want to know that btrfs would want to treat an inode is read-only. With this commit, there are no remaining users of update_time() in the inode operations structure, so we can remove it and simply things further. Signed-off-by: Theodore Ts'o Cc: linux-btrfs@vger.kernel.org Reviewed-by: David Sterba --- fs/btrfs/inode.c | 26 ++++++-------------------- fs/inode.c | 22 +++++++++++----------- include/linux/fs.h | 2 +- 3 files changed, 18 insertions(+), 32 deletions(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index a5e0d0d..0bfe3a4 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5554,26 +5554,12 @@ static int btrfs_dirty_inode(struct inode *inode) return ret; } -/* - * This is a copy of file_update_time. We need this so we can return error on - * ENOSPC for updating the inode in the case of file write and mmap writes. - */ -static int btrfs_update_time(struct inode *inode, struct timespec *now, - int flags) +static int btrfs_is_readonly(struct inode *inode) { struct btrfs_root *root = BTRFS_I(inode)->root; if (btrfs_root_readonly(root)) return -EROFS; - - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *now; - if (flags & S_MTIME) - inode->i_mtime = *now; - if (flags & S_ATIME) - inode->i_atime = *now; return 0; } @@ -9466,8 +9452,8 @@ static const struct inode_operations btrfs_dir_inode_operations = { .permission = btrfs_permission, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9475,8 +9461,8 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .permission = btrfs_permission, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9546,8 +9532,8 @@ static const struct inode_operations btrfs_file_inode_operations = { .fiemap = btrfs_fiemap, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9559,8 +9545,8 @@ static const struct inode_operations btrfs_special_inode_operations = { .removexattr = btrfs_removexattr, .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9573,8 +9559,8 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .getxattr = btrfs_getxattr, .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, - .update_time = btrfs_update_time, .write_time = btrfs_write_time, + .is_readonly = btrfs_is_readonly, }; const struct dentry_operations btrfs_dentry_operations = { diff --git a/fs/inode.c b/fs/inode.c index 0b4c6ae..e29bd2d 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1554,20 +1554,20 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) unsigned short days_since_boot; int ret; - if (inode->i_op->update_time) { - ret = inode->i_op->update_time(inode, time, flags); + if (inode->i_op->is_readonly) { + ret = inode->i_op->is_readonly(inode); if (ret) return ret; - } else { - if (flags & S_ATIME) - inode->i_atime = *time; - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *time; - if (flags & S_MTIME) - inode->i_mtime = *time; } + if (flags & S_ATIME) + inode->i_atime = *time; + if (flags & S_VERSION) + inode_inc_iversion(inode); + if (flags & S_CTIME) + inode->i_ctime = *time; + if (flags & S_MTIME) + inode->i_mtime = *time; + /* * If i_ts_dirty_day is zero, then either we have not deferred * timestamp updates, or the system has been up for less than diff --git a/include/linux/fs.h b/include/linux/fs.h index dc615ec..6e41107 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,8 +1545,8 @@ struct inode_operations { int (*removexattr) (struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); - int (*update_time)(struct inode *, struct timespec *, int); int (*write_time)(struct inode *); + int (*is_readonly)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); -- 2.1.0 From tytso@thunk.org Wed Nov 26 04:24:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 669737F5D for ; Wed, 26 Nov 2014 04:24:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5560F30404E for ; Wed, 26 Nov 2014 02:24:08 -0800 (PST) X-ASG-Debug-ID: 1416997447-04cbb01e596e1350001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id dL2D5Dhv5O9ws9xp (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 02:24:07 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=UKkO2ur6FCjX6kUqrvW6aJYG2DVCxrOx5zSQ8TLBxs8=; b=rq+sOs3bbRmlHdGqcqeDMSD98rIbV00sSNSr8Rwz5rfaJWNbj+Ywvps1rMoeFfOGw0vhHq8xVNq8kORN2+j9H8eTKFzHtA2AvwfEh+a3PSAxKRCrK8kT60lo7X73BR/vkDnjKkZTtuaQCJkChuKTMAJPaTRDAfInU3IUddoyR/8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XtZlW-0003Qy-Te; Wed, 26 Nov 2014 10:24:07 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 6C51F5802D0; Wed, 26 Nov 2014 05:24:02 -0500 (EST) From: Theodore Ts'o To: Linux Filesystem Development List Cc: Ext4 Developers List , Linux btrfs Developers List , XFS Developers , Theodore Ts'o Subject: [PATCH-v4 5/7] vfs: add find_active_inode_nowait() function Date: Wed, 26 Nov 2014 05:23:55 -0500 X-ASG-Orig-Subj: [PATCH-v4 5/7] vfs: add find_active_inode_nowait() function Message-Id: <1416997437-26092-6-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1416997437-26092-1-git-send-email-tytso@mit.edu> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1416997447 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Add a new function find_active_inode_nowait() which will never block. If there is an inode being freed or is still being initialized, this function will return NULL instead of blocking waiting for an inode to be freed or to finish initializing. Hence, a negative return from this function does not mean that inode number is free for use. It is useful for callers that want to opportunistically do some work on an inode only if it is present and available in the cache, and where blocking is not an option. Signed-off-by: Theodore Ts'o --- fs/inode.c | 36 ++++++++++++++++++++++++++++++++++++ include/linux/fs.h | 2 ++ 2 files changed, 38 insertions(+) diff --git a/fs/inode.c b/fs/inode.c index b2fea60..0b4c6ae 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1283,6 +1283,42 @@ struct inode *ilookup(struct super_block *sb, unsigned long ino) } EXPORT_SYMBOL(ilookup); +/** + * find_active_inode_nowait - find an active inode in the inode cache + * @sb: super block of file system to search + * @ino: inode number to search for + * + * Search for an active inode @ino in the inode cache, and if the + * inode is in the cache, the inode is returned with an incremented + * reference count. If the inode is being freed or is newly + * initialized, return nothing instead of trying to wait for the inode + * initialization or destruction to be complete. + */ +struct inode *find_active_inode_nowait(struct super_block *sb, + unsigned long ino) +{ + struct hlist_head *head = inode_hashtable + hash(sb, ino); + struct inode *inode, *ret_inode = NULL; + + spin_lock(&inode_hash_lock); + hlist_for_each_entry(inode, head, i_hash) { + if ((inode->i_ino != ino) || + (inode->i_sb != sb)) + continue; + spin_lock(&inode->i_lock); + if ((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) { + __iget(inode); + ret_inode = inode; + } + spin_unlock(&inode->i_lock); + goto out; + } +out: + spin_unlock(&inode_hash_lock); + return ret_inode; +} +EXPORT_SYMBOL(find_active_inode_nowait); + int insert_inode_locked(struct inode *inode) { struct super_block *sb = inode->i_sb; diff --git a/include/linux/fs.h b/include/linux/fs.h index d0a2181..dc615ec 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2419,6 +2419,8 @@ extern struct inode *ilookup(struct super_block *sb, unsigned long ino); extern struct inode * iget5_locked(struct super_block *, unsigned long, int (*test)(struct inode *, void *), int (*set)(struct inode *, void *), void *); extern struct inode * iget_locked(struct super_block *, unsigned long); +extern struct inode *find_active_inode_nowait(struct super_block *, + unsigned long); extern int insert_inode_locked4(struct inode *, unsigned long, int (*test)(struct inode *, void *), void *); extern int insert_inode_locked(struct inode *); #ifdef CONFIG_DEBUG_LOCK_ALLOC -- 2.1.0 From scan@surveyservicesinc.com Wed Nov 26 05:56:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6F9017F4E for ; Wed, 26 Nov 2014 05:56:40 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4F50A8F8033 for ; Wed, 26 Nov 2014 03:56:36 -0800 (PST) X-ASG-Debug-ID: 1417002995-04bdf061608709b0001-NocioJ Received: from outbound3.messaging.lotuslive.com ([192.86.64.21]) by cuda.sgi.com with ESMTP id d1dQGfnazkdQMiXR; Wed, 26 Nov 2014 03:56:35 -0800 (PST) X-Barracuda-Envelope-From: scan@surveyservicesinc.com X-Barracuda-Apparent-Source-IP: 192.86.64.21 Received: from c-in3ofil03-02.sv2.lotuslive.com (unknown [10.6.33.55]) by c-in3obnd03-02.sv2.lotuslive.com (Postfix) with ESMTP id 9EE61C00C2; Wed, 26 Nov 2014 11:56:35 +0000 (GMT) Received: from c-in3ofil03-02.sv2.lotuslive.com (unknown [127.0.0.1]) by c-in3ofil03-02.sv2.lotuslive.com (Postfix) with ESMTP id 8351D27E92; Wed, 26 Nov 2014 11:56:35 +0000 (GMT) Received: from c-in3ws--03-06.ben.sv2.lotuslive.com (c-in3ws--03-06.sv2.lotuslive.com [10.6.33.86]) (sender scan@surveyservicesinc.com) by c-in3ofil03-02.sv2.lotuslive.com (LotusLive iNotes outfilter/0.91) with ESMTP; Wed, 26 Nov 2014 11:56:35 +0000 Received: by c-in3ws--03-06.sv2.lotuslive.com (Postfix, from userid 1001) id 656364FCB4; Wed, 26 Nov 2014 11:56:35 +0000 (GMT) Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 From: "musa ibrahim" Date: Wed, 26 Nov 2014 14:56:35 +0300 Subject: Financial donation. Received: from [197.231.183.120] by Yy1pbjN3cy0tMDMtMDYuc3YyLmxvdHVzbGl2ZW9wcy5jb20= with http for scan@surveyservicesinc.com; Wed, 26 Nov 2014 14:56:35 +0300 X-ASG-Orig-Subj: Financial donation. X-Originating-Ip: 197.231.183.120 X-Originating-Server: c-in3ws--03-06.sv2.lotuslive.com X-Ob-Auth: scan:surveyservicesinc.com@hickorytech.net Message-Id: <20141126115635.656364FCB4@c-in3ws--03-06.sv2.lotuslive.com> To: undisclosed-recipients:; X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=O9QA4nNW c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=+l2EpAEu3YFgc6o2OXrguA==:17 a=SDDnXvVnAAAA:8 a=smd98w2VAAAA:8 a=htC2ImNVOyUA:10 a=8nJEP1OIZ-IA:10 a=pGLkceISAAAA:8 a=o5_iZSGHAAAA:8 a=5y4faFyK3SkA:10 a=MkqF_Fv9fw-DMdQ16v8A:9 a=ix23re-RjR2kmPXJ:21 a=G_b53ATeDaJ8A8ud:21 a=wPNLvfGTeEIA:10 a=AFnEbiaKfzcA:10 a=9ISOHZfzIYAA:10 X-Barracuda-Connect: UNKNOWN[192.86.64.21] X-Barracuda-Start-Time: 1417002995 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12072 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Financial donation. Muslim Community Association Greetings i am writing to you following an opportunity in my office that w= ill be of immense benefit to you.I am Mr.Musa Ibrahim the secretary to Mr.P= remji Azim Hashim who is presently giving out cash donation 70% to Muslim b= rother and christian to everyone who are in needs world wide.Write back wit= h your Name/Address/Phone Number to partake. Send details to: imusa5917@gma= il.com Regards, Musa Ibrahim From sandeen@sandeen.net Wed Nov 26 09:58:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6437D29DF7 for ; Wed, 26 Nov 2014 09:58:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 027E7AC00D for ; Wed, 26 Nov 2014 07:58:21 -0800 (PST) X-ASG-Debug-ID: 1417017491-04bdf06160883e00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nGyMy6HxJSnN2d0h for ; Wed, 26 Nov 2014 07:58:12 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6AFA06565094; Wed, 26 Nov 2014 09:58:11 -0600 (CST) Message-ID: <5475F892.5000102@sandeen.net> Date: Wed, 26 Nov 2014 09:58:10 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() References: <546D15E3.5000200@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() In-Reply-To: <546D15E3.5000200@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1417017491 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12078 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/19/14 4:12 PM, Eric Sandeen wrote: > Here blkno is a daddr_t, which is a __s64; it's possible to hold > a value which is negative, and thus pass the (blkno >= eofs) > test. Then we try to do a xfs_perag_get() for a ridiculous > agno via xfs_daddr_to_agno(), and bad things happen when that > fails, and returns a null pag which is dereferenced shortly > thereafter. > > Found via a user-supplied fuzzed image... > > Signed-off-by: Eric Sandeen Ok, so after further digging, I think this patch is fine on its own, and could use review. How and if and when this function returns errors, and whether errors should get this far, etc, are all subjects for other patches. IF we're range-checking here, we should do both halves of the range checking properly so ... review appreciated. Thanks, -Eric > --- > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 24b4ebe..f54a497 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -463,7 +463,7 @@ _xfs_buf_find( > * have to check that the buffer falls within the filesystem bounds. > */ > eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); > - if (blkno >= eofs) { > + if (blkno < 0 || blkno >= eofs) { > /* > * XXX (dgc): we should really be returning -EFSCORRUPTED here, > * but none of the higher level infrastructure supports > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Wed Nov 26 10:38:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 44A3029DF7 for ; Wed, 26 Nov 2014 10:38:11 -0600 (CST) Received: from eagdhcp-232-156.americas.sgi.com (eagdhcp-232-156.americas.sgi.com [128.162.232.156]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1CC25304070; Wed, 26 Nov 2014 08:38:07 -0800 (PST) Message-ID: <547601ED.7060704@sgi.com> Date: Wed, 26 Nov 2014 10:38:05 -0600 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs: catch invalid negative blknos in _xfs_buf_find() References: <546D15E3.5000200@redhat.com> In-Reply-To: <546D15E3.5000200@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 11/19/14 16:12, Eric Sandeen wrote: > Here blkno is a daddr_t, which is a __s64; it's possible to hold > a value which is negative, and thus pass the (blkno>= eofs) > test. Then we try to do a xfs_perag_get() for a ridiculous > agno via xfs_daddr_to_agno(), and bad things happen when that > fails, and returns a null pag which is dereferenced shortly > thereafter. > > Found via a user-supplied fuzzed image... > > Signed-off-by: Eric Sandeen > --- Looks good. I did a little playing with sending the try lock failure (EAGAIN?) and EFSCORRUPT error status up the stack. It looked straight forward and could save a xfs_buf allocation when we know it is not necessary. Reviewed-by: Mark Tinguely From BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org Wed Nov 26 13:14:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CC2ED7F4E for ; Wed, 26 Nov 2014 13:14:40 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BB028304062 for ; Wed, 26 Nov 2014 11:14:40 -0800 (PST) X-ASG-Debug-ID: 1417029276-04cb6c057173eaf0001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id 9KxfPkImvlCy5VlR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:14:38 -0800 (PST) X-Barracuda-Envelope-From: BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xti2u-0002p3-JG for xfs@oss.sgi.com; Wed, 26 Nov 2014 19:14:36 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: move acl structures to xfs_format.h Date: Wed, 26 Nov 2014 20:14:24 +0100 X-ASG-Orig-Subj: [PATCH 2/5] xfs: move acl structures to xfs_format.h Message-Id: <1417029267-20149-2-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1417029267-20149-1-git-send-email-hch@lst.de> References: <1417029267-20149-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1417029277 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Move the on-disk ACL format to xfs_format.h, so that repair can use the common defintion. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_format.h | 36 ++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_acl.h | 36 ------------------------------------ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 3be17ee..e99d329 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -627,4 +627,40 @@ struct xfs_btree_block { #define XFS_BTREE_LBLOCK_CRC_OFF \ offsetof(struct xfs_btree_block, bb_u.l.bb_crc) +/* + * On-disk XFS access control list structure. + */ +struct xfs_acl_entry { + __be32 ae_tag; + __be32 ae_id; + __be16 ae_perm; + __be16 ae_pad; /* fill the implicit hole in the structure */ +}; + +struct xfs_acl { + __be32 acl_cnt; + struct xfs_acl_entry acl_entry[0]; +}; + +/* + * The number of ACL entries allowed is defined by the on-disk format. + * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is + * limited only by the maximum size of the xattr that stores the information. + */ +#define XFS_ACL_MAX_ENTRIES(mp) \ + (xfs_sb_version_hascrc(&mp->m_sb) \ + ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ + sizeof(struct xfs_acl_entry) \ + : 25) + +#define XFS_ACL_MAX_SIZE(mp) \ + (sizeof(struct xfs_acl) + \ + sizeof(struct xfs_acl_entry) * XFS_ACL_MAX_ENTRIES((mp))) + +/* On-disk XFS extended attribute names */ +#define SGI_ACL_FILE (unsigned char *)"SGI_ACL_FILE" +#define SGI_ACL_DEFAULT (unsigned char *)"SGI_ACL_DEFAULT" +#define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1) +#define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1) + #endif /* __XFS_FORMAT_H__ */ diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h index 5dc1637..3841b07 100644 --- a/fs/xfs/xfs_acl.h +++ b/fs/xfs/xfs_acl.h @@ -22,42 +22,6 @@ struct inode; struct posix_acl; struct xfs_inode; -#define XFS_ACL_NOT_PRESENT (-1) - -/* On-disk XFS access control list structure */ -struct xfs_acl_entry { - __be32 ae_tag; - __be32 ae_id; - __be16 ae_perm; - __be16 ae_pad; /* fill the implicit hole in the structure */ -}; - -struct xfs_acl { - __be32 acl_cnt; - struct xfs_acl_entry acl_entry[0]; -}; - -/* - * The number of ACL entries allowed is defined by the on-disk format. - * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is - * limited only by the maximum size of the xattr that stores the information. - */ -#define XFS_ACL_MAX_ENTRIES(mp) \ - (xfs_sb_version_hascrc(&mp->m_sb) \ - ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ - sizeof(struct xfs_acl_entry) \ - : 25) - -#define XFS_ACL_MAX_SIZE(mp) \ - (sizeof(struct xfs_acl) + \ - sizeof(struct xfs_acl_entry) * XFS_ACL_MAX_ENTRIES((mp))) - -/* On-disk XFS extended attribute names */ -#define SGI_ACL_FILE (unsigned char *)"SGI_ACL_FILE" -#define SGI_ACL_DEFAULT (unsigned char *)"SGI_ACL_DEFAULT" -#define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1) -#define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1) - #ifdef CONFIG_XFS_POSIX_ACL extern struct posix_acl *xfs_get_acl(struct inode *inode, int type); extern int xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type); -- 1.9.1 From BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org Wed Nov 26 13:14:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C5D987F57 for ; Wed, 26 Nov 2014 13:14:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4ABA304070 for ; Wed, 26 Nov 2014 11:14:43 -0800 (PST) X-ASG-Debug-ID: 1417029276-04cbb01e5b734190001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id ulrDAZXKQQjRASYI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:14:37 -0800 (PST) X-Barracuda-Envelope-From: BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xti2t-0002oy-6Q for xfs@oss.sgi.com; Wed, 26 Nov 2014 19:14:35 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: merge xfs_dinode.h into xfs_format.h Date: Wed, 26 Nov 2014 20:14:23 +0100 X-ASG-Orig-Subj: [PATCH 1/5] xfs: merge xfs_dinode.h into xfs_format.h Message-Id: <1417029267-20149-1-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.9.1 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1417029277 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- More consolidatation for the on-disk format defintions. Note that the XFS_IS_REALTIME_INODE moves to xfs_linux.h instead as it is not related to the on disk format, but depends on a CONFIG_ option. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_attr.c | 1 - fs/xfs/libxfs/xfs_attr_leaf.c | 1 - fs/xfs/libxfs/xfs_bmap.c | 1 - fs/xfs/libxfs/xfs_bmap_btree.c | 1 - fs/xfs/libxfs/xfs_dinode.h | 243 ----------------------------------------- fs/xfs/libxfs/xfs_dir2.c | 1 - fs/xfs/libxfs/xfs_dir2_block.c | 1 - fs/xfs/libxfs/xfs_dir2_sf.c | 1 - fs/xfs/libxfs/xfs_format.h | 214 ++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.c | 1 - fs/xfs/libxfs/xfs_inode_buf.c | 1 - fs/xfs/libxfs/xfs_inode_fork.c | 1 - fs/xfs/libxfs/xfs_log_format.h | 2 +- fs/xfs/libxfs/xfs_rtbitmap.c | 1 - fs/xfs/libxfs/xfs_sb.c | 1 - fs/xfs/xfs_aops.c | 1 - fs/xfs/xfs_attr_inactive.c | 1 - fs/xfs/xfs_attr_list.c | 1 - fs/xfs/xfs_bmap_util.c | 1 - fs/xfs/xfs_dir2_readdir.c | 1 - fs/xfs/xfs_file.c | 1 - fs/xfs/xfs_filestream.c | 1 - fs/xfs/xfs_fsops.c | 1 - fs/xfs/xfs_inode.h | 2 - fs/xfs/xfs_inode_item.c | 1 - fs/xfs/xfs_ioctl.c | 1 - fs/xfs/xfs_iomap.c | 1 - fs/xfs/xfs_iops.c | 1 - fs/xfs/xfs_itable.c | 1 - fs/xfs/xfs_linux.h | 6 + fs/xfs/xfs_log_recover.c | 1 - fs/xfs/xfs_mount.c | 1 - fs/xfs/xfs_qm.c | 1 - fs/xfs/xfs_rtalloc.c | 1 - fs/xfs/xfs_super.c | 1 - fs/xfs/xfs_symlink.c | 1 - 36 files changed, 221 insertions(+), 277 deletions(-) delete mode 100644 fs/xfs/libxfs/xfs_dinode.h diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 353fb42..4c0e33b 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -42,7 +42,6 @@ #include "xfs_quota.h" #include "xfs_trans_space.h" #include "xfs_trace.h" -#include "xfs_dinode.h" /* * xfs_attr.c diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index b1f73db..d9a172b 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -41,7 +41,6 @@ #include "xfs_trace.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" -#include "xfs_dinode.h" #include "xfs_dir2.h" diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 79c9819..427c13f 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -46,7 +46,6 @@ #include "xfs_trace.h" #include "xfs_symlink.h" #include "xfs_attr_leaf.h" -#include "xfs_dinode.h" #include "xfs_filestream.h" diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index fba7533..b016fc4 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -36,7 +36,6 @@ #include "xfs_quota.h" #include "xfs_trace.h" #include "xfs_cksum.h" -#include "xfs_dinode.h" /* * Determine the extent state. diff --git a/fs/xfs/libxfs/xfs_dinode.h b/fs/xfs/libxfs/xfs_dinode.h deleted file mode 100644 index 623bbe8..0000000 --- a/fs/xfs/libxfs/xfs_dinode.h +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DINODE_H__ -#define __XFS_DINODE_H__ - -#define XFS_DINODE_MAGIC 0x494e /* 'IN' */ -#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) - -typedef struct xfs_timestamp { - __be32 t_sec; /* timestamp seconds */ - __be32 t_nsec; /* timestamp nanoseconds */ -} xfs_timestamp_t; - -/* - * On-disk inode structure. - * - * This is just the header or "dinode core", the inode is expanded to fill a - * variable size the leftover area split into a data and an attribute fork. - * The format of the data and attribute fork depends on the format of the - * inode as indicated by di_format and di_aformat. To access the data and - * attribute use the XFS_DFORK_DPTR, XFS_DFORK_APTR, and XFS_DFORK_PTR macros - * below. - * - * There is a very similar struct icdinode in xfs_inode which matches the - * layout of the first 96 bytes of this structure, but is kept in native - * format instead of big endian. - * - * Note: di_flushiter is only used by v1/2 inodes - it's effectively a zeroed - * padding field for v3 inodes. - */ -typedef struct xfs_dinode { - __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ - __be16 di_mode; /* mode and type of file */ - __u8 di_version; /* inode version */ - __u8 di_format; /* format of di_c data */ - __be16 di_onlink; /* old number of links to file */ - __be32 di_uid; /* owner's user id */ - __be32 di_gid; /* owner's group id */ - __be32 di_nlink; /* number of links to file */ - __be16 di_projid_lo; /* lower part of owner's project id */ - __be16 di_projid_hi; /* higher part owner's project id */ - __u8 di_pad[6]; /* unused, zeroed space */ - __be16 di_flushiter; /* incremented on flush */ - xfs_timestamp_t di_atime; /* time last accessed */ - xfs_timestamp_t di_mtime; /* time last modified */ - xfs_timestamp_t di_ctime; /* time created/inode modified */ - __be64 di_size; /* number of bytes in file */ - __be64 di_nblocks; /* # of direct & btree blocks used */ - __be32 di_extsize; /* basic/minimum extent size for file */ - __be32 di_nextents; /* number of extents in data fork */ - __be16 di_anextents; /* number of extents in attribute fork*/ - __u8 di_forkoff; /* attr fork offs, <<3 for 64b align */ - __s8 di_aformat; /* format of attr fork's data */ - __be32 di_dmevmask; /* DMIG event mask */ - __be16 di_dmstate; /* DMIG state info */ - __be16 di_flags; /* random flags, XFS_DIFLAG_... */ - __be32 di_gen; /* generation number */ - - /* di_next_unlinked is the only non-core field in the old dinode */ - __be32 di_next_unlinked;/* agi unlinked list ptr */ - - /* start of the extended dinode, writable fields */ - __le32 di_crc; /* CRC of the inode */ - __be64 di_changecount; /* number of attribute changes */ - __be64 di_lsn; /* flush sequence */ - __be64 di_flags2; /* more random flags */ - __u8 di_pad2[16]; /* more padding for future expansion */ - - /* fields only written to during inode creation */ - xfs_timestamp_t di_crtime; /* time created */ - __be64 di_ino; /* inode number */ - uuid_t di_uuid; /* UUID of the filesystem */ - - /* structure must be padded to 64 bit alignment */ -} xfs_dinode_t; - -#define XFS_DINODE_CRC_OFF offsetof(struct xfs_dinode, di_crc) - -#define DI_MAX_FLUSH 0xffff - -/* - * Size of the core inode on disk. Version 1 and 2 inodes have - * the same size, but version 3 has grown a few additional fields. - */ -static inline uint xfs_dinode_size(int version) -{ - if (version == 3) - return sizeof(struct xfs_dinode); - return offsetof(struct xfs_dinode, di_crc); -} - -/* - * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. - * Since the pathconf interface is signed, we use 2^31 - 1 instead. - * The old inode format had a 16 bit link count, so its maximum is USHRT_MAX. - */ -#define XFS_MAXLINK ((1U << 31) - 1U) -#define XFS_MAXLINK_1 65535U - -/* - * Values for di_format - */ -typedef enum xfs_dinode_fmt { - XFS_DINODE_FMT_DEV, /* xfs_dev_t */ - XFS_DINODE_FMT_LOCAL, /* bulk data */ - XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ - XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ - XFS_DINODE_FMT_UUID /* uuid_t */ -} xfs_dinode_fmt_t; - -/* - * Inode minimum and maximum sizes. - */ -#define XFS_DINODE_MIN_LOG 8 -#define XFS_DINODE_MAX_LOG 11 -#define XFS_DINODE_MIN_SIZE (1 << XFS_DINODE_MIN_LOG) -#define XFS_DINODE_MAX_SIZE (1 << XFS_DINODE_MAX_LOG) - -/* - * Inode size for given fs. - */ -#define XFS_LITINO(mp, version) \ - ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) - -/* - * Inode data & attribute fork sizes, per inode. - */ -#define XFS_DFORK_Q(dip) ((dip)->di_forkoff != 0) -#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_forkoff << 3)) - -#define XFS_DFORK_DSIZE(dip,mp) \ - (XFS_DFORK_Q(dip) ? \ - XFS_DFORK_BOFF(dip) : \ - XFS_LITINO(mp, (dip)->di_version)) -#define XFS_DFORK_ASIZE(dip,mp) \ - (XFS_DFORK_Q(dip) ? \ - XFS_LITINO(mp, (dip)->di_version) - XFS_DFORK_BOFF(dip) : \ - 0) -#define XFS_DFORK_SIZE(dip,mp,w) \ - ((w) == XFS_DATA_FORK ? \ - XFS_DFORK_DSIZE(dip, mp) : \ - XFS_DFORK_ASIZE(dip, mp)) - -/* - * Return pointers to the data or attribute forks. - */ -#define XFS_DFORK_DPTR(dip) \ - ((char *)dip + xfs_dinode_size(dip->di_version)) -#define XFS_DFORK_APTR(dip) \ - (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) -#define XFS_DFORK_PTR(dip,w) \ - ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip)) - -#define XFS_DFORK_FORMAT(dip,w) \ - ((w) == XFS_DATA_FORK ? \ - (dip)->di_format : \ - (dip)->di_aformat) -#define XFS_DFORK_NEXTENTS(dip,w) \ - ((w) == XFS_DATA_FORK ? \ - be32_to_cpu((dip)->di_nextents) : \ - be16_to_cpu((dip)->di_anextents)) - -#define XFS_BUF_TO_DINODE(bp) ((xfs_dinode_t *)((bp)->b_addr)) - -/* - * For block and character special files the 32bit dev_t is stored at the - * beginning of the data fork. - */ -static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip) -{ - return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip)); -} - -static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) -{ - *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev); -} - -/* - * Values for di_flags - * There should be a one-to-one correspondence between these flags and the - * XFS_XFLAG_s. - */ -#define XFS_DIFLAG_REALTIME_BIT 0 /* file's blocks come from rt area */ -#define XFS_DIFLAG_PREALLOC_BIT 1 /* file space has been preallocated */ -#define XFS_DIFLAG_NEWRTBM_BIT 2 /* for rtbitmap inode, new format */ -#define XFS_DIFLAG_IMMUTABLE_BIT 3 /* inode is immutable */ -#define XFS_DIFLAG_APPEND_BIT 4 /* inode is append-only */ -#define XFS_DIFLAG_SYNC_BIT 5 /* inode is written synchronously */ -#define XFS_DIFLAG_NOATIME_BIT 6 /* do not update atime */ -#define XFS_DIFLAG_NODUMP_BIT 7 /* do not dump */ -#define XFS_DIFLAG_RTINHERIT_BIT 8 /* create with realtime bit set */ -#define XFS_DIFLAG_PROJINHERIT_BIT 9 /* create with parents projid */ -#define XFS_DIFLAG_NOSYMLINKS_BIT 10 /* disallow symlink creation */ -#define XFS_DIFLAG_EXTSIZE_BIT 11 /* inode extent size allocator hint */ -#define XFS_DIFLAG_EXTSZINHERIT_BIT 12 /* inherit inode extent size */ -#define XFS_DIFLAG_NODEFRAG_BIT 13 /* do not reorganize/defragment */ -#define XFS_DIFLAG_FILESTREAM_BIT 14 /* use filestream allocator */ -#define XFS_DIFLAG_REALTIME (1 << XFS_DIFLAG_REALTIME_BIT) -#define XFS_DIFLAG_PREALLOC (1 << XFS_DIFLAG_PREALLOC_BIT) -#define XFS_DIFLAG_NEWRTBM (1 << XFS_DIFLAG_NEWRTBM_BIT) -#define XFS_DIFLAG_IMMUTABLE (1 << XFS_DIFLAG_IMMUTABLE_BIT) -#define XFS_DIFLAG_APPEND (1 << XFS_DIFLAG_APPEND_BIT) -#define XFS_DIFLAG_SYNC (1 << XFS_DIFLAG_SYNC_BIT) -#define XFS_DIFLAG_NOATIME (1 << XFS_DIFLAG_NOATIME_BIT) -#define XFS_DIFLAG_NODUMP (1 << XFS_DIFLAG_NODUMP_BIT) -#define XFS_DIFLAG_RTINHERIT (1 << XFS_DIFLAG_RTINHERIT_BIT) -#define XFS_DIFLAG_PROJINHERIT (1 << XFS_DIFLAG_PROJINHERIT_BIT) -#define XFS_DIFLAG_NOSYMLINKS (1 << XFS_DIFLAG_NOSYMLINKS_BIT) -#define XFS_DIFLAG_EXTSIZE (1 << XFS_DIFLAG_EXTSIZE_BIT) -#define XFS_DIFLAG_EXTSZINHERIT (1 << XFS_DIFLAG_EXTSZINHERIT_BIT) -#define XFS_DIFLAG_NODEFRAG (1 << XFS_DIFLAG_NODEFRAG_BIT) -#define XFS_DIFLAG_FILESTREAM (1 << XFS_DIFLAG_FILESTREAM_BIT) - -#ifdef CONFIG_XFS_RT -#define XFS_IS_REALTIME_INODE(ip) ((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME) -#else -#define XFS_IS_REALTIME_INODE(ip) (0) -#endif - -#define XFS_DIFLAG_ANY \ - (XFS_DIFLAG_REALTIME | XFS_DIFLAG_PREALLOC | XFS_DIFLAG_NEWRTBM | \ - XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND | XFS_DIFLAG_SYNC | \ - XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \ - XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \ - XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM) - -#endif /* __XFS_DINODE_H__ */ diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index 7075aaf..d6ddb3f 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -34,7 +34,6 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" -#include "xfs_dinode.h" struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR }; diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c index 9628cec..a9afd7e 100644 --- a/fs/xfs/libxfs/xfs_dir2_block.c +++ b/fs/xfs/libxfs/xfs_dir2_block.c @@ -36,7 +36,6 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_cksum.h" -#include "xfs_dinode.h" /* * Local function prototypes. diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c index 5079e05..58133d2 100644 --- a/fs/xfs/libxfs/xfs_dir2_sf.c +++ b/fs/xfs/libxfs/xfs_dir2_sf.c @@ -32,7 +32,6 @@ #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_trace.h" -#include "xfs_dinode.h" /* * Prototypes for internal functions. diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 7e42bba..3be17ee 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -33,6 +33,220 @@ struct xfs_inode; struct xfs_buf; struct xfs_ifork; +typedef struct xfs_timestamp { + __be32 t_sec; /* timestamp seconds */ + __be32 t_nsec; /* timestamp nanoseconds */ +} xfs_timestamp_t; + +/* + * On-disk inode structure. + * + * This is just the header or "dinode core", the inode is expanded to fill a + * variable size the leftover area split into a data and an attribute fork. + * The format of the data and attribute fork depends on the format of the + * inode as indicated by di_format and di_aformat. To access the data and + * attribute use the XFS_DFORK_DPTR, XFS_DFORK_APTR, and XFS_DFORK_PTR macros + * below. + * + * There is a very similar struct icdinode in xfs_inode which matches the + * layout of the first 96 bytes of this structure, but is kept in native + * format instead of big endian. + * + * Note: di_flushiter is only used by v1/2 inodes - it's effectively a zeroed + * padding field for v3 inodes. + */ +#define XFS_DINODE_MAGIC 0x494e /* 'IN' */ +#define XFS_DINODE_GOOD_VERSION(v) ((v) >= 1 && (v) <= 3) +typedef struct xfs_dinode { + __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ + __be16 di_mode; /* mode and type of file */ + __u8 di_version; /* inode version */ + __u8 di_format; /* format of di_c data */ + __be16 di_onlink; /* old number of links to file */ + __be32 di_uid; /* owner's user id */ + __be32 di_gid; /* owner's group id */ + __be32 di_nlink; /* number of links to file */ + __be16 di_projid_lo; /* lower part of owner's project id */ + __be16 di_projid_hi; /* higher part owner's project id */ + __u8 di_pad[6]; /* unused, zeroed space */ + __be16 di_flushiter; /* incremented on flush */ + xfs_timestamp_t di_atime; /* time last accessed */ + xfs_timestamp_t di_mtime; /* time last modified */ + xfs_timestamp_t di_ctime; /* time created/inode modified */ + __be64 di_size; /* number of bytes in file */ + __be64 di_nblocks; /* # of direct & btree blocks used */ + __be32 di_extsize; /* basic/minimum extent size for file */ + __be32 di_nextents; /* number of extents in data fork */ + __be16 di_anextents; /* number of extents in attribute fork*/ + __u8 di_forkoff; /* attr fork offs, <<3 for 64b align */ + __s8 di_aformat; /* format of attr fork's data */ + __be32 di_dmevmask; /* DMIG event mask */ + __be16 di_dmstate; /* DMIG state info */ + __be16 di_flags; /* random flags, XFS_DIFLAG_... */ + __be32 di_gen; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + __be32 di_next_unlinked;/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + __le32 di_crc; /* CRC of the inode */ + __be64 di_changecount; /* number of attribute changes */ + __be64 di_lsn; /* flush sequence */ + __be64 di_flags2; /* more random flags */ + __u8 di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_timestamp_t di_crtime; /* time created */ + __be64 di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_dinode_t; + +#define XFS_DINODE_CRC_OFF offsetof(struct xfs_dinode, di_crc) + +#define DI_MAX_FLUSH 0xffff + +/* + * Size of the core inode on disk. Version 1 and 2 inodes have + * the same size, but version 3 has grown a few additional fields. + */ +static inline uint xfs_dinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_dinode); + return offsetof(struct xfs_dinode, di_crc); +} + +/* + * The 32 bit link count in the inode theoretically maxes out at UINT_MAX. + * Since the pathconf interface is signed, we use 2^31 - 1 instead. + * The old inode format had a 16 bit link count, so its maximum is USHRT_MAX. + */ +#define XFS_MAXLINK ((1U << 31) - 1U) +#define XFS_MAXLINK_1 65535U + +/* + * Values for di_format + */ +typedef enum xfs_dinode_fmt { + XFS_DINODE_FMT_DEV, /* xfs_dev_t */ + XFS_DINODE_FMT_LOCAL, /* bulk data */ + XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ + XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ + XFS_DINODE_FMT_UUID /* uuid_t */ +} xfs_dinode_fmt_t; + +/* + * Inode minimum and maximum sizes. + */ +#define XFS_DINODE_MIN_LOG 8 +#define XFS_DINODE_MAX_LOG 11 +#define XFS_DINODE_MIN_SIZE (1 << XFS_DINODE_MIN_LOG) +#define XFS_DINODE_MAX_SIZE (1 << XFS_DINODE_MAX_LOG) + +/* + * Inode size for given fs. + */ +#define XFS_LITINO(mp, version) \ + ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) + +/* + * Inode data & attribute fork sizes, per inode. + */ +#define XFS_DFORK_Q(dip) ((dip)->di_forkoff != 0) +#define XFS_DFORK_BOFF(dip) ((int)((dip)->di_forkoff << 3)) + +#define XFS_DFORK_DSIZE(dip,mp) \ + (XFS_DFORK_Q(dip) ? \ + XFS_DFORK_BOFF(dip) : \ + XFS_LITINO(mp, (dip)->di_version)) +#define XFS_DFORK_ASIZE(dip,mp) \ + (XFS_DFORK_Q(dip) ? \ + XFS_LITINO(mp, (dip)->di_version) - XFS_DFORK_BOFF(dip) : \ + 0) +#define XFS_DFORK_SIZE(dip,mp,w) \ + ((w) == XFS_DATA_FORK ? \ + XFS_DFORK_DSIZE(dip, mp) : \ + XFS_DFORK_ASIZE(dip, mp)) + +/* + * Return pointers to the data or attribute forks. + */ +#define XFS_DFORK_DPTR(dip) \ + ((char *)dip + xfs_dinode_size(dip->di_version)) +#define XFS_DFORK_APTR(dip) \ + (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip)) +#define XFS_DFORK_PTR(dip,w) \ + ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip)) + +#define XFS_DFORK_FORMAT(dip,w) \ + ((w) == XFS_DATA_FORK ? \ + (dip)->di_format : \ + (dip)->di_aformat) +#define XFS_DFORK_NEXTENTS(dip,w) \ + ((w) == XFS_DATA_FORK ? \ + be32_to_cpu((dip)->di_nextents) : \ + be16_to_cpu((dip)->di_anextents)) + +/* + * For block and character special files the 32bit dev_t is stored at the + * beginning of the data fork. + */ +static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip) +{ + return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip)); +} + +static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) +{ + *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev); +} + +/* + * Values for di_flags + * There should be a one-to-one correspondence between these flags and the + * XFS_XFLAG_s. + */ +#define XFS_DIFLAG_REALTIME_BIT 0 /* file's blocks come from rt area */ +#define XFS_DIFLAG_PREALLOC_BIT 1 /* file space has been preallocated */ +#define XFS_DIFLAG_NEWRTBM_BIT 2 /* for rtbitmap inode, new format */ +#define XFS_DIFLAG_IMMUTABLE_BIT 3 /* inode is immutable */ +#define XFS_DIFLAG_APPEND_BIT 4 /* inode is append-only */ +#define XFS_DIFLAG_SYNC_BIT 5 /* inode is written synchronously */ +#define XFS_DIFLAG_NOATIME_BIT 6 /* do not update atime */ +#define XFS_DIFLAG_NODUMP_BIT 7 /* do not dump */ +#define XFS_DIFLAG_RTINHERIT_BIT 8 /* create with realtime bit set */ +#define XFS_DIFLAG_PROJINHERIT_BIT 9 /* create with parents projid */ +#define XFS_DIFLAG_NOSYMLINKS_BIT 10 /* disallow symlink creation */ +#define XFS_DIFLAG_EXTSIZE_BIT 11 /* inode extent size allocator hint */ +#define XFS_DIFLAG_EXTSZINHERIT_BIT 12 /* inherit inode extent size */ +#define XFS_DIFLAG_NODEFRAG_BIT 13 /* do not reorganize/defragment */ +#define XFS_DIFLAG_FILESTREAM_BIT 14 /* use filestream allocator */ +#define XFS_DIFLAG_REALTIME (1 << XFS_DIFLAG_REALTIME_BIT) +#define XFS_DIFLAG_PREALLOC (1 << XFS_DIFLAG_PREALLOC_BIT) +#define XFS_DIFLAG_NEWRTBM (1 << XFS_DIFLAG_NEWRTBM_BIT) +#define XFS_DIFLAG_IMMUTABLE (1 << XFS_DIFLAG_IMMUTABLE_BIT) +#define XFS_DIFLAG_APPEND (1 << XFS_DIFLAG_APPEND_BIT) +#define XFS_DIFLAG_SYNC (1 << XFS_DIFLAG_SYNC_BIT) +#define XFS_DIFLAG_NOATIME (1 << XFS_DIFLAG_NOATIME_BIT) +#define XFS_DIFLAG_NODUMP (1 << XFS_DIFLAG_NODUMP_BIT) +#define XFS_DIFLAG_RTINHERIT (1 << XFS_DIFLAG_RTINHERIT_BIT) +#define XFS_DIFLAG_PROJINHERIT (1 << XFS_DIFLAG_PROJINHERIT_BIT) +#define XFS_DIFLAG_NOSYMLINKS (1 << XFS_DIFLAG_NOSYMLINKS_BIT) +#define XFS_DIFLAG_EXTSIZE (1 << XFS_DIFLAG_EXTSIZE_BIT) +#define XFS_DIFLAG_EXTSZINHERIT (1 << XFS_DIFLAG_EXTSZINHERIT_BIT) +#define XFS_DIFLAG_NODEFRAG (1 << XFS_DIFLAG_NODEFRAG_BIT) +#define XFS_DIFLAG_FILESTREAM (1 << XFS_DIFLAG_FILESTREAM_BIT) + +#define XFS_DIFLAG_ANY \ + (XFS_DIFLAG_REALTIME | XFS_DIFLAG_PREALLOC | XFS_DIFLAG_NEWRTBM | \ + XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND | XFS_DIFLAG_SYNC | \ + XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \ + XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \ + XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM) + + /* * RealTime Device format definitions */ diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 23dcb72..7eb2fca 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -39,7 +39,6 @@ #include "xfs_buf_item.h" #include "xfs_icreate_item.h" #include "xfs_icache.h" -#include "xfs_dinode.h" #include "xfs_trace.h" diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index f18fd2d..184c68e 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -30,7 +30,6 @@ #include "xfs_icache.h" #include "xfs_trans.h" #include "xfs_ialloc.h" -#include "xfs_dinode.h" /* * Check that none of the inode's in the buffer have a next diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 6a00f7f..e45d833 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -34,7 +34,6 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_attr_sf.h" -#include "xfs_dinode.h" kmem_zone_t *xfs_ifork_zone; diff --git a/fs/xfs/libxfs/xfs_log_format.h b/fs/xfs/libxfs/xfs_log_format.h index aff12f2..2653146 100644 --- a/fs/xfs/libxfs/xfs_log_format.h +++ b/fs/xfs/libxfs/xfs_log_format.h @@ -361,7 +361,7 @@ typedef struct xfs_ictimestamp { /* * NOTE: This structure must be kept identical to struct xfs_dinode - * in xfs_dinode.h except for the endianness annotations. + * except for the endianness annotations. */ typedef struct xfs_icdinode { __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index 7c818f1..de0fe1e 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -36,7 +36,6 @@ #include "xfs_trace.h" #include "xfs_buf.h" #include "xfs_icache.h" -#include "xfs_dinode.h" #include "xfs_rtalloc.h" diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 5f902fa..1eed436 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -33,7 +33,6 @@ #include "xfs_cksum.h" #include "xfs_trans.h" #include "xfs_buf_item.h" -#include "xfs_dinode.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index f5b2453..e4f27e7 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -33,7 +33,6 @@ #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include #include #include diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index aa2a8b1..5665f46 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -39,7 +39,6 @@ #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trace.h" -#include "xfs_dinode.h" #include "xfs_dir2.h" /* diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 62db83a..143435c 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -39,7 +39,6 @@ #include "xfs_trace.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" -#include "xfs_dinode.h" #include "xfs_dir2.h" STATIC int diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 2810026..6bafbc0 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -42,7 +42,6 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_log.h" -#include "xfs_dinode.h" /* Kernel only BMAP related definitions and functions */ diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index f1b69ed..1e937fc 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -34,7 +34,6 @@ #include "xfs_trace.h" #include "xfs_bmap.h" #include "xfs_trans.h" -#include "xfs_dinode.h" /* * Directory file type support functions diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index eb596b4..8fe87bb 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -37,7 +37,6 @@ #include "xfs_ioctl.h" #include "xfs_trace.h" #include "xfs_log.h" -#include "xfs_dinode.h" #include "xfs_icache.h" #include diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index e92730c..fe47f3d 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -29,7 +29,6 @@ #include "xfs_bmap_util.h" #include "xfs_alloc.h" #include "xfs_mru_cache.h" -#include "xfs_dinode.h" #include "xfs_filestream.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index c05ac8b..594af19 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -40,7 +40,6 @@ #include "xfs_rtalloc.h" #include "xfs_trace.h" #include "xfs_log.h" -#include "xfs_dinode.h" #include "xfs_filestream.h" /* diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 9af2882..4ed2ba9 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -20,7 +20,6 @@ #include "xfs_inode_buf.h" #include "xfs_inode_fork.h" -#include "xfs_dinode.h" /* * Kernel only inode definitions @@ -324,7 +323,6 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ ((pip)->i_d.di_mode & S_ISGID)) - int xfs_release(struct xfs_inode *ip); void xfs_inactive(struct xfs_inode *ip); int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name, diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 63de0b0..efa6e59 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -29,7 +29,6 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_trans_priv.h" -#include "xfs_dinode.h" #include "xfs_log.h" diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 24c926b6..6a8737b 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -40,7 +40,6 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_symlink.h" -#include "xfs_dinode.h" #include "xfs_trans.h" #include diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index afcf3c9..cf110224 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -38,7 +38,6 @@ #include "xfs_quota.h" #include "xfs_dquot_item.h" #include "xfs_dquot.h" -#include "xfs_dinode.h" #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..1e72c77 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -38,7 +38,6 @@ #include "xfs_symlink.h" #include "xfs_da_btree.h" #include "xfs_dir2_priv.h" -#include "xfs_dinode.h" #include "xfs_trans_space.h" #include diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 894924a..c3f51f6 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -33,7 +33,6 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_icache.h" -#include "xfs_dinode.h" STATIC int xfs_internal_inum( diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 6a51619..c31d2c2 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -384,4 +384,10 @@ static inline __uint64_t howmany_64(__uint64_t x, __uint32_t y) #endif /* XFS_WARN */ #endif /* DEBUG */ +#ifdef CONFIG_XFS_RT +#define XFS_IS_REALTIME_INODE(ip) ((ip)->i_d.di_flags & XFS_DIFLAG_REALTIME) +#else +#define XFS_IS_REALTIME_INODE(ip) (0) +#endif + #endif /* __XFS_LINUX__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 00cd7f3..9b3fca6 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -42,7 +42,6 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_error.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 51435db..faf3e36 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -41,7 +41,6 @@ #include "xfs_fsops.h" #include "xfs_trace.h" #include "xfs_icache.h" -#include "xfs_dinode.h" #include "xfs_sysfs.h" diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index d68f230..cca7445 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -38,7 +38,6 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_cksum.h" -#include "xfs_dinode.h" /* * The global quota manager. There is only one of these for the entire diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index e1175ea..562dcdf 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -36,7 +36,6 @@ #include "xfs_trace.h" #include "xfs_buf.h" #include "xfs_icache.h" -#include "xfs_dinode.h" #include "xfs_rtalloc.h" diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 9f622fe..8f02647 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -44,7 +44,6 @@ #include "xfs_icache.h" #include "xfs_trace.h" #include "xfs_icreate_item.h" -#include "xfs_dinode.h" #include "xfs_filestream.h" #include "xfs_quota.h" #include "xfs_sysfs.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 02ae62a..f38a3f1 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -42,7 +42,6 @@ #include "xfs_symlink.h" #include "xfs_trans.h" #include "xfs_log.h" -#include "xfs_dinode.h" /* ----- Kernel only functions below ----- */ STATIC int -- 1.9.1 From BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org Wed Nov 26 13:14:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 88EB17F58 for ; Wed, 26 Nov 2014 13:14:44 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 520DC304071 for ; Wed, 26 Nov 2014 11:14:44 -0800 (PST) X-ASG-Debug-ID: 1417029281-04bdf0615e8b8e10001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id D9SwFokaY6sJgFVo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:14:42 -0800 (PST) X-Barracuda-Envelope-From: BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xti2y-0002pG-MD for xfs@oss.sgi.com; Wed, 26 Nov 2014 19:14:41 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: merge xfs_inum.h into xfs_format.h Date: Wed, 26 Nov 2014 20:14:27 +0100 X-ASG-Orig-Subj: [PATCH 5/5] xfs: merge xfs_inum.h into xfs_format.h Message-Id: <1417029267-20149-5-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1417029267-20149-1-git-send-email-hch@lst.de> References: <1417029267-20149-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1417029282 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_bmap.c | 1 - fs/xfs/libxfs/xfs_dir2.c | 1 - fs/xfs/libxfs/xfs_format.h | 35 ++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.c | 1 - fs/xfs/libxfs/xfs_inode_fork.c | 1 - fs/xfs/libxfs/xfs_inum.h | 60 ------------------------------------------ fs/xfs/xfs_filestream.c | 1 - fs/xfs/xfs_icache.c | 1 - fs/xfs/xfs_inode.c | 1 - fs/xfs/xfs_itable.c | 1 - fs/xfs/xfs_log_recover.c | 1 - fs/xfs/xfs_mount.c | 1 - fs/xfs/xfs_super.c | 1 - 13 files changed, 35 insertions(+), 71 deletions(-) delete mode 100644 fs/xfs/libxfs/xfs_inum.h diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 68d9133..c2a36c3 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index 5d89291..d399f17 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_inum.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 70ca740..fbd6da2 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -1068,6 +1068,41 @@ static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev) XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \ XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM) +/* + * Inode number format: + * low inopblog bits - offset in block + * next agblklog bits - block number in ag + * next agno_log bits - ag number + * high agno_log-agblklog-inopblog bits - 0 + */ +#define XFS_INO_MASK(k) (__uint32_t)((1ULL << (k)) - 1) +#define XFS_INO_OFFSET_BITS(mp) (mp)->m_sb.sb_inopblog +#define XFS_INO_AGBNO_BITS(mp) (mp)->m_sb.sb_agblklog +#define XFS_INO_AGINO_BITS(mp) (mp)->m_agino_log +#define XFS_INO_AGNO_BITS(mp) (mp)->m_agno_log +#define XFS_INO_BITS(mp) \ + XFS_INO_AGNO_BITS(mp) + XFS_INO_AGINO_BITS(mp) +#define XFS_INO_TO_AGNO(mp,i) \ + ((xfs_agnumber_t)((i) >> XFS_INO_AGINO_BITS(mp))) +#define XFS_INO_TO_AGINO(mp,i) \ + ((xfs_agino_t)(i) & XFS_INO_MASK(XFS_INO_AGINO_BITS(mp))) +#define XFS_INO_TO_AGBNO(mp,i) \ + (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \ + XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp))) +#define XFS_INO_TO_OFFSET(mp,i) \ + ((int)(i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp))) +#define XFS_INO_TO_FSB(mp,i) \ + XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) +#define XFS_AGINO_TO_INO(mp,a,i) \ + (((xfs_ino_t)(a) << XFS_INO_AGINO_BITS(mp)) | (i)) +#define XFS_AGINO_TO_AGBNO(mp,i) ((i) >> XFS_INO_OFFSET_BITS(mp)) +#define XFS_AGINO_TO_OFFSET(mp,i) \ + ((i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp))) +#define XFS_OFFBNO_TO_AGINO(mp,b,o) \ + ((xfs_agino_t)(((b) << XFS_INO_OFFSET_BITS(mp)) | (o))) + +#define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 56) - 1ULL)) +#define XFS_MAXINUMBER_32 ((xfs_ino_t)((1ULL << 32) - 1ULL)) /* * RealTime Device format definitions diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 1dae7da..92d2617 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index 8912d28..0defbd0 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -22,7 +22,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_inum.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_inum.h b/fs/xfs/libxfs/xfs_inum.h deleted file mode 100644 index 4ff2278..0000000 --- a/fs/xfs/libxfs/xfs_inum.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_INUM_H__ -#define __XFS_INUM_H__ - -/* - * Inode number format: - * low inopblog bits - offset in block - * next agblklog bits - block number in ag - * next agno_log bits - ag number - * high agno_log-agblklog-inopblog bits - 0 - */ - -struct xfs_mount; - -#define XFS_INO_MASK(k) (__uint32_t)((1ULL << (k)) - 1) -#define XFS_INO_OFFSET_BITS(mp) (mp)->m_sb.sb_inopblog -#define XFS_INO_AGBNO_BITS(mp) (mp)->m_sb.sb_agblklog -#define XFS_INO_AGINO_BITS(mp) (mp)->m_agino_log -#define XFS_INO_AGNO_BITS(mp) (mp)->m_agno_log -#define XFS_INO_BITS(mp) \ - XFS_INO_AGNO_BITS(mp) + XFS_INO_AGINO_BITS(mp) -#define XFS_INO_TO_AGNO(mp,i) \ - ((xfs_agnumber_t)((i) >> XFS_INO_AGINO_BITS(mp))) -#define XFS_INO_TO_AGINO(mp,i) \ - ((xfs_agino_t)(i) & XFS_INO_MASK(XFS_INO_AGINO_BITS(mp))) -#define XFS_INO_TO_AGBNO(mp,i) \ - (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \ - XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp))) -#define XFS_INO_TO_OFFSET(mp,i) \ - ((int)(i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp))) -#define XFS_INO_TO_FSB(mp,i) \ - XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i)) -#define XFS_AGINO_TO_INO(mp,a,i) \ - (((xfs_ino_t)(a) << XFS_INO_AGINO_BITS(mp)) | (i)) -#define XFS_AGINO_TO_AGBNO(mp,i) ((i) >> XFS_INO_OFFSET_BITS(mp)) -#define XFS_AGINO_TO_OFFSET(mp,i) \ - ((i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp))) -#define XFS_OFFBNO_TO_AGINO(mp,b,o) \ - ((xfs_agino_t)(((b) << XFS_INO_OFFSET_BITS(mp)) | (o))) - -#define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 56) - 1ULL)) -#define XFS_MAXINUMBER_32 ((xfs_ino_t)((1ULL << 32) - 1ULL)) - -#endif /* __XFS_INUM_H__ */ diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index c5b06a9..a2e86e8 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -22,7 +22,6 @@ #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_mount.h" -#include "xfs_inum.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index e364723..92ca910 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 229dfde..7054bae 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -23,7 +23,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 77aba24..5930d66 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_inum.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 697073a..75705dd 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index e627336..92faae5 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index af4f63e..f14affc 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" -- 1.9.1 From BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org Wed Nov 26 13:14:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BF777F5D for ; Wed, 26 Nov 2014 13:14:45 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 880E0304070 for ; Wed, 26 Nov 2014 11:14:45 -0800 (PST) X-ASG-Debug-ID: 1417029280-04cb6c057073eb00001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id oWtqENIc270dSY3l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:14:41 -0800 (PST) X-Barracuda-Envelope-From: BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xti2x-0002pC-3W for xfs@oss.sgi.com; Wed, 26 Nov 2014 19:14:40 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: move most of xfs_sb.h to xfs_format.h Date: Wed, 26 Nov 2014 20:14:26 +0100 X-ASG-Orig-Subj: [PATCH 4/5] xfs: move most of xfs_sb.h to xfs_format.h Message-Id: <1417029267-20149-4-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1417029267-20149-1-git-send-email-hch@lst.de> References: <1417029267-20149-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1417029280 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- More on-disk format consolidation. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_attr.c | 1 - fs/xfs/libxfs/xfs_attr_remote.c | 1 - fs/xfs/libxfs/xfs_bmap_btree.c | 1 - fs/xfs/libxfs/xfs_btree.c | 1 - fs/xfs/libxfs/xfs_da_btree.c | 1 - fs/xfs/libxfs/xfs_da_format.c | 1 - fs/xfs/libxfs/xfs_dir2.c | 1 - fs/xfs/libxfs/xfs_dir2_block.c | 1 - fs/xfs/libxfs/xfs_dir2_data.c | 1 - fs/xfs/libxfs/xfs_dir2_leaf.c | 1 - fs/xfs/libxfs/xfs_dir2_node.c | 1 - fs/xfs/libxfs/xfs_dir2_sf.c | 1 - fs/xfs/libxfs/xfs_dquot_buf.c | 1 - fs/xfs/libxfs/xfs_format.h | 579 ++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc_btree.c | 1 - fs/xfs/libxfs/xfs_inode_buf.c | 1 - fs/xfs/libxfs/xfs_inode_fork.c | 1 - fs/xfs/libxfs/xfs_log_rlimit.c | 1 - fs/xfs/libxfs/xfs_rtbitmap.c | 1 - fs/xfs/libxfs/xfs_sb.h | 584 ------------------------------------- fs/xfs/libxfs/xfs_symlink_remote.c | 1 - fs/xfs/libxfs/xfs_trans_resv.c | 1 - fs/xfs/xfs_acl.c | 1 - fs/xfs/xfs_aops.c | 1 - fs/xfs/xfs_attr_inactive.c | 1 - fs/xfs/xfs_attr_list.c | 1 - fs/xfs/xfs_bmap_util.c | 1 - fs/xfs/xfs_dir2_readdir.c | 1 - fs/xfs/xfs_dquot.c | 1 - fs/xfs/xfs_dquot_item.c | 1 - fs/xfs/xfs_error.c | 1 - fs/xfs/xfs_export.c | 1 - fs/xfs/xfs_extfree_item.c | 1 - fs/xfs/xfs_file.c | 1 - fs/xfs/xfs_icreate_item.c | 1 - fs/xfs/xfs_inode_item.c | 1 - fs/xfs/xfs_ioctl.c | 1 - fs/xfs/xfs_ioctl32.c | 1 - fs/xfs/xfs_iomap.c | 1 - fs/xfs/xfs_iops.c | 1 - fs/xfs/xfs_itable.c | 1 - fs/xfs/xfs_log.c | 1 - fs/xfs/xfs_log_cil.c | 1 - fs/xfs/xfs_message.c | 1 - fs/xfs/xfs_qm_bhv.c | 1 - fs/xfs/xfs_quotaops.c | 1 - fs/xfs/xfs_rtalloc.c | 1 - fs/xfs/xfs_symlink.c | 1 - fs/xfs/xfs_trace.c | 1 - fs/xfs/xfs_trans.c | 1 - fs/xfs/xfs_trans_ail.c | 1 - fs/xfs/xfs_trans_buf.c | 1 - fs/xfs/xfs_trans_dquot.c | 1 - fs/xfs/xfs_trans_extfree.c | 1 - fs/xfs/xfs_trans_inode.c | 1 - fs/xfs/xfs_xattr.c | 1 - 56 files changed, 579 insertions(+), 638 deletions(-) diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index f782d36..0a472fb 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c index 4edd4a8..20de88d 100644 --- a/fs/xfs/libxfs/xfs_attr_remote.c +++ b/fs/xfs/libxfs/xfs_attr_remote.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index 91588a5..2c44c8e 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 256d532..81cad43 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index 2b88061..c41e751 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_da_format.c b/fs/xfs/libxfs/xfs_da_format.c index 927e9eb..9d624a6 100644 --- a/fs/xfs/libxfs/xfs_da_format.c +++ b/fs/xfs/libxfs/xfs_da_format.c @@ -22,7 +22,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index 672a29e..5d89291 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c index a6b3a6a..c2e34c5 100644 --- a/fs/xfs/libxfs/xfs_dir2_block.c +++ b/fs/xfs/libxfs/xfs_dir2_block.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index 2c8f463..5ff31be 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_leaf.c b/fs/xfs/libxfs/xfs_dir2_leaf.c index 777c482..ed41a0e 100644 --- a/fs/xfs/libxfs/xfs_dir2_leaf.c +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c index c0a0e19..78ceda1 100644 --- a/fs/xfs/libxfs/xfs_dir2_node.c +++ b/fs/xfs/libxfs/xfs_dir2_node.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c index ab99dbc..2baedc4 100644 --- a/fs/xfs/libxfs/xfs_dir2_sf.c +++ b/fs/xfs/libxfs/xfs_dir2_sf.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dquot_buf.c b/fs/xfs/libxfs/xfs_dquot_buf.c index cd68926..6fbf2d8 100644 --- a/fs/xfs/libxfs/xfs_dquot_buf.c +++ b/fs/xfs/libxfs/xfs_dquot_buf.c @@ -22,7 +22,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_quota.h" diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index 9b6e424..70ca740 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -34,6 +34,585 @@ struct xfs_buf; struct xfs_ifork; /* + * Super block + * Fits into a sector-sized buffer at address 0 of each allocation group. + * Only the first of these is ever updated except during growfs. + */ +#define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ +#define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ +#define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ +#define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ +#define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ +#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ +#define XFS_SB_VERSION_NUMBITS 0x000f +#define XFS_SB_VERSION_ALLFBITS 0xfff0 +#define XFS_SB_VERSION_ATTRBIT 0x0010 +#define XFS_SB_VERSION_NLINKBIT 0x0020 +#define XFS_SB_VERSION_QUOTABIT 0x0040 +#define XFS_SB_VERSION_ALIGNBIT 0x0080 +#define XFS_SB_VERSION_DALIGNBIT 0x0100 +#define XFS_SB_VERSION_SHAREDBIT 0x0200 +#define XFS_SB_VERSION_LOGV2BIT 0x0400 +#define XFS_SB_VERSION_SECTORBIT 0x0800 +#define XFS_SB_VERSION_EXTFLGBIT 0x1000 +#define XFS_SB_VERSION_DIRV2BIT 0x2000 +#define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ +#define XFS_SB_VERSION_MOREBITSBIT 0x8000 + +/* + * Supported feature bit list is just all bits in the versionnum field because + * we've used them all up and understand them all. Except, of course, for the + * shared superblock bit, which nobody knows what it does and so is unsupported. + */ +#define XFS_SB_VERSION_OKBITS \ + ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ + ~XFS_SB_VERSION_SHAREDBIT) + +/* + * There are two words to hold XFS "feature" bits: the original + * word, sb_versionnum, and sb_features2. Whenever a bit is set in + * sb_features2, the feature bit XFS_SB_VERSION_MOREBITSBIT must be set. + * + * These defines represent bits in sb_features2. + */ +#define XFS_SB_VERSION2_RESERVED1BIT 0x00000001 +#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */ +#define XFS_SB_VERSION2_RESERVED4BIT 0x00000004 +#define XFS_SB_VERSION2_ATTR2BIT 0x00000008 /* Inline attr rework */ +#define XFS_SB_VERSION2_PARENTBIT 0x00000010 /* parent pointers */ +#define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32 bit project id */ +#define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ +#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ + +#define XFS_SB_VERSION2_OKBITS \ + (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ + XFS_SB_VERSION2_ATTR2BIT | \ + XFS_SB_VERSION2_PROJID32BIT | \ + XFS_SB_VERSION2_FTYPE) + +/* + * Superblock - in core version. Must match the ondisk version below. + * Must be padded to 64 bit alignment. + */ +typedef struct xfs_sb { + __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ + __uint32_t sb_blocksize; /* logical block size, bytes */ + xfs_rfsblock_t sb_dblocks; /* number of data blocks */ + xfs_rfsblock_t sb_rblocks; /* number of realtime blocks */ + xfs_rtblock_t sb_rextents; /* number of realtime extents */ + uuid_t sb_uuid; /* file system unique id */ + xfs_fsblock_t sb_logstart; /* starting block of log if internal */ + xfs_ino_t sb_rootino; /* root inode number */ + xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */ + xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */ + xfs_agblock_t sb_rextsize; /* realtime extent size, blocks */ + xfs_agblock_t sb_agblocks; /* size of an allocation group */ + xfs_agnumber_t sb_agcount; /* number of allocation groups */ + xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */ + xfs_extlen_t sb_logblocks; /* number of log blocks */ + __uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */ + __uint16_t sb_sectsize; /* volume sector size, bytes */ + __uint16_t sb_inodesize; /* inode size, bytes */ + __uint16_t sb_inopblock; /* inodes per block */ + char sb_fname[12]; /* file system name */ + __uint8_t sb_blocklog; /* log2 of sb_blocksize */ + __uint8_t sb_sectlog; /* log2 of sb_sectsize */ + __uint8_t sb_inodelog; /* log2 of sb_inodesize */ + __uint8_t sb_inopblog; /* log2 of sb_inopblock */ + __uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ + __uint8_t sb_rextslog; /* log2 of sb_rextents */ + __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ + __uint8_t sb_imax_pct; /* max % of fs for inode space */ + /* statistics */ + /* + * These fields must remain contiguous. If you really + * want to change their layout, make sure you fix the + * code in xfs_trans_apply_sb_deltas(). + */ + __uint64_t sb_icount; /* allocated inodes */ + __uint64_t sb_ifree; /* free inodes */ + __uint64_t sb_fdblocks; /* free data blocks */ + __uint64_t sb_frextents; /* free realtime extents */ + /* + * End contiguous fields. + */ + xfs_ino_t sb_uquotino; /* user quota inode */ + xfs_ino_t sb_gquotino; /* group quota inode */ + __uint16_t sb_qflags; /* quota flags */ + __uint8_t sb_flags; /* misc. flags */ + __uint8_t sb_shared_vn; /* shared version number */ + xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */ + __uint32_t sb_unit; /* stripe or raid unit */ + __uint32_t sb_width; /* stripe or raid width */ + __uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ + __uint8_t sb_logsectlog; /* log2 of the log sector size */ + __uint16_t sb_logsectsize; /* sector size for the log, bytes */ + __uint32_t sb_logsunit; /* stripe unit size for the log */ + __uint32_t sb_features2; /* additional feature bits */ + + /* + * bad features2 field as a result of failing to pad the sb + * structure to 64 bits. Some machines will be using this field + * for features2 bits. Easiest just to mark it bad and not use + * it for anything else. + */ + __uint32_t sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __uint32_t sb_features_compat; + __uint32_t sb_features_ro_compat; + __uint32_t sb_features_incompat; + __uint32_t sb_features_log_incompat; + + __uint32_t sb_crc; /* superblock crc */ + __uint32_t sb_pad; + + xfs_ino_t sb_pquotino; /* project quota inode */ + xfs_lsn_t sb_lsn; /* last write sequence */ + + /* must be padded to 64 bit alignment */ +} xfs_sb_t; + +#define XFS_SB_CRC_OFF offsetof(struct xfs_sb, sb_crc) + +/* + * Superblock - on disk version. Must match the in core version above. + * Must be padded to 64 bit alignment. + */ +typedef struct xfs_dsb { + __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ + __be32 sb_blocksize; /* logical block size, bytes */ + __be64 sb_dblocks; /* number of data blocks */ + __be64 sb_rblocks; /* number of realtime blocks */ + __be64 sb_rextents; /* number of realtime extents */ + uuid_t sb_uuid; /* file system unique id */ + __be64 sb_logstart; /* starting block of log if internal */ + __be64 sb_rootino; /* root inode number */ + __be64 sb_rbmino; /* bitmap inode for realtime extents */ + __be64 sb_rsumino; /* summary inode for rt bitmap */ + __be32 sb_rextsize; /* realtime extent size, blocks */ + __be32 sb_agblocks; /* size of an allocation group */ + __be32 sb_agcount; /* number of allocation groups */ + __be32 sb_rbmblocks; /* number of rt bitmap blocks */ + __be32 sb_logblocks; /* number of log blocks */ + __be16 sb_versionnum; /* header version == XFS_SB_VERSION */ + __be16 sb_sectsize; /* volume sector size, bytes */ + __be16 sb_inodesize; /* inode size, bytes */ + __be16 sb_inopblock; /* inodes per block */ + char sb_fname[12]; /* file system name */ + __u8 sb_blocklog; /* log2 of sb_blocksize */ + __u8 sb_sectlog; /* log2 of sb_sectsize */ + __u8 sb_inodelog; /* log2 of sb_inodesize */ + __u8 sb_inopblog; /* log2 of sb_inopblock */ + __u8 sb_agblklog; /* log2 of sb_agblocks (rounded up) */ + __u8 sb_rextslog; /* log2 of sb_rextents */ + __u8 sb_inprogress; /* mkfs is in progress, don't mount */ + __u8 sb_imax_pct; /* max % of fs for inode space */ + /* statistics */ + /* + * These fields must remain contiguous. If you really + * want to change their layout, make sure you fix the + * code in xfs_trans_apply_sb_deltas(). + */ + __be64 sb_icount; /* allocated inodes */ + __be64 sb_ifree; /* free inodes */ + __be64 sb_fdblocks; /* free data blocks */ + __be64 sb_frextents; /* free realtime extents */ + /* + * End contiguous fields. + */ + __be64 sb_uquotino; /* user quota inode */ + __be64 sb_gquotino; /* group quota inode */ + __be16 sb_qflags; /* quota flags */ + __u8 sb_flags; /* misc. flags */ + __u8 sb_shared_vn; /* shared version number */ + __be32 sb_inoalignmt; /* inode chunk alignment, fsblocks */ + __be32 sb_unit; /* stripe or raid unit */ + __be32 sb_width; /* stripe or raid width */ + __u8 sb_dirblklog; /* log2 of dir block size (fsbs) */ + __u8 sb_logsectlog; /* log2 of the log sector size */ + __be16 sb_logsectsize; /* sector size for the log, bytes */ + __be32 sb_logsunit; /* stripe unit size for the log */ + __be32 sb_features2; /* additional feature bits */ + /* + * bad features2 field as a result of failing to pad the sb + * structure to 64 bits. Some machines will be using this field + * for features2 bits. Easiest just to mark it bad and not use + * it for anything else. + */ + __be32 sb_bad_features2; + + /* version 5 superblock fields start here */ + + /* feature masks */ + __be32 sb_features_compat; + __be32 sb_features_ro_compat; + __be32 sb_features_incompat; + __be32 sb_features_log_incompat; + + __le32 sb_crc; /* superblock crc */ + __be32 sb_pad; + + __be64 sb_pquotino; /* project quota inode */ + __be64 sb_lsn; /* last write sequence */ + + /* must be padded to 64 bit alignment */ +} xfs_dsb_t; + +/* + * Sequence number values for the fields. + */ +typedef enum { + XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS, + XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO, + XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS, + XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS, + XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE, + XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG, + XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG, + XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT, + XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO, + XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, + XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, + XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, + XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, + XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, + XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, + XFS_SBS_PQUOTINO, XFS_SBS_LSN, + XFS_SBS_FIELDCOUNT +} xfs_sb_field_t; + +/* + * Mask values, defined based on the xfs_sb_field_t values. + * Only define the ones we're using. + */ +#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x) +#define XFS_SB_UUID XFS_SB_MVAL(UUID) +#define XFS_SB_FNAME XFS_SB_MVAL(FNAME) +#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO) +#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO) +#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO) +#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM) +#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO) +#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO) +#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS) +#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN) +#define XFS_SB_UNIT XFS_SB_MVAL(UNIT) +#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH) +#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) +#define XFS_SB_IFREE XFS_SB_MVAL(IFREE) +#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) +#define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) +#define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) +#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) +#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) +#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) +#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) +#define XFS_SB_CRC XFS_SB_MVAL(CRC) +#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) +#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) +#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) +#define XFS_SB_MOD_BITS \ + (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ + XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ + XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ + XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ + XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ + XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \ + XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO) + + +/* + * Misc. Flags - warning - these will be cleared by xfs_repair unless + * a feature bit is set when the flag is used. + */ +#define XFS_SBF_NOFLAGS 0x00 /* no flags set */ +#define XFS_SBF_READONLY 0x01 /* only read-only mounts allowed */ + +/* + * define max. shared version we can interoperate with + */ +#define XFS_SB_MAX_SHARED_VN 0 + +#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) + +/* + * The first XFS version we support is a v4 superblock with V2 directories. + */ +static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) +{ + if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) + return false; + + /* check for unknown features in the fs */ + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) + return false; + + return true; +} + +static inline bool xfs_sb_good_version(struct xfs_sb *sbp) +{ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) + return true; + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) + return xfs_sb_good_v4_features(sbp); + return false; +} + +/* + * Detect a mismatched features2 field. Older kernels read/wrote + * this into the wrong slot, so to be safe we keep them in sync. + */ +static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp) +{ + return sbp->sb_bad_features2 != sbp->sb_features2; +} + +static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp) +{ + return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); +} + +static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) +{ + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; +} + +static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp) +{ + return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); +} + +static inline void xfs_sb_version_addquota(struct xfs_sb *sbp) +{ + sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; +} + +static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); +} + +static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp) +{ + return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); +} + +static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); +} + +static inline bool xfs_sb_version_hasextflgbit(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); +} + +static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp) +{ + return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); +} + +static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp) +{ + return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); +} + +static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); +} + +/* + * sb_features2 bit version macros. + */ +static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); +} + +static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); +} + +static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) +{ + sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; + sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; +} + +static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) +{ + sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; + if (!sbp->sb_features2) + sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; +} + +static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); +} + +static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp) +{ + sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; + sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; + sbp->sb_bad_features2 |= XFS_SB_VERSION2_PROJID32BIT; +} + +/* + * Extended v5 superblock feature masks. These are to be used for new v5 + * superblock features only. + * + * Compat features are new features that old kernels will not notice or affect + * and so can mount read-write without issues. + * + * RO-Compat (read only) are features that old kernels can read but will break + * if they write. Hence only read-only mounts of such filesystems are allowed on + * kernels that don't support the feature bit. + * + * InCompat features are features which old kernels will not understand and so + * must not mount. + * + * Log-InCompat features are for changes to log formats or new transactions that + * can't be replayed on older kernels. The fields are set when the filesystem is + * mounted, and a clean unmount clears the fields. + */ +#define XFS_SB_FEAT_COMPAT_ALL 0 +#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL +static inline bool +xfs_sb_has_compat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_compat & feature) != 0; +} + +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ +#define XFS_SB_FEAT_RO_COMPAT_ALL \ + (XFS_SB_FEAT_RO_COMPAT_FINOBT) +#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL +static inline bool +xfs_sb_has_ro_compat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_ro_compat & feature) != 0; +} + +#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_ALL \ + (XFS_SB_FEAT_INCOMPAT_FTYPE) + +#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL +static inline bool +xfs_sb_has_incompat_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_incompat & feature) != 0; +} + +#define XFS_SB_FEAT_INCOMPAT_LOG_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL +static inline bool +xfs_sb_has_incompat_log_feature( + struct xfs_sb *sbp, + __uint32_t feature) +{ + return (sbp->sb_features_log_incompat & feature) != 0; +} + +/* + * V5 superblock specific feature checks + */ +static inline int xfs_sb_version_hascrc(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; +} + +static inline int xfs_sb_version_has_pquotino(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; +} + +static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE)) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); +} + +static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) +{ + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && + (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); +} + +/* + * end of superblock version macros + */ + +static inline bool +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) +{ + return (ino == sbp->sb_uquotino || + ino == sbp->sb_gquotino || + ino == sbp->sb_pquotino); +} + +#define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ +#define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) +#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) + +#define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) +#define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ + xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d)) +#define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \ + XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno)) + +/* + * File system sector to basic block conversions. + */ +#define XFS_FSS_TO_BB(mp,sec) ((sec) << (mp)->m_sectbb_log) + +/* + * File system block to basic block conversions. + */ +#define XFS_FSB_TO_BB(mp,fsbno) ((fsbno) << (mp)->m_blkbb_log) +#define XFS_BB_TO_FSB(mp,bb) \ + (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log) +#define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log) + +/* + * File system block to byte conversions. + */ +#define XFS_FSB_TO_B(mp,fsbno) ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog) +#define XFS_B_TO_FSB(mp,b) \ + ((((__uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog) +#define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) +#define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask) + +/* * Allocation group header * * This is divided into three structures, placed in sequential 512-byte diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index 4e029cc..964c465 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index f63c455..002b6b3 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_error.h" diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index ab06599..8912d28 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_log_rlimit.c b/fs/xfs/libxfs/xfs_log_rlimit.c index 1c250ee..c105979 100644 --- a/fs/xfs/libxfs/xfs_log_rlimit.c +++ b/fs/xfs/libxfs/xfs_log_rlimit.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_trans_space.h" diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index ad3d1dc..9b59ffa 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_bmap.h" diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h index 2e73970..8eb1c54 100644 --- a/fs/xfs/libxfs/xfs_sb.h +++ b/fs/xfs/libxfs/xfs_sb.h @@ -19,590 +19,6 @@ #define __XFS_SB_H__ /* - * Super block - * Fits into a sector-sized buffer at address 0 of each allocation group. - * Only the first of these is ever updated except during growfs. - */ - -struct xfs_buf; -struct xfs_mount; -struct xfs_trans; - -#define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ -#define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ -#define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ -#define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ -#define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ -#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ -#define XFS_SB_VERSION_NUMBITS 0x000f -#define XFS_SB_VERSION_ALLFBITS 0xfff0 -#define XFS_SB_VERSION_ATTRBIT 0x0010 -#define XFS_SB_VERSION_NLINKBIT 0x0020 -#define XFS_SB_VERSION_QUOTABIT 0x0040 -#define XFS_SB_VERSION_ALIGNBIT 0x0080 -#define XFS_SB_VERSION_DALIGNBIT 0x0100 -#define XFS_SB_VERSION_SHAREDBIT 0x0200 -#define XFS_SB_VERSION_LOGV2BIT 0x0400 -#define XFS_SB_VERSION_SECTORBIT 0x0800 -#define XFS_SB_VERSION_EXTFLGBIT 0x1000 -#define XFS_SB_VERSION_DIRV2BIT 0x2000 -#define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ -#define XFS_SB_VERSION_MOREBITSBIT 0x8000 - -/* - * Supported feature bit list is just all bits in the versionnum field because - * we've used them all up and understand them all. Except, of course, for the - * shared superblock bit, which nobody knows what it does and so is unsupported. - */ -#define XFS_SB_VERSION_OKBITS \ - ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \ - ~XFS_SB_VERSION_SHAREDBIT) - -/* - * There are two words to hold XFS "feature" bits: the original - * word, sb_versionnum, and sb_features2. Whenever a bit is set in - * sb_features2, the feature bit XFS_SB_VERSION_MOREBITSBIT must be set. - * - * These defines represent bits in sb_features2. - */ -#define XFS_SB_VERSION2_RESERVED1BIT 0x00000001 -#define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */ -#define XFS_SB_VERSION2_RESERVED4BIT 0x00000004 -#define XFS_SB_VERSION2_ATTR2BIT 0x00000008 /* Inline attr rework */ -#define XFS_SB_VERSION2_PARENTBIT 0x00000010 /* parent pointers */ -#define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32 bit project id */ -#define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ -#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ - -#define XFS_SB_VERSION2_OKBITS \ - (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ - XFS_SB_VERSION2_ATTR2BIT | \ - XFS_SB_VERSION2_PROJID32BIT | \ - XFS_SB_VERSION2_FTYPE) - -/* - * Superblock - in core version. Must match the ondisk version below. - * Must be padded to 64 bit alignment. - */ -typedef struct xfs_sb { - __uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */ - __uint32_t sb_blocksize; /* logical block size, bytes */ - xfs_rfsblock_t sb_dblocks; /* number of data blocks */ - xfs_rfsblock_t sb_rblocks; /* number of realtime blocks */ - xfs_rtblock_t sb_rextents; /* number of realtime extents */ - uuid_t sb_uuid; /* file system unique id */ - xfs_fsblock_t sb_logstart; /* starting block of log if internal */ - xfs_ino_t sb_rootino; /* root inode number */ - xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */ - xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */ - xfs_agblock_t sb_rextsize; /* realtime extent size, blocks */ - xfs_agblock_t sb_agblocks; /* size of an allocation group */ - xfs_agnumber_t sb_agcount; /* number of allocation groups */ - xfs_extlen_t sb_rbmblocks; /* number of rt bitmap blocks */ - xfs_extlen_t sb_logblocks; /* number of log blocks */ - __uint16_t sb_versionnum; /* header version == XFS_SB_VERSION */ - __uint16_t sb_sectsize; /* volume sector size, bytes */ - __uint16_t sb_inodesize; /* inode size, bytes */ - __uint16_t sb_inopblock; /* inodes per block */ - char sb_fname[12]; /* file system name */ - __uint8_t sb_blocklog; /* log2 of sb_blocksize */ - __uint8_t sb_sectlog; /* log2 of sb_sectsize */ - __uint8_t sb_inodelog; /* log2 of sb_inodesize */ - __uint8_t sb_inopblog; /* log2 of sb_inopblock */ - __uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ - __uint8_t sb_rextslog; /* log2 of sb_rextents */ - __uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ - __uint8_t sb_imax_pct; /* max % of fs for inode space */ - /* statistics */ - /* - * These fields must remain contiguous. If you really - * want to change their layout, make sure you fix the - * code in xfs_trans_apply_sb_deltas(). - */ - __uint64_t sb_icount; /* allocated inodes */ - __uint64_t sb_ifree; /* free inodes */ - __uint64_t sb_fdblocks; /* free data blocks */ - __uint64_t sb_frextents; /* free realtime extents */ - /* - * End contiguous fields. - */ - xfs_ino_t sb_uquotino; /* user quota inode */ - xfs_ino_t sb_gquotino; /* group quota inode */ - __uint16_t sb_qflags; /* quota flags */ - __uint8_t sb_flags; /* misc. flags */ - __uint8_t sb_shared_vn; /* shared version number */ - xfs_extlen_t sb_inoalignmt; /* inode chunk alignment, fsblocks */ - __uint32_t sb_unit; /* stripe or raid unit */ - __uint32_t sb_width; /* stripe or raid width */ - __uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ - __uint8_t sb_logsectlog; /* log2 of the log sector size */ - __uint16_t sb_logsectsize; /* sector size for the log, bytes */ - __uint32_t sb_logsunit; /* stripe unit size for the log */ - __uint32_t sb_features2; /* additional feature bits */ - - /* - * bad features2 field as a result of failing to pad the sb - * structure to 64 bits. Some machines will be using this field - * for features2 bits. Easiest just to mark it bad and not use - * it for anything else. - */ - __uint32_t sb_bad_features2; - - /* version 5 superblock fields start here */ - - /* feature masks */ - __uint32_t sb_features_compat; - __uint32_t sb_features_ro_compat; - __uint32_t sb_features_incompat; - __uint32_t sb_features_log_incompat; - - __uint32_t sb_crc; /* superblock crc */ - __uint32_t sb_pad; - - xfs_ino_t sb_pquotino; /* project quota inode */ - xfs_lsn_t sb_lsn; /* last write sequence */ - - /* must be padded to 64 bit alignment */ -} xfs_sb_t; - -#define XFS_SB_CRC_OFF offsetof(struct xfs_sb, sb_crc) - -/* - * Superblock - on disk version. Must match the in core version above. - * Must be padded to 64 bit alignment. - */ -typedef struct xfs_dsb { - __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ - __be32 sb_blocksize; /* logical block size, bytes */ - __be64 sb_dblocks; /* number of data blocks */ - __be64 sb_rblocks; /* number of realtime blocks */ - __be64 sb_rextents; /* number of realtime extents */ - uuid_t sb_uuid; /* file system unique id */ - __be64 sb_logstart; /* starting block of log if internal */ - __be64 sb_rootino; /* root inode number */ - __be64 sb_rbmino; /* bitmap inode for realtime extents */ - __be64 sb_rsumino; /* summary inode for rt bitmap */ - __be32 sb_rextsize; /* realtime extent size, blocks */ - __be32 sb_agblocks; /* size of an allocation group */ - __be32 sb_agcount; /* number of allocation groups */ - __be32 sb_rbmblocks; /* number of rt bitmap blocks */ - __be32 sb_logblocks; /* number of log blocks */ - __be16 sb_versionnum; /* header version == XFS_SB_VERSION */ - __be16 sb_sectsize; /* volume sector size, bytes */ - __be16 sb_inodesize; /* inode size, bytes */ - __be16 sb_inopblock; /* inodes per block */ - char sb_fname[12]; /* file system name */ - __u8 sb_blocklog; /* log2 of sb_blocksize */ - __u8 sb_sectlog; /* log2 of sb_sectsize */ - __u8 sb_inodelog; /* log2 of sb_inodesize */ - __u8 sb_inopblog; /* log2 of sb_inopblock */ - __u8 sb_agblklog; /* log2 of sb_agblocks (rounded up) */ - __u8 sb_rextslog; /* log2 of sb_rextents */ - __u8 sb_inprogress; /* mkfs is in progress, don't mount */ - __u8 sb_imax_pct; /* max % of fs for inode space */ - /* statistics */ - /* - * These fields must remain contiguous. If you really - * want to change their layout, make sure you fix the - * code in xfs_trans_apply_sb_deltas(). - */ - __be64 sb_icount; /* allocated inodes */ - __be64 sb_ifree; /* free inodes */ - __be64 sb_fdblocks; /* free data blocks */ - __be64 sb_frextents; /* free realtime extents */ - /* - * End contiguous fields. - */ - __be64 sb_uquotino; /* user quota inode */ - __be64 sb_gquotino; /* group quota inode */ - __be16 sb_qflags; /* quota flags */ - __u8 sb_flags; /* misc. flags */ - __u8 sb_shared_vn; /* shared version number */ - __be32 sb_inoalignmt; /* inode chunk alignment, fsblocks */ - __be32 sb_unit; /* stripe or raid unit */ - __be32 sb_width; /* stripe or raid width */ - __u8 sb_dirblklog; /* log2 of dir block size (fsbs) */ - __u8 sb_logsectlog; /* log2 of the log sector size */ - __be16 sb_logsectsize; /* sector size for the log, bytes */ - __be32 sb_logsunit; /* stripe unit size for the log */ - __be32 sb_features2; /* additional feature bits */ - /* - * bad features2 field as a result of failing to pad the sb - * structure to 64 bits. Some machines will be using this field - * for features2 bits. Easiest just to mark it bad and not use - * it for anything else. - */ - __be32 sb_bad_features2; - - /* version 5 superblock fields start here */ - - /* feature masks */ - __be32 sb_features_compat; - __be32 sb_features_ro_compat; - __be32 sb_features_incompat; - __be32 sb_features_log_incompat; - - __le32 sb_crc; /* superblock crc */ - __be32 sb_pad; - - __be64 sb_pquotino; /* project quota inode */ - __be64 sb_lsn; /* last write sequence */ - - /* must be padded to 64 bit alignment */ -} xfs_dsb_t; - -/* - * Sequence number values for the fields. - */ -typedef enum { - XFS_SBS_MAGICNUM, XFS_SBS_BLOCKSIZE, XFS_SBS_DBLOCKS, XFS_SBS_RBLOCKS, - XFS_SBS_REXTENTS, XFS_SBS_UUID, XFS_SBS_LOGSTART, XFS_SBS_ROOTINO, - XFS_SBS_RBMINO, XFS_SBS_RSUMINO, XFS_SBS_REXTSIZE, XFS_SBS_AGBLOCKS, - XFS_SBS_AGCOUNT, XFS_SBS_RBMBLOCKS, XFS_SBS_LOGBLOCKS, - XFS_SBS_VERSIONNUM, XFS_SBS_SECTSIZE, XFS_SBS_INODESIZE, - XFS_SBS_INOPBLOCK, XFS_SBS_FNAME, XFS_SBS_BLOCKLOG, - XFS_SBS_SECTLOG, XFS_SBS_INODELOG, XFS_SBS_INOPBLOG, XFS_SBS_AGBLKLOG, - XFS_SBS_REXTSLOG, XFS_SBS_INPROGRESS, XFS_SBS_IMAX_PCT, XFS_SBS_ICOUNT, - XFS_SBS_IFREE, XFS_SBS_FDBLOCKS, XFS_SBS_FREXTENTS, XFS_SBS_UQUOTINO, - XFS_SBS_GQUOTINO, XFS_SBS_QFLAGS, XFS_SBS_FLAGS, XFS_SBS_SHARED_VN, - XFS_SBS_INOALIGNMT, XFS_SBS_UNIT, XFS_SBS_WIDTH, XFS_SBS_DIRBLKLOG, - XFS_SBS_LOGSECTLOG, XFS_SBS_LOGSECTSIZE, XFS_SBS_LOGSUNIT, - XFS_SBS_FEATURES2, XFS_SBS_BAD_FEATURES2, XFS_SBS_FEATURES_COMPAT, - XFS_SBS_FEATURES_RO_COMPAT, XFS_SBS_FEATURES_INCOMPAT, - XFS_SBS_FEATURES_LOG_INCOMPAT, XFS_SBS_CRC, XFS_SBS_PAD, - XFS_SBS_PQUOTINO, XFS_SBS_LSN, - XFS_SBS_FIELDCOUNT -} xfs_sb_field_t; - -/* - * Mask values, defined based on the xfs_sb_field_t values. - * Only define the ones we're using. - */ -#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x) -#define XFS_SB_UUID XFS_SB_MVAL(UUID) -#define XFS_SB_FNAME XFS_SB_MVAL(FNAME) -#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO) -#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO) -#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO) -#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM) -#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO) -#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO) -#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS) -#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN) -#define XFS_SB_UNIT XFS_SB_MVAL(UNIT) -#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH) -#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) -#define XFS_SB_IFREE XFS_SB_MVAL(IFREE) -#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) -#define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) -#define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) -#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) -#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) -#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) -#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) -#define XFS_SB_CRC XFS_SB_MVAL(CRC) -#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) -#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) -#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) -#define XFS_SB_MOD_BITS \ - (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ - XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ - XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ - XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ - XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ - XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \ - XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO) - - -/* - * Misc. Flags - warning - these will be cleared by xfs_repair unless - * a feature bit is set when the flag is used. - */ -#define XFS_SBF_NOFLAGS 0x00 /* no flags set */ -#define XFS_SBF_READONLY 0x01 /* only read-only mounts allowed */ - -/* - * define max. shared version we can interoperate with - */ -#define XFS_SB_MAX_SHARED_VN 0 - -#define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) - -/* - * The first XFS version we support is a v4 superblock with V2 directories. - */ -static inline bool xfs_sb_good_v4_features(struct xfs_sb *sbp) -{ - if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)) - return false; - - /* check for unknown features in the fs */ - if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) - return false; - - return true; -} - -static inline bool xfs_sb_good_version(struct xfs_sb *sbp) -{ - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) - return true; - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) - return xfs_sb_good_v4_features(sbp); - return false; -} - -/* - * Detect a mismatched features2 field. Older kernels read/wrote - * this into the wrong slot, so to be safe we keep them in sync. - */ -static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp) -{ - return sbp->sb_bad_features2 != sbp->sb_features2; -} - -static inline bool xfs_sb_version_hasattr(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); -} - -static inline void xfs_sb_version_addattr(struct xfs_sb *sbp) -{ - sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; -} - -static inline bool xfs_sb_version_hasquota(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); -} - -static inline void xfs_sb_version_addquota(struct xfs_sb *sbp) -{ - sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; -} - -static inline bool xfs_sb_version_hasalign(struct xfs_sb *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || - (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); -} - -static inline bool xfs_sb_version_hasdalign(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); -} - -static inline bool xfs_sb_version_haslogv2(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); -} - -static inline bool xfs_sb_version_hasextflgbit(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); -} - -static inline bool xfs_sb_version_hassector(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); -} - -static inline bool xfs_sb_version_hasasciici(struct xfs_sb *sbp) -{ - return (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); -} - -static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); -} - -/* - * sb_features2 bit version macros. - */ -static inline bool xfs_sb_version_haslazysbcount(struct xfs_sb *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)); -} - -static inline bool xfs_sb_version_hasattr2(struct xfs_sb *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)); -} - -static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp) -{ - sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; - sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; - sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; -} - -static inline void xfs_sb_version_removeattr2(struct xfs_sb *sbp) -{ - sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; - sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; - if (!sbp->sb_features2) - sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; -} - -static inline bool xfs_sb_version_hasprojid32bit(struct xfs_sb *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)); -} - -static inline void xfs_sb_version_addprojid32bit(struct xfs_sb *sbp) -{ - sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; - sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT; - sbp->sb_bad_features2 |= XFS_SB_VERSION2_PROJID32BIT; -} - -/* - * Extended v5 superblock feature masks. These are to be used for new v5 - * superblock features only. - * - * Compat features are new features that old kernels will not notice or affect - * and so can mount read-write without issues. - * - * RO-Compat (read only) are features that old kernels can read but will break - * if they write. Hence only read-only mounts of such filesystems are allowed on - * kernels that don't support the feature bit. - * - * InCompat features are features which old kernels will not understand and so - * must not mount. - * - * Log-InCompat features are for changes to log formats or new transactions that - * can't be replayed on older kernels. The fields are set when the filesystem is - * mounted, and a clean unmount clears the fields. - */ -#define XFS_SB_FEAT_COMPAT_ALL 0 -#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL -static inline bool -xfs_sb_has_compat_feature( - struct xfs_sb *sbp, - __uint32_t feature) -{ - return (sbp->sb_features_compat & feature) != 0; -} - -#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ -#define XFS_SB_FEAT_RO_COMPAT_ALL \ - (XFS_SB_FEAT_RO_COMPAT_FINOBT) -#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL -static inline bool -xfs_sb_has_ro_compat_feature( - struct xfs_sb *sbp, - __uint32_t feature) -{ - return (sbp->sb_features_ro_compat & feature) != 0; -} - -#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ -#define XFS_SB_FEAT_INCOMPAT_ALL \ - (XFS_SB_FEAT_INCOMPAT_FTYPE) - -#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL -static inline bool -xfs_sb_has_incompat_feature( - struct xfs_sb *sbp, - __uint32_t feature) -{ - return (sbp->sb_features_incompat & feature) != 0; -} - -#define XFS_SB_FEAT_INCOMPAT_LOG_ALL 0 -#define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL -static inline bool -xfs_sb_has_incompat_log_feature( - struct xfs_sb *sbp, - __uint32_t feature) -{ - return (sbp->sb_features_log_incompat & feature) != 0; -} - -/* - * V5 superblock specific feature checks - */ -static inline int xfs_sb_version_hascrc(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; -} - -static inline int xfs_sb_version_has_pquotino(struct xfs_sb *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; -} - -static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && - xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE)) || - (xfs_sb_version_hasmorebits(sbp) && - (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); -} - -static inline int xfs_sb_version_hasfinobt(xfs_sb_t *sbp) -{ - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) && - (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT); -} - -/* - * end of superblock version macros - */ - -static inline bool -xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) -{ - return (ino == sbp->sb_uquotino || - ino == sbp->sb_gquotino || - ino == sbp->sb_pquotino); -} - -#define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ -#define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) -#define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) - -#define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d)) -#define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \ - xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d)) -#define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \ - XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno)) - -/* - * File system sector to basic block conversions. - */ -#define XFS_FSS_TO_BB(mp,sec) ((sec) << (mp)->m_sectbb_log) - -/* - * File system block to basic block conversions. - */ -#define XFS_FSB_TO_BB(mp,fsbno) ((fsbno) << (mp)->m_blkbb_log) -#define XFS_BB_TO_FSB(mp,bb) \ - (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log) -#define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log) - -/* - * File system block to byte conversions. - */ -#define XFS_FSB_TO_B(mp,fsbno) ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog) -#define XFS_B_TO_FSB(mp,b) \ - ((((__uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog) -#define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) -#define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask) - -/* * perag get/put wrappers for ref counting */ extern struct xfs_perag *xfs_perag_get(struct xfs_mount *, xfs_agnumber_t); diff --git a/fs/xfs/libxfs/xfs_symlink_remote.c b/fs/xfs/libxfs/xfs_symlink_remote.c index 87ee299..c80c523 100644 --- a/fs/xfs/libxfs/xfs_symlink_remote.c +++ b/fs/xfs/libxfs/xfs_symlink_remote.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_shared.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index f2a03e5..6c1330f 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -22,7 +22,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 66cd043..4b64167 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -19,7 +19,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_acl.h" diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 183b634..18e2f3b 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index b466388..83af4c1 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 13dce2b..a43d370 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index e663822..22a5dcb 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 09b0eb7..b5a10d2 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 2221684..02c01bb 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -22,7 +22,6 @@ #include "xfs_shared.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_bmap.h" diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index 1f87bc8..814cff9 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_quota.h" diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index f5d90ed..3ee186a 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -20,7 +20,6 @@ #include "xfs_fs.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 73172e1..0a0a6fa 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -19,7 +19,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index e751c60..cb7fe64 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 69b7dd3..e2b1a81 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_icreate_item.c b/fs/xfs/xfs_icreate_item.c index 131b043..d45ca72 100644 --- a/fs/xfs/xfs_icreate_item.c +++ b/fs/xfs/xfs_icreate_item.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 0bd3af6..bf13a5a 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index d2175b6..a183198 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_ioctl.h" diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 9a36ee0..ec67728 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -25,7 +25,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_itable.h" diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 7ab365a..2262ce3 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 55aa9e8..f14a3e5 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 8efcdf0..77aba24 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 765f32e..bfeb442 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 951c08f..45cc0ce 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_shared.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_alloc.h" diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c index 8abc2d5..d8b6754 100644 --- a/fs/xfs/xfs_message.c +++ b/fs/xfs/xfs_message.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" /* diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index b781dc5..3e52d5d 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 7638439..7542bbe 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -19,7 +19,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_quota.h" diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index cb93a72..f2079b6 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_bmap.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 99bc129..25791df 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 017051a..13a0298 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 02df25d..fa3135b 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -22,7 +22,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_extent_busy.h" diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index dd828d6..573aefb 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index f9192b0..d3d80be 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 6320e28..76a16df 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index a0aaa3e..284397d 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 592904b..17280cd 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 30c6158..69f6e47 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" -- 1.9.1 From BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org Wed Nov 26 13:14:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A88C7F63 for ; Wed, 26 Nov 2014 13:14:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3776FAC003 for ; Wed, 26 Nov 2014 11:14:43 -0800 (PST) X-ASG-Debug-ID: 1417029278-04bdf0615e8b8e00001-NocioJ Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) by cuda.sgi.com with ESMTP id vYOVZsA8C5EmH1VY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:14:39 -0800 (PST) X-Barracuda-Envelope-From: BATV+c0ad0ac58ad80632eb3c+4112+infradead.org+hch@casper.srs.infradead.org X-Barracuda-Apparent-Source-IP: 85.118.1.10 Received: from [83.175.99.196] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xti2v-0002p8-HC for xfs@oss.sgi.com; Wed, 26 Nov 2014 19:14:38 +0000 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: merge xfs_ag.h into xfs_format.h Date: Wed, 26 Nov 2014 20:14:25 +0100 X-ASG-Orig-Subj: [PATCH 3/5] xfs: merge xfs_ag.h into xfs_format.h Message-Id: <1417029267-20149-3-git-send-email-hch@lst.de> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1417029267-20149-1-git-send-email-hch@lst.de> References: <1417029267-20149-1-git-send-email-hch@lst.de> X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: casper.infradead.org[85.118.1.10] X-Barracuda-Start-Time: 1417029279 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- More on-disk format consolidation. A few declarations that weren't on-disk format related move into better suitable spots. Signed-off-by: Christoph Hellwig --- fs/xfs/libxfs/xfs_ag.h | 281 ------------------------------------- fs/xfs/libxfs/xfs_alloc.c | 1 - fs/xfs/libxfs/xfs_alloc.h | 3 + fs/xfs/libxfs/xfs_alloc_btree.c | 1 - fs/xfs/libxfs/xfs_attr.c | 1 - fs/xfs/libxfs/xfs_attr_leaf.c | 1 - fs/xfs/libxfs/xfs_attr_remote.c | 1 - fs/xfs/libxfs/xfs_bmap.c | 1 - fs/xfs/libxfs/xfs_bmap_btree.c | 1 - fs/xfs/libxfs/xfs_btree.c | 1 - fs/xfs/libxfs/xfs_da_btree.c | 1 - fs/xfs/libxfs/xfs_da_format.c | 1 - fs/xfs/libxfs/xfs_dir2.c | 1 - fs/xfs/libxfs/xfs_dir2_block.c | 1 - fs/xfs/libxfs/xfs_dir2_data.c | 1 - fs/xfs/libxfs/xfs_dir2_leaf.c | 1 - fs/xfs/libxfs/xfs_dir2_node.c | 1 - fs/xfs/libxfs/xfs_dir2_sf.c | 1 - fs/xfs/libxfs/xfs_dquot_buf.c | 1 - fs/xfs/libxfs/xfs_format.h | 243 ++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.c | 1 - fs/xfs/libxfs/xfs_ialloc.h | 4 + fs/xfs/libxfs/xfs_ialloc_btree.c | 1 - fs/xfs/libxfs/xfs_inode_buf.c | 1 - fs/xfs/libxfs/xfs_inode_fork.c | 1 - fs/xfs/libxfs/xfs_log_rlimit.c | 1 - fs/xfs/libxfs/xfs_rtbitmap.c | 1 - fs/xfs/libxfs/xfs_sb.c | 1 - fs/xfs/libxfs/xfs_symlink_remote.c | 1 - fs/xfs/libxfs/xfs_trans_resv.c | 1 - fs/xfs/xfs_acl.c | 1 - fs/xfs/xfs_aops.c | 1 - fs/xfs/xfs_attr_inactive.c | 1 - fs/xfs/xfs_attr_list.c | 1 - fs/xfs/xfs_bmap_util.c | 1 - fs/xfs/xfs_buf.c | 2 +- fs/xfs/xfs_buf_item.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 1 - fs/xfs/xfs_discard.c | 1 - fs/xfs/xfs_dquot.c | 1 - fs/xfs/xfs_dquot_item.c | 1 - fs/xfs/xfs_error.c | 1 - fs/xfs/xfs_export.c | 1 - fs/xfs/xfs_extent_busy.c | 1 - fs/xfs/xfs_extfree_item.c | 2 +- fs/xfs/xfs_file.c | 1 - fs/xfs/xfs_filestream.c | 1 - fs/xfs/xfs_fsops.c | 1 - fs/xfs/xfs_icache.c | 1 - fs/xfs/xfs_icache.h | 8 ++ fs/xfs/xfs_icreate_item.c | 2 +- fs/xfs/xfs_inode.c | 1 - fs/xfs/xfs_inode_item.c | 1 - fs/xfs/xfs_ioctl.c | 1 - fs/xfs/xfs_ioctl32.c | 1 - fs/xfs/xfs_iomap.c | 1 - fs/xfs/xfs_iops.c | 1 - fs/xfs/xfs_itable.c | 1 - fs/xfs/xfs_log.c | 1 - fs/xfs/xfs_log_cil.c | 2 +- fs/xfs/xfs_log_recover.c | 1 - fs/xfs/xfs_message.c | 2 +- fs/xfs/xfs_mount.c | 1 - fs/xfs/xfs_mount.h | 5 +- fs/xfs/xfs_qm.c | 1 - fs/xfs/xfs_qm_bhv.c | 1 - fs/xfs/xfs_qm_syscalls.c | 1 - fs/xfs/xfs_quotaops.c | 1 - fs/xfs/xfs_rtalloc.c | 1 - fs/xfs/xfs_super.c | 1 - fs/xfs/xfs_symlink.c | 1 - fs/xfs/xfs_trace.c | 1 - fs/xfs/xfs_trans.c | 1 - fs/xfs/xfs_trans_ail.c | 2 +- fs/xfs/xfs_trans_buf.c | 1 - fs/xfs/xfs_trans_dquot.c | 1 - fs/xfs/xfs_trans_extfree.c | 2 +- fs/xfs/xfs_trans_inode.c | 1 - fs/xfs/xfs_xattr.c | 1 - 79 files changed, 267 insertions(+), 358 deletions(-) delete mode 100644 fs/xfs/libxfs/xfs_ag.h diff --git a/fs/xfs/libxfs/xfs_ag.h b/fs/xfs/libxfs/xfs_ag.h deleted file mode 100644 index 6e247a9..0000000 --- a/fs/xfs/libxfs/xfs_ag.h +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_AG_H__ -#define __XFS_AG_H__ - -/* - * Allocation group header - * This is divided into three structures, placed in sequential 512-byte - * buffers after a copy of the superblock (also in a 512-byte buffer). - */ - -struct xfs_buf; -struct xfs_mount; -struct xfs_trans; - -#define XFS_AGF_MAGIC 0x58414746 /* 'XAGF' */ -#define XFS_AGI_MAGIC 0x58414749 /* 'XAGI' */ -#define XFS_AGFL_MAGIC 0x5841464c /* 'XAFL' */ -#define XFS_AGF_VERSION 1 -#define XFS_AGI_VERSION 1 - -#define XFS_AGF_GOOD_VERSION(v) ((v) == XFS_AGF_VERSION) -#define XFS_AGI_GOOD_VERSION(v) ((v) == XFS_AGI_VERSION) - -/* - * Btree number 0 is bno, 1 is cnt. This value gives the size of the - * arrays below. - */ -#define XFS_BTNUM_AGF ((int)XFS_BTNUM_CNTi + 1) - -/* - * The second word of agf_levels in the first a.g. overlaps the EFS - * superblock's magic number. Since the magic numbers valid for EFS - * are > 64k, our value cannot be confused for an EFS superblock's. - */ - -typedef struct xfs_agf { - /* - * Common allocation group header information - */ - __be32 agf_magicnum; /* magic number == XFS_AGF_MAGIC */ - __be32 agf_versionnum; /* header version == XFS_AGF_VERSION */ - __be32 agf_seqno; /* sequence # starting from 0 */ - __be32 agf_length; /* size in blocks of a.g. */ - /* - * Freespace information - */ - __be32 agf_roots[XFS_BTNUM_AGF]; /* root blocks */ - __be32 agf_spare0; /* spare field */ - __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ - __be32 agf_spare1; /* spare field */ - - __be32 agf_flfirst; /* first freelist block's index */ - __be32 agf_fllast; /* last freelist block's index */ - __be32 agf_flcount; /* count of blocks in freelist */ - __be32 agf_freeblks; /* total free blocks */ - - __be32 agf_longest; /* longest free space */ - __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ - uuid_t agf_uuid; /* uuid of filesystem */ - - /* - * reserve some contiguous space for future logged fields before we add - * the unlogged fields. This makes the range logging via flags and - * structure offsets much simpler. - */ - __be64 agf_spare64[16]; - - /* unlogged fields, written during buffer writeback. */ - __be64 agf_lsn; /* last write sequence */ - __be32 agf_crc; /* crc of agf sector */ - __be32 agf_spare2; - - /* structure must be padded to 64 bit alignment */ -} xfs_agf_t; - -#define XFS_AGF_CRC_OFF offsetof(struct xfs_agf, agf_crc) - -#define XFS_AGF_MAGICNUM 0x00000001 -#define XFS_AGF_VERSIONNUM 0x00000002 -#define XFS_AGF_SEQNO 0x00000004 -#define XFS_AGF_LENGTH 0x00000008 -#define XFS_AGF_ROOTS 0x00000010 -#define XFS_AGF_LEVELS 0x00000020 -#define XFS_AGF_FLFIRST 0x00000040 -#define XFS_AGF_FLLAST 0x00000080 -#define XFS_AGF_FLCOUNT 0x00000100 -#define XFS_AGF_FREEBLKS 0x00000200 -#define XFS_AGF_LONGEST 0x00000400 -#define XFS_AGF_BTREEBLKS 0x00000800 -#define XFS_AGF_UUID 0x00001000 -#define XFS_AGF_NUM_BITS 13 -#define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) - -#define XFS_AGF_FLAGS \ - { XFS_AGF_MAGICNUM, "MAGICNUM" }, \ - { XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \ - { XFS_AGF_SEQNO, "SEQNO" }, \ - { XFS_AGF_LENGTH, "LENGTH" }, \ - { XFS_AGF_ROOTS, "ROOTS" }, \ - { XFS_AGF_LEVELS, "LEVELS" }, \ - { XFS_AGF_FLFIRST, "FLFIRST" }, \ - { XFS_AGF_FLLAST, "FLLAST" }, \ - { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ - { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ - { XFS_AGF_LONGEST, "LONGEST" }, \ - { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ - { XFS_AGF_UUID, "UUID" } - -/* disk block (xfs_daddr_t) in the AG */ -#define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) -#define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) -#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)((bp)->b_addr)) - -extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, - xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); - -/* - * Size of the unlinked inode hash table in the agi. - */ -#define XFS_AGI_UNLINKED_BUCKETS 64 - -typedef struct xfs_agi { - /* - * Common allocation group header information - */ - __be32 agi_magicnum; /* magic number == XFS_AGI_MAGIC */ - __be32 agi_versionnum; /* header version == XFS_AGI_VERSION */ - __be32 agi_seqno; /* sequence # starting from 0 */ - __be32 agi_length; /* size in blocks of a.g. */ - /* - * Inode information - * Inodes are mapped by interpreting the inode number, so no - * mapping data is needed here. - */ - __be32 agi_count; /* count of allocated inodes */ - __be32 agi_root; /* root of inode btree */ - __be32 agi_level; /* levels in inode btree */ - __be32 agi_freecount; /* number of free inodes */ - - __be32 agi_newino; /* new inode just allocated */ - __be32 agi_dirino; /* last directory inode chunk */ - /* - * Hash table of inodes which have been unlinked but are - * still being referenced. - */ - __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; - /* - * This marks the end of logging region 1 and start of logging region 2. - */ - uuid_t agi_uuid; /* uuid of filesystem */ - __be32 agi_crc; /* crc of agi sector */ - __be32 agi_pad32; - __be64 agi_lsn; /* last write sequence */ - - __be32 agi_free_root; /* root of the free inode btree */ - __be32 agi_free_level;/* levels in free inode btree */ - - /* structure must be padded to 64 bit alignment */ -} xfs_agi_t; - -#define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc) - -#define XFS_AGI_MAGICNUM (1 << 0) -#define XFS_AGI_VERSIONNUM (1 << 1) -#define XFS_AGI_SEQNO (1 << 2) -#define XFS_AGI_LENGTH (1 << 3) -#define XFS_AGI_COUNT (1 << 4) -#define XFS_AGI_ROOT (1 << 5) -#define XFS_AGI_LEVEL (1 << 6) -#define XFS_AGI_FREECOUNT (1 << 7) -#define XFS_AGI_NEWINO (1 << 8) -#define XFS_AGI_DIRINO (1 << 9) -#define XFS_AGI_UNLINKED (1 << 10) -#define XFS_AGI_NUM_BITS_R1 11 /* end of the 1st agi logging region */ -#define XFS_AGI_ALL_BITS_R1 ((1 << XFS_AGI_NUM_BITS_R1) - 1) -#define XFS_AGI_FREE_ROOT (1 << 11) -#define XFS_AGI_FREE_LEVEL (1 << 12) -#define XFS_AGI_NUM_BITS_R2 13 - -/* disk block (xfs_daddr_t) in the AG */ -#define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) -#define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) -#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)((bp)->b_addr)) - -extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, - xfs_agnumber_t agno, struct xfs_buf **bpp); - -/* - * The third a.g. block contains the a.g. freelist, an array - * of block pointers to blocks owned by the allocation btree code. - */ -#define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) -#define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) -#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) - -#define XFS_BUF_TO_AGFL_BNO(mp, bp) \ - (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \ - (__be32 *)(bp)->b_addr) - -/* - * Size of the AGFL. For CRC-enabled filesystes we steal a couple of - * slots in the beginning of the block for a proper header with the - * location information and CRC. - */ -#define XFS_AGFL_SIZE(mp) \ - (((mp)->m_sb.sb_sectsize - \ - (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - sizeof(struct xfs_agfl) : 0)) / \ - sizeof(xfs_agblock_t)) - -typedef struct xfs_agfl { - __be32 agfl_magicnum; - __be32 agfl_seqno; - uuid_t agfl_uuid; - __be64 agfl_lsn; - __be32 agfl_crc; - __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ -} xfs_agfl_t; - -#define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc) - -/* - * tags for inode radix tree - */ -#define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup - in xfs_inode_ag_iterator */ -#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ -#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ - -#define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) -#define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ - (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) -#define XFS_MIN_FREELIST(a,mp) \ - (XFS_MIN_FREELIST_RAW( \ - be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \ - be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp)) -#define XFS_MIN_FREELIST_PAG(pag,mp) \ - (XFS_MIN_FREELIST_RAW( \ - (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ - (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) - -#define XFS_AGB_TO_FSB(mp,agno,agbno) \ - (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) -#define XFS_FSB_TO_AGNO(mp,fsbno) \ - ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog)) -#define XFS_FSB_TO_AGBNO(mp,fsbno) \ - ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog))) -#define XFS_AGB_TO_DADDR(mp,agno,agbno) \ - ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \ - (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno))) -#define XFS_AG_DADDR(mp,agno,d) (XFS_AGB_TO_DADDR(mp, agno, 0) + (d)) - -/* - * For checking for bad ranges of xfs_daddr_t's, covering multiple - * allocation groups or a single xfs_daddr_t that's a superblock copy. - */ -#define XFS_AG_CHECK_DADDR(mp,d,len) \ - ((len) == 1 ? \ - ASSERT((d) == XFS_SB_DADDR || \ - xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \ - ASSERT(xfs_daddr_to_agno(mp, d) == \ - xfs_daddr_to_agno(mp, (d) + (len) - 1))) - -#endif /* __XFS_AG_H__ */ diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index eff3421..a6fbf44 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/libxfs/xfs_alloc.h b/fs/xfs/libxfs/xfs_alloc.h index feacb06..d1b4b6a 100644 --- a/fs/xfs/libxfs/xfs_alloc.h +++ b/fs/xfs/libxfs/xfs_alloc.h @@ -231,4 +231,7 @@ xfs_alloc_get_rec( xfs_extlen_t *len, /* output: length of extent */ int *stat); /* output: success/failure */ +int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); + #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/libxfs/xfs_alloc_btree.c b/fs/xfs/libxfs/xfs_alloc_btree.c index e0e83e2..59d521c 100644 --- a/fs/xfs/libxfs/xfs_alloc_btree.c +++ b/fs/xfs/libxfs/xfs_alloc_btree.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/libxfs/xfs_attr.c b/fs/xfs/libxfs/xfs_attr.c index 4c0e33b..f782d36 100644 --- a/fs/xfs/libxfs/xfs_attr.c +++ b/fs/xfs/libxfs/xfs_attr.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c index d9a172b..5d38e8b 100644 --- a/fs/xfs/libxfs/xfs_attr_leaf.c +++ b/fs/xfs/libxfs/xfs_attr_leaf.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c index 7510ab8..4edd4a8 100644 --- a/fs/xfs/libxfs/xfs_attr_remote.c +++ b/fs/xfs/libxfs/xfs_attr_remote.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 427c13f..68d9133 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -24,7 +24,6 @@ #include "xfs_bit.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_bmap_btree.c b/fs/xfs/libxfs/xfs_bmap_btree.c index b016fc4..91588a5 100644 --- a/fs/xfs/libxfs/xfs_bmap_btree.c +++ b/fs/xfs/libxfs/xfs_bmap_btree.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_btree.c b/fs/xfs/libxfs/xfs_btree.c index 8fe6a93..256d532 100644 --- a/fs/xfs/libxfs/xfs_btree.c +++ b/fs/xfs/libxfs/xfs_btree.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_da_btree.c b/fs/xfs/libxfs/xfs_da_btree.c index fd82753..2b88061 100644 --- a/fs/xfs/libxfs/xfs_da_btree.c +++ b/fs/xfs/libxfs/xfs_da_btree.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_da_format.c b/fs/xfs/libxfs/xfs_da_format.c index 7e42fdf..927e9eb 100644 --- a/fs/xfs/libxfs/xfs_da_format.c +++ b/fs/xfs/libxfs/xfs_da_format.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index d6ddb3f..672a29e 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -22,7 +22,6 @@ #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_block.c b/fs/xfs/libxfs/xfs_dir2_block.c index a9afd7e..a6b3a6a 100644 --- a/fs/xfs/libxfs/xfs_dir2_block.c +++ b/fs/xfs/libxfs/xfs_dir2_block.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_data.c b/fs/xfs/libxfs/xfs_dir2_data.c index fdd803f..2c8f463 100644 --- a/fs/xfs/libxfs/xfs_dir2_data.c +++ b/fs/xfs/libxfs/xfs_dir2_data.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_leaf.c b/fs/xfs/libxfs/xfs_dir2_leaf.c index a19174e..777c482 100644 --- a/fs/xfs/libxfs/xfs_dir2_leaf.c +++ b/fs/xfs/libxfs/xfs_dir2_leaf.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_node.c b/fs/xfs/libxfs/xfs_dir2_node.c index 2ae6ac2..c0a0e19 100644 --- a/fs/xfs/libxfs/xfs_dir2_node.c +++ b/fs/xfs/libxfs/xfs_dir2_node.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dir2_sf.c b/fs/xfs/libxfs/xfs_dir2_sf.c index 58133d2..ab99dbc 100644 --- a/fs/xfs/libxfs/xfs_dir2_sf.c +++ b/fs/xfs/libxfs/xfs_dir2_sf.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/libxfs/xfs_dquot_buf.c b/fs/xfs/libxfs/xfs_dquot_buf.c index bb96933..cd68926 100644 --- a/fs/xfs/libxfs/xfs_dquot_buf.c +++ b/fs/xfs/libxfs/xfs_dquot_buf.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_quota.h" diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h index e99d329..9b6e424 100644 --- a/fs/xfs/libxfs/xfs_format.h +++ b/fs/xfs/libxfs/xfs_format.h @@ -33,6 +33,249 @@ struct xfs_inode; struct xfs_buf; struct xfs_ifork; +/* + * Allocation group header + * + * This is divided into three structures, placed in sequential 512-byte + * buffers after a copy of the superblock (also in a 512-byte buffer). + */ +#define XFS_AGF_MAGIC 0x58414746 /* 'XAGF' */ +#define XFS_AGI_MAGIC 0x58414749 /* 'XAGI' */ +#define XFS_AGFL_MAGIC 0x5841464c /* 'XAFL' */ +#define XFS_AGF_VERSION 1 +#define XFS_AGI_VERSION 1 + +#define XFS_AGF_GOOD_VERSION(v) ((v) == XFS_AGF_VERSION) +#define XFS_AGI_GOOD_VERSION(v) ((v) == XFS_AGI_VERSION) + +/* + * Btree number 0 is bno, 1 is cnt. This value gives the size of the + * arrays below. + */ +#define XFS_BTNUM_AGF ((int)XFS_BTNUM_CNTi + 1) + +/* + * The second word of agf_levels in the first a.g. overlaps the EFS + * superblock's magic number. Since the magic numbers valid for EFS + * are > 64k, our value cannot be confused for an EFS superblock's. + */ + +typedef struct xfs_agf { + /* + * Common allocation group header information + */ + __be32 agf_magicnum; /* magic number == XFS_AGF_MAGIC */ + __be32 agf_versionnum; /* header version == XFS_AGF_VERSION */ + __be32 agf_seqno; /* sequence # starting from 0 */ + __be32 agf_length; /* size in blocks of a.g. */ + /* + * Freespace information + */ + __be32 agf_roots[XFS_BTNUM_AGF]; /* root blocks */ + __be32 agf_spare0; /* spare field */ + __be32 agf_levels[XFS_BTNUM_AGF]; /* btree levels */ + __be32 agf_spare1; /* spare field */ + + __be32 agf_flfirst; /* first freelist block's index */ + __be32 agf_fllast; /* last freelist block's index */ + __be32 agf_flcount; /* count of blocks in freelist */ + __be32 agf_freeblks; /* total free blocks */ + + __be32 agf_longest; /* longest free space */ + __be32 agf_btreeblks; /* # of blocks held in AGF btrees */ + uuid_t agf_uuid; /* uuid of filesystem */ + + /* + * reserve some contiguous space for future logged fields before we add + * the unlogged fields. This makes the range logging via flags and + * structure offsets much simpler. + */ + __be64 agf_spare64[16]; + + /* unlogged fields, written during buffer writeback. */ + __be64 agf_lsn; /* last write sequence */ + __be32 agf_crc; /* crc of agf sector */ + __be32 agf_spare2; + + /* structure must be padded to 64 bit alignment */ +} xfs_agf_t; + +#define XFS_AGF_CRC_OFF offsetof(struct xfs_agf, agf_crc) + +#define XFS_AGF_MAGICNUM 0x00000001 +#define XFS_AGF_VERSIONNUM 0x00000002 +#define XFS_AGF_SEQNO 0x00000004 +#define XFS_AGF_LENGTH 0x00000008 +#define XFS_AGF_ROOTS 0x00000010 +#define XFS_AGF_LEVELS 0x00000020 +#define XFS_AGF_FLFIRST 0x00000040 +#define XFS_AGF_FLLAST 0x00000080 +#define XFS_AGF_FLCOUNT 0x00000100 +#define XFS_AGF_FREEBLKS 0x00000200 +#define XFS_AGF_LONGEST 0x00000400 +#define XFS_AGF_BTREEBLKS 0x00000800 +#define XFS_AGF_UUID 0x00001000 +#define XFS_AGF_NUM_BITS 13 +#define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) + +#define XFS_AGF_FLAGS \ + { XFS_AGF_MAGICNUM, "MAGICNUM" }, \ + { XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \ + { XFS_AGF_SEQNO, "SEQNO" }, \ + { XFS_AGF_LENGTH, "LENGTH" }, \ + { XFS_AGF_ROOTS, "ROOTS" }, \ + { XFS_AGF_LEVELS, "LEVELS" }, \ + { XFS_AGF_FLFIRST, "FLFIRST" }, \ + { XFS_AGF_FLLAST, "FLLAST" }, \ + { XFS_AGF_FLCOUNT, "FLCOUNT" }, \ + { XFS_AGF_FREEBLKS, "FREEBLKS" }, \ + { XFS_AGF_LONGEST, "LONGEST" }, \ + { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \ + { XFS_AGF_UUID, "UUID" } + +/* disk block (xfs_daddr_t) in the AG */ +#define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log)) +#define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp)) +#define XFS_BUF_TO_AGF(bp) ((xfs_agf_t *)((bp)->b_addr)) + +/* + * Size of the unlinked inode hash table in the agi. + */ +#define XFS_AGI_UNLINKED_BUCKETS 64 + +typedef struct xfs_agi { + /* + * Common allocation group header information + */ + __be32 agi_magicnum; /* magic number == XFS_AGI_MAGIC */ + __be32 agi_versionnum; /* header version == XFS_AGI_VERSION */ + __be32 agi_seqno; /* sequence # starting from 0 */ + __be32 agi_length; /* size in blocks of a.g. */ + /* + * Inode information + * Inodes are mapped by interpreting the inode number, so no + * mapping data is needed here. + */ + __be32 agi_count; /* count of allocated inodes */ + __be32 agi_root; /* root of inode btree */ + __be32 agi_level; /* levels in inode btree */ + __be32 agi_freecount; /* number of free inodes */ + + __be32 agi_newino; /* new inode just allocated */ + __be32 agi_dirino; /* last directory inode chunk */ + /* + * Hash table of inodes which have been unlinked but are + * still being referenced. + */ + __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS]; + /* + * This marks the end of logging region 1 and start of logging region 2. + */ + uuid_t agi_uuid; /* uuid of filesystem */ + __be32 agi_crc; /* crc of agi sector */ + __be32 agi_pad32; + __be64 agi_lsn; /* last write sequence */ + + __be32 agi_free_root; /* root of the free inode btree */ + __be32 agi_free_level;/* levels in free inode btree */ + + /* structure must be padded to 64 bit alignment */ +} xfs_agi_t; + +#define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc) + +#define XFS_AGI_MAGICNUM (1 << 0) +#define XFS_AGI_VERSIONNUM (1 << 1) +#define XFS_AGI_SEQNO (1 << 2) +#define XFS_AGI_LENGTH (1 << 3) +#define XFS_AGI_COUNT (1 << 4) +#define XFS_AGI_ROOT (1 << 5) +#define XFS_AGI_LEVEL (1 << 6) +#define XFS_AGI_FREECOUNT (1 << 7) +#define XFS_AGI_NEWINO (1 << 8) +#define XFS_AGI_DIRINO (1 << 9) +#define XFS_AGI_UNLINKED (1 << 10) +#define XFS_AGI_NUM_BITS_R1 11 /* end of the 1st agi logging region */ +#define XFS_AGI_ALL_BITS_R1 ((1 << XFS_AGI_NUM_BITS_R1) - 1) +#define XFS_AGI_FREE_ROOT (1 << 11) +#define XFS_AGI_FREE_LEVEL (1 << 12) +#define XFS_AGI_NUM_BITS_R2 13 + +/* disk block (xfs_daddr_t) in the AG */ +#define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log)) +#define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp)) +#define XFS_BUF_TO_AGI(bp) ((xfs_agi_t *)((bp)->b_addr)) + +/* + * The third a.g. block contains the a.g. freelist, an array + * of block pointers to blocks owned by the allocation btree code. + */ +#define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log)) +#define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp)) +#define XFS_BUF_TO_AGFL(bp) ((xfs_agfl_t *)((bp)->b_addr)) + +#define XFS_BUF_TO_AGFL_BNO(mp, bp) \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + &(XFS_BUF_TO_AGFL(bp)->agfl_bno[0]) : \ + (__be32 *)(bp)->b_addr) + +/* + * Size of the AGFL. For CRC-enabled filesystes we steal a couple of + * slots in the beginning of the block for a proper header with the + * location information and CRC. + */ +#define XFS_AGFL_SIZE(mp) \ + (((mp)->m_sb.sb_sectsize - \ + (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ + sizeof(struct xfs_agfl) : 0)) / \ + sizeof(xfs_agblock_t)) + +typedef struct xfs_agfl { + __be32 agfl_magicnum; + __be32 agfl_seqno; + uuid_t agfl_uuid; + __be64 agfl_lsn; + __be32 agfl_crc; + __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ +} xfs_agfl_t; + +#define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc) + + +#define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) +#define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ + (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp))) +#define XFS_MIN_FREELIST(a,mp) \ + (XFS_MIN_FREELIST_RAW( \ + be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \ + be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp)) +#define XFS_MIN_FREELIST_PAG(pag,mp) \ + (XFS_MIN_FREELIST_RAW( \ + (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \ + (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp)) + +#define XFS_AGB_TO_FSB(mp,agno,agbno) \ + (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno)) +#define XFS_FSB_TO_AGNO(mp,fsbno) \ + ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog)) +#define XFS_FSB_TO_AGBNO(mp,fsbno) \ + ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog))) +#define XFS_AGB_TO_DADDR(mp,agno,agbno) \ + ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \ + (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno))) +#define XFS_AG_DADDR(mp,agno,d) (XFS_AGB_TO_DADDR(mp, agno, 0) + (d)) + +/* + * For checking for bad ranges of xfs_daddr_t's, covering multiple + * allocation groups or a single xfs_daddr_t that's a superblock copy. + */ +#define XFS_AG_CHECK_DADDR(mp,d,len) \ + ((len) == 1 ? \ + ASSERT((d) == XFS_SB_DADDR || \ + xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \ + ASSERT(xfs_daddr_to_agno(mp, d) == \ + xfs_daddr_to_agno(mp, (d) + (len) - 1))) + typedef struct xfs_timestamp { __be32 t_sec; /* timestamp seconds */ __be32 t_nsec; /* timestamp nanoseconds */ diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index 7eb2fca..1dae7da 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -24,7 +24,6 @@ #include "xfs_bit.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 95ad1c0..100007d 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -160,4 +160,8 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); +int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_agnumber_t agno, struct xfs_buf **bpp); + + #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c index c9b06f3..4e029cc 100644 --- a/fs/xfs/libxfs/xfs_ialloc_btree.c +++ b/fs/xfs/libxfs/xfs_ialloc_btree.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index 184c68e..f63c455 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_error.h" diff --git a/fs/xfs/libxfs/xfs_inode_fork.c b/fs/xfs/libxfs/xfs_inode_fork.c index e45d833..ab06599 100644 --- a/fs/xfs/libxfs/xfs_inode_fork.c +++ b/fs/xfs/libxfs/xfs_inode_fork.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/libxfs/xfs_log_rlimit.c b/fs/xfs/libxfs/xfs_log_rlimit.c index ee7e0e8..1c250ee 100644 --- a/fs/xfs/libxfs/xfs_log_rlimit.c +++ b/fs/xfs/libxfs/xfs_log_rlimit.c @@ -21,7 +21,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_da_format.h" diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index de0fe1e..ad3d1dc 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_bmap.h" diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index 1eed436..752915f 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/libxfs/xfs_symlink_remote.c b/fs/xfs/libxfs/xfs_symlink_remote.c index 5782f03..87ee299 100644 --- a/fs/xfs/libxfs/xfs_symlink_remote.c +++ b/fs/xfs/libxfs/xfs_symlink_remote.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_shared.h" #include "xfs_trans_resv.h" -#include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c index f2bda7c..f2a03e5 100644 --- a/fs/xfs/libxfs/xfs_trans_resv.c +++ b/fs/xfs/libxfs/xfs_trans_resv.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index a65fa5d..66cd043 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -19,7 +19,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e4f27e7..183b634 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 5665f46..b466388 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 143435c..13dce2b 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 6bafbc0..e663822 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 24b4ebe..b0a594e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -34,10 +34,10 @@ #include #include +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trace.h" #include "xfs_log.h" diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index f159695..3f9bd58 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -17,11 +17,11 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_buf_item.h" diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 1e937fc..09b0eb7 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 13d08a1..799e5a2 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -20,7 +20,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_quota.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 63c2de4..2221684 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_bmap.h" diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index f33fbaa..1f87bc8 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_quota.h" diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index b92fd7bc..f5d90ed 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 5a6bd5d..73172e1 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -20,7 +20,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index fd22f69..c263e07 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -24,7 +24,6 @@ #include "xfs_shared.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_alloc.h" #include "xfs_extent_busy.h" diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index c432741..e751c60 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -17,10 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 8fe87bb..69b7dd3 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index fe47f3d..c5b06a9 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -20,7 +20,6 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 594af19..fdc6422 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index b45f7b2..e364723 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -22,7 +22,6 @@ #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 46748b8..62f1f91 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -34,6 +34,14 @@ struct xfs_eofblocks { #define SYNC_TRYLOCK 0x0002 /* only try to lock inodes */ /* + * tags for inode radix tree + */ +#define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup + in xfs_inode_ag_iterator */ +#define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ + +/* * Flags for xfs_iget() */ #define XFS_IGET_CREATE 0x1 diff --git a/fs/xfs/xfs_icreate_item.c b/fs/xfs/xfs_icreate_item.c index 7e45492..131b043 100644 --- a/fs/xfs/xfs_icreate_item.c +++ b/fs/xfs/xfs_icreate_item.c @@ -18,11 +18,11 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 8ed049d..229dfde 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -25,7 +25,6 @@ #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_da_format.h" diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index efa6e59..0bd3af6 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 6a8737b..d2175b6 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_ioctl.h" diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 94ce027..9a36ee0 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -26,7 +26,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_itable.h" diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index cf110224..7ab365a 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 1e72c77..55aa9e8 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index c3f51f6..8efcdf0 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index fe88ef6..765f32e 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index f506c45..951c08f 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -17,11 +17,11 @@ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_shared.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_error.h" #include "xfs_alloc.h" diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 9b3fca6..697073a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -24,7 +24,6 @@ #include "xfs_bit.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c index 63ca2f0..8abc2d5 100644 --- a/fs/xfs/xfs_message.c +++ b/fs/xfs/xfs_message.c @@ -17,10 +17,10 @@ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" /* diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index faf3e36..e627336 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -24,7 +24,6 @@ #include "xfs_bit.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b0447c8..d27804a 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -320,10 +320,7 @@ typedef struct xfs_mod_sb { /* * Per-ag incore structure, copies of information in agf and agi, to improve the - * performance of allocation group selection. This is defined for the kernel - * only, and hence is defined here instead of in xfs_ag.h. You need the struct - * xfs_mount to be defined to look up a xfs_perag anyway (via mp->m_perag_tree), - * so this doesn't introduce any strange header file dependencies. + * performance of allocation group selection. */ typedef struct xfs_perag { struct xfs_mount *pag_mount; /* owner filesystem */ diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index cca7445..26d4a8d 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_ialloc.h" diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index 2c61e61..b781dc5 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 80f2d77..0449d93 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -26,7 +26,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index b238027..7638439 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -20,7 +20,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_quota.h" diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 562dcdf..cb93a72 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_bmap.h" diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 8f02647..af4f63e 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -23,7 +23,6 @@ #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index f38a3f1..99bc129 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -24,7 +24,6 @@ #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 1e85bcd..017051a 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 30e8e34..02df25d 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -23,7 +23,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_extent_busy.h" diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 859482f..dd828d6 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -18,10 +18,10 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index e2b2216..f9192b0 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 846e061..6320e28 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 47978ba..a0aaa3e 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -18,10 +18,10 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index cdb4d86..592904b 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -22,7 +22,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_inode.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 93455b9..30c6158 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -21,7 +21,6 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" -#include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_inode.h" -- 1.9.1 From BATV+832b2e2bae0c07a984ad+4112+infradead.org+hch@bombadil.srs.infradead.org Wed Nov 26 13:23:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9A74B7F54 for ; Wed, 26 Nov 2014 13:23:33 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 79E248F8037 for ; Wed, 26 Nov 2014 11:23:30 -0800 (PST) X-ASG-Debug-ID: 1417029808-04bdf061608b9500001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id e9js0MDnqc7FLnZu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:23:29 -0800 (PST) X-Barracuda-Envelope-From: BATV+832b2e2bae0c07a984ad+4112+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XtiBU-0001ie-2a; Wed, 26 Nov 2014 19:23:28 +0000 Date: Wed, 26 Nov 2014 11:23:28 -0800 From: Christoph Hellwig To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141126192328.GA20436@infradead.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416997437-26092-2-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1417029809 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- As mentioned last round please move the addition of the is_readonly operation to the first thing in the series, so that the ordering makes more sense. Second I think this patch is incorrect for XFS - XFS uses ->update_time to set the time stampst in the dinode. These two need to be coherent as we can write out a dirty inode any time, so it needs to have the timestamp uptodate. Third update_time now calls mark_inode_dirty unconditionally, while previously it wasn't called when ->update_time was set. At least for XFS that's a major change in behavior as XFS never used VFS dirty tracking for metadata updates. From BATV+832b2e2bae0c07a984ad+4112+infradead.org+hch@bombadil.srs.infradead.org Wed Nov 26 13:24:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37A0D7F5E for ; Wed, 26 Nov 2014 13:24:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6059AC00D for ; Wed, 26 Nov 2014 11:24:21 -0800 (PST) X-ASG-Debug-ID: 1417029861-04bdf061608b95a0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id vhw7R60sp9kXWeFA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Nov 2014 11:24:21 -0800 (PST) X-Barracuda-Envelope-From: BATV+832b2e2bae0c07a984ad+4112+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1XtiCK-0002HR-OD; Wed, 26 Nov 2014 19:24:20 +0000 Date: Wed, 26 Nov 2014 11:24:20 -0800 From: Christoph Hellwig To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141126192420.GB20436@infradead.org> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416997437-26092-7-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1417029861 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The subject line seems incorrect, this seems to implement some form of dirty inode writeback clustering. From sandeen@sandeen.net Wed Nov 26 13:26:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B72D57F4E for ; Wed, 26 Nov 2014 13:26:58 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4553304062 for ; Wed, 26 Nov 2014 11:26:58 -0800 (PST) X-ASG-Debug-ID: 1417030016-04cbb01e5a734e60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bOC9ZLMT9HTtq9Bu for ; Wed, 26 Nov 2014 11:26:56 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5842F6565094 for ; Wed, 26 Nov 2014 13:26:56 -0600 (CST) Message-ID: <5476297F.8080304@sandeen.net> Date: Wed, 26 Nov 2014 13:26:55 -0600 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: no quota output if no usage? Content-Type: text/plain; charset=utf-8 X-ASG-Orig-Subj: no quota output if no usage? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1417030016 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12085 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This seems a bit weird: # xfs_quota -x -c 'quota -p project1' /mnt/test # Huh, did it work? # xfs_quota -x -c 'quota -pv project1' /mnt/test Disk quotas for Project project1 (1) Filesystem Blocks Quota Limit Warn/Time Mounted on /dev/sdc2 0 1024000 1228800 00 [--------] /mnt/test # Oh, ok! I don't know why reporting limits should depend on the verbose flag, but it has been that way since 2005 in quota_mount() : if (!(flags & VERBOSE_FLAG)) { count = 0; if ((form & XFS_BLOCK_QUOTA) && d.d_bcount) count++; if ((form & XFS_INODE_QUOTA) && d.d_icount) count++; if ((form & XFS_RTBLOCK_QUOTA) && d.d_rtbcount) count++; if (!count) return 0; } I'm inclined to change it, but is it OK to change the output of this - might old scripts be relying on this (odd) silent behavior? I think it can certainly cause confusion (as evidenced by at least one bug I'm looking at ...) Thanks, -Eric From david@fromorbit.com Wed Nov 26 15:21:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 37A577F4E for ; Wed, 26 Nov 2014 15:21:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D7470AC003 for ; Wed, 26 Nov 2014 13:21:49 -0800 (PST) X-ASG-Debug-ID: 1417036906-04bdf0615e8c5500001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id qPFPV7HYzgn72opG for ; Wed, 26 Nov 2014 13:21:47 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqUUAJFDdlR5LLkmPGdsb2JhbABbgwaBKYI1hAStTQEBAQEBAQaVMoUhBAICgQ8XAQEBAQEGAQEBATg7hAMBAQQ6HCMQCAMYCSUPBSUDBxoTiD/SewEBAQEGAQEBAR4Yhh+JbQpNB4MugR8FnwCbLTMwgQeBQwEBAQ Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail06.adl2.internode.on.net with ESMTP; 27 Nov 2014 07:51:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xtk1w-00019k-I8; Thu, 27 Nov 2014 08:21:44 +1100 Date: Thu, 27 Nov 2014 08:21:44 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: no quota output if no usage? Message-ID: <20141126212144.GD9561@dastard> X-ASG-Orig-Subj: Re: no quota output if no usage? References: <5476297F.8080304@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5476297F.8080304@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1417036907 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12089 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 26, 2014 at 01:26:55PM -0600, Eric Sandeen wrote: > This seems a bit weird: > > # xfs_quota -x -c 'quota -p project1' /mnt/test > # > > Huh, did it work? > > # xfs_quota -x -c 'quota -pv project1' /mnt/test > Disk quotas for Project project1 (1) > Filesystem Blocks Quota Limit Warn/Time Mounted on > /dev/sdc2 0 1024000 1228800 00 [--------] /mnt/test > # > > Oh, ok! > > I don't know why reporting limits should depend on the verbose flag, but it > has been that way since 2005 in quota_mount() : > > if (!(flags & VERBOSE_FLAG)) { > count = 0; > if ((form & XFS_BLOCK_QUOTA) && d.d_bcount) > count++; > if ((form & XFS_INODE_QUOTA) && d.d_icount) > count++; > if ((form & XFS_RTBLOCK_QUOTA) && d.d_rtbcount) > count++; > if (!count) > return 0; > } > > I'm inclined to change it, but is it OK to change the output of this - might old > scripts be relying on this (odd) silent behavior? I think it can certainly cause > confusion (as evidenced by at least one bug I'm looking at ...) It's done that way because the quota lookup can find dquots that are completely empty because there are no uid/gid/prid found in the filesystem, but the dquot is allocated because it's within a block that has in use dquots in it. I'd guess that if you queried a non-existent project quota (e.g. prid 2) you'd get the same result.... i.e. you've got to have inodes or blocks accounted to have a dquot "created" for the uid/gid/prid in normal conditions, hence dquots with zero counts are ignored by default as they are effectively the same as unallocated dquots.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Nov 26 15:26:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1D3867F4E for ; Wed, 26 Nov 2014 15:26:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EABCD304062 for ; Wed, 26 Nov 2014 13:26:31 -0800 (PST) X-ASG-Debug-ID: 1417037187-04cbb01e5a740c20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vFW3VvIjgSCWNWdZ for ; Wed, 26 Nov 2014 13:26:27 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D674765C7C87; Wed, 26 Nov 2014 15:26:26 -0600 (CST) Message-ID: <54764582.6000005@sandeen.net> Date: Wed, 26 Nov 2014 15:26:26 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: no quota output if no usage? References: <5476297F.8080304@sandeen.net> <20141126212144.GD9561@dastard> X-ASG-Orig-Subj: Re: no quota output if no usage? In-Reply-To: <20141126212144.GD9561@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1417037187 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12089 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/26/14 3:21 PM, Dave Chinner wrote: > On Wed, Nov 26, 2014 at 01:26:55PM -0600, Eric Sandeen wrote: >> This seems a bit weird: >> >> # xfs_quota -x -c 'quota -p project1' /mnt/test >> # >> >> Huh, did it work? >> >> # xfs_quota -x -c 'quota -pv project1' /mnt/test >> Disk quotas for Project project1 (1) >> Filesystem Blocks Quota Limit Warn/Time Mounted on >> /dev/sdc2 0 1024000 1228800 00 [--------] /mnt/test >> # >> >> Oh, ok! >> >> I don't know why reporting limits should depend on the verbose flag, but it >> has been that way since 2005 in quota_mount() : >> >> if (!(flags & VERBOSE_FLAG)) { >> count = 0; >> if ((form & XFS_BLOCK_QUOTA) && d.d_bcount) >> count++; >> if ((form & XFS_INODE_QUOTA) && d.d_icount) >> count++; >> if ((form & XFS_RTBLOCK_QUOTA) && d.d_rtbcount) >> count++; >> if (!count) >> return 0; >> } >> >> I'm inclined to change it, but is it OK to change the output of this - might old >> scripts be relying on this (odd) silent behavior? I think it can certainly cause >> confusion (as evidenced by at least one bug I'm looking at ...) > > It's done that way because the quota lookup can find dquots that are > completely empty because there are no uid/gid/prid found in the > filesystem, but the dquot is allocated because it's within a block > that has in use dquots in it. I'd guess that if you queried a > non-existent project quota (e.g. prid 2) you'd get the same > result.... if I ask for something that doesn't exist by name, it tells me: # xfs_quota -x -c 'quota -pv project4' /mnt/test xfs_quota: cannot find project project4 or if I ask by prid, I get nothing with or without -v :( # xfs_quota -x -c 'quota -pv 4' /mnt/test # > i.e. you've got to have inodes or blocks accounted to have a dquot > "created" for the uid/gid/prid in normal conditions, hence dquots > with zero counts are ignored by default as they are effectively > the same as unallocated dquots.... That's all well and good, but with -v it is able to tell me what the set limits are, and that I have no blocks allocated within those limits. So the information we might expect seems available; it's just not shown, because the code short-circuits it w/o -v. Or am I missing something ... -Eric > Cheers, > > Dave. > From david@fromorbit.com Wed Nov 26 16:19:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E1AD77F4E for ; Wed, 26 Nov 2014 16:19:24 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B3A9F8F8054 for ; Wed, 26 Nov 2014 14:19:24 -0800 (PST) X-ASG-Debug-ID: 1417040358-04bdf0615f8cbca0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id F3sdQFiLpQ1J8phq for ; Wed, 26 Nov 2014 14:19:19 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqYUAGxRdlR5LLkmPGdsb2JhbABbgwaBKYI1hAStTQEBAQEBAQaVMoUhBAICgQ8XAQEBAQEGAQEBATg7hAIBAQEDATocIwULCAMYCSUPBSUDBxoTiDcI0lwBAQEBBgEBAQEeGIYfiW0KTQeDLoEfBZ8Amy0zMIEHAR4GgR4BAQE Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail06.adl2.internode.on.net with ESMTP; 27 Nov 2014 08:48:47 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xtkv7-0001HW-7c; Thu, 27 Nov 2014 09:18:45 +1100 Date: Thu, 27 Nov 2014 09:18:45 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: no quota output if no usage? Message-ID: <20141126221845.GE9561@dastard> X-ASG-Orig-Subj: Re: no quota output if no usage? References: <5476297F.8080304@sandeen.net> <20141126212144.GD9561@dastard> <54764582.6000005@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54764582.6000005@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1417040358 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 26, 2014 at 03:26:26PM -0600, Eric Sandeen wrote: > On 11/26/14 3:21 PM, Dave Chinner wrote: > > On Wed, Nov 26, 2014 at 01:26:55PM -0600, Eric Sandeen wrote: > >> This seems a bit weird: > >> > >> # xfs_quota -x -c 'quota -p project1' /mnt/test > >> # > >> > >> Huh, did it work? > >> > >> # xfs_quota -x -c 'quota -pv project1' /mnt/test > >> Disk quotas for Project project1 (1) > >> Filesystem Blocks Quota Limit Warn/Time Mounted on > >> /dev/sdc2 0 1024000 1228800 00 [--------] /mnt/test > >> # > >> > >> Oh, ok! > >> > >> I don't know why reporting limits should depend on the verbose flag, but it > >> has been that way since 2005 in quota_mount() : > >> > >> if (!(flags & VERBOSE_FLAG)) { > >> count = 0; > >> if ((form & XFS_BLOCK_QUOTA) && d.d_bcount) > >> count++; > >> if ((form & XFS_INODE_QUOTA) && d.d_icount) > >> count++; > >> if ((form & XFS_RTBLOCK_QUOTA) && d.d_rtbcount) > >> count++; > >> if (!count) > >> return 0; > >> } > >> > >> I'm inclined to change it, but is it OK to change the output of this - might old > >> scripts be relying on this (odd) silent behavior? I think it can certainly cause > >> confusion (as evidenced by at least one bug I'm looking at ...) > > > > It's done that way because the quota lookup can find dquots that are > > completely empty because there are no uid/gid/prid found in the > > filesystem, but the dquot is allocated because it's within a block > > that has in use dquots in it. I'd guess that if you queried a > > non-existent project quota (e.g. prid 2) you'd get the same > > result.... > > if I ask for something that doesn't exist by name, it tells me: > > # xfs_quota -x -c 'quota -pv project4' /mnt/test > xfs_quota: cannot find project project4 It can't convert it to a prid because it's not in the /etc/projects file. Project quotas are a little bit special in this way. > or if I ask by prid, I get nothing with or without -v :( > > # xfs_quota -x -c 'quota -pv 4' /mnt/test > # Ah, I missed the XFS_IS_DQUOT_UNINITIALIZED() check at the syscall entry point. It checks for everything being zero and returns -ENOENT if it's an empty dquot. Too many bloody layers of validation.... > > i.e. you've got to have inodes or blocks accounted to have a dquot > > "created" for the uid/gid/prid in normal conditions, hence dquots > > with zero counts are ignored by default as they are effectively > > the same as unallocated dquots.... > > That's all well and good, but with -v it is able to tell me what > the set limits are, and that I have no blocks allocated within those limits. > > So the information we might expect seems available; it's just not > shown, because the code short-circuits it w/o -v. > > Or am I missing something ... Nope, I'm confusing different reporting command behaviour.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Nov 26 16:39:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C14947F4E for ; Wed, 26 Nov 2014 16:39:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41B28AC005 for ; Wed, 26 Nov 2014 14:39:51 -0800 (PST) X-ASG-Debug-ID: 1417041589-04cbb01e5c7478f0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id CTR5eRPvoEwRE0Th for ; Wed, 26 Nov 2014 14:39:49 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqcUAFNWdlR5LLkmPGdsb2JhbABbDoJ4gSmCNYQErU0BAQEBAQEGlTKFIQQCAoEMFwEBAQEBBgEBAQE4O4QCAQEBAwE6HCMFCwgDGAklDwUlAwcaE4g3CNJfAQEBAQYCAR8Yhh+KRAeDLoEfAQSfAJpZVDMwgkoBAQE Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail06.adl2.internode.on.net with ESMTP; 27 Nov 2014 09:09:07 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XtlEk-0001JO-0L; Thu, 27 Nov 2014 09:39:02 +1100 Date: Thu, 27 Nov 2014 09:39:01 +1100 From: Dave Chinner To: Theodore Ts'o Cc: linux-fsdevel@vger.kernel.org, Ext4 Developers List , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale Message-ID: <20141126223901.GF9561@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/4] vfs: don't let the dirty time inodes get more than a day stale References: <1416599964-21892-1-git-send-email-tytso@mit.edu> <1416599964-21892-4-git-send-email-tytso@mit.edu> <20141125015332.GE27262@dastard> <20141125044508.GG31339@thunk.org> <20141125234851.GB9561@dastard> <20141126102017.GJ28449@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141126102017.GJ28449@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1417041589 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 26, 2014 at 05:20:17AM -0500, Theodore Ts'o wrote: > On Wed, Nov 26, 2014 at 10:48:51AM +1100, Dave Chinner wrote: > > No abuse necessary at all. Just a different inode_dirtied_after() > > check is requires if the inode is on the time dirty list in > > move_expired_inodes(). > > I'm still not sure what you have in mind here. When would this be > checked? Have you looked at where move_expired_inodes() gets called from? It's called periodically from background writeback by queue_io(), and sync uses the same infrastructure to expire all inodes on the dirty list.... > It sounds like you want to set a timeout such that when an > inode which had its timestamps updated lazily 24 hours earlier, the > inode would get written out. Yes? But that implies something is > going to have to scan the list of inodes on the dirty time list > periodically. When are you proposing that this take place? The writeback code already does this for dirty inodes. it does it in move_expired_inodes() to move the inodes with i_dirtied_when is older than 30s. It's *trivial* to add a time dirty inode list and scan that at the same time to pull off inodes that are older than 24hrs. > The various approaches that come to mind all seem more complex than > what I have in this patch 3 of 4, and I'm not sure it's worth the > complexity. the "once a day" stuff you've added is a horrible, nasty hack. I wasn't going to say anything about it (i.e. if you can't say anything nice...). The existing dirty inode writeback expiry code does *everything* we need already, we just need to plumb in a new list and add an expiry check of that list to move inodes to the b_io list when they have been timestamp dirty for more than 24 hours... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Nov 26 16:48:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1FF2B7F4E for ; Wed, 26 Nov 2014 16:48:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ACEBAAC003 for ; Wed, 26 Nov 2014 14:48:47 -0800 (PST) X-ASG-Debug-ID: 1417042125-04bdf0615e8cf2d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 1sIH3jrvqOeQZpnB for ; Wed, 26 Nov 2014 14:48:45 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoUkAEhXdlR5LLkmPGdsb2JhbABbDoJ4gSmCNYQErU0BAQEBAQEGlTKFIQICAQECgQwXAQEBAQEGAQEBATg7hAMBAQQnExwjEAgDGAklDwUlAwcaE4g/0mABAQEHAgEfGIYfikQHhE0FhS4CmVCBNo4hiwJUMzCBBiSBIAEBAQ Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail06.adl2.internode.on.net with ESMTP; 27 Nov 2014 09:18:44 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XtlO7-0001Ka-Dh; Thu, 27 Nov 2014 09:48:43 +1100 Date: Thu, 27 Nov 2014 09:48:43 +1100 From: Dave Chinner To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141126224843.GG9561@dastard> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416997437-26092-7-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1417042125 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12090 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 26, 2014 at 05:23:56AM -0500, Theodore Ts'o wrote: > Add an optimization for the MS_LAZYTIME mount option so that we will > opportunistically write out any inodes with the I_DIRTY_TIME flag set > in a particular inode table block when we need to update some inode in > that inode table block anyway. > > Also add some temporary code so that we can set the lazytime mount > option without needing a modified /sbin/mount program which can set > MS_LAZYTIME. We can eventually make this go away once util-linux has > added support. > > Google-Bug-Id: 18297052 > > Signed-off-by: Theodore Ts'o > --- > fs/ext4/inode.c | 49 ++++++++++++++++++++++++++++++++++++++++++--- > fs/ext4/super.c | 9 +++++++++ > include/trace/events/ext4.h | 30 +++++++++++++++++++++++++++ > 3 files changed, 85 insertions(+), 3 deletions(-) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index 5653fa4..8308c82 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -4140,6 +4140,51 @@ static int ext4_inode_blocks_set(handle_t *handle, > } > > /* > + * Opportunistically update the other time fields for other inodes in > + * the same inode table block. > + */ > +static void ext4_update_other_inodes_time(struct super_block *sb, > + unsigned long orig_ino, char *buf) > +{ > + struct ext4_inode_info *ei; > + struct ext4_inode *raw_inode; > + unsigned long ino; > + struct inode *inode; > + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; > + int inode_size = EXT4_INODE_SIZE(sb); > + > + ino = orig_ino & ~(inodes_per_block - 1); > + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { > + if (ino == orig_ino) > + continue; > + inode = find_active_inode_nowait(sb, ino); > + if (!inode || > + (inode->i_state & I_DIRTY_TIME) == 0 || > + !spin_trylock(&inode->i_lock)) { > + iput(inode); > + continue; > + } > + inode->i_state &= ~I_DIRTY_TIME; > + inode->i_ts_dirty_day = 0; > + spin_unlock(&inode->i_lock); > + inode_requeue_dirtytime(inode); > + > + ei = EXT4_I(inode); > + raw_inode = (struct ext4_inode *) buf; > + > + spin_lock(&ei->i_raw_lock); > + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); > + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); > + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); > + ext4_inode_csum_set(inode, raw_inode, ei); > + spin_unlock(&ei->i_raw_lock); > + trace_ext4_other_inode_update_time(inode, orig_ino); > + iput(inode); > + } > +} Am I right in that this now does unlogged timestamp updates of inodes? What happens when that buffer gets overwritten by log recover after a crash? The timestamp updates get lost? FYI, XFS has had all sorts of nasty log recovery corner cases caused by log recovery overwriting non-logged inode updates like this. In the past few years we've removed every single non-logged inode update "optimisation" so that all changes (including timestamps) are transactional so inode state on disk not matching what log recovery wrote to disk for all the other inode metadata... Optimistic unlogged inode updates are a slippery slope, and history tells me that it doesn't lead to a nice place.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From adilger@dilger.ca Wed Nov 26 17:10:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14C087F4E for ; Wed, 26 Nov 2014 17:10:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6EC9AC003 for ; Wed, 26 Nov 2014 15:10:48 -0800 (PST) X-ASG-Debug-ID: 1417043447-04bdf0615e8d0c90001-NocioJ Received: from mail-pa0-f44.google.com (mail-pa0-f44.google.com [209.85.220.44]) by cuda.sgi.com with ESMTP id GHDAOWY3ktaeEQOC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 26 Nov 2014 15:10:47 -0800 (PST) X-Barracuda-Envelope-From: adilger@dilger.ca X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.44 Received: by mail-pa0-f44.google.com with SMTP id et14so3795357pad.3 for ; Wed, 26 Nov 2014 15:10:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:content-type:mime-version:subject:from :in-reply-to:date:cc:content-transfer-encoding:message-id:references :to; bh=AgIUfkC8eIrmH4loD+fECCt7HdfCgBVDCNikmw+CDwY=; b=huGqirotbu0JR/7VRQdghCVU9+zRMF5yDrAXWMIznhoP2RuhSNvELX+Hg3cjzW20kN s8LhMuUWGi/XsLKA8EdZNcZPJGjRvVzdW04L7d9CjLmVssuO3zaxr+HO1h8YPD0vehEU MbeI9UfZOSsiv5R4R15vOPfj8D/qQTf+c/Ow5KjC2JRcJ7FP3G+N7JYCf8qI/86xK2Tg O2VY4DHrbmgdyrTnrpaqLGossaqvoyWPQ/TlmU+/5vC/83rNochDUZAQNl+rmn8G1aa6 6qLx9INcIAzn4NIoM6GVML+AG3jUXaM+94ori2c9ULIZ4VWvxJQZi/e1UKKFW6UHKPsN vAvg== X-Barracuda-BBL-IP: nil X-Gm-Message-State: ALoCoQkz4YGp8ZD0Sd9aERDSOcNW/A/DiyclUj+IxQ4JZYZCKdzokf+tGjOhqt4t65fQ2lxnFZzk X-Received: by 10.66.151.162 with SMTP id ur2mr57140724pab.115.1417043446867; Wed, 26 Nov 2014 15:10:46 -0800 (PST) Received: from cabot-100.adilger.int (S0106002191d9348b.cg.shawcable.net. [96.51.76.157]) by mx.google.com with ESMTPSA id oz10sm5235617pdb.95.2014.11.26.15.10.45 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 26 Nov 2014 15:10:46 -0800 (PST) Content-Type: text/plain; charset=us-ascii X-Barracuda-Apparent-Source-IP: 96.51.76.157 Mime-Version: 1.0 (Mac OS X Mail 8.1 \(1993\)) Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option From: Andreas Dilger X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option In-Reply-To: <20141126224843.GG9561@dastard> Date: Wed, 26 Nov 2014 16:10:44 -0700 Cc: Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Content-Transfer-Encoding: quoted-printable Message-Id: <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> To: Dave Chinner X-Mailer: Apple Mail (2.1993) X-Barracuda-Connect: mail-pa0-f44.google.com[209.85.220.44] X-Barracuda-Start-Time: 1417043447 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12091 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Nov 26, 2014, at 3:48 PM, Dave Chinner wrote: >=20 > On Wed, Nov 26, 2014 at 05:23:56AM -0500, Theodore Ts'o wrote: >> Add an optimization for the MS_LAZYTIME mount option so that we will >> opportunistically write out any inodes with the I_DIRTY_TIME flag set >> in a particular inode table block when we need to update some inode >> in that inode table block anyway. >>=20 >> Also add some temporary code so that we can set the lazytime mount >> option without needing a modified /sbin/mount program which can set >> MS_LAZYTIME. We can eventually make this go away once util-linux has >> added support. >>=20 >> Google-Bug-Id: 18297052 >>=20 >> Signed-off-by: Theodore Ts'o >> --- >> fs/ext4/inode.c | 49 = ++++++++++++++++++++++++++++++++++++++++++--- >> fs/ext4/super.c | 9 +++++++++ >> include/trace/events/ext4.h | 30 +++++++++++++++++++++++++++ >> 3 files changed, 85 insertions(+), 3 deletions(-) >>=20 >> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c >> index 5653fa4..8308c82 100644 >> --- a/fs/ext4/inode.c >> +++ b/fs/ext4/inode.c >> @@ -4140,6 +4140,51 @@ static int ext4_inode_blocks_set(handle_t = *handle, >> } >>=20 >> /* >> + * Opportunistically update the other time fields for other inodes = in >> + * the same inode table block. >> + */ >> +static void ext4_update_other_inodes_time(struct super_block *sb, >> + unsigned long orig_ino, char = *buf) >> +{ >> + struct ext4_inode_info *ei; >> + struct ext4_inode *raw_inode; >> + unsigned long ino; >> + struct inode *inode; >> + int i, inodes_per_block =3D = EXT4_SB(sb)->s_inodes_per_block; >> + int inode_size =3D EXT4_INODE_SIZE(sb); >> + >> + ino =3D orig_ino & ~(inodes_per_block - 1); >> + for (i =3D 0; i < inodes_per_block; i++, ino++, buf +=3D = inode_size) { >> + if (ino =3D=3D orig_ino) >> + continue; >> + inode =3D find_active_inode_nowait(sb, ino); >> + if (!inode || >> + (inode->i_state & I_DIRTY_TIME) =3D=3D 0 || >> + !spin_trylock(&inode->i_lock)) { >> + iput(inode); >> + continue; >> + } >> + inode->i_state &=3D ~I_DIRTY_TIME; >> + inode->i_ts_dirty_day =3D 0; >> + spin_unlock(&inode->i_lock); >> + inode_requeue_dirtytime(inode); >> + >> + ei =3D EXT4_I(inode); >> + raw_inode =3D (struct ext4_inode *) buf; >> + >> + spin_lock(&ei->i_raw_lock); >> + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); >> + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); >> + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); >> + ext4_inode_csum_set(inode, raw_inode, ei); >> + spin_unlock(&ei->i_raw_lock); >> + trace_ext4_other_inode_update_time(inode, orig_ino); >> + iput(inode); >> + } >> +} >=20 > Am I right in that this now does unlogged timestamp updates of > inodes? What happens when that buffer gets overwritten by log > recover after a crash? The timestamp updates get lost? >=20 > FYI, XFS has had all sorts of nasty log recovery corner cases > caused by log recovery overwriting non-logged inode updates like > this. In the past few years we've removed every single non-logged > inode update "optimisation" so that all changes (including timestamps) > are transactional so inode state on disk not matching what log > recovery wrote to disk for all the other inode metadata... >=20 > Optimistic unlogged inode updates are a slippery slope, and history > tells me that it doesn't lead to a nice place.... Since ext4/jbd2 is logging the whole block, unlike XFS which is doing logical journaling, this isn't an unlogged update. It is just taking advantage of the fact that the whole block is going to be logged and written to the disk anyway. If the only update needed for other inodes in the block is the timestamp then they may as well be flushed to disk at the same time and avoid the need for another update later on. Cheers, Andreas From david@fromorbit.com Wed Nov 26 17:38:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C3457F4E for ; Wed, 26 Nov 2014 17:38:19 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4BFDC8F8037 for ; Wed, 26 Nov 2014 15:38:16 -0800 (PST) X-ASG-Debug-ID: 1417045093-04cb6c0572757d50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id G7yF3MbjKlCymckS for ; Wed, 26 Nov 2014 15:38:14 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoYkADhjdlR5LLkmPGdsb2JhbABbgwaBKYI1hAStTQEBAQEBAQaVMoUhAgIBAQKBDBcBAQEBAQYBAQEBODuEAgEBAQMBJxMcIxAIAw4KCSUPBSUDBxoTiDcI0mcBAQEHAgEfGIYfikQHhE0FhS4CmVCBNo4hi1YzMIEGJIEgAQEB Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail06.adl2.internode.on.net with ESMTP; 27 Nov 2014 10:06:38 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xtm7V-0001Ul-Hg; Thu, 27 Nov 2014 10:35:37 +1100 Date: Thu, 27 Nov 2014 10:35:37 +1100 From: Dave Chinner To: Andreas Dilger Cc: Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141126233537.GH9561@dastard> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1417045093 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12091 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Nov 26, 2014 at 04:10:44PM -0700, Andreas Dilger wrote: > On Nov 26, 2014, at 3:48 PM, Dave Chinner wrote: > > > > On Wed, Nov 26, 2014 at 05:23:56AM -0500, Theodore Ts'o wrote: > >> Add an optimization for the MS_LAZYTIME mount option so that we will > >> opportunistically write out any inodes with the I_DIRTY_TIME flag set > >> in a particular inode table block when we need to update some inode > >> in that inode table block anyway. > >> > >> Also add some temporary code so that we can set the lazytime mount > >> option without needing a modified /sbin/mount program which can set > >> MS_LAZYTIME. We can eventually make this go away once util-linux has > >> added support. > >> > >> Google-Bug-Id: 18297052 > >> > >> Signed-off-by: Theodore Ts'o > >> --- > >> fs/ext4/inode.c | 49 ++++++++++++++++++++++++++++++++++++++++++--- > >> fs/ext4/super.c | 9 +++++++++ > >> include/trace/events/ext4.h | 30 +++++++++++++++++++++++++++ > >> 3 files changed, 85 insertions(+), 3 deletions(-) > >> > >> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > >> index 5653fa4..8308c82 100644 > >> --- a/fs/ext4/inode.c > >> +++ b/fs/ext4/inode.c > >> @@ -4140,6 +4140,51 @@ static int ext4_inode_blocks_set(handle_t *handle, > >> } > >> > >> /* > >> + * Opportunistically update the other time fields for other inodes in > >> + * the same inode table block. > >> + */ > >> +static void ext4_update_other_inodes_time(struct super_block *sb, > >> + unsigned long orig_ino, char *buf) > >> +{ > >> + struct ext4_inode_info *ei; > >> + struct ext4_inode *raw_inode; > >> + unsigned long ino; > >> + struct inode *inode; > >> + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; > >> + int inode_size = EXT4_INODE_SIZE(sb); > >> + > >> + ino = orig_ino & ~(inodes_per_block - 1); > >> + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { > >> + if (ino == orig_ino) > >> + continue; > >> + inode = find_active_inode_nowait(sb, ino); > >> + if (!inode || > >> + (inode->i_state & I_DIRTY_TIME) == 0 || > >> + !spin_trylock(&inode->i_lock)) { > >> + iput(inode); > >> + continue; > >> + } > >> + inode->i_state &= ~I_DIRTY_TIME; > >> + inode->i_ts_dirty_day = 0; > >> + spin_unlock(&inode->i_lock); > >> + inode_requeue_dirtytime(inode); > >> + > >> + ei = EXT4_I(inode); > >> + raw_inode = (struct ext4_inode *) buf; > >> + > >> + spin_lock(&ei->i_raw_lock); > >> + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); > >> + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); > >> + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); > >> + ext4_inode_csum_set(inode, raw_inode, ei); > >> + spin_unlock(&ei->i_raw_lock); > >> + trace_ext4_other_inode_update_time(inode, orig_ino); > >> + iput(inode); > >> + } > >> +} > > > > Am I right in that this now does unlogged timestamp updates of > > inodes? What happens when that buffer gets overwritten by log > > recover after a crash? The timestamp updates get lost? > > > > FYI, XFS has had all sorts of nasty log recovery corner cases > > caused by log recovery overwriting non-logged inode updates like > > this. In the past few years we've removed every single non-logged > > inode update "optimisation" so that all changes (including timestamps) > > are transactional so inode state on disk not matching what log > > recovery wrote to disk for all the other inode metadata... > > > > Optimistic unlogged inode updates are a slippery slope, and history > > tells me that it doesn't lead to a nice place.... > > Since ext4/jbd2 is logging the whole block, unlike XFS which is doing > logical journaling, this isn't an unlogged update. It is just taking > advantage of the fact that the whole block is going to be logged and > written to the disk anyway. Urk - that's worse, isn't it? i.e the code above calls iput() from within a current transaction context? What happens if that drops the last reference to the inode and it gets evicted due to racing with an unlink? Won't that try to start another transaction to free the inode (i.e. through ext4_evict_inode())? > > If the only update needed for other inodes > in the block is the timestamp then they may as well be flushed to disk > at the same time and avoid the need for another update later on. > > Cheers, Andreas > > > > > > -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Nov 26 18:28:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 625427F4E for ; Wed, 26 Nov 2014 18:28:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E5175AC005 for ; Wed, 26 Nov 2014 16:28:38 -0800 (PST) X-ASG-Debug-ID: 1417048114-04cbb01e5974d090001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 5KYZepTyNqt33u1S for ; Wed, 26 Nov 2014 16:28:34 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 79A68657384C; Wed, 26 Nov 2014 18:28:33 -0600 (CST) Message-ID: <54767030.7070706@sandeen.net> Date: Wed, 26 Nov 2014 18:28:32 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: no quota output if no usage? References: <5476297F.8080304@sandeen.net> <20141126212144.GD9561@dastard> <54764582.6000005@sandeen.net> <20141126221845.GE9561@dastard> X-ASG-Orig-Subj: Re: no quota output if no usage? In-Reply-To: <20141126221845.GE9561@dastard> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1417048114 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12096 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/26/14 4:18 PM, Dave Chinner wrote: >> Or am I missing something ... > > Nope, I'm confusing different reporting command behaviour.... Ok, so back to the original question: think it's cool to drop the verbose requirement to find out limits when there is 0 usage? -Eric From jack@suse.cz Thu Nov 27 03:32:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F4187F4E for ; Thu, 27 Nov 2014 03:32:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E9C6304053 for ; Thu, 27 Nov 2014 01:32:35 -0800 (PST) X-ASG-Debug-ID: 1417080750-04cbb01e5c78be50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id xcGmgIxpwCZkfgS3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 01:32:31 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C6F5EACF1; Thu, 27 Nov 2014 09:32:28 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id BB79181C69; Thu, 27 Nov 2014 10:32:25 +0100 (CET) Date: Thu, 27 Nov 2014 10:32:25 +0100 From: Jan Kara To: Eric Sandeen Cc: Dave Chinner , xfs-oss Subject: Re: no quota output if no usage? Message-ID: <20141127093225.GB30152@quack.suse.cz> X-ASG-Orig-Subj: Re: no quota output if no usage? References: <5476297F.8080304@sandeen.net> <20141126212144.GD9561@dastard> <54764582.6000005@sandeen.net> <20141126221845.GE9561@dastard> <54767030.7070706@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54767030.7070706@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417080751 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12112 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 26-11-14 18:28:32, Eric Sandeen wrote: > On 11/26/14 4:18 PM, Dave Chinner wrote: > > >> Or am I missing something ... > > > > Nope, I'm confusing different reporting command behaviour.... > > Ok, so back to the original question: think it's cool to drop > the verbose requirement to find out limits when there is 0 usage? Just as a data point quota(1) command from quota-tools also doesn't report quota entries where no space & inode is accounted without -v option. I never thought it's particularly useful but apparently it's some heritage from the original implementation of quota in some Unix and so I decided to maintain compatibility... Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Nov 27 06:34:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B4E2C7F4E for ; Thu, 27 Nov 2014 06:34:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 866F0304039 for ; Thu, 27 Nov 2014 04:34:36 -0800 (PST) X-ASG-Debug-ID: 1417091673-04bdf0615e9afe70001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 89sh1jz1gkRT3n02 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 04:34:34 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4690BACF9; Thu, 27 Nov 2014 12:34:33 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id CFBA281C69; Thu, 27 Nov 2014 13:34:29 +0100 (CET) Date: Thu, 27 Nov 2014 13:34:29 +0100 From: Jan Kara To: Christoph Hellwig Cc: Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127123429.GD30152@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141126192328.GA20436@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417091674 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 26-11-14 11:23:28, Christoph Hellwig wrote: > As mentioned last round please move the addition of the is_readonly > operation to the first thing in the series, so that the ordering makes > more sense. > > Second I think this patch is incorrect for XFS - XFS uses ->update_time > to set the time stampst in the dinode. These two need to be coherent > as we can write out a dirty inode any time, so it needs to have the > timestamp uptodate. But Ted changed XFS to copy timestamps to on-disk structure from the in-memory inode fields after VFS updated the timestamps. So the stamps should be coherent AFAICT, shouldn't they? > Third update_time now calls mark_inode_dirty unconditionally, while > previously it wasn't called when ->update_time was set. At least > for XFS that's a major change in behavior as XFS never used VFS dirty > tracking for metadata updates. We don't call mark_inode_dirty() when ->write_time is set (note the return, I missed it on the first reading) which looks sensible to me. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Nov 27 07:14:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9BB367F4E for ; Thu, 27 Nov 2014 07:14:32 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 19F42AC003 for ; Thu, 27 Nov 2014 05:14:29 -0800 (PST) X-ASG-Debug-ID: 1417094066-04cbb01e5a7fe0c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 0OA9z4rrN9LYWCV8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 05:14:26 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id BA12CAD00; Thu, 27 Nov 2014 13:14:25 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id F118181C69; Thu, 27 Nov 2014 14:14:21 +0100 (CET) Date: Thu, 27 Nov 2014 14:14:21 +0100 From: Jan Kara To: Theodore Ts'o Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-ID: <20141127131421.GE30152@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-3-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416997437-26092-3-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417094066 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 26-11-14 05:23:52, Ted Tso wrote: > Add a new mount option which enables a new "lazytime" mode. This mode > causes atime, mtime, and ctime updates to only be made to the > in-memory version of the inode. The on-disk times will only get > updated when (a) if the inode needs to be updated for some non-time > related change, (b) if userspace calls fsync(), syncfs() or sync(), or > (c) just before an undeleted inode is evicted from memory. > > This is OK according to POSIX because there are no guarantees after a > crash unless userspace explicitly requests via a fsync(2) call. > > For workloads which feature a large number of random write to a > preallocated file, the lazytime mount option significantly reduces > writes to the inode table. The repeated 4k writes to a single block > will result in undesirable stress on flash devices and SMR disk > drives. Even on conventional HDD's, the repeated writes to the inode > table block will trigger Adjacent Track Interference (ATI) remediation > latencies, which very negatively impact 99.9 percentile latencies --- > which is a very big deal for web serving tiers (for example). So this looks better to me than previous versions but I'm still not 100% happy :) Looking into the code & your patch I'd prefer to do something like: * add support for I_DIRTY_TIME in __mark_inode_dirty() - update_time will call __mark_inode_dirty() with this flag if any of the times was updated. That way we can just remove your ->write_time() callback - filesystems can just handle this in their ->dirty_inode() methods if they wish. __mark_inode_dirty() will take care of moving inode into proper writeback list (i_dirty / i_dirty_time), dirtied_when will be set to current time. * change queue_io() to also call moved += move_expired_inodes(&wb->b_dirty_time, &wb->b_io, time + 24hours) For this you need to tweak move_expired_inodes() to take pointer to timestamp instead of pointer to work but that's trivial. Also you want probably leave time ->older_than_this value (i.e. without +24 hours) if we are doing WB_SYNC_ALL writeback. With this you can remove flush_sb_dirty_time() completely. * Changes for iput() & fsync stay as they are. And this should be all that's necessary. I'm not 100% sure about your dirty bits naming changes - let's see how that will look like when the above more substantial changes are done. One technical detail below: > diff --git a/fs/inode.c b/fs/inode.c > index 8f5c4b5..9e464cc 100644 > --- a/fs/inode.c > +++ b/fs/inode.c > @@ -1430,11 +1430,22 @@ static void iput_final(struct inode *inode) > */ > void iput(struct inode *inode) > { > - if (inode) { > - BUG_ON(inode->i_state & I_CLEAR); > - > - if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock)) > - iput_final(inode); > + if (!inode) > + return; > + BUG_ON(inode->i_state & I_CLEAR); I think we can better handle this without retry at this place like: if (atomic_read(&inode->i_count) == 1 && inode->i_nlink && (inode->i_state & I_DIRTY_TIME)) { if (inode->i_op->write_time) inode->i_op->write_time(inode); else if (inode->i_sb->s_op->write_inode) mark_inode_dirty_sync(inode); } Sure it will be one more read of i_count in the fast path but that's IMO negligible. BTW: Is the test for ->write_inode really needed? We don't do it e.g. in update_time(). > +retry: > + if (atomic_dec_and_lock(&inode->i_count, &inode->i_lock)) { > + if (inode->i_nlink && (inode->i_state & I_DIRTY_TIME)) { > + atomic_inc(&inode->i_count); > + inode->i_state &= ~I_DIRTY_TIME; > + spin_unlock(&inode->i_lock); > + if (inode->i_op->write_time) > + inode->i_op->write_time(inode); > + else if (inode->i_sb->s_op->write_inode) > + mark_inode_dirty_sync(inode); > + goto retry; > + } > + iput_final(inode); > } > } > EXPORT_SYMBOL(iput); Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Nov 27 07:27:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9EFC27F4E for ; Thu, 27 Nov 2014 07:27:59 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 39B79AC003 for ; Thu, 27 Nov 2014 05:27:59 -0800 (PST) X-ASG-Debug-ID: 1417094876-04bdf061619b3a70001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 4U8xFk6SW7R3Tah4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 05:27:57 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 13CB9AB07; Thu, 27 Nov 2014 13:27:55 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 3EE8F81C69; Thu, 27 Nov 2014 14:27:52 +0100 (CET) Date: Thu, 27 Nov 2014 14:27:52 +0100 From: Jan Kara To: Dave Chinner Cc: Andreas Dilger , Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141127132752.GF30152@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> <20141126233537.GH9561@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141126233537.GH9561@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417094877 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 27-11-14 10:35:37, Dave Chinner wrote: > On Wed, Nov 26, 2014 at 04:10:44PM -0700, Andreas Dilger wrote: > > On Nov 26, 2014, at 3:48 PM, Dave Chinner wrote: > > > > > > On Wed, Nov 26, 2014 at 05:23:56AM -0500, Theodore Ts'o wrote: > > >> Add an optimization for the MS_LAZYTIME mount option so that we will > > >> opportunistically write out any inodes with the I_DIRTY_TIME flag set > > >> in a particular inode table block when we need to update some inode > > >> in that inode table block anyway. > > >> > > >> Also add some temporary code so that we can set the lazytime mount > > >> option without needing a modified /sbin/mount program which can set > > >> MS_LAZYTIME. We can eventually make this go away once util-linux has > > >> added support. > > >> > > >> Google-Bug-Id: 18297052 > > >> > > >> Signed-off-by: Theodore Ts'o > > >> --- > > >> fs/ext4/inode.c | 49 ++++++++++++++++++++++++++++++++++++++++++--- > > >> fs/ext4/super.c | 9 +++++++++ > > >> include/trace/events/ext4.h | 30 +++++++++++++++++++++++++++ > > >> 3 files changed, 85 insertions(+), 3 deletions(-) > > >> > > >> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > > >> index 5653fa4..8308c82 100644 > > >> --- a/fs/ext4/inode.c > > >> +++ b/fs/ext4/inode.c > > >> @@ -4140,6 +4140,51 @@ static int ext4_inode_blocks_set(handle_t *handle, > > >> } > > >> > > >> /* > > >> + * Opportunistically update the other time fields for other inodes in > > >> + * the same inode table block. > > >> + */ > > >> +static void ext4_update_other_inodes_time(struct super_block *sb, > > >> + unsigned long orig_ino, char *buf) > > >> +{ > > >> + struct ext4_inode_info *ei; > > >> + struct ext4_inode *raw_inode; > > >> + unsigned long ino; > > >> + struct inode *inode; > > >> + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; > > >> + int inode_size = EXT4_INODE_SIZE(sb); > > >> + > > >> + ino = orig_ino & ~(inodes_per_block - 1); > > >> + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { > > >> + if (ino == orig_ino) > > >> + continue; > > >> + inode = find_active_inode_nowait(sb, ino); > > >> + if (!inode || > > >> + (inode->i_state & I_DIRTY_TIME) == 0 || > > >> + !spin_trylock(&inode->i_lock)) { > > >> + iput(inode); > > >> + continue; > > >> + } > > >> + inode->i_state &= ~I_DIRTY_TIME; > > >> + inode->i_ts_dirty_day = 0; > > >> + spin_unlock(&inode->i_lock); > > >> + inode_requeue_dirtytime(inode); > > >> + > > >> + ei = EXT4_I(inode); > > >> + raw_inode = (struct ext4_inode *) buf; > > >> + > > >> + spin_lock(&ei->i_raw_lock); > > >> + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); > > >> + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); > > >> + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); > > >> + ext4_inode_csum_set(inode, raw_inode, ei); > > >> + spin_unlock(&ei->i_raw_lock); > > >> + trace_ext4_other_inode_update_time(inode, orig_ino); > > >> + iput(inode); > > >> + } > > >> +} > > > > > > Am I right in that this now does unlogged timestamp updates of > > > inodes? What happens when that buffer gets overwritten by log > > > recover after a crash? The timestamp updates get lost? > > > > > > FYI, XFS has had all sorts of nasty log recovery corner cases > > > caused by log recovery overwriting non-logged inode updates like > > > this. In the past few years we've removed every single non-logged > > > inode update "optimisation" so that all changes (including timestamps) > > > are transactional so inode state on disk not matching what log > > > recovery wrote to disk for all the other inode metadata... > > > > > > Optimistic unlogged inode updates are a slippery slope, and history > > > tells me that it doesn't lead to a nice place.... > > > > Since ext4/jbd2 is logging the whole block, unlike XFS which is doing > > logical journaling, this isn't an unlogged update. It is just taking > > advantage of the fact that the whole block is going to be logged and > > written to the disk anyway. > > Urk - that's worse, isn't it? i.e the code above calls iput() from > within a current transaction context? What happens if that drops > the last reference to the inode and it gets evicted due to racing > with an unlink? Won't that try to start another transaction to free > the inode (i.e. through ext4_evict_inode())? Yeah, the patch looks buggy (and racy wrt concurrent updates of time stamps as well). I think if we want to do this optimization, we would need a function like "clear inode dirty bits for this range of inode numbers". That is doable atomically within VFS and although it looks somewhat ugly, the performance -- Jan Kara SUSE Labs, CR From jack@suse.cz Thu Nov 27 07:32:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EE0667F4E for ; Thu, 27 Nov 2014 07:32:36 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DCA518F8052 for ; Thu, 27 Nov 2014 05:32:33 -0800 (PST) X-ASG-Debug-ID: 1417095150-04cb6c057282c830001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id RSFVAFv8I6LY2Xkd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 05:32:31 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B0615AD06; Thu, 27 Nov 2014 13:32:30 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 21B2E81C69; Thu, 27 Nov 2014 14:32:27 +0100 (CET) Date: Thu, 27 Nov 2014 14:32:27 +0100 From: Jan Kara To: Dave Chinner Cc: Andreas Dilger , Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141127133227.GA11872@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> <20141126233537.GH9561@dastard> <20141127132752.GF30152@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127132752.GF30152@quack.suse.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417095151 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 27-11-14 14:27:52, Jan Kara wrote: > On Thu 27-11-14 10:35:37, Dave Chinner wrote: > > On Wed, Nov 26, 2014 at 04:10:44PM -0700, Andreas Dilger wrote: > > > On Nov 26, 2014, at 3:48 PM, Dave Chinner wrote: > > > > > > > > On Wed, Nov 26, 2014 at 05:23:56AM -0500, Theodore Ts'o wrote: > > > >> Add an optimization for the MS_LAZYTIME mount option so that we will > > > >> opportunistically write out any inodes with the I_DIRTY_TIME flag set > > > >> in a particular inode table block when we need to update some inode > > > >> in that inode table block anyway. > > > >> > > > >> Also add some temporary code so that we can set the lazytime mount > > > >> option without needing a modified /sbin/mount program which can set > > > >> MS_LAZYTIME. We can eventually make this go away once util-linux has > > > >> added support. > > > >> > > > >> Google-Bug-Id: 18297052 > > > >> > > > >> Signed-off-by: Theodore Ts'o > > > >> --- > > > >> fs/ext4/inode.c | 49 ++++++++++++++++++++++++++++++++++++++++++--- > > > >> fs/ext4/super.c | 9 +++++++++ > > > >> include/trace/events/ext4.h | 30 +++++++++++++++++++++++++++ > > > >> 3 files changed, 85 insertions(+), 3 deletions(-) > > > >> > > > >> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > > > >> index 5653fa4..8308c82 100644 > > > >> --- a/fs/ext4/inode.c > > > >> +++ b/fs/ext4/inode.c > > > >> @@ -4140,6 +4140,51 @@ static int ext4_inode_blocks_set(handle_t *handle, > > > >> } > > > >> > > > >> /* > > > >> + * Opportunistically update the other time fields for other inodes in > > > >> + * the same inode table block. > > > >> + */ > > > >> +static void ext4_update_other_inodes_time(struct super_block *sb, > > > >> + unsigned long orig_ino, char *buf) > > > >> +{ > > > >> + struct ext4_inode_info *ei; > > > >> + struct ext4_inode *raw_inode; > > > >> + unsigned long ino; > > > >> + struct inode *inode; > > > >> + int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; > > > >> + int inode_size = EXT4_INODE_SIZE(sb); > > > >> + > > > >> + ino = orig_ino & ~(inodes_per_block - 1); > > > >> + for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { > > > >> + if (ino == orig_ino) > > > >> + continue; > > > >> + inode = find_active_inode_nowait(sb, ino); > > > >> + if (!inode || > > > >> + (inode->i_state & I_DIRTY_TIME) == 0 || > > > >> + !spin_trylock(&inode->i_lock)) { > > > >> + iput(inode); > > > >> + continue; > > > >> + } > > > >> + inode->i_state &= ~I_DIRTY_TIME; > > > >> + inode->i_ts_dirty_day = 0; > > > >> + spin_unlock(&inode->i_lock); > > > >> + inode_requeue_dirtytime(inode); > > > >> + > > > >> + ei = EXT4_I(inode); > > > >> + raw_inode = (struct ext4_inode *) buf; > > > >> + > > > >> + spin_lock(&ei->i_raw_lock); > > > >> + EXT4_INODE_SET_XTIME(i_ctime, inode, raw_inode); > > > >> + EXT4_INODE_SET_XTIME(i_mtime, inode, raw_inode); > > > >> + EXT4_INODE_SET_XTIME(i_atime, inode, raw_inode); > > > >> + ext4_inode_csum_set(inode, raw_inode, ei); > > > >> + spin_unlock(&ei->i_raw_lock); > > > >> + trace_ext4_other_inode_update_time(inode, orig_ino); > > > >> + iput(inode); > > > >> + } > > > >> +} > > > > > > > > Am I right in that this now does unlogged timestamp updates of > > > > inodes? What happens when that buffer gets overwritten by log > > > > recover after a crash? The timestamp updates get lost? > > > > > > > > FYI, XFS has had all sorts of nasty log recovery corner cases > > > > caused by log recovery overwriting non-logged inode updates like > > > > this. In the past few years we've removed every single non-logged > > > > inode update "optimisation" so that all changes (including timestamps) > > > > are transactional so inode state on disk not matching what log > > > > recovery wrote to disk for all the other inode metadata... > > > > > > > > Optimistic unlogged inode updates are a slippery slope, and history > > > > tells me that it doesn't lead to a nice place.... > > > > > > Since ext4/jbd2 is logging the whole block, unlike XFS which is doing > > > logical journaling, this isn't an unlogged update. It is just taking > > > advantage of the fact that the whole block is going to be logged and > > > written to the disk anyway. > > > > Urk - that's worse, isn't it? i.e the code above calls iput() from > > within a current transaction context? What happens if that drops > > the last reference to the inode and it gets evicted due to racing > > with an unlink? Won't that try to start another transaction to free > > the inode (i.e. through ext4_evict_inode())? > Yeah, the patch looks buggy (and racy wrt concurrent updates of time > stamps as well). I think if we want to do this optimization, we would need > a function like "clear inode dirty bits for this range of inode numbers". > That is doable atomically within VFS and although it looks somewhat ugly, > the performance Sorry, I sent this too early (did send instead of postpone). So the patch looks buggy because of iput() but it isn't racy wrt time updates as I checked now. So it would be enough to move calling of this outside of the transaction and start new handle for each inode. Honza -- Jan Kara SUSE Labs, CR From raja@where2getit.com Thu Nov 27 08:30:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 88B6A7F4E for ; Thu, 27 Nov 2014 08:30:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66C8A8F8059 for ; Thu, 27 Nov 2014 06:30:07 -0800 (PST) X-ASG-Debug-ID: 1417098605-04cb6c0573833d20001-NocioJ Received: from exprod7og119.obsmtp.com (exprod7og119.obsmtp.com [64.18.2.16]) by cuda.sgi.com with SMTP id 2gY7QIHHu4dHMTvK for ; Thu, 27 Nov 2014 06:30:05 -0800 (PST) X-Barracuda-Envelope-From: raja@where2getit.com X-Barracuda-RBL-Trusted-Forwarder: 64.18.2.16 Received: from mail-ob0-f178.google.com ([209.85.214.178]) (using TLSv1) by exprod7ob119.postini.com ([64.18.6.12]) with SMTP ID DSNKVHc1bak8eaOzeDtanMTU7lHhjR/v17ZU@postini.com; Thu, 27 Nov 2014 06:30:06 PST Received: by mail-ob0-f178.google.com with SMTP id gq1so3790287obb.23 for ; Thu, 27 Nov 2014 06:30:05 -0800 (PST) X-Barracuda-Apparent-Source-IP: 209.85.214.178 X-Barracuda-BBL-IP: 209.85.214.178 X-Barracuda-RBL-IP: 209.85.214.178 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=lu3OfEBpv18UORoBr5qkwt/Vb/7Jozeic8uKpb+yEPU=; b=cB/LDv0ekq6Hbabz3kTQ8TTVATSQQptFIwoGk1BpZaff8CLG4fsXcBLiIcVei3PJ4J tkcCt6EbTsCi6jDEd5WVZO3Y7VUUeMUxK9GZiSDTlZ94RG1FCRXw4rMU2rG/8Eu87xSs RDxiYxXXjPzDVOHcGsR30+FwvGUOjIX/soeqq0FWucuvhpeZA/mYvwc6X9IFxC0EEZo0 FI5/nBgshVRlhIBH2aEH/ed41fvkgZk0Kpcy3xJ4ZvefUzcYl1WGSsFNyapjf5PFs+KI 5JZauarUPEaHn1GYf9AUvj4JqG9KpAAi4aNdrtyw+POuANMZXJujDTqZPbh8bFVCx073 wI8g== X-Gm-Message-State: ALoCoQn23yETIuRV+brt1T8WGUTw+QbQDDv9QBwGG8g0WqjOG33JUVZnkLAURn4eYz4kAlGVr4BmtLu4f/otD7Qc3js0esmQyzrt+Lc7VNOceUEXfAyvtMY4aHg4a63KmZ2Yo5QfNC2Cvfx0a1GZ3KVZ3/XekM9SUg== X-Received: by 10.60.132.142 with SMTP id ou14mr23392181oeb.73.1417098605415; Thu, 27 Nov 2014 06:30:05 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.60.132.142 with SMTP id ou14mr23392117oeb.73.1417098599188; Thu, 27 Nov 2014 06:29:59 -0800 (PST) Received: by 10.202.227.194 with HTTP; Thu, 27 Nov 2014 06:29:59 -0800 (PST) Date: Thu, 27 Nov 2014 19:59:59 +0530 Message-ID: Subject: OS Upgrade Considerations For XFS Volume From: Bharathiraja P X-ASG-Orig-Subj: OS Upgrade Considerations For XFS Volume To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b4724a29e05870508d7fa8a X-Barracuda-Connect: exprod7og119.obsmtp.com[64.18.2.16] X-Barracuda-Start-Time: 1417098605 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b4724a29e05870508d7fa8a Content-Type: text/plain; charset=UTF-8 Hi there, We recently upgraded our database system from OpenSuSE-11.4 to OpenSuSE-13.1 Post the upgrade we are noticing load spikes on our database system. OpenSuSE 11.4 uses kernel-2.6.37 and OpenSuSE-13.1 uses kernel-3.11.10 There seems to be some changes related to XFS in new kernel and I'm getting this error when I run xfs_logprint ============== sudo /usr/sbin/xfs_logprint /dev/mapper/pgsql-data raja's password: xfs_logprint: xfs_logprint: /dev/mapper/pgsql-data contains a mounted and writable filesystem data device: 0xfd00 log device: 0xfd00 daddr: 6442450880 length: 4173824 cycle: 879 version: 2 lsn: 879,3707616 tail_lsn: 879,3666528 length of Log Record: 32256 prev offset: 3707552 num ops: 120 uuid: 314e5417-3787-476d-9ee3-22a81732cb67 format: little endian linux h_size: 32768 ---------------------------------------------------------------------------- Oper (0): tid: f8163d32 len: 112 clientid: TRANS flags: WAS_CONT END Left over region from split log item ---------------------------------------------------------------------------- Oper (1): tid: f8163d32 len: 1664 clientid: TRANS flags: none xfs_logprint: unknown log operation type (b001) ********************************************************************** * ERROR: data block=3707616 * ********************************************************************** Bad data in log ============== Do we need to do something for the xfs volume post os upgrade for better performance? -- Bharathiraja --047d7b4724a29e05870508d7fa8a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hi there,

We re= cently upgraded our database system from OpenSuSE-11.4 to OpenSuSE-13.1
=
Post the upgrade we are noticing load spikes on our database syst= em.

OpenSuSE 11.4 uses kernel-2.6.37 and OpenSuSE-13.1 uses ke= rnel-3.11.10

There seems to be some changes related to XFS in = new kernel and I'm getting this error when I run xfs_logprint

= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
sudo /usr/sbin/xfs_logprint /= dev/mapper/pgsql-data
raja's password:
xfs_logprint:
xfs_logp= rint: /dev/mapper/pgsql-data contains a mounted and writable filesystem
= =C2=A0=C2=A0=C2=A0 data device: 0xfd00
=C2=A0=C2=A0=C2=A0 log device: 0x= fd00 daddr: 6442450880 length: 4173824

cycle: 879=C2=A0=C2=A0=C2=A0 = version: 2=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 lsn: 879,3707616=C2=A0=C2= =A0=C2=A0 tail_lsn: 879,3666528
length of Log Record: 32256=C2=A0=C2=A0= =C2=A0 prev offset: 3707552=C2=A0=C2=A0=C2=A0 =C2=A0=C2=A0=C2=A0 num ops: 1= 20
uuid: 314e5417-3787-476d-9ee3-22a81732cb67=C2=A0=C2=A0 format: little= endian linux
h_size: 32768
-----------------------------------------= -----------------------------------
Oper (0): tid: f8163d32=C2=A0 len: 1= 12=C2=A0 clientid: TRANS=C2=A0 flags: WAS_CONT END
Left over region fro= m split log item
-------------------------------------------------------= ---------------------
Oper (1): tid: f8163d32=C2=A0 len: 1664=C2=A0 clie= ntid: TRANS=C2=A0 flags: none
xfs_logprint: unknown log operation type (= b001)
******************************************************************= ****
* ERROR: data block=3D3707616=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *
***= *******************************************************************
Bad = data in log
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D


= Do we need to do something for the xfs volume post os upgrade for better pe= rformance?

--
Bharathiraja
--047d7b4724a29e05870508d7fa8a-- From tytso@thunk.org Thu Nov 27 08:41:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 838617F4E for ; Thu, 27 Nov 2014 08:41:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 610358F8050 for ; Thu, 27 Nov 2014 06:41:26 -0800 (PST) X-ASG-Debug-ID: 1417099283-04bdf0615f9ba130001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id jhjnZHh7f7MpC3GL (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 06:41:23 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=JIIRaXgsxl7G7rc1SC7NSiwRNwx1Nrv5Tt7T7paLJbw=; b=b9VsGsTNX+jfX7SqjXcJJXD4tmNE/1b0reLDi/SBW8ZkSR7xbTOOQB+CrOPaTy3HSavQGXKZU3K8TbrTVxPZe3boH8ubhULvhFimm1hr1cKx/RPqfJWflJcDbPsiWmAG0nyvEFPhN62Fajf0Rddh+sLXg0de2hvP7z9lbX7kGK8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu0Fz-0007W7-25; Thu, 27 Nov 2014 14:41:19 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id BB6FB5809A3; Thu, 27 Nov 2014 09:41:16 -0500 (EST) Date: Thu, 27 Nov 2014 09:41:16 -0500 From: Theodore Ts'o To: Christoph Hellwig Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127144116.GA14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141126192328.GA20436@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417099283 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Wed, Nov 26, 2014 at 11:23:28AM -0800, Christoph Hellwig wrote: > As mentioned last round please move the addition of the is_readonly > operation to the first thing in the series, so that the ordering makes > more sense. OK, will fix. > Second I think this patch is incorrect for XFS - XFS uses ->update_time > to set the time stampst in the dinode. These two need to be coherent > as we can write out a dirty inode any time, so it needs to have the > timestamp uptodate. > > Third update_time now calls mark_inode_dirty unconditionally, while > previously it wasn't called when ->update_time was set. At least > for XFS that's a major change in behavior as XFS never used VFS dirty > tracking for metadata updates. Thanks, I'll fix both of the above. - Ted From BATV+655c0bdf523a347a657e+4113+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 27 09:25:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D1BE47F4E for ; Thu, 27 Nov 2014 09:25:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B12288F8049 for ; Thu, 27 Nov 2014 07:25:07 -0800 (PST) X-ASG-Debug-ID: 1417101906-04bdf061619bbbc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 2wg4NWhe4I50FKgT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 07:25:06 -0800 (PST) X-Barracuda-Envelope-From: BATV+655c0bdf523a347a657e+4113+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xu0wK-00055n-3h; Thu, 27 Nov 2014 15:25:04 +0000 Date: Thu, 27 Nov 2014 07:25:04 -0800 From: Christoph Hellwig To: Jan Kara Cc: Theodore Ts'o , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127152504.GA15839@infradead.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> <20141127123429.GD30152@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127123429.GD30152@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1417101906 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Nov 27, 2014 at 01:34:29PM +0100, Jan Kara wrote: > But Ted changed XFS to copy timestamps to on-disk structure from the > in-memory inode fields after VFS updated the timestamps. So the stamps > should be coherent AFAICT, shouldn't they? Not coherent enough. We need the XFS ilock to synchronize reading from and writing to the time stamps. update_time() only has i_mutex, which we can't take for the transaction commit path. From tytso@thunk.org Thu Nov 27 09:25:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 079EF7F4E for ; Thu, 27 Nov 2014 09:25:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD34930405F for ; Thu, 27 Nov 2014 07:25:35 -0800 (PST) X-ASG-Debug-ID: 1417101933-04bdf061619bbc60001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id kmVDoAZkb1Y3A8RJ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 07:25:33 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=dTEnKfxrdmm4V0lSWCzRCzO3Y7i66LO/A+tzlwyhRy4=; b=m4avSVJvb9iMF6TH3gJdTyIgfwfy606Lk8X4GnQiPM6isQOE5vgs8S1rEBBtq+FrLtiOT0t1Qvyas6743VH6EbMpWu8CKWVmYFNwdQLhXKk/SW/CPUhGR7m8geevnT9/5CTgI8p5011o2yaPIozYP8XDOwckbTU+4EmM3DACly8=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu0wl-0007vV-Oz; Thu, 27 Nov 2014 15:25:31 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 904E15809A3; Thu, 27 Nov 2014 10:25:24 -0500 (EST) Date: Thu, 27 Nov 2014 10:25:24 -0500 From: Theodore Ts'o To: Jan Kara Cc: Dave Chinner , Andreas Dilger , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141127152524.GB14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> <20141126233537.GH9561@dastard> <20141127132752.GF30152@quack.suse.cz> <20141127133227.GA11872@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127133227.GA11872@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417101933 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is what I'm currently playing with which I believe fixes the iput() problem. In fs/ext4/inode.c: struct other_inode { unsigned long orig_ino; struct ext4_inode *raw_inode; }; static int other_inode_match(struct inode * inode, unsigned long ino, void *data); /* * Opportunistically update the other time fields for other inodes in * the same inode table block. */ static void ext4_update_other_inodes_time(struct super_block *sb, unsigned long orig_ino, char *buf) { struct other_inode oi; unsigned long ino; int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; int inode_size = EXT4_INODE_SIZE(sb); oi.orig_ino = orig_ino; ino = orig_ino & ~(inodes_per_block - 1); for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { if (ino == orig_ino) continue; oi.raw_inode = (struct ext4_inode *) buf; (void) find_inode_nowait(sb, ino, other_inode_match, &oi); } } static int other_inode_match(struct inode * inode, unsigned long ino, void *data) { struct other_inode *oi = (struct other_inode *) data; if ((inode->i_ino != ino) || (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) || ((inode->i_state & I_DIRTY_TIME) == 0)) return 0; spin_lock(&inode->i_lock); if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) && (inode->i_state & I_DIRTY_TIME)) { struct ext4_inode_info *ei = EXT4_I(inode); inode->i_state &= ~I_DIRTY_TIME; inode->i_ts_dirty_day = 0; spin_unlock(&inode->i_lock); inode_requeue_dirtytime(inode); spin_lock(&ei->i_raw_lock); EXT4_INODE_SET_XTIME(i_ctime, inode, oi->raw_inode); EXT4_INODE_SET_XTIME(i_mtime, inode, oi->raw_inode); EXT4_INODE_SET_XTIME(i_atime, inode, oi->raw_inode); ext4_inode_csum_set(inode, oi->raw_inode, ei); spin_unlock(&ei->i_raw_lock); trace_ext4_other_inode_update_time(inode, oi->orig_ino); return -1; } spin_unlock(&inode->i_lock); return -1; } The above uses the following in fs/inode.c (which gets added instead of find_active_inode_nowait): /** * find_inode_nowait - find an inode in the inode cache * @sb: super block of file system to search * @hashval: hash value (usually inode number) to search for * @match: callback used for comparisons between inodes * @data: opaque data pointer to pass to @match * * Search for the inode specified by @hashval and @data in the inode * cache, where the helper function @match will return 0 if the inode * does not match, 1 if the inode does match, and -1 if the search * should be stopped. The @match function must be responsible for * taking the i_lock spin_lock and checking i_state for an inode being * freed or being initialized, and incrementing the reference count * before returning 1. It also must not sleep, since it is called with * the inode_hash_lock spinlock held. * * This is a even more generalized version of ilookup5() when the * function must never block --- find_inode() can block in * __wait_on_freeing_inode() --- or when the caller can not increment * the reference count because the resulting iput() might cause an * inode eviction(). The tradeoff is that the @match funtion must be * very carefully implemented. */ struct inode *find_inode_nowait(struct super_block *sb, unsigned long hashval, int (*match)(struct inode *, unsigned long, void *), void *data) { struct hlist_head *head = inode_hashtable + hash(sb, hashval); struct inode *inode, *ret_inode = NULL; int mval; spin_lock(&inode_hash_lock); hlist_for_each_entry(inode, head, i_hash) { if (inode->i_sb != sb) continue; mval = match(inode, hashval, data); if (mval == 0) continue; if (mval == 1) ret_inode = inode; goto out; } out: spin_unlock(&inode_hash_lock); return ret_inode; } EXPORT_SYMBOL(find_inode_nowait); Comments? - Ted From BATV+655c0bdf523a347a657e+4113+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 27 09:28:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0D4907F4E for ; Thu, 27 Nov 2014 09:28:48 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CF5EB8F8052 for ; Thu, 27 Nov 2014 07:28:47 -0800 (PST) X-ASG-Debug-ID: 1417102126-04bdf0615e9bc1c0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id ANaJIZ2OD3CaPHPT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 07:28:46 -0800 (PST) X-Barracuda-Envelope-From: BATV+655c0bdf523a347a657e+4113+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xu0zu-0007be-DT; Thu, 27 Nov 2014 15:28:46 +0000 Date: Thu, 27 Nov 2014 07:28:46 -0800 From: Christoph Hellwig To: Theodore Ts'o Cc: Christoph Hellwig , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127152846.GA24779@infradead.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> <20141127144116.GA14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127144116.GA14091@thunk.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1417102126 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS FYI, I suspect for now the best might be to let filesystems that define ->update_times work as-is and not tie them into the infrastructure. At least for XFS I suspect the lazy updates might better be handled internally, although I'm not entirely sure yet. From tytso@thunk.org Thu Nov 27 09:33:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A43DA7F4E for ; Thu, 27 Nov 2014 09:33:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 713648F804B for ; Thu, 27 Nov 2014 07:33:23 -0800 (PST) X-ASG-Debug-ID: 1417102401-04bdf0615f9bc530001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 1UutqJ7fwxleQQzC (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 07:33:21 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=GiBBmcsWsA8P4KR9/EqmZ4yZENMmegyqbSArYOhRl10=; b=R6nQpbDGuZoKDfJ2T4A1VIkV1X9DF2dbg2whUV8MEHf8pmXzKgY90Rvjd8hbLQRFxFu3L12jBjquNgzva4j6Wsyedl8TxVrrgObzeP6y60OpJHw8jZ5jFAeoC0ll3TbULWc9U2hlbfyoa4g+z6SMcJFX9OqODrGcRSL0A1u1sl4=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu14J-0007wx-1q; Thu, 27 Nov 2014 15:33:19 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id CB16E5809A3; Thu, 27 Nov 2014 10:33:15 -0500 (EST) Date: Thu, 27 Nov 2014 10:33:15 -0500 From: Theodore Ts'o To: Christoph Hellwig Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127153315.GC14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> <20141127144116.GA14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127144116.GA14091@thunk.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417102401 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Christoph, can you take a quick look at this? I'm not sure I got the xfs inode transaction logging correct. Thanks!! - Ted commit cd58addfa340c9cf88b1f9b2d31a42e2e65c7252 Author: Theodore Ts'o Date: Thu Nov 27 10:14:27 2014 -0500 vfs: split update_time() into update_time() and write_time() In preparation for adding support for the lazytime mount option, we need to be able to separate out the update_time() and write_time() inode operations. Previously, only btrfs and xfs uses update_time(). With this patch, btrfs only needs write_time(), and xfs uses update_time() to synchronize its on-disk and in-memory timestamps. Signed-off-by: Theodore Ts'o Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Acked-by: David Sterba diff --git a/include/linux/fs.h b/include/linux/fs.h index f4b0ecd..befd5d2 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1545,7 +1545,8 @@ struct inode_operations { int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); int (*is_readonly)(struct inode *); - int (*update_time)(struct inode *, struct timespec *, int); + void (*update_time)(struct inode *); + int (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); diff --git a/fs/inode.c b/fs/inode.c index 53f0173..94bc908 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1506,9 +1506,6 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) if (ret) return ret; } - if (inode->i_op->update_time) - return inode->i_op->update_time(inode, time, flags); - if (flags & S_ATIME) inode->i_atime = *time; if (flags & S_VERSION) @@ -1517,6 +1514,10 @@ static int update_time(struct inode *inode, struct timespec *time, int flags) inode->i_ctime = *time; if (flags & S_MTIME) inode->i_mtime = *time; + if (inode->i_op->update_time) + inode->i_op->update_time(inode); + if (inode->i_op->write_time) + return inode->i_op->write_time(inode); mark_inode_dirty_sync(inode); return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ec6dcdc..b69493d 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -983,42 +983,42 @@ xfs_vn_setattr( return error; } -STATIC int +STATIC void xfs_vn_update_time( - struct inode *inode, - struct timespec *now, - int flags) + struct inode *inode) +{ + struct xfs_inode *ip = XFS_I(inode); + + trace_xfs_update_time(ip); + xfs_ilock(ip, XFS_ILOCK_EXCL); + ip->i_d.di_ctime.t_sec = (__int32_t) inode->i_ctime.tv_sec; + ip->i_d.di_ctime.t_nsec = (__int32_t) inode->i_ctime.tv_nsec; + + ip->i_d.di_mtime.t_sec = (__int32_t)inode->i_mtime.tv_sec; + ip->i_d.di_mtime.t_nsec = (__int32_t) inode->i_mtime.tv_nsec; + + ip->i_d.di_atime.t_sec = (__int32_t) inode->i_atime.tv_sec; + ip->i_d.di_atime.t_nsec = (__int32_t) inode->i_atime.tv_nsec; + xfs_iunlock(ip, XFS_ILOCK_EXCL); +} + +STATIC int +xfs_vn_write_time( + struct inode *inode) { struct xfs_inode *ip = XFS_I(inode); struct xfs_mount *mp = ip->i_mount; struct xfs_trans *tp; int error; - trace_xfs_update_time(ip); - + trace_xfs_write_time(ip); tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_fsyncts, 0, 0); if (error) { xfs_trans_cancel(tp, 0); return error; } - xfs_ilock(ip, XFS_ILOCK_EXCL); - if (flags & S_CTIME) { - inode->i_ctime = *now; - ip->i_d.di_ctime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_ctime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_MTIME) { - inode->i_mtime = *now; - ip->i_d.di_mtime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_mtime.t_nsec = (__int32_t)now->tv_nsec; - } - if (flags & S_ATIME) { - inode->i_atime = *now; - ip->i_d.di_atime.t_sec = (__int32_t)now->tv_sec; - ip->i_d.di_atime.t_nsec = (__int32_t)now->tv_nsec; - } xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_TIMESTAMP); return xfs_trans_commit(tp, 0); @@ -1130,6 +1130,7 @@ static const struct inode_operations xfs_inode_operations = { .listxattr = xfs_vn_listxattr, .fiemap = xfs_vn_fiemap, .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; static const struct inode_operations xfs_dir_inode_operations = { @@ -1157,6 +1158,7 @@ static const struct inode_operations xfs_dir_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1185,6 +1187,7 @@ static const struct inode_operations xfs_dir_ci_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, .tmpfile = xfs_vn_tmpfile, }; @@ -1199,6 +1202,7 @@ static const struct inode_operations xfs_symlink_inode_operations = { .removexattr = generic_removexattr, .listxattr = xfs_vn_listxattr, .update_time = xfs_vn_update_time, + .write_time = xfs_vn_write_time, }; STATIC void diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 51372e3..09d261c 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -677,6 +677,7 @@ DEFINE_INODE_EVENT(xfs_file_fsync); DEFINE_INODE_EVENT(xfs_destroy_inode); DEFINE_INODE_EVENT(xfs_evict_inode); DEFINE_INODE_EVENT(xfs_update_time); +DEFINE_INODE_EVENT(xfs_write_time); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index b30753c..ee94a66 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -62,7 +62,8 @@ prototypes: ssize_t (*listxattr) (struct dentry *, char *, size_t); int (*removexattr) (struct dentry *, const char *); int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, u64 len); - void (*update_time)(struct inode *, struct timespec *, int); + void (*update_time)(struct inode *); + void (*write_time)(struct inode *); int (*atomic_open)(struct inode *, struct dentry *, struct file *, unsigned open_flag, umode_t create_mode, int *opened); @@ -95,6 +96,7 @@ listxattr: no removexattr: yes fiemap: no update_time: no +write_time: no atomic_open: yes tmpfile: no dentry_open: no diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index bd46a22..a81a0652 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -5563,26 +5563,8 @@ static int btrfs_is_readonly(struct inode *inode) return 0; } -/* - * This is a copy of file_update_time. We need this so we can return error on - * ENOSPC for updating the inode in the case of file write and mmap writes. - */ -static int btrfs_update_time(struct inode *inode, struct timespec *now, - int flags) +static int btrfs_write_time(struct inode *inode) { - struct btrfs_root *root = BTRFS_I(inode)->root; - - if (btrfs_root_readonly(root)) - return -EROFS; - - if (flags & S_VERSION) - inode_inc_iversion(inode); - if (flags & S_CTIME) - inode->i_ctime = *now; - if (flags & S_MTIME) - inode->i_mtime = *now; - if (flags & S_ATIME) - inode->i_atime = *now; return btrfs_dirty_inode(inode); } @@ -9471,7 +9453,7 @@ static const struct inode_operations btrfs_dir_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .is_readonly = btrfs_is_readonly, - .update_time = btrfs_update_time, + .write_time = btrfs_write_time, .tmpfile = btrfs_tmpfile, }; static const struct inode_operations btrfs_dir_ro_inode_operations = { @@ -9480,7 +9462,7 @@ static const struct inode_operations btrfs_dir_ro_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .is_readonly = btrfs_is_readonly, - .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct file_operations btrfs_dir_file_operations = { @@ -9551,7 +9533,7 @@ static const struct inode_operations btrfs_file_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .is_readonly = btrfs_is_readonly, - .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_special_inode_operations = { .getattr = btrfs_getattr, @@ -9564,7 +9546,7 @@ static const struct inode_operations btrfs_special_inode_operations = { .get_acl = btrfs_get_acl, .set_acl = btrfs_set_acl, .is_readonly = btrfs_is_readonly, - .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; static const struct inode_operations btrfs_symlink_inode_operations = { .readlink = generic_readlink, @@ -9578,7 +9560,7 @@ static const struct inode_operations btrfs_symlink_inode_operations = { .listxattr = btrfs_listxattr, .removexattr = btrfs_removexattr, .is_readonly = btrfs_is_readonly, - .update_time = btrfs_update_time, + .write_time = btrfs_write_time, }; const struct dentry_operations btrfs_dentry_operations = { From jack@suse.cz Thu Nov 27 09:42:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 238B07F4E for ; Thu, 27 Nov 2014 09:42:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F173304039 for ; Thu, 27 Nov 2014 07:42:05 -0800 (PST) X-ASG-Debug-ID: 1417102923-04cbb01e5c8078d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id tFoQfLRZERGEbqRn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 07:42:04 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 0ADF6AC64; Thu, 27 Nov 2014 15:42:03 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 5F57D81C69; Thu, 27 Nov 2014 16:41:59 +0100 (CET) Date: Thu, 27 Nov 2014 16:41:59 +0100 From: Jan Kara To: Theodore Ts'o Cc: Jan Kara , Dave Chinner , Andreas Dilger , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141127154159.GA11922@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> <20141126233537.GH9561@dastard> <20141127132752.GF30152@quack.suse.cz> <20141127133227.GA11872@quack.suse.cz> <20141127152524.GB14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127152524.GB14091@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417102923 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 27-11-14 10:25:24, Ted Tso wrote: > This is what I'm currently playing with which I believe fixes the iput() > problem. In fs/ext4/inode.c: > > struct other_inode { > unsigned long orig_ino; > struct ext4_inode *raw_inode; > }; > static int other_inode_match(struct inode * inode, unsigned long ino, > void *data); > > /* > * Opportunistically update the other time fields for other inodes in > * the same inode table block. > */ > static void ext4_update_other_inodes_time(struct super_block *sb, > unsigned long orig_ino, char *buf) > { > struct other_inode oi; > unsigned long ino; > int i, inodes_per_block = EXT4_SB(sb)->s_inodes_per_block; > int inode_size = EXT4_INODE_SIZE(sb); > > oi.orig_ino = orig_ino; > ino = orig_ino & ~(inodes_per_block - 1); > for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) { > if (ino == orig_ino) > continue; > oi.raw_inode = (struct ext4_inode *) buf; > (void) find_inode_nowait(sb, ino, other_inode_match, &oi); > } > } > > static int other_inode_match(struct inode * inode, unsigned long ino, > void *data) > { > struct other_inode *oi = (struct other_inode *) data; > > if ((inode->i_ino != ino) || > (inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) || > ((inode->i_state & I_DIRTY_TIME) == 0)) > return 0; > spin_lock(&inode->i_lock); > if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW)) == 0) && > (inode->i_state & I_DIRTY_TIME)) { > struct ext4_inode_info *ei = EXT4_I(inode); > > inode->i_state &= ~I_DIRTY_TIME; > inode->i_ts_dirty_day = 0; > spin_unlock(&inode->i_lock); > inode_requeue_dirtytime(inode); > > spin_lock(&ei->i_raw_lock); > EXT4_INODE_SET_XTIME(i_ctime, inode, oi->raw_inode); > EXT4_INODE_SET_XTIME(i_mtime, inode, oi->raw_inode); > EXT4_INODE_SET_XTIME(i_atime, inode, oi->raw_inode); > ext4_inode_csum_set(inode, oi->raw_inode, ei); > spin_unlock(&ei->i_raw_lock); > trace_ext4_other_inode_update_time(inode, oi->orig_ino); > return -1; > } > spin_unlock(&inode->i_lock); > return -1; > } Hum, but this puts lots of stuff under inode_hash_lock, including writeback list lock. I don't like this too much. I understand that getting handle for each inode is rather more CPU intensive but it should still be a clear win over the current situation and avoids entangling locks like this. Honza > The above uses the following in fs/inode.c (which gets added instead of > find_active_inode_nowait): > > /** > * find_inode_nowait - find an inode in the inode cache > * @sb: super block of file system to search > * @hashval: hash value (usually inode number) to search for > * @match: callback used for comparisons between inodes > * @data: opaque data pointer to pass to @match > * > * Search for the inode specified by @hashval and @data in the inode > * cache, where the helper function @match will return 0 if the inode > * does not match, 1 if the inode does match, and -1 if the search > * should be stopped. The @match function must be responsible for > * taking the i_lock spin_lock and checking i_state for an inode being > * freed or being initialized, and incrementing the reference count > * before returning 1. It also must not sleep, since it is called with > * the inode_hash_lock spinlock held. > * > * This is a even more generalized version of ilookup5() when the > * function must never block --- find_inode() can block in > * __wait_on_freeing_inode() --- or when the caller can not increment > * the reference count because the resulting iput() might cause an > * inode eviction(). The tradeoff is that the @match funtion must be > * very carefully implemented. > */ > struct inode *find_inode_nowait(struct super_block *sb, > unsigned long hashval, > int (*match)(struct inode *, unsigned long, > void *), > void *data) > { > struct hlist_head *head = inode_hashtable + hash(sb, hashval); > struct inode *inode, *ret_inode = NULL; > int mval; > > spin_lock(&inode_hash_lock); > hlist_for_each_entry(inode, head, i_hash) { > if (inode->i_sb != sb) > continue; > mval = match(inode, hashval, data); > if (mval == 0) > continue; > if (mval == 1) > ret_inode = inode; > goto out; > } > out: > spin_unlock(&inode_hash_lock); > return ret_inode; > } > EXPORT_SYMBOL(find_inode_nowait); > > Comments? > > - Ted -- Jan Kara SUSE Labs, CR From BATV+655c0bdf523a347a657e+4113+infradead.org+hch@bombadil.srs.infradead.org Thu Nov 27 10:49:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A81A7F4E for ; Thu, 27 Nov 2014 10:49:59 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A2009AC003 for ; Thu, 27 Nov 2014 08:49:55 -0800 (PST) X-ASG-Debug-ID: 1417106993-04cbb01e5a813500001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id Gow4tpqfKbahqfqc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Nov 2014 08:49:54 -0800 (PST) X-Barracuda-Envelope-From: BATV+655c0bdf523a347a657e+4113+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xu2GO-0004Q0-TM; Thu, 27 Nov 2014 16:49:52 +0000 Date: Thu, 27 Nov 2014 08:49:52 -0800 From: Christoph Hellwig To: Theodore Ts'o Cc: Christoph Hellwig , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127164952.GA1622@infradead.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> <20141127144116.GA14091@thunk.org> <20141127153315.GC14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127153315.GC14091@thunk.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1417106994 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12125 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS I don't think this scheme works well. As mentioned earlier XFS doesn't even use vfs dirty tracking at the moment, so introducing this in a hidden way sounds like a bad idea. Probably the same for btrfs. I'd rather keep update_time as-is for now, don't add ->write_time and let btrfs and XFS figure out how to implement the semantics on their own. From tytso@thunk.org Thu Nov 27 14:13:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C6FED7F4E for ; Thu, 27 Nov 2014 14:13:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B5BAF8F8035 for ; Thu, 27 Nov 2014 12:13:23 -0800 (PST) X-ASG-Debug-ID: 1417119201-04cb6c057085ef80001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id 4kB61SyW41GJDWe1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 12:13:21 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=Dr5VIJ12LTt8MH9Uz8w1PrTeDGh6BOAz8aueFfHhZIM=; b=l6ASwwAQ9+f/1OpPssiTLH/lxtVRE1yxjiQh13WpxY9NJxNLmnG9tI5eQmdRJKnMecXF5b30fwuByoRdADW5snbbdtVOyXDl0Cj1HjEmOrww1qRAsBsGm49ocbFwgGl6D+C2xK43EVgFZRacHBmxnAUBRdVgMG1+CSnRhvUHnaU=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu5RH-0001YN-5s; Thu, 27 Nov 2014 20:13:19 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 8B10D5809A3; Thu, 27 Nov 2014 15:13:16 -0500 (EST) Date: Thu, 27 Nov 2014 15:13:16 -0500 From: Theodore Ts'o To: Jan Kara Cc: Dave Chinner , Andreas Dilger , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option Message-ID: <20141127201316.GE14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 6/7] ext4: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-7-git-send-email-tytso@mit.edu> <20141126224843.GG9561@dastard> <1A106262-D64C-4493-856F-AAAFC3BE2647@dilger.ca> <20141126233537.GH9561@dastard> <20141127132752.GF30152@quack.suse.cz> <20141127133227.GA11872@quack.suse.cz> <20141127152524.GB14091@thunk.org> <20141127154159.GA11922@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127154159.GA11922@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417119201 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12130 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Nov 27, 2014 at 04:41:59PM +0100, Jan Kara wrote: > Hum, but this puts lots of stuff under inode_hash_lock, including > writeback list lock. I don't like this too much. I understand that getting > handle for each inode is rather more CPU intensive but it should still be a > clear win over the current situation and avoids entangling locks like this. Hmm, if we dropped the inode_requeue_dirtytime(), then we can avoid taking the writeback list lock. The net result is that we would have some inodes still on the b_dirty_time list that were no longer I_DIRTY_TIME, but since I_DIRTY_TIME wouldn't be set, it's mostly harmless since when we do iterate over the b_dirty_time list, those inodes can be quickly identified and skipped over. (And if the inode ever gets dirtied for real, then it will get moved onto the b_dirty list and that will be that.) The problem with getting a handle on the inode is not just that it is more CPU intensive, but that can't let the iput_final() call happen until after we have finished the transaction handle. We could keep a linked list of inodes attached to the handle, and then only call iput on them once ext4_journal_stop(handle) gets called, but that's a complication I'd like to avoid if at all possible. Being able to opporunistically write the timestamps when we are journalling an inode table block is a pretty big win, so if we end up extending the hold time on inode_hash_lock (only when we come across a I_DIRTY_TIME inode that we can clear) a tiny bit, there will be a lot of workloads where I think it's a worthwhile tradeoff. If we can avoid entangling the writebakc list lock, does that make you happier about this approach? - Ted From tytso@thunk.org Thu Nov 27 14:20:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B2EAA7F4E for ; Thu, 27 Nov 2014 14:20:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A1985304048 for ; Thu, 27 Nov 2014 12:20:05 -0800 (PST) X-ASG-Debug-ID: 1417119603-04cbb01e59830fe0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id SKaoD5FEOOW2ckwy (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 12:20:04 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=qFlsdkLPu5r1+aPLrEhsGCv4B4iLaHLYtrccRM/cnLQ=; b=V4qEKVH2/j/RMGJFZ65kYXzg1XRK1XEXBS2zh9gOO5C7EBQqe9j1t39JZVJLCBrABBSXIhzxtUyvEg0v8Uh2VLIixzh6XxspRuKTG2yQ3sZw6aCK2tQxDlr16wr2A+0p078ZpSpEd1mnRQ1PJjP71weyhgM1sTOwBnS+Ig2SX0o=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu5Xk-0001aS-HY; Thu, 27 Nov 2014 20:20:00 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id BEF035809A3; Thu, 27 Nov 2014 15:19:54 -0500 (EST) Date: Thu, 27 Nov 2014 15:19:54 -0500 From: Theodore Ts'o To: Jan Kara Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-ID: <20141127201954.GF14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-3-git-send-email-tytso@mit.edu> <20141127131421.GE30152@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127131421.GE30152@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417119604 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Nov 27, 2014 at 02:14:21PM +0100, Jan Kara wrote: > Looking into the code & your patch I'd prefer to do something like: > * add support for I_DIRTY_TIME in __mark_inode_dirty() - update_time will > call __mark_inode_dirty() with this flag if any of the times was updated. > That way we can just remove your ->write_time() callback - filesystems > can just handle this in their ->dirty_inode() methods if they wish. > __mark_inode_dirty() will take care of moving inode into proper writeback > list (i_dirty / i_dirty_time), dirtied_when will be set to current time. One of the tricky bits about this is that btrfs wants to be able to return an error from write_time() which gets reflected up through update_time() to the callers of file_update_time(). Currently __mark_inode_dirty() and family return a void, and changing this is going to be a bit of a mess, since doing this correctly would require auditing all of the callers of mark_inode_dirty(), mark_inode_dirty_sync(), __mark_inode_dirty(), etc. Doing this would be a good thing, and eventually I think it would be nice if we could allow the mark_inode_dirty() functions return an error instead of void, but I wonder if that's a cleanup that's better saved for later. While we were at it, maybe we should rename mark_inode_dirty() to inode_dirty(), since that way we can be sure we've looked at all of the call site of mark_inode_dirty() and friends --- and we have a number of file systems, including btrfs, ext3, and ext4, where mark_inode_dirty() is doing a lot more than just marking the inode is dirty, and the only reason why it's named that is mostly historical. - Ted From tytso@thunk.org Thu Nov 27 14:27:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 58DE07F4E for ; Thu, 27 Nov 2014 14:27:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD532AC002 for ; Thu, 27 Nov 2014 12:27:38 -0800 (PST) X-ASG-Debug-ID: 1417120057-04cbb01e5a8383d0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id HjtKL1WjOWEUPVWK (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 12:27:37 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=6czeLEogBWqhQPXVcVMXZUXqRHTo50b1rtHu5hVuhGQ=; b=IkCicVMBgm89Y2oRs6S7ge0GLD18LDR2TjKn+L1oSp7j4h1Z9syRf4KO5UIKRwRrKMymRjWS9zklNd6PN68vPRLSAivwv/l207lcd/txJT4lkRRYXW70fM3GYG7bK3YiMQwcOXOlSqn8SUxLYFHmgMp/Co8b71nwpORjCja26Co=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu5f3-0001cL-0E; Thu, 27 Nov 2014 20:27:33 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 4CCE15809A3; Thu, 27 Nov 2014 15:27:31 -0500 (EST) Date: Thu, 27 Nov 2014 15:27:31 -0500 From: Theodore Ts'o To: Christoph Hellwig Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() Message-ID: <20141127202731.GG14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 1/7] vfs: split update_time() into update_time() and write_time() References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-2-git-send-email-tytso@mit.edu> <20141126192328.GA20436@infradead.org> <20141127144116.GA14091@thunk.org> <20141127153315.GC14091@thunk.org> <20141127164952.GA1622@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127164952.GA1622@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417120057 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12131 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Nov 27, 2014 at 08:49:52AM -0800, Christoph Hellwig wrote: > I don't think this scheme works well. As mentioned earlier XFS doesn't > even use vfs dirty tracking at the moment, so introducing this in a > hidden way sounds like a bad idea. Probably the same for btrfs. > > I'd rather keep update_time as-is for now, don't add ->write_time and > let btrfs and XFS figure out how to implement the semantics on their > own. I can do that, but part of the reason why we were doing this rather involved set of changes was to allow other file systems to be able to take advantage of lazytime. I suppose there is value in allowing other file systems, such as jfs, f2fs, etc., to use it, but still, it's a bit of a shame to drop btrfs and xfs support for this feature. I'll note by the way that ext3 and ext4 doesn't really use VFS dirty tracking either --- see my other comments about the naming of "mark_inode_dirty" being a bit misleading, at least for all/most of the major file systems. The problem seems to be that replacement schemes that we've all using are slightly different. :-/ I suppose should let the btrfs folks decide whether they want to add is_readonly() and write_time() function --- or maybe help with the cleanup work so that mark_inode_dirty() can reflect an error to its callers. Chris, David, what do you think? - Ted From tytso@thunk.org Thu Nov 27 17:00:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BD77F7F4E for ; Thu, 27 Nov 2014 17:00:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ABD9B8F804B for ; Thu, 27 Nov 2014 15:00:24 -0800 (PST) X-ASG-Debug-ID: 1417129222-04cb6c05718825c0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id FL26YCDIyLafuT06 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 15:00:22 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=p/ImgSve+1E6mWSj0WUvy2VFbXUoNdkxWXqDq7dtF5g=; b=Ov8c53sDqsN7atLU2atsVpILDNC6SlFgZAgWr+watSiX+eHYdgyVMVDoIh+TAz+CtFyDvGyedwAwZA+vCRZbMAKPJ98WHXTMKBJlmNbBKwbThl1KpyVpB7RibRv2RJTXHoBdCo1jNG00Ws8g0qgHlInOw9+vey9xLZ2AKDvfylk=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1Xu82s-0002Qf-EO; Thu, 27 Nov 2014 23:00:18 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 4F02E5809A3; Thu, 27 Nov 2014 18:00:16 -0500 (EST) Date: Thu, 27 Nov 2014 18:00:16 -0500 From: Theodore Ts'o To: Jan Kara Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-ID: <20141127230016.GH14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-3-git-send-email-tytso@mit.edu> <20141127131421.GE30152@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127131421.GE30152@quack.suse.cz> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417129222 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12134 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Nov 27, 2014 at 02:14:21PM +0100, Jan Kara wrote: > * change queue_io() to also call > moved += move_expired_inodes(&wb->b_dirty_time, &wb->b_io, time + 24hours) > For this you need to tweak move_expired_inodes() to take pointer to > timestamp instead of pointer to work but that's trivial. Also you want > probably leave time ->older_than_this value (i.e. without +24 hours) if > we are doing WB_SYNC_ALL writeback. With this you can remove > flush_sb_dirty_time() completely. Well.... it's not quite enough. The problem is that for ext3 and ext4, the actual work of writing the inode happens in dirty_inode(), not in write_inode(). Which means we need to do something like this. I'm not entirely sure whether or not this is too ugly to live; personally, I think my hack of handling this in update_time() might be preferable.... diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index b93c529..95a42b3 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -253,7 +253,7 @@ static bool inode_dirtied_after(struct inode *inode, unsigned long t) */ static int move_expired_inodes(struct list_head *delaying_queue, struct list_head *dispatch_queue, - struct wb_writeback_work *work) + unsigned long *older_than_this) { LIST_HEAD(tmp); struct list_head *pos, *node; @@ -264,8 +264,8 @@ static int move_expired_inodes(struct list_head *delaying_queue, while (!list_empty(delaying_queue)) { inode = wb_inode(delaying_queue->prev); - if (work->older_than_this && - inode_dirtied_after(inode, *work->older_than_this)) + if (older_than_this && + inode_dirtied_after(inode, *older_than_this)) break; list_move(&inode->i_wb_list, &tmp); moved++; @@ -309,9 +309,14 @@ out: static void queue_io(struct bdi_writeback *wb, struct wb_writeback_work *work) { int moved; + unsigned long one_day_later = jiffies + (HZ * 86400); + assert_spin_locked(&wb->list_lock); list_splice_init(&wb->b_more_io, &wb->b_io); - moved = move_expired_inodes(&wb->b_dirty, &wb->b_io, work); + moved = move_expired_inodes(&wb->b_dirty, &wb->b_io, + work->older_than_this); + moved += move_expired_inodes(&wb->b_dirty_time, &wb->b_io, + &one_day_later); trace_writeback_queue_io(wb, work, moved); } @@ -637,6 +642,17 @@ static long writeback_sb_inodes(struct super_block *sb, } /* + * If the inode is marked dirty time but is not dirty, + * then at last for ext3 and ext4 we need to call + * mark_inode_dirty_sync in order to get the inode + * timestamp transferred to the on disk inode, since + * write_inode is a no-op for those file systems. HACK HACK HACK + */ + if ((inode->i_state & I_DIRTY_TIME) && + ((inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) == 0)) + mark_inode_dirty_sync(inode); + + /* * Don't bother with new inodes or inodes being freed, first * kind does not need periodic writeout yet, and for the latter * kind writeout is handled by the freer. @@ -1233,9 +1249,10 @@ void inode_requeue_dirtytime(struct inode *inode) spin_lock(&bdi->wb.list_lock); spin_lock(&inode->i_lock); if ((inode->i_state & I_DIRTY_WB) == 0) { - if (inode->i_state & I_DIRTY_TIME) + if (inode->i_state & I_DIRTY_TIME) { + inode->dirtied_when = jiffies; list_move(&inode->i_wb_list, &bdi->wb.b_dirty_time); - else + } else list_del_init(&inode->i_wb_list); } spin_unlock(&inode->i_lock); Comments? - Ted From david@fromorbit.com Thu Nov 27 18:59:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 63A1C7F4E for ; Thu, 27 Nov 2014 18:59:41 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 41A8C8F8033 for ; Thu, 27 Nov 2014 16:59:38 -0800 (PST) X-ASG-Debug-ID: 1417136372-04cbb01e5b8611e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 5qtHNRI5BG71Oqny for ; Thu, 27 Nov 2014 16:59:33 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqETALLHd1R5LLkmPGdsb2JhbABbgwaDXoQErSUBAQEBAQEGlQKFIQQCAoEIFwEBAQEBBgEBAQE4O4QCAQEBAwE6HCMFCwgDGAkPDAoPBSUDBxoTiDcIwSOQSwEBCAIBHxiGH4oCQgcYgxaBHwWfAJstKzCBCIFCAQEB Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail05.adl6.internode.on.net with ESMTP; 28 Nov 2014 11:29:31 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1Xu9uE-0004BZ-Lj; Fri, 28 Nov 2014 11:59:30 +1100 Date: Fri, 28 Nov 2014 11:59:30 +1100 From: Dave Chinner To: Bharathiraja P Cc: xfs@oss.sgi.com Subject: Re: OS Upgrade Considerations For XFS Volume Message-ID: <20141128005930.GF27262@dastard> X-ASG-Orig-Subj: Re: OS Upgrade Considerations For XFS Volume References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1417136372 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12138 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 27, 2014 at 07:59:59PM +0530, Bharathiraja P wrote: > Hi there, > > We recently upgraded our database system from OpenSuSE-11.4 to OpenSuSE-13.1 > > Post the upgrade we are noticing load spikes on our database system. And ...? Is there any actual performance problem you've measured? > OpenSuSE 11.4 uses kernel-2.6.37 and OpenSuSE-13.1 uses kernel-3.11.10 > > There seems to be some changes related to XFS in new kernel and I'm getting > this error when I run xfs_logprint > > ============== > sudo /usr/sbin/xfs_logprint /dev/mapper/pgsql-data > raja's password: > xfs_logprint: > xfs_logprint: /dev/mapper/pgsql-data contains a mounted and writable logprint is completely unreliable on an active and mounted filesystem. It's not going to tell you anything useful about any sort of performance issue - logprint is for debugging log recovery problems.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 27 19:38:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 90E837F4E for ; Thu, 27 Nov 2014 19:38:43 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 548498F8033 for ; Thu, 27 Nov 2014 17:38:40 -0800 (PST) X-ASG-Debug-ID: 1417138717-04bdf06160a51830001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id QJdWl4dhaM8FnQAM for ; Thu, 27 Nov 2014 17:38:37 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtsiADjRd1R5LLkmPGdsb2JhbABbgwaDXoQErSUBAQEBAQEGgU6TNIUhAgIBAQKBCBcBAQEBAQYBAQEBODuEAgEBAQMBJxMcIwULCAMOCgklDwUlAwcaCgmINwjRcAEBAQcBAQEBHhiGH4pEB4MugR8FkDmOR4E2g1mIG4Iti1YrMIEGBIFAAQEB Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail05.adl6.internode.on.net with ESMTP; 28 Nov 2014 12:08:30 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XuAVy-0004FS-2o; Fri, 28 Nov 2014 12:38:30 +1100 Date: Fri, 28 Nov 2014 12:38:30 +1100 From: Dave Chinner To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V8 Message-ID: <20141128013830.GA16151@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] Add support to RENAME_EXCHANGE flag V8 References: <1416923368-28322-1-git-send-email-cmaiolino@redhat.com> <1416923368-28322-3-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1416923368-28322-3-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1417138717 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12139 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Nov 25, 2014 at 11:49:28AM -0200, Carlos Maiolino wrote: > Adds a new function named xfs_cross_rename(), responsible to handle requests > from sys_renameat2() using RENAME_EXCHANGE flag. > > Changelog: > > V2: - refactor xfs_cross_rename() to not duplicate code from xfs_rename() > > V3: - fix indentation to avoid 80 column crossing, decrease the amount of > arguments passed to xfs_cross_rename() > - Rebase patches over the latest linux code > > v4: - use a label/goto statement instead of an if conditional after > xfs_cross_rename() return, to finish the rename operation > - Make xfs_cross_rename() static > - Fix some comments > > V5: - Keep all the code under 80 columns > > V6: - Ensure i_mode of both files are updated during exchange > > V7: - Use struct names instead of typedefs in the xfs_cross_rename() > definition > > V8: - Replace src/target names for better variable names > - Log and timestamp updates done in different places > - Fix missing space in comments > - get rid of {src,tgt}_is_directory and new_parent variables FYI, Changelog should be in the cover patch 0, not in the commit message for the individual patch. > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/xfs_inode.h | 2 +- > fs/xfs/xfs_iops.c | 15 +++++-- > 3 files changed, 123 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 8ed049d..5c5ed99 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -2668,6 +2668,102 @@ xfs_sort_for_rename( > } > } > > +/* xfs_cross_rename() > + * > + * responsible to handle RENAME_EXCHANGE flag > + * in renameat2() sytemcall Comments can use all 80 columns. And the first line of the comment is "/*" by itself. > + */ > +STATIC int > +xfs_cross_rename( > + struct xfs_trans *tp, > + struct xfs_inode *dp1, > + struct xfs_name *name1, > + struct xfs_inode *ip1, > + struct xfs_inode *dp2, > + struct xfs_name *name2, > + struct xfs_inode *ip2, > + struct xfs_bmap_free *free_list, > + xfs_fsblock_t *first_block, > + int spaceres) > +{ > + int error = 0; > + > + /* Replace source inode */ still got source/target in comments that don't make sense. "Swap inode number for dirent in first parent" might be better... > + error = xfs_dir_replace(tp, dp1, name1, > + ip2->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + > + /* Replace target inode */ /* Swap inode number for dirent in second parent */ > + error = xfs_dir_replace(tp, dp2, name2, > + ip1->i_ino, > + first_block, free_list, spaceres); > + if (error) > + goto out; > + /* > + * If we're renaming one or more directories across different parents, > + * update the respective ".." entries (and link counts) to match the new > + * parents. > + */ > + if (dp1 != dp2) { > + > + if (S_ISDIR(ip2->i_d.di_mode)) { > + error = xfs_dir_replace(tp, ip2, &xfs_name_dotdot, > + dp1->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out; now ip2 is modified, so it ctime/mtime dirty. > + > + /* transfer target ".." reference to dp1 */ > + if (!S_ISDIR(ip1->i_d.di_mode)) { > + error = xfs_droplink(tp, dp2); > + if (error) > + goto out; > + error = xfs_bumplink(tp, dp1); > + if (error) > + goto out; > + } > + xfs_trans_ichgtime(tp, ip1, XFS_ICHGTIME_CHG); > + xfs_trans_ichgtime(tp, ip2, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, ip2, XFS_ILOG_CORE); But now you're unconditionally changing ctime on ip1 without it having been modified and you aren't logging the change. Why is the ctime changing (comments, please!)? > + } > + > + if (S_ISDIR(ip1->i_d.di_mode)) { > + error = xfs_dir_replace(tp, ip1, &xfs_name_dotdot, > + dp2->i_ino, first_block, > + free_list, spaceres); > + if (error) > + goto out; here ip2 is modified > + > + /* transfer src ".." reference to dp2 */ > + if (!S_ISDIR(ip2->i_d.di_mode)) { > + error = xfs_droplink(tp, dp1); > + if (error) > + goto out; > + error = xfs_bumplink(tp, dp2); > + if (error) > + goto out; > + } > + xfs_trans_ichgtime(tp, ip1, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_ichgtime(tp, ip2, XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, ip1, XFS_ILOG_CORE); and same again - changing ctime on ip2 without logging it. > + } > + xfs_trans_ichgtime(tp, dp2, > + XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, dp2, XFS_ILOG_CORE); > + } > + xfs_trans_ichgtime(tp, dp1, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); > + xfs_trans_log_inode(tp, dp1, XFS_ILOG_CORE); perhaps: int ip1_flags = 0; int ip2_flags = 0; int dp2_flags = 0; if (dp1 != dp2) dp2_flags = XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; if (S_ISDIR(ip1)) { ip1_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; ip2_flags |= XFS_ICHGTIME_CHG; /* because ... */ ..... } if (S_ISDIR(ip2)) { ip1_flags |= XFS_ICHGTIME_CHG; /* because ... */ ip2_flags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG; ..... } } if (ip1_flags) { xfs_trans_ichgtime(tp, ip1, ip1_flags); xfs_trans_log_inode(tp, ip1); } if (ip2_flags) { xfs_trans_ichgtime(tp, ip2, ip2_flags); xfs_trans_log_inode(tp, ip2); } if (dp2_flags) { xfs_trans_ichgtime(tp, dp2, ip2_flags); xfs_trans_log_inode(tp, dp2); } xfs_trans_ichgtime(tp, dp2, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); xfs_trans_log_inode(tp, dp2); > + > +out: > + return error; > +} > + > /* > * xfs_rename > */ > @@ -2678,7 +2774,8 @@ xfs_rename( > xfs_inode_t *src_ip, > xfs_inode_t *target_dp, > struct xfs_name *target_name, > - xfs_inode_t *target_ip) > + xfs_inode_t *target_ip, > + unsigned int flags) > { > xfs_trans_t *tp = NULL; > xfs_mount_t *mp = src_dp->i_mount; > @@ -2706,6 +2803,7 @@ xfs_rename( > cancel_flags = XFS_TRANS_RELEASE_LOG_RES; > spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, spaceres, 0); > + > if (error == -ENOSPC) { Stray new line. > spaceres = 0; > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_rename, 0, 0); > @@ -2756,6 +2854,17 @@ xfs_rename( > } > > /* > + * Handle RENAME_EXCHANGE flags > + */ Comment whitespace still needs fixing. > + if (flags & RENAME_EXCHANGE) { > + error = xfs_cross_rename(tp, src_dp, src_name, src_ip, > + target_dp, target_name, target_ip, > + &free_list, &first_block, spaceres); > + if (error) > + goto abort_return; > + goto finish_rename; > + } > + /* > * Set up the target. > */ Put an empty line between the "}" and the start of the comment. > if (target_ip == NULL) { > @@ -2894,6 +3003,7 @@ xfs_rename( > if (new_parent) > xfs_trans_log_inode(tp, target_dp, XFS_ILOG_CORE); > > +finish_rename: > /* > * If this is a synchronous mount, make sure that the > * rename transaction goes to disk before returning to > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 9af2882..051d9f0 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -340,7 +340,7 @@ int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip, > int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name, > struct xfs_inode *src_ip, struct xfs_inode *target_dp, > struct xfs_name *target_name, > - struct xfs_inode *target_ip); > + struct xfs_inode *target_ip, unsigned int flags); > > void xfs_ilock(xfs_inode_t *, uint); > int xfs_ilock_nowait(xfs_inode_t *, uint); > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 0b8704c..4e5d8ce 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -387,19 +387,26 @@ xfs_vn_rename( > unsigned int flags) > { > struct inode *new_inode = ndentry->d_inode; > + int omode = 0; > struct xfs_name oname; > struct xfs_name nname; > > - /* XFS does not support RENAME_EXCHANGE yet */ > - if (flags & ~RENAME_NOREPLACE) > + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) > return -EINVAL; > > - xfs_dentry_to_name(&oname, odentry, 0); > + /* > + * if we are exchanging files, we should set > + * i_mode of both files > + */ Comments can use all 80 characters of the line. Also, s/should/need to/. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 27 20:48:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3E18C7F4E for ; Thu, 27 Nov 2014 20:48:22 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1E04D304039 for ; Thu, 27 Nov 2014 18:48:18 -0800 (PST) X-ASG-Debug-ID: 1417142896-04bdf0615ea62660001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2pz6tHpyHB6sNRIF for ; Thu, 27 Nov 2014 18:48:16 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtMiALbhd1R5LLkmPGdsb2JhbABbgwaDXoQErSUBAQEBAQEGlQKFIQICAQECgQgXAQEBAQEGAQEBATg7hAMBAQQnExwjEAgDDgoJJQ8FJQMHGhOIP9FyAQEBAQEFAQEBAR4Yhh+KRAeDLoEfBZ8AmVSBWSswgkoBAQE Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail05.adl6.internode.on.net with ESMTP; 28 Nov 2014 13:18:15 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XuBbS-0004LU-9U; Fri, 28 Nov 2014 13:48:14 +1100 Date: Fri, 28 Nov 2014 13:48:14 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH RFC v3 2/2] xfs: split metadata and log buffer completion to separate workqueues Message-ID: <20141128024814.GB16151@dastard> X-ASG-Orig-Subj: Re: [PATCH RFC v3 2/2] xfs: split metadata and log buffer completion to separate workqueues References: <1415906641-43587-1-git-send-email-bfoster@redhat.com> <1415906641-43587-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415906641-43587-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1417142896 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 13, 2014 at 02:24:01PM -0500, Brian Foster wrote: > XFS traditionally sends all buffer I/O completion work to a single > queue. This includes metadata buffer completion and log buffer > completion. The log buffer completion requires a high priority queue to > prevent stalls due to log forces getting stuck behind other queued work. > > Rather than continue to prioritize all buffer I/O completion due to the > needs of log completion, split log buffer completion off to > m_log_workqueue and move the high priority flag from m_buf_workqueue to > m_log_workqueue. > > [XXX: Use of XBF_SYNCIO is purely for demonstration. Define a new flag.] > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_buf.c | 9 ++++++++- > fs/xfs/xfs_super.c | 5 ++--- > 2 files changed, 10 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index c06d790..58d729c 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1050,8 +1050,15 @@ void > xfs_buf_ioend_async( > struct xfs_buf *bp) > { > + struct workqueue_struct *wq; > + > + if (bp->b_flags & XBF_SYNCIO) > + wq = bp->b_target->bt_mount->m_log_workqueue; > + else > + wq = bp->b_target->bt_mount->m_buf_workqueue; > + > INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); > - queue_work(bp->b_target->bt_mount->m_buf_workqueue, &bp->b_iodone_work); > + queue_work(wq, &bp->b_iodone_work); I can see what you are doing here, but I still think it would be better to set this up at IO submission rather than taking all those cacheline misses chasing pointers on IO completion. Adding an extra pointer to the struct xfs_buf is not a big deal.... Otherwise this looks fine.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Nov 27 20:49:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 251927F4E for ; Thu, 27 Nov 2014 20:49:49 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12E0B304053 for ; Thu, 27 Nov 2014 18:49:49 -0800 (PST) X-ASG-Debug-ID: 1417142986-04cbb01e5c882360001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 9ELLaiPQ0DP75DBv for ; Thu, 27 Nov 2014 18:49:47 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtMiALbhd1R5LLkmPGdsb2JhbABbgwaDXoQErSUBAQEBAQEGlQKFIQICAQECgQgXAQEBAQEGAQEBATg7hAMBAQQnExwjEAgDDgoJJQ8FJQMHGhOIP9FyAQEBBwIBHxiGH4pEB4MugR8BBJ8Amy0rMIJKAQEB Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail05.adl6.internode.on.net with ESMTP; 28 Nov 2014 13:19:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XuBcv-0004Lf-9r; Fri, 28 Nov 2014 13:49:45 +1100 Date: Fri, 28 Nov 2014 13:49:45 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 1/2] xfs: replace global xfslogd wq with per-mount wq Message-ID: <20141128024945.GC16151@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 1/2] xfs: replace global xfslogd wq with per-mount wq References: <1415906641-43587-1-git-send-email-bfoster@redhat.com> <1415906641-43587-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1415906641-43587-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1417142986 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Nov 13, 2014 at 02:24:00PM -0500, Brian Foster wrote: > The xfslogd workqueue is a global, single-job workqueue for buffer ioend > processing. This means we allow for a single work item at a time for all > possible XFS mounts on a system. fsstress testing in loopback XFS over > XFS configurations has reproduced xfslogd deadlocks due to the single > threaded nature of the queue and dependencies introduced between the > separate XFS instances by online discard (-o discard). > > Discard over a loopback device converts the discard request to a hole > punch (fallocate) on the underlying file. Online discard requests are > issued synchronously and from xfslogd context in XFS, hence the xfslogd > workqueue is blocked in the upper fs waiting on a hole punch request to > be servied in the lower fs. If the lower fs issues I/O that depends on > xfslogd to complete, both filesystems end up hung indefinitely. This is > reproduced reliabily by generic/013 on XFS->loop->XFS test devices with > the '-o discard' mount option. > > Further, docker implementations appear to use this kind of configuration > for container instance filesystems by default (container fs->dm-> > loop->base fs) and therefore are subject to this deadlock when running > on XFS. > > Replace the global xfslogd workqueue with a per-mount variant. This > guarantees each mount access to a single worker and prevents deadlocks > due to inter-fs dependencies introduced by discard. Since the queue is > only responsible for buffer iodone processing at this point in time, > rename xfslogd to xfs-buf. > > Signed-off-by: Brian Foster Looks good. I'll take this as is and we can refine the way we point to the workqueue in the patches that separate the log buffer completions... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Nov 27 23:20:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 34A3E7F4E for ; Thu, 27 Nov 2014 23:20:27 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4C91AC007 for ; Thu, 27 Nov 2014 21:20:23 -0800 (PST) X-ASG-Debug-ID: 1417152022-04bdf06161a7a3a0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id VBvBZMZtuk8ViTFV for ; Thu, 27 Nov 2014 21:20:22 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id EEB026C0BF; Thu, 27 Nov 2014 23:20:21 -0600 (CST) Message-ID: <54780618.1000009@hardwarefreak.com> Date: Thu, 27 Nov 2014 23:20:24 -0600 From: Stan Hoeppner User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.2.0 MIME-Version: 1.0 To: Bharathiraja P , xfs@oss.sgi.com Subject: Re: OS Upgrade Considerations For XFS Volume References: X-ASG-Orig-Subj: Re: OS Upgrade Considerations For XFS Volume In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1417152022 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 11/27/2014 08:29 AM, Bharathiraja P wrote: > Hi there, > > We recently upgraded our database system from OpenSuSE-11.4 to OpenSuSE-13.1 > > Post the upgrade we are noticing load spikes on our database system. > > OpenSuSE 11.4 uses kernel-2.6.37 and OpenSuSE-13.1 uses kernel-3.11.10 > > There seems to be some changes related to XFS in new kernel and I'm > getting this error when I run xfs_logprint The two major XFS defaults changes here are: 1. Delayed logging 2. inode64 allocator Read about each. They should not be impacting performance of a DB workload nor system load. Stan From tytso@thunk.org Thu Nov 27 23:37:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A43C47F4E for ; Thu, 27 Nov 2014 23:37:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93232304048 for ; Thu, 27 Nov 2014 21:37:02 -0800 (PST) X-ASG-Debug-ID: 1417153020-04cb6c05728d2710001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id Glcyj6zUvFkG3pby (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 27 Nov 2014 21:37:01 -0800 (PST) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=thunk.org; s=ef5046eb; h=In-Reply-To:Content-Type:MIME-Version:References:Message-ID:Subject:Cc:To:From:Date; bh=pW4+9IUnGp0BdGgYJJkbRbe/KBELQT+eOxf7rm5la4w=; b=yn3dfE8VQukzpeqAaXCTbfgAfX18nCcZIZV7ecIwE/nhCvuuHeFfw0CxpDibGhNFygBOqGkRxFJAu7VqYd0azezT+9mqi1xDHU9M2xnAZGs3NVdRLfCSCaH5r5DNAlxNTsDr5Ec++fL2oSjA/spf5oYIl3LKKTjGyrHZcX0IjpI=; Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1XuEEl-0004lg-Ad; Fri, 28 Nov 2014 05:36:59 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 9954B5809A3; Fri, 28 Nov 2014 00:36:56 -0500 (EST) Date: Fri, 28 Nov 2014 00:36:56 -0500 From: Theodore Ts'o To: Jan Kara Cc: Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-ID: <20141128053656.GI14091@thunk.org> X-ASG-Orig-Subj: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-3-git-send-email-tytso@mit.edu> <20141127131421.GE30152@quack.suse.cz> <20141127230016.GH14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127230016.GH14091@thunk.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1417153020 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Nov 27, 2014 at 06:00:16PM -0500, Theodore Ts'o wrote: > Well.... it's not quite enough. The problem is that for ext3 and > ext4, the actual work of writing the inode happens in dirty_inode(), > not in write_inode(). Which means we need to do something like this. > > I'm not entirely sure whether or not this is too ugly to live; > personally, I think my hack of handling this in update_time() might be > preferable.... .... and this doesn't work because it breaks ext3/ext4's transaction handling, since the writeback thread could be racing against some transactional update of the inode. So I don't see a way of making the queue_io / move_expired_inodes approach to the 24 hour time being tractable. So the alternatives that I can see at this point is either give up on the 24 hour timeout, or we fall back to handling this in update_time(). - Ted From dgc@oss.sgi.com Fri Nov 28 05:16:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 0F3A67F47; Fri, 28 Nov 2014 05:16:04 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-misc-fixes-for-3.19-1, created. v3.18-rc2-5-gdb52d09e X-Git-Refname: refs/heads/xfs-misc-fixes-for-3.19-1 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: db52d09ecbf85c54e263a9d1ebfb615a9b2b3ba6 Message-Id: <20141128111604.0F3A67F47@oss.sgi.com> Date: Fri, 28 Nov 2014 05:16:03 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-misc-fixes-for-3.19-1 has been created at db52d09ecbf85c54e263a9d1ebfb615a9b2b3ba6 (commit) - Log ----------------------------------------------------------------- commit db52d09ecbf85c54e263a9d1ebfb615a9b2b3ba6 Author: Eric Sandeen Date: Fri Nov 28 14:03:55 2014 +1100 xfs: catch invalid negative blknos in _xfs_buf_find() Here blkno is a daddr_t, which is a __s64; it's possible to hold a value which is negative, and thus pass the (blkno >= eofs) test. Then we try to do a xfs_perag_get() for a ridiculous agno via xfs_daddr_to_agno(), and bad things happen when that fails, and returns a null pag which is dereferenced shortly thereafter. Found via a user-supplied fuzzed image... Signed-off-by: Eric Sandeen Reviewed-by: Mark Tinguely Signed-off-by: Dave Chinner commit 91ee575f2b35d1307412f917787195c2f6a38dfb Author: Brian Foster Date: Fri Nov 28 14:02:59 2014 +1100 xfs: allow lazy sb counter sync during filesystem freeze sequence The expectation since the introduction the lazy superblock counters is that the counters are synced and superblock logged appropriately as part of the filesystem freeze sequence. This does not occur, however, due to the logic in xfs_fs_writable() that prevents progress when the fs is in any state other than SB_UNFROZEN. While this is a bug, it has not been exposed to date because the last thing XFS does during freeze is dirty the log. The log recovery process recalculates the counters from AGI/AGF metadata to ensure everything is correct. Therefore should a crash occur while an fs is frozen, the subsequent log recovery puts everything back in order. See the following commit for reference: 92821e2b [XFS] Lazy Superblock Counters We might not always want to rely on dirtying the log on a frozen fs. Modify xfs_log_sbcount() to proceed when the filesystem is freezing but not once the freeze process has completed. Modify xfs_fs_writable() to accept the minimum freeze level for which modifications should be blocked to support various codepaths. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 5d45ee1b41b02269ce04920a48cd2c6b2a458090 Author: Brian Foster Date: Fri Nov 28 14:00:53 2014 +1100 xfs: fix error handling in xfs_qm_log_quotaoff() The error handling in xfs_qm_log_quotaoff() has a couple problems. If xfs_trans_commit() fails, we fall through to the error block and call xfs_trans_cancel(). This is incorrect on commit failure. If xfs_trans_reserve() fails, we jump to the error block, cancel the tp and restore the superblock qflags to oldsbqflag. However, oldsbqflag has been initialized to zero and not yet updated from the original flags so we set the flags to zero. Fix up the error handling in xfs_qm_log_quotaoff() to not restore flags if they haven't been modified and not cancel the tp on commit failure. Remove the flag restore code altogether because commit error is the only failure condition and we don't know whether the transaction made it to disk. Reported-by: Dan Carpenter Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 062647a8b41928f4fb97f967b24092be68f5f0f0 Author: Brian Foster Date: Fri Nov 28 14:00:16 2014 +1100 xfs: replace on-stack xfs_trans_res with pointer in xfs_create() There's no need to store a full struct xfs_trans_res on the stack in xfs_create() and copy the fields. Use a pointer to the appropriate structures embedded in the xfs_mount. Signed-off-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 78c931b8be75456562b55ed4e27878f1519e1367 Author: Brian Foster Date: Fri Nov 28 13:59:58 2014 +1100 xfs: replace global xfslogd wq with per-mount wq The xfslogd workqueue is a global, single-job workqueue for buffer ioend processing. This means we allow for a single work item at a time for all possible XFS mounts on a system. fsstress testing in loopback XFS over XFS configurations has reproduced xfslogd deadlocks due to the single threaded nature of the queue and dependencies introduced between the separate XFS instances by online discard (-o discard). Discard over a loopback device converts the discard request to a hole punch (fallocate) on the underlying file. Online discard requests are issued synchronously and from xfslogd context in XFS, hence the xfslogd workqueue is blocked in the upper fs waiting on a hole punch request to be servied in the lower fs. If the lower fs issues I/O that depends on xfslogd to complete, both filesystems end up hung indefinitely. This is reproduced reliabily by generic/013 on XFS->loop->XFS test devices with the '-o discard' mount option. Further, docker implementations appear to use this kind of configuration for container instance filesystems by default (container fs->dm-> loop->base fs) and therefore are subject to this deadlock when running on XFS. Replace the global xfslogd workqueue with a per-mount variant. This guarantees each mount access to a single worker and prevents deadlocks due to inter-fs dependencies introduced by discard. Since the queue is only responsible for buffer iodone processing at this point in time, rename xfslogd to xfs-buf. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Fri Nov 28 05:16:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id F0B4E7F56; Fri, 28 Nov 2014 05:16:21 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-consolidate-format-defs, created. v3.18-rc2-5-g508b6b3 X-Git-Refname: refs/heads/xfs-consolidate-format-defs X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 508b6b3b73888e3296ff638b32f15327e63b7b42 Message-Id: <20141128111621.F0B4E7F56@oss.sgi.com> Date: Fri, 28 Nov 2014 05:16:21 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-consolidate-format-defs has been created at 508b6b3b73888e3296ff638b32f15327e63b7b42 (commit) - Log ----------------------------------------------------------------- commit 508b6b3b73888e3296ff638b32f15327e63b7b42 Author: Christoph Hellwig Date: Fri Nov 28 14:27:10 2014 +1100 xfs: merge xfs_inum.h into xfs_format.h Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit bb58e6188a10f06dc65612a59ce3815da62ca3c1 Author: Christoph Hellwig Date: Fri Nov 28 14:27:09 2014 +1100 xfs: move most of xfs_sb.h to xfs_format.h More on-disk format consolidation. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 4fb6e8ade2c70ef1a13f358963b3298fd8b72bcc Author: Christoph Hellwig Date: Fri Nov 28 14:25:04 2014 +1100 xfs: merge xfs_ag.h into xfs_format.h More on-disk format consolidation. A few declarations that weren't on-disk format related move into better suitable spots. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 5beda58bf269febe67eca91d5d5dc7c7d392232a Author: Christoph Hellwig Date: Fri Nov 28 14:24:37 2014 +1100 xfs: move acl structures to xfs_format.h Move the on-disk ACL format to xfs_format.h, so that repair can use the common defintion. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit 6d3ebaae7c20128bfa6965a8d5cee0d1deea8486 Author: Christoph Hellwig Date: Fri Nov 28 14:24:06 2014 +1100 xfs: merge xfs_dinode.h into xfs_format.h More consolidatation for the on-disk format defintions. Note that the XFS_IS_REALTIME_INODE moves to xfs_linux.h instead as it is not related to the on disk format, but depends on a CONFIG_ option. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Fri Nov 28 05:16:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 3A0E47F5F; Fri, 28 Nov 2014 05:16:37 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.18-rc2-23-g216875a X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 002758992693ae63c04122603ea9261a0a58d728 X-Git-Newrev: 216875a594e0b4fc72830e3690b8fbe7430738e2 Message-Id: <20141128111637.3A0E47F5F@oss.sgi.com> Date: Fri, 28 Nov 2014 05:16:36 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 216875a Merge branch 'xfs-consolidate-format-defs' into for-next 4bd47c1 Merge branch 'xfs-misc-fixes-for-3.19-1' into for-next 508b6b3 xfs: merge xfs_inum.h into xfs_format.h bb58e61 xfs: move most of xfs_sb.h to xfs_format.h 4fb6e8a xfs: merge xfs_ag.h into xfs_format.h 5beda58 xfs: move acl structures to xfs_format.h 6d3ebaa xfs: merge xfs_dinode.h into xfs_format.h db52d09e xfs: catch invalid negative blknos in _xfs_buf_find() 91ee575 xfs: allow lazy sb counter sync during filesystem freeze sequence 5d45ee1 xfs: fix error handling in xfs_qm_log_quotaoff() 062647a xfs: replace on-stack xfs_trans_res with pointer in xfs_create() 78c931b xfs: replace global xfslogd wq with per-mount wq from 002758992693ae63c04122603ea9261a0a58d728 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 216875a594e0b4fc72830e3690b8fbe7430738e2 Merge: 4bd47c1 508b6b3 Author: Dave Chinner Date: Fri Nov 28 14:52:16 2014 +1100 Merge branch 'xfs-consolidate-format-defs' into for-next commit 4bd47c1bf4a64225a855ed77e259eeb37944ba33 Merge: 0027589 db52d09e Author: Dave Chinner Date: Fri Nov 28 14:52:02 2014 +1100 Merge branch 'xfs-misc-fixes-for-3.19-1' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/libxfs/xfs_ag.h | 281 --------- fs/xfs/libxfs/xfs_alloc.c | 1 - fs/xfs/libxfs/xfs_alloc.h | 3 + fs/xfs/libxfs/xfs_alloc_btree.c | 1 - fs/xfs/libxfs/xfs_attr.c | 3 - fs/xfs/libxfs/xfs_attr_leaf.c | 2 - fs/xfs/libxfs/xfs_attr_remote.c | 2 - fs/xfs/libxfs/xfs_bmap.c | 3 - fs/xfs/libxfs/xfs_bmap_btree.c | 3 - fs/xfs/libxfs/xfs_btree.c | 2 - fs/xfs/libxfs/xfs_da_btree.c | 2 - fs/xfs/libxfs/xfs_da_format.c | 2 - fs/xfs/libxfs/xfs_dinode.h | 243 -------- fs/xfs/libxfs/xfs_dir2.c | 4 - fs/xfs/libxfs/xfs_dir2_block.c | 3 - fs/xfs/libxfs/xfs_dir2_data.c | 2 - fs/xfs/libxfs/xfs_dir2_leaf.c | 2 - fs/xfs/libxfs/xfs_dir2_node.c | 2 - fs/xfs/libxfs/xfs_dir2_sf.c | 3 - fs/xfs/libxfs/xfs_dquot_buf.c | 2 - fs/xfs/libxfs/xfs_format.h | 1107 ++++++++++++++++++++++++++++++++++++ fs/xfs/libxfs/xfs_ialloc.c | 3 - fs/xfs/libxfs/xfs_ialloc.h | 4 + fs/xfs/libxfs/xfs_ialloc_btree.c | 2 - fs/xfs/libxfs/xfs_inode_buf.c | 3 - fs/xfs/libxfs/xfs_inode_fork.c | 4 - fs/xfs/libxfs/xfs_inum.h | 60 -- fs/xfs/libxfs/xfs_log_format.h | 2 +- fs/xfs/libxfs/xfs_log_rlimit.c | 2 - fs/xfs/libxfs/xfs_rtbitmap.c | 3 - fs/xfs/libxfs/xfs_sb.c | 2 - fs/xfs/libxfs/xfs_sb.h | 584 ------------------- fs/xfs/libxfs/xfs_symlink_remote.c | 2 - fs/xfs/libxfs/xfs_trans_resv.c | 2 - fs/xfs/xfs_acl.c | 2 - fs/xfs/xfs_acl.h | 36 -- fs/xfs/xfs_aops.c | 3 - fs/xfs/xfs_attr_inactive.c | 3 - fs/xfs/xfs_attr_list.c | 3 - fs/xfs/xfs_bmap_util.c | 3 - fs/xfs/xfs_buf.c | 16 +- fs/xfs/xfs_buf_item.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 3 - fs/xfs/xfs_discard.c | 1 - fs/xfs/xfs_dquot.c | 2 - fs/xfs/xfs_dquot_item.c | 2 - fs/xfs/xfs_error.c | 2 - fs/xfs/xfs_export.c | 2 - fs/xfs/xfs_extent_busy.c | 1 - fs/xfs/xfs_extfree_item.c | 3 +- fs/xfs/xfs_file.c | 3 - fs/xfs/xfs_filestream.c | 3 - fs/xfs/xfs_fsops.c | 2 - fs/xfs/xfs_icache.c | 2 - fs/xfs/xfs_icache.h | 8 + fs/xfs/xfs_icreate_item.c | 3 +- fs/xfs/xfs_inode.c | 17 +- fs/xfs/xfs_inode.h | 2 - fs/xfs/xfs_inode_item.c | 3 - fs/xfs/xfs_ioctl.c | 3 - fs/xfs/xfs_ioctl32.c | 2 - fs/xfs/xfs_iomap.c | 3 - fs/xfs/xfs_iops.c | 3 - fs/xfs/xfs_itable.c | 4 - fs/xfs/xfs_linux.h | 6 + fs/xfs/xfs_log.c | 4 +- fs/xfs/xfs_log_cil.c | 3 +- fs/xfs/xfs_log_recover.c | 3 - fs/xfs/xfs_message.c | 3 +- fs/xfs/xfs_mount.c | 32 +- fs/xfs/xfs_mount.h | 8 +- fs/xfs/xfs_qm.c | 2 - fs/xfs/xfs_qm_bhv.c | 2 - fs/xfs/xfs_qm_syscalls.c | 27 +- fs/xfs/xfs_quotaops.c | 2 - fs/xfs/xfs_rtalloc.c | 3 - fs/xfs/xfs_super.c | 14 +- fs/xfs/xfs_symlink.c | 3 - fs/xfs/xfs_trace.c | 2 - fs/xfs/xfs_trans.c | 2 - fs/xfs/xfs_trans_ail.c | 3 +- fs/xfs/xfs_trans_buf.c | 2 - fs/xfs/xfs_trans_dquot.c | 2 - fs/xfs/xfs_trans_extfree.c | 3 +- fs/xfs/xfs_trans_inode.c | 2 - fs/xfs/xfs_xattr.c | 2 - 86 files changed, 1190 insertions(+), 1428 deletions(-) delete mode 100644 fs/xfs/libxfs/xfs_ag.h delete mode 100644 fs/xfs/libxfs/xfs_dinode.h delete mode 100644 fs/xfs/libxfs/xfs_inum.h hooks/post-receive -- XFS development tree From jack@suse.cz Fri Nov 28 06:41:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 63E2A7F3F for ; Fri, 28 Nov 2014 06:41:49 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 35BEC8F8049 for ; Fri, 28 Nov 2014 04:41:45 -0800 (PST) X-ASG-Debug-ID: 1417178499-04bdf06160ad53f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id vFHHUY9mrAhfhFkJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Nov 2014 04:41:43 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id C8946AD1C; Fri, 28 Nov 2014 12:41:38 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 2B68D8095B; Fri, 28 Nov 2014 13:41:35 +0100 (CET) Date: Fri, 28 Nov 2014 13:41:35 +0100 From: Jan Kara To: Theodore Ts'o Cc: Jan Kara , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-ID: <20141128124135.GA27902@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-3-git-send-email-tytso@mit.edu> <20141127131421.GE30152@quack.suse.cz> <20141127201954.GF14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127201954.GF14091@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417178500 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12157 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 27-11-14 15:19:54, Ted Tso wrote: > On Thu, Nov 27, 2014 at 02:14:21PM +0100, Jan Kara wrote: > > Looking into the code & your patch I'd prefer to do something like: > > * add support for I_DIRTY_TIME in __mark_inode_dirty() - update_time will > > call __mark_inode_dirty() with this flag if any of the times was updated. > > That way we can just remove your ->write_time() callback - filesystems > > can just handle this in their ->dirty_inode() methods if they wish. > > __mark_inode_dirty() will take care of moving inode into proper writeback > > list (i_dirty / i_dirty_time), dirtied_when will be set to current time. > > One of the tricky bits about this is that btrfs wants to be able to > return an error from write_time() which gets reflected up through > update_time() to the callers of file_update_time(). Currently > __mark_inode_dirty() and family return a void, and changing this is > going to be a bit of a mess, since doing this correctly would require > auditing all of the callers of mark_inode_dirty(), > mark_inode_dirty_sync(), __mark_inode_dirty(), etc. > > Doing this would be a good thing, and eventually I think it would be > nice if we could allow the mark_inode_dirty() functions return an > error instead of void, but I wonder if that's a cleanup that's better > saved for later. While we were at it, maybe we should rename > mark_inode_dirty() to inode_dirty(), since that way we can be sure > we've looked at all of the call site of mark_inode_dirty() and friends > --- and we have a number of file systems, including btrfs, ext3, and > ext4, where mark_inode_dirty() is doing a lot more than just marking > the inode is dirty, and the only reason why it's named that is mostly > historical. Except that lots of callers of update_time() / file_update_time() just ignore the return value anyway. And frankly most of the time it's a simplification we can get away with. I agree that ultimately we should propagate and handle these errors but as you say above handling errors from __mark_inode_dirty() is what we'd really need - that handles the whole class of errors. So for now I would be OK, with just ignoring the error when updating time stamps. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Fri Nov 28 10:24:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3CDC97F3F for ; Fri, 28 Nov 2014 10:24:56 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D854304059 for ; Fri, 28 Nov 2014 08:24:52 -0800 (PST) X-ASG-Debug-ID: 1417191889-04bdf0615eaffeb0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 9yJB9AtJwtMkvKBe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Nov 2014 08:24:50 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 86BD3ACDE; Fri, 28 Nov 2014 16:24:49 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id EEDC28095B; Fri, 28 Nov 2014 17:24:45 +0100 (CET) Date: Fri, 28 Nov 2014 17:24:45 +0100 From: Jan Kara To: Theodore Ts'o Cc: Jan Kara , Linux Filesystem Development List , Ext4 Developers List , Linux btrfs Developers List , XFS Developers Subject: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option Message-ID: <20141128162445.GB27902@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH-v4 2/7] vfs: add support for a lazytime mount option References: <1416997437-26092-1-git-send-email-tytso@mit.edu> <1416997437-26092-3-git-send-email-tytso@mit.edu> <20141127131421.GE30152@quack.suse.cz> <20141127230016.GH14091@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20141127230016.GH14091@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1417191890 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 27-11-14 18:00:16, Ted Tso wrote: > On Thu, Nov 27, 2014 at 02:14:21PM +0100, Jan Kara wrote: > > * change queue_io() to also call > > moved += move_expired_inodes(&wb->b_dirty_time, &wb->b_io, time + 24hours) > > For this you need to tweak move_expired_inodes() to take pointer to > > timestamp instead of pointer to work but that's trivial. Also you want > > probably leave time ->older_than_this value (i.e. without +24 hours) if > > we are doing WB_SYNC_ALL writeback. With this you can remove > > flush_sb_dirty_time() completely. > > Well.... it's not quite enough. The problem is that for ext3 and > ext4, the actual work of writing the inode happens in dirty_inode(), > not in write_inode(). Which means we need to do something like this. Right, I didn't realize this problem. > I'm not entirely sure whether or not this is too ugly to live; > personally, I think my hack of handling this in update_time() might be > preferable.... Actually handling the copying of timestamps in __writeback_single_inode() would look fine to me. You mention in your next email, calling mark_inode_dirty_sync() from flusher may be problematic - why? How is this any different from calling mark_inode_dirty_sync() from flush_sb_dirty_time()? I will note that for a while I thought copying the full inode to on-disk buffer may be problematic because inode may be in an intermediate state of some transactional change. But that isn't an issue - if there's any transactional change in progress, it has a handle open and until the change is node, thus the buffer with the partial change cannot go to the journal (transaction cannot commit) until mark_inode_dirty_sync() copies the final state of the inode. Another solution may be to convey the information that copying of timestamps is necessary to ->write_inode method. We could do that via a flag bit in writeback_control. Each filesystem can then copy timestamps when this bit is set. But calling mark_inode_dirty_sync() from __writeback_single_inode() looks simpler to me. Honza > diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c > index b93c529..95a42b3 100644 > --- a/fs/fs-writeback.c > +++ b/fs/fs-writeback.c > @@ -253,7 +253,7 @@ static bool inode_dirtied_after(struct inode *inode, unsigned long t) > */ > static int move_expired_inodes(struct list_head *delaying_queue, > struct list_head *dispatch_queue, > - struct wb_writeback_work *work) > + unsigned long *older_than_this) > { > LIST_HEAD(tmp); > struct list_head *pos, *node; > @@ -264,8 +264,8 @@ static int move_expired_inodes(struct list_head *delaying_queue, > > while (!list_empty(delaying_queue)) { > inode = wb_inode(delaying_queue->prev); > - if (work->older_than_this && > - inode_dirtied_after(inode, *work->older_than_this)) > + if (older_than_this && > + inode_dirtied_after(inode, *older_than_this)) > break; > list_move(&inode->i_wb_list, &tmp); > moved++; > @@ -309,9 +309,14 @@ out: > static void queue_io(struct bdi_writeback *wb, struct wb_writeback_work *work) > { > int moved; > + unsigned long one_day_later = jiffies + (HZ * 86400); > + > assert_spin_locked(&wb->list_lock); > list_splice_init(&wb->b_more_io, &wb->b_io); > - moved = move_expired_inodes(&wb->b_dirty, &wb->b_io, work); > + moved = move_expired_inodes(&wb->b_dirty, &wb->b_io, > + work->older_than_this); > + moved += move_expired_inodes(&wb->b_dirty_time, &wb->b_io, > + &one_day_later); > trace_writeback_queue_io(wb, work, moved); > } > > @@ -637,6 +642,17 @@ static long writeback_sb_inodes(struct super_block *sb, > } > > /* > + * If the inode is marked dirty time but is not dirty, > + * then at last for ext3 and ext4 we need to call > + * mark_inode_dirty_sync in order to get the inode > + * timestamp transferred to the on disk inode, since > + * write_inode is a no-op for those file systems. HACK HACK HACK > + */ > + if ((inode->i_state & I_DIRTY_TIME) && > + ((inode->i_state & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) == 0)) > + mark_inode_dirty_sync(inode); > + > + /* > * Don't bother with new inodes or inodes being freed, first > * kind does not need periodic writeout yet, and for the latter > * kind writeout is handled by the freer. > @@ -1233,9 +1249,10 @@ void inode_requeue_dirtytime(struct inode *inode) > spin_lock(&bdi->wb.list_lock); > spin_lock(&inode->i_lock); > if ((inode->i_state & I_DIRTY_WB) == 0) { > - if (inode->i_state & I_DIRTY_TIME) > + if (inode->i_state & I_DIRTY_TIME) { > + inode->dirtied_when = jiffies; > list_move(&inode->i_wb_list, &bdi->wb.b_dirty_time); > - else > + } else > list_del_init(&inode->i_wb_list); > } > spin_unlock(&inode->i_lock); > > Comments? > > - Ted -- Jan Kara SUSE Labs, CR From sandeen@sandeen.net Fri Nov 28 10:40:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 96B8529DF7 for ; Fri, 28 Nov 2014 10:40:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83F1B8F8052 for ; Fri, 28 Nov 2014 08:40:11 -0800 (PST) X-ASG-Debug-ID: 1417192809-04cbb01e5b8fca00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BqLTDUkgJdyruavj for ; Fri, 28 Nov 2014 08:40:09 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4E80163C3CA6; Fri, 28 Nov 2014 10:40:08 -0600 (CST) Message-ID: <5478A566.2080500@sandeen.net> Date: Fri, 28 Nov 2014 10:40:06 -0600 From: Eric Sandeen MIME-Version: 1.0 To: Jan Kara CC: xfs-oss Subject: Re: no quota output if no usage? References: <5476297F.8080304@sandeen.net> <20141126212144.GD9561@dastard> <54764582.6000005@sandeen.net> <20141126221845.GE9561@dastard> <54767030.7070706@sandeen.net> <20141127093225.GB30152@quack.suse.cz> X-ASG-Orig-Subj: Re: no quota output if no usage? In-Reply-To: <20141127093225.GB30152@quack.suse.cz> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1417192809 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/27/14 3:32 AM, Jan Kara wrote: > On Wed 26-11-14 18:28:32, Eric Sandeen wrote: >> On 11/26/14 4:18 PM, Dave Chinner wrote: >> >>>> Or am I missing something ... >>> >>> Nope, I'm confusing different reporting command behaviour.... >> >> Ok, so back to the original question: think it's cool to drop >> the verbose requirement to find out limits when there is 0 usage? > Just as a data point quota(1) command from quota-tools also doesn't > report quota entries where no space & inode is accounted without -v option. > I never thought it's particularly useful but apparently it's some heritage > from the original implementation of quota in some Unix and so I decided to > maintain compatibility... Thanks - sounds like maybe the weight of history is behind this. Perhaps it'll just be a documentation fix to clarify what happens when there's no block or inode used. -Eric > Honza > From jkbhuber@centurylink.net Sat Nov 29 05:52:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8FC1E7F3F for ; Sat, 29 Nov 2014 05:52:37 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E82B8F8049 for ; Sat, 29 Nov 2014 03:52:37 -0800 (PST) X-ASG-Debug-ID: 1417261954-04bdf0615fbd4060003-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id lvMP8p4iDuD8yWaG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 29 Nov 2014 03:52:36 -0800 (PST) X-Barracuda-Envelope-From: jkbhuber@centurylink.net X-Barracuda-Apparent-Source-IP: 205.219.233.9 DKIM-Signature: v=1; a=rsa-sha1; d=centurylink.net; s=ctl201402; c=relaxed/simple; q=dns/txt; i=@centurylink.net; t=1417261954; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=V/cMScWcEt31IED8tGtn9y69qUw=; b=3k0ZlZ6v34bZ1YIQ94ujv+SGudhyYOS+RZPcWjnwfDWNpjr0JP7p46dJlrWIcYMh 2x2Du3olddhZcMfdYZp3s9Ymoqw5EDZsGnvK01lucbBfhGFF7L6zF1eIUXiS/UHH sUnGX0NyeKIUZti8QLYZ2NwqOCpZbju7Si2DEnNEulSgJ8wIC8dSs6trM1uHZV7v GmzGGgHtqyxCkHcWfuc73rxndgsRiIwSY4aPhCJHhmOU8hVVmZHvD/DVQo58+8T4 KK8eVpnAL40n/eH5RYwhXKp6FmDEdOZQimDPXZ214wx4RSmWiuhYn2Ukw/DusgBC hg5n8fTs2RQRg/5LhQAJ+A==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=YYA/Fntf c=1 sm=1 a=FKkrIqjQGGEA:10 a=2nSVe8QEupIA:10 a=I_5RNyk1AAAA:8 a=lYOmUbz74taShFRPVSAA:9 a=QEXdDO2ut3YA:10 a=2h_eZd-_PeEA:10 a=Pi-zstWeDScA:10 a=lQ7uGnkEiLcA:10 a=fvRIlVpKwQqXeFiIV3AA:9 a=_W_S_7VecoQA:10 a=nKbv8S8nHfCvR9fH:21 a=0ZOY+l80EUD9aPsrkRtrLg==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: amtiaHViZXJAY2VudHVyeWxpbmsubmV0 Received: from [10.40.66.7] ([10.40.66.7:50246] helo=md36.agate.dfw.synacor.com) by smtp.centurylink.net (envelope-from ) (ecelerity 3.5.1.37854 r(Momo-dev:3.5.1.0)) with ESMTP id C9/04-27788-F73B9745; Sat, 29 Nov 2014 06:52:32 -0500 Date: Sat, 29 Nov 2014 06:52:31 -0500 (EST) From: Gloria Mackenzie To: Gloria Mackenzie Message-ID: <1253457884.40556294.1417261951366.JavaMail.root@centurylink.net> In-Reply-To: Subject: Re: Good Day, MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Good Day, Content-Type: multipart/alternative; boundary="----=_Part_40556293_1345270500.1417261951363" X-Originating-IP: [105.228.167.61] X-Mailer: Zimbra 7.2.2_GA_2852 (zclient/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1417261956 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_40556293_1345270500.1417261951363 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Did you receive my previous message? ------=_Part_40556293_1345270500.1417261951363 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit
Did you receive my previous message? ------=_Part_40556293_1345270500.1417261951363-- From ciechanow@ctw-energy.com Sat Nov 29 06:29:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 90BD77F3F for ; Sat, 29 Nov 2014 06:29:23 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7DE3230405F for ; Sat, 29 Nov 2014 04:29:20 -0800 (PST) X-ASG-Debug-ID: 1417264155-04cbb01e599d77c0001-NocioJ Received: from v018054.home.net.pl (v018054.home.net.pl [62.129.231.20]) by cuda.sgi.com with SMTP id wv82ol0zjzeUWY1U for ; Sat, 29 Nov 2014 04:29:15 -0800 (PST) X-Barracuda-Envelope-From: ciechanow@ctw-energy.com X-Barracuda-Apparent-Source-IP: 62.129.231.20 Received: from adsl-99-125-158-230.dsl.rcsntx.sbcglobal.net [99.125.158.230] (HELO SERVER) by ctw-energy.home.pl [62.129.231.20] with SMTP (IdeaSmtpServer v0.80) id f070788081fb49f8; Sat, 29 Nov 2014 13:29:11 +0100 List-Unsubscribe: From: "Faris Deeb" Subject: Guaranteed 3% To: xfs@oss.sgi.com X-ASG-Orig-Subj: Guaranteed 3% Content-Type: multipart/alternative; charset=utf-8; boundary="hRt=_nkINWjc5Ut72bLa48dbPplSYuEz58" MIME-Version: 1.0 Reply-To: faris_deeb@aol.com Disposition-Notification-To: "Faris Deeb" Return-Receipt-To: "Faris Deeb" Date: Sat, 29 Nov 2014 06:28:21 -0600 Message-ID: <45561817093843@server> X-Barracuda-Connect: v018054.home.net.pl[62.129.231.20] X-Barracuda-Start-Time: 1417264155 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.42 X-Barracuda-Spam-Status: No, SCORE=1.42 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, SUBJ_GUARANTEED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.42 SUBJ_GUARANTEED Subject GUARANTEED 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format --hRt=_nkINWjc5Ut72bLa48dbPplSYuEz58 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Good Day I am the Head of Finance at Sullah Finance FZE here in Abu Dhabi, UAE.= I am looking at investing over US$M900, 000,000.00 that has been place= d for investments by a private owner. If you are in need of funds to expand existing businesses or to start = up a new project, then look no further as we would be more than deligh= ted to work with you. We are driven by a project's credibility to yield investment returns a= nd should we ascertain your project as such, we will engage our funds = at guaranteed 3% Fixed Interest Rate per annum but strictly in form of= Loans. Regards, Faris Deeb Sullah Finance Fze Abu Dhabi-UAE. --hRt=_nkINWjc5Ut72bLa48dbPplSYuEz58 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline

Good Day

I am the Head of Finance at Sull= ah Finance FZE here in Abu Dhabi, UAE.

I am looking at investing over U= S$M900, 000,000.00 that has been placed for investments by a private o= wner.

If you are in need of funds to e= xpand existing businesses or to start up a new project, then look no f= urther as we would be more than delighted to work with you.

We are driven by a project's cre= dibility to yield investment returns and should we ascertain your proj= ect as such, we will engage our funds at guaranteed 3% Fixed Interest = Rate per annum but strictly in form of Loans.

Regards,

Faris Deeb
Sullah Finance Fze
Abu= Dhabi-UAE.

--hRt=_nkINWjc5Ut72bLa48dbPplSYuEz58-- From Silvia.Camina@parliament.vic.gov.au Sat Nov 29 06:56:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C3AC7F47 for ; Sat, 29 Nov 2014 06:56:41 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 68A9B8F8033 for ; Sat, 29 Nov 2014 04:56:41 -0800 (PST) X-ASG-Debug-ID: 1417265799-04cb6c0572a18cc0001-NocioJ Received: from PJSDSW2NG02.parliament.vic.gov.au (pjsdsw2ng01.parliament.vic.gov.au [203.16.24.235]) by cuda.sgi.com with ESMTP id TcgKoAgKWZ8dMBvF for ; Sat, 29 Nov 2014 04:56:39 -0800 (PST) X-Barracuda-Envelope-From: Silvia.Camina@parliament.vic.gov.au X-Barracuda-Apparent-Source-IP: 203.16.24.235 Received: from INOTES1.parliament.vic.gov.au ([192.168.11.1]) by PJSDSW2NG02.parliament.vic.gov.au (Lotus Domino Release 8.5.3FP6) with ESMTP id 2014112922104809-316307 ; Sat, 29 Nov 2014 22:10:48 +1100 MIME-Version: 1.0 Importance: Normal X-Priority: 3 (Normal) In-Reply-To: References: Subject: Please Read Donation From: Silvia.Camina@parliament.vic.gov.au X-ASG-Orig-Subj: Please Read Donation Date: Sat, 29 Nov 2014 22:14:07 +1100 Message-ID: X-Mailer: Lotus Domino Web Server Release 9.0.1 October 14, 2013 X-MIMETrack: Serialize by HTTP Server on PJSDSW2NI01/Servers/PARL(Release 9.0.1|October 14, 2013) at 29/11/2014 10:14:07 PM, Serialize complete at 29/11/2014 10:14:07 PM, Itemize by HTTP Server on PJSDSW2NI01/Servers/PARL(Release 9.0.1|October 14, 2013) at 29/11/2014 10:14:07 PM, Serialize by Router on PJSDSW2NI01/Servers/PARL(Release 9.0.1|October 14, 2013) at 29/11/2014 10:14:08 PM, Serialize complete at 29/11/2014 10:14:08 PM, Itemize by SMTP Server on PJSDSW2NG02/Servers/PARL(Release 8.5.3FP6|November 21, 2013) at 29/11/2014 22:10:48, Serialize by Router on PJSDSW2NG02/Servers/PARL(Release 8.5.3FP6|November 21, 2013) at 29/11/2014 23:54:11, Serialize complete at 29/11/2014 23:54:11 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: pjsdsw2ng01.parliament.vic.gov.au[203.16.24.235] X-Barracuda-Start-Time: 1417265799 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.91 X-Barracuda-Spam-Status: No, SCORE=1.91 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, BSF_SC7_SA298e, MAILTO_TO_SPAM_ADDR, MISSING_HEADERS, NO_REAL_NAME, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12199 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.21 MISSING_HEADERS Missing To: header 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 TO_CC_NONE No To: or Cc: header 0.50 BSF_SC0_SA620b Custom Rule SA620b 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; =20 I am Mrs. Gu Kailai and i intend to make a DONATION. Contact this E-mail fo= r more details: gukailai10@gmail.com From elfring@users.sourceforge.net Sat Nov 29 10:45:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 59A367F47 for ; Sat, 29 Nov 2014 10:45:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC3EDAC005 for ; Sat, 29 Nov 2014 08:45:41 -0800 (PST) X-ASG-Debug-ID: 1417279539-04cbb01e599eba40001-NocioJ Received: from mout.web.de (mout.web.de [212.227.15.3]) by cuda.sgi.com with ESMTP id EGFnmB4QXThC7Bg9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 29 Nov 2014 08:45:40 -0800 (PST) X-Barracuda-Envelope-From: elfring@users.sourceforge.net X-Barracuda-Apparent-Source-IP: 212.227.15.3 Received: from [192.168.1.2] ([78.49.36.109]) by smtp.web.de (mrweb002) with ESMTPSA (Nemesis) id 0MGRMG-1XhVbF1LvM-00DKba; Sat, 29 Nov 2014 17:45:29 +0100 Message-ID: <5479F823.60900@users.sourceforge.net> Date: Sat, 29 Nov 2014 17:45:23 +0100 From: SF Markus Elfring User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com CC: LKML , kernel-janitors@vger.kernel.org, Julia Lawall Subject: [PATCH 1/1] XFS: Deletion of unnecessary checks before two function calls References: <5307CAA2.8060406@users.sourceforge.net> <530A086E.8010901@users.sourceforge.net> <530A72AA.3000601@users.sourceforge.net> <530B5FB6.6010207@users.sourceforge.net> <530C5E18.1020800@users.sourceforge.net> <530CD2C4.4050903@users.sourceforge.net> <530CF8FF.8080600@users.sourceforge.net> <530DD06F.4090703@users.sourceforge.net> <5317A59D.4@users.sourceforge.net> X-ASG-Orig-Subj: [PATCH 1/1] XFS: Deletion of unnecessary checks before two function calls In-Reply-To: <5317A59D.4@users.sourceforge.net> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:cAISUDfYit9/Cz6Ehk3Qw1+5s50gXDCI7t8fiDkh5judN7mTXhi w0Sm2ZRoHay1a7kfZ0WX2X58ZvTcdDDKf94byfnSCV4NU7cOAgCwRrUn4lKx0REJXqvKiq0 xCyI9eRIP4cYkhZyiEyu8Ui3XdEuN2HI41n6de6AkLqnl5ZkKQQnEdJ49j4IXney94l7QTm 7u3/wI87iFLefFF2rzZmg== X-UI-Out-Filterresults: notjunk:1; X-Barracuda-Connect: mout.web.de[212.227.15.3] X-Barracuda-Start-Time: 1417279540 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Markus Elfring Date: Sat, 29 Nov 2014 17:40:22 +0100 The functions xfs_blkdev_put() and xfs_qm_dqrele() test whether their argument is NULL and then return immediately. Thus the test around the call is not needed. This issue was detected by using the Coccinelle software. Signed-off-by: Markus Elfring --- fs/xfs/xfs_qm.c | 12 +++++------- fs/xfs/xfs_super.c | 3 +-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index d68f230..9a4b50a 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -1749,23 +1749,21 @@ xfs_qm_vop_dqalloc( xfs_iunlock(ip, lockflags); if (O_udqpp) *O_udqpp = uq; - else if (uq) + else xfs_qm_dqrele(uq); if (O_gdqpp) *O_gdqpp = gq; - else if (gq) + else xfs_qm_dqrele(gq); if (O_pdqpp) *O_pdqpp = pq; - else if (pq) + else xfs_qm_dqrele(pq); return 0; error_rele: - if (gq) - xfs_qm_dqrele(gq); - if (uq) - xfs_qm_dqrele(uq); + xfs_qm_dqrele(gq); + xfs_qm_dqrele(uq); return error; } diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 206b97f..97eaa25 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -796,8 +796,7 @@ xfs_open_devices( out_free_ddev_targ: xfs_free_buftarg(mp, mp->m_ddev_targp); out_close_rtdev: - if (rtdev) - xfs_blkdev_put(rtdev); + xfs_blkdev_put(rtdev); out_close_logdev: if (logdev && logdev != ddev) xfs_blkdev_put(logdev); -- 2.1.3 From root@krios.tbi.univie.ac.at Sat Nov 29 23:25:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B018A7F47 for ; Sat, 29 Nov 2014 23:25:11 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 90C5430405F for ; Sat, 29 Nov 2014 21:25:08 -0800 (PST) X-ASG-Debug-ID: 1417325105-04bdf06161c8ce70001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id sGsJ2Sw7I8TXwP1W for ; Sat, 29 Nov 2014 21:25:06 -0800 (PST) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 734F35EB21; Sun, 30 Nov 2014 06:25:03 +0100 (CET) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 5F9135F32B; Sun, 30 Nov 2014 06:25:03 +0100 (CET) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20141130052503.5F9135F32B@krios.tbi.univie.ac.at> Date: Sun, 30 Nov 2014 06:25:03 +0100 (CET) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1417325105 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From somdeepdey10@gmail.com Sun Nov 30 13:59:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9AFA67F4E for ; Sun, 30 Nov 2014 13:59:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1BE2BAC001 for ; Sun, 30 Nov 2014 11:59:49 -0800 (PST) X-ASG-Debug-ID: 1417377587-04cbb01e5ab93090001-NocioJ Received: from mail-ig0-f176.google.com (mail-ig0-f176.google.com [209.85.213.176]) by cuda.sgi.com with ESMTP id YJr07ZYnF9jyLGtq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 30 Nov 2014 11:59:47 -0800 (PST) X-Barracuda-Envelope-From: somdeepdey10@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.176] Received: by mail-ig0-f176.google.com with SMTP id l13so12851447iga.15 for ; Sun, 30 Nov 2014 11:59:47 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=09+gxXzkRGRartZs40yMZ7vlzEU/7DEB+g9kESrpZbA=; b=Zd4SbicpfDqTQ2QQLNRkrROFRVxWkURTQCIEhTzHCFdujocem54fgKMQ2MW953qe5K EVhWyYpbkNfunX6Z4+j24OcKJxJv0hmhYL5angqtpq22t6k4Jw3z0W3grJk7zpEk02t/ S8B1pyx4ap7uyjEj94z3xDJlVAyKBPmpvqDBp3xeMk7kPfpEv/HT6UuE2OovcJR2LQCN RTJp952jGeHtMtlq4bwWUGWBm3A9eGPp9oaiWCQXBBV7D7G+pFk+Nk3azOLRuHSpYIlk 2JSdwvC3zUQPeqaBzuNa8O7ipVI4iUn+s58/UlGnH8+46rDYLFqY0yb0b2PmK3orRgyS IF9g== MIME-Version: 1.0 X-Received: by 10.107.16.130 with SMTP id 2mr47459892ioq.81.1417377587291; Sun, 30 Nov 2014 11:59:47 -0800 (PST) Received: by 10.107.6.164 with HTTP; Sun, 30 Nov 2014 11:59:47 -0800 (PST) In-Reply-To: References: Date: Mon, 1 Dec 2014 01:29:47 +0530 Message-ID: Subject: Re: Meeting From: Somdeep Dey X-ASG-Orig-Subj: Re: Meeting To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113fbe2e9a6ad1050918ef76 X-Barracuda-Connect: mail-ig0-f176.google.com[209.85.213.176] X-Barracuda-Start-Time: 1417377587 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12253 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message --001a113fbe2e9a6ad1050918ef76 Content-Type: text/plain; charset=UTF-8 Hi, We've now resumed working on the xfs_fsr utility as discussed before, after our exams. The first task that we undertook was to use fiemap to get file extent mappings and tried to correlate the output with the information obtained from xfs_bmap. For this we used the two underlying structures fiemap and fiemap_extent. We're now trying to use the available free space mapping patches to get free spaces in the file system. We also wanted to ask about the current status of the rmap, as we'll be required to define the interfaces that query it, as a key component of our work. Regards, A-DRS. On Mon, Dec 1, 2014 at 1:01 AM, Swapnil Pimpale wrote: > Just say that you have resumed work on the project after the exam. > > On Sun, Nov 30, 2014 at 2:16 PM, Somdeep Dey > wrote: > >> This is the final draft : >> Hi, >> We were occupied with our exams for the last two months. >> We've now resumed working on the xfs_fsr utility as discussed before. >> >> The first task that we undertook was to use fiemap to get file extent >> mappings and tried to correlate the output with the information obtained >> from xfs_bmap. For this we used the two underlying structures fiemap >> and fiemap_extent. We're now trying to use the available free space >> mapping >> patches to get free spaces in the file system. >> >> We also wanted to ask about the current status of the rmap, as we'll >> be required to define the interfaces that query it, as a key component of >> our >> work. >> >> Regards, >> A-DRS. >> >> On Sun, Nov 30, 2014 at 11:55 PM, Somdeep Dey >> wrote: >> >>> Hi, >>> We were occupied with our exams for the last two months. >>> We've now resumed working on the xfs_fsr utility as discussed before. >>> >>> The first task that we undertook was to use fiemap to get file extent >>> mappings and tried to correlate the output with the information obtained >>> from xfs_bmap. For this we used the two underlying structures fiemap >>> and fiemap_extent. We're now trying to use the available free space >>> mapping >>> patches to get free spaces in the file system. >>> >>> We also wanted to ask about the current status of the rmap, as we'll >>> be required to define the interfaces that query it, as a key component >>> of our >>> work. >>> >>> Regards, >>> A-DRS. >>> >>> On Sun, Nov 30, 2014 at 9:37 PM, Nafisa Mandliwala < >>> nafisa.mandliwala@gmail.com> wrote: >>> >>>> Umm, no need to apologize. >>>> >>>> What you showed me on Thursday was the standard fiemap ioctl that gives >>>> the extents used by a file. >>>> Say that you're now trying to use Dave's freespace mapping patches to >>>> get free spaces in the file system. >>>> Also, you're going to *define* the interfaces needed to query the >>>> rmap, not just query them. >>>> >>>> Looks fine otherwise. >>>> >>>> On Sun, Nov 30, 2014 at 9:16 PM, Somdeep Dey >>>> wrote: >>>> >>>>> Hi, >>>>> This is the mail we drafted for Dave : >>>>> >>>>> Hi, >>>>> We'd like to apologise for our unavailability over the last two months >>>>> given the occurrence of our exams. We've now resumed working on the >>>>> xfs_fsr utility as discussed before. >>>>> >>>>> The first task that we undertook was to use fiemap to get file extent >>>>> mappings and tried to correlate the output with the information >>>>> obtained >>>>> from xfs_bmap. For this we used the two underlying structures fiemap >>>>> and fiemap_extent. >>>>> >>>>> We also wanted to ask about the current status of the rmap, as we'll >>>>> be required to query the interfaces of that as a key component of our >>>>> work. >>>>> >>>>> Regards, >>>>> A-DRS. >>>>> >>>>> >>>>> Do tell us if this will suffice. >>>>> Thanks, >>>>> A-DRS. >>>>> >>>>> On Sun, Nov 30, 2014 at 9:05 PM, Somdeep Dey >>>>> wrote: >>>>> >>>>>> Hi, >>>>>> This is the mail we drafted for Dave : >>>>>> >>>>>> Hi, >>>>>> We'd like to apologise for our unavailability over the last two months >>>>>> given the occurrence of our exams. We've now resumed working on the >>>>>> xfs_fsr utility as discussed before. >>>>>> >>>>>> The first task that we undertook was to use fiemap to get file extent >>>>>> mappings and tried to correlate the output with the information >>>>>> obtained >>>>>> from xfs_bmap. For this we used the two underlying structures fiemap >>>>>> and fiemap_extent. >>>>>> >>>>>> We also wanted to ask about the current status of the rmap, as we'll >>>>>> be required to query the interfaces of that as a key component of our >>>>>> work. >>>>>> >>>>>> Regards, >>>>>> A-DRS. >>>>>> >>>>>> >>>>>> Do tell us if this will suffice. >>>>>> Thanks, >>>>>> A-DRS. >>>>>> >>>>>> On Thu, Nov 27, 2014 at 9:39 PM, Nafisa Mandliwala < >>>>>> nafisa.mandliwala@gmail.com> wrote: >>>>>> >>>>>>> Guys, you can find the xfs_alloc.h, xfs_alloc.c and xfs_iops.c in >>>>>>> linux-x.x.x/fs/xfs/ >>>>>>> Please check if it has the changes we're looking for. >>>>>>> >>>>>>> I couldn't find anything on rmap, you should write a mail asap. >>>>>>> >>>>>>> On Thu, Nov 27, 2014 at 2:40 AM, Somdeep Dey >>>>>> > wrote: >>>>>>> >>>>>>>> Hi, >>>>>>>> We ran the code for fiemap on files, that included the following >>>>>>>> three types : >>>>>>>> 1) A non-fragmented file >>>>>>>> 2) A fragmented file before using xfs_fsr >>>>>>>> 3) The defragmeneted equivalent of the above file after using >>>>>>>> xfs_fsr >>>>>>>> >>>>>>>> >>>>>>>> Thereafter we examined the data by printing the fiemap structure >>>>>>>> and fiemap_extents struct. The logs for the process followed is also >>>>>>>> attached here. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> A-DRS. >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "ADRScube" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to adrscube+unsubscribe@googlegroups.com. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/adrscube/CAJAKVEFdkSEMW84%3DTvRNqOQdNMz6nS_WRVGN-2MX5se9NUaV1A%40mail.gmail.com >>>>>>>> >>>>>>>> . >>>>>>>> >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "ADRScube" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to adrscube+unsubscribe@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/adrscube/CAJAKVEE2Lu%3DMReV9fdg0L4OvWAymJJv9qteNDm_1oHyNNcdKVw%40mail.gmail.com >> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > Swapnil > --001a113fbe2e9a6ad1050918ef76 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


--
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Swapnil
Hi,

We've now resumed working= on the xfs_fsr utility as discussed before, after our exams.
The first task that we undertook was to use fiemap to get file = extent=C2=A0
mappings and tried to correlate the output with the information o= btained
from xfs_bmap. For this we used the two underlying structures fiemap
= and fiemap_extent. We're now trying to use the available free space map= ping
patches to get free spaces in the file system.
We also wanted to ask about the current status of the rmap, as we= 9;ll
be required to define the interfaces that query it, as a key compo= nent of our
work.

Regards,
A-D= RS.


On Mon, = Dec 1, 2014 at 1:01 AM, Swapnil Pimpale <pimpale.swapnil@gmail.com= > wrote:
J= ust say that you have resumed work on the project after the exam.

On Sun, Nov 30, 2014 at 2:16 PM, Somdeep Dey <somdeepdey10@gmail.co= m> wrote:
=
This is the final draft :=C2=A0
=
Hi,
We were occupied with our exams for the last two months.
We= 've now resumed working on the xfs_fsr utility as discussed before.

The first task that we undertook was to use fiemap to= get file extent=C2=A0
mappings and tried to correlate the output= with the information obtained
from xfs_bma= p. For this we used the two underlying structures fiemap
= and fiemap_extent. We're now trying to use the available free space map= ping
patches to get free spaces in the file system.

We also wanted to ask about th= e current status of the rmap, as we'll
be required to= define the interfaces that query it, as a key component of our
w= ork.

Regards,
A-DRS.

On Sun, Nov 3= 0, 2014 at 11:55 PM, Somdeep Dey <somdeepdey10@gmail.com> wrote:
Hi,<= /div>
We were occupied with our exams for the last two months.
We've now resumed working on the xfs_fsr utility as discussed= before.

The first task that we undertook was to use f= iemap to get file extent=C2=A0
mappings a= nd tried to correlate the output with the information obtained
from xfs_bmap. For this we used the two unde= rlying structures fiemap
and fiemap_extent. We'= re now trying to use the available free space mapping
patches to get free spaces in the file system.

=
We also wanted to ask about the current status of t= he rmap, as we'll
be required to define the int= erfaces that query it, as a key component of our
work.
=
Regards,
A-DRS.

On Sun, Nov 30= , 2014 at 9:37 PM, Nafisa Mandliwala <nafisa.mandliwala@gmail.co= m> wrote:
= Umm, no need to apologize.

What you showed me on Thursda= y was the standard fiemap ioctl that gives the extents used by a file.
Say that you're now trying to use Dave's freespace mapping pa= tches to get free spaces in the file system.
Also, you're goi= ng to=C2=A0<= i>define the interfaces needed to query=C2=A0the rmap, not just query them.=

Looks fine otherwise.

On Sun, Nov 30, = 2014 at 9:16 PM, Somdeep Dey <somdeepdey10@gmail.com> w= rote:
Hi,
This is the mail we drafted for Dave :=C2=A0

Hi,
We'd like to apologise for our unavailability over the = last two months
given the occurrence of our exams. We've now = resumed working on the xfs_fsr utility as discussed before.

<= /div>
The first task that we undertook was to use fiemap to get file ex= tent=C2=A0
mappings and tried to correlate the out= put with the information obtained
from xfs_bmap. For this we used= the two underlying structures fiemap
and fiemap_extent.

We also wanted to ask about the current status of the rmap= , as we'll
be required to query the interfaces of that as a k= ey component of our
work.

Regards,
=
A-DRS.


Do tell us if this will= suffice.
Thanks,
A-DRS.
=

On Sun,= Nov 30, 2014 at 9:05 PM, Somdeep Dey <somdeepdey10@gmail.com>= wrote:
Hi,
T= his is the mail we drafted for Dave :=C2=A0

Hi,
We'd like to apologise for our unavailability over the last two= months
given the occurrence of our exams. We've now resumed working on the= xfs_fsr utility as discussed before.

The first task that we undertook was to use fiemap to = get file extent=C2=A0
mappings and tried to correlate the output with the i= nformation obtained
from xfs_bmap. For this we used the two under= lying structures fiemap
and fiemap_extent.

We also wanted to ask about the current status of the rmap, as we'll=
be required to query the interfaces of that as a key component o= f our
work.

Regards,
A-DRS.


Do tell us if this will suffice.
Thanks,
A-DRS.

On Thu, Nov 27, 2014 at 9:3= 9 PM, Nafisa Mandliwala <nafisa.mandliwala@gmail.com> wrote:
Guys, you can= find the xfs_alloc.h, xfs_alloc.c and xfs_iops.c in linux-x.x.x/fs/xfs/Please check if it has the changes we're looking for.

I couldn= 't find anything on rmap, you should write a mail asap.

Hi,
We ran the code for fiemap on files, that included =C2=A0t= he following three types :=C2=A0
1) A non-fragmented file
2) A fragmented file before using xfs_fsr
3) The defragme= neted equivalent of the above file after using xfs_fsr

=

Thereafter we examined the = data by printing the fiemap structure and fiemap_extents struct. The logs f= or the process followed is also attached here.=C2=A0

Thanks,
A-DRS.

--
You received this message because you are subscribed to the Google Groups &= quot;ADRScube" group.
To unsubscribe from this group and stop receiving emails from it, send an e= mail to adrscube+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/adrscube/CAJAKVEFdkSEMW84%3DTvRNqOQdNM= z6nS_WRVGN-2MX5se9NUaV1A%40mail.gmail.com.

For more options, visit https://groups.google.com/d/optout.






--
You received this message because you are subscribed to the Google Groups &= quot;ADRScube" group.
To unsubscribe from this group and stop receiving emails from it, send an e= mail to adrscube+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/adrscube/CAJAKVEE2Lu%3DMReV9fdg0L4OvWA= ymJJv9qteNDm_1oHyNNcdKVw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

--001a113fbe2e9a6ad1050918ef76-- From david@fromorbit.com Sun Nov 30 17:09:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B25327F51 for ; Sun, 30 Nov 2014 17:09:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 419B6AC002 for ; Sun, 30 Nov 2014 15:09:25 -0800 (PST) X-ASG-Debug-ID: 1417388958-04cb6c0571bd5220001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id S6N5pN6nEeMiBvzo for ; Sun, 30 Nov 2014 15:09:19 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjEdAM+ie1R5LLkm/2dsb2JhbABbgwaBKbNMAQEBAgEGlE+FIgICAQECgQkXAQEBAQF9hAIBAQEEOhwjEAgDFAEDCSUPBSUDIROIP9FzAQEBAQEFAQEBAR4Yhh+JYGQHgymBHwWOfY1JlUSEDyswgQSBQwEBAQ Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 09:39:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XvDc0-0001Dz-TD; Mon, 01 Dec 2014 10:09:04 +1100 Date: Mon, 1 Dec 2014 10:09:04 +1100 From: Dave Chinner To: SF Markus Elfring Cc: xfs@oss.sgi.com, LKML , kernel-janitors@vger.kernel.org, Julia Lawall Subject: Re: [PATCH 1/1] XFS: Deletion of unnecessary checks before two function calls Message-ID: <20141130230904.GF16151@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/1] XFS: Deletion of unnecessary checks before two function calls References: <530C5E18.1020800@users.sourceforge.net> <530CD2C4.4050903@users.sourceforge.net> <530CF8FF.8080600@users.sourceforge.net> <530DD06F.4090703@users.sourceforge.net> <5317A59D.4@users.sourceforge.net> <5479F823.60900@users.sourceforge.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5479F823.60900@users.sourceforge.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417388959 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12258 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Nov 29, 2014 at 05:45:23PM +0100, SF Markus Elfring wrote: > From: Markus Elfring > Date: Sat, 29 Nov 2014 17:40:22 +0100 > > The functions xfs_blkdev_put() and xfs_qm_dqrele() test whether their argument > is NULL and then return immediately. > Thus the test around the call is not needed. > > This issue was detected by using the Coccinelle software. > > Signed-off-by: Markus Elfring Looks fine. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Sun Nov 30 18:30:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id D0BCA7F55; Sun, 30 Nov 2014 18:30:11 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-coccinelle-cleanups, created. v3.18-rc2-4-gd254aae X-Git-Refname: refs/heads/xfs-coccinelle-cleanups X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: d254aaec5d1aa2997dad035db340c298eaa8d089 Message-Id: <20141201003011.D0BCA7F55@oss.sgi.com> Date: Sun, 30 Nov 2014 18:30:11 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-coccinelle-cleanups has been created at d254aaec5d1aa2997dad035db340c298eaa8d089 (commit) - Log ----------------------------------------------------------------- commit d254aaec5d1aa2997dad035db340c298eaa8d089 Author: kbuild test robot Date: Mon Dec 1 08:42:52 2014 +1100 xfs: fix simple_return.cocci warning in xfs_bmse_shift_one fs/xfs/libxfs/xfs_bmap.c:5591:1-6: WARNING: end returns can be simpified Simplify a trivial if-return sequence. Possibly combine with a preceding function call. Generated by: scripts/coccinelle/misc/simple_return.cocci CC: Brian Foster Signed-off-by: Fengguang Wu commit 8300475ebf03a54ec3c56b6b808ccbd9e1bc320d Author: kbuild test robot Date: Mon Dec 1 08:25:28 2014 +1100 xfs: fix simple_return.cocci warning in xfs_file_readdir fs/xfs/xfs_file.c:919:1-6: WARNING: end returns can be simpified and declaration on line 902 can be dropped Simplify a trivial if-return sequence. Possibly combine with a preceding function call. Generated by: scripts/coccinelle/misc/simple_return.cocci Signed-off-by: Fengguang Wu Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit b72091f2fb28fb9e2746010b54d6cc3c27924e6c Author: kbuild test robot Date: Mon Dec 1 08:24:58 2014 +1100 libxfs: fix simple_return.cocci warnings fs/xfs/libxfs/xfs_ialloc.c:1141:1-6: WARNING: end returns can be simpified Simplify a trivial if-return sequence. Possibly combine with a preceding function call. Generated by: scripts/coccinelle/misc/simple_return.cocci Signed-off-by: Fengguang Wu Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit d2a5e3c6fccb25234a594bacb056e0b3974faf49 Author: Markus Elfring Date: Mon Dec 1 08:24:20 2014 +1100 xfs: remove unnecessary null checks The functions xfs_blkdev_put() and xfs_qm_dqrele() test whether their argument is NULL and then return immediately. Thus the test around the call is not needed. This issue was detected by using the Coccinelle software. Signed-off-by: Markus Elfring Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Sun Nov 30 18:30:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id CFC057F5A; Sun, 30 Nov 2014 18:30:44 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.18-rc2-28-gc14fc01 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 216875a594e0b4fc72830e3690b8fbe7430738e2 X-Git-Newrev: c14fc01340dd0afe58d8671acc3ea5e907e707ae Message-Id: <20141201003044.CFC057F5A@oss.sgi.com> Date: Sun, 30 Nov 2014 18:30:44 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated c14fc01 Merge branch 'xfs-coccinelle-cleanups' into for-next d254aae xfs: fix simple_return.cocci warning in xfs_bmse_shift_one 8300475 xfs: fix simple_return.cocci warning in xfs_file_readdir b72091f libxfs: fix simple_return.cocci warnings d2a5e3c xfs: remove unnecessary null checks from 216875a594e0b4fc72830e3690b8fbe7430738e2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c14fc01340dd0afe58d8671acc3ea5e907e707ae Merge: 216875a d254aae Author: Dave Chinner Date: Mon Dec 1 09:03:02 2014 +1100 Merge branch 'xfs-coccinelle-cleanups' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/libxfs/xfs_bmap.c | 6 +----- fs/xfs/libxfs/xfs_ialloc.c | 6 +----- fs/xfs/xfs_file.c | 6 +----- fs/xfs/xfs_qm.c | 12 +++++------- fs/xfs/xfs_super.c | 3 +-- 5 files changed, 9 insertions(+), 24 deletions(-) hooks/post-receive -- XFS development tree From dave@fromorbit.com Sun Nov 30 18:32:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F30727F54 for ; Sun, 30 Nov 2014 18:32:39 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D242B304053 for ; Sun, 30 Nov 2014 16:32:39 -0800 (PST) X-ASG-Debug-ID: 1417393956-04cb6c0573be0d70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id N4QDCG6aC3Bsfxdl for ; Sun, 30 Nov 2014 16:32:36 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At4GANC2e1R5LLkm/2dsb2JhbABbgwaBKYMFsEcBAQECAQabAxcBAQEBAX2ELAQLASM7GAUCERUCOwM0iD+scI9GlWSBLoUJilWCa4FTBYYDrAeBSQELAYI5KzCCRwEBAQ Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 11:02:27 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XvEuO-0001Kq-UP for xfs@oss.sgi.com; Mon, 01 Dec 2014 11:32:08 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XvEuO-0007wU-Sr for xfs@oss.sgi.com; Mon, 01 Dec 2014 11:32:08 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix premature enospc on inode allocation Date: Mon, 1 Dec 2014 11:32:08 +1100 X-ASG-Orig-Subj: [PATCH] xfs: fix premature enospc on inode allocation Message-Id: <1417393928-30497-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417393956 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12262 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner After growing a filesystem, XFS can fail to allocate inodes even though there is a large amount of space available in the filesystem for inodes. The issue is caused by a nearly full allocation group having enough free space in it to be considered for inode allocation, but not enough contiguous free space to actually allocation inodes. This situation results in successful selection of the AG for allocation, then failure of the allocation resulting in ENOSPC being reported to the caller. It is caused by two possible issues. Firstly, we only consider the lognest free extent and whether it would fit an inode chunk. If the extent is not correctly aligned, then we can't allocate an inode chunk in it regardless of the fact that it is large enough. This tends to be a permanent error until space in the AG is freed. The second issue is that we don't actually lock the AGI or AGF when we are doing these checks, and so by the time we get to actually allocating the inode chunk the space we thought we had in the AG may have been allocated. This tends to be a spurious error as it requires a race to trigger. Hence this case is ignored in this patch as the reported problem is for permanent errors. The first issue could be addressed by simply taking into account the alignment when checking the longest extent. This, however, would prevent allocation in AGs that have aligned, exact sized extents free. However, this case should be fairly rare compared to the number of allocations that occur near ENOSPC that would trigger this condition. Hence, when selecting the inode AG, take into account the inode cluster alignment when checking the lognest free extent in the AG. If we can't find any AGs with a contiguous free space large enough to be aligned, drop the alignment addition and just try for an AG that has enough contiguous free space available for an inode chunk. This won't prevent issues from occurring, but should avoid situations where other AGs have lots of free space but the selected AG can't allocate due to alignment constraints. Reported-by: Arkadiusz Mi¿kiewicz Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_ialloc.c | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index d1dc590..53757bd 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -45,12 +45,12 @@ */ static inline int xfs_ialloc_cluster_alignment( - xfs_alloc_arg_t *args) + struct xfs_mount *mp) { - if (xfs_sb_version_hasalign(&args->mp->m_sb) && - args->mp->m_sb.sb_inoalignmt >= - XFS_B_TO_FSBT(args->mp, args->mp->m_inode_cluster_size)) - return args->mp->m_sb.sb_inoalignmt; + if (xfs_sb_version_hasalign(&mp->m_sb) && + mp->m_sb.sb_inoalignmt >= + XFS_B_TO_FSBT(mp, mp->m_inode_cluster_size)) + return mp->m_sb.sb_inoalignmt; return 1; } @@ -409,7 +409,7 @@ xfs_ialloc_ag_alloc( * but not to use them in the actual exact allocation. */ args.alignment = 1; - args.minalignslop = xfs_ialloc_cluster_alignment(&args) - 1; + args.minalignslop = xfs_ialloc_cluster_alignment(args.mp) - 1; /* Allow space for the inode btree to split. */ args.minleft = args.mp->m_in_maxlevels - 1; @@ -445,7 +445,7 @@ xfs_ialloc_ag_alloc( args.alignment = args.mp->m_dalign; isaligned = 1; } else - args.alignment = xfs_ialloc_cluster_alignment(&args); + args.alignment = xfs_ialloc_cluster_alignment(args.mp); /* * Need to figure out where to allocate the inode blocks. * Ideally they should be spaced out through the a.g. @@ -474,7 +474,7 @@ xfs_ialloc_ag_alloc( args.type = XFS_ALLOCTYPE_NEAR_BNO; args.agbno = be32_to_cpu(agi->agi_root); args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); - args.alignment = xfs_ialloc_cluster_alignment(&args); + args.alignment = xfs_ialloc_cluster_alignment(args.mp); if ((error = xfs_alloc_vextent(&args))) return error; } @@ -629,10 +629,24 @@ xfs_ialloc_ag_select( } /* - * Is there enough free space for the file plus a block of - * inodes? (if we need to allocate some)? + * Check that there enough free space for the file plus a chunk + * of inodes if we need to allocate some. If this is the first + * pass across the AGs, take into account the potential space + * needed for alignment of inode chunks when checking the + * longest contiguous free space in the AG - this prevents us + * from getting ENOSPC because we have free space larger than + * m_ialloc_blks but alignment constraints prevent us from using + * it. + * + * If we can't find an AG with space for full alignment slack to + * be taken into account, we must be near ENOSPC in all AGs. + * Hence we don't include alignment for the second pass and so + * if we fail allocation due to alignment issues then it is most + * likely a real ENOSPC condition. */ ineed = mp->m_ialloc_blks; + if (flags && ineed > 1) + ineed += xfs_ialloc_cluster_alignment(mp); longest = pag->pagf_longest; if (!longest) longest = pag->pagf_flcount > 0; -- 2.0.0 From dave@fromorbit.com Sun Nov 30 22:21:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 61F997F59 for ; Sun, 30 Nov 2014 22:21:04 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 480F78F8037 for ; Sun, 30 Nov 2014 20:21:04 -0800 (PST) X-ASG-Debug-ID: 1417407662-04cbb01e5abdf950001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id XvzsTB3AZHwSEXOH for ; Sun, 30 Nov 2014 20:21:02 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtEGAI/re1R5LLkm/2dsb2JhbABbgwaBKbNLAQEBAgEGmwcXAQEBAQF9hAMBBVYzCBgxOQMbGYg/0keGN4phhDIFhgOXcosBggqHCoFJAQuCOiswgkcBAQE Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 14:50:24 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XvIT5-0001d9-2Y for xfs@oss.sgi.com; Mon, 01 Dec 2014 15:20:11 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XvIT5-00026z-1H for xfs@oss.sgi.com; Mon, 01 Dec 2014 15:20:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: cleanup xfs_bmse_merge returns Date: Mon, 1 Dec 2014 15:20:08 +1100 X-ASG-Orig-Subj: [PATCH 2/2] xfs: cleanup xfs_bmse_merge returns Message-Id: <1417407608-8016-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1417407608-8016-1-git-send-email-david@fromorbit.com> References: <1417407608-8016-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417407662 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner xfs_bmse_merge() has a jump label for return that just returns the error value. Convert all the code to just return the error directly and use XFS_WANT_CORRUPTED_RETURN. This also allows the final call to xfs_bmbt_update() to return directly. Noticed while reviewing coccinelle return cleanup patches and wondering why the same return pattern as in xfs_bmse_shift_one() wasn't picked up by the checker pattern... Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 0628a67..5a42e2b 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5489,32 +5489,25 @@ xfs_bmse_merge( error = xfs_bmbt_lookup_eq(cur, got.br_startoff, got.br_startblock, got.br_blockcount, &i); if (error) - goto out_error; - XFS_WANT_CORRUPTED_GOTO(i == 1, out_error); + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); error = xfs_btree_delete(cur, &i); if (error) - goto out_error; - XFS_WANT_CORRUPTED_GOTO(i == 1, out_error); + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); /* lookup and update size of the previous extent */ error = xfs_bmbt_lookup_eq(cur, left.br_startoff, left.br_startblock, left.br_blockcount, &i); if (error) - goto out_error; - XFS_WANT_CORRUPTED_GOTO(i == 1, out_error); + return error; + XFS_WANT_CORRUPTED_RETURN(i == 1); left.br_blockcount = blockcount; - error = xfs_bmbt_update(cur, left.br_startoff, left.br_startblock, - left.br_blockcount, left.br_state); - if (error) - goto out_error; - - return 0; - -out_error: - return error; + return xfs_bmbt_update(cur, left.br_startoff, left.br_startblock, + left.br_blockcount, left.br_state); } /* -- 2.0.0 From dave@fromorbit.com Sun Nov 30 22:21:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 335617F61 for ; Sun, 30 Nov 2014 22:21:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 04AA88F8035 for ; Sun, 30 Nov 2014 20:21:02 -0800 (PST) X-ASG-Debug-ID: 1417407660-04bdf0615fdd2790001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id WtFPzfOdxPcMDWVj for ; Sun, 30 Nov 2014 20:21:00 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtEGAI/re1R5LLkm/2dsb2JhbABbgwaBKbNLAQEBAgEGmwcXAQEBAQF9hAMBBVYzCBgxOQMbGYg/0keGN4Qyhi+EMgWGA5dyhluEJoIKhwqBSQELgjorMIJHAQEB Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 14:50:24 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XvIT5-0001d8-1h for xfs@oss.sgi.com; Mon, 01 Dec 2014 15:20:11 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XvIT5-00026u-0m for xfs@oss.sgi.com; Mon, 01 Dec 2014 15:20:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: cleanup xfs_bmse_shift_one goto mess Date: Mon, 1 Dec 2014 15:20:07 +1100 X-ASG-Orig-Subj: [PATCH 1/2] xfs: cleanup xfs_bmse_shift_one goto mess Message-Id: <1417407608-8016-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1417407608-8016-1-git-send-email-david@fromorbit.com> References: <1417407608-8016-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417407660 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_bmse_shift_one() jumps around determining whether to shift or merge, making the code flow difficult to follow. Clean it up and use direct error returns (including XFS_WANT_CORRUPTED_RETURN) to make the code flow better and be easier to read. Signed-off-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 20d2e96..0628a67 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5544,35 +5544,29 @@ xfs_bmse_shift_one( startoff = got.br_startoff - offset_shift_fsb; /* delalloc extents should be prevented by caller */ - XFS_WANT_CORRUPTED_GOTO(!isnullstartblock(got.br_startblock), - out_error); + XFS_WANT_CORRUPTED_RETURN(!isnullstartblock(got.br_startblock)); /* - * If this is the first extent in the file, make sure there's enough - * room at the start of the file and jump right to the shift as there's - * no left extent to merge. + * Check for merge if we've got an extent to the left, otherwise make + * sure there's enough room at the start of the file for the shift. */ - if (*current_ext == 0) { - if (got.br_startoff < offset_shift_fsb) - return -EINVAL; - goto shift_extent; - } + if (*current_ext) { + /* grab the left extent and check for a large enough hole */ + leftp = xfs_iext_get_ext(ifp, *current_ext - 1); + xfs_bmbt_get_all(leftp, &left); - /* grab the left extent and check for a large enough hole */ - leftp = xfs_iext_get_ext(ifp, *current_ext - 1); - xfs_bmbt_get_all(leftp, &left); + if (startoff < left.br_startoff + left.br_blockcount) + return -EINVAL; - if (startoff < left.br_startoff + left.br_blockcount) + /* check whether to merge the extent or shift it down */ + if (xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) { + return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, + *current_ext, gotp, leftp, cur, + logflags); + } + } else if (got.br_startoff < offset_shift_fsb) return -EINVAL; - /* check whether to merge the extent or shift it down */ - if (!xfs_bmse_can_merge(&left, &got, offset_shift_fsb)) - goto shift_extent; - - return xfs_bmse_merge(ip, whichfork, offset_shift_fsb, *current_ext, - gotp, leftp, cur, logflags); - -shift_extent: /* * Increment the extent index for the next iteration, update the start * offset of the in-core extent and update the btree if applicable. @@ -5589,14 +5583,11 @@ shift_extent: got.br_blockcount, &i); if (error) return error; - XFS_WANT_CORRUPTED_GOTO(i == 1, out_error); + XFS_WANT_CORRUPTED_RETURN(i == 1); got.br_startoff = startoff; return xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, got.br_blockcount, got.br_state); - -out_error: - return error; } /* -- 2.0.0 From dave@fromorbit.com Sun Nov 30 22:21:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DFED87F61 for ; Sun, 30 Nov 2014 22:21:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D9EAAC002 for ; Sun, 30 Nov 2014 20:21:03 -0800 (PST) X-ASG-Debug-ID: 1417407660-04bdf0615fdd2790002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id c3nmGtv2NvTIodPE for ; Sun, 30 Nov 2014 20:21:01 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsIGAI/re1R5LLkm/2dsb2JhbABbgwa0dAEBAQIBBpsHFwEBAQEBfYRfO4ECA4hzrQ+lOIY3imGEMgWddYZbjTqBSQEBCAEBAQGCOCuCdwEBAQ Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 14:50:24 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XvIT5-0001d7-19 for xfs@oss.sgi.com; Mon, 01 Dec 2014 15:20:11 +1100 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XvIT4-00026r-WB for xfs@oss.sgi.com; Mon, 01 Dec 2014 15:20:11 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: more return cleanups Date: Mon, 1 Dec 2014 15:20:06 +1100 X-ASG-Orig-Subj: [PATCH 0/2] xfs: more return cleanups Message-Id: <1417407608-8016-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417407661 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, I noticed a bit of inconsistency when reviewing the shift extent return cleanups that coccinelle flagged. The first was that the out_error labels were basically meaningless - it jsut returns the error, and we have much neater ways of doing that. Also, the logic flow through xfs_bmse_shift_one() jumped around all over the place - it can be done lots neater without any gotos at all, and is easier to read as a result. These patches apply on top of the for-next branch (the xfs-coccinelle-cleanups branch to be precise). Cheers, Dave. From david@fromorbit.com Sun Nov 30 22:32:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8A4FB7F61 for ; Sun, 30 Nov 2014 22:32:12 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 691328F8035 for ; Sun, 30 Nov 2014 20:32:12 -0800 (PST) X-ASG-Debug-ID: 1417408329-04cb6c0572bef3c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id RyNoy5dUWAaMJuQe for ; Sun, 30 Nov 2014 20:32:10 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjsdACHue1R5LLkm/2dsb2JhbABRCoMGUVizSwEBAQIBBpMhgS6FIgICAQECgQ8XAQEBAQF9hAMBAQQ6HCMQCAMYCSUPBSUDIRMbiCTSFgEBCAIgGIYfhDKFNlwHhEgFlVKCPYQ3gWuTWYICIIFtKzCCRwEBAQ Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 15:02:08 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XvIeR-0001eN-Tg; Mon, 01 Dec 2014 15:31:55 +1100 Date: Mon, 1 Dec 2014 15:31:55 +1100 From: Dave Chinner To: Somdeep Dey Cc: xfs@oss.sgi.com Subject: Re: Meeting Message-ID: <20141201043155.GH16151@dastard> X-ASG-Orig-Subj: Re: Meeting References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417408329 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12269 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Dec 01, 2014 at 01:29:47AM +0530, Somdeep Dey wrote: > Hi, > > We've now resumed working on the xfs_fsr utility as discussed before, after > our exams. > > The first task that we undertook was to use fiemap to get file extent > mappings and tried to correlate the output with the information obtained > from xfs_bmap. For this we used the two underlying structures fiemap > and fiemap_extent. We're now trying to use the available free space mapping > patches to get free spaces in the file system. > > We also wanted to ask about the current status of the rmap, as we'll > be required to define the interfaces that query it, as a key component of > our > work. The rmap design is slowly being thrashed out. Brian and I had a discussion about it on IRC a couple of weeks ago (below). I'm relatively close to having a proof of concept for single-owner rmap btrees that works... Cheers, Dave. -- Dave Chinner david@fromorbit.com >From #xfs on freenode.net [13/11/14 10:07] foster: still around? [13/11/14 10:10] dchinner_: yep [13/11/14 10:27] foster: been prototyping reverse mapping btree code over the past couple of days [13/11/14 10:28] couple of interesting issues have come up that need discussion [13/11/14 10:28] I think I have solutions to them, but I'm sure there are other ways of solving the problems [13/11/14 10:28] basically I want the rmap btree for two purposes [13/11/14 10:29] 1) to keep owner information so we can do block-to-owner lookups efficiently [13/11/14 10:29] e.g. to identify the files corrupted by bad sectors [13/11/14 10:29] found during a media scan [13/11/14 10:31] or to provide sufficient redundant information for an online rebuild of a corrupted free space btree [13/11/14 10:32] so a btree that maps extents to inodes or something of that nature? [13/11/14 10:32] exactly [13/11/14 10:32] per-ag btree [13/11/14 10:32] that contains { start block, length, owner } [13/11/14 10:32] records [13/11/14 10:32] ok [13/11/14 10:33] that's relatively easy to do [13/11/14 10:33] The patches I've written do that. [13/11/14 10:33] (not that it does anything other than compile yet) [13/11/14 10:33] however, there is a second reason for having a reverse mapping tree [13/11/14 10:34] it's for reference counting extents shared between inodes [13/11/14 10:34] ah, reflink? [13/11/14 10:34] i.e. to implement reflink semantics [13/11/14 10:34] *nod* [13/11/14 10:35] this doesn't affect how the ramp btree interacts with the rest of the allocation/freeing code [13/11/14 10:35] but it does affect the "extent owner" tracking [13/11/14 10:35] i.e. we can now have multiple owners of an extent [13/11/14 10:36] so that btree record now becomes {stat, len, refcount, owner, owner, .... owner } [13/11/14 10:36] yeah [13/11/14 10:36] and we can't do that with the generic btree infrastructure because it's all based around fixed length records [13/11/14 10:38] I've come up with a way of using fixed length records to implement this variable length shared rmap record [13/11/14 10:38] which uses the high bit of the start block number to distinguish between the types of records [13/11/14 10:39] and, in some cases, also uses the high bit of the extent length field to hold more information again. [13/11/14 10:40] but the issue is that it's quite complicated [13/11/14 10:40] and there's some interesting warts around records that span multiple btree blocks [13/11/14 10:41] because they've been shared across hundreds of owners [13/11/14 10:43] I can't see any obvious way of tracking owner information another way when we have shared extents [13/11/14 10:44] it's an 1:N mapping [13/11/14 10:44] this information that's encoded in the record indicates the length of the record, or some kind of record chaining method..? [13/11/14 10:44] both ;) [13/11/14 10:45] heh, ok [13/11/14 10:45] the first record becomes { start block, length, refcount, owner records} [13/11/14 10:45] and so a shared extent record looks like: [13/11/14 10:46] {{ master extent record}, {owner record }, {owner record }, .... {owner record}} [13/11/14 10:46] when an owner record is simply {owner #1, owner #2} [13/11/14 10:47] so both the master record and the owner record are teh same size (16 bytes) [13/11/14 10:48] so you can see how it can be problematic when a btree block only contains owner records [13/11/14 10:48] there's no start/len information, and so it's problematic for indexing that block in the higher levels of the btree [13/11/14 10:49] as the higher levels need to point to the master records.... [13/11/14 10:49] I'm missing how the master record refers to the owner record [13/11/14 10:50] does it, or it's simply followed by the owner records? [13/11/14 10:50] owner records always follow the master record [13/11/14 10:50] ok [13/11/14 10:50] right [13/11/14 10:51] So what I'm wondering is whether you think this is way too complex [13/11/14 10:51] or whether we might do better to have some other representation [13/11/14 10:52] such as keeping owner records in a different tree [13/11/14 10:53] or even not keeping them at all for shared extents [13/11/14 10:53] sounds somewhat hairy at first, my first reaction is to think about whether there's some kind of level of indirection [13/11/14 10:53] but i obviously haven't thought about this much at all [13/11/14 10:54] right, and I'm trying not to expose you to allthe gruesome details of what I've come up with ;) [13/11/14 10:54] just enough to describe the problem [13/11/14 10:54] understood, i think i get the gist of it [13/11/14 10:54] effectively creating first order/second order records within the tree [13/11/14 10:55] right [13/11/14 10:55] or chaining or whatever the best terminology is ;) [13/11/14 10:56] hmmm, which triggers me immediately to think of an interesting btree extension [13/11/14 10:57] hmm, a second tree is an interesting thought [13/11/14 10:57] or some kind of magic/hidden owner inode that handles shared records [13/11/14 10:57] which, at first glance, makes it very similar to the directory btree structure.... [13/11/14 10:59] need to think about that more.... [13/11/14 11:02] (basically adding another level below the current leaf level of the btree that only holds owner records) [13/11/14 11:06] interesting, though i'm not familiar enough with the on-disk dir structure to reason about off hand From david@fromorbit.com Sun Nov 30 23:08:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A936329DF7 for ; Sun, 30 Nov 2014 23:08:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 296D9AC002 for ; Sun, 30 Nov 2014 21:08:50 -0800 (PST) X-ASG-Debug-ID: 1417410527-04cbb01e59bec350001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id YfZ1mD8Uvk7apXTV for ; Sun, 30 Nov 2014 21:08:48 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkYQAEP3e1R5LLkm/2dsb2JhbABbDoJ4gSmzTAEBAQIBBpRPhSIEAgKBDxcBAQEBAX2EAgEBAQMBOhwjBQsIAxgJJQ8FJQMKFxOINwjRegEBAQcCIBiGH4pEB4RIBY59jUmVRIM7VCswgQYkgR0BAQE Received: from ppp121-44-185-38.lns20.syd7.internode.on.net (HELO dastard) ([121.44.185.38]) by ipmail07.adl2.internode.on.net with ESMTP; 01 Dec 2014 15:38:35 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XvJDi-0001hL-Ie; Mon, 01 Dec 2014 16:08:22 +1100 Date: Mon, 1 Dec 2014 16:08:22 +1100 From: Dave Chinner To: Li Mengyang Cc: xfs@oss.sgi.com, Erez Zadok , miklos@szeredi.hu, fstests@vger.kernel.org Subject: Re: Support overlayfs testing. Message-ID: <20141201050822.GI16151@dastard> X-ASG-Orig-Subj: Re: Support overlayfs testing. References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1417410527 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.12271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [cc fstests@vger.kernel.org] On Sat, Nov 15, 2014 at 03:41:39PM -0500, Li Mengyang wrote: > Hi, > Recently people are proposing overlayfs for inclusion into the mainline, I > found it could be helpful if xfstests supports overlayfs testing. Here is > the patch and example configuration file for that. Thank you. Sorry, I missed this in all the other stuff going paston the xfs list. In future, can you send patches to xfstests to fstests@vger.kernel.org? > diff --git a/common/rc b/common/rc > index d5e3aff..efa0fac 100644 > --- a/common/rc > +++ b/common/rc > @@ -1133,6 +1133,24 @@ _require_test() > _notrun "this test requires a valid \$TEST_DIR and unique $TEST_DEV" > fi > ;; > + overlayfs) > + if [ -z "$OVLFS_LOWERDIR" -o ! -d "$OVLFS_LOWERDIR" ]; > + then > + _notrun "this test requires a valid \$OVLFS_LOWERDIR" > + fi > + if [ -z "$OVLFS_UPPERDIR" -o ! -d "$OVLFS_UPPERDIR" ]; > + then > + _notrun "this test requires a valid \$OVLFS_UPPERDIR" > + fi > + if [ -z "$OVLFS_WORKDIR" -o ! -d "$OVLFS_WORKDIR" ]; > + then > + _notrun "this test requires a valid \$OVLFS_WORKDIR" > + fi Why do these varibles need to be declared and checked by the test harness? They are purely mount option fields, and so if they don't exist mount will fail, right? Indeed, if you're going to start validating such variables, then you'd need to check they don't point at the same directory, etc. i.e. I don't think this actually belongs here.... > + if [ -z "$TEST_DIR" -o ! -d "$TEST_DIR" ]; > + then > + _notrun "this test requires a valid \$TEST_DIR" > + fi Why would you not test for $TEST_DEV, too? > + ;; > *) > if [ -z "$TEST_DEV" -o "`_is_block_dev $TEST_DEV`" = "" ] > then > @@ -1947,6 +1965,9 @@ _check_test_fs() > tmpfs) > # no way to check consistency for tmpfs > ;; > + overlayfs) > + # no way to check consistency for overlayfs > + ;; > *) > _check_generic_filesystem $TEST_DEV > ;; > diff --git a/configs/overlayfs.config b/configs/overlayfs.config > new file mode 100644 > index 0000000..42ef975 > --- /dev/null > +++ b/configs/overlayfs.config > @@ -0,0 +1,16 @@ > +# Example config for overlayfs > +# source me before run ./check > + > +export OVLFS_LOWERDIR=/mnt/ovllower > +export OVLFS_UPPERDIR=/mnt/ovlupper > +export OVLFS_WORKDIR=/mnt/workdir > + > +export TEST_DIR=/mnt/merged > +export TEST_DEV=/dev/loop0 Slightly confused. I'm trying to understand what the TEST_DEV has to do with the overlayfs mount. Understand that I know *nothing* about how overlayfs should be set up, and neither will most people who want to add a FSTYP=overlayfs to their config section to test that overlayfs works on the filesystem they develop/maintain. I think that the "How to set up overlayfs" needs to be documented in the README file, not left as an exercise for the reader to reverse engineer what a template is supposed to do. i.e. if I want to test overlayfs on XFS and I already have /dev/vda as an XFS filesystem, exactly what do I do need to do to make xfstests work? > +export TEST_FS_MOUNT_OPTS=-olowerdir=$OVLFS_LOWERDIR,\ > +upperdir=$OVLFS_UPPERDIR,workdir=$OVLFS_WORKDIR > + > +unset SCRATCH_DEV > +unset SCRATCH_MNT No need to unset variables you don't need, nor is there any need to export them - the test harness will export them as appropriate Cheers, Dave. -- Dave Chinner david@fromorbit.com