From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8EE52238C1F; Tue, 10 Mar 2026 01:17:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773105464; cv=none; b=QU2RnAY/0B8JrNwWfmZMVGMG0ITtfEYgvUlz51gb014d7b3Z+g9enWMfY0pOImvour1Lzz/XFEEt1QSWGhOkzdF7cTFZ1fsdlkiojOLOZWXVgREQUpM4d/EzOWSW+cnxaFTslNGmVIgRMOSKCuzrQ5xBljdcKMfzXbG4Or5f0Co= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773105464; c=relaxed/simple; bh=56nUjjKM7Ah5K6O4pNWS96wSR3WUSaWfhbp+8xaYKE8=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=HT0WZDcOSHKBeWKygVuH6fvMNckpmgAdmzwYLg8+KuHHEbvOKvoO5urMNTXzEIwuI04fWOVCwmmSZe5MkxU/BHFHFhW+K0hTl4k792BnMiyG8QiYqEzceNUbRL8os8PH0uB+u+aVb7sX0ymlG4Wd5vAWjAho+wTUo+a5GlgYz0E= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=stFSN5L8; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="stFSN5L8" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 293B4C4CEF7; Tue, 10 Mar 2026 01:17:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773105464; bh=56nUjjKM7Ah5K6O4pNWS96wSR3WUSaWfhbp+8xaYKE8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=stFSN5L8sfCRPDMCe2F664UFPXnPmY8Pgr0bJXpIWNcENTM+E1sba/PXsnWA8wdoc sTy4itKJFWuH0zv0qcO87Xa65d6MRqq1ypre2/fX9RPuddA+lS6c5XqMOGRGyx6rYM Q4pjVzVx4kTAYyLHtkhM30XllxejOcI3+Luv5i1ygTfsDLEI0djm3BDssJvYLTFccF eOorbzm3opINq+yp2zWpEkBxKLBLz6hYBtp1eRG/UPh89mR2ALJcijZ6fLkiFiPL94 ReXr8LH1jIhJK6Moxl+0GrP2n4FvOvf7PewhzUbrGlSKyVWAAZG48l1eQtmBeThwc0 wSsmmYYAHNymg== Date: Mon, 9 Mar 2026 18:17:43 -0700 From: "Darrick J. Wong" To: Andrey Albershteyn Cc: linux-xfs@vger.kernel.org, fsverity@lists.linux.dev, linux-fsdevel@vger.kernel.org, ebiggers@kernel.org, hch@lst.de, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-btrfs@vger.kernel.org Subject: Re: [PATCH v4 16/25] xfs: handle fsverity I/O in write/read path Message-ID: <20260310011743.GD1105363@frogsfrogsfrogs> References: <20260309192355.176980-1-aalbersh@kernel.org> <20260309192355.176980-17-aalbersh@kernel.org> Precedence: bulk X-Mailing-List: fsverity@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20260309192355.176980-17-aalbersh@kernel.org> On Mon, Mar 09, 2026 at 08:23:31PM +0100, Andrey Albershteyn wrote: > For write/writeback set IOMAP_F_FSVERITY flag telling iomap to not > update inode size and to not skip folios beyond EOF. > > Initiate fsverity writeback with IOMAP_F_FSVERITY set to tell iomap > should not skip folio that is dirty beyond EOF. > > In read path let iomap know that we are reading fsverity metadata. So, > treat holes in the tree as request to synthesize tree blocks and hole > after descriptor as end of the fsverity region. > > Introduce a new inode flag meaning that merkle tree is being build on > the inode. > > Signed-off-by: Andrey Albershteyn > --- > fs/xfs/Makefile | 1 + > fs/xfs/libxfs/xfs_bmap.c | 7 +++++++ > fs/xfs/xfs_aops.c | 16 +++++++++++++++- > fs/xfs/xfs_fsverity.c | 34 ++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_fsverity.h | 20 ++++++++++++++++++++ > fs/xfs/xfs_inode.h | 6 ++++++ > fs/xfs/xfs_iomap.c | 15 +++++++++++++-- > 7 files changed, 96 insertions(+), 3 deletions(-) > create mode 100644 fs/xfs/xfs_fsverity.c > create mode 100644 fs/xfs/xfs_fsverity.h > > diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile > index 9f7133e02576..38b7f51e5d84 100644 > --- a/fs/xfs/Makefile > +++ b/fs/xfs/Makefile > @@ -149,6 +149,7 @@ xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o > xfs-$(CONFIG_SYSCTL) += xfs_sysctl.o > xfs-$(CONFIG_COMPAT) += xfs_ioctl32.o > xfs-$(CONFIG_EXPORTFS_BLOCK_OPS) += xfs_pnfs.o > +xfs-$(CONFIG_FS_VERITY) += xfs_fsverity.o > > # notify failure > ifeq ($(CONFIG_MEMORY_FAILURE),y) > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 7a4c8f1aa76c..931d02678d19 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -41,6 +41,8 @@ > #include "xfs_inode_util.h" > #include "xfs_rtgroup.h" > #include "xfs_zone_alloc.h" > +#include "xfs_fsverity.h" > +#include > > struct kmem_cache *xfs_bmap_intent_cache; > > @@ -4451,6 +4453,11 @@ xfs_bmapi_convert_one_delalloc( > XFS_STATS_ADD(mp, xs_xstrat_bytes, XFS_FSB_TO_B(mp, bma.length)); > XFS_STATS_INC(mp, xs_xstrat_quick); > > + if (xfs_iflags_test(ip, XFS_VERITY_CONSTRUCTION) && > + XFS_FSB_TO_B(mp, bma.got.br_startoff) >= > + xfs_fsverity_metadata_offset(ip)) > + flags |= IOMAP_F_FSVERITY; > + > ASSERT(!isnullstartblock(bma.got.br_startblock)); > xfs_bmbt_to_iomap(ip, iomap, &bma.got, 0, flags, > xfs_iomap_inode_sequence(ip, flags)); > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index f279055fcea0..9503252a0fa4 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -22,6 +22,7 @@ > #include "xfs_icache.h" > #include "xfs_zone_alloc.h" > #include "xfs_rtgroup.h" > +#include "xfs_fsverity.h" > #include > > struct xfs_writepage_ctx { > @@ -339,12 +340,16 @@ xfs_map_blocks( > int retries = 0; > int error = 0; > unsigned int *seq; > + unsigned int iomap_flags = 0; > > if (xfs_is_shutdown(mp)) > return -EIO; > > XFS_ERRORTAG_DELAY(mp, XFS_ERRTAG_WB_DELAY_MS); > > + if (xfs_iflags_test(ip, XFS_VERITY_CONSTRUCTION)) > + iomap_flags |= IOMAP_F_FSVERITY; > + > /* > * COW fork blocks can overlap data fork blocks even if the blocks > * aren't shared. COW I/O always takes precedent, so we must always > @@ -432,7 +437,8 @@ xfs_map_blocks( > isnullstartblock(imap.br_startblock)) > goto allocate_blocks; > > - xfs_bmbt_to_iomap(ip, &wpc->iomap, &imap, 0, 0, XFS_WPC(wpc)->data_seq); > + xfs_bmbt_to_iomap(ip, &wpc->iomap, &imap, 0, iomap_flags, > + XFS_WPC(wpc)->data_seq); > trace_xfs_map_blocks_found(ip, offset, count, whichfork, &imap); > return 0; > allocate_blocks: > @@ -705,6 +711,14 @@ xfs_vm_writepages( > }, > }; > > + /* > + * Writeback does not work for folios past EOF, let it know that > + * I/O happens for fsverity metadata and this restriction need > + * to be skipped > + */ > + if (xfs_iflags_test(ip, XFS_VERITY_CONSTRUCTION)) > + wpc.ctx.iomap.flags |= IOMAP_F_FSVERITY; > + > return iomap_writepages(&wpc.ctx); > } > } > diff --git a/fs/xfs/xfs_fsverity.c b/fs/xfs/xfs_fsverity.c > new file mode 100644 > index 000000000000..bc6020cc6e41 > --- /dev/null > +++ b/fs/xfs/xfs_fsverity.c > @@ -0,0 +1,34 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2026 Red Hat, Inc. > + */ > +#include "xfs_platform.h" > +#include "xfs_format.h" > +#include "xfs_inode.h" > +#include "xfs_shared.h" > +#include "xfs_trans_resv.h" > +#include "xfs_mount.h" > +#include "xfs_fsverity.h" > +#include "xfs_fsverity.h" > +#include > +#include > + > +/* > + * At maximum of 8 levels with 128 hashes per block (32 bytes SHA-256) maximum > + * tree size is ((128^8 − 1)/(128 − 1)) = 567*10^12 blocks. This should fit in > + * 53 bits address space. > + * > + * At this Merkle tree size we can cover 295EB large file. This is much larger > + * than the currently supported file size. > + * > + * For sha512 the largest file we can cover ends at 1 << 50 offset, this is also > + * good. > + */ > +#define XFS_FSVERITY_LARGEST_FILE ((loff_t)1ULL << 53) I think this ought to go in xfs_format.h since it's related to the ondisk file layout. In addition, I think the roundup value ought to get its own #define in xfs_format.h similar to the way btrfs does it. #define XFS_FSVERITY_START_ALIGN (65536) > + > +loff_t > +xfs_fsverity_metadata_offset( > + const struct xfs_inode *ip) > +{ > + return round_up(i_size_read(VFS_IC(ip)), 65536); > +} then this turns into: loff_t xfs_fsverity_metadata_offset( const struct xfs_inode *ip) { return round_up(i_size_read(VFS_IC(ip)), XFS_FSVERITY_START_ALIGN); } With those two #define things addressed, I'm satisfied Reviewed-by: "Darrick J. Wong" --D > diff --git a/fs/xfs/xfs_fsverity.h b/fs/xfs/xfs_fsverity.h > new file mode 100644 > index 000000000000..5771db2cd797 > --- /dev/null > +++ b/fs/xfs/xfs_fsverity.h > @@ -0,0 +1,20 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (C) 2026 Red Hat, Inc. > + */ > +#ifndef __XFS_FSVERITY_H__ > +#define __XFS_FSVERITY_H__ > + > +#include "xfs_platform.h" > + > +#ifdef CONFIG_FS_VERITY > +loff_t xfs_fsverity_metadata_offset(const struct xfs_inode *ip); > +#else > +static inline loff_t xfs_fsverity_metadata_offset(const struct xfs_inode *ip) > +{ > + WARN_ON_ONCE(1); > + return ULLONG_MAX; > +} > +#endif /* CONFIG_FS_VERITY */ > + > +#endif /* __XFS_FSVERITY_H__ */ > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index bd6d33557194..6df48d68a919 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -415,6 +415,12 @@ static inline bool xfs_inode_can_sw_atomic_write(const struct xfs_inode *ip) > */ > #define XFS_IREMAPPING (1U << 15) > > +/* > + * fs-verity's Merkle tree is under construction. The file is read-only, the > + * only writes happening are for the fsverity metadata. > + */ > +#define XFS_VERITY_CONSTRUCTION (1U << 16) > + > /* All inode state flags related to inode reclaim. */ > #define XFS_ALL_IRECLAIM_FLAGS (XFS_IRECLAIMABLE | \ > XFS_IRECLAIM | \ > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 9c2f12d5fec9..71ccd4ff5f48 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -32,6 +32,8 @@ > #include "xfs_rtbitmap.h" > #include "xfs_icache.h" > #include "xfs_zone_alloc.h" > +#include "xfs_fsverity.h" > +#include > > #define XFS_ALLOC_ALIGN(mp, off) \ > (((off) >> mp->m_allocsize_log) << mp->m_allocsize_log) > @@ -1789,6 +1791,9 @@ xfs_buffered_write_iomap_begin( > return xfs_direct_write_iomap_begin(inode, offset, count, > flags, iomap, srcmap); > > + if (xfs_iflags_test(ip, XFS_VERITY_CONSTRUCTION)) > + iomap_flags |= IOMAP_F_FSVERITY; > + > error = xfs_qm_dqattach(ip); > if (error) > return error; > @@ -2113,12 +2118,17 @@ xfs_read_iomap_begin( > bool shared = false; > unsigned int lockmode = XFS_ILOCK_SHARED; > u64 seq; > + unsigned int iomap_flags = 0; > > ASSERT(!(flags & (IOMAP_WRITE | IOMAP_ZERO))); > > if (xfs_is_shutdown(mp)) > return -EIO; > > + if (fsverity_active(inode) && > + (offset >= xfs_fsverity_metadata_offset(ip))) > + iomap_flags |= IOMAP_F_FSVERITY; > + > error = xfs_ilock_for_iomap(ip, flags, &lockmode); > if (error) > return error; > @@ -2132,8 +2142,9 @@ xfs_read_iomap_begin( > if (error) > return error; > trace_xfs_iomap_found(ip, offset, length, XFS_DATA_FORK, &imap); > - return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, > - shared ? IOMAP_F_SHARED : 0, seq); > + iomap_flags |= shared ? IOMAP_F_SHARED : 0; > + > + return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, iomap_flags, seq); > } > > const struct iomap_ops xfs_read_iomap_ops = { > -- > 2.51.2 > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id CAB7FFCC9A2 for ; Tue, 10 Mar 2026 01:17:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Transfer-Encoding:Content-Type:Cc: Reply-To:From:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Subject:In-Reply-To:MIME-Version:References: Message-ID:To:Date:Sender:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=6Pl/tthRzjgcL4B3O8EUkstoIqADd2mwpqV/dKUVmhM=; b=ii/esGYooMlz8/vs4/Ima7DFNU UNwArmRq1OMxtKcMyktDg3ytGDYIrMMbC6ceiqhbZ6nHwd5W+V256XWjwjVzuGy8B05NYSixQlebz sWGUtEaS779k7hWRl8pEvFVZa1IbLcOT57zP912iJHMfSXRRMm0fXiDr/u8sym9dflZY=; Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1vzljP-00080k-Tw; Tue, 10 Mar 2026 01:17:56 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1vzljO-00080Y-VB for linux-f2fs-devel@lists.sourceforge.net; Tue, 10 Mar 2026 01:17:55 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=In-Reply-To:Content-Transfer-Encoding:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=mMsWtjFfdzc2pb1gJCuGw/ksE2opqcinsWgN8sAvXtg=; b=cc6WVVTrR8qDEZTg8c6geDqBka n2PeWaQQbW6Hy7p1qcA35mDfymTJpLsNIGCSodDvzCTWgeOV31HApHwBvPNsNNxt1yb7Xdkp7+ByB /wuXTzSdNfHps5VyfMTno9LMsqnz6GIPhB6bOWkf0W++NLLDjYa3R/xabILdCa6yTc3k=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=mMsWtjFfdzc2pb1gJCuGw/ksE2opqcinsWgN8sAvXtg=; b=CWiS6RPkUeqokpBMBQS0IIZZc8 IR3e8QqK9TNmpACI6LpCJ6KPlaDFQkPOVbNWlIQyajgdH93kX1S7G1JIX95HMzt42RTRpqZh9EVZ8 RMmfk88W2TktnFtPpsqOSepqopCKLEojBeQYouqGl0MKZf6IcqmeJbvQAzDenv3UpqYo=; Received: from sea.source.kernel.org ([172.234.252.31]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1vzljO-0007lK-T5 for linux-f2fs-devel@lists.sourceforge.net; Tue, 10 Mar 2026 01:17:55 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 5289E43D25; Tue, 10 Mar 2026 01:17:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 293B4C4CEF7; Tue, 10 Mar 2026 01:17:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1773105464; bh=56nUjjKM7Ah5K6O4pNWS96wSR3WUSaWfhbp+8xaYKE8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=stFSN5L8sfCRPDMCe2F664UFPXnPmY8Pgr0bJXpIWNcENTM+E1sba/PXsnWA8wdoc sTy4itKJFWuH0zv0qcO87Xa65d6MRqq1ypre2/fX9RPuddA+lS6c5XqMOGRGyx6rYM Q4pjVzVx4kTAYyLHtkhM30XllxejOcI3+Luv5i1ygTfsDLEI0djm3BDssJvYLTFccF eOorbzm3opINq+yp2zWpEkBxKLBLz6hYBtp1eRG/UPh89mR2ALJcijZ6fLkiFiPL94 ReXr8LH1jIhJK6Moxl+0GrP2n4FvOvf7PewhzUbrGlSKyVWAAZG48l1eQtmBeThwc0 wSsmmYYAHNymg== Date: Mon, 9 Mar 2026 18:17:43 -0700 To: Andrey Albershteyn Message-ID: <20260310011743.GD1105363@frogsfrogsfrogs> References: <20260309192355.176980-1-aalbersh@kernel.org> <20260309192355.176980-17-aalbersh@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20260309192355.176980-17-aalbersh@kernel.org> X-Headers-End: 1vzljO-0007lK-T5 Subject: Re: [f2fs-dev] [PATCH v4 16/25] xfs: handle fsverity I/O in write/read path X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: "Darrick J. Wong via Linux-f2fs-devel" Reply-To: "Darrick J. Wong" Cc: fsverity@lists.linux.dev, ebiggers@kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, hch@lst.de, linux-btrfs@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net T24gTW9uLCBNYXIgMDksIDIwMjYgYXQgMDg6MjM6MzFQTSArMDEwMCwgQW5kcmV5IEFsYmVyc2h0 ZXluIHdyb3RlOgo+IEZvciB3cml0ZS93cml0ZWJhY2sgc2V0IElPTUFQX0ZfRlNWRVJJVFkgZmxh ZyB0ZWxsaW5nIGlvbWFwIHRvIG5vdAo+IHVwZGF0ZSBpbm9kZSBzaXplIGFuZCB0byBub3Qgc2tp cCBmb2xpb3MgYmV5b25kIEVPRi4KPiAKPiBJbml0aWF0ZSBmc3Zlcml0eSB3cml0ZWJhY2sgd2l0 aCBJT01BUF9GX0ZTVkVSSVRZIHNldCB0byB0ZWxsIGlvbWFwCj4gc2hvdWxkIG5vdCBza2lwIGZv bGlvIHRoYXQgaXMgZGlydHkgYmV5b25kIEVPRi4KPiAKPiBJbiByZWFkIHBhdGggbGV0IGlvbWFw IGtub3cgdGhhdCB3ZSBhcmUgcmVhZGluZyBmc3Zlcml0eSBtZXRhZGF0YS4gU28sCj4gdHJlYXQg aG9sZXMgaW4gdGhlIHRyZWUgYXMgcmVxdWVzdCB0byBzeW50aGVzaXplIHRyZWUgYmxvY2tzIGFu ZCBob2xlCj4gYWZ0ZXIgZGVzY3JpcHRvciBhcyBlbmQgb2YgdGhlIGZzdmVyaXR5IHJlZ2lvbi4K PiAKPiBJbnRyb2R1Y2UgYSBuZXcgaW5vZGUgZmxhZyBtZWFuaW5nIHRoYXQgbWVya2xlIHRyZWUg aXMgYmVpbmcgYnVpbGQgb24KPiB0aGUgaW5vZGUuCj4gCj4gU2lnbmVkLW9mZi1ieTogQW5kcmV5 IEFsYmVyc2h0ZXluIDxhYWxiZXJzaEBrZXJuZWwub3JnPgo+IC0tLQo+ICBmcy94ZnMvTWFrZWZp bGUgICAgICAgICAgfCAgMSArCj4gIGZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYyB8ICA3ICsrKysr KysKPiAgZnMveGZzL3hmc19hb3BzLmMgICAgICAgIHwgMTYgKysrKysrKysrKysrKysrLQo+ICBm cy94ZnMveGZzX2ZzdmVyaXR5LmMgICAgfCAzNCArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrCj4gIGZzL3hmcy94ZnNfZnN2ZXJpdHkuaCAgICB8IDIwICsrKysrKysrKysrKysrKysr KysrCj4gIGZzL3hmcy94ZnNfaW5vZGUuaCAgICAgICB8ICA2ICsrKysrKwo+ICBmcy94ZnMveGZz X2lvbWFwLmMgICAgICAgfCAxNSArKysrKysrKysrKysrLS0KPiAgNyBmaWxlcyBjaGFuZ2VkLCA5 NiBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZnMv eGZzL3hmc19mc3Zlcml0eS5jCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcy94ZnMveGZzX2ZzdmVy aXR5LmgKPiAKPiBkaWZmIC0tZ2l0IGEvZnMveGZzL01ha2VmaWxlIGIvZnMveGZzL01ha2VmaWxl Cj4gaW5kZXggOWY3MTMzZTAyNTc2Li4zOGI3ZjUxZTVkODQgMTAwNjQ0Cj4gLS0tIGEvZnMveGZz L01ha2VmaWxlCj4gKysrIGIvZnMveGZzL01ha2VmaWxlCj4gQEAgLTE0OSw2ICsxNDksNyBAQCB4 ZnMtJChDT05GSUdfWEZTX1BPU0lYX0FDTCkJKz0geGZzX2FjbC5vCj4gIHhmcy0kKENPTkZJR19T WVNDVEwpCQkrPSB4ZnNfc3lzY3RsLm8KPiAgeGZzLSQoQ09ORklHX0NPTVBBVCkJCSs9IHhmc19p b2N0bDMyLm8KPiAgeGZzLSQoQ09ORklHX0VYUE9SVEZTX0JMT0NLX09QUykJKz0geGZzX3BuZnMu bwo+ICt4ZnMtJChDT05GSUdfRlNfVkVSSVRZKQkJKz0geGZzX2ZzdmVyaXR5Lm8KPiAgCj4gICMg bm90aWZ5IGZhaWx1cmUKPiAgaWZlcSAoJChDT05GSUdfTUVNT1JZX0ZBSUxVUkUpLHkpCj4gZGlm ZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2Jt YXAuYwo+IGluZGV4IDdhNGM4ZjFhYTc2Yy4uOTMxZDAyNjc4ZDE5IDEwMDY0NAo+IC0tLSBhL2Zz L3hmcy9saWJ4ZnMveGZzX2JtYXAuYwo+ICsrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYwo+ IEBAIC00MSw2ICs0MSw4IEBACj4gICNpbmNsdWRlICJ4ZnNfaW5vZGVfdXRpbC5oIgo+ICAjaW5j bHVkZSAieGZzX3J0Z3JvdXAuaCIKPiAgI2luY2x1ZGUgInhmc196b25lX2FsbG9jLmgiCj4gKyNp bmNsdWRlICJ4ZnNfZnN2ZXJpdHkuaCIKPiArI2luY2x1ZGUgPGxpbnV4L2ZzdmVyaXR5Lmg+Cj4g IAo+ICBzdHJ1Y3Qga21lbV9jYWNoZQkJKnhmc19ibWFwX2ludGVudF9jYWNoZTsKPiAgCj4gQEAg LTQ0NTEsNiArNDQ1MywxMSBAQCB4ZnNfYm1hcGlfY29udmVydF9vbmVfZGVsYWxsb2MoCj4gIAlY RlNfU1RBVFNfQUREKG1wLCB4c194c3RyYXRfYnl0ZXMsIFhGU19GU0JfVE9fQihtcCwgYm1hLmxl bmd0aCkpOwo+ICAJWEZTX1NUQVRTX0lOQyhtcCwgeHNfeHN0cmF0X3F1aWNrKTsKPiAgCj4gKwlp ZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNfVkVSSVRZX0NPTlNUUlVDVElPTikgJiYKPiArCSAg ICBYRlNfRlNCX1RPX0IobXAsIGJtYS5nb3QuYnJfc3RhcnRvZmYpID49Cj4gKwkJICAgIHhmc19m c3Zlcml0eV9tZXRhZGF0YV9vZmZzZXQoaXApKQo+ICsJCWZsYWdzIHw9IElPTUFQX0ZfRlNWRVJJ VFk7Cj4gKwo+ICAJQVNTRVJUKCFpc251bGxzdGFydGJsb2NrKGJtYS5nb3QuYnJfc3RhcnRibG9j aykpOwo+ICAJeGZzX2JtYnRfdG9faW9tYXAoaXAsIGlvbWFwLCAmYm1hLmdvdCwgMCwgZmxhZ3Ms Cj4gIAkJCQl4ZnNfaW9tYXBfaW5vZGVfc2VxdWVuY2UoaXAsIGZsYWdzKSk7Cj4gZGlmZiAtLWdp dCBhL2ZzL3hmcy94ZnNfYW9wcy5jIGIvZnMveGZzL3hmc19hb3BzLmMKPiBpbmRleCBmMjc5MDU1 ZmNlYTAuLjk1MDMyNTJhMGZhNCAxMDA2NDQKPiAtLS0gYS9mcy94ZnMveGZzX2FvcHMuYwo+ICsr KyBiL2ZzL3hmcy94ZnNfYW9wcy5jCj4gQEAgLTIyLDYgKzIyLDcgQEAKPiAgI2luY2x1ZGUgInhm c19pY2FjaGUuaCIKPiAgI2luY2x1ZGUgInhmc196b25lX2FsbG9jLmgiCj4gICNpbmNsdWRlICJ4 ZnNfcnRncm91cC5oIgo+ICsjaW5jbHVkZSAieGZzX2ZzdmVyaXR5LmgiCj4gICNpbmNsdWRlIDxs aW51eC9iaW8taW50ZWdyaXR5Lmg+Cj4gIAo+ICBzdHJ1Y3QgeGZzX3dyaXRlcGFnZV9jdHggewo+ IEBAIC0zMzksMTIgKzM0MCwxNiBAQCB4ZnNfbWFwX2Jsb2NrcygKPiAgCWludAkJCXJldHJpZXMg PSAwOwo+ICAJaW50CQkJZXJyb3IgPSAwOwo+ICAJdW5zaWduZWQgaW50CQkqc2VxOwo+ICsJdW5z aWduZWQgaW50CQlpb21hcF9mbGFncyA9IDA7Cj4gIAo+ICAJaWYgKHhmc19pc19zaHV0ZG93biht cCkpCj4gIAkJcmV0dXJuIC1FSU87Cj4gIAo+ICAJWEZTX0VSUk9SVEFHX0RFTEFZKG1wLCBYRlNf RVJSVEFHX1dCX0RFTEFZX01TKTsKPiAgCj4gKwlpZiAoeGZzX2lmbGFnc190ZXN0KGlwLCBYRlNf VkVSSVRZX0NPTlNUUlVDVElPTikpCj4gKwkJaW9tYXBfZmxhZ3MgfD0gSU9NQVBfRl9GU1ZFUklU WTsKPiArCj4gIAkvKgo+ICAJICogQ09XIGZvcmsgYmxvY2tzIGNhbiBvdmVybGFwIGRhdGEgZm9y ayBibG9ja3MgZXZlbiBpZiB0aGUgYmxvY2tzCj4gIAkgKiBhcmVuJ3Qgc2hhcmVkLiAgQ09XIEkv TyBhbHdheXMgdGFrZXMgcHJlY2VkZW50LCBzbyB3ZSBtdXN0IGFsd2F5cwo+IEBAIC00MzIsNyAr NDM3LDggQEAgeGZzX21hcF9ibG9ja3MoCj4gIAkgICAgaXNudWxsc3RhcnRibG9jayhpbWFwLmJy X3N0YXJ0YmxvY2spKQo+ICAJCWdvdG8gYWxsb2NhdGVfYmxvY2tzOwo+ICAKPiAtCXhmc19ibWJ0 X3RvX2lvbWFwKGlwLCAmd3BjLT5pb21hcCwgJmltYXAsIDAsIDAsIFhGU19XUEMod3BjKS0+ZGF0 YV9zZXEpOwo+ICsJeGZzX2JtYnRfdG9faW9tYXAoaXAsICZ3cGMtPmlvbWFwLCAmaW1hcCwgMCwg aW9tYXBfZmxhZ3MsCj4gKwkJCSAgWEZTX1dQQyh3cGMpLT5kYXRhX3NlcSk7Cj4gIAl0cmFjZV94 ZnNfbWFwX2Jsb2Nrc19mb3VuZChpcCwgb2Zmc2V0LCBjb3VudCwgd2hpY2hmb3JrLCAmaW1hcCk7 Cj4gIAlyZXR1cm4gMDsKPiAgYWxsb2NhdGVfYmxvY2tzOgo+IEBAIC03MDUsNiArNzExLDE0IEBA IHhmc192bV93cml0ZXBhZ2VzKAo+ICAJCQl9LAo+ICAJCX07Cj4gIAo+ICsJCS8qCj4gKwkJICog V3JpdGViYWNrIGRvZXMgbm90IHdvcmsgZm9yIGZvbGlvcyBwYXN0IEVPRiwgbGV0IGl0IGtub3cg dGhhdAo+ICsJCSAqIEkvTyBoYXBwZW5zIGZvciBmc3Zlcml0eSBtZXRhZGF0YSBhbmQgdGhpcyBy ZXN0cmljdGlvbiBuZWVkCj4gKwkJICogdG8gYmUgc2tpcHBlZAo+ICsJCSAqLwo+ICsJCWlmICh4 ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19WRVJJVFlfQ09OU1RSVUNUSU9OKSkKPiArCQkJd3BjLmN0 eC5pb21hcC5mbGFncyB8PSBJT01BUF9GX0ZTVkVSSVRZOwo+ICsKPiAgCQlyZXR1cm4gaW9tYXBf d3JpdGVwYWdlcygmd3BjLmN0eCk7Cj4gIAl9Cj4gIH0KPiBkaWZmIC0tZ2l0IGEvZnMveGZzL3hm c19mc3Zlcml0eS5jIGIvZnMveGZzL3hmc19mc3Zlcml0eS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmJjNjAyMGNjNmU0MQo+IC0tLSAvZGV2L251bGwKPiAr KysgYi9mcy94ZnMveGZzX2ZzdmVyaXR5LmMKPiBAQCAtMCwwICsxLDM0IEBACj4gKy8qIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoQykg MjAyNiBSZWQgSGF0LCBJbmMuCj4gKyAqLwo+ICsjaW5jbHVkZSAieGZzX3BsYXRmb3JtLmgiCj4g KyNpbmNsdWRlICJ4ZnNfZm9ybWF0LmgiCj4gKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKPiArI2lu Y2x1ZGUgInhmc19zaGFyZWQuaCIKPiArI2luY2x1ZGUgInhmc190cmFuc19yZXN2LmgiCj4gKyNp bmNsdWRlICJ4ZnNfbW91bnQuaCIKPiArI2luY2x1ZGUgInhmc19mc3Zlcml0eS5oIgo+ICsjaW5j bHVkZSAieGZzX2ZzdmVyaXR5LmgiCj4gKyNpbmNsdWRlIDxsaW51eC9mc3Zlcml0eS5oPgo+ICsj aW5jbHVkZSA8bGludXgvaW9tYXAuaD4KPiArCj4gKy8qCj4gKyAqIEF0IG1heGltdW0gb2YgOCBs ZXZlbHMgd2l0aCAxMjggaGFzaGVzIHBlciBibG9jayAoMzIgYnl0ZXMgU0hBLTI1NikgbWF4aW11 bQo+ICsgKiB0cmVlIHNpemUgaXMgKCgxMjheOCDiiJIgMSkvKDEyOCDiiJIgMSkpID0gNTY3KjEw XjEyIGJsb2Nrcy4gVGhpcyBzaG91bGQgZml0IGluCj4gKyAqIDUzIGJpdHMgYWRkcmVzcyBzcGFj ZS4KPiArICoKPiArICogQXQgdGhpcyBNZXJrbGUgdHJlZSBzaXplIHdlIGNhbiBjb3ZlciAyOTVF QiBsYXJnZSBmaWxlLiBUaGlzIGlzIG11Y2ggbGFyZ2VyCj4gKyAqIHRoYW4gdGhlIGN1cnJlbnRs eSBzdXBwb3J0ZWQgZmlsZSBzaXplLgo+ICsgKgo+ICsgKiBGb3Igc2hhNTEyIHRoZSBsYXJnZXN0 IGZpbGUgd2UgY2FuIGNvdmVyIGVuZHMgYXQgMSA8PCA1MCBvZmZzZXQsIHRoaXMgaXMgYWxzbwo+ ICsgKiBnb29kLgo+ICsgKi8KPiArI2RlZmluZSBYRlNfRlNWRVJJVFlfTEFSR0VTVF9GSUxFICgo bG9mZl90KTFVTEwgPDwgNTMpCgpJIHRoaW5rIHRoaXMgb3VnaHQgdG8gZ28gaW4geGZzX2Zvcm1h dC5oIHNpbmNlIGl0J3MgcmVsYXRlZCB0byB0aGUKb25kaXNrIGZpbGUgbGF5b3V0LiAgSW4gYWRk aXRpb24sIEkgdGhpbmsgdGhlIHJvdW5kdXAgdmFsdWUgb3VnaHQgdG8KZ2V0IGl0cyBvd24gI2Rl ZmluZSBpbiB4ZnNfZm9ybWF0Lmggc2ltaWxhciB0byB0aGUgd2F5IGJ0cmZzIGRvZXMgaXQuCgoj ZGVmaW5lIFhGU19GU1ZFUklUWV9TVEFSVF9BTElHTgkJKDY1NTM2KQoKPiArCj4gK2xvZmZfdAo+ ICt4ZnNfZnN2ZXJpdHlfbWV0YWRhdGFfb2Zmc2V0KAo+ICsJY29uc3Qgc3RydWN0IHhmc19pbm9k ZQkqaXApCj4gK3sKPiArCXJldHVybiByb3VuZF91cChpX3NpemVfcmVhZChWRlNfSUMoaXApKSwg NjU1MzYpOwo+ICt9CgoKdGhlbiB0aGlzIHR1cm5zIGludG86Cgpsb2ZmX3QKeGZzX2ZzdmVyaXR5 X21ldGFkYXRhX29mZnNldCgKCWNvbnN0IHN0cnVjdCB4ZnNfaW5vZGUJKmlwKQp7CglyZXR1cm4g cm91bmRfdXAoaV9zaXplX3JlYWQoVkZTX0lDKGlwKSksIFhGU19GU1ZFUklUWV9TVEFSVF9BTElH Tik7Cn0KCldpdGggdGhvc2UgdHdvICNkZWZpbmUgdGhpbmdzIGFkZHJlc3NlZCwgSSdtIHNhdGlz ZmllZApSZXZpZXdlZC1ieTogIkRhcnJpY2sgSi4gV29uZyIgPGRqd29uZ0BrZXJuZWwub3JnPgoK LS1ECgoKPiBkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc3Zlcml0eS5oIGIvZnMveGZzL3hmc19m c3Zlcml0eS5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjU3 NzFkYjJjZDc5Nwo+IC0tLSAvZGV2L251bGwKPiArKysgYi9mcy94ZnMveGZzX2ZzdmVyaXR5LmgK PiBAQCAtMCwwICsxLDIwIEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w ICovCj4gKy8qCj4gKyAqIENvcHlyaWdodCAoQykgMjAyNiBSZWQgSGF0LCBJbmMuCj4gKyAqLwo+ ICsjaWZuZGVmIF9fWEZTX0ZTVkVSSVRZX0hfXwo+ICsjZGVmaW5lIF9fWEZTX0ZTVkVSSVRZX0hf Xwo+ICsKPiArI2luY2x1ZGUgInhmc19wbGF0Zm9ybS5oIgo+ICsKPiArI2lmZGVmIENPTkZJR19G U19WRVJJVFkKPiArbG9mZl90IHhmc19mc3Zlcml0eV9tZXRhZGF0YV9vZmZzZXQoY29uc3Qgc3Ry dWN0IHhmc19pbm9kZSAqaXApOwo+ICsjZWxzZQo+ICtzdGF0aWMgaW5saW5lIGxvZmZfdCB4ZnNf ZnN2ZXJpdHlfbWV0YWRhdGFfb2Zmc2V0KGNvbnN0IHN0cnVjdCB4ZnNfaW5vZGUgKmlwKQo+ICt7 Cj4gKwlXQVJOX09OX09OQ0UoMSk7Cj4gKwlyZXR1cm4gVUxMT05HX01BWDsKPiArfQo+ICsjZW5k aWYJLyogQ09ORklHX0ZTX1ZFUklUWSAqLwo+ICsKPiArI2VuZGlmCS8qIF9fWEZTX0ZTVkVSSVRZ X0hfXyAqLwo+IGRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lu b2RlLmgKPiBpbmRleCBiZDZkMzM1NTcxOTQuLjZkZjQ4ZDY4YTkxOSAxMDA2NDQKPiAtLS0gYS9m cy94ZnMveGZzX2lub2RlLmgKPiArKysgYi9mcy94ZnMveGZzX2lub2RlLmgKPiBAQCAtNDE1LDYg KzQxNSwxMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgeGZzX2lub2RlX2Nhbl9zd19hdG9taWNfd3Jp dGUoY29uc3Qgc3RydWN0IHhmc19pbm9kZSAqaXApCj4gICAqLwo+ICAjZGVmaW5lIFhGU19JUkVN QVBQSU5HCQkoMVUgPDwgMTUpCj4gIAo+ICsvKgo+ICsgKiBmcy12ZXJpdHkncyBNZXJrbGUgdHJl ZSBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uIFRoZSBmaWxlIGlzIHJlYWQtb25seSwgdGhlCj4gKyAq IG9ubHkgd3JpdGVzIGhhcHBlbmluZyBhcmUgZm9yIHRoZSBmc3Zlcml0eSBtZXRhZGF0YS4KPiAr ICovCj4gKyNkZWZpbmUgWEZTX1ZFUklUWV9DT05TVFJVQ1RJT04JKDFVIDw8IDE2KQo+ICsKPiAg LyogQWxsIGlub2RlIHN0YXRlIGZsYWdzIHJlbGF0ZWQgdG8gaW5vZGUgcmVjbGFpbS4gKi8KPiAg I2RlZmluZSBYRlNfQUxMX0lSRUNMQUlNX0ZMQUdTCShYRlNfSVJFQ0xBSU1BQkxFIHwgXAo+ICAJ CQkJIFhGU19JUkVDTEFJTSB8IFwKPiBkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIv ZnMveGZzL3hmc19pb21hcC5jCj4gaW5kZXggOWMyZjEyZDVmZWM5Li43MWNjZDRmZjVmNDggMTAw NjQ0Cj4gLS0tIGEvZnMveGZzL3hmc19pb21hcC5jCj4gKysrIGIvZnMveGZzL3hmc19pb21hcC5j Cj4gQEAgLTMyLDYgKzMyLDggQEAKPiAgI2luY2x1ZGUgInhmc19ydGJpdG1hcC5oIgo+ICAjaW5j bHVkZSAieGZzX2ljYWNoZS5oIgo+ICAjaW5jbHVkZSAieGZzX3pvbmVfYWxsb2MuaCIKPiArI2lu Y2x1ZGUgInhmc19mc3Zlcml0eS5oIgo+ICsjaW5jbHVkZSA8bGludXgvZnN2ZXJpdHkuaD4KPiAg Cj4gICNkZWZpbmUgWEZTX0FMTE9DX0FMSUdOKG1wLCBvZmYpIFwKPiAgCSgoKG9mZikgPj4gbXAt Pm1fYWxsb2NzaXplX2xvZykgPDwgbXAtPm1fYWxsb2NzaXplX2xvZykKPiBAQCAtMTc4OSw2ICsx NzkxLDkgQEAgeGZzX2J1ZmZlcmVkX3dyaXRlX2lvbWFwX2JlZ2luKAo+ICAJCXJldHVybiB4ZnNf ZGlyZWN0X3dyaXRlX2lvbWFwX2JlZ2luKGlub2RlLCBvZmZzZXQsIGNvdW50LAo+ICAJCQkJZmxh Z3MsIGlvbWFwLCBzcmNtYXApOwo+ICAKPiArCWlmICh4ZnNfaWZsYWdzX3Rlc3QoaXAsIFhGU19W RVJJVFlfQ09OU1RSVUNUSU9OKSkKPiArCQlpb21hcF9mbGFncyB8PSBJT01BUF9GX0ZTVkVSSVRZ Owo+ICsKPiAgCWVycm9yID0geGZzX3FtX2RxYXR0YWNoKGlwKTsKPiAgCWlmIChlcnJvcikKPiAg CQlyZXR1cm4gZXJyb3I7Cj4gQEAgLTIxMTMsMTIgKzIxMTgsMTcgQEAgeGZzX3JlYWRfaW9tYXBf YmVnaW4oCj4gIAlib29sCQkJc2hhcmVkID0gZmFsc2U7Cj4gIAl1bnNpZ25lZCBpbnQJCWxvY2tt b2RlID0gWEZTX0lMT0NLX1NIQVJFRDsKPiAgCXU2NAkJCXNlcTsKPiArCXVuc2lnbmVkIGludAkJ aW9tYXBfZmxhZ3MgPSAwOwo+ICAKPiAgCUFTU0VSVCghKGZsYWdzICYgKElPTUFQX1dSSVRFIHwg SU9NQVBfWkVSTykpKTsKPiAgCj4gIAlpZiAoeGZzX2lzX3NodXRkb3duKG1wKSkKPiAgCQlyZXR1 cm4gLUVJTzsKPiAgCj4gKwlpZiAoZnN2ZXJpdHlfYWN0aXZlKGlub2RlKSAmJgo+ICsJICAgIChv ZmZzZXQgPj0geGZzX2ZzdmVyaXR5X21ldGFkYXRhX29mZnNldChpcCkpKQo+ICsJCWlvbWFwX2Zs YWdzIHw9IElPTUFQX0ZfRlNWRVJJVFk7Cj4gKwo+ICAJZXJyb3IgPSB4ZnNfaWxvY2tfZm9yX2lv bWFwKGlwLCBmbGFncywgJmxvY2ttb2RlKTsKPiAgCWlmIChlcnJvcikKPiAgCQlyZXR1cm4gZXJy b3I7Cj4gQEAgLTIxMzIsOCArMjE0Miw5IEBAIHhmc19yZWFkX2lvbWFwX2JlZ2luKAo+ICAJaWYg KGVycm9yKQo+ICAJCXJldHVybiBlcnJvcjsKPiAgCXRyYWNlX3hmc19pb21hcF9mb3VuZChpcCwg b2Zmc2V0LCBsZW5ndGgsIFhGU19EQVRBX0ZPUkssICZpbWFwKTsKPiAtCXJldHVybiB4ZnNfYm1i dF90b19pb21hcChpcCwgaW9tYXAsICZpbWFwLCBmbGFncywKPiAtCQkJCSBzaGFyZWQgPyBJT01B UF9GX1NIQVJFRCA6IDAsIHNlcSk7Cj4gKwlpb21hcF9mbGFncyB8PSBzaGFyZWQgPyBJT01BUF9G X1NIQVJFRCA6IDA7Cj4gKwo+ICsJcmV0dXJuIHhmc19ibWJ0X3RvX2lvbWFwKGlwLCBpb21hcCwg JmltYXAsIGZsYWdzLCBpb21hcF9mbGFncywgc2VxKTsKPiAgfQo+ICAKPiAgY29uc3Qgc3RydWN0 IGlvbWFwX29wcyB4ZnNfcmVhZF9pb21hcF9vcHMgPSB7Cj4gLS0gCj4gMi41MS4yCj4gCj4gCgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtZjJm cy1kZXZlbCBtYWlsaW5nIGxpc3QKTGludXgtZjJmcy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5u ZXQKaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vbGludXgtZjJm cy1kZXZlbAo=