From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (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 337283C1090; Tue, 15 Sep 2026 14:30:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789482656; cv=none; b=ErHIs0fpctOCYER1tEyoG9bOckpgLeTK1OuDHR3QXonGCMEIc5flL24PiE/WFTG9BDstLxw3N3FCxFAR0C0TndbHlVtMkt4T5tV4A0nO2XmDlmfUPyAE2gpNYMHM6MiW5JgYZql9I+cPLNgTaEf2faGgiup2Kw5zk0mVXzrby6k= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789482656; c=relaxed/simple; bh=moIPUmoig2JAgKqAA6UrukBxyXWK3E849Xq6gng+scw=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=lVv8ze4yORKlGr1hj9mmYZqa2lg4UN0zSEqf71uOdyRlidz7HOntZYie7JC60DmS6rON/XQJhzk+vsmJvFeBFHPc3myDhPn0MLw5yYuC0JgsWs37K0UDxt0QRECTvcsC5yEMm9Ty+2JprnSeCIqnKD54YDcm+I8afJm7EzM3498= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ExS+veNg; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ExS+veNg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id E75D01F000FF; Tue, 15 Sep 2026 14:30:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1789482654; bh=C8lwuOuhj9txlc80fCv3H4oifLhv4WSxNGb/qOtVudM=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=ExS+veNgBdz30FclQpYaSCTexz90mRkZ4TxP0L0gy1RFIR6zbpI4Dikj4vA4P/AXO t/OeNJSnMmU40l2yi2IYcES7gZP7EQSHLVgAVDU85kj/8mL+llrLyBIfZS0WEp98qz I4U7fawy4JaSj9S5OnGVb+wb//Agn/A0wpOa6phj0QtDBo5ywXKqv9zqMTN6TWNR4U rsAfoE3JGOXAg1scCoJgia/HWwS8t8a+WJLjyr+sCr0S5GULThAMjvcA3cOsfFH0co 87e14KinXUO7LY8fcGAkmTAPBtlSakU1p1pRIwGhCIC38zvMGAqMmENgla+q9vrc7S Fu6OaBPBfXB7g== Date: Tue, 15 Sep 2026 15:30:43 +0100 From: "Lorenzo Stoakes (ARM)" To: Kees Cook Cc: Linus Torvalds , Nathan Chancellor , Nicolas Schier , Nick Desaulniers , Bill Wendling , Justin Stitt , Masahiro Yamada , Alexey Gladkov , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Arnd Bergmann , Catalin Marinas , Will Deacon , Mark Rutland , Ard Biesheuvel , Ilias Apalodimas , Josh Poimboeuf , Peter Zijlstra , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?B?QmrDtnJu?= Roy Baron , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , Onur =?utf-8?B?w5Z6a2Fu?= , Jonathan Corbet , Randy Dunlap , "Gustavo A. R. Silva" , linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, llvm@lists.linux.dev, linux-riscv@lists.infradead.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-efi@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, Jens Axboe , linux-hardening@vger.kernel.org Subject: Re: [PATCH v2 21/21] kbuild: use pigz for gzip compression if available Message-ID: References: <20260914-build-speedup-v2-0-39817ec5db23@kernel.org> <20260914-build-speedup-v2-21-39817ec5db23@kernel.org> <202609140844.FA7E848A@keescook> Precedence: bulk X-Mailing-List: linux-kbuild@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: <202609140844.FA7E848A@keescook> On Mon, Sep 14, 2026 at 09:39:07AM -0700, Kees Cook wrote: > On Mon, Sep 14, 2026 at 10:22:20AM +0100, Lorenzo Stoakes (ARM) wrote: > > On a 128-core Threadripper, gzip -9 of a 36 MiB x86-64 vmlinux.bin takes > > 1.6s, and with pigz it takes 0.09s, so the performance increase is > > significant. > > Neat! I wanna go learn how pigz accomplishes this -- I thought the > problem with gzip was a common lookup table. Anyway... Yeah not sure on the details :) > > > --- a/Documentation/kbuild/reproducible-builds.rst > > +++ b/Documentation/kbuild/reproducible-builds.rst > > @@ -76,6 +76,22 @@ include generated files. You should ensure the source tree is > > pristine by running ``make mrproper`` or ``git clean -d -f -x`` before > > building a source package. > > > > +Compression tools > > +----------------- > > + > > +The compressed kernel image, compressed modules and packages are produced > > +using the program named by the make variable ``KGZIP`` (described in > > +Documentation/kbuild/kbuild.rst). > > + > > +It defaults to ``pigz`` if installed (a parallel implementation of gzip), > > +or ``gzip`` otherwise. > > + > > +The generated output between two invocations of identical builds with > > +either of the default tools will be byte-for-byte equivalent. > > + > > +However, for reproducible builds, ensure the same tool is used on all build > > +hosts, as different tools may generate different output from one another. > > + > > Module signing > > -------------- > > > > This doc update seems totally unneeded? Having the same build tools for RB > is already a known requirement. I don't think anything new is added here? Ack that's fair enough, will drop the doc update. > > > diff --git a/Makefile b/Makefile > > index 790ef23c5e8a..38c0cdc9f591 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -561,7 +561,7 @@ PERL = perl > > PYTHON3 = python3 > > CHECK = sparse > > BASH = bash > > -KGZIP = gzip > > +KGZIP := $(if $(shell command -v pigz 2>/dev/null),pigz,gzip) > > I think the more idiomatic way to do this is: > > KGZIP := $(call try-run,command -v pigz,pigz,gzip) try-run is defined in scripts/Makefile.compiler which is only included ~200 lines after KGZIP is set. That'll also set up and tear down a temp dir for a probe that doesn't need that, so I think it's fine as it is. > > However, parallelism needs to be set. We can't let it eat all CPUs: it > needs to respect the -j make option (and make its CPU reservation known > to "make"), which we already have a solution for in > scripts/jobserver-exec. The only place where it's invoked is vmlinux.bin at the end of the serial tail, where all the tokens would be free anyway. So I don't think it really buys anything at all? Using jobserver-exec would also put python3 and two wrapper scripts in front of every gzip in the build including tar -I "$(KGZIP)" when packaging and some arm and m68k scripts too. (For the module zips it's already constrained to a single process.) Overall I think it's less complexity and really no delta to just invoke it as normal. It's designed as drop-in so it makes sense to use it as that. > > However, I would actually argue that given such an improvement we should just > make pigz explicitly required and not optional. It is packaged everywhere: > > │ Debian / Ubuntu │ ✅ │ pigz (main) > │ Fedora │ ✅ │ pigz 2.8 (current) > │ RHEL / CentOS / Rocky / Alma │ ✅ via EPEL │ pigz — not in base/AppStream > │ openSUSE / SLE │ ✅ │ pigz > │ Arch Linux │ ✅ │ pigz (extra) > │ Alpine │ ✅ │ pigz > │ Gentoo │ ✅ │ app-arch/pigz 2.8 > > Only RHEL appears a little glitchy, but likely they would trivially move > it to base since it's already packaged, but off in EPEL. Definitely not something for this series, the fallback is one invocation of command -v and I don't really want to break RHEL either :) If, once this has landed, we want to go that way then it's simple enough for us to change it. > > So, I would say that pigz would be best run as something like: > > KGZIP := $(PYTHON3) $(abs_srctree)/scripts/jobserver-exec $(abs_srctree)/scripts/parallel-pigz > > with scripts/parallel-pigz being something like: > > #!/bin/sh > exec pigz -p ${PARALLELISM:-1} "$@" > > > --- a/scripts/Makefile.modinst > > +++ b/scripts/Makefile.modinst > > @@ -145,8 +145,10 @@ endif > > # > > # Compression > > # > > +# Modules are compressed in parallel by make itself, so keep the compressor > > +# single-threaded when it is pigz. > > quiet_cmd_gzip = GZIP $@ > > - cmd_gzip = $(KGZIP) -n -f $< > > + cmd_gzip = $(KGZIP) $(if $(filter pigz,$(notdir $(firstword $(KGZIP)))),-p 1) -n -f $< > > quiet_cmd_xz = XZ $@ > > Then this could be: > > cmd_gzip = SINGLE_THREADED=1 $(KGZIP) -n -f $< This is already achieved for the modinst case with a one-liner in any case. > > and we patch scripts/jobserver-exec: > > diff --git a/scripts/jobserver-exec b/scripts/jobserver-exec > index 21b319e6c9a5..8b953148ee9f 100755 > --- a/scripts/jobserver-exec > +++ b/scripts/jobserver-exec > @@ -5,6 +5,7 @@ > Determines how many parallel tasks "make" is expecting, as it is > not exposed via any special variables, reserves them all, runs a subprocess > with PARALLELISM environment variable set, and releases the jobs back again. > +If SINGLE_THREADED is set, nothing is reserved and PARALLELISM is 1. > > See: > https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html#POSIX-Jobserver > diff --git a/tools/lib/python/jobserver.py b/tools/lib/python/jobserver.py > index 0b1ffdf9f7a3..fc38c5020b22 100755 > --- a/tools/lib/python/jobserver.py > +++ b/tools/lib/python/jobserver.py > @@ -29,6 +29,11 @@ $claim child to do the actual work. > The end goal here is to keep the total number of build tasks under the > limit established by the initial ``make -j$n_proc`` call. > > +Setting the ``SINGLE_THREADED`` environment variable skips the reservation > +entirely and runs the command with ``PARALLELISM=1``. This is meant for callers > +that run many short commands in parallel themselves, where each one should use > +only the job slot it already holds. > + > See: > https://www.gnu.org/software/make/manual/html_node/POSIX-Jobserver.html#POSIX-Jobserver > """ > @@ -68,6 +73,13 @@ class JobserverExec: > self.is_open = True # We only try once > self.claim = None > # > + # SINGLE_THREADED asks for no reservation at all: the command runs > + # with PARALLELISM=1, using only the slot its caller already holds. > + # > + if os.environ.get('SINGLE_THREADED'): > + self.claim = 1 > + return > + # > # Check the make flags for "--jobserver=R,W" > # Note that GNU Make has used --jobserver-fds and --jobserver-auth > # so this handles all of them. > > -- > Kees Cook -- Cheers, Lorenzo 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 3CFA1C88E53 for ; Tue, 15 Sep 2026 14:31:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EAgNjAnBVOTraXT3r8BvP3Nz88mZ8/gD/MRnG21qOdk=; b=phD/HwRskkxPZj 3c+9093Ny2xpwx+i2aZRHPwJZEaOvrC3tXpbKxM+geIB75p8HXsLaTP6t1mw6pkC/VWiU+VHtvYTs zW9R89A68yjeYRdo02IZS1E0bIjeZMthz/JBsVaQXu9wOqKzbl28Ssugea7jTsG+Cie9sVk6y0mkJ RV5qjfJITwefdJioIOCuE8QQCIovWQudAxtYV0tBGXICoXei6VRvXXVIzCAyoonUabL8AEgdb3W3J Sx/G7Xkwy/UwDUf9iheyQccE65CQX4Sq1hqxj9ZlwiKiop/csXDtM3Hq+HdVrqHgaoIsokT70+L/Z DXJgTLfiJ1yY4eqNsWQg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1x6UBW-00000006wT9-1cCu; Tue, 15 Sep 2026 14:30:58 +0000 Received: from tor.source.kernel.org ([172.105.4.254]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1x6UBU-00000006wSf-0uBA; Tue, 15 Sep 2026 14:30:56 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id 30B9460142; Tue, 15 Sep 2026 14:30:55 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E75D01F000FF; Tue, 15 Sep 2026 14:30:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1789482654; bh=C8lwuOuhj9txlc80fCv3H4oifLhv4WSxNGb/qOtVudM=; h=Date:From:To:Cc:Subject:References:In-Reply-To; b=ExS+veNgBdz30FclQpYaSCTexz90mRkZ4TxP0L0gy1RFIR6zbpI4Dikj4vA4P/AXO t/OeNJSnMmU40l2yi2IYcES7gZP7EQSHLVgAVDU85kj/8mL+llrLyBIfZS0WEp98qz I4U7fawy4JaSj9S5OnGVb+wb//Agn/A0wpOa6phj0QtDBo5ywXKqv9zqMTN6TWNR4U rsAfoE3JGOXAg1scCoJgia/HWwS8t8a+WJLjyr+sCr0S5GULThAMjvcA3cOsfFH0co 87e14KinXUO7LY8fcGAkmTAPBtlSakU1p1pRIwGhCIC38zvMGAqMmENgla+q9vrc7S Fu6OaBPBfXB7g== Date: Tue, 15 Sep 2026 15:30:43 +0100 From: "Lorenzo Stoakes (ARM)" To: Kees Cook Cc: Linus Torvalds , Nathan Chancellor , Nicolas Schier , Nick Desaulniers , Bill Wendling , Justin Stitt , Masahiro Yamada , Alexey Gladkov , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Paul Walmsley , Palmer Dabbelt , Albert Ou , Alexandre Ghiti , Arnd Bergmann , Catalin Marinas , Will Deacon , Mark Rutland , Ard Biesheuvel , Ilias Apalodimas , Josh Poimboeuf , Peter Zijlstra , Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?B?QmrDtnJu?= Roy Baron , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Daniel Almeida , Tamir Duberstein , Alexandre Courbot , Onur =?utf-8?B?w5Z6a2Fu?= , Jonathan Corbet , Randy Dunlap , "Gustavo A. R. Silva" , linux-kbuild@vger.kernel.org, linux-kernel@vger.kernel.org, llvm@lists.linux.dev, linux-riscv@lists.infradead.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-efi@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-doc@vger.kernel.org, Jens Axboe , linux-hardening@vger.kernel.org Subject: Re: [PATCH v2 21/21] kbuild: use pigz for gzip compression if available Message-ID: References: <20260914-build-speedup-v2-0-39817ec5db23@kernel.org> <20260914-build-speedup-v2-21-39817ec5db23@kernel.org> <202609140844.FA7E848A@keescook> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <202609140844.FA7E848A@keescook> X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gTW9uLCBTZXAgMTQsIDIwMjYgYXQgMDk6Mzk6MDdBTSAtMDcwMCwgS2VlcyBDb29rIHdyb3Rl Ogo+IE9uIE1vbiwgU2VwIDE0LCAyMDI2IGF0IDEwOjIyOjIwQU0gKzAxMDAsIExvcmVuem8gU3Rv YWtlcyAoQVJNKSB3cm90ZToKPiA+IE9uIGEgMTI4LWNvcmUgVGhyZWFkcmlwcGVyLCBnemlwIC05 IG9mIGEgMzYgTWlCIHg4Ni02NCB2bWxpbnV4LmJpbiB0YWtlcwo+ID4gMS42cywgYW5kIHdpdGgg cGlneiBpdCB0YWtlcyAwLjA5cywgc28gdGhlIHBlcmZvcm1hbmNlIGluY3JlYXNlIGlzCj4gPiBz aWduaWZpY2FudC4KPgo+IE5lYXQhIEkgd2FubmEgZ28gbGVhcm4gaG93IHBpZ3ogYWNjb21wbGlz aGVzIHRoaXMgLS0gSSB0aG91Z2h0IHRoZQo+IHByb2JsZW0gd2l0aCBnemlwIHdhcyBhIGNvbW1v biBsb29rdXAgdGFibGUuIEFueXdheS4uLgoKWWVhaCBub3Qgc3VyZSBvbiB0aGUgZGV0YWlscyA6 KQoKPgo+ID4gLS0tIGEvRG9jdW1lbnRhdGlvbi9rYnVpbGQvcmVwcm9kdWNpYmxlLWJ1aWxkcy5y c3QKPiA+ICsrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL3JlcHJvZHVjaWJsZS1idWlsZHMucnN0 Cj4gPiBAQCAtNzYsNiArNzYsMjIgQEAgaW5jbHVkZSBnZW5lcmF0ZWQgZmlsZXMuICBZb3Ugc2hv dWxkIGVuc3VyZSB0aGUgc291cmNlIHRyZWUgaXMKPiA+ICBwcmlzdGluZSBieSBydW5uaW5nIGBg bWFrZSBtcnByb3BlcmBgIG9yIGBgZ2l0IGNsZWFuIC1kIC1mIC14YGAgYmVmb3JlCj4gPiAgYnVp bGRpbmcgYSBzb3VyY2UgcGFja2FnZS4KPiA+Cj4gPiArQ29tcHJlc3Npb24gdG9vbHMKPiA+ICst LS0tLS0tLS0tLS0tLS0tLQo+ID4gKwo+ID4gK1RoZSBjb21wcmVzc2VkIGtlcm5lbCBpbWFnZSwg Y29tcHJlc3NlZCBtb2R1bGVzIGFuZCBwYWNrYWdlcyBhcmUgcHJvZHVjZWQKPiA+ICt1c2luZyB0 aGUgcHJvZ3JhbSBuYW1lZCBieSB0aGUgbWFrZSB2YXJpYWJsZSBgYEtHWklQYGAgKGRlc2NyaWJl ZCBpbgo+ID4gK0RvY3VtZW50YXRpb24va2J1aWxkL2tidWlsZC5yc3QpLgo+ID4gKwo+ID4gK0l0 IGRlZmF1bHRzIHRvIGBgcGlnemBgIGlmIGluc3RhbGxlZCAoYSBwYXJhbGxlbCBpbXBsZW1lbnRh dGlvbiBvZiBnemlwKSwKPiA+ICtvciBgYGd6aXBgYCBvdGhlcndpc2UuCj4gPiArCj4gPiArVGhl IGdlbmVyYXRlZCBvdXRwdXQgYmV0d2VlbiB0d28gaW52b2NhdGlvbnMgb2YgaWRlbnRpY2FsIGJ1 aWxkcyB3aXRoCj4gPiArZWl0aGVyIG9mIHRoZSBkZWZhdWx0IHRvb2xzIHdpbGwgYmUgYnl0ZS1m b3ItYnl0ZSBlcXVpdmFsZW50Lgo+ID4gKwo+ID4gK0hvd2V2ZXIsIGZvciByZXByb2R1Y2libGUg YnVpbGRzLCBlbnN1cmUgdGhlIHNhbWUgdG9vbCBpcyB1c2VkIG9uIGFsbCBidWlsZAo+ID4gK2hv c3RzLCBhcyBkaWZmZXJlbnQgdG9vbHMgbWF5IGdlbmVyYXRlIGRpZmZlcmVudCBvdXRwdXQgZnJv bSBvbmUgYW5vdGhlci4KPiA+ICsKPiA+ICBNb2R1bGUgc2lnbmluZwo+ID4gIC0tLS0tLS0tLS0t LS0tCj4gPgo+Cj4gVGhpcyBkb2MgdXBkYXRlIHNlZW1zIHRvdGFsbHkgdW5uZWVkZWQ/IEhhdmlu ZyB0aGUgc2FtZSBidWlsZCB0b29scyBmb3IgUkIKPiBpcyBhbHJlYWR5IGEga25vd24gcmVxdWly ZW1lbnQuIEkgZG9uJ3QgdGhpbmsgYW55dGhpbmcgbmV3IGlzIGFkZGVkIGhlcmU/CgpBY2sgdGhh dCdzIGZhaXIgZW5vdWdoLCB3aWxsIGRyb3AgdGhlIGRvYyB1cGRhdGUuCgo+Cj4gPiBkaWZmIC0t Z2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQo+ID4gaW5kZXggNzkwZWYyM2M1ZThhLi4zOGMwY2Rj OWY1OTEgMTAwNjQ0Cj4gPiAtLS0gYS9NYWtlZmlsZQo+ID4gKysrIGIvTWFrZWZpbGUKPiA+IEBA IC01NjEsNyArNTYxLDcgQEAgUEVSTAkJPSBwZXJsCj4gPiAgUFlUSE9OMwkJPSBweXRob24zCj4g PiAgQ0hFQ0sJCT0gc3BhcnNlCj4gPiAgQkFTSAkJPSBiYXNoCj4gPiAtS0daSVAJCT0gZ3ppcAo+ ID4gK0tHWklQCQk6PSAkKGlmICQoc2hlbGwgY29tbWFuZCAtdiBwaWd6IDI+L2Rldi9udWxsKSxw aWd6LGd6aXApCj4KPiBJIHRoaW5rIHRoZSBtb3JlIGlkaW9tYXRpYyB3YXkgdG8gZG8gdGhpcyBp czoKPgo+IEtHWklQIDo9ICQoY2FsbCB0cnktcnVuLGNvbW1hbmQgLXYgcGlneixwaWd6LGd6aXAp Cgp0cnktcnVuIGlzIGRlZmluZWQgaW4gc2NyaXB0cy9NYWtlZmlsZS5jb21waWxlciB3aGljaCBp cyBvbmx5IGluY2x1ZGVkIH4yMDAKbGluZXMgYWZ0ZXIgS0daSVAgaXMgc2V0LgoKVGhhdCdsbCBh bHNvIHNldCB1cCBhbmQgdGVhciBkb3duIGEgdGVtcCBkaXIgZm9yIGEgcHJvYmUgdGhhdCBkb2Vz bid0IG5lZWQKdGhhdCwgc28gSSB0aGluayBpdCdzIGZpbmUgYXMgaXQgaXMuCgo+Cj4gSG93ZXZl ciwgcGFyYWxsZWxpc20gbmVlZHMgdG8gYmUgc2V0LiBXZSBjYW4ndCBsZXQgaXQgZWF0IGFsbCBD UFVzOiBpdAo+IG5lZWRzIHRvIHJlc3BlY3QgdGhlIC1qIG1ha2Ugb3B0aW9uIChhbmQgbWFrZSBp dHMgQ1BVIHJlc2VydmF0aW9uIGtub3duCj4gdG8gIm1ha2UiKSwgd2hpY2ggd2UgYWxyZWFkeSBo YXZlIGEgc29sdXRpb24gZm9yIGluCj4gc2NyaXB0cy9qb2JzZXJ2ZXItZXhlYy4KClRoZSBvbmx5 IHBsYWNlIHdoZXJlIGl0J3MgaW52b2tlZCBpcyB2bWxpbnV4LmJpbiBhdCB0aGUgZW5kIG9mIHRo ZSBzZXJpYWwKdGFpbCwgd2hlcmUgYWxsIHRoZSB0b2tlbnMgd291bGQgYmUgZnJlZSBhbnl3YXku CgpTbyBJIGRvbid0IHRoaW5rIGl0IHJlYWxseSBidXlzIGFueXRoaW5nIGF0IGFsbD8KClVzaW5n IGpvYnNlcnZlci1leGVjIHdvdWxkIGFsc28gcHV0IHB5dGhvbjMgYW5kIHR3byB3cmFwcGVyIHNj cmlwdHMgaW4KZnJvbnQgb2YgZXZlcnkgZ3ppcCBpbiB0aGUgYnVpbGQgaW5jbHVkaW5nIHRhciAt SSAiJChLR1pJUCkiIHdoZW4gcGFja2FnaW5nCmFuZCBzb21lIGFybSBhbmQgbTY4ayBzY3JpcHRz IHRvby4KCihGb3IgdGhlIG1vZHVsZSB6aXBzIGl0J3MgYWxyZWFkeSBjb25zdHJhaW5lZCB0byBh IHNpbmdsZSBwcm9jZXNzLikKCk92ZXJhbGwgSSB0aGluayBpdCdzIGxlc3MgY29tcGxleGl0eSBh bmQgcmVhbGx5IG5vIGRlbHRhIHRvIGp1c3QgaW52b2tlIGl0CmFzIG5vcm1hbC4KCkl0J3MgZGVz aWduZWQgYXMgZHJvcC1pbiBzbyBpdCBtYWtlcyBzZW5zZSB0byB1c2UgaXQgYXMgdGhhdC4KCj4K PiBIb3dldmVyLCBJIHdvdWxkIGFjdHVhbGx5IGFyZ3VlIHRoYXQgZ2l2ZW4gc3VjaCBhbiBpbXBy b3ZlbWVudCB3ZSBzaG91bGQganVzdAo+IG1ha2UgcGlneiBleHBsaWNpdGx5IHJlcXVpcmVkIGFu ZCBub3Qgb3B0aW9uYWwuIEl0IGlzIHBhY2thZ2VkIGV2ZXJ5d2hlcmU6Cj4KPiAgIOKUgiBEZWJp YW4gLyBVYnVudHUgICAgICAgICAgICAgIOKUgiDinIUgICAgICAgICAg4pSCIHBpZ3ogKG1haW4p Cj4gICDilIIgRmVkb3JhICAgICAgICAgICAgICAgICAgICAgICDilIIg4pyFICAgICAgICAgIOKU giBwaWd6IDIuOCAoY3VycmVudCkKPiAgIOKUgiBSSEVMIC8gQ2VudE9TIC8gUm9ja3kgLyBBbG1h IOKUgiDinIUgdmlhIEVQRUwg4pSCIHBpZ3og4oCUIG5vdCBpbiBiYXNlL0FwcFN0cmVhbQo+ICAg 4pSCIG9wZW5TVVNFIC8gU0xFICAgICAgICAgICAgICAg4pSCIOKchSAgICAgICAgICDilIIgcGln ego+ICAg4pSCIEFyY2ggTGludXggICAgICAgICAgICAgICAgICAg4pSCIOKchSAgICAgICAgICDi lIIgcGlneiAoZXh0cmEpCj4gICDilIIgQWxwaW5lICAgICAgICAgICAgICAgICAgICAgICDilIIg 4pyFICAgICAgICAgIOKUgiBwaWd6Cj4gICDilIIgR2VudG9vICAgICAgICAgICAgICAgICAgICAg ICDilIIg4pyFICAgICAgICAgIOKUgiBhcHAtYXJjaC9waWd6IDIuOAo+Cj4gT25seSBSSEVMIGFw cGVhcnMgYSBsaXR0bGUgZ2xpdGNoeSwgYnV0IGxpa2VseSB0aGV5IHdvdWxkIHRyaXZpYWxseSBt b3ZlCj4gaXQgdG8gYmFzZSBzaW5jZSBpdCdzIGFscmVhZHkgcGFja2FnZWQsIGJ1dCBvZmYgaW4g RVBFTC4KCkRlZmluaXRlbHkgbm90IHNvbWV0aGluZyBmb3IgdGhpcyBzZXJpZXMsIHRoZSBmYWxs YmFjayBpcyBvbmUgaW52b2NhdGlvbiBvZgpjb21tYW5kIC12IGFuZCBJIGRvbid0IHJlYWxseSB3 YW50IHRvIGJyZWFrIFJIRUwgZWl0aGVyIDopCgpJZiwgb25jZSB0aGlzIGhhcyBsYW5kZWQsIHdl IHdhbnQgdG8gZ28gdGhhdCB3YXkgdGhlbiBpdCdzIHNpbXBsZSBlbm91Z2gKZm9yIHVzIHRvIGNo YW5nZSBpdC4KCj4KPiBTbywgSSB3b3VsZCBzYXkgdGhhdCBwaWd6IHdvdWxkIGJlIGJlc3QgcnVu IGFzIHNvbWV0aGluZyBsaWtlOgo+Cj4gICBLR1pJUCA6PSAkKFBZVEhPTjMpICQoYWJzX3NyY3Ry ZWUpL3NjcmlwdHMvam9ic2VydmVyLWV4ZWMgJChhYnNfc3JjdHJlZSkvc2NyaXB0cy9wYXJhbGxl bC1waWd6Cj4KPiB3aXRoIHNjcmlwdHMvcGFyYWxsZWwtcGlneiBiZWluZyBzb21ldGhpbmcgbGlr ZToKPgo+IAkjIS9iaW4vc2gKPiAJZXhlYyBwaWd6IC1wICR7UEFSQUxMRUxJU006LTF9ICIkQCIK Pgo+ID4gLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0Cj4gPiArKysgYi9zY3JpcHRzL01h a2VmaWxlLm1vZGluc3QKPiA+IEBAIC0xNDUsOCArMTQ1LDEwIEBAIGVuZGlmCj4gPiAgIwo+ID4g ICMgQ29tcHJlc3Npb24KPiA+ICAjCj4gPiArIyBNb2R1bGVzIGFyZSBjb21wcmVzc2VkIGluIHBh cmFsbGVsIGJ5IG1ha2UgaXRzZWxmLCBzbyBrZWVwIHRoZSBjb21wcmVzc29yCj4gPiArIyBzaW5n bGUtdGhyZWFkZWQgd2hlbiBpdCBpcyBwaWd6Lgo+ID4gIHF1aWV0X2NtZF9nemlwID0gR1pJUCAg ICAkQAo+ID4gLSAgICAgIGNtZF9nemlwID0gJChLR1pJUCkgLW4gLWYgJDwKPiA+ICsgICAgICBj bWRfZ3ppcCA9ICQoS0daSVApICQoaWYgJChmaWx0ZXIgcGlneiwkKG5vdGRpciAkKGZpcnN0d29y ZCAkKEtHWklQKSkpKSwtcCAxKSAtbiAtZiAkPAo+ID4gIHF1aWV0X2NtZF94eiA9IFhaICAgICAg JEAKPgo+IFRoZW4gdGhpcyBjb3VsZCBiZToKPgo+IAljbWRfZ3ppcCA9IFNJTkdMRV9USFJFQURF RD0xICQoS0daSVApIC1uIC1mICQ8CgpUaGlzIGlzIGFscmVhZHkgYWNoaWV2ZWQgZm9yIHRoZSBt b2RpbnN0IGNhc2Ugd2l0aCBhIG9uZS1saW5lciBpbiBhbnkgY2FzZS4KCj4KPiBhbmQgd2UgcGF0 Y2ggc2NyaXB0cy9qb2JzZXJ2ZXItZXhlYzoKPgo+IGRpZmYgLS1naXQgYS9zY3JpcHRzL2pvYnNl cnZlci1leGVjIGIvc2NyaXB0cy9qb2JzZXJ2ZXItZXhlYwo+IGluZGV4IDIxYjMxOWU2YzlhNS4u OGI5NTMxNDhlZTlmIDEwMDc1NQo+IC0tLSBhL3NjcmlwdHMvam9ic2VydmVyLWV4ZWMKPiArKysg Yi9zY3JpcHRzL2pvYnNlcnZlci1leGVjCj4gQEAgLTUsNiArNSw3IEBACj4gIERldGVybWluZXMg aG93IG1hbnkgcGFyYWxsZWwgdGFza3MgIm1ha2UiIGlzIGV4cGVjdGluZywgYXMgaXQgaXMKPiAg bm90IGV4cG9zZWQgdmlhIGFueSBzcGVjaWFsIHZhcmlhYmxlcywgcmVzZXJ2ZXMgdGhlbSBhbGws IHJ1bnMgYSBzdWJwcm9jZXNzCj4gIHdpdGggUEFSQUxMRUxJU00gZW52aXJvbm1lbnQgdmFyaWFi bGUgc2V0LCBhbmQgcmVsZWFzZXMgdGhlIGpvYnMgYmFjayBhZ2Fpbi4KPiArSWYgU0lOR0xFX1RI UkVBREVEIGlzIHNldCwgbm90aGluZyBpcyByZXNlcnZlZCBhbmQgUEFSQUxMRUxJU00gaXMgMS4K Pgo+ICBTZWU6Cj4gICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL21ha2UvbWFudWFs L2h0bWxfbm9kZS9QT1NJWC1Kb2JzZXJ2ZXIuaHRtbCNQT1NJWC1Kb2JzZXJ2ZXIKPiBkaWZmIC0t Z2l0IGEvdG9vbHMvbGliL3B5dGhvbi9qb2JzZXJ2ZXIucHkgYi90b29scy9saWIvcHl0aG9uL2pv YnNlcnZlci5weQo+IGluZGV4IDBiMWZmZGY5ZjdhMy4uZmMzOGM1MDIwYjIyIDEwMDc1NQo+IC0t LSBhL3Rvb2xzL2xpYi9weXRob24vam9ic2VydmVyLnB5Cj4gKysrIGIvdG9vbHMvbGliL3B5dGhv bi9qb2JzZXJ2ZXIucHkKPiBAQCAtMjksNiArMjksMTEgQEAgJGNsYWltIGNoaWxkIHRvIGRvIHRo ZSBhY3R1YWwgd29yay4KPiAgVGhlIGVuZCBnb2FsIGhlcmUgaXMgdG8ga2VlcCB0aGUgdG90YWwg bnVtYmVyIG9mIGJ1aWxkIHRhc2tzIHVuZGVyIHRoZQo+ICBsaW1pdCBlc3RhYmxpc2hlZCBieSB0 aGUgaW5pdGlhbCBgYG1ha2UgLWokbl9wcm9jYGAgY2FsbC4KPgo+ICtTZXR0aW5nIHRoZSBgYFNJ TkdMRV9USFJFQURFRGBgIGVudmlyb25tZW50IHZhcmlhYmxlIHNraXBzIHRoZSByZXNlcnZhdGlv bgo+ICtlbnRpcmVseSBhbmQgcnVucyB0aGUgY29tbWFuZCB3aXRoIGBgUEFSQUxMRUxJU009MWBg LiBUaGlzIGlzIG1lYW50IGZvciBjYWxsZXJzCj4gK3RoYXQgcnVuIG1hbnkgc2hvcnQgY29tbWFu ZHMgaW4gcGFyYWxsZWwgdGhlbXNlbHZlcywgd2hlcmUgZWFjaCBvbmUgc2hvdWxkIHVzZQo+ICtv bmx5IHRoZSBqb2Igc2xvdCBpdCBhbHJlYWR5IGhvbGRzLgo+ICsKPiAgU2VlOgo+ICAgICAgaHR0 cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9tYWtlL21hbnVhbC9odG1sX25vZGUvUE9TSVgtSm9i c2VydmVyLmh0bWwjUE9TSVgtSm9ic2VydmVyCj4gICIiIgo+IEBAIC02OCw2ICs3MywxMyBAQCBj bGFzcyBKb2JzZXJ2ZXJFeGVjOgo+ICAgICAgICAgIHNlbGYuaXNfb3BlbiA9IFRydWUgICMgV2Ug b25seSB0cnkgb25jZQo+ICAgICAgICAgIHNlbGYuY2xhaW0gPSBOb25lCj4gICAgICAgICAgIwo+ ICsgICAgICAgICMgU0lOR0xFX1RIUkVBREVEIGFza3MgZm9yIG5vIHJlc2VydmF0aW9uIGF0IGFs bDogdGhlIGNvbW1hbmQgcnVucwo+ICsgICAgICAgICMgd2l0aCBQQVJBTExFTElTTT0xLCB1c2lu ZyBvbmx5IHRoZSBzbG90IGl0cyBjYWxsZXIgYWxyZWFkeSBob2xkcy4KPiArICAgICAgICAjCj4g KyAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1NJTkdMRV9USFJFQURFRCcpOgo+ICsgICAgICAg ICAgICBzZWxmLmNsYWltID0gMQo+ICsgICAgICAgICAgICByZXR1cm4KPiArICAgICAgICAjCj4g ICAgICAgICAgIyBDaGVjayB0aGUgbWFrZSBmbGFncyBmb3IgIi0tam9ic2VydmVyPVIsVyIKPiAg ICAgICAgICAjIE5vdGUgdGhhdCBHTlUgTWFrZSBoYXMgdXNlZCAtLWpvYnNlcnZlci1mZHMgYW5k IC0tam9ic2VydmVyLWF1dGgKPiAgICAgICAgICAjIHNvIHRoaXMgaGFuZGxlcyBhbGwgb2YgdGhl bS4KPgo+IC0tCj4gS2VlcyBDb29rCgotLQpDaGVlcnMsIExvcmVuem8KCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlz dApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK