From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BF696161939; Fri, 12 Jul 2024 11:07:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=195.135.223.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720782453; cv=none; b=G29zU7BkdBDFOGB+KiTqdyVIQMJ765W0fZ4ApXxzIk0QqAevs9VbnOo+WnIYRoVyeftWWtzV69C4B0+MrxsPK8ViJzvtoz8U4xVGtuLMcIuZXdaXNtBR+e2MBujz04mc6ZkDgQhUE1gfS8ipx+0byk/NZr2Z9FHfuySNf9UNJkM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1720782453; c=relaxed/simple; bh=KO4kttHx10IlAeAhvD34CLXhVryUwWtWoENO37bXDaw=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=bB6qKXuZdv0yhVmVCFxZu4+lFLOJH3KN8a5s8FdjNcakK8dCb1g4xtW06Ib15nN6he1MD0OziUDBnpf08VPeJgrxqQmCGSmQrO/w1kDSA1T/ffwIHLmk6eQVfRwwznypyTbK+xOiP7xn3Z5f5ibP+41VA2PwdE2guR9nzFmfn4Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz; spf=pass smtp.mailfrom=suse.cz; arc=none smtp.client-ip=195.135.223.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=suse.cz Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 436F61FB7B; Fri, 12 Jul 2024 11:07:29 +0000 (UTC) Authentication-Results: smtp-out2.suse.de; none Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id DB9D613686; Fri, 12 Jul 2024 11:07:28 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id 07PMNHAOkWYaOAAAD6G6ig (envelope-from ); Fri, 12 Jul 2024 11:07:28 +0000 Date: Fri, 12 Jul 2024 13:07:27 +0200 From: Petr Vorel To: Jeff Layton Cc: NeilBrown , Chuck Lever III , Greg KH , Sherry Yang , Calum Mackay , linux-stable , Trond Myklebust , Anna Schumaker , Linux NFS Mailing List , "kernel-team@fb.com" , "ltp@lists.linux.it" , Avinesh Kumar , Josef Bacik Subject: Re: [LTP] [PATCH 1/1] nfsstat01: Update client RPC calls for kernel 6.9 Message-ID: <20240712110727.GB118354@pevik> Reply-To: Petr Vorel References: <> <172076474233.15471.345629269384872391@noble.neil.brown.name> Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org 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: X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Server: rspamd1.dmz-prg2.suse.org X-Spam-Level: X-Rspamd-Queue-Id: 436F61FB7B X-Spamd-Result: default: False [-4.00 / 50.00]; REPLY(-4.00)[] X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Spam-Flag: NO X-Rspamd-Action: no action X-Spam-Score: -4.00 Hi all, > On Fri, 2024-07-12 at 16:12 +1000, NeilBrown wrote: > > On Fri, 12 Jul 2024, Jeff Layton wrote: > > > On Fri, 2024-07-12 at 08:58 +1000, NeilBrown wrote: > > > > On Fri, 12 Jul 2024, Jeff Layton wrote: > > > > > On Mon, 2024-07-08 at 17:49 +0000, Chuck Lever III wrote: > > > > > > > On Jul 8, 2024, at 6:36 AM, Greg KH wrote: > > > > > > > On Sat, Jul 06, 2024 at 07:46:19AM +0000, Sherry Yang wrote: > > > > > > > > > On Jul 6, 2024, at 12:11 AM, Greg KH wrote: > > > > > > > > > On Fri, Jul 05, 2024 at 02:19:18PM +0000, Chuck Lever III wrote: > > > > > > > > > > > On Jul 2, 2024, at 6:55 PM, Calum Mackay wrote: > > > > > > > > > > > To clarify… > > > > > > > > > > > On 02/07/2024 5:54 pm, Calum Mackay wrote: > > > > > > > > > > > > hi Petr, > > > > > > > > > > > > I noticed your LTP patch [1][2] which adjusts the nfsstat01 test on v6.9 kernels, to account for Josef's changes [3], which restrict the NFS/RPC stats per-namespace. > > > > > > > > > > > > I see that Josef's changes were backported, as far back as longterm v5.4, > > > > > > > > > > > Sorry, that's not quite accurate. > > > > > > > > > > > Josef's NFS client changes were all backported from v6.9, as far as longterm v5.4.y: > > > > > > > > > > > 2057a48d0dd0 sunrpc: add a struct rpc_stats arg to rpc_create_args > > > > > > > > > > > d47151b79e32 nfs: expose /proc/net/sunrpc/nfs in net namespaces > > > > > > > > > > > 1548036ef120 nfs: make the rpc_stat per net namespace > > > > > > > > > > > Of Josef's NFS server changes, four were backported from v6.9 to v6.8: > > > > > > > > > > > 418b9687dece sunrpc: use the struct net as the svc proc private > > > > > > > > > > > d98416cc2154 nfsd: rename NFSD_NET_* to NFSD_STATS_* > > > > > > > > > > > 93483ac5fec6 nfsd: expose /proc/net/sunrpc/nfsd in net namespaces > > > > > > > > > > > 4b14885411f7 nfsd: make all of the nfsd stats per-network namespace > > > > > > > > > > > and the others remained only in v6.9: > > > > > > > > > > > ab42f4d9a26f sunrpc: don't change ->sv_stats if it doesn't exist > > > > > > > > > > > a2214ed588fb nfsd: stop setting ->pg_stats for unused stats > > > > > > > > > > > f09432386766 sunrpc: pass in the sv_stats struct through svc_create_pooled > > > > > > > > > > > 3f6ef182f144 sunrpc: remove ->pg_stats from svc_program > > > > > > > > > > > e41ee44cc6a4 nfsd: remove nfsd_stats, make th_cnt a global counter > > > > > > > > > > > 16fb9808ab2c nfsd: make svc_stat per-network namespace instead of global > > > > > > > > > > > I'm wondering if this difference between NFS client, and NFS server, stat behaviour, across kernel versions, may perhaps cause some user confusion? > > > > > > > > > > As a refresher for the stable folken, Josef's changes make > > > > > > > > > > nfsstats silo'd, so they no longer show counts from the whole > > > > > > > > > > system, but only for NFS operations relating to the local net > > > > > > > > > > namespace. That is a surprising change for some users, tools, > > > > > > > > > > and testing. > > > > > > > > > > I'm not clear on whether there are any rules/guidelines around > > > > > > > > > > LTS backports causing behavior changes that user tools, like > > > > > > > > > > nfsstat, might be impacted by. > > > > > > > > > The same rules that apply for Linus's tree (i.e. no userspace > > > > > > > > > regressions.) > > > > > > > > Given the current data we have, LTP nfsstat01[1] failed on LTS v5.4.278 because of kernel commit 1548036ef1204 ("nfs: > > > > > > > > make the rpc_stat per net namespace") [2]. Other LTS which backported the same commit are very likely troubled with the same LTP test failure. > > > > > > > > The following are the LTP nfsstat01 failure output > > > > > > > > ======== > > > > > > > > network 1 TINFO: initialize 'lhost' 'ltp_ns_veth2' interface > > > > > > > > network 1 TINFO: add local addr 10.0.0.2/24 > > > > > > > > network 1 TINFO: add local addr fd00:1:1:1::2/64 > > > > > > > > network 1 TINFO: initialize 'rhost' 'ltp_ns_veth1' interface > > > > > > > > network 1 TINFO: add remote addr 10.0.0.1/24 > > > > > > > > network 1 TINFO: add remote addr fd00:1:1:1::1/64 > > > > > > > > network 1 TINFO: Network config (local -- remote): > > > > > > > > network 1 TINFO: ltp_ns_veth2 -- ltp_ns_veth1 > > > > > > > > network 1 TINFO: 10.0.0.2/24 -- 10.0.0.1/24 > > > > > > > > network 1 TINFO: fd00:1:1:1::2/64 -- fd00:1:1:1::1/64 > > > > > > > > <<>> > > > > > > > > tag=veth|nfsstat3_01 stime=1719943586 > > > > > > > > cmdline="nfsstat01" > > > > > > > > contacts="" > > > > > > > > analysis=exit > > > > > > > > <<>> > > > > > > > > incrementing stop > > > > > > > > nfsstat01 1 TINFO: timeout per run is 0h 20m 0s > > > > > > > > nfsstat01 1 TINFO: setup NFSv3, socket type udp > > > > > > > > nfsstat01 1 TINFO: Mounting NFS: mount -t nfs -o proto=udp,vers=3 10.0.0.2:/tmp/netpan-4577/LTP_nfsstat01.lz6zhgQHoV/3/udp /tmp/netpan-4577/LTP_nfsstat01.lz6zhgQHoV/3/0 > > > > > > > > nfsstat01 1 TINFO: checking RPC calls for server/client > > > > > > > > nfsstat01 1 TINFO: calls 98/0 > > > > > > > > nfsstat01 1 TINFO: Checking for tracking of RPC calls for server/client > > > > > > > > nfsstat01 1 TINFO: new calls 102/0 > > > > > > > > nfsstat01 1 TPASS: server RPC calls increased > > > > > > > > nfsstat01 1 TFAIL: client RPC calls not increased > > > > > > > > nfsstat01 1 TINFO: checking NFS calls for server/client > > > > > > > > nfsstat01 1 TINFO: calls 2/2 > > > > > > > > nfsstat01 1 TINFO: Checking for tracking of NFS calls for server/client > > > > > > > > nfsstat01 1 TINFO: new calls 3/3 > > > > > > > > nfsstat01 1 TPASS: server NFS calls increased > > > > > > > > nfsstat01 1 TPASS: client NFS calls increased > > > > > > > > nfsstat01 2 TINFO: Cleaning up testcase > > > > > > > > nfsstat01 2 TINFO: SELinux enabled in enforcing mode, this may affect test results > > > > > > > > nfsstat01 2 TINFO: it can be disabled with TST_DISABLE_SELINUX=1 (requires super/root) > > > > > > > > nfsstat01 2 TINFO: install seinfo to find used SELinux profiles > > > > > > > > nfsstat01 2 TINFO: loaded SELinux profiles: none > > > > > > > > Summary: > > > > > > > > passed 3 > > > > > > > > failed 1 > > > > > > > > skipped 0 > > > > > > > > warnings 0 > > > > > > > > <<>> > > > > > > > > initiation_status="ok" > > > > > > > > duration=1 termination_type=exited termination_id=1 corefile=no > > > > > > > > cutime=11 cstime=16 > > > > > > > > <<>> > > > > > > > > ltp-pan reported FAIL > > > > > > > > ======== > > > > > > > > We can observe the number of RPC client calls is 0, which is wired. And this happens from the kernel commit 57d1ce96d7655 ("nfs: make the rpc_stat per net namespace”). So now we’re not sure the kernel backport of nfs client changes is proper, or the LTP tests / userspace need to be modified. > > > > > > > > If no userspace regression, should we revert the Josef’s NFS client-side changes on LTS? > > > > > > > This sounds like a regression in Linus's tree too, so why isn't it > > > > > > > reverted there first? > > > > > > There is a change in behavior in the upstream code, but Josef's > > > > > > patches fix an information leak and make the statistics more > > > > > > sensible in container environments. I'm not certain that > > > > > > should be considered a regression, but confess I don't know > > > > > > the regression rules to this fine a degree of detail. > > > > > > If it is indeed a regression, how can we go about retaining > > > > > > both behaviors (selectable by Kconfig or perhaps administrative > > > > > > UI)? > > > > > I'd argue that the old behavior was a bug, and that Josef fixed > > > > > it. These stats should probably have been made per-net when all of the > > > > > original nfsd namespace work was done, but no one noticed until > > > > > recently. Whoops.  > > > > > A couple of hacky ideas for how we might deal with this: > > > > > 1/ add a new line to the output of /proc/net/rpc/nfsd. It could just > > > > > say "per-net\n" or "per-net \n" or something. nfsstat > > > > > should ignore it, but LTP test could look for it and handle it > > > > > appropriately. That could even be useful later for nfsstat too I guess. > > > > > 2/ move the file to a new name and make the old filename be a symlink > > > > > to the new one. nfsstat would still work, but LTP would be able to see > > > > > whether it was a symlink to detect the difference...or could just make > > > > > a new symlink that points to the file and LTP could look for its > > > > > presence. > > > > I don't think it makes sense to present a solution which requires > > > > LTP to be modified. If we are willing to modify LTP, then we should > > > > modify it to work with the per-net stats. > > > > I think we need to create a new interface for the per-net stats, then > > > > deprecate the old interface and remove it in (say) 2 years. That given > > > > LTP time to update, and means that an old LTP won't give incorrect > > > > numbers, it will simply fail. > > > > All we need to do is bikeshed the new interface. > > > > netlink ? > > > > /proc/net/rpc-pernet/nfsd ? > > > > This means that we still need to keep the combined stats, or to combine > > > > all the per-net stats on each access. > > > How much of this functionality would we need to restore? > > > Prior to Josef's patches, you would get info about global stats from > > > relevant stats procfiles in a container. That seems like an information > > > leak to me, but fixing that is probably going to break _somebody_. > > > Where do we draw the line and why? > > > LTP is just a testsuite. Asking them to alter tests in order to cope > > > with a bugfix seems entirely reasonable to me. If someone can make a > > > case for real-world applications that rely on the old semantics, then > > > I'd be more open to changing this, but I just don't see the upside of > > > restoring legacy behavior here. +1. Also people who test with LTP are advised to use at least the latest release (we release every 3 months) or the current master branch (linux-next and kernel rc testers should probably use master branch). > > If it is OK to ask them to alter the tests, ask them to alter the tests > > to work with today's kernel and don't make any change to the kernel. > > Maybe the tests will have to be fixed to "PASS" both the old and the new > > results, but that probably isn't rocket science. > > My point is that if we are going to change the kernel to accommodate LTP > > at all, we should accommodate LTP as it is today. If we are going to > > change LTP to accommodate the kernel, then it should accommodate the > > kernel as it is today. > The problem is that there is no way for userland tell the difference > between the older and newer behavior. That was what I was suggesting we > add. > To be clear, I hold this opinion loosely. If the consensus is that we > need to revert things then so be it. I just don't see the value of > doing that in this particular situation. I also think that from container POV it fixed an information leak. Kind regards, Petr 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 picard.linux.it (picard.linux.it [213.254.12.146]) (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 13A9BC3DA4A for ; Fri, 12 Jul 2024 11:07:48 +0000 (UTC) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 71B153D199F for ; Fri, 12 Jul 2024 13:07:47 +0200 (CEST) Received: from in-5.smtp.seeweb.it (in-5.smtp.seeweb.it [217.194.8.5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by picard.linux.it (Postfix) with ESMTPS id 71DD73D1962 for ; Fri, 12 Jul 2024 13:07:31 +0200 (CEST) Authentication-Results: in-5.smtp.seeweb.it; spf=pass (sender SPF authorized) smtp.mailfrom=suse.cz (client-ip=195.135.223.131; helo=smtp-out2.suse.de; envelope-from=pvorel@suse.cz; receiver=lists.linux.it) Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.223.131]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-5.smtp.seeweb.it (Postfix) with ESMTPS id 913C6601555 for ; Fri, 12 Jul 2024 13:07:29 +0200 (CEST) Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 436F61FB7B; Fri, 12 Jul 2024 11:07:29 +0000 (UTC) Authentication-Results: smtp-out2.suse.de; none Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id DB9D613686; Fri, 12 Jul 2024 11:07:28 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id 07PMNHAOkWYaOAAAD6G6ig (envelope-from ); Fri, 12 Jul 2024 11:07:28 +0000 Date: Fri, 12 Jul 2024 13:07:27 +0200 From: Petr Vorel To: Jeff Layton Message-ID: <20240712110727.GB118354@pevik> References: <> <172076474233.15471.345629269384872391@noble.neil.brown.name> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Server: rspamd1.dmz-prg2.suse.org X-Rspamd-Queue-Id: 436F61FB7B X-Spamd-Result: default: False [-4.00 / 50.00]; REPLY(-4.00)[] X-Rspamd-Pre-Result: action=no action; module=replies; Message is reply to one we originated X-Rspamd-Action: no action X-Virus-Scanned: clamav-milter 1.0.3 at in-5.smtp.seeweb.it X-Virus-Status: Clean Subject: Re: [LTP] [PATCH 1/1] nfsstat01: Update client RPC calls for kernel 6.9 X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Petr Vorel Cc: Linux NFS Mailing List , NeilBrown , Greg KH , Sherry Yang , linux-stable , Josef Bacik , Chuck Lever III , Anna Schumaker , Trond Myklebust , Calum Mackay , "kernel-team@fb.com" , "ltp@lists.linux.it" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: ltp-bounces+ltp=archiver.kernel.org@lists.linux.it Sender: "ltp" SGkgYWxsLAoKPiBPbiBGcmksIDIwMjQtMDctMTIgYXQgMTY6MTIgKzEwMDAsIE5laWxCcm93biB3 cm90ZToKPiA+IE9uIEZyaSwgMTIgSnVsIDIwMjQsIEplZmYgTGF5dG9uIHdyb3RlOgo+ID4gPiBP biBGcmksIDIwMjQtMDctMTIgYXQgMDg6NTggKzEwMDAsIE5laWxCcm93biB3cm90ZToKPiA+ID4g PiBPbiBGcmksIDEyIEp1bCAyMDI0LCBKZWZmIExheXRvbiB3cm90ZToKPiA+ID4gPiA+IE9uIE1v biwgMjAyNC0wNy0wOCBhdCAxNzo0OSArMDAwMCwgQ2h1Y2sgTGV2ZXIgSUlJIHdyb3RlOgoKPiA+ ID4gPiA+ID4gPiBPbiBKdWwgOCwgMjAyNCwgYXQgNjozNuKAr0FNLCBHcmVnIEtIIDxncmVnQGty b2FoLmNvbT4gd3JvdGU6Cgo+ID4gPiA+ID4gPiA+IE9uIFNhdCwgSnVsIDA2LCAyMDI0IGF0IDA3 OjQ2OjE5QU0gKzAwMDAsIFNoZXJyeSBZYW5nIHdyb3RlOgoKCj4gPiA+ID4gPiA+ID4gPiA+IE9u IEp1bCA2LCAyMDI0LCBhdCAxMjoxMeKAr0FNLCBHcmVnIEtIIDxncmVnQGtyb2FoLmNvbT4gd3Jv dGU6Cgo+ID4gPiA+ID4gPiA+ID4gPiBPbiBGcmksIEp1bCAwNSwgMjAyNCBhdCAwMjoxOToxOFBN ICswMDAwLCBDaHVjayBMZXZlciBJSUkgd3JvdGU6CgoKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IE9u IEp1bCAyLCAyMDI0LCBhdCA2OjU14oCvUE0sIENhbHVtIE1hY2theSA8Y2FsdW0ubWFja2F5QG9y YWNsZS5jb20+IHdyb3RlOgoKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFRvIGNsYXJpZnnigKYKCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiBPbiAwMi8wNy8yMDI0IDU6NTQgcG0sIENhbHVtIE1hY2theSB3 cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaGkgUGV0ciwKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gSSBub3RpY2VkIHlvdXIgTFRQIHBhdGNoIFsxXVsyXSB3aGljaCBhZGp1c3RzIHRoZSBu ZnNzdGF0MDEgdGVzdCBvbiB2Ni45IGtlcm5lbHMsIHRvIGFjY291bnQgZm9yIEpvc2VmJ3MgY2hh bmdlcyBbM10sIHdoaWNoIHJlc3RyaWN0IHRoZSBORlMvUlBDIHN0YXRzIHBlci1uYW1lc3BhY2Uu Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IEkgc2VlIHRoYXQgSm9zZWYncyBjaGFuZ2VzIHdlcmUg YmFja3BvcnRlZCwgYXMgZmFyIGJhY2sgYXMgbG9uZ3Rlcm0gdjUuNCwKCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiBTb3JyeSwgdGhhdCdzIG5vdCBxdWl0ZSBhY2N1cmF0ZS4KCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiBKb3NlZidzIE5GUyBjbGllbnQgY2hhbmdlcyB3ZXJlIGFsbCBiYWNrcG9ydGVkIGZy b20gdjYuOSwgYXMgZmFyIGFzIGxvbmd0ZXJtIHY1LjQueToKCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiAyMDU3YTQ4ZDBkZDAgc3VucnBjOiBhZGQgYSBzdHJ1Y3QgcnBjX3N0YXRzIGFyZyB0byBycGNf Y3JlYXRlX2FyZ3MKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGQ0NzE1MWI3OWUzMiBuZnM6IGV4cG9z ZSAvcHJvYy9uZXQvc3VucnBjL25mcyBpbiBuZXQgbmFtZXNwYWNlcwo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gMTU0ODAzNmVmMTIwIG5mczogbWFrZSB0aGUgcnBjX3N0YXQgcGVyIG5ldCBuYW1lc3Bh Y2UKCgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gT2YgSm9zZWYncyBORlMgc2VydmVyIGNoYW5nZXMs IGZvdXIgd2VyZSBiYWNrcG9ydGVkIGZyb20gdjYuOSB0byB2Ni44OgoKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IDQxOGI5Njg3ZGVjZSBzdW5ycGM6IHVzZSB0aGUgc3RydWN0IG5ldCBhcyB0aGUgc3Zj IHByb2MgcHJpdmF0ZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gZDk4NDE2Y2MyMTU0IG5mc2Q6IHJl bmFtZSBORlNEX05FVF8qIHRvIE5GU0RfU1RBVFNfKgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gOTM0 ODNhYzVmZWM2IG5mc2Q6IGV4cG9zZSAvcHJvYy9uZXQvc3VucnBjL25mc2QgaW4gbmV0IG5hbWVz cGFjZXMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IDRiMTQ4ODU0MTFmNyBuZnNkOiBtYWtlIGFsbCBv ZiB0aGUgbmZzZCBzdGF0cyBwZXItbmV0d29yayBuYW1lc3BhY2UKCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiBhbmQgdGhlIG90aGVycyByZW1haW5lZCBvbmx5IGluIHY2Ljk6Cgo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gYWI0MmY0ZDlhMjZmIHN1bnJwYzogZG9uJ3QgY2hhbmdlIC0+c3Zfc3RhdHMgaWYg aXQgZG9lc24ndCBleGlzdAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYTIyMTRlZDU4OGZiIG5mc2Q6 IHN0b3Agc2V0dGluZyAtPnBnX3N0YXRzIGZvciB1bnVzZWQgc3RhdHMKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IGYwOTQzMjM4Njc2NiBzdW5ycGM6IHBhc3MgaW4gdGhlIHN2X3N0YXRzIHN0cnVjdCB0 aHJvdWdoIHN2Y19jcmVhdGVfcG9vbGVkCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAzZjZlZjE4MmYx NDQgc3VucnBjOiByZW1vdmUgLT5wZ19zdGF0cyBmcm9tIHN2Y19wcm9ncmFtCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiBlNDFlZTQ0Y2M2YTQgbmZzZDogcmVtb3ZlIG5mc2Rfc3RhdHMsIG1ha2UgdGhf Y250IGEgZ2xvYmFsIGNvdW50ZXIKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IDE2ZmI5ODA4YWIyYyBu ZnNkOiBtYWtlIHN2Y19zdGF0IHBlci1uZXR3b3JrIG5hbWVzcGFjZSBpbnN0ZWFkIG9mIGdsb2Jh bAoKCgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gSSdtIHdvbmRlcmluZyBpZiB0aGlzIGRpZmZlcmVu Y2UgYmV0d2VlbiBORlMgY2xpZW50LCBhbmQgTkZTIHNlcnZlciwgc3RhdCBiZWhhdmlvdXIsIGFj cm9zcyBrZXJuZWwgdmVyc2lvbnMsIG1heSBwZXJoYXBzIGNhdXNlIHNvbWUgdXNlciBjb25mdXNp b24/Cgo+ID4gPiA+ID4gPiA+ID4gPiA+IEFzIGEgcmVmcmVzaGVyIGZvciB0aGUgc3RhYmxlIGZv bGtlbiwgSm9zZWYncyBjaGFuZ2VzIG1ha2UKPiA+ID4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0cyBz aWxvJ2QsIHNvIHRoZXkgbm8gbG9uZ2VyIHNob3cgY291bnRzIGZyb20gdGhlIHdob2xlCj4gPiA+ ID4gPiA+ID4gPiA+ID4gc3lzdGVtLCBidXQgb25seSBmb3IgTkZTIG9wZXJhdGlvbnMgcmVsYXRp bmcgdG8gdGhlIGxvY2FsIG5ldAo+ID4gPiA+ID4gPiA+ID4gPiA+IG5hbWVzcGFjZS4gVGhhdCBp cyBhIHN1cnByaXNpbmcgY2hhbmdlIGZvciBzb21lIHVzZXJzLCB0b29scywKPiA+ID4gPiA+ID4g PiA+ID4gPiBhbmQgdGVzdGluZy4KCj4gPiA+ID4gPiA+ID4gPiA+ID4gSSdtIG5vdCBjbGVhciBv biB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcnVsZXMvZ3VpZGVsaW5lcyBhcm91bmQKPiA+ID4gPiA+ ID4gPiA+ID4gPiBMVFMgYmFja3BvcnRzIGNhdXNpbmcgYmVoYXZpb3IgY2hhbmdlcyB0aGF0IHVz ZXIgdG9vbHMsIGxpa2UKPiA+ID4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0LCBtaWdodCBiZSBpbXBh Y3RlZCBieS4KCj4gPiA+ID4gPiA+ID4gPiA+IFRoZSBzYW1lIHJ1bGVzIHRoYXQgYXBwbHkgZm9y IExpbnVzJ3MgdHJlZSAoaS5lLiBubyB1c2Vyc3BhY2UKPiA+ID4gPiA+ID4gPiA+ID4gcmVncmVz c2lvbnMuKQoKPiA+ID4gPiA+ID4gPiA+IEdpdmVuIHRoZSBjdXJyZW50IGRhdGEgd2UgaGF2ZSwg TFRQIG5mc3N0YXQwMVsxXSBmYWlsZWQgb24gTFRTIHY1LjQuMjc4IGJlY2F1c2Ugb2Yga2VybmVs IGNvbW1pdCAxNTQ4MDM2ZWYxMjA0ICgibmZzOgo+ID4gPiA+ID4gPiA+ID4gbWFrZSB0aGUgcnBj X3N0YXQgcGVyIG5ldCBuYW1lc3BhY2UiKSBbMl0uIE90aGVyIExUUyB3aGljaCBiYWNrcG9ydGVk IHRoZSBzYW1lIGNvbW1pdCBhcmUgdmVyeSBsaWtlbHkgdHJvdWJsZWQgd2l0aCB0aGUgc2FtZSBM VFAgdGVzdCBmYWlsdXJlLgoKPiA+ID4gPiA+ID4gPiA+IFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBM VFAgbmZzc3RhdDAxIGZhaWx1cmUgb3V0cHV0Cgo+ID4gPiA+ID4gPiA+ID4gPT09PT09PT0KPiA+ ID4gPiA+ID4gPiA+IG5ldHdvcmsgMSBUSU5GTzogaW5pdGlhbGl6ZSAnbGhvc3QnICdsdHBfbnNf dmV0aDInIGludGVyZmFjZQo+ID4gPiA+ID4gPiA+ID4gbmV0d29yayAxIFRJTkZPOiBhZGQgbG9j YWwgYWRkciAxMC4wLjAuMi8yNAo+ID4gPiA+ID4gPiA+ID4gbmV0d29yayAxIFRJTkZPOiBhZGQg bG9jYWwgYWRkciBmZDAwOjE6MToxOjoyLzY0Cj4gPiA+ID4gPiA+ID4gPiBuZXR3b3JrIDEgVElO Rk86IGluaXRpYWxpemUgJ3Job3N0JyAnbHRwX25zX3ZldGgxJyBpbnRlcmZhY2UKPiA+ID4gPiA+ ID4gPiA+IG5ldHdvcmsgMSBUSU5GTzogYWRkIHJlbW90ZSBhZGRyIDEwLjAuMC4xLzI0Cj4gPiA+ ID4gPiA+ID4gPiBuZXR3b3JrIDEgVElORk86IGFkZCByZW1vdGUgYWRkciBmZDAwOjE6MToxOjox LzY0Cj4gPiA+ID4gPiA+ID4gPiBuZXR3b3JrIDEgVElORk86IE5ldHdvcmsgY29uZmlnIChsb2Nh bCAtLSByZW1vdGUpOgo+ID4gPiA+ID4gPiA+ID4gbmV0d29yayAxIFRJTkZPOiBsdHBfbnNfdmV0 aDIgLS0gbHRwX25zX3ZldGgxCj4gPiA+ID4gPiA+ID4gPiBuZXR3b3JrIDEgVElORk86IDEwLjAu MC4yLzI0IC0tIDEwLjAuMC4xLzI0Cj4gPiA+ID4gPiA+ID4gPiBuZXR3b3JrIDEgVElORk86IGZk MDA6MToxOjE6OjIvNjQgLS0gZmQwMDoxOjE6MTo6MS82NAo+ID4gPiA+ID4gPiA+ID4gPDw8dGVz dF9zdGFydD4+Pgo+ID4gPiA+ID4gPiA+ID4gdGFnPXZldGh8bmZzc3RhdDNfMDEgc3RpbWU9MTcx OTk0MzU4Ngo+ID4gPiA+ID4gPiA+ID4gY21kbGluZT0ibmZzc3RhdDAxIgo+ID4gPiA+ID4gPiA+ ID4gY29udGFjdHM9IiIKPiA+ID4gPiA+ID4gPiA+IGFuYWx5c2lzPWV4aXQKPiA+ID4gPiA+ID4g PiA+IDw8PHRlc3Rfb3V0cHV0Pj4+Cj4gPiA+ID4gPiA+ID4gPiBpbmNyZW1lbnRpbmcgc3RvcAo+ ID4gPiA+ID4gPiA+ID4gbmZzc3RhdDAxIDEgVElORk86IHRpbWVvdXQgcGVyIHJ1biBpcyAwaCAy MG0gMHMKPiA+ID4gPiA+ID4gPiA+IG5mc3N0YXQwMSAxIFRJTkZPOiBzZXR1cCBORlN2Mywgc29j a2V0IHR5cGUgdWRwCj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEgMSBUSU5GTzogTW91bnRpbmcg TkZTOiBtb3VudCAtdCBuZnMgLW8gcHJvdG89dWRwLHZlcnM9MyAxMC4wLjAuMjovdG1wL25ldHBh bi00NTc3L0xUUF9uZnNzdGF0MDEubHo2emhnUUhvVi8zL3VkcCAvdG1wL25ldHBhbi00NTc3L0xU UF9uZnNzdGF0MDEubHo2emhnUUhvVi8zLzAKPiA+ID4gPiA+ID4gPiA+IG5mc3N0YXQwMSAxIFRJ TkZPOiBjaGVja2luZyBSUEMgY2FsbHMgZm9yIHNlcnZlci9jbGllbnQKPiA+ID4gPiA+ID4gPiA+ IG5mc3N0YXQwMSAxIFRJTkZPOiBjYWxscyA5OC8wCj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEg MSBUSU5GTzogQ2hlY2tpbmcgZm9yIHRyYWNraW5nIG9mIFJQQyBjYWxscyBmb3Igc2VydmVyL2Ns aWVudAo+ID4gPiA+ID4gPiA+ID4gbmZzc3RhdDAxIDEgVElORk86IG5ldyBjYWxscyAxMDIvMAo+ ID4gPiA+ID4gPiA+ID4gbmZzc3RhdDAxIDEgVFBBU1M6IHNlcnZlciBSUEMgY2FsbHMgaW5jcmVh c2VkCj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEgMSBURkFJTDogY2xpZW50IFJQQyBjYWxscyBu b3QgaW5jcmVhc2VkCj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEgMSBUSU5GTzogY2hlY2tpbmcg TkZTIGNhbGxzIGZvciBzZXJ2ZXIvY2xpZW50Cj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEgMSBU SU5GTzogY2FsbHMgMi8yCj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEgMSBUSU5GTzogQ2hlY2tp bmcgZm9yIHRyYWNraW5nIG9mIE5GUyBjYWxscyBmb3Igc2VydmVyL2NsaWVudAo+ID4gPiA+ID4g PiA+ID4gbmZzc3RhdDAxIDEgVElORk86IG5ldyBjYWxscyAzLzMKPiA+ID4gPiA+ID4gPiA+IG5m c3N0YXQwMSAxIFRQQVNTOiBzZXJ2ZXIgTkZTIGNhbGxzIGluY3JlYXNlZAo+ID4gPiA+ID4gPiA+ ID4gbmZzc3RhdDAxIDEgVFBBU1M6IGNsaWVudCBORlMgY2FsbHMgaW5jcmVhc2VkCj4gPiA+ID4g PiA+ID4gPiBuZnNzdGF0MDEgMiBUSU5GTzogQ2xlYW5pbmcgdXAgdGVzdGNhc2UKPiA+ID4gPiA+ ID4gPiA+IG5mc3N0YXQwMSAyIFRJTkZPOiBTRUxpbnV4IGVuYWJsZWQgaW4gZW5mb3JjaW5nIG1v ZGUsIHRoaXMgbWF5IGFmZmVjdCB0ZXN0IHJlc3VsdHMKPiA+ID4gPiA+ID4gPiA+IG5mc3N0YXQw MSAyIFRJTkZPOiBpdCBjYW4gYmUgZGlzYWJsZWQgd2l0aCBUU1RfRElTQUJMRV9TRUxJTlVYPTEg KHJlcXVpcmVzIHN1cGVyL3Jvb3QpCj4gPiA+ID4gPiA+ID4gPiBuZnNzdGF0MDEgMiBUSU5GTzog aW5zdGFsbCBzZWluZm8gdG8gZmluZCB1c2VkIFNFTGludXggcHJvZmlsZXMKPiA+ID4gPiA+ID4g PiA+IG5mc3N0YXQwMSAyIFRJTkZPOiBsb2FkZWQgU0VMaW51eCBwcm9maWxlczogbm9uZQoKPiA+ ID4gPiA+ID4gPiA+IFN1bW1hcnk6Cj4gPiA+ID4gPiA+ID4gPiBwYXNzZWQgMwo+ID4gPiA+ID4g PiA+ID4gZmFpbGVkIDEKPiA+ID4gPiA+ID4gPiA+IHNraXBwZWQgMAo+ID4gPiA+ID4gPiA+ID4g d2FybmluZ3MgMAo+ID4gPiA+ID4gPiA+ID4gPDw8ZXhlY3V0aW9uX3N0YXR1cz4+Pgo+ID4gPiA+ ID4gPiA+ID4gaW5pdGlhdGlvbl9zdGF0dXM9Im9rIgo+ID4gPiA+ID4gPiA+ID4gZHVyYXRpb249 MSB0ZXJtaW5hdGlvbl90eXBlPWV4aXRlZCB0ZXJtaW5hdGlvbl9pZD0xIGNvcmVmaWxlPW5vCj4g PiA+ID4gPiA+ID4gPiBjdXRpbWU9MTEgY3N0aW1lPTE2Cj4gPiA+ID4gPiA+ID4gPiA8PDx0ZXN0 X2VuZD4+Pgo+ID4gPiA+ID4gPiA+ID4gbHRwLXBhbiByZXBvcnRlZCBGQUlMCj4gPiA+ID4gPiA+ ID4gPiA9PT09PT09PQoKPiA+ID4gPiA+ID4gPiA+IFdlIGNhbiBvYnNlcnZlIHRoZSBudW1iZXIg b2YgUlBDIGNsaWVudCBjYWxscyBpcyAwLCB3aGljaCBpcyB3aXJlZC4gQW5kIHRoaXMgaGFwcGVu cyBmcm9tIHRoZSBrZXJuZWwgY29tbWl0IDU3ZDFjZTk2ZDc2NTUgKCJuZnM6IG1ha2UgdGhlIHJw Y19zdGF0IHBlciBuZXQgbmFtZXNwYWNl4oCdKS4gU28gbm93IHdl4oCZcmUgbm90IHN1cmUgdGhl IGtlcm5lbCBiYWNrcG9ydCBvZiBuZnMgY2xpZW50IGNoYW5nZXMgaXMgcHJvcGVyLCBvciB0aGUg TFRQIHRlc3RzIC8gdXNlcnNwYWNlIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgo+ID4gPiA+ID4gPiA+ ID4gSWYgbm8gdXNlcnNwYWNlIHJlZ3Jlc3Npb24sIHNob3VsZCB3ZSByZXZlcnQgdGhlIEpvc2Vm 4oCZcyBORlMgY2xpZW50LXNpZGUgY2hhbmdlcyBvbiBMVFM/Cgo+ID4gPiA+ID4gPiA+IFRoaXMg c291bmRzIGxpa2UgYSByZWdyZXNzaW9uIGluIExpbnVzJ3MgdHJlZSB0b28sIHNvIHdoeSBpc24n dCBpdAo+ID4gPiA+ID4gPiA+IHJldmVydGVkIHRoZXJlIGZpcnN0PwoKPiA+ID4gPiA+ID4gVGhl cmUgaXMgYSBjaGFuZ2UgaW4gYmVoYXZpb3IgaW4gdGhlIHVwc3RyZWFtIGNvZGUsIGJ1dCBKb3Nl ZidzCj4gPiA+ID4gPiA+IHBhdGNoZXMgZml4IGFuIGluZm9ybWF0aW9uIGxlYWsgYW5kIG1ha2Ug dGhlIHN0YXRpc3RpY3MgbW9yZQo+ID4gPiA+ID4gPiBzZW5zaWJsZSBpbiBjb250YWluZXIgZW52 aXJvbm1lbnRzLiBJJ20gbm90IGNlcnRhaW4gdGhhdAo+ID4gPiA+ID4gPiBzaG91bGQgYmUgY29u c2lkZXJlZCBhIHJlZ3Jlc3Npb24sIGJ1dCBjb25mZXNzIEkgZG9uJ3Qga25vdwo+ID4gPiA+ID4g PiB0aGUgcmVncmVzc2lvbiBydWxlcyB0byB0aGlzIGZpbmUgYSBkZWdyZWUgb2YgZGV0YWlsLgoK PiA+ID4gPiA+ID4gSWYgaXQgaXMgaW5kZWVkIGEgcmVncmVzc2lvbiwgaG93IGNhbiB3ZSBnbyBh Ym91dCByZXRhaW5pbmcKPiA+ID4gPiA+ID4gYm90aCBiZWhhdmlvcnMgKHNlbGVjdGFibGUgYnkg S2NvbmZpZyBvciBwZXJoYXBzIGFkbWluaXN0cmF0aXZlCj4gPiA+ID4gPiA+IFVJKT8KCgo+ID4g PiA+ID4gSSdkIGFyZ3VlIHRoYXQgdGhlIG9sZCBiZWhhdmlvciB3YXMgYSBidWcsIGFuZCB0aGF0 IEpvc2VmIGZpeGVkCj4gPiA+ID4gPiBpdC7CoFRoZXNlIHN0YXRzIHNob3VsZCBwcm9iYWJseSBo YXZlIGJlZW4gbWFkZSBwZXItbmV0IHdoZW4gYWxsIG9mIHRoZQo+ID4gPiA+ID4gb3JpZ2luYWwg bmZzZCBuYW1lc3BhY2Ugd29yayB3YXMgZG9uZSwgYnV0IG5vIG9uZSBub3RpY2VkIHVudGlsCj4g PiA+ID4gPiByZWNlbnRseS4gV2hvb3BzLsKgCgo+ID4gPiA+ID4gQSBjb3VwbGUgb2YgaGFja3kg aWRlYXMgZm9yIGhvdyB3ZSBtaWdodCBkZWFsIHdpdGggdGhpczoKCj4gPiA+ID4gPiAxLyBhZGQg YSBuZXcgbGluZSB0byB0aGUgb3V0cHV0IG9mIC9wcm9jL25ldC9ycGMvbmZzZC4gSXQgY291bGQg anVzdAo+ID4gPiA+ID4gc2F5ICJwZXItbmV0XG4iIG9yICJwZXItbmV0IDxuZXRuc19pZF9udW1i ZXI+XG4iIG9yIHNvbWV0aGluZy4gbmZzc3RhdAo+ID4gPiA+ID4gc2hvdWxkIGlnbm9yZSBpdCwg YnV0IExUUCB0ZXN0IGNvdWxkIGxvb2sgZm9yIGl0IGFuZCBoYW5kbGUgaXQKPiA+ID4gPiA+IGFw cHJvcHJpYXRlbHkuIFRoYXQgY291bGQgZXZlbiBiZSB1c2VmdWwgbGF0ZXIgZm9yIG5mc3N0YXQg dG9vIEkgZ3Vlc3MuCgo+ID4gPiA+ID4gMi8gbW92ZSB0aGUgZmlsZSB0byBhIG5ldyBuYW1lIGFu ZCBtYWtlIHRoZSBvbGQgZmlsZW5hbWUgYmUgYSBzeW1saW5rCj4gPiA+ID4gPiB0byB0aGUgbmV3 IG9uZS4gbmZzc3RhdCB3b3VsZCBzdGlsbCB3b3JrLCBidXQgTFRQIHdvdWxkIGJlIGFibGUgdG8g c2VlCj4gPiA+ID4gPiB3aGV0aGVyIGl0IHdhcyBhIHN5bWxpbmsgdG8gZGV0ZWN0IHRoZSBkaWZm ZXJlbmNlLi4ub3IgY291bGQganVzdCBtYWtlCj4gPiA+ID4gPiBhIG5ldyBzeW1saW5rIHRoYXQg cG9pbnRzIHRvIHRoZSBmaWxlIGFuZCBMVFAgY291bGQgbG9vayBmb3IgaXRzCj4gPiA+ID4gPiBw cmVzZW5jZS4KCj4gPiA+ID4gSSBkb24ndCB0aGluayBpdCBtYWtlcyBzZW5zZSB0byBwcmVzZW50 IGEgc29sdXRpb24gd2hpY2ggcmVxdWlyZXMKPiA+ID4gPiBMVFAgdG8gYmUgbW9kaWZpZWQuICBJ ZiB3ZSBhcmUgd2lsbGluZyB0byBtb2RpZnkgTFRQLCB0aGVuIHdlIHNob3VsZAo+ID4gPiA+IG1v ZGlmeSBpdCB0byB3b3JrIHdpdGggdGhlIHBlci1uZXQgc3RhdHMuCgo+ID4gPiA+IEkgdGhpbmsg d2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW50ZXJmYWNlIGZvciB0aGUgcGVyLW5ldCBzdGF0cywg dGhlbgo+ID4gPiA+IGRlcHJlY2F0ZSB0aGUgb2xkIGludGVyZmFjZSBhbmQgcmVtb3ZlIGl0IGlu IChzYXkpIDIgeWVhcnMuICBUaGF0IGdpdmVuCj4gPiA+ID4gTFRQIHRpbWUgdG8gdXBkYXRlLCBh bmQgbWVhbnMgdGhhdCBhbiBvbGQgTFRQIHdvbid0IGdpdmUgaW5jb3JyZWN0Cj4gPiA+ID4gbnVt YmVycywgaXQgd2lsbCBzaW1wbHkgZmFpbC4KCj4gPiA+ID4gQWxsIHdlIG5lZWQgdG8gZG8gaXMg YmlrZXNoZWQgdGhlIG5ldyBpbnRlcmZhY2UuCj4gPiA+ID4gICBuZXRsaW5rID8KPiA+ID4gPiAg IC9wcm9jL25ldC9ycGMtcGVybmV0L25mc2QgPwoKPiA+ID4gPiBUaGlzIG1lYW5zIHRoYXQgd2Ug c3RpbGwgbmVlZCB0byBrZWVwIHRoZSBjb21iaW5lZCBzdGF0cywgb3IgdG8gY29tYmluZQo+ID4g PiA+IGFsbCB0aGUgcGVyLW5ldCBzdGF0cyBvbiBlYWNoIGFjY2Vzcy4KCgo+ID4gPiBIb3cgbXVj aCBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgd291bGQgd2UgbmVlZCB0byByZXN0b3JlPwoKPiA+ID4g UHJpb3IgdG8gSm9zZWYncyBwYXRjaGVzLCB5b3Ugd291bGQgZ2V0IGluZm8gYWJvdXQgZ2xvYmFs IHN0YXRzIGZyb20KPiA+ID4gcmVsZXZhbnQgc3RhdHMgcHJvY2ZpbGVzIGluIGEgY29udGFpbmVy LiBUaGF0IHNlZW1zIGxpa2UgYW4gaW5mb3JtYXRpb24KPiA+ID4gbGVhayB0byBtZSwgYnV0IGZp eGluZyB0aGF0IGlzIHByb2JhYmx5IGdvaW5nIHRvIGJyZWFrIF9zb21lYm9keV8uCj4gPiA+IFdo ZXJlIGRvIHdlIGRyYXcgdGhlIGxpbmUgYW5kIHdoeT8KCj4gPiA+IExUUCBpcyBqdXN0IGEgdGVz dHN1aXRlLiBBc2tpbmcgdGhlbSB0byBhbHRlciB0ZXN0cyBpbiBvcmRlciB0byBjb3BlCj4gPiA+ IHdpdGggYSBidWdmaXggc2VlbXMgZW50aXJlbHkgcmVhc29uYWJsZSB0byBtZS4gSWYgc29tZW9u ZSBjYW4gbWFrZSBhCj4gPiA+IGNhc2UgZm9yIHJlYWwtd29ybGQgYXBwbGljYXRpb25zIHRoYXQg cmVseSBvbiB0aGUgb2xkIHNlbWFudGljcywgdGhlbgo+ID4gPiBJJ2QgYmUgbW9yZSBvcGVuIHRv IGNoYW5naW5nIHRoaXMsIGJ1dCBJIGp1c3QgZG9uJ3Qgc2VlIHRoZSB1cHNpZGUgb2YKPiA+ID4g cmVzdG9yaW5nIGxlZ2FjeSBiZWhhdmlvciBoZXJlLgoKKzEuIEFsc28gcGVvcGxlIHdobyB0ZXN0 IHdpdGggTFRQIGFyZSBhZHZpc2VkIHRvIHVzZSBhdCBsZWFzdCB0aGUgbGF0ZXN0IHJlbGVhc2UK KHdlIHJlbGVhc2UgZXZlcnkgMyBtb250aHMpIG9yIHRoZSBjdXJyZW50IG1hc3RlciBicmFuY2gg KGxpbnV4LW5leHQgYW5kIGtlcm5lbApyYyB0ZXN0ZXJzIHNob3VsZCBwcm9iYWJseSB1c2UgbWFz dGVyIGJyYW5jaCkuCgo+ID4gSWYgaXQgaXMgT0sgdG8gYXNrIHRoZW0gdG8gYWx0ZXIgdGhlIHRl c3RzLCBhc2sgdGhlbSB0byBhbHRlciB0aGUgdGVzdHMKPiA+IHRvIHdvcmsgd2l0aCB0b2RheSdz IGtlcm5lbCBhbmQgZG9uJ3QgbWFrZSBhbnkgY2hhbmdlIHRvIHRoZSBrZXJuZWwuCj4gPiBNYXli ZSB0aGUgdGVzdHMgd2lsbCBoYXZlIHRvIGJlIGZpeGVkIHRvICJQQVNTIiBib3RoIHRoZSBvbGQg YW5kIHRoZSBuZXcKPiA+IHJlc3VsdHMsIGJ1dCB0aGF0IHByb2JhYmx5IGlzbid0IHJvY2tldCBz Y2llbmNlLgoKPiA+IE15IHBvaW50IGlzIHRoYXQgaWYgd2UgYXJlIGdvaW5nIHRvIGNoYW5nZSB0 aGUga2VybmVsIHRvIGFjY29tbW9kYXRlIExUUAo+ID4gYXQgYWxsLCB3ZSBzaG91bGQgYWNjb21t b2RhdGUgTFRQIGFzIGl0IGlzIHRvZGF5LiAgSWYgd2UgYXJlIGdvaW5nIHRvCj4gPiBjaGFuZ2Ug TFRQIHRvIGFjY29tbW9kYXRlIHRoZSBrZXJuZWwsIHRoZW4gaXQgc2hvdWxkIGFjY29tbW9kYXRl IHRoZQo+ID4ga2VybmVsIGFzIGl0IGlzIHRvZGF5LgoKCj4gVGhlIHByb2JsZW0gaXMgdGhhdCB0 aGVyZSBpcyBubyB3YXkgZm9yIHVzZXJsYW5kIHRlbGwgdGhlIGRpZmZlcmVuY2UKPiBiZXR3ZWVu IHRoZSBvbGRlciBhbmQgbmV3ZXIgYmVoYXZpb3IuIFRoYXQgd2FzIHdoYXQgSSB3YXMgc3VnZ2Vz dGluZyB3ZQo+IGFkZC4KCj4gVG8gYmUgY2xlYXIsIEkgaG9sZCB0aGlzIG9waW5pb24gbG9vc2Vs eS4gSWYgdGhlIGNvbnNlbnN1cyBpcyB0aGF0IHdlCj4gbmVlZCB0byByZXZlcnQgdGhpbmdzIHRo ZW4gc28gYmUgaXQuIEkganVzdCBkb24ndCBzZWUgdGhlIHZhbHVlIG9mCj4gZG9pbmcgdGhhdCBp biB0aGlzIHBhcnRpY3VsYXIgc2l0dWF0aW9uLgoKSSBhbHNvIHRoaW5rIHRoYXQgZnJvbSBjb250 YWluZXIgUE9WIGl0IGZpeGVkIGFuIGluZm9ybWF0aW9uIGxlYWsuCgpLaW5kIHJlZ2FyZHMsClBl dHIKCi0tIApNYWlsaW5nIGxpc3QgaW5mbzogaHR0cHM6Ly9saXN0cy5saW51eC5pdC9saXN0aW5m by9sdHAK